From 3b39752ab709065e75c1b839488bc6e5a3d27e49 Mon Sep 17 00:00:00 2001 From: Paminger Date: Sun, 10 Apr 2016 18:11:09 +0200 Subject: [PATCH] Acceptance Tests --- .gitignore | 5 + CI_hybrid.asciidoc | 13 + .../controllers/organisation/Studiengang2.php | 167 + application/helpers/fhcdb_helper.php | 430 + application/migrations/001_init.php | 4 +- application/migrations/005_fhc30.php | 24 +- application/migrations/006_fhc31.php | 16 +- application/migrations/007_fhc32.php | 16 +- application/models/Grocery_crud_model.php | 592 + application/models/message/Message_model.php | 703 + application/models/message/message_model.php | 511 + application/seeds/001_person.php | 47 + application/views/vilesci_frameset.php | 2 +- assets/grocery_crud/config/index.html | 10 + assets/grocery_crud/config/language_alias.php | 33 + assets/grocery_crud/config/translit_chars.php | 169 + assets/grocery_crud/css/index.html | 10 + .../jquery_plugins/chosen/chosen-sprite.png | Bin 0 -> 538 bytes .../chosen/chosen-sprite@2x.png | Bin 0 -> 738 bytes .../css/jquery_plugins/chosen/chosen.css | 450 + .../css/jquery_plugins/chosen/chosen.min.css | 3 + .../css/jquery_plugins/chosen/index.html | 10 + .../css/jquery_plugins/fancybox/blank.gif | Bin 0 -> 43 bytes .../jquery_plugins/fancybox/fancy_close.png | Bin 0 -> 1517 bytes .../jquery_plugins/fancybox/fancy_loading.png | Bin 0 -> 10195 bytes .../fancybox/fancy_nav_left.png | Bin 0 -> 1446 bytes .../fancybox/fancy_nav_right.png | Bin 0 -> 1454 bytes .../fancybox/fancy_shadow_e.png | Bin 0 -> 107 bytes .../fancybox/fancy_shadow_n.png | Bin 0 -> 106 bytes .../fancybox/fancy_shadow_ne.png | Bin 0 -> 347 bytes .../fancybox/fancy_shadow_nw.png | Bin 0 -> 324 bytes .../fancybox/fancy_shadow_s.png | Bin 0 -> 111 bytes .../fancybox/fancy_shadow_se.png | Bin 0 -> 352 bytes .../fancybox/fancy_shadow_sw.png | Bin 0 -> 340 bytes .../fancybox/fancy_shadow_w.png | Bin 0 -> 103 bytes .../fancybox/fancy_title_left.png | Bin 0 -> 503 bytes .../fancybox/fancy_title_main.png | Bin 0 -> 96 bytes .../fancybox/fancy_title_over.png | Bin 0 -> 70 bytes .../fancybox/fancy_title_right.png | Bin 0 -> 506 bytes .../jquery_plugins/fancybox/fancybox-x.png | Bin 0 -> 203 bytes .../jquery_plugins/fancybox/fancybox-y.png | Bin 0 -> 176 bytes .../css/jquery_plugins/fancybox/fancybox.png | Bin 0 -> 15287 bytes .../fancybox/jquery.fancybox.css | 359 + .../file_upload/bootstrap.min.css | 360 + .../file_upload/file-uploader.css | 29 + .../file_upload/fileuploader.css | 71 + .../file_upload/jquery.fileupload-ui.css | 56 + .../jquery_plugins/file_upload/loading.gif | Bin 0 -> 1688 bytes .../file_upload/progressbar.gif | Bin 0 -> 3323 bytes .../css/jquery_plugins/index.html | 10 + .../jquery-ui-timepicker-addon.css | 10 + .../css/jquery_plugins/jquery.ui.datetime.css | 116 + .../css/jquery_plugins/ui.multiselect.css | 32 + .../uniform/images/bg-input-focus.png | Bin 0 -> 143 bytes .../uniform/images/bg-input.png | Bin 0 -> 143 bytes .../jquery_plugins/uniform/images/sprite.png | Bin 0 -> 34229 bytes .../uniform/uniform.default.css | 644 + assets/grocery_crud/css/ui/index.html | 10 + .../css/ui/simple/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 274 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 271 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 387 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 272 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 375 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 368 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 384 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 360 bytes .../simple/images/ui-icons_222222_256x240.png | Bin 0 -> 6781 bytes .../simple/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4353 bytes .../simple/images/ui-icons_333333_256x240.png | Bin 0 -> 6813 bytes .../simple/images/ui-icons_454545_256x240.png | Bin 0 -> 6854 bytes .../simple/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4353 bytes assets/grocery_crud/css/ui/simple/index.html | 10 + .../ui/simple/jquery-ui-1.10.1.custom.min.css | 5 + assets/grocery_crud/index.html | 10 + assets/grocery_crud/js/common/lazyload-min.js | 7 + assets/grocery_crud/js/common/list.js | 82 + assets/grocery_crud/js/index.html | 10 + assets/grocery_crud/js/jquery-1.11.1.js | 10308 ++++++++++++++ assets/grocery_crud/js/jquery-1.11.1.min.js | 4 + assets/grocery_crud/js/jquery-1.11.1.min.map | 1 + .../js/jquery_plugins/ajax-chosen.js | 87 + .../js/jquery_plugins/config/index.html | 10 + .../jquery-ui-timepicker-addon.config.js | 17 + .../config/jquery.chosen.config.js | 3 + .../config/jquery.ckeditor.config.js | 4 + .../config/jquery.datepicker.config.js | 16 + .../config/jquery.datetime.config.js | 14 + .../config/jquery.fancybox.config.js | 9 + .../config/jquery.fileupload.config.js | 160 + .../config/jquery.markitup.config.js | 35 + .../config/jquery.multiselect.js | 3 + .../config/jquery.noty.config.js | 53 + .../config/jquery.numeric.config.js | 36 + .../config/jquery.tine_mce.config.js | 47 + .../config/jquery.uniform.config.js | 3 + .../grocery_crud/js/jquery_plugins/index.html | 10 + .../jquery-ui-timepicker-addon.js | 2103 +++ .../jquery-ui-timepicker-addon.min.js | 69 + .../js/jquery_plugins/jquery.chosen.js | 1257 ++ .../js/jquery_plugins/jquery.chosen.min.js | 2 + .../jquery_plugins/jquery.easing-1.3.pack.js | 72 + .../jquery_plugins/jquery.fancybox-1.3.4.js | 1156 ++ .../js/jquery_plugins/jquery.fancybox.js | 1156 ++ .../js/jquery_plugins/jquery.fancybox.pack.js | 46 + .../js/jquery_plugins/jquery.fileupload.js | 840 ++ .../js/jquery_plugins/jquery.form.js | 1278 ++ .../js/jquery_plugins/jquery.form.min.js | 7 + .../jquery_plugins/jquery.iframe-transport.js | 165 + .../js/jquery_plugins/jquery.noty.js | 667 + .../js/jquery_plugins/jquery.numeric.min.js | 2 + .../js/jquery_plugins/jquery.ui.datetime.js | 318 + .../js/jquery_plugins/jquery.uniform.js | 967 ++ .../js/jquery_plugins/jquery.uniform.min.js | 1 + .../js/jquery_plugins/load-image.min.js | 3 + .../js/jquery_plugins/tmpl.min.js | 2 + .../js/jquery_plugins/ui.multiselect.min.js | 2 + .../ui/i18n/datepicker/index.html | 10 + .../datepicker/jquery.ui.datepicker-af.js | 23 + .../datepicker/jquery.ui.datepicker-ar.js | 23 + .../datepicker/jquery.ui.datepicker-bg.js | 24 + .../datepicker/jquery.ui.datepicker-bn.js | 21 + .../datepicker/jquery.ui.datepicker-cs.js | 23 + .../datepicker/jquery.ui.datepicker-da.js | 23 + .../datepicker/jquery.ui.datepicker-de.js | 23 + .../datepicker/jquery.ui.datepicker-el.js | 23 + .../datepicker/jquery.ui.datepicker-es.js | 23 + .../datepicker/jquery.ui.datepicker-fa.js | 59 + .../datepicker/jquery.ui.datepicker-fr.js | 25 + .../datepicker/jquery.ui.datepicker-hu.js | 23 + .../datepicker/jquery.ui.datepicker-id.js | 23 + .../datepicker/jquery.ui.datepicker-it.js | 23 + .../datepicker/jquery.ui.datepicker-ja.js | 23 + .../datepicker/jquery.ui.datepicker-ko.js | 23 + .../datepicker/jquery.ui.datepicker-nl.js | 23 + .../datepicker/jquery.ui.datepicker-no.js | 23 + .../datepicker/jquery.ui.datepicker-pl.js | 23 + .../datepicker/jquery.ui.datepicker-pt-br.js | 23 + .../datepicker/jquery.ui.datepicker-pt.js | 22 + .../datepicker/jquery.ui.datepicker-ro.js | 26 + .../datepicker/jquery.ui.datepicker-ru.js | 23 + .../datepicker/jquery.ui.datepicker-sk.js | 23 + .../datepicker/jquery.ui.datepicker-th.js | 23 + .../datepicker/jquery.ui.datepicker-tr.js | 23 + .../datepicker/jquery.ui.datepicker-uk.js | 24 + .../datepicker/jquery.ui.datepicker-vi.js | 23 + .../datepicker/jquery.ui.datepicker-zh-cn.js | 23 + .../js/jquery_plugins/ui/i18n/index.html | 10 + .../ui/i18n/multiselect/index.html | 10 + .../ui/i18n/multiselect/ui-multiselect-ar.js | 12 + .../ui/i18n/multiselect/ui-multiselect-de.js | 11 + .../ui/i18n/multiselect/ui-multiselect-el.js | 11 + .../ui/i18n/multiselect/ui-multiselect-en.js | 11 + .../ui/i18n/multiselect/ui-multiselect-es.js | 11 + .../ui/i18n/multiselect/ui-multiselect-fr.js | 11 + .../ui/i18n/multiselect/ui-multiselect-it.js | 13 + .../ui/i18n/multiselect/ui-multiselect-ja.js | 11 + .../i18n/multiselect/ui-multiselect-pt-br.js | 11 + .../ui/i18n/multiselect/ui-multiselect-ru.js | 11 + .../ui/i18n/multiselect/ui-multiselect-uk.js | 11 + .../ui/i18n/timepicker/index.html | 10 + .../timepicker/jquery-ui-timepicker-af.js | 21 + .../timepicker/jquery-ui-timepicker-ar.js | 21 + .../timepicker/jquery-ui-timepicker-bg.js | 21 + .../timepicker/jquery-ui-timepicker-cs.js | 21 + .../timepicker/jquery-ui-timepicker-de.js | 21 + .../timepicker/jquery-ui-timepicker-el.js | 21 + .../timepicker/jquery-ui-timepicker-es.js | 21 + .../timepicker/jquery-ui-timepicker-fr.js | 21 + .../timepicker/jquery-ui-timepicker-hu.js | 21 + .../timepicker/jquery-ui-timepicker-id.js | 21 + .../timepicker/jquery-ui-timepicker-it.js | 21 + .../timepicker/jquery-ui-timepicker-ja.js | 21 + .../timepicker/jquery-ui-timepicker-ko.js | 21 + .../timepicker/jquery-ui-timepicker-nl.js | 21 + .../timepicker/jquery-ui-timepicker-no.js | 20 + .../timepicker/jquery-ui-timepicker-pl.js | 21 + .../timepicker/jquery-ui-timepicker-pt-br.js | 21 + .../timepicker/jquery-ui-timepicker-pt.js | 21 + .../timepicker/jquery-ui-timepicker-ro.js | 21 + .../timepicker/jquery-ui-timepicker-ru.js | 21 + .../timepicker/jquery-ui-timepicker-sk.js | 21 + .../timepicker/jquery-ui-timepicker-tr.js | 21 + .../timepicker/jquery-ui-timepicker-uk.js | 21 + .../timepicker/jquery-ui-timepicker-vi.js | 21 + .../timepicker/jquery-ui-timepicker-zh-cn.js | 21 + .../js/jquery_plugins/ui/index.html | 10 + .../ui/jquery-ui-1.10.3.custom.min.js | 7 + .../languages/add-new-lang-string.sh | 7 + assets/grocery_crud/languages/afrikaans.php | 91 + assets/grocery_crud/languages/arabic.php | 90 + assets/grocery_crud/languages/bengali.php | 91 + assets/grocery_crud/languages/bulgarian.php | 88 + assets/grocery_crud/languages/catalan.php | 90 + assets/grocery_crud/languages/chinese.php | 88 + assets/grocery_crud/languages/czech.php | 88 + assets/grocery_crud/languages/danish.php | 89 + assets/grocery_crud/languages/dutch.php | 88 + assets/grocery_crud/languages/english.php | 91 + assets/grocery_crud/languages/french.php | 88 + assets/grocery_crud/languages/german.php | 87 + assets/grocery_crud/languages/greek.php | 87 + assets/grocery_crud/languages/hindi.php | 92 + assets/grocery_crud/languages/hungarian.php | 90 + assets/grocery_crud/languages/index.html | 10 + assets/grocery_crud/languages/indonesian.php | 94 + assets/grocery_crud/languages/italian.php | 73 + assets/grocery_crud/languages/japanese.php | 88 + assets/grocery_crud/languages/korean.php | 87 + assets/grocery_crud/languages/lithuanian.php | 88 + assets/grocery_crud/languages/mongolian.php | 93 + assets/grocery_crud/languages/norwegian.php | 91 + assets/grocery_crud/languages/persian.php | 88 + assets/grocery_crud/languages/polish.php | 88 + .../languages/pt-br.portuguese.php | 89 + .../languages/pt-pt.portuguese.php | 89 + assets/grocery_crud/languages/romanian.php | 89 + assets/grocery_crud/languages/russian.php | 88 + assets/grocery_crud/languages/slovak.php | 87 + assets/grocery_crud/languages/spanish.php | 89 + assets/grocery_crud/languages/thai.php | 88 + assets/grocery_crud/languages/turkish.php | 91 + assets/grocery_crud/languages/ukrainian.php | 88 + assets/grocery_crud/languages/vietnamese.php | 88 + assets/grocery_crud/license-gpl3.txt | 674 + assets/grocery_crud/license-grocery-crud.txt | 7 + assets/grocery_crud/license-mit.txt | 21 + .../texteditor/ckeditor/LICENSE.html | 1327 ++ .../texteditor/ckeditor/adapters/jquery.js | 6 + .../texteditor/ckeditor/ckeditor.js | 153 + .../texteditor/ckeditor/ckeditor.php | 29 + .../texteditor/ckeditor/ckeditor_php4.php | 566 + .../texteditor/ckeditor/ckeditor_php5.php | 556 + .../texteditor/ckeditor/config.js | 11 + .../texteditor/ckeditor/contents.css | 25 + .../texteditor/ckeditor/images/spacer.gif | Bin 0 -> 43 bytes .../texteditor/ckeditor/lang/_languages.js | 6 + .../ckeditor/lang/_translationstatus.txt | 65 + .../texteditor/ckeditor/lang/af.js | 6 + .../texteditor/ckeditor/lang/ar.js | 6 + .../texteditor/ckeditor/lang/bg.js | 6 + .../texteditor/ckeditor/lang/bn.js | 6 + .../texteditor/ckeditor/lang/bs.js | 6 + .../texteditor/ckeditor/lang/ca.js | 6 + .../texteditor/ckeditor/lang/cs.js | 6 + .../texteditor/ckeditor/lang/cy.js | 6 + .../texteditor/ckeditor/lang/da.js | 6 + .../texteditor/ckeditor/lang/de.js | 6 + .../texteditor/ckeditor/lang/el.js | 6 + .../texteditor/ckeditor/lang/en-au.js | 6 + .../texteditor/ckeditor/lang/en-ca.js | 6 + .../texteditor/ckeditor/lang/en-gb.js | 6 + .../texteditor/ckeditor/lang/en.js | 6 + .../texteditor/ckeditor/lang/eo.js | 6 + .../texteditor/ckeditor/lang/es.js | 6 + .../texteditor/ckeditor/lang/et.js | 6 + .../texteditor/ckeditor/lang/eu.js | 6 + .../texteditor/ckeditor/lang/fa.js | 822 ++ .../texteditor/ckeditor/lang/fi.js | 6 + .../texteditor/ckeditor/lang/fo.js | 6 + .../texteditor/ckeditor/lang/fr-ca.js | 6 + .../texteditor/ckeditor/lang/fr.js | 6 + .../texteditor/ckeditor/lang/gl.js | 6 + .../texteditor/ckeditor/lang/gu.js | 6 + .../texteditor/ckeditor/lang/he.js | 6 + .../texteditor/ckeditor/lang/hi.js | 6 + .../texteditor/ckeditor/lang/hr.js | 6 + .../texteditor/ckeditor/lang/hu.js | 6 + .../texteditor/ckeditor/lang/id.js | 6 + .../texteditor/ckeditor/lang/is.js | 6 + .../texteditor/ckeditor/lang/it.js | 6 + .../texteditor/ckeditor/lang/ja.js | 6 + .../texteditor/ckeditor/lang/ka.js | 6 + .../texteditor/ckeditor/lang/km.js | 6 + .../texteditor/ckeditor/lang/ko.js | 6 + .../texteditor/ckeditor/lang/ku.js | 821 ++ .../texteditor/ckeditor/lang/lt.js | 6 + .../texteditor/ckeditor/lang/lv.js | 6 + .../texteditor/ckeditor/lang/mk.js | 6 + .../texteditor/ckeditor/lang/mn.js | 6 + .../texteditor/ckeditor/lang/ms.js | 6 + .../texteditor/ckeditor/lang/nb.js | 6 + .../texteditor/ckeditor/lang/nl.js | 6 + .../texteditor/ckeditor/lang/no.js | 6 + .../texteditor/ckeditor/lang/pl.js | 6 + .../texteditor/ckeditor/lang/pt-br.js | 6 + .../texteditor/ckeditor/lang/pt.js | 6 + .../texteditor/ckeditor/lang/ro.js | 6 + .../texteditor/ckeditor/lang/ru.js | 6 + .../texteditor/ckeditor/lang/sk.js | 6 + .../texteditor/ckeditor/lang/sl.js | 6 + .../texteditor/ckeditor/lang/sr-latn.js | 6 + .../texteditor/ckeditor/lang/sr.js | 6 + .../texteditor/ckeditor/lang/sv.js | 6 + .../texteditor/ckeditor/lang/th.js | 6 + .../texteditor/ckeditor/lang/tr.js | 6 + .../texteditor/ckeditor/lang/ug.js | 6 + .../texteditor/ckeditor/lang/uk.js | 6 + .../texteditor/ckeditor/lang/vi.js | 6 + .../texteditor/ckeditor/lang/zh-cn.js | 6 + .../texteditor/ckeditor/lang/zh.js | 6 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 7 + .../a11yhelp/lang/_translationstatus.txt | 27 + .../ckeditor/plugins/a11yhelp/lang/cs.js | 6 + .../ckeditor/plugins/a11yhelp/lang/cy.js | 6 + .../ckeditor/plugins/a11yhelp/lang/da.js | 6 + .../ckeditor/plugins/a11yhelp/lang/de.js | 6 + .../ckeditor/plugins/a11yhelp/lang/el.js | 6 + .../ckeditor/plugins/a11yhelp/lang/en.js | 6 + .../ckeditor/plugins/a11yhelp/lang/eo.js | 6 + .../ckeditor/plugins/a11yhelp/lang/fa.js | 94 + .../ckeditor/plugins/a11yhelp/lang/fi.js | 6 + .../ckeditor/plugins/a11yhelp/lang/fr.js | 6 + .../ckeditor/plugins/a11yhelp/lang/gu.js | 6 + .../ckeditor/plugins/a11yhelp/lang/he.js | 6 + .../ckeditor/plugins/a11yhelp/lang/it.js | 6 + .../ckeditor/plugins/a11yhelp/lang/ku.js | 94 + .../ckeditor/plugins/a11yhelp/lang/mk.js | 6 + .../ckeditor/plugins/a11yhelp/lang/nb.js | 6 + .../ckeditor/plugins/a11yhelp/lang/nl.js | 6 + .../ckeditor/plugins/a11yhelp/lang/no.js | 6 + .../ckeditor/plugins/a11yhelp/lang/pt-br.js | 6 + .../ckeditor/plugins/a11yhelp/lang/ro.js | 6 + .../ckeditor/plugins/a11yhelp/lang/sk.js | 6 + .../ckeditor/plugins/a11yhelp/lang/tr.js | 6 + .../ckeditor/plugins/a11yhelp/lang/ug.js | 6 + .../ckeditor/plugins/a11yhelp/lang/vi.js | 6 + .../ckeditor/plugins/a11yhelp/lang/zh-cn.js | 6 + .../ckeditor/plugins/about/dialogs/about.js | 6 + .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 2759 bytes .../ckeditor/plugins/adobeair/plugin.js | 6 + .../ckeditor/plugins/ajax/plugin.js | 6 + .../ckeditor/plugins/autogrow/plugin.js | 6 + .../ckeditor/plugins/bbcode/plugin.js | 9 + .../plugins/clipboard/dialogs/paste.js | 7 + .../colordialog/dialogs/colordialog.js | 7 + .../devtools/lang/_translationstatus.txt | 30 + .../ckeditor/plugins/devtools/lang/bg.js | 6 + .../ckeditor/plugins/devtools/lang/cs.js | 6 + .../ckeditor/plugins/devtools/lang/cy.js | 6 + .../ckeditor/plugins/devtools/lang/da.js | 6 + .../ckeditor/plugins/devtools/lang/de.js | 6 + .../ckeditor/plugins/devtools/lang/el.js | 6 + .../ckeditor/plugins/devtools/lang/en.js | 6 + .../ckeditor/plugins/devtools/lang/eo.js | 6 + .../ckeditor/plugins/devtools/lang/et.js | 6 + .../ckeditor/plugins/devtools/lang/fa.js | 21 + .../ckeditor/plugins/devtools/lang/fi.js | 6 + .../ckeditor/plugins/devtools/lang/fr.js | 6 + .../ckeditor/plugins/devtools/lang/gu.js | 6 + .../ckeditor/plugins/devtools/lang/he.js | 6 + .../ckeditor/plugins/devtools/lang/hr.js | 6 + .../ckeditor/plugins/devtools/lang/it.js | 6 + .../ckeditor/plugins/devtools/lang/ku.js | 21 + .../ckeditor/plugins/devtools/lang/nb.js | 6 + .../ckeditor/plugins/devtools/lang/nl.js | 6 + .../ckeditor/plugins/devtools/lang/no.js | 6 + .../ckeditor/plugins/devtools/lang/pl.js | 6 + .../ckeditor/plugins/devtools/lang/pt-br.js | 6 + .../ckeditor/plugins/devtools/lang/sk.js | 6 + .../ckeditor/plugins/devtools/lang/tr.js | 6 + .../ckeditor/plugins/devtools/lang/ug.js | 6 + .../ckeditor/plugins/devtools/lang/uk.js | 6 + .../ckeditor/plugins/devtools/lang/vi.js | 6 + .../ckeditor/plugins/devtools/lang/zh-cn.js | 6 + .../ckeditor/plugins/devtools/plugin.js | 6 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/div/dialogs/div.js | 8 + .../plugins/docprops/dialogs/docprops.js | 10 + .../ckeditor/plugins/docprops/plugin.js | 6 + .../ckeditor/plugins/find/dialogs/find.js | 10 + .../ckeditor/plugins/flash/dialogs/flash.js | 9 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/forms/dialogs/button.js | 6 + .../plugins/forms/dialogs/checkbox.js | 6 + .../ckeditor/plugins/forms/dialogs/form.js | 6 + .../plugins/forms/dialogs/hiddenfield.js | 6 + .../ckeditor/plugins/forms/dialogs/radio.js | 6 + .../ckeditor/plugins/forms/dialogs/select.js | 9 + .../plugins/forms/dialogs/textarea.js | 6 + .../plugins/forms/dialogs/textfield.js | 6 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 105 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 7 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 449 bytes .../ckeditor/plugins/iframedialog/plugin.js | 6 + .../ckeditor/plugins/image/dialogs/image.js | 13 + .../ckeditor/plugins/link/dialogs/anchor.js | 6 + .../ckeditor/plugins/link/dialogs/link.js | 12 + .../ckeditor/plugins/link/images/anchor.gif | Bin 0 -> 184 bytes .../plugins/liststyle/dialogs/liststyle.js | 7 + .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 54 bytes .../plugins/pastefromword/filter/default.js | 11 + .../plugins/pastetext/dialogs/pastetext.js | 6 + .../placeholder/dialogs/placeholder.js | 6 + .../placeholder/lang/_translationstatus.txt | 29 + .../ckeditor/plugins/placeholder/lang/bg.js | 6 + .../ckeditor/plugins/placeholder/lang/cs.js | 6 + .../ckeditor/plugins/placeholder/lang/cy.js | 6 + .../ckeditor/plugins/placeholder/lang/da.js | 6 + .../ckeditor/plugins/placeholder/lang/de.js | 6 + .../ckeditor/plugins/placeholder/lang/el.js | 6 + .../ckeditor/plugins/placeholder/lang/en.js | 6 + .../ckeditor/plugins/placeholder/lang/eo.js | 6 + .../ckeditor/plugins/placeholder/lang/et.js | 6 + .../ckeditor/plugins/placeholder/lang/fa.js | 21 + .../ckeditor/plugins/placeholder/lang/fi.js | 6 + .../ckeditor/plugins/placeholder/lang/fr.js | 6 + .../ckeditor/plugins/placeholder/lang/he.js | 6 + .../ckeditor/plugins/placeholder/lang/hr.js | 6 + .../ckeditor/plugins/placeholder/lang/it.js | 6 + .../ckeditor/plugins/placeholder/lang/ku.js | 21 + .../ckeditor/plugins/placeholder/lang/nb.js | 6 + .../ckeditor/plugins/placeholder/lang/nl.js | 6 + .../ckeditor/plugins/placeholder/lang/no.js | 6 + .../ckeditor/plugins/placeholder/lang/pl.js | 6 + .../plugins/placeholder/lang/pt-br.js | 6 + .../ckeditor/plugins/placeholder/lang/sk.js | 6 + .../ckeditor/plugins/placeholder/lang/tr.js | 6 + .../ckeditor/plugins/placeholder/lang/ug.js | 6 + .../ckeditor/plugins/placeholder/lang/uk.js | 6 + .../ckeditor/plugins/placeholder/lang/vi.js | 6 + .../plugins/placeholder/lang/zh-cn.js | 6 + .../plugins/placeholder/placeholder.gif | Bin 0 -> 96 bytes .../ckeditor/plugins/placeholder/plugin.js | 6 + .../ckeditor/plugins/preview/preview.html | 10 + .../ckeditor/plugins/scayt/dialogs/options.js | 8 + .../plugins/scayt/dialogs/toolbar.css | 6 + .../showblocks/images/block_address.png | Bin 0 -> 171 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 181 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 136 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 134 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 131 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 129 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 119 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 136 bytes .../ckeditor/plugins/smiley/dialogs/smiley.js | 7 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 465 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 443 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 192 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 464 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 468 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 436 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 426 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 183 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 241 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 368 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 451 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 450 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 460 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 449 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 408 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 396 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 446 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 452 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 458 bytes .../specialchar/dialogs/specialchar.js | 7 + .../specialchar/lang/_translationstatus.txt | 23 + .../ckeditor/plugins/specialchar/lang/cs.js | 6 + .../ckeditor/plugins/specialchar/lang/cy.js | 6 + .../ckeditor/plugins/specialchar/lang/de.js | 6 + .../ckeditor/plugins/specialchar/lang/el.js | 6 + .../ckeditor/plugins/specialchar/lang/en.js | 6 + .../ckeditor/plugins/specialchar/lang/eo.js | 6 + .../ckeditor/plugins/specialchar/lang/et.js | 6 + .../ckeditor/plugins/specialchar/lang/fa.js | 131 + .../ckeditor/plugins/specialchar/lang/fi.js | 6 + .../ckeditor/plugins/specialchar/lang/fr.js | 6 + .../ckeditor/plugins/specialchar/lang/he.js | 6 + .../ckeditor/plugins/specialchar/lang/hr.js | 6 + .../ckeditor/plugins/specialchar/lang/it.js | 6 + .../ckeditor/plugins/specialchar/lang/ku.js | 131 + .../ckeditor/plugins/specialchar/lang/nb.js | 6 + .../ckeditor/plugins/specialchar/lang/nl.js | 6 + .../ckeditor/plugins/specialchar/lang/no.js | 6 + .../plugins/specialchar/lang/pt-br.js | 6 + .../ckeditor/plugins/specialchar/lang/tr.js | 6 + .../ckeditor/plugins/specialchar/lang/ug.js | 6 + .../plugins/specialchar/lang/zh-cn.js | 6 + .../ckeditor/plugins/styles/styles/default.js | 6 + .../plugins/stylesheetparser/plugin.js | 6 + .../ckeditor/plugins/table/dialogs/table.js | 9 + .../ckeditor/plugins/tableresize/plugin.js | 7 + .../plugins/tabletools/dialogs/tableCell.js | 8 + .../plugins/templates/dialogs/templates.js | 7 + .../plugins/templates/templates/default.js | 6 + .../templates/templates/images/template1.gif | Bin 0 -> 375 bytes .../templates/templates/images/template2.gif | Bin 0 -> 333 bytes .../templates/templates/images/template3.gif | Bin 0 -> 422 bytes .../plugins/uicolor/dialogs/uicolor.js | 7 + .../uicolor/lang/_translationstatus.txt | 30 + .../ckeditor/plugins/uicolor/lang/bg.js | 6 + .../ckeditor/plugins/uicolor/lang/cs.js | 6 + .../ckeditor/plugins/uicolor/lang/cy.js | 6 + .../ckeditor/plugins/uicolor/lang/da.js | 6 + .../ckeditor/plugins/uicolor/lang/de.js | 6 + .../ckeditor/plugins/uicolor/lang/el.js | 6 + .../ckeditor/plugins/uicolor/lang/en.js | 6 + .../ckeditor/plugins/uicolor/lang/eo.js | 6 + .../ckeditor/plugins/uicolor/lang/et.js | 6 + .../ckeditor/plugins/uicolor/lang/fa.js | 20 + .../ckeditor/plugins/uicolor/lang/fi.js | 6 + .../ckeditor/plugins/uicolor/lang/fr.js | 6 + .../ckeditor/plugins/uicolor/lang/he.js | 6 + .../ckeditor/plugins/uicolor/lang/hr.js | 6 + .../ckeditor/plugins/uicolor/lang/it.js | 6 + .../ckeditor/plugins/uicolor/lang/ku.js | 20 + .../ckeditor/plugins/uicolor/lang/mk.js | 6 + .../ckeditor/plugins/uicolor/lang/nb.js | 6 + .../ckeditor/plugins/uicolor/lang/nl.js | 6 + .../ckeditor/plugins/uicolor/lang/no.js | 6 + .../ckeditor/plugins/uicolor/lang/pl.js | 6 + .../ckeditor/plugins/uicolor/lang/pt-br.js | 6 + .../ckeditor/plugins/uicolor/lang/sk.js | 6 + .../ckeditor/plugins/uicolor/lang/tr.js | 6 + .../ckeditor/plugins/uicolor/lang/ug.js | 6 + .../ckeditor/plugins/uicolor/lang/uk.js | 6 + .../ckeditor/plugins/uicolor/lang/vi.js | 6 + .../ckeditor/plugins/uicolor/lang/zh-cn.js | 6 + .../ckeditor/plugins/uicolor/plugin.js | 6 + .../ckeditor/plugins/uicolor/uicolor.gif | Bin 0 -> 1108 bytes .../plugins/uicolor/yui/assets/hue_bg.png | Bin 0 -> 1120 bytes .../plugins/uicolor/yui/assets/hue_thumb.png | Bin 0 -> 195 bytes .../uicolor/yui/assets/picker_mask.png | Bin 0 -> 12174 bytes .../uicolor/yui/assets/picker_thumb.png | Bin 0 -> 192 bytes .../plugins/uicolor/yui/assets/yui.css | 6 + .../ckeditor/plugins/uicolor/yui/yui.js | 76 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 49 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 6 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 7 + .../texteditor/ckeditor/plugins/xml/plugin.js | 6 + .../texteditor/ckeditor/skins/kama/dialog.css | 10 + .../texteditor/ckeditor/skins/kama/editor.css | 13 + .../texteditor/ckeditor/skins/kama/icons.png | Bin 0 -> 5598 bytes .../ckeditor/skins/kama/icons_rtl.png | Bin 0 -> 5600 bytes .../skins/kama/images/dialog_sides.gif | Bin 0 -> 48 bytes .../skins/kama/images/dialog_sides.png | Bin 0 -> 178 bytes .../skins/kama/images/dialog_sides_rtl.png | Bin 0 -> 181 bytes .../ckeditor/skins/kama/images/mini.gif | Bin 0 -> 183 bytes .../ckeditor/skins/kama/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor/skins/kama/images/sprites.png | Bin 0 -> 7086 bytes .../skins/kama/images/sprites_ie6.png | Bin 0 -> 2724 bytes .../skins/kama/images/toolbar_start.gif | Bin 0 -> 105 bytes .../texteditor/ckeditor/skins/kama/skin.js | 7 + .../ckeditor/skins/kama/templates.css | 6 + .../ckeditor/themes/default/theme.js | 8 + .../grocery_crud/themes/datatables/config.php | 2 + .../themes/datatables/css/datatables.css | 279 + .../themes/datatables/css/demo_table_jui.css | 526 + .../themes/datatables/css/images/error.png | Bin 0 -> 1469 bytes .../themes/datatables/css/images/index.html | 10 + .../datatables/css/images/small-loading.gif | Bin 0 -> 847 bytes .../themes/datatables/css/images/success.png | Bin 0 -> 781 bytes .../themes/datatables/css/index.html | 10 + .../datatables/css/jquery.dataTables.css | 220 + .../TableTools/media/as3/ZeroClipboard.as | 221 + .../TableTools/media/as3/ZeroClipboardPdf.as | 310 + .../TableTools/media/as3/lib/AlivePDF.swc | Bin 0 -> 131230 bytes .../TableTools/media/css/TableTools.css | 315 + .../TableTools/media/css/TableTools_JUI.css | 183 + .../TableTools/media/images/background.png | Bin 0 -> 944 bytes .../TableTools/media/images/collection.png | Bin 0 -> 1166 bytes .../media/images/collection_hover.png | Bin 0 -> 1194 bytes .../extras/TableTools/media/images/copy.png | Bin 0 -> 2184 bytes .../TableTools/media/images/copy_hover.png | Bin 0 -> 2797 bytes .../extras/TableTools/media/images/csv.png | Bin 0 -> 1607 bytes .../TableTools/media/images/csv_hover.png | Bin 0 -> 1854 bytes .../extras/TableTools/media/images/pdf.png | Bin 0 -> 4325 bytes .../TableTools/media/images/pdf_hover.png | Bin 0 -> 2786 bytes .../extras/TableTools/media/images/print.png | Bin 0 -> 2123 bytes .../TableTools/media/images/print_hover.png | Bin 0 -> 2230 bytes .../media/images/psd/collection.psd | Bin 0 -> 25792 bytes .../media/images/psd/copy document.psd | Bin 0 -> 104729 bytes .../media/images/psd/file_types.psd | Bin 0 -> 1090645 bytes .../TableTools/media/images/psd/printer.psd | Bin 0 -> 119952 bytes .../extras/TableTools/media/images/xls.png | Bin 0 -> 1641 bytes .../TableTools/media/images/xls_hover.png | Bin 0 -> 2061 bytes .../extras/TableTools/media/js/TableTools.js | 2406 ++++ .../TableTools/media/js/TableTools.min.js | 76 + .../TableTools/media/js/TableTools.min.js.gz | Bin 0 -> 8688 bytes .../TableTools/media/js/ZeroClipboard.js | 367 + .../TableTools/media/swf/copy_csv_xls.swf | Bin 0 -> 2139 bytes .../TableTools/media/swf/copy_csv_xls_pdf.swf | Bin 0 -> 58813 bytes .../grocery_crud/themes/datatables/index.html | 10 + .../themes/datatables/js/datatables-add.js | 143 + .../themes/datatables/js/datatables-edit.js | 99 + .../themes/datatables/js/datatables-extras.js | 26 + .../themes/datatables/js/datatables.js | 238 + .../themes/datatables/js/index.html | 10 + .../themes/datatables/js/jquery.dataTables.js | 11863 ++++++++++++++++ .../datatables/js/jquery.dataTables.min.js | 154 + .../themes/datatables/views/add.php | 77 + .../themes/datatables/views/edit.php | 78 + .../themes/datatables/views/list.php | 74 + .../themes/datatables/views/list_template.php | 124 + .../themes/datatables/views/read.php | 66 + .../grocery_crud/themes/flexigrid/config.php | 2 + .../themes/flexigrid/css/flexigrid.css | 1455 ++ .../themes/flexigrid/css/images/add.png | Bin 0 -> 837 bytes .../themes/flexigrid/css/images/bg.gif | Bin 0 -> 854 bytes .../flexigrid/css/images/btn-sprite.gif | Bin 0 -> 955 bytes .../themes/flexigrid/css/images/close.png | Bin 0 -> 828 bytes .../themes/flexigrid/css/images/ddn.png | Bin 0 -> 111 bytes .../themes/flexigrid/css/images/dn.png | Bin 0 -> 220 bytes .../themes/flexigrid/css/images/edit.png | Bin 0 -> 794 bytes .../themes/flexigrid/css/images/error.png | Bin 0 -> 1469 bytes .../themes/flexigrid/css/images/export.png | Bin 0 -> 684 bytes .../themes/flexigrid/css/images/fhbg.gif | Bin 0 -> 836 bytes .../themes/flexigrid/css/images/first.gif | Bin 0 -> 217 bytes .../themes/flexigrid/css/images/hl.png | Bin 0 -> 189 bytes .../themes/flexigrid/css/images/index.html | 10 + .../themes/flexigrid/css/images/last.gif | Bin 0 -> 220 bytes .../themes/flexigrid/css/images/line.gif | Bin 0 -> 817 bytes .../themes/flexigrid/css/images/load.gif | Bin 0 -> 1737 bytes .../themes/flexigrid/css/images/load.png | Bin 0 -> 827 bytes .../themes/flexigrid/css/images/magnifier.png | Bin 0 -> 615 bytes .../themes/flexigrid/css/images/next.gif | Bin 0 -> 185 bytes .../themes/flexigrid/css/images/prev.gif | Bin 0 -> 186 bytes .../themes/flexigrid/css/images/print.png | Bin 0 -> 662 bytes .../themes/flexigrid/css/images/success.png | Bin 0 -> 781 bytes .../themes/flexigrid/css/images/up.png | Bin 0 -> 224 bytes .../themes/flexigrid/css/images/uup.png | Bin 0 -> 130 bytes .../themes/flexigrid/css/images/wbg.gif | Bin 0 -> 868 bytes .../themes/flexigrid/css/index.html | 10 + .../grocery_crud/themes/flexigrid/index.html | 10 + .../themes/flexigrid/js/cookies.js | 25 + .../themes/flexigrid/js/flexigrid-add.js | 146 + .../themes/flexigrid/js/flexigrid-edit.js | 115 + .../themes/flexigrid/js/flexigrid.js | 269 + .../themes/flexigrid/js/index.html | 10 + .../themes/flexigrid/js/jquery.form.js | 825 ++ .../flexigrid/js/jquery.printElement.js | 176 + .../flexigrid/js/jquery.printElement.min.js | 28 + .../themes/flexigrid/views/add.php | 81 + .../themes/flexigrid/views/edit.php | 82 + .../themes/flexigrid/views/list.php | 77 + .../themes/flexigrid/views/list_template.php | 187 + .../themes/flexigrid/views/read.php | 73 + assets/grocery_crud/themes/index.html | 10 + assets/index.html | 10 + assets/uploads/files/index.html | 10 + assets/uploads/files/pdftest.pdf | 157 + assets/uploads/files/test-2.pdf | 157 + assets/uploads/index.html | 10 + ci_hack.php | 41 +- favicon.ico | Bin 0 -> 24702 bytes system/dbupdate_3.0.php | 2 +- tests/codeception.dist.yml | 23 +- tests/codeception/_data/dump.sql | 131 +- tests/codeception/acceptance.suite.dist.yml | 2 +- .../acceptance/VileSciSearchPersonCept.php | 16 + .../acceptance/VileSciStartPageCept.php | 26 + tests/codeception/api/LoginCept.php | 4 +- vilesci/index.php | 2 +- 659 files changed, 59893 insertions(+), 54 deletions(-) create mode 100644 CI_hybrid.asciidoc create mode 100644 application/controllers/organisation/Studiengang2.php create mode 100644 application/helpers/fhcdb_helper.php create mode 100755 application/models/Grocery_crud_model.php create mode 100644 application/models/message/Message_model.php create mode 100644 application/models/message/message_model.php create mode 100644 application/seeds/001_person.php create mode 100644 assets/grocery_crud/config/index.html create mode 100644 assets/grocery_crud/config/language_alias.php create mode 100644 assets/grocery_crud/config/translit_chars.php create mode 100644 assets/grocery_crud/css/index.html create mode 100644 assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite.png create mode 100644 assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite@2x.png create mode 100644 assets/grocery_crud/css/jquery_plugins/chosen/chosen.css create mode 100644 assets/grocery_crud/css/jquery_plugins/chosen/chosen.min.css create mode 100644 assets/grocery_crud/css/jquery_plugins/chosen/index.html create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/blank.gif create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_close.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_loading.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_left.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_right.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_e.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_n.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_ne.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_nw.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_s.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_se.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_sw.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_w.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_left.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_main.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_over.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_right.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancybox-x.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancybox-y.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/fancybox.png create mode 100644 assets/grocery_crud/css/jquery_plugins/fancybox/jquery.fancybox.css create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/bootstrap.min.css create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/file-uploader.css create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/fileuploader.css create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/jquery.fileupload-ui.css create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/loading.gif create mode 100644 assets/grocery_crud/css/jquery_plugins/file_upload/progressbar.gif create mode 100644 assets/grocery_crud/css/jquery_plugins/index.html create mode 100644 assets/grocery_crud/css/jquery_plugins/jquery-ui-timepicker-addon.css create mode 100644 assets/grocery_crud/css/jquery_plugins/jquery.ui.datetime.css create mode 100644 assets/grocery_crud/css/jquery_plugins/ui.multiselect.css create mode 100644 assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input-focus.png create mode 100644 assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input.png create mode 100644 assets/grocery_crud/css/jquery_plugins/uniform/images/sprite.png create mode 100644 assets/grocery_crud/css/jquery_plugins/uniform/uniform.default.css create mode 100644 assets/grocery_crud/css/ui/index.html create mode 100644 assets/grocery_crud/css/ui/simple/images/animated-overlay.gif create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-icons_222222_256x240.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-icons_2e83ff_256x240.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-icons_333333_256x240.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-icons_454545_256x240.png create mode 100644 assets/grocery_crud/css/ui/simple/images/ui-icons_cd0a0a_256x240.png create mode 100644 assets/grocery_crud/css/ui/simple/index.html create mode 100644 assets/grocery_crud/css/ui/simple/jquery-ui-1.10.1.custom.min.css create mode 100644 assets/grocery_crud/index.html create mode 100644 assets/grocery_crud/js/common/lazyload-min.js create mode 100644 assets/grocery_crud/js/common/list.js create mode 100644 assets/grocery_crud/js/index.html create mode 100644 assets/grocery_crud/js/jquery-1.11.1.js create mode 100644 assets/grocery_crud/js/jquery-1.11.1.min.js create mode 100644 assets/grocery_crud/js/jquery-1.11.1.min.map create mode 100644 assets/grocery_crud/js/jquery_plugins/ajax-chosen.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery-ui-timepicker-addon.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.chosen.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.ckeditor.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.datepicker.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.datetime.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.fancybox.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.fileupload.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.markitup.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.multiselect.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.noty.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.numeric.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.tine_mce.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/config/jquery.uniform.config.js create mode 100644 assets/grocery_crud/js/jquery_plugins/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery-ui-timepicker-addon.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery-ui-timepicker-addon.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.chosen.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.chosen.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.easing-1.3.pack.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.fancybox-1.3.4.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.fancybox.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.fancybox.pack.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.fileupload.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.form.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.form.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.iframe-transport.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.noty.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.numeric.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.ui.datetime.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.uniform.js create mode 100644 assets/grocery_crud/js/jquery_plugins/jquery.uniform.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/load-image.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/tmpl.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui.multiselect.min.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-af.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ar.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bg.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bn.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-cs.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-da.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-de.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-el.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-es.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fa.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fr.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-hu.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-id.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-it.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ja.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ko.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-nl.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-no.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pl.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt-br.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ro.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ru.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-sk.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-th.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-tr.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-uk.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-vi.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-zh-cn.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ar.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-de.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-el.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-en.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-es.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-fr.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-it.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ja.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-pt-br.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ru.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-uk.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-af.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ar.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-bg.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-cs.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-de.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-el.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-es.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-fr.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-hu.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-id.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-it.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ja.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ko.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-nl.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-no.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pl.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt-br.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ro.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ru.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-sk.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-tr.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-uk.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-vi.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-zh-cn.js create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/index.html create mode 100644 assets/grocery_crud/js/jquery_plugins/ui/jquery-ui-1.10.3.custom.min.js create mode 100644 assets/grocery_crud/languages/add-new-lang-string.sh create mode 100644 assets/grocery_crud/languages/afrikaans.php create mode 100644 assets/grocery_crud/languages/arabic.php create mode 100644 assets/grocery_crud/languages/bengali.php create mode 100644 assets/grocery_crud/languages/bulgarian.php create mode 100755 assets/grocery_crud/languages/catalan.php create mode 100644 assets/grocery_crud/languages/chinese.php create mode 100644 assets/grocery_crud/languages/czech.php create mode 100644 assets/grocery_crud/languages/danish.php create mode 100644 assets/grocery_crud/languages/dutch.php create mode 100644 assets/grocery_crud/languages/english.php create mode 100644 assets/grocery_crud/languages/french.php create mode 100644 assets/grocery_crud/languages/german.php create mode 100644 assets/grocery_crud/languages/greek.php create mode 100644 assets/grocery_crud/languages/hindi.php create mode 100644 assets/grocery_crud/languages/hungarian.php create mode 100644 assets/grocery_crud/languages/index.html create mode 100644 assets/grocery_crud/languages/indonesian.php create mode 100644 assets/grocery_crud/languages/italian.php create mode 100644 assets/grocery_crud/languages/japanese.php create mode 100644 assets/grocery_crud/languages/korean.php create mode 100644 assets/grocery_crud/languages/lithuanian.php create mode 100644 assets/grocery_crud/languages/mongolian.php create mode 100644 assets/grocery_crud/languages/norwegian.php create mode 100644 assets/grocery_crud/languages/persian.php create mode 100644 assets/grocery_crud/languages/polish.php create mode 100644 assets/grocery_crud/languages/pt-br.portuguese.php create mode 100644 assets/grocery_crud/languages/pt-pt.portuguese.php create mode 100644 assets/grocery_crud/languages/romanian.php create mode 100644 assets/grocery_crud/languages/russian.php create mode 100644 assets/grocery_crud/languages/slovak.php create mode 100644 assets/grocery_crud/languages/spanish.php create mode 100644 assets/grocery_crud/languages/thai.php create mode 100644 assets/grocery_crud/languages/turkish.php create mode 100644 assets/grocery_crud/languages/ukrainian.php create mode 100644 assets/grocery_crud/languages/vietnamese.php create mode 100644 assets/grocery_crud/license-gpl3.txt create mode 100644 assets/grocery_crud/license-grocery-crud.txt create mode 100644 assets/grocery_crud/license-mit.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/LICENSE.html create mode 100644 assets/grocery_crud/texteditor/ckeditor/adapters/jquery.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/ckeditor.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/ckeditor.php create mode 100644 assets/grocery_crud/texteditor/ckeditor/ckeditor_php4.php create mode 100644 assets/grocery_crud/texteditor/ckeditor/ckeditor_php5.php create mode 100644 assets/grocery_crud/texteditor/ckeditor/config.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/contents.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/images/spacer.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/_languages.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/af.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ar.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/bg.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/bn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/bs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ca.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/da.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/en-au.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/en-ca.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/en-gb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/es.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/et.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/eu.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/fo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/fr-ca.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/gl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/gu.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/hi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/hr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/hu.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/id.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/is.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ja.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ka.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/km.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ko.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/lt.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/lv.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/mk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/mn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ms.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/pl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/pt.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ro.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ru.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/sk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/sl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/sr-latn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/sr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/sv.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/th.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/uk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/vi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/lang/zh.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/da.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/gu.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/mk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/ro.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/sk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/vi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/a11yhelp/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/about/dialogs/about.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/adobeair/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/ajax/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/autogrow/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/bbcode/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/bg.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/da.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/et.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/gu.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/hr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/pl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/sk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/uk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/vi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/devtools/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/div/dialogs/div.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/docprops/dialogs/docprops.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/docprops/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/find/dialogs/find.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/flash/images/placeholder.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/button.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/form.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/select.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/forms/images/hiddenfield.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/iframe/dialogs/iframe.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/iframe/images/placeholder.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/iframedialog/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/image/dialogs/image.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/link/dialogs/link.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/link/images/anchor.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/pastetext/dialogs/pastetext.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/dialogs/placeholder.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/bg.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/da.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/et.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/hr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/pl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/sk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/uk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/vi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/placeholder.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/placeholder/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/preview/preview.html create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/heart.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/et.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/hr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/specialchar/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/styles/styles/default.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/stylesheetparser/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/table/dialogs/table.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/tableresize/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/templates/templates/default.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/dialogs/uicolor.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/_translationstatus.txt create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/bg.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/cs.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/cy.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/da.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/de.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/el.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/en.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/eo.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/et.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/fa.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/fi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/fr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/he.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/hr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/it.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/ku.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/mk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/nb.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/nl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/no.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/pl.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/pt-br.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/sk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/tr.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/ug.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/uk.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/vi.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/lang/zh-cn.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/uicolor.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/assets/hue_bg.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/assets/picker_mask.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/assets/yui.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/uicolor/yui/yui.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/plugins/xml/plugin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/dialog.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/editor.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/icons.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/icons_rtl.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/dialog_sides.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/dialog_sides.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/dialog_sides_rtl.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/mini.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/noimage.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/sprites.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/sprites_ie6.png create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/images/toolbar_start.gif create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/skin.js create mode 100644 assets/grocery_crud/texteditor/ckeditor/skins/kama/templates.css create mode 100644 assets/grocery_crud/texteditor/ckeditor/themes/default/theme.js create mode 100644 assets/grocery_crud/themes/datatables/config.php create mode 100644 assets/grocery_crud/themes/datatables/css/datatables.css create mode 100644 assets/grocery_crud/themes/datatables/css/demo_table_jui.css create mode 100644 assets/grocery_crud/themes/datatables/css/images/error.png create mode 100644 assets/grocery_crud/themes/datatables/css/images/index.html create mode 100644 assets/grocery_crud/themes/datatables/css/images/small-loading.gif create mode 100644 assets/grocery_crud/themes/datatables/css/images/success.png create mode 100644 assets/grocery_crud/themes/datatables/css/index.html create mode 100644 assets/grocery_crud/themes/datatables/css/jquery.dataTables.css create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboard.as create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboardPdf.as create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/lib/AlivePDF.swc create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/css/TableTools.css create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/css/TableTools_JUI.css create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/background.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/collection.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/collection_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/copy.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/copy_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/pdf.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/pdf_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/print.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/print_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/collection.psd create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/copy document.psd create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/file_types.psd create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/printer.psd create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls_hover.png create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.js create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js.gz create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/js/ZeroClipboard.js create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/swf/copy_csv_xls.swf create mode 100644 assets/grocery_crud/themes/datatables/extras/TableTools/media/swf/copy_csv_xls_pdf.swf create mode 100644 assets/grocery_crud/themes/datatables/index.html create mode 100644 assets/grocery_crud/themes/datatables/js/datatables-add.js create mode 100644 assets/grocery_crud/themes/datatables/js/datatables-edit.js create mode 100644 assets/grocery_crud/themes/datatables/js/datatables-extras.js create mode 100644 assets/grocery_crud/themes/datatables/js/datatables.js create mode 100644 assets/grocery_crud/themes/datatables/js/index.html create mode 100644 assets/grocery_crud/themes/datatables/js/jquery.dataTables.js create mode 100644 assets/grocery_crud/themes/datatables/js/jquery.dataTables.min.js create mode 100644 assets/grocery_crud/themes/datatables/views/add.php create mode 100644 assets/grocery_crud/themes/datatables/views/edit.php create mode 100644 assets/grocery_crud/themes/datatables/views/list.php create mode 100644 assets/grocery_crud/themes/datatables/views/list_template.php create mode 100644 assets/grocery_crud/themes/datatables/views/read.php create mode 100644 assets/grocery_crud/themes/flexigrid/config.php create mode 100755 assets/grocery_crud/themes/flexigrid/css/flexigrid.css create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/add.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/bg.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/btn-sprite.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/close.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/ddn.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/dn.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/edit.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/error.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/export.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/fhbg.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/first.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/hl.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/index.html create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/last.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/line.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/load.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/load.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/magnifier.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/next.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/prev.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/print.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/success.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/up.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/uup.png create mode 100644 assets/grocery_crud/themes/flexigrid/css/images/wbg.gif create mode 100644 assets/grocery_crud/themes/flexigrid/css/index.html create mode 100644 assets/grocery_crud/themes/flexigrid/index.html create mode 100644 assets/grocery_crud/themes/flexigrid/js/cookies.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/flexigrid-add.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/flexigrid-edit.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/flexigrid.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/index.html create mode 100644 assets/grocery_crud/themes/flexigrid/js/jquery.form.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/jquery.printElement.js create mode 100644 assets/grocery_crud/themes/flexigrid/js/jquery.printElement.min.js create mode 100644 assets/grocery_crud/themes/flexigrid/views/add.php create mode 100644 assets/grocery_crud/themes/flexigrid/views/edit.php create mode 100644 assets/grocery_crud/themes/flexigrid/views/list.php create mode 100755 assets/grocery_crud/themes/flexigrid/views/list_template.php create mode 100644 assets/grocery_crud/themes/flexigrid/views/read.php create mode 100644 assets/grocery_crud/themes/index.html create mode 100644 assets/index.html create mode 100644 assets/uploads/files/index.html create mode 100644 assets/uploads/files/pdftest.pdf create mode 100644 assets/uploads/files/test-2.pdf create mode 100644 assets/uploads/index.html create mode 100644 favicon.ico create mode 100644 tests/codeception/acceptance/VileSciSearchPersonCept.php create mode 100644 tests/codeception/acceptance/VileSciStartPageCept.php diff --git a/.gitignore b/.gitignore index b27451708..af282a94b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,8 @@ documents/ .settings .project .buildpath +!/tests/codeception.yml +!/tests/codeception/api.suite.yml +!/tests/codeception/functional.suite.yml +!/tests/codeception/acceptance.suite.yml +!/submodules/d3/ diff --git a/CI_hybrid.asciidoc b/CI_hybrid.asciidoc new file mode 100644 index 000000000..827e382db --- /dev/null +++ b/CI_hybrid.asciidoc @@ -0,0 +1,13 @@ +CodeIgniter - FHComplete -> Hybrid Cyborg +========================================= + +== CodeIgniter Basics + +https://codeigniter.com/user_guide/ + +=== wichtige Pfadkonstanten + +* FCPATH -> dort wo die index.php liegt -> Bspl: /var/www/html/ +* BASEPATH -> Pfad zum CodeIgniter-Framework -> Bspl: '..../vendor/codeingiter/framework/system/' +* APPPATH -> Pfad zur Application-Folder '/var/www/html/application/' + diff --git a/application/controllers/organisation/Studiengang2.php b/application/controllers/organisation/Studiengang2.php new file mode 100644 index 000000000..600a1d17b --- /dev/null +++ b/application/controllers/organisation/Studiengang2.php @@ -0,0 +1,167 @@ +load->model('organisation/studiengang_model'); + $this->load->library('form_validation'); + } + + public function index() + { + $keyword = ''; + $this->load->library('pagination'); + + $config['base_url'] = base_url() . 'studiengang/index/'; + $config['total_rows'] = $this->studiengang_model->total_rows(); + $config['per_page'] = 10; + $config['uri_segment'] = 3; + $config['suffix'] = '.html'; + $config['first_url'] = base_url() . 'studiengang.html'; + $this->pagination->initialize($config); + + $start = $this->uri->segment(3, 0); + $studiengang = $this->studiengang_model->index_limit($config['per_page'], $start); + + $data = array( + 'studiengang_data' => $studiengang, + 'keyword' => $keyword, + 'pagination' => $this->pagination->create_links(), + 'total_rows' => $config['total_rows'], + 'start' => $start, + ); + + $this->load->view('tbl_studiengang_list', $data); + } + + public function search() + { + $keyword = $this->uri->segment(3, $this->input->post('keyword', TRUE)); + $this->load->library('pagination'); + + if ($this->uri->segment(2)=='search') { + $config['base_url'] = base_url() . 'studiengang/search/' . $keyword; + } else { + $config['base_url'] = base_url() . 'studiengang/index/'; + } + + $config['total_rows'] = $this->studiengang_model->search_total_rows($keyword); + $config['per_page'] = 10; + $config['uri_segment'] = 4; + $config['suffix'] = '.html'; + $config['first_url'] = base_url() . 'studiengang/search/'.$keyword.'.html'; + $this->pagination->initialize($config); + + $start = $this->uri->segment(4, 0); + $studiengang = $this->studiengang_model->search_index_limit($config['per_page'], $start, $keyword); + + $data = array( + 'studiengang_data' => $studiengang, + 'keyword' => $keyword, + 'pagination' => $this->pagination->create_links(), + 'total_rows' => $config['total_rows'], + 'start' => $start, + ); + $this->load->view('tbl_studiengang_list', $data); + } + + public function read($id) + { + $row = $this->studiengang_model->get_by_id($id); + if ($row) { + $data = array( + ); + $this->load->view('tbl_studiengang_read', $data); + } else { + $this->session->set_flashdata('message', 'Record Not Found'); + redirect(site_url('studiengang')); + } + } + + public function create() + { + $data = array( + 'button' => 'Create', + 'action' => site_url('studiengang/create_action'), + ); + $this->load->view('tbl_studiengang_form', $data); + } + + public function create_action() + { + $this->_rules(); + + if ($this->form_validation->run() == FALSE) { + $this->create(); + } else { + $data = array( + ); + + $this->studiengang_model->insert($data); + $this->session->set_flashdata('message', 'Create Record Success'); + redirect(site_url('studiengang')); + } + } + + public function update($id) + { + $row = $this->studiengang_model->get_by_id($id); + + if ($row) { + $data = array( + 'button' => 'Update', + 'action' => site_url('studiengang/update_action'), + ); + $this->load->view('tbl_studiengang_form', $data); + } else { + $this->session->set_flashdata('message', 'Record Not Found'); + redirect(site_url('studiengang')); + } + } + + public function update_action() + { + $this->_rules(); + + if ($this->form_validation->run() == FALSE) { + $this->update($this->input->post('', TRUE)); + } else { + $data = array( + ); + + $this->studiengang_model->update($this->input->post('', TRUE), $data); + $this->session->set_flashdata('message', 'Update Record Success'); + redirect(site_url('studiengang')); + } + } + + public function delete($id) + { + $row = $this->studiengang_model->get_by_id($id); + + if ($row) { + $this->studiengang_model->delete($id); + $this->session->set_flashdata('message', 'Delete Record Success'); + redirect(site_url('studiengang')); + } else { + $this->session->set_flashdata('message', 'Record Not Found'); + redirect(site_url('studiengang')); + } + } + + public function _rules() + { + + $this->form_validation->set_rules('', '', 'trim'); + $this->form_validation->set_error_delimiters('', ''); + } + +}; + +/* End of file Studiengang.php */ +/* Location: ./application/controllers/Studiengang.php */ diff --git a/application/helpers/fhcdb_helper.php b/application/helpers/fhcdb_helper.php new file mode 100644 index 000000000..8f86ea691 --- /dev/null +++ b/application/helpers/fhcdb_helper.php @@ -0,0 +1,430 @@ +ci=$ci; + } + + public function db_connect() + { + $conn_str='host='.DB_HOST.' port='.DB_PORT.' dbname='.DB_NAME.' user='.DB_USER.' password='.DB_PASSWORD; + //Connection Herstellen + if (DB_CONNECT_PERSISTENT) + { + if(!basis_db::$db_conn = pg_pconnect($conn_str)) + die('Fehler beim Oeffnen der Datenbankverbindung'); + } + else + { + if(!basis_db::$db_conn = pg_connect($conn_str)) + die('Fehler beim Oeffnen der Datenbankverbindung'); + } + } + + public function db_query($sql) + { + if ($this->db_result=$this->ci->db->simple_query($sql)) + return $this->db_result; + else + { + $this->errormsg.='Abfrage in Datenbank fehlgeschlagen! '.$this->db_last_error(); + return false; + } + } + + public function db_num_rows($result=null) + { + if(is_null($result)) + return pg_num_rows($this->db_result); + else + return pg_num_rows($result); + } + + public function db_fetch_object($result = null, $i=null) + { + if(is_null($result)) + { + if(is_null($i)) + return pg_fetch_object($this->db_result); + else + return pg_fetch_object($this->db_result, $i); + } + else + { + if(is_null($i)) + return pg_fetch_object($result); + else + return pg_fetch_object($result, $i); + } + } + + public function db_fetch_row($result = null, $i=null) + { + if(is_null($result)) + { + if(is_null($i)) + return pg_fetch_row($this->db_result); + else + return pg_fetch_row($this->db_result, $i); + } + else + { + if(is_null($i)) + return pg_fetch_row($result); + else + return pg_fetch_row($result, $i); + } + } + + public function db_fetch_assoc($result = null, $i=null) + { + if(is_null($result)) + { + if(is_null($i)) + return pg_fetch_assoc($this->db_result); + else + return pg_fetch_assoc($this->db_result, $i); + } + else + { + if(is_null($i)) + return pg_fetch_row($result); + else + return pg_fetch_row($result, $i); + } + } + + public function db_result($result = null, $i,$item) + { + if(is_null($result)) + { + return pg_result($this->db_result, $i,$item); + } + else + { + return pg_result($result, $i,$item); + } + } + + public function db_getResultJSON($result = null) + { + $rows=array(); + if(is_null($result)) + { + while($r = pg_fetch_assoc($this->db_result)) + $rows[] = $r; + + //print json_encode($rows); + } + else + { + pg_result_seek($result, 0); + //var_dump($result); + while($r = pg_fetch_assoc($result)) + { + $rows[] = $r; + } + + //print json_encode($rows); + } + return json_encode($rows); + } + + public function db_last_error() + { + return pg_last_error(); + } + + public function db_affected_rows($result=null) + { + if(is_null($result)) + return pg_affected_rows($this->db_result); + else + return pg_affected_rows($result); + } + + public function db_result_seek($result=null, $offset) + { + if(is_null($result)) + return pg_result_seek($this->db_result, $offset); + else + return pg_result_seek($result, $offset); + } + + public function db_fetch_array($result=null) + { + if(is_null($result)) + return pg_fetch_array($this->db_result); + else + return pg_fetch_array($result); + } + + public function db_num_fields($result=null) + { + if(is_null($result)) + return pg_num_fields($this->db_result); + else + return pg_num_fields($result); + } + + /** + * Liefert den Feldnamen mit index i + */ + public function db_field_name($result=null, $i) + { + if(is_null($result)) + return pg_field_name($this->db_result, $i); + else + return pg_field_name($result, $i); + } + + /** + * Gibt den Speicher wieder Frei. + * (ist das sinnvoll wenn es per Value uebergeben wird??) + */ + public function db_free_result($result = null) + { + if(is_null($result)) + { + return pg_free_result($this->db_result); + } + else + { + return pg_free_result($result); + } + } + + /** + * Liefert die aktuelle Datenbankversion + */ + public function db_version() + { + return pg_version(basis_db::$db_conn); + } + + /** + * Escaped Sonderzeichen in Variablen vor der Verwendung in SQL Statements + * um SQL Injections zu verhindern + * + */ + public function db_escape($var) + { + return pg_escape_string($var); + } + + /** + * Null Value Handling und Hochkomma für Inserts / Updates + * Wenn die Uebergebe Variable leer ist, wird ein String mit null + * zurueckgeliefert, wenn nicht dann wird der string unter Hochkomma zurueckgeliefert + * es sei denn qoute=false dann wird nur der String zurueckgeliefert + * + * @param $var String-Value fuer SQL Request + * @return string + */ + public function db_null_value($var, $qoute=true) + { + if($qoute) + return ($var!==''?$this->db_qoute($var):'null'); + else + return ($var!==''?$var:'null'); + } + + /** + * Setzt einen String unter Hochkomma + * @param $var Value fuer Insert/Update + * @return value unter Hochkomma + */ + public function db_qoute($var) + { + return "'".$var."'"; + } + + /** + * Escaped einen Parameter fuer die Verwendung in Insert/Update SQL Befehlen + * Es werden abhaengig vom Typ Hochkomma oder Null hinzugefuegt + * @param $var Value der gesetzt werden soll + * @param $type Typ des Values (FHC_STRING | FHC_BOOLEAN | FHC_INTEGER | ...) + * @param $nullable boolean gibt an ob das Feld NULL sein darf. Wenn true wird + * NULL statt einem Leerstring zurueckgeliefert + * @return Escapter Value inklusive Hochkomma wenn noetig + * + * Verwendungsbeispiel: + * Update tbl_person set nachname=$this->db_add_param($var) + * Update tbl_person set aktiv=$this->db_add_param($var, FHC_BOOL, false) + * Update tbl_person set anzahlkinder=$this->db_add_param($var, FHC_INT) + */ + public function db_add_param($var, $type=FHC_STRING, $nullable=true) + { + if(($var==='' || is_null($var)) && $type!=FHC_BOOLEAN) + { + if($nullable) + return 'null'; + else + return "''"; + } + + switch($type) + { + case FHC_INTEGER: + $var = $this->db_escape($var); + if(!is_numeric($var) && $var!=='') + die('Invalid Integer Parameter detected:'.$var); + $var = $this->db_null_value($var, false); + break; + + case FHC_LANG_ARRAY: + + $sprache = new sprache(); + $sprache->getAll(true); + $buf = $var; + $var = array(); + $languages = $sprache->getAllIndexesSorted(); + + foreach($languages as $sk => $sp) + { + if(!$sp || !isset($buf[$sp])) + $var[$sk] = ""; + else + $var[$sk] = $this->db_escape($buf[$sp]); + } + $var = str_replace('\\', '\\\\', $var); + $var = str_replace('"', '\\\"', $var); + $var = '\'{"' . join('","', $var) . '"}\''; + + break; + + case FHC_BOOLEAN: + if($var===true) + $var='true'; + elseif($var===false) + $var='false'; + elseif($var=='' && $nullable) + $var = 'null'; + else + die('Invalid Boolean Parameter detected'); + break; + + case FHC_STRING: + default: + $var = $this->db_escape($var); + $var = $this->db_null_value($var); + break; + } + return $var; + } + + /** + * Erzeugt aus einem DB-Result-Boolean einen PHP Boolean + */ + public function db_parse_bool($var) + { + if($var=='t') + return true; + elseif($var=='f') + return false; + elseif($var=='') + return ''; + else + die('Invalid DB Boolean. Wrong DB-Engine?'); + } + + /** + * Bereitet ein Array von Elementen auf, damit es in der IN-Klausel eines + * Select Befehls verwendet werden kann. + */ + public function db_implode4SQL($array) + { + $string = ''; + foreach($array as $row) + { + if($string!='') + $string.=','; + $string.=$this->db_add_param($row); + } + return $string; + } + + /** + * Erstellt aus einem DB Array ein PHP Array + * @param $var DB Result Array Spalte + * @return php array + */ + public function db_parse_array($var) + { + if ($var == '') + return; + preg_match_all('/(?<=^\{|,)(([^,"{]*)|\s*"((?:[^"\\\\]|\\\\(?:.|[0-9]+|x[0-9a-f]+))*)"\s*)(,|(?loadIndexArray(); + + $sprache = new sprache(); + $sprache->getAll(true); + $languages = $sprache->getAllIndexesSorted(); + + + foreach ($matches as $mk => $match) + { + $values[$languages[$mk+1]] = $match[3] != '' ? stripcslashes($match[3]) : (strtolower($match[2]) == 'null' ? null : $match[2]); + } + return $values; + } +} + +function indexSort($a, $b) +{ + return strcmp($a->index, $b->index); +} diff --git a/application/migrations/001_init.php b/application/migrations/001_init.php index 333c9c3dc..fe8c1ae05 100644 --- a/application/migrations/001_init.php +++ b/application/migrations/001_init.php @@ -6,9 +6,9 @@ class Migration_Init extends CI_Migration { public function up() { - //$this->load->database('system'); + $this->load->database('system'); // Schemas - //$this->db->query('CREATE SCHEMA IF NOT EXISTS gis;'); + $this->db->query('CREATE SCHEMA IF NOT EXISTS addon;'); } diff --git a/application/migrations/005_fhc30.php b/application/migrations/005_fhc30.php index 7ca2adc2d..845f8dc61 100644 --- a/application/migrations/005_fhc30.php +++ b/application/migrations/005_fhc30.php @@ -5,26 +5,20 @@ defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_fhc30 extends CI_Migration { public function up() - { - //$this->load->helper('file'); - require_once(FCPATH.'include/basis_db.class.php'); - $db = new basis_db(); - //$db = $this->db; - //$db->db_query = $this->db->simple_query; + { + echo '

Update to FHC 3.0


'; + $this->db=$this->load->database('system', true); + $this->load->helper('fhcdb'); + $db = new basis_db($this); require_once('./system/dbupdate_3.0.php'); } public function down() { - /*$this->db->simple_query('DROP SCHEMA bis;'); - $this->db->simple_query('DROP SCHEMA campus;'); - $this->db->simple_query('DROP SCHEMA fue;'); - $this->db->simple_query('DROP SCHEMA kommune;'); - $this->db->simple_query('DROP SCHEMA lehre;'); - $this->db->simple_query('DROP SCHEMA sync;'); - $this->db->simple_query('DROP SCHEMA system;'); - $this->db->simple_query('DROP SCHEMA testtool;'); - $this->db->simple_query('DROP SCHEMA wawi;');*/ + /*$this->db->simple_query('DROP TABLE fue.tbl_scrumteam;'); + $this->db->simple_query('DROP TABLE lehre.tbl_studienordnung;'); + $this->db->simple_query('DROP TABLE lehre.tbl_studienordnung_semester;'); + $this->db->simple_query('DROP TABLE lehre.tbl_studienplan;');*/ } } diff --git a/application/migrations/006_fhc31.php b/application/migrations/006_fhc31.php index 881f5a803..f945571d5 100644 --- a/application/migrations/006_fhc31.php +++ b/application/migrations/006_fhc31.php @@ -6,17 +6,11 @@ class Migration_fhc31 extends CI_Migration { public function up() { - //$this->load->database('system'); - if (!$this->db->table_exists('tbl_person')) - { - $this->load->helper('file'); - $sqlfile = read_file('./system/fhcomplete3.0.sql'); - - if (!$this->db->simple_query($sqlfile)) - { - echo "Error creating Basis DB-Schema!"; - } - } + echo '

Update to FHC 3.1


'; + $this->db=$this->load->database('system', true); + $this->load->helper('fhcdb'); + $db = new basis_db($this); + require_once('./system/dbupdate_3.1.php'); } public function down() diff --git a/application/migrations/007_fhc32.php b/application/migrations/007_fhc32.php index a3bb24cee..13732d455 100644 --- a/application/migrations/007_fhc32.php +++ b/application/migrations/007_fhc32.php @@ -6,17 +6,11 @@ class Migration_fhc32 extends CI_Migration { public function up() { - //$this->load->database('system'); - if (!$this->db->table_exists('tbl_person')) - { - $this->load->helper('file'); - $sqlfile = read_file('./system/fhcomplete3.0.sql'); - - if (!$this->db->simple_query($sqlfile)) - { - echo "Error creating Basis DB-Schema!"; - } - } + echo '

Update to FHC 3.2


'; + $this->db=$this->load->database('system', true); + $this->load->helper('fhcdb'); + $db = new basis_db($this); + require_once('./system/dbupdate_3.2.php'); } public function down() diff --git a/application/models/Grocery_crud_model.php b/application/models/Grocery_crud_model.php new file mode 100755 index 000000000..f40ad1faf --- /dev/null +++ b/application/models/Grocery_crud_model.php @@ -0,0 +1,592 @@ + + */ + +// ------------------------------------------------------------------------ + +/** + * Grocery CRUD Model + * + * + * @package grocery CRUD + * @author John Skoumbourdis + * @version 1.5.4 + * @link http://www.grocerycrud.com/documentation + */ +class Grocery_crud_model extends CI_Model { + + protected $primary_key = null; + protected $table_name = null; + protected $relation = array(); + protected $relation_n_n = array(); + protected $primary_keys = array(); + + function __construct() + { + parent::__construct(); + } + + function db_table_exists($table_name = null) + { + return $this->db->table_exists($table_name); + } + + function get_list() + { + if($this->table_name === null) + return false; + + $select = "{$this->table_name}.*"; + + //set_relation special queries + if(!empty($this->relation)) + { + foreach($this->relation as $relation) + { + list($field_name , $related_table , $related_field_title) = $relation; + $unique_join_name = $this->_unique_join_name($field_name); + $unique_field_name = $this->_unique_field_name($field_name); + + if(strstr($related_field_title,'{')) + { + $related_field_title = str_replace(" "," ",$related_field_title); + $select .= ", CONCAT('".str_replace(array('{','}'),array("',COALESCE({$unique_join_name}.",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $unique_field_name"; + } + else + { + $select .= ", $unique_join_name.$related_field_title AS $unique_field_name"; + } + + if($this->field_exists($related_field_title)) + $select .= ", {$this->table_name}.$related_field_title AS {$this->table_name}.$related_field_title"; + } + } + + //set_relation_n_n special queries. We prefer sub queries from a simple join for the relation_n_n as it is faster and more stable on big tables. + if(!empty($this->relation_n_n)) + { + $select = $this->relation_n_n_queries($select); + } + + $this->db->select($select, false); + + $results = $this->db->get($this->table_name)->result(); + + return $results; + } + + public function get_row($table_name = null) + { + $table_name = $table_name === null ? $this->table_name : $table_name; + + return $this->db->get($table_name)->row(); + } + + public function set_primary_key($field_name, $table_name = null) + { + $table_name = $table_name === null ? $this->table_name : $table_name; + + $this->primary_keys[$table_name] = $field_name; + } + + protected function relation_n_n_queries($select) + { + $this_table_primary_key = $this->get_primary_key(); + foreach($this->relation_n_n as $relation_n_n) + { + list($field_name, $relation_table, $selection_table, $primary_key_alias_to_this_table, + $primary_key_alias_to_selection_table, $title_field_selection_table, $priority_field_relation_table) = array_values((array)$relation_n_n); + + $primary_key_selection_table = $this->get_primary_key($selection_table); + + $field = ""; + $use_template = strpos($title_field_selection_table,'{') !== false; + $field_name_hash = $this->_unique_field_name($title_field_selection_table); + if($use_template) + { + $title_field_selection_table = str_replace(" ", " ", $title_field_selection_table); + $field .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$title_field_selection_table))."')"; + } + else + { + $field .= "$selection_table.$title_field_selection_table"; + } + + //Sorry Codeigniter but you cannot help me with the subquery! + $select .= ", (SELECT GROUP_CONCAT(DISTINCT $field) FROM $selection_table " + ."LEFT JOIN $relation_table ON $relation_table.$primary_key_alias_to_selection_table = $selection_table.$primary_key_selection_table " + ."WHERE $relation_table.$primary_key_alias_to_this_table = `{$this->table_name}`.$this_table_primary_key GROUP BY $relation_table.$primary_key_alias_to_this_table) AS $field_name"; + } + + return $select; + } + + function order_by($order_by , $direction) + { + $this->db->order_by( $order_by , $direction ); + } + + function where($key, $value = NULL, $escape = TRUE) + { + $this->db->where( $key, $value, $escape); + } + + function or_where($key, $value = NULL, $escape = TRUE) + { + $this->db->or_where( $key, $value, $escape); + } + + function having($key, $value = NULL, $escape = TRUE) + { + $this->db->having( $key, $value, $escape); + } + + function or_having($key, $value = NULL, $escape = TRUE) + { + $this->db->or_having( $key, $value, $escape); + } + + function like($field, $match = '', $side = 'both') + { + $this->db->like($field, $match, $side); + } + + function or_like($field, $match = '', $side = 'both') + { + $this->db->or_like($field, $match, $side); + } + + function limit($value, $offset = '') + { + $this->db->limit( $value , $offset ); + } + + function get_total_results() + { + //set_relation_n_n special queries. We prefer sub queries from a simple join for the relation_n_n as it is faster and more stable on big tables. + if(!empty($this->relation_n_n)) + { + $select = "{$this->table_name}.*"; + $select = $this->relation_n_n_queries($select); + + $this->db->select($select,false); + } + + return $this->db->get($this->table_name)->num_rows(); + } + + function set_basic_table($table_name = null) + { + if( !($this->db->table_exists($table_name)) ) + return false; + + $this->table_name = $table_name; + + return true; + } + + function get_edit_values($primary_key_value) + { + $primary_key_field = $this->get_primary_key(); + $this->db->where($primary_key_field,$primary_key_value); + $result = $this->db->get($this->table_name)->row(); + return $result; + } + + function join_relation($field_name , $related_table , $related_field_title) + { + $related_primary_key = $this->get_primary_key($related_table); + + if($related_primary_key !== false) + { + $unique_name = $this->_unique_join_name($field_name); + $this->db->join( $related_table.' as '.$unique_name , "$unique_name.$related_primary_key = {$this->table_name}.$field_name",'left'); + + $this->relation[$field_name] = array($field_name , $related_table , $related_field_title); + + return true; + } + + return false; + } + + function set_relation_n_n_field($field_info) + { + $this->relation_n_n[$field_info->field_name] = $field_info; + } + + protected function _unique_join_name($field_name) + { + return 'j'.substr(md5($field_name),0,8); //This j is because is better for a string to begin with a letter and not with a number + } + + protected function _unique_field_name($field_name) + { + return 's'.substr(md5($field_name),0,8); //This s is because is better for a string to begin with a letter and not with a number + } + + function get_relation_array($field_name , $related_table , $related_field_title, $where_clause, $order_by, $limit = null, $search_like = null) + { + $relation_array = array(); + $field_name_hash = $this->_unique_field_name($field_name); + + $related_primary_key = $this->get_primary_key($related_table); + + $select = "$related_table.$related_primary_key, "; + + if(strstr($related_field_title,'{')) + { + $related_field_title = str_replace(" ", " ", $related_field_title); + $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; + } + else + { + $select .= "$related_table.$related_field_title as $field_name_hash"; + } + + $this->db->select($select,false); + if($where_clause !== null) + $this->db->where($where_clause); + + if($where_clause !== null) + $this->db->where($where_clause); + + if($limit !== null) + $this->db->limit($limit); + + if($search_like !== null) + $this->db->having("$field_name_hash LIKE '%".$this->db->escape_like_str($search_like)."%'"); + + $order_by !== null + ? $this->db->order_by($order_by) + : $this->db->order_by($field_name_hash); + + $results = $this->db->get($related_table)->result(); + + foreach($results as $row) + { + $relation_array[$row->$related_primary_key] = $row->$field_name_hash; + } + + return $relation_array; + } + + function get_ajax_relation_array($search, $field_name , $related_table , $related_field_title, $where_clause, $order_by) + { + return $this->get_relation_array($field_name , $related_table , $related_field_title, $where_clause, $order_by, 10 , $search); + } + + function get_relation_total_rows($field_name , $related_table , $related_field_title, $where_clause) + { + if($where_clause !== null) + $this->db->where($where_clause); + + return $this->db->count_all_results($related_table); + } + + function get_relation_n_n_selection_array($primary_key_value, $field_info) + { + $select = ""; + $related_field_title = $field_info->title_field_selection_table; + $use_template = strpos($related_field_title,'{') !== false;; + $field_name_hash = $this->_unique_field_name($related_field_title); + if($use_template) + { + $related_field_title = str_replace(" ", " ", $related_field_title); + $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; + } + else + { + $select .= "$related_field_title as $field_name_hash"; + } + $this->db->select('*, '.$select,false); + + $selection_primary_key = $this->get_primary_key($field_info->selection_table); + + if(empty($field_info->priority_field_relation_table)) + { + if(!$use_template){ + $this->db->order_by("{$field_info->selection_table}.{$field_info->title_field_selection_table}"); + } + } + else + { + $this->db->order_by("{$field_info->relation_table}.{$field_info->priority_field_relation_table}"); + } + $this->db->where($field_info->primary_key_alias_to_this_table, $primary_key_value); + $this->db->join( + $field_info->selection_table, + "{$field_info->relation_table}.{$field_info->primary_key_alias_to_selection_table} = {$field_info->selection_table}.{$selection_primary_key}" + ); + $results = $this->db->get($field_info->relation_table)->result(); + + $results_array = array(); + foreach($results as $row) + { + $results_array[$row->{$field_info->primary_key_alias_to_selection_table}] = $row->{$field_name_hash}; + } + + return $results_array; + } + + function get_relation_n_n_unselected_array($field_info, $selected_values) + { + $use_where_clause = !empty($field_info->where_clause); + + $select = ""; + $related_field_title = $field_info->title_field_selection_table; + $use_template = strpos($related_field_title,'{') !== false; + $field_name_hash = $this->_unique_field_name($related_field_title); + + if($use_template) + { + $related_field_title = str_replace(" ", " ", $related_field_title); + $select .= "CONCAT('".str_replace(array('{','}'),array("',COALESCE(",", ''),'"),str_replace("'","\\'",$related_field_title))."') as $field_name_hash"; + } + else + { + $select .= "$related_field_title as $field_name_hash"; + } + $this->db->select('*, '.$select,false); + + if($use_where_clause){ + $this->db->where($field_info->where_clause); + } + + $selection_primary_key = $this->get_primary_key($field_info->selection_table); + if(!$use_template) + $this->db->order_by("{$field_info->selection_table}.{$field_info->title_field_selection_table}"); + $results = $this->db->get($field_info->selection_table)->result(); + + $results_array = array(); + foreach($results as $row) + { + if(!isset($selected_values[$row->$selection_primary_key])) + $results_array[$row->$selection_primary_key] = $row->{$field_name_hash}; + } + + return $results_array; + } + + function db_relation_n_n_update($field_info, $post_data ,$main_primary_key) + { + $this->db->where($field_info->primary_key_alias_to_this_table, $main_primary_key); + if(!empty($post_data)) + $this->db->where_not_in($field_info->primary_key_alias_to_selection_table , $post_data); + $this->db->delete($field_info->relation_table); + + $counter = 0; + if(!empty($post_data)) + { + foreach($post_data as $primary_key_value) + { + $where_array = array( + $field_info->primary_key_alias_to_this_table => $main_primary_key, + $field_info->primary_key_alias_to_selection_table => $primary_key_value, + ); + + $this->db->where($where_array); + $count = $this->db->from($field_info->relation_table)->count_all_results(); + + if($count == 0) + { + if(!empty($field_info->priority_field_relation_table)) + $where_array[$field_info->priority_field_relation_table] = $counter; + + $this->db->insert($field_info->relation_table, $where_array); + + }elseif($count >= 1 && !empty($field_info->priority_field_relation_table)) + { + $this->db->update( $field_info->relation_table, array($field_info->priority_field_relation_table => $counter) , $where_array); + } + + $counter++; + } + } + } + + function db_relation_n_n_delete($field_info, $main_primary_key) + { + $this->db->where($field_info->primary_key_alias_to_this_table, $main_primary_key); + $this->db->delete($field_info->relation_table); + } + + function get_field_types_basic_table() + { + $db_field_types = array(); + foreach($this->db->query('SELECT column_name AS "Field", data_type AS "Type", +CASE WHEN indisprimary THEN '."'PRI'".' WHEN indisunique THEN '."'UNI'".' ELSE null END AS "Key", is_nullable AS "Null", NULL AS "Extra" +FROM information_schema.columns +JOIN pg_namespace ON (table_schema=nspname) +JOIN pg_class ON (pg_class.relnamespace = pg_namespace.oid AND pg_class.oid = table_name::regclass) +JOIN pg_attribute ON (pg_attribute.attrelid = pg_class.oid AND attname=column_name) +LEFT JOIN pg_index ON (indrelid = pg_class.oid AND + pg_attribute.attnum = any(pg_index.indkey)) +WHERE table_name = '."'{$this->table_name}'")->result() as $db_field_type) + { + $type = explode("(",$db_field_type->Type); + $db_type = $type[0]; + + if(isset($type[1])) + { + if(substr($type[1],-1) == ')') + { + $length = substr($type[1],0,-1); + } + else + { + list($length) = explode(" ",$type[1]); + $length = substr($length,0,-1); + } + } + else + { + $length = ''; + } + $db_field_types[$db_field_type->Field]['db_max_length'] = $length; + $db_field_types[$db_field_type->Field]['db_type'] = $db_type; + $db_field_types[$db_field_type->Field]['db_null'] = $db_field_type->Null == 'YES' ? true : false; + $db_field_types[$db_field_type->Field]['db_extra'] = $db_field_type->Extra; + $db_field_types[$db_field_type->Field]['db_key'] = $db_field_type->Key; + $db_field_types[$db_field_type->Field]['primary_key'] = $db_field_type->Key == 'PRI' ? 1 : 0; + } + + $results = $this->db->field_data($this->table_name); + foreach($results as $num => $row) + { + $row = (array)$row; + $results[$num] = (object)( array_merge($row, $db_field_types[$row['name']]) ); + } + + return $results; + } + + function get_field_types($table_name) + { + $results = $this->db->field_data($table_name); + + return $results; + } + + function db_update($post_array, $primary_key_value) + { + $primary_key_field = $this->get_primary_key(); + return $this->db->update($this->table_name,$post_array, array( $primary_key_field => $primary_key_value)); + } + + function db_insert($post_array) + { + $insert = $this->db->insert($this->table_name,$post_array); + if($insert) + { + return $this->db->insert_id(); + } + return false; + } + + function db_delete($primary_key_value) + { + $primary_key_field = $this->get_primary_key(); + + if($primary_key_field === false) + return false; + + $this->db->limit(1); + $this->db->delete($this->table_name,array( $primary_key_field => $primary_key_value)); + if( $this->db->affected_rows() != 1) + return false; + else + return true; + } + + function db_file_delete($field_name, $filename) + { + if( $this->db->update($this->table_name,array($field_name => ''),array($field_name => $filename)) ) + { + return true; + } + else + { + return false; + } + } + + function field_exists($field,$table_name = null) + { + if(empty($table_name)) + { + $table_name = $this->table_name; + } + return $this->db->field_exists($field,$table_name); + } + + function get_primary_key($table_name = null) + { + if($table_name == null) + { + if(isset($this->primary_keys[$this->table_name])) + { + return $this->primary_keys[$this->table_name]; + } + + if(empty($this->primary_key)) + { + $fields = $this->get_field_types_basic_table(); + + foreach($fields as $field) + { + if($field->primary_key == 1) + { + return $field->name; + } + } + + return false; + } + else + { + return $this->primary_key; + } + } + else + { + if(isset($this->primary_keys[$table_name])) + { + return $this->primary_keys[$table_name]; + } + + $fields = $this->get_field_types($table_name); + + foreach($fields as $field) + { + /*if($field->primary_key == 1) + { + return $field->name; + }*/ + } + + return false; + } + + } + + function escape_str($value) + { + return $this->db->escape_str($value); + } + +} diff --git a/application/models/message/Message_model.php b/application/models/message/Message_model.php new file mode 100644 index 000000000..95e469ab7 --- /dev/null +++ b/application/models/message/Message_model.php @@ -0,0 +1,703 @@ +load->helper('language'); + $this->lang->load('message'); + } + + /** ----------------------------------------------------------------- + * get_message() - will return a single message, including the status for specified user. + * + * @param integer $msg_id EQUIRED + * @param integer $user_id REQUIRED + * @return array + */ + function getMessage($msg_id, $user_id) + { + // Validate + if (empty($msg_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_MSG_ID); + } + + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $sql = 'SELECT m.*, s.status, t.subject, ' . USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_messages m ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE m.id = ? ' ; + + $result = $this->db->query($sql, array($user_id, $msg_id)); + + if ($result) + return $this->_success($result->result_array()); + else + return $this->_general_error(); + } + + /** ----------------------------------------------------------------- + * Get a Full Thread + * get_full_thread() - will return a entire thread, including the status for specified user. + * + * @param integer $thread_id REQUIRED + * @param integer $user_id REQUIRED + * @param boolean $full_thread OPTIONAL - If true, user will also see messages from thread posted BEFORE user became participant + * @param string $order_by OPTIONAL + * @return array + */ + function get_full_thread($thread_id, $user_id, $full_thread = FALSE, $order_by = 'ASC') + { + // Validate + if (empty($thread_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_THREAD_ID); + } + + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' . + ' AND p.thread_id = ? '; + + if ( ! $full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } + + $sql .= ' ORDER BY m.cdate ' . $order_by; + + $result = $this->db->query($sql, array($user_id, $user_id, $thread_id)); + + if ($result) + return $this->_success($result->result_array()); + else + return $this->_general_error(); + } + + /** ----------------------------------------------------------------- + * get_all_threads() - will return all threads for user, including the status for specified user. + * + * @param integer $user_id REQUIRED + * @param boolean $full_thread OPTIONAL - If true, user will also see messages from thread posted BEFORE user became participant + * @param string $order_by OPTIONAL + * @return array + */ + function get_all_threads($user_id, $full_thread = FALSE, $order_by = 'asc') + { + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' ; + + if (!$full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } + + $sql .= ' ORDER BY t.id ' . $order_by. ', m.cdate '. $order_by; + + $result = $this->db->query($sql, array($user_id, $user_id)); + + if ($result) + return $this->_success($result->result_array()); + else + return $this->_general_error(); + } + + /** ----------------------------------------------------------------- + * Get all Threads Grouped + * get_all_threads_grouped() - will return all threads for user, including the status for specified user. + * - messages are grouped in threads. + * + * @param integer $user_id REQUIRED + * @param boolean $full_thread OPTIONAL - If true, user will also see messages from thread posted BEFORE user became participant + * @param string $order_by OPTIONAL + * @return array + */ + function get_all_threads_grouped($user_id, $full_thread = FALSE, $order_by = 'ASC') + { + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $message = $this->get_all_threads($user_id, $full_thread, $order_by); + if (is_array($message)) + { + $threads = array(); + + foreach ($message as $msg) + { + if ( ! isset($threads[$msg['thread_id']])) + { + $threads[$msg['thread_id']]['thread_id'] = $msg['thread_id']; + $threads[$msg['thread_id']]['messages'] = array($msg); + } + else + { + $threads[$msg['thread_id']]['messages'][] = $msg; + } + } + + return $this->_success($threads); + } + + // General Error Occurred + return $this->_general_error(); + } + + /** ----------------------------------------------------------------- + * Change Message Status + * update_message_status() - will change status on message for particular user + * + * @param integer $msg_id REQUIRED + * @param integer $user_id REQUIRED + * @param integer $status_id REQUIRED - should come from config/message.php list of constants + * @return array + */ + function update_message_status($msg_id, $user_id, $status_id) + { + // Validate + if (empty($msg_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_MSG_ID); + } + + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + if (empty($status_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_STATUS_ID); + } + + $this->db->where(array('message_id' => $msg_id, 'user_id' => $user_id )); + $this->db->update('msg_status', array('status' => $status_id )); + + $rows = $this->db->affected_rows(); + if ($rows == 1) + return $this->_success($rows, MSG_STATUS_UPDATE); + else + return $this->_general_error(); + } + + + /** ----------------------------------------------------------------- + * Add a Participant + * add_participant() - adds user to existing thread + * + * @param integer $thread_id REQUIRED + * @param integer $user_id REQUIRED + * @return array + */ + function add_participant($thread_id, $user_id) + { + + if (empty($thread_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_THREAD_ID); + } + + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + if ( ! $this->valid_new_participant($thread_id, $user_id)) + { + $this->_participant_error(MSG_ERR_PARTICIPANT_EXISTS); + } + + if ( ! $this->application_user($user_id)) + { + $this->_participant_error(MSG_ERR_PARTICIPANT_NONSYSTEM); + } + + $this->db->trans_start(); + + $participants[] = array('thread_id' => $thread_id,'user_id' => $user_id); + + $this->_insert_participants($participants); + + // Get Messages by Thread + $messages = $this->_get_messages_by_thread_id($thread_id); + + foreach ($messages as $message) + { + $statuses[] = array('message_id' => $message['id'], 'user_id' => $user_id, 'status' => MSG_STATUS_UNREAD); + } + + $this->_insert_statuses($statuses); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return $this->_general_error(); + } + + return $this->_success(NULL, MSG_PARTICIPANT_ADDED); + } + + + /** --------------------------------------------------------------- + * Remove a Participant + * remove_participant() - removes user from existing thread + * + * @param integer $thread_id REQUIRED + * @param integer $user_id REQUIRED + * @return array + */ + function remove_participant($thread_id, $user_id) + { + // Validate + if (empty($thread_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_THREAD_ID); + } + + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $this->db->trans_start(); + + $this->_delete_participant($thread_id, $user_id); + $this->_delete_statuses($thread_id, $user_id); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return $this->_success(NULL, MSG_PARTICIPANT_REMOVED); + } + + return $this->_general_error(); + } + + /** ---------------------------------------------------------------- + * Send a New Message + * send_new_message() - sends new internal message. This function will create a new thread + * + * @param integer $sender_id REQUIRED + * @param mixed $recipients REQUIRED - a single integer or an array of integers, representing user_ids + * @param string $subject + * @param string $body + * @param integer $priority + * @return array + */ + function send_new_message($sender_id, $recipients, $subject, $body, $priority) + { + // Validate + if (empty($sender_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_SENDER_ID); + } + + if (empty($recipients)) + { + return array( + 'err' => 1, + 'code' => MSG_ERR_INVALID_RECIPIENTS, + 'msg' => lang('mahana_'.MSG_ERR_INVALID_RECIPIENTS) + ); + } + + $this->db->trans_start(); + + $thread_id = $this->_insert_thread($subject); + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); + + // Create batch inserts + $participants[] = array('thread_id' => $thread_id,'user_id' => $sender_id); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); + + if ( ! is_array($recipients) ) + { + if ($sender_id != $recipients) + { + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipients); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipients, 'status' => MSG_STATUS_UNREAD); + } + } + else + { + foreach ($recipients as $recipient) + { + if ($sender_id != $recipient) + { + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipient); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient, 'status' => MSG_STATUS_UNREAD); + } + } + } + $participants=array_unique($participants, SORT_REGULAR); // Clean if sender and recipient is the same + $this->_insert_participants($participants); + $this->_insert_statuses($statuses); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return $this->_general_error(); + } + + return $this->_success($thread_id, MSG_MESSAGE_SENT); + } + + /** -------------------------------------------------------------- + * Reply to Message + * reply_to_message() - replies to internal message. This function will NOT create a new thread or participant list + * + * @param integer $msg_id REQUIRED + * @param integer $sender_id REQUIRED + * @param string $subject + * @param string $body + * @param integer $priority + * @return array + */ + function reply_to_message($reply_msg_id, $sender_id, $body, $priority) + { + // Validate + if (empty($sender_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_SENDER_ID); + } + + if (empty($msg_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_MSG_ID); + } + + $this->db->trans_start(); + + // Get the thread id to keep messages together + if ( ! $thread_id = $this->_get_thread_id_from_message($reply_msg_id)) + { + return FALSE; + } + + // Add this message + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); + + if ($recipients = $this->_get_thread_participants($thread_id, $sender_id)) + { + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); + + foreach ($recipients as $recipient) + { + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient['user_id'], 'status' => MSG_STATUS_UNREAD); + } + + $this->_insert_statuses($statuses); + } + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return $this->_general_error(); + } + + return $this->_success($msg_id, MSG_MESSAGE_SENT); + } + + /** ---------------------------------------------------------------- + * Get Participant List + * get_participant_list() - returns list of participants on given thread. If sender_id set, sender_id will be left off list + * + * @param integer $thread_id REQUIRED + * @param integer $sender_id REQUIRED + * @return array + */ + function get_participant_list($thread_id, $sender_id = 0) + { + // Validate + if (empty($thread_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_THREAD_ID); + } + + if ($results = $this->_get_thread_participants($thread_id, $sender_id)) + return $this->_success($results); + else + return $this->_general_error(); + } + + /** ---------------------------------------------------------------- + * Get Message Count + * get_msg_count() - returns integer with count of message for user, by status. defaults to new messages + * + * @param integer $user_id REQUIRED + * @param integer $status_id OPTIONAL - defaults to "Unread" + * @return array + */ + function get_msg_count($user_id, $status_id = MSG_STATUS_UNREAD) + { + if (empty($user_id)) + { + return $this->_invalid_id(MSG_ERR_INVALID_USER_ID); + } + + $result = $this->db->select('COUNT(*) AS msg_count')->where(array('user_id' => $user_id, 'status' => $status_id ))->get('msg_status'); + $rows = $result->row()->msg_count; + + if (is_numeric($rows)) + return $this->_success($rows); + else + return $this->_general_error(); + } + + + // ------------------------------------------------------------------------ + + /** + * Valid New Participant - because of CodeIgniter's DB Class return style, + * it is safer to check for uniqueness first + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + function valid_new_participant($thread_id, $user_id) + { + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' WHERE p.thread_id = ? ' . + ' AND p.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + if ($query->row()->count) + { + return FALSE; + } + + return TRUE; + } + + + + /** --------------------------------------------------------------- + * Application User + * + * @param integer $user_id` + * @return boolean + */ + function application_user($user_id) + { + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . USER_TABLE_TABLENAME . + ' WHERE ' . USER_TABLE_ID . ' = ?' ; + + $query = $this->db->query($sql, array($user_id)); + + if ($query->row()->count) + { + return TRUE; + } + + return FALSE; + } + + + // ------------------------------------------------------------------------ + // Private Functions from here out! + // ------------------------------------------------------------------------ + + /** + * Insert Thread + * + * @param string $subject + * @return integer + */ + private function _insert_thread($subject) + { + $insert_id = $this->db->insert('msg_threads', array('subject' => $subject)); + + return $this->db->insert_id(); + } + + /** + * Insert Message + * + * @param integer $thread_id + * @param integer $sender_id + * @param string $body + * @param integer $priority + * @return integer + */ + private function _insert_message($thread_id, $sender_id, $body, $priority) + { + $insert['thread_id'] = $thread_id; + $insert['sender_id'] = $sender_id; + $insert['body'] = $body; + $insert['priority'] = $priority; + + $insert_id = $this->db->insert('msg_messages', $insert); + + return $this->db->insert_id(); + } + + /** + * Insert Participants + * + * @param array $participants + * @return bool + */ + private function _insert_participants($participants) + { + return $this->db->insert_batch('msg_participants', $participants); + } + + /** + * Insert Statuses + * + * @param array $statuses + * @return bool + */ + private function _insert_statuses($statuses) + { + return $this->db->insert_batch('msg_status', $statuses); + } + + /** + * Get Thread ID from Message + * + * @param integer $msg_id + * @return integer + */ + private function _get_thread_id_from_message($msg_id) + { + $query = $this->db->select('thread_id')->get_where('msg_messages', array('id' => $msg_id)); + + if ($query->num_rows()) + { + return $query->row()->thread_id; + } + return 0; + } + + /** + * Get Messages by Thread + * + * @param integer $thread_id + * @return array + */ + private function _get_messages_by_thread_id($thread_id) + { + $query = $this->db->get_where('msg_messages', array('thread_id' => $thread_id)); + + return $query->result_array(); + } + + + /** + * Get Thread Particpiants + * + * @param integer $thread_id + * @param integer $sender_id + * @return array + */ + private function _get_thread_participants($thread_id, $sender_id = 0) + { + $array['thread_id'] = $thread_id; + + if ($sender_id) // If $sender_id 0, no one to exclude + { + $array['msg_participants.user_id != '] = $sender_id; + } + + $this->db->select('msg_participants.user_id, '.USER_TABLE_USERNAME, FALSE); + $this->db->join(USER_TABLE_TABLENAME, 'msg_participants.user_id = ' . USER_TABLE_ID); + + $query = $this->db->get_where('msg_participants', $array); + + return $query->result_array(); + } + + /** + * Delete Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + private function _delete_participant($thread_id, $user_id) + { + $this->db->delete('msg_participants', array('thread_id' => $thread_id, 'user_id' => $user_id)); + + if ($this->db->affected_rows() > 0) + { + return TRUE; + } + return FALSE; + } + + /** + * Delete Statuses + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + private function _delete_statuses($thread_id, $user_id) + { + $sql = 'DELETE s FROM msg_status s ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.id = s.message_id) ' . + ' WHERE m.thread_id = ? ' . + ' AND s.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + return TRUE; + } + + /** --------------------------------------------------------------- + * Error Particpant Exists + * + * @return array + */ + private function _participant_error($error = '') + { + return array( + 'err' => 1, + 'code' => 1, + 'msg' => lang('mahana_' . $error) + ); + } +} +/* end of file message_model.php */ diff --git a/application/models/message/message_model.php b/application/models/message/message_model.php new file mode 100644 index 000000000..8b564ed4e --- /dev/null +++ b/application/models/message/message_model.php @@ -0,0 +1,511 @@ +db->trans_start(); + + $thread_id = $this->_insert_thread($subject); + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); + + // Create batch inserts + $participants[] = array('thread_id' => $thread_id,'user_id' => $sender_id); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); + + if ( ! is_array($recipients)) + { + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipients); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipients, 'status' => MSG_STATUS_UNREAD); + } + else + { + foreach ($recipients as $recipient) + { + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipient); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient, 'status' => MSG_STATUS_UNREAD); + } + } + + $this->_insert_participants($participants); + $this->_insert_statuses($statuses); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return $thread_id; + } + + // ------------------------------------------------------------------------ + + /** + * Reply to Message + * + * @param integer $reply_msg_id + * @param integer $sender_id + * @param string $body + * @param integer $priority + * @return integer $new_msg_id + */ + function reply_to_message($reply_msg_id, $sender_id, $body, $priority) + { + $this->db->trans_start(); + + // Get the thread id to keep messages together + if ( ! $thread_id = $this->_get_thread_id_from_message($reply_msg_id)) + { + return FALSE; + } + + // Add this message + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); + + if ($recipients = $this->_get_thread_participants($thread_id, $sender_id)) + { + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); + + foreach ($recipients as $recipient) + { + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient['user_id'], 'status' => MSG_STATUS_UNREAD); + } + + $this->_insert_statuses($statuses); + } + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return $msg_id; + } + + // ------------------------------------------------------------------------ + + /** + * Get a Single Message + * + * @param integer $msg_id + * @param integer $user_id + * @return array + */ + function get_message($msg_id, $user_id) + { + $sql = 'SELECT m.*, s.status, t.subject, ' . USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_messages m ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE m.id = ? ' ; + + $query = $this->db->query($sql, array($user_id, $msg_id)); + + return $query->result_array(); + } + + // ------------------------------------------------------------------------ + + /** + * Get a Full Thread + * + * @param integer $thread_id + * @param integer $user_id + * @param boolean $full_thread + * @param string $order_by + * @return array + */ + function get_full_thread($thread_id, $user_id, $full_thread = FALSE, $order_by = 'asc') + { + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' . + ' AND p.thread_id = ? '; + + if ( ! $full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } + + $sql .= ' ORDER BY m.cdate ' . $order_by; + + $query = $this->db->query($sql, array($user_id, $user_id, $thread_id)); + + return $query->result_array(); + } + + // ------------------------------------------------------------------------ + + /** + * Get All Threads + * + * @param integer $user_id + * @param boolean $full_thread + * @param string $order_by + * @return array + */ + function get_all_threads($user_id, $full_thread = FALSE, $order_by = 'asc') + { + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' ; + + if (!$full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } + + $sql .= ' ORDER BY t.id ' . $order_by. ', m.cdate '. $order_by; + + $query = $this->db->query($sql, array($user_id, $user_id)); + + return $query->result_array(); + } + + // ------------------------------------------------------------------------ + + /** + * Change Message Status + * + * @param integer $msg_id + * @param integer $user_id + * @param integer $status_id + * @return integer + */ + function update_message_status($msg_id, $user_id, $status_id) + { + $this->db->where(array('message_id' => $msg_id, 'user_id' => $user_id )); + $this->db->update('msg_status', array('status' => $status_id )); + + return $this->db->affected_rows(); + } + + // ------------------------------------------------------------------------ + + /** + * Add a Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + function add_participant($thread_id, $user_id) + { + $this->db->trans_start(); + + $participants[] = array('thread_id' => $thread_id,'user_id' => $user_id); + + $this->_insert_participants($participants); + + // Get Messages by Thread + $messages = $this->_get_messages_by_thread_id($thread_id); + + foreach ($messages as $message) + { + $statuses[] = array('message_id' => $message['id'], 'user_id' => $user_id, 'status' => MSG_STATUS_UNREAD); + } + + $this->_insert_statuses($statuses); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Remove a Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + function remove_participant($thread_id, $user_id) + { + $this->db->trans_start(); + + $this->_delete_participant($thread_id, $user_id); + $this->_delete_statuses($thread_id, $user_id); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Valid New Participant - because of CodeIgniter's DB Class return style, + * it is safer to check for uniqueness first + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + function valid_new_participant($thread_id, $user_id) + { + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' WHERE p.thread_id = ? ' . + ' AND p.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + if ($query->row()->count) + { + return FALSE; + } + + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Application User + * + * @param integer $user_id` + * @return boolean + */ + function application_user($user_id) + { + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . USER_TABLE_TABLENAME . + ' WHERE ' . USER_TABLE_ID . ' = ?' ; + + $query = $this->db->query($sql, array($user_id)); + + if ($query->row()->count) + { + return TRUE; + } + + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Get Participant List + * + * @param integer $thread_id + * @param integer $sender_id + * @return mixed + */ + function get_participant_list($thread_id, $sender_id = 0) + { + if ($results = $this->_get_thread_participants($thread_id, $sender_id)) + { + return $results; + } + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Get Message Count + * + * @param integer $user_id + * @param integer $status_id + * @return integer + */ + function get_msg_count($user_id, $status_id = MSG_STATUS_UNREAD) + { + $query = $this->db->select('COUNT(*) AS msg_count')->where(array('user_id' => $user_id, 'status' => $status_id ))->get('msg_status'); + + return $query->row()->msg_count; + } + + // ------------------------------------------------------------------------ + // Private Functions from here out! + // ------------------------------------------------------------------------ + + /** + * Insert Thread + * + * @param string $subject + * @return integer + */ + private function _insert_thread($subject) + { + $insert_id = $this->db->insert('msg_threads', array('subject' => $subject)); + + return $this->db->insert_id(); + } + + /** + * Insert Message + * + * @param integer $thread_id + * @param integer $sender_id + * @param string $body + * @param integer $priority + * @return integer + */ + private function _insert_message($thread_id, $sender_id, $body, $priority) + { + $insert['thread_id'] = $thread_id; + $insert['sender_id'] = $sender_id; + $insert['body'] = $body; + $insert['priority'] = $priority; + + $insert_id = $this->db->insert('msg_messages', $insert); + + return $this->db->insert_id(); + } + + /** + * Insert Participants + * + * @param array $participants + * @return bool + */ + private function _insert_participants($participants) + { + return $this->db->insert_batch('msg_participants', $participants); + } + + /** + * Insert Statuses + * + * @param array $statuses + * @return bool + */ + private function _insert_statuses($statuses) + { + return $this->db->insert_batch('msg_status', $statuses); + } + + /** + * Get Thread ID from Message + * + * @param integer $msg_id + * @return integer + */ + private function _get_thread_id_from_message($msg_id) + { + $query = $this->db->select('thread_id')->get_where('msg_messages', array('id' => $msg_id)); + + if ($query->num_rows()) + { + return $query->row()->thread_id; + } + return 0; + } + + /** + * Get Messages by Thread + * + * @param integer $thread_id + * @return array + */ + private function _get_messages_by_thread_id($thread_id) + { + $query = $this->db->get_where('msg_messages', array('thread_id' => $thread_id)); + + return $query->result_array(); + } + + + /** + * Get Thread Particpiants + * + * @param integer $thread_id + * @param integer $sender_id + * @return array + */ + private function _get_thread_participants($thread_id, $sender_id = 0) + { + $array['thread_id'] = $thread_id; + + if ($sender_id) // If $sender_id 0, no one to exclude + { + $array['msg_participants.user_id != '] = $sender_id; + } + + $this->db->select('msg_participants.user_id, '.USER_TABLE_USERNAME, FALSE); + $this->db->join(USER_TABLE_TABLENAME, 'msg_participants.user_id = ' . USER_TABLE_ID); + + $query = $this->db->get_where('msg_participants', $array); + + return $query->result_array(); + } + + /** + * Delete Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + private function _delete_participant($thread_id, $user_id) + { + $this->db->delete('msg_participants', array('thread_id' => $thread_id, 'user_id' => $user_id)); + + if ($this->db->affected_rows() > 0) + { + return TRUE; + } + return FALSE; + } + + /** + * Delete Statuses + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ + private function _delete_statuses($thread_id, $user_id) + { + $sql = 'DELETE s FROM msg_status s ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.id = s.message_id) ' . + ' WHERE m.thread_id = ? ' . + ' AND s.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + return TRUE; + } +} + +/* end of file mahana_model.php */ diff --git a/application/seeds/001_person.php b/application/seeds/001_person.php new file mode 100644 index 000000000..0605a351a --- /dev/null +++ b/application/seeds/001_person.php @@ -0,0 +1,47 @@ +fhc =& get_instance(); + $this->fhc->load->model('person/Person_model'); + + for ($i = 0; $i < $limit; $i++) + { + echo "."; + $data = array( + // 'username' => $this->faker->unique()->userName, // get a unique nickname + 'vorname' => $this->fhc->faker->firstName, + 'vornamen' => $this->fhc->faker->firstName, + 'nachname' => $this->fhc->faker->lastName, + //'address' => $this->faker->streetAddress, + 'gebort' => $this->fhc->faker->city, + //'state' => $this->faker->state, + //'country' => $this->faker->country, + //'postcode' => $this->faker->postcode, + //'email' => $this->faker->email, + //'email_verified' => mt_rand(0, 1) ? '0' : '1', + //'phone' => $this->faker->phoneNumber, + 'gebdatum' => $this->fhc->faker->dateTimeThisCentury->format('Y-m-d H:i:s'), + //'registration_date' => $this->faker->dateTimeThisYear->format('Y-m-d H:i:s'), + //'ip_address' => mt_rand(0, 1) ? $this->faker->ipv4 : $this->faker->ipv6, + ); + + $this->fhc->Person_model->insert($data); + } + + echo PHP_EOL; + + } + + public function truncate() + { + //$this->db->query('EMPTY TABLE public.person;'); + } +} + diff --git a/application/views/vilesci_frameset.php b/application/views/vilesci_frameset.php index 40ab922f6..cd193d90e 100644 --- a/application/views/vilesci_frameset.php +++ b/application/views/vilesci_frameset.php @@ -1,4 +1,4 @@ - + diff --git a/assets/grocery_crud/config/index.html b/assets/grocery_crud/config/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/config/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/config/language_alias.php b/assets/grocery_crud/config/language_alias.php new file mode 100644 index 000000000..4656400cf --- /dev/null +++ b/assets/grocery_crud/config/language_alias.php @@ -0,0 +1,33 @@ + 'af', + 'arabic' => 'ar', + 'bengali' => 'bn', // Timepicker is not avaliable yet + 'bulgarian' => 'bg', + 'chinese' => 'zh-cn', + 'czech' => 'cs', + 'danish' => 'da', // Timepicker is not avaliable yet + 'dutch' => 'nl', + 'french' => 'fr', + 'german' => 'de', + 'greek' => 'el', + 'hungarian' => 'hu', + 'indonesian' => 'id', + 'italian' => 'it', + 'japanese' => 'ja', + 'korean' => 'ko', + 'norwegian' => 'no', + 'persian' => 'fa', // Timepicker is not avaliable yet + 'polish' => 'pl', + 'pt-br.portuguese' => 'pt-br', + 'pt-pt.portuguese' => 'pt', + 'romanian' => 'ro', + 'russian' => 'ru', + 'slovak' => 'sk', + 'spanish' => 'es', + 'thai' => 'th', // Timepicker is not avaliable yet + 'turkish' => 'tr', + 'ukrainian' => 'uk', + 'vietnamese' => 'vi' +); diff --git a/assets/grocery_crud/config/translit_chars.php b/assets/grocery_crud/config/translit_chars.php new file mode 100644 index 000000000..8cea88188 --- /dev/null +++ b/assets/grocery_crud/config/translit_chars.php @@ -0,0 +1,169 @@ + 'A', + '/α|ά|а|à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a', + + // Bb + '/Β|Б/' => 'B', + '/β|б/' => 'b', + + // Cc + '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', + '/ç|ć|ĉ|ċ|č/' => 'c', + + // Dd + '/Δ|Д|Ð|Ď|Đ/' => 'D', + '/δ|д|ð|ď|đ/' => 'd', + + // Ee + '/Ε|Έ|Е|Э|Є|È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E', + '/ε|έ|е|э|є|è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e', + + // Ff + '/Φ|Ф/' => 'F', + '/φ|ф|ƒ/' => 'f', + + // Gg + '/Γ|Г|Ĝ|Ğ|Ġ|Ģ/' => 'G', + '/γ|г|ĝ|ğ|ġ|ģ/' => 'g', + + // Hh + '/Х|Ĥ|Ħ/' => 'H', + '/х|ĥ|ħ/' => 'h', + + // Ii + '/Η|Ή|Ι|Ί|И|Ы|І|Ї|Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I', + '/η|ή|ι|ί|и|ы|і|ї|ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i', + + // Jj + '/Ĵ/' => 'J', + '/ĵ/' => 'j', + + // Kk + '/Κ|К|Ķ/' => 'K', + '/κ|к|ķ/' => 'k', + + // Ll + '/Λ|Л|Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L', + '/λ|л|ĺ|ļ|ľ|ŀ|ł/' => 'l', + + // Mm + '/Μ|М/' => 'M', + '/μ|м/' => 'm', + + // Nn + '/Ν|Н|Ñ|Ń|Ņ|Ň/' => 'N', + '/ν|н|ñ|ń|ņ|ň|ʼn/' => 'n', + + // Oo + '/Ο|Ό|О|Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O', + '/ο|ό|о|ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o', + + // Pp + '/Π|П/' => 'P', + '/π|п/' => 'p', + + // Qq + // '//' => 'Q', + // '//' => 'q', + + // Rr + '/Ρ|Р|Ŕ|Ŗ|Ř/' => 'R', + '/ρ|р|ŕ|ŗ|ř/' => 'r', + + // Ss + '/Σ|С|Ś|Ŝ|Ş|Š/' => 'S', + '/σ|ς|с|ś|ŝ|ş|š|ſ/' => 's', + + // Tt + '/Τ|Т|Ţ|Ť|Ŧ/' => 'T', + '/τ|т|ţ|ť|ŧ/' => 't', + + // Uu + '/У|Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U', + '/у|ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u', + + // Vv + '/В/' => 'V', + '/в/' => 'v', + + // Ww + '/Ω|Ώ|Ŵ/' => 'W', + '/ω|ώ|ŵ/' => 'w', + + // Xx + '/Χ/' => 'X', + '/χ/' => 'x', + + // Yy + '/Υ|Ύ|Ψ|Й|Ý|Ÿ|Ŷ/' => 'Y', + '/υ|ύ|ψ|й|ý|ÿ|ŷ/' => 'y', + + // Zz + '/Ζ|З|Ź|Ż|Ž/' => 'Z', + '/ζ|з|ź|ż|ž/' => 'z', + + '/Θ/' => 'Th', + '/θ/' => 'th', + + '/Ξ/' => 'Ks', + '/ξ/' => 'ks', + + '/Ё/' => 'Yo', + '/ё/' => 'yo', + + '/Ж/' => 'Zh', + '/ж/' => 'zh', + + '/Ц/' => 'Ts', + '/ц/' => 'ts', + + '/Ч/' => 'Ch', + '/ч/' => 'ch', + + '/Ш/' => 'Sh', + '/ш/' => 'sh', + + '/Щ/' => 'Sch', + '/щ/' => 'sch', + + '/Ь|Ъ/' => '', + '/ь|ъ/' => '', + + '/Ю/' => 'Yu', + '/ю/' => 'yu', + + '/Я/' => 'Ya', + '/я/' => 'ya', + + '/Æ|Ǽ/' => 'AE', + '/Ä/' => 'Ae', + '/ä|æ|ǽ/' => 'ae', + + '/Œ/' => 'OE', + '/Ö/' => 'Oe', + '/ö|œ/' => 'oe', + + '/Ü/' => 'Ue', + '/ü/' => 'ue', + + '/IJ/' => 'IJ', + '/ij/' => 'ij', + + '/ß/'=> 'ss', + +); + +/* End of file translit_chars.php */ +/* Location: ./assets/grocery_crud/translit_chars.php */ \ No newline at end of file diff --git a/assets/grocery_crud/css/index.html b/assets/grocery_crud/css/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/css/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite.png b/assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..c57da70b4b5b1e08a6977ddde182677af0e5e1b8 GIT binary patch literal 538 zcmV+#0_FXQP)cz2)-WJLkv8J@4bb5L`rsE?Kc|FrXHkKz)ov z76MHYM&Apx%05P7orE!>9=yZ~6O0^V?1%{=1UASqa<2Pgnk7fs!OIs9gh{NCN+@=) z>Gfttd5uq;oeR{%NHjtqV~jEQeY?tDff=(jqx>~SZ_e+iN26HR*`0Q!Re)~HD85p> zbL()Mw}bI^#`7wp0+cv&7*LhrtOmR)?PK>(-BeLm#jL5Jfogv-QS(TBnUb;))Krqm zD}uDDeVLNhm1G*pFB`O?iA=dnWBEpqHk8Yh%Qu45EIG=&F-dDmt|;|nN@|3lOkVZ7>z*~a1?_t?U)c+&|JFJke1`&0-a z#PjhRlg?=$KTo4|rU@NyV_fzDy@>h!lVyKShsO8>V>$xyIXRbHK%H~^Aaz=s$Jz^V zlb?KfaKdZqu3^#m$mintvgJ15@j`sb2Zr%69Sn=xN01Tm5r)NQanT=jhwm7zqj2>O cEB}D~0$b-QdD7|v=>Px#07*qoM6N<$g6AXnUH||9 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite@2x.png b/assets/grocery_crud/css/jquery_plugins/chosen/chosen-sprite@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b50545202cb4770039362c55025b0b9824663ad GIT binary patch literal 738 zcmV<80v-K{P)oJoIWh{eAG@xkM<0ryd(K3(} zP8JV&;uuIJ4nL%g8!wSG9E$P+3QVMGgj><+00}M5I5kMzaT<~M;uJ`UhLfbp9Ahdsrux5(g+(>Q*+9wU{AuYPH0}W_u4`|q(9c->{ zt>Jn|lbhH<_x5jU6prFi#S}&XMZ=~Y5VyC3+ZN%hXciz8 zPcLpJgbIK#a49e31-%wf2zh2F&&(Nq;AL%4zA(=QJRGq`sx3y3#0_cg9Fim739XTOu1NKKjlWs`52Q+3 Uja*K~(*OVf07*qoM6N<$g3mu-GXMYp literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/chosen/chosen.css b/assets/grocery_crud/css/jquery_plugins/chosen/chosen.css new file mode 100644 index 000000000..e7ea09225 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/chosen/chosen.css @@ -0,0 +1,450 @@ +/*! +Chosen, a Select Box Enhancer for jQuery and Prototype +by Patrick Filler for Harvest, http://getharvest.com + +Version 1.4.2 +Full source at https://github.com/harvesthq/chosen +Copyright (c) 2011-2015 Harvest http://getharvest.com + +MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md +This file is generated by `grunt build`, do not edit it by hand. +*/ + +/* @group Base */ +.chosen-container { + position: relative; + display: inline-block; + vertical-align: middle; + font-size: 13px; + zoom: 1; + *display: inline; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.chosen-container * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.chosen-container .chosen-drop { + position: absolute; + top: 100%; + left: -9999px; + z-index: 1010; + width: 100%; + border: 1px solid #aaa; + border-top: 0; + background: #fff; + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); +} +.chosen-container.chosen-with-drop .chosen-drop { + left: 0; +} +.chosen-container a { + cursor: pointer; +} +.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name { + margin-right: 4px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-weight: normal; + color: #999999; +} +.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after { + content: ":"; + padding-left: 2px; + vertical-align: top; +} + +/* @end */ +/* @group Single Chosen */ +.chosen-container-single .chosen-single { + position: relative; + display: block; + overflow: hidden; + padding: 0 0 0 8px; + height: 25px; + border: 1px solid #aaa; + border-radius: 5px; + background-color: #fff; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-clip: padding-box; + box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); + color: #444; + text-decoration: none; + white-space: nowrap; + line-height: 24px; +} +.chosen-container-single .chosen-default { + color: #999; +} +.chosen-container-single .chosen-single span { + display: block; + overflow: hidden; + margin-right: 26px; + text-overflow: ellipsis; + white-space: nowrap; +} +.chosen-container-single .chosen-single-with-deselect span { + margin-right: 38px; +} +.chosen-container-single .chosen-single abbr { + position: absolute; + top: 6px; + right: 26px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-single .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single .chosen-single div { + position: absolute; + top: 0; + right: 0; + display: block; + width: 18px; + height: 100%; +} +.chosen-container-single .chosen-single div b { + display: block; + width: 100%; + height: 100%; + background: url('chosen-sprite.png') no-repeat 0px 2px; +} +.chosen-container-single .chosen-search { + position: relative; + z-index: 1010; + margin: 0; + padding: 3px 4px; + white-space: nowrap; +} +.chosen-container-single .chosen-search input[type="text"] { + margin: 1px 0; + padding: 4px 20px 4px 5px; + width: 100%; + height: auto; + outline: 0; + border: 1px solid #aaa; + background: white url('chosen-sprite.png') no-repeat 100% -20px; + background: url('chosen-sprite.png') no-repeat 100% -20px; + font-size: 1em; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-single .chosen-drop { + margin-top: -1px; + border-radius: 0 0 4px 4px; + background-clip: padding-box; +} +.chosen-container-single.chosen-container-single-nosearch .chosen-search { + position: absolute; + left: -9999px; +} + +/* @end */ +/* @group Results */ +.chosen-container .chosen-results { + color: #444; + position: relative; + overflow-x: hidden; + overflow-y: auto; + margin: 0 4px 4px 0; + padding: 0 0 0 4px; + max-height: 240px; + -webkit-overflow-scrolling: touch; +} +.chosen-container .chosen-results li { + display: none; + margin: 0; + padding: 5px 6px; + list-style: none; + line-height: 15px; + word-wrap: break-word; + -webkit-touch-callout: none; +} +.chosen-container .chosen-results li.active-result { + display: list-item; + cursor: pointer; +} +.chosen-container .chosen-results li.disabled-result { + display: list-item; + color: #ccc; + cursor: default; +} +.chosen-container .chosen-results li.highlighted { + background-color: #3875d7; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); + color: #fff; +} +.chosen-container .chosen-results li.no-results { + color: #777; + display: list-item; + background: #f4f4f4; +} +.chosen-container .chosen-results li.group-result { + display: list-item; + font-weight: bold; + cursor: default; +} +.chosen-container .chosen-results li.group-option { + padding-left: 15px; +} +.chosen-container .chosen-results li em { + font-style: normal; + text-decoration: underline; +} + +/* @end */ +/* @group Multi Chosen */ +.chosen-container-multi .chosen-choices { + position: relative; + overflow: hidden; + margin: 0; + padding: 0 5px; + width: 100%; + height: auto !important; + height: 1%; + border: 1px solid #aaa; + background-color: #fff; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); + cursor: text; +} +.chosen-container-multi .chosen-choices li { + float: left; + list-style: none; +} +.chosen-container-multi .chosen-choices li.search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + margin: 1px 0; + padding: 0; + height: 25px; + outline: 0; + border: 0 !important; + background: transparent !important; + box-shadow: none; + color: #999; + font-size: 100%; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-multi .chosen-choices li.search-choice { + position: relative; + margin: 3px 5px 3px 0; + padding: 3px 20px 3px 5px; + border: 1px solid #aaa; + max-width: 100%; + border-radius: 3px; + background-color: #eeeeee; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-size: 100% 19px; + background-repeat: repeat-x; + background-clip: padding-box; + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} +.chosen-container-multi .chosen-choices li.search-choice span { + word-wrap: break-word; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + position: absolute; + top: 4px; + right: 3px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-choices li.search-choice-disabled { + padding-right: 5px; + border: 1px solid #ccc; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + color: #666; +} +.chosen-container-multi .chosen-choices li.search-choice-focus { + background: #d4d4d4; +} +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-results { + margin: 0; + padding: 0; +} +.chosen-container-multi .chosen-drop .result-selected { + display: list-item; + color: #ccc; + cursor: default; +} + +/* @end */ +/* @group Active */ +.chosen-container-active .chosen-single { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active.chosen-with-drop .chosen-single { + border: 1px solid #aaa; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); + background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); + box-shadow: 0 1px 0 #fff inset; +} +.chosen-container-active.chosen-with-drop .chosen-single div { + border-left: none; + background: transparent; +} +.chosen-container-active.chosen-with-drop .chosen-single div b { + background-position: -18px 2px; +} +.chosen-container-active .chosen-choices { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active .chosen-choices li.search-field input[type="text"] { + color: #222 !important; +} + +/* @end */ +/* @group Disabled Support */ +.chosen-disabled { + opacity: 0.5 !important; + cursor: default; +} +.chosen-disabled .chosen-single { + cursor: default; +} +.chosen-disabled .chosen-choices .search-choice .search-choice-close { + cursor: default; +} + +/* @end */ +/* @group Right to Left */ +.chosen-rtl { + text-align: right; +} +.chosen-rtl .chosen-single { + overflow: visible; + padding: 0 8px 0 0; +} +.chosen-rtl .chosen-single span { + margin-right: 0; + margin-left: 26px; + direction: rtl; +} +.chosen-rtl .chosen-single-with-deselect span { + margin-left: 38px; +} +.chosen-rtl .chosen-single div { + right: auto; + left: 3px; +} +.chosen-rtl .chosen-single abbr { + right: auto; + left: 26px; +} +.chosen-rtl .chosen-choices li { + float: right; +} +.chosen-rtl .chosen-choices li.search-field input[type="text"] { + direction: rtl; +} +.chosen-rtl .chosen-choices li.search-choice { + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 19px; +} +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { + right: auto; + left: 4px; +} +.chosen-rtl.chosen-container-single-nosearch .chosen-search, +.chosen-rtl .chosen-drop { + left: 9999px; +} +.chosen-rtl.chosen-container-single .chosen-results { + margin: 0 0 4px 4px; + padding: 0 4px 0 0; +} +.chosen-rtl .chosen-results li.group-option { + padding-right: 15px; + padding-left: 0; +} +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { + border-right: none; +} +.chosen-rtl .chosen-search input[type="text"] { + padding: 4px 5px 4px 20px; + background: white url('chosen-sprite.png') no-repeat -30px -20px; + background: url('chosen-sprite.png') no-repeat -30px -20px; + direction: rtl; +} +.chosen-rtl.chosen-container-single .chosen-single div b { + background-position: 6px 2px; +} +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { + background-position: -12px 2px; +} + +/* @end */ +/* @group Retina compatibility */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi), only screen and (min-resolution: 1.5dppx) { + .chosen-rtl .chosen-search input[type="text"], + .chosen-container-single .chosen-single abbr, + .chosen-container-single .chosen-single div b, + .chosen-container-single .chosen-search input[type="text"], + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, + .chosen-container .chosen-results-scroll-down span, + .chosen-container .chosen-results-scroll-up span { + background-image: url('chosen-sprite@2x.png') !important; + background-size: 52px 37px !important; + background-repeat: no-repeat !important; + } +} +/* @end */ diff --git a/assets/grocery_crud/css/jquery_plugins/chosen/chosen.min.css b/assets/grocery_crud/css/jquery_plugins/chosen/chosen.min.css new file mode 100644 index 000000000..5ca6159cf --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/chosen/chosen.min.css @@ -0,0 +1,3 @@ +/* Chosen v1.4.2 | (c) 2011-2015 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ + +.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;*display:inline;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container .search-choice .group-name,.chosen-container .chosen-single .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .search-choice .group-name:after,.chosen-container .chosen-single .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:#fff url(chosen-sprite.png) no-repeat 100% -20px;background:url(chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:transparent!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:transparent}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single-nosearch .chosen-search,.chosen-rtl .chosen-drop{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:#fff url(chosen-sprite.png) no-repeat -30px -20px;background:url(chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi),only screen and (min-resolution:1.5dppx){.chosen-rtl .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-container-single .chosen-search input[type=text],.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/chosen/index.html b/assets/grocery_crud/css/jquery_plugins/chosen/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/chosen/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/blank.gif b/assets/grocery_crud/css/jquery_plugins/fancybox/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_close.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_close.png new file mode 100644 index 0000000000000000000000000000000000000000..07035307ad435f8f2f8eedf0bce50f7ec8a858c2 GIT binary patch literal 1517 zcmV1To%f)hA(E>uTT$~N#GA0orBqo9-jKM;POccZrXJjTzge4|Sa0ca~7y<+{ z2m7~>41(Jqf9L`mBM6zAjf4;hkjP@@B~d6Xz385|dB5iCM=Ro&JZZmk-uHdZd2i=@ zK0a@Md;u9DFE7t8BO^nxckf<*yC?SckUFGmX^jwM@NV80+eiP zQ*s##s^a3}Ldwd@cHO*r^T5i=%Fj}=Cr_R@78e&C((#usU;YFS>C)2Dw4tG)YO=*P zWt;6ZfL46;=u!R1$jGM-hhvcpVyCa+S}Q!T2ALHx;BHe#M~BsHHos=s2iW})#C?}q ztqvud-gYjKsG$zHm2XhmYPB(Bn>kzw z=gS!w6cG`jJ$?H00VK+=!cMnBDn?IFkCkj7KmNq~hrkZvU@n=EP}|7Gxw*M}1_lPI zNx@_?IS^|%_ok<(o3gXBH^f+@(X7_g)K~%n0$gMM{{Ab=%gZ*hH99)_Eo>!VJd8_C zE)WMoNsBB#u&}W3BMEnPby>y64F-cra9>kX)4DJoA0KZ5fitNn`NTT4wY3%+fA;Lz zZ+K4ucJi+Mg!m%<>Ug8kSg^LX_JD-5va;NEM#+V_H)8UHgaj8UJ?LiZVx92t@KxlB zb1oz#Bo|{kAO!IDVfOII$VfwRad8C+y?XV^;VEu~g@tQka>%(zhlYl1p7P=0!-vj9 zYiMYw3l0uW##jWq+eZ-;6r@4F%{+PXGcz;xx78|Q_F7Eb+}ynGO@4TI*h!27r4#SzfR=K~ zhtpe&%-o-olT$}R&!0cHdm}}wbdd`2lO~)PlarHXnm>2$+(ng2^$EtJ+=vwl#Xg-* zSA%x<9|=lJ3CXuACMEY46&1O~{LGm%7HKm8lhZ|+Pv?nF1LcJswy+L%zshO4HzpR4skij zxq<8a{QPpl!oq4$R(*n7$-q`gsjcF2;NWZ?##l9wBW)lu_Bpk)RJgGO&Ey+2dDr3J z*x2~aJFl#)G^5U)q~qh`_b^ru6q9Xf%arlfse$W(T#z5f?cqE0>k)x`c6QcMUS4jN z#$B996B84z1O(|{7{3S{Bb#j7?T~OCi+pq$fP9eGqJ%Evk~i}B@#8tcAnk_QAg)9f z!qn81MJO5W0n6>}?Q|$y25QL`+uU$0x?KbSI<(UOBavf=wCW!^J3Ie)^yty-8!yk& z($YLG4fjwT{k&5mHL@*_7Xi1c4?x$HT^y5qc2zyPPCG3CUKl!f@Zj&~&!7K?fD>&z zDk^G(=74sN=`q$#Wm{gaK5myi7K~vRQ8s=CoB+NC8j<}iKpXzI(SMmt*2r@wST=`s zW7t-}X4hPqXy3W00000NkvXXu0mjftFGKG literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_loading.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..2503017960b3972499d3aa92f89953935ae40934 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_left.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ebaa6a4fd34e51575a01da366312c20618985cbc GIT binary patch literal 1446 zcmV;X1zGxuP)R`@usIzf?P{x4#0gFqr~|(;IJySuwjr=+Ar78e&sHZ(Lu;P)*wKU%|U#jmpg5~Q6= zNl8{#mZGz>Q!_F$qJ8n=#Z9x>Jn_n|ZEtTsSzllOW_Wn`!@Rt_=!l4jAl`tKb-5%L zv7js_CMF<1KR>Fcr{|nbr~AR4Y-MG|y0EZdwI6@^^5yrikSZ}TQ5hH*C?{R4Q{?KT zKD6U2SFWfB2M0g0TCEGD5GUP%Y0a>J0W!M1fVuVU?d@ix(YV91PjUK7@OzY8E)OJ~ z&Q30n%8njA8kC)#t?uvd&xMXHQZzI)WQmTB-n1vQM_gQ-{_*3-7UA?*_bJ9=m|W(F zT+IHE$H&L3T3T8zSS*%BTHM>)YZi;eI#;9uNVch|X-go#ckf=VQmKq2-ORBYaGo52 zejyg&!SS;_ltMX3~N9_#ORsfn&tMTp}T$j*yAd)6-A(_4O6g z0=-^ug|9bVkxorbSsNQ0x9sPG&EF`laq6qgf=!d ztnQGKnVtDqz_Vx1Y=Kr=TU+Vx?;nS;5H`1m#Lv%9fqI)#T3Y%!3C+yRSpE-E!h;77 zwm7Z1{&Y;%TkkIqz&m9sAKBbnCkzsHry#@vbY{a-wI?zu7 zloV4Q9NtQWLUAT7Ev=G-*4EZ6|HZd^F*!MDB>C#<>PDGN_5sGi_Yq4ZlG7@css!ck z9};wyN`LrygSGPaaLVfqXl2Z+Nkm;ygvo12>(Bf+YwDwC`Hbwy5foiCI>(Z2*F z+nZVe;)K}P*aF#9Y8tUS3{lK|w(!NULrkdP#x17leSb zXU`h&IIwaw4`8eqNV6{>BDOh|vjhZ0E{e&QDDu0Pe|>%Zmb;{dg@s0w$z&rPA0K~+ zu^J$UblaCq5g(ljxEe?Y`8AmFYt-vOfqZ&;+Eh?bV07kp3Z#jN34Zfk3!OW_7k zM!Hz%fopN!Lja&lI}y+lIZjBszTeT&@!Ra|?DQ)q4Us*EN5ey8M=zh0NVTlX;X`2G z(+8kuN)-Dfn@v@Ns?$arfE9ks%*_0?uCDGc0&cYN@bK_KngiO{r&oDx0_$@6^x5~= zW5Gx^5k=$2z;)mYpdQiR47B2ZEBzOVMD;v(on_N_Z6xdRarMj=Ped`)=n zv4Dh?$k=SYcJSdjDa(58`F?t%ZzxBbaRs;9zaA#)un(S!5dZ)H07*qoM6N<$g4RXF AD*ylh literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_right.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_nav_right.png new file mode 100644 index 0000000000000000000000000000000000000000..873294e969db9160f5ddd4e1ab498ff60b080e3f GIT binary patch literal 1454 zcmV;f1yTBmP)Wa6`&Z+!IVkxf`V#(j>y7#5eg z5*PD+C=wGBwT+F9xi*_^fd=>X_FBba@wz8b0c3ma+OG#c&LYnSBp_4S(*6BG8m#QpsI))yBSw}|WBy?ft)>pk?VIMu|0u-xC@UxO$< zHa9o-0~vR8bXeVyB61x;@W6T@vgyO$TgWvPslhu zJ>BGvFeN3$D2UT9wO!c-2M2E;RvddB6cm(&J}nRg`1!DUaA;_#J})n?kc`&W*6f~w z$XoI8@o`6>)z;Ql1O^7iqc4Qr?IQ^Y2vDQmrd_^#`AagIo}RXO6Tw=o)=2K&OZ?8A zJDVKcH{^2p2j~ms)bf#Ff5Y^8{ZZ7~8Zw%koV0nHJ||9`FbS!%u(0sL`TfAafI}Du zN;}#qfQDkqhr?T=R;!O@W@c89(aOq-SHe5pO)Do4INRL6f8R{+tE;Q)Wir`E=nLN^ zERjf#VBjT`yZ^}0T`IW~brs!I17PDwDHNtJpz(@u7&_Ci&*x`nXGh4eva-_hHlhTo z>wKX6jrLg})!Ef*2q(qH#unh5y~V~`*!#E25W2>+0$@y%jAkE;d^% z7KiBQ=;#CV)c|?K?OZZNymTtyIv@+;=i$b0QLhID@u{gPOF=<_+1^cd)FbceJt|Pr3Z2#UW)pC9hbbpr%#_w3xu>9DucKZSqKjwKC}oa!!=;B zxw)ARh3h~maWUsB$KtMw06>R!GGHKatdM5?eS3TRA2TyEQ!m{-s9LkQG(13d^zuqc z)WBRWF9N%+J^)=)qIgeo*i|*CI?Xfzc;V-hCr|!<<;s9veooizpgD1ug<#0dV!Z literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_e.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda0893649371f8d92b92976d8542cdd1b601ed GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W@!3HGnP3ltxQbwLGjv*Y^lSRZuwe#}JO|p{EaWGAM`~zK|Yh zF7SQ+m+Ig>B0@o-N8?trihfzZ+Vp1~`{zf0o*#X0$hUAi%N$P)W1wCJ22WQ%mvv4F FO#q)zAp-ya literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_ne.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_ne.png new file mode 100644 index 0000000000000000000000000000000000000000..79f6980a3ba5c43de120d963dbba2516b8f27ac7 GIT binary patch literal 347 zcmV-h0i^zkP)dR9Yb&V8f!h)aDezHAsc|y@|hdQ zYJb}?8~~zFbQ)ku!Ey)KSukutuvdZ@MKMX|x|A3tPyx?YVhN^6z!Mi4Mj2f#%<;nh z2{>?YAzu|{u^;Oq!;f7Z4tPBpJEmZ+^GZ#$=9nz(K+UmK7}|u&EPi%aRt_C3qOFB_ zHc`~N>51%{?ijG?xsHt>MwRChgk=x_z0gh3O2xSL)-6?+2LKZL74~Q>MZjWtwukkA tvjRC=&j+0R$&bLyT7MhBcTXDISHC&xXU0&5CWHV0002ovPDHLkV1fX+la~Mh literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_nw.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_nw.png new file mode 100644 index 0000000000000000000000000000000000000000..7182cd938ae98e7e28c65a0bc55df576042ff9f5 GIT binary patch literal 324 zcmV-K0lWT*P)2-&4CO{qhKP$XKD&mgeXEM77>~`RA}h@U^Z##eQZVtM>a-K?QT4 z&(8BFf(rD5V61)2I__wHYuRwoaDIqw5Vdr_JSDVr){#J@r;{vbDL|tRyCiirf~4OF zX-l=Ecm>@yR)1nSMt~dy90Zb`^`)TQbhf8jR@fA!l6V$musRyB9Y{p$SCW}!$3==V zk)fW)Xo{s^ez$t+XhmZj;ts)!kTokvmM>z)zt70000 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_se.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_shadow_se.png new file mode 100644 index 0000000000000000000000000000000000000000..541e3ffd3e88224b34a4d2097c66a780e6060aeb GIT binary patch literal 352 zcmV-m0iXVfP){pM9=`y8<_IvWD02WY@RZ<9dgjNmAB|sYF}Xw>7Sq@O0000eMf9z;FC21=)67q_`W0*0KnS4AR00W2`RGn3i8UfsEegLO@ zPhds?2e1Tm)FK3=bymIAx?X=YFo3Mdh7W?@I#8s#svp!&PB> zwah@Ngd|l0N4SCfzvjtQnd$dZ0yM)N$X+lqdtN!Pt{Wn*_`0U}m1^#r1 mwpaW{;a?9KKt^WrpTAEd?0j1W(3L*`0000P{ho=rRL|66mGO)=r*Hk83F#~lnc)I$ztaD0e0sy?& B8X5oq literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_left.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6049223d1ec6af46e100499c01f6489c9e2c6240 GIT binary patch literal 503 zcmV+)0005LNklqcp9&~$uJw{{rUub~E?-XJ#Upm4Fe%-Gl z!u%tb0N102a|s5;SPlQvJlFCTBbvYaK@wIW6Gjx@?i20AlVDJcHNfh25WRlbF6CIq zv9_ZnqOH`}ppaUR0@%ZcM9zpDt2uQM>f+Z#wIMmyuui3DeoYXWE|hQ{D$te=Yhgkq zIvyj+$t8T|S1wITzUftNOe(E+Qjn$kDotY;I5}1lRgwi=?K26ke)djLR5W2|!7CVH zJ-`tuAq|`lK978y+CnqGNCkUke_%Gig ukvFM-ftpWh!il7Wg7kz7Y?7xB@G*olNlgoj4E_Yv!rmdKI;Vst0Ha3^zyJUM literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_right.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancy_title_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d9db2a7c6e570aec993d3665cbc13620115e2 GIT binary patch literal 506 zcmV+)0005ONklxjQB-g>5=x46nGBwseihc$zfzvTFh(=tCRj6cJ4M&ASrCAq-HbokPnRBAHVa2(-|l wYU(UxfYLN;KDSr z1<%~X^wgl##FWaylc_d9MY*0Xjv*Ddw)7kFH5l+P-xcE$W)3=fYI&uMKVzWNT*W|n zhqlRY)q0r(8Mg&Fu_zpISivgz+b7g)c6G&O{~njE??Y{u-MM!p^=9_W+X-j8mhfK? zj`H2Yy;kp%)!V-M3;EVThyB(Z@o88wpMja-vy^g)SgE!<&|(HpS3j3^P6|6H_V+Po~-c6$N>^IEGZ*^681?Yf#{6Zf~e!I`r4y-J+3m*Ue*gH=cNZ zzpU%p61aCO%jt%FHUKW&bEWLcUAGzK?;SYE)E{9#W9O8@uj{O@89qzNU(dkI YVCW(7-@(*!CeU;SPgg&ebxsLQ07`N|KL7v# literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/fancybox.png b/assets/grocery_crud/css/jquery_plugins/fancybox/fancybox.png new file mode 100644 index 0000000000000000000000000000000000000000..65e14f68fd83b87f75c22c0c074e7b20bf20a133 GIT binary patch literal 15287 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 ZMt7F5hocMxav&E)U0Fw|QQ>vO{{ZOG+C=~W literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/fancybox/jquery.fancybox.css b/assets/grocery_crud/css/jquery_plugins/fancybox/jquery.fancybox.css new file mode 100644 index 000000000..8fe0fbd5a --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/fancybox/jquery.fancybox.css @@ -0,0 +1,359 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + cursor: pointer; + overflow: hidden; + z-index: 1104; + display: none; +} + +#fancybox-loading div { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 480px; + background-image: url('fancybox.png'); +} + +#fancybox-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 1100; + display: none; +} + +#fancybox-tmp { + padding: 0; + margin: 0; + border: 0; + overflow: auto; + display: none; +} + +#fancybox-wrap { + position: absolute; + top: 0; + left: 0; + padding: 20px; + z-index: 1101; + outline: none; + display: none; +} + +#fancybox-outer { + position: relative; + width: 100%; + height: 100%; + background: #fff; +} + +#fancybox-content { + width: 0; + height: 0; + padding: 0; + outline: none; + position: relative; + overflow: hidden; + z-index: 1102; + border: 0px solid #fff; +} + +#fancybox-hide-sel-frame { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: transparent; + z-index: 1101; +} + +#fancybox-close { + position: absolute; + top: -15px; + right: -15px; + width: 30px; + height: 30px; + background: transparent url('fancybox.png') -40px 0px; + cursor: pointer; + z-index: 1103; + display: none; +} + +#fancybox-error { + color: #444; + font: normal 12px/20px Arial; + padding: 14px; + margin: 0; +} + +#fancybox-img { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + line-height: 0; + vertical-align: top; +} + +#fancybox-frame { + width: 100%; + height: 100%; + border: none; + display: block; +} + +#fancybox-left, #fancybox-right { + position: absolute; + bottom: 0px; + height: 100%; + width: 35%; + cursor: pointer; + outline: none; + background: transparent url('blank.gif'); + z-index: 1102; + display: none; +} + +#fancybox-left { + left: 0px; +} + +#fancybox-right { + right: 0px; +} + +#fancybox-left-ico, #fancybox-right-ico { + position: absolute; + top: 50%; + left: -9999px; + width: 30px; + height: 30px; + margin-top: -15px; + cursor: pointer; + z-index: 1102; + display: block; +} + +#fancybox-left-ico { + background-image: url('fancybox.png'); + background-position: -40px -30px; +} + +#fancybox-right-ico { + background-image: url('fancybox.png'); + background-position: -40px -60px; +} + +#fancybox-left:hover, #fancybox-right:hover { + visibility: visible; /* IE6 */ +} + +#fancybox-left:hover span { + left: 20px; +} + +#fancybox-right:hover span { + left: auto; + right: 20px; +} + +.fancybox-bg { + position: absolute; + padding: 0; + margin: 0; + border: 0; + width: 20px; + height: 20px; + z-index: 1001; +} + +#fancybox-bg-n { + top: -20px; + left: 0; + width: 100%; + background-image: url('fancybox-x.png'); +} + +#fancybox-bg-ne { + top: -20px; + right: -20px; + background-image: url('fancybox.png'); + background-position: -40px -162px; +} + +#fancybox-bg-e { + top: 0; + right: -20px; + height: 100%; + background-image: url('fancybox-y.png'); + background-position: -20px 0px; +} + +#fancybox-bg-se { + bottom: -20px; + right: -20px; + background-image: url('fancybox.png'); + background-position: -40px -182px; +} + +#fancybox-bg-s { + bottom: -20px; + left: 0; + width: 100%; + background-image: url('fancybox-x.png'); + background-position: 0px -20px; +} + +#fancybox-bg-sw { + bottom: -20px; + left: -20px; + background-image: url('fancybox.png'); + background-position: -40px -142px; +} + +#fancybox-bg-w { + top: 0; + left: -20px; + height: 100%; + background-image: url('fancybox-y.png'); +} + +#fancybox-bg-nw { + top: -20px; + left: -20px; + background-image: url('fancybox.png'); + background-position: -40px -122px; +} + +#fancybox-title { + font-family: Helvetica; + font-size: 12px; + z-index: 1102; +} + +.fancybox-title-inside { + padding-bottom: 10px; + text-align: center; + color: #333; + background: #fff; + position: relative; +} + +.fancybox-title-outside { + padding-top: 10px; + color: #fff; +} + +.fancybox-title-over { + position: absolute; + bottom: 0; + left: 0; + color: #FFF; + text-align: left; +} + +#fancybox-title-over { + padding: 10px; + background-image: url('fancy_title_over.png'); + display: block; +} + +.fancybox-title-float { + position: absolute; + left: 0; + bottom: -20px; + height: 32px; +} + +#fancybox-title-float-wrap { + border: none; + border-collapse: collapse; + width: auto; +} + +#fancybox-title-float-wrap td { + border: none; + white-space: nowrap; +} + +#fancybox-title-float-left { + padding: 0 0 0 15px; + background: url('fancybox.png') -40px -90px no-repeat; +} + +#fancybox-title-float-main { + color: #FFF; + line-height: 29px; + font-weight: bold; + padding: 0 0 3px 0; + background: url('fancybox-x.png') 0px -40px; +} + +#fancybox-title-float-right { + padding: 0 0 0 15px; + background: url('fancybox.png') -55px -90px no-repeat; +} + +/* IE6 */ + +.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } +.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { + height: expression(this.parentNode.clientHeight + "px"); +} + +#fancybox-loading.fancybox-ie6 { + position: absolute; margin-top: 0; + top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); +} + +#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); } + +/* IE6, IE7, IE8 */ + +.fancybox-ie .fancybox-bg { background: transparent !important; } + +.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); } \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/file_upload/bootstrap.min.css b/assets/grocery_crud/css/jquery_plugins/file_upload/bootstrap.min.css new file mode 100644 index 000000000..22b3ecc05 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/file_upload/bootstrap.min.css @@ -0,0 +1,360 @@ +html,body{margin:0;padding:0;} +h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;} +table{border-collapse:collapse;border-spacing:0;} +ol,ul{list-style:none;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;} +a:hover,a:active{outline:0;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;} +button,input{line-height:normal;*overflow:visible;} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{background-color:#ffffff;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;} +.container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;} +.container:after{clear:both;} +.container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;} +.container-fluid:after{clear:both;} +.container-fluid>.sidebar{position:absolute;top:0;left:20px;width:220px;} +.container-fluid>.content{margin-left:240px;} +a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;} +.row:after{clear:both;} +.row>[class*="span"]{display:inline;float:left;margin-left:20px;} +.span1{width:40px;} +.span2{width:100px;} +.span3{width:160px;} +.span4{width:220px;} +.span5{width:280px;} +.span6{width:340px;} +.span7{width:400px;} +.span8{width:460px;} +.span9{width:520px;} +.span10{width:580px;} +.span11{width:640px;} +.span12{width:700px;} +.span13{width:760px;} +.span14{width:820px;} +.span15{width:880px;} +.span16{width:940px;} +.span17{width:1000px;} +.span18{width:1060px;} +.span19{width:1120px;} +.span20{width:1180px;} +.span21{width:1240px;} +.span22{width:1300px;} +.span23{width:1360px;} +.span24{width:1420px;} +.row>.offset1{margin-left:80px;} +.row>.offset2{margin-left:140px;} +.row>.offset3{margin-left:200px;} +.row>.offset4{margin-left:260px;} +.row>.offset5{margin-left:320px;} +.row>.offset6{margin-left:380px;} +.row>.offset7{margin-left:440px;} +.row>.offset8{margin-left:500px;} +.row>.offset9{margin-left:560px;} +.row>.offset10{margin-left:620px;} +.row>.offset11{margin-left:680px;} +.row>.offset12{margin-left:740px;} +.span-one-third{width:300px;} +.span-two-thirds{width:620px;} +.row>.offset-one-third{margin-left:340px;} +.row>.offset-two-thirds{margin-left:660px;} +p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;} +h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;} +h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;} +h3,h4,h5,h6{line-height:36px;} +h3{font-size:18px;}h3 small{font-size:14px;} +h4{font-size:16px;}h4 small{font-size:12px;} +h5{font-size:14px;} +h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;} +ul,ol{margin:0 0 18px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;color:#808080;} +ul.unstyled{list-style:none;margin-left:0;} +dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;} +dl dt{font-weight:bold;} +dl dd{margin-left:9px;} +hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;} +strong{font-style:inherit;font-weight:bold;} +em{font-style:italic;font-weight:inherit;line-height:inherit;} +.muted{color:#bfbfbf;} +blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;} +blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';} +address{display:block;line-height:18px;margin-bottom:18px;} +code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;} +pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;} +form{margin-bottom:18px;} +fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;} +form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;} +form .clearfix:after{clear:both;} +label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;} +label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;} +form .input{margin-left:150px;} +input[type=checkbox],input[type=radio]{cursor:pointer;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +select{padding:initial;} +input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;} +input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;} +select,input[type=file]{height:27px;*height:auto;line-height:27px;*margin-top:4px;} +select[multiple]{height:inherit;background-color:#ffffff;} +textarea{height:auto;} +.uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#bfbfbf;} +::-webkit-input-placeholder{color:#bfbfbf;} +input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);} +input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);} +input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;} +form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;} +form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on{color:#b94a48;background-color:#fce6e6;border-color:#b94a48;} +form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline{color:#c09853;} +form .clearfix.warning input,form .clearfix.warning textarea{color:#c09853;border-color:#ccae64;}form .clearfix.warning input:focus,form .clearfix.warning textarea:focus{border-color:#be9a3f;-webkit-box-shadow:0 0 6px #e5d6b1;-moz-box-shadow:0 0 6px #e5d6b1;box-shadow:0 0 6px #e5d6b1;} +form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on{color:#c09853;background-color:#d2b877;border-color:#c09853;} +form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline{color:#468847;} +form .clearfix.success input,form .clearfix.success textarea{color:#468847;border-color:#57a957;}form .clearfix.success input:focus,form .clearfix.success textarea:focus{border-color:#458845;-webkit-box-shadow:0 0 6px #9acc9a;-moz-box-shadow:0 0 6px #9acc9a;box-shadow:0 0 6px #9acc9a;} +form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on{color:#468847;background-color:#bcddbc;border-color:#468847;} +.input-mini,input.mini,textarea.mini,select.mini{width:60px;} +.input-small,input.small,textarea.small,select.small{width:90px;} +.input-medium,input.medium,textarea.medium,select.medium{width:150px;} +.input-large,input.large,textarea.large,select.large{width:210px;} +.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;} +.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;} +textarea.xxlarge{overflow-y:auto;} +input.span1,textarea.span1{display:inline-block;float:none;width:30px;margin-left:0;} +input.span2,textarea.span2{display:inline-block;float:none;width:90px;margin-left:0;} +input.span3,textarea.span3{display:inline-block;float:none;width:150px;margin-left:0;} +input.span4,textarea.span4{display:inline-block;float:none;width:210px;margin-left:0;} +input.span5,textarea.span5{display:inline-block;float:none;width:270px;margin-left:0;} +input.span6,textarea.span6{display:inline-block;float:none;width:330px;margin-left:0;} +input.span7,textarea.span7{display:inline-block;float:none;width:390px;margin-left:0;} +input.span8,textarea.span8{display:inline-block;float:none;width:450px;margin-left:0;} +input.span9,textarea.span9{display:inline-block;float:none;width:510px;margin-left:0;} +input.span10,textarea.span10{display:inline-block;float:none;width:570px;margin-left:0;} +input.span11,textarea.span11{display:inline-block;float:none;width:630px;margin-left:0;} +input.span12,textarea.span12{display:inline-block;float:none;width:690px;margin-left:0;} +input.span13,textarea.span13{display:inline-block;float:none;width:750px;margin-left:0;} +input.span14,textarea.span14{display:inline-block;float:none;width:810px;margin-left:0;} +input.span15,textarea.span15{display:inline-block;float:none;width:870px;margin-left:0;} +input.span16,textarea.span16{display:inline-block;float:none;width:930px;margin-left:0;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;} +.help-inline,.help-block{font-size:13px;line-height:18px;color:#bfbfbf;} +.help-inline{padding-left:5px;*position:relative;*top:-5px;} +.help-block{display:block;max-width:600px;} +.inline-inputs{color:#808080;}.inline-inputs span{padding:0 2px 0 1px;} +.input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;} +.inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;} +.inputs-list label{display:block;float:none;width:auto;padding:0;margin-left:20px;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;} +.inputs-list label small{font-size:11px;font-weight:normal;} +.inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;} +.inputs-list:first-child{padding-top:6px;} +.inputs-list li+li{padding-top:2px;} +.inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;margin-left:-20px;float:left;} +.form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;} +.form-stacked legend{padding-left:0;} +.form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;} +.form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;} +.form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;} +.form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;} +.form-stacked .actions{margin-left:-20px;padding-left:20px;} +table{width:100%;margin-bottom:18px;padding:0;font-size:13px;border-collapse:collapse;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;} +table th{padding-top:9px;font-weight:bold;vertical-align:middle;} +table td{vertical-align:top;border-top:1px solid #ddd;} +table tbody th{border-top:1px solid #ddd;vertical-align:top;} +.condensed-table th,.condensed-table td{padding:5px 5px 4px;} +.bordered-table{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.bordered-table th+th,.bordered-table td+td,.bordered-table th+td{border-left:1px solid #ddd;} +.bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.bordered-table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.bordered-table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +table .span1{width:20px;} +table .span2{width:60px;} +table .span3{width:100px;} +table .span4{width:140px;} +table .span5{width:180px;} +table .span6{width:220px;} +table .span7{width:260px;} +table .span8{width:300px;} +table .span9{width:340px;} +table .span10{width:380px;} +table .span11{width:420px;} +table .span12{width:460px;} +table .span13{width:500px;} +table .span14{width:540px;} +table .span15{width:580px;} +table .span16{width:620px;} +.zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +.zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th{background-color:#f5f5f5;} +table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;} +table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);} +table .header:hover:after{visibility:visible;} +table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} +table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} +table .blue{color:#049cdb;border-bottom-color:#049cdb;} +table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;} +table .green{color:#46a546;border-bottom-color:#46a546;} +table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;} +table .red{color:#9d261d;border-bottom-color:#9d261d;} +table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;} +table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;} +table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;} +table .orange{color:#f89406;border-bottom-color:#f89406;} +table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;} +table .purple{color:#7a43b6;border-bottom-color:#7a43b6;} +table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;} +.topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;} +.topbar h3{position:relative;} +.topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;} +.topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;} +.topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} +.topbar form.pull-right{float:right;} +.topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;} +.topbar input::-webkit-input-placeholder{color:#e6e6e6;} +.topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;} +.topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);} +.topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;} +.topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;} +.topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);} +.topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;} +.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);} +.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);} +.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;} +.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;} +.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;} +.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;} +li.menu,.dropdown{position:relative;} +a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} +.menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;} +.menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;} +.topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);} +.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;} +.tabs,.pills{margin:0 0 18px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;} +.tabs:after,.pills:after{clear:both;} +.tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;} +.tabs{border-color:#ddd;border-style:solid;border-width:0 0 1px;}.tabs>li{position:relative;margin-bottom:-1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:34px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;} +.tabs .active>a,.tabs .active>a:hover{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;} +.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;} +.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;} +.pills a{margin:5px 3px 5px 0;padding:0 15px;line-height:30px;text-shadow:0 1px 1px #ffffff;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#00438a;} +.pills .active a{color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#0069d6;} +.pills-vertical>li{float:none;} +.tab-content>.tab-pane,.pill-content>.pill-pane,.tab-content>div,.pill-content>div{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#bfbfbf;} +.breadcrumb .active a{color:#404040;} +.hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;} +.page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;} +.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;} +.btn .close,.alert-message .close{font-family:Arial,sans-serif;line-height:18px;} +.btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} +.btn:focus{outline:1px dotted #666;} +.btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} +.btn.active,.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.btn.small{padding:7px 9px 7px;font-size:11px;} +:root .alert-message,:root .btn{border-radius:0 \0;} +button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} +.close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;} +.alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{margin-top:1px;*margin-top:0;} +.alert-message a{font-weight:bold;color:#404040;} +.alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a{color:#ffffff;} +.alert-message h5{line-height:18px;} +.alert-message p{margin-bottom:0;} +.alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;} +.alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);} +.alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;} +.alert-message.block-message ul{margin-bottom:0;} +.alert-message.block-message li{color:#404040;} +.alert-message.block-message .alert-actions{margin-top:5px;} +.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;} +.alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;} +.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} +.alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a{color:#404040;} +.pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;} +.pagination a:hover,.pagination .active a{background-color:#c7eefe;} +.pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;} +.pagination .next a{border:0;} +.well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} +.modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;} +.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{border-bottom:1px solid #eee;padding:5px 15px;} +.modal-body{padding:15px;} +.modal-body form{margin-bottom:0;} +.modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;} +.modal .popover,.modal .twipsy{z-index:12000;} +.twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} +.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.twipsy-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover .inner{background:#000000;background:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;} +.popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;} +.label.warning{background-color:#f89406;} +.label.success{background-color:#46a546;} +.label.notice{background-color:#62cffc;} +.media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;} +.media-grid:after{clear:both;} +.media-grid li{display:inline;} +.media-grid a{float:left;padding:4px;margin:0 0 18px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;} +.media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} + +/* grocery CRUD extra */ +input,textarea,select,.uneditable-input{color:#444444;} +/* ------------------ */ diff --git a/assets/grocery_crud/css/jquery_plugins/file_upload/file-uploader.css b/assets/grocery_crud/css/jquery_plugins/file_upload/file-uploader.css new file mode 100644 index 000000000..85e810332 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/file_upload/file-uploader.css @@ -0,0 +1,29 @@ +.qq-upload-button { + display:block; /* or inline-block */ + padding: 7px 15px; + text-align:center; + border:1px solid #AAA; + color: #555555; + border-radius: 5px; + float:left; + + background: #ccc; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); + background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); + background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); + background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); + background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); + background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%); +} +.qq-upload-button:hover { + background: #bbb; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #bbb), color-stop(0.6, #ddd)); + background-image: -webkit-linear-gradient(center bottom, #bbb 0%, #ddd 60%); + background-image: -moz-linear-gradient(center bottom, #bbb 0%, #ddd 60%); + background-image: -o-linear-gradient(bottom, #bbb 0%, #ddd 60%); + background-image: -ms-linear-gradient(top, #bbbbbb 0%,#dddddd 60%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bbbbbb', endColorstr='#dddddd',GradientType=0 ); + background-image: linear-gradient(top, #bbbbbb 0%,#dddddd 60%); +} +.qq-upload-button:focus {outline:1px dotted black;} \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/file_upload/fileuploader.css b/assets/grocery_crud/css/jquery_plugins/file_upload/fileuploader.css new file mode 100644 index 000000000..f7950208d --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/file_upload/fileuploader.css @@ -0,0 +1,71 @@ +.qq-uploader { position:relative; width: 100%;} + +.qq-upload-button { + display:block; /* or inline-block */ + padding: 7px 15px; + text-align:center; + border:1px solid #AAA; + color: #555555; + border-radius: 5px; + float:left; +} +.qq-upload-button-hover { + +} +.qq-upload-button-focus {outline:1px dotted black;} + +.qq-upload-drop-area { + position:absolute; top:0; left:0; width: 510px; height: 35px; z-index:2; + background:#FF9797; text-align:center; +} +.qq-upload-drop-area span { + display:block; position:absolute; top: 50%; width:100%; margin-top:-8px; font-size:16px; +} +.qq-upload-drop-area-active {background:#FF7171;} + +.qq-upload-list {margin: 10px 5px 0px 10px; padding:0; list-style: none; float:left;} +.qq-upload-list li { margin:0; padding:0; line-height:15px; font-size:12px; float:left;} +.qq-upload-file, .qq-upload-spinner, .qq-upload-size, .qq-upload-cancel, .qq-upload-failed-text { + margin-right: 7px; +} +.qq-upload-file {} +.qq-upload-spinner {display:inline-block; background: url("loading.gif"); width:15px; height:15px; vertical-align:text-bottom;} +.qq-upload-size,.qq-upload-cancel {font-size:11px;} + +.qq-upload-failed-text {display:none;} +.qq-upload-fail .qq-upload-failed-text {display:inline;} + +a.qq-upload-cancel +{ + color: red !important; +} + +/* Grocery CRUD extras */ +a.open-file +{ + color: #000; + font-weight: bold; + text-decoration: none; +} +a.open-file:hover +{ + text-decoration: underline; +} +a.delete-anchor +{ + color: red !important; +} +.image-thumbnail img +{ + cursor: -moz-zoom-in; + cursor: -webkit-zoom-in; +} +.form-field-box.even .image-thumbnail img +{ + border: 4px solid #fff; +} +.form-field-box.odd .image-thumbnail img +{ + border: 4px solid #ddd; +} +/* ------------------- */ \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/file_upload/jquery.fileupload-ui.css b/assets/grocery_crud/css/jquery_plugins/file_upload/jquery.fileupload-ui.css new file mode 100644 index 000000000..edb196f56 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/file_upload/jquery.fileupload-ui.css @@ -0,0 +1,56 @@ +@charset 'UTF-8'; +/* + * jQuery File Upload UI Plugin CSS 6.0 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.fileinput-button input { + position: absolute; + top: 0; + right: 0; + margin: 0; + border: solid transparent; + border-width: 0 0 100px 200px; + opacity: 0; + filter: alpha(opacity=0); + -moz-transform: translate(-300px, 0) scale(4); + direction: ltr; + cursor: pointer; +} + +.fileinput-button { + position: relative; + overflow: hidden; + float: left; + margin-right: 4px; +} + +.progressbar, +.progressbar div { + width: 200px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.3); + background: #fff; +} + +.progressbar div { + width: auto; + background: url(progressbar.gif); +} + +.fileupload-progressbar { + float: right; + width: 400px; + margin-top: 4px; +} diff --git a/assets/grocery_crud/css/jquery_plugins/file_upload/loading.gif b/assets/grocery_crud/css/jquery_plugins/file_upload/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fba77609ec50f9ab338a90d658e16bb05b8d206 GIT binary patch literal 1688 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 + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/jquery-ui-timepicker-addon.css b/assets/grocery_crud/css/jquery_plugins/jquery-ui-timepicker-addon.css new file mode 100644 index 000000000..b93a85f62 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/jquery-ui-timepicker-addon.css @@ -0,0 +1,10 @@ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } + +.ui-timepicker-rtl{ direction: rtl; } +.ui-timepicker-rtl dl { text-align: right; } +.ui-timepicker-rtl dl dd { margin: 0 65px 10px 10px; } \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/jquery.ui.datetime.css b/assets/grocery_crud/css/jquery_plugins/jquery.ui.datetime.css new file mode 100644 index 000000000..c81be5087 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/jquery.ui.datetime.css @@ -0,0 +1,116 @@ +@CHARSET "UTF-8"; + + /*demo page css*/ + + + .demoHeaders { + margin-top: 2em; + } + + #dialog_link { + padding: .4em 1em .4em 20px; + text-decoration: none; + position: relative; + } + + #dialog_link span.ui-icon { + margin: 0 5px 0 0; + position: absolute; + left: .2em; + top: 50%; + margin-top: -8px; + } + + ul#icons { + margin: 0; + padding: 0; + } + + ul#icons li { + margin: 2px; + position: relative; + padding: 4px 0; + cursor: pointer; + float: left; + list-style: none; + } + + ul#icons span.ui-icon { + float: left; + margin: 0 4px; + } + + + .selHrs, .selMins { + width:2.5em; + } + .selHrs { + margin-left:5px; + } + .dayPeriod { + display:inline-block; + width:20px; + } + .slider { + height:120px; + float:left; + margin:10px + } + + #tpSelectedTime { + margin-bottom:0; + border-bottom:1px solid #aaa; + padding:5px; + color:#000; + background:#fff; + text-transform:none; + + } + #tpSelectedTime span { + fon-weight:bold; + } + #datepicker { + + } + #pickerplug { + overflow:hidden; + display:none; + position:absolute; + top:200px; + left:300px; + padding:0; + margin:0; + z-index:500; + } + #pickerplug li { + display:block; + float:left; + } + #timepicker { + border:1px solid #aaa; + background:#fff; + } + #timepicker ul { + overflow:hidden; + padding:5px; + } + #timepicker ul li { + position:relative; + display:block; + float:left; + width:50px; + + } + #timepicker ul li h4 { + width:100%; + background:transparent; + color:#000; + text-align:center; + } + #timepicker ul li .slider { + position:relative; + left:10px; + + /* background:#FBF9EE url(images/ui-bg_glass_55_fbf9ee_1x400.png) repeat-x scroll 50% 50%; + border:1px solid #FCEFA1;*/ + } \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/ui.multiselect.css b/assets/grocery_crud/css/jquery_plugins/ui.multiselect.css new file mode 100644 index 000000000..f1e41cec8 --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/ui.multiselect.css @@ -0,0 +1,32 @@ +/* Multiselect +----------------------------------*/ + +.ui-multiselect { border: solid 1px; font-size: 0.8em; } +.ui-multiselect ul { -moz-user-select: none; } +.ui-multiselect li { margin: 0; padding: 0; cursor: default; line-height: 20px; height: 20px; font-size: 11px; list-style: none; } +.ui-multiselect li a { color: #999; text-decoration: none; padding: 0; display: block; float: left; cursor: pointer;} +.ui-multiselect li.ui-draggable-dragging { padding-left: 10px; } + +.ui-multiselect div.selected { position: relative; padding: 0; margin: 0; border: 0; float:left; } +.ui-multiselect ul.selected { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; position: relative; width: 100%; } +.ui-multiselect ul.selected li { } + +.ui-multiselect div.available { position: relative; padding: 0; margin: 0; border: 0; float:left; border-left: 1px solid; } +.ui-multiselect ul.available { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; width: 100%; } +.ui-multiselect ul.available li { padding-left: 10px; } + +.ui-multiselect .ui-state-default { border: none; margin-bottom: 1px; position: relative; padding-left: 20px;} +.ui-multiselect .ui-state-hover { border: none; } +.ui-multiselect .ui-widget-header {border: none; font-size: 11px; margin-bottom: 1px;} + +.ui-multiselect .add-all { float: right; padding: 10px 7px 10px 0; font-size: 11px; } +.ui-multiselect .remove-all { float: right; padding: 10px 7px 11px 0; font-size: 11px; } +.ui-multiselect .search { float: left; padding:0;} +.ui-multiselect .count { float: left; padding: 10px 7px;} + +.ui-multiselect li span.ui-icon-arrowthick-2-n-s { position: absolute; left: 2px; } +.ui-multiselect li a.action { position: absolute; right: 2px; top: 2px; } + +.ui-multiselect input.search { height: 20px !important; padding: 2px !important; opacity: 0.5 !important; margin: 4px !important; width: 150px !important; } + +select.multiselect{ width:704px; } \ No newline at end of file diff --git a/assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input-focus.png b/assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..0b059d48da54ea8912aa090ff066c305ad2bd737 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3-o#&#{0g$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G`~f~8u0MYKc>n(WvuDrl-o5+(|Np=24<-Yp#5`RbLn>}1 nC8Q-JC8Q)IBqSybP0l+XkKgNrV7 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input.png b/assets/grocery_crud/css/jquery_plugins/uniform/images/bg-input.png new file mode 100644 index 0000000000000000000000000000000000000000..485d222ebb14b743b62680377907cf01944bb761 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3-o#&#{0g$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G`~f~8u1}vnee>qc=g*&i{rdI)|No0DL0f=QVxBIJAr-fh n5)u+p5|R?q5)u;_ISd#WoEZ4!^X2t`Di}On{an^LB{Ts5W?d~; literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/uniform/images/sprite.png b/assets/grocery_crud/css/jquery_plugins/uniform/images/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..66b558fc6e40a749db29374e9bfef084c7c91e0e GIT binary patch literal 34229 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 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/jquery_plugins/uniform/uniform.default.css b/assets/grocery_crud/css/jquery_plugins/uniform/uniform.default.css new file mode 100644 index 000000000..bb21dd2cc --- /dev/null +++ b/assets/grocery_crud/css/jquery_plugins/uniform/uniform.default.css @@ -0,0 +1,644 @@ +/* + +Uniform Theme: Uniform Default +Version: 1.8 +By: Josh Pyles +License: MIT License +--- +For use with the Uniform plugin: +http://pixelmatrixdesign.com/uniform/ +--- +Generated by Uniform Theme Generator: +http://pixelmatrixdesign.com/uniform/themer.html + +*/ + +/* Global Declaration */ + +div.selector, +div.selector span, +div.checker span, +div.radio span, +div.uploader, +div.uploader span.action, +div.button, +div.button span { + background-image: url(images/sprite.png); + background-repeat: no-repeat; + -webkit-font-smoothing: antialiased; +} + +.selector, +.radio, +.checker, +.uploader, +.button, +.selector *, +.radio *, +.checker *, +.uploader *, +.button *{ + margin: 0; + padding: 0; +} + +/* INPUT & TEXTAREA */ + +input.text, +input.email, +input.search, +input.tel, +input.url, +input.datetime, +input.date, +input.month, +input.week, +input.time, +input.datetime-local, +input.number, +input.color, +input.password, +select.uniform-multiselect, +textarea.uniform { + font-size: 12px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + padding: 3px; + color: #777; + background: url('images/bg-input-focus.png') repeat-x 0px 0px; + background: url('images/bg-input.png') repeat-x 0px 0px; + border-top: solid 1px #aaa; + border-left: solid 1px #aaa; + border-bottom: solid 1px #ccc; + border-right: solid 1px #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + outline: 0; +} + +/* remove default webkit and possible mozilla .search styles */ +input.search, input.search:active { + -moz-appearance: none; + -webkit-appearance: none; +} + +input.text:focus, +input.email:focus, +input.search:focus, +input.tel:focus, +input.url:focus, +input.datetime:focus, +input.date:focus, +input.month:focus, +input.week:focus, +input.time:focus, +input.datetime-local:focus, +input.number:focus, +input.color:focus, +input.password:focus, +select.uniform-multiselect:focus, +textarea.uniform:focus { + -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,0.3); + -moz-box-shadow: 0px 0px 4px rgba(0,0,0,0.3); + box-shadow: 0px 0px 4px rgba(0,0,0,0.3); + border-color: #999; + background: url('images/bg-input-focus.png') repeat-x 0px 0px; +} + +/* SPRITES */ + +/* Select */ + +div.selector { + background-position: -483px -130px; + line-height: 26px; + height: 26px; +} + +div.selector span { + background-position: right 0px; + height: 26px; + line-height: 26px; +} + +div.selector select { + /* change these to adjust positioning of select element */ + top: 0px; + left: 0px; +} + +div.selector:active, +div.selector.active { + background-position: -483px -156px; +} + +div.selector:active span, +div.selector.active span { + background-position: right -26px; +} + +div.selector.focus, div.selector.hover, div.selector:hover { + background-position: -483px -182px; +} + +div.selector.focus span, div.selector.hover span, div.selector:hover span { + background-position: right -52px; +} + +div.selector.focus:active, +div.selector.focus.active, +div.selector:hover:active, +div.selector.active:hover { + background-position: -483px -208px; +} + +div.selector.focus:active span, +div.selector:hover:active span, +div.selector.active:hover span, +div.selector.focus.active span { + background-position: right -78px; +} + +div.selector.disabled { + background-position: -483px -234px; +} + +div.selector.disabled span { + background-position: right -104px; +} + +/* Checkbox */ + +div.checker { + width: 19px; + height: 19px; +} + +div.checker input { + width: 19px; + height: 19px; +} + +div.checker span { + background-position: 0px -260px; + height: 19px; + width: 19px; +} + +div.checker:active span, +div.checker.active span { + background-position: -19px -260px; +} + +div.checker.focus span, +div.checker:hover span { + background-position: -38px -260px; +} + +div.checker.focus:active span, +div.checker:active:hover span, +div.checker.active:hover span, +div.checker.focus.active span { + background-position: -57px -260px; +} + +div.checker span.checked { + background-position: -76px -260px; +} + +div.checker:active span.checked, +div.checker.active span.checked { + background-position: -95px -260px; +} + +div.checker.focus span.checked, +div.checker:hover span.checked { + background-position: -114px -260px; +} + +div.checker.focus:active span.checked, +div.checker:hover:active span.checked, +div.checker.active:hover span.checked, +div.checker.active.focus span.checked { + background-position: -133px -260px; +} + +div.checker.disabled span, +div.checker.disabled:active span, +div.checker.disabled.active span { + background-position: -152px -260px; +} + +div.checker.disabled span.checked, +div.checker.disabled:active span.checked, +div.checker.disabled.active span.checked { + background-position: -171px -260px; +} + +/* Radio */ + +div.radio { + width: 18px; + height: 18px; +} + +div.radio input { + width: 18px; + height: 18px; +} + +div.radio span { + height: 18px; + width: 18px; + background-position: 0px -279px; +} + +div.radio:active span, +div.radio.active span { + background-position: -18px -279px; +} + +div.radio.focus span, +div.radio:hover span { + background-position: -36px -279px; +} + +div.radio.focus:active span, +div.radio:active:hover span, +div.radio.active:hover span, +div.radio.active.focus span { + background-position: -54px -279px; +} + +div.radio span.checked { + background-position: -72px -279px; +} + +div.radio:active span.checked, +div.radio.active span.checked { + background-position: -90px -279px; +} + +div.radio.focus span.checked, div.radio:hover span.checked { + background-position: -108px -279px; +} + +div.radio.focus:active span.checked, +div.radio:hover:active span.checked, +div.radio.focus.active span.checked, +div.radio.active:hover span.checked { + background-position: -126px -279px; +} + +div.radio.disabled span, +div.radio.disabled:active span, +div.radio.disabled.active span { + background-position: -144px -279px; +} + +div.radio.disabled span.checked, +div.radio.disabled:active span.checked, +div.radio.disabled.active span.checked { + background-position: -162px -279px; +} + +/* Uploader */ + +div.uploader { + background-position: 0px -297px; + height: 28px; +} + +div.uploader span.action { + background-position: right -409px; + height: 24px; + line-height: 24px; +} + +div.uploader span.filename { + height: 24px; + /* change this line to adjust positioning of filename area */ + margin: 2px 0px 2px 2px; + line-height: 24px; +} + +div.uploader.focus, +div.uploader.hover, +div.uploader:hover { + background-position: 0px -353px; +} + +div.uploader.focus span.action, +div.uploader.hover span.action, +div.uploader:hover span.action { + background-position: right -437px; +} + +div.uploader.active span.action, +div.uploader:active span.action { + background-position: right -465px; +} + +div.uploader.focus.active span.action, +div.uploader:focus.active span.action, +div.uploader.focus:active span.action, +div.uploader:focus:active span.action { + background-position: right -493px; +} + +div.uploader.disabled { + background-position: 0px -325px; +} + +div.uploader.disabled span.action { + background-position: right -381px; +} + +div.button { + background-position: 0px -523px; +} + +div.button span { + background-position: right -643px; +} + +div.button.focus, +div.button:focus, +div.button:hover, +div.button.hover { + background-position: 0px -553px; +} + +div.button.focus span, +div.button:focus span, +div.button:hover span, +div.button.hover span { + background-position: right -673px; +} + +div.button.active, +div.button:active { + background-position: 0px -583px; +} + +div.button.active span, +div.button:active span { + background-position: right -703px; + color: #555; +} + +div.button.disabled, +div.button:disabled { + background-position: 0px -613px; +} + +div.button.disabled span, +div.button:disabled span { + background-position: right -733px; + color: #bbb; + cursor: default; +} + +/* PRESENTATION */ + +/* Button */ + +div.button { + height: 30px; +} + +div.button span { + margin-left: 13px; + height: 22px; + padding-top: 8px; + font-weight: bold; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + letter-spacing: 1px; + text-transform: uppercase; + padding-left: 2px; + padding-right: 15px; +} + +/* Select */ +div.selector { + width: 190px; + font-size: 12px; +} + +div.selector select { + min-width: 190px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + border: solid 1px #fff; +} + +div.selector span { + padding: 0px 25px 0px 2px; + cursor: pointer; +} + +div.selector span { + color: #666; + width: 158px; + text-shadow: 0 1px 0 #fff; +} + +div.selector.disabled span { + color: #bbb; +} + +/* Checker */ +div.checker { + margin-right: 5px; +} + +/* Radio */ +div.radio { + margin-right: 3px; +} + +/* Uploader */ +div.uploader { + width: 190px; + cursor: pointer; +} + +div.uploader span.action { + width: 85px; + text-align: center; + text-shadow: #fff 0px 1px 0px; + background-color: #fff; + font-size: 11px; + font-weight: bold; +} + +div.uploader span.filename { + color: #777; + width: 82px; + border-right: solid 1px #bbb; + font-size: 11px; +} + +div.uploader input { + width: 190px; +} + +div.uploader.disabled span.action { + color: #aaa; +} + +div.uploader.disabled span.filename { + border-color: #ddd; + color: #aaa; +} +/* + +CORE FUNCTIONALITY + +Not advised to edit stuff below this line +----------------------------------------------------- +*/ + +.selector, +.checker, +.button, +.radio, +.uploader { + display: -moz-inline-box; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} + +.selector select:focus, .radio input:focus, .checker input:focus, .uploader input:focus { + outline: 0; +} + +/* Button */ + +div.button a, +div.button button, +div.button input { + position: absolute; +} + +div.button { + cursor: pointer; + position: relative; +} + +div.button span { + display: -moz-inline-box; + display: inline-block; + line-height: 1; + text-align: center; +} + +/* Select */ + +div.selector { + position: relative; + padding-left: 10px; + overflow: hidden; +} + +div.selector span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +div.selector select { + position: absolute; + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + height: 25px; + border: none; + background: none; +} + +/* Checker */ + +div.checker { + position: relative; +} + +div.checker span { + display: -moz-inline-box; + display: inline-block; + text-align: center; +} + +div.checker input { + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + display: inline-block; + background: none; +} + +/* Radio */ + +div.radio { + position: relative; +} + +div.radio span { + display: -moz-inline-box; + display: inline-block; + text-align: center; +} + +div.radio input { + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + text-align: center; + display: inline-block; + background: none; +} + +/* Uploader */ + +div.uploader { + position: relative; + overflow: hidden; + cursor: default; +} + +div.uploader span.action { + float: left; + display: inline; + padding: 2px 0px; + overflow: hidden; + cursor: pointer; +} + +div.uploader span.filename { + padding: 0px 10px; + float: left; + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: default; +} + +div.uploader input { + opacity: 0; + filter: alpha(opacity=0); + -moz-opacity: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + float: right; + height: 25px; + border: none; + cursor: default; +} diff --git a/assets/grocery_crud/css/ui/index.html b/assets/grocery_crud/css/ui/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/css/ui/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/css/ui/simple/images/animated-overlay.gif b/assets/grocery_crud/css/ui/simple/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-bg_flat_0_aaaaaa_40x100.png b/assets/grocery_crud/css/ui/simple/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5261a1f938c973aaa668fcd8d1569da9cc5fd6 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq*&4&eH|GXHuiJ>Nn{1`8H!C8<`)MX5lF!N|bSSl7Tv*U&t~(89{p%*x1A*TBNcz~F2AsX7!5x%nxX YX_dG&v@jJN0%~CJboFyt=akR{0FsVJZvX%Q literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-bg_flat_75_ffffff_40x100.png b/assets/grocery_crud/css/ui/simple/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..262b9f460b8968dcddc985c687d2e5398f490cff GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq*&4&eH|GXHuiJ>Nn{1`8HIsBe3jv*T7lM^IZ7dHS+VTxd2EH!H@2TG}y zxJHzuB$lLFB^RXvDF!10Lt|Y7BV9xD5JL+qQ&THr3ta;XD+7bgq5{e&8glbfGSez? VYdGYwVm?p$~zaujKJSU)dGAg8%w!(ui^3BziR*I}z84KnZk zu3$dcT+u38*8N!e;3H9&!`|^fF8l9$xy+KAL82{D;y&BeDX(VTsr~jY?gNWg;)$NM z21)PAoE)F1i0Ir6oUvh%QoM=D$IB=9ZMOs$CX2nPbltnn^8-sb7qd;aRdP`(kYX@0Ff`URFw!+N4>7c`GBpJvT>}d% k0|Sw@6)7kha`RI%(<*UmNd0i&22cZor>mdKI;Vst05au-iU0rr literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-bg_glass_65_ffffff_1x400.png b/assets/grocery_crud/css/ui/simple/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..314778eabbf2a934ff9b4351a4b6e9fdb799de60 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjkr~Jeoi<|zkYY)9^mSxl*x1kgCy^DTpg73g ziDBJ2nU_G0Lb6AYF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CF41H=pF>?)FK#IZ0z|dINz)087JjBq#%GA`#*izTP!pguvG)a0oiiX_$l+3hB W+!|8s7i$AGFnGH9xvX-!3l}eP^2^y2tgpW7t>QVU z!zOt zI!3j`HKHUXu_V9 ZnO2Eg!y%6q^MM)|JYD@<);T3K0RYu?c@6*o literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-bg_glass_75_e6e6e6_1x400.png b/assets/grocery_crud/css/ui/simple/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..1367a16c3e645bdb8505b1764bbe273aeed6697d GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCN7hf*w8d!INoBxwRi;GitEYKCIC9V-A zDTyViR>?)FK#IZ0z|dINz)087JjBq#%GA`#*izTP!pguvG)a0oiiX_$l+3hB+!|8s S7i$AGFnGH9xvX8eS1;{{-AUQbcXq5B8w2)SU0<=PeM`lecf!mJ#|vei-@dS|RF>)Ftim~yHl>Mc zU;1FSYhABg^xWQrCQ<|QIe8al4_M)lnSI6j0_Bobq$Pk4b4LgEv!t41qIX6((c#2JpPek&$r@Ir;|4~0c}?;ag8WRNi0dVN-jzT zQVd20hQ_)EM!JUPA%+%KrlwXVmbwNORt5(0%Z2(-H00)|WTsW(){ysWl@U+_gQu&X J%Q~loCID0|cF_O; literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-icons_222222_256x240.png b/assets/grocery_crud/css/ui/simple/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..0de6293259d866646ee06e63162f42bc56c5bae4 GIT binary patch literal 6781 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 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-icons_2e83ff_256x240.png b/assets/grocery_crud/css/ui/simple/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..513a241d44d68c31a0db4af7f0c4d4a3d5596822 GIT binary patch literal 4353 zcmds4_g9lmw|!CwEtG^JO^RT7r6qs@(n1GCng|Gl8kz_}y0koWqzDKiQUugju}}mH zNDCdL3j!)7s7RBd5LyWN(C_|of4Kj^-D}pIbJm(Yvu4&_v-Y`ZZfeNECd38+0Ee-W zo+SW44pU&A1$H=37@yxg3~*2Fi`oDru>`x2>vUKTnwwbZ%f&JNKaI?<7s3v&rWa&s zdI^9+Sa=guEtug)PIDX+h2?BYx|E-*Y!$t%QJ*Mr~_uxHCR zY2c71W@6`evf(nf_&;ZjB$Yj*O%C^ixLz>S1Cp7J8UX<3uCboBRoLehJiFUyEh<+m z;?wbIL)N=c4qvt?eC7DGsK{JELXHB1p?vwaSbmaB`LE7psXeH1=k4SD^I1xgJ;MK@ z(P$44S$#=)wtcUyPf%d00ol6enFqy8Z=@FmQr^do@$3BaT-nvt9LHZ0fs$8L^O%u|1omXL_Hc^mQyOi z+Nzqoa=IGMk_-0a!X7b67x&-xS^=qGS}y;R#gjLHd^Ik$tCG1}G~feP{8o}CyVU=n zkn@`eqs&K0mJ~$6Rs)$|o?^te7q)u70S~mZK8Q!^KkK@!?NRzx*D1d_))}V$bapT5 zcsvVw@d2hZ<^`wiu}!HrX(_)aIEL3ZLVzR_{HP%7hUvrYBa0il5A82!EhU|yl(4n_YM8L6DgpmWH>d`KHl7OG%qJ;R z(|6N(^|!{?ZW8ODrPVDobCebv(d_+LIA^`5HuRWh+nw<~9VC3WSG`vwYmON`@MhLO zLi=ZtB0GAv>ZH(-%4=mXA&MDQq3`_scEq(3Mu;}(6?0AW;yhl)6l{hxW~`SGP?&8V z%9QdH_Qp77 zka@k_bBKO*c-q{5Xqr9htymFwcJimB_(ptN^}@P%(h^+nc1~bIMo)=svP>DAxuxW<%)Dx zZID)~t3hib!Z^G8I`{Df$?>F3Jv!Kb&m3uIO%phchQ6wi)qCf)ThSg)l z|3Ozm>kexNC>)U9V`sC}Df{017V+49;lhsw~@9F);Sbm}p-lFEQwHFB@?RWwKuL z#<8@iYU|?!llSGzb7ur3*mVF`;F_P!H$e&9k;ab;4&Gj}CB$ao{H3Wqo%`-g&d`v0 z{0;{)fz=!ZwT{QxYrHFA?ZHR{bDmc@4qgFr!05b`0xVz-GfrJzLP0)Vr3&lda%V?o z9ATg%&m3HUUhE1jGmaS(lhQYGIod6>X-6I_Xh3>wnA3%MS~cRe`SdxqAi6Q0vu` zlxl-O3H#Qobu!L3XHYtLBd48mdh6bgLa-18v_r>C82|)-eNZ;9r|w?9J?`aeFR`r5 zmb910Gd1fRLTbp><)oX>B{^=x+us4Em0jd#y^|>Op}lusuWA8J78=g{+y#i`trv?z zCbN(IGT96fjT{w@juf~p;&iY&Z%3zVa%Gq5qlydaYH4=Xc1JJ&R|5CGb)@=-bG8Kg z0yD#giLD9s@+(TzYQA2NX+O80!IG8r5kBLD;Hnp+Yqk;3C=EY`&CI^2G~$NmTf+=& zdeKa3?|PPN2C_CREoztLg>4$#aWmJ*A^ByVHA)qfmH@i?IgZoc`sSu4?+g2l+s@kn zm3ar97EAo%X>O|mVBcDDslRA+W%I!GI5v7Adrt9Bj^7hHbZz`|t*<*FPZN%3@!bhl zNhXXO^gphQ8B(F8PYQ`tt4vK?Ty^LQ?|6_}Aq9~UK~TeK9<*zzx#?`aGfaMFnV?on zF?HOjDz=mA`8!YtY=vL*f(d(SZjWz2;2Tz{0yolsl<*IH<}0YtgyvfSSIDaSe2%pU zZ~E|U{3P_?anmJIXquw}do6+AzemPd*OhAuwxsH&uaHHsmQncDpipZETWb@NAbH-FMEzl?v0qM#96^=PNTRh) zr{3|$ox&6NQuq6~D817rTTxIGqiKKou2R{OE?(}_DvSElcQoxBT$R-}_eT&Y-ogF- ztxw`^9(kND&3w1?XK3WBAwPY%rA;@Z@gNzU2yL5`zYN2aW1ifa=Y0cGg^F#Q_!C&=k3#H73AtpI zZ|b(|seSD)>+3xC#?7jZ!lJ9b46ax7nqU5YAOP9Q_;`=xTaB$kTX#ckH|^FwItDW} zohi2$$pHKyTK2mdA7}olowR?kuyPB-1?dj>JVoIXfcA6dZ8SKa zCVtfA_3MWI;fQd65nVK#5p1#3opPVI59XVGwN}hOoFJx2(a-3wvoHw6eNGjUF*QAL z=%UheZoa7-?U46K-ktk8nx4t*-_sWN}-gqxSMMh3wne+FRQw#*w^-9o>llI8scLp)4pn0lLa9Y)!lO5WEk zOMK4WV85f7(%o`VlJs6{czltk41MU?GJa1z*Bs1qcWjg|n7-m35416MoBEGdNtMJs{#Nu`YHP}y`ndPnx zWE+>Q_3f~KAt?r{vO3Dx+%=A)E)`iYri?R22fbe(llX(#TNc_z4L;=9{$1uq2`s|X z(}Bd29BKw&*jONEWxE8Q>H9ThAx{we=7Ni!YBiMStvTEzRH+eo(71m};G^F7f|YN> zOTUouK%pEfrR9MGvLxyHNeMs<@dG|Fm+?4js|)(Jt_Nhb4GT)~F==-@po4KNc|%an zW6rMZc_B!O%B}$BmyGzhnyET_AMk_=dU)a*aKn2i_BXf^-`BK>9z0<+UkIvpahDLF5Od#c?6rNblSuOUSJP%m zsM)vCX)!ss$tl&b)>)qLU7WzJ@I8>OD78|zE4>|`D~x%v(vzx|4A9=`zgZcW_sn$v zp(9P~zf0TK$gZd)e7T2qmc@M&(z>oF_p@h_phw>LF*27@neCaBPy|z6=u71^xL|un z1Fl}H?a%5T6`Y<#4_9qXc;x@R*L#V?5~4E${#*0z)4_}i(7NeN)2y%LxS_Z2UXm$7?)mg) zh8*3ENN0;(RCAZ71a*9=T&HnLfX{(*b+USA>RaBv4GUGtb$Xn-@0U7x_g3iOzE;dD z!>HZg`omkbHfdbq;QrUFi))SU9Gx8K-8<%|3X4(Pz8O~;+ucl=8MPv2WJDCAC<&Mu zlwi|e-nKRBhMG*`$pG{#o*cP1#?6xvj7mlc{IpD&o3HjLS@><(GQ+iwyt*R3fWT@R zLGIF+FRzLBEYHWuTqN!;W|!_Jr*JW&FjS?pAwow_cVS;kDvo6d{Yj+N#_ouo{`)vm zQt%-a&d?KsqGU$CgGn?9#~oUj1U@SlC@w1{zj_hFS>q ztt;Yx#Vj#9(Y=~+l3Rm`wPQW5LXbwo1sXg)=Boh$2Muf42VGS_#aiQsVmnY{+OIjB zWnpW&tSMeMa69fOEQQ~SwBPPSU(4V~dkvmr&_9x1Fil3#y9S^dds-7%ap)5U{bfuU z6EbGFo?e`Z3EUT}@AXo&jP2Sx?1+yC>DvYoT!P%sxdpf%20#IWRg}dj$YQWom^0@T z70+QYvKWR8iCqnAv-eOyunL z?FkFnp!6om4(Ak`X0w9&(MELYMbfob9nspPYlOB_ouXYIFgcRGp_R#eV2>D|U!I;*C8AY2L= zFg*ZMh&Er4&_syw>gru-$cuz?WL86nqBhx$Q9_>x=e(205N+GnN2}CX%Jccpi>Rtfg zjbsgc-miZ$4r_8 zuaZ}(EY{!qUSLFW&VgNlcOnx-fEYOH7Ho<0!I6M+J5_(Cq^CVPB8kPKE^!Lnz{7>ELJnmkQZxEJg zZl2mY7~NRb?dmy38fUUnWh#LF(q`;@Y_H>eO_LfiH3_>5V|7<_jIW&nWx$0>UWJ%; z^p8sTn^IWmiucNl&_Tg$EhNwfT&YSIvuCg@d`y0sIx)x-L zMwCRf%P#Me7RQec`JDyid0;{N@&w(7uCs)#Cc@GF^%PFW4>92e^z?80pB?#!TT+}J zfqcJsB7HU~!ALnf>Yq?c2-SEE?V~M%<;EemqF?+~S?>%P#oS5m_edsaj6-jFs&5G# z24#F6gb5KUK z0Xo@+^@pQ)`|3zCqIA_$AT(5MFVZti;#P}**s**{(;&sy{o0$E0 z{B%HfRJ2DH98F|8#lZ00nIy>zAr3lGn9D4gf^KdnC{G-eP%H}BK;KK=$uie=aY0qq zDMKF-|J)=YLY|78j7840F90v35IjHJ?+@roOg{7nZVn5XpUjpiW=K8&Any9SP`=(C zw4eKIik67oi$EGxG7*hFC1`x4P=C>R@7Fx+xsZPl#KSz~V?qB-r{JB1lWRGhSnrx( zx#l}&jP`$=`cNDtkHQ%&m`j;MLS%oGMa{Lku*YsG%?0JiqL0FT^2dPZxuM2O!bT#y(?mdWb zSgf2)mx)$@n$wY`P?OfE!=4?7WJyYX6kj~OIue`ZXOZT=R!4)wQl+v)p^#k4bN^};P zMyxvVi;`4648>sWEF~KWdw0geGU$)b+s!&A_sYmcuh%CYiIJ9Q+Xm0-jNy~@90N&OIN7l zEAOWf{`-OZA7&N_0}CTc(uz{fJ#gC(V%$5F6I6Eo)u?MT)hjLof6^4@r-=2yd6r}g zw)8XH`jo#MtJM$Zs0IemZze6~7oQIMX^B1kHr>!{?C}LNclQ^GZTuGw_$p2O_9+8M z2)hsAeX+GPzf-!qgihVk^$?t@8X0O~>{wkjli|a-wYBcQu<(i_gN@4ciYQFj+{8|? zX=T#g`kXfZwZ1K;E|1Xh-5M|)O&Nh6B3U5{5*3#V(RpZGv+{HIh4(r4*M2k@b`HNH zrRvwON_V6NmAVr+y=@4d;q58ScBOZTjk9waX@f9)t=fJxlkcu z2WNUS8@)XQlOc}Ve$kSC^TF|>kB0V$#Wxbrp5KyR)9yW!f@S8TSDC6G-lpzzlM*jW zCW7SHA4UW_6`io4uT#D@6UAyMHGb2;TK?n7m3jge<`p0);z6>}MdGQIxZ7Wjde|E~ z4{n7kWOq<|u}ms4OF))m=kNhjIYB>+<9pr(T+beFa;NJ6djLs9D zCd8u~xn@fKFBK2ak3uSB+lF!}Cnr>f9?~%Sy`_}M%ZhR}Xd$V_pFk;JB@smQijzSNAhLbQ&+RMC+m zfCa0wJY}Hmj4Ll&4)oPsY^j<#WpATw9u9gDBa=`dBmMmc}_OiXnyGtwYb|hZ?RuoM7GwGY1c)-SMKo>7YTp9M(;bHV`Y5N zRGYedE3E7`M(Rnue5Ty!bbi_eNVKm|DJ3b@Zx_5NBS$OFr{R#peEFBke7^ZKLG7_2 z3Ek`@&-mJ&*9Dt^{Et7<)!`OuybA{6z*ZkAKY0Uj?0*g0V z<=7!kXvHxN!pJ&_PoU=lh~|?&xkqmFU;{1U4yh!!pROi6^90uFkzh%5CNDbHd)dgzmF63igge6G3{NUzWwb`vyRx{I!DA%98J2ZQol71`bQrQhP zaREUp9=?t|_ou-+MdW}6GsM|qVx;9bHaM=bQx2{7muzE7lBcbc_HwkJBQG7BlzNxg zxmKQ^3*4j$;d`!XIlg_34e=7qbP@}JFdvR|`<(e2HadigB-Bk*5^?%s^^qB&g(V}o z%}xzB_hy+ke7}t?m28)OTl3jQ7tw^CHjB_5+~#%4V*i@-IV6a&K2>-Ir9)sHFQeJ zoIj^q+?s1kFooDr9vo-hp7-6Hr!FcpS5}gd>!dH01dS~-Ch_&Xas0~|b zv@&V+j}w1sk>uhu;?2RWZrC$xiywWvY^?_u#bygSI^N~mZkKt!^ZasJ!BAJ3OyF?6 z6fPkx(v*GohkgA!`}()`Mr*QRWuwq1z|`i;WtFXrbL46A_o!IgpF2gB;p9sEPa%%v*^xOx>HgVyX2+RkT|uZxjoI ztHMysb6boJ>Q}Y2Ggc2kkjjdJ);QPwb%Vt_m`Zfe&6lsxvqKgWyZJH_9VG26$V1P% zdCP?u=D#r4_WdLtY-%2)ZMq7!E*lCPRhkOR1ra4}DZyFj;N?|%zt(`?Cgmj%`oFre zXUX6Zh=#eBX;}$g4zVXBM)>o#2Ty7F76a8CsYDKR^u8K}p&r~gM>&FEd9Bbs=s%N@ z8y=MK{n-*@#1p-JD{C~Zcb!}?sEm+5gQD_Bj`{C%0P@Wn?AM}@20`ZZ z3e&4I9LBkkg8N*xMcXwlibiF$uo)((=##|>~@S#WO=F9q##ZXPYA#oTYpfvL~sGLwH zFMP2)^uGQmSr>HH_lg}bTaFzpgixRi8gg*zM14z6V@2wZJ+wV)GoA@KKVg zd7W<$z-1Zp5^5KOVFoN=5nSYEW#_JhremfSHzl?5IxUUbU%fgx`Xz{UhI57kjs{nr zxRMv#3wVZ`O6mc8?~PfQDDyp0TqN2jY3+E|z;p*ZUqvsBVe1Yn+a&UV^pfE)_zy=* z`b0TZ0#t*KyW8-hXGgRWkW>mm7hhi@28d_!z%hP`wi0uF#si3!HdsHNO?9&_AuP`d zNBMnbcv2=_Ip%pba~2pzc24~Kkj}g!LrDh#1lGO1BJ=pvolop#*zk0S_duisO&GWr zT8*Q&k1-Y3EuS!5Jq~cGZHVKWWKrNoRgjc63)k&|sUwVeQ8308JUT2MbI%v&rWUaMR|+f)u^40& zx?;%Z<8p-ed@-h%wGXH-My#E6Fvx&mV!MJ-3bmWX0AgL z5%EP%2EX_w%@!T;>{hiDLUeK(0TU*_#qr~vb69sYCj zNb=*{`pl@lD{EnTZbE}k?(}W@gjVL}Lc7Ni>{qXoLKFRa17oZyDHp-Vp*CzmsEn6& zqU%S8eg2(_~}(?+ZMQ9d?8CL`qKR zZo?d#_Fdhp43z&%U+*jqub$vK{B5}0`L_`L&0~2S%%5q;zK$X5MZos4)~~1E22Jr@GxE%; zo}Z*`sKGkEx7)QM6F=#{b4(x(RLRJz2ywtn+2}@w+dk#Zc)@(1bEd3_H2|>^g&!iB>3NZ-)s-88 z2tb8#C&QNW*UfasmE0k$OB(FPz@Yz&n^;(N%dj=mW(&&u=s;LET-s@@y-bt_z*Ho! zEieHaB8b-?$YUs9QF%naFQA=%!Sj55wX)-<6|HR)Rva=maS$05s^pQcWD51`IT7`-|$3Z=To3%Tv*2ogJyr{(8M%A!Z%J)f` zs);bqdZKYb1+-zbrfEZ^GsnjGx%(%Vam^+09g`_&txZCT_N-L_Ne~Ij$$e$hnusk= zV`LJ1`=#GlR8S_0!GG<0MFy*$yx(@2B<9JW$!@lA)<_QkZ6B7=(NffY)p?svU;2%A z@UIwJr^Et}?yAl7qu6X+bHTZ>96c(|F_l!(HiUKJ@XAM}{|!U^K^>nG9agkxOT8|o zV_hi%1ZRI7PiL=9fm;bFT}SJq5=G3plaWC&DMo8-W>!pJK1MnUKDJaLgnK4!ky7@) zYaiAXIB6sgo}{G=%nxbpK`q!1-+eln+~|ogHAe_v;KwCjiJw#QxoWqfe=9TwQ`m(Z@`nwr$i|2Cp!)AC zxO}jh-FR}XC3Q!~pZwy4{n=vHMMAYnfO%?W%o)@F4j-NnDE%hzDaIW3rQK+L?{9P* z|AcHa9yd{HCHiGR9GO+03*%{P98va=C`e8L! zgGc#O(2@rH?@cG3U0p}eC@``xJm!?F)Q_|t7@#d9_V`BRqVsBkPW#Aynm&7tB6I_s zC5?=nXKt&&@nJe{4%nZ}?|BHz>Otj))pt~pfY*i`uH@|0l z2H`z0<3)J$NxIBU^23ci;oTvnuSOROOo5f^ht{HmehYvle9TewfDL@-qX4~|)LptZ zG~gpR@*XEp0+m2Ou*&iTs^~t1C~m?~>$dA`DV4sW_NVgw>V1vO{Fz&RzQ!tC4O3vc zrnE??Sk@>GQ|rqx846YV7`+*=WwiC`;%MgQbH{Y*7T4dsmunSUO*!X#2v?8@NOl`z zi4CQAFVO;2p*nQKEtf1miwZ$pa_*x?4-Dt6KK_ai8K6Q!qR7mpkgTa6$oF zE02h?>3oO|PXJ`a4y)$aXZ5XREoc>BRGW6U5AIV;`yJuuatgG!&46g1rj&_0ne+DDDfWIX${w+bz-Ok6~(#sa0Xya~W%c|*WX>Y4*YiSec*=H;J QXA(eD^_dD<$>Q~Y0GBiP)Bpeg literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-icons_454545_256x240.png b/assets/grocery_crud/css/ui/simple/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..95032e4423f5589c377ac4ccdc1fa4e74b5a8e72 GIT binary patch literal 6854 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 J8a2n*{{hD+0U`hZ literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/images/ui-icons_cd0a0a_256x240.png b/assets/grocery_crud/css/ui/simple/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e28c9249bdb6c65caf4de1face364db3a363787f GIT binary patch literal 4353 zcmds4_g9lmw|!Cw5JE{P(xeEMS6TunAT4xIq=|q)sG*4z>C*Dhks=_7ND)w9#X=D* zAT4x|E(oZUpdw9*LMVZd5B=^h_lNrr+`VSaIcKfeGizq;HEW-nW+n#gNI@h30PIGF zx)uNcIZT0d7TDoDVRU}?Fu*;uE@}ag#1h;>uH#`nXl87w*N;U0e;PzHXvpE!bb~BR zE&)&o3r~WIIWzpoY4&3xuzVB;8Y9TWhfrhHP)a?XU7U&J1jFMLJwu#y+=<=+G#lPY zefu;~V_V;o4VSsZ{yA$Xq2v*5e7GOP<${4Okj!+{5CAxKjdZmv!#=MN*jz_z(Yc}# zpN>x(u-=8T`yitTmE+SQ!gB!$Ir0pK(&gKt`AO2{zdDyCX;7oi+sFIovlJzIg#N`~ zFzz6#`jXOYJFTrxfPbn1)k^cogJj>Z)y`vzg&YUpCOs+`ML9yac=09BkY;+YMK*=+ z6l-@_gyA_-Y%CC6{{l}OI6=g}nyJ(lBgmK8tokoD^oXyg7@)B=3DJ>&5 z1TM;uO;bEwl7Z_=EZnR)1IGR|90kx=4dSB^JZV=b-@|_1GSmKx*0k&M_bE5&CC0km z(F#gr=FcYc05;#vtKL<{tcxh8UPo*-=kHbWXS)=P+J>^3)L z%I>b}W+Nv)2r{PkfIyzRIili$vne*cA)u*6Sc`78NRmiao^7WN6_2_bA5BbY1+Il7%65pDlTdbu`cKl%jrOm9pF^U;v zUN83;qF)`JHuE2vW{Y|&S_Gb*{3#)}5#Lt57!!8>@m|Q2n18jE6@;^5`$n|UtI)IN zEL+Z|UXfaoVeTClfHjN(=h|e6J0G`hkp9ft_9KOs@fDnSY%z;CuC*(!Vj+1UrxAy_ z>EN0Kx-4_fQXeuWCsjE9(R6E@e)Ql;`HU}+(v{Pz?41lm3z!eb3ISvFy6Ux55}Jvgo-eXJ9b~F@MDEVaSD^EtV^UcB=-Rj)O9{p>Z8PlF7*+l zzVtHd!1HIi1NZ4gTrN`&UaQe3QwsFk*oWVGKp9>+BeK#g2Xh=O_ zhaHu`YKDed#pCVN-<7cTV8w$u&MO}WuK+nKQs8?H1g$C6ASH%#D@9c*YJ?p#jfjhrZg!ykoPsr^r?* zJbZ94J!LjgSt&_gV0`~H5)G9PX*uhk%41b!TTbf&Caxl09pnLfl@er**krK0uD-Xj zI-IL7@7w~y2n^HH!9klkmbsVvx#^8d5}>u`=9$y=zvblQh6T&2Ko`4QTEQ~ZYV{CuW)dnz-8<>4j`L#Xs49PiWJ%2+uXY?u0x|IG)9OCs;X| zIC9YcxH4u)c`toZP`FxoYU1LmeOGwLgVYL1h_o<*8ouYgcP%wH9qBW}b-Q z58ozCLJuA{T_T01Imols68Zdlq@8qJIHzDsTF+Abu0+j@f7m9#e6Sg=%ve{zwm2EH z9=^A7p0rE#Qwui6JII}W{acg5OsAR#xx{W>mpWpszxal6^%WtHdq_W2#fz&(G(pSY zM)w6lx$975Cw8P+6|KdJ|GiXyEsOsA%r76i$tCO!o#Oi#LP^%kouxb3=_{ejMGjD& zI2DPU=LdR5PN|b}1&I19WMP~|6rnXJ)XLt*%9tcTp0^=Ue;BCmmy;q#&?S2$ky^)7 z@A%?Q5s190`+c00-f82lD5$aFv_E}Uv200)Ap2>RMeXUkJ*^ykmE|_qM-V99!TRAFEw=@-hO zInkr2re(k`r(E=s{5{8oSfy1Z8E5lcKUUZ*=aE$BhrPBBJh>HN5v%Eyh4YvF^i-{b z9G9SHkJXwhH_r>7p6U(0@oL#-!KurKV~ka{R{qv6k?C-g-st0y&X3xm{8K9o*|s}_ z)S#7rcrAq*YT8)E4D`ve`lT?=x@UJ!2h4jPaaTv6owk?!6C&EeMImYpIZM@>;h}?9 zMyKDKFof0Mwf*Cv=e%MjFTWJgTB{8GG7M9Sd2(x>=M6{|EVg#!OJJ2d3b7?6W12E+OB7b4nbWuuX_PpVJ7^l$b)RYa z`L^=GeCe0y#t=5EaQG-ApbHR{Tz0fxVbWj^;d{9x04q@>!*}k_@>Y!<-jLF_EJB?xmWDo4LGaiwKqqko;9y6te%*0qH8Sr z6&of_v9gwZo+nVb&0flK`WJmue9@c%7Urd;BLgrd+)(7iO328KcP6vZ(C_Moq;gdO z9s@h_tGJRgAgzf1c^k6#{_;^Cx5haRwv%wvPb;~^Ox%#J#InNC?RqB4I zTkP1EZVTkPd*B=J!?Y9o8=Q&nYuZE(p0JuN1XVk`iStwZa^G#x+P>F`Cwc#?VZ9{S z?9=GDn4H_>nCejLBuD%%M&y$J9!OV^T&dfY+K$f^!aiB)NmWe-_TK5eSs9r3$aMRm zE#=pLcW+-kyP}f#&H6};8+iH9l1vb?&!;yt zWa+McbY$$Js+$}osN+lJ`W}Zk_#8M_C!>3&zUA%Puu$b($H%GrzNwRUZ-ox-YsS1X zh}!+FH@sDAoyI8!?tjg?xYp>#-pP*Hy<>K&uo%tdlW~=?-OZGlQ7ddpMnoZsl7N{( zairezwvAyo)OeCW2B2RFWbI`0;gdJ zxx2@Fc}=Wmc|K11qTlXfcIj?%3MVrfOI17@B6#$47w)x$!dRBzpF~P^?2gFkzmFp+ z2_I7C2t6?12B0Bmd}1s@_QShfdx$T4F^kVmbgyQdyKp3|9FZ7Wt=pXX1_PJ#K1;ivS}%6Wt1Jr`Z1hd_CNw literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/css/ui/simple/index.html b/assets/grocery_crud/css/ui/simple/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/css/ui/simple/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/css/ui/simple/jquery-ui-1.10.1.custom.min.css b/assets/grocery_crud/css/ui/simple/jquery-ui-1.10.1.custom.min.css new file mode 100644 index 000000000..aa671e086 --- /dev/null +++ b/assets/grocery_crud/css/ui/simple/jquery-ui-1.10.1.custom.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.10.1 - 2013-02-19 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=%23cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=%23aaaaaa&fcHeader=%23222222&iconColorHeader=%23222222&bgColorContent=%23ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=%23aaaaaa&fcContent=%23222222&iconColorContent=%23222222&bgColorDefault=%23e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=%23d3d3d3&fcDefault=%23555555&iconColorDefault=%23333333&bgColorHover=%23dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=%23999999&fcHover=%23212121&iconColorHover=%23454545&bgColorActive=%23ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=%23aaaaaa&fcActive=%23212121&iconColorActive=%23454545&bgColorHighlight=%23fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=%23fcefa1&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23cd0a0a&fcError=%23cd0a0a&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px;background-position:16px 16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/assets/grocery_crud/index.html b/assets/grocery_crud/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/common/lazyload-min.js b/assets/grocery_crud/js/common/lazyload-min.js new file mode 100644 index 000000000..53a13a582 --- /dev/null +++ b/assets/grocery_crud/js/common/lazyload-min.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2008 Ryan Grove . All rights reserved. +Licensed under the BSD License: +http://www.opensource.org/licenses/bsd-license.html +Version: 1.0.4 +*/ +var LazyLoad=function(){var E=document,D=null,A=[],C;function B(){if(C){return }var G=navigator.userAgent,F;C={gecko:0,ie:0,webkit:0};F=G.match(/AppleWebKit\/(\S*)/);if(F&&F[1]){C.webkit=parseFloat(F[1])}else{F=G.match(/MSIE\s([^;]*)/);if(F&&F[1]){C.ie=parseFloat(F[1])}else{if((/Gecko\/(\S*)/).test(G)){C.gecko=1;F=G.match(/rv:([^\s\)]*)/);if(F&&F[1]){C.gecko=parseFloat(F[1])}}}}}return{load:function(K,L,J,I){var H=E.getElementsByTagName("head")[0],G,F;if(K){K=K.constructor===Array?K:[K];for(G=0;G=420){F.onload=LazyLoad.requestComplete;F.onerror=LazyLoad.requestComplete}}H.appendChild(F);if(!C.ie&&!C.gecko&&!(C.webkit>=420)){F=E.createElement("script");F.appendChild(E.createTextNode("LazyLoad.requestComplete();"));H.appendChild(F)}},loadOnce:function(N,O,L,P,G){var H=[],I=E.getElementsByTagName("script"),M,J,K,F;N=N.constructor===Array?N:[N];for(M=0;M0){LazyLoad.load(H,O,L,P)}else{if(G){if(L){if(P){O.call(L)}else{O.call(window,L)}}else{O.call()}}}},requestComplete:function(){if(D.callback){if(D.obj){if(D.scope){D.callback.call(D.obj)}else{D.callback.call(window,D.obj)}}else{D.callback.call()}}D=null;if(A.length){LazyLoad.load()}}}}(); \ No newline at end of file diff --git a/assets/grocery_crud/js/common/list.js b/assets/grocery_crud/js/common/list.js new file mode 100644 index 000000000..ebd902375 --- /dev/null +++ b/assets/grocery_crud/js/common/list.js @@ -0,0 +1,82 @@ +var js_libraries = []; + +var fnOpenEditForm = function(this_element){ + + var href_url = this_element.attr("href"); + + var dialog_height = $(window).height() - 80; + + //Close all + $(".ui-dialog-content").dialog("close"); + + $.ajax({ + url: href_url, + data: { + is_ajax: 'true' + }, + type: 'post', + dataType: 'json', + beforeSend: function() { + this_element.closest('.flexigrid').addClass('loading-opacity'); + this_element.closest('.dataTablesContainer').addClass('loading-opacity'); + }, + complete: function(){ + this_element.closest('.flexigrid').removeClass('loading-opacity'); + this_element.closest('.dataTablesContainer').removeClass('loading-opacity'); + }, + success: function (data) { + if (typeof CKEDITOR !== 'undefined' && typeof CKEDITOR.instances !== 'undefined') { + $.each(CKEDITOR.instances,function(index){ + delete CKEDITOR.instances[index]; + }); + } + + LazyLoad.loadOnce(data.js_lib_files); + LazyLoad.load(data.js_config_files); + + $.each(data.css_files,function(index,css_file){ + load_css_file(css_file); + }); + + $("
").html(data.output).dialog({ + width: 910, + modal: true, + height: dialog_height, + close: function(){ + $(this).remove(); + }, + open: function(){ + var this_dialog = $(this); + + $('#cancel-button').click(function(){ + this_dialog.dialog("close"); + }); + + } + }); + } + }); +}; + +var add_edit_button_listener = function () { + + //If dialog AJAX forms is turned on from grocery CRUD config + if (dialog_forms) { + + $('.edit_button,.add_button').unbind('click'); + $('.edit_button,.add_button').click(function(){ + + fnOpenEditForm($(this)); + + return false; + }); + + } +} + +var load_css_file = function(css_file) { + if ($('head').find('link[href="'+css_file+'"]').length == 0) { + $('head').append($('').attr("type","text/css") + .attr("rel","stylesheet").attr("href",css_file)); + } +}; diff --git a/assets/grocery_crud/js/index.html b/assets/grocery_crud/js/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/js/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery-1.11.1.js b/assets/grocery_crud/js/jquery-1.11.1.js new file mode 100644 index 000000000..d4b67f7e6 --- /dev/null +++ b/assets/grocery_crud/js/jquery-1.11.1.js @@ -0,0 +1,10308 @@ +/*! + * jQuery JavaScript Library v1.11.1 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-05-01T17:42Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper window is present, + // execute the factory and get jQuery + // For environments that do not inherently posses a window with a document + // (such as Node.js), expose a jQuery-making factory as module.exports + // This accentuates the need for the creation of a real window + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.11.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v1.10.19 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-04-18 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== strundefined && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", function() { + setDocument(); + }, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", function() { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { + div.innerHTML = "
"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowclip^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "').appendTo(content); + } + + wrap.show(); + + busy = false; + + $.fancybox.center(); + + currentOpts.onComplete(currentArray, currentIndex, currentOpts); + + _preload_images(); + }, + + _preload_images = function() { + var href, + objNext; + + if ((currentArray.length -1) > currentIndex) { + href = currentArray[ currentIndex + 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + + if (currentIndex > 0) { + href = currentArray[ currentIndex - 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + }, + + _draw = function(pos) { + var dim = { + width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), + height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), + + top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), + left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) + }; + + if (typeof final_pos.opacity !== 'undefined') { + dim.opacity = pos < 0.5 ? 0.5 : pos; + } + + wrap.css(dim); + + content.css({ + 'width' : dim.width - currentOpts.padding * 2, + 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 + }); + }, + + _get_viewport = function() { + return [ + $(window).width() - (currentOpts.margin * 2), + $(window).height() - (currentOpts.margin * 2), + $(document).scrollLeft() + currentOpts.margin, + $(document).scrollTop() + currentOpts.margin + ]; + }, + + _get_zoom_to = function () { + var view = _get_viewport(), + to = {}, + resize = currentOpts.autoScale, + double_padding = currentOpts.padding * 2, + ratio; + + if (currentOpts.width.toString().indexOf('%') > -1) { + to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); + } else { + to.width = currentOpts.width + double_padding; + } + + if (currentOpts.height.toString().indexOf('%') > -1) { + to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); + } else { + to.height = currentOpts.height + double_padding; + } + + if (resize && (to.width > view[0] || to.height > view[1])) { + if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { + ratio = (currentOpts.width ) / (currentOpts.height ); + + if ((to.width ) > view[0]) { + to.width = view[0]; + to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); + } + + if ((to.height) > view[1]) { + to.height = view[1]; + to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); + } + + } else { + to.width = Math.min(to.width, view[0]); + to.height = Math.min(to.height, view[1]); + } + } + + to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); + to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); + + return to; + }, + + _get_obj_pos = function(obj) { + var pos = obj.offset(); + + pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; + pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; + + pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; + pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; + + pos.width = obj.width(); + pos.height = obj.height(); + + return pos; + }, + + _get_zoom_from = function() { + var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, + from = {}, + pos, + view; + + if (orig && orig.length) { + pos = _get_obj_pos(orig); + + from = { + width : pos.width + (currentOpts.padding * 2), + height : pos.height + (currentOpts.padding * 2), + top : pos.top - currentOpts.padding - 20, + left : pos.left - currentOpts.padding - 20 + }; + + } else { + view = _get_viewport(); + + from = { + width : currentOpts.padding * 2, + height : currentOpts.padding * 2, + top : parseInt(view[3] + view[1] * 0.5, 10), + left : parseInt(view[2] + view[0] * 0.5, 10) + }; + } + + return from; + }, + + _animate_loading = function() { + if (!loading.is(':visible')){ + clearInterval(loadingTimer); + return; + } + + $('div', loading).css('top', (loadingFrame * -40) + 'px'); + + loadingFrame = (loadingFrame + 1) % 12; + }; + + /* + * Public methods + */ + + $.fn.fancybox = function(options) { + if (!$(this).length) { + return this; + } + + $(this) + .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) + .unbind('click.fb') + .bind('click.fb', function(e) { + e.preventDefault(); + + if (busy) { + return; + } + + busy = true; + + $(this).blur(); + + selectedArray = []; + selectedIndex = 0; + + var rel = $(this).attr('rel') || ''; + + if (!rel || rel == '' || rel === 'nofollow') { + selectedArray.push(this); + + } else { + selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); + selectedIndex = selectedArray.index( this ); + } + + _start(); + + return; + }); + + return this; + }; + + $.fancybox = function(obj) { + var opts; + + if (busy) { + return; + } + + busy = true; + opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; + + selectedArray = []; + selectedIndex = parseInt(opts.index, 10) || 0; + + if ($.isArray(obj)) { + for (var i = 0, j = obj.length; i < j; i++) { + if (typeof obj[i] == 'object') { + $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); + } else { + obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); + } + } + + selectedArray = jQuery.merge(selectedArray, obj); + + } else { + if (typeof obj == 'object') { + $(obj).data('fancybox', $.extend({}, opts, obj)); + } else { + obj = $({}).data('fancybox', $.extend({content : obj}, opts)); + } + + selectedArray.push(obj); + } + + if (selectedIndex > selectedArray.length || selectedIndex < 0) { + selectedIndex = 0; + } + + _start(); + }; + + $.fancybox.showActivity = function() { + clearInterval(loadingTimer); + + loading.show(); + loadingTimer = setInterval(_animate_loading, 66); + }; + + $.fancybox.hideActivity = function() { + loading.hide(); + }; + + $.fancybox.next = function() { + return $.fancybox.pos( currentIndex + 1); + }; + + $.fancybox.prev = function() { + return $.fancybox.pos( currentIndex - 1); + }; + + $.fancybox.pos = function(pos) { + if (busy) { + return; + } + + pos = parseInt(pos); + + selectedArray = currentArray; + + if (pos > -1 && pos < currentArray.length) { + selectedIndex = pos; + _start(); + + } else if (currentOpts.cyclic && currentArray.length > 1) { + selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; + _start(); + } + + return; + }; + + $.fancybox.cancel = function() { + if (busy) { + return; + } + + busy = true; + + $.event.trigger('fancybox-cancel'); + + _abort(); + + selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); + + busy = false; + }; + + // Note: within an iframe use - parent.$.fancybox.close(); + $.fancybox.close = function() { + if (busy || wrap.is(':hidden')) { + return; + } + + busy = true; + + if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { + busy = false; + return; + } + + _abort(); + + $(close.add( nav_left ).add( nav_right )).hide(); + + $(content.add( overlay )).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); + + if (currentOpts.titlePosition !== 'inside') { + title.empty(); + } + + wrap.stop(); + + function _cleanup() { + overlay.fadeOut('fast'); + + title.empty().hide(); + wrap.hide(); + + $.event.trigger('fancybox-cleanup'); + + content.empty(); + + currentOpts.onClosed(currentArray, currentIndex, currentOpts); + + currentArray = selectedOpts = []; + currentIndex = selectedIndex = 0; + currentOpts = selectedOpts = {}; + + busy = false; + } + + if (currentOpts.transitionOut == 'elastic') { + start_pos = _get_zoom_from(); + + var pos = wrap.position(); + + final_pos = { + top : pos.top , + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + if (currentOpts.opacity) { + final_pos.opacity = 1; + } + + title.empty().hide(); + + fx.prop = 1; + + $(fx).animate({ prop: 0 }, { + duration : currentOpts.speedOut, + easing : currentOpts.easingOut, + step : _draw, + complete : _cleanup + }); + + } else { + wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); + } + }; + + $.fancybox.resize = function() { + if (overlay.is(':visible')) { + overlay.css('height', $(document).height()); + } + + $.fancybox.center(true); + }; + + $.fancybox.center = function() { + var view, align; + + if (busy) { + return; + } + + align = arguments[0] === true ? 1 : 0; + view = _get_viewport(); + + if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { + return; + } + + wrap + .stop() + .animate({ + 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), + 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) + }, typeof arguments[0] == 'number' ? arguments[0] : 200); + }; + + $.fancybox.init = function() { + if ($("#fancybox-wrap").length) { + return; + } + + $('body').append( + tmp = $('
'), + loading = $('
'), + overlay = $('
'), + wrap = $('
') + ); + + outer = $('
') + .append('
') + .appendTo( wrap ); + + outer.append( + content = $('
'), + close = $(''), + title = $('
'), + + nav_left = $(''), + nav_right = $('') + ); + + close.click($.fancybox.close); + loading.click($.fancybox.cancel); + + nav_left.click(function(e) { + e.preventDefault(); + $.fancybox.prev(); + }); + + nav_right.click(function(e) { + e.preventDefault(); + $.fancybox.next(); + }); + + if ($.fn.mousewheel) { + wrap.bind('mousewheel.fb', function(e, delta) { + if (busy) { + e.preventDefault(); + + } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { + e.preventDefault(); + $.fancybox[ delta > 0 ? 'prev' : 'next'](); + } + }); + } + + if (!$.support.opacity) { + wrap.addClass('fancybox-ie'); + } + + if (isIE6) { + loading.addClass('fancybox-ie6'); + wrap.addClass('fancybox-ie6'); + + $('').prependTo(outer); + } + }; + + $.fn.fancybox.defaults = { + padding : 10, + margin : 40, + opacity : false, + modal : false, + cyclic : false, + scrolling : 'auto', // 'auto', 'yes' or 'no' + + width : 560, + height : 340, + + autoScale : true, + autoDimensions : true, + centerOnScroll : false, + + ajax : {}, + swf : { wmode: 'transparent' }, + + hideOnOverlayClick : true, + hideOnContentClick : false, + + overlayShow : true, + overlayOpacity : 0.7, + overlayColor : '#777', + + titleShow : true, + titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' + titleFormat : null, + titleFromAlt : false, + + transitionIn : 'fade', // 'elastic', 'fade' or 'none' + transitionOut : 'fade', // 'elastic', 'fade' or 'none' + + speedIn : 300, + speedOut : 300, + + changeSpeed : 300, + changeFade : 'fast', + + easingIn : 'swing', + easingOut : 'swing', + + showCloseButton : true, + showNavArrows : true, + enableEscapeButton : true, + enableKeyboardNav : true, + + onStart : function(){}, + onCancel : function(){}, + onComplete : function(){}, + onCleanup : function(){}, + onClosed : function(){}, + onError : function(){} + }; + + $(document).ready(function() { + $.fancybox.init(); + }); + +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.js b/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.js new file mode 100644 index 000000000..a8520051d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.js @@ -0,0 +1,1156 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +;(function($) { + var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, + + selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], + + ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, + + loadingTimer, loadingFrame = 1, + + titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('
')[0], { prop: 0 }), + + isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, + + /* + * Private methods + */ + + _abort = function() { + loading.hide(); + + imgPreloader.onerror = imgPreloader.onload = null; + + if (ajaxLoader) { + ajaxLoader.abort(); + } + + tmp.empty(); + }, + + _error = function() { + if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { + loading.hide(); + busy = false; + return; + } + + selectedOpts.titleShow = false; + + selectedOpts.width = 'auto'; + selectedOpts.height = 'auto'; + + tmp.html( '

The requested content cannot be loaded.
Please try again later.

' ); + + _process_inline(); + }, + + _start = function() { + var obj = selectedArray[ selectedIndex ], + href, + type, + title, + str, + emb, + ret; + + _abort(); + + selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); + + ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); + + if (ret === false) { + busy = false; + return; + } else if (typeof ret == 'object') { + selectedOpts = $.extend(selectedOpts, ret); + } + + title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; + + if (obj.nodeName && !selectedOpts.orig) { + selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); + } + + if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { + title = selectedOpts.orig.attr('alt'); + } + + href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; + + if ((/^(?:javascript)/i).test(href) || href == '#') { + href = null; + } + + if (selectedOpts.type) { + type = selectedOpts.type; + + if (!href) { + href = selectedOpts.content; + } + + } else if (selectedOpts.content) { + type = 'html'; + + } else if (href) { + if (href.match(imgRegExp)) { + type = 'image'; + + } else if (href.match(swfRegExp)) { + type = 'swf'; + + } else if ($(obj).hasClass("iframe")) { + type = 'iframe'; + + } else if (href.indexOf("#") === 0) { + type = 'inline'; + + } else { + type = 'ajax'; + } + } + + if (!type) { + _error(); + return; + } + + if (type == 'inline') { + obj = href.substr(href.indexOf("#")); + type = $(obj).length > 0 ? 'inline' : 'ajax'; + } + + selectedOpts.type = type; + selectedOpts.href = href; + selectedOpts.title = title; + + if (selectedOpts.autoDimensions) { + if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { + selectedOpts.width = 'auto'; + selectedOpts.height = 'auto'; + } else { + selectedOpts.autoDimensions = false; + } + } + + if (selectedOpts.modal) { + selectedOpts.overlayShow = true; + selectedOpts.hideOnOverlayClick = false; + selectedOpts.hideOnContentClick = false; + selectedOpts.enableEscapeButton = false; + selectedOpts.showCloseButton = false; + } + + selectedOpts.padding = parseInt(selectedOpts.padding, 10); + selectedOpts.margin = parseInt(selectedOpts.margin, 10); + + tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); + + $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { + $(this).replaceWith(content.children()); + }); + + switch (type) { + case 'html' : + tmp.html( selectedOpts.content ); + _process_inline(); + break; + + case 'inline' : + if ( $(obj).parent().is('#fancybox-content') === true) { + busy = false; + return; + } + + $('
') + .hide() + .insertBefore( $(obj) ) + .bind('fancybox-cleanup', function() { + $(this).replaceWith(content.children()); + }).bind('fancybox-cancel', function() { + $(this).replaceWith(tmp.children()); + }); + + $(obj).appendTo(tmp); + + _process_inline(); + break; + + case 'image': + busy = false; + + $.fancybox.showActivity(); + + imgPreloader = new Image(); + + imgPreloader.onerror = function() { + _error(); + }; + + imgPreloader.onload = function() { + busy = true; + + imgPreloader.onerror = imgPreloader.onload = null; + + _process_image(); + }; + + imgPreloader.src = href; + break; + + case 'swf': + selectedOpts.scrolling = 'no'; + + str = ''; + emb = ''; + + $.each(selectedOpts.swf, function(name, val) { + str += ''; + emb += ' ' + name + '="' + val + '"'; + }); + + str += ''; + + tmp.html(str); + + _process_inline(); + break; + + case 'ajax': + busy = false; + + $.fancybox.showActivity(); + + selectedOpts.ajax.win = selectedOpts.ajax.success; + + ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { + url : href, + data : selectedOpts.ajax.data || {}, + error : function(XMLHttpRequest, textStatus, errorThrown) { + if ( XMLHttpRequest.status > 0 ) { + _error(); + } + }, + success : function(data, textStatus, XMLHttpRequest) { + var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; + if (o.status == 200) { + if ( typeof selectedOpts.ajax.win == 'function' ) { + ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); + + if (ret === false) { + loading.hide(); + return; + } else if (typeof ret == 'string' || typeof ret == 'object') { + data = ret; + } + } + + tmp.html( data ); + _process_inline(); + } + } + })); + + break; + + case 'iframe': + _show(); + break; + } + }, + + _process_inline = function() { + var + w = selectedOpts.width, + h = selectedOpts.height; + + if (w.toString().indexOf('%') > -1) { + w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; + + } else { + w = w == 'auto' ? 'auto' : w + 'px'; + } + + if (h.toString().indexOf('%') > -1) { + h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; + + } else { + h = h == 'auto' ? 'auto' : h + 'px'; + } + + tmp.wrapInner('
'); + + selectedOpts.width = tmp.width(); + selectedOpts.height = tmp.height(); + + _show(); + }, + + _process_image = function() { + selectedOpts.width = imgPreloader.width; + selectedOpts.height = imgPreloader.height; + + $("").attr({ + 'id' : 'fancybox-img', + 'src' : imgPreloader.src, + 'alt' : selectedOpts.title + }).appendTo( tmp ); + + _show(); + }, + + _show = function() { + var pos, equal; + + loading.hide(); + + if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { + $.event.trigger('fancybox-cancel'); + + busy = false; + return; + } + + busy = true; + + $(content.add( overlay )).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { + wrap.css('height', wrap.height()); + } + + currentArray = selectedArray; + currentIndex = selectedIndex; + currentOpts = selectedOpts; + + if (currentOpts.overlayShow) { + overlay.css({ + 'background-color' : currentOpts.overlayColor, + 'opacity' : currentOpts.overlayOpacity, + 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', + 'height' : $(document).height() + }); + + if (!overlay.is(':visible')) { + if (isIE6) { + $('select:not(#fancybox-tmp select)').filter(function() { + return this.style.visibility !== 'hidden'; + }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { + this.style.visibility = 'inherit'; + }); + } + + overlay.show(); + } + } else { + overlay.hide(); + } + + final_pos = _get_zoom_to(); + + _process_title(); + + if (wrap.is(":visible")) { + $( close.add( nav_left ).add( nav_right ) ).hide(); + + pos = wrap.position(), + + start_pos = { + top : pos.top, + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); + + content.fadeTo(currentOpts.changeFade, 0.3, function() { + var finish_resizing = function() { + content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish); + }; + + $.event.trigger('fancybox-change'); + + content + .empty() + .removeAttr('filter') + .css({ + 'border-width' : currentOpts.padding, + 'width' : final_pos.width - currentOpts.padding * 2, + 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 + }); + + if (equal) { + finish_resizing(); + + } else { + fx.prop = 0; + + $(fx).animate({prop: 1}, { + duration : currentOpts.changeSpeed, + easing : currentOpts.easingChange, + step : _draw, + complete : finish_resizing + }); + } + }); + + return; + } + + wrap.removeAttr("style"); + + content.css('border-width', currentOpts.padding); + + if (currentOpts.transitionIn == 'elastic') { + start_pos = _get_zoom_from(); + + content.html( tmp.contents() ); + + wrap.show(); + + if (currentOpts.opacity) { + final_pos.opacity = 0; + } + + fx.prop = 0; + + $(fx).animate({prop: 1}, { + duration : currentOpts.speedIn, + easing : currentOpts.easingIn, + step : _draw, + complete : _finish + }); + + return; + } + + if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { + title.show(); + } + + content + .css({ + 'width' : final_pos.width - currentOpts.padding * 2, + 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 + }) + .html( tmp.contents() ); + + wrap + .css(final_pos) + .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); + }, + + _format_title = function(title) { + if (title && title.length) { + if (currentOpts.titlePosition == 'float') { + return '
' + title + '
'; + } + + return '
' + title + '
'; + } + + return false; + }, + + _process_title = function() { + titleStr = currentOpts.title || ''; + titleHeight = 0; + + title + .empty() + .removeAttr('style') + .removeClass(); + + if (currentOpts.titleShow === false) { + title.hide(); + return; + } + + titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); + + if (!titleStr || titleStr === '') { + title.hide(); + return; + } + + title + .addClass('fancybox-title-' + currentOpts.titlePosition) + .html( titleStr ) + .appendTo( 'body' ) + .show(); + + switch (currentOpts.titlePosition) { + case 'inside': + title + .css({ + 'width' : final_pos.width - (currentOpts.padding * 2), + 'marginLeft' : currentOpts.padding, + 'marginRight' : currentOpts.padding + }); + + titleHeight = title.outerHeight(true); + + title.appendTo( outer ); + + final_pos.height += titleHeight; + break; + + case 'over': + title + .css({ + 'marginLeft' : currentOpts.padding, + 'width' : final_pos.width - (currentOpts.padding * 2), + 'bottom' : currentOpts.padding + }) + .appendTo( outer ); + break; + + case 'float': + title + .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) + .appendTo( wrap ); + break; + + default: + title + .css({ + 'width' : final_pos.width - (currentOpts.padding * 2), + 'paddingLeft' : currentOpts.padding, + 'paddingRight' : currentOpts.padding + }) + .appendTo( wrap ); + break; + } + + title.hide(); + }, + + _set_navigation = function() { + if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { + $(document).bind('keydown.fb', function(e) { + if (e.keyCode == 27 && currentOpts.enableEscapeButton) { + e.preventDefault(); + $.fancybox.close(); + + } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { + e.preventDefault(); + $.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); + } + }); + } + + if (!currentOpts.showNavArrows) { + nav_left.hide(); + nav_right.hide(); + return; + } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { + nav_left.show(); + } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { + nav_right.show(); + } + }, + + _finish = function () { + if (!$.support.opacity) { + content.get(0).style.removeAttribute('filter'); + wrap.get(0).style.removeAttribute('filter'); + } + + if (selectedOpts.autoDimensions) { + content.css('height', 'auto'); + } + + wrap.css('height', 'auto'); + + if (titleStr && titleStr.length) { + title.show(); + } + + if (currentOpts.showCloseButton) { + close.show(); + } + + _set_navigation(); + + if (currentOpts.hideOnContentClick) { + content.bind('click', $.fancybox.close); + } + + if (currentOpts.hideOnOverlayClick) { + overlay.bind('click', $.fancybox.close); + } + + $(window).bind("resize.fb", $.fancybox.resize); + + if (currentOpts.centerOnScroll) { + $(window).bind("scroll.fb", $.fancybox.center); + } + + if (currentOpts.type == 'iframe') { + $('').appendTo(content); + } + + wrap.show(); + + busy = false; + + $.fancybox.center(); + + currentOpts.onComplete(currentArray, currentIndex, currentOpts); + + _preload_images(); + }, + + _preload_images = function() { + var href, + objNext; + + if ((currentArray.length -1) > currentIndex) { + href = currentArray[ currentIndex + 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + + if (currentIndex > 0) { + href = currentArray[ currentIndex - 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + }, + + _draw = function(pos) { + var dim = { + width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), + height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), + + top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), + left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) + }; + + if (typeof final_pos.opacity !== 'undefined') { + dim.opacity = pos < 0.5 ? 0.5 : pos; + } + + wrap.css(dim); + + content.css({ + 'width' : dim.width - currentOpts.padding * 2, + 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 + }); + }, + + _get_viewport = function() { + return [ + $(window).width() - (currentOpts.margin * 2), + $(window).height() - (currentOpts.margin * 2), + $(document).scrollLeft() + currentOpts.margin, + $(document).scrollTop() + currentOpts.margin + ]; + }, + + _get_zoom_to = function () { + var view = _get_viewport(), + to = {}, + resize = currentOpts.autoScale, + double_padding = currentOpts.padding * 2, + ratio; + + if (currentOpts.width.toString().indexOf('%') > -1) { + to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); + } else { + to.width = currentOpts.width + double_padding; + } + + if (currentOpts.height.toString().indexOf('%') > -1) { + to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); + } else { + to.height = currentOpts.height + double_padding; + } + + if (resize && (to.width > view[0] || to.height > view[1])) { + if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { + ratio = (currentOpts.width ) / (currentOpts.height ); + + if ((to.width ) > view[0]) { + to.width = view[0]; + to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); + } + + if ((to.height) > view[1]) { + to.height = view[1]; + to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); + } + + } else { + to.width = Math.min(to.width, view[0]); + to.height = Math.min(to.height, view[1]); + } + } + + to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); + to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); + + return to; + }, + + _get_obj_pos = function(obj) { + var pos = obj.offset(); + + pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; + pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; + + pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; + pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; + + pos.width = obj.width(); + pos.height = obj.height(); + + return pos; + }, + + _get_zoom_from = function() { + var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, + from = {}, + pos, + view; + + if (orig && orig.length) { + pos = _get_obj_pos(orig); + + from = { + width : pos.width + (currentOpts.padding * 2), + height : pos.height + (currentOpts.padding * 2), + top : pos.top - currentOpts.padding - 20, + left : pos.left - currentOpts.padding - 20 + }; + + } else { + view = _get_viewport(); + + from = { + width : currentOpts.padding * 2, + height : currentOpts.padding * 2, + top : parseInt(view[3] + view[1] * 0.5, 10), + left : parseInt(view[2] + view[0] * 0.5, 10) + }; + } + + return from; + }, + + _animate_loading = function() { + if (!loading.is(':visible')){ + clearInterval(loadingTimer); + return; + } + + $('div', loading).css('top', (loadingFrame * -40) + 'px'); + + loadingFrame = (loadingFrame + 1) % 12; + }; + + /* + * Public methods + */ + + $.fn.fancybox = function(options) { + if (!$(this).length) { + return this; + } + + $(this) + .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) + .unbind('click.fb') + .bind('click.fb', function(e) { + e.preventDefault(); + + if (busy) { + return; + } + + busy = true; + + $(this).blur(); + + selectedArray = []; + selectedIndex = 0; + + var rel = $(this).attr('rel') || ''; + + if (!rel || rel == '' || rel === 'nofollow') { + selectedArray.push(this); + + } else { + selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); + selectedIndex = selectedArray.index( this ); + } + + _start(); + + return; + }); + + return this; + }; + + $.fancybox = function(obj) { + var opts; + + if (busy) { + return; + } + + busy = true; + opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; + + selectedArray = []; + selectedIndex = parseInt(opts.index, 10) || 0; + + if ($.isArray(obj)) { + for (var i = 0, j = obj.length; i < j; i++) { + if (typeof obj[i] == 'object') { + $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); + } else { + obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); + } + } + + selectedArray = jQuery.merge(selectedArray, obj); + + } else { + if (typeof obj == 'object') { + $(obj).data('fancybox', $.extend({}, opts, obj)); + } else { + obj = $({}).data('fancybox', $.extend({content : obj}, opts)); + } + + selectedArray.push(obj); + } + + if (selectedIndex > selectedArray.length || selectedIndex < 0) { + selectedIndex = 0; + } + + _start(); + }; + + $.fancybox.showActivity = function() { + clearInterval(loadingTimer); + + loading.show(); + loadingTimer = setInterval(_animate_loading, 66); + }; + + $.fancybox.hideActivity = function() { + loading.hide(); + }; + + $.fancybox.next = function() { + return $.fancybox.pos( currentIndex + 1); + }; + + $.fancybox.prev = function() { + return $.fancybox.pos( currentIndex - 1); + }; + + $.fancybox.pos = function(pos) { + if (busy) { + return; + } + + pos = parseInt(pos); + + selectedArray = currentArray; + + if (pos > -1 && pos < currentArray.length) { + selectedIndex = pos; + _start(); + + } else if (currentOpts.cyclic && currentArray.length > 1) { + selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; + _start(); + } + + return; + }; + + $.fancybox.cancel = function() { + if (busy) { + return; + } + + busy = true; + + $.event.trigger('fancybox-cancel'); + + _abort(); + + selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); + + busy = false; + }; + + // Note: within an iframe use - parent.$.fancybox.close(); + $.fancybox.close = function() { + if (busy || wrap.is(':hidden')) { + return; + } + + busy = true; + + if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { + busy = false; + return; + } + + _abort(); + + $(close.add( nav_left ).add( nav_right )).hide(); + + $(content.add( overlay )).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); + + if (currentOpts.titlePosition !== 'inside') { + title.empty(); + } + + wrap.stop(); + + function _cleanup() { + overlay.fadeOut('fast'); + + title.empty().hide(); + wrap.hide(); + + $.event.trigger('fancybox-cleanup'); + + content.empty(); + + currentOpts.onClosed(currentArray, currentIndex, currentOpts); + + currentArray = selectedOpts = []; + currentIndex = selectedIndex = 0; + currentOpts = selectedOpts = {}; + + busy = false; + } + + if (currentOpts.transitionOut == 'elastic') { + start_pos = _get_zoom_from(); + + var pos = wrap.position(); + + final_pos = { + top : pos.top , + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + if (currentOpts.opacity) { + final_pos.opacity = 1; + } + + title.empty().hide(); + + fx.prop = 1; + + $(fx).animate({ prop: 0 }, { + duration : currentOpts.speedOut, + easing : currentOpts.easingOut, + step : _draw, + complete : _cleanup + }); + + } else { + wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); + } + }; + + $.fancybox.resize = function() { + if (overlay.is(':visible')) { + overlay.css('height', $(document).height()); + } + + $.fancybox.center(true); + }; + + $.fancybox.center = function() { + var view, align; + + if (busy) { + return; + } + + align = arguments[0] === true ? 1 : 0; + view = _get_viewport(); + + if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { + return; + } + + wrap + .stop() + .animate({ + 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), + 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) + }, typeof arguments[0] == 'number' ? arguments[0] : 200); + }; + + $.fancybox.init = function() { + if ($("#fancybox-wrap").length) { + return; + } + + $('body').append( + tmp = $('
'), + loading = $('
'), + overlay = $('
'), + wrap = $('
') + ); + + outer = $('
') + .append('
') + .appendTo( wrap ); + + outer.append( + content = $('
'), + close = $(''), + title = $('
'), + + nav_left = $(''), + nav_right = $('') + ); + + close.click($.fancybox.close); + loading.click($.fancybox.cancel); + + nav_left.click(function(e) { + e.preventDefault(); + $.fancybox.prev(); + }); + + nav_right.click(function(e) { + e.preventDefault(); + $.fancybox.next(); + }); + + if ($.fn.mousewheel) { + wrap.bind('mousewheel.fb', function(e, delta) { + if (busy) { + e.preventDefault(); + + } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { + e.preventDefault(); + $.fancybox[ delta > 0 ? 'prev' : 'next'](); + } + }); + } + + if (!$.support.opacity) { + wrap.addClass('fancybox-ie'); + } + + if (isIE6) { + loading.addClass('fancybox-ie6'); + wrap.addClass('fancybox-ie6'); + + $('').prependTo(outer); + } + }; + + $.fn.fancybox.defaults = { + padding : 10, + margin : 40, + opacity : false, + modal : false, + cyclic : false, + scrolling : 'auto', // 'auto', 'yes' or 'no' + + width : 560, + height : 340, + + autoScale : true, + autoDimensions : true, + centerOnScroll : false, + + ajax : {}, + swf : { wmode: 'transparent' }, + + hideOnOverlayClick : true, + hideOnContentClick : false, + + overlayShow : true, + overlayOpacity : 0.7, + overlayColor : '#777', + + titleShow : true, + titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' + titleFormat : null, + titleFromAlt : false, + + transitionIn : 'fade', // 'elastic', 'fade' or 'none' + transitionOut : 'fade', // 'elastic', 'fade' or 'none' + + speedIn : 300, + speedOut : 300, + + changeSpeed : 300, + changeFade : 'fast', + + easingIn : 'swing', + easingOut : 'swing', + + showCloseButton : true, + showNavArrows : true, + enableEscapeButton : true, + enableKeyboardNav : true, + + onStart : function(){}, + onCancel : function(){}, + onComplete : function(){}, + onCleanup : function(){}, + onClosed : function(){}, + onError : function(){} + }; + + $(document).ready(function() { + $.fancybox.init(); + }); + +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.pack.js b/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.pack.js new file mode 100644 index 000000000..1373ed083 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.fancybox.pack.js @@ -0,0 +1,46 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("
")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('

The requested content cannot be loaded.
Please try again later.

'); +F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)|| +c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick= +false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('
').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel", +function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='';P="";b.each(e.swf,function(x,H){C+='';P+=" "+x+'="'+H+'"'});C+='";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win== +"function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('
');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor, +opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length? +d.titlePosition=="float"?'
'+s+'
':'
'+s+"
":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding}); +y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height== +i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents()); +f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode== +37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto"); +s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('').appendTo(j); +f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c); +j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type== +"image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"), +10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)}; +b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k= +0,C=a.length;ko.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+ +1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h= +true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1; +b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5- +d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('
'),t=b('
'),u=b('
'),f=b('
'));D=b('
').append('
').appendTo(f); +D.append(j=b('
'),E=b(''),n=b('
'),z=b(''),A=b(''));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()}); +b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('').prependTo(D)}}}; +b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing", +easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.fileupload.js b/assets/grocery_crud/js/jquery_plugins/jquery.fileupload.js new file mode 100644 index 000000000..ed9708f2c --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.fileupload.js @@ -0,0 +1,840 @@ +/* + * jQuery File Upload Plugin 5.6 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window, document, XMLHttpRequestUpload, Blob, File, FormData, location */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery', './vendor/jquery.ui.widget', './jquery.iframe-transport'], factory); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The namespace used for event handler binding on the dropZone and + // fileInput collections. + // If not set, the name of the widget ("fileupload") is used. + namespace: undefined, + // The drop target collection, by the default the complete document. + // Set to null or an empty collection to disable drag & drop support: + dropZone: $(document), + // The file input field collection, that is listened for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null or an empty collection to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uplaods, else + // once for each file selection. + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows to override plugin options as well as define ajax settings. + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + data.submit(); + }, + + // Other callbacks: + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + // Callback for change events of the fileInput collection: + // change: function (e, data) {}, // .bind('fileuploadchange', func); + // Callback for paste events to the dropZone collection: + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + // Callback for drop events of the dropZone collection: + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + // Callback for dragover events of the dropZone collection: + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false + }, + + // A list of options that require a refresh after assigning a new value: + _refreshOptionsList: ['namespace', 'dropZone', 'fileInput'], + + _isXHRUpload: function (options) { + var undef = 'undefined'; + return !options.forceIframeTransport && + typeof XMLHttpRequestUpload !== undef && typeof File !== undef && + (!options.multipart || typeof FormData !== undef); + }, + + _getFormData: function (options) { + var formData; + if (typeof options.formData === 'function') { + return options.formData(options.form); + } else if ($.isArray(options.formData)) { + return options.formData; + } else if (options.formData) { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var total = data.total || this._getTotal(data.files), + loaded = parseInt( + e.loaded / e.total * (data.chunkSize || total), + 10 + ) + (data.uploadedBytes || 0); + this._loaded += loaded - (data.loaded || data.uploadedBytes || 0); + data.lengthComputable = true; + data.loaded = loaded; + data.total = total; + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger('progress', e, data); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger('progressall', e, { + lengthComputable: true, + loaded: this._loaded, + total: this._total + }); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _initXHRData: function (options) { + var formData, + file = options.files[0]; + if (!options.multipart || options.blob) { + // For non-multipart uploads and chunked uploads, + // file meta data is not part of the request body, + // so we transmit this data as part of the HTTP headers. + // For cross domain requests, these headers must be allowed + // via Access-Control-Allow-Headers or removed using + // the beforeSend callback: + options.headers = $.extend(options.headers, { + 'X-File-Name': file.name, + 'X-File-Type': file.type, + 'X-File-Size': file.size + }); + if (!options.blob) { + // Non-chunked non-multipart upload: + options.contentType = file.type; + options.data = file; + } else if (!options.multipart) { + // Chunked non-multipart upload: + options.contentType = 'application/octet-stream'; + options.data = options.blob; + } + } + if (options.multipart && typeof FormData !== 'undefined') { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: options.paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: options.paramName, + value: file + }); + }); + } + } else { + if (options.formData instanceof FormData) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append(options.paramName, options.blob); + } else { + $.each(options.files, function (index, file) { + // File objects are also Blob instances. + // This check allows the tests to run with + // dummy objects: + if (file instanceof Blob) { + formData.append(options.paramName, file); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options, 'iframe'); + } + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + } + if (!options.paramName) { + options.paramName = options.fileInput.prop('name') || + 'files[]'; + } + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || options.form.prop('method') || '') + .toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT') { + options.type = 'POST'; + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes = options.uploadedBytes || 0, + mcs = options.maxChunkSize || fs, + // Use the Blob methods with the slice implementation + // according to the W3C Blob API specification: + slice = file.webkitSlice || file.mozSlice || file.slice, + upload, + n, + jqXHR, + pipe; + if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = 'uploadedBytes'; + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // n is the number of blobs to upload, + // calculated via filesize, uploaded bytes and max chunk size: + n = Math.ceil((fs - ub) / mcs); + // The chunk upload method accepting the chunk number as parameter: + upload = function (i) { + if (!i) { + return that._getXHRPromise(true, options.context); + } + // Upload the blobs in sequential order: + return upload(i -= 1).pipe(function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options); + o.blob = slice.call( + file, + ub + i * mcs, + ub + (i + 1) * mcs + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context)) + .done(function () { + // Create a progress event if upload is done and + // no progress event has been invoked for this chunk: + if (!o.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: o.chunkSize, + total: o.chunkSize + }), o); + } + options.uploadedBytes = o.uploadedBytes += + o.chunkSize; + }); + return jqXHR; + }); + }; + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe = upload(n); + pipe.abort = function () { + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + } + this._active += 1; + // Initialize the global progress values: + this._loaded += data.uploadedBytes || 0; + this._total += this._getTotal(data.files); + }, + + _onDone: function (result, textStatus, jqXHR, options) { + if (!this._isXHRUpload(options)) { + // Create a progress event for each iframe load: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: 1, + total: 1 + }), options); + } + options.result = result; + options.textStatus = textStatus; + options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + options.jqXHR = jqXHR; + options.textStatus = textStatus; + options.errorThrown = errorThrown; + this._trigger('fail', null, options); + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._loaded -= options.loaded || options.uploadedBytes || 0; + this._total -= options.total || this._getTotal(options.files); + } + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + this._active -= 1; + options.textStatus = textStatus; + if (jqXHRorError && jqXHRorError.always) { + options.jqXHR = jqXHRorError; + options.result = jqXHRorResult; + } else { + options.jqXHR = jqXHRorResult; + options.errorThrown = jqXHRorError; + } + this._trigger('always', null, options); + if (this._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + this._trigger('stop'); + // Reset the global progress values: + this._loaded = this._total = 0; + } + }, + + _onSend: function (e, data) { + var that = this, + jqXHR, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function (resolve, args) { + that._sending += 1; + jqXHR = jqXHR || ( + (resolve !== false && + that._trigger('send', e, options) !== false && + (that._chunkedUpload(options) || $.ajax(options))) || + that._getXHRPromise(false, options.context, args) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._sending -= 1; + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (!nextSlot.isRejected()) { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.pipe(send); + } else { + pipe = (this._sequence = this._sequence.pipe(send, send)); + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + var args = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(args); + } + return send(false, args); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + limit = options.limitMultiFileUploads, + fileSet, + i; + if (!(options.singleFileUploads || limit) || + !this._isXHRUpload(options)) { + fileSet = [data.files]; + } else if (!options.singleFileUploads && limit) { + fileSet = []; + for (i = 0; i < data.files.length; i += limit) { + fileSet.push(data.files.slice(i, i + limit)); + } + } + data.originalFiles = data.files; + $.each(fileSet || data.files, function (index, element) { + var files = fileSet ? element : [element], + newData = $.extend({}, data, {files: files}); + newData.submit = function () { + newData.jqXHR = this.jqXHR = + (that._trigger('submit', e, this) !== false) && + that._onSend(e, this); + return this.jqXHR; + }; + return (result = that._trigger('add', e, newData)); + }); + return result; + }, + + // File Normalization for Gecko 1.9.1 (Firefox 3.5) support: + _normalizeFile: function (index, file) { + if (file.name === undefined && file.size === undefined) { + file.name = file.fileName; + file.size = file.fileSize; + } + }, + + _replaceFileInput: function (input) { + var inputClone = input.clone(true); + $('
').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // collection with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _onChange: function (e) { + var that = e.data.fileupload, + data = { + files: $.each($.makeArray(e.target.files), that._normalizeFile), + fileInput: $(e.target), + form: $(e.target.form) + }; + if (!data.files.length) { + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + data.files = [{name: e.target.value.replace(/^.*\\/, '')}]; + } + if (that.options.replaceFileInput) { + that._replaceFileInput(data.fileInput); + } + if (that._trigger('change', e, data) === false || + that._onAdd(e, data) === false) { + return false; + } + }, + + _onPaste: function (e) { + var that = e.data.fileupload, + cbd = e.originalEvent.clipboardData, + items = (cbd && cbd.items) || [], + data = {files: []}; + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (that._trigger('paste', e, data) === false || + that._onAdd(e, data) === false) { + return false; + } + }, + + _onDrop: function (e) { + var that = e.data.fileupload, + dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer, + data = { + files: $.each( + $.makeArray(dataTransfer && dataTransfer.files), + that._normalizeFile + ) + }; + if (that._trigger('drop', e, data) === false || + that._onAdd(e, data) === false) { + return false; + } + e.preventDefault(); + }, + + _onDragOver: function (e) { + var that = e.data.fileupload, + dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer; + if (that._trigger('dragover', e) === false) { + return false; + } + if (dataTransfer) { + dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy'; + } + e.preventDefault(); + }, + + _initEventHandlers: function () { + var ns = this.options.namespace; + this.options.dropZone + .bind('dragover.' + ns, {fileupload: this}, this._onDragOver) + .bind('drop.' + ns, {fileupload: this}, this._onDrop) + .bind('paste.' + ns, {fileupload: this}, this._onPaste); + this.options.fileInput + .bind('change.' + ns, {fileupload: this}, this._onChange); + }, + + _destroyEventHandlers: function () { + var ns = this.options.namespace; + this.options.dropZone + .unbind('dragover.' + ns, this._onDragOver) + .unbind('drop.' + ns, this._onDrop) + .unbind('paste.' + ns, this._onPaste); + this.options.fileInput + .unbind('change.' + ns, this._onChange); + }, + + _beforeSetOption: function (key, value) { + this._destroyEventHandlers(); + }, + + _afterSetOption: function (key, value) { + var options = this.options; + if (!options.fileInput) { + options.fileInput = $(); + } + if (!options.dropZone) { + options.dropZone = $(); + } + this._initEventHandlers(); + }, + + _setOption: function (key, value) { + var refresh = $.inArray(key, this._refreshOptionsList) !== -1; + if (refresh) { + this._beforeSetOption(key, value); + } + $.Widget.prototype._setOption.call(this, key, value); + if (refresh) { + this._afterSetOption(key, value); + } + }, + + _create: function () { + var options = this.options; + options.namespace = options.namespace || this.widgetName; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input:file') ? + this.element : this.element.find('input:file'); + } else if (!options.fileInput) { + options.fileInput = $(); + } + if (!options.dropZone) { + options.dropZone = $(); + } + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = this._loaded = this._total = 0; + this._initEventHandlers(); + }, + + destroy: function () { + this._destroyEventHandlers(); + $.Widget.prototype.destroy.call(this); + }, + + enable: function () { + $.Widget.prototype.enable.call(this); + this._initEventHandlers(); + }, + + disable: function () { + this._destroyEventHandlers(); + $.Widget.prototype.disable.call(this); + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + if (!data || this.options.disabled) { + return; + } + data.files = $.each($.makeArray(data.files), this._normalizeFile); + this._onAdd(null, data); + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + data.files = $.each($.makeArray(data.files), this._normalizeFile); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.form.js b/assets/grocery_crud/js/jquery_plugins/jquery.form.js new file mode 100644 index 000000000..9606f91f0 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.form.js @@ -0,0 +1,1278 @@ +/*! + * jQuery Form Plugin + * version: 3.50.0-2014.02.05 + * Requires jQuery v1.5 or later + * Copyright (c) 2013 M. Alsup + * Examples and documentation at: http://malsup.com/jquery/form/ + * Project repository: https://github.com/malsup/form + * Dual licensed under the MIT and GPL licenses. + * https://github.com/malsup/form#copyright-and-license + */ +/*global ActiveXObject */ + +// AMD support +(function (factory) { + "use strict"; + if (typeof define === 'function' && define.amd) { + // using AMD; register as anon module + define(['jquery'], factory); + } else { + // no AMD; invoke directly + factory( (typeof(jQuery) != 'undefined') ? jQuery : window.Zepto ); + } +} + +(function($) { +"use strict"; + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are mutually exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').on('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + You can also use ajaxForm with delegation (requires jQuery v1.7+), so the + form does not have to exist when you invoke ajaxForm: + + $('#myForm').ajaxForm({ + delegation: true, + target: '#output' + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * Feature detection + */ +var feature = {}; +feature.fileapi = $("").get(0).files !== undefined; +feature.formdata = window.FormData !== undefined; + +var hasProp = !!$.fn.prop; + +// attr2 uses prop when it can but checks the return type for +// an expected string. this accounts for the case where a form +// contains inputs with names like "action" or "method"; in those +// cases "prop" returns the element +$.fn.attr2 = function() { + if ( ! hasProp ) { + return this.attr.apply(this, arguments); + } + var val = this.prop.apply(this, arguments); + if ( ( val && val.jquery ) || typeof val === 'string' ) { + return val; + } + return this.attr.apply(this, arguments); +}; + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + /*jshint scripturl:true */ + + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + var method, action, url, $form = this; + + if (typeof options == 'function') { + options = { success: options }; + } + else if ( options === undefined ) { + options = {}; + } + + method = options.type || this.attr2('method'); + action = options.url || this.attr2('action'); + + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: method || $.ajaxSettings.type, + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var traditional = options.traditional; + if ( traditional === undefined ) { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements); + if (options.data) { + options.extraData = options.data; + qx = $.param(options.data, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a, traditional); + if (qx) { + q = ( q ? (q + '&' + qx) : qx ); + } + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(options.includeHidden); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this ; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + if (options.error) { + var oldError = options.error; + options.error = function(xhr, status, error) { + var context = options.context || this; + oldError.apply(context, [xhr, status, error, $form]); + }; + } + + if (options.complete) { + var oldComplete = options.complete; + options.complete = function(xhr, status) { + var context = options.context || this; + oldComplete.apply(context, [xhr, status, $form]); + }; + } + + // are there files to upload? + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled', this).filter(function() { return $(this).val() !== ''; }); + + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + var fileAPI = feature.fileapi && feature.formdata; + log("fileAPI :" + fileAPI); + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + + var jqxhr; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + jqxhr = fileUploadIframe(a); + }); + } + else { + jqxhr = fileUploadIframe(a); + } + } + else if ((hasFileInputs || multipart) && fileAPI) { + jqxhr = fileUploadXhr(a); + } + else { + jqxhr = $.ajax(options); + } + + $form.removeData('jqxhr').data('jqxhr', jqxhr); + + // clear element array + for (var k=0; k < elements.length; k++) { + elements[k] = null; + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData, options.traditional).split('&'); + var len = serialized.length; + var result = []; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + return result; + } + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i=0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + var serializedData = deepSerialize(options.extraData); + for (i=0; i < serializedData.length; i++) { + if (serializedData[i]) { + formdata.append(serializedData[i][0], serializedData[i][1]); + } + } + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType: false, + processData: false, + cache: false, + type: method || 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = $.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(event) { + var percent = 0; + var position = event.loaded || event.position; /*event.position is deprecated*/ + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + options.uploadProgress(event, position, total, percent); + }, false); + } + return xhr; + }; + } + + s.data = null; + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + //Send FormData() provided by user + if (options.formData) { + o.data = options.formData; + } + else { + o.data = formdata; + } + if(beforeSend) { + beforeSend.call(this, xhr, o); + } + }; + return $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var deferred = $.Deferred(); + + // #341 + deferred.abort = function(status) { + xhr.abort(status); + }; + + if (a) { + // ensure that every serialized input is still enabled + for (i=0; i < elements.length; i++) { + el = $(elements[i]); + if ( hasProp ) { + el.prop('disabled', false); + } + else { + el.removeAttr('disabled'); + } + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + (new Date().getTime()); + if (s.iframeTarget) { + $io = $(s.iframeTarget); + n = $io.attr2('name'); + if (!n) { + $io.attr2('name', id); + } + else { + id = n; + } + } + else { + $io = $('' + ).bind('load', function () { + var fileInputClones; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + form.remove(); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function () { + $(this).prop('name', options.paramName); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + $(input).prop('name', clone.prop('name')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', 'javascript'.concat(':false;')); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, and script: + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return $(iframe[0].body).html(); + }, + 'iframe script': function (iframe) { + return $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.noty.js b/assets/grocery_crud/js/jquery_plugins/jquery.noty.js new file mode 100644 index 000000000..b41fd3442 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.noty.js @@ -0,0 +1,667 @@ +/** +* noty - jQuery Notification Plugin v2.0.3 +* Contributors: https://github.com/needim/noty/graphs/contributors +* +* Examples and Documentation - http://needim.github.com/noty/ +* +* Licensed under the MIT licenses: +* http://www.opensource.org/licenses/mit-license.php +* +**/ + +if (typeof Object.create !== 'function') { + Object.create = function (o) { + function F() {}; + F.prototype = o; + return new F(); + }; +}; + +;(function($) { + + var NotyObject = { + + init: function(options) { + + // Mix in the passed in options with the default options + this.options = $.extend({}, $.noty.defaults, options); + + this.options.layout = (this.options.custom) ? $.noty.layouts['inline'] : $.noty.layouts[this.options.layout]; + this.options.theme = $.noty.themes[this.options.theme]; + + delete options.layout, delete options.theme; + + this.options = $.extend({}, this.options, this.options.layout.options); + this.options.id = 'noty_' + (new Date().getTime() * Math.floor(Math.random()* 1000000)); + + this.options = $.extend({}, this.options, options); + + // Build the noty dom initial structure + this._build(); + + // return this so we can chain/use the bridge with less code. + return this; + }, // end init + + _build: function() { + + // Generating noty bar + var $bar = $('
').attr('id', this.options.id); + $bar.append(this.options.template).find('.noty_text').html(this.options.text); + + this.$bar = (this.options.layout.parent.object !== null) ? $(this.options.layout.parent.object).css(this.options.layout.parent.css).append($bar) : $bar; + + // Set buttons if available + if (this.options.buttons) { + + // If we have button disable closeWith & timeout options + this.options.closeWith = [], this.options.timeout = false; + + var $buttons = $('
').addClass('noty_buttons'); + + (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($buttons) : this.$bar.append($buttons); + + var self = this; + + $.each(this.options.buttons, function(i, button) { + var $button = $(''; + htmlins += ''; + htmlins += ''; + $('body').append(htmlins); + + $('#datepicker').datepicker(); + $(document).mousedown(closePickPlug); + $('#pickerplug .ui-datepicker-close').click(closePickPlug); + + // Slider + $('#hourSlider').slider({ + orientation: "vertical", + range: 'min', + min: 0, + max: 23, + step: 1, + slide: function(event, ui) { + writeDate(writeTime(ui.value,'hour'),'time'); + + }, + change: function(event, ui) { + $('#tpSelectedTime .selHrs').effect('highlight', 1000); + } + }); + // Slider + $('#minuteSlider').slider({ + orientation: "vertical", + range: 'min', + min: 0, + max: 55, + step: 5, + slide: function(event, ui) { + writeDate(writeTime(ui.value,'minute'),'time'); + }, + change: function(event, ui) { + $('#tpSelectedTime .selMins').effect('highlight', 1000); + } + }); + + //Inline editor bind + $('#tpSelectedTime .selHrs').keyup(function(e){ + if((e.which <= 57 && e.which >= 48) && ($(this).text() >=1 && $(this).text() <=12 ) ){ + //console.log("Which: "+e.which); + $('#hourSlider').slider('value', parseInt($(this).text())); + //console.log("Val: "+parseInt($(this).val())) + }else{ + $(this).val($(this).text().slice(0, -1)); + } + //if($(this).val() < 1){ + // $(this).val(1); + //} + }); + + //Inline editor bind + $('#tpSelectedTime .selMins').keyup(function(e){ + if((e.which <= 57 && e.which >= 48) && ($(this).text() >=0 && $(this).text() <=59 ) ){ + //console.log("Which: "+e.which); + $('#minuteSlider').slider('value', parseInt($(this).text())); + //console.log("Val: "+parseInt($(this).val())) + }else{ + $(this).text($(this).text().slice(0, -1)); + } + //if($(this).val() < 1){ + // $(this).val(1); + //} + }); + } + + $('.dayPeriod').toggle(!b24Hour); + $('#text_time').text(loadedLang['time']); + $('#text_hour').text(loadedLang['hour']); + $('#text_minute').text(loadedLang['minute']); + $('#text_close').text(loadedLang['close']); + + $('#pickerplug').data('userLang',lang_); + $('#pickerplug').data('b24Hour',b24Hour_); + } + + $(this).bind('focus',function(){ + + var top = $(this).offset().top+$(this).outerHeight(); + var left = $(this).offset().left; + + if ($(this).data('userLang') != $('#pickerplug').data('userLang') || + $(this).data('b24Hour') != $('#pickerplug').data('userLang') ) { + renderPickerPlug($(this).data('b24Hour'),$(this).data('userLang')); + } + + $('#pickerplug').css({ + left: left+'px', + top: top+'px' + }).show('normal'); + + if ($(this).data('userLang')!='en' && lang[$(this).data('userLang')]) { + $('#datepicker').datepicker('option', $.extend({}, + $.datepicker.regional[$(this).data('userLang')])); + $('#datepicker').datepicker('option', $.extend($(this).data('sets'))); + } else { + $('#datepicker').datepicker('option', $.extend({}, + $.datepicker.regional[''])); + $('#datepicker').datepicker('option', $.extend($(this).data('sets'))); + } + + parseTime(this); + + if ($('#pickerplug').css('display') == 'none') { + $('#pickerplug').show('normal'); + } + + $(this).bind('keyup',parseTime); + //$(this).bind('slider',writeTime); + + $(this).addClass(markerClass); + + $('#pickerplug').data('inputfield',this); + }); + + function parseTime (obj) { + if($(obj).val() != '') + var time = ($(obj).val() || $(this).val()).split(" "); + else + var time = ['00-00-00','00:00:00']; + + if (time.length < 2) { + time = ['00-00-00','00:00:00']; + } + + $('#pickerplug').data('lastdate',time[0]); //lastdate = time[0]; + $('#pickerplug').data('lasttime',time[1]); //lasttime = time[1]; + time = time[1].split(":"); + + if (time.length < 2) { + time = ['00','00','00']; + } + + var hour = time[0] || '00'; + var minute = time[1] || '00'; + + writeTime(hour,'hour'); + writeTime(minute,'minute'); + + $('#hourSlider').slider('option', 'value', hour); + $('#minuteSlider').slider('option', 'value', minute); + + var zero_string = "0"; + + if( $('#pickerplug').data('lastdate').charAt(0) != zero_string.charAt(0) ) + { + $('#datepicker').datepicker( 'setDate', + $.datepicker.parseDate( + datepicker_def['dateFormat'], + $('#pickerplug').data('lastdate') + ) + ); + } + else + { + $('#datepicker').datepicker( 'setDate', + $.datepicker.parseDate( + datepicker_def['dateFormat'], + '' + ) + ); + } + } + + function writeTime(fragment,type) { + var time = ''; + + switch (type) { + case 'hour': + var hours = parseInt(fragment,10); + + if (!$('#pickerplug').data('b24Hour') && hours > 11) { + hours -= 12; + $('.dayPeriod').text('pm'); + + } else if (!$('#pickerplug').data('b24Hour')) { + $('.dayPeriod').text('am'); + } + + if (hours < 10) { + hours = '0'.concat(hours); + } + if (fragment < 10) { + fragment = '0'.concat(parseInt(fragment)); + } + + $('#tpSelectedTime .selHrs').text(hours); + + time = fragment+':'+$('#tpSelectedTime .selMins').text(); + break; + case 'minute': + minutes = ((fragment < 10) ? '0' :'') + parseInt(fragment,10); + $('#tpSelectedTime .selMins').text(minutes); + + time = $('#hourSlider').slider('option', 'value')+':'+minutes; + break; + } + return time; + } + + function writeDate (text,type) { + + switch (type) { + case 'time': + $('#pickerplug').data('lasttime',text+':00'); + break; + default: + $('#pickerplug').data('lastdate',text); + } + $($('#pickerplug').data('inputfield')).val( + $('#pickerplug').data('lastdate')+' '+$('#pickerplug').data('lasttime') + ); + } + + function closePickPlug (event) { + + if (($(event.target).parents('#pickerplug').length || + $(event.target).hasClass(markerClass)) && + !$(event.target).hasClass('ui-datepicker-close')) { + return; + } + + $('#pickerplug').hide('normal'); + $(this).unbind('click',closePickPlug); + $(this).unbind('keyup',parseTime); + $(this).removeClass(markerClass); + } + + }); + + } diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.uniform.js b/assets/grocery_crud/js/jquery_plugins/jquery.uniform.js new file mode 100644 index 000000000..4c8105528 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.uniform.js @@ -0,0 +1,967 @@ +/* + +Uniform v2.0.0 +Copyright © 2009 Josh Pyles / Pixelmatrix Design LLC +http://pixelmatrixdesign.com + +Requires jQuery 1.3 or newer + +Much thanks to Thomas Reynolds and Buck Wilson for their help and advice on +this. + +Disabling text selection is made possible by Mathias Bynens + and his noSelect plugin. +, which is embedded. + +Also, thanks to David Kaneda and Eugene Bond for their contributions to the +plugin. + +Tyler Akins has also rewritten chunks of the plugin, helped close many issues, +and ensured version 2 got out the door. + +License: +MIT License - http://www.opensource.org/licenses/mit-license.php + +Enjoy! + +*/ +/*global jQuery, window, document*/ + +(function ($, undef) { + "use strict"; + + /** + * Use .prop() if jQuery supports it, otherwise fall back to .attr() + * + * @param jQuery $el jQuery'd element on which we're calling attr/prop + * @param ... All other parameters are passed to jQuery's function + * @return The result from jQuery + */ + function attrOrProp($el) { + var args = Array.prototype.slice.call(arguments, 1); + + if ($el.prop) { + // jQuery 1.6+ + return $el.prop.apply($el, args); + } + + // jQuery 1.5 and below + return $el.attr.apply($el, args); + } + + /** + * For backwards compatibility with older jQuery libraries, only bind + * one thing at a time. Also, this function adds our namespace to + * events in one consistent location, shrinking the minified code. + * + * The properties on the events object are the names of the events + * that we are supposed to add to. It can be a space separated list. + * The namespace will be added automatically. + * + * @param jQuery $el + * @param Object options Uniform options for this element + * @param Object events Events to bind, properties are event names + */ + function bindMany($el, options, events) { + var name, namespaced; + + for (name in events) { + if (events.hasOwnProperty(name)) { + namespaced = name.replace(/ |$/g, options.eventNamespace); + $el.bind(name, events[name]); + } + } + } + + /** + * Bind the hover, active, focus, and blur UI updates + * + * @param jQuery $el Original element + * @param jQuery $target Target for the events (our div/span) + * @param Object options Uniform options for the element $target + */ + function bindUi($el, $target, options) { + bindMany($el, options, { + focus: function () { + $target.addClass(options.focusClass); + }, + blur: function () { + $target.removeClass(options.focusClass); + $target.removeClass(options.activeClass); + }, + mouseenter: function () { + $target.addClass(options.hoverClass); + }, + mouseleave: function () { + $target.removeClass(options.hoverClass); + $target.removeClass(options.activeClass); + }, + "mousedown touchbegin": function () { + if (!$el.is(":disabled")) { + $target.addClass(options.activeClass); + } + }, + "mouseup touchend": function () { + $target.removeClass(options.activeClass); + } + }); + } + + /** + * Remove the hover, focus, active classes. + * + * @param jQuery $el Element with classes + * @param Object options Uniform options for the element + */ + function classClearStandard($el, options) { + $el.removeClass(options.hoverClass + " " + options.focusClass + " " + options.activeClass); + } + + /** + * Add or remove a class, depending on if it's "enabled" + * + * @param jQuery $el Element that has the class added/removed + * @param String className Class or classes to add/remove + * @param Boolean enabled True to add the class, false to remove + */ + function classUpdate($el, className, enabled) { + if (enabled) { + $el.addClass(className); + } else { + $el.removeClass(className); + } + } + + /** + * Updating the "checked" property can be a little tricky. This + * changed in jQuery 1.6 and now we can pass booleans to .prop(). + * Prior to that, one either adds an attribute ("checked=checked") or + * removes the attribute. + * + * @param jQuery $tag Our Uniform span/div + * @param jQuery $el Original form element + * @param Object options Uniform options for this element + */ + function classUpdateChecked($tag, $el, options) { + var c = "checked", + isChecked = $el.is(":" + c); + + if ($el.prop) { + // jQuery 1.6+ + $el.prop(c, isChecked); + } else { + // jQuery 1.5 and below + if (isChecked) { + $el.attr(c, c); + } else { + $el.removeAttr(c); + } + } + + classUpdate($tag, options.checkedClass, isChecked); + } + + /** + * Set or remove the "disabled" class for disabled elements, based on + * if the + * + * @param jQuery $tag Our Uniform span/div + * @param jQuery $el Original form element + * @param Object options Uniform options for this element + */ + function classUpdateDisabled($tag, $el, options) { + classUpdate($tag, options.disabledClass, $el.is(":disabled")); + } + + /** + * Wrap an element inside of a container or put the container next + * to the element. See the code for examples of the different methods. + * + * Returns the container that was added to the HTML. + * + * @param jQuery $el Element to wrap + * @param jQuery $container Add this new container around/near $el + * @param String method One of "after", "before" or "wrap" + * @return $container after it has been cloned for adding to $el + */ + function divSpanWrap($el, $container, method) { + switch (method) { + case "after": + // Result: + $el.after($container); + return $el.next(); + case "before": + // Result: + $el.before($container); + return $el.prev(); + case "wrap": + // Result: + $el.wrap($container); + return $el.parent(); + } + + return null; + } + + /** + * Create a div/span combo for uniforming an element + * + * @param jQuery $el Element to wrap + * @param Object options Options for the element, set by the user + * @param Object divSpanConfig Options for how we wrap the div/span + * @return Object Contains the div and span as properties + */ + function divSpan($el, options, divSpanConfig) { + var $div, $span, id; + + if (!divSpanConfig) { + divSpanConfig = {}; + } + + divSpanConfig = $.extend({ + bind: {}, + divClass: null, + divWrap: "wrap", + spanClass: null, + spanHtml: null, + spanWrap: "wrap" + }, divSpanConfig); + + $div = $('
'); + $span = $(''); + + // Automatically hide this div/span if the element is hidden. + // Do not hide if the element is hidden because a parent is hidden. + if (options.autoHide && $el.is(':hidden') && $el.css('display') === 'none') { + $div.hide(); + } + + if (divSpanConfig.divClass) { + $div.addClass(divSpanConfig.divClass); + } + + if (divSpanConfig.spanClass) { + $span.addClass(divSpanConfig.spanClass); + } + + id = attrOrProp($el, 'id'); + + if (options.useID && id) { + attrOrProp($div, 'id', options.idPrefix + '-' + id); + } + + if (divSpanConfig.spanHtml) { + $span.html(divSpanConfig.spanHtml); + } + + $div = divSpanWrap($el, $div, divSpanConfig.divWrap); + $span = divSpanWrap($el, $span, divSpanConfig.spanWrap); + classUpdateDisabled($div, $el, options); + return { + div: $div, + span: $span + }; + } + + + /** + * Test if high contrast mode is enabled. + * + * In high contrast mode, background images can not be set and + * they are always returned as 'none'. + * + * @return boolean True if in high contrast mode + */ + function highContrast() { + var c, $div, el, rgb; + + // High contrast mode deals with white and black + rgb = 'rgb(120,2,153)'; + $div = $('
'); + $('body').append($div); + el = $div.get(0); + + // $div.css() will get the style definition, not + // the actually displaying style + if (window.getComputedStyle) { + c = window.getComputedStyle(el, '').color; + } else { + c = (el.currentStyle || el.style || {}).color; + } + + $div.remove(); + return c.replace(/ /g, '') !== rgb; + } + + + /** + * Change text into safe HTML + * + * @param String text + * @return String HTML version + */ + function htmlify(text) { + if (!text) { + return ""; + } + + return $('').text(text).html(); + } + + /** + * Test if the element is a multiselect + * + * @param jQuery $el Element + * @return boolean true/false + */ + function isMultiselect($el) { + var elSize; + + if ($el[0].multiple) { + return true; + } + + elSize = attrOrProp($el, "size"); + + if (!elSize || elSize <= 1) { + return false; + } + + return true; + } + + /** + * Meaningless utility function. Used mostly for improving minification. + * + * @return false + */ + function returnFalse() { + return false; + } + + /** + * noSelect plugin, very slightly modified + * http://mths.be/noselect v1.0.3 + * + * @param jQuery $elem Element that we don't want to select + * @param Object options Uniform options for the element + */ + function noSelect($elem, options) { + var none = 'none'; + bindMany($elem, options, { + 'selectstart dragstart mousedown': returnFalse + }); + + $elem.css({ + MozUserSelect: none, + msUserSelect: none, + webkitUserSelect: none, + userSelect: none + }); + } + + /** + * Updates the filename tag based on the value of the real input + * element. + * + * @param jQuery $el Actual form element + * @param jQuery $filenameTag Span/div to update + * @param Object options Uniform options for this element + */ + function setFilename($el, $filenameTag, options) { + var filename = $el.val(); + + if (filename === "") { + filename = options.fileDefaultHtml; + } else { + filename = filename.split(/[\/\\]+/); + filename = filename[(filename.length - 1)]; + } + + $filenameTag.text(filename); + } + + + /** + * Function from jQuery to swap some CSS values, run a callback, + * then restore the CSS. Modified to pass JSLint and handle undefined + * values with 'use strict'. + * + * @param jQuery $el Element + * @param object newCss CSS values to swap out + * @param Function callback Function to run + */ + function swap($el, newCss, callback) { + var restore, item; + + restore = []; + + $el.each(function () { + var name; + + for (name in newCss) { + if (Object.prototype.hasOwnProperty.call(newCss, name)) { + restore.push({ + el: this, + name: name, + old: this.style[name] + }); + + this.style[name] = newCss[name]; + } + } + }); + + callback(); + + while (restore.length) { + item = restore.pop(); + item.el.style[item.name] = item.old; + } + } + + + /** + * The browser doesn't provide sizes of elements that are not visible. + * This will clone an element and add it to the DOM for calculations. + * + * @param jQuery $el + * @param String method + */ + function sizingInvisible($el, callback) { + swap($el.parents().andSelf().not(':visible'), { + visibility: "hidden", + display: "block", + position: "absolute" + }, callback); + } + + + /** + * Standard way to unwrap the div/span combination from an element + * + * @param jQuery $el Element that we wish to preserve + * @param Object options Uniform options for the element + * @return Function This generated function will perform the given work + */ + function unwrapUnwrapUnbindFunction($el, options) { + return function () { + $el.unwrap().unwrap().unbind(options.eventNamespace); + }; + } + + var allowStyling = true, // False if IE6 or other unsupported browsers + highContrastTest = false, // Was the high contrast test ran? + uniformHandlers = [ // Objects that take care of "unification" + { + // Buttons + match: function ($el) { + return $el.is("a, button, :submit, :reset, input[type='button']"); + }, + apply: function ($el, options) { + var $div, defaultSpanHtml, ds, getHtml, doingClickEvent; + defaultSpanHtml = options.submitDefaultHtml; + + if ($el.is(":reset")) { + defaultSpanHtml = options.resetDefaultHtml; + } + + if ($el.is("a, button")) { + // Use the HTML inside the tag + getHtml = function () { + return $el.html() || defaultSpanHtml; + }; + } else { + // Use the value property of the element + getHtml = function () { + return htmlify(attrOrProp($el, "value")) || defaultSpanHtml; + }; + } + + ds = divSpan($el, options, { + divClass: options.buttonClass, + spanHtml: getHtml() + }); + $div = ds.div; + bindUi($el, $div, options); + doingClickEvent = false; + bindMany($div, options, { + "click touchend": function () { + var ev, res, target, href; + + if (doingClickEvent) { + return; + } + + doingClickEvent = true; + + if ($el[0].dispatchEvent) { + ev = document.createEvent("MouseEvents"); + ev.initEvent("click", true, true); + res = $el[0].dispatchEvent(ev); + + // What about Chrome and Opera? + // Should the browser check be removed? + if ((jQuery.browser.msie || jQuery.browser.mozilla) && $el.is('a') && res) { + target = attrOrProp($el, 'target'); + href = attrOrProp($el, 'href'); + + if (!target || target === '_self') { + document.location.href = href; + } else { + window.open(href, target); + } + } + } else { + $el.click(); + } + + doingClickEvent = false; + } + }); + noSelect($div, options); + return { + remove: function () { + // Move $el out + $div.after($el); + + // Remove div and span + $div.remove(); + + // Unbind events + $el.unbind(options.eventNamespace); + return $el; + }, + update: function () { + classClearStandard($div, options); + classUpdateDisabled($div, $el, options); + ds.span.html(getHtml()); + } + }; + } + }, + { + // Checkboxes + match: function ($el) { + return $el.is(":checkbox"); + }, + apply: function ($el, options) { + var ds, $div, $span; + ds = divSpan($el, options, { + divClass: options.checkboxClass + }); + $div = ds.div; + $span = ds.span; + + // Add focus classes, toggling, active, etc. + bindUi($el, $div, options); + bindMany($el, options, { + "click touchend": function () { + classUpdateChecked($span, $el, options); + } + }); + classUpdateChecked($span, $el, options); + return { + remove: unwrapUnwrapUnbindFunction($el, options), + update: function () { + classClearStandard($div, options); + $span.removeClass(options.checkedClass); + classUpdateChecked($span, $el, options); + classUpdateDisabled($div, $el, options); + } + }; + } + }, + { + // File selection / uploads + match: function ($el) { + return $el.is(":file"); + }, + apply: function ($el, options) { + var ds, $div, $filename, $button; + + // The "span" is the button + ds = divSpan($el, options, { + divClass: options.fileClass, + spanClass: options.fileButtonClass, + spanHtml: options.fileButtonHtml, + spanWrap: "after" + }); + $div = ds.div; + $button = ds.span; + $filename = $("").html(options.fileDefaultHtml); + $filename.addClass(options.filenameClass); + $filename = divSpanWrap($el, $filename, "after"); + + // Set the size + if (!attrOrProp($el, "size")) { + attrOrProp($el, "size", $div.width() / 10); + } + + // Actions + function filenameUpdate() { + setFilename($el, $filename, options); + } + + bindUi($el, $div, options); + + // Account for input saved across refreshes + filenameUpdate(); + + // IE7 doesn't fire onChange until blur or second fire. + if ($.browser.msie) { + // IE considers browser chrome blocking I/O, so it + // suspends tiemouts until after the file has + // been selected. + bindMany($el, options, { + click: function () { + $el.trigger("change"); + setTimeout(filenameUpdate, 0); + } + }); + } else { + // All other browsers behave properly + bindMany($el, options, { + change: filenameUpdate + }); + } + + noSelect($filename, options); + noSelect($button, options); + return { + remove: function () { + // Remove filename and button + $filename.remove(); + $button.remove(); + + // Unwrap parent div, remove events + return $el.unwrap().unbind(options.eventNamespace); + }, + update: function () { + classClearStandard($div, options); + setFilename($el, $filename, options); + classUpdateDisabled($div, $el, options); + } + }; + } + }, + { + // Input fields (text) + match: function ($el) { + if ($el.is("input")) { + var t = (" " + attrOrProp($el, "type") + " ").toLowerCase(), + allowed = " color date datetime datetime-local email month number password search tel text time url week "; + return allowed.indexOf(t) >= 0; + } + + return false; + }, + apply: function ($el) { + var elType = attrOrProp($el, "type"); + $el.addClass(elType); + return { + remove: function () { + $el.removeClass(elType); + }, + update: returnFalse + }; + } + }, + { + // Radio buttons + match: function ($el) { + return $el.is(":radio"); + }, + apply: function ($el, options) { + var ds, $div, $span; + ds = divSpan($el, options, { + divClass: options.radioClass + }); + $div = ds.div; + $span = ds.span; + + // Add classes for focus, handle active, checked + bindUi($el, $div, options); + bindMany($el, options, { + "click touchend": function () { + // Find all radios with the same name, then update + // them with $.uniform.update() so the right + // per-element options are used + $.uniform.update($(':radio[name="' + attrOrProp($el, "name") + '"]')); + } + }); + classUpdateChecked($span, $el, options); + return { + remove: unwrapUnwrapUnbindFunction($el, options), + update: function () { + classClearStandard($div, options); + classUpdateChecked($span, $el, options); + classUpdateDisabled($div, $el, options); + } + }; + } + }, + { + // Select lists, but do not style multiselects here + match: function ($el) { + if ($el.is("select") && !isMultiselect($el)) { + return true; + } + + return false; + }, + apply: function ($el, options) { + var ds, $div, $span, origElemWidth; + + if (options.selectAutoWidth) { + sizingInvisible($el, function () { + origElemWidth = $el.width(); + }); + } + + ds = divSpan($el, options, { + divClass: options.selectClass, + spanHtml: ($el.find(":selected:first") || $el.find("option:first")).html(), + spanWrap: "before" + }); + $div = ds.div; + $span = ds.span; + + if (options.selectAutoWidth) { + // Use the width of the select and adjust the + // span and div accordingly + sizingInvisible($el, function () { + var spanPad; + spanPad = $span.outerWidth() - $span.width(); + $div.width(origElemWidth + spanPad); + $span.width(origElemWidth); + }); + } else { + // Force the select to fill the size of the div + $div.addClass('fixedWidth'); + } + + // Take care of events + bindUi($el, $div, options); + bindMany($el, options, { + change: function () { + $span.html($el.find(":selected").html()); + $div.removeClass(options.activeClass); + }, + "click touchend": function () { + // IE7 and IE8 may not update the value right + // until after click event - issue #238 + var selHtml = $el.find(":selected").html(); + + if ($span.html() !== selHtml) { + // Change was detected + // Fire the change event on the select tag + $el.trigger('change'); + } + }, + keyup: function () { + $span.html($el.find(":selected").html()); + } + }); + noSelect($span, options); + return { + remove: function () { + // Remove sibling span + $span.remove(); + + // Unwrap parent div + $el.unwrap().unbind(options.eventNamespace); + return $el; + }, + update: function () { + if (options.selectAutoWidth) { + // Easier to remove and reapply formatting + $.uniform.restore($el); + $el.uniform(options); + } else { + classClearStandard($div, options); + + // Reset current selected text + $span.html($el.find(":selected").html()); + classUpdateDisabled($div, $el, options); + } + } + }; + } + }, + { + // Select lists - multiselect lists only + match: function ($el) { + if ($el.is("select") && isMultiselect($el)) { + return true; + } + + return false; + }, + apply: function ($el, options) { + $el.addClass(options.selectMultiClass); + return { + remove: function () { + $el.removeClass(options.selectMultiClass); + }, + update: returnFalse + }; + } + }, + { + // Textareas + match: function ($el) { + return $el.is("textarea"); + }, + apply: function ($el, options) { + $el.addClass(options.textareaClass); + return { + remove: function () { + $el.removeClass(options.textareaClass); + }, + update: returnFalse + }; + } + } + ]; + + // IE6 can't be styled - can't set opacity on select + if ($.browser.msie && $.browser.version < 7) { + allowStyling = false; + } + + $.uniform = { + // Default options that can be overridden globally or when uniformed + // globally: $.uniform.defaults.fileButtonHtml = "Pick A File"; + // on uniform: $('input').uniform({fileButtonHtml: "Pick a File"}); + defaults: { + activeClass: "active", + autoHide: true, + buttonClass: "button", + checkboxClass: "checker", + checkedClass: "checked", + disabledClass: "disabled", + eventNamespace: ".uniform", + fileButtonClass: "action", + fileButtonHtml: "Choose File", + fileClass: "uploader", + fileDefaultHtml: "No file selected", + filenameClass: "filename", + focusClass: "focus", + hoverClass: "hover", + idPrefix: "uniform", + radioClass: "radio", + resetDefaultHtml: "Reset", + resetSelector: false, // We'll use our own function when you don't specify one + selectAutoWidth: true, + selectClass: "selector", + selectMultiClass: "uniform-multiselect", + submitDefaultHtml: "Submit", // Only text allowed + textareaClass: "uniform", + useID: true + }, + + // All uniformed elements - DOM objects + elements: [] + }; + + $.fn.uniform = function (options) { + var el = this; + options = $.extend({}, $.uniform.defaults, options); + + // If we are in high contrast mode, do not allow styling + if (!highContrastTest) { + highContrastTest = true; + + if (highContrast()) { + allowStyling = false; + } + } + + // Only uniform on browsers that work + if (!allowStyling) { + return this; + } + + // Code for specifying a reset button + if (options.resetSelector) { + $(options.resetSelector).mouseup(function () { + window.setTimeout(function () { + $.uniform.update(el); + }, 10); + }); + } + + return this.each(function () { + var $el = $(this), i, handler, callbacks; + + // Avoid uniforming elements already uniformed - just update + if ($el.data("uniformed")) { + $.uniform.update($el); + return; + } + + // See if we have any handler for this type of element + for (i = 0; i < uniformHandlers.length; i = i + 1) { + handler = uniformHandlers[i]; + + if (handler.match($el, options)) { + callbacks = handler.apply($el, options); + $el.data("uniformed", callbacks); + + // Store element in our global array + $.uniform.elements.push($el.get(0)); + return; + } + } + + // Could not style this element + }); + }; + + $.uniform.restore = $.fn.uniform.restore = function (elem) { + if (elem === undef) { + elem = $.uniform.elements; + } + + $(elem).each(function () { + var $el = $(this), index, elementData; + elementData = $el.data("uniformed"); + + // Skip elements that are not uniformed + if (!elementData) { + return; + } + + // Unbind events, remove additional markup that was added + elementData.remove(); + + // Remove item from list of uniformed elements + index = $.inArray(this, $.uniform.elements); + + if (index >= 0) { + $.uniform.elements.splice(index, 1); + } + + $el.removeData("uniformed"); + }); + }; + + $.uniform.update = $.fn.uniform.update = function (elem) { + if (elem === undef) { + elem = $.uniform.elements; + } + + $(elem).each(function () { + var $el = $(this), elementData; + elementData = $el.data("uniformed"); + + // Skip elements that are not uniformed + if (!elementData) { + return; + } + + elementData.update($el, elementData.options); + }); + }; +}(jQuery)); diff --git a/assets/grocery_crud/js/jquery_plugins/jquery.uniform.min.js b/assets/grocery_crud/js/jquery_plugins/jquery.uniform.min.js new file mode 100644 index 000000000..1326e08c4 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/jquery.uniform.min.js @@ -0,0 +1 @@ +(function(e,t){"use strict";function n(e){var t=Array.prototype.slice.call(arguments,1);return e.prop?e.prop.apply(e,t):e.attr.apply(e,t)}function s(e,t,n){var s,a;for(s in n)n.hasOwnProperty(s)&&(a=s.replace(/ |$/g,t.eventNamespace),e.bind(s,n[s]))}function a(e,t,n){s(e,n,{focus:function(){t.addClass(n.focusClass)},blur:function(){t.removeClass(n.focusClass),t.removeClass(n.activeClass)},mouseenter:function(){t.addClass(n.hoverClass)},mouseleave:function(){t.removeClass(n.hoverClass),t.removeClass(n.activeClass)},"mousedown touchbegin":function(){e.is(":disabled")||t.addClass(n.activeClass)},"mouseup touchend":function(){t.removeClass(n.activeClass)}})}function i(e,t){e.removeClass(t.hoverClass+" "+t.focusClass+" "+t.activeClass)}function r(e,t,n){n?e.addClass(t):e.removeClass(t)}function o(e,t,n){var s="checked",a=t.is(":"+s);t.prop?t.prop(s,a):a?t.attr(s,s):t.removeAttr(s),r(e,n.checkedClass,a)}function l(e,t,n){r(e,n.disabledClass,t.is(":disabled"))}function u(e,t,n){switch(n){case"after":return e.after(t),e.next();case"before":return e.before(t),e.prev();case"wrap":return e.wrap(t),e.parent()}return null}function c(t,s,a){var i,r,o;return a||(a={}),a=e.extend({bind:{},divClass:null,divWrap:"wrap",spanClass:null,spanHtml:null,spanWrap:"wrap"},a),i=e("
"),r=e(""),s.autoHide&&t.is(":hidden")&&"none"===t.css("display")&&i.hide(),a.divClass&&i.addClass(a.divClass),a.spanClass&&r.addClass(a.spanClass),o=n(t,"id"),s.useID&&o&&n(i,"id",s.idPrefix+"-"+o),a.spanHtml&&r.html(a.spanHtml),i=u(t,i,a.divWrap),r=u(t,r,a.spanWrap),l(i,t,s),{div:i,span:r}}function f(){var t,n,s,a;return a="rgb(120,2,153)",n=e('
'),e("body").append(n),s=n.get(0),t=window.getComputedStyle?window.getComputedStyle(s,"").color:(s.currentStyle||s.style||{}).color,n.remove(),t.replace(/ /g,"")!==a}function d(t){return t?e("").text(t).html():""}function m(e){var t;return e[0].multiple?!0:(t=n(e,"size"),!t||1>=t?!1:!0)}function p(){return!1}function v(e,t){var n="none";s(e,t,{"selectstart dragstart mousedown":p}),e.css({MozUserSelect:n,msUserSelect:n,webkitUserSelect:n,userSelect:n})}function h(e,t,n){var s=e.val();""===s?s=n.fileDefaultHtml:(s=s.split(/[\/\\]+/),s=s[s.length-1]),t.text(s)}function C(e,t,n){var s,a;for(s=[],e.each(function(){var e;for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(s.push({el:this,name:e,old:this.style[e]}),this.style[e]=t[e])}),n();s.length;)a=s.pop(),a.el.style[a.name]=a.old}function b(e,t){C(e.parents().andSelf().not(":visible"),{visibility:"hidden",display:"block",position:"absolute"},t)}function w(e,t){return function(){e.unwrap().unwrap().unbind(t.eventNamespace)}}var y=!0,g=!1,k=[{match:function(e){return e.is("a, button, :submit, :reset, input[type='button']")},apply:function(e,t){var r,o,u,f,m;return o=t.submitDefaultHtml,e.is(":reset")&&(o=t.resetDefaultHtml),f=e.is("a, button")?function(){return e.html()||o}:function(){return d(n(e,"value"))||o},u=c(e,t,{divClass:t.buttonClass,spanHtml:f()}),r=u.div,a(e,r,t),m=!1,s(r,t,{"click touchend":function(){var t,s,a,i;m||(m=!0,e[0].dispatchEvent?(t=document.createEvent("MouseEvents"),t.initEvent("click",!0,!0),s=e[0].dispatchEvent(t),(jQuery.browser.msie||jQuery.browser.mozilla)&&e.is("a")&&s&&(a=n(e,"target"),i=n(e,"href"),a&&"_self"!==a?window.open(i,a):document.location.href=i)):e.click(),m=!1)}}),v(r,t),{remove:function(){return r.after(e),r.remove(),e.unbind(t.eventNamespace),e},update:function(){i(r,t),l(r,e,t),u.span.html(f())}}}},{match:function(e){return e.is(":checkbox")},apply:function(e,t){var n,r,u;return n=c(e,t,{divClass:t.checkboxClass}),r=n.div,u=n.span,a(e,r,t),s(e,t,{"click touchend":function(){o(u,e,t)}}),o(u,e,t),{remove:w(e,t),update:function(){i(r,t),u.removeClass(t.checkedClass),o(u,e,t),l(r,e,t)}}}},{match:function(e){return e.is(":file")},apply:function(t,r){function o(){h(t,m,r)}var f,d,m,p;return f=c(t,r,{divClass:r.fileClass,spanClass:r.fileButtonClass,spanHtml:r.fileButtonHtml,spanWrap:"after"}),d=f.div,p=f.span,m=e("").html(r.fileDefaultHtml),m.addClass(r.filenameClass),m=u(t,m,"after"),n(t,"size")||n(t,"size",d.width()/10),a(t,d,r),o(),e.browser.msie?s(t,r,{click:function(){t.trigger("change"),setTimeout(o,0)}}):s(t,r,{change:o}),v(m,r),v(p,r),{remove:function(){return m.remove(),p.remove(),t.unwrap().unbind(r.eventNamespace)},update:function(){i(d,r),h(t,m,r),l(d,t,r)}}}},{match:function(e){if(e.is("input")){var t=(" "+n(e,"type")+" ").toLowerCase(),s=" color date datetime datetime-local email month number password search tel text time url week ";return s.indexOf(t)>=0}return!1},apply:function(e){var t=n(e,"type");return e.addClass(t),{remove:function(){e.removeClass(t)},update:p}}},{match:function(e){return e.is(":radio")},apply:function(t,r){var u,f,d;return u=c(t,r,{divClass:r.radioClass}),f=u.div,d=u.span,a(t,f,r),s(t,r,{"click touchend":function(){e.uniform.update(e(':radio[name="'+n(t,"name")+'"]'))}}),o(d,t,r),{remove:w(t,r),update:function(){i(f,r),o(d,t,r),l(f,t,r)}}}},{match:function(e){return e.is("select")&&!m(e)?!0:!1},apply:function(t,n){var r,o,u,f;return n.selectAutoWidth&&b(t,function(){f=t.width()}),r=c(t,n,{divClass:n.selectClass,spanHtml:(t.find(":selected:first")||t.find("option:first")).html(),spanWrap:"before"}),o=r.div,u=r.span,n.selectAutoWidth?b(t,function(){var e;e=u.outerWidth()-u.width(),o.width(f+e),u.width(f)}):o.addClass("fixedWidth"),a(t,o,n),s(t,n,{change:function(){u.html(t.find(":selected").html()),o.removeClass(n.activeClass)},"click touchend":function(){var e=t.find(":selected").html();u.html()!==e&&t.trigger("change")},keyup:function(){u.html(t.find(":selected").html())}}),v(u,n),{remove:function(){return u.remove(),t.unwrap().unbind(n.eventNamespace),t},update:function(){n.selectAutoWidth?(e.uniform.restore(t),t.uniform(n)):(i(o,n),u.html(t.find(":selected").html()),l(o,t,n))}}}},{match:function(e){return e.is("select")&&m(e)?!0:!1},apply:function(e,t){return e.addClass(t.selectMultiClass),{remove:function(){e.removeClass(t.selectMultiClass)},update:p}}},{match:function(e){return e.is("textarea")},apply:function(e,t){return e.addClass(t.textareaClass),{remove:function(){e.removeClass(t.textareaClass)},update:p}}}];e.browser.msie&&7>e.browser.version&&(y=!1),e.uniform={defaults:{activeClass:"active",autoHide:!0,buttonClass:"button",checkboxClass:"checker",checkedClass:"checked",disabledClass:"disabled",eventNamespace:".uniform",fileButtonClass:"action",fileButtonHtml:"Choose File",fileClass:"uploader",fileDefaultHtml:"No file selected",filenameClass:"filename",focusClass:"focus",hoverClass:"hover",idPrefix:"uniform",radioClass:"radio",resetDefaultHtml:"Reset",resetSelector:!1,selectAutoWidth:!0,selectClass:"selector",selectMultiClass:"uniform-multiselect",submitDefaultHtml:"Submit",textareaClass:"uniform",useID:!0},elements:[]},e.fn.uniform=function(t){var n=this;return t=e.extend({},e.uniform.defaults,t),g||(g=!0,f()&&(y=!1)),y?(t.resetSelector&&e(t.resetSelector).mouseup(function(){window.setTimeout(function(){e.uniform.update(n)},10)}),this.each(function(){var n,s,a,i=e(this);if(i.data("uniformed"))return e.uniform.update(i),void 0;for(n=0;k.length>n;n+=1)if(s=k[n],s.match(i,t))return a=s.apply(i,t),i.data("uniformed",a),e.uniform.elements.push(i.get(0)),void 0})):this},e.uniform.restore=e.fn.uniform.restore=function(n){n===t&&(n=e.uniform.elements),e(n).each(function(){var t,n,s=e(this);n=s.data("uniformed"),n&&(n.remove(),t=e.inArray(this,e.uniform.elements),t>=0&&e.uniform.elements.splice(t,1),s.removeData("uniformed"))})},e.uniform.update=e.fn.uniform.update=function(n){n===t&&(n=e.uniform.elements),e(n).each(function(){var t,n=e(this);t=n.data("uniformed"),t&&t.update(n,t.options)})}})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/load-image.min.js b/assets/grocery_crud/js/jquery_plugins/load-image.min.js new file mode 100644 index 000000000..9edd707f8 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/load-image.min.js @@ -0,0 +1,3 @@ +(function(h){var e=function(a,c,d){var b=document.createElement("img"),f,g;b.onerror=c;b.onload=function(){g&&e.revokeObjectURL(g);c(e.scale(b,d))};return(f=window.Blob&&a instanceof Blob||window.File&&a instanceof File?g=e.createObjectURL(a):a)?(b.src=f,b):e.readFile(a,function(a){b.src=a})},f=window.createObjectURL&&window||window.URL&&URL||window.webkitURL&&webkitURL;e.scale=function(a,c){var c=c||{},d=document.createElement("canvas"),b=Math.max((c.minWidth||a.width)/a.width,(c.minHeight||a.height)/ +a.height);if(1b)a.width=parseInt(a.width*b,10),a.height=parseInt(a.height*b,10);if(!c.canvas||!d.getContext)return a;d.width=a.width;d.height=a.height;d.getContext("2d").drawImage(a,0,0,a.width,a.height);return d};e.createObjectURL=function(a){return f?f.createObjectURL(a):!1};e.revokeObjectURL=function(a){return f?f.revokeObjectURL(a):!1};e.readFile=function(a, +c){if(window.FileReader&&FileReader.prototype.readAsDataURL){var d=new FileReader;d.onload=function(a){c(a.target.result)};d.readAsDataURL(a);return d}return!1};"undefined"!==typeof define&&define.amd?define("loadImage",function(){return e}):h.loadImage=e})(this); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/tmpl.min.js b/assets/grocery_crud/js/jquery_plugins/tmpl.min.js new file mode 100644 index 000000000..53146973b --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/tmpl.min.js @@ -0,0 +1,2 @@ +(function(e){var a=function(b,d){var c=!/[^\-\w]/.test(b)?a.cache[b]=a.cache[b]||a(a.load(b)):new Function(a.arg,("var _s=''"+a.helper+";_s+='"+b.replace(a.regexp,a.func)+"';return _s;").split("_s+='';").join(""));c.tmpl=c.tmpl||a;return d?c(d):c};a.cache={};a.load=function(a){return document.getElementById(a).innerHTML};a.regexp=/(\s+)|('|\\)(?![^%]*%\})|(?:\{%(=|#)(.+?)%\})|(\{%)|(%\})/g;a.func=function(a,d,c,f,g,e,i,h,j){if(d)return h&&h+a.length!==j.length?" ":"";if(c)return"\\"+a;if(f)return"="=== +f?"'+_e("+g+")+'":"'+("+g+"||'')+'";if(e)return"';";if(i)return"_s+='"};a.encReg=/[<>&"\x00]/g;a.encMap={"<":"<",">":">","&":"&",'"':""","\x00":""};a.encode=function(b){return(""+(b||"")).replace(a.encReg,function(b){return a.encMap[b]})};a.arg="o";a.helper=",_t=arguments.callee.tmpl,_e=_t.encode,print=function(s,e){_s+=e&&(s||'')||_e(s);},include=function(s,d){_s+=_t(s,d);}";"function"===typeof define&&define.amd?define("tmpl",function(){return a}):e.tmpl=a})(this); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui.multiselect.min.js b/assets/grocery_crud/js/jquery_plugins/ui.multiselect.min.js new file mode 100644 index 000000000..cae69b6bf --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui.multiselect.min.js @@ -0,0 +1,2 @@ +/* jQuery UI Multiselect | https://github.com/michael/multiselect */ +(function(b){b.widget("ui.multiselect",{options:{sortable:!0,searchable:!0,doubleClickable:!0,animated:"fast",show:"slideDown",hide:"slideUp",dividerLocation:0.6,availableFirst:!1,nodeComparator:function(a,b){var d=a.text(),e=b.text();return d==e?0:d
').insertAfter(this.element);this.count=0;this.selectedContainer=b('
').appendTo(this.container);this.availableContainer=b('
')[this.options.availableFirst?"prependTo":"appendTo"](this.container);this.selectedActions=b('
0 '+b.ui.multiselect.locale.itemsCount+''+b.ui.multiselect.locale.removeAll+"
").appendTo(this.selectedContainer);this.availableActions=b('").appendTo(this.availableContainer);this.selectedList=b('
').bind("selectstart",function(){return!1}).appendTo(this.selectedContainer);this.availableList=b('
').bind("selectstart",function(){return!1}).appendTo(this.availableContainer);var a=this;this.container.width(this.element.width()+1);this.selectedContainer.width(Math.floor(this.element.width()*this.options.dividerLocation));this.availableContainer.width(Math.floor(this.element.width()*(1-this.options.dividerLocation)));this.selectedList.height(Math.max(this.element.height()-this.selectedActions.height(),1));this.availableList.height(Math.max(this.element.height()-this.availableActions.height(),1));this.options.animated||(this.options.show="show",this.options.hide="hide");this._populateLists(this.element.find("option"));this.options.sortable&&this.selectedList.sortable({placeholder:"ui-state-highlight",axis:"y",update:function(){a.selectedList.find("li").each(function(){b(this).data("optionLink")&&b(this).data("optionLink").remove().appendTo(a.element)})},receive:function(c,d){d.item.data("optionLink").attr("selected",!0);a.count+=1;a._updateCount();a.selectedList.children(".ui-draggable").each(function(){b(this).removeClass("ui-draggable");b(this).data("optionLink",d.item.data("optionLink"));b(this).data("idx",d.item.data("idx"));a._applyItemState(b(this),!0)});setTimeout(function(){d.item.remove()},1)}});this.options.searchable?this._registerSearchEvents(this.availableContainer.find("input.search")):b(".search").hide();this.container.find(".remove-all").click(function(){a._populateLists(a.element.find("option").removeAttr("selected"));return!1});this.container.find(".add-all").click(function(){var c=a.element.find("option").not(":selected");1'+a.text()+'').hide();c.data("optionLink",a);return c},_cloneWithData:function(a){var b=a.clone(!1,!1);b.data("optionLink",a.data("optionLink"));b.data("idx",a.data("idx"));return b},_setSelected:function(a,c){a.data("optionLink").attr("selected",c);if(c){var d=this._cloneWithData(a);a[this.options.hide](this.options.animated,function(){b(this).remove()});d.appendTo(this.selectedList).hide()[this.options.show](this.options.animated);this._applyItemState(d,!0);return d}var e=this.availableList.find("li"),g=this.options.nodeComparator,d=null,f=a.data("idx"),h=g(a,b(e[f]));if(h)for(;0<=f&&f + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-af.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-af.js new file mode 100644 index 000000000..bd9861d8c --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-af.js @@ -0,0 +1,23 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +jQuery(function($){ + $.datepicker.regional['af'] = { + closeText: 'Selekteer', + prevText: 'Vorige', + nextText: 'Volgende', + currentText: 'Vandag', + monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie', + 'Julie','Augustus','September','Oktober','November','Desember'], + monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', + 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['af']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ar.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ar.js new file mode 100644 index 000000000..1f0aa3d33 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ar.js @@ -0,0 +1,23 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Ashraf Kaabi -- mail@kaabi.info */ + +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['يناير','فبراير','مارس','ابريل','مايو','يونيو', + 'يوليو','اغطسس','سبتمبر','اكتوبر','نوفمبر','ديسمبر'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +}); diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bg.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bg.js new file mode 100644 index 000000000..26b08cf08 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bg.js @@ -0,0 +1,24 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +jQuery(function($){ + $.datepicker.regional['bg'] = { + closeText: 'затвори', + prevText: '<назад', + nextText: 'напред>', + nextBigText: '>>', + currentText: 'днес', + monthNames: ['Януари','Февруари','Март','Април','Май','Юни', + 'Юли','Август','Септември','Октомври','Ноември','Декември'], + monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни', + 'Юли','Авг','Сеп','Окт','Нов','Дек'], + dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'], + dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'], + dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'], + weekHeader: 'Wk', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bg']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bn.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bn.js new file mode 100644 index 000000000..9ecb0a45f --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-bn.js @@ -0,0 +1,21 @@ +/* Bengali initialisation for the jQuery UI date picker plugin. */ +/* Written by Rajib, Utpol and Shishir | http://github.com/rajibahmed */ +jQuery(function($){ + $.datepicker.regional['bn'] = { + closeText: 'সমাপ্ত', + prevText: 'পূর্ববর্তী', + nextText: 'পরবর্তী', + currentText: 'আজ', + monthNames: ['জানুয়ারী','ফেব্রুয়ারী','মার্চ','এপ্রিল','মে','জুন','জুলাই','আগস্ট','সেপ্টেম্বর','অক্টোবর','নভেম্বর','ডিসেম্বর'], + monthNamesShort: ['জানু', 'ফেব্রু', 'মার্চ', 'এপ্রি', 'মে', 'জুন','জুলা', 'আগ', 'সেপ', 'অক্টো', 'নভে', 'ডিসে'], + dayNames: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], + dayNamesShort: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], + dayNamesMin: ['র','সো','ম','বু','বৃ','শু','শ'], + weekHeader: 'সপ্তা', + dateFormat: 'দিিন/মাস/সাল্', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['bn']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-cs.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-cs.js new file mode 100644 index 000000000..a809e877d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-cs.js @@ -0,0 +1,23 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +jQuery(function($){ + $.datepicker.regional['cs'] = { + closeText: 'Zavřít', + prevText: '<Dříve', + nextText: 'Později>', + currentText: 'Nyní', + monthNames: ['leden','únor','březen','duben','květen','červen', + 'červenec','srpen','září','říjen','listopad','prosinec'], + monthNamesShort: ['led','úno','bře','dub','kvě','čer', + 'čvc','srp','zář','říj','lis','pro'], + dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + dayNamesMin: ['ne','po','út','st','čt','pá','so'], + weekHeader: 'Týd', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['cs']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-da.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-da.js new file mode 100644 index 000000000..ce33c030d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-da.js @@ -0,0 +1,23 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['da'] = { + closeText: 'Luk', + prevText: '<Forrige', + nextText: 'Næste>', + currentText: 'Idag', + monthNames: ['Januar','Februar','Marts','April','Maj','Juni', + 'Juli','August','September','Oktober','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + weekHeader: 'Uge', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['da']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-de.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-de.js new file mode 100644 index 000000000..896d351bf --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-de.js @@ -0,0 +1,23 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +jQuery(function($){ + $.datepicker.regional['de'] = { + closeText: 'schließen', + prevText: '<zurück', + nextText: 'Vor>', + currentText: 'heute', + monthNames: ['Januar','Februar','März','April','Mai','Juni', + 'Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', + 'Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], + weekHeader: 'KW', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['de']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-el.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-el.js new file mode 100644 index 000000000..6d775f995 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-el.js @@ -0,0 +1,23 @@ +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +jQuery(function($){ + $.datepicker.regional['el'] = { + closeText: 'Κλείσιμο', + prevText: 'Προηγούμενος', + nextText: 'Επόμενος', + currentText: 'Τρέχων Μήνας', + monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος', + 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'], + monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν', + 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'], + dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'], + dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'], + dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'], + weekHeader: 'Εβδ', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['el']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-es.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-es.js new file mode 100644 index 000000000..63368aecc --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-es.js @@ -0,0 +1,23 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['es'] = { + closeText: 'Cerrar', + prevText: '<Ant', + nextText: 'Sig>', + currentText: 'Hoy', + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', + 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', + 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], + dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['es']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fa.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fa.js new file mode 100644 index 000000000..be8acd2a5 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fa.js @@ -0,0 +1,59 @@ +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */ +/* Javad Mowlanezhad -- jmowla@gmail.com */ +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */ +jQuery(function($) { + $.datepicker.regional['fa'] = { + closeText: 'بستن', + prevText: '<قبلی', + nextText: 'بعدی>', + currentText: 'امروز', + monthNames: [ + 'فروردين', + 'ارديبهشت', + 'خرداد', + 'تير', + 'مرداد', + 'شهريور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند' + ], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: [ + 'يکشنبه', + 'دوشنبه', + 'سه‌شنبه', + 'چهارشنبه', + 'پنجشنبه', + 'جمعه', + 'شنبه' + ], + dayNamesShort: [ + 'ی', + 'د', + 'س', + 'چ', + 'پ', + 'ج', + 'ش' + ], + dayNamesMin: [ + 'ی', + 'د', + 'س', + 'چ', + 'پ', + 'ج', + 'ش' + ], + weekHeader: 'هف', + dateFormat: 'yy/mm/dd', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fa']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fr.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fr.js new file mode 100644 index 000000000..670cf8392 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-fr.js @@ -0,0 +1,25 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin', + 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-hu.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-hu.js new file mode 100644 index 000000000..b700a14b3 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-hu.js @@ -0,0 +1,23 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */ +jQuery(function($){ + $.datepicker.regional['hu'] = { + closeText: 'bezár', + 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: false, + showMonthAfterYear: true, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['hu']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-id.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-id.js new file mode 100644 index 000000000..4ad46f640 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-id.js @@ -0,0 +1,23 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['id'] = { + closeText: 'Tutup', + prevText: '<mundur', + nextText: 'maju>', + currentText: 'hari ini', + monthNames: ['Januari','Februari','Maret','April','Mei','Juni', + 'Juli','Agustus','September','Oktober','Nopember','Desember'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun', + 'Jul','Agus','Sep','Okt','Nop','Des'], + dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'], + dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'], + dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'], + weekHeader: 'Mg', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['id']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-it.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-it.js new file mode 100644 index 000000000..c9c08bb6b --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-it.js @@ -0,0 +1,23 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['it'] = { + closeText: 'Chiudi', + prevText: '<Prec', + nextText: 'Succ>', + currentText: 'Oggi', + monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno', + 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'], + monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu', + 'Lug','Ago','Set','Ott','Nov','Dic'], + dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'], + dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'], + dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['it']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ja.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ja.js new file mode 100644 index 000000000..afd298315 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ja.js @@ -0,0 +1,23 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +jQuery(function($){ + $.datepicker.regional['ja'] = { + closeText: '閉じる', + prevText: '<前', + nextText: '次>', + currentText: '今日', + monthNames: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + monthNamesShort: ['1月','2月','3月','4月','5月','6月', + '7月','8月','9月','10月','11月','12月'], + dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'], + dayNamesShort: ['日','月','火','水','木','金','土'], + dayNamesMin: ['日','月','火','水','木','金','土'], + weekHeader: '週', + dateFormat: 'yy/mm/dd', + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['ja']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ko.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ko.js new file mode 100644 index 000000000..04112424d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ko.js @@ -0,0 +1,23 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */ +jQuery(function($){ + $.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: false, + showMonthAfterYear: true, + yearSuffix: '년'}; + $.datepicker.setDefaults($.datepicker.regional['ko']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-nl.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-nl.js new file mode 100644 index 000000000..781fe6191 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-nl.js @@ -0,0 +1,23 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: '←', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', '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: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-no.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-no.js new file mode 100644 index 000000000..f41143e87 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-no.js @@ -0,0 +1,23 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +jQuery(function($){ + $.datepicker.regional['no'] = { + closeText: 'Lukk', + prevText: '«Forrige', + nextText: 'Neste»', + currentText: 'I dag', + monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'], + monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'], + dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'], + dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'], + dayNamesMin: ['sø','ma','ti','on','to','fr','lø'], + weekHeader: 'Uke', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + }; + $.datepicker.setDefaults($.datepicker.regional['no']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pl.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pl.js new file mode 100644 index 000000000..738d9b5eb --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pl.js @@ -0,0 +1,23 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '<Poprzedni', + nextText: 'Następny>', + currentText: 'Dziś', + monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', + 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'], + monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze', + 'Lip','Sie','Wrz','Pa','Lis','Gru'], + dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'], + dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'], + dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'], + weekHeader: 'Tydz', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pl']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt-br.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt-br.js new file mode 100644 index 000000000..0741892ab --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt-br.js @@ -0,0 +1,23 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['pt-BR'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Próximo>', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sm', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt-BR']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt.js new file mode 100644 index 000000000..98925b455 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-pt.js @@ -0,0 +1,22 @@ +/* Portuguese initialisation for the jQuery UI date picker plugin. */ +jQuery(function($){ + $.datepicker.regional['pt'] = { + closeText: 'Fechar', + prevText: '<Anterior', + nextText: 'Seguinte', + currentText: 'Hoje', + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', + 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun', + 'Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + weekHeader: 'Sem', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['pt']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ro.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ro.js new file mode 100644 index 000000000..8ce6cdc67 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ro.js @@ -0,0 +1,26 @@ +/* Romanian initialisation for the jQuery UI date picker plugin. + * + * Written by Edmond L. (ll_edmond@walla.com) + * and Ionut G. Stan (ionut.g.stan@gmail.com) + */ +jQuery(function($){ + $.datepicker.regional['ro'] = { + closeText: 'Închide', + prevText: '« Luna precedentă', + nextText: 'Luna următoare »', + currentText: 'Azi', + monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie', + 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'], + monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', + 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'], + dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'], + dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'], + weekHeader: 'Săpt', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ro']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ru.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ru.js new file mode 100644 index 000000000..2017e0537 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-ru.js @@ -0,0 +1,23 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Сегодня', + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', + 'Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Нед', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ru']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-sk.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-sk.js new file mode 100644 index 000000000..f1e12330d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-sk.js @@ -0,0 +1,23 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +jQuery(function($){ + $.datepicker.regional['sk'] = { + closeText: 'Zavrieť', + prevText: '<Predchádzajúci', + nextText: 'Nasledujúci>', + currentText: 'Dnes', + monthNames: ['Január','Február','Marec','Apríl','Máj','Jún', + 'Júl','August','September','Október','November','December'], + monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún', + 'Júl','Aug','Sep','Okt','Nov','Dec'], + dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'], + dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'], + dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'], + weekHeader: 'Ty', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['sk']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-th.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-th.js new file mode 100644 index 000000000..d57541f64 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-th.js @@ -0,0 +1,23 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +jQuery(function($){ + $.datepicker.regional['th'] = { + closeText: 'ปิด', + prevText: '« ย้อน', + nextText: 'ถัดไป »', + currentText: 'วันนี้', + monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน', + 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'], + monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.', + 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'], + dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'], + dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['th']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-tr.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-tr.js new file mode 100644 index 000000000..1b5cafc39 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-tr.js @@ -0,0 +1,23 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +jQuery(function($){ + $.datepicker.regional['tr'] = { + closeText: 'kapat', + prevText: '<geri', + nextText: 'ileri>', + currentText: 'bugün', + monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran', + 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'], + monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz', + 'Tem','Ağu','Eyl','Eki','Kas','Ara'], + dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'], + dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'], + weekHeader: 'Hf', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['tr']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-uk.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-uk.js new file mode 100644 index 000000000..31964af44 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-uk.js @@ -0,0 +1,24 @@ +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */ +/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['uk'] = { + closeText: 'Закрити', + prevText: '<', + nextText: '>', + currentText: 'Сьогодні', + monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень', + 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'], + monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер', + 'Лип','Сер','Вер','Жов','Лис','Гру'], + dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'], + dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'], + dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'], + weekHeader: 'Тиж', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['uk']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-vi.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-vi.js new file mode 100644 index 000000000..376583c5d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-vi.js @@ -0,0 +1,23 @@ +/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +jQuery(function($){ + $.datepicker.regional['vi'] = { + closeText: 'Đóng', + prevText: '<Trước', + nextText: 'Tiếp>', + currentText: 'Hôm nay', + monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu', + 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'], + monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', + 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'], + dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'], + dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + weekHeader: 'Tu', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['vi']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-zh-cn.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-zh-cn.js new file mode 100644 index 000000000..9bc93c5bc --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/datepicker/jquery.ui.datepicker-zh-cn.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-CN'] = { + closeText: '关闭', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy-mm-dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-CN']); +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/index.html b/assets/grocery_crud/js/jquery_plugins/ui/i18n/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/index.html b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ar.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ar.js new file mode 100644 index 000000000..773660cfb --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ar.js @@ -0,0 +1,12 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale ar, ar-eg + */ +/* Ashraf Kaabi -- mail@kaabi.info */ + +$.extend($.ui.multiselect.locale, { + addAll:'اضافة الكل', + removeAll:'حذف الكل', + itemsCount:'الاختيارات المحددة' +}); diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-de.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-de.js new file mode 100644 index 000000000..c7362038a --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-de.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale de, de-DE, de-AT, de-CH + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Alle hinzufügen', + removeAll:'Alle entfernen', + itemsCount:'Einträge ausgewählt' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-el.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-el.js new file mode 100644 index 000000000..596a64116 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-el.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale el, GR + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Επιλογή όλων', + removeAll:'Αφαίρεση όλων', + itemsCount:'επιλεγμένα στοιχεία' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-en.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-en.js new file mode 100644 index 000000000..4f9c5ff35 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-en.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale en, en-US + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Add all', + removeAll:'Remove all', + itemsCount:'items selected' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-es.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-es.js new file mode 100644 index 000000000..9eeaaab2a --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-es.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale es, es-ES + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Agregar todos', + removeAll:'Remover todos', + itemsCount:'Objetos seleccionados' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-fr.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-fr.js new file mode 100644 index 000000000..80ace0fe5 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-fr.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale fr, fr-FR, fr-CA + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Ajouter tout', + removeAll:'Supprimer tout', + itemsCount:'items sélectionnés' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-it.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-it.js new file mode 100644 index 000000000..bc2ba1b82 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-it.js @@ -0,0 +1,13 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale it, it-IT + */ + +$.extend($.ui.multiselect, { + locale: { + addAll:'Aggiungi tutti', + removeAll:'Rimuovi tutti', + itemsCount:'elementi selezionati' + } +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ja.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ja.js new file mode 100644 index 000000000..b01d276e4 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ja.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale ja, ja-JP + */ + +$.extend($.ui.multiselect.locale, { + addAll:'すべて選択', + removeAll:'すべて削除', + itemsCount:'個選択' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-pt-br.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-pt-br.js new file mode 100644 index 000000000..6144477f9 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-pt-br.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale pt, pt-BR + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Adicionar todos', + removeAll:'Remover todos', + itemsCount:'Itens selecionados' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ru.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ru.js new file mode 100644 index 000000000..fed827a55 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-ru.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale ru, ru-RU + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Добавить все', + removeAll:'Удалить все', + itemsCount:'элементов выбрано' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-uk.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-uk.js new file mode 100644 index 000000000..28a06d53d --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/multiselect/ui-multiselect-uk.js @@ -0,0 +1,11 @@ +/** + * Localization strings for the UI Multiselect widget + * + * @locale uk, uk-UK + */ + +$.extend($.ui.multiselect.locale, { + addAll:'Додати все', + removeAll:'Видалити все', + itemsCount:'елементів обрано' +}); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/index.html b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-af.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-af.js new file mode 100644 index 000000000..8d4dfa0dc --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-af.js @@ -0,0 +1,21 @@ +/* Afrikaans translation for the jQuery Timepicker Addon */ +/* Written by Deon Heyns */ +(function($) { + $.timepicker.regional['af'] = { + timeOnlyTitle: 'Kies Tyd', + timeText: 'Tyd ', + hourText: 'Ure ', + minuteText: 'Minute', + secondText: 'Sekondes', + millisecText: 'Millisekondes', + timezoneText: 'Tydsone', + currentText: 'Huidige Tyd', + closeText: 'Klaar', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['af']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ar.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ar.js new file mode 100644 index 000000000..540dd9e55 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ar.js @@ -0,0 +1,21 @@ +/* Arabic translation for the jQuery Timepicker Addon */ +/* Written by Ashraf Kaabi */ +(function($) { + $.timepicker.regional['ar'] = { + timeOnlyTitle: 'اختار الساعة', + timeText: 'الساعة', + hourText: 'الساعات', + minuteText: 'الدقائق', + secondText: 'الثواني', + millisecText: 'ميلي ثانية', + timezoneText: 'توقيت', + currentText: 'الآن', + closeText: 'الانتهاء', + timeFormat: 'hh:mm', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ar']); +})(jQuery); diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-bg.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-bg.js new file mode 100644 index 000000000..1ccf6dbe6 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-bg.js @@ -0,0 +1,21 @@ +/* Bulgarian translation for the jQuery Timepicker Addon */ +/* Written by Plamen Kovandjiev */ +(function($) { + $.timepicker.regional['bg'] = { + timeOnlyTitle: 'Изберете време', + timeText: 'Време', + hourText: 'Час', + minuteText: 'Минути', + secondText: 'Секунди', + millisecText: 'Милисекунди', + timezoneText: 'Часови пояс', + currentText: 'Сега', + closeText: 'Затвори', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['bg']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-cs.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-cs.js new file mode 100644 index 000000000..de461feb6 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-cs.js @@ -0,0 +1,21 @@ +/* Czech translation for the jQuery Timepicker Addon */ +/* Written by Ondřej Vodáček */ +(function($) { + $.timepicker.regional['cs'] = { + timeOnlyTitle: 'Vyberte čas', + timeText: 'Čas', + hourText: 'Hodiny', + minuteText: 'Minuty', + secondText: 'Vteřiny', + millisecText: 'Milisekundy', + timezoneText: 'Časové pásmo', + currentText: 'Nyní', + closeText: 'Zavřít', + timeFormat: 'h:m', + amNames: ['dop.', 'AM', 'A'], + pmNames: ['odp.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['cs']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-de.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-de.js new file mode 100644 index 000000000..b130659b0 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-de.js @@ -0,0 +1,21 @@ +/* German translation for the jQuery Timepicker Addon */ +/* Written by Marvin */ +(function($) { + $.timepicker.regional['de'] = { + timeOnlyTitle: 'Zeit Wählen', + timeText: 'Zeit', + hourText: 'Stunde', + minuteText: 'Minute', + secondText: 'Sekunde', + millisecText: 'Millisekunde', + timezoneText: 'Zeitzone', + currentText: 'Jetzt', + closeText: 'Fertig', + timeFormat: 'hh:mm tt', + amNames: ['vorm.', 'AM', 'A'], + pmNames: ['nachm.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['de']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-el.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-el.js new file mode 100644 index 000000000..99cc5d6de --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-el.js @@ -0,0 +1,21 @@ +/* Hellenic translation for the jQuery Timepicker Addon */ +/* Written by Christos Pontikis */ +(function($) { + $.timepicker.regional['el'] = { + timeOnlyTitle: 'Επιλογή ώρας', + timeText: 'Ώρα', + hourText: 'Ώρες', + minuteText: 'Λεπτά', + secondText: 'Δευτερόλεπτα', + millisecText: 'μιλιδευτερόλεπτο', + timezoneText: 'Ζώνη ώρας', + currentText: 'Τώρα', + closeText: 'Κλείσιμο', + timeFormat: 'hh:mm', + amNames: ['π.μ.', 'AM', 'A'], + pmNames: ['μ.μ.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['el']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-es.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-es.js new file mode 100644 index 000000000..831140322 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-es.js @@ -0,0 +1,21 @@ +/* Spanish translation for the jQuery Timepicker Addon */ +/* Written by Ianaré Sévi */ +(function($) { + $.timepicker.regional['es'] = { + timeOnlyTitle: 'Elegir una hora', + timeText: 'Hora', + hourText: 'Horas', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milisegundos', + timezoneText: 'Huso horario', + currentText: 'Ahora', + closeText: 'Cerrar', + timeFormat: 'hh:mm', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['es']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-fr.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-fr.js new file mode 100644 index 000000000..2ccac520e --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-fr.js @@ -0,0 +1,21 @@ +/* French translation for the jQuery Timepicker Addon */ +/* Written by Thomas Lété */ +(function($) { + $.timepicker.regional['fr'] = { + timeOnlyTitle: 'Choisir une heure', + timeText: 'Heure', + hourText: 'Heures', + minuteText: 'Minutes', + secondText: 'Secondes', + millisecText: 'Millisecondes', + timezoneText: 'Fuseau horaire', + currentText: 'Maintenant', + closeText: 'Terminé', + timeFormat: 'hh:mm', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['fr']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-hu.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-hu.js new file mode 100644 index 000000000..d78178179 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-hu.js @@ -0,0 +1,21 @@ +/* Hungarian translation for the jQuery Timepicker Addon */ +/* Written by Vas Gábor */ +(function($) { + $.timepicker.regional['hu'] = { + timeOnlyTitle: 'Válasszon időpontot', + timeText: 'Idő', + hourText: 'Óra', + minuteText: 'Perc', + secondText: 'Másodperc', + millisecText: 'Milliszekundumos', + timezoneText: 'Időzóna', + currentText: 'Most', + closeText: 'Kész', + timeFormat: 'hh:mm tt', + amNames: ['de.', 'AM', 'A'], + pmNames: ['du.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['hu']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-id.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-id.js new file mode 100644 index 000000000..30eed80f1 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-id.js @@ -0,0 +1,21 @@ +/* Indonesian translation for the jQuery Timepicker Addon */ +/* Written by Nia */ +(function($) { + $.timepicker.regional['id'] = { + timeOnlyTitle: 'Pilih Waktu', + timeText: 'Waktu', + hourText: 'Pukul', + minuteText: 'Menit', + secondText: 'Detik', + millisecText: 'Milidetik', + timezoneText: 'Zona Waktu', + currentText: 'Sekarang', + closeText: 'OK', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['id']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-it.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-it.js new file mode 100644 index 000000000..be99daa87 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-it.js @@ -0,0 +1,21 @@ +/* Italian translation for the jQuery Timepicker Addon */ +/* Written by Marco "logicoder" Del Tongo */ +(function($) { + $.timepicker.regional['it'] = { + timeOnlyTitle: 'Scegli orario', + timeText: 'Orario', + hourText: 'Ora', + minuteText: 'Minuto', + secondText: 'Secondo', + millisecText: 'Millisecondo', + timezoneText: 'Fuso orario', + currentText: 'Adesso', + closeText: 'Chiudi', + timeFormat: 'hh:mm', + amNames: ['m.', 'AM', 'A'], + pmNames: ['p.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['it']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ja.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ja.js new file mode 100644 index 000000000..2004b1663 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ja.js @@ -0,0 +1,21 @@ +/* Japanese translation for the jQuery Timepicker Addon */ +/* Written by Jun Omae */ +(function($) { + $.timepicker.regional['ja'] = { + timeOnlyTitle: '時間を選択', + timeText: '時間', + hourText: '時', + minuteText: '分', + secondText: '秒', + millisecText: 'ミリ秒', + timezoneText: 'タイムゾーン', + currentText: '現時刻', + closeText: '閉じる', + timeFormat: 'hh:mm tt', + amNames: ['午前', 'AM', 'A'], + pmNames: ['午後', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ja']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ko.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ko.js new file mode 100644 index 000000000..c238d878e --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ko.js @@ -0,0 +1,21 @@ +/* Korean translation for the jQuery Timepicker Addon */ +/* Written by Genie */ +(function($) { + $.timepicker.regional['ko'] = { + timeOnlyTitle: '시간 선택', + timeText: '시간', + hourText: '시', + minuteText: '분', + secondText: '초', + millisecText: '밀리초', + timezoneText: '표준 시간대', + currentText: '현재 시각', + closeText: '닫기', + timeFormat: 'tt h:mm', + amNames: ['오전', 'AM', 'A'], + pmNames: ['오후', 'PM', 'P'], + ampm: true, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ko']); +})(jQuery); diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-nl.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-nl.js new file mode 100644 index 000000000..f6afd6207 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-nl.js @@ -0,0 +1,21 @@ +/* Dutch translation for the jQuery Timepicker Addon */ +/* Written by Martijn van der Lee */ +(function($) { + $.timepicker.regional['nl'] = { + timeOnlyTitle: 'Tijdstip', + timeText: 'Tijd', + hourText: 'Uur', + minuteText: 'Minuut', + secondText: 'Seconde', + millisecText: 'Milliseconde', + timezoneText: 'Tijdzone', + currentText: 'Vandaag', + closeText: 'Sluiten', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['nl']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-no.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-no.js new file mode 100644 index 000000000..4f24e5730 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-no.js @@ -0,0 +1,20 @@ +/* Norwegian translation for the jQuery Timepicker Addon */ +/* Written by Morten Hauan (http://hauan.me) */ +(function($) { + $.timepicker.regional['no'] = { + timeOnlyTitle: 'Velg tid', + timeText: 'Tid', + hourText: 'Time', + minuteText: 'Minutt', + secondText: 'Sekund', + millisecText: 'Millisekund', + timezoneText: 'Tidssone', + currentText: 'Nå', + closeText: 'Lukk', + timeFormat: 'HH:mm', + amNames: ['am', 'AM', 'A'], + pmNames: ['pm', 'PM', 'P'], + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['no']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pl.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pl.js new file mode 100644 index 000000000..9aed6a076 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pl.js @@ -0,0 +1,21 @@ +/* Polish translation for the jQuery Timepicker Addon */ +/* Written by Michał Pena */ +(function($) { + $.timepicker.regional['pl'] = { + timeOnlyTitle: 'Wybierz godzinę', + timeText: 'Czas', + hourText: 'Godzina', + minuteText: 'Minuta', + secondText: 'Sekunda', + millisecText: 'Milisekunda', + timezoneText: 'Strefa czasowa', + currentText: 'Teraz', + closeText: 'Gotowe', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pl']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt-br.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt-br.js new file mode 100644 index 000000000..5b366e372 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt-br.js @@ -0,0 +1,21 @@ +/* Brazilian Portuguese translation for the jQuery Timepicker Addon */ +/* Written by Diogo Damiani (diogodamiani@gmail.com) */ +(function($) { + $.timepicker.regional['pt-BR'] = { + timeOnlyTitle: 'Escolha a horário', + timeText: 'Horário', + hourText: 'Hora', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milissegundos', + timezoneText: 'Fuso horário', + currentText: 'Agora', + closeText: 'Fechar', + timeFormat: 'hh:mm', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pt-BR']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt.js new file mode 100644 index 000000000..9f277e022 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-pt.js @@ -0,0 +1,21 @@ +/* Portuguese translation for the jQuery Timepicker Addon */ +/* Written by Luan Almeida */ +(function($) { + $.timepicker.regional['pt'] = { + timeOnlyTitle: 'Escolha uma hora', + timeText: 'Hora', + hourText: 'Horas', + minuteText: 'Minutos', + secondText: 'Segundos', + millisecText: 'Milissegundos', + timezoneText: 'Fuso horário', + currentText: 'Agora', + closeText: 'Fechar', + timeFormat: 'hh:mm', + amNames: ['a.m.', 'AM', 'A'], + pmNames: ['p.m.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['pt']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ro.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ro.js new file mode 100644 index 000000000..98d92e7b8 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ro.js @@ -0,0 +1,21 @@ +/* Romanian translation for the jQuery Timepicker Addon */ +/* Written by Romeo Adrian Cioaba */ +(function($) { + $.timepicker.regional['ro'] = { + timeOnlyTitle: 'Alegeţi o oră', + timeText: 'Timp', + hourText: 'Ore', + minuteText: 'Minute', + secondText: 'Secunde', + millisecText: 'Milisecunde', + timezoneText: 'Fus orar', + currentText: 'Acum', + closeText: 'Închide', + timeFormat: 'hh:mm', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ro']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ru.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ru.js new file mode 100644 index 000000000..972b84e27 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-ru.js @@ -0,0 +1,21 @@ +/* Russian translation for the jQuery Timepicker Addon */ +/* Written by Trent Richardson */ +(function($) { + $.timepicker.regional['ru'] = { + timeOnlyTitle: 'Выберите время', + timeText: 'Время', + hourText: 'Часы', + minuteText: 'Минуты', + secondText: 'Секунды', + millisecText: 'Миллисекунды', + timezoneText: 'Часовой пояс', + currentText: 'Сейчас', + closeText: 'Закрыть', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['ru']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-sk.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-sk.js new file mode 100644 index 000000000..e978ec603 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-sk.js @@ -0,0 +1,21 @@ +/* Slovak translation for the jQuery Timepicker Addon */ +/* Written by David Vallner */ +(function($) { + $.timepicker.regional['sk'] = { + timeOnlyTitle: 'Zvoľte čas', + timeText: 'Čas', + hourText: 'Hodiny', + minuteText: 'Minúty', + secondText: 'Sekundy', + millisecText: 'Milisekundy', + timezoneText: 'Časové pásmo', + currentText: 'Teraz', + closeText: 'Zavrieť', + timeFormat: 'h:m', + amNames: ['dop.', 'AM', 'A'], + pmNames: ['pop.', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['sk']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-tr.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-tr.js new file mode 100644 index 000000000..05f7fd1dd --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-tr.js @@ -0,0 +1,21 @@ +/* Turkish translation for the jQuery Timepicker Addon */ +/* Written by Fehmi Can Saglam, Edited by Goktug Ozturk */ +(function($) { + $.timepicker.regional['tr'] = { + timeOnlyTitle: 'Zaman Seçiniz', + timeText: 'Zaman', + hourText: 'Saat', + minuteText: 'Dakika', + secondText: 'Saniye', + millisecText: 'Milisaniye', + timezoneText: 'Zaman Dilimi', + currentText: 'Şu an', + closeText: 'Tamam', + timeFormat: 'hh:mm', + amNames: ['ÖÖ', 'Ö'], + pmNames: ['ÖS', 'S'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['tr']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-uk.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-uk.js new file mode 100644 index 000000000..a7ac61ce5 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-uk.js @@ -0,0 +1,21 @@ +/* Ukrainian translation for the jQuery Timepicker Addon */ +/* Written by Sergey Noskov */ +(function($) { + $.timepicker.regional['uk'] = { + timeOnlyTitle: 'Виберіть час', + timeText: 'Час', + hourText: 'Години', + minuteText: 'Хвилини', + secondText: 'Секунди', + millisecText: 'Мілісекунди', + timezoneText: 'Часовий пояс', + currentText: 'Зараз', + closeText: 'Закрити', + timeFormat: 'hh:mm tt', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['uk']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-vi.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-vi.js new file mode 100644 index 000000000..64fcf0515 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-vi.js @@ -0,0 +1,21 @@ +/* Vietnamese translation for the jQuery Timepicker Addon */ +/* Written by Nguyen Dinh Trung */ +(function($) { + $.timepicker.regional['vi'] = { + timeOnlyTitle: 'Chọn giờ', + timeText: 'Thời gian', + hourText: 'Giờ', + minuteText: 'Phút', + secondText: 'Giây', + millisecText: 'Phần nghìn giây', + timezoneText: 'Múi giờ', + currentText: 'Hiện thời', + closeText: 'Đóng', + timeFormat: 'h:m', + amNames: ['SA', 'AM', 'A'], + pmNames: ['CH', 'PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['vi']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-zh-cn.js b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-zh-cn.js new file mode 100644 index 000000000..f8f101480 --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/i18n/timepicker/jquery-ui-timepicker-zh-cn.js @@ -0,0 +1,21 @@ +/* Simplified Chinese translation for the jQuery Timepicker Addon / +/ Written by Will Lu */ +(function($) { + $.timepicker.regional['zh-CN'] = { + timeOnlyTitle: '选择时间', + timeText: '时间', + hourText: '小时', + minuteText: '分钟', + secondText: '秒钟', + millisecText: '微秒', + timezoneText: '时区', + currentText: '现在时间', + closeText: '关闭', + timeFormat: 'hh:mm', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + ampm: false, + isRTL: false + }; + $.timepicker.setDefaults($.timepicker.regional['zh-CN']); +})(jQuery); \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/index.html b/assets/grocery_crud/js/jquery_plugins/ui/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/js/jquery_plugins/ui/jquery-ui-1.10.3.custom.min.js b/assets/grocery_crud/js/jquery_plugins/ui/jquery-ui-1.10.3.custom.min.js new file mode 100644 index 000000000..df25d36ea --- /dev/null +++ b/assets/grocery_crud/js/jquery_plugins/ui/jquery-ui-1.10.3.custom.min.js @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.10.3 - 2013-06-10 +* http://jqueryui.com +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js +* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ + +(function(e,t){function i(t,i){var a,n,r,o=t.nodeName.toLowerCase();return"area"===o?(a=t.parentNode,n=a.name,t.href&&n&&"map"===a.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var a=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,a,n=e(this[0]);n.length&&n[0]!==document;){if(s=n.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(a=parseInt(n.css("zIndex"),10),!isNaN(a)&&0!==a))return a;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),a=isNaN(s);return(a||s>=0)&&i(t,!a)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function a(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,a(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,a(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var a,n=e.ui[t].prototype;for(a in s)n.plugins[a]=n.plugins[a]||[],n.plugins[a].push([i,s[a]])},call:function(e,t,i){var s,a=e.plugins[t];if(a&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;a.length>s;s++)e.options[a[s][0]]&&a[s][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",a=!1;return t[s]>0?!0:(t[s]=1,a=t[s]>0,t[s]=0,a)}})})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,n=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(a){}n(t)},e.widget=function(i,s,n){var a,r,o,h,l={},u=i.split(".")[0];i=i.split(".")[1],a=u+"-"+i,n||(n=s,s=e.Widget),e.expr[":"][a.toLowerCase()]=function(t){return!!e.data(t,a)},e[u]=e[u]||{},r=e[u][i],o=e[u][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(n,function(i,n){return e.isFunction(n)?(l[i]=function(){var e=function(){return s.prototype[i].apply(this,arguments)},t=function(e){return s.prototype[i].apply(this,e)};return function(){var i,s=this._super,a=this._superApply;return this._super=e,this._superApply=t,i=n.apply(this,arguments),this._super=s,this._superApply=a,i}}(),t):(l[i]=n,t)}),o.prototype=e.widget.extend(h,{widgetEventPrefix:r?h.widgetEventPrefix:i},l,{constructor:o,namespace:u,widgetName:i,widgetFullName:a}),r?(e.each(r._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete r._childConstructors):s._childConstructors.push(o),e.widget.bridge(i,o)},e.widget.extend=function(i){for(var n,a,r=s.call(arguments,1),o=0,h=r.length;h>o;o++)for(n in r[o])a=r[o][n],r[o].hasOwnProperty(n)&&a!==t&&(i[n]=e.isPlainObject(a)?e.isPlainObject(i[n])?e.widget.extend({},i[n],a):e.widget.extend({},a):a);return i},e.widget.bridge=function(i,n){var a=n.prototype.widgetFullName||i;e.fn[i]=function(r){var o="string"==typeof r,h=s.call(arguments,1),l=this;return r=!o&&h.length?e.widget.extend.apply(null,[r].concat(h)):r,o?this.each(function(){var s,n=e.data(this,a);return n?e.isFunction(n[r])&&"_"!==r.charAt(0)?(s=n[r].apply(n,h),s!==n&&s!==t?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):t):e.error("no such method '"+r+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+r+"'")}):this.each(function(){var t=e.data(this,a);t?t.option(r||{})._init():e.data(this,a,new n(r,this))}),l}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var n,a,r,o=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(o={},n=i.split("."),i=n.shift(),n.length){for(a=o[i]=e.widget.extend({},this.options[i]),r=0;n.length-1>r;r++)a[n[r]]=a[n[r]]||{},a=a[n[r]];if(i=n.pop(),s===t)return a[i]===t?null:a[i];a[i]=s}else{if(s===t)return this.options[i]===t?null:this.options[i];o[i]=s}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var a,r=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=a=e(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,a=this.widget()),e.each(n,function(n,o){function h(){return i||r.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?r[o]:o).apply(r,arguments):t}"string"!=typeof o&&(h.guid=o.guid=o.guid||h.guid||e.guid++);var l=n.match(/^(\w+)\s*(.*)$/),u=l[1]+r.eventNamespace,c=l[2];c?a.delegate(c,u,h):s.bind(u,h)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,r=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(r)&&r.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var r,o=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),r=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),r&&e.effects&&e.effects.effect[o]?s[t](n):o!==t&&s[o]?s[o](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}})})(jQuery);(function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("
"),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},getScrollInfo:function(e){var i=e.isWindow?"":e.element.css("overflow-x"),s=e.isWindow?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widths?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(h.horizontal="center"),d>m&&m>r(n+a)&&(h.vertical="middle"),h.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,h)}),c.offset(t.extend(C,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-o-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-o-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-o-a,t.top+p+f+m>c&&(0>s||r(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,t.top+p+f+m>u&&(i>0||u>r(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(e){e.widget("ui.draggable",e.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(t){var i=this.options;return this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){e("
").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||e.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1):!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,e(document).width()-this.helperProportions.width-this.margins.left,(e(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(t){var i,s,n,a,o=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=t.pageX,l=t.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s]),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i){var s=e(this).data("ui-draggable"),n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i){var s=e(this).data("ui-draggable"),n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i){var s=e(this).data("ui-draggable"),n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(){var t=e("body"),i=e(this).data("ui-draggable").options;t.css("cursor")&&(i._cursor=t.css("cursor")),t.css("cursor",i.cursor)},stop:function(){var t=e(this).data("ui-draggable").options;t._cursor&&e("body").css("cursor",t._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i){var s=e(i.helper),n=e(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(t,i){var s=e(this).data("ui-draggable").options;s._opacity&&e(i.helper).css("opacity",s._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(){var t=e(this).data("ui-draggable");t.scrollParent[0]!==document&&"HTML"!==t.scrollParent[0].tagName&&(t.overflowOffset=t.scrollParent.offset())},drag:function(t){var i=e(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-t.pageY=0;c--)r=p.snapElements[c].left,h=r+p.snapElements[c].width,l=p.snapElements[c].top,u=l+p.snapElements[c].height,r-m>v||g>h+m||l-m>y||b>u+m||!e.contains(p.snapElements[c].item.ownerDocument,p.snapElements[c].item)?(p.snapElements[c].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,t,e.extend(p._uiHash(),{snapItem:p.snapElements[c].item})),p.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(s=m>=Math.abs(l-y),n=m>=Math.abs(u-b),a=m>=Math.abs(r-v),o=m>=Math.abs(h-g),s&&(i.position.top=p._convertPositionTo("relative",{top:l-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:u,left:0}).top-p.margins.top),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h}).left-p.margins.left)),d=s||n||a||o,"outer"!==f.snapMode&&(s=m>=Math.abs(l-b),n=m>=Math.abs(u-y),a=m>=Math.abs(r-g),o=m>=Math.abs(h-v),s&&(i.position.top=p._convertPositionTo("relative",{top:l,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:u-p.helperProportions.height,left:0}).top-p.margins.top),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[c].snapping&&(s||n||a||o||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,t,e.extend(p._uiHash(),{snapItem:p.snapElements[c].item})),p.snapElements[c].snapping=s||n||a||o||d)}}),e.ui.plugin.add("draggable","stack",{start:function(){var t,i=this.data("ui-draggable").options,s=e.makeArray(e(i.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});s.length&&(t=parseInt(e(s[0]).css("zIndex"),10)||0,e(s).each(function(i){e(this).css("zIndex",t+i)}),this.css("zIndex",t+s.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i){var s=e(i.helper),n=e(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(t,i){var s=e(this).data("ui-draggable").options;s._zIndex&&e(i.helper).css("zIndex",s._zIndex)}})})(jQuery);(function(e){function t(e,t,i){return e>t&&t+i>e}e.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t=this.options,i=t.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(i)?i:function(e){return e.is(i)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},e.ui.ddmanager.droppables[t.scope]=e.ui.ddmanager.droppables[t.scope]||[],e.ui.ddmanager.droppables[t.scope].push(this),t.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var t=0,i=e.ui.ddmanager.droppables[this.options.scope];i.length>t;t++)i[t]===this&&i.splice(t,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){"accept"===t&&(this.accept=e.isFunction(i)?i:function(e){return e.is(i)}),e.Widget.prototype._setOption.apply(this,arguments)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var t=e.data(this,"ui-droppable");return t.options.greedy&&!t.options.disabled&&t.options.scope===s.options.scope&&t.accept.call(t.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(t,{offset:t.element.offset()}),t.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(e,i,s){if(!i.offset)return!1;var n,a,o=(e.positionAbs||e.position.absolute).left,r=o+e.helperProportions.width,h=(e.positionAbs||e.position.absolute).top,l=h+e.helperProportions.height,u=i.offset.left,c=u+i.proportions.width,d=i.offset.top,p=d+i.proportions.height;switch(s){case"fit":return o>=u&&c>=r&&h>=d&&p>=l;case"intersect":return o+e.helperProportions.width/2>u&&c>r-e.helperProportions.width/2&&h+e.helperProportions.height/2>d&&p>l-e.helperProportions.height/2;case"pointer":return n=(e.positionAbs||e.position.absolute).left+(e.clickOffset||e.offset.click).left,a=(e.positionAbs||e.position.absolute).top+(e.clickOffset||e.offset.click).top,t(a,d,i.proportions.height)&&t(n,u,i.proportions.width);case"touch":return(h>=d&&p>=h||l>=d&&p>=l||d>h&&l>p)&&(o>=u&&c>=o||r>=u&&c>=r||u>o&&r>c);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions.height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions={width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight})}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e.data(this,"ui-droppable").options.scope===n}),a.length&&(s=e.data(a[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}}})(jQuery);(function(e){function t(e){return parseInt(e,10)||0}function i(e){return!isNaN(parseInt(e,10))}e.widget("ui.resizable",e.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("
"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=e(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,a,o=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=t(this.helper.css("left")),n=t(this.helper.css("top")),o.containment&&(s+=e(o.containment).scrollLeft()||0,n+=e(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,a=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===a?this.axis+"-resize":a),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(t){var i,s=this.helper,n={},a=this.originalMousePosition,o=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,u=this.size.height,c=t.pageX-a.left||0,d=t.pageY-a.top||0,p=this._change[o];return p?(i=p.apply(this,[t,c,d]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==u&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(n)||this._trigger("resize",t,this.ui()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&e.ui.hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,s,n,a,o,r=this.options;o={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||e)&&(t=o.minHeight*this.aspectRatio,n=o.minWidth/this.aspectRatio,s=o.maxHeight*this.aspectRatio,a=o.maxWidth/this.aspectRatio,t>o.minWidth&&(o.minWidth=t),n>o.minHeight&&(o.minHeight=n),o.maxWidth>s&&(o.maxWidth=s),o.maxHeight>a&&(o.maxHeight=a)),this._vBoundaries=o},_updateCache:function(e){this.offset=this.helper.offset(),i(e.left)&&(this.position.left=e.left),i(e.top)&&(this.position.top=e.top),i(e.height)&&(this.size.height=e.height),i(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,s=this.size,n=this.axis;return i(e.height)?e.width=e.height*this.aspectRatio:i(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===n&&(e.left=t.left+(s.width-e.width),e.top=null),"nw"===n&&(e.top=t.top+(s.height-e.height),e.left=t.left+(s.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,s=this.axis,n=i(e.width)&&t.maxWidth&&t.maxWidthe.width,r=i(e.height)&&t.minHeight&&t.minHeight>e.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,u=/sw|nw|w/.test(s),c=/nw|ne|n/.test(s);return o&&(e.width=t.minWidth),r&&(e.height=t.minHeight),n&&(e.width=t.maxWidth),a&&(e.height=t.maxHeight),o&&u&&(e.left=h-t.minWidth),n&&u&&(e.left=h-t.maxWidth),r&&c&&(e.top=l-t.minHeight),a&&c&&(e.top=l-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var e,t,i,s,n,a=this.helper||this.element;for(e=0;this._proportionallyResizeElements.length>e;e++){if(n=this._proportionallyResizeElements[e],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],t=0;i.length>t;t++)this.borderDif[t]=(parseInt(i[t],10)||0)+(parseInt(s[t],10)||0);n.css({height:a.height()-this.borderDif[0]-this.borderDif[2]||0,width:a.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("
"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&e.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,a,o,r,h,l=e(this).data("ui-resizable"),u=l.options,c=l.element,d=u.containment,p=d instanceof e?d.get(0):/parent/.test(d)?c.parent().get(0):d;p&&(l.containerElement=e(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(i=e(p),s=[],e(["Top","Right","Left","Bottom"]).each(function(e,n){s[e]=t(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,a=l.containerSize.height,o=l.containerSize.width,r=e.ui.hasScroll(p,"left")?p.scrollWidth:o,h=e.ui.hasScroll(p)?p.scrollHeight:a,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(t){var i,s,n,a,o=e(this).data("ui-resizable"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,c={top:0,left:0},d=o.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(c=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-c.left),u&&(o.size.height=o.size.width/o.aspectRatio),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio),o.position.top=o._helper?h.top:0),o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top,i=Math.abs((o._helper?o.offset.left-c.left:o.offset.left-c.left)+o.sizeDiff.width),s=Math.abs((o._helper?o.offset.top-c.top:o.offset.top-h.top)+o.sizeDiff.height),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a&&(i-=o.parentData.left),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio))},stop:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).data("ui-resizable"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).data("ui-resizable");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).data("ui-resizable");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size,n=t.originalSize,a=t.originalPosition,o=t.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,u=Math.round((s.width-n.width)/h)*h,c=Math.round((s.height-n.height)/l)*l,d=n.width+u,p=n.height+c,f=i.maxWidth&&d>i.maxWidth,m=i.maxHeight&&p>i.maxHeight,g=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,g&&(d+=h),v&&(p+=l),f&&(d-=h),m&&(p-=l),/^(se|s|e)$/.test(o)?(t.size.width=d,t.size.height=p):/^(ne)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.top=a.top-c):/^(sw)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.left=a.left-u):(t.size.width=d,t.size.height=p,t.position.top=a.top-c,t.position.left=a.left-u)}})})(jQuery);(function(e){e.widget("ui.selectable",e.ui.mouse,{version:"1.10.3",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("
")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):undefined}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}})})(jQuery);(function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,a.widgetName+"-item")===a?(s=t(this),!1):undefined}),t.data(e.target,a.widgetName+"-item")===a&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=t("").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!o.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=t.left,o=a+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>a&&o>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,a=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return n?this.floating?o&&"right"===o||"down"===a?2:1:a&&("down"===a?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return this.floating&&a?"right"===a&&s||"left"===a&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,a,o=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)a=t.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&r.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){o.push(this)});return t(o)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)a=t.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(u.push([t.isFunction(a.options.items)?a.options.items.call(a.element[0],e,{item:this.currentItem}):t(a.options.items,a.element),a]),this.containers.push(a));for(i=u.length-1;i>=0;i--)for(o=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",o),c.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t(" ",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,a,o,r,h,l,c,u,d,p,f=null,m=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],m=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[m].containerCache.over||(this.containers[m]._trigger("over",s,this._uiHash(this)),this.containers[m].containerCache.over=1);else{for(o=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],a=this.items.length-1;a>=0;a--)t.contains(this.containers[m].element[0],this.items[a].item[0])&&this.items[a].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[a].top,this.items[a].height))&&(u=this.items[a].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[a][l]-c)&&(d=!0,u+=this.items[a][l]),o>Math.abs(u-c)&&(o=Math.abs(u-c),r=this.items[a],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[m])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[m].element,!0),this._trigger("change",s,this._uiHash()),this.containers[m]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[m],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[m]._trigger("over",s,this._uiHash(this)),this.containers[m].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,a=e.pageX,o=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(a=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})})(jQuery);(function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),a=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(t(e.target).attr("tabIndex",-1),t(a).attr("tabIndex",0),a.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,a=this.element.parent(),o=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),a=n.attr("id");s||(s=o+"-header-"+e,i.attr("id",s)),a||(a=o+"-panel-"+e,n.attr("id",a)),i.attr("aria-controls",a),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=a.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?t():n,newPanel:r};e.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var a,o,r,h=this,l=0,c=t.length&&(!e.length||t.index()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var a=t.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:e=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case a.UP:e=!0,this._keyEvent("previous",n);break;case a.DOWN:e=!0,this._keyEvent("next",n);break;case a.ENTER:case a.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("
');delete this._.started;}},getClick:function(){if(!this._.click)this._.click=e.addFunction(function(m){var o=this;var n=true;if(o.multiSelect)n=o.toggle(m);else o.mark(m);if(o.onClick)o.onClick(m,n);},this);return this._.click;}},proto:{add:function(m,n,o){var r=this;var p=r._.pendingHtml,q=e.getNextId();if(!r._.started){p.push('
'+'',j=a.config.wsc_customLoaderScript||g+'//loader.webspellchecker.net/sproxy_fck/sproxy.php'+'?plugin=fck2'+'&customerid='+a.config.wsc_customerId+'&cmd=script&doc=wsc&schema=22';if(a.config.wsc_customLoaderScript)h+='

'+a.lang.spellCheck.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+'

';function k(m,n){var o=0;return function(){if(typeof window.doSpell=='function'){if(typeof f!='undefined')window.clearInterval(f);l(m);}else if(o++==180)window._cancelOnError(n);};};window._cancelOnError=function(m){if(typeof window.WSC_Error=='undefined'){CKEDITOR.document.getById(c).setStyle('display','none');var n=CKEDITOR.document.getById(e);n.setStyle('display','block');n.setHtml(m||a.lang.spellCheck.notAvailable);}};function l(m){var n=new window._SP_FCK_LangCompare(),o=CKEDITOR.getUrl(a.plugins.wsc.path+'dialogs/'),p=o+'tmpFrameset.html';window.gFCKPluginName='wsc';n.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:d,lang:a.config.wsc_lang||n.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||n.getSPLangCode(a.langCode),winType:c,onCancel:function(){m.hide();},onFinish:function(q){a.focus();m.getParentEditor().setData(q.value);m.hide();},staticFrame:p,framesetPath:p,iframePath:o+'ciframe.html',schemaURI:o+'wsc.css',userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(','),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(e).setStyle('display','none');CKEDITOR.document.getById(c).setStyle('display','block');};return{title:a.config.wsc_dialogTitle||a.lang.spellCheck.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var m=this.getContentElement('general','content').getElement();m.setHtml(i);m.getChild(2).setStyle('height',this._.contentSize.height+'px'); +if(typeof window.doSpell!='function')CKEDITOR.document.getHead().append(CKEDITOR.document.createElement('script',{attributes:{type:'text/javascript',src:j}}));var n=a.getData();CKEDITOR.document.getById(d).setValue(n);f=window.setInterval(k(this,h),250);},onHide:function(){window.ooo=undefined;window.int_framsetLoaded=undefined;window.framesetLoaded=undefined;window.is_window_opened=false;},contents:[{id:'general',label:a.config.wsc_dialogTitle||a.lang.spellCheck.title,padding:0,elements:[{type:'html',id:'content',html:''}]}]};});CKEDITOR.dialog.on('resize',function(a){var b=a.data,c=b.dialog;if(c._.name=='checkspell'){var d=c.getContentElement('general','content').getElement(),e=d&&d.getChild(2);e&&e.setSize('height',b.height);e&&e.setSize('width',b.width);}}); diff --git a/assets/grocery_crud/texteditor/ckeditor/plugins/xml/plugin.js b/assets/grocery_crud/texteditor/ckeditor/plugins/xml/plugin.js new file mode 100644 index 000000000..d1dc6a209 --- /dev/null +++ b/assets/grocery_crud/texteditor/ckeditor/plugins/xml/plugin.js @@ -0,0 +1,6 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +(function(){CKEDITOR.plugins.add('xml',{});CKEDITOR.xml=function(a){var b=null;if(typeof a=='object')b=a;else{var c=(a||'').replace(/ /g,'\xa0');if(window.DOMParser)b=new DOMParser().parseFromString(c,'text/xml');else if(window.ActiveXObject){try{b=new ActiveXObject('MSXML2.DOMDocument');}catch(d){try{b=new ActiveXObject('Microsoft.XmlDom');}catch(d){}}if(b){b.async=false;b.resolveExternals=false;b.validateOnParse=false;b.loadXML(c);}}}this.baseXml=b;};CKEDITOR.xml.prototype={selectSingleNode:function(a,b){var c=this.baseXml;if(b||(b=c))if(CKEDITOR.env.ie||b.selectSingleNode)return b.selectSingleNode(a);else if(c.evaluate){var d=c.evaluate(a,b,null,9,null);return d&&d.singleNodeValue||null;}return null;},selectNodes:function(a,b){var c=this.baseXml,d=[];if(b||(b=c))if(CKEDITOR.env.ie||b.selectNodes)return b.selectNodes(a);else if(c.evaluate){var e=c.evaluate(a,b,null,5,null);if(e){var f;while(f=e.iterateNext())d.push(f);}}return d;},getInnerXml:function(a,b){var c=this.selectSingleNode(a,b),d=[];if(c){c=c.firstChild;while(c){if(c.xml)d.push(c.xml);else if(window.XMLSerializer)d.push(new XMLSerializer().serializeToString(c));c=c.nextSibling;}}return d.length?d.join(''):null;}};})(); diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/dialog.css b/assets/grocery_crud/texteditor/ckeditor/skins/kama/dialog.css new file mode 100644 index 000000000..0ce353e6e --- /dev/null +++ b/assets/grocery_crud/texteditor/ckeditor/skins/kama/dialog.css @@ -0,0 +1,10 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +body .cke_dialog{visibility:visible;}.cke_skin_kama table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_kama .cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;_position:static;}.cke_skin_kama .cke_dialog_tl,.cke_skin_kama .cke_dialog_tr,.cke_skin_kama .cke_dialog_tc,.cke_skin_kama .cke_dialog_bl,.cke_skin_kama .cke_dialog_br,.cke_skin_kama .cke_dialog_bc,.cke_skin_kama .cke_dialog_ml,.cke_skin_kama .cke_dialog_mr{display:none;}.cke_skin_kama .cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_title,.cke_skin_kama .cke_browser_ie6 .cke_dialog_title,.cke_skin_kama .cke_browser_ie7 .cke_dialog_title{margin-bottom:22px;}.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title{margin-bottom:10px;}.cke_skin_kama .cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px;}.cke_skin_kama .cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;}.cke_skin_kama .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_kama .cke_dialog_footer .cke_resizer{margin-top:20px;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer{margin-top:27px;}.cke_skin_kama .cke_dialog_tabs{height:23px;display:inline-block;_display:block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie6 .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie7 .cke_dialog_tabs{top:33px;}.cke_skin_kama .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_kama a.cke_dialog_tab,.cke_skin_kama a:link.cke_dialog_tab,.cke_skin_kama a:active.cke_dialog_tab,.cke_skin_kama a:hover.cke_dialog_tab,.cke_skin_kama a:visited.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer;}.cke_skin_kama .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_kama a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_kama .cke_hc a:hover.cke_dialog_tab{padding:2px 6px!important;border-width:3px;}.cke_skin_kama a.cke_dialog_tab_selected,.cke_skin_kama a:link.cke_dialog_tab_selected,.cke_skin_kama a:active.cke_dialog_tab_selected,.cke_skin_kama a:hover.cke_dialog_tab_selected,.cke_skin_kama a:visited.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default;}.cke_skin_kama .cke_hc a.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px;}.cke_skin_kama .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_kama .cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px;}.cke_skin_kama .cke_dialog_ui_vbox table,.cke_skin_kama .cke_dialog_ui_hbox table{margin:auto;} +.cke_skin_kama .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_kama input.cke_dialog_ui_input_text,.cke_skin_kama input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_kama div.cke_dialog_ui_input_text,.cke_skin_kama div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_kama textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_kama div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_kama .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_kama .cke_dialog_ui_hbox{width:100%;}.cke_skin_kama .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_kama a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;_background:none;padding:5px 0;text-align:center;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button{padding:0;}.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{width:70px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span{width:100px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{padding:5px 15px;text-align:center;color:#3b3b1f;background:#53D9F0 none;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button{margin:0;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button{display:inline-block;padding-top:3px;padding-bottom:2px;margin:2px 0;}.cke_skin_kama a.cke_dialog_ui_button_ok span,.cke_skin_kama a.cke_dialog_ui_button_cancel span{width:60px;padding-right:20px;padding-left:20px;}.cke_skin_kama a.cke_dialog_ui_button_ok{background-position:0 -1143px;} +.cke_skin_kama a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1219px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1219px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-color:#B8E834;margin-right:0;}.cke_skin_kama a.cke_dialog_ui_button_cancel{background-position:0 -1104px;}.cke_skin_kama a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1245px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1245px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span{background-color:#F65D20;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-image:none;}.cke_skin_kama span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px;+margin:2px 0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_kama a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_kama a:hover.cke_dialog_ui_button,.cke_skin_kama a:focus.cke_dialog_ui_button,.cke_skin_kama a:active.cke_dialog_ui_button{background-position:0 -1180px;}.cke_skin_kama .cke_hc a:hover.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:focus.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:active.cke_dialog_ui_button{border-width:2px;}.cke_skin_kama .cke_browser_iequirks a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:active.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:active.cke_dialog_ui_button span{background-image:none;background:#F7A922;}.cke_skin_kama .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_kama .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_kama .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;text-align:center;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button{display:block;padding:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{padding-bottom:5px;padding-top:6px;margin-bottom:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button{background-position:right -1214px;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button{background-position:right -1242px;}.cke_skin_kama .cke_browser_ie9.cke_rtl .cke_dialog_footer_buttons td{padding-left:2px;}.cke_skin_kama strong{font-weight:bold;}.cke_skin_kama .cke_dialog .cke_dialog_body .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_kama .cke_dialog_close_button span{display:none;}.cke_skin_kama .cke_dialog_close_button:hover{background-position:0 -1045px;}.cke_skin_kama .cke_ltr .cke_dialog_close_button{right:10px;}.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button{left:8px;}.cke_skin_kama .cke_rtl .cke_dialog_close_button{left:10px;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{left:16px;top:0;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{position:absolute;left:10px;top:5px;} +.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer{margin-top:22px;}.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button{top:7px;}.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_kama .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_kama .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_kama .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_dialog .cke_centered{text-align:center;}.cke_skin_kama .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_kama .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_kama .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_kama .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_kama .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_kama .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_kama .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_kama .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_kama .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_kama .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_kama .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_kama .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_disabled{color:#a0a0a0;}.cke_skin_kama .cke_hc .cke_dialog_title,.cke_skin_kama .cke_hc .cke_dialog_tabs,.cke_skin_kama .cke_hc .cke_dialog_contents,.cke_skin_kama .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_kama .cke_dialog_body .cke_label{display:none;}.cke_skin_kama .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_kama .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_kama .cke_hc a.cke_btn_locked,.cke_skin_kama .cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_kama .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_kama a.cke_smile img{border:2px solid #eaead1;}.cke_skin_kama a.cke_smile:focus img,.cke_skin_kama a.cke_smile:active img,.cke_skin_kama a.cke_smile:hover img{border-color:#C7C78F;}.cke_skin_kama .cke_hc .cke_dialog_tabs a,.cke_skin_kama .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;} +.cke_skin_kama .cke_hc .ImagePreviewBox{width:260px;}.cke_skin_kama .cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px;}.cke_skin_kama .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_kama .cke_browser_gecko .cke_btn_over,.cke_skin_kama .cke_browser_opera .cke_btn_over,.cke_skin_kama .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_kama .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_kama .cke_browser_ie .cke_btn_reset,.cke_skin_kama .cke_browser_ie .cke_btn_locked,.cke_skin_kama .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_kama .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_kama .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;} diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/editor.css b/assets/grocery_crud/texteditor/ckeditor/skins/kama/editor.css new file mode 100644 index 000000000..71d3499fa --- /dev/null +++ b/assets/grocery_crud/texteditor/ckeditor/skins/kama/editor.css @@ -0,0 +1,13 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +.cke_skin_kama *,.cke_skin_kama a:hover,.cke_skin_kama a:link,.cke_skin_kama a:visited,.cke_skin_kama a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif;}.cke_skin_kama .cke_rtl *,.cke_skin_kama .cke_rtl a:hover,.cke_skin_kama .cke_rtl a:link,.cke_skin_kama .cke_rtl a:visited,.cke_skin_kama .cke_rtl a:active,.cke_rtl .cke_skin_kama *,.cke_rtl .cke_skin_kama a:hover,.cke_rtl .cke_skin_kama a:link,.cke_rtl .cke_skin_kama a:visited,.cke_rtl .cke_skin_kama a:active{text-align:right;}.cke_skin_kama iframe{vertical-align:inherit;}.cke_skin_kama textarea{white-space:pre;}.cke_skin_kama .cke_browser_gecko textarea{cursor:text;}.cke_skin_kama .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_kama input[type="text"],.cke_skin_kama input[type="password"]{cursor:text;}.cke_skin_kama input[type="text"][disabled],.cke_skin_kama input[type="password"][disabled]{cursor:default;}.cke_skin_kama fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_kama{display:block;}span.cke_skin_kama{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #D3D3D3;padding:5px;}.cke_skin_kama span.cke_browser_webkit,.cke_skin_kama span.cke_browser_gecko18{display:block;}.cke_skin_kama .cke_wrapper{-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background-color:#d3d3d3;background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1950px;display:block;_display:inline-block;padding:5px;}.cke_shared .cke_skin_kama .cke_wrapper{padding-bottom:0;}.cke_skin_kama .cke_browser_ie6 .cke_wrapper,.cke_skin_kama .cke_browser_iequirks .cke_wrapper{background-image:none;}.cke_skin_kama .cke_editor{display:inline-table;width:100%;}.cke_skin_kama .cke_browser_ie .cke_editor,.cke_skin_kama .cke_browser_webkit .cke_editor{display:table;}.cke_skin_kama .ltr .cke_browser_ie iframe{margin-right:-10px;}.cke_skin_kama .rtl .cke_browser_ie iframe{margin-left:-10px;}.cke_skin_kama .cke_browser_opera .cke_editor.cke_skin_kama .cke_resizer{display:table;}.cke_skin_kama .cke_contents{margin:5px;}.cke_skin_kama .cke_hc .cke_contents{border:1px solid black;}.cke_skin_kama .cke_contents iframe{background-color:#fff;}.cke_skin_kama .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_kama textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre;}.cke_skin_kama .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_kama .cke_resizer{width:12px;height:12px;margin-top:9px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1428px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_kama .cke_browser_air .cke_resizer,.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_kama .cke_resizer_rtl{cursor:sw-resize;background-position:0 -1455px;float:left;}.cke_skin_kama .cke_resizer_horizontal,.cke_skin_kama .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_kama .cke_resizer_vertical,.cke_skin_kama .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_kama .cke_maximized .cke_resizer{display:none;}.cke_skin_kama .cke_browser_ie6 .cke_contents textarea,.cke_skin_kama .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_kama .cke_browser_ie.cke_browser_quirks .cke_contents iframe{position:absolute;top:0;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_skin_kama .cke_browser_ie7 .cke_editor{display:inline-block;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_shared .cke_skin_kama .cke_browser_ie7 .cke_wrapper{padding-bottom:5px;}.cke_skin_kama .cke_voice_label{display:none;}.cke_skin_kama legend.cke_voice_label{display:none;}.cke_skin_kama .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;} +.cke_skin_kama .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_kama .cke_contextmenu{margin:0;}.cke_skin_kama .cke_panel iframe{width:100%;height:100%;}html.cke_skin_kama_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;}.cke_panel_frame .cke_label{display:none;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_kama .cke_button_textcolor_panel,.cke_skin_kama .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_kama .cke_toolbox{display:none;}}.cke_skin_kama .cke_browser_webkit .cke_toolbox,.cke_skin_kama .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_kama .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_kama a.cke_toolbox_collapser,.cke_skin_kama a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1366px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:1px outset #D3D3D3;margin:11px 0 2px;cursor:pointer;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_kama a.cke_toolbox_collapser span{display:none;}.cke_skin_kama .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_kama a.cke_toolbox_collapser_min,.cke_skin_kama a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1387px;background-repeat:no-repeat;margin:2px 4px;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1408px;}.cke_skin_kama .cke_separator{display:inline-block;border-left:solid 1px #D3D3D3;margin:3px 2px 0;height:16px;vertical-align:top;}.cke_skin_kama .cke_break{font-size:0;clear:left;}.cke_skin_kama .cke_rtl .cke_break{clear:right;}.cke_skin_kama .cke_toolbar_start{display:none;}.cke_skin_kama .cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -500px;float:left;margin-right:6px;margin-bottom:5px;padding:2px;display:inline;} +.cke_skin_kama .cke_rtl .cke_toolgroup{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active,.cke_skin_kama .cke_button a.cke_off{border-radius:3px;outline:none;padding:2px 4px;height:18px;display:inline-block;cursor:default;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_kama .cke_hc .cke_button a,.cke_skin_kama .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_kama .cke_button a.cke_on{background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_hc .cke_button a.cke_on{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_kama .cke_hc .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on,.cke_skin_kama .cke_button a:hover.cke_off,.cke_skin_kama .cke_button a:focus.cke_off,.cke_skin_kama .cke_button a:active.cke_off{filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active{background-color:#dff1ff;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on{background-color:#86caff;}.cke_skin_kama .cke_hc .cke_button a:hover,.cke_skin_kama .cke_hc .cke_button a:focus,.cke_skin_kama .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}.cke_skin_kama .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_kama .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_button .cke_label{cursor:default;display:none;padding-left:3px;line-height:18px;vertical-align:middle;}.cke_skin_kama .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_kama .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_kama .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -1469px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_kama .cke_browser_ie .cke_button .cke_buttonarrow{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');} +.cke_skin_kama .cke_browser_ie6 .cke_button .cke_buttonarrow{filter:;}.cke_skin_kama .cke_browser_gecko .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_toolbar_start{display:block;float:left;}.cke_skin_kama .cke_browser_gecko.cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_rtl.cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_kama .cke_browser_gecko .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_break{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_break{float:right;}.cke_skin_kama .cke_browser_webkit .cke_toolbar{float:left;}.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_toolbar{float:right;}.cke_skin_kama .cke_browser_ie .cke_button .cke_label{line-height:16px;}.cke_skin_kama .cke_browser_ie .cke_rcombo,.cke_skin_kama .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:5px;_padding-bottom:6px;}.cke_shared .cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:0;}.cke_skin_kama .cke_contextmenu{padding:2px;}.cke_skin_kama .cke_menuitem a{display:block;}.cke_skin_kama .cke_menuitem span{cursor:default;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{background-color:#D3D3D3;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;} +.cke_skin_kama .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{background-color:#D3D3D3;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_kama .cke_menuseparator{background-color:#D3D3D3;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_kama .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1411px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_kama .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1390px;background-repeat:no-repeat;}.cke_skin_kama .cke_menuarrow span{display:none;}.cke_hc .cke_skin_kama .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_kama .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow{position:absolute;left:2px;}.cke_skin_kama .cke_rcombo{display:inline;}.cke_skin_kama .cke_rcombopanel{border:1px solid #8F8F73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;height:auto;_height:100px;}.cke_skin_kama .cke_rcombo a,.cke_skin_kama .cke_rcombo a:active,.cke_skin_kama .cke_rcombo a:hover{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -100px;border-bottom:1px solid #DAD9D9;border-right:1px solid #DAD9D9;float:left;padding:2px;height:21px;margin-right:6px;margin-bottom:5px;}.cke_skin_kama .cke_rtl .cke_rcombo a,.cke_skin_kama .cke_rtl .cke_rcombo a:active,.cke_skin_kama .cke_rtl .cke_rcombo a:hover{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_label{display:none;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_label{margin-right:0;margin-left:5px;}.cke_skin_kama .cke_rcombo .cke_inline_label{line-height:21px;font-style:italic;color:#666;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton{vertical-align:top;}.cke_skin_kama .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_text{filter:alpha(opacity=70);opacity:.70;height:21px;line-height:21px;width:60px;text-overflow:ellipsis;overflow:hidden;display:inline-block;margin:0 2px 0 4px;cursor:default;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_text{margin:0 4px 0 2px;}.cke_skin_kama .cke_rcombo .cke_openbutton{display:inline-block;}.cke_skin_kama .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -68px;background-repeat:no-repeat;width:17px;height:19px;margin:1px 2px;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;}.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_openbutton{margin-bottom:0;}.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_text,.cke_skin_kama .cke_rcombo .cke_on .cke_text{border-color:#316ac5;filter:alpha(opacity=100);opacity:1;} +.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_kama .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_kama .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_label{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_kama .cke_browser_ie7 .cke_rcombo .cke_text{line-height:18px;}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_text{height:auto;line-height:17px;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_kama .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_kama .cke_path{display:inline-block;float:left;margin-top:5px;}.cke_skin_kama .cke_rtl .cke_path{float:right;}.cke_shared .cke_skin_kama .cke_path{_width:100%;margin:0 0 5px;}.cke_skin_kama .cke_path a,.cke_skin_kama .cke_path .cke_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;}.cke_skin_kama .cke_path .cke_empty{visibility:hidden;}.cke_skin_kama .cke_rtl .cke_path a,.cke_skin_kama .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_kama .cke_path a:hover,.cke_skin_kama .cke_path a:focus,.cke_skin_kama .cke_path a:active{background-color:#dff1ff;padding:1px 4px 0;outline:none;color:#000;}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_kama .cke_path .cke_label{display:none;}.cke_skin_kama .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_kama .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_kama .cke_button_newpage .cke_icon{background-position:0 -48px;}.cke_skin_kama .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_kama .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_kama .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_kama .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_kama .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_kama .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_kama .cke_button_replace .cke_icon{background-position:0 -256px;} +.cke_skin_kama .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_kama .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_kama .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_kama .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_kama .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_kama .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_kama .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_kama .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_kama .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_kama .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_kama .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_kama .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_kama .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_kama .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_kama .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_kama .cke_button_checkspell .cke_icon,.cke_skin_kama .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_kama .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_kama .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_kama .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_kama .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_kama .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_kama .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_kama .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_kama .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_kama .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_kama .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_kama .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_kama .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_kama .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_kama .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}.cke_skin_kama .cke_button_outdent .cke_icon{background-position:0 -432px;}.cke_skin_kama .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_kama .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_kama .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_kama .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_kama .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_kama .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_kama .cke_button_creatediv .cke_icon{background-position:0 -1168px;} +.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_kama .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_kama .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_kama .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_kama .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_kama .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_kama .cke_button_source .cke_label{display:inline;}.cke_skin_kama .cke_styles_panel{width:150px;height:170px;}.cke_skin_kama .cke_format_panel{width:150px;height:170px;}.cke_skin_kama .cke_font_panel{width:150px;height:170px;}.cke_skin_kama .cke_fontSize_panel{height:170px;}.cke_skin_kama .cke_fontSize .cke_text{width:25px;}.cke_skin_kama .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_kama{visibility:inherit;}html.cke_skin_kama_container{visibility:visible;} diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/icons.png b/assets/grocery_crud/texteditor/ckeditor/skins/kama/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3bf195dd35a2dd3773a5cae7e4712a1133a5d5 GIT binary patch literal 5598 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 M(7LLX%GRO(1EjHd^8f$< literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/icons_rtl.png b/assets/grocery_crud/texteditor/ckeditor/skins/kama/icons_rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..83eee28ac79d5e00e8ec9136ba491c8c0a2b8352 GIT binary patch literal 5600 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 Y*liGXlBs6f3N(+w)78&qol`;+0EeeJRsaA1 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/images/dialog_sides_rtl.png b/assets/grocery_crud/texteditor/ckeditor/skins/kama/images/dialog_sides_rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f7b49fcc3ed5a8fa763d0ad0372f86c8582b20 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-r!3HGvcdbbWQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%xqG@ehE&{2($V8fPfJKhU`;Ah zc*d3_ry$0Vx09fWpQlD(0qaDhB!Y^fDE`igwg9eSAM}o@l*f2hbU8 Z4DP$Qd9j}#|1MMRnVHftai)I0hk4V(@-do3I{afTNt=~7q!&zhQ}M^!I~t% lw;gm1W_k-^4+91Sga8FY3}$4Fii8ejXLS&6nq4;u06XFIMo9nw literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/images/noimage.png b/assets/grocery_crud/texteditor/ckeditor/skins/kama/images/noimage.png new file mode 100644 index 0000000000000000000000000000000000000000..159811305af7fc78662a53949f9c62bd702785af GIT binary patch literal 2115 zcmV-J2)y@+P)Ho>++t$jfPmRaN!?~<++bkXLqpg`M%qnH+*(@WuCC*= zv+nTj+f!5FhKAvZiQ<}?-*EHQt|a&q5ubK|eC;+&k} zgoNRWitg>}4K<ekfk+}q{E#Me7J>(bHOVPWE?rr?K%;Dm(Xm6h64Q}6Nb*FHY!#>MR6-{6IX-+X-I z%F5>4+~J3Z;f00e!NKCVxZ<&~;;O3SqN3ugtl@%!iP1e z;;ydZ#KhvOtLC({;-aGCtgP(Y+2*ma)hMx z+uH5p;oyjf;E9RksHoz~%Hqq*FIou1*CnBt3z=eoJ#jg8})n&6C#;Ej#qx3}JMbKrV7tBO*{xtyZfK3kwUxgN0tN*J@X6OH7P%ba6R|MjaCq zA3fCS^trNaG^w6x&h;0X}?rKOdWz!A`Z9|xkD8K>f`UV#Y?778OHBSXx=QYf4d zoK}L{Q!~*TtJJk6Fh&?D5QJPX2q1&OfL$*X3k0A6uYHxe2KBE^0~AtRv$6lS_4Mtw zjmdb8w%ey$-|jzKQydZk_OE`ld4h0VagD&R{(3`^$bu@IvWz|F(np;w+L$1T|t*mx13G3-F40Aw`c@9 zL2Z;#D6&TC32e8>&v@;sZF2I)mdogy^|n{%#!lK$`8FOL+{->kqn*o!Q&9ZdT8hya zJJ)vob|e5rp^%1ahwoV6vbpfmrNU;DyYo|7C5b{g9~)~xp8^}MtSyt#I%b%psG&iG zJBt||G?}cda+pLp|0#Mv83t8ePNQkM%(Af1?7Hn1&|J&A%4#b~576<-vaWL11-=d% zjn3E4Bu&oGSEtcv9DHfzU9xYFqYbj3X$xMyvzk620x(KK`!SZ(ByE*QR@b!~_Z6C8;XY$~ zUEONQDrvnAqx;eCz@ACxt*$HG6s>%H00x>89eAybjwzilk+fp83w8hb?EbuE^JAhJ z4EY}FF(BrSQGb)G7>tXRo_^U^P?TAn+Y1rHE_ zni#6(xk`Dp*RS@tv%k3M@Zn7t&6_X1D#9_UszMSrI*i%%e-j6MXo5XJ>^opYKB$zvO6U3O$0= z3qz|IC~Lr`ua^};XHRw(6BB$8(H!zg5bq|pvFFeuV5s|YG-%VelSQAyCZv#&k664V zAt7N4cG)c!6Me{hf)g7X>XnP+d$Dm&DP%HHygT2`jc3lyEx$laRFL^?xRj&toe^}W zHa;0GEXa4`dHDM?hdMhuhnW8UJfP3tD98k-IT0*xQ~{2_R}dFsjM>TMT3T{AmK;ki zcZli18~1!6BBy|?LIZR*fvg}FjN^S6;&M40&uLiiJvkf>m&x=PS74Iv$cEj9I}aw8 z3u^H!bBh8Q6YMezoAmY&mQ&3gCl6I1WNV$>{I@G?DfCd0dk^LaeL t9L{?@PmZPK&HVPo0dInHUQTi%e5P)c`ZnVqp=C z6F$I5Jto1NSXeBcnySi1K8xra5+9?Ph5-}8r`Y=J#52$Ex!;CRuoLqUn�~;+yNk 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 D|1u-x literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/texteditor/ckeditor/skins/kama/skin.js b/assets/grocery_crud/texteditor/ckeditor/skins/kama/skin.js new file mode 100644 index 000000000..b67509414 --- /dev/null +++ b/assets/grocery_crud/texteditor/ckeditor/skins/kama/skin.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +CKEDITOR.skins.add('kama',(function(){var a='cke_ui_color';return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},richcombo:{canGroup:false},templates:{css:['templates.css']},margins:[0,0,0,0],init:function(b){if(b.config.width&&!isNaN(b.config.width))b.config.width-=12;var c=[],d=/\$color/g,e='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';if(CKEDITOR.env.webkit){e=e.split('}').slice(0,-1);for(var f=0;f'+''+''+''+''+'
'+'
',h=f.append(CKEDITOR.dom.element.createFromHtml(g,f.getDocument()));if(f.getCustomData('cke_hasshared'))h.hide();else f.setCustomData('cke_hasshared',1);e=h.getChild([0,0,0,0]);!c.sharedSpaces&&(c.sharedSpaces={});c.sharedSpaces[d]=e;c.on('focus',function(){for(var i=0,j,k=f.getChildren();j=k.getItem(i);i++){if(j.type==CKEDITOR.NODE_ELEMENT&&!j.equals(h)&&j.hasClass('cke_shared'))j.hide();}h.show();});c.on('destroy',function(){h.remove();});}return e;};return{build:function(c,d){var e=c.name,f=c.element,g=c.elementMode;if(!f||g==CKEDITOR.ELEMENT_MODE_NONE)return;if(g==CKEDITOR.ELEMENT_MODE_REPLACE)f.hide();var h=c.fire('themeSpace',{space:'top',html:''}).html,i=c.fire('themeSpace',{space:'contents',html:''}).html,j=c.fireOnce('themeSpace',{space:'bottom',html:''}).html,k=i&&c.config.height,l=c.config.tabIndex||c.element.getAttribute('tabindex')||0;if(!i)k='auto';else if(!isNaN(k))k+='px';var m='',n=c.config.width;if(n){if(!isNaN(n))n+='px';m+='width: '+n+';';}var o=h&&b(c,'top'),p=b(c,'bottom');o&&(o.setHtml(h),h='');p&&(p.setHtml(j),j='');var q='';if(a[c.skinClass])q='';else a[c.skinClass]=1;var r=CKEDITOR.dom.element.createFromHtml([''+''+c.lang.editor+''+''+q+''+''+''].join('')); +r.getChild([1,0,0,0,0]).unselectable();r.getChild([1,0,0,0,2]).unselectable();if(g==CKEDITOR.ELEMENT_MODE_REPLACE)r.insertAfter(f);else f.append(r);c.container=r;r.disableContextMenu();c.on('contentDirChanged',function(s){var t=(c.lang.dir!=s.data?'add':'remove')+'Class';r.getChild(1)[t]('cke_mixed_dir_content');var u=this.sharedSpaces&&this.sharedSpaces[this.config.toolbarLocation];u&&u.getParent().getParent()[t]('cke_mixed_dir_content');});c.fireOnce('themeLoaded');c.fireOnce('uiReady');},buildDialog:function(c){var d=CKEDITOR.tools.getNextNumber(),e=CKEDITOR.dom.element.createFromHtml([''].join('').replace(/#/g,'_'+d).replace(/%/g,'cke_dialog_')),f=e.getChild([0,0,0,0,0]),g=f.getChild(0),h=f.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var i=CKEDITOR.env.isCustomDomain(),j='javascript:void(function(){'+encodeURIComponent('document.open();'+(i?'document.domain="'+document.domain+'";':'')+'document.close();')+'}())',k=CKEDITOR.dom.element.createFromHtml('');k.appendTo(f.getParent());}g.unselectable();h.unselectable();return{element:e,parts:{dialog:e.getChild(0),title:g,close:h,tabs:f.getChild(2),contents:f.getChild([3,0,0,0]),footer:f.getChild([3,0,1,0])}}; +},destroy:function(c){var d=c.container,e=c.element;if(d){d.clearCustomData();d.remove();}if(e){e.clearCustomData();c.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&e.show();delete c.element;}}};})());CKEDITOR.editor.prototype.getThemeSpace=function(a){var b='cke_'+a,c=this._[b]||(this._[b]=CKEDITOR.document.getById(b+'_'+this.name));return c;};CKEDITOR.editor.prototype.resize=function(a,b,c,d){var j=this;var e=j.container,f=CKEDITOR.document.getById('cke_contents_'+j.name),g=CKEDITOR.env.webkit&&j.document&&j.document.getWindow().$.frameElement,h=d?e.getChild(1):e;h.setSize('width',a,true);g&&(g.style.width='1%');var i=c?0:(h.$.offsetHeight||0)-(f.$.clientHeight||0);f.setStyle('height',Math.max(b-i,0)+'px');g&&(g.style.width='100%');j.fire('resize');};CKEDITOR.editor.prototype.getResizable=function(a){return a?CKEDITOR.document.getById('cke_contents_'+this.name):this.container;}; diff --git a/assets/grocery_crud/themes/datatables/config.php b/assets/grocery_crud/themes/datatables/config.php new file mode 100644 index 000000000..7ec43e056 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/config.php @@ -0,0 +1,2 @@ + c4 + ee > d5 + Level 2: + dd > d1 + ee > e2 + */ +tr.odd.gradeA td.sorting_1 { + background-color: #c4ffc4; +} + +tr.odd.gradeA td.sorting_2 { + background-color: #d1ffd1; +} + +tr.odd.gradeA td.sorting_3 { + background-color: #d1ffd1; +} + +tr.even.gradeA td.sorting_1 { + background-color: #d5ffd5; +} + +tr.even.gradeA td.sorting_2 { + background-color: #e2ffe2; +} + +tr.even.gradeA td.sorting_3 { + background-color: #e2ffe2; +} + +tr.odd.gradeC td.sorting_1 { + background-color: #c4c4ff; +} + +tr.odd.gradeC td.sorting_2 { + background-color: #d1d1ff; +} + +tr.odd.gradeC td.sorting_3 { + background-color: #d1d1ff; +} + +tr.even.gradeC td.sorting_1 { + background-color: #d5d5ff; +} + +tr.even.gradeC td.sorting_2 { + background-color: #e2e2ff; +} + +tr.even.gradeC td.sorting_3 { + background-color: #e2e2ff; +} + +tr.odd.gradeX td.sorting_1 { + background-color: #ffc4c4; +} + +tr.odd.gradeX td.sorting_2 { + background-color: #ffd1d1; +} + +tr.odd.gradeX td.sorting_3 { + background-color: #ffd1d1; +} + +tr.even.gradeX td.sorting_1 { + background-color: #ffd5d5; +} + +tr.even.gradeX td.sorting_2 { + background-color: #ffe2e2; +} + +tr.even.gradeX td.sorting_3 { + background-color: #ffe2e2; +} + +tr.odd.gradeU td.sorting_1 { + background-color: #c4c4c4; +} + +tr.odd.gradeU td.sorting_2 { + background-color: #d1d1d1; +} + +tr.odd.gradeU td.sorting_3 { + background-color: #d1d1d1; +} + +tr.even.gradeU td.sorting_1 { + background-color: #d5d5d5; +} + +tr.even.gradeU td.sorting_2 { + background-color: #e2e2e2; +} + +tr.even.gradeU td.sorting_3 { + background-color: #e2e2e2; +} + + +/* + * Row highlighting example + */ +.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted { + background-color: #ECFFB3; +} + +.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted { + background-color: #E6FF99; +} \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/css/images/error.png b/assets/grocery_crud/themes/datatables/css/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd3b55dbe0ebec6e35cec8eaeba62038acfeb10 GIT binary patch literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`Jj+tIX_n~5oC^DMQ#CujeSKy zVsdtBi9%9pdS;%jl7fPQl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3a#eP+Wr~u$9hXgo z6;N|-YDuC(MQ%=Bu~mhw64*>DAR8pCucQE0Qj%?}1aWkPZ-9bxeo?A|iJqZuvVpOQ zf{B@)k-3qjxtWeaaAJvqS7M%mk-37AfdP;(vNANZGBE@?1`L$!xPY`xQA(Oskc%7C zP9V=#DWjyMz)D}gyu4hm+*mKaC|%#s($Z4jz)0W7NEfI=x41H|B(Xv_uUHvk2+SOp z)Z*l#%mQ$5fy_-z$}cUkRZ;?31P4&hB^JOf$}5Hj9xxd7D-sLz4fPE4;U)t$+5iQu zz!8yO6q28xV}~WqY(P3u6d`Oy=udS?EJ?KkhKGf&fswAEd5D3Lm9d$XiD?v)euyG8 z?Y{XbnQ4_s+KqLMOhODTtqcsTOpKt~krY9-+vtM=0x4j?p$_sBnz#ai082@RhgU&q zQ4Tm-Qj+ykb5e6t^Gb?=VP=RLW+};5Y57IDi6wTKxryni`UQFEHu?xbyzYaz8kj7A z$xbP0l+XkK D*?Od} literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/css/images/index.html b/assets/grocery_crud/themes/datatables/css/images/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/themes/datatables/css/images/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/css/images/small-loading.gif b/assets/grocery_crud/themes/datatables/css/images/small-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ea146c0253f2e500ca022050f4353be456e6d4d GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`<;O|NsBc(9mDMepOXfty!}sA|fI$FYoc=$48DFNls2)ym;}9 z88hCzd9!QRt{XRQw6wJJ_4P530u=vq`?-b$J39ur8tEA@GXnK0{*!VpN=+BBCMNfRtuR+y^ER&<(X zE7%B&e5#Z^`o7-@nEg_P~LI*N!rA^h{|;%@7gdIe0+9 zL6FPmK*NXRK=)=Qr!7yn1(?oIuvujqni9B8`-RfJ#pzQFR*0=zw6NbXTj0F1BLlZh zfVly?4JS*30beAWg%&SoyRsrS%M*Y;RQ^0c<0TpwHaFY zz6r{%O%_#7fe{VKyK@(naSJIeRCsx4aYAE48*ixFGRdMll6*@GUTc0%``>`o8j#V4 zg9*c-O~)LSJSTE&n6)s0!!ECt)zd(wL!wvC+k6wRhYtI}PTi7bt)^yIDG`AshjlL| qtmsHM!1PnVu#-b#!*qv!K4WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/css/jquery.dataTables.css b/assets/grocery_crud/themes/datatables/css/jquery.dataTables.css new file mode 100644 index 000000000..83df98ea7 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/css/jquery.dataTables.css @@ -0,0 +1,220 @@ + +/* + * Table + */ +table.dataTable { + margin: 0 auto; + clear: both; + width: 100%; +} + +table.dataTable thead th { + padding: 3px 18px 3px 10px; + border-bottom: 1px solid black; + font-weight: bold; + cursor: pointer; + *cursor: hand; +} + +table.dataTable tfoot th { + padding: 3px 18px 3px 10px; + border-top: 1px solid black; + font-weight: bold; +} + +table.dataTable td { + padding: 3px 10px; +} + +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} + +table.dataTable tr.odd { background-color: #E2E4FF; } +table.dataTable tr.even { background-color: white; } + +table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } +table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } +table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } +table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } +table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } +table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } + + +/* + * Table wrapper + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; +} + + +/* + * Page length menu + */ +.dataTables_length { + float: left; +} + + +/* + * Filter + */ +.dataTables_filter { + float: right; + text-align: right; +} + + +/* + * Table information + */ +.dataTables_info { + clear: both; + float: left; +} + + +/* + * Pagination + */ +.dataTables_paginate { + float: right; + text-align: right; +} + +/* Two button pagination - previous / next */ +.paginate_disabled_previous, +.paginate_enabled_previous, +.paginate_disabled_next, +.paginate_enabled_next { + height: 19px; + float: left; + cursor: pointer; + *cursor: hand; + color: #111 !important; +} +.paginate_disabled_previous:hover, +.paginate_enabled_previous:hover, +.paginate_disabled_next:hover, +.paginate_enabled_next:hover { + text-decoration: none !important; +} +.paginate_disabled_previous:active, +.paginate_enabled_previous:active, +.paginate_disabled_next:active, +.paginate_enabled_next:active { + outline: none; +} + +.paginate_disabled_previous, +.paginate_disabled_next { + color: #666 !important; +} +.paginate_disabled_previous, +.paginate_enabled_previous { + padding-left: 23px; +} +.paginate_disabled_next, +.paginate_enabled_next { + padding-right: 23px; + margin-left: 10px; +} + +.paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } +.paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } +.paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } + +.paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } +.paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } +.paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } + +/* Full number pagination */ +.paging_full_numbers { + height: 22px; + line-height: 22px; +} +.paging_full_numbers a:active { + outline: none +} +.paging_full_numbers a:hover { + text-decoration: none; +} + +.paging_full_numbers a.paginate_button, +.paging_full_numbers a.paginate_active { + border: 1px solid #aaa; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + padding: 2px 5px; + margin: 0 3px; + cursor: pointer; + *cursor: hand; + color: #333 !important; +} + +.paging_full_numbers a.paginate_button { + background-color: #ddd; +} + +.paging_full_numbers a.paginate_button:hover { + background-color: #ccc; + text-decoration: none !important; +} + +.paging_full_numbers a.paginate_active { + background-color: #99B3FF; +} + + +/* + * Processing indicator + */ +.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 250px; + height: 30px; + margin-left: -125px; + margin-top: -15px; + padding: 14px 0 2px 0; + border: 1px solid #ddd; + text-align: center; + color: #999; + font-size: 14px; + background-color: white; +} + + +/* + * Sorting + */ +.sorting { background: url('../images/sort_both.png') no-repeat center right; } +.sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; } +.sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; } + +.sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; } +.sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; } + +table.dataTable th:active { + outline: none; +} + + +/* + * Scrolling + */ +.dataTables_scroll { + clear: both; +} + +.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} + diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboard.as b/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboard.as new file mode 100644 index 000000000..75dd82ee0 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboard.as @@ -0,0 +1,221 @@ +/* Compile using: mxmlc --target-player=10.0.0 ZeroClipboard.as */ +package { + import flash.display.Stage; + import flash.display.Sprite; + import flash.display.LoaderInfo; + import flash.display.StageScaleMode; + import flash.events.*; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.external.ExternalInterface; + import flash.system.Security; + import flash.utils.*; + import flash.system.System; + import flash.net.FileReference; + import flash.net.FileFilter; + + public class ZeroClipboard extends Sprite { + + private var domId:String = ''; + private var button:Sprite; + private var clipText:String = 'blank'; + private var fileName:String = ''; + private var action:String = 'copy'; + private var incBom:Boolean = true; + private var charSet:String = 'utf8'; + + + public function ZeroClipboard() { + // constructor, setup event listeners and external interfaces + stage.scaleMode = StageScaleMode.EXACT_FIT; + flash.system.Security.allowDomain("*"); + + // import flashvars + var flashvars:Object = LoaderInfo( this.root.loaderInfo ).parameters; + domId = flashvars.id; + + // invisible button covers entire stage + button = new Sprite(); + button.buttonMode = true; + button.useHandCursor = true; + button.graphics.beginFill(0x00FF00); + button.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); + button.alpha = 0.0; + addChild(button); + + button.addEventListener(MouseEvent.CLICK, clickHandler); + button.addEventListener(MouseEvent.MOUSE_OVER, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseOver', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_OUT, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseOut', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_DOWN, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseDown', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_UP, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseUp', null ); + } ); + + // External functions - readd whenever the stage is made active for IE + addCallbacks(); + stage.addEventListener(Event.ACTIVATE, addCallbacks); + + // signal to the browser that we are ready + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'load', null ); + } + + public function addCallbacks (evt:Event = null):void { + ExternalInterface.addCallback("setHandCursor", setHandCursor); + ExternalInterface.addCallback("clearText", clearText); + ExternalInterface.addCallback("setText", setText); + ExternalInterface.addCallback("appendText", appendText); + ExternalInterface.addCallback("setFileName", setFileName); + ExternalInterface.addCallback("setAction", setAction); + ExternalInterface.addCallback("setCharSet", setCharSet); + ExternalInterface.addCallback("setBomInc", setBomInc); + } + + + public function setCharSet(newCharSet:String):void { + if ( newCharSet == 'UTF16LE' ) { + charSet = newCharSet; + } else { + charSet = 'UTF8'; + } + } + + public function setBomInc(newBomInc:Boolean):void { + incBom = newBomInc; + } + + public function clearText():void { + clipText = ''; + } + + public function appendText(newText:String):void { + clipText += newText; + } + + public function setText(newText:String):void { + clipText = newText; + } + + public function setFileName(newFileName:String):void { + fileName = newFileName; + } + + public function setAction(newAction:String):void { + action = newAction; + } + + public function setHandCursor(enabled:Boolean):void { + // control whether the hand cursor is shown on rollover (true) + // or the default arrow cursor (false) + button.useHandCursor = enabled; + } + + + private function clickHandler(event:Event):void { + var fileRef:FileReference = new FileReference(); + fileRef.addEventListener(Event.COMPLETE, saveComplete); + + if ( action == "save" ) { + /* Save as a file */ + if ( charSet == 'UTF16LE' ) { + fileRef.save( strToUTF16LE(clipText), fileName ); + } else { + fileRef.save( strToUTF8(clipText), fileName ); + } + } else if ( action == "pdf" ) { + fileRef.save( "This instance of ZeroClipboard is not configured for PDF export. "+ + "Please use the PDF export version.", fileName+".txt" ); + } else { + /* Copy the text to the clipboard. Note charset and BOM have no effect here */ + System.setClipboard( clipText ); + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'complete', clipText ); + } + } + + + private function saveComplete(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'complete', clipText ); + } + + + private function getProp( prop:String, opts:Array ):String + { + var i:int, iLen:int; + for ( i=0, iLen=opts.length ; i> 8 ); + } + + i++; + } + + return utf16; + } + } +} diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboardPdf.as b/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboardPdf.as new file mode 100644 index 000000000..a49d07343 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/ZeroClipboardPdf.as @@ -0,0 +1,310 @@ +/* Compile using: mxmlc --target-player=10.0.0 -static-link-runtime-shared-libraries=true -library-path+=lib ZeroClipboardPdf.as */ +package { + import flash.display.Stage; + import flash.display.Sprite; + import flash.display.LoaderInfo; + import flash.display.StageScaleMode; + import flash.events.*; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.external.ExternalInterface; + import flash.system.Security; + import flash.utils.*; + import flash.system.System; + import flash.net.FileReference; + import flash.net.FileFilter; + + /* PDF imports */ + import org.alivepdf.pdf.PDF; + import org.alivepdf.data.Grid; + import org.alivepdf.data.GridColumn; + import org.alivepdf.layout.Orientation; + import org.alivepdf.layout.Size; + import org.alivepdf.layout.Unit; + import org.alivepdf.display.Display; + import org.alivepdf.saving.Method; + import org.alivepdf.fonts.FontFamily; + import org.alivepdf.fonts.Style; + import org.alivepdf.fonts.CoreFont; + import org.alivepdf.colors.RGBColor; + + public class ZeroClipboard extends Sprite { + + private var domId:String = ''; + private var button:Sprite; + private var clipText:String = 'blank'; + private var fileName:String = ''; + private var action:String = 'copy'; + private var incBom:Boolean = true; + private var charSet:String = 'utf8'; + + + public function ZeroClipboard() { + // constructor, setup event listeners and external interfaces + stage.scaleMode = StageScaleMode.EXACT_FIT; + flash.system.Security.allowDomain("*"); + + // import flashvars + var flashvars:Object = LoaderInfo( this.root.loaderInfo ).parameters; + domId = flashvars.id; + + // invisible button covers entire stage + button = new Sprite(); + button.buttonMode = true; + button.useHandCursor = true; + button.graphics.beginFill(0x00FF00); + button.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); + button.alpha = 0.0; + addChild(button); + + button.addEventListener(MouseEvent.CLICK, function(event:Event):void { + clickHandler(event); + } ); + button.addEventListener(MouseEvent.MOUSE_OVER, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseOver', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_OUT, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseOut', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_DOWN, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseDown', null ); + } ); + button.addEventListener(MouseEvent.MOUSE_UP, function(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'mouseUp', null ); + } ); + + // External functions - readd whenever the stage is made active for IE + addCallbacks(); + stage.addEventListener(Event.ACTIVATE, addCallbacks); + + // signal to the browser that we are ready + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'load', null ); + } + + public function addCallbacks (evt:Event = null):void { + ExternalInterface.addCallback("setHandCursor", setHandCursor); + ExternalInterface.addCallback("clearText", clearText); + ExternalInterface.addCallback("setText", setText); + ExternalInterface.addCallback("appendText", appendText); + ExternalInterface.addCallback("setFileName", setFileName); + ExternalInterface.addCallback("setAction", setAction); + ExternalInterface.addCallback("setCharSet", setCharSet); + ExternalInterface.addCallback("setBomInc", setBomInc); + } + + + public function setCharSet(newCharSet:String):void { + if ( newCharSet == 'UTF16LE' ) { + charSet = newCharSet; + } else { + charSet = 'UTF8'; + } + } + + public function setBomInc(newBomInc:Boolean):void { + incBom = newBomInc; + } + + public function clearText():void { + clipText = ''; + } + + public function appendText(newText:String):void { + clipText += newText; + } + + public function setText(newText:String):void { + clipText = newText; + } + + public function setFileName(newFileName:String):void { + fileName = newFileName; + } + + public function setAction(newAction:String):void { + action = newAction; + } + + public function setHandCursor(enabled:Boolean):void { + // control whether the hand cursor is shown on rollover (true) + // or the default arrow cursor (false) + button.useHandCursor = enabled; + } + + + private function clickHandler(event:Event):void { + var fileRef:FileReference = new FileReference(); + fileRef.addEventListener(Event.COMPLETE, saveComplete); + + if ( action == "save" ) { + /* Save as a file */ + if ( charSet == 'UTF16LE' ) { + fileRef.save( strToUTF16LE(clipText), fileName ); + } else { + fileRef.save( strToUTF8(clipText), fileName ); + } + } else if ( action == "pdf" ) { + /* Save as a PDF */ + var pdf:PDF = configPdf(); + fileRef.save( pdf.save( Method.LOCAL ), fileName ); + } else { + /* Copy the text to the clipboard. Note charset and BOM have no effect here */ + System.setClipboard( clipText ); + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'complete', clipText ); + } + } + + + private function saveComplete(event:Event):void { + ExternalInterface.call( 'ZeroClipboard_TableTools.dispatch', domId, 'complete', clipText ); + } + + + private function getProp( prop:String, opts:Array ):String + { + var i:int, iLen:int; + for ( i=0, iLen=opts.length ; i> 8 ); + } + + i++; + } + + return utf16; + } + } +} diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/lib/AlivePDF.swc b/assets/grocery_crud/themes/datatables/extras/TableTools/media/as3/lib/AlivePDF.swc new file mode 100644 index 0000000000000000000000000000000000000000..ee0f3f8f4ca49ccea24defe4ac6bd4b9c3e65a05 GIT binary patch literal 131230 zcmV(Ec zCQbD3`^2_w+qP}{i8-++wry)-TNB&1Z6`CC%$(%?oxAQm_n)&?t?p0n+Eumpcdf4O z-7Ti2220}y4)6rI>VYxFmvQ3~{H`z?qqv#$0$kr2%(0z)%E7H$?IN>2TCTOjk=bck zy>ydgW3XN+#$gd?teJlOAcIbT0ELl4ydeuDN4}vG)<$)93=Ry*CKpDnCC3KchraUr zsa5A~p-ZS^`1cAcNvW~Q=r#M|qH?va(y+(-_Bk`)Z>n&?>vCXUsjRWxrg@<7o|e0> zGz|F5irk}5+2}|On_OyT7nBy4pm)Q(_6}NXp5S-y*Ylwp-R~qemQCwc^n|ga9weiT z9xWTxIqMp3b>E)^Rr)dxF)xpgB|9`*%KHZN?Ms~wi-{QI7%;L!8S9qlipEq~F4S`< zerz}vzc}DQq(=Fi*gltvni`pSb*M68mbaf}8r%SDJRe;5Q<`jhRUNTjCG~L5^CUY| zoL-J)TX;rs>$okeOHysOnVelPC-iMJT#fYD;9OsCfc7+<`gN(AQRR#LQK(#PyP^{G zbyFG>H$`f@ZK?t~HMzA>`V92PG%LBH#V51-`)9ARg`M@P+Kw;BNKswct3`34VNKt* zGMi9W_3kqW4t0^8zokTMO4>#Czi(o-SNb0}US3_!tgY6pJ&uEQy&_?q<|}ja`&VMm zD#Q;J2R42Gw*2pA1P^KF`I{8v&J)FZ8rd!G<-g8WF6K(Xx4mEwN%lK&WEmv#B*5GI z>QnBlKf32pfB&mJ9Jpi9&ni=v%ezC%5 zsdi$e*r_&Rr8ub$V&>SX)?x^3Hth(h=IX5osix|+2pj|DiJVK+#gd!KrZKp-V#heC z-^60sY`Q}mGYtU>-s|#A0hm$e=56zn7TzGu&MZAwoc|d$8OzeQC7H6%A?7BApBgvM z%-MPXx*ZvY?sz?RWmv*=Sc{Vm#p%;epjO8~?{)j9ulc6+oyxERy7Z}e6RQs8833p9 z4XWCpVUZAbL#euhG}9UZrZynzT4^UaoqC4lpp)QW)XTJ~q6FAwSbdFZOu#3QsB;Kq zZO{bAh0?e3lnCt1dO^J;fJBS66k0% zn09S-d%MK|i1C#UEuh~FOk3Z;(6t;!o&&H{qhDOfG7r$lMIzIp$}j`G@;>9%W&!~% zv==$X&LHfHi*@oe0VBZe!re@1z+($W0(Cz*Xa-Y$(Qc+7z~L7>V^GVHBc`&=?~P^&Ncx7LNVbAQ{6DZQ%gMb^$=!VbCU+Bh(j4ef4lh!8suH<$evC zT80}=Mzk=x0H<-l>BFy2VpH1^1!QWy#G-Ry7VKe89s@fJ^+iS%oti*2D=D6afHjDJ z{p_TU*Q*=T6{WGec@L0=P*DI)tLE{B-<8a01qw?+ZHPzQL1+w zo(n~|dt96%wcHKVnEd~ zPYwmZ@2krJYsXkwh()>OPzO`6@mh{1Ct*p~G7RyaMaOk$m->%%WI#8ad(xy)k95iJ zE=a5s>TNu8b!39O-ReAk>>=XGdo`=OU&MKS?I@ zcy34l?Bklu3S>wg=m7_^1Wm3eS9ynjLF;8*G~;~W`}BL<7b;*8XPst29CJyPD0yy# z0QMZm4k?pBUOmH9`xz$>&~g#U(drR3qc}cHz&*?g9|w97aY)+|+7yy04T=aoW zJTnJKlp@Sg-<`m~5O_fK!izrTX$0{pYFHXZx2`w;B3glr(l1cSi~;~PG^m&XG&GsK zGQb!M4kPB3OkM>rubG)@H7E{o7Xo9^p+d0up0OH)} z63Z$A;>-|-YhDC;#Jm$2%tDXi0XTYS2L^%0aGrBclz@-vTSj;em^twh}ow< z=>&FiY=9OL-4i` zVAOMm8HRvi%IxFM2L-l9yQ+Mh?}~G`EKAP=&*Z&ERAd@a!`y0*ir_3c7`4ywr`c3< zoi6@7byiQ6`KW_uRvnDGZ354-2!wmc;!vI?pptxuTMfQ|l8Ad|2(p>@@YCIscCC#2d?1*?qE;iq0%W{pmixP4JtaFiRKGrIRS{ZF_=4Vu0! z#!<2Hx^(ulW<{~_I#oN{^36`T%izheY#jj2o_9ig-|ZJ+;q8S(VV~u)^az%7K-Pdw zOeEBtxc#{kzZ=nzBW`c&6L$lHK-^x)=Ye=IjWGPQhCyKFpQnH#Jx(w*uMy*BgZ4yN zp4gbdI5xO)WDJ;0(JBNxzf3tT51*`vd(r?QB!yDfOyp2~>=NI&cB{_2iF)`@Lo5gX zIQG-;#u}X?Oi&$G&I^)7aSRp}N>efgat^f!OqmGG#_Mr(S8~x91yNh_$*H0#BVmoi z0wbwuWz;O-t$CS>hfGgwikQq{hrA$lmH@e-T-rDkMuWHonsWFZ zt#Qu{HB4fh%kaXUlqLa%%sIVbj{Tuq{aQt`Lij{8avl1!Uk$T7EEeRek>$^Lv#H0rKM;%WWB$>pN7?X4AOBhZI4pmeixR_?s za(-7SWUS;pi%hoY)i)PqGKvN$Qn{&uCKw6Tt&v(Pl0|pYP%Xp{6al$C2z?ANDl51=Mg@-aJCBCqnY5`f`FXC@){l?Y8vOuUcu^`H7 zF;vuM9<_gwFy0Tlli?XmkZ46u^?>sX1 zKM!x9!v3d+ywVk-k90j6U0TxIt&enb#Il@B`I`W_?htMn`O_L9Dg%&04fTEK3k1|q zH~#|$HB`RgPY4Q&gckJ~o`RQYhQ_4~v|C_{#B3;|iOdBuQRxm%l##nf36Qr$oXg-1 zH_F?fETYlDBgrrTy@6e8Vye*@d26gM2}`79RPM3=xkbjBB7IJtaE&)e*A5@c$rE z7MT78bD}864G4$-rEACasmJGrDTnbtDon16sUBzMt$Dm8sC$)Bz2s3iXVA_*4c#<_ z5BXTeswcJP|FTCcmZ(mb1!8T86-iWQea7$~@s%PUh$|M?8NL&`0`9kFIsXB;BE>q1x8)5=<6>hOTRp3JH0o z>Nx)Y^w@UzAGuaH#VkJWX*BuxF?Q?8Co4Jg7IW_q7~fC)|1{|_YpMr2N7}WTLjIsMe{df+&;ijWit;9h8rFHoC?_stqBn@LxPBxc}mHFxTgn z7L1SFUd;&QHIGZ=v6smF=z>4#m0uvDkj)KhE|Fzl0*qs6T?T?Z`$UHSS*Veu} zWlyd2&rv_@?N$9APqve@Z!)(=@9_RSm$nAtH5^ z$-N5k1HoV}g1DUaF#DKoTUzg{q-4pl;T7YsSjFc54bd_ZS0O1gNiX1d;jOX zO5dP?5(I0E-(xmlEhl}K^`tut)g_MQCW4RUs0!{bLisu}rdU8wRQg)tRZ z%Mrb2yct^-_*C6QdHCr(v7Dt#7PxoLo{)ANv)DkL^N@AlWK4|}>RtJk5whQlok;T7 z!0u*61pWXoNn+?M*D54eWX}`0FZJz_=n$tjC}9dQk{{;9l(;*#gTNoYWTcy9aauFu zg?^U@PH=XT5Mn*hR;T39(hgLUp)fB}J{tn<{#0UB&=E(dbJ>_=80~(7{)uRN6I5pZ zyy+>%kF z198C}5Is(c-O{brGJRS0fgPdOI;iz#bS!Q440517$}1?L%x!%b4~C2(<4{b}y=D*n z&kg-s17&nDR@4<2?fK{7f8CQhLK!qs&&;5`N!mlFHBcR$$am#h)np3fG|r3!^{c>g2ZAfMimOK!2Kf$#$jRbI>i0!Hgi*wS&w9d+T#cota-;SJ zp#54vrD_JD!L}wdl01-xj{aecjDVj-wjl!Q%OCnCKsV`v5dus}qZAe)to5eW?E-Mv zc|oJL1_%cvdm%|Ic=LyH==YGQ4BW#|Z&tEzNr-0$h9fN^*m5EDiw_>uxGspnWKrya zD@)p;v@dDlPPQjkgh9;n59`uQFV6sI#xR4i0)(g)@&Cd>e-kUzN|2eOR~(s}i~x8^ zO5zW0AY#Ok1)*R2dr6D5ag)l7Gn)|_Lf1E>p`pGDQ|zVeX*eUkw`gDXWAm+GmWSr% z&!|DxzpGV?VPm`mMzu)bBUfg5!jcSp$~M8YlO2%{mV=RiUayCdb+>1f=_>>lORS#CVEDEh;5!S#RPf=2se1V z4;g~lMsPd~NhS~lpO5@O{jkXGt0?^*OVupHtcl7FthNv_qO$L^O_h!-XJMI_3TFKAk-A1F|e7|z#zi?dq6A7@tF#iib zWWG>M^b^0Uf8lr0|I_#XhAlp_!i%I!*q8iDU#7>eUV;A?KU}^LMfz)gp)ZvCvTpl) zA%Vmv8c2Pi)F+ZK7hk;{9gu$H{)wYo*d4#cq4-2a?=LK&`b0$IFO2`fzn))cP5Fs} zeqZQE`G5NUUop?(3p@TppZ_23Qh&ve@`Zd~RzvqMB&7Mo8{aSVruyFt!|a<;_$Ngd zJb66u{1xDS^W)}+Xj@XrFloilYh6;&yC`RHTT0`#kt1j+jT2QjZ}5M9bn`@|P0s&j zW?o42%WFt^q)1(o>*$V`6P=~W5MUt^{W3OzuRSX1ddYWeP%ZO2G^&N(s%ZyQiaO5j z42@B+nU(a^Cl;L+3Gbpj49id_>EutqWW+PWEh;Qo2$3O{J&$5n3;uqVz4w9kicFVB zT#BhF1rJTJt^+ z@^AyPk$wdu`URa_>Hw^IHa_}j*x#aqV{}|nJd&eZdorS`2)i?sALhk6Lg--alX1etzn$0UV+%0DpCJ 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 z�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%0DJQR7sG>Xt#p#V(I8GKf74o* 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

{ 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

LlCHqghW6o`YlXts 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 A0{{R3 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/copy.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..5b01ab165a9d1adeee1142b4ea5a0c47278c0689 GIT binary patch literal 2184 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 KfL+QIrTrJRQ-Rt5 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..43df1559f7cf9546065ef4864e605a834df47b51 GIT binary patch literal 1607 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI1#=yXM&$lK5$YDu$^mSxlxOU@;e}oZ`FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpC$O5Fu(I+G%F`dC)!8b7_RUto5 zArZ(*R^)Z9NX{uO&MZq+NXsu$2+mC`&dAJ52g;=9c{FoijrsN?cNllZ!G7 zN;32FfI+yXM}5RnejUS+Wl7>dU|T^vIyZYBNs|KFb3 zD1k}v^Ru(R|9^db{eJ;ta&mIp{`&t)Au+ql-rl&jHoCv@1_R@fjvThn>*M!N+gJCu zN;hCbqi0Nv&8?FsJ0ITOp3kG>ecgrAxJ1HVNM7J!W^?A=z4@(A z^5i{##6PVszG~a@VcC=>L$>EKUYY_<6Qa-k-1*b}hv@-Jd(){w{MowG1d@6bTIQ^X zdi{|nnPQT$IzbLn-bEqiyquXz7aut6tld!hu(BJs{?T!E5h z3zC?WEqSYVB&pm`l5Ar0mOC(ad%+*SLt&G&EfnwW{%$#KcJZ^7g);mz-r9WFnk&8a z+Pvq>%DrCR+xGtV!YPYNV#b4&KN$t7MH4jesUanDhyefFE zGUEDGp2G_762EWK>3v?wwx%lK9dpqg#ecCpEm~^6!7Bw^Cnh|yE{&R&s^&R~Ij7>E zB!9yEUF)hh=l+&^w=Z?N0Z*%=(4o!me;+HH!~IRJ@%WL#nx+Nre?7D(TIS4|v%MwK zQJ^Dqg&_0oZKA!?QVl~xCH3z2*@hinbxP`ERx+<>23-~Uc8 zOPSDjIQ@>f!Xww@{VXrG^n^-vG->P#P1<=>sN+V<1UC;sMb~Tmf;u@z?_D}CVDHL( zP;G+9&n6K?0Vl21xm!QXJGk3s@|upuv$x-zt1eD|c5d#UjPlJ3u4dhRURl>{R*@W~ zeZfNJ>PMF=)mMKh>^`5bZtDO2qU|d!(Q?%(@=@ov&Qp7#q%L;jWQvgX&Q+_lZs%_mR_e_p;m{9rn<7PmN^r`oXxdYf;B1rE>;FX0u(7@Cbiqk(TjFEc$wC z^PGLFZ{90;bG1=3-IJrZ)vyUCI0#j&)qp z^9c;B;Bd0qu_K&!QC#yu1rc^#gAITG_Fh&h^(eXg(nLvBi0}3H-#064__p0_wElfP z@#2#fW{W+SUtZbVyT#z=#nAt%8$2wHj~|OztSl~iWLC)5Khgaw9IIwXKELwUQYk?3 whM0}@N5#Gw-!;Gfzopr0IJ)>1ONa4 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv_hover.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/csv_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..10b34d3b90b3f7712f6de998fbc98a051b38a661 GIT binary patch literal 1854 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 TzzMz{00000NkvXXu0mjfWhV~A literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/pdf_hover.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/pdf_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..eb06855f4fc6bb57036cf61324149e3f8e27c902 GIT binary patch literal 2786 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 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/print_hover.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/print_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..9808a9cc9c59c3968494faea0399864448fdb3f4 GIT binary patch literal 2230 zcmb7_c|6p67sr3r1~ZnfWk?xIiiEL+$`}SCOJWGwh8bgQ6DC_@D_e+>r9_Ik;r5_h zYf9sy!DSlRsf!{dvZjfVdB$J&-{(26*Li)nNZ3TTM{wuWE4IsAd+~MOeBT#MgXuzqyN8NjL&DVc}k-L+`nE9U|s*Cp;J$c zUje`&BU=;_6Fcp{$K@gf^!)gxVpfy(xZBH@pMhPlaS#C|_QiB1M4~QErcg6QNXNIG z{9RO1U}_NH>&XlicISTFW+7F&a##-$To#kbT;JTjp80)j;BKC&iHSTQC^_GqA@LW# zg~bgnm&+Mg|GuOzY!oeSO@*qyph{a(Q0wzKg(!JzYinWZj-sL>SlG=mM=RY_0qht( zu4iRs1@@&U1o#Euv1nUc{LmN%&JTiFlh-;QY=3#HnjX-b3#a_rUE;PreaO}EYFq!> zah(l?nw!2#;?6WvwxVELy zUsQfeZmyv@0N3_zmtO6mCvhW9O-&Oy>@}sydY(#m<^A(5h?AEz4g!AkQwpjvvWnQr zk6T!|{79Wjg33$(?hX|+QR*;+!`}j$aRSc0U43s@os9ne_2qfHbRH*ZUQpo+mO0qj zHP{9GxzWqg0Z%;b*gGOC!%mo(=>RJs00{YqsGp>ajCQTo;5W|Z_Nhsa!NEa4aHJ4g zwU6dY=LR}qsDW44L4LUWqGErL*d~d42-C@8u{!yhihhH}t*nI3WePr~JwznwQTF%b zq2yWlm0IR)bLAdfF!4IZ!X9Jk<5PTGL%IC(JckXox3>qwX7@RqyD37@nbSwTNy+IA zq<8JEaxg&YQ|mNJGHrtteTGxLs;++JhCvn#nmS&J*6f;Q$O?XY%z|b5ZCgtzRmy#{ z^66w~X6_35fMiA=ooRu$33VIUX-D&_p;~x($vr3J*)!epi-TqQ^tDoMms#-1q6>IM zT;o&+#f)@&y}dp=xY;!1{vxM4<5cc^j=;2Z;IKx1&s*7Sp`M66#}R|#flvGW#Lbaj ziDoA2MCkC7w*H~x@7wPGZmwPMCn=9)ig^-?jk37$GhgDAZy!5J-)-?NFssQp+ zuIm$RIeqAu?|h5m-bxqy9q8szW~JnXI=AleA1yU>FYTLGFom`jpKd9oK@#3MJf{DAuEj1r*+DItbKWWMrD~$T;qJqHv>SvUkSrf^Ga-mOvujy$8DDiiYh_7QKW_fK1|FX?j(kfw+=TFz-fm8$-?4aB;ksc=82 zx||azjKp@^ss9?h9<_R&{XWXZXLhxzVc03}m(Zq`p{wcwzE%sARe8kez8PvNrQ=3t zor3wIK$Gn%wqlK|i8%aQ`e(yXvOBR_--bpD*znVx%mvCnhJU5!v;+}OsBHDS*(DM^ zXn$Q5eLdVOq*JOTGUu}G7%AhSQBsV)R0u8`I|Tb&Wxj?0XMOajqn>pn42d_VBrit1 zFpw{69I?}Ns2b3^Bwm7ZR)9Dx{82HJGA%7wUAl5p(ZL7^>OXbRmZjv*Ra6 zY(Po(+4g|=VI6_O{>3lI3Bj?NW2OmY2}-w>j_-DA{OpgT8IT2h-aDqVncHKxafW|` zp~%yudm`%UeWrImCQw9nRJ+H;GE)7ZnCxES)7HI5mB##_Nc3V#^6fOVnlt*u<H}ZllwAh0Ka*zPT7YdQLphI{Gzo#AU?boT6~eD$@wCGGnbK!#yhz zNg&x3Mu?|;y{KFJfJ^1f>dR|u6qf>T3j@W7!{WP7AtLcp8qccR+U~WtzZeM%`!?~h o;Us;q!HUvr$byH37?TLU_*S9#_)UUT%E868wQ@w&Tln4hFFz3kD*ylh literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/collection.psd b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/collection.psd new file mode 100644 index 0000000000000000000000000000000000000000..7eb7caf2cc5c98e1d9ac04de50b2009b344bbe85 GIT binary patch literal 25792 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 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/copy document.psd b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/copy document.psd new file mode 100644 index 0000000000000000000000000000000000000000..ca207adc608751b51eb5265bda2b7392889305a3 GIT binary patch literal 104729 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 -z29Kyi71;_?78Nx8T@Kyi71;_?8+RhFJ*IS|(R zV!bqG3$m6Y9v^AF3fsCthdKb8O7xR9@|=69)Pv@ zipvA2wFHaH1F+0cad`k1%V$L^SsYCE>MAY|kaByTV_~l1@&H?95wPO&04xw!Tpoa> z30Ww-xI6&-vA8?{E7KL12XJIxhvM=8tj8()?Xbs4ae06YhIVmzfQT&i>J^sWuE$@eH70Ukd8Mek_dn}y|5LtL%HXcf`TY{_z%vJ`nxdfXp%Oz3E zke;z{b+Hc|`__Og)Ixrv&xX$IR`^vOop z(RFdz*IZwxwr-QXd2kiTOO9-Z$=1QdM%mL#b|6ZzxnFU4fFyg*;aw~)53r35>x;_+ z$hJ_z9b{+uSlZ}jx1FRHW;3FoeJdL(>2`$u?-ns`eZ20^Pn;Xg=BKD?7eb_|G4etGJ=9#Tg zww_^^NcOr)T49SR3IP*Q*u$DlpP23d^>+luR@q;W*$V72BU>Y?rFYrBhwYjIwtZsz zCgyn-mj@^=4^UhlptwAM6LdUZTppmfJV0@Ifa3B1#pMBt%L5db2k7n%vol|>7|-mA z$xg0G_F|PSx7nB0^Lu){cn_P(vT0!ow*s4n%l@Kv8n-~AH`yL_66_hsPKM~+GG~|> z4Z4|#$&RD4AKzp8)*kkR#3|sg>#WWG=#Y^SVn|;FfM3B zH+ybJEFwmRnWQOfk;oKh!^r4tTg#@!?1(8fF(ulM~Upj z%#RU`2H(-GsOg3~LTuw1V;@Ff%Pk{pM7hu8^k~#h>l@hhol326G9G0=^T4~0eUaG> z*zaWv$Fvp3f^(7)wg?a6>~k+w6qg4mE)P -z29Kyi71;_?8+*%Z6t|PmTavb|hC)Rb}+9$jh zUzN*Ixyz2X$f&J7`s$HgS+c&ld+bY2Jhb+?hZC7!zO{Q)?xN#uGEG?f>Z`kU?cTlX zmoLA%`?aHcCcL(LSD%wuyKCKpvCOMS_l)ho-gboSC2Of>Bx$d{y8EbP-@R+s4sY#& zSDt-P@00BP*X>8iK3+=S{Tlgq@7a4~&+qMhZTD-h?pV8L&x_CeB>B>7dj?%^C3|-G zTAK3qYuP<-?LE4uWbdnQtsU{R)b727i;_{=SYAHPTTX?#oe z?mMz~)T^o31BsXR9?e~jkW1CF*Y@l=x_8WOO5DGH-`>4%@6YZ#x_9JjnYHm3_v9{y zb3xXT^l$H8ZkFsnaCE=6@96&Qfh@VRd$W5kSQ~wD@BaM<4p0V#?Aap^3|~wBqx-V^ z-#(!2e=DDN#GbX0o%`O-Uky_k8PUDN_w7Hh|IGtO50aVYj$GTjv#Kh8QIfBo+NGR> zM-RPypk#k8*Gp9oRUOG)scfU^JzY6KN!bIX2M-45o=$24QL+F4jwr?;`PI?zj62| znf5IkQw0?BRgO??%jFq!=)j>j4pKb@l~hq?pgckORcbVjzE*M%?H_Z`?%m)7ojY=H#DRSWUO({GzHy+*?t3CTs+KLQdVAkUbw$>a zd!T}`d&qiF!R6?oEJMgp?j1+=C_t1(%Jp!rd0^r_6iwOt_Nxbu(2@_+PspOG>Ymt3 zj3oKh^=_4aEcqFyy#OBI9MS|t`)Leh#(2hFmel=Y)OGHG59AsTUJITGY!B=MO0ON= zJwZnF#eMnfw|A?)js+&tBKmuD|1dCH#`Ap-Rqa&>O1coQG+evq=&q98djQcMAV|)t z|JTmhw6qa~aeQ}u+mK?sRm~inCkjrG$h$JmjBepPB#8^J6bjepimz|Pva2rw;U-Ya<8F7}WWxDaRy%g6YR1Cz6u_c5n-7CdBD+Op~Jm<^x+-e@3@ zLUNmN!F=cNOeAUE-^sDSg2S1gc7V35AVjYTPguY2yg$X|I+^9Gy(l=$_nFd)nD?L& zD4z(<8S|T|8oB+DLvK6yhN<#*yr*$`(To|IPW*o7!&&`zihVQNw{^#Q{pRhhW3%+BO3g{ z1*jg!AKbKv27jny5H0>-W{Kp$pYk&Y{@`au{K3vH{<`?dHq+&-EWf7Eqp4*XG9HJJ&2 zlmdTnGBf_*XFmKXNA>uFpF;=So?waRT|Ik5Wh&{`8}d5jTbTEXKB1l5I;%lm4WzC znrjFrQYHVxr)d|l47+R>OXcB_(XsJ~$*Gyyx%q{~rR9~?_-T1{WqE0FVSa9QW@>U` Td~9@NxLhjQ$40|Q%*gl&pqPNb literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/file_types.psd b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/file_types.psd new file mode 100644 index 0000000000000000000000000000000000000000..0f280ad520ae61fc8bf3f6d0781d878c28e62a73 GIT binary patch literal 1090645 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%0D!*7gJ&xXg{)WOAPknlyJ>Sq1bGcb~zFrJobK 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 NIbZ(A+IS-N{{g?^6wUwu literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/printer.psd b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/psd/printer.psd new file mode 100644 index 0000000000000000000000000000000000000000..8c33f7aaadcb2e4932ec714f29a6717f05de2bd6 GIT binary patch literal 119952 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 RPsfkiB~w3|a8^@5`)|Mpx1|68 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls.png new file mode 100644 index 0000000000000000000000000000000000000000..5aaf40d0e3ebe984398903d89d11cf9bc21385c0 GIT binary patch literal 1641 zcmb7^dpy&77{`BDv)GzzO&$7?vb|XDW#u*@w{hBBMyY<7SuS&#>*Tr#-4H5`LnI;B zmXcUmvE)c3Md*H+qC*m8Xa4HnbDr1hd3~Sf`~5uc*XQ;9`zng}=m$V`xusnP~UCz6N&FfuyqK{b)~8Y~AYi^2?M#Y53FfEdIKpn=Ze5S>P* zK|zU8BATUCWU(qDx_Np+bif8AK|wT-8397lDo`8ckPsLa8^egBfx*mZkP;5XgfJrL z(lKf!;{Lgr^N(DGa^|GW`y(#0A?z?{;wAct7G4#lRH*%zrC!&?*2zZ`n49F z(qH`OY)|w|cpmUmBC(M(IV`I@_pX0g@=ffMjdZ%#l`2`8dDi;gCc9r&x@m$Kii^XSXk@g6-y6x-KkUF zbLSB7;04aKx$6gPD&s^rMghVurr7Th$sz&8W)1WGRRKBmw#0N87Nz1OT*2n5ZD>fo zKI1RhHK{VOjK3u0ss2qE_N(A`YT+*FeIz2H8a-V!bvbF|2M0sLFD_tSTRvjHw^a)4 zz?rN#^jP1=TpP)YvF^D!SZ7$0Vk&Z`hJIB}Bbi)J$8aiYn1CG@TcECk$#^GRUuaNd z{H5KjPz`CTN|Q?xLay4oaK$y#rzNSjac$w1xInk=`&{)>tsWVx#aqWaOCKH`ODyXr z?3F9UIpMT9zy#Z+oWCN(!Jyq*PCan>jeqE)Y~BB7JwX6|iRpO(%I@ zkF-km@8*tO|4b>VmX8Gx$m}d=vFv>!8uaq|m3yPk&>-QB5qZe$O`;aQ&yMEn5+3&L zl<4Tm*NcMhHe4-idY-twO1z5;VVlnwzpUEooS`;N$nr>C7`YY7Zd1$j7ds7&an|si znfQVsH7qje%!P?!_DuXr@+2Xw_l0kHjTHwz zR?o4<+V%Qfedn*ZcA5`_^8JQl#N2G+($cR^D-oiF0(Imq$2%8{f0!PN%gRmbyI5v1 zNZFcQiEWQ)8zaG5s0K*jSHRn3>o(abPNv>;-BWS0Vo|xzRU6ho->Ie<)dke-xckbW4_P(#*&2PUn=OE667#nV zY!G0)S;B%Z2!_{(Q&u-?^{XR2w$)DMb+J9Ls@;=EZ{xpcf-nL66T0|S5v3@$q#8bc zgm2KX45yF!jC_Y{%=Q{Cd>k=8+jr@$!NA;MORWuE-R*-RY7c`=6)&@W-aZ-B7V}1; z{@4S}og<@`0ivkXU2k@KN{FW{l+PB?R17uEL(DdM%gXTFws}|0`}CxN1)F@{?xRWO zgvIEJ&6X9*vW{N!C0y8Ir(qa79T2!|*I8&nHFnTc-(Yt*<6piT&6xlI literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls_hover.png b/assets/grocery_crud/themes/datatables/extras/TableTools/media/images/xls_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1930afd86e7ef439026ee89e75520c086471f5 GIT binary patch literal 2061 zcmb7_dpHvcAIFzDGtT5v)~3lUrG?ta>SWj$DJBfDl-bNoW0{#vB)8o1qI#?0xK-YC zKaNWzm-M2@r94F{&E!&N?+A^#?47^Pzwi5dp5ODkf1dAuzie->Bf2`qIsgDb_ozF` zR~?Nv91H>gHhm^12C5597LiN@0NxD`9S^io*KodTAfLhw=f{Wgm;hoJm(D~UjS6Kk zeVL(QqL`OVyn5--#uCxf&o7h(a6*zp!pfU z1Us6gp0Pp`*wIWg&w@fdH3PfBaN(X6@z|^gKA;-;x9K8nFqq$vbP@76N6q0O{nTQ@ zxbd-P*gxx7#p+`hwqGEh#EfO|*k}1{ZnU}u0LX8){=ZrdIboA@B@8SrE&t=&@>EgKRCFayrwil0e$CWJqi^?abQ*Jk03(ocH9G} z-QDG&0DwN>Qg`@c*txQxZ}L~BM$@ZlDd;{~!~&~Wc#%8Sf_;p^VzDJQo$#TtwViT8te0B1+9Jb!J|Fq^wJ;9f! z@p9Pt)undKn!9z!&6WMImgJSq^(M#*u)$|Q;HANTH>}U|Y;9MUmh(e-b$dFVDoo)M z6B96TDPH*`?Yhi94JM2-xb*4;-%mN>oH9({g2%9rIpgH|ALF=P`y{P@2Zkh1YB`WZ9?#;XSZLD;`7zeHM zI((Revkmpq0i`XFKmJ+SrA1EwPjk=&R28G#-ZZnz09P<28kPx2D1%?I?{pgFG*|4d zMtGAq_m)NDgNL2eXDz!bZlX<{H}@}8-f;Cve;K9>%b&nA=^9&H8XT|Ri^&nNXxaa~ zbBFE0bQoIyxqaw_Tei~enm$i+^4bY&F?wl7aN&$$yu$EPaV@Yp*LD`X<#46FU$%+BHgE%rP0%o7sbuXs#96$LL;&$VRPm19mTT6Vp7QSdeg1;$H z{{H=I=T-Z*_rqfcitVo6V-_x<|cPN6Mw=sJBxECJf& za>b7@n-TK&IOV~Un&`!ukio)a3+t6EA4cHljj{p8=y%lmjmqxvsrzj^1%RF;n?93! z<^Gk#?hXtjqNsj!YQC;ZI``)gsb3frumEhGiEW&$uI9u>2L|TEJfjhe${O_Gp9}QHtn)HN8wODZZQdRWnTydB|GGYF~xTqhZ_G0w}$z2b?CL>1nN{iSl2 zDy(-{W4{z>uM!u`Q)zDW+km){p|7&gydO(55GHq@q1{a$(v{B-z^+N0Fru0oRBW2{_7|YRA zd#MbS;H9Tm^}Rg`znr+OmHa#3ojTK6gtKz8D`^5AQIu$`1mx9-sfmMQDKtl%aWg2H+sFotDXNROl$ ax&mAY+hYDES`WPO$d0;tksdnJQvVCjG_(i+ literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.js b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.js new file mode 100644 index 000000000..37d96a127 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.js @@ -0,0 +1,2406 @@ +/* + * File: TableTools.js + * Version: 2.1.2 + * Description: Tools and buttons for DataTables + * Author: Allan Jardine (www.sprymedia.co.uk) + * Language: Javascript + * License: GPL v2 or BSD 3 point style + * Project: DataTables + * + * Copyright 2009-2012 Allan Jardine, all rights reserved. + * + * This source file is free software, under either the GPL v2 license or a + * BSD style license, available at: + * http://datatables.net/license_gpl2 + * http://datatables.net/license_bsd + */ + +/* Global scope for TableTools */ +var TableTools; + +(function($, window, document) { + +/** + * TableTools provides flexible buttons and other tools for a DataTables enhanced table + * @class TableTools + * @constructor + * @param {Object} oDT DataTables instance + * @param {Object} oOpts TableTools options + * @param {String} oOpts.sSwfPath ZeroClipboard SWF path + * @param {String} oOpts.sRowSelect Row selection options - 'none', 'single' or 'multi' + * @param {Function} oOpts.fnPreRowSelect Callback function just prior to row selection + * @param {Function} oOpts.fnRowSelected Callback function just after row selection + * @param {Function} oOpts.fnRowDeselected Callback function when row is deselected + * @param {Array} oOpts.aButtons List of buttons to be used + */ +TableTools = function( oDT, oOpts ) +{ + /* Santiy check that we are a new instance */ + if ( ! this instanceof TableTools ) + { + alert( "Warning: TableTools must be initialised with the keyword 'new'" ); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * @namespace Settings object which contains customisable information for TableTools instance + */ + this.s = { + /** + * Store 'this' so the instance can be retreieved from the settings object + * @property that + * @type object + * @default this + */ + "that": this, + + /** + * DataTables settings objects + * @property dt + * @type object + * @default From the oDT init option + */ + "dt": oDT.fnSettings(), + + /** + * @namespace Print specific information + */ + "print": { + /** + * DataTables draw 'start' point before the printing display was shown + * @property saveStart + * @type int + * @default -1 + */ + "saveStart": -1, + + /** + * DataTables draw 'length' point before the printing display was shown + * @property saveLength + * @type int + * @default -1 + */ + "saveLength": -1, + + /** + * Page scrolling point before the printing display was shown so it can be restored + * @property saveScroll + * @type int + * @default -1 + */ + "saveScroll": -1, + + /** + * Wrapped function to end the print display (to maintain scope) + * @property funcEnd + * @type Function + * @default function () {} + */ + "funcEnd": function () {} + }, + + /** + * A unique ID is assigned to each button in each instance + * @property buttonCounter + * @type int + * @default 0 + */ + "buttonCounter": 0, + + /** + * @namespace Select rows specific information + */ + "select": { + /** + * Select type - can be 'none', 'single' or 'multi' + * @property type + * @type string + * @default "" + */ + "type": "", + + /** + * Array of nodes which are currently selected + * @property selected + * @type array + * @default [] + */ + "selected": [], + + /** + * Function to run before the selection can take place. Will cancel the select if the + * function returns false + * @property preRowSelect + * @type Function + * @default null + */ + "preRowSelect": null, + + /** + * Function to run when a row is selected + * @property postSelected + * @type Function + * @default null + */ + "postSelected": null, + + /** + * Function to run when a row is deselected + * @property postDeselected + * @type Function + * @default null + */ + "postDeselected": null, + + /** + * Indicate if all rows are selected (needed for server-side processing) + * @property all + * @type boolean + * @default false + */ + "all": false, + + /** + * Class name to add to selected TR nodes + * @property selectedClass + * @type String + * @default "" + */ + "selectedClass": "" + }, + + /** + * Store of the user input customisation object + * @property custom + * @type object + * @default {} + */ + "custom": {}, + + /** + * SWF movie path + * @property swfPath + * @type string + * @default "" + */ + "swfPath": "", + + /** + * Default button set + * @property buttonSet + * @type array + * @default [] + */ + "buttonSet": [], + + /** + * When there is more than one TableTools instance for a DataTable, there must be a + * master which controls events (row selection etc) + * @property master + * @type boolean + * @default false + */ + "master": false, + + /** + * Tag names that are used for creating collections and buttons + * @namesapce + */ + "tags": {} + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + /** + * DIV element that is create and all TableTools buttons (and their children) put into + * @property container + * @type node + * @default null + */ + "container": null, + + /** + * The table node to which TableTools will be applied + * @property table + * @type node + * @default null + */ + "table": null, + + /** + * @namespace Nodes used for the print display + */ + "print": { + /** + * Nodes which have been removed from the display by setting them to display none + * @property hidden + * @type array + * @default [] + */ + "hidden": [], + + /** + * The information display saying tellng the user about the print display + * @property message + * @type node + * @default null + */ + "message": null + }, + + /** + * @namespace Nodes used for a collection display. This contains the currently used collection + */ + "collection": { + /** + * The div wrapper containing the buttons in the collection (i.e. the menu) + * @property collection + * @type node + * @default null + */ + "collection": null, + + /** + * Background display to provide focus and capture events + * @property background + * @type node + * @default null + */ + "background": null + } + }; + + /** + * @namespace Name space for the classes that this TableTools instance will use + * @extends TableTools.classes + */ + this.classes = $.extend( true, {}, TableTools.classes ); + if ( this.s.dt.bJUI ) + { + $.extend( true, this.classes, TableTools.classes_themeroller ); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @method fnSettings + * @returns {object} TableTools settings object + */ + this.fnSettings = function () { + return this.s; + }; + + + /* Constructor logic */ + if ( typeof oOpts == 'undefined' ) + { + oOpts = {}; + } + + this._fnConstruct( oOpts ); + + return this; +}; + + + +TableTools.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @returns {array} List of TR nodes which are currently selected + */ + "fnGetSelected": function () + { + var out=[]; + var data=this.s.dt.aoData; + var i, iLen; + + for ( i=0, iLen=data.length ; i 0 ) + { + sTitle = anTitle[0].innerHTML; + } + } + + /* Strip characters which the OS will object to - checking for UTF8 support in the scripting + * engine + */ + if ( "\u00A1".toString().length < 4 ) { + return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, ""); + } else { + return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, ""); + } + }, + + + /** + * Calculate a unity array with the column width by proportion for a set of columns to be + * included for a button. This is particularly useful for PDF creation, where we can use the + * column widths calculated by the browser to size the columns in the PDF. + * @param {Object} oConfig Button configuration object + * @returns {Array} Unity array of column ratios + */ + "fnCalcColRatios": function ( oConfig ) + { + var + aoCols = this.s.dt.aoColumns, + aColumnsInc = this._fnColumnTargets( oConfig.mColumns ), + aColWidths = [], + iWidth = 0, iTotal = 0, i, iLen; + + for ( i=0, iLen=aColumnsInc.length ; i

Copied '+len+' row'+plural+' to the clipboard.

', + 1500 + ); + } + } ), + + "pdf": $.extend( {}, TableTools.buttonBase, { + "sAction": "flash_pdf", + "sNewLine": "\n", + "sFileName": "*.pdf", + "sButtonClass": "DTTT_button_pdf", + "sButtonText": "PDF", + "sPdfOrientation": "portrait", + "sPdfSize": "A4", + "sPdfMessage": "", + "fnClick": function( nButton, oConfig, flash ) { + this.fnSetText( flash, + "title:"+ this.fnGetTitle(oConfig) +"\n"+ + "message:"+ oConfig.sPdfMessage +"\n"+ + "colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+ + "orientation:"+ oConfig.sPdfOrientation +"\n"+ + "size:"+ oConfig.sPdfSize +"\n"+ + "--/TableToolsOpts--\n" + + this.fnGetTableData(oConfig) + ); + } + } ), + + "print": $.extend( {}, TableTools.buttonBase, { + "sInfo": "
Print view

Please use your browser's print function to "+ + "print this table. Press escape when finished.", + "sMessage": null, + "bShowAll": true, + "sToolTip": "View print view", + "sButtonClass": "DTTT_button_print", + "sButtonText": "Print", + "fnClick": function ( nButton, oConfig ) { + this.fnPrint( true, oConfig ); + } + } ), + + "text": $.extend( {}, TableTools.buttonBase ), + + "select": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select button", + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length !== 0 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "select_single": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select button", + "fnSelect": function( nButton, oConfig ) { + var iSelected = this.fnGetSelected().length; + if ( iSelected == 1 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "select_all": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select all", + "fnClick": function( nButton, oConfig ) { + this.fnSelectAll(); + }, + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length == this.s.dt.fnRecordsDisplay() ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } else { + $(nButton).removeClass( this.classes.buttons.disabled ); + } + } + } ), + + "select_none": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Deselect all", + "fnClick": function( nButton, oConfig ) { + this.fnSelectNone(); + }, + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length !== 0 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "ajax": $.extend( {}, TableTools.buttonBase, { + "sAjaxUrl": "/xhr.php", + "sButtonText": "Ajax button", + "fnClick": function( nButton, oConfig ) { + var sData = this.fnGetTableData(oConfig); + $.ajax( { + "url": oConfig.sAjaxUrl, + "data": [ + { "name": "tableData", "value": sData } + ], + "success": oConfig.fnAjaxComplete, + "dataType": "json", + "type": "POST", + "cache": false, + "error": function () { + alert( "Error detected when sending table data to server" ); + } + } ); + }, + "fnAjaxComplete": function( json ) { + alert( 'Ajax complete' ); + } + } ), + + "div": $.extend( {}, TableTools.buttonBase, { + "sAction": "div", + "sTag": "div", + "sButtonClass": "DTTT_nonbutton", + "sButtonText": "Text button" + } ), + + "collection": $.extend( {}, TableTools.buttonBase, { + "sAction": "collection", + "sButtonClass": "DTTT_button_collection", + "sButtonText": "Collection", + "fnClick": function( nButton, oConfig ) { + this._fnCollectionShow(nButton, oConfig); + } + } ) +}; +/* + * on* callback parameters: + * 1. node - button element + * 2. object - configuration object for this button + * 3. object - ZeroClipboard reference (flash button only) + * 4. string - Returned string from Flash (flash button only - and only on 'complete') + */ + + + +/** + * @namespace Classes used by TableTools - allows the styles to be overriden easily. + * Note that when TableTools initialises it will take a copy of the classes object + * and will use its internal copy for the remainder of its run time. + */ +TableTools.classes = { + "container": "DTTT_container", + "buttons": { + "normal": "DTTT_button", + "disabled": "DTTT_disabled" + }, + "collection": { + "container": "DTTT_collection", + "background": "DTTT_collection_background", + "buttons": { + "normal": "DTTT_button", + "disabled": "DTTT_disabled" + } + }, + "select": { + "table": "DTTT_selectable", + "row": "DTTT_selected" + }, + "print": { + "body": "DTTT_Print", + "info": "DTTT_print_info", + "message": "DTTT_PrintMessage" + } +}; + + +/** + * @namespace ThemeRoller classes - built in for compability with DataTables' + * bJQueryUI option. + */ +TableTools.classes_themeroller = { + "container": "DTTT_container ui-buttonset ui-buttonset-multi", + "buttons": { + "normal": "DTTT_button ui-button ui-state-default" + }, + "collection": { + "container": "DTTT_collection ui-buttonset ui-buttonset-multi" + } +}; + + +/** + * @namespace TableTools default settings for initialisation + */ +TableTools.DEFAULTS = { + "sSwfPath": "media/swf/copy_csv_xls_pdf.swf", + "sRowSelect": "none", + "sSelectedClass": null, + "fnPreRowSelect": null, + "fnRowSelected": null, + "fnRowDeselected": null, + "aButtons": [ "copy", "csv", "xls", "pdf", "print" ], + "oTags": { + "container": "div", + "button": "a", // We really want to use buttons here, but Firefox and IE ignore the + // click on the Flash element in the button (but not mouse[in|out]). + "liner": "span", + "collection": { + "container": "div", + "button": "a", + "liner": "span" + } + } +}; + + +/** + * Name of this class + * @constant CLASS + * @type String + * @default TableTools + */ +TableTools.prototype.CLASS = "TableTools"; + + +/** + * TableTools version + * @constant VERSION + * @type String + * @default See code + */ +TableTools.VERSION = "2.1.2"; +TableTools.prototype.VERSION = TableTools.VERSION; + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Register a new feature with DataTables + */ +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.9.0') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( oDTSettings ) { + var oOpts = typeof oDTSettings.oInit.oTableTools != 'undefined' ? + oDTSettings.oInit.oTableTools : {}; + + var oTT = new TableTools( oDTSettings.oInstance, oOpts ); + TableTools._aInstances.push( oTT ); + + return oTT.dom.container; + }, + "cFeature": "T", + "sFeature": "TableTools" + } ); +} +else +{ + alert( "Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download"); +} + +$.fn.DataTable.TableTools = TableTools; + +})(jQuery, window, document); diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js new file mode 100644 index 000000000..a15d1a3fe --- /dev/null +++ b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js @@ -0,0 +1,76 @@ +// Simple Set Clipboard System +// Author: Joseph Huckaby +var ZeroClipboard_TableTools={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=document.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(RegExp("\\s*"+ +a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,c){(a=this.clients[a])&&a.receiveEvent(b,c)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!=a.style.width&&(b.width=a.style.width.replace("px",""));""!=a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b}, +Client:function(a){this.handlers={};this.id=ZeroClipboard_TableTools.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;ZeroClipboard_TableTools.register(this.id,this);a&&this.glue(a)}}; +ZeroClipboard_TableTools.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,glue:function(a,b){this.domElement=ZeroClipboard_TableTools.$(a);var c=99;this.domElement.style.zIndex&&(c=parseInt(this.domElement.style.zIndex)+1);var d=ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);this.div=document.createElement("div");var e=this.div.style;e.position="absolute";e.left="0px";e.top="0px";e.width=d.width+ +"px";e.height=d.height+"px";e.zIndex=c;"undefined"!=typeof b&&""!=b&&(this.div.title=b);0!=d.width&&0!=d.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(d.width,d.height))},positionElement:function(){var a=ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.left=this.domElement.offsetLeft+"px";b.top=this.domElement.offsetTop+"px";b.width=a.width+"px";b.height=a.height+"px";0!=a.width&& +0!=a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var c="",d="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var e=location.href.match(/^https/i)?"https://":"http://",c=c+('');else c+='';return c},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=document.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.div=this.domElement=null}},reposition:function(a){a&&((this.domElement=ZeroClipboard_TableTools.$(a))||this.hide());if(this.domElement&&this.div){var a=ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement), +b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setCharSet:function(a){this.charSet=a;this.ready&&this.movie.setCharSet(a)},setBomInc:function(a){this.incBom=a;this.ready&&this.movie.setBomInc(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)}, +setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=document.getElementById(this.movieId); +if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setCharSet(this.charSet);this.movie.setBomInc(this.incBom);this.movie.setHandCursor(this.handCursorEnabled); +break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var d= +0,e=this.handlers[a].length;d"\u00a1".toString().length?b.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,""):b.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g,"")},fnCalcColRatios:function(a){var b=this.s.dt.aoColumns,a=this._fnColumnTargets(a.mColumns),c=[],d=0,e=0,h,f;h=0;for(f=a.length;hj?p:j)+"px";l.style.width=(k>n?k:n)+"px";l.className=this.classes.collection.background;e(l).css("opacity",0);f.body.appendChild(l);f.body.appendChild(g);p=e(g).outerWidth();k=e(g).outerHeight();h+p>n&&(g.style.left=n-p+"px");d+k>j&&(g.style.top=d-k-e(a).outerHeight()+"px");this.dom.collection.collection=g;this.dom.collection.background= +l;setTimeout(function(){e(g).animate({opacity:1},500);e(l).animate({opacity:0.25},500)},10);this.fnResizeButtons();e(l).click(function(){c._fnCollectionHide.call(c,null,null)})},_fnCollectionHide:function(a,b){!(null!==b&&"collection"==b.sExtends)&&null!==this.dom.collection.collection&&(e(this.dom.collection.collection).animate({opacity:0},500,function(){this.style.display="none"}),e(this.dom.collection.background).animate({opacity:0},500,function(){this.parentNode.removeChild(this)}),this.dom.collection.collection= +null,this.dom.collection.background=null)},_fnRowSelectConfig:function(){if(this.s.master){var a=this,b=this.s.dt;e(b.nTable).addClass(this.classes.select.table);e("tr",b.nTBody).live("click",function(c){if(this.parentNode==b.nTBody&&null!==b.oInstance.fnGetData(this)&&(null===a.s.select.preRowSelect||a.s.select.preRowSelect.call(a,c)))a.fnIsSelected(this)?a._fnRowDeselect(this):"single"==a.s.select.type?(a.fnSelectNone(),a._fnRowSelect(this)):"multi"==a.s.select.type&&a._fnRowSelect(this)});b.oApi._fnCallbackReg(b, +"aoRowCreatedCallback",function(c,d,g){b.aoData[g]._DTTT_selected&&e(c).addClass(a.classes.select.row)},"TableTools-SelectAll")}},_fnRowSelect:function(a){for(var a=this._fnSelectData(a),b=0===a.length?null:a[0].nTr,c=0,d=a.length;c/g,"").replace(/^\s+|\s+$/g,""),j=this._fnHtmlDecode(j),h.push(this._fnBoundData(j,a.sFieldBoundary,l)));f.push(h.join(a.sFieldSeperator))}var o=k.aiDisplay;g=this.fnGetSelected();if("none"!==this.s.select.type&&d&&0!==g.length){o=[];b=0;for(c=g.length;b]+)).*?>/gi,"$1$2$3"),j=j.replace(/<.*?>/g,"")):j+="",j=j.replace(/^\s+/,"").replace(/\s+$/,""),j=this._fnHtmlDecode(j),h.push(this._fnBoundData(j,a.sFieldBoundary,l)));f.push(h.join(a.sFieldSeperator));a.bOpenRows&&(b=e.grep(k.aoOpenRows,function(a){return a.nParent===n}), +1===b.length&&(j=this._fnBoundData(e("td",b[0].nTr).html(),a.sFieldBoundary,l),f.push(j)))}if(a.bFooter&&null!==k.nTFoot){h=[];b=0;for(c=k.aoColumns.length;b/g,""),j=this._fnHtmlDecode(j),h.push(this._fnBoundData(j,a.sFieldBoundary,l)));f.push(h.join(a.sFieldSeperator))}return _sLastData=f.join(this._fnNewline(a))},_fnBoundData:function(a,b,c){return""===b?a:b+a.replace(c,b+b)+b},_fnChunkData:function(a, +b){for(var c=[],d=a.length,e=0;ea[c].length-8)&&(a[c].substr(e),a[c]=a[c].substr(0,e)),b.innerHTML=a[c],h+=b.childNodes[0].nodeValue;return h},_fnPrintStart:function(a){var b=this,c=this.s.dt;this._fnPrintHideNodes(c.nTable); +this.s.print.saveStart=c._iDisplayStart;this.s.print.saveLength=c._iDisplayLength;a.bShowAll&&(c._iDisplayStart=0,c._iDisplayLength=-1,c.oApi._fnCalculateEnd(c),c.oApi._fnDraw(c));(""!==c.oScroll.sX||""!==c.oScroll.sY)&&this._fnPrintScrollStart(c);var c=c.aanFeatures,d;for(d in c)if("i"!=d&&"t"!=d&&1==d.length)for(var g=0,h=c[d].length;gTable copied

Copied "+a+" row"+(1==a?"":"s")+" to the clipboard.

",1500)}}),pdf:e.extend({},TableTools.buttonBase,{sAction:"flash_pdf",sNewLine:"\n",sFileName:"*.pdf",sButtonClass:"DTTT_button_pdf",sButtonText:"PDF",sPdfOrientation:"portrait",sPdfSize:"A4",sPdfMessage:"",fnClick:function(a,b,c){this.fnSetText(c,"title:"+this.fnGetTitle(b)+"\nmessage:"+b.sPdfMessage+"\ncolWidth:"+this.fnCalcColRatios(b)+"\norientation:"+ +b.sPdfOrientation+"\nsize:"+b.sPdfSize+"\n--/TableToolsOpts--\n"+this.fnGetTableData(b))}}),print:e.extend({},TableTools.buttonBase,{sInfo:"
Print view

Please use your browser's print function to print this table. Press escape when finished.",sMessage:null,bShowAll:!0,sToolTip:"View print view",sButtonClass:"DTTT_button_print",sButtonText:"Print",fnClick:function(a,b){this.fnPrint(!0,b)}}),text:e.extend({},TableTools.buttonBase),select:e.extend({},TableTools.buttonBase,{sButtonText:"Select button", +fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),select_single:e.extend({},TableTools.buttonBase,{sButtonText:"Select button",fnSelect:function(a){1==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}), +select_all:e.extend({},TableTools.buttonBase,{sButtonText:"Select all",fnClick:function(){this.fnSelectAll()},fnSelect:function(a){this.fnGetSelected().length==this.s.dt.fnRecordsDisplay()?e(a).addClass(this.classes.buttons.disabled):e(a).removeClass(this.classes.buttons.disabled)}}),select_none:e.extend({},TableTools.buttonBase,{sButtonText:"Deselect all",fnClick:function(){this.fnSelectNone()},fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)}, +fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),ajax:e.extend({},TableTools.buttonBase,{sAjaxUrl:"/xhr.php",sButtonText:"Ajax button",fnClick:function(a,b){var c=this.fnGetTableData(b);e.ajax({url:b.sAjaxUrl,data:[{name:"tableData",value:c}],success:b.fnAjaxComplete,dataType:"json",type:"POST",cache:!1,error:function(){alert("Error detected when sending table data to server")}})},fnAjaxComplete:function(){alert("Ajax complete")}}),div:e.extend({},TableTools.buttonBase,{sAction:"div", +sTag:"div",sButtonClass:"DTTT_nonbutton",sButtonText:"Text button"}),collection:e.extend({},TableTools.buttonBase,{sAction:"collection",sButtonClass:"DTTT_button_collection",sButtonText:"Collection",fnClick:function(a,b){this._fnCollectionShow(a,b)}})};TableTools.classes={container:"DTTT_container",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"},collection:{container:"DTTT_collection",background:"DTTT_collection_background",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"}},select:{table:"DTTT_selectable", +row:"DTTT_selected"},print:{body:"DTTT_Print",info:"DTTT_print_info",message:"DTTT_PrintMessage"}};TableTools.classes_themeroller={container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}};TableTools.DEFAULTS={sSwfPath:"media/swf/copy_csv_xls_pdf.swf",sRowSelect:"none",sSelectedClass:null,fnPreRowSelect:null,fnRowSelected:null,fnRowDeselected:null,aButtons:["copy","csv", +"xls","pdf","print"],oTags:{container:"div",button:"a",liner:"span",collection:{container:"div",button:"a",liner:"span"}}};TableTools.prototype.CLASS="TableTools";TableTools.VERSION="2.1.2";TableTools.prototype.VERSION=TableTools.VERSION;"function"==typeof e.fn.dataTable&&"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){a=new TableTools(a.oInstance,"undefined"!=typeof a.oInit.oTableTools?a.oInit.oTableTools: +{});TableTools._aInstances.push(a);return a.dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");e.fn.DataTable.TableTools=TableTools})(jQuery,window,document); diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js.gz b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/TableTools.min.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..63ba2ceea26f38b37bffdded18236485f3b729ee GIT binary patch literal 8688 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 OQ~NK(e!eRHaR2~(O4Moq literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/ZeroClipboard.js b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/ZeroClipboard.js new file mode 100644 index 000000000..be0a04819 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/extras/TableTools/media/js/ZeroClipboard.js @@ -0,0 +1,367 @@ +// Simple Set Clipboard System +// Author: Joseph Huckaby + +var ZeroClipboard_TableTools = { + + version: "1.0.4-TableTools2", + clients: {}, // registered upload clients on page, indexed by id + moviePath: '', // URL to movie + nextId: 1, // ID of next movie + + $: function(thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function() { this.style.display = 'none'; }; + thingy.show = function() { this.style.display = ''; }; + thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; + thingy.removeClass = function(name) { + this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); + }; + thingy.hasClass = function(name) { + return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); + } + } + return thingy; + }, + + setMoviePath: function(path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function(id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function(id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function(obj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + if ( obj.style.width != "" ) + info.width = obj.style.width.replace("px",""); + + if ( obj.style.height != "" ) + info.height = obj.style.height.replace("px",""); + + while (obj) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + obj = obj.offsetParent; + } + + return info; + }, + + Client: function(elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard_TableTools.nextId++; + this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard_TableTools.register(this.id, this); + + // create movie + if (elem) this.glue(elem); + } +}; + +ZeroClipboard_TableTools.Client.prototype = { + + id: 0, // unique ID for us + ready: false, // whether movie is ready to receive events or not + movie: null, // reference to movie object + clipText: '', // text to copy to clipboard + fileName: '', // default file save name + action: 'copy', // action to perform + handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor + cssEffects: true, // enable CSS mouse effects on dom container + handlers: null, // user event handlers + sized: false, + + glue: function(elem, title) { + // glue to DOM element + // elem can be ID or actual DOM element object + this.domElement = ZeroClipboard_TableTools.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex) + 1; + } + + // find X/Y position of domElement + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + + // create floating DIV above element + this.div = document.createElement('div'); + var style = this.div.style; + style.position = 'absolute'; + style.left = '0px'; + style.top = '0px'; + style.width = (box.width) + 'px'; + style.height = box.height + 'px'; + style.zIndex = zIndex; + + if ( typeof title != "undefined" && title != "" ) { + this.div.title = title; + } + if ( box.width != 0 && box.height != 0 ) { + this.sized = true; + } + + // style.backgroundColor = '#f00'; // debug + if ( this.domElement ) { + this.domElement.appendChild(this.div); + this.div.innerHTML = this.getHTML( box.width, box.height ); + } + }, + + positionElement: function() { + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + var style = this.div.style; + + style.position = 'absolute'; + style.left = (this.domElement.offsetLeft)+'px'; + style.top = this.domElement.offsetTop+'px'; + style.width = box.width + 'px'; + style.height = box.height + 'px'; + + if ( box.width != 0 && box.height != 0 ) { + this.sized = true; + } else { + return; + } + + var flash = this.div.childNodes[0]; + flash.width = box.width; + flash.height = box.height; + }, + + getHTML: function(width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + + '&width=' + width + + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += ''; + } + else { + // all other browsers get an EMBED tag + html += ''; + } + return html; + }, + + hide: function() { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function() { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function() { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { body.removeChild( this.div ); } catch(e) {;} + + this.domElement = null; + this.div = null; + } + }, + + reposition: function(elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard_TableTools.$(elem); + if (!this.domElement) this.hide(); + } + + if (this.domElement && this.div) { + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + clearText: function() { + // clear the text to be copy / saved + this.clipText = ''; + if (this.ready) this.movie.clearText(); + }, + + appendText: function(newText) { + // append text to that which is to be copied / saved + this.clipText += newText; + if (this.ready) { this.movie.appendText(newText) ;} + }, + + setText: function(newText) { + // set text to be copied to be copied / saved + this.clipText = newText; + if (this.ready) { this.movie.setText(newText) ;} + }, + + setCharSet: function(charSet) { + // set the character set (UTF16LE or UTF8) + this.charSet = charSet; + if (this.ready) { this.movie.setCharSet(charSet) ;} + }, + + setBomInc: function(bomInc) { + // set if the BOM should be included or not + this.incBom = bomInc; + if (this.ready) { this.movie.setBomInc(bomInc) ;} + }, + + setFileName: function(newText) { + // set the file name + this.fileName = newText; + if (this.ready) this.movie.setFileName(newText); + }, + + setAction: function(newText) { + // set action (save or copy) + this.action = newText; + if (this.ready) this.movie.setAction(newText); + }, + + addEventListener: function(eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) this.handlers[eventName] = []; + this.handlers[eventName].push(func); + }, + + setHandCursor: function(enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) this.movie.setHandCursor(enabled); + }, + + setCSSEffects: function(enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !!enabled; + }, + + receiveEvent: function(eventName, args) { + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 1 ); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 100 ); + this.ready = true; + return; + } + + this.ready = true; + this.movie.clearText(); + this.movie.appendText( this.clipText ); + this.movie.setFileName( this.fileName ); + this.movie.setAction( this.action ); + this.movie.setCharSet( this.charSet ); + this.movie.setBomInc( this.incBom ); + this.movie.setHandCursor( this.handCursorEnabled ); + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + //this.domElement.addClass('hover'); + if (this.recoverActive) this.domElement.addClass('active'); + } + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + //this.domElement.removeClass('hover'); + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } + else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][ func[1] ](this, args); + } + else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; diff --git a/assets/grocery_crud/themes/datatables/extras/TableTools/media/swf/copy_csv_xls.swf b/assets/grocery_crud/themes/datatables/extras/TableTools/media/swf/copy_csv_xls.swf new file mode 100644 index 0000000000000000000000000000000000000000..35ddc3f3d77d7cd85ea608a505e2d97feeefcb64 GIT binary patch literal 2139 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±N1eBtL`?iMyhf-{zf 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 kS9|(aAQ1TZL%;p?4}SGGze)bO{ + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/js/datatables-add.js b/assets/grocery_crud/themes/datatables/js/datatables-add.js new file mode 100644 index 000000000..e345c87c8 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/js/datatables-add.js @@ -0,0 +1,143 @@ +$(function(){ + $('.ptogtitle').click(function(){ + if($(this).hasClass('vsble')) + { + $(this).removeClass('vsble'); + $('#main-table-box').slideDown("slow"); + } + else + { + $(this).addClass('vsble'); + $('#main-table-box').slideUp("slow"); + } + }); + + var save_and_close = false; + var reload_datagrid = function () { + $('.refresh-data').trigger('click'); + }; + + $('#save-and-go-back-button').click(function(){ + save_and_close = true; + + $('#crudForm').trigger('submit'); + }); + + $('#crudForm').submit(function(){ + $(this).ajaxSubmit({ + url: validation_url, + dataType: 'json', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(data){ + $("#FormLoading").hide(); + if(data.success) + { + $('#crudForm').ajaxSubmit({ + dataType: 'text', + cache: 'false', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(result){ + $("#FormLoading").fadeOut("slow"); + data = $.parseJSON( result ); + if(data.success) + { + if(save_and_close) + { + if ($('#save-and-go-back-button').closest('.ui-dialog').length === 0) { + window.location = data.success_list_url; + } else { + $(".ui-dialog-content").dialog("close"); + success_message(data.success_message); + reload_datagrid(); + } + + return true; + } + + $('.field_error').removeClass('field_error'); + + form_success_message(data.success_message); + reload_datagrid(); + + clearForm(); + } + else + { + form_error_message('An error has been occured at the insert.'); + } + } + }); + } + else + { + $('.field_error').removeClass('field_error'); + form_error_message(data.error_message); + $.each(data.error_fields, function(index,value){ + $('#crudForm input[name='+index+']').addClass('field_error'); + }); + + } + } + }); + return false; + }); + + $('.ui-input-button').button(); + $('.gotoListButton').button({ + icons: { + primary: "ui-icon-triangle-1-w" + } + }); + + if( $('#cancel-button').closest('.ui-dialog').length === 0 ) { + + $('#cancel-button').click(function(){ + if( confirm( message_alert_add_form ) ) + { + window.location = list_url; + } + + return false; + }); + + } + }); + + function clearForm() + { + $('#crudForm').find(':input').each(function() { + switch(this.type) { + case 'password': + case 'select-multiple': + case 'select-one': + case 'text': + case 'textarea': + $(this).val(''); + break; + case 'checkbox': + case 'radio': + this.checked = false; + } + }); + + /* Clear upload inputs */ + $('.open-file,.gc-file-upload,.hidden-upload-input').each(function(){ + $(this).val(''); + }); + + $('.upload-success-url').hide(); + $('.fileinput-button').fadeIn("normal"); + /* -------------------- */ + + $('.remove-all').each(function(){ + $(this).trigger('click'); + }); + + $('.chosen-multiple-select, .chosen-select, .ajax-chosen-select').each(function(){ + $(this).trigger("liszt:updated"); + }); + } \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/js/datatables-edit.js b/assets/grocery_crud/themes/datatables/js/datatables-edit.js new file mode 100644 index 000000000..333041000 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/js/datatables-edit.js @@ -0,0 +1,99 @@ +$(function(){ + + var save_and_close = false; + + var reload_datagrid = function () { + $('.refresh-data').trigger('click'); + }; + + $('#save-and-go-back-button').click(function(){ + save_and_close = true; + + $('#crudForm').trigger('submit'); + }); + + $('#crudForm').submit(function(){ + $(this).ajaxSubmit({ + url: validation_url, + dataType: 'json', + beforeSend: function(){ + $("#FormLoading").show(); + }, + cache: false, + success: function(data){ + $("#FormLoading").hide(); + if(data.success) + { + $('#crudForm').ajaxSubmit({ + dataType: 'text', + cache: false, + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(result){ + $("#FormLoading").fadeOut("slow"); + data = $.parseJSON( result ); + if(data.success) + { + if(save_and_close) + { + if ($('#save-and-go-back-button').closest('.ui-dialog').length === 0) { + window.location = data.success_list_url; + } else { + $(".ui-dialog-content").dialog("close"); + success_message(data.success_message); + reload_datagrid(); + } + + return true; + } + + $('.field_error').removeClass('field_error'); + + form_success_message(data.success_message); + reload_datagrid(); + } + else + { + form_error_message(message_update_error); + } + }, + error: function(){ + form_error_message( message_update_error ); + } + }); + } + else + { + $('.field_error').removeClass('field_error'); + form_error_message(data.error_message); + $.each(data.error_fields, function(index,value){ + $('#crudForm input[name='+index+']').addClass('field_error'); + }); + } + } + }); + return false; + }); + + $('.ui-input-button').button(); + $('.gotoListButton').button({ + icons: { + primary: "ui-icon-triangle-1-w" + } + }); + + if( $('#cancel-button').closest('.ui-dialog').length === 0 ) { + + $('#cancel-button').click(function(){ + if( $(this).hasClass('back-to-list') || confirm( message_alert_edit_form ) ) + { + window.location = list_url; + } + + return false; + }); + + } + +}); \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/js/datatables-extras.js b/assets/grocery_crud/themes/datatables/js/datatables-extras.js new file mode 100644 index 000000000..c7c30572c --- /dev/null +++ b/assets/grocery_crud/themes/datatables/js/datatables-extras.js @@ -0,0 +1,26 @@ +$.fn.dataTableExt.oApi.fnFilterClear = function ( oSettings ) +{ + /* Remove global filter */ + oSettings.oPreviousSearch.sSearch = ""; + + /* Remove the text of the global filter in the input boxes */ + if ( typeof oSettings.aanFeatures.f != 'undefined' ) + { + var n = oSettings.aanFeatures.f; + for ( var i=0, iLen=n.length ; i 1) { + use_storage = false; + } + + $('.groceryCrudTable').each(function(index){ + if (typeof oTableArray[index] !== 'undefined') { + return false; + } + + oTableMapping[$(this).attr('id')] = index; + + oTableArray[index] = loadDataTable(this); + }); + + $(".groceryCrudTable tfoot input").keyup( function () { + + chosen_table = datatables_get_chosen_table($(this).closest('.groceryCrudTable')); + + chosen_table.fnFilter( this.value, chosen_table.find("tfoot input").index(this) ); + + if(use_storage) + { + var search_values_array = []; + + chosen_table.find("tfoot tr th").each(function(index,value){ + search_values_array[index] = $(this).children(':first').val(); + }); + + localStorage.setItem( 'datatables_search_'+ unique_hash ,'["' + search_values_array.join('","') + '"]'); + } + } ); + + var search_values = localStorage.getItem('datatables_search_'+ unique_hash); + + if( search_values !== null) + { + $.each($.parseJSON(search_values),function(num,val){ + if(val !== '') + { + $(".groceryCrudTable tfoot tr th:eq("+num+")").children(':first').val(val); + } + }); + } + + $('.clear-filtering').click(function(){ + localStorage.removeItem( 'DataTables_' + unique_hash); + localStorage.removeItem( 'datatables_search_'+ unique_hash); + + chosen_table = datatables_get_chosen_table($(this).closest('.groceryCrudTable')); + + chosen_table.fnFilterClear(); + $(this).closest('.groceryCrudTable').find("tfoot tr th input").val(""); + }); + + loadListenersForDatatables(); + + $('a.ui-button').on("mouseover mouseout", function(event) { + if ( event.type == "mouseover" ) { + $(this).addClass('ui-state-hover'); + } else { + $(this).removeClass('ui-state-hover'); + } + }); + + $('th.actions').unbind('click'); + $('th.actions>div .DataTables_sort_icon').remove(); + +} ); + +function loadListenersForDatatables() { + + $('.refresh-data').click(function(){ + var this_container = $(this).closest('.dataTablesContainer'); + + var new_container = $("
").addClass('dataTablesContainer'); + + this_container.after(new_container); + this_container.remove(); + + $.ajax({ + url: $(this).attr('data-url'), + success: function(my_output){ + new_container.html(my_output); + + loadDataTable(new_container.find('.groceryCrudTable')); + + loadListenersForDatatables(); + } + }); + }); +} + +function loadDataTable(this_datatables) { + return $(this_datatables).dataTable({ + "bJQueryUI": true, + "sPaginationType": "full_numbers", + "bStateSave": use_storage, + "fnStateSave": function (oSettings, oData) { + localStorage.setItem( 'DataTables_' + unique_hash, JSON.stringify(oData) ); + }, + "fnStateLoad": function (oSettings) { + return JSON.parse( localStorage.getItem('DataTables_'+unique_hash) ); + }, + "iDisplayLength": default_per_page, + "aaSorting": datatables_aaSorting, + "oLanguage":{ + "sProcessing": list_loading, + "sLengthMenu": show_entries_string, + "sZeroRecords": list_no_items, + "sInfo": displaying_paging_string, + "sInfoEmpty": list_zero_entries, + "sInfoFiltered": filtered_from_string, + "sSearch": search_string+":", + "oPaginate": { + "sFirst": paging_first, + "sPrevious": paging_previous, + "sNext": paging_next, + "sLast": paging_last + } + }, + "bDestory": true, + "bRetrieve": true, + "fnDrawCallback": function() { + $('.image-thumbnail').fancybox({ + 'transitionIn' : 'elastic', + 'transitionOut' : 'elastic', + 'speedIn' : 600, + 'speedOut' : 200, + 'overlayShow' : false + }); + add_edit_button_listener(); + }, + "sDom": 'T<"clear"><"H"lfr>t<"F"ip>', + "oTableTools": { + "aButtons": aButtons, + "sSwfPath": base_url+"assets/grocery_crud/themes/datatables/extras/TableTools/media/swf/copy_csv_xls_pdf.swf" + } + }); +} + +function datatables_get_chosen_table(table_as_object) +{ + chosen_table_index = oTableMapping[table_as_object.attr('id')]; + return oTableArray[chosen_table_index]; +} + +function delete_row(delete_url , row_id) +{ + if(confirm(message_alert_delete)) + { + $.ajax({ + url: delete_url, + dataType: 'json', + success: function(data) + { + if(data.success) + { + success_message(data.success_message); + + chosen_table = datatables_get_chosen_table($('tr#row-'+row_id).closest('.groceryCrudTable')); + + $('tr#row-'+row_id).addClass('row_selected'); + var anSelected = fnGetSelected( chosen_table ); + chosen_table.fnDeleteRow( anSelected[0] ); + } + else + { + error_message(data.error_message); + } + } + }); + } + + return false; +} + +function fnGetSelected( oTableLocal ) +{ + var aReturn = new Array(); + var aTrs = oTableLocal.fnGetNodes(); + + for ( var i=0 ; i + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/js/jquery.dataTables.js b/assets/grocery_crud/themes/datatables/js/jquery.dataTables.js new file mode 100644 index 000000000..ae5d1750d --- /dev/null +++ b/assets/grocery_crud/themes/datatables/js/jquery.dataTables.js @@ -0,0 +1,11863 @@ +/** + * @summary DataTables + * @description Paginate, search and sort HTML tables + * @version 1.9.2 + * @file jquery.dataTables.js + * @author Allan Jardine (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * + * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved. + * + * This source file is free software, under either the GPL v2 license or a + * BSD style license, available at: + * http://datatables.net/license_gpl2 + * http://datatables.net/license_bsd + * + * This source file 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 license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +/*jslint evil: true, undef: true, browser: true */ +/*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros*/ + +(/** @lends */function($, window, document, undefined) { + /** + * DataTables is a plug-in for the jQuery Javascript library. It is a + * highly flexible tool, based upon the foundations of progressive + * enhancement, which will add advanced interaction controls to any + * HTML table. For a full list of features please refer to + *
DataTables.net. + * + * Note that the DataTable object is not a global variable but is + * aliased to jQuery.fn.DataTable and jQuery.fn.dataTable through which + * it may be accessed. + * + * @class + * @param {object} [oInit={}] Configuration object for DataTables. Options + * are defined by {@link DataTable.defaults} + * @requires jQuery 1.3+ + * + * @example + * // Basic initialisation + * $(document).ready( function { + * $('#example').dataTable(); + * } ); + * + * @example + * // Initialisation with configuration options - in this case, disable + * // pagination and sorting. + * $(document).ready( function { + * $('#example').dataTable( { + * "bPaginate": false, + * "bSort": false + * } ); + * } ); + */ + var DataTable = function( oInit ) + { + + + /** + * Add a column to the list used for the table with default values + * @param {object} oSettings dataTables settings object + * @param {node} nTh The th element for this column + * @memberof DataTable#oApi + */ + function _fnAddColumn( oSettings, nTh ) + { + var oDefaults = DataTable.defaults.columns; + var iCol = oSettings.aoColumns.length; + var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { + "sSortingClass": oSettings.oClasses.sSortable, + "sSortingClassJUI": oSettings.oClasses.sSortJUI, + "nTh": nTh ? nTh : document.createElement('th'), + "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', + "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], + "mDataProp": oDefaults.mDataProp ? oDefaults.oDefaults : iCol + } ); + oSettings.aoColumns.push( oCol ); + + /* Add a column specific filter */ + if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) + { + oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); + } + else + { + var oPre = oSettings.aoPreSearchCols[ iCol ]; + + /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ + if ( oPre.bRegex === undefined ) + { + oPre.bRegex = true; + } + + if ( oPre.bSmart === undefined ) + { + oPre.bSmart = true; + } + + if ( oPre.bCaseInsensitive === undefined ) + { + oPre.bCaseInsensitive = true; + } + } + + /* Use the column options function to initialise classes etc */ + _fnColumnOptions( oSettings, iCol, null ); + } + + + /** + * Apply options for a column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column index to consider + * @param {object} oOptions object with sType, bVisible and bSearchable + * @memberof DataTable#oApi + */ + function _fnColumnOptions( oSettings, iCol, oOptions ) + { + var oCol = oSettings.aoColumns[ iCol ]; + + /* User specified column options */ + if ( oOptions !== undefined && oOptions !== null ) + { + if ( oOptions.sType !== undefined ) + { + oCol.sType = oOptions.sType; + oCol._bAutoType = false; + } + + $.extend( oCol, oOptions ); + _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); + + /* iDataSort to be applied (backwards compatibility), but aDataSort will take + * priority if defined + */ + if ( oOptions.iDataSort !== undefined ) + { + oCol.aDataSort = [ oOptions.iDataSort ]; + } + _fnMap( oCol, oOptions, "aDataSort" ); + } + + /* Cache the data get and set functions for speed */ + oCol.fnGetData = _fnGetObjectDataFn( oCol.mDataProp ); + oCol.fnSetData = _fnSetObjectDataFn( oCol.mDataProp ); + + /* Feature sorting overrides column specific when off */ + if ( !oSettings.oFeatures.bSort ) + { + oCol.bSortable = false; + } + + /* Check that the class assignment is correct for sorting */ + if ( !oCol.bSortable || + ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableNone; + oCol.sSortingClassJUI = ""; + } + else if ( oCol.bSortable || + ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) + { + oCol.sSortingClass = oSettings.oClasses.sSortable; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; + } + else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableAsc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; + } + else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableDesc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; + } + } + + + /** + * Adjust the table column widths for new data. Note: you would probably want to + * do a redraw after calling this function! + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAdjustColumnSizing ( oSettings ) + { + /* Not interested in doing column width calculation if autowidth is disabled */ + if ( oSettings.oFeatures.bAutoWidth === false ) + { + return false; + } + + _fnCalculateColumnWidths( oSettings ); + for ( var i=0 , iLen=oSettings.aoColumns.length ; i
')[0]; + oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); + + /* + * All DataTables are wrapped in a div + */ + oSettings.nTableWrapper = $('
')[0]; + oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; + + /* Track where we want to insert the option */ + var nInsertNode = oSettings.nTableWrapper; + + /* Loop over the user set positioning and place the elements as needed */ + var aDom = oSettings.sDom.split(''); + var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j; + for ( var i=0 ; i
')[0]; + + /* Check to see if we should append an id and/or a class name to the container */ + cNext = aDom[i+1]; + if ( cNext == "'" || cNext == '"' ) + { + sAttr = ""; + j = 2; + while ( aDom[i+j] != cNext ) + { + sAttr += aDom[i+j]; + j++; + } + + /* Replace jQuery UI constants */ + if ( sAttr == "H" ) + { + sAttr = oSettings.oClasses.sJUIHeader; + } + else if ( sAttr == "F" ) + { + sAttr = oSettings.oClasses.sJUIFooter; + } + + /* The attribute can be in the format of "#id.class", "#id" or "class" This logic + * breaks the string into parts and applies them as needed + */ + if ( sAttr.indexOf('.') != -1 ) + { + var aSplit = sAttr.split('.'); + nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); + nNewNode.className = aSplit[1]; + } + else if ( sAttr.charAt(0) == "#" ) + { + nNewNode.id = sAttr.substr(1, sAttr.length-1); + } + else + { + nNewNode.className = sAttr; + } + + i += j; /* Move along the position array */ + } + + nInsertNode.appendChild( nNewNode ); + nInsertNode = nNewNode; + } + else if ( cOption == '>' ) + { + /* End container div */ + nInsertNode = nInsertNode.parentNode; + } + else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange ) + { + /* Length */ + nTmp = _fnFeatureHtmlLength( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'f' && oSettings.oFeatures.bFilter ) + { + /* Filter */ + nTmp = _fnFeatureHtmlFilter( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'r' && oSettings.oFeatures.bProcessing ) + { + /* pRocessing */ + nTmp = _fnFeatureHtmlProcessing( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 't' ) + { + /* Table */ + nTmp = _fnFeatureHtmlTable( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'i' && oSettings.oFeatures.bInfo ) + { + /* Info */ + nTmp = _fnFeatureHtmlInfo( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'p' && oSettings.oFeatures.bPaginate ) + { + /* Pagination */ + nTmp = _fnFeatureHtmlPaginate( oSettings ); + iPushFeature = 1; + } + else if ( DataTable.ext.aoFeatures.length !== 0 ) + { + /* Plug-in features */ + var aoFeatures = DataTable.ext.aoFeatures; + for ( var k=0, kLen=aoFeatures.length ; k') : + sSearchStr==="" ? '' : sSearchStr+' '; + + var nFilter = document.createElement( 'div' ); + nFilter.className = oSettings.oClasses.sFilter; + nFilter.innerHTML = ''; + if ( !oSettings.aanFeatures.f ) + { + nFilter.id = oSettings.sTableId+'_filter'; + } + + var jqFilter = $('input[type="text"]', nFilter); + + // Store a reference to the input element, so other input elements could be + // added to the filter wrapper if needed (submit button for example) + nFilter._DT_Input = jqFilter[0]; + + jqFilter.val( oPreviousSearch.sSearch.replace('"','"') ); + jqFilter.bind( 'keyup.DT', function(e) { + /* Update all other filter input elements for the new display */ + var n = oSettings.aanFeatures.f; + var val = this.value==="" ? "" : this.value; // mental IE8 fix :-( + + for ( var i=0, iLen=n.length ; i=0 ; i-- ) + { + var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ), + oSettings.aoColumns[iColumn].sType ); + if ( ! rpSearch.test( sData ) ) + { + oSettings.aiDisplay.splice( i, 1 ); + iIndexCorrector++; + } + } + } + + + /** + * Filter the data table based on user input and draw the table + * @param {object} oSettings dataTables settings object + * @param {string} sInput string to filter on + * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0) + * @param {bool} bRegex treat as a regular expression or not + * @param {bool} bSmart perform smart filtering or not + * @param {bool} bCaseInsensitive Do case insenstive matching or not + * @memberof DataTable#oApi + */ + function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive ) + { + var i; + var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); + var oPrevSearch = oSettings.oPreviousSearch; + + /* Check if we are forcing or not - optional parameter */ + if ( !iForce ) + { + iForce = 0; + } + + /* Need to take account of custom filtering functions - always filter */ + if ( DataTable.ext.afnFiltering.length !== 0 ) + { + iForce = 1; + } + + /* + * If the input is blank - we want the full data set + */ + if ( sInput.length <= 0 ) + { + oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); + oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); + } + else + { + /* + * We are starting a new search or the new search string is smaller + * then the old one (i.e. delete). Search from the master array + */ + if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || + oPrevSearch.sSearch.length > sInput.length || iForce == 1 || + sInput.indexOf(oPrevSearch.sSearch) !== 0 ) + { + /* Nuke the old display array - we are going to rebuild it */ + oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); + + /* Force a rebuild of the search array */ + _fnBuildSearchArray( oSettings, 1 ); + + /* Search through all records to populate the search array + * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 + * mapping + */ + for ( i=0 ; i tag - remove it */ + sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,""); + } + + return sSearch; + } + + /** + * Build a regular expression object suitable for searching a table + * @param {string} sSearch string to search for + * @param {bool} bRegex treat as a regular expression or not + * @param {bool} bSmart perform smart filtering or not + * @param {bool} bCaseInsensitive Do case insenstive matching or not + * @returns {RegExp} constructed object + * @memberof DataTable#oApi + */ + function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive ) + { + var asSearch, sRegExpString; + + if ( bSmart ) + { + /* Generate the regular expression to use. Something along the lines of: + * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ + */ + asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' ); + sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$'; + return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" ); + } + else + { + sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch ); + return new RegExp( sSearch, bCaseInsensitive ? "i" : "" ); + } + } + + + /** + * Convert raw data into something that the user can search on + * @param {string} sData data to be modified + * @param {string} sType data type + * @returns {string} search string + * @memberof DataTable#oApi + */ + function _fnDataToSearch ( sData, sType ) + { + if ( typeof DataTable.ext.ofnSearch[sType] === "function" ) + { + return DataTable.ext.ofnSearch[sType]( sData ); + } + else if ( sData === null ) + { + return ''; + } + else if ( sType == "html" ) + { + return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" ); + } + else if ( typeof sData === "string" ) + { + return sData.replace(/[\r\n]/g," "); + } + return sData; + } + + + /** + * scape a string stuch that it can be used in a regular expression + * @param {string} sVal string to escape + * @returns {string} escaped string + * @memberof DataTable#oApi + */ + function _fnEscapeRegex ( sVal ) + { + var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ]; + var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' ); + return sVal.replace(reReplace, '\\$1'); + } + + + + /** + * Generate the node required for the info display + * @param {object} oSettings dataTables settings object + * @returns {node} Information element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlInfo ( oSettings ) + { + var nInfo = document.createElement( 'div' ); + nInfo.className = oSettings.oClasses.sInfo; + + /* Actions that are to be taken once only for this feature */ + if ( !oSettings.aanFeatures.i ) + { + /* Add draw callback */ + oSettings.aoDrawCallback.push( { + "fn": _fnUpdateInfo, + "sName": "information" + } ); + + /* Add id */ + nInfo.id = oSettings.sTableId+'_info'; + } + oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' ); + + return nInfo; + } + + + /** + * Update the information elements in the display + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnUpdateInfo ( oSettings ) + { + /* Show information about the table */ + if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 ) + { + return; + } + + var + oLang = oSettings.oLanguage, + iStart = oSettings._iDisplayStart+1, + iEnd = oSettings.fnDisplayEnd(), + iMax = oSettings.fnRecordsTotal(), + iTotal = oSettings.fnRecordsDisplay(), + sOut; + + if ( iTotal === 0 && iTotal == iMax ) + { + /* Empty record set */ + sOut = oLang.sInfoEmpty; + } + else if ( iTotal === 0 ) + { + /* Empty record set after filtering */ + sOut = oLang.sInfoEmpty +' '+ oLang.sInfoFiltered; + } + else if ( iTotal == iMax ) + { + /* Normal record set */ + sOut = oLang.sInfo; + } + else + { + /* Record set after filtering */ + sOut = oLang.sInfo +' '+ oLang.sInfoFiltered; + } + + // Convert the macros + sOut += oLang.sInfoPostFix; + sOut = _fnInfoMacros( oSettings, sOut ); + + if ( oLang.fnInfoCallback !== null ) + { + sOut = oLang.fnInfoCallback.call( oSettings.oInstance, + oSettings, iStart, iEnd, iMax, iTotal, sOut ); + } + + var n = oSettings.aanFeatures.i; + for ( var i=0, iLen=n.length ; i'; + var i, iLen; + var aLengthMenu = oSettings.aLengthMenu; + + if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && + typeof aLengthMenu[1] === 'object' ) + { + for ( i=0, iLen=aLengthMenu[0].length ; i'+aLengthMenu[1][i]+''; + } + } + else + { + for ( i=0, iLen=aLengthMenu.length ; i'+aLengthMenu[i]+''; + } + } + sStdMenu += ''; + + var nLength = document.createElement( 'div' ); + if ( !oSettings.aanFeatures.l ) + { + nLength.id = oSettings.sTableId+'_length'; + } + nLength.className = oSettings.oClasses.sLength; + nLength.innerHTML = ''; + + /* + * Set the length to the current display length - thanks to Andrea Pavlovic for this fix, + * and Stefan Skopnik for fixing the fix! + */ + $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true); + + $('select', nLength).bind( 'change.DT', function(e) { + var iVal = $(this).val(); + + /* Update all other length options for the new display */ + var n = oSettings.aanFeatures.l; + for ( i=0, iLen=n.length ; i oSettings.aiDisplay.length || + oSettings._iDisplayLength == -1 ) + { + oSettings._iDisplayEnd = oSettings.aiDisplay.length; + } + else + { + oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; + } + } + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Note that most of the paging logic is done in + * DataTable.ext.oPagination + */ + + /** + * Generate the node required for default pagination + * @param {object} oSettings dataTables settings object + * @returns {node} Pagination feature node + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlPaginate ( oSettings ) + { + if ( oSettings.oScroll.bInfinite ) + { + return null; + } + + var nPaginate = document.createElement( 'div' ); + nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType; + + DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, + function( oSettings ) { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + ); + + /* Add a draw callback for the pagination on first instance, to update the paging display */ + if ( !oSettings.aanFeatures.p ) + { + oSettings.aoDrawCallback.push( { + "fn": function( oSettings ) { + DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } ); + }, + "sName": "pagination" + } ); + } + return nPaginate; + } + + + /** + * Alter the display settings to change the page + * @param {object} oSettings dataTables settings object + * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" + * or page number to jump to (integer) + * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1 + * @memberof DataTable#oApi + */ + function _fnPageChange ( oSettings, mAction ) + { + var iOldStart = oSettings._iDisplayStart; + + if ( typeof mAction === "number" ) + { + oSettings._iDisplayStart = mAction * oSettings._iDisplayLength; + if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "first" ) + { + oSettings._iDisplayStart = 0; + } + else if ( mAction == "previous" ) + { + oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? + oSettings._iDisplayStart - oSettings._iDisplayLength : + 0; + + /* Correct for underrun */ + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "next" ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + /* Make sure we are not over running the display array */ + if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart += oSettings._iDisplayLength; + } + } + else + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "last" ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1; + oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength; + } + else + { + oSettings._iDisplayStart = 0; + } + } + else + { + _fnLog( oSettings, 0, "Unknown paging action: "+mAction ); + } + $(oSettings.oInstance).trigger('page', oSettings); + + return iOldStart != oSettings._iDisplayStart; + } + + + + /** + * Generate the node required for the processing node + * @param {object} oSettings dataTables settings object + * @returns {node} Processing element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlProcessing ( oSettings ) + { + var nProcessing = document.createElement( 'div' ); + + if ( !oSettings.aanFeatures.r ) + { + nProcessing.id = oSettings.sTableId+'_processing'; + } + nProcessing.innerHTML = oSettings.oLanguage.sProcessing; + nProcessing.className = oSettings.oClasses.sProcessing; + oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable ); + + return nProcessing; + } + + + /** + * Display or hide the processing indicator + * @param {object} oSettings dataTables settings object + * @param {bool} bShow Show the processing indicator (true) or not (false) + * @memberof DataTable#oApi + */ + function _fnProcessingDisplay ( oSettings, bShow ) + { + if ( oSettings.oFeatures.bProcessing ) + { + var an = oSettings.aanFeatures.r; + for ( var i=0, iLen=an.length ; i 0 ) + { + nCaption = nCaption[0]; + if ( nCaption._captionSide === "top" ) + { + nScrollHeadTable.appendChild( nCaption ); + } + else if ( nCaption._captionSide === "bottom" && nTfoot ) + { + nScrollFootTable.appendChild( nCaption ); + } + } + + /* + * Sizing + */ + /* When xscrolling add the width and a scroller to move the header with the body */ + if ( oSettings.oScroll.sX !== "" ) + { + nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX ); + nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX ); + + if ( nTfoot !== null ) + { + nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX ); + } + + /* When the body is scrolled, then we also want to scroll the headers */ + $(nScrollBody).scroll( function (e) { + nScrollHead.scrollLeft = this.scrollLeft; + + if ( nTfoot !== null ) + { + nScrollFoot.scrollLeft = this.scrollLeft; + } + } ); + } + + /* When yscrolling, add the height */ + if ( oSettings.oScroll.sY !== "" ) + { + nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY ); + } + + /* Redraw - align columns across the tables */ + oSettings.aoDrawCallback.push( { + "fn": _fnScrollDraw, + "sName": "scrolling" + } ); + + /* Infinite scrolling event handlers */ + if ( oSettings.oScroll.bInfinite ) + { + $(nScrollBody).scroll( function() { + /* Use a blocker to stop scrolling from loading more data while other data is still loading */ + if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 ) + { + /* Check if we should load the next data set */ + if ( $(this).scrollTop() + $(this).height() > + $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) + { + /* Only do the redraw if we have to - we might be at the end of the data */ + if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() ) + { + _fnPageChange( oSettings, 'next' ); + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + } + } + } ); + } + + oSettings.nScrollHead = nScrollHead; + oSettings.nScrollFoot = nScrollFoot; + + return nScroller; + } + + + /** + * Update the various tables for resizing. It's a bit of a pig this function, but + * basically the idea to: + * 1. Re-create the table inside the scrolling div + * 2. Take live measurements from the DOM + * 3. Apply the measurements + * 4. Clean up + * @param {object} o dataTables settings object + * @returns {node} Node to add to the DOM + * @memberof DataTable#oApi + */ + function _fnScrollDraw ( o ) + { + var + nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0], + nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], + nScrollBody = o.nTable.parentNode, + i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis, + nTheadSize, nTfootSize, + iWidth, aApplied=[], iSanityWidth, + nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null, + nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null, + ie67 = $.browser.msie && $.browser.version <= 7; + + /* + * 1. Re-create the table inside the scrolling div + */ + + /* Remove the old minimised thead and tfoot elements in the inner table */ + $(o.nTable).children('thead, tfoot').remove(); + + /* Clone the current header and footer elements and then place it into the inner table */ + nTheadSize = $(o.nTHead).clone()[0]; + o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] ); + + if ( o.nTFoot !== null ) + { + nTfootSize = $(o.nTFoot).clone()[0]; + o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] ); + } + + /* + * 2. Take live measurements from the DOM - do not alter the DOM itself! + */ + + /* Remove old sizing and apply the calculated column widths + * Get the unique column headers in the newly created (cloned) header. We want to apply the + * calclated sizes to this header + */ + if ( o.oScroll.sX === "" ) + { + nScrollBody.style.width = '100%'; + nScrollHeadInner.parentNode.style.width = '100%'; + } + + var nThs = _fnGetUniqueThs( o, nTheadSize ); + for ( i=0, iLen=nThs.length ; i nScrollBody.offsetHeight || + $(nScrollBody).css('overflow-y') == "scroll") ) + { + o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); + } + } + else + { + if ( o.oScroll.sXInner !== "" ) + { + /* x scroll inner has been given - use it */ + o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner); + } + else if ( iSanityWidth == $(nScrollBody).width() && + $(nScrollBody).height() < $(o.nTable).height() ) + { + /* There is y-scrolling - try to take account of the y scroll bar */ + o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth ); + if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth ) + { + /* Not possible to take account of it */ + o.nTable.style.width = _fnStringToCss( iSanityWidth ); + } + } + else + { + /* All else fails */ + o.nTable.style.width = _fnStringToCss( iSanityWidth ); + } + } + + /* Recalculate the sanity width - now that we've applied the required width, before it was + * a temporary variable. This is required because the column width calculation is done + * before this table DOM is created. + */ + iSanityWidth = $(o.nTable).outerWidth(); + + /* We want the hidden header to have zero height, so remove padding and borders. Then + * set the width based on the real headers + */ + anHeadToSize = o.nTHead.getElementsByTagName('tr'); + anHeadSizers = nTheadSize.getElementsByTagName('tr'); + + _fnApplyToChildren( function(nSizer, nToSize) { + oStyle = nSizer.style; + oStyle.paddingTop = "0"; + oStyle.paddingBottom = "0"; + oStyle.borderTopWidth = "0"; + oStyle.borderBottomWidth = "0"; + oStyle.height = 0; + + iWidth = $(nSizer).width(); + nToSize.style.width = _fnStringToCss( iWidth ); + aApplied.push( iWidth ); + }, anHeadSizers, anHeadToSize ); + $(anHeadSizers).height(0); + + if ( o.nTFoot !== null ) + { + /* Clone the current footer and then place it into the body table as a "hidden header" */ + anFootSizers = nTfootSize.getElementsByTagName('tr'); + anFootToSize = o.nTFoot.getElementsByTagName('tr'); + + _fnApplyToChildren( function(nSizer, nToSize) { + oStyle = nSizer.style; + oStyle.paddingTop = "0"; + oStyle.paddingBottom = "0"; + oStyle.borderTopWidth = "0"; + oStyle.borderBottomWidth = "0"; + oStyle.height = 0; + + iWidth = $(nSizer).width(); + nToSize.style.width = _fnStringToCss( iWidth ); + aApplied.push( iWidth ); + }, anFootSizers, anFootToSize ); + $(anFootSizers).height(0); + } + + /* + * 3. Apply the measurements + */ + + /* "Hide" the header and footer that we used for the sizing. We want to also fix their width + * to what they currently are + */ + _fnApplyToChildren( function(nSizer) { + nSizer.innerHTML = ""; + nSizer.style.width = _fnStringToCss( aApplied.shift() ); + }, anHeadSizers ); + + if ( o.nTFoot !== null ) + { + _fnApplyToChildren( function(nSizer) { + nSizer.innerHTML = ""; + nSizer.style.width = _fnStringToCss( aApplied.shift() ); + }, anFootSizers ); + } + + /* Sanity check that the table is of a sensible width. If not then we are going to get + * misalignment - try to prevent this by not allowing the table to shrink below its min width + */ + if ( $(o.nTable).outerWidth() < iSanityWidth ) + { + /* The min width depends upon if we have a vertical scrollbar visible or not */ + var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || + $(nScrollBody).css('overflow-y') == "scroll")) ? + iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; + + /* IE6/7 are a law unto themselves... */ + if ( ie67 && (nScrollBody.scrollHeight > + nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) + { + o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); + } + + /* Apply the calculated minimum width to the table wrappers */ + nScrollBody.style.width = _fnStringToCss( iCorrection ); + nScrollHeadInner.parentNode.style.width = _fnStringToCss( iCorrection ); + + if ( o.nTFoot !== null ) + { + nScrollFootInner.parentNode.style.width = _fnStringToCss( iCorrection ); + } + + /* And give the user a warning that we've stopped the table getting too small */ + if ( o.oScroll.sX === "" ) + { + _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ + " misalignment. The table has been drawn at its minimum possible width." ); + } + else if ( o.oScroll.sXInner !== "" ) + { + _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ + " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+ + " calculation" ); + } + } + else + { + nScrollBody.style.width = _fnStringToCss( '100%' ); + nScrollHeadInner.parentNode.style.width = _fnStringToCss( '100%' ); + + if ( o.nTFoot !== null ) + { + nScrollFootInner.parentNode.style.width = _fnStringToCss( '100%' ); + } + } + + + /* + * 4. Clean up + */ + if ( o.oScroll.sY === "" ) + { + /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting + * the scrollbar height from the visible display, rather than adding it on. We need to + * set the height in order to sort this. Don't want to do it in any other browsers. + */ + if ( ie67 ) + { + nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth ); + } + } + + if ( o.oScroll.sY !== "" && o.oScroll.bCollapse ) + { + nScrollBody.style.height = _fnStringToCss( o.oScroll.sY ); + + var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ? + o.oScroll.iBarWidth : 0; + if ( o.nTable.offsetHeight < nScrollBody.offsetHeight ) + { + nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra ); + } + } + + /* Finally set the width's of the header and footer tables */ + var iOuterWidth = $(o.nTable).outerWidth(); + nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth ); + nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth ); + + // Figure out if there are scrollbar present - if so then we need a the header and footer to + // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) + var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll"; + nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; + + if ( o.nTFoot !== null ) + { + nScrollFootTable.style.width = _fnStringToCss( iOuterWidth ); + nScrollFootInner.style.width = _fnStringToCss( iOuterWidth ); + nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; + } + + /* Adjust the position of the header incase we loose the y-scrollbar */ + $(nScrollBody).scroll(); + + /* If sorting or filtering has occurred, jump the scrolling back to the top */ + if ( o.bSorted || o.bFiltered ) + { + nScrollBody.scrollTop = 0; + } + } + + + /** + * Apply a given function to the display child nodes of an element array (typically + * TD children of TR rows + * @param {function} fn Method to apply to the objects + * @param array {nodes} an1 List of elements to look through for display children + * @param array {nodes} an2 Another list (identical structure to the first) - optional + * @memberof DataTable#oApi + */ + function _fnApplyToChildren( fn, an1, an2 ) + { + for ( var i=0, iLen=an1.length ; itd', nCalcTmp); + } + + /* Apply custom sizing to the cloned header */ + var nThs = _fnGetUniqueThs( oSettings, nTheadClone ); + iCorrector = 0; + for ( i=0 ; i 0 ) + { + oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth ); + } + iCorrector++; + } + } + + var cssWidth = $(nCalcTmp).css('width'); + oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ? + cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() ); + nCalcTmp.parentNode.removeChild( nCalcTmp ); + } + + if ( widthAttr ) + { + oSettings.nTable.style.width = _fnStringToCss( widthAttr ); + } + } + + + /** + * Adjust a table's width to take account of scrolling + * @param {object} oSettings dataTables settings object + * @param {node} n table node + * @memberof DataTable#oApi + */ + function _fnScrollingWidthAdjust ( oSettings, n ) + { + if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" ) + { + /* When y-scrolling only, we want to remove the width of the scroll bar so the table + * + scroll bar will fit into the area avaialble. + */ + var iOrigWidth = $(n).width(); + n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth ); + } + else if ( oSettings.oScroll.sX !== "" ) + { + /* When x-scrolling both ways, fix the table at it's current size, without adjusting */ + n.style.width = _fnStringToCss( $(n).outerWidth() ); + } + } + + + /** + * Get the widest node + * @param {object} oSettings dataTables settings object + * @param {int} iCol column of interest + * @returns {string} max strlens for each column + * @memberof DataTable#oApi + */ + function _fnGetWidestNode( oSettings, iCol ) + { + var iMaxIndex = _fnGetMaxLenString( oSettings, iCol ); + if ( iMaxIndex < 0 ) + { + return null; + } + + if ( oSettings.aoData[iMaxIndex].nTr === null ) + { + var n = document.createElement('td'); + n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' ); + return n; + } + return _fnGetTdNodes(oSettings, iMaxIndex)[iCol]; + } + + + /** + * Get the maximum strlen for each data column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column of interest + * @returns {string} max strlens for each column + * @memberof DataTable#oApi + */ + function _fnGetMaxLenString( oSettings, iCol ) + { + var iMax = -1; + var iMaxIndex = -1; + + for ( var i=0 ; i/g, "" ); + if ( s.length > iMax ) + { + iMax = s.length; + iMaxIndex = i; + } + } + + return iMaxIndex; + } + + + /** + * Append a CSS unit (only if required) to a string + * @param {array} aArray1 first array + * @param {array} aArray2 second array + * @returns {int} 0 if match, 1 if length is different, 2 if no match + * @memberof DataTable#oApi + */ + function _fnStringToCss( s ) + { + if ( s === null ) + { + return "0px"; + } + + if ( typeof s == 'number' ) + { + if ( s < 0 ) + { + return "0px"; + } + return s+"px"; + } + + /* Check if the last character is not 0-9 */ + var c = s.charCodeAt( s.length-1 ); + if (c < 0x30 || c > 0x39) + { + return s; + } + return s+"px"; + } + + + /** + * Get the width of a scroll bar in this browser being used + * @returns {int} width in pixels + * @memberof DataTable#oApi + */ + function _fnScrollBarWidth () + { + var inner = document.createElement('p'); + var style = inner.style; + style.width = "100%"; + style.height = "200px"; + style.padding = "0px"; + + var outer = document.createElement('div'); + style = outer.style; + style.position = "absolute"; + style.top = "0px"; + style.left = "0px"; + style.visibility = "hidden"; + style.width = "200px"; + style.height = "150px"; + style.padding = "0px"; + style.overflow = "hidden"; + outer.appendChild(inner); + + document.body.appendChild(outer); + var w1 = inner.offsetWidth; + outer.style.overflow = 'scroll'; + var w2 = inner.offsetWidth; + if ( w1 == w2 ) + { + w2 = outer.clientWidth; + } + + document.body.removeChild(outer); + return (w1 - w2); + } + + + + /** + * Change the order of the table + * @param {object} oSettings dataTables settings object + * @param {bool} bApplyClasses optional - should we apply classes or not + * @memberof DataTable#oApi + */ + function _fnSort ( oSettings, bApplyClasses ) + { + var + i, iLen, j, jLen, k, kLen, + sDataType, nTh, + aaSort = [], + aiOrig = [], + oSort = DataTable.ext.oSort, + aoData = oSettings.aoData, + aoColumns = oSettings.aoColumns, + oAria = oSettings.oLanguage.oAria; + + /* No sorting required if server-side or no sorting array */ + if ( !oSettings.oFeatures.bServerSide && + (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) + { + aaSort = ( oSettings.aaSortingFixed !== null ) ? + oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : + oSettings.aaSorting.slice(); + + /* If there is a sorting data type, and a fuction belonging to it, then we need to + * get the data from the developer's function and apply it for this column + */ + for ( i=0 ; i/g, "" ); + nTh = aoColumns[i].nTh; + nTh.removeAttribute('aria-sort'); + nTh.removeAttribute('aria-label'); + + /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ + if ( aoColumns[i].bSortable ) + { + if ( aaSort.length > 0 && aaSort[0][0] == i ) + { + nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); + + var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? + aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; + nTh.setAttribute('aria-label', sTitle+ + (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); + } + else + { + nTh.setAttribute('aria-label', sTitle+ + (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); + } + } + else + { + nTh.setAttribute('aria-label', sTitle); + } + } + + /* Tell the draw function that we have sorted the data */ + oSettings.bSorted = true; + $(oSettings.oInstance).trigger('sort', oSettings); + + /* Copy the master data into the draw array and re-draw */ + if ( oSettings.oFeatures.bFilter ) + { + /* _fnFilter() will redraw the table for us */ + _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); + } + else + { + oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); + oSettings._iDisplayStart = 0; /* reset display back to page 0 */ + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + } + + + /** + * Attach a sort handler (click) to a node + * @param {object} oSettings dataTables settings object + * @param {node} nNode node to attach the handler to + * @param {int} iDataIndex column sorting index + * @param {function} [fnCallback] callback function + * @memberof DataTable#oApi + */ + function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback ) + { + _fnBindAction( nNode, {}, function (e) { + /* If the column is not sortable - don't to anything */ + if ( oSettings.aoColumns[iDataIndex].bSortable === false ) + { + return; + } + + /* + * This is a little bit odd I admit... I declare a temporary function inside the scope of + * _fnBuildHead and the click handler in order that the code presented here can be used + * twice - once for when bProcessing is enabled, and another time for when it is + * disabled, as we need to perform slightly different actions. + * Basically the issue here is that the Javascript engine in modern browsers don't + * appear to allow the rendering engine to update the display while it is still excuting + * it's thread (well - it does but only after long intervals). This means that the + * 'processing' display doesn't appear for a table sort. To break the js thread up a bit + * I force an execution break by using setTimeout - but this breaks the expected + * thread continuation for the end-developer's point of view (their code would execute + * too early), so we on;y do it when we absolutely have to. + */ + var fnInnerSorting = function () { + var iColumn, iNextSort; + + /* If the shift key is pressed then we are multipe column sorting */ + if ( e.shiftKey ) + { + /* Are we already doing some kind of sort on this column? */ + var bFound = false; + for ( var i=0 ; i= iColumns ) + { + for ( i=0 ; i 4096 ) /* Magic 10 for padding */ + { + var aCookies =document.cookie.split(';'); + for ( var i=0, iLen=aCookies.length ; i=0 ; i-- ) + { + aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) ); + } + + if ( sTrigger !== null ) + { + $(oSettings.oInstance).trigger(sTrigger, aArgs); + } + + return aRet; + } + + + /** + * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other + * library, then we use that as it is fast, safe and accurate. If the function isn't + * available then we need to built it ourselves - the insperation for this function comes + * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is + * not perfect and absolutely should not be used as a replacement to json2.js - but it does + * do what we need, without requiring a dependency for DataTables. + * @param {object} o JSON object to be converted + * @returns {string} JSON string + * @memberof DataTable#oApi + */ + var _fnJsonString = (window.JSON) ? JSON.stringify : function( o ) + { + /* Not an object or array */ + var sType = typeof o; + if (sType !== "object" || o === null) + { + // simple data type + if (sType === "string") + { + o = '"'+o+'"'; + } + return o+""; + } + + /* If object or array, need to recurse over it */ + var + sProp, mValue, + json = [], + bArr = $.isArray(o); + + for (sProp in o) + { + mValue = o[sProp]; + sType = typeof mValue; + + if (sType === "string") + { + mValue = '"'+mValue+'"'; + } + else if (sType === "object" && mValue !== null) + { + mValue = _fnJsonString(mValue); + } + + json.push((bArr ? "" : '"'+sProp+'":') + mValue); + } + + return (bArr ? "[" : "{") + json + (bArr ? "]" : "}"); + }; + + + + + /** + * Perform a jQuery selector action on the table's TR elements (from the tbody) and + * return the resulting jQuery object. + * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on + * @param {object} [oOpts] Optional parameters for modifying the rows to be included + * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter + * criterion ("applied") or all TR elements (i.e. no filter). + * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. + * Can be either 'current', whereby the current sorting of the table is used, or + * 'original' whereby the original order the data was read into the table is used. + * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page + * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * 'current' and filter is 'applied', regardless of what they might be given as. + * @returns {object} jQuery object, filtered by the given selector. + * @dtopt API + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Highlight every second row + * oTable.$('tr:odd').css('backgroundColor', 'blue'); + * } ); + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Filter to rows with 'Webkit' in them, add a background colour and then + * // remove the filter, thus highlighting the 'Webkit' rows only. + * oTable.fnFilter('Webkit'); + * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue'); + * oTable.fnFilter(''); + * } ); + */ + this.$ = function ( sSelector, oOpts ) + { + var i, iLen, a = [], tr; + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + var aoData = oSettings.aoData; + var aiDisplay = oSettings.aiDisplay; + var aiDisplayMaster = oSettings.aiDisplayMaster; + + if ( !oOpts ) + { + oOpts = {}; + } + + oOpts = $.extend( {}, { + "filter": "none", // applied + "order": "current", // "original" + "page": "all" // current + }, oOpts ); + + // Current page implies that order=current and fitler=applied, since it is fairly + // senseless otherwise + if ( oOpts.page == 'current' ) + { + for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i + *
  • 1D array of data - add a single row with the data provided
  • + *
  • 2D array of arrays - add multiple rows in a single call
  • + *
  • object - data object when using mDataProp
  • + *
  • array of objects - multiple data objects when using mDataProp
  • + * + * @param {bool} [bRedraw=true] redraw the table or not + * @returns {array} An array of integers, representing the list of indexes in + * aoData ({@link DataTable.models.oSettings}) that have been added to + * the table. + * @dtopt API + * + * @example + * // Global var for counter + * var giCount = 2; + * + * $(document).ready(function() { + * $('#example').dataTable(); + * } ); + * + * function fnClickAddRow() { + * $('#example').dataTable().fnAddData( [ + * giCount+".1", + * giCount+".2", + * giCount+".3", + * giCount+".4" ] + * ); + * + * giCount++; + * } + */ + this.fnAddData = function( mData, bRedraw ) + { + if ( mData.length === 0 ) + { + return []; + } + + var aiReturn = []; + var iTest; + + /* Find settings from table node */ + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + + /* Check if we want to add multiple rows or not */ + if ( typeof mData[0] === "object" && mData[0] !== null ) + { + for ( var i=0 ; i= oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart -= oSettings._iDisplayLength; + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + } + + if ( bRedraw === undefined || bRedraw ) + { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + + return oData; + }; + + + /** + * Restore the table to it's original state in the DOM by removing all of DataTables + * enhancements, alterations to the DOM structure of the table and event listeners. + * @param {boolean} [bRemove=false] Completely remove the table from the DOM + * @dtopt API + * + * @example + * $(document).ready(function() { + * // This example is fairly pointless in reality, but shows how fnDestroy can be used + * var oTable = $('#example').dataTable(); + * oTable.fnDestroy(); + * } ); + */ + this.fnDestroy = function ( bRemove ) + { + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + var nOrig = oSettings.nTableWrapper.parentNode; + var nBody = oSettings.nTBody; + var i, iLen; + + bRemove = (bRemove===undefined) ? false : true; + + /* Flag to note that the table is currently being destroyed - no action should be taken */ + oSettings.bDestroying = true; + + /* Fire off the destroy callbacks for plug-ins etc */ + _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] ); + + /* Restore hidden columns */ + for ( i=0, iLen=oSettings.aoColumns.length ; itr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove(); + + /* When scrolling we had to break the table up - restore it */ + if ( oSettings.nTable != oSettings.nTHead.parentNode ) + { + $(oSettings.nTable).children('thead').remove(); + oSettings.nTable.appendChild( oSettings.nTHead ); + } + + if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode ) + { + $(oSettings.nTable).children('tfoot').remove(); + oSettings.nTable.appendChild( oSettings.nTFoot ); + } + + /* Remove the DataTables generated nodes, events and classes */ + oSettings.nTable.parentNode.removeChild( oSettings.nTable ); + $(oSettings.nTableWrapper).remove(); + + oSettings.aaSorting = []; + oSettings.aaSortingFixed = []; + _fnSortingClasses( oSettings ); + + $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') ); + + $('th, td', oSettings.nTHead).removeClass( [ + oSettings.oClasses.sSortable, + oSettings.oClasses.sSortableAsc, + oSettings.oClasses.sSortableDesc, + oSettings.oClasses.sSortableNone ].join(' ') + ); + if ( oSettings.bJUI ) + { + $('th span.'+oSettings.oClasses.sSortIcon + + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove(); + + $('th, td', oSettings.nTHead).each( function () { + var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this); + var kids = jqWrapper.contents(); + $(this).append( kids ); + jqWrapper.remove(); + } ); + } + + /* Add the TR elements back into the table in their original order */ + if ( !bRemove && oSettings.nTableReinsertBefore ) + { + nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore ); + } + else if ( !bRemove ) + { + nOrig.appendChild( oSettings.nTable ); + } + + for ( i=0, iLen=oSettings.aoData.length ; i
    + */ + + /** + * State save event, fired when the table has changed state a new state save is required. + * This method allows modification of the state saving object prior to actually doing the + * save, including addition or other state properties (for plug-ins) or modification + * of a DataTables core property. + * @name DataTable#stateSaveParams + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The state information to be saved + */ + + /** + * State load event, fired when the table is loading state from the stored data, but + * prior to the settings object being modified by the saved state - allowing modification + * of the saved state is required or loading of state for a plug-in. + * @name DataTable#stateLoadParams + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * State loaded event, fired when state has been loaded from stored data and the settings + * object has been modified by the loaded data. + * @name DataTable#stateLoaded + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * Processing event, fired when DataTables is doing some kind of processing (be it, + * sort, filter or anything else). Can be used to indicate to the end user that + * there is something happening, or that something has finished. + * @name DataTable#processing + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {boolean} bShow Flag for if DataTables is doing processing or not + */ + + /** + * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to + * made to the server for new data (note that this trigger is called in fnServerData, + * if you override fnServerData and which to use this event, you need to trigger it in + * you success function). + * @name DataTable#xhr + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing + * the bDestroy:true parameter in the initialisation object. This can be used to remove + * bound events, added DOM nodes, etc. + * @name DataTable#destroy + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ +}(jQuery, window, document, undefined)); diff --git a/assets/grocery_crud/themes/datatables/js/jquery.dataTables.min.js b/assets/grocery_crud/themes/datatables/js/jquery.dataTables.min.js new file mode 100644 index 000000000..ce18c9357 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/js/jquery.dataTables.min.js @@ -0,0 +1,154 @@ +/* + * File: jquery.dataTables.min.js + * Version: 1.9.2 + * Author: Allan Jardine (www.sprymedia.co.uk) + * Info: www.datatables.net + * + * Copyright 2008-2012 Allan Jardine, all rights reserved. + * + * This source file is free software, under either the GPL v2 license or a + * BSD style license, available at: + * http://datatables.net/license_gpl2 + * http://datatables.net/license_bsd + * + * This source file 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 license files for details. + */ +(function(i,V,l,n){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=i.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,nTh:b?b:l.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mDataProp:c.mDataProp?c.oDefaults:d});a.aoColumns.push(c);if(a.aoPreSearchCols[d]===n||null===a.aoPreSearchCols[d])a.aoPreSearchCols[d]=i.extend({},j.models.oSearch);else if(c=a.aoPreSearchCols[d], +c.bRegex===n&&(c.bRegex=!0),c.bSmart===n&&(c.bSmart=!0),c.bCaseInsensitive===n)c.bCaseInsensitive=!0;r(a,d,null)}function r(a,b,c){b=a.aoColumns[b];c!==n&&null!==c&&(c.sType!==n&&(b.sType=c.sType,b._bAutoType=!1),i.extend(b,c),p(b,c,"sWidth","sWidthOrig"),c.iDataSort!==n&&(b.aDataSort=[c.iDataSort]),p(b,c,"aDataSort"));b.fnGetData=W(b.mDataProp);b.fnSetData=ta(b.mDataProp);a.oFeatures.bSort||(b.bSortable=!1);!b.bSortable||-1==i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting)?(b.sSortingClass= +a.oClasses.sSortableNone,b.sSortingClassJUI=""):b.bSortable||-1==i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting)?(b.sSortingClass=a.oClasses.sSortable,b.sSortingClassJUI=a.oClasses.sSortJUI):-1!=i.inArray("asc",b.asSorting)&&-1==i.inArray("desc",b.asSorting)?(b.sSortingClass=a.oClasses.sSortableAsc,b.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed):-1==i.inArray("asc",b.asSorting)&&-1!=i.inArray("desc",b.asSorting)&&(b.sSortingClass=a.oClasses.sSortableDesc,b.sSortingClassJUI=a.oClasses.sSortJUIDescAllowed)} +function k(a){if(!1===a.oFeatures.bAutoWidth)return!1;ba(a);for(var b=0,c=a.aoColumns.length;bm[f])d(a.aoColumns.length+m[f],b[g]);else if("string"===typeof m[f]){e=0;for(s=a.aoColumns.length;eb&&a[d]--; -1!=c&&a.splice(c,1)}function R(a,b,c){var d=a.aoColumns[c];return d.fnRender({iDataRow:b,iDataColumn:c,oSettings:a,aData:a.aoData[b]._aData,mDataProp:d.mDataProp},w(a,b,c,"display"))}function ca(a,b){var c=a.aoData[b],d;if(null===c.nTr){c.nTr=l.createElement("tr");c.nTr._DT_RowIndex=b;c._aData.DT_RowId&&(c.nTr.id=c._aData.DT_RowId);c._aData.DT_RowClass&&i(c.nTr).addClass(c._aData.DT_RowClass);for(var g=0,f=a.aoColumns.length;g=a.fnRecordsDisplay()?0:a.iInitDisplayStart,a.iInitDisplayStart=-1,A(a));if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++;else if(a.oFeatures.bServerSide){if(!a.bDestroying&&!wa(a))return}else a.iDraw++;if(0!==a.aiDisplay.length){var h=a._iDisplayStart;d=a._iDisplayEnd;a.oFeatures.bServerSide&&(h=0,d=a.aoData.length);for(;h
  • + * Function return: + *
      + *
    • {int} Sorting match: <0 if first parameter should be sorted lower than + * the second parameter, ===0 if the two parameters are equal and >0 if + * the first parameter should be sorted height than the second parameter.
    • + *
    + * + * + * @type object + * @default {} + * + * @example + * // Case-sensitive string sorting, with no pre-formatting method + * $.extend( $.fn.dataTableExt.oSort, { + * "string-case-asc": function(x,y) { + * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + * }, + * "string-case-desc": function(x,y) { + * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + * } + * } ); + * + * @example + * // Case-insensitive string sorting, with pre-formatting + * $.extend( $.fn.dataTableExt.oSort, { + * "string-pre": function(x) { + * return x.toLowerCase(); + * }, + * "string-asc": function(x,y) { + * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + * }, + * "string-desc": function(x,y) { + * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + * } + * } ); + */ + "oSort": {}, + + + /** + * Version string for plug-ins to check compatibility. Allowed format is + * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and + * e are optional + * @type string + * @default Version number + */ + "sVersion": DataTable.version, + + + /** + * How should DataTables report an error. Can take the value 'alert' or 'throw' + * @type string + * @default alert + */ + "sErrMode": "alert", + + + /** + * Store information for DataTables to access globally about other instances + * @namespace + * @private + */ + "_oExternConfig": { + /* int:iNextUnique - next unique number for an instance */ + "iNextUnique": 0 + } + }; + + + + + /** + * Template object for the way in which DataTables holds information about + * search information for the global filter and individual column filters. + * @namespace + */ + DataTable.models.oSearch = { + /** + * Flag to indicate if the filtering should be case insensitive or not + * @type boolean + * @default true + */ + "bCaseInsensitive": true, + + /** + * Applied search term + * @type string + * @default Empty string + */ + "sSearch": "", + + /** + * Flag to indicate if the search term should be interpreted as a + * regular expression (true) or not (false) and therefore and special + * regex characters escaped. + * @type boolean + * @default false + */ + "bRegex": false, + + /** + * Flag to indicate if DataTables is to use its smart filtering or not. + * @type boolean + * @default true + */ + "bSmart": true + }; + + + + + /** + * Template object for the way in which DataTables holds information about + * each individual row. This is the object format used for the settings + * aoData array. + * @namespace + */ + DataTable.models.oRow = { + /** + * TR element for the row + * @type node + * @default null + */ + "nTr": null, + + /** + * Data object from the original data source for the row. This is either + * an array if using the traditional form of DataTables, or an object if + * using mDataProp options. The exact type will depend on the passed in + * data from the data source, or will be an array if using DOM a data + * source. + * @type array|object + * @default [] + */ + "_aData": [], + + /** + * Sorting data cache - this array is ostensibly the same length as the + * number of columns (although each index is generated only as it is + * needed), and holds the data that is used for sorting each column in the + * row. We do this cache generation at the start of the sort in order that + * the formatting of the sort data need be done only once for each cell + * per sort. This array should not be read from or written to by anything + * other than the master sorting methods. + * @type array + * @default [] + * @private + */ + "_aSortData": [], + + /** + * Array of TD elements that are cached for hidden rows, so they can be + * reinserted into the table if a column is made visible again (or to act + * as a store if a column is made hidden). Only hidden columns have a + * reference in the array. For non-hidden columns the value is either + * undefined or null. + * @type array nodes + * @default [] + * @private + */ + "_anHidden": [], + + /** + * Cache of the class name that DataTables has applied to the row, so we + * can quickly look at this variable rather than needing to do a DOM check + * on className for the nTr property. + * @type string + * @default Empty string + * @private + */ + "_sRowStripe": "" + }; + + + + /** + * Template object for the column information object in DataTables. This object + * is held in the settings aoColumns array and contains all the information that + * DataTables needs about each individual column. + * + * Note that this object is related to {@link DataTable.defaults.columns} + * but this one is the internal data store for DataTables's cache of columns. + * It should NOT be manipulated outside of DataTables. Any configuration should + * be done through the initialisation options. + * @namespace + */ + DataTable.models.oColumn = { + /** + * A list of the columns that sorting should occur on when this column + * is sorted. That this property is an array allows multi-column sorting + * to be defined for a column (for example first name / last name columns + * would benefit from this). The values are integers pointing to the + * columns to be sorted on (typically it will be a single integer pointing + * at itself, but that doesn't need to be the case). + * @type array + */ + "aDataSort": null, + + /** + * Define the sorting directions that are applied to the column, in sequence + * as the column is repeatedly sorted upon - i.e. the first value is used + * as the sorting direction when the column if first sorted (clicked on). + * Sort it again (click again) and it will move on to the next index. + * Repeat until loop. + * @type array + */ + "asSorting": null, + + /** + * Flag to indicate if the column is searchable, and thus should be included + * in the filtering or not. + * @type boolean + */ + "bSearchable": null, + + /** + * Flag to indicate if the column is sortable or not. + * @type boolean + */ + "bSortable": null, + + /** + * When using fnRender, you have two options for what to do with the data, + * and this property serves as the switch. Firstly, you can have the sorting + * and filtering use the rendered value (true - default), or you can have + * the sorting and filtering us the original value (false). + * + * *NOTE* It is it is advisable now to use mDataProp as a function and make + * use of the 'type' that it gives, allowing (potentially) different data to + * be used for sorting, filtering, display and type detection. + * @type boolean + * @deprecated + */ + "bUseRendered": null, + + /** + * Flag to indicate if the column is currently visible in the table or not + * @type boolean + */ + "bVisible": null, + + /** + * Flag to indicate to the type detection method if the automatic type + * detection should be used, or if a column type (sType) has been specified + * @type boolean + * @default true + * @private + */ + "_bAutoType": true, + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to fnRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available (since it is not when fnRender is called). + * @type function + * @param {element} nTd The TD node that has been created + * @param {*} sData The Data for the cell + * @param {array|object} oData The data for the whole row + * @param {int} iRow The row index for the aoData data store + * @default null + */ + "fnCreatedCell": null, + + /** + * Function to get data from a cell in a column. You should never + * access data directly through _aData internally in DataTables - always use + * the method attached to this property. It allows mDataProp to function as + * required. This function is automatically assigned by the column + * initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {string} sSpecific The specific data type you want to get - + * 'display', 'type' 'filter' 'sort' + * @returns {*} The data for the cell from the given row's data + * @default null + */ + "fnGetData": null, + + /** + * Custom display function that will be called for the display of each cell + * in this column. + * @type function + * @param {object} o Object with the following parameters: + * @param {int} o.iDataRow The row in aoData + * @param {int} o.iDataColumn The column in question + * @param {array} o.aData The data for the row in question + * @param {object} o.oSettings The settings object for this DataTables instance + * @returns {string} The string you which to use in the display + * @default null + */ + "fnRender": null, + + /** + * Function to set data for a cell in the column. You should never + * set the data directly to _aData internally in DataTables - always use + * this method. It allows mDataProp to function as required. This function + * is automatically assigned by the column initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {*} sValue Value to set + * @default null + */ + "fnSetData": null, + + /** + * Property to read the value for the cells in the column from the data + * source array / object. If null, then the default content is used, if a + * function is given then the return from the function is used. + * @type function|int|string|null + * @default null + */ + "mDataProp": null, + + /** + * Unique header TH/TD element for this column - this is what the sorting + * listener is attached to (if sorting is enabled.) + * @type node + * @default null + */ + "nTh": null, + + /** + * Unique footer TH/TD element for this column (if there is one). Not used + * in DataTables as such, but can be used for plug-ins to reference the + * footer for each column. + * @type node + * @default null + */ + "nTf": null, + + /** + * The class to apply to all TD elements in the table's TBODY for the column + * @type string + * @default null + */ + "sClass": null, + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * @type string + */ + "sContentPadding": null, + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because mDataProp + * is set to null, or because the data source itself is null). + * @type string + * @default null + */ + "sDefaultContent": null, + + /** + * Name for the column, allowing reference to the column by name as well as + * by index (needs a lookup to work by name). + * @type string + */ + "sName": null, + + /** + * Custom sorting data type - defines which of the available plug-ins in + * afnSortData the custom sorting will use - if any is defined. + * @type string + * @default std + */ + "sSortDataType": 'std', + + /** + * Class to be applied to the header element when sorting on this column + * @type string + * @default null + */ + "sSortingClass": null, + + /** + * Class to be applied to the header element when sorting on this column - + * when jQuery UI theming is used. + * @type string + * @default null + */ + "sSortingClassJUI": null, + + /** + * Title of the column - what is seen in the TH element (nTh). + * @type string + */ + "sTitle": null, + + /** + * Column sorting and filtering type + * @type string + * @default null + */ + "sType": null, + + /** + * Width of the column + * @type string + * @default null + */ + "sWidth": null, + + /** + * Width of the column when it was first "encountered" + * @type string + * @default null + */ + "sWidthOrig": null + }; + + + + /** + * Initialisation options that can be given to DataTables at initialisation + * time. + * @namespace + */ + DataTable.defaults = { + /** + * An array of data to use for the table, passed in at initialisation which + * will be used in preference to any data which is already in the DOM. This is + * particularly useful for constructing tables purely in Javascript, for + * example with a custom Ajax call. + * @type array + * @default null + * @dtopt Option + * + * @example + * // Using a 2D array data source + * $(document).ready( function () { + * $('#example').dataTable( { + * "aaData": [ + * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], + * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], + * ], + * "aoColumns": [ + * { "sTitle": "Engine" }, + * { "sTitle": "Browser" }, + * { "sTitle": "Platform" }, + * { "sTitle": "Version" }, + * { "sTitle": "Grade" } + * ] + * } ); + * } ); + * + * @example + * // Using an array of objects as a data source (mDataProp) + * $(document).ready( function () { + * $('#example').dataTable( { + * "aaData": [ + * { + * "engine": "Trident", + * "browser": "Internet Explorer 4.0", + * "platform": "Win 95+", + * "version": 4, + * "grade": "X" + * }, + * { + * "engine": "Trident", + * "browser": "Internet Explorer 5.0", + * "platform": "Win 95+", + * "version": 5, + * "grade": "C" + * } + * ], + * "aoColumns": [ + * { "sTitle": "Engine", "mDataProp": "engine" }, + * { "sTitle": "Browser", "mDataProp": "browser" }, + * { "sTitle": "Platform", "mDataProp": "platform" }, + * { "sTitle": "Version", "mDataProp": "version" }, + * { "sTitle": "Grade", "mDataProp": "grade" } + * ] + * } ); + * } ); + */ + "aaData": null, + + + /** + * If sorting is enabled, then DataTables will perform a first pass sort on + * initialisation. You can define which column(s) the sort is performed upon, + * and the sorting direction, with this variable. The aaSorting array should + * contain an array for each column to be sorted initially containing the + * column's index and a direction string ('asc' or 'desc'). + * @type array + * @default [[0,'asc']] + * @dtopt Option + * + * @example + * // Sort by 3rd column first, and then 4th column + * $(document).ready( function() { + * $('#example').dataTable( { + * "aaSorting": [[2,'asc'], [3,'desc']] + * } ); + * } ); + * + * // No initial sorting + * $(document).ready( function() { + * $('#example').dataTable( { + * "aaSorting": [] + * } ); + * } ); + */ + "aaSorting": [[0,'asc']], + + + /** + * This parameter is basically identical to the aaSorting parameter, but + * cannot be overridden by user interaction with the table. What this means + * is that you could have a column (visible or hidden) which the sorting will + * always be forced on first - any sorting after that (from the user) will + * then be performed as required. This can be useful for grouping rows + * together. + * @type array + * @default null + * @dtopt Option + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "aaSortingFixed": [[0,'asc']] + * } ); + * } ) + */ + "aaSortingFixed": null, + + + /** + * This parameter allows you to readily specify the entries in the length drop + * down menu that DataTables shows when pagination is enabled. It can be + * either a 1D array of options which will be used for both the displayed + * option and the value, or a 2D array which will use the array in the first + * position as the value, and the array in the second position as the + * displayed options (useful for language strings such as 'All'). + * @type array + * @default [ 10, 25, 50, 100 ] + * @dtopt Option + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] + * } ); + * } ); + * + * @example + * // Setting the default display length as well as length menu + * // This is likely to be wanted if you remove the '10' option which + * // is the iDisplayLength default. + * $(document).ready(function() { + * $('#example').dataTable( { + * "iDisplayLength": 25, + * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]] + * } ); + * } ); + */ + "aLengthMenu": [ 10, 25, 50, 100 ], + + + /** + * The aoColumns option in the initialisation parameter allows you to define + * details about the way individual columns behave. For a full list of + * column options that can be set, please see + * {@link DataTable.defaults.columns}. Note that if you use aoColumns to + * define your columns, you must have an entry in the array for every single + * column that you have in your table (these can be null if you don't which + * to specify any options). + * @member + */ + "aoColumns": null, + + /** + * Very similar to aoColumns, aoColumnDefs allows you to target a specific + * column, multiple columns, or all columns, using the aTargets property of + * each object in the array. This allows great flexibility when creating + * tables, as the aoColumnDefs arrays can be of any length, targeting the + * columns you specifically want. aoColumnDefs may use any of the column + * options available: {@link DataTable.defaults.columns}, but it _must_ + * have aTargets defined in each object in the array. Values in the aTargets + * array may be: + *
      + *
    • a string - class name will be matched on the TH for the column
    • + *
    • 0 or a positive integer - column index counting from the left
    • + *
    • a negative integer - column index counting from the right
    • + *
    • the string "_all" - all columns (i.e. assign a default)
    • + *
    + * @member + */ + "aoColumnDefs": null, + + + /** + * Basically the same as oSearch, this parameter defines the individual column + * filtering state at initialisation time. The array must be of the same size + * as the number of columns, and each element be an object with the parameters + * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also + * accepted and the default will be used. + * @type array + * @default [] + * @dtopt Option + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "aoSearchCols": [ + * null, + * { "sSearch": "My filter" }, + * null, + * { "sSearch": "^[0-9]", "bEscapeRegex": false } + * ] + * } ); + * } ) + */ + "aoSearchCols": [], + + + /** + * An array of CSS classes that should be applied to displayed rows. This + * array may be of any length, and DataTables will apply each class + * sequentially, looping when required. + * @type array + * @default null Will take the values determinted by the oClasses.sStripe* + * options + * @dtopt Option + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ] + * } ); + * } ) + */ + "asStripeClasses": null, + + + /** + * Enable or disable automatic column width calculation. This can be disabled + * as an optimisation (it takes some time to calculate the widths) if the + * tables widths are passed in using aoColumns. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bAutoWidth": false + * } ); + * } ); + */ + "bAutoWidth": true, + + + /** + * Deferred rendering can provide DataTables with a huge speed boost when you + * are using an Ajax or JS data source for the table. This option, when set to + * true, will cause DataTables to defer the creation of the table elements for + * each row until they are needed for a draw - saving a significant amount of + * time. + * @type boolean + * @default false + * @dtopt Features + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "sAjaxSource": "sources/arrays.txt", + * "bDeferRender": true + * } ); + * } ); + */ + "bDeferRender": false, + + + /** + * Replace a DataTable which matches the given selector and replace it with + * one which has the properties of the new initialisation object passed. If no + * table matches the selector, then the new DataTable will be constructed as + * per normal. + * @type boolean + * @default false + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "bPaginate": false + * } ); + * + * // Some time later.... + * $('#example').dataTable( { + * "bFilter": false, + * "bDestroy": true + * } ); + * } ); + */ + "bDestroy": false, + + + /** + * Enable or disable filtering of data. Filtering in DataTables is "smart" in + * that it allows the end user to input multiple words (space separated) and + * will match a row containing those words, even if not in the order that was + * specified (this allow matching across multiple columns). Note that if you + * wish to use filtering in DataTables this must remain 'true' - to remove the + * default filtering input box and retain filtering abilities, please use + * {@link DataTable.defaults.sDom}. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bFilter": false + * } ); + * } ); + */ + "bFilter": true, + + + /** + * Enable or disable the table information display. This shows information + * about the data that is currently visible on the page, including information + * about filtered data if that action is being performed. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bInfo": false + * } ); + * } ); + */ + "bInfo": true, + + + /** + * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some + * slightly different and additional mark-up from what DataTables has + * traditionally used). + * @type boolean + * @default false + * @dtopt Features + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "bJQueryUI": true + * } ); + * } ); + */ + "bJQueryUI": false, + + + /** + * Allows the end user to select the size of a formatted page from a select + * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate). + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bLengthChange": false + * } ); + * } ); + */ + "bLengthChange": true, + + + /** + * Enable or disable pagination. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bPaginate": false + * } ); + * } ); + */ + "bPaginate": true, + + + /** + * Enable or disable the display of a 'processing' indicator when the table is + * being processed (e.g. a sort). This is particularly useful for tables with + * large amounts of data where it can take a noticeable amount of time to sort + * the entries. + * @type boolean + * @default false + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bProcessing": true + * } ); + * } ); + */ + "bProcessing": false, + + + /** + * Retrieve the DataTables object for the given selector. Note that if the + * table has already been initialised, this parameter will cause DataTables + * to simply return the object that has already been set up - it will not take + * account of any changes you might have made to the initialisation object + * passed to DataTables (setting this parameter to true is an acknowledgement + * that you understand this). bDestroy can be used to reinitialise a table if + * you need. + * @type boolean + * @default false + * @dtopt Options + * + * @example + * $(document).ready(function() { + * initTable(); + * tableActions(); + * } ); + * + * function initTable () + * { + * return $('#example').dataTable( { + * "sScrollY": "200px", + * "bPaginate": false, + * "bRetrieve": true + * } ); + * } + * + * function tableActions () + * { + * var oTable = initTable(); + * // perform API operations with oTable + * } + */ + "bRetrieve": false, + + + /** + * Indicate if DataTables should be allowed to set the padding / margin + * etc for the scrolling header elements or not. Typically you will want + * this. + * @type boolean + * @default true + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bScrollAutoCss": false, + * "sScrollY": "200px" + * } ); + * } ); + */ + "bScrollAutoCss": true, + + + /** + * When vertical (y) scrolling is enabled, DataTables will force the height of + * the table's viewport to the given height at all times (useful for layout). + * However, this can look odd when filtering data down to a small data set, + * and the footer is left "floating" further down. This parameter (when + * enabled) will cause DataTables to collapse the table's viewport down when + * the result set will fit within the given Y height. + * @type boolean + * @default false + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200", + * "bScrollCollapse": true + * } ); + * } ); + */ + "bScrollCollapse": false, + + + /** + * Enable infinite scrolling for DataTables (to be used in combination with + * sScrollY). Infinite scrolling means that DataTables will continually load + * data as a user scrolls through a table, which is very useful for large + * dataset. This cannot be used with pagination, which is automatically + * disabled. Note - the Scroller extra for DataTables is recommended in + * in preference to this option. + * @type boolean + * @default false + * @dtopt Features + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bScrollInfinite": true, + * "bScrollCollapse": true, + * "sScrollY": "200px" + * } ); + * } ); + */ + "bScrollInfinite": false, + + + /** + * Configure DataTables to use server-side processing. Note that the + * sAjaxSource parameter must also be given in order to give DataTables a + * source to obtain the required data for each draw. + * @type boolean + * @default false + * @dtopt Features + * @dtopt Server-side + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bServerSide": true, + * "sAjaxSource": "xhr.php" + * } ); + * } ); + */ + "bServerSide": false, + + + /** + * Enable or disable sorting of columns. Sorting of individual columns can be + * disabled by the "bSortable" option for each column. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bSort": false + * } ); + * } ); + */ + "bSort": true, + + + /** + * Allows control over whether DataTables should use the top (true) unique + * cell that is found for a single column, or the bottom (false - default). + * This is useful when using complex headers. + * @type boolean + * @default false + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bSortCellsTop": true + * } ); + * } ); + */ + "bSortCellsTop": false, + + + /** + * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and + * 'sorting_3' to the columns which are currently being sorted on. This is + * presented as a feature switch as it can increase processing time (while + * classes are removed and added) so for large data sets you might want to + * turn this off. + * @type boolean + * @default true + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bSortClasses": false + * } ); + * } ); + */ + "bSortClasses": true, + + + /** + * Enable or disable state saving. When enabled a cookie will be used to save + * table display information such as pagination information, display length, + * filtering and sorting. As such when the end user reloads the page the + * display display will match what thy had previously set up. + * @type boolean + * @default false + * @dtopt Features + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "bStateSave": true + * } ); + * } ); + */ + "bStateSave": false, + + + /** + * Customise the cookie and / or the parameters being stored when using + * DataTables with state saving enabled. This function is called whenever + * the cookie is modified, and it expects a fully formed cookie string to be + * returned. Note that the data object passed in is a Javascript object which + * must be converted to a string (JSON.stringify for example). + * @type function + * @param {string} sName Name of the cookie defined by DataTables + * @param {object} oData Data to be stored in the cookie + * @param {string} sExpires Cookie expires string + * @param {string} sPath Path of the cookie to set + * @returns {string} Cookie formatted string (which should be encoded by + * using encodeURIComponent()) + * @dtopt Callbacks + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "fnCookieCallback": function (sName, oData, sExpires, sPath) { + * // Customise oData or sName or whatever else here + * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath; + * } + * } ); + * } ); + */ + "fnCookieCallback": null, + + + /** + * This function is called when a TR element is created (and all TD child + * elements have been inserted), or registered if using a DOM source, allowing + * manipulation of the TR element (adding classes etc). + * @type function + * @param {node} nRow "TR" element for the current row + * @param {array} aData Raw data array for this row + * @param {int} iDataIndex The index of this row in aoData + * @dtopt Callbacks + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "fnCreatedRow": function( nRow, aData, iDataIndex ) { + * // Bold the grade for all 'A' grade browsers + * if ( aData[4] == "A" ) + * { + * $('td:eq(4)', nRow).html( 'A' ); + * } + * } + * } ); + * } ); + */ + "fnCreatedRow": null, + + + /** + * This function is called on every 'draw' event, and allows you to + * dynamically modify any aspect you want about the created DOM. + * @type function + * @param {object} oSettings DataTables settings object + * @dtopt Callbacks + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "fnDrawCallback": function( oSettings ) { + * alert( 'DataTables has redrawn the table' ); + * } + * } ); + * } ); + */ + "fnDrawCallback": null, + + + /** + * Identical to fnHeaderCallback() but for the table footer this function + * allows you to modify the table footer on every 'draw' even. + * @type function + * @param {node} nFoot "TR" element for the footer + * @param {array} aData Full table data (as derived from the original HTML) + * @param {int} iStart Index for the current display starting point in the + * display array + * @param {int} iEnd Index for the current display ending point in the + * display array + * @param {array int} aiDisplay Index array to translate the visual position + * to the full data array + * @dtopt Callbacks + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) { + * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart; + * } + * } ); + * } ) + */ + "fnFooterCallback": null, + + + /** + * When rendering large numbers in the information element for the table + * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers + * to have a comma separator for the 'thousands' units (e.g. 1 million is + * rendered as "1,000,000") to help readability for the end user. This + * function will override the default method DataTables uses. + * @type function + * @member + * @param {int} iIn number to be formatted + * @returns {string} formatted string for DataTables to show the number + * @dtopt Callbacks + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "fnFormatNumber": function ( iIn ) { + * if ( iIn < 1000 ) { + * return iIn; + * } else { + * var + * s=(iIn+""), + * a=s.split(""), out="", + * iLen=s.length; + * + * for ( var i=0 ; i<iLen ; i++ ) { + * if ( i%3 === 0 && i !== 0 ) { + * out = "'"+out; + * } + * out = a[iLen-i-1]+out; + * } + * } + * return out; + * }; + * } ); + * } ); + */ + "fnFormatNumber": function ( iIn ) { + if ( iIn < 1000 ) + { + // A small optimisation for what is likely to be the majority of use cases + return iIn; + } + + var s=(iIn+""), a=s.split(""), out="", iLen=s.length; + + for ( var i=0 ; iA
    ' ); + * } + * } + * } ); + * } ); + */ + "fnRowCallback": null, + + + /** + * This parameter allows you to override the default function which obtains + * the data from the server ($.getJSON) so something more suitable for your + * application. For example you could use POST data, or pull information from + * a Gears or AIR database. + * @type function + * @member + * @param {string} sSource HTTP source to obtain the data from (sAjaxSource) + * @param {array} aoData A key/value pair object containing the data to send + * to the server + * @param {function} fnCallback to be called on completion of the data get + * process that will draw the data on the page. + * @param {object} oSettings DataTables settings object + * @dtopt Callbacks + * @dtopt Server-side + * + * @example + * // POST data to server + * $(document).ready(function() { + * $('#example').dataTable( { + * "bProcessing": true, + * "bServerSide": true, + * "sAjaxSource": "xhr.php", + * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) { + * oSettings.jqXHR = $.ajax( { + * "dataType": 'json', + * "type": "POST", + * "url": sSource, + * "data": aoData, + * "success": fnCallback + * } ); + * } + * } ); + * } ); + */ + "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) { + oSettings.jqXHR = $.ajax( { + "url": sUrl, + "data": aoData, + "success": function (json) { + $(oSettings.oInstance).trigger('xhr', oSettings); + fnCallback( json ); + }, + "dataType": "json", + "cache": false, + "type": oSettings.sServerMethod, + "error": function (xhr, error, thrown) { + if ( error == "parsererror" ) { + oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+ + "server could not be parsed. This is caused by a JSON formatting error." ); + } + } + } ); + }, + + + /** + * It is often useful to send extra data to the server when making an Ajax + * request - for example custom filtering information, and this callback + * function makes it trivial to send extra information to the server. The + * passed in parameter is the data set that has been constructed by + * DataTables, and you can add to this or modify it as you require. + * @type function + * @param {array} aoData Data array (array of objects which are name/value + * pairs) that has been constructed by DataTables and will be sent to the + * server. In the case of Ajax sourced data with server-side processing + * this will be an empty array, for server-side processing there will be a + * significant number of parameters! + * @returns {undefined} Ensure that you modify the aoData array passed in, + * as this is passed by reference. + * @dtopt Callbacks + * @dtopt Server-side + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bProcessing": true, + * "bServerSide": true, + * "sAjaxSource": "scripts/server_processing.php", + * "fnServerParams": function ( aoData ) { + * aoData.push( { "name": "more_data", "value": "my_value" } ); + * } + * } ); + * } ); + */ + "fnServerParams": null, + + + /** + * Load the table state. With this function you can define from where, and how, the + * state of a table is loaded. By default DataTables will load from its state saving + * cookie, but you might wish to use local storage (HTML5) or a server-side database. + * @type function + * @member + * @param {object} oSettings DataTables settings object + * @return {object} The DataTables state object to be loaded + * @dtopt Callbacks + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateLoad": function (oSettings) { + * var o; + * + * // Send an Ajax request to the server to get the data. Note that + * // this is a synchronous request. + * $.ajax( { + * "url": "/state_load", + * "async": false, + * "dataType": "json", + * "success": function (json) { + * o = json; + * } + * } ); + * + * return o; + * } + * } ); + * } ); + */ + "fnStateLoad": function ( oSettings ) { + var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance ); + var oData; + + try { + oData = (typeof $.parseJSON === 'function') ? + $.parseJSON(sData) : eval( '('+sData+')' ); + } catch (e) { + oData = null; + } + + return oData; + }, + + + /** + * Callback which allows modification of the saved state prior to loading that state. + * This callback is called when the table is loading state from the stored data, but + * prior to the settings object being modified by the saved state. Note that for + * plug-in authors, you should use the 'stateLoadParams' event to load parameters for + * a plug-in. + * @type function + * @param {object} oSettings DataTables settings object + * @param {object} oData The state object that is to be loaded + * @dtopt Callbacks + * + * @example + * // Remove a saved filter, so filtering is never loaded + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateLoadParams": function (oSettings, oData) { + * oData.oSearch.sSearch = ""; + * } ); + * } ); + * + * @example + * // Disallow state loading by returning false + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateLoadParams": function (oSettings, oData) { + * return false; + * } ); + * } ); + */ + "fnStateLoadParams": null, + + + /** + * Callback that is called when the state has been loaded from the state saving method + * and the DataTables settings object has been modified as a result of the loaded state. + * @type function + * @param {object} oSettings DataTables settings object + * @param {object} oData The state object that was loaded + * @dtopt Callbacks + * + * @example + * // Show an alert with the filtering value that was saved + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateLoaded": function (oSettings, oData) { + * alert( 'Saved filter was: '+oData.oSearch.sSearch ); + * } ); + * } ); + */ + "fnStateLoaded": null, + + + /** + * Save the table state. This function allows you to define where and how the state + * information for the table is stored - by default it will use a cookie, but you + * might want to use local storage (HTML5) or a server-side database. + * @type function + * @member + * @param {object} oSettings DataTables settings object + * @param {object} oData The state object to be saved + * @dtopt Callbacks + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateSave": function (oSettings, oData) { + * // Send an Ajax request to the server with the state object + * $.ajax( { + * "url": "/state_save", + * "data": oData, + * "dataType": "json", + * "method": "POST" + * "success": function () {} + * } ); + * } + * } ); + * } ); + */ + "fnStateSave": function ( oSettings, oData ) { + this.oApi._fnCreateCookie( + oSettings.sCookiePrefix+oSettings.sInstance, + this.oApi._fnJsonString(oData), + oSettings.iCookieDuration, + oSettings.sCookiePrefix, + oSettings.fnCookieCallback + ); + }, + + + /** + * Callback which allows modification of the state to be saved. Called when the table + * has changed state a new state save is required. This method allows modification of + * the state saving object prior to actually doing the save, including addition or + * other state properties or modification. Note that for plug-in authors, you should + * use the 'stateSaveParams' event to save parameters for a plug-in. + * @type function + * @param {object} oSettings DataTables settings object + * @param {object} oData The state object to be saved + * @dtopt Callbacks + * + * @example + * // Remove a saved filter, so filtering is never saved + * $(document).ready(function() { + * $('#example').dataTable( { + * "bStateSave": true, + * "fnStateSaveParams": function (oSettings, oData) { + * oData.oSearch.sSearch = ""; + * } ); + * } ); + */ + "fnStateSaveParams": null, + + + /** + * Duration of the cookie which is used for storing session information. This + * value is given in seconds. + * @type int + * @default 7200 (2 hours) + * @dtopt Options + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "iCookieDuration": 60*60*24 // 1 day + * } ); + * } ) + */ + "iCookieDuration": 7200, + + + /** + * When enabled DataTables will not make a request to the server for the first + * page draw - rather it will use the data already on the page (no sorting etc + * will be applied to it), thus saving on an XHR at load time. iDeferLoading + * is used to indicate that deferred loading is required, but it is also used + * to tell DataTables how many records there are in the full table (allowing + * the information element and pagination to be displayed correctly). In the case + * where a filtering is applied to the table on initial load, this can be + * indicated by giving the parameter as an array, where the first element is + * the number of records available after filtering and the second element is the + * number of records without filtering (allowing the table information element + * to be shown correctly). + * @type int | array + * @default null + * @dtopt Options + * + * @example + * // 57 records available in the table, no filtering applied + * $(document).ready(function() { + * $('#example').dataTable( { + * "bServerSide": true, + * "sAjaxSource": "scripts/server_processing.php", + * "iDeferLoading": 57 + * } ); + * } ); + * + * @example + * // 57 records after filtering, 100 without filtering (an initial filter applied) + * $(document).ready(function() { + * $('#example').dataTable( { + * "bServerSide": true, + * "sAjaxSource": "scripts/server_processing.php", + * "iDeferLoading": [ 57, 100 ], + * "oSearch": { + * "sSearch": "my_filter" + * } + * } ); + * } ); + */ + "iDeferLoading": null, + + + /** + * Number of rows to display on a single page when using pagination. If + * feature enabled (bLengthChange) then the end user will be able to override + * this to a custom setting using a pop-up menu. + * @type int + * @default 10 + * @dtopt Options + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "iDisplayLength": 50 + * } ); + * } ) + */ + "iDisplayLength": 10, + + + /** + * Define the starting point for data display when using DataTables with + * pagination. Note that this parameter is the number of records, rather than + * the page number, so if you have 10 records per page and want to start on + * the third page, it should be "20". + * @type int + * @default 0 + * @dtopt Options + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "iDisplayStart": 20 + * } ); + * } ) + */ + "iDisplayStart": 0, + + + /** + * The scroll gap is the amount of scrolling that is left to go before + * DataTables will load the next 'page' of data automatically. You typically + * want a gap which is big enough that the scrolling will be smooth for the + * user, while not so large that it will load more data than need. + * @type int + * @default 100 + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bScrollInfinite": true, + * "bScrollCollapse": true, + * "sScrollY": "200px", + * "iScrollLoadGap": 50 + * } ); + * } ); + */ + "iScrollLoadGap": 100, + + + /** + * By default DataTables allows keyboard navigation of the table (sorting, paging, + * and filtering) by adding a tabindex attribute to the required elements. This + * allows you to tab through the controls and press the enter key to activate them. + * The tabindex is default 0, meaning that the tab follows the flow of the document. + * You can overrule this using this parameter if you wish. Use a value of -1 to + * disable built-in keyboard navigation. + * @type int + * @default 0 + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "iTabIndex": 1 + * } ); + * } ); + */ + "iTabIndex": 0, + + + /** + * All strings that DataTables uses in the user interface that it creates + * are defined in this object, allowing you to modified them individually or + * completely replace them all as required. + * @namespace + */ + "oLanguage": { + /** + * Strings that are used for WAI-ARIA labels and controls only (these are not + * actually visible on the page, but will be read by screenreaders, and thus + * must be internationalised as well). + * @namespace + */ + "oAria": { + /** + * ARIA label that is added to the table headers when the column may be + * sorted ascending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oAria": { + * "sSortAscending": " - click/return to sort ascending" + * } + * } + * } ); + * } ); + */ + "sSortAscending": ": activate to sort column ascending", + + /** + * ARIA label that is added to the table headers when the column may be + * sorted descending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oAria": { + * "sSortDescending": " - click/return to sort descending" + * } + * } + * } ); + * } ); + */ + "sSortDescending": ": activate to sort column descending" + }, + + /** + * Pagination string used by DataTables for the two built-in pagination + * control types ("two_button" and "full_numbers") + * @namespace + */ + "oPaginate": { + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the first page. + * @type string + * @default First + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oPaginate": { + * "sFirst": "First page" + * } + * } + * } ); + * } ); + */ + "sFirst": "First", + + + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the last page. + * @type string + * @default Last + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oPaginate": { + * "sLast": "Last page" + * } + * } + * } ); + * } ); + */ + "sLast": "Last", + + + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the next page. + * @type string + * @default Next + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oPaginate": { + * "sNext": "Next page" + * } + * } + * } ); + * } ); + */ + "sNext": "Next", + + + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the previous page. + * @type string + * @default Previous + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "oPaginate": { + * "sPrevious": "Previous page" + * } + * } + * } ); + * } ); + */ + "sPrevious": "Previous" + }, + + /** + * This string is shown in preference to sZeroRecords when the table is + * empty of data (regardless of filtering). Note that this is an optional + * parameter - if it is not given, the value of sZeroRecords will be used + * instead (either the default or given value). + * @type string + * @default No data available in table + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sEmptyTable": "No data available in table" + * } + * } ); + * } ); + */ + "sEmptyTable": "No data available in table", + + + /** + * This string gives information to the end user about the information that + * is current on display on the page. The _START_, _END_ and _TOTAL_ + * variables are all dynamically replaced as the table display updates, and + * can be freely moved or removed as the language requirements change. + * @type string + * @default Showing _START_ to _END_ of _TOTAL_ entries + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)" + * } + * } ); + * } ); + */ + "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", + + + /** + * Display information string for when the table is empty. Typically the + * format of this string should match sInfo. + * @type string + * @default Showing 0 to 0 of 0 entries + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sInfoEmpty": "No entries to show" + * } + * } ); + * } ); + */ + "sInfoEmpty": "Showing 0 to 0 of 0 entries", + + + /** + * When a user filters the information in a table, this string is appended + * to the information (sInfo) to give an idea of how strong the filtering + * is. The variable _MAX_ is dynamically updated. + * @type string + * @default (filtered from _MAX_ total entries) + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sInfoFiltered": " - filtering from _MAX_ records" + * } + * } ); + * } ); + */ + "sInfoFiltered": "(filtered from _MAX_ total entries)", + + + /** + * If can be useful to append extra information to the info string at times, + * and this variable does exactly that. This information will be appended to + * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are + * being used) at all times. + * @type string + * @default Empty string + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sInfoPostFix": "All records shown are derived from real information." + * } + * } ); + * } ); + */ + "sInfoPostFix": "", + + + /** + * DataTables has a build in number formatter (fnFormatNumber) which is used + * to format large numbers that are used in the table information. By + * default a comma is used, but this can be trivially changed to any + * character you wish with this parameter. + * @type string + * @default , + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sInfoThousands": "'" + * } + * } ); + * } ); + */ + "sInfoThousands": ",", + + + /** + * Detail the action that will be taken when the drop down menu for the + * pagination length option is changed. The '_MENU_' variable is replaced + * with a default select list of 10, 25, 50 and 100, and can be replaced + * with a custom select box if required. + * @type string + * @default Show _MENU_ entries + * @dtopt Language + * + * @example + * // Language change only + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sLengthMenu": "Display _MENU_ records" + * } + * } ); + * } ); + * + * @example + * // Language and options change + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sLengthMenu": 'Display records' + * } + * } ); + * } ); + */ + "sLengthMenu": "Show _MENU_ entries", + + + /** + * When using Ajax sourced data and during the first draw when DataTables is + * gathering the data, this message is shown in an empty row in the table to + * indicate to the end user the the data is being loaded. Note that this + * parameter is not used when loading data by server-side processing, just + * Ajax sourced data with client-side processing. + * @type string + * @default Loading... + * @dtopt Language + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sLoadingRecords": "Please wait - loading..." + * } + * } ); + * } ); + */ + "sLoadingRecords": "Loading...", + + + /** + * Text which is displayed when the table is processing a user action + * (usually a sort command or similar). + * @type string + * @default Processing... + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sProcessing": "DataTables is currently busy" + * } + * } ); + * } ); + */ + "sProcessing": "Processing...", + + + /** + * Details the actions that will be taken when the user types into the + * filtering input text box. The variable "_INPUT_", if used in the string, + * is replaced with the HTML text box for the filtering input allowing + * control over where it appears in the string. If "_INPUT_" is not given + * then the input box is appended to the string automatically. + * @type string + * @default Search: + * @dtopt Language + * + * @example + * // Input text box will be appended at the end automatically + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sSearch": "Filter records:" + * } + * } ); + * } ); + * + * @example + * // Specify where the filter should appear + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sSearch": "Apply filter _INPUT_ to table" + * } + * } ); + * } ); + */ + "sSearch": "Search:", + + + /** + * All of the language information can be stored in a file on the + * server-side, which DataTables will look up if this parameter is passed. + * It must store the URL of the language file, which is in a JSON format, + * and the object has the same properties as the oLanguage object in the + * initialiser object (i.e. the above parameters). Please refer to one of + * the example language files to see how this works in action. + * @type string + * @default Empty string - i.e. disabled + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt" + * } + * } ); + * } ); + */ + "sUrl": "", + + + /** + * Text shown inside the table records when the is no information to be + * displayed after filtering. sEmptyTable is shown when there is simply no + * information in the table at all (regardless of filtering). + * @type string + * @default No matching records found + * @dtopt Language + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "oLanguage": { + * "sZeroRecords": "No records to display" + * } + * } ); + * } ); + */ + "sZeroRecords": "No matching records found" + }, + + + /** + * This parameter allows you to have define the global filtering state at + * initialisation time. As an object the "sSearch" parameter must be + * defined, but all other parameters are optional. When "bRegex" is true, + * the search string will be treated as a regular expression, when false + * (default) it will be treated as a straight string. When "bSmart" + * DataTables will use it's smart filtering methods (to word match at + * any point in the data), when false this will not be done. + * @namespace + * @extends DataTable.models.oSearch + * @dtopt Options + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "oSearch": {"sSearch": "Initial search"} + * } ); + * } ) + */ + "oSearch": $.extend( {}, DataTable.models.oSearch ), + + + /** + * By default DataTables will look for the property 'aaData' when obtaining + * data from an Ajax source or for server-side processing - this parameter + * allows that property to be changed. You can use Javascript dotted object + * notation to get a data source for multiple levels of nesting. + * @type string + * @default aaData + * @dtopt Options + * @dtopt Server-side + * + * @example + * // Get data from { "data": [...] } + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "sAjaxSource": "sources/data.txt", + * "sAjaxDataProp": "data" + * } ); + * } ); + * + * @example + * // Get data from { "data": { "inner": [...] } } + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "sAjaxSource": "sources/data.txt", + * "sAjaxDataProp": "data.inner" + * } ); + * } ); + */ + "sAjaxDataProp": "aaData", + + + /** + * You can instruct DataTables to load data from an external source using this + * parameter (use aData if you want to pass data in you already have). Simply + * provide a url a JSON object can be obtained from. This object must include + * the parameter 'aaData' which is the data source for the table. + * @type string + * @default null + * @dtopt Options + * @dtopt Server-side + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php" + * } ); + * } ) + */ + "sAjaxSource": null, + + + /** + * This parameter can be used to override the default prefix that DataTables + * assigns to a cookie when state saving is enabled. + * @type string + * @default SpryMedia_DataTables_ + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sCookiePrefix": "my_datatable_", + * } ); + * } ); + */ + "sCookiePrefix": "SpryMedia_DataTables_", + + + /** + * This initialisation variable allows you to specify exactly where in the + * DOM you want DataTables to inject the various controls it adds to the page + * (for example you might want the pagination controls at the top of the + * table). DIV elements (with or without a custom class) can also be added to + * aid styling. The follow syntax is used: + *
      + *
    • The following options are allowed: + *
        + *
      • 'l' - Length changing
      • 'f' - Filtering input + *
      • 't' - The table!
      • + *
      • 'i' - Information
      • + *
      • 'p' - Pagination
      • + *
      • 'r' - pRocessing
      • + *
      + *
    • + *
    • The following constants are allowed: + *
        + *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • + *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • + *
      + *
    • + *
    • The following syntax is expected: + *
        + *
      • '<' and '>' - div elements
      • + *
      • '<"class" and '>' - div with a class
      • + *
      • '<"#id" and '>' - div with an ID
      • + *
      + *
    • + *
    • Examples: + *
        + *
      • '<"wrapper"flipt>'
      • + *
      • '<lf<t>ip>'
      • + *
      + *
    • + *
    + * @type string + * @default lfrtip (when bJQueryUI is false) or + * <"H"lfr>t<"F"ip> (when bJQueryUI is true) + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sDom": '<"top"i>rt<"bottom"flp><"clear">' + * } ); + * } ); + */ + "sDom": "lfrtip", + + + /** + * DataTables features two different built-in pagination interaction methods + * ('two_button' or 'full_numbers') which present different page controls to + * the end user. Further methods can be added using the API (see below). + * @type string + * @default two_button + * @dtopt Options + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "sPaginationType": "full_numbers" + * } ); + * } ) + */ + "sPaginationType": "two_button", + + + /** + * Enable horizontal scrolling. When a table is too wide to fit into a certain + * layout, or you have a large number of columns in the table, you can enable + * x-scrolling to show the table in a viewport, which can be scrolled. This + * property can be any CSS unit, or a number (in which case it will be treated + * as a pixel measurement). + * @type string + * @default blank string - i.e. disabled + * @dtopt Features + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollX": "100%", + * "bScrollCollapse": true + * } ); + * } ); + */ + "sScrollX": "", + + + /** + * This property can be used to force a DataTable to use more width than it + * might otherwise do when x-scrolling is enabled. For example if you have a + * table which requires to be well spaced, this parameter is useful for + * "over-sizing" the table, and thus forcing scrolling. This property can by + * any CSS unit, or a number (in which case it will be treated as a pixel + * measurement). + * @type string + * @default blank string - i.e. disabled + * @dtopt Options + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollX": "100%", + * "sScrollXInner": "110%" + * } ); + * } ); + */ + "sScrollXInner": "", + + + /** + * Enable vertical scrolling. Vertical scrolling will constrain the DataTable + * to the given height, and enable scrolling for any data which overflows the + * current viewport. This can be used as an alternative to paging to display + * a lot of data in a small area (although paging and scrolling can both be + * enabled at the same time). This property can be any CSS unit, or a number + * (in which case it will be treated as a pixel measurement). + * @type string + * @default blank string - i.e. disabled + * @dtopt Features + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "bPaginate": false + * } ); + * } ); + */ + "sScrollY": "", + + + /** + * Set the HTTP method that is used to make the Ajax call for server-side + * processing or Ajax sourced data. + * @type string + * @default GET + * @dtopt Options + * @dtopt Server-side + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "bServerSide": true, + * "sAjaxSource": "scripts/post.php", + * "sServerMethod": "POST" + * } ); + * } ); + */ + "sServerMethod": "GET" + }; + + + + /** + * Column options that can be given to DataTables at initialisation time. + * @namespace + */ + DataTable.defaults.columns = { + /** + * Allows a column's sorting to take multiple columns into account when + * doing a sort. For example first name / last name columns make sense to + * do a multi-column sort over the two columns. + * @type array + * @default null Takes the value of the column index automatically + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] }, + * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] }, + * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "aDataSort": [ 0, 1 ] }, + * { "aDataSort": [ 1, 0 ] }, + * { "aDataSort": [ 2, 3, 4 ] }, + * null, + * null + * ] + * } ); + * } ); + */ + "aDataSort": null, + + + /** + * You can control the default sorting direction, and even alter the behaviour + * of the sort handler (i.e. only allow ascending sorting etc) using this + * parameter. + * @type array + * @default [ 'asc', 'desc' ] + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "asSorting": [ "asc" ], "aTargets": [ 1 ] }, + * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] }, + * { "asSorting": [ "desc" ], "aTargets": [ 3 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * null, + * { "asSorting": [ "asc" ] }, + * { "asSorting": [ "desc", "asc", "asc" ] }, + * { "asSorting": [ "desc" ] }, + * null + * ] + * } ); + * } ); + */ + "asSorting": [ 'asc', 'desc' ], + + + /** + * Enable or disable filtering on the data in this column. + * @type boolean + * @default true + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "bSearchable": false, "aTargets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "bSearchable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSearchable": true, + + + /** + * Enable or disable sorting on this column. + * @type boolean + * @default true + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "bSortable": false, "aTargets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "bSortable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSortable": true, + + + /** + * When using fnRender() for a column, you may wish to use the original data + * (before rendering) for sorting and filtering (the default is to used the + * rendered data that the user can see). This may be useful for dates etc. + * + * *NOTE* It is it is advisable now to use mDataProp as a function and make + * use of the 'type' that it gives, allowing (potentially) different data to + * be used for sorting, filtering, display and type detection. + * @type boolean + * @default true + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { + * "fnRender": function ( oObj ) { + * return oObj.aData[0] +' '+ oObj.aData[3]; + * }, + * "bUseRendered": false, + * "aTargets": [ 0 ] + * } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { + * "fnRender": function ( oObj ) { + * return oObj.aData[0] +' '+ oObj.aData[3]; + * }, + * "bUseRendered": false + * }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "bUseRendered": true, + + + /** + * Enable or disable the display of this column. + * @type boolean + * @default true + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "bVisible": false, "aTargets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "bVisible": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bVisible": true, + + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to fnRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available (since it is not when fnRender is called). + * @type function + * @param {element} nTd The TD node that has been created + * @param {*} sData The Data for the cell + * @param {array|object} oData The data for the whole row + * @param {int} iRow The row index for the aoData data store + * @param {int} iCol The column index for aoColumns + * @dtopt Columns + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ { + * "aTargets": [3], + * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { + * if ( sData == "1.7" ) { + * $(nTd).css('color', 'blue') + * } + * } + * } ] + * }); + * } ); + */ + "fnCreatedCell": null, + + + /** + * Custom display function that will be called for the display of each cell in + * this column. + * @type function + * @param {object} o Object with the following parameters: + * @param {int} o.iDataRow The row in aoData + * @param {int} o.iDataColumn The column in question + * @param {array} o.aData The data for the row in question + * @param {object} o.oSettings The settings object for this DataTables instance + * @param {object} o.mDataProp The data property used for this column + * @param {*} val The current cell value + * @returns {string} The string you which to use in the display + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { + * "fnRender": function ( o, val ) { + * return o.aData[0] +' '+ o.aData[3]; + * }, + * "aTargets": [ 0 ] + * } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "fnRender": function ( o, val ) { + * return o.aData[0] +' '+ o.aData[3]; + * } }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "fnRender": null, + + + /** + * The column index (starting from 0!) that you wish a sort to be performed + * upon when this column is selected for sorting. This can be used for sorting + * on hidden columns for example. + * @type int + * @default -1 Use automatically calculated column index + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "iDataSort": 1, "aTargets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "iDataSort": 1 }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "iDataSort": -1, + + + /** + * This property can be used to read data from any JSON data source property, + * including deeply nested objects / properties. mDataProp can be given in a + * number of different ways which effect its behaviour: + *
      + *
    • integer - treated as an array index for the data source. This is the + * default that DataTables uses (incrementally increased for each column).
    • + *
    • string - read an object property from the data source. Note that you can + * use Javascript dotted notation to read deep properties/arrays from the + * data source.
    • + *
    • null - the sDefaultContent option will be used for the cell (null + * by default, so you will need to specify the default content you want - + * typically an empty string). This can be useful on generated columns such + * as edit / delete action columns.
    • + *
    • function - the function given will be executed whenever DataTables + * needs to set or get the data for a cell in the column. The function + * takes three parameters: + *
        + *
      • {array|object} The data source for the row
      • + *
      • {string} The type call data requested - this will be 'set' when + * setting data or 'filter', 'display', 'type', 'sort' or undefined when + * gathering data. Note that when undefined is given for the type + * DataTables expects to get the raw data for the object back
      • + *
      • {*} Data to set when the second parameter is 'set'.
      • + *
      + * The return value from the function is not required when 'set' is the type + * of call, but otherwise the return is what will be used for the data + * requested.
    • + *
    + * @type string|int|function|null + * @default null Use automatically calculated column index + * @dtopt Columns + * + * @example + * // Read table data from objects + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "sAjaxSource": "sources/deep.txt", + * "aoColumns": [ + * { "mDataProp": "engine" }, + * { "mDataProp": "browser" }, + * { "mDataProp": "platform.inner" }, + * { "mDataProp": "platform.details.0" }, + * { "mDataProp": "platform.details.1" } + * ] + * } ); + * } ); + * + * @example + * // Using mDataProp as a function to provide different information for + * // sorting, filtering and display. In this case, currency (price) + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "aoColumnDefs": [ + * { + * "aTargets": [ 0 ], + * "mDataProp": function ( source, type, val ) { + * if (type === 'set') { + * source.price = val; + * // Store the computed dislay and filter values for efficiency + * source.price_display = val=="" ? "" : "$"+numberFormat(val); + * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; + * return; + * } + * else if (type === 'display') { + * return source.price_display; + * } + * else if (type === 'filter') { + * return source.price_filter; + * } + * // 'sort', 'type' and undefined all just use the integer + * return source.price; + * } + * ] + * } ); + * } ); + */ + "mDataProp": null, + + + /** + * Change the cell type created for the column - either TD cells or TH cells. This + * can be useful as TH cells have semantic meaning in the table body, allowing them + * to act as a header for a row (you may wish to add scope='row' to the TH elements). + * @type string + * @default td + * @dtopt Columns + * + * @example + * // Make the first column use TH cells + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "aoColumnDefs": [ + * { + * "aTargets": [ 0 ], + * "sCellType": "th" + * ] + * } ); + * } ); + */ + "sCellType": "td", + + + /** + * Class to give to each cell in this column. + * @type string + * @default Empty string + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sClass": "my_class", "aTargets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "sClass": "my_class" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sClass": "", + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * Generally you shouldn't need this, and it is not documented on the + * general DataTables.net documentation + * @type string + * @default Empty string + * @dtopt Columns + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * null, + * null, + * null, + * { + * "sContentPadding": "mmm" + * } + * ] + * } ); + * } ); + */ + "sContentPadding": "", + + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because mDataProp + * is set to null, or because the data source itself is null). + * @type string + * @default null + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { + * "mDataProp": null, + * "sDefaultContent": "Edit", + * "aTargets": [ -1 ] + * } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * null, + * null, + * null, + * { + * "mDataProp": null, + * "sDefaultContent": "Edit" + * } + * ] + * } ); + * } ); + */ + "sDefaultContent": null, + + + /** + * This parameter is only used in DataTables' server-side processing. It can + * be exceptionally useful to know what columns are being displayed on the + * client side, and to map these to database fields. When defined, the names + * also allow DataTables to reorder information from the server if it comes + * back in an unexpected order (i.e. if you switch your columns around on the + * client-side, your server-side code does not also need updating). + * @type string + * @default Empty string + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sName": "engine", "aTargets": [ 0 ] }, + * { "sName": "browser", "aTargets": [ 1 ] }, + * { "sName": "platform", "aTargets": [ 2 ] }, + * { "sName": "version", "aTargets": [ 3 ] }, + * { "sName": "grade", "aTargets": [ 4 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "sName": "engine" }, + * { "sName": "browser" }, + * { "sName": "platform" }, + * { "sName": "version" }, + * { "sName": "grade" } + * ] + * } ); + * } ); + */ + "sName": "", + + + /** + * Defines a data source type for the sorting which can be used to read + * realtime information from the table (updating the internally cached + * version) prior to sorting. This allows sorting to occur on user editable + * elements such as form inputs. + * @type string + * @default std + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] }, + * { "sType": "numeric", "aTargets": [ 3 ] }, + * { "sSortDataType": "dom-select", "aTargets": [ 4 ] }, + * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * null, + * null, + * { "sSortDataType": "dom-text" }, + * { "sSortDataType": "dom-text", "sType": "numeric" }, + * { "sSortDataType": "dom-select" }, + * { "sSortDataType": "dom-checkbox" } + * ] + * } ); + * } ); + */ + "sSortDataType": "std", + + + /** + * The title of this column. + * @type string + * @default null Derived from the 'TH' value for this column in the + * original HTML table. + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sTitle": "My column title", "aTargets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "sTitle": "My column title" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sTitle": null, + + + /** + * The type allows you to specify how the data for this column will be sorted. + * Four types (string, numeric, date and html (which will strip HTML tags + * before sorting)) are currently available. Note that only date formats + * understood by Javascript's Date() object will be accepted as type date. For + * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric', + * 'date' or 'html' (by default). Further types can be adding through + * plug-ins. + * @type string + * @default null Auto-detected from raw data + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sType": "html", "aTargets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "sType": "html" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sType": null, + + + /** + * Defining the width of the column, this parameter may take any CSS value + * (3em, 20px etc). DataTables applys 'smart' widths to columns which have not + * been given a specific width through this interface ensuring that the table + * remains readable. + * @type string + * @default null Automatic + * @dtopt Columns + * + * @example + * // Using aoColumnDefs + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumnDefs": [ + * { "sWidth": "20%", "aTargets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using aoColumns + * $(document).ready(function() { + * $('#example').dataTable( { + * "aoColumns": [ + * { "sWidth": "20%" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sWidth": null + }; + + + + /** + * DataTables settings object - this holds all the information needed for a + * given table, including configuration, data and current application of the + * table options. DataTables does not have a single instance for each DataTable + * with the settings attached to that instance, but rather instances of the + * DataTable "class" are created on-the-fly as needed (typically by a + * $().dataTable() call) and the settings object is then applied to that + * instance. + * + * Note that this object is related to {@link DataTable.defaults} but this + * one is the internal data store for DataTables's cache of columns. It should + * NOT be manipulated outside of DataTables. Any configuration should be done + * through the initialisation options. + * @namespace + * @todo Really should attach the settings object to individual instances so we + * don't need to create new instances on each $().dataTable() call (if the + * table already exists). It would also save passing oSettings around and + * into every single function. However, this is a very significant + * architecture change for DataTables and will almost certainly break + * backwards compatibility with older installations. This is something that + * will be done in 2.0. + */ + DataTable.models.oSettings = { + /** + * Primary features of DataTables and their enablement state. + * @namespace + */ + "oFeatures": { + + /** + * Flag to say if DataTables should automatically try to calculate the + * optimum table and columns widths (true) or not (false). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bAutoWidth": null, + + /** + * Delay the creation of TR and TD elements until they are actually + * needed by a driven page draw. This can give a significant speed + * increase for Ajax source and Javascript source data, but makes no + * difference at all fro DOM and server-side processing tables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bDeferRender": null, + + /** + * Enable filtering on the table or not. Note that if this is disabled + * then there is no filtering at all on the table, including fnFilter. + * To just remove the filtering input use sDom and remove the 'f' option. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bFilter": null, + + /** + * Table information element (the 'Showing x of y records' div) enable + * flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bInfo": null, + + /** + * Present a user control allowing the end user to change the page size + * when pagination is enabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bLengthChange": null, + + /** + * Pagination enabled or not. Note that if this is disabled then length + * changing must also be disabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bPaginate": null, + + /** + * Processing indicator enable flag whenever DataTables is enacting a + * user request - typically an Ajax request for server-side processing. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bProcessing": null, + + /** + * Server-side processing enabled flag - when enabled DataTables will + * get all data from the server for every draw - there is no filtering, + * sorting or paging done on the client-side. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bServerSide": null, + + /** + * Sorting enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSort": null, + + /** + * Apply a class to the columns which are being sorted to provide a + * visual highlight or not. This can slow things down when enabled since + * there is a lot of DOM interaction. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortClasses": null, + + /** + * State saving enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bStateSave": null + }, + + + /** + * Scrolling settings for a table. + * @namespace + */ + "oScroll": { + /** + * Indicate if DataTables should be allowed to set the padding / margin + * etc for the scrolling header elements or not. Typically you will want + * this. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bAutoCss": null, + + /** + * When the table is shorter in height than sScrollY, collapse the + * table container down to the height of the table (when true). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bCollapse": null, + + /** + * Infinite scrolling enablement flag. Now deprecated in favour of + * using the Scroller plug-in. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bInfinite": null, + + /** + * Width of the scrollbar for the web-browser's platform. Calculated + * during table initialisation. + * @type int + * @default 0 + */ + "iBarWidth": 0, + + /** + * Space (in pixels) between the bottom of the scrolling container and + * the bottom of the scrolling viewport before the next page is loaded + * when using infinite scrolling. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type int + */ + "iLoadGap": null, + + /** + * Viewport width for horizontal scrolling. Horizontal scrolling is + * disabled if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sX": null, + + /** + * Width to expand the table to when using x-scrolling. Typically you + * should not need to use this. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @deprecated + */ + "sXInner": null, + + /** + * Viewport height for vertical scrolling. Vertical scrolling is disabled + * if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sY": null + }, + + /** + * Language information for the table. + * @namespace + * @extends DataTable.defaults.oLanguage + */ + "oLanguage": { + /** + * Information callback function. See + * {@link DataTable.defaults.fnInfoCallback} + * @type function + * @default + */ + "fnInfoCallback": null + }, + + /** + * Array referencing the nodes which are used for the features. The + * parameters of this object match what is allowed by sDom - i.e. + *
      + *
    • 'l' - Length changing
    • + *
    • 'f' - Filtering input
    • + *
    • 't' - The table!
    • + *
    • 'i' - Information
    • + *
    • 'p' - Pagination
    • + *
    • 'r' - pRocessing
    • + *
    + * @type array + * @default [] + */ + "aanFeatures": [], + + /** + * Store data information - see {@link DataTable.models.oRow} for detailed + * information. + * @type array + * @default [] + */ + "aoData": [], + + /** + * Array of indexes which are in the current display (after filtering etc) + * @type array + * @default [] + */ + "aiDisplay": [], + + /** + * Array of indexes for display - no filtering + * @type array + * @default [] + */ + "aiDisplayMaster": [], + + /** + * Store information about each column that is in use + * @type array + * @default [] + */ + "aoColumns": [], + + /** + * Store information about the table's header + * @type array + * @default [] + */ + "aoHeader": [], + + /** + * Store information about the table's footer + * @type array + * @default [] + */ + "aoFooter": [], + + /** + * Search data array for regular expression searching + * @type array + * @default [] + */ + "asDataSearch": [], + + /** + * Store the applied global search information in case we want to force a + * research or compare the old search to a new one. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @namespace + * @extends DataTable.models.oSearch + */ + "oPreviousSearch": {}, + + /** + * Store the applied search for each column - see + * {@link DataTable.models.oSearch} for the format that is used for the + * filtering information for each column. + * @type array + * @default [] + */ + "aoPreSearchCols": [], + + /** + * Sorting that is applied to the table. Note that the inner arrays are + * used in the following manner: + *
      + *
    • Index 0 - column number
    • + *
    • Index 1 - current sorting direction
    • + *
    • Index 2 - index of asSorting for this column
    • + *
    + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @todo These inner arrays should really be objects + */ + "aaSorting": null, + + /** + * Sorting that is always applied to the table (i.e. prefixed in front of + * aaSorting). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array|null + * @default null + */ + "aaSortingFixed": null, + + /** + * Classes to use for the striping of a table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "asStripeClasses": null, + + /** + * If restoring a table - we should restore its striping classes as well + * @type array + * @default [] + */ + "asDestroyStripes": [], + + /** + * If restoring a table - we should restore its width + * @type int + * @default 0 + */ + "sDestroyWidth": 0, + + /** + * Callback functions array for every time a row is inserted (i.e. on a draw). + * @type array + * @default [] + */ + "aoRowCallback": [], + + /** + * Callback functions for the header on each draw. + * @type array + * @default [] + */ + "aoHeaderCallback": [], + + /** + * Callback function for the footer on each draw. + * @type array + * @default [] + */ + "aoFooterCallback": [], + + /** + * Array of callback functions for draw callback functions + * @type array + * @default [] + */ + "aoDrawCallback": [], + + /** + * Array of callback functions for row created function + * @type array + * @default [] + */ + "aoRowCreatedCallback": [], + + /** + * Callback functions for just before the table is redrawn. A return of + * false will be used to cancel the draw. + * @type array + * @default [] + */ + "aoPreDrawCallback": [], + + /** + * Callback functions for when the table has been initialised. + * @type array + * @default [] + */ + "aoInitComplete": [], + + + /** + * Callbacks for modifying the settings to be stored for state saving, prior to + * saving state. + * @type array + * @default [] + */ + "aoStateSaveParams": [], + + /** + * Callbacks for modifying the settings that have been stored for state saving + * prior to using the stored values to restore the state. + * @type array + * @default [] + */ + "aoStateLoadParams": [], + + /** + * Callbacks for operating on the settings object once the saved state has been + * loaded + * @type array + * @default [] + */ + "aoStateLoaded": [], + + /** + * Cache the table ID for quick access + * @type string + * @default Empty string + */ + "sTableId": "", + + /** + * The TABLE node for the main table + * @type node + * @default null + */ + "nTable": null, + + /** + * Permanent ref to the thead element + * @type node + * @default null + */ + "nTHead": null, + + /** + * Permanent ref to the tfoot element - if it exists + * @type node + * @default null + */ + "nTFoot": null, + + /** + * Permanent ref to the tbody element + * @type node + * @default null + */ + "nTBody": null, + + /** + * Cache the wrapper node (contains all DataTables controlled elements) + * @type node + * @default null + */ + "nTableWrapper": null, + + /** + * Indicate if when using server-side processing the loading of data + * should be deferred until the second draw. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + * @default false + */ + "bDeferLoading": false, + + /** + * Indicate if all required information has been read in + * @type boolean + * @default false + */ + "bInitialised": false, + + /** + * Information about open rows. Each object in the array has the parameters + * 'nTr' and 'nParent' + * @type array + * @default [] + */ + "aoOpenRows": [], + + /** + * Dictate the positioning of DataTables' control elements - see + * {@link DataTable.model.oInit.sDom}. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sDom": null, + + /** + * Which type of pagination should be used. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default two_button + */ + "sPaginationType": "two_button", + + /** + * The cookie duration (for bStateSave) in seconds. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type int + * @default 0 + */ + "iCookieDuration": 0, + + /** + * The cookie name prefix. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default Empty string + */ + "sCookiePrefix": "", + + /** + * Callback function for cookie creation. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + * @default null + */ + "fnCookieCallback": null, + + /** + * Array of callback functions for state saving. Each array element is an + * object with the following parameters: + *
      + *
    • function:fn - function to call. Takes two parameters, oSettings + * and the JSON string to save that has been thus far created. Returns + * a JSON string to be inserted into a json object + * (i.e. '"param": [ 0, 1, 2]')
    • + *
    • string:sName - name of callback
    • + *
    + * @type array + * @default [] + */ + "aoStateSave": [], + + /** + * Array of callback functions for state loading. Each array element is an + * object with the following parameters: + *
      + *
    • function:fn - function to call. Takes two parameters, oSettings + * and the object stored. May return false to cancel state loading
    • + *
    • string:sName - name of callback
    • + *
    + * @type array + * @default [] + */ + "aoStateLoad": [], + + /** + * State that was loaded from the cookie. Useful for back reference + * @type object + * @default null + */ + "oLoadedState": null, + + /** + * Source url for AJAX data for the table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sAjaxSource": null, + + /** + * Property from a given object from which to read the table data from. This + * can be an empty string (when not server-side processing), in which case + * it is assumed an an array is given directly. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sAjaxDataProp": null, + + /** + * Note if draw should be blocked while getting data + * @type boolean + * @default true + */ + "bAjaxDataGet": true, + + /** + * The last jQuery XHR object that was used for server-side data gathering. + * This can be used for working with the XHR information in one of the + * callbacks + * @type object + * @default null + */ + "jqXHR": null, + + /** + * Function to get the server-side data. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnServerData": null, + + /** + * Functions which are called prior to sending an Ajax request so extra + * parameters can easily be sent to the server + * @type array + * @default [] + */ + "aoServerParams": [], + + /** + * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if + * required). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sServerMethod": null, + + /** + * Format numbers for display. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnFormatNumber": null, + + /** + * List of options that can be used for the user selectable length menu. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "aLengthMenu": null, + + /** + * Counter for the draws that the table does. Also used as a tracker for + * server-side processing + * @type int + * @default 0 + */ + "iDraw": 0, + + /** + * Indicate if a redraw is being done - useful for Ajax + * @type boolean + * @default false + */ + "bDrawing": false, + + /** + * Draw index (iDraw) of the last error when parsing the returned data + * @type int + * @default -1 + */ + "iDrawError": -1, + + /** + * Paging display length + * @type int + * @default 10 + */ + "_iDisplayLength": 10, + + /** + * Paging start point - aiDisplay index + * @type int + * @default 0 + */ + "_iDisplayStart": 0, + + /** + * Paging end point - aiDisplay index. Use fnDisplayEnd rather than + * this property to get the end point + * @type int + * @default 10 + * @private + */ + "_iDisplayEnd": 10, + + /** + * Server-side processing - number of records in the result set + * (i.e. before filtering), Use fnRecordsTotal rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type int + * @default 0 + * @private + */ + "_iRecordsTotal": 0, + + /** + * Server-side processing - number of records in the current display set + * (i.e. after filtering). Use fnRecordsDisplay rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type boolean + * @default 0 + * @private + */ + "_iRecordsDisplay": 0, + + /** + * Flag to indicate if jQuery UI marking and classes should be used. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bJUI": null, + + /** + * The classes to use for the table + * @type object + * @default {} + */ + "oClasses": {}, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if filtering has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bFiltered": false, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if sorting has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bSorted": false, + + /** + * Indicate that if multiple rows are in the header and there is more than + * one unique cell per column, if the top one (true) or bottom one (false) + * should be used for sorting / title by DataTables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortCellsTop": null, + + /** + * Initialisation object that is used for the table + * @type object + * @default null + */ + "oInit": null, + + /** + * Destroy callback functions - for plug-ins to attach themselves to the + * destroy so they can clean up markup and events. + * @type array + * @default [] + */ + "aoDestroyCallback": [], + + + /** + * Get the number of records in the current record set, before filtering + * @type function + */ + "fnRecordsTotal": function () + { + if ( this.oFeatures.bServerSide ) { + return parseInt(this._iRecordsTotal, 10); + } else { + return this.aiDisplayMaster.length; + } + }, + + /** + * Get the number of records in the current record set, after filtering + * @type function + */ + "fnRecordsDisplay": function () + { + if ( this.oFeatures.bServerSide ) { + return parseInt(this._iRecordsDisplay, 10); + } else { + return this.aiDisplay.length; + } + }, + + /** + * Set the display end point - aiDisplay index + * @type function + * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here + */ + "fnDisplayEnd": function () + { + if ( this.oFeatures.bServerSide ) { + if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) { + return this._iDisplayStart+this.aiDisplay.length; + } else { + return Math.min( this._iDisplayStart+this._iDisplayLength, + this._iRecordsDisplay ); + } + } else { + return this._iDisplayEnd; + } + }, + + /** + * The DataTables object for this table + * @type object + * @default null + */ + "oInstance": null, + + /** + * Unique identifier for each instance of the DataTables object. If there + * is an ID on the table node, then it takes that value, otherwise an + * incrementing internal counter is used. + * @type string + * @default null + */ + "sInstance": null, + + /** + * tabindex attribute value that is added to DataTables control elements, allowing + * keyboard navigation of the table and its controls. + */ + "iTabIndex": 0, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollHead": null, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollFoot": null + }; + + /** + * Extension object for DataTables that is used to provide all extension options. + * + * Note that the DataTable.ext object is available through + * jQuery.fn.dataTable.ext where it may be accessed and manipulated. It is + * also aliased to jQuery.fn.dataTableExt for historic reasons. + * @namespace + * @extends DataTable.models.ext + */ + DataTable.ext = $.extend( true, {}, DataTable.models.ext ); + + $.extend( DataTable.ext.oStdClasses, { + "sTable": "dataTable", + + /* Two buttons buttons */ + "sPagePrevEnabled": "paginate_enabled_previous", + "sPagePrevDisabled": "paginate_disabled_previous", + "sPageNextEnabled": "paginate_enabled_next", + "sPageNextDisabled": "paginate_disabled_next", + "sPageJUINext": "", + "sPageJUIPrev": "", + + /* Full numbers paging buttons */ + "sPageButton": "paginate_button", + "sPageButtonActive": "paginate_active", + "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled", + "sPageFirst": "first", + "sPagePrevious": "previous", + "sPageNext": "next", + "sPageLast": "last", + + /* Striping classes */ + "sStripeOdd": "odd", + "sStripeEven": "even", + + /* Empty row */ + "sRowEmpty": "dataTables_empty", + + /* Features */ + "sWrapper": "dataTables_wrapper", + "sFilter": "dataTables_filter", + "sInfo": "dataTables_info", + "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ + "sLength": "dataTables_length", + "sProcessing": "dataTables_processing", + + /* Sorting */ + "sSortAsc": "sorting_asc", + "sSortDesc": "sorting_desc", + "sSortable": "sorting", /* Sortable in both directions */ + "sSortableAsc": "sorting_asc_disabled", + "sSortableDesc": "sorting_desc_disabled", + "sSortableNone": "sorting_disabled", + "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ + "sSortJUIAsc": "", + "sSortJUIDesc": "", + "sSortJUI": "", + "sSortJUIAscAllowed": "", + "sSortJUIDescAllowed": "", + "sSortJUIWrapper": "", + "sSortIcon": "", + + /* Scrolling */ + "sScrollWrapper": "dataTables_scroll", + "sScrollHead": "dataTables_scrollHead", + "sScrollHeadInner": "dataTables_scrollHeadInner", + "sScrollBody": "dataTables_scrollBody", + "sScrollFoot": "dataTables_scrollFoot", + "sScrollFootInner": "dataTables_scrollFootInner", + + /* Misc */ + "sFooterTH": "", + "sJUIHeader": "", + "sJUIFooter": "" + } ); + + + $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, { + /* Two buttons buttons */ + "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left", + "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled", + "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right", + "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled", + "sPageJUINext": "ui-icon ui-icon-circle-arrow-e", + "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w", + + /* Full numbers paging buttons */ + "sPageButton": "fg-button ui-button ui-state-default", + "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled", + "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled", + "sPageFirst": "first ui-corner-tl ui-corner-bl", + "sPageLast": "last ui-corner-tr ui-corner-br", + + /* Features */ + "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ + "ui-buttonset-multi paging_", /* Note that the type is postfixed */ + + /* Sorting */ + "sSortAsc": "ui-state-default", + "sSortDesc": "ui-state-default", + "sSortable": "ui-state-default", + "sSortableAsc": "ui-state-default", + "sSortableDesc": "ui-state-default", + "sSortableNone": "ui-state-default", + "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n", + "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s", + "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s", + "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n", + "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s", + "sSortJUIWrapper": "DataTables_sort_wrapper", + "sSortIcon": "DataTables_sort_icon", + + /* Scrolling */ + "sScrollHead": "dataTables_scrollHead ui-state-default", + "sScrollFoot": "dataTables_scrollFoot ui-state-default", + + /* Misc */ + "sFooterTH": "ui-state-default", + "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix", + "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix" + } ); + + + /* + * Variable: oPagination + * Purpose: + * Scope: jQuery.fn.dataTableExt + */ + $.extend( DataTable.ext.oPagination, { + /* + * Variable: two_button + * Purpose: Standard two button (forward/back) pagination + * Scope: jQuery.fn.dataTableExt.oPagination + */ + "two_button": { + /* + * Function: oPagination.two_button.fnInit + * Purpose: Initialise dom elements required for pagination with forward/back buttons only + * Returns: - + * Inputs: object:oSettings - dataTables settings object + * node:nPaging - the DIV which contains this pagination control + * function:fnCallbackDraw - draw function which must be called on update + */ + "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) + { + var oLang = oSettings.oLanguage.oPaginate; + var oClasses = oSettings.oClasses; + var fnClickHandler = function ( e ) { + if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) + { + fnCallbackDraw( oSettings ); + } + }; + + var sAppend = (!oSettings.bJUI) ? + ''+oLang.sPrevious+''+ + ''+oLang.sNext+'' + : + ''+ + ''; + $(nPaging).append( sAppend ); + + var els = $('a', nPaging); + var nPrevious = els[0], + nNext = els[1]; + + oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler ); + oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); + + /* ID the first elements only */ + if ( !oSettings.aanFeatures.p ) + { + nPaging.id = oSettings.sTableId+'_paginate'; + nPrevious.id = oSettings.sTableId+'_previous'; + nNext.id = oSettings.sTableId+'_next'; + + nPrevious.setAttribute('aria-controls', oSettings.sTableId); + nNext.setAttribute('aria-controls', oSettings.sTableId); + } + }, + + /* + * Function: oPagination.two_button.fnUpdate + * Purpose: Update the two button pagination at the end of the draw + * Returns: - + * Inputs: object:oSettings - dataTables settings object + * function:fnCallbackDraw - draw function to call on page change + */ + "fnUpdate": function ( oSettings, fnCallbackDraw ) + { + if ( !oSettings.aanFeatures.p ) + { + return; + } + + var oClasses = oSettings.oClasses; + var an = oSettings.aanFeatures.p; + + /* Loop over each instance of the pager */ + for ( var i=0, iLen=an.length ; i'+oLang.sFirst+''+ + ''+oLang.sPrevious+''+ + ''+ + ''+oLang.sNext+''+ + ''+oLang.sLast+'' + ); + var els = $('a', nPaging); + var nFirst = els[0], + nPrev = els[1], + nNext = els[2], + nLast = els[3]; + + oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler ); + oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler ); + oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); + oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler ); + + /* ID the first elements only */ + if ( !oSettings.aanFeatures.p ) + { + nPaging.id = oSettings.sTableId+'_paginate'; + nFirst.id =oSettings.sTableId+'_first'; + nPrev.id =oSettings.sTableId+'_previous'; + nNext.id =oSettings.sTableId+'_next'; + nLast.id =oSettings.sTableId+'_last'; + } + }, + + /* + * Function: oPagination.full_numbers.fnUpdate + * Purpose: Update the list of page buttons shows + * Returns: - + * Inputs: object:oSettings - dataTables settings object + * function:fnCallbackDraw - draw function to call on page change + */ + "fnUpdate": function ( oSettings, fnCallbackDraw ) + { + if ( !oSettings.aanFeatures.p ) + { + return; + } + + var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages; + var iPageCountHalf = Math.floor(iPageCount / 2); + var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); + var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; + var sList = ""; + var iStartButton, iEndButton, i, iLen; + var oClasses = oSettings.oClasses; + var anButtons, anStatic, nPaginateList; + var an = oSettings.aanFeatures.p; + var fnBind = function (j) { + oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) { + /* Use the information in the element to jump to the required page */ + oSettings.oApi._fnPageChange( oSettings, e.data.page ); + fnCallbackDraw( oSettings ); + e.preventDefault(); + } ); + }; + + /* Pages calculation */ + if ( oSettings._iDisplayLength === -1 ) + { + iStartButton = 1; + iEndButton = 1; + iCurrentPage = 1; + } + else if (iPages < iPageCount) + { + iStartButton = 1; + iEndButton = iPages; + } + else if (iCurrentPage <= iPageCountHalf) + { + iStartButton = 1; + iEndButton = iPageCount; + } + else if (iCurrentPage >= (iPages - iPageCountHalf)) + { + iStartButton = iPages - iPageCount + 1; + iEndButton = iPages; + } + else + { + iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; + iEndButton = iStartButton + iPageCount - 1; + } + + + /* Build the dynamic list */ + for ( i=iStartButton ; i<=iEndButton ; i++ ) + { + sList += (iCurrentPage !== i) ? + ''+oSettings.fnFormatNumber(i)+'' : + ''+oSettings.fnFormatNumber(i)+''; + } + + /* Loop over each instance of the pager */ + for ( i=0, iLen=an.length ; i y) ? 1 : 0)); + }, + + "string-desc": function ( x, y ) + { + return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + }, + + + /* + * html sorting (ignore html tags) + */ + "html-pre": function ( a ) + { + return a.replace( /<.*?>/g, "" ).toLowerCase(); + }, + + "html-asc": function ( x, y ) + { + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }, + + "html-desc": function ( x, y ) + { + return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + }, + + + /* + * date sorting + */ + "date-pre": function ( a ) + { + var x = Date.parse( a ); + + if ( isNaN(x) || x==="" ) + { + x = Date.parse( "01/01/1970 00:00:00" ); + } + return x; + }, + + "date-asc": function ( x, y ) + { + return x - y; + }, + + "date-desc": function ( x, y ) + { + return y - x; + }, + + + /* + * numerical sorting + */ + "numeric-pre": function ( a ) + { + return (a=="-" || a==="") ? 0 : a*1; + }, + + "numeric-asc": function ( x, y ) + { + return x - y; + }, + + "numeric-desc": function ( x, y ) + { + return y - x; + } + } ); + + + $.extend( DataTable.ext.aTypes, [ + /* + * Function: - + * Purpose: Check to see if a string is numeric + * Returns: string:'numeric' or null + * Inputs: mixed:sText - string to check + */ + function ( sData ) + { + /* Allow zero length strings as a number */ + if ( typeof sData === 'number' ) + { + return 'numeric'; + } + else if ( typeof sData !== 'string' ) + { + return null; + } + + var sValidFirstChars = "0123456789-"; + var sValidChars = "0123456789."; + var Char; + var bDecimal = false; + + /* Check for a valid first char (no period and allow negatives) */ + Char = sData.charAt(0); + if (sValidFirstChars.indexOf(Char) == -1) + { + return null; + } + + /* Check all the other characters are valid */ + for ( var i=1 ; i') != -1 ) + { + return 'html'; + } + return null; + } + ] ); + + + // jQuery aliases + $.fn.DataTable = DataTable; + $.fn.dataTable = DataTable; + $.fn.dataTableSettings = DataTable.settings; + $.fn.dataTableExt = DataTable.ext; + + + // Information about events fired by DataTables - for documentation. + /** + * Draw event, fired whenever the table is redrawn on the page, at the same point as + * fnDrawCallback. This may be useful for binding events or performing calculations when + * the table is altered at all. + * @name DataTable#draw + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Filter event, fired when the filtering applied to the table (using the build in global + * global filter, or column filters) is altered. + * @name DataTable#filter + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Page change event, fired when the paging of the table is altered. + * @name DataTable#page + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Sort event, fired when the sorting applied to the table is altered. + * @name DataTable#sort + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * DataTables initialisation complete event, fired when the table is fully drawn, + * including Ajax data loaded, if Ajax data is required. + * @name DataTable#init + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The JSON object request from the server - only + * present if client-side Ajax sourced data is used
  • ")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=i('
    ')[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var c=a.nTableWrapper,d=a.sDom.split(""),g,f,h,e,s,m,o,k=0;k
    ")[0];s=d[k+1];if("'"==s||'"'==s){m="";for(o=2;d[k+o]!=s;)m+=d[k+o],o++;"H"==m?m=a.oClasses.sJUIHeader:"F"==m&&(m=a.oClasses.sJUIFooter); +-1!=m.indexOf(".")?(s=m.split("."),e.id=s[0].substr(1,s[0].length-1),e.className=s[1]):"#"==m.charAt(0)?e.id=m.substr(1,m.length-1):e.className=m;k+=o}c.appendChild(e);c=e}else if(">"==h)c=c.parentNode;else if("l"==h&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange)g=ya(a),f=1;else if("f"==h&&a.oFeatures.bFilter)g=za(a),f=1;else if("r"==h&&a.oFeatures.bProcessing)g=Aa(a),f=1;else if("t"==h)g=Ba(a),f=1;else if("i"==h&&a.oFeatures.bInfo)g=Ca(a),f=1;else if("p"==h&&a.oFeatures.bPaginate)g=Da(a),f=1; +else if(0!==j.ext.aoFeatures.length){e=j.ext.aoFeatures;o=0;for(s=e.length;o'): +""===c?'':c+' ',d=l.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="";a.aanFeatures.f||(d.id=a.sTableId+"_filter");c=i('input[type="text"]',d);d._DT_Input=c[0];c.val(b.sSearch.replace('"',"""));c.bind("keyup.DT",function(){for(var c=a.aanFeatures.f,d=this.value===""?"":this.value,h=0,e=c.length;h=b.length)a.aiDisplay.splice(0,a.aiDisplay.length),a.aiDisplay=a.aiDisplayMaster.slice();else if(a.aiDisplay.length==a.aiDisplayMaster.length||g.sSearch.length>b.length||1==c||0!==b.indexOf(g.sSearch)){a.aiDisplay.splice(0,a.aiDisplay.length);ja(a,1);for(b=0;b/g,""):"string"===typeof a?a.replace(/[\r\n]/g," "):a}function na(a){return a.replace(RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)", +"g"),"\\$1")}function Ca(a){var b=l.createElement("div");b.className=a.oClasses.sInfo;a.aanFeatures.i||(a.aoDrawCallback.push({fn:Ja,sName:"information"}),b.id=a.sTableId+"_info");a.nTable.setAttribute("aria-describedby",a.sTableId+"_info");return b}function Ja(a){if(a.oFeatures.bInfo&&0!==a.aanFeatures.i.length){var b=a.oLanguage,c=a._iDisplayStart+1,d=a.fnDisplayEnd(),g=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),h;h=0===f&&f==g?b.sInfoEmpty:0===f?b.sInfoEmpty+" "+b.sInfoFiltered:f==g?b.sInfo:b.sInfo+ +" "+b.sInfoFiltered;h+=b.sInfoPostFix;h=ha(a,h);null!==b.fnInfoCallback&&(h=b.fnInfoCallback.call(a.oInstance,a,c,d,g,f,h));a=a.aanFeatures.i;b=0;for(c=a.length;b",c,d,g=a.aLengthMenu;if(2==g.length&&"object"===typeof g[0]&&"object"===typeof g[1]){c=0;for(d=g[0].length;c'+g[1][c]+""}else{c=0;for(d=g.length;c'+g[c]+""}b+= +"";g=l.createElement("div");a.aanFeatures.l||(g.id=a.sTableId+"_length");g.className=a.oClasses.sLength;g.innerHTML="";i('select option[value="'+a._iDisplayLength+'"]',g).attr("selected",!0);i("select",g).bind("change.DT",function(){var b=i(this).val(),g=a.aanFeatures.l;c=0;for(d=g.length;ca.aiDisplay.length||-1==a._iDisplayLength?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Da(a){if(a.oScroll.bInfinite)return null;var b=l.createElement("div");b.className=a.oClasses.sPaging+a.sPaginationType; +j.ext.oPagination[a.sPaginationType].fnInit(a,b,function(a){A(a);y(a)});a.aanFeatures.p||a.aoDrawCallback.push({fn:function(a){j.ext.oPagination[a.sPaginationType].fnUpdate(a,function(a){A(a);y(a)})},sName:"pagination"});return b}function pa(a,b){var c=a._iDisplayStart;if("number"===typeof b)a._iDisplayStart=b*a._iDisplayLength,a._iDisplayStart>a.fnRecordsDisplay()&&(a._iDisplayStart=0);else if("first"==b)a._iDisplayStart=0;else if("previous"==b)a._iDisplayStart=0<=a._iDisplayLength?a._iDisplayStart- +a._iDisplayLength:0,0>a._iDisplayStart&&(a._iDisplayStart=0);else if("next"==b)0<=a._iDisplayLength?a._iDisplayStart+a._iDisplayLengthi(a.nTable).height()-a.oScroll.iLoadGap&&a.fnDisplayEnd()=i.browser.version;i(a.nTable).children("thead, tfoot").remove();h=i(a.nTHead).clone()[0];a.nTable.insertBefore(h,a.nTable.childNodes[0]);null!==a.nTFoot&&(j=i(a.nTFoot).clone()[0],a.nTable.insertBefore(j,a.nTable.childNodes[1]));""===a.oScroll.sX&&(d.style.width="100%",b.parentNode.style.width="100%");var t=O(a,h);g=0;for(f=t.length;gd.offsetHeight||"scroll"==i(d).css("overflow-y")))a.nTable.style.width=q(i(a.nTable).outerWidth()-a.oScroll.iBarWidth)}else""!==a.oScroll.sXInner?a.nTable.style.width=q(a.oScroll.sXInner):g==i(d).width()&&i(d).height()g-a.oScroll.iBarWidth&& +(a.nTable.style.width=q(g))):a.nTable.style.width=q(g);g=i(a.nTable).outerWidth();f=a.nTHead.getElementsByTagName("tr");h=h.getElementsByTagName("tr");N(function(a,b){m=a.style;m.paddingTop="0";m.paddingBottom="0";m.borderTopWidth="0";m.borderBottomWidth="0";m.height=0;k=i(a).width();b.style.width=q(k);n.push(k)},h,f);i(h).height(0);null!==a.nTFoot&&(e=j.getElementsByTagName("tr"),j=a.nTFoot.getElementsByTagName("tr"),N(function(a,b){m=a.style;m.paddingTop="0";m.paddingBottom="0";m.borderTopWidth= +"0";m.borderBottomWidth="0";m.height=0;k=i(a).width();b.style.width=q(k);n.push(k)},e,j),i(e).height(0));N(function(a){a.innerHTML="";a.style.width=q(n.shift())},h);null!==a.nTFoot&&N(function(a){a.innerHTML="";a.style.width=q(n.shift())},e);if(i(a.nTable).outerWidth()d.offsetHeight||"scroll"==i(d).css("overflow-y")?g+a.oScroll.iBarWidth:g;if(l&&(d.scrollHeight>d.offsetHeight||"scroll"==i(d).css("overflow-y")))a.nTable.style.width=q(e-a.oScroll.iBarWidth);d.style.width=q(e);b.parentNode.style.width= +q(e);null!==a.nTFoot&&(r.parentNode.style.width=q(e));""===a.oScroll.sX?E(a,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width."):""!==a.oScroll.sXInner&&E(a,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}else d.style.width=q("100%"),b.parentNode.style.width=q("100%"),null!==a.nTFoot&&(r.parentNode.style.width= +q("100%"));""===a.oScroll.sY&&l&&(d.style.height=q(a.nTable.offsetHeight+a.oScroll.iBarWidth));""!==a.oScroll.sY&&a.oScroll.bCollapse&&(d.style.height=q(a.oScroll.sY),l=""!==a.oScroll.sX&&a.nTable.offsetWidth>d.offsetWidth?a.oScroll.iBarWidth:0,a.nTable.offsetHeightd.clientHeight||"scroll"==i(d).css("overflow-y");b.style.paddingRight=c?a.oScroll.iBarWidth+ +"px":"0px";null!==a.nTFoot&&(p.style.width=q(l),r.style.width=q(l),r.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px");i(d).scroll();if(a.bSorted||a.bFiltered)d.scrollTop=0}function N(a,b,c){for(var d=0,g=b.length;dtd",b));h=O(a,f);for(f=d=0;fc)return null;if(null===a.aoData[c].nTr){var d=l.createElement("td");d.innerHTML=w(a,c,b,"");return d}return L(a,c)[b]}function Oa(a,b){for(var c= +-1,d=-1,g=0;g/g,"");f.length>c&&(c=f.length,d=g)}return d}function q(a){if(null===a)return"0px";if("number"==typeof a)return 0>a?"0px":a+"px";var b=a.charCodeAt(a.length-1);return 48>b||57/g,""),g=l[c].nTh,g.removeAttribute("aria-sort"),g.removeAttribute("aria-label"),l[c].bSortable?0=h)for(b=0;be&&e++}}}function qa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b,c;b=a.oScroll.bInfinite;var d={iCreate:(new Date).getTime(),iStart:b?0:a._iDisplayStart, +iEnd:b?a._iDisplayLength:a._iDisplayEnd,iLength:a._iDisplayLength,aaSorting:i.extend(!0,[],a.aaSorting),oSearch:i.extend(!0,{},a.oPreviousSearch),aoSearchCols:i.extend(!0,[],a.aoPreSearchCols),abVisCols:[]};b=0;for(c=a.aoColumns.length;b=d.fnRecordsDisplay()&&(d._iDisplayStart-=d._iDisplayLength,0>d._iDisplayStart&&(d._iDisplayStart=0));if(c===n||c)A(d),y(d);return h};this.fnDestroy=function(a){var b=u(this[j.ext.iApiIndex]),c=b.nTableWrapper.parentNode,d=b.nTBody,g,e,a=a===n?!1:!0;b.bDestroying=!0;C(b,"aoDestroyCallback","destroy",[b]);g=0;for(e=b.aoColumns.length;gtr>td."+b.oClasses.sRowEmpty,b.nTable).parent().remove();b.nTable!=b.nTHead.parentNode&&(i(b.nTable).children("thead").remove(),b.nTable.appendChild(b.nTHead));b.nTFoot&&b.nTable!=b.nTFoot.parentNode&&(i(b.nTable).children("tfoot").remove(),b.nTable.appendChild(b.nTFoot));b.nTable.parentNode.removeChild(b.nTable);i(b.nTableWrapper).remove();b.aaSorting=[];b.aaSortingFixed=[];Q(b);i(S(b)).removeClass(b.asStripeClasses.join(" ")); +i("th, td",b.nTHead).removeClass([b.oClasses.sSortable,b.oClasses.sSortableAsc,b.oClasses.sSortableDesc,b.oClasses.sSortableNone].join(" "));b.bJUI&&(i("th span."+b.oClasses.sSortIcon+", td span."+b.oClasses.sSortIcon,b.nTHead).remove(),i("th, td",b.nTHead).each(function(){var a=i("div."+b.oClasses.sSortJUIWrapper,this),c=a.contents();i(this).append(c);a.remove()}));!a&&b.nTableReinsertBefore?c.insertBefore(b.nTable,b.nTableReinsertBefore):a||c.appendChild(b.nTable);g=0;for(e=b.aoData.length;g=v(d);if(!m)for(e=a;et<"F"ip>')):i.extend(h.oClasses,j.ext.oStdClasses);i(this).addClass(h.oClasses.sTable); +if(""!==h.oScroll.sX||""!==h.oScroll.sY)h.oScroll.iBarWidth=Pa();h.iInitDisplayStart===n&&(h.iInitDisplayStart=e.iDisplayStart,h._iDisplayStart=e.iDisplayStart);e.bStateSave&&(h.oFeatures.bStateSave=!0,Ra(h,e),B(h,"aoDrawCallback",qa,"state_save"));null!==e.iDeferLoading&&(h.bDeferLoading=!0,a=i.isArray(e.iDeferLoading),h._iRecordsDisplay=a?e.iDeferLoading[0]:e.iDeferLoading,h._iRecordsTotal=a?e.iDeferLoading[1]:e.iDeferLoading);null!==e.aaData&&(f=!0);""!==e.oLanguage.sUrl?(h.oLanguage.sUrl=e.oLanguage.sUrl, +i.getJSON(h.oLanguage.sUrl,null,function(a){oa(a);i.extend(true,h.oLanguage,e.oLanguage,a);aa(h)}),g=!0):i.extend(!0,h.oLanguage,e.oLanguage);null===e.asStripeClasses&&(h.asStripeClasses=[h.oClasses.sStripeOdd,h.oClasses.sStripeEven]);c=!1;d=i(this).children("tbody").children("tr");a=0;for(b=h.asStripeClasses.length;a=h.aoColumns.length&&(h.aaSorting[a][0]=0);var k=h.aoColumns[h.aaSorting[a][0]];h.aaSorting[a][2]===n&&(h.aaSorting[a][2]=0);e.aaSorting===n&&h.saved_aaSorting===n&&(h.aaSorting[a][1]=k.asSorting[0]);c=0;for(d=k.asSorting.length;c=parseInt(n,10)};j.fnIsDataTable=function(e){for(var i=j.settings,r=0;re)return e;for(var i=e+"",e=i.split(""),j="",i=i.length,k=0;k'+k.sPrevious+''+k.sNext+"":'';i(j).append(k);var t=i("a",j),k=t[0],t=t[1];e.oApi._fnBindAction(k,{action:"previous"},l);e.oApi._fnBindAction(t,{action:"next"},l); +e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_previous",t.id=e.sTableId+"_next",k.setAttribute("aria-controls",e.sTableId),t.setAttribute("aria-controls",e.sTableId))},fnUpdate:function(e){if(e.aanFeatures.p)for(var i=e.oClasses,j=e.aanFeatures.p,k=0,n=j.length;k'+k.sFirst+''+k.sPrevious+''+k.sNext+''+k.sLast+"");var v=i("a",j),k=v[0],l=v[1],z=v[2],v=v[3];e.oApi._fnBindAction(k,{action:"first"},t);e.oApi._fnBindAction(l,{action:"previous"},t);e.oApi._fnBindAction(z,{action:"next"},t);e.oApi._fnBindAction(v,{action:"last"},t);e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_first",l.id=e.sTableId+"_previous",z.id=e.sTableId+"_next",v.id=e.sTableId+"_last")},fnUpdate:function(e,o){if(e.aanFeatures.p){var l=j.ext.oPagination.iFullNumbersShowPages,k=Math.floor(l/ +2),n=Math.ceil(e.fnRecordsDisplay()/e._iDisplayLength),t=Math.ceil(e._iDisplayStart/e._iDisplayLength)+1,v="",z,D=e.oClasses,x,J=e.aanFeatures.p,H=function(i){e.oApi._fnBindAction(this,{page:i+z-1},function(i){e.oApi._fnPageChange(e,i.data.page);o(e);i.preventDefault()})};-1===e._iDisplayLength?t=k=z=1:n=n-k?(z=n-l+1,k=n):(z=t-Math.ceil(l/2)+1,k=z+l-1);for(l=z;l<=k;l++)v+=t!==l?''+e.fnFormatNumber(l)+"":''+e.fnFormatNumber(l)+"";l=0;for(k=J.length;li?1:0},"string-desc":function(e,i){return ei?-1:0},"html-pre":function(e){return e.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(e,i){return ei?1:0},"html-desc":function(e,i){return ei?-1:0},"date-pre":function(e){e=Date.parse(e);if(isNaN(e)||""===e)e=Date.parse("01/01/1970 00:00:00"); +return e},"date-asc":function(e,i){return e-i},"date-desc":function(e,i){return i-e},"numeric-pre":function(e){return"-"==e||""===e?0:1*e},"numeric-asc":function(e,i){return e-i},"numeric-desc":function(e,i){return i-e}});i.extend(j.ext.aTypes,[function(e){if("number"===typeof e)return"numeric";if("string"!==typeof e)return null;var i,j=!1;i=e.charAt(0);if(-1=="0123456789-".indexOf(i))return null;for(var k=1;k")?"html":null}]);i.fn.DataTable=j;i.fn.dataTable=j;i.fn.dataTableSettings=j.settings;i.fn.dataTableExt=j.ext})(jQuery,window,document,void 0); diff --git a/assets/grocery_crud/themes/datatables/views/add.php b/assets/grocery_crud/themes/datatables/views/add.php new file mode 100644 index 000000000..82fd96c7a --- /dev/null +++ b/assets/grocery_crud/themes/datatables/views/add.php @@ -0,0 +1,77 @@ +set_css($this->default_theme_path.'/datatables/css/datatables.css'); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.form.min.js'); + $this->set_js_config($this->default_theme_path.'/datatables/js/datatables-add.js'); + $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.noty.js'); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/config/jquery.noty.config.js'); +?> +
    +

    + +
    +

    +
    + +
    + +
    +
    + field_name]->display_as?>field_name]->required)? "* " : ""?> : +
    +
    + field_name]->input?> +
    +
    +
    + + + input; + } + ?> + + +
    +
    +
    +
    +
    +
    + ' class='ui-input-button'/> +
    +unset_back_to_list) { ?> +
    + ' class='ui-input-button' id="save-and-go-back-button"/> +
    +
    + ' class='ui-input-button' id="cancel-button" /> +
    + +
    +
    l('form_insert_loading'); ?>
    +
    +
    +
    + +
    +
    + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/views/edit.php b/assets/grocery_crud/themes/datatables/views/edit.php new file mode 100644 index 000000000..3eece6d3f --- /dev/null +++ b/assets/grocery_crud/themes/datatables/views/edit.php @@ -0,0 +1,78 @@ +set_css($this->default_theme_path.'/datatables/css/datatables.css'); + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.form.min.js'); + $this->set_js_config($this->default_theme_path.'/datatables/js/datatables-edit.js'); + $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.noty.js'); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/config/jquery.noty.config.js'); +?> +
    +

    + +
    +

    +
    + +
    + +
    +
    + field_name]->display_as?>field_name]->required)? "* " : ""?> : +
    +
    + field_name]->input?> +
    +
    +
    + + + input; + } + ?> + + +
    +
    +
    +
    +
    +
    + ' class='ui-input-button' /> +
    + unset_back_to_list) { ?> +
    + ' class='ui-input-button' id="save-and-go-back-button"/> +
    +
    + ' class='ui-input-button' id="cancel-button" /> +
    + +
    +
    l('form_update_loading'); ?>
    +
    +
    +
    + +
    +
    + \ No newline at end of file diff --git a/assets/grocery_crud/themes/datatables/views/list.php b/assets/grocery_crud/themes/datatables/views/list.php new file mode 100644 index 000000000..dcff6792c --- /dev/null +++ b/assets/grocery_crud/themes/datatables/views/list.php @@ -0,0 +1,74 @@ + + + + + + + + + + + + + $row){ ?> + + + + + + + + + + + + + + + + + + + + +
    display_as; ?>l('list_actions'); ?>
    {$column->field_name}?> + action_urls)){ + foreach($row->action_urls as $action_unique_id => $action_url){ + $action = $actions[$action_unique_id]; + ?> + +  label?> + + + + + +  l('list_view'); ?> + + + + + + +  l('list_edit'); ?> + + + + + +  l('list_delete'); ?> + + +
    + + + + l('list_clear_filtering');?> + +
    diff --git a/assets/grocery_crud/themes/datatables/views/list_template.php b/assets/grocery_crud/themes/datatables/views/list_template.php new file mode 100644 index 000000000..f4e3a16e2 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/views/list_template.php @@ -0,0 +1,124 @@ +set_css($this->default_theme_path.'/datatables/css/demo_table_jui.css'); + $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); + $this->set_css($this->default_theme_path.'/datatables/css/datatables.css'); + $this->set_css($this->default_theme_path.'/datatables/css/jquery.dataTables.css'); + $this->set_css($this->default_theme_path.'/datatables/extras/TableTools/media/css/TableTools.css'); + $this->set_js_lib($this->default_javascript_path.'/'.grocery_CRUD::JQUERY); + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.noty.js'); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/config/jquery.noty.config.js'); + $this->set_js_lib($this->default_javascript_path.'/common/lazyload-min.js'); + + if (!$this->is_IE7()) { + $this->set_js_lib($this->default_javascript_path.'/common/list.js'); + } + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); + $this->set_js_lib($this->default_theme_path.'/datatables/js/jquery.dataTables.min.js'); + $this->set_js($this->default_theme_path.'/datatables/js/datatables-extras.js'); + $this->set_js($this->default_theme_path.'/datatables/js/datatables.js'); + $this->set_js($this->default_theme_path.'/datatables/extras/TableTools/media/js/ZeroClipboard.js'); + $this->set_js($this->default_theme_path.'/datatables/extras/TableTools/media/js/TableTools.min.js'); + + /** Fancybox */ + $this->set_css($this->default_css_path.'/jquery_plugins/fancybox/jquery.fancybox.css'); + $this->set_js($this->default_javascript_path.'/jquery_plugins/jquery.fancybox-1.3.4.js'); + $this->set_js($this->default_javascript_path.'/jquery_plugins/jquery.easing-1.3.pack.js'); +?> + + + + + + + +
    +
    style="display:block"> +

    +
    +
    + + + + +
    + + +
    diff --git a/assets/grocery_crud/themes/datatables/views/read.php b/assets/grocery_crud/themes/datatables/views/read.php new file mode 100644 index 000000000..4a56c2de4 --- /dev/null +++ b/assets/grocery_crud/themes/datatables/views/read.php @@ -0,0 +1,66 @@ +set_css($this->default_theme_path.'/datatables/css/datatables.css'); + $this->set_js_lib($this->default_theme_path.'/flexigrid/js/jquery.form.js'); + $this->set_js_config($this->default_theme_path.'/datatables/js/datatables-edit.js'); + $this->set_css($this->default_css_path.'/ui/simple/'.grocery_CRUD::JQUERY_UI_CSS); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/ui/'.grocery_CRUD::JQUERY_UI_JS); + + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/jquery.noty.js'); + $this->set_js_lib($this->default_javascript_path.'/jquery_plugins/config/jquery.noty.config.js'); +?> +
    +

    + +
    +

    +
    + +
    + +
    +
    + field_name]->display_as?>field_name]->required)? "* " : ""?> : +
    +
    + field_name]->input?> +
    +
    +
    + + + input; + } + ?> + + +
    +
    +
    +
    +
    +
    + ' class='ui-input-button back-to-list' id="cancel-button" /> +
    +
    +
    + +
    +
    + diff --git a/assets/grocery_crud/themes/flexigrid/config.php b/assets/grocery_crud/themes/flexigrid/config.php new file mode 100644 index 000000000..753478f9e --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/config.php @@ -0,0 +1,2 @@ + .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +/* End of twitter bootstrap buttons */ + +.pretty-radio-buttons +{ + margin-top: 6px; +} + +.pretty-radio-buttons label +{ + margin-right: 10px; +} +.ui-widget +{ + font-size: 12px !important; +} + + +/** Common CSS */ +.loading-opacity +{ + opacity: 0.5; + pointer-events: none; + cursor: default; +} + +.loading-opacity:before { + font-size: 26px; + position:absolute; + color: #000; + content: "Loading..."; + margin-left: 550px; + z-index: 1000; +} diff --git a/assets/grocery_crud/themes/flexigrid/css/images/add.png b/assets/grocery_crud/themes/flexigrid/css/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..29bb191b4ba0a8e42c83e807e17f7d3f34b44371 GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c#)bf&5ZCEfyJwtfTYrDqf}7K3ADq#=HLrGOcFFdb@;wQj z{r1JXVkYmefBpI8o~t`=zP$MU+nX03pWXR*+dcV?Tp@hb7|qe z_^zFm6h&ptSQ z^4^ikgDLr2BMWv!{s)6g3f>ce5!O%=AYH$AQBg8mjp&JV@i+*+@*Qc{0bY*@*~ z!0P36XvWgySFaw$GM^Qm(!iv}>T|4WR%z)6=4duEpX-QUM2|Pp`F_#H^ukS}*+wlgI^kx%MpnNvZpQN^DNUA_b0gP0*yqZ|z{tkXlM?3p UrTFVdpw}2YUHx3vIVCg!01GGTLjV8( literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/bg.gif b/assets/grocery_crud/themes/flexigrid/css/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ab78a2ec788d6dfbbcd6212a4d3b1d9917d55e7 GIT binary patch literal 854 zcmZ?wbhEHbWMZ&jXlGz}_Uzg7=g(ifc=7V(%U7>ny?*`r&6_uG-@bkK?%n(M?>~I_ z@c;jRhEXsY0>d-}6o0Y+efFP02jo9co?zfGW)Rn5a1d~4Xl7*5h_P7kkby}+S!_nc jfrg{q>_&192R0@*^>d1J$arpAa&odp@G2Wg0S0RTW*Ik7 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/btn-sprite.gif b/assets/grocery_crud/themes/flexigrid/css/images/btn-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..e827ba35728adaadfea417b20b4727a859ae770a GIT binary patch literal 955 zcmZ?wbhEHbWM;5u_|CwqVCuHv7^FyiGrC;B`V~@f{N6$_kz9kU`8(JNhS(qhw794D46x85p z*}&P<+Q_fZQ^9dd@kQGLsiw35DG}!j+>X*Nyr&diG>Nc9NpNf^eZbhMAD1Day(p(+ sv%;mih}R2q+qX+U>bp8&;ksC!3jG(k2e#`s@8@P}=gm6c;J{!F06~?tlmGw# literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/close.png b/assets/grocery_crud/themes/flexigrid/css/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc2ebcf28a57e5bb37821c373224c7a456f3467 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c#)bf&5Z8An4}Y9HZGVizx0amWuV25L)c@`L`R7M={+iqU zxW4v7Px+l?(>_-wKa2Exmlbzs`SiyXl@C&5t|f$=OA7h6deN`dbKj)}9ZB(doSpcw zuj=dbN1w`*-=94CVcWLvFP=TBto+bi{bSpTFAL@!2(`VIm+~^&|9NcWkM&DlRu_Dj zSbwE3^`Niuuf-F01)1Cq^Zs+??ET7;GeI_w3er9=U;KOJoR`Vb?^C!`7{Tj_>;Z;_0gmYrd{o__4R~Y(~V-(?`B+S@m$`ydwc7FY7BV_}d+b zw13xC`nfpvSy;fs)eD|Q1wG6!`1$h1hm^4QZFN6-%D%2&`s47vZ%rBdgRP#0`JBiO z{WYuoRdemxguvUGsb|tcug3=dy?y2Hog1$=uYXce_@b)xPG08E%V$2c7W|k}|8?2I z$9c&=U%hyh7IP@w=k4UaA8iG9vNQIDS^nI){?po3-zV37efIFnqIs`k0)9=de-`2M zb5h;+)eGOmhrEpR{SO9T4&B=bjIf51AirRU$bgXy7OdXsK(`$8ba4!+xRtcRota0W z$#vT0JqHvt8PpD_%@?2b>`l^=BwoRU&-#8_E<7~YcvT>cfpY_ggt|+nS6T?GcADi$ zM%J7~UoE}%%xG+Izk66*%yEO%pbM?uDP?Lk?CfX5TEJOt$PIRQk{H)6xvT7;Yeef zxoW27(bt=t=bRHrpK<8atTktk@O_>$H+xBXg+yHbi)?XzCUN`iQ~P L)z4*}Q$iB}#ZK`U literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/ddn.png b/assets/grocery_crud/themes/flexigrid/css/images/ddn.png new file mode 100644 index 0000000000000000000000000000000000000000..2178f11e327167c25acfb35264b03dd87b9486b4 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^96-#%#0(_QEuNMPq&Ne7LR^6~5JW~sygPna1;}D7 z3GxeOaCmkj4agDkba4!+xRpFZ>evFQg9m0FIB_E)I!3-ozC9e7dDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MFs&rA+EKxwMUK|$<58(vSmwOU!RMM%lh@}Po6y4-`~G; z=gyv73!GZ->u3Y*5|9@k!)E}T;fs!Dl?2MEdAc};RNP8R zNPUp>F!gcbgY-wwQl39ffAIWy!js4B7yq1b;1Nh*5J+RxDZkxN0@T6a>FVdQ&MBb@ E04CC4Q~&?~ literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/edit.png b/assets/grocery_crud/themes/flexigrid/css/images/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..8f819bf3ba2f2119d051c6da7d92b5ad5a6fdbf9 GIT binary patch literal 794 zcmV+#1LgdQP)|2D`hcJY&qDbgV7)+34hJ!vNg(0T(K`4*{u^U7YQE4^vS}9sO zb*^oix6SRG?VQuQ9r4!12mZY0<-EWD^PKa%4+WEmbs-8wytE2Ih?YoD6op5}4qr}m z^cPX{Ga2O65YcVJpjgL*n485M{tSvp9)3zIdwkECFP27YmB_NTfQn5>wmoRN@o66g z8k+=lY05Mdl~U@_?MI3s6(dDe5T_kTN{9`;KF@^8TpQ)*T2?m)jV2AlnT>~ZaH%5D z^wEuyR5?1b&mik{8)yp2^hSe~FdQ*yWPY~}5JiDp_dSpNQoF#>bp%zFsj(c?hh@Eq6> zZ2t+cEa`xn6z!|}`lRA?h#>}S7{1#0xmLrl=E7Vlb7!vu13wnv_w(RaU?s%BQWd5= z)l_CPB!eIeZTqR(B~evTkh>kb2>ia+g@MsUczpo`?e=illrAC!SHj_|Ui-V44?9k% zcv<8HwL--1SUI}-o%mu~gvZMvI6f(5j*&~SGf=a!S&WZm^AgjJMs#PsM0%?iDwPrf zCxRcJkl<*Vz@AFDgqpu~oAGjNp>A)wT&<0PwYU>IZ|M;kq(KKb2+gAGu6+F-l*9bSF`^cDdzg8lmc;BW=qeuL`3z*8_YV}g6y7o7gp$Tua; z1xML!_0|35S2mrMlgD!cNt$_HuNoUB`*xxiL~qX8uJI7~<y%`?mlC Y05!}z&ioqLfdBvi07*qoM6N<$f>ES!asU7T literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/error.png b/assets/grocery_crud/themes/flexigrid/css/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd3b55dbe0ebec6e35cec8eaeba62038acfeb10 GIT binary patch literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`Jj+tIX_n~5oC^DMQ#CujeSKy zVsdtBi9%9pdS;%jl7fPQl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3a#eP+Wr~u$9hXgo z6;N|-YDuC(MQ%=Bu~mhw64*>DAR8pCucQE0Qj%?}1aWkPZ-9bxeo?A|iJqZuvVpOQ zf{B@)k-3qjxtWeaaAJvqS7M%mk-37AfdP;(vNANZGBE@?1`L$!xPY`xQA(Oskc%7C zP9V=#DWjyMz)D}gyu4hm+*mKaC|%#s($Z4jz)0W7NEfI=x41H|B(Xv_uUHvk2+SOp z)Z*l#%mQ$5fy_-z$}cUkRZ;?31P4&hB^JOf$}5Hj9xxd7D-sLz4fPE4;U)t$+5iQu zz!8yO6q28xV}~WqY(P3u6d`Oy=udS?EJ?KkhKGf&fswAEd5D3Lm9d$XiD?v)euyG8 z?Y{XbnQ4_s+KqLMOhODTtqcsTOpKt~krY9-+vtM=0x4j?p$_sBnz#ai082@RhgU&q zQ4Tm-Qj+ykb5e6t^Gb?=VP=RLW+};5Y57IDi6wTKxryni`UQFEHu?xbyzYaz8kj7A z$xbP0l+XkK D*?Od} literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/export.png b/assets/grocery_crud/themes/flexigrid/css/images/export.png new file mode 100644 index 0000000000000000000000000000000000000000..0f77b7d8edca3521599fa3c3ef1dd4f56b470e22 GIT binary patch literal 684 zcmV;d0#p5oP)B4=IQcq5cEf#?tmu5G!emQp95}O~k7g!GhAFSZF{YO5=}%o}v&+ ztF;D=tuc+e+1+v8Y&KMcs1F`*X6LCWHW4@5GZS86v1{@w*czF8%g}0Lafp zlOnfX7N6G*vASl6Pv6LO@iFiChp)Pz9O+YT4Y}q5*_I6^GgOd@EU$wUT^2h!!5aTNj^0Bwu~6M_6pBg{%`DqUgdf%{?w<}Rs%?R0$nMZsFX;&%Qt50&Gj$VVu^Y%1 z-(#h;h~)L8D(aa$gM1;6U7`uTb`zOZ9mm@JN)xN1$^O{VJG|%` z=|pI>8(+S!U`xHg{hKqO98LaIlUjJBCKSn}pwRS8Y zhyiyQoE+^!u9(C8%SUMQw_EDT*QSNm4I!vSzwkOJL~-Ku$w$A=H70o!cU1`VIO#$f;czYdb; z4*;58$>4b+qfQQ#gWNI1yM!7mYUVnf4WCKe8!85Rx=4Ga>@3=9GS G4Auam1ttan literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/first.gif b/assets/grocery_crud/themes/flexigrid/css/images/first.gif new file mode 100644 index 0000000000000000000000000000000000000000..7623e7387a1db305267e63826400a23bf4298dee GIT binary patch literal 217 zcmV;~04D!ONk%w1VGsZi0K^RdBuJ1gQ=T(frax%6EN0j^Zrne0-7InLL~p=CZPZG2 z$VhtMPJ7}1|Nm2f)=`7uR)pzai{N04G|Ek3AA^8LW000dDEC2ui01yBW000G6U?YxXX`bhlT_#&TUsXnO>2wnr zdAZF=qr}DoEGaY*QNm*3Bufa)qah$1EShO)Kv{?Y){D0!pcqEr$C)fCkN^pHDF7jq Tz$O60UgE#uD1m~5Bq0Dh8K_|4 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/hl.png b/assets/grocery_crud/themes/flexigrid/css/images/hl.png new file mode 100644 index 0000000000000000000000000000000000000000..6248e45dfe83355a94b9ccac57f557a760b003c3 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{F!3-oHI6iF!Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiVOmLLR{~C`t$zB-|O%HTz&uN+1J0XzWsgi?eClKe?R>A zd+q(7hoAr4`taw;=f8J8{`vUh@3-H7^W;8E0qRxuba4!+xW#gim61V#fkENTwg367 n=dZH*2BzLVveCu)7ZVQyM+8Hq(5Z@YpmGLJS3j3^P6 + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/css/images/last.gif b/assets/grocery_crud/themes/flexigrid/css/images/last.gif new file mode 100644 index 0000000000000000000000000000000000000000..61483e998b141b8b137506dabf4338b045afa13d GIT binary patch literal 220 zcmV<203-iLNk%w1VGsZi0K^RdBuJ1gQ=T(frax%6EN0j^Zrne0-7InLL~p=CZPZG2 z$VhtMPJ7}1|Nm2f)=`7uR)pzai{N04G|Ek3AA^8LW000dDEC2ui01yBW000G9U?YxXX`bh0UfE<;QCWSDIeGCo zb&e@{o5V=M>6IcJi$&OoXcVT0#&RGC8V?M@w766Oq6KAOGCT-ik%4k86%uJtLDD9n WO9V*3MBp>xC?arxfrW+*Apkq35Mp)! literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/line.gif b/assets/grocery_crud/themes/flexigrid/css/images/line.gif new file mode 100644 index 0000000000000000000000000000000000000000..c76a16e95997a487ee9cd1675ecdd99bd2f37c17 GIT binary patch literal 817 zcmZ?wbhEHbWMbfDXlGzpvts7||Nj|A!DtAK$PiHc$pZBEe+C_p??HKjfrF2Mkww6x PV8OvA4t_Qc4hCxg>zoX) literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/load.gif b/assets/grocery_crud/themes/flexigrid/css/images/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..68f01d04813c1f622810864a3aaa04b4a17ac8f9 GIT binary patch literal 1737 zcmaKsX;2e)7>CzDa{xjjy99|1A!tC(kfocDi)<1$AxHpOQ4k^l!Vx1W6x7<&|FYXU zqO4jEiU-!VR1p+Xj1?4-iuI_J;!&?!+ghg|JJad3U)pMGzcKxNeCM6tJnuX+uPvX@ zZY|=AHdxt2Xr2y*)5|c6#FSEuyJ+Y3Z&l z2hJWo`9;lJ$6wzSoW60tqkB|d$oiO*d-^85^ojn{*NR{MP*%{@H*#gihZ8BKyB68E z-MIbjgNNV0y5khpJ^Jv`51aR%={<4jhaVq5e*9D5+*hL)XCHn4{^d%hPu@?KpKbc=eN!D=XUjDmH#n{YHNS zHCX6BV)yn2CuTNujhN~V+`RKpyXO6^ht92eqhIIlQLfz6eeCnH_C7`NPNrw9ks366 z4xX9(`s~z=+1uX^ocZ$2_fBs=JihPfWYufOIuD&AU-@`>>qn~cy$1)T7CU!5z2(U8 z)9Kt9)l`f6?NU41j6XbXfR{OHwm|T4}&24tIf+!C-g~6cQfY2^n$?AT&ZW zgqm`}3-jS2NS6n=k;sr5Hv(Q%%n)qW0X|neWVBd;Ko}d(=u%?{O0-a>kSI}shOd9n z5top}%gUCf=>?tg;*;#7!^HOL3k$fMxd=O-6Y4@%u8LS)C1D_a?27R6^vcC+6tttL z)GmTahbyJB!xmcHL#ya8ZXyfRl)a!N0BJE0y3BBfAV5;#=K&Z2VkaKZ)?9`1h5P_% znt*b}%j1|#j`b|aQDx@~wA#$PYRN2xE6UO;;vE(@$&xww-s8fZ5HmJ(eJ*rQrDbaawDbrfe_8F(wq{ge?)qQG`aXV;r(*6EM|ESje;52aFmrX!f=Pw^2oGQX$1|o4yts|b_5@w_kNwtl{wDP#JGMvIp#!SYX?Wq9S&`&_ZwkgGH5CLB7DEGJ6=R4J~p3Z4i^A}hs=-uZeD zs92l6u@**R$~L()G{5N8*7cE5-q$SCo`q4|NSVF*+A7&xZnypm$EdXgf)E%(VJHFD zSgi(H!D!(;9Zcc#GrCCJh=RlvXBQ-hv4Vodse`a32ZUFWgP5ZhM5LeV(#D^H8p@Lg ztra5R32z@1rQv{6u&RZL5%Z@Ye{q|t#6aM_1hIrpl@)oH6}os*cbAQywa{5<`ekzW O1il%9bk82&KlvLjD^%40 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/load.png b/assets/grocery_crud/themes/flexigrid/css/images/load.png new file mode 100644 index 0000000000000000000000000000000000000000..d65defbcb54ab2e3ffb4d12201ca3f6a56182df4 GIT binary patch literal 827 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2c#)bf&5Z9?^djJ0WyX4C3S?4G9pKSM^>M`L|hyMi6q(#xs z-aczRQa52w_nh-nW}ctWcdRXBs^88l+t%M$HGALmzLTxp$C`7tq;wu@3Y#8KHm7*Y zxlNNc_Xp4Oc4)HS-;2=?GbJv^;Q@V~c-}`W9+r=%rukV<2sxxC+%D#s?`%iYn ztqz%Rva@qdd-LJSoVBUD?``*O^m_OG?e1&aYxWi|I63>z-#;5quXpLTop!cAZ*_Xp zp{mulmYlnDcKZ1Vjr*#WU!T{0q#WV@pJ!)ya+G39{~0PY zR(NyEiQ3MbCG_o<(FU>kT5SqHl@zocnUYq_SJK`s&=ETG)k=X0DaQr01e9hTTfr&x zsWee{d;5;VCj~v06nt=OZ)7Gntwxq1(jW}}Tt^?D#dp~_vIn3U?qhybTBU95! zDI3XGyDAIUwOI=6pK?lcnY8%qw%bLAY>vNW_^#~IaFIoiK_G$Qo@|7?`$KD9pobVd MUHx3vIVCg!0CQN?vH$=8 literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/magnifier.png b/assets/grocery_crud/themes/flexigrid/css/images/magnifier.png new file mode 100644 index 0000000000000000000000000000000000000000..cf3d97f75e9cde9c143980d89272fe61fc2d64ee GIT binary patch literal 615 zcmV-t0+{`YP)gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3DMtRfXPIhu=?%_D_lZSBKzVjNxaT`)Hi` zg|7dIuK%LF|E0hGA^8LW000pHEC2ui01yBW000FxU?h%YX`ZNvrKXgzB=o&-^k`pI nI~Vs+u);;t@l03*hDD=*4Hk_-^N_EIHS*BQr-&26rSBKy~Xt!va{WNmu zXq@>+g!?E>mjD0%A^8LW0018VEC2ui01yBW000Fy;3tk`X`X0_r6q8&BM>C;X9XGs o3xU%}tO4V|>11FNPJ^(h88(Va?Gq^=rXPq0`+0D`U{eSHJ0!qRy#N3J literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/print.png b/assets/grocery_crud/themes/flexigrid/css/images/print.png new file mode 100644 index 0000000000000000000000000000000000000000..cc17b26b6184489e6088d952fb2d2c85aa4a47ff GIT binary patch literal 662 zcmV;H0%`q;P)55P0Rm|dyRo_;fiAk% z;6fG{C6S0i0v4J#GjHa)z&5Qm@gygiJ2U4b_uNa&j4qNSdAPW^IAd)F03hnVTpn_{ z0Q>u&KQx;=PkJI|?y*{(f5*(6WsaTmJ$ldVJu@@&+S>ZJeocTrIG1GrptZ&@M9~Pe zPF??<=r5#{g#TjjivWPyMxEX?8l#m;rJ}X@S3(3Lf-x3_Lg8wo(I^fWIOnd{YPGvU z$UG522mv7kh%Py31o3ipb-A`tF9QH6rJ|?Lp1-eFZaDVyUjX+8{Jv%#Fbk0Lci71K?st{?aVU32%98{=~&*!02jdr^Ytqtbp z<_bhK6U1>Wl~Vam=K{w+f8gxw6joc<%py%wq-hFkEIOSI+UIQ;V=y%}g;Hr^B#vVl z5Yd=1Mj37Rp%;k`eVtD6qcz6iMEVC?|2#hh~we>YGq=fShrO6Wd*Lz^*L^!{= zK;vx#xgf~A_mi};vNAeaEIzQ-&KKgst#bLA?56%Vq?Bm2S{O@`mQw1~+3D#EFtf7O zCa>#t+S=N3&NWdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C_E)I!3-ozC9e7dDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MaBU>A+A@hT&b(}4Bd2{~!`8hc`m6erlZf|6H_V+Po~-c6{&c-IEGZ*N=k5GnmAGLzvB!>=?1R`!#1T9PafABDicK+ bStJ;q-j}gmEMvVDsGh;o)z4*}Q$iB}fe$3! literal 0 HcmV?d00001 diff --git a/assets/grocery_crud/themes/flexigrid/css/images/wbg.gif b/assets/grocery_crud/themes/flexigrid/css/images/wbg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8046089a9de7680673de4bc9dbf45ffedf72aa52 GIT binary patch literal 868 zcmZ?wbhEHbWMt4`Y-eD&e*OB58#iv-HPoF=3 z{^G@pmoHzwe*OB*n>TOYzJ2%Z-G>h!{{R2aFbYOPVCaW{;!hT!C;l_&fV=|A6AT=V z46Gg<3=bQd*?7b>JQ^4dGBUGr2}md?Ff?>a7-!u%v2pS7eg)?)8P7|LTPAA+uZlUj WY3b?d2Fa)9cy3 + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/index.html b/assets/grocery_crud/themes/flexigrid/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/js/cookies.js b/assets/grocery_crud/themes/flexigrid/js/cookies.js new file mode 100644 index 000000000..3d2d5cf2b --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/cookies.js @@ -0,0 +1,25 @@ +function createCookie(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else var expires = ""; + document.cookie = name+"="+escape(value)+expires+"; path=/"; +} + +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) + return unescape(c.substring(nameEQ.length,c.length)); + } + return null; +} + +function eraseCookie(name) { + createCookie(name,"",-1); +} \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/js/flexigrid-add.js b/assets/grocery_crud/themes/flexigrid/js/flexigrid-add.js new file mode 100644 index 000000000..382bd81b0 --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/flexigrid-add.js @@ -0,0 +1,146 @@ +$(function(){ + $('.ptogtitle').click(function(){ + if($(this).hasClass('vsble')) + { + $(this).removeClass('vsble'); + $('#main-table-box #crudForm').slideDown("slow"); + } + else + { + $(this).addClass('vsble'); + $('#main-table-box #crudForm').slideUp("slow"); + } + }); + + var save_and_close = false; + + $('#save-and-go-back-button').click(function(){ + save_and_close = true; + + $('#crudForm').trigger('submit'); + }); + + $('#crudForm').submit(function(){ + var my_crud_form = $(this); + + $(this).ajaxSubmit({ + url: validation_url, + dataType: 'json', + cache: 'false', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(data){ + $("#FormLoading").hide(); + if(data.success) + { + $('#crudForm').ajaxSubmit({ + dataType: 'text', + cache: 'false', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(result){ + $("#FormLoading").fadeOut("slow"); + data = $.parseJSON( result ); + if(data.success) + { + var data_unique_hash = my_crud_form.closest(".flexigrid").attr("data-unique-hash"); + + $('.flexigrid[data-unique-hash='+data_unique_hash+']').find('.ajax_refresh_and_loading').trigger('click'); + + if(save_and_close) + { + if ($('#save-and-go-back-button').closest('.ui-dialog').length === 0) { + window.location = data.success_list_url; + } else { + $(".ui-dialog-content").dialog("close"); + success_message(data.success_message); + } + + return true; + } + + $('.field_error').each(function(){ + $(this).removeClass('field_error'); + }); + clearForm(); + form_success_message(data.success_message); + } + else + { + alert( message_insert_error ); + } + }, + error: function(){ + alert( message_insert_error ); + $("#FormLoading").hide(); + } + }); + } + else + { + $('.field_error').removeClass('field_error'); + form_error_message(data.error_message); + $.each(data.error_fields, function(index,value){ + $('input[name='+index+']').addClass('field_error'); + }); + + } + }, + error: function(){ + error_message (message_insert_error); + $("#FormLoading").hide(); + } + }); + return false; + }); + + if( $('#cancel-button').closest('.ui-dialog').length === 0 ) { + + $('#cancel-button').click(function(){ + if( confirm( message_alert_add_form ) ) + { + window.location = list_url; + } + + return false; + }); + + } + }); + + function clearForm() + { + $('#crudForm').find(':input').each(function() { + switch(this.type) { + case 'password': + case 'select-multiple': + case 'select-one': + case 'text': + case 'textarea': + $(this).val(''); + break; + case 'checkbox': + case 'radio': + this.checked = false; + } + }); + + /* Clear upload inputs */ + $('.open-file,.gc-file-upload,.hidden-upload-input').each(function(){ + $(this).val(''); + }); + + $('.upload-success-url').hide(); + $('.fileinput-button').fadeIn("normal"); + /* -------------------- */ + + $('.remove-all').each(function(){ + $(this).trigger('click'); + }); + + $('.chosen-multiple-select, .chosen-select, .ajax-chosen-select').each(function(){ + $(this).trigger("liszt:updated"); + }); + } \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/js/flexigrid-edit.js b/assets/grocery_crud/themes/flexigrid/js/flexigrid-edit.js new file mode 100644 index 000000000..276816785 --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/flexigrid-edit.js @@ -0,0 +1,115 @@ +$(function(){ + + var save_and_close = false; + + $('.ptogtitle').click(function(){ + if($(this).hasClass('vsble')) + { + $(this).removeClass('vsble'); + $('#main-table-box #crudForm').slideDown("slow"); + } + else + { + $(this).addClass('vsble'); + $('#main-table-box #crudForm').slideUp("slow"); + } + }); + + $('#save-and-go-back-button').click(function(){ + save_and_close = true; + + $('#crudForm').trigger('submit'); + }); + + $('#crudForm').submit(function(){ + var my_crud_form = $(this); + + $(this).ajaxSubmit({ + url: validation_url, + dataType: 'json', + cache: 'false', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(data){ + $("#FormLoading").hide(); + if(data.success) + { + $('#crudForm').ajaxSubmit({ + dataType: 'text', + cache: 'false', + beforeSend: function(){ + $("#FormLoading").show(); + }, + success: function(result){ + + $("#FormLoading").fadeOut("slow"); + data = $.parseJSON( result ); + if(data.success) + { + var data_unique_hash = my_crud_form.closest(".flexigrid").attr("data-unique-hash"); + + $('.flexigrid[data-unique-hash='+data_unique_hash+']').find('.ajax_refresh_and_loading').trigger('click'); + + if(save_and_close) + { + if ($('#save-and-go-back-button').closest('.ui-dialog').length === 0) { + window.location = data.success_list_url; + } else { + $(".ui-dialog-content").dialog("close"); + success_message(data.success_message); + } + + return true; + } + + form_success_message(data.success_message); + } + else + { + form_error_message(message_update_error); + } + }, + error: function(){ + form_error_message( message_update_error ); + } + }); + } + else + { + $('.field_error').each(function(){ + $(this).removeClass('field_error'); + }); + $('#report-error').slideUp('fast'); + $('#report-error').html(data.error_message); + $.each(data.error_fields, function(index,value){ + $('input[name='+index+']').addClass('field_error'); + }); + + $('#report-error').slideDown('normal'); + $('#report-success').slideUp('fast').html(''); + + } + }, + error: function(){ + alert( message_update_error ); + $("#FormLoading").hide(); + + } + }); + return false; + }); + + if( $('#cancel-button').closest('.ui-dialog').length === 0 ) { + + $('#cancel-button').click(function(){ + if( $(this).hasClass('back-to-list') || confirm( message_alert_edit_form ) ) + { + window.location = list_url; + } + + return false; + }); + + } +}); diff --git a/assets/grocery_crud/themes/flexigrid/js/flexigrid.js b/assets/grocery_crud/themes/flexigrid/js/flexigrid.js new file mode 100644 index 000000000..e90c39a59 --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/flexigrid.js @@ -0,0 +1,269 @@ +$(function(){ + $('.quickSearchButton').click(function(){ + $(this).closest('.flexigrid').find('.quickSearchBox').slideToggle('normal'); + }); + + $('.ptogtitle').click(function(){ + if ($(this).hasClass('vsble')) { + $(this).removeClass('vsble'); + $(this).closest('.flexigrid').find('.main-table-box').slideDown("slow"); + } else { + $(this).addClass('vsble'); + $(this).closest('.flexigrid').find('.main-table-box').slideUp("slow"); + } + }); + + var call_fancybox = function () { + //If there is no thumbnail this means that the fancybox library doesn't exist + if ($('.image-thumbnail').length > 0) { + $('.image-thumbnail').fancybox({ + 'transitionIn' : 'elastic', + 'transitionOut' : 'elastic', + 'speedIn' : 600, + 'speedOut' : 200, + 'overlayShow' : false + }); + } + }; + + call_fancybox(); + add_edit_button_listener(); + + $('.filtering_form').submit(function(){ + var crud_page = parseInt($(this).closest('.flexigrid').find('.crud_page').val(), 10); + var last_page = parseInt($(this).closest('.flexigrid').find('.last-page-number').html(), 10); + + if (crud_page > last_page) { + $(this).closest('.flexigrid').find('.crud_page').val(last_page); + } + if (crud_page <= 0) { + $(this).closest('.flexigrid').find('.crud_page').val('1'); + } + + var this_form = $(this); + + var ajax_list_info_url = $(this).attr('data-ajax-list-info-url'); + + $(this).ajaxSubmit({ + url: ajax_list_info_url, + dataType: 'json', + beforeSend: function(){ + this_form.closest('.flexigrid').find('.ajax_refresh_and_loading').addClass('loading'); + }, + complete: function(){ + this_form.closest('.flexigrid').find('.ajax_refresh_and_loading').removeClass('loading'); + }, + success: function(data){ + this_form.closest('.flexigrid').find('.total_items').html( data.total_results); + displaying_and_pages(this_form.closest('.flexigrid')); + + this_form.ajaxSubmit({ + success: function(data){ + this_form.closest('.flexigrid').find('.ajax_list').html(data); + call_fancybox(); + add_edit_button_listener(); + } + }); + } + }); + + if ($('.flexigrid').length == 1) { //disable cookie storing for multiple grids in one page + createCookie('crud_page_'+unique_hash,crud_page,1); + createCookie('per_page_'+unique_hash,$('#per_page').val(),1); + createCookie('hidden_ordering_'+unique_hash,$('#hidden-ordering').val(),1); + createCookie('hidden_sorting_'+unique_hash,$('#hidden-sorting').val(),1); + createCookie('search_text_'+unique_hash,$(this).closest('.flexigrid').find('.search_text').val(),1); + createCookie('search_field_'+unique_hash,$('#search_field').val(),1); + } + + return false; + }); + + $('.crud_search').click(function(){ + $(this).closest('.flexigrid').find('.crud_page').val('1'); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.search_clear').click(function(){ + $(this).closest('.flexigrid').find('.crud_page').val('1'); + $(this).closest('.flexigrid').find('.search_text').val(''); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.per_page').change(function(){ + $(this).closest('.flexigrid').find('.crud_page').val('1'); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.ajax_refresh_and_loading').click(function(){ + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.first-button').click(function(){ + $(this).closest('.flexigrid').find('.crud_page').val('1'); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.prev-button').click(function(){ + if( $(this).closest('.flexigrid').find('.crud_page').val() != "1") + { + $(this).closest('.flexigrid').find('.crud_page').val( parseInt($(this).closest('.flexigrid').find('.crud_page').val(),10) - 1 ); + $(this).closest('.flexigrid').find('.crud_page').trigger('change'); + } + }); + + $('.last-button').click(function(){ + $(this).closest('.flexigrid').find('.crud_page').val( $(this).closest('.flexigrid').find('.last-page-number').html()); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.next-button').click(function(){ + $(this).closest('.flexigrid').find('.crud_page').val( parseInt($(this).closest('.flexigrid').find('.crud_page').val()) + 1 ); + $(this).closest('.flexigrid').find('.crud_page').trigger('change'); + }); + + $('.crud_page').change(function(){ + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.ajax_list').on('click','.field-sorting', function(){ + $(this).closest('.flexigrid').find('.hidden-sorting').val($(this).attr('rel')); + + if ($(this).hasClass('asc')) { + $(this).closest('.flexigrid').find('.hidden-ordering').val('desc'); + } else { + $(this).closest('.flexigrid').find('.hidden-ordering').val('asc'); + } + + $(this).closest('.flexigrid').find('.crud_page').val('1'); + $(this).closest('.flexigrid').find('.filtering_form').trigger('submit'); + }); + + $('.ajax_list').on('click','.delete-row', function(){ + var delete_url = $(this).attr('href'); + + var this_container = $(this).closest('.flexigrid'); + + if( confirm( message_alert_delete ) ) + { + $.ajax({ + url: delete_url, + dataType: 'json', + success: function(data) + { + if(data.success) + { + this_container.find('.ajax_refresh_and_loading').trigger('click'); + + success_message(data.success_message); + } + else + { + error_message(data.error_message); + + } + } + }); + } + + return false; + }); + + $('.export-anchor').click(function(){ + var export_url = $(this).attr('data-url'); + + var form_input_html = ''; + $.each($(this).closest('.flexigrid').find('.filtering_form').serializeArray(), function(i, field) { + form_input_html = form_input_html + ''; + }); + + var form_on_demand = $("
    ").attr("id","export_form").attr("method","post").attr("target","_blank") + .attr("action",export_url).html(form_input_html); + + $(this).closest('.flexigrid').find('.hidden-operations').html(form_on_demand); + + $(this).closest('.flexigrid').find('.hidden-operations').find('#export_form').submit(); + }); + + $('.print-anchor').click(function(){ + var print_url = $(this).attr('data-url'); + + var form_input_html = ''; + $.each($(this).closest('.flexigrid').find('.filtering_form').serializeArray(), function(i, field) { + form_input_html = form_input_html + ''; + }); + + var form_on_demand = $("").attr("id","print_form").attr("method","post").attr("action",print_url).html(form_input_html); + + $(this).closest('.flexigrid').find('.hidden-operations').html(form_on_demand); + + var _this_button = $(this); + + $(this).closest('.flexigrid').find('#print_form').ajaxSubmit({ + beforeSend: function(){ + _this_button.find('.fbutton').addClass('loading'); + _this_button.find('.fbutton>div').css('opacity','0.4'); + }, + complete: function(){ + _this_button.find('.fbutton').removeClass('loading'); + _this_button.find('.fbutton>div').css('opacity','1'); + }, + success: function(html_data){ + $("
    ").html(html_data).printElement(); + } + }); + }); + + $('.crud_page').numeric(); + + + if ($('.flexigrid').length == 1) { //disable cookie storing for multiple grids in one page + var cookie_crud_page = readCookie('crud_page_'+unique_hash); + var cookie_per_page = readCookie('per_page_'+unique_hash); + var hidden_ordering = readCookie('hidden_ordering_'+unique_hash); + var hidden_sorting = readCookie('hidden_sorting_'+unique_hash); + var cookie_search_text = readCookie('search_text_'+unique_hash); + var cookie_search_field = readCookie('search_field_'+unique_hash); + + if(cookie_crud_page !== null && cookie_per_page !== null) + { + $('#crud_page').val(cookie_crud_page); + $('#per_page').val(cookie_per_page); + $('#hidden-ordering').val(hidden_ordering); + $('#hidden-sorting').val(hidden_sorting); + $('#search_text').val(cookie_search_text); + $('#search_field').val(cookie_search_field); + + if(cookie_search_text !== '') + $('#quickSearchButton').trigger('click'); + + $('#filtering_form').trigger('submit'); + } + } + +}); + +function displaying_and_pages(this_container) +{ + if (this_container.find('.crud_page').val() == 0) { + this_container.find('.crud_page').val('1'); + } + + var crud_page = parseInt( this_container.find('.crud_page').val(), 10) ; + var per_page = parseInt( this_container.find('.per_page').val(), 10 ); + var total_items = parseInt( this_container.find('.total_items').html(), 10 ); + + this_container.find('.last-page-number').html( Math.ceil( total_items / per_page) ); + + if (total_items == 0) { + this_container.find('.page-starts-from').html( '0'); + } else { + this_container.find('.page-starts-from').html( (crud_page - 1)*per_page + 1 ); + } + + if (crud_page*per_page > total_items) { + this_container.find('.page-ends-to').html( total_items ); + } else { + this_container.find('.page-ends-to').html( crud_page*per_page ); + } +} \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/js/index.html b/assets/grocery_crud/themes/flexigrid/js/index.html new file mode 100644 index 000000000..c942a79ce --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + \ No newline at end of file diff --git a/assets/grocery_crud/themes/flexigrid/js/jquery.form.js b/assets/grocery_crud/themes/flexigrid/js/jquery.form.js new file mode 100644 index 000000000..2be0471c4 --- /dev/null +++ b/assets/grocery_crud/themes/flexigrid/js/jquery.form.js @@ -0,0 +1,825 @@ +/*! + * jQuery Form Plugin + * version: 2.72 (28-APR-2011) + * @requires jQuery v1.3.2 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +;(function($) { + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are intended to be exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').bind('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + if (typeof options == 'function') { + options = { success: options }; + } + + var action = this.attr('action'); + var url = (typeof action === 'string') ? $.trim(action) : ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + url = url || window.location.href || ''; + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57) + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var n,v,a = this.formToArray(options.semantic); + if (options.data) { + options.extraData = options.data; + for (n in options.data) { + if(options.data[n] instanceof Array) { + for (var k in options.data[n]) { + a.push( { name: n, value: options.data[n][k] } ); + } + } + else { + v = options.data[n]; + v = $.isFunction(v) ? v() : v; // if value is fn, invoke it + a.push( { name: n, value: v } ); + } + } + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var $form = this, callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || options; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + // are there files to upload? + var fileInputs = $('input:file', this).length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (fileInputs || options.iframe || multipart)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, fileUpload); + } + else { + fileUpload(); + } + } + else { + $.ajax(options); + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + + if ($(':input[name=submit],:input[id=submit]', form).length) { + // if there is an input with a name or id of 'submit' then we won't be + // able to invoke the submit fn on the form (at least not x-browser) + alert('Error: Form elements must not have name or id of "submit".'); + return; + } + + var s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id; + var $io = $('