├── index.html ├── support ├── admin_view_print.css ├── flex_forms_error.png ├── multiselect-select2 │ ├── select2.png │ ├── select2x2.png │ ├── select2-spinner.gif │ ├── select2_locale_zh-CN.js │ ├── select2_locale_zh-TW.js │ ├── select2_locale_ja.js │ ├── select2_locale_ko.js │ ├── select2_locale_ug-CN.js │ ├── select2_locale_hu.js │ ├── select2_locale_he.js │ ├── select2_locale_is.js │ ├── select2_locale_th.js │ ├── select2_locale_nl.js │ ├── select2_locale_ka.js │ ├── select2_locale_sv.js │ ├── select2_locale_da.js │ ├── select2_locale_it.js │ ├── select2_locale_vi.js │ ├── select2_locale_ro.js │ ├── select2_locale_pt-PT.js │ ├── select2_locale_et.js │ ├── select2_locale_mk.js │ ├── LICENSE │ ├── select2_locale_ca.js │ ├── select2_locale_el.js │ ├── select2_locale_bg.js │ ├── select2_locale_pt-BR.js │ ├── select2_locale_az.js │ ├── select2_locale_fi.js │ ├── select2_locale_lv.js │ ├── select2_locale_de.js │ ├── select2_locale_hr.js │ ├── select2_locale_fa.js │ ├── select2_locale_rs.js │ ├── select2_locale_tr.js │ ├── select2_locale_fr.js │ ├── select2_locale_ru.js │ ├── select2.jquery.json │ ├── select2_locale_en.js.template │ ├── select2_locale_id.js │ ├── select2_locale_ar.js │ ├── select2_locale_ms.js │ ├── select2_locale_nb.js │ ├── select2_locale_lt.js │ ├── select2_locale_es.js │ ├── select2_locale_uk.js │ ├── select2_locale_eu.js │ ├── select2_locale_gl.js │ ├── release.sh │ ├── select2_locale_sk.js │ ├── select2_locale_cs.js │ ├── select2_locale_pl.js │ ├── select2-bootstrap.css │ ├── README.md │ └── CONTRIBUTING.md ├── jquery_ui_themes │ └── adminpack │ │ └── images │ │ ├── ui-icons_333333_256x240.png │ │ ├── ui-icons_777620_256x240.png │ │ ├── ui-icons_777777_256x240.png │ │ ├── ui-icons_cc0000_256x240.png │ │ ├── ui-icons_fafafa_256x240.png │ │ └── ui-icons_ffffff_256x240.png ├── jquery.tablecards.css ├── multiselect-widget │ ├── jquery.multiselect.filter.css │ ├── jquery.multiselect.css │ ├── jquery.multiselect.filter.js │ └── jquery.multiselect.min.js ├── admin_bulkedit.js ├── multiselect-flat │ ├── MIT-LICENSE.txt │ ├── js │ │ └── locales │ │ │ ├── jquery.uix.multiselect_et.js │ │ │ ├── jquery.uix.multiselect_nl.js │ │ │ ├── jquery.uix.multiselect_sv.js │ │ │ ├── jquery.uix.multiselect_en.js │ │ │ ├── jquery.uix.multiselect_ru.js │ │ │ ├── jquery.uix.multiselect_es.js │ │ │ ├── jquery.uix.multiselect_pt.js │ │ │ ├── jquery.uix.multiselect_fr.js │ │ │ ├── jquery.uix.multiselect_it.js │ │ │ └── jquery.uix.multiselect_de.js │ ├── css │ │ ├── jquery.uix.multiselect.css │ │ └── common.css │ └── README.md ├── admin_bulkedit.css ├── admin_print.css ├── admin.js ├── jquery.tablebodyscroll.css ├── str_basics.php ├── jquery.stickytableheaders.min.js ├── view_print_layout.php ├── jquery.tablecards.js ├── admin_view.css ├── jquery.tablednd.min.js ├── jquery.tablebodyscroll.js └── admin.css ├── admin_pack_demo_logo.png ├── admin_pack_demo_favicon.png └── README.md /index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /support/admin_view_print.css: -------------------------------------------------------------------------------- 1 | .pagewrap .menuwrap { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /admin_pack_demo_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/admin_pack_demo_logo.png -------------------------------------------------------------------------------- /admin_pack_demo_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/admin_pack_demo_favicon.png -------------------------------------------------------------------------------- /support/flex_forms_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/flex_forms_error.png -------------------------------------------------------------------------------- /support/multiselect-select2/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/multiselect-select2/select2.png -------------------------------------------------------------------------------- /support/multiselect-select2/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/multiselect-select2/select2x2.png -------------------------------------------------------------------------------- /support/multiselect-select2/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/multiselect-select2/select2-spinner.gif -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_333333_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_333333_256x240.png -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_fafafa_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_fafafa_256x240.png -------------------------------------------------------------------------------- /support/jquery_ui_themes/adminpack/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cubiclesoft/admin-pack-with-extras/master/support/jquery_ui_themes/adminpack/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /support/jquery.tablecards.css: -------------------------------------------------------------------------------- 1 | .tablecard-col, .tablecard-show th, .tablecard-show td { display: none; } 2 | .tablecard-show th.tablecard-mode-card, .tablecard-show td.tablecard-mode-card { display: table-cell; } 3 | .tablecard-show.tablecard-show-nohead > thead { display: none; } 4 | .tablecard-show.tablecard-show-nofoot > tfoot { display: none; } 5 | -------------------------------------------------------------------------------- /support/multiselect-widget/jquery.multiselect.filter.css: -------------------------------------------------------------------------------- 1 | .ui-multiselect-hasfilter ul { position:relative; top:2px } 2 | .ui-multiselect-filter { float:left; margin-right:10px; font-size:11px } 3 | .ui-multiselect-filter input { width:100px; font-size:10px; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } 4 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Chinese translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | $.fn.select2.locales['zh-CN'] = { 7 | formatNoMatches: function () { return "没有找到匹配项"; }, 8 | formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";}, 9 | formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";}, 10 | formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; }, 11 | formatLoadMore: function (pageNumber) { return "加载结果中…"; }, 12 | formatSearching: function () { return "搜索中…"; } 13 | }; 14 | 15 | $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']); 16 | })(jQuery); 17 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_zh-TW.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Traditional Chinese translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | $.fn.select2.locales['zh-TW'] = { 7 | formatNoMatches: function () { return "沒有找到相符的項目"; }, 8 | formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";}, 9 | formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";}, 10 | formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; }, 11 | formatLoadMore: function (pageNumber) { return "載入中…"; }, 12 | formatSearching: function () { return "搜尋中…"; } 13 | }; 14 | 15 | $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']); 16 | })(jQuery); 17 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ja.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Japanese translation. 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['ja'] = { 8 | formatNoMatches: function () { return "該当なし"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; }, 11 | formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; }, 12 | formatLoadMore: function (pageNumber) { return "読込中・・・"; }, 13 | formatSearching: function () { return "検索中・・・"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ko.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Korean translation. 3 | * 4 | * @author Swen Mun 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['ko'] = { 10 | formatNoMatches: function () { return "결과 없음"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; }, 13 | formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; }, 14 | formatLoadMore: function (pageNumber) { return "불러오는 중…"; }, 15 | formatSearching: function () { return "검색 중…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ug-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Uyghur translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | $.fn.select2.locales['ug-CN'] = { 7 | formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; }, 8 | formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";}, 9 | formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";}, 10 | formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; }, 11 | formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; }, 12 | formatSearching: function () { return "ئىزدەۋاتىدۇ…"; } 13 | }; 14 | 15 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']); 16 | })(jQuery); 17 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_hu.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Hungarian translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['hu'] = { 8 | formatNoMatches: function () { return "Nincs találat."; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; }, 11 | formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; }, 12 | formatLoadMore: function (pageNumber) { return "Töltés…"; }, 13 | formatSearching: function () { return "Keresés…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_he.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Hebrew translation. 3 | * 4 | * Author: Yakir Sitbon 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['he'] = { 10 | formatNoMatches: function () { return "לא נמצאו התאמות"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; }, 13 | formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; }, 14 | formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; }, 15 | formatSearching: function () { return "מחפש…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['he']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_is.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Icelandic translation. 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['is'] = { 8 | formatNoMatches: function () { return "Ekkert fannst"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); }, 11 | formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; }, 12 | formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; }, 13 | formatSearching: function () { return "Leita…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['is']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_th.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Thai translation. 3 | * 4 | * Author: Atsawin Chaowanakritsanakul 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['th'] = { 10 | formatNoMatches: function () { return "ไม่พบข้อมูล"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; }, 13 | formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; }, 14 | formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; }, 15 | formatSearching: function () { return "กำลังค้นข้อมูล…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['th']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_nl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Dutch translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['nl'] = { 8 | formatNoMatches: function () { return "Geen resultaten gevonden"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; }, 11 | formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; }, 12 | formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; }, 13 | formatSearching: function () { return "Zoeken…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ka.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Georgian (Kartuli) translation. 3 | * 4 | * Author: Dimitri Kurashvili dimakura@gmail.com 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['ka'] = { 10 | formatNoMatches: function () { return "ვერ მოიძებნა"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; }, 13 | formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; }, 14 | formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; }, 15 | formatSearching: function () { return "ძებნა…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_sv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Swedish translation. 3 | * 4 | * Author: Jens Rantil 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['sv'] = { 10 | formatNoMatches: function () { return "Inga träffar"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; }, 13 | formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; }, 14 | formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; }, 15 | formatSearching: function () { return "Söker…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_da.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Danish translation. 3 | * 4 | * Author: Anders Jenbo 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['da'] = { 10 | formatNoMatches: function () { return "Ingen resultater fundet"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; }, 13 | formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); }, 14 | formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; }, 15 | formatSearching: function () { return "Søger…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['da']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_it.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Italian translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['it'] = { 8 | formatNoMatches: function () { return "Nessuna corrispondenza trovata"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; }, 11 | formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); }, 12 | formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; }, 13 | formatSearching: function () { return "Ricerca…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['it']); 17 | })(jQuery); -------------------------------------------------------------------------------- /support/admin_bulkedit.js: -------------------------------------------------------------------------------- 1 | function BB_UpdateLayout() { 2 | var barheight = 0; 3 | var topbar = $('#topbarwrap'); 4 | if (!topbar.children().length) topbar.hide(); 5 | else 6 | { 7 | topbar.show(); 8 | barheight += topbar.outerHeight(); 9 | } 10 | 11 | var bottombar = $('#bottombarwrap'); 12 | if (!bottombar.children().length) $('#bottombarwrap').hide(); 13 | else 14 | { 15 | bottombar.show(); 16 | barheight += bottombar.outerHeight(); 17 | } 18 | 19 | $('#maincontentwrap').outerHeight($(window).height() - barheight); 20 | } 21 | 22 | function BB_StripeSidebar() { 23 | $('#sidebarwrap a').removeClass('altrow').filter(':visible:odd').addClass('altrow'); 24 | } 25 | 26 | function BB_SelectSidebarItem(obj) { 27 | $('#sidebarwrap a').removeClass('selected'); 28 | $(obj).addClass('selected'); 29 | 30 | return false; 31 | } 32 | 33 | $(function() { 34 | BB_StripeSidebar(); 35 | BB_UpdateLayout(); 36 | 37 | $(window).on('resize', BB_UpdateLayout); 38 | }); -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_vi.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Vietnamese translation. 3 | * 4 | * Author: Long Nguyen , Nguyen Chien Cong 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['vi'] = { 10 | formatNoMatches: function () { return "Không tìm thấy kết quả"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự"; }, 13 | formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " lựa chọn"; }, 14 | formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; }, 15 | formatSearching: function () { return "Đang tìm…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']); 19 | })(jQuery); 20 | 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ro.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Romanian translation. 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['ro'] = { 8 | formatNoMatches: function () { return "Nu a fost găsit nimic"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); }, 11 | formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); }, 12 | formatLoadMore: function (pageNumber) { return "Se încarcă…"; }, 13 | formatSearching: function () { return "Căutare…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_pt-PT.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Portuguese (Portugal) translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['pt-PT'] = { 8 | formatNoMatches: function () { return "Nenhum resultado encontrado"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, 11 | formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 12 | formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; }, 13 | formatSearching: function () { return "A pesquisar…"; } 14 | }; 15 | 16 | $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']); 17 | })(jQuery); 18 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_et.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Estonian translation. 3 | * 4 | * Author: Kuldar Kalvik 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['et'] = { 10 | formatNoMatches: function () { return "Tulemused puuduvad"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; }, 13 | formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; }, 14 | formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; }, 15 | formatSearching: function () { return "Otsin.."; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['et']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_mk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Macedonian translation. 3 | * 4 | * Author: Marko Aleksic 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['mk'] = { 10 | formatNoMatches: function () { return "Нема пронајдено совпаѓања"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); }, 13 | formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); }, 14 | formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; }, 15 | formatSearching: function () { return "Пребарување…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']); 19 | })(jQuery); -------------------------------------------------------------------------------- /support/multiselect-select2/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2014 Igor Vaynberg 2 | 3 | Version: @@ver@@ Timestamp: @@timestamp@@ 4 | 5 | This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU 6 | General Public License version 2 (the "GPL License"). You may choose either license to govern your 7 | use of this software only upon the condition that you accept all of the terms of either the Apache 8 | License or the GPL License. 9 | 10 | You may obtain a copy of the Apache License and the GPL License at: 11 | 12 | http://www.apache.org/licenses/LICENSE-2.0 13 | http://www.gnu.org/licenses/gpl-2.0.html 14 | 15 | Unless required by applicable law or agreed to in writing, software distributed under the Apache License 16 | or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 17 | either express or implied. See the Apache License and the GPL License for the specific language governing 18 | permissions and limitations under the Apache License and the GPL License. 19 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ca.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Catalan translation. 3 | * 4 | * Author: David Planella 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['ca'] = { 10 | formatNoMatches: function () { return "No s'ha trobat cap coincidència"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; }, 13 | formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); }, 14 | formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; }, 15 | formatSearching: function () { return "S'està cercant…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_el.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Greek translation. 3 | * 4 | * @author Uriy Efremochkin 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['el'] = { 10 | formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, 13 | formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); }, 14 | formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; }, 15 | formatSearching: function () { return "Αναζήτηση…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['el']); 19 | })(jQuery); -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_bg.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Bulgarian translation. 3 | * 4 | * @author Lubomir Vikev 5 | * @author Uriy Efremochkin 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['bg'] = { 11 | formatNoMatches: function () { return "Няма намерени съвпадения"; }, 12 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); }, 13 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); }, 14 | formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); }, 15 | formatLoadMore: function (pageNumber) { return "Зареждат се още…"; }, 16 | formatSearching: function () { return "Търсене…"; } 17 | }; 18 | 19 | $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']); 20 | })(jQuery); 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_pt-BR.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Brazilian Portuguese translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['pt-BR'] = { 8 | formatNoMatches: function () { return "Nenhum resultado encontrado"; }, 9 | formatAjaxError: function () { return "Erro na busca"; }, 10 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); }, 11 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); }, 12 | formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 13 | formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; }, 14 | formatSearching: function () { return "Buscando…"; } 15 | }; 16 | 17 | $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']); 18 | })(jQuery); 19 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_az.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Azerbaijani translation. 3 | * 4 | * Author: Farhad Safarov 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['az'] = { 10 | formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; }, 11 | formatNoMatches: function () { return "Nəticə tapılmadı"; }, 12 | formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; }, 13 | formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; }, 14 | formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; }, 15 | formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; }, 16 | formatSearching: function () { return "Axtarılır…"; } 17 | }; 18 | 19 | $.extend($.fn.select2.defaults, $.fn.select2.locales['az']); 20 | })(jQuery); 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_fi.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Finnish translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | $.fn.select2.locales['fi'] = { 7 | formatNoMatches: function () { 8 | return "Ei tuloksia"; 9 | }, 10 | formatInputTooShort: function (input, min) { 11 | var n = min - input.length; 12 | return "Ole hyvä ja anna " + n + " merkkiä lisää"; 13 | }, 14 | formatInputTooLong: function (input, max) { 15 | var n = input.length - max; 16 | return "Ole hyvä ja anna " + n + " merkkiä vähemmän"; 17 | }, 18 | formatSelectionTooBig: function (limit) { 19 | return "Voit valita ainoastaan " + limit + " kpl"; 20 | }, 21 | formatLoadMore: function (pageNumber) { 22 | return "Ladataan lisää tuloksia…"; 23 | }, 24 | formatSearching: function () { 25 | return "Etsitään…"; 26 | } 27 | }; 28 | 29 | $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']); 30 | })(jQuery); 31 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_lv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Latvian translation. 3 | * 4 | * @author Uriy Efremochkin 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['lv'] = { 10 | formatNoMatches: function () { return "Sakritību nav"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; }, 13 | formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); }, 14 | formatLoadMore: function (pageNumber) { return "Datu ielāde…"; }, 15 | formatSearching: function () { return "Meklēšana…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_de.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 German translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['de'] = { 8 | formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; }, 9 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; }, 10 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; }, 11 | formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; }, 12 | formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; }, 13 | formatSearching: function () { return "Suche…"; }, 14 | formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; } 15 | }; 16 | 17 | $.extend($.fn.select2.defaults, $.fn.select2.locales['de']); 18 | })(jQuery); -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_hr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Croatian translation. 3 | * 4 | * @author Edi Modrić 5 | * @author Uriy Efremochkin 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['hr'] = { 11 | formatNoMatches: function () { return "Nema rezultata"; }, 12 | formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); }, 13 | formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; }, 14 | formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; }, 15 | formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; }, 16 | formatSearching: function () { return "Pretraga…"; } 17 | }; 18 | 19 | $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']); 20 | 21 | function character (n) { 22 | return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova"); 23 | } 24 | })(jQuery); 25 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_fa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Persian translation. 3 | * 4 | * Author: Ali Choopan 5 | * Author: Ebrahim Byagowi 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['fa'] = { 11 | formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; }, 12 | formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; }, 13 | formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; }, 14 | formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; }, 15 | formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; }, 16 | formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; }, 17 | formatSearching: function () { return "در حال جستجو…"; } 18 | }; 19 | 20 | $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']); 21 | })(jQuery); 22 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_rs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Serbian translation. 3 | * 4 | * @author Limon Monte 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['rs'] = { 10 | formatNoMatches: function () { return "Ništa nije pronađeno"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, 13 | formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); }, 14 | formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; }, 15 | formatSearching: function () { return "Pretraga…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_tr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Turkish translation. 3 | * 4 | * Author: Salim KAYABAŞI 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['tr'] = { 10 | formatMatches: function (matches) { if (matches === 1) { return "Sadece bir sonuç bulundu, seçmek için enter tuşuna basabilirsiniz."; } return matches + " sonuç bulundu, yukarı ve aşağı tuşları ile seçebilirsiniz."; }, 11 | formatNoMatches: function () { return "Sonuç bulunamadı"; }, 12 | formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; }, 13 | formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; }, 14 | formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; }, 15 | formatLoadMore: function (pageNumber) { return "Daha fazla…"; }, 16 | formatSearching: function () { return "Aranıyor…"; } 17 | }; 18 | 19 | $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']); 20 | })(jQuery); 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_fr.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 French translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['fr'] = { 8 | formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; }, 9 | formatNoMatches: function () { return "Aucun résultat trouvé"; }, 10 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; }, 11 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); }, 12 | formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); }, 13 | formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; }, 14 | formatSearching: function () { return "Recherche en cours…"; } 15 | }; 16 | 17 | $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']); 18 | })(jQuery); 19 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ru.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Russian translation. 3 | * 4 | * @author Uriy Efremochkin 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['ru'] = { 10 | formatNoMatches: function () { return "Совпадений не найдено"; }, 11 | formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); }, 12 | formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; }, 13 | formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); }, 14 | formatLoadMore: function (pageNumber) { return "Загрузка данных…"; }, 15 | formatSearching: function () { return "Поиск…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']); 19 | 20 | function character (n) { 21 | return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов"); 22 | } 23 | })(jQuery); 24 | -------------------------------------------------------------------------------- /support/multiselect-flat/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 yanick.rochon at gmail.com 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2.jquery.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "select2", 3 | "title": "Select2", 4 | "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.", 5 | "keywords": [ 6 | "select", 7 | "autocomplete", 8 | "typeahead", 9 | "dropdown", 10 | "multiselect", 11 | "tag", 12 | "tagging" 13 | ], 14 | "version": "3.5.4", 15 | "author": { 16 | "name": "Igor Vaynberg", 17 | "url": "https://github.com/ivaynberg" 18 | }, 19 | "licenses": [ 20 | { 21 | "type": "Apache", 22 | "url": "http://www.apache.org/licenses/LICENSE-2.0" 23 | }, 24 | { 25 | "type": "GPL v2", 26 | "url": "http://www.gnu.org/licenses/gpl-2.0.html" 27 | } 28 | ], 29 | "bugs": "https://github.com/ivaynberg/select2/issues", 30 | "homepage": "http://ivaynberg.github.com/select2", 31 | "docs": "http://ivaynberg.github.com/select2/", 32 | "download": "https://github.com/ivaynberg/select2/tags", 33 | "dependencies": { 34 | "jquery": ">=1.7.1" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_en.js.template: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 translation. 3 | * 4 | * Author: Your Name 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['en'] = { 10 | formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; }, 11 | formatNoMatches: function () { return "No matches found"; }, 12 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); }, 13 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); }, 14 | formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, 15 | formatLoadMore: function (pageNumber) { return "Loading more results…"; }, 16 | formatSearching: function () { return "Searching…"; } 17 | }; 18 | 19 | $.extend($.fn.select2.defaults, $.fn.select2.locales['en']); 20 | })(jQuery); 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_id.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Indonesian translation. 3 | * 4 | * Author: Ibrahim Yusuf 5 | * Author: Salahuddin Hairai 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['id'] = { 11 | formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, 12 | formatNoMatches: function () { return "Tidak ada data yang sesuai"; }, 13 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi"; }, 14 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapuskan " + n + " huruf" ; }, 15 | formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan"; }, 16 | formatLoadMore: function (pageNumber) { return "Mengambil data…"; }, 17 | formatSearching: function () { return "Mencari…"; } 18 | }; 19 | 20 | $.extend($.fn.select2.defaults, $.fn.select2.locales['id']); 21 | })(jQuery); 22 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Arabic translation. 3 | * 4 | * Author: Adel KEDJOUR 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['ar'] = { 10 | formatNoMatches: function () { return "لم يتم العثور على مطابقات"; }, 11 | formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; }, 12 | formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; }, 13 | formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; }, 14 | formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; }, 15 | formatSearching: function () { return "البحث…"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_ms.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Malay translation. 3 | * 4 | * Author: Kepoweran 5 | * Author: Salahuddin Hairai 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['ms'] = { 11 | formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, 12 | formatNoMatches: function () { return "Tiada padanan yang ditemui"; }, 13 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; }, 14 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; }, 15 | formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; }, 16 | formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; }, 17 | formatSearching: function () { return "Mencari…"; } 18 | }; 19 | 20 | $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']); 21 | })(jQuery); 22 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_nb.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Norwegian Bokmål translation. 3 | * 4 | * Author: Torgeir Veimo 5 | * Author: Bjørn Johansen 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['nb'] = { 11 | formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; }, 12 | formatNoMatches: function () { return "Ingen treff"; }, 13 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); }, 14 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; }, 15 | formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; }, 16 | formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; }, 17 | formatSearching: function () { return "Søker …"; } 18 | }; 19 | 20 | $.extend($.fn.select2.defaults, $.fn.select2.locales['no']); 21 | })(jQuery); 22 | 23 | -------------------------------------------------------------------------------- /support/admin_bulkedit.css: -------------------------------------------------------------------------------- 1 | html, body { height: 100%; margin: 0px; padding: 0px; overflow: hidden; background-color: #FFFFFF; } 2 | body { font-family: Verdana, Arial, Helvetica, sans-serif; position: relative; } 3 | 4 | #sidebarwrap { float: left; width: 350px; min-width: 200px; max-width: 25%; height: 100%; overflow: auto; border-right: 1px solid #CCCCCC; font-size: 0.9em; } 5 | #sidebarwrap a { display: block; padding: 0.3em 0.5em; color: #035488; text-decoration: none; background-color: #FAFAFA; } 6 | #sidebarwrap a.altrow { background-color: #F5F5F5; } 7 | #sidebarwrap a:hover { background-color: #EEEEEE; } 8 | #sidebarwrap a.selected { color: #FEFEFE; background-color: #035488; } 9 | #sidebarwrap a.selected:hover { background-color: #035488; } 10 | 11 | #topbarwrap { border-bottom: 1px solid #CCCCCC; font-size: 0.9em; padding: 0.7em; overflow: hidden; } 12 | #maincontentwrap { overflow: auto; } 13 | #bottombarwrap { border-top: 1px solid #CCCCCC; font-size: 0.9em; padding: 0.7em; overflow: hidden; } 14 | 15 | #ajaxhidden { display: none; } 16 | 17 | @media (max-width: 600px) { 18 | html, body { overflow: auto; } 19 | #sidebarwrap { float: none; width: auto; min-width: 0; max-width: none; height: 60%; border-right: none; border-bottom: 1px solid #CCCCCC; } 20 | } 21 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_lt.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Lithuanian translation. 3 | * 4 | * @author CRONUS Karmalakas 5 | * @author Uriy Efremochkin 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['lt'] = { 11 | formatNoMatches: function () { return "Atitikmenų nerasta"; }, 12 | formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); }, 13 | formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); }, 14 | formatSelectionTooBig: function (limit) { 15 | return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą"); 16 | }, 17 | formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; }, 18 | formatSearching: function () { return "Ieškoma…"; } 19 | }; 20 | 21 | $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']); 22 | 23 | function character (n) { 24 | return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į"); 25 | } 26 | })(jQuery); 27 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_es.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Spanish translation 3 | */ 4 | (function ($) { 5 | "use strict"; 6 | 7 | $.fn.select2.locales['es'] = { 8 | formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; }, 9 | formatNoMatches: function () { return "No se encontraron resultados"; }, 10 | formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); }, 11 | formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); }, 12 | formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, 13 | formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; }, 14 | formatSearching: function () { return "Buscando…"; }, 15 | formatAjaxError: function() { return "La carga falló"; } 16 | }; 17 | 18 | $.extend($.fn.select2.defaults, $.fn.select2.locales['es']); 19 | })(jQuery); 20 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_uk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Ukrainian translation. 3 | * 4 | * @author bigmihail 5 | * @author Uriy Efremochkin 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | 10 | $.fn.select2.locales['uk'] = { 11 | formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; }, 12 | formatNoMatches: function () { return "Нічого не знайдено"; }, 13 | formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); }, 14 | formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; }, 15 | formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); }, 16 | formatLoadMore: function (pageNumber) { return "Завантаження даних…"; }, 17 | formatSearching: function () { return "Пошук…"; } 18 | }; 19 | 20 | $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']); 21 | 22 | function character (n, word) { 23 | return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів"); 24 | } 25 | })(jQuery); 26 | -------------------------------------------------------------------------------- /support/admin_print.css: -------------------------------------------------------------------------------- 1 | html, body { height: auto; overflow: visible; } 2 | 3 | #menuwrap { display: none; } 4 | #menuwrap.showmenu { display: none; } 5 | 6 | #contentwrap { height: auto; overflow: hidden; } 7 | #contentwrap .proptitlewrap { background-color: #222222; color: #FAFAFA; padding: 0.85em; box-shadow: none; border-bottom: 1px solid #CCCCCC; } 8 | #contentwrap.showmenu #navoverflowwrap { display: none; } 9 | #contentwrap #navbutton { display: none; } 10 | #contentwrap .proptitletext { padding-left: 0em; } 11 | 12 | .formitemdata table.formitemtable > thead > tr > th, .formitemdata table.formitemtable > tbody > tr > td { border-top: 1px solid #CCCCCC; } 13 | .formitemdata table.formitemtable > thead > tr > th:first-child { border-left: 1px solid #CCCCCC; } 14 | .formitemdata table.formitemtable > thead > tr > th:last-child { border-right: 1px solid #CCCCCC; } 15 | .formitemdata table.formitemtable > tbody > tr:first-child > td { border-top: 1px solid #CCCCCC; } 16 | 17 | form.ff_form .formsubmit input { background-color: #FAFAFA; color: #222222; border: 1px solid #222222; } 18 | 19 | .ui-multiselect { width: 100% !important; } 20 | .formitemdata .ui-multiselect.ui-widget { border: 1px solid #c5c5c5 !important; background: #ffffff !important; color: #222222 !important; } 21 | 22 | .multiselect-available-list { display: none; } 23 | .multiselect-selected-list { left: 0 !important; width: 100% !important; } 24 | 25 | .no-print { display: none; } 26 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_eu.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Basque translation. 3 | * 4 | * Author: Julen Ruiz Aizpuru 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['eu'] = { 10 | formatNoMatches: function () { 11 | return "Ez da bat datorrenik aurkitu"; 12 | }, 13 | formatInputTooShort: function (input, min) { 14 | var n = min - input.length; 15 | if (n === 1) { 16 | return "Idatzi karaktere bat gehiago"; 17 | } else { 18 | return "Idatzi " + n + " karaktere gehiago"; 19 | } 20 | }, 21 | formatInputTooLong: function (input, max) { 22 | var n = input.length - max; 23 | if (n === 1) { 24 | return "Idatzi karaktere bat gutxiago"; 25 | } else { 26 | return "Idatzi " + n + " karaktere gutxiago"; 27 | } 28 | }, 29 | formatSelectionTooBig: function (limit) { 30 | if (limit === 1 ) { 31 | return "Elementu bakarra hauta dezakezu"; 32 | } else { 33 | return limit + " elementu hauta ditzakezu soilik"; 34 | } 35 | }, 36 | formatLoadMore: function (pageNumber) { 37 | return "Emaitza gehiago kargatzen…"; 38 | }, 39 | formatSearching: function () { 40 | return "Bilatzen…"; 41 | } 42 | }; 43 | 44 | $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']); 45 | })(jQuery); 46 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_gl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Galician translation 3 | * 4 | * Author: Leandro Regueiro 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | 9 | $.fn.select2.locales['gl'] = { 10 | formatNoMatches: function () { 11 | return "Non se atoparon resultados"; 12 | }, 13 | formatInputTooShort: function (input, min) { 14 | var n = min - input.length; 15 | if (n === 1) { 16 | return "Engada un carácter"; 17 | } else { 18 | return "Engada " + n + " caracteres"; 19 | } 20 | }, 21 | formatInputTooLong: function (input, max) { 22 | var n = input.length - max; 23 | if (n === 1) { 24 | return "Elimine un carácter"; 25 | } else { 26 | return "Elimine " + n + " caracteres"; 27 | } 28 | }, 29 | formatSelectionTooBig: function (limit) { 30 | if (limit === 1 ) { 31 | return "Só pode seleccionar un elemento"; 32 | } else { 33 | return "Só pode seleccionar " + limit + " elementos"; 34 | } 35 | }, 36 | formatLoadMore: function (pageNumber) { 37 | return "Cargando máis resultados…"; 38 | }, 39 | formatSearching: function () { 40 | return "Buscando…"; 41 | } 42 | }; 43 | 44 | $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']); 45 | })(jQuery); 46 | -------------------------------------------------------------------------------- /support/admin.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | // For handling menu scroll. 3 | function GetScrollLineHeight() { 4 | var iframe = document.createElement('iframe'); 5 | iframe.src = '#'; 6 | document.body.appendChild(iframe); 7 | var iwin = iframe.contentWindow; 8 | var idoc = iwin.document; 9 | idoc.open(); 10 | idoc.write('a'); 11 | idoc.close(); 12 | var span = idoc.body.firstElementChild; 13 | var r = span.offsetHeight; 14 | document.body.removeChild(iframe); 15 | 16 | return r; 17 | } 18 | 19 | var scrolllineheight = GetScrollLineHeight(); 20 | var showingmenu = false; 21 | 22 | $('.proptitlewrap').after($('').click(function() { 23 | $('#menuwrap').toggleClass('showmenu'); 24 | $('#contentwrap').toggleClass('showmenu'); 25 | 26 | showingmenu = !showingmenu; 27 | })); 28 | 29 | $('#navbutton').click(function() { 30 | $('#menuwrap').toggleClass('showmenu'); 31 | $('#contentwrap').toggleClass('showmenu'); 32 | 33 | showingmenu = !showingmenu; 34 | }); 35 | 36 | var scrolltarget = $('#contentwrap').get(0); 37 | 38 | $('#menuwrap').on('wheel', function(e) { 39 | var $this = $(this); 40 | 41 | if (!showingmenu && $this.get(0).scrollHeight <= $this.innerHeight()) 42 | { 43 | var o = e.originalEvent; 44 | var mult = (o.deltaMode == 1 ? scrolllineheight * 2 : (o.deltaMode == 2 ? $(window).height() - (2 * scrolllineheight) : 1)); 45 | 46 | scrolltarget.scrollTop += o.deltaY * mult; 47 | scrolltarget.scrollLeft += o.deltaX * mult; 48 | } 49 | }); 50 | 51 | $('#contentwrap').focus(); 52 | }); -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_et.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * karmux (https://github.com/karmux) 7 | * 8 | * Dual licensed under the MIT (MIT-LICENSE.txt) 9 | * and GPL (GPL-LICENSE.txt) licenses. 10 | * 11 | * http://mind2soft.com/labs/jquery/multiselect/ 12 | * 13 | * 14 | * Localization : ET 15 | * 16 | */ 17 | 18 | (function($) { 19 | 20 | $.uix.multiselect.i18n['et'] = { 21 | itemsSelected_nil: 'midagi pole valitud', // 0 22 | itemsSelected: '{count} valitud', // 0, 1 23 | itemsSelected_plural: '{count} valitud', // n 24 | //itemsSelected_plural_two: ... // 2 25 | //itemsSelected_plural_few: ... // 3, 4 26 | itemsAvailable_nil: 'valikuid pole saadaval', 27 | itemsAvailable: '{count} valik saadaval', 28 | itemsAvailable_plural: '{count} valikut saadaval', 29 | //itemsAvailable_plural_two: ... 30 | //itemsAvailable_plural_few: ... 31 | itemsFiltered_nil: 'valikuid pole filtreeritud', 32 | itemsFiltered: '{count} valik filtreeritud', 33 | itemsFiltered_plural: '{count} valikut filtreeritud', 34 | //itemsFiltered_plural_two: ... 35 | //itemsFiltered_plural_few: ... 36 | selectAll: 'Vali kõik', 37 | deselectAll: 'Tühista kõik', 38 | search: 'Otsi', 39 | collapseGroup: 'Kahanda grupp', 40 | expandGroup: 'Laienda grupp', 41 | selectAllGroup: 'Vali kogu grupp', 42 | deselectAllGroup: 'Tühista kogu grupp' 43 | }; 44 | 45 | // link locales 46 | $.uix.multiselect.i18n['et_EE'] = $.uix.multiselect.i18n['et']; 47 | // ... 48 | 49 | })(jQuery); 50 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_nl.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : NL 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['nl'] = { 20 | itemsSelected_nil: 'Geen geselecteerde items', // 0 21 | itemsSelected: '{count} geselecteerde item', // 0, 1 22 | itemsSelected_plural: '{count} geselecteerde items', // n 23 | //itemsSelected_plural_two: ... // 2 24 | //itemsSelected_plural_few: ... // 3, 4 25 | itemsAvailable_nil: 'Geen item beschikbaar', 26 | itemsAvailable: '{count} beschikbare item', 27 | itemsAvailable_plural: '{count} beschikbare items', 28 | //itemsAvailable_plural_two: ... 29 | //itemsAvailable_plural_few: ... 30 | itemsFiltered_nil: 'Geen gefilterde item', 31 | itemsFiltered: '{count} item gefilterd', 32 | itemsFiltered_plural: '{count} items fgeilterd', 33 | //itemsFiltered_plural_two: ... 34 | //itemsFiltered_plural_few: ... 35 | selectAll: 'Selecteer Alles', 36 | deselectAll: 'Deselecteer Alles', 37 | search: 'Zoek opties', 38 | collapseGroup: 'Klap groep in', 39 | expandGroup: 'Klap Group uit', 40 | selectAllGroup: 'Selecteer alle groepen', 41 | deselectAllGroup: 'Deselecteer alle groepen' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['nl_NL'] = $.uix.multiselect.i18n['nl']; 46 | // ... 47 | 48 | })(jQuery); 49 | -------------------------------------------------------------------------------- /support/multiselect-widget/jquery.multiselect.css: -------------------------------------------------------------------------------- 1 | .ui-multiselect { padding:2px 0 2px 4px; text-align:left } 2 | .ui-multiselect span.ui-icon { float:right } 3 | .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } 4 | .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important } 5 | 6 | .ui-multiselect-header { margin-bottom:3px; padding:3px 0 3px 4px; } 7 | .ui-multiselect-header ul { font-size:0.9em } 8 | .ui-multiselect-header ul li { float:left; padding:0 10px 0 0; } 9 | .ui-multiselect-header a { text-decoration:none; } 10 | .ui-multiselect-header a:hover { text-decoration:underline; } 11 | .ui-multiselect-header span.ui-icon { float:left; } 12 | .ui-multiselect-header .ui-multiselect-close { float:right; padding-right:0; text-align:right; } 13 | 14 | .ui-multiselect-menu { display:none; padding:3px; position:absolute; text-align: left; } 15 | .ui-multiselect-checkboxes { overflow-y:auto; position:relative; } 16 | .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px; } 17 | .ui-multiselect-checkboxes label input { position:relative; top:1px } 18 | .ui-multiselect-checkboxes li { clear:both; font-size:0.9em; list-style: none; padding-right:3px; } 19 | .ui-multiselect-checkboxes .ui-multiselect-optgroup { padding: 3px; } 20 | .ui-multiselect-columns { display: inline-block; vertical-align: top; } 21 | .ui-multiselect-checkboxes .ui-multiselect-optgroup a { border-bottom:1px solid; cursor: pointer; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } 22 | 23 | @media print{ 24 | .ui-multiselect-menu {display: none;} 25 | } 26 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_sv.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : EN 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['sv'] = { 20 | itemsSelected_nil: 'inga alternativ valda', // 0 21 | itemsSelected: '{count} valt alternativ', // 0, 1 22 | itemsSelected_plural: '{count} valda alternativ', // n 23 | //itemsSelected_plural_two: ... // 2 24 | //itemsSelected_plural_few: ... // 3, 4 25 | itemsAvailable_nil: 'inga alternativ tillgängliga', 26 | itemsAvailable: '{count} tillgängligt alternativ', 27 | itemsAvailable_plural: '{count} tillgängliga alternativ', 28 | //itemsAvailable_plural_two: ... 29 | //itemsAvailable_plural_few: ... 30 | itemsFiltered_nil: 'inga alternativ filtrerade', 31 | itemsFiltered: '{count} alternativ filtrerat', 32 | itemsFiltered_plural: '{count} alternativ filtrerade', 33 | //itemsFiltered_plural_two: ... 34 | //itemsFiltered_plural_few: ... 35 | selectAll: 'Markera alla', 36 | deselectAll: 'Avmarkera alla', 37 | search: 'Sök alternativ', 38 | collapseGroup: 'Dölj grupp', 39 | expandGroup: 'Visa grupp', 40 | selectAllGroup: 'Markera alla i gruppen', 41 | deselectAllGroup: 'Avmarkera alla i gruppen' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['sv_SE'] = $.uix.multiselect.i18n['sv']; 46 | // ... 47 | 48 | })(jQuery); 49 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_en.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : EN 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['en'] = { 20 | itemsSelected_nil: 'No options selected', // 0 21 | itemsSelected: '{count} selected option', // 0, 1 22 | itemsSelected_plural: '{count} options selected', // n 23 | //itemsSelected_plural_two: ... // 2 24 | //itemsSelected_plural_few: ... // 3, 4 25 | itemsAvailable_nil: 'No items available', 26 | itemsAvailable: '{count} options available', 27 | itemsAvailable_plural: '{count} options available', 28 | //itemsAvailable_plural_two: ... 29 | //itemsAvailable_plural_few: ... 30 | itemsFiltered_nil: 'No options found', 31 | itemsFiltered: '{count} option found', 32 | itemsFiltered_plural: '{count} options found', 33 | //itemsFiltered_plural_two: ... 34 | //itemsFiltered_plural_few: ... 35 | selectAll: 'Select All', 36 | deselectAll: 'Deselect All', 37 | search: 'Search Options', 38 | collapseGroup: 'Collapse Group', 39 | expandGroup: 'Expand Group', 40 | selectAllGroup: 'Select All Group', 41 | deselectAllGroup: 'Deselect All Group' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['en_CA'] = $.uix.multiselect.i18n['en']; 46 | $.uix.multiselect.i18n['en_GB'] = $.uix.multiselect.i18n['en']; 47 | $.uix.multiselect.i18n['en_US'] = $.uix.multiselect.i18n['en']; 48 | // ... 49 | 50 | })(jQuery); 51 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_ru.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : RU 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['ru'] = { 20 | itemsSelected_nil: 'Варианты не выбраны', // 0 21 | itemsSelected: 'Выбран 1 вариант', // 1 22 | itemsSelected_plural: 'Выбрано {count} вариантов', // n 23 | itemsSelected_plural_two: 'Выбрано 2 варианта', // 2 24 | itemsSelected_plural_few: 'Выбрано {count} варианта',// 3, 4 25 | itemsAvailable_nil: 'Нет вариантов для выбора', 26 | itemsAvailable: 'Доступен один вариант', 27 | itemsAvailable_plural: 'Доступно {count} вариантов', 28 | itemsAvailable_plural_two: 'Доступно 2 варианта', 29 | itemsAvailable_plural_few: 'Доступно {count} варианта', 30 | itemsFiltered_nil: 'Нет отфильтрованных вариантов', 31 | itemsFiltered: 'Отфильтрован 1 вариант', 32 | itemsFiltered_plural: 'Отфильтровано {count} вариантов', 33 | itemsFiltered_plural_two: 'Отфильтровано 2 варианта', 34 | itemsFiltered_plural_few: 'Отфильтровано {count} варианта', 35 | selectAll: 'Выбрать все', 36 | deselectAll: 'Отменить выбор для всех', 37 | search: 'Поиск...', 38 | collapseGroup: 'Свернуть группу', 39 | expandGroup: 'Развернуть группу', 40 | selectAllGroup: 'Выбрать всю группу', 41 | deselectAllGroup: 'Отменить выбор группы' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['ru_RU'] = $.uix.multiselect.i18n['ru']; 46 | 47 | })(jQuery); 48 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_es.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : ES 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['es'] = { 20 | itemsSelected_nil: 'no hay opciones seleccionadas', // 0 21 | itemsSelected: '{count} opción seleccionada', // 0, 1 22 | itemsSelected_plural: '{count} opciones seleccionadas', // n 23 | //itemsSelected_plural_two: ... // 2 24 | //itemsSelected_plural_few: ... // 3, 4 25 | itemsAvailable_nil: 'no hay opciones disponibles', 26 | itemsAvailable: '{count} opción disponible', 27 | itemsAvailable_plural: '{count} opciones disponibles', 28 | //itemsAvailable_plural_two: ... 29 | //itemsAvailable_plural_few: ... 30 | itemsFiltered_nil: 'ninguna opción filtrada', 31 | itemsFiltered: '{count} opción filtrada', 32 | itemsFiltered_plural: '{count} opciones filtradas', 33 | //itemsFiltered_plural_two: ... 34 | //itemsFiltered_plural_few: ... 35 | selectAll: 'Seleccionar Todo', 36 | deselectAll: 'Deseleccionar Todo', 37 | search: 'Buscar opciones', 38 | collapseGroup: 'Plegar Grupo', 39 | expandGroup: 'Expandir Grupo', 40 | selectAllGroup: 'Seleccionar Grupo Entero', 41 | deselectAllGroup: 'Deseleccionar Grupo Entero' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['es_ES'] = $.uix.multiselect.i18n['es']; 46 | $.uix.multiselect.i18n['es_AR'] = $.uix.multiselect.i18n['es']; 47 | // ... 48 | 49 | })(jQuery); 50 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_pt.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * Translation: Alexander Bulei 7 | * 8 | * Dual licensed under the MIT (MIT-LICENSE.txt) 9 | * and GPL (GPL-LICENSE.txt) licenses. 10 | * 11 | * http://mind2soft.com/labs/jquery/multiselect/ 12 | * 13 | * 14 | * Localization : PT 15 | * 16 | */ 17 | 18 | (function($) { 19 | 20 | $.uix.multiselect.i18n['pt'] = { 21 | itemsSelected_nil: 'Nenhuma opção selecionada', // 0 22 | itemsSelected: '{count} opção seleccionada', // 0, 1 23 | itemsSelected_plural: '{count} opções seleccionadas', // n 24 | //itemsSelected_plural_two: ... // 2 25 | //itemsSelected_plural_few: ... // 3, 4 26 | itemsAvailable_nil: 'Nenhuma opção disponível', 27 | itemsAvailable: '{count} opção disponível', 28 | itemsAvailable_plural: '{count} opções disponíveis', 29 | //itemsAvailable_plural_two: ... 30 | //itemsAvailable_plural_few: ... 31 | itemsFiltered_nil: 'Nenhuma opção filtrada', 32 | itemsFiltered: '{count} opção filtrada', 33 | itemsFiltered_plural: '{count} opções filtradas', 34 | //itemsFiltered_plural_two: ... 35 | //itemsFiltered_plural_few: ... 36 | selectAll: 'Seleccionar todos', 37 | deselectAll: 'Desseleccionar todos', 38 | search: 'Opções de pesquisa', 39 | collapseGroup: 'Ocultar grupo', 40 | expandGroup: 'Expandir grupo', 41 | selectAllGroup: 'Seleccionar grupo', 42 | deselectAllGroup: 'Desseleccionar grupo' 43 | }; 44 | 45 | // link locales 46 | $.uix.multiselect.i18n['pt_PT'] = $.uix.multiselect.i18n['pt']; 47 | $.uix.multiselect.i18n['pt_BR'] = $.uix.multiselect.i18n['pt']; 48 | // ... 49 | 50 | })(jQuery); 51 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_fr.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : FR 14 | * 15 | */ 16 | 17 | (function($) { 18 | 19 | $.uix.multiselect.i18n['fr'] = { 20 | itemsSelected_nil: 'aucune option sélectionnée', // 0 21 | itemsSelected: '{count} option sélectionnée', // 0, 1 22 | itemsSelected_plural: '{count} options sélectionnées', // n 23 | //itemsSelected_plural_two: ... // 2 24 | //itemsSelected_plural_few: ... // 3, 4 25 | itemsAvailable_nil: 'aucune option disponible', 26 | itemsAvailable: '{count} option disponible', 27 | itemsAvailable_plural: '{count} options disponibles', 28 | //itemsAvailable_plural_two: ... 29 | //itemsAvailable_plural_few: ... 30 | itemsFiltered_nil: 'aucune option masquée', 31 | itemsFiltered: '{count} option masquée', 32 | itemsFiltered_plural: '{count} options masquées', 33 | //itemsFiltered_plural_two: ... 34 | //itemsFiltered_plural_few: ... 35 | selectAll: 'Sélectionner tout', 36 | deselectAll: 'Désélectionner tout', 37 | search: 'Rechercher les options', 38 | collapseGroup: 'Masquer le groupe', 39 | expandGroup: 'Afficher le groupe', 40 | selectAllGroup: 'Sélectionner tout le groupe', 41 | deselectAllGroup: 'Déselectionner tout le groupe' 42 | }; 43 | 44 | // link locales 45 | $.uix.multiselect.i18n['fr_CA'] = $.uix.multiselect.i18n['fr']; 46 | $.uix.multiselect.i18n['fr_FR'] = $.uix.multiselect.i18n['fr']; 47 | // ... 48 | 49 | })(jQuery); 50 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_it.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * Manuel Dalla Lana (endelwar[at]aregar[dot]it) 7 | * 8 | * Dual licensed under the MIT (MIT-LICENSE.txt) 9 | * and GPL (GPL-LICENSE.txt) licenses. 10 | * 11 | * http://mind2soft.com/labs/jquery/multiselect/ 12 | * 13 | * 14 | * Localization : IT 15 | * 16 | */ 17 | 18 | (function($) { 19 | 20 | $.uix.multiselect.i18n['it'] = { 21 | itemsSelected_nil: 'nessuna opzione selezionata', // 0 22 | itemsSelected: '{count} opzione selezionata', // 0, 1 23 | itemsSelected_plural: '{count} opzioni selezionate', // n 24 | //itemsSelected_plural_two: ... // 2 25 | //itemsSelected_plural_few: ... // 3, 4 26 | itemsAvailable_nil: 'nessuna opzione disponibile', 27 | itemsAvailable: '{count} opzione disponibile', 28 | itemsAvailable_plural: '{count} opzioni disponibili', 29 | //itemsAvailable_plural_two: ... 30 | //itemsAvailable_plural_few: ... 31 | itemsFiltered_nil: 'nessuna opzione filtrata', 32 | itemsFiltered: '{count} opzione filtrata', 33 | itemsFiltered_plural: '{count} opzioni filtrate', 34 | //itemsFiltered_plural_two: ... 35 | //itemsFiltered_plural_few: ... 36 | selectAll: 'Seleziona Tutto', 37 | deselectAll: 'Deseleziona Tutto', 38 | search: 'Cerca Opzioni', 39 | collapseGroup: 'Collassa Gruppo', 40 | expandGroup: 'Espandi Gruppo', 41 | selectAllGroup: 'Seleziona Tutto il Gruppo', 42 | deselectAllGroup: 'Deseleziona Tutto il Gruppo' 43 | }; 44 | 45 | // link locales 46 | $.uix.multiselect.i18n['it_IT'] = $.uix.multiselect.i18n['it']; 47 | $.uix.multiselect.i18n['it_CH'] = $.uix.multiselect.i18n['it']; 48 | // ... 49 | 50 | })(jQuery); 51 | -------------------------------------------------------------------------------- /support/multiselect-select2/release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | echo -n "Enter the version for this release: " 5 | 6 | read ver 7 | 8 | if [ ! $ver ]; then 9 | echo "Invalid version." 10 | exit 11 | fi 12 | 13 | name="select2" 14 | js="$name.js" 15 | mini="$name.min.js" 16 | css="$name.css" 17 | release="$name-$ver" 18 | tag="$ver" 19 | branch="build-$ver" 20 | curbranch=`git branch | grep "*" | sed "s/* //"` 21 | timestamp=$(date) 22 | tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g" 23 | remote="origin" 24 | 25 | echo "Pulling from origin" 26 | 27 | git pull 28 | 29 | echo "Updating Version Identifiers" 30 | 31 | sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json 32 | 33 | git add bower.json 34 | git add select2.jquery.json 35 | git add component.json 36 | git add composer.json 37 | git add package.json 38 | 39 | git commit -m "modified version identifiers in descriptors for release $ver" 40 | git push 41 | 42 | git branch "$branch" 43 | git checkout "$branch" 44 | 45 | echo "Tokenizing..." 46 | 47 | find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {} 48 | find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {} 49 | 50 | sed -e "s/latest/$ver/g" -i -- bower.json 51 | 52 | git add "$js" 53 | git add "$css" 54 | 55 | echo "Minifying..." 56 | 57 | echo "/*" > "$mini" 58 | cat LICENSE | sed "$tokens" >> "$mini" 59 | echo "*/" >> "$mini" 60 | 61 | curl -s \ 62 | --data-urlencode "js_code@$js" \ 63 | http://marijnhaverbeke.nl/uglifyjs \ 64 | >> "$mini" 65 | 66 | git add "$mini" 67 | 68 | git commit -m "release $ver" 69 | 70 | echo "Tagging..." 71 | git tag -a "$tag" -m "tagged version $ver" 72 | git push "$remote" --tags 73 | 74 | echo "Cleaning Up..." 75 | 76 | git checkout "$curbranch" 77 | git branch -D "$branch" 78 | 79 | echo "Done" 80 | -------------------------------------------------------------------------------- /support/multiselect-flat/js/locales/jquery.uix.multiselect_de.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jQuery UI Multiselect 2.0 3 | * 4 | * Authors: 5 | * Yanick Rochon (yanick.rochon[at]gmail[dot]com) 6 | * 7 | * Dual licensed under the MIT (MIT-LICENSE.txt) 8 | * and GPL (GPL-LICENSE.txt) licenses. 9 | * 10 | * http://mind2soft.com/labs/jquery/multiselect/ 11 | * 12 | * 13 | * Localization : DE 14 | */ 15 | 16 | (function($) { 17 | 18 | $.uix.multiselect.i18n['de'] = { 19 | itemsSelected_nil: 'keine Option ausgewählt', // 0 20 | itemsSelected: 'eine Option ausgewählt', // 0, 1 21 | itemsSelected_plural: '{count} Optionen ausgewählt', // n 22 | itemsSelected_plural_two: '2 Optionen ausgewählt', // 2 23 | itemsSelected_plural_few: '{count} Optionen ausgewählt', // 3, 4 24 | itemsAvailable_nil: 'keine Option verfügbar', 25 | itemsAvailable: 'eine Option verfügbar', 26 | itemsAvailable_plural: '{count} Optionen verfügbar', 27 | itemsAvailable_plural_two: '2 Optionen verfügbar', 28 | itemsAvailable_plural_few: '{count} Optionen verfügbar', 29 | itemsFiltered_nil: 'keine Option gefiltert', 30 | itemsFiltered: 'eine Option gefiltert', 31 | itemsFiltered_plural: '{count} Optionen gefiltert', 32 | itemsFiltered_plural_two: '2 Optionen gefiltert', 33 | itemsFiltered_plural_few: '{count} Optionen gefiltert', 34 | selectAll: 'Alle Optionen auswählen', 35 | deselectAll: 'Komplette Auswahl aufheben', 36 | search: 'Suchen', 37 | collapseGroup: 'Gruppe ausblenden', 38 | expandGroup: 'Gruppe anzeigen', 39 | selectAllGroup: 'Gruppe auswählen', 40 | deselectAllGroup: 'Gruppenauswahl aufheben' 41 | }; 42 | 43 | // link locales 44 | $.uix.multiselect.i18n['de_DE'] = $.uix.multiselect.i18n['de']; 45 | $.uix.multiselect.i18n['de_CH'] = $.uix.multiselect.i18n['de']; 46 | $.uix.multiselect.i18n['de_AT'] = $.uix.multiselect.i18n['de']; 47 | // ... 48 | 49 | })(jQuery); 50 | -------------------------------------------------------------------------------- /support/multiselect-flat/css/jquery.uix.multiselect.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .uix-multiselect-original { position: absolute; left:-999999px; } 4 | .uix-multiselect { position: relative; float:left; } 5 | .uix-multiselect .multiselect-selected-list, .uix-multiselect .multiselect-available-list { position:absolute; overflow:hidden; } 6 | .uix-multiselect .ui-widget-header { overflow:hidden; white-space:nowrap; padding:2px 4px; } 7 | .uix-multiselect .ui-widget-header div.header-text { white-space: nowrap; } 8 | .uix-multiselect .ui-widget-header .uix-control-right, .uix-multiselect .ui-widget-header .uix-control-left { width:16px; height:16px; } 9 | .uix-multiselect .ui-widget-header .uix-control-right { float:right; } 10 | .uix-multiselect .ui-widget-header .uix-control-left { float:left; } 11 | .uix-multiselect .ui-widget-header .uix-search { float:right; height:14px; font-size:80%; } 12 | .uix-multiselect .uix-list-container { position:relative; overflow:auto; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } 13 | .uix-multiselect .uix-list-container .ui-priority-secondary { padding-right:0; } 14 | .uix-multiselect .group-element { position:relative; padding-left:0; white-space:nowrap; overflow:hidden; } 15 | .uix-multiselect .group-element-collapsable { padding-left:16px; } 16 | .uix-multiselect .group-element span.collapse-handle { position:absolute; margin-top:-8px; top:50%; left:0; } 17 | .uix-multiselect .group-element .label { margin:0 3px; white-space:nowrap; overflow:hidden; } 18 | .uix-multiselect .group-element .ui-icon { float:left; cursor:pointer; } 19 | .uix-multiselect .option-element, .dragged-element { cursor:pointer; padding:0 2px; } 20 | .uix-multiselect .option-element.ui-state-disabled { font-style:italic; } 21 | .dragged-element, .dragged-grouped-element { padding:1px 3px; } 22 | .dragged-grouped-element { padding-left:16px; } 23 | .uix-multiselect .grouped-option { position:relative; padding-left:16px } 24 | .uix-multiselect .grouped-option .ui-icon { position:absolute; left:0; } 25 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_sk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Slovak translation. 3 | * 4 | * Author: David Vallner 5 | */ 6 | (function ($) { 7 | "use strict"; 8 | // use text for the numbers 2 through 4 9 | var smallNumbers = { 10 | 2: function(masc) { return (masc ? "dva" : "dve"); }, 11 | 3: function() { return "tri"; }, 12 | 4: function() { return "štyri"; } 13 | }; 14 | $.fn.select2.locales['sk'] = { 15 | formatNoMatches: function () { return "Nenašli sa žiadne položky"; }, 16 | formatInputTooShort: function (input, min) { 17 | var n = min - input.length; 18 | if (n == 1) { 19 | return "Prosím, zadajte ešte jeden znak"; 20 | } else if (n <= 4) { 21 | return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; 22 | } else { 23 | return "Prosím, zadajte ešte ďalších "+n+" znakov"; 24 | } 25 | }, 26 | formatInputTooLong: function (input, max) { 27 | var n = input.length - max; 28 | if (n == 1) { 29 | return "Prosím, zadajte o jeden znak menej"; 30 | } else if (n >= 2 && n <= 4) { 31 | return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej"; 32 | } else { 33 | return "Prosím, zadajte o "+n+" znakov menej"; 34 | } 35 | }, 36 | formatSelectionTooBig: function (limit) { 37 | if (limit == 1) { 38 | return "Môžete zvoliť len jednu položku"; 39 | } else if (limit >= 2 && limit <= 4) { 40 | return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky"; 41 | } else { 42 | return "Môžete zvoliť najviac "+limit+" položiek"; 43 | } 44 | }, 45 | formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; }, 46 | formatSearching: function () { return "Vyhľadávanie…"; } 47 | }; 48 | 49 | $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']); 50 | })(jQuery); 51 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_cs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Czech translation. 3 | * 4 | * Author: Michal Marek 5 | * Author - sklonovani: David Vallner 6 | */ 7 | (function ($) { 8 | "use strict"; 9 | // use text for the numbers 2 through 4 10 | var smallNumbers = { 11 | 2: function(masc) { return (masc ? "dva" : "dvě"); }, 12 | 3: function() { return "tři"; }, 13 | 4: function() { return "čtyři"; } 14 | } 15 | $.fn.select2.locales['cs'] = { 16 | formatNoMatches: function () { return "Nenalezeny žádné položky"; }, 17 | formatInputTooShort: function (input, min) { 18 | var n = min - input.length; 19 | if (n == 1) { 20 | return "Prosím zadejte ještě jeden znak"; 21 | } else if (n <= 4) { 22 | return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky"; 23 | } else { 24 | return "Prosím zadejte ještě dalších "+n+" znaků"; 25 | } 26 | }, 27 | formatInputTooLong: function (input, max) { 28 | var n = input.length - max; 29 | if (n == 1) { 30 | return "Prosím zadejte o jeden znak méně"; 31 | } else if (n <= 4) { 32 | return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně"; 33 | } else { 34 | return "Prosím zadejte o "+n+" znaků méně"; 35 | } 36 | }, 37 | formatSelectionTooBig: function (limit) { 38 | if (limit == 1) { 39 | return "Můžete zvolit jen jednu položku"; 40 | } else if (limit <= 4) { 41 | return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky"; 42 | } else { 43 | return "Můžete zvolit maximálně "+limit+" položek"; 44 | } 45 | }, 46 | formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; }, 47 | formatSearching: function () { return "Vyhledávání…"; } 48 | }; 49 | 50 | $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']); 51 | })(jQuery); 52 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2_locale_pl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Select2 Polish translation. 3 | * 4 | * @author Jan Kondratowicz 5 | * @author Uriy Efremochkin 6 | * @author Michał Połtyn 7 | * @author Damian Zajkowski 8 | */ 9 | (function($) { 10 | "use strict"; 11 | 12 | $.fn.select2.locales['pl'] = { 13 | formatNoMatches: function() { 14 | return "Brak wyników"; 15 | }, 16 | formatInputTooShort: function(input, min) { 17 | return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); 18 | }, 19 | formatInputTooLong: function(input, max) { 20 | return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); 21 | }, 22 | formatSelectionTooBig: function(limit) { 23 | return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); 24 | }, 25 | formatLoadMore: function(pageNumber) { 26 | return "Ładowanie wyników…"; 27 | }, 28 | formatSearching: function() { 29 | return "Szukanie…"; 30 | } 31 | }; 32 | 33 | $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']); 34 | 35 | function character(n, word, pluralSuffix) { 36 | //Liczba pojedyncza - brak suffiksu 37 | //jeden znak 38 | //jeden element 39 | var suffix = ''; 40 | if (n > 1 && n < 5) { 41 | //Liczaba mnoga ilość od 2 do 4 - własny suffiks 42 | //Dwa znaki, trzy znaki, cztery znaki. 43 | //Dwa elementy, trzy elementy, cztery elementy 44 | suffix = pluralSuffix; 45 | } else if (n == 0 || n >= 5) { 46 | //Ilość 0 suffiks ów 47 | //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości) 48 | //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków. 49 | //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów. 50 | suffix = 'ów'; 51 | } 52 | return " " + n + " " + word + suffix; 53 | } 54 | })(jQuery); 55 | -------------------------------------------------------------------------------- /support/jquery.tablebodyscroll.css: -------------------------------------------------------------------------------- 1 | .tablebodyscroll-head { margin-bottom: 0 !important; border-bottom: none !important; } 2 | 3 | /* Hide the scrollbar on most platforms. Post-load Javascript adjusts the inner box a bit. */ 4 | .tablebodyscroll-scroller { position: relative; overflow: hidden; } 5 | .tablebodyscroll-scroller2 { position: absolute; overflow: scroll; top: 0; bottom: -17px; left: 0; right: -17px; } 6 | [dir="rtl"] .tablebodyscroll-scroller2 { left: -17px; right: 0; } 7 | .tablebodyscroll-scroller2::-webkit-scrollbar { display: none; } 8 | 9 | .tablebodyscroll-scroller3 { position: relative; } 10 | 11 | .tablebodyscroll-shadow-top .tablebodyscroll-scroller-shadow-top, .tablebodyscroll-shadow-both .tablebodyscroll-scroller-shadow-top { position: absolute; left: 0; right: 0; top: 0; height: 10px; background: rgba(0, 0, 0, 0.4); background: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0)); } 12 | .tablebodyscroll-shadow-bottom .tablebodyscroll-scroller-shadow-bottom, .tablebodyscroll-shadow-both .tablebodyscroll-scroller-shadow-bottom { position: absolute; left: 0; right: 0; bottom: 0; height: 10px; background: rgba(0, 0, 0, 0); background: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1)); } 13 | 14 | .tablebodyscroll-scroller-indicator { position: absolute; right: 0; height: 25px; width: 3px; background: #CCCCCC; transition: top .25s; } 15 | [dir="rtl"] .tablebodyscroll-scroller-indicator { right: auto; left: 0; } 16 | .tablebodyscroll-scroller-indicator-hide { opacity: 0; transition: opacity .5s linear; } 17 | .tablebodyscroll-scroller-indicator-show { opacity: 1; } 18 | 19 | .tablebodyscroll-has-head .tablebodyscroll-scroller3 > table { margin-top: 0 !important; border-top: none !important; } 20 | .tablebodyscroll-scroller3 > table > thead > tr { height: 0; } 21 | .tablebodyscroll-has-foot .tablebodyscroll-scroller3 > table { margin-bottom: 0 !important; border-bottom: none !important; } 22 | .tablebodyscroll-scroller3 > table > tfoot > tr { height: 0; } 23 | 24 | .tablebodyscroll-scroller3 th.tablebodyscroll-body-hide-cell, .tablebodyscroll-scroller3 td.tablebodyscroll-body-hide-cell { padding-top: 0 !important; padding-bottom: 0 !important; } 25 | .tablebodyscroll-scroller3 div.tablebodyscroll-body-hide-cell { height: 0; overflow: hidden; } 26 | 27 | .tablebodyscroll-foot { margin-top: 0 !important; border-top: none !important; } 28 | -------------------------------------------------------------------------------- /support/multiselect-flat/css/common.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | Copyright (c) 2007, Yahoo! Inc. All rights reserved. 4 | Code licensed under the BSD License: 5 | http://developer.yahoo.net/yui/license.txt 6 | version: 2.2.0 7 | */ 8 | body {font:13px 'Helvetica',arial,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;} 9 | body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}/*ol,ul {list-style:none;}*/caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;} 10 | 11 | /* end of yahoo reset and fonts */ 12 | 13 | body {color:#333; background: #232f2e; line-height:1.3;} 14 | p {margin:0 0 20px;} 15 | a {color:#636363;} 16 | a:hover {text-decoration:none;} 17 | strong {font-weight:bold;} 18 | em {font-style: italic;} 19 | h1,h2,h3,h4,h5,h6 {font-weight:bold;} 20 | h1 {font-size:197%; margin:30px 0; color: #4f6f6c;} 21 | h2 {font-size:174%; margin:20px 0; color:#4f6f6c;} 22 | h3 {font-size:152%; margin:10px 0;} 23 | h4 {font-size:129%; margin:10px 0;} 24 | pre {background:#eee; margin:0 0 20px; padding:20px; border:1px solid #ccc; font-size:100%; overflow:auto;} 25 | code {font-size:100%; margin:0; padding:0;} 26 | ul, ol {margin:10px 0 10px 25px;} 27 | ol li {margin:0 0 10px;} 28 | 29 | div#wrapper {background:#fff; width:560px; margin:0 auto; padding:20px; border:10px solid #0f1616; border-width:0 10px 10px 10px;} 30 | div#header {position:relative; border-bottom:1px dotted; margin:0 0 10px; padding:0 0 10px;} 31 | div#header p {margin:0; padding:0;} 32 | div#header h1 {margin:0; padding:0;} 33 | ul#nav {position:absolute; top:0; right:0; list-style:none; margin:0; padding:0;} 34 | ul#nav li {display:inline; padding:0 0 0 5px;} 35 | ul#nav li a {} 36 | div#content {} 37 | div#footer {margin:40px 0 0; border-top:1px dotted; padding:10px 0 0;} 38 | .left {float:left;} 39 | .right {float:right;} 40 | .clear {clear:both;} 41 | 42 | 43 | #content { width: 900px; margin: auto; padding: 1px 16px 64px 16px; background-color: white; } 44 | 45 | /* multiselect styles */ 46 | #switcher { 47 | 48 | } 49 | 50 | form {margin: 0; padding: 0;} 51 | -------------------------------------------------------------------------------- /support/multiselect-select2/select2-bootstrap.css: -------------------------------------------------------------------------------- 1 | .form-control .select2-choice { 2 | border: 0; 3 | border-radius: 2px; 4 | } 5 | 6 | .form-control .select2-choice .select2-arrow { 7 | border-radius: 0 2px 2px 0; 8 | } 9 | 10 | .form-control.select2-container { 11 | height: auto !important; 12 | padding: 0; 13 | } 14 | 15 | .form-control.select2-container.select2-dropdown-open { 16 | border-color: #5897FB; 17 | border-radius: 3px 3px 0 0; 18 | } 19 | 20 | .form-control .select2-container.select2-dropdown-open .select2-choices { 21 | border-radius: 3px 3px 0 0; 22 | } 23 | 24 | .form-control.select2-container .select2-choices { 25 | border: 0 !important; 26 | border-radius: 3px; 27 | } 28 | 29 | .control-group.warning .select2-container .select2-choice, 30 | .control-group.warning .select2-container .select2-choices, 31 | .control-group.warning .select2-container-active .select2-choice, 32 | .control-group.warning .select2-container-active .select2-choices, 33 | .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice, 34 | .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices, 35 | .control-group.warning .select2-container-multi.select2-container-active .select2-choices { 36 | border: 1px solid #C09853 !important; 37 | } 38 | 39 | .control-group.warning .select2-container .select2-choice div { 40 | border-left: 1px solid #C09853 !important; 41 | background: #FCF8E3 !important; 42 | } 43 | 44 | .control-group.error .select2-container .select2-choice, 45 | .control-group.error .select2-container .select2-choices, 46 | .control-group.error .select2-container-active .select2-choice, 47 | .control-group.error .select2-container-active .select2-choices, 48 | .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice, 49 | .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices, 50 | .control-group.error .select2-container-multi.select2-container-active .select2-choices { 51 | border: 1px solid #B94A48 !important; 52 | } 53 | 54 | .control-group.error .select2-container .select2-choice div { 55 | border-left: 1px solid #B94A48 !important; 56 | background: #F2DEDE !important; 57 | } 58 | 59 | .control-group.info .select2-container .select2-choice, 60 | .control-group.info .select2-container .select2-choices, 61 | .control-group.info .select2-container-active .select2-choice, 62 | .control-group.info .select2-container-active .select2-choices, 63 | .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice, 64 | .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices, 65 | .control-group.info .select2-container-multi.select2-container-active .select2-choices { 66 | border: 1px solid #3A87AD !important; 67 | } 68 | 69 | .control-group.info .select2-container .select2-choice div { 70 | border-left: 1px solid #3A87AD !important; 71 | background: #D9EDF7 !important; 72 | } 73 | 74 | .control-group.success .select2-container .select2-choice, 75 | .control-group.success .select2-container .select2-choices, 76 | .control-group.success .select2-container-active .select2-choice, 77 | .control-group.success .select2-container-active .select2-choices, 78 | .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice, 79 | .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices, 80 | .control-group.success .select2-container-multi.select2-container-active .select2-choices { 81 | border: 1px solid #468847 !important; 82 | } 83 | 84 | .control-group.success .select2-container .select2-choice div { 85 | border-left: 1px solid #468847 !important; 86 | background: #DFF0D8 !important; 87 | } 88 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Admin Pack with FlexForms Extras 2 | ================================ 3 | 4 | A PHP toolkit designed specifically for programmers to quickly create a nice-looking, custom-built, secure administrative web interface. Choose from a MIT or LGPL license. Proven to cut development time by at least 50% over traditional frameworks and template engines. But it isn't a CMS nor a framework or a template engine. Admin Pack is very different. Give it a go to power your next PHP-based administrative backend. 5 | 6 | Admin Pack with FlexForms Extras is the functionality of [Admin Pack](https://github.com/cubiclesoft/admin-pack) with the powerful extensions of [FlexForms Extras](https://github.com/cubiclesoft/php-flexforms-extras). 7 | 8 | [![Donate](https://cubiclesoft.com/res/donate-shield.png)](https://cubiclesoft.com/donate/) [![Discord](https://img.shields.io/discord/777282089980526602?label=chat&logo=discord)](https://cubiclesoft.com/product-support/github/) 9 | 10 | Features 11 | -------- 12 | 13 | * Quick-n-dirty custom administrative interface builder. [Live demo](https://barebonescms.com/demos/admin_pack/admin.php) 14 | * The default templates look nice enough. Gets the job done. 15 | * Integrated CSRF/XSRF defenses. 16 | * Date picker and fancy multiselect options. 17 | * Supports custom logos/favicon. 18 | * Reasonable size (~1MB). 19 | * Has a liberal open source license. MIT or LGPL, your choice. 20 | * Designed for relatively painless integration into your project. 21 | * Sits on GitHub for all of that pull request and issue tracker goodness to easily submit changes and ideas respectively. 22 | 23 | The Extras 24 | ---------- 25 | 26 | * Date picker - Adds a new field 'type' of 'date' and leverages the jQuery UI datepicker. 27 | * Accordion - Adds the jQuery UI accordion for grouping large sets of associated fields. 28 | * Multiselect tags - Adds select2 in tag mode for selecting multiple items. 29 | * Multiselect dropdown - Adds a jQuery UI widget for selecting multiple items. If jQuery UI is already loaded or a smaller interface is desired, it can be better than select2. 30 | * Multiselect flat - Adds a jQuery UI widget for selecting and reordering multiple items. 31 | * Table cards - Adds a jQuery plugin [TableCards](https://github.com/cubiclesoft/jquery-tablecards) that uses simple templates to convert tables to mobile-friendly cards on the client. Won't activate in layouts that don't support tables. 32 | * Table body scrolling - Adds a jQuery plugin [TableBodyScroll](https://github.com/cubiclesoft/jquery-tablebodyscroll) that enables a table's body to be displayed on one screen vertically. Won't activate in layouts that don't support tables. 33 | * Table row order - Adds drag-and-drop support to an injected column for the 'table' type. Won't activate in layouts that don't support tables. 34 | * Table sticky headers - Adds sticky header support to the header for the 'table' type. Won't activate in layouts that don't support tables. 35 | 36 | Getting Started 37 | --------------- 38 | 39 | Download or clone the latest software release. Transfer the files to a web server. 40 | 41 | Next, go over to the Admin Pack [Getting Started](https://github.com/cubiclesoft/admin-pack#getting-started) documentation for the rest of the quick start guide. 42 | 43 | Under the Hood 44 | -------------- 45 | 46 | Admin Pack with FlexForms Extras is a full integration that adds a custom jQuery UI themeroller theme plus a few custom style overrides to create a seamless experience with Admin Pack. 47 | 48 | Admin Pack uses [FlexForms](https://github.com/cubiclesoft/php-flexforms), which makes it easy to extend Admin Pack with custom functionality (see `support/view_print_layout.php`). For example, [FlexForms Modules](https://github.com/cubiclesoft/php-flexforms-modules) contains several official extensions (e.g. charts, HTML editor, character/word counter). 49 | -------------------------------------------------------------------------------- /support/multiselect-flat/README.md: -------------------------------------------------------------------------------- 1 | jQuery UIx Multiselect 2 | ================== 3 | Version 2.0 4 | 5 | ![Preview](http://mind2soft.com/labs/jquery/multiselect/preview.png) 6 | 7 | Introduction 8 | ------------ 9 | 10 | This widget is a complete rewrite of the [previous version](https://github.com/michael/multiselect). Why a new rewrite? Because the original widget's attempt was to create a all-in-one-out-of-the-box-multi-featured SELECT replacement and thus failed to be compliant with the DOMElement's behavior and limitations. Notably, it failed to : 11 | 12 | * update the option items when modifying the SELECT element directly 13 | * didn't support disabled items 14 | * didn't support item groups 15 | * etc. 16 | 17 | Also, it quickly became slow when loading a few hundred items and some branches had [drag](https://github.com/michael/multiselect/issues/91) [and](https://github.com/michael/multiselect/issues/124) [drop](https://github.com/michael/multiselect/issues/8) issues. 18 | 19 | Release notes 20 | ------------- 21 | 22 | This widget is stable enough to be used in staging environments. However it is *still* under development, in testing phase, as some features may require more feedbacks yet! (Mainly browser compatiblity.) At this point, expect minor bug fixes within 72 hours, and there will be no more features planned at this point. 23 | 24 | The compressed (minified) version is created using the [YUI Compressor](http://refresh-sf.com/yui/). 25 | 26 | Requirements 27 | ------------ 28 | 29 | * jQuery 1.8+ 30 | * jQuery UI 1.9+ 31 | 32 | Features 33 | -------- 34 | 35 | * Support for disabled options 36 | * Support for option groups 37 | * Option group collapsable 38 | * Draggable drop and/or sortable enabled 39 | * Mouse selection mode (click, dblclick) 40 | * Support for predefined or custom sort functions 41 | * Searchable 42 | * List layout and select direction (horizontal or vertical) 43 | * Custom item renderer 44 | 45 | 46 | Usage 47 | ----- 48 | 49 | **Note :** Even though it is a complete rewrite of the widget, I kept the `multiselect` widget name (but it is declared as `uix.multiselect` instead of [`ui.multiselect`](http://ajpiano.com/widgetfactory/#slide22)). 50 | 51 | $('selector').multiselect(); 52 | 53 | To programmatically select/deselect, add/modify/remove items, you may access and modify the DOMElement directly, then call the `refresh` widget method to update it. 54 | 55 | $('selector').append("") 56 | .multiselect('refresh'); 57 | 58 | // manually filter available options 59 | // This will only render visible the available items containing 'My Item' (case insensitive) 60 | $('selector').multiselect('search', 'my item'); 61 | 62 | $('selector').multiselect('destroy'); // restore original element 63 | 64 | See [wiki documentation](https://github.com/yanickrochon/jquery.uix.multiselect/wiki) for more information. 65 | 66 | 67 | TODO 68 | ---- 69 | 70 | * add custom item rendering support *(needs more tests)* 71 | * HTML5 ARIA attributes 72 | * Make all options as mutable as possible after initialization. 73 | * Test in all major browsers *(not fully tested)* 74 | * Mobile support 75 | * Code cleanup 76 | * etc. 77 | 78 | 79 | Limitations 80 | ----------- 81 | 82 | * When setting `sortable` option to `true`, options can only be reordered within their own groups. That is, an option cannot be 83 | reordered between two options of a different group. As this widget's purpose is not to extend the original element's behaviour 84 | beyound user interaction and presentation, this limitation shall not be lifted for the time being. 85 | * This widget was designed for modern browsers usage. It is working fine in IE7+, Firefox and Chrome. Note that it 86 | *will not work* in quirks mode. There will be little to no support for [non standards compliant browsers](http://www.ie6countdown.com/). 87 | -------------------------------------------------------------------------------- /support/str_basics.php: -------------------------------------------------------------------------------- 1 | $val) 10 | { 11 | if (is_string($val)) $_REQUEST[$key] = trim($val); 12 | else if (is_array($val)) 13 | { 14 | $_REQUEST[$key] = array(); 15 | foreach ($val as $key2 => $val2) $_REQUEST[$key][$key2] = (is_string($val2) ? trim($val2) : $val2); 16 | } 17 | else $_REQUEST[$key] = $val; 18 | } 19 | } 20 | 21 | // Cleans up all PHP input issues so that $_REQUEST may be used as expected. 22 | public static function ProcessAllInput() 23 | { 24 | self::ProcessSingleInput($_COOKIE); 25 | self::ProcessSingleInput($_GET); 26 | self::ProcessSingleInput($_POST); 27 | } 28 | 29 | public static function ExtractPathname($dirfile) 30 | { 31 | $dirfile = str_replace("\\", "/", $dirfile); 32 | $pos = strrpos($dirfile, "/"); 33 | if ($pos === false) $dirfile = ""; 34 | else $dirfile = substr($dirfile, 0, $pos + 1); 35 | 36 | return $dirfile; 37 | } 38 | 39 | public static function ExtractFilename($dirfile) 40 | { 41 | $dirfile = str_replace("\\", "/", $dirfile); 42 | $pos = strrpos($dirfile, "/"); 43 | if ($pos !== false) $dirfile = substr($dirfile, $pos + 1); 44 | 45 | return $dirfile; 46 | } 47 | 48 | public static function ExtractFileExtension($dirfile) 49 | { 50 | $dirfile = self::ExtractFilename($dirfile); 51 | $pos = strrpos($dirfile, "."); 52 | if ($pos !== false) $dirfile = substr($dirfile, $pos + 1); 53 | else $dirfile = ""; 54 | 55 | return $dirfile; 56 | } 57 | 58 | public static function ExtractFilenameNoExtension($dirfile) 59 | { 60 | $dirfile = self::ExtractFilename($dirfile); 61 | $pos = strrpos($dirfile, "."); 62 | if ($pos !== false) $dirfile = substr($dirfile, 0, $pos); 63 | 64 | return $dirfile; 65 | } 66 | 67 | // Makes an input filename safe for use. 68 | // Allows a very limited number of characters through. 69 | public static function FilenameSafe($filename) 70 | { 71 | return preg_replace('/\s+/', "-", trim(trim(preg_replace('/[^A-Za-z0-9_.\-]/', " ", $filename), "."))); 72 | } 73 | 74 | public static function ReplaceNewlines($replacewith, $data) 75 | { 76 | $data = str_replace("\r\n", "\n", $data); 77 | $data = str_replace("\r", "\n", $data); 78 | $data = str_replace("\n", $replacewith, $data); 79 | 80 | return $data; 81 | } 82 | 83 | public static function LineInput($data, &$pos) 84 | { 85 | $CR = ord("\r"); 86 | $LF = ord("\n"); 87 | 88 | $result = ""; 89 | $y = strlen($data); 90 | if ($pos > $y) $pos = $y; 91 | while ($pos < $y && ord($data[$pos]) != $CR && ord($data[$pos]) != $LF) 92 | { 93 | $result .= $data[$pos]; 94 | $pos++; 95 | } 96 | if ($pos + 1 < $y && ord($data[$pos]) == $CR && ord($data[$pos + 1]) == $LF) $pos++; 97 | if ($pos < $y) $pos++; 98 | 99 | return $result; 100 | } 101 | 102 | // Constant-time string comparison. Ported from CubicleSoft C++ code. 103 | public static function CTstrcmp($secret, $userinput) 104 | { 105 | $sx = 0; 106 | $sy = strlen($secret); 107 | $uy = strlen($userinput); 108 | $result = $sy - $uy; 109 | for ($ux = 0; $ux < $uy; $ux++) 110 | { 111 | $result |= ord($userinput[$ux]) ^ ord($secret[$sx]); 112 | $sx = ($sx + 1) % $sy; 113 | } 114 | 115 | return $result; 116 | } 117 | 118 | public static function ConvertUserStrToBytes($str) 119 | { 120 | $str = trim($str); 121 | $num = (double)$str; 122 | if (strtoupper(substr($str, -1)) == "B") $str = substr($str, 0, -1); 123 | switch (strtoupper(substr($str, -1))) 124 | { 125 | case "P": $num *= 1024; 126 | case "T": $num *= 1024; 127 | case "G": $num *= 1024; 128 | case "M": $num *= 1024; 129 | case "K": $num *= 1024; 130 | } 131 | 132 | return $num; 133 | } 134 | 135 | public static function ConvertBytesToUserStr($num) 136 | { 137 | $num = (double)$num; 138 | 139 | if ($num < 0) return "0 B"; 140 | if ($num < 1024) return number_format($num, 0) . " B"; 141 | if ($num < 1048576) return str_replace(".0 ", "", number_format($num / 1024, 1)) . " KB"; 142 | if ($num < 1073741824) return str_replace(".0 ", "", number_format($num / 1048576, 1)) . " MB"; 143 | if ($num < 1099511627776.0) return str_replace(".0 ", "", number_format($num / 1073741824.0, 1)) . " GB"; 144 | if ($num < 1125899906842624.0) return str_replace(".0 ", "", number_format($num / 1099511627776.0, 1)) . " TB"; 145 | 146 | return str_replace(".0 ", "", number_format($num / 1125899906842624.0, 1)) . " PB"; 147 | } 148 | 149 | public static function JSSafe($data) 150 | { 151 | return str_replace(array("'", "\r", "\n"), array("\\'", "\\r", "\\n"), $data); 152 | } 153 | } 154 | ?> -------------------------------------------------------------------------------- /support/jquery.stickytableheaders.min.js: -------------------------------------------------------------------------------- 1 | !function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.cachedHeaderHeight=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.setOptions(g),h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css({display:"none",opacity:0}),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a(''),h.$head.append(h.$printStyle)}),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.debounce=function(a,b){var c=null;return function(){var d=this,e=arguments;clearTimeout(c),c=setTimeout(function(){a.apply(d,e)},b)}},h.toggleHeaders=h.debounce(function(){h.$el&&h.$el.each(function(){var b,c=a(this),e=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),f=c.offset(),g=h.$scrollableArea.scrollTop()+e,i=h.$scrollableArea.scrollLeft(),j=h.options.cacheHeaderHeight?h.cachedHeaderHeight:h.$clonedHeader.height(),k=h.isWindowScrolling?g>f.top:e>f.top,l=(h.isWindowScrolling?g:0)a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},0),h.updateWidth=h.debounce(function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width()),h.options.cacheHeaderHeight&&(h.cachedHeaderHeight=h.$clonedHeader.height())}},0),h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing")){var g=f[0].getBoundingClientRect();e=g.width?g.width:g.right-g.left}else{var i=a("th",h.$originalHeader);if("collapse"===i.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var j=parseFloat(f.css("padding-left")),k=parseFloat(f.css("padding-right")),l=parseFloat(f.css("border-width"));e=f.outerWidth()-j-k-l}else e=f.width()}d[c]=e}),d},h.setWidth=function(a,b,c){b.each(function(b){var d=a[b];c.eq(b).css({"min-width":d,"max-width":d})})},h.resetWidth=function(b,c){b.each(function(b){var d=a(this);c.eq(b).css({"min-width":d.css("min-width"),"max-width":d.css("max-width")})})},h.setOptions=function(b){h.options=a.extend({},f,b),h.$window=a(h.options.objWindow),h.$head=a(h.options.objHead),h.$document=a(h.options.objDocument),h.$scrollableArea=a(h.options.scrollableArea),h.isWindowScrolling=h.$scrollableArea[0]===h.$window[0]},h.updateOptions=function(a){h.setOptions(a),h.unbind(),h.bind(),h.updateWidth(),h.toggleHeaders()},h.init()}var d="stickyTableHeaders",e=0,f={fixedOffset:0,leftOffset:0,marginTop:0,objDocument:document,objHead:"head",objWindow:b,scrollableArea:b,cacheHeaderHeight:!1};a.fn[d]=function(b){return this.each(function(){var e=a.data(this,"plugin_"+d);e?"string"==typeof b?e[b].apply(e):e.updateOptions(b):"destroy"!==b&&a.data(this,"plugin_"+d,new c(this,b))})}}(jQuery,window); -------------------------------------------------------------------------------- /support/multiselect-select2/README.md: -------------------------------------------------------------------------------- 1 | Select2 2 | ======= 3 | 4 | Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. 5 | 6 | To get started, checkout examples and documentation at http://select2.github.io/select2/ 7 | 8 | Use cases 9 | --------- 10 | 11 | * Enhancing native selects with search. 12 | * Enhancing native selects with a better multi-select interface. 13 | * Loading data from JavaScript: easily load items via ajax and have them searchable. 14 | * Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction. 15 | * Tagging: ability to add new items on the fly. 16 | * Working with large, remote datasets: ability to partially load a dataset based on the search term. 17 | * Paging of large datasets: easy support for loading more pages when the results are scrolled to the end. 18 | * Templating: support for custom rendering of results and selections. 19 | 20 | Browser compatibility 21 | --------------------- 22 | * IE 8+ 23 | * Chrome 8+ 24 | * Firefox 10+ 25 | * Safari 3+ 26 | * Opera 10.6+ 27 | 28 | Usage 29 | ----- 30 | You can source Select2 directly from a CDN like [jsDelivr](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/select2/select2/tags), or use one of the integrations below. 31 | 32 | Integrations 33 | ------------ 34 | 35 | * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org)) 36 | * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails) 37 | * [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/)) 38 | * [Django](https://github.com/applegrew/django-select2) 39 | * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin) 40 | * [Symfony2](https://github.com/avocode/FormExtensions) 41 | * [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins) 42 | * [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/)) 43 | * [Meteor](https://jquery-select2.meteor.com) 44 | * [Yii 2.x](http://demos.krajee.com/widgets#select2) 45 | * [Yii 1.x](https://github.com/tonybolzan/yii-select2) 46 | * [AtmosphereJS](https://atmospherejs.com/package/jquery-select2) 47 | * [EmberJS](https://github.com/iStefo/ember-select-2) 48 | 49 | ### Example Integrations 50 | 51 | * [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration) 52 | * [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration) 53 | * [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example) 54 | * [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example) 55 | 56 | Internationalization (i18n) 57 | --------------------------- 58 | 59 | Select2 supports multiple languages by simply including the right language JS 60 | file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`. 61 | 62 | Missing a language? Just copy `select2_locale_en.js.template`, translate 63 | it, and make a pull request back to Select2 here on GitHub. 64 | 65 | Documentation 66 | ------------- 67 | 68 | The documentation for Select2 is available [through GitHub Pages](http://select2.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages). 69 | 70 | Community 71 | --------- 72 | 73 | ### Bug tracker 74 | 75 | Have a bug? Please create an issue here on GitHub! 76 | 77 | https://github.com/ivaynberg/select2/issues 78 | 79 | ### Mailing list 80 | 81 | Have a question? Ask on our mailing list! 82 | 83 | select2@googlegroups.com 84 | 85 | https://groups.google.com/d/forum/select2 86 | 87 | ### IRC channel 88 | 89 | Need help implementing Select2 in your project? Ask in our IRC channel! 90 | 91 | **Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`) 92 | 93 | **Channel:** `#select2` 94 | 95 | **Web access:** https://webchat.freenode.net/?channels=select2 96 | 97 | Copyright and license 98 | --------------------- 99 | 100 | Copyright 2015 Igor Vaynberg 101 | 102 | This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU 103 | General Public License version 2 (the "GPL License"). You may choose either license to govern your 104 | use of this software only upon the condition that you accept all of the terms of either the Apache 105 | License or the GPL License. 106 | 107 | You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at: 108 | 109 | http://www.apache.org/licenses/LICENSE-2.0 110 | http://www.gnu.org/licenses/gpl-2.0.html 111 | 112 | Unless required by applicable law or agreed to in writing, software distributed under the Apache License 113 | or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 114 | either express or implied. See the Apache License and the GPL License for the specific language governing 115 | permissions and limitations under the Apache License and the GPL License. 116 | -------------------------------------------------------------------------------- /support/multiselect-select2/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing to Select2 2 | ======================= 3 | Looking to contribute something to Select2? **Here's how you can help.** 4 | 5 | Please take a moment to review this document in order to make the contribution 6 | process easy and effective for everyone involved. 7 | 8 | Following these guidelines helps to communicate that you respect the time of 9 | the developers managing and developing this open source project. In return, 10 | they should reciprocate that respect in addressing your issue or assessing 11 | patches and features. 12 | 13 | Using the issue tracker 14 | ----------------------- 15 | When [reporting bugs][reporting-bugs] or 16 | [requesting features][requesting-features], the 17 | [issue tracker on GitHub][issue-tracker] is the recommended channel to use. 18 | 19 | The issue tracker **is not** a place for support requests. The 20 | [mailing list][mailing-list] or [IRC channel][irc-channel] are better places to 21 | get help. 22 | 23 | Reporting bugs with Select2 24 | --------------------------- 25 | We really appreciate clear bug reports that _consistently_ show an issue 26 | _within Select2_. 27 | 28 | The ideal bug report follows these guidelines: 29 | 30 | 1. **Use the [GitHub issue search][issue-search]** — Check if the issue 31 | has already been reported. 32 | 2. **Check if the issue has been fixed** — Try to reproduce the problem 33 | using the code in the `master` branch. 34 | 3. **Isolate the problem** — Try to create an 35 | [isolated test case][isolated-case] that consistently reproduces the problem. 36 | 37 | Please try to be as detailed as possible in your bug report, especially if an 38 | isolated test case cannot be made. Some useful questions to include the answer 39 | to are: 40 | 41 | - What steps can be used to reproduce the issue? 42 | - What is the bug and what is the expected outcome? 43 | - What browser(s) and Operating System have you tested with? 44 | - Does the bug happen consistently across all tested browsers? 45 | - What version of jQuery are you using? And what version of Select2? 46 | - Are you using Select2 with other plugins? 47 | 48 | All of these questions will help people fix and identify any potential bugs. 49 | 50 | Requesting features in Select2 51 | ------------------------------ 52 | Select2 is a large library that carries with it a lot of functionality. Because 53 | of this, many feature requests will not be implemented in the core library. 54 | 55 | Before starting work on a major feature for Select2, **contact the 56 | [community][community] first** or you may risk spending a considerable amount of 57 | time on something which the project developers are not interested in bringing 58 | into the project. 59 | 60 | ### Select2 4.0 61 | 62 | Many feature requests will be closed off until 4.0, where Select2 plans to adopt 63 | a more flexible API. If you are interested in helping with the development of 64 | the next major Select2 release, please send a message to the 65 | [mailing list][mailing-list] or [irc channel][irc-channel] for more information. 66 | 67 | Triaging issues and pull requests 68 | --------------------------------- 69 | Anyone can help the project maintainers triage issues and review pull requests. 70 | 71 | ### Handling new issues 72 | 73 | Select2 regularly receives new issues which need to be tested and organized. 74 | 75 | When a new issue that comes in that is similar to another existing issue, it 76 | should be checked to make sure it is not a duplicate. Duplicates issues should 77 | be marked by replying to the issue with "Duplicate of #[issue number]" where 78 | `[issue number]` is the url or issue number for the existing issue. This will 79 | allow the project maintainers to quickly close off additional issues and keep 80 | the discussion focused within a single issue. 81 | 82 | If you can test issues that are reported to Select2 that contain test cases and 83 | confirm under what conditions bugs happen, that will allow others to identify 84 | what causes a bug quicker. 85 | 86 | ### Reviewing pull requests 87 | 88 | It is very common for pull requests to be opened for issues that contain a clear 89 | solution to the problem. These pull requests should be rigorously reviewed by 90 | the community before being accepted. If you are not sure about a piece of 91 | submitted code, or know of a better way to do something, do not hesitate to make 92 | a comment on the pull request. 93 | 94 | It should also be made clear that **all code contributed to Select** must be 95 | licensable under the [Apache 2 or GPL 2 licenses][licensing]. Code that cannot 96 | be released under either of these licenses **cannot be accepted** into the 97 | project. 98 | 99 | [community]: https://github.com/ivaynberg/select2#community 100 | [reporting-bugs]: #reporting-bugs-with-select2 101 | [requesting-features]: #requesting-features-in-select2 102 | [issue-tracker]: https://github.com/ivaynberg/select2/issues 103 | [mailing-list]: https://github.com/ivaynberg/select2#mailing-list 104 | [irc-channel]: https://github.com/ivaynberg/select2#irc-channel 105 | [issue-search]: https://github.com/ivaynberg/select2/search?q=&type=Issues 106 | [isolated-case]: http://css-tricks.com/6263-reduced-test-cases/ 107 | [licensing]: https://github.com/ivaynberg/select2#copyright-and-license 108 | -------------------------------------------------------------------------------- /support/view_print_layout.php: -------------------------------------------------------------------------------- 1 | 20 |
21 | 32 |
33 | 39 |
40 | 46 |
47 | 55 |
56 | 61 |
62 | 65 |
66 | 77 |
78 | 95 | 96 | $val) 98 | { 99 | if ($val != "" || !$compact) 100 | { 101 | ?> 102 | 103 | 107 |
\n", htmlspecialchars($val)) : $val); ?>
108 | 121 |
\n", htmlspecialchars($field["value"])) : $field["value"]); ?>
122 | 150 | 151 | 152 | 153 | @TITLE@ 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 |
162 |
@ROOTNAME@
163 |
164 |
165 | @CONTENT@ 166 |
167 |
168 | 169 |
170 | 171 | 172 | @MENU@', "", $bb_page_layout); 177 | ?> -------------------------------------------------------------------------------- /support/multiselect-widget/jquery.multiselect.filter.js: -------------------------------------------------------------------------------- 1 | /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ 2 | /* 3 | * jQuery MultiSelect UI Widget Filtering Plugin 2.0.0 4 | * Copyright (c) 2012 Eric Hynds 5 | * 6 | * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ 7 | * 8 | * Depends: 9 | * - jQuery UI MultiSelect widget 10 | * 11 | * Dual licensed under the MIT and GPL licenses: 12 | * http://www.opensource.org/licenses/mit-license.php 13 | * http://www.gnu.org/licenses/gpl.html 14 | * 15 | */ 16 | (function($) { 17 | var rEscape = /[\-\[\]{}()*+?.,\\\^$|#\s]/g; 18 | 19 | //Courtesy of underscore.js 20 | function debounce(func, wait, immediate) { 21 | var timeout; 22 | return function() { 23 | var context = this, args = arguments; 24 | var later = function() { 25 | timeout = null; 26 | if (!immediate) { 27 | func.apply(context, args); 28 | } 29 | }; 30 | var callNow = immediate && !timeout; 31 | clearTimeout(timeout); 32 | timeout = setTimeout(later, wait); 33 | if (callNow) { 34 | func.apply(context, args); 35 | } 36 | }; 37 | } 38 | 39 | $.widget('ech.multiselectfilter', { 40 | 41 | options: { 42 | label: 'Filter:', 43 | width: null, /* override default width set in css file (px). null will inherit */ 44 | placeholder: 'Enter keywords', 45 | autoReset: false, 46 | debounceMS: 250 47 | }, 48 | 49 | _create: function() { 50 | var opts = this.options; 51 | var elem = $(this.element); 52 | 53 | // get the multiselect instance 54 | this.instance = elem.multiselect('instance'); 55 | 56 | // store header; add filter class so the close/check all/uncheck all links can be positioned correctly 57 | this.header = this.instance.menu.find('.ui-multiselect-header').addClass('ui-multiselect-hasfilter'); 58 | 59 | // wrapper elem 60 | this.input = $("").attr({ 61 | placeholder: opts.placeholder, 62 | type: "search" 63 | }).css({ 64 | width: (/\d/.test(opts.width) ? opts.width + 'px' : null) 65 | }).bind({ 66 | keydown: function(e) { 67 | // prevent the enter key from submitting the form / closing the widget 68 | if(e.which === 13) { 69 | e.preventDefault(); 70 | } else if(e.which === 27) { 71 | elem.multiselect('close'); 72 | e.preventDefault(); 73 | } else if(e.which === 9 && e.shiftKey) { 74 | elem.multiselect('close'); 75 | e.preventDefault(); 76 | } else if(e.altKey) { 77 | switch(e.which) { 78 | case 82: 79 | e.preventDefault(); 80 | $(this).val('').trigger('input', ''); 81 | break; 82 | case 65: 83 | elem.multiselect('checkAll'); 84 | break; 85 | case 85: 86 | elem.multiselect('uncheckAll'); 87 | break; 88 | case 76: 89 | elem.multiselect('instance').labels.first().trigger("mouseenter"); 90 | break; 91 | } 92 | } 93 | }, 94 | input: $.proxy(debounce(this._handler, opts.debounceMS), this), 95 | search: $.proxy(this._handler, this) 96 | }); 97 | // automatically reset the widget on close? 98 | if(this.options.autoReset) { 99 | elem.bind('multiselectclose', $.proxy(this._reset, this)); 100 | } 101 | // rebuild cache when multiselect is updated 102 | elem.bind('multiselectrefresh', $.proxy(function() { 103 | this.updateCache(); 104 | this._handler(); 105 | }, this)); 106 | this.wrapper = $("
").addClass("ui-multiselect-filter").text(opts.label).append(this.input).prependTo(this.header); 107 | 108 | // reference to the actual inputs 109 | this.inputs = this.instance.menu.find('input[type="checkbox"], input[type="radio"]'); 110 | 111 | // cache input values for searching 112 | this.updateCache(); 113 | 114 | // rewrite internal _toggleChecked fn so that when checkAll/uncheckAll is fired, 115 | // only the currently filtered elements are checked 116 | this.instance._toggleChecked = function(flag, group) { 117 | var $inputs = (group && group.length) ? group : this.labels.find('input'); 118 | var _self = this; 119 | 120 | // do not include hidden elems if the menu isn't open. 121 | var selector = _self._isOpen ? ':disabled, :hidden' : ':disabled'; 122 | 123 | $inputs = $inputs 124 | .not(selector) 125 | .each(this._toggleState('checked', flag)); 126 | 127 | // update text 128 | this.update(); 129 | 130 | // gather an array of the values that actually changed 131 | var values = {}; 132 | $inputs.each(function() { 133 | values[this.value] = true; 134 | }); 135 | 136 | // select option tags 137 | this.element.find('option').filter(function() { 138 | if(!this.disabled && values[this.value]) { 139 | _self._toggleState('selected', flag).call(this); 140 | } 141 | }); 142 | 143 | // trigger the change event on the select 144 | if($inputs.length) { 145 | this.element.trigger('change'); 146 | } 147 | }; 148 | }, 149 | 150 | // thx for the logic here ben alman 151 | _handler: function(e) { 152 | var term = $.trim(this.input[0].value.toLowerCase()), 153 | 154 | // speed up lookups 155 | rows = this.rows, inputs = this.inputs, cache = this.cache; 156 | var $groups = this.instance.menu.find(".ui-multiselect-optgroup"); 157 | $groups.show(); 158 | if(!term) { 159 | rows.show(); 160 | } else { 161 | rows.hide(); 162 | 163 | var regex = new RegExp(term.replace(rEscape, "\\$&"), 'gi'); 164 | 165 | this._trigger("filter", e, $.map(cache, function(v, i) { 166 | if(v.search(regex) !== -1) { 167 | rows.eq(i).show(); 168 | return inputs.get(i); 169 | } 170 | 171 | return null; 172 | })); 173 | } 174 | 175 | // show/hide optgroups 176 | $groups.each(function() { 177 | var $this = $(this); 178 | if(!$this.children("li:visible").length) { 179 | $this.hide(); 180 | } 181 | }); 182 | this.instance._setMenuHeight(); 183 | }, 184 | 185 | _reset: function() { 186 | this.input.val('').trigger('input', ''); 187 | }, 188 | 189 | updateCache: function() { 190 | // each list item 191 | this.rows = this.instance.labels.parent(); 192 | 193 | // cache 194 | this.cache = this.element.children().map(function() { 195 | var elem = $(this); 196 | 197 | // account for optgroups 198 | if(this.tagName.toLowerCase() === "optgroup") { 199 | elem = elem.children(); 200 | } 201 | 202 | return elem.map(function() { 203 | return this.innerHTML.toLowerCase(); 204 | }).get(); 205 | }).get(); 206 | }, 207 | 208 | widget: function() { 209 | return this.wrapper; 210 | }, 211 | 212 | destroy: function() { 213 | $.Widget.prototype.destroy.call(this); 214 | this.input.val('').trigger("keyup"); 215 | this.wrapper.remove(); 216 | } 217 | }); 218 | 219 | })(jQuery); 220 | -------------------------------------------------------------------------------- /support/jquery.tablecards.js: -------------------------------------------------------------------------------- 1 | // jQuery plugin to convert tables to responsive cards via templates. 2 | // (C) 2017 CubicleSoft. All Rights Reserved. 3 | 4 | (function($) { 5 | $.fn.TableCards = function(options) { 6 | // Reset TableCards (e.g. card template changes). 7 | this.each(function() { 8 | var $this = $(this); 9 | 10 | $this.removeClass('tablecards'); 11 | $this.removeClass('tablecard-show'); 12 | $this.children('thead, tbody, tfoot').children('tr').children('th, td').each(function() { 13 | $this2 = $(this); 14 | 15 | if ($this2.hasClass('tablecard-col')) $this2.remove(); 16 | else $this2.removeClass('tablecard-mode-card'); 17 | }); 18 | 19 | $this.off('tablecards:resize'); 20 | $this.off('tablecards:datachanged'); 21 | }); 22 | 23 | if (typeof(options) === 'string' && options === 'destroy') return this; 24 | 25 | var settings = $.extend({}, $.fn.TableCards.defaults, options); 26 | 27 | // Allows rotation through input templates per row. 28 | if (typeof(settings.head) === 'string') settings.head = [settings.head]; 29 | if (typeof(settings.body) === 'string') settings.body = [settings.body]; 30 | if (typeof(settings.foot) === 'string') settings.foot = [settings.foot]; 31 | 32 | // Tokenize the templates. 33 | var ParseTemplate = function(templatestr) { 34 | if (typeof(templatestr) === 'function') return templatestr; 35 | 36 | var template = []; 37 | var tokens = templatestr.split(settings.tokenstart); 38 | template.push(tokens.shift()); 39 | var zero = '0'.charCodeAt(0); 40 | var nine = '9'.charCodeAt(0); 41 | for (var x = 0; x < tokens.length; x++) 42 | { 43 | var str = tokens[x]; 44 | 45 | if (str.length == 0) template.push(settings.tokenstart); 46 | else 47 | { 48 | var x2; 49 | for (x2 = 0; x2 < str.length && str.charCodeAt(x2) >= zero && str.charCodeAt(x2) <= nine; x2++) 50 | { 51 | } 52 | 53 | if (x2 > 0) template.push(parseInt(str.substr(0, x2), 10)); 54 | 55 | template.push(str.substr(x2)); 56 | } 57 | } 58 | 59 | return template; 60 | }; 61 | 62 | var ParseTemplates = function(templates) { 63 | var result = []; 64 | 65 | for (var x = 0; x < templates.length; x++) result.push(ParseTemplate(templates[x])); 66 | 67 | return result; 68 | }; 69 | 70 | // Apply a template to one or more rows of data and generate card columns. 71 | var ApplyTemplates = function(trs, templates, tag, mainbody) { 72 | var num = 0; 73 | 74 | trs.each(function() { 75 | var template = templates[num]; 76 | 77 | num++; 78 | if (num >= templates.length) num = 0; 79 | 80 | var html = ''; 81 | 82 | if (typeof(template) === 'function') html += template(); 83 | else 84 | { 85 | var children = $(this).children('th, td'); 86 | 87 | for (var x = 0; x < template.length; x++) 88 | { 89 | if (typeof(template[x]) === 'string') html += template[x]; 90 | else if (template[x] > 0 && template[x] <= children.length) html += $(children.get(template[x] - 1)).html(); 91 | } 92 | } 93 | 94 | $(this).append('<' + tag + ' class="tablecard-col' + (mainbody ? ' tablecard-mode-card' : '') + '">' + html + ''); 95 | }); 96 | }; 97 | 98 | // Add a class to always show specified columns when in card mode. 99 | var AddCardClass = function(trs) { 100 | if (settings.extracols.length) 101 | { 102 | trs.first().children('th.tablecard-col, td.tablecard-col').addClass('tablecard-mode-card'); 103 | 104 | for (var x = 0; x < settings.extracols.length; x++) 105 | { 106 | var col = settings.extracols[x]; 107 | if (typeof(col) !== 'number') continue; 108 | 109 | if (col > 0) 110 | { 111 | trs.each(function() { 112 | $(this).children('th, td').slice(col - 1, col).addClass('tablecard-mode-card'); 113 | }); 114 | } 115 | } 116 | } 117 | }; 118 | 119 | var headtemplates = null, bodytemplates, foottemplates; 120 | 121 | var Init = function($this) { 122 | if (!headtemplates) 123 | { 124 | headtemplates = ParseTemplates(settings.head); 125 | bodytemplates = ParseTemplates(settings.body); 126 | foottemplates = ParseTemplates(settings.foot); 127 | } 128 | 129 | // Add a class so that CSS can make any necessary adjustments. 130 | $this.addClass('tablecards'); 131 | 132 | // Alter table header. 133 | var theads = $this.children('thead'); 134 | if (!theads.length) 135 | { 136 | $this.prepend(''); 137 | theads = $this.children('thead'); 138 | } 139 | var headtrs = theads.children('tr'); 140 | ApplyTemplates(headtrs, headtemplates, 'th', false); 141 | AddCardClass(headtrs); 142 | 143 | // Alter table body. 144 | var tbodys = $this.children('tbody'); 145 | var bodytrs = tbodys.children('tr'); 146 | ApplyTemplates(bodytrs, bodytemplates, 'td', true); 147 | AddCardClass(bodytrs); 148 | 149 | // Alter table footer (if any). 150 | var tfoots = $this.children('tfoot'); 151 | var foottrs = tfoots.children('tr'); 152 | ApplyTemplates(foottrs, foottemplates, 'td', false); 153 | AddCardClass(foottrs); 154 | }; 155 | 156 | return this.each(function() { 157 | var $this = $(this); 158 | var minwidth = settings.width; 159 | var resetminwidth = false; 160 | var currmode = 'table'; 161 | var initialized = false; 162 | 163 | var HandleResize = function(e) { 164 | var tablewidth = $this.outerWidth(); 165 | if (tablewidth < 1) return; 166 | 167 | var parentwidth = $this.parent().innerWidth(); 168 | 169 | if (!minwidth && currmode === 'table') 170 | { 171 | if (tablewidth > parentwidth + 1) minwidth = tablewidth; 172 | } 173 | 174 | if (minwidth) 175 | { 176 | if ((parentwidth < minwidth || tablewidth > parentwidth + 1) && currmode === 'table') 177 | { 178 | if (!initialized) 179 | { 180 | Init($this); 181 | initialized = true; 182 | } 183 | 184 | $this.addClass('tablecard-show'); 185 | if (!settings.extracols.length) $this.addClass('tablecard-show-nohead'); 186 | currmode = 'card'; 187 | 188 | //console.log('mode = ' + currmode + ', parentwidth = ' + parentwidth + ', minwidth = ' + minwidth + ', tablewidth = ' + tablewidth); 189 | 190 | setTimeout(function() { $this.trigger('tablecards:mode', currmode); }, 0); 191 | } 192 | else if (parentwidth > minwidth + 1 && currmode === 'card') 193 | { 194 | $this.removeClass('tablecard-show'); 195 | if (!settings.extracols.length) $this.removeClass('tablecard-show-nohead'); 196 | currmode = 'table'; 197 | 198 | //console.log('mode = ' + currmode + ', parentwidth = ' + parentwidth + ', minwidth = ' + minwidth + ', tablewidth = ' + tablewidth); 199 | 200 | if (resetminwidth) 201 | { 202 | minwidth = settings.width; 203 | resetminwidth = false; 204 | 205 | setTimeout(HandleResize, 20); 206 | } 207 | 208 | setTimeout(function() { $this.trigger('tablecards:mode', currmode); }, 0); 209 | } 210 | } 211 | }; 212 | 213 | $this.on('tablecards:resize', HandleResize); 214 | setTimeout(HandleResize, 0); 215 | 216 | $this.on('tablecards:datachanged', function() { 217 | if (currmode === 'card') resetminwidth = true; 218 | else 219 | { 220 | minwidth = settings.width; 221 | setTimeout(HandleResize, 0); 222 | } 223 | }); 224 | 225 | if (settings.postinit) settings.postinit(this, settings); 226 | }); 227 | }; 228 | 229 | $.fn.TableCards.defaults = { 230 | 'width' : null, 231 | 'extracols' : [], 232 | 'tokenstart' : '%', 233 | 'head' : ' ', 234 | 'body' : ' ', 235 | 'foot' : ' ', 236 | 'postinit' : null 237 | }; 238 | }(jQuery)); 239 | -------------------------------------------------------------------------------- /support/admin_view.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | border: 0; 5 | font-family: Verdana, Arial, Helvetica, sans-serif; 6 | max-width: 800px; 7 | margin: 0 auto; 8 | } 9 | 10 | .pagewrap { 11 | margin: 0 5px 5px 5px; 12 | } 13 | 14 | .pagewrap .headerwrap { 15 | text-align: center; 16 | font-weight: bold; 17 | font-size: 1.7em; 18 | border-left: 1px solid #BBBBBB; 19 | border-right: 1px solid #BBBBBB; 20 | border-bottom: 1px solid #BBBBBB; 21 | background-color: #F5F5F5; 22 | padding: 0.1em; 23 | border-bottom-right-radius: 3px; 24 | border-bottom-left-radius: 3px; 25 | -moz-border-radius-bottomright: 3px; 26 | -moz-border-radius-bottomleft: 3px; 27 | -webkitborder-bottom-right-radius: 3px; 28 | -webkitborder-bottom-left-radius: 3px; 29 | } 30 | 31 | .pagewrap .contentwrap { 32 | margin-top: 10px; 33 | } 34 | 35 | .pagewrap .menuwrap { 36 | margin-top: 7px; 37 | border-top: 1px solid #CCCCCC; 38 | padding: 25px 0 10px; 39 | } 40 | 41 | /* Basic styles for elements. */ 42 | img { 43 | border: 0px none; 44 | margin: 0px; 45 | } 46 | 47 | form { 48 | border: 0px none; 49 | margin: 0px; 50 | } 51 | 52 | a { 53 | color: #035488; 54 | text-decoration: none; 55 | } 56 | 57 | a:hover { 58 | color: #444444; 59 | text-decoration: underline; 60 | } 61 | 62 | /* Optional message styles. */ 63 | .message { 64 | margin: 10px 7px; 65 | font-weight: bold; 66 | padding: 7px 15px; 67 | border-radius: 3px; 68 | -moz-border-radius: 3px; 69 | -webkit-border-radius: 3px; 70 | } 71 | 72 | .message .success { 73 | background-color: #E8FCDC; 74 | border: 1px solid #008800; 75 | color: #008800; 76 | } 77 | 78 | .message .error { 79 | background-color: #FCDCDC; 80 | border: 1px solid #880000; 81 | color: #880000; 82 | } 83 | 84 | .message .info { 85 | background-color: #DCDCDC; 86 | border: 1px solid #333333; 87 | color: #333333; 88 | } 89 | 90 | .maincontent { 91 | } 92 | 93 | .maincontent .proptitle { 94 | font-weight: bold; 95 | font-size: 1.3em; 96 | color: #1F1F1F; 97 | } 98 | 99 | .maincontent .propdesc { 100 | margin-top: 5px; 101 | padding: 10px 7px; 102 | border-top: 1px solid #CCCCCC; 103 | color: #333333; 104 | font-size: 1.0em; 105 | } 106 | 107 | .maincontent .propinfo { 108 | } 109 | 110 | .maincontent .propmain { 111 | margin: 0px 7px; 112 | } 113 | 114 | .maincontent .propmain .formfields { 115 | font-size: 0.9em; 116 | } 117 | 118 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion { 119 | margin-bottom: 7px; 120 | } 121 | 122 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion h3.ui-accordion-header { 123 | margin-top: 7px; 124 | } 125 | 126 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion h3.ui-state-active { 127 | background: url("jquery_ui_themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6; 128 | } 129 | 130 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion .formaccordionitems.ui-accordion-content { 131 | padding: 0 14px; 132 | background: none; 133 | background-color: #FEFEFE; 134 | } 135 | 136 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion .formaccordionitems.ui-widget-content a { 137 | color: #035488; 138 | } 139 | 140 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion .formaccordionitems.ui-accordion-content .formitem { 141 | margin-top: 6px; 142 | border-top: 1px dotted #CCCCCC; 143 | padding-top: 6px; 144 | } 145 | 146 | .maincontent .propmain .formfields .formaccordionwrap.ui-accordion .formaccordionitems.ui-accordion-content .formitem.firstitem { 147 | border-top: 0; 148 | } 149 | 150 | .maincontent .propmain .formfields .formitem { 151 | margin: 0.9em 0 0.5em; 152 | } 153 | 154 | .maincontent .propmain .formfields .formitem .formitemtitle { 155 | font-weight: bold; 156 | margin-bottom: 2px; 157 | } 158 | 159 | .maincontent .propmain .formfields .formitem .staticwrap, .maincontent .propmain .formfields .formitem .static { 160 | margin-left: 7px; 161 | width: 95%; 162 | font-size: 0.95em; 163 | color: #333333; 164 | } 165 | 166 | .maincontent .propmain .formfields .formitem input.text { 167 | padding: 0.5em; 168 | width: 95%; 169 | border: 1px solid #BBBBBB; 170 | } 171 | 172 | .maincontent .propmain .formfields .formitem input.text:hover { 173 | border: 1px solid #888888; 174 | } 175 | 176 | .maincontent .propmain .formfields .formitem input.text:focus { 177 | border: 1px solid #888888; 178 | } 179 | 180 | .maincontent .propmain .formfields .formitem input.date { 181 | padding: 0.5em; 182 | max-width: 20em; 183 | width: 95%; 184 | border: 1px solid #BBBBBB; 185 | } 186 | 187 | .maincontent .propmain .formfields .formitem input.date:hover { 188 | border: 1px solid #888888; 189 | } 190 | 191 | .maincontent .propmain .formfields .formitem input.date:focus { 192 | border: 1px solid #888888; 193 | } 194 | 195 | .maincontent .propmain .formfields .formitem .textareawrap { 196 | width: 95%; 197 | } 198 | 199 | .maincontent .propmain .formfields .formitem textarea.text { 200 | padding: 0.3em; 201 | width: 100%; 202 | border: 1px solid #BBBBBB; 203 | } 204 | 205 | .maincontent .propmain .formfields .formitem textarea.text:hover { 206 | border: 1px solid #888888; 207 | } 208 | 209 | .maincontent .propmain .formfields .formitem textarea.text:focus { 210 | border: 1px solid #888888; 211 | } 212 | 213 | .maincontent .propmain .formfields .formitem input.checkbox { 214 | border: 1px solid #BBBBBB; 215 | } 216 | 217 | .maincontent .propmain .formfields .formitem select { 218 | padding: 0.3em; 219 | width: 95%; 220 | max-width: 750px; 221 | border: 1px solid #BBBBBB; 222 | } 223 | 224 | .maincontent .propmain .formfields .formitem select:hover { 225 | border: 1px solid #888888; 226 | } 227 | 228 | .maincontent .propmain .formfields .formitem select:focus { 229 | border: 1px solid #888888; 230 | } 231 | 232 | .maincontent .propmain .formfields .formitem table.viewtable td { 233 | vertical-align: top; 234 | } 235 | 236 | .maincontent .propmain .formfields .formitem table.viewtable td.datakey { 237 | padding-right: 2.0em; 238 | font-weight: bold; 239 | white-space: nowrap; 240 | } 241 | 242 | .maincontent .propmain .formfields .formitem .formitemdesc { 243 | margin-left: 7px; 244 | font-size: 0.9em; 245 | color: #333333; 246 | } 247 | 248 | .maincontent .propmain .formsubmit { 249 | margin: 15px auto; 250 | text-align: center; 251 | } 252 | 253 | .maincontent .propmain .formsubmit input.submit { 254 | color: #1F1F1F; 255 | font-size: 0.9em; 256 | font-weight: bold; 257 | padding: 0.2em 0.5em; 258 | } 259 | 260 | .maincontent .propmain hr { 261 | margin-top: 0.7em; 262 | border: none 0; 263 | border-top: 1px dashed #AAAAAA; 264 | height: 1px; 265 | } 266 | 267 | .maincontent .propmain .nontablewrap { 268 | border-left: 1px solid #CCCCCC; 269 | border-right: 1px solid #CCCCCC; 270 | border-bottom: 1px solid #CCCCCC; 271 | color: #333333; 272 | } 273 | 274 | .maincontent .propmain .nontable_row { 275 | background-color: #F5F5F5; 276 | border-top: 1px dashed #CCCCCC; 277 | padding: 0.5em; 278 | } 279 | 280 | .maincontent .propmain .nontable_row.firstrow { 281 | border-top: 1px solid #CCCCCC; 282 | } 283 | 284 | .maincontent .propmain .nontable_row.altrow { 285 | background-color: #FEFEFE; 286 | } 287 | 288 | .maincontent .propmain .nontable_th { 289 | margin-top: 0.4em; 290 | font-weight: bold; 291 | } 292 | 293 | .maincontent .propmain .nontable_th.firstcol { 294 | margin-top: 0; 295 | } 296 | 297 | .maincontent .propmain .nontable_td { 298 | margin-left: 7px; 299 | color: #444444; 300 | } 301 | 302 | .maincontent .propmain .mediawrap { 303 | float: right; 304 | margin-left: 2.0em; 305 | max-width: 45%; 306 | margin-bottom: 0.5em; 307 | } 308 | 309 | @media (max-width: 600px) { 310 | .maincontent .propmain .mediawrap { 311 | float: none; 312 | margin-left: 0; 313 | max-width: none; 314 | } 315 | } 316 | 317 | .maincontent .propmain .mediawrap .mediaitemtitle { 318 | font-weight: bold; 319 | margin-bottom: 0.3em; 320 | } 321 | 322 | .maincontent .propmain .mediawrap .mediaitem { 323 | max-width: 100%; 324 | } 325 | 326 | .maincontent .propmain .mediawrap .mediaitemdesc { 327 | font-size: 0.9em; 328 | color: #333333; 329 | } 330 | 331 | /* Optional menu navigation styles. */ 332 | .menuwrap { 333 | } 334 | 335 | .menuwrap .menu { 336 | font-size: 0.7em; 337 | border: 1px solid #BBBBBB; 338 | background-color: #F5F5F5; 339 | margin-top: 7px; 340 | padding: 5px; 341 | } 342 | 343 | .menuwrap .menu .titlewrap { 344 | font-weight: bold; 345 | padding-bottom: 6px; 346 | } 347 | 348 | .menuwrap .menu a { 349 | display: block; 350 | border-top: 1px solid #CCCCCC; 351 | padding: 12px 15px; 352 | } 353 | 354 | .menuwrap .menu a:hover { 355 | background-color: #EAEAEA; 356 | text-decoration: none; 357 | } 358 | 359 | /* Floating navigation menu styles. */ 360 | .maincontent .proptitle #navbutton { 361 | display: none; 362 | } 363 | 364 | .maincontent .proptitle #navdropdown { 365 | display: none; 366 | } 367 | -------------------------------------------------------------------------------- /support/jquery.tablednd.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e,a,n){var i="ontouchstart"in a.documentElement,r="touchstart mousedown",l="touchmove mousemove",o="touchend mouseup";i&&t.each("touchstart touchmove touchend".split(" "),function(e,a){try{t.event.fixHooks[a]=t.event.mouseHooks}catch(n){}}),t(a).ready(function(){function e(t){for(var e={},a=t.match(/([^;:]+)/g)||[];a.length;)e[a.shift()]=a.shift().trim();return e}t("table").each(function(){"dnd"==t(this).data("table")&&t(this).tableDnD({onDragStyle:t(this).data("ondragstyle")&&e(t(this).data("ondragstyle"))||null,onDropStyle:t(this).data("ondropstyle")&&e(t(this).data("ondropstyle"))||null,onDragClass:t(this).data("ondragclass")==n&&"tDnD_whileDrag"||t(this).data("ondragclass"),onDrop:t(this).data("ondrop")&&new Function("table","row",t(this).data("ondrop")),onDragStart:t(this).data("ondragstart")&&new Function("table","row",t(this).data("ondragstart")),onDragStop:t(this).data("ondragstop")&&new Function("table","row",t(this).data("ondragstop")),scrollAmount:t(this).data("scrollamount")||5,sensitivity:t(this).data("sensitivity")||10,hierarchyLevel:t(this).data("hierarchylevel")||0,indentArtifact:t(this).data("indentartifact")||'
 
',autoWidthAdjust:t(this).data("autowidthadjust")||!0,autoCleanRelations:t(this).data("autocleanrelations")||!0,jsonPretifySeparator:t(this).data("jsonpretifyseparator")||" ",serializeRegexp:t(this).data("serializeregexp")&&new RegExp(t(this).data("serializeregexp"))||/[^\-]*$/,serializeParamName:t(this).data("serializeparamname")||!1,dragHandle:t(this).data("draghandle")||null})})}),jQuery.tableDnD={currentTable:null,dragObject:null,mouseOffset:null,oldX:0,oldY:0,build:function(e){return this.each(function(){this.tableDnDConfig=t.extend({onDragStyle:null,onDropStyle:null,onDragClass:"tDnD_whileDrag",onDrop:null,onDragStart:null,onDragStop:null,scrollAmount:5,sensitivity:10,hierarchyLevel:0,indentArtifact:'
 
',autoWidthAdjust:!0,autoCleanRelations:!0,jsonPretifySeparator:" ",serializeRegexp:/[^\-]*$/,serializeParamName:!1,dragHandle:null},e||{}),t.tableDnD.makeDraggable(this),this.tableDnDConfig.hierarchyLevel&&t.tableDnD.makeIndented(this)}),this},makeIndented:function(e){var a,n,i=e.tableDnDConfig,r=e.rows,l=t(r).first().find("td:first")[0],o=0,s=0;if(t(e).hasClass("indtd"))return null;n=t(e).addClass("indtd").attr("style"),t(e).css({whiteSpace:"nowrap"});for(var d=0;dt.vertical&&this.dragObject.parentNode.insertBefore(this.dragObject,e.nextSibling)||00&&t(a).find("td:first").children(":first").remove()&&t(a).data("level",--n),void(0>e.horizontal&&n=n&&t(a).children(":first").prepend(i.indentArtifact)&&t(a).data("level",++n))):null},mousemove:function(e){var a,n,i,r,l,o=t(t.tableDnD.dragObject),s=t.tableDnD.currentTable.tableDnDConfig;return e&&e.preventDefault(),t.tableDnD.dragObject?("touchmove"==e.type&&event.preventDefault(),s.onDragClass&&o.addClass(s.onDragClass)||o.css(s.onDragStyle),n=t.tableDnD.mouseCoords(e),r=n.x-t.tableDnD.mouseOffset.x,l=n.y-t.tableDnD.mouseOffset.y,t.tableDnD.autoScroll(n),a=t.tableDnD.findDropTargetRow(o,l),i=t.tableDnD.findDragDirection(r,l),t.tableDnD.moveVerticle(i,a),t.tableDnD.moveHorizontal(i,a),!1):!1},findDragDirection:function(t,e){var a=this.currentTable.tableDnDConfig.sensitivity,n=this.oldX,i=this.oldY,r=n-a,l=n+a,o=i-a,s=i+a,d={horizontal:t>=r&&l>=t?0:t>n?-1:1,vertical:e>=o&&s>=e?0:e>i?-1:1};return 0!=d.horizontal&&(this.oldX=t),0!=d.vertical&&(this.oldY=e),d},findDropTargetRow:function(e,a){for(var n=0,i=this.currentTable.rows,r=this.currentTable.tableDnDConfig,l=0,o=null,s=0;sl-n&&l+n>a)return e.is(o)||r.onAllowDrop&&!r.onAllowDrop(e,o)||t(o).hasClass("nodrop")?null:o;return null},processMouseup:function(){if(!this.currentTable||!this.dragObject)return null;var e=this.currentTable.tableDnDConfig,n=this.dragObject,i=0,r=0;t(a).unbind(l,this.mousemove).unbind(o,this.mouseup),e.hierarchyLevel&&e.autoCleanRelations&&t(this.currentTable.rows).first().find("td:first").children().each(function(){r=t(this).parents("tr:first").data("level"),r&&t(this).parents("tr:first").data("level",--r)&&t(this).remove()})&&e.hierarchyLevel>1&&t(this.currentTable.rows).each(function(){if(r=t(this).data("level"),r>1)for(i=t(this).prev().data("level");r>i+1;)t(this).find("td:first").children(":first").remove(),t(this).data("level",--r)}),e.onDragClass&&t(n).removeClass(e.onDragClass)||t(n).css(e.onDropStyle),this.dragObject=null,e.onDrop&&this.originalOrder!=this.currentOrder()&&t(n).hide().fadeIn("fast")&&e.onDrop(this.currentTable,n),e.onDragStop&&e.onDragStop(this.currentTable,n),this.currentTable=null},mouseup:function(e){return e&&e.preventDefault(),t.tableDnD.processMouseup(),!1},jsonize:function(t){var e=this.currentTable;return t?JSON.stringify(this.tableData(e),null,e.tableDnDConfig.jsonPretifySeparator):JSON.stringify(this.tableData(e))},serialize:function(){return t.param(this.tableData(this.currentTable))},serializeTable:function(t){for(var e="",a=t.tableDnDConfig.serializeParamName||t.id,n=t.rows,i=0;i0&&(e+="&");var r=n[i].id;r&&t.tableDnDConfig&&t.tableDnDConfig.serializeRegexp&&(r=r.match(t.tableDnDConfig.serializeRegexp)[0],e+=a+"[]="+r)}return e},serializeTables:function(){var e=[];return t("table").each(function(){this.id&&e.push(t.param(this.tableData(this)))}),e.join("&")},tableData:function(e){var a,n,i,r,l=e.tableDnDConfig,o=[],s=0,d=0,h=null,u={};if(e||(e=this.currentTable),!(e&&e.id&&e.rows&&e.rows.length))return{error:{code:500,message:"Not a valid table, no serializable unique id provided."}};r=l.autoCleanRelations&&e.rows||t.makeArray(e.rows),n=l.serializeParamName||e.id,i=n,a=function(t){return t&&l&&l.serializeRegexp?t.match(l.serializeRegexp)[0]:t},u[i]=[],!l.autoCleanRelations&&t(r[0]).data("level")&&r.unshift({id:"undefined"});for(var c=0;cs)o.push([i,s]),i=a(r[c-1].id);else if(s>d)for(var f=0;f=s&&(o[f][1]=0);s=d,t.isArray(u[i])||(u[i]=[]),h=a(r[c].id),h&&u[i].push(h)}else h=a(r[c].id),h&&u[i].push(h);return u}},jQuery.fn.extend({tableDnD:t.tableDnD.build,tableDnDUpdate:t.tableDnD.updateTables,tableDnDSerialize:t.proxy(t.tableDnD.serialize,t.tableDnD),tableDnDSerializeAll:t.tableDnD.serializeTables,tableDnDData:t.proxy(t.tableDnD.tableData,t.tableDnD)})}(jQuery,window,window.document); -------------------------------------------------------------------------------- /support/jquery.tablebodyscroll.js: -------------------------------------------------------------------------------- 1 | // jQuery plugin to scroll the body of long tables so the table fits on a single screen. 2 | // (C) 2017 CubicleSoft. All Rights Reserved. 3 | 4 | (function($) { 5 | var debounce = function(func, wait) { 6 | var timeout = null; 7 | 8 | return function() { 9 | var context = this, args = arguments; 10 | var later = function() { 11 | timeout = null; 12 | 13 | func.apply(context, args); 14 | }; 15 | 16 | if (timeout) clearTimeout(timeout); 17 | timeout = setTimeout(later, wait); 18 | }; 19 | }; 20 | 21 | var debounce2 = function(func, wait, wait2) { 22 | var timeout = null, timeout2 = null; 23 | 24 | return function() { 25 | var context = this, args = arguments; 26 | var later = function() { 27 | clearTimeout(timeout); 28 | timeout = null; 29 | 30 | clearTimeout(timeout2); 31 | timeout2 = null; 32 | 33 | func.apply(context, args); 34 | }; 35 | 36 | if (timeout) clearTimeout(timeout); 37 | timeout = setTimeout(later, wait); 38 | 39 | if (!timeout2) timeout2 = setTimeout(later, wait2); 40 | }; 41 | }; 42 | 43 | $.fn.TableBodyScroll = function(options) { 44 | this.each(function() { 45 | var $this = $(this); 46 | 47 | if ($this.parent().hasClass('tablebodyscroll-scroller3')) 48 | { 49 | var scroller3 = $this.parent(); 50 | var scroller2 = scroller3.parent(); 51 | var scroller = scroller2.parent(); 52 | var wrapper = scroller.parent(); 53 | var origparent = wrapper.parent(); 54 | 55 | // Remove event handlers. 56 | scroller2.off('scroll.tablebodyscroll'); 57 | scroller2.off('mousemove.tablebodyscroll'); 58 | scroller2.off('keypress.tablebodyscroll'); 59 | $this.off('tablebodyscroll:resize'); 60 | $this.off('tablebodyscroll:columnschanged'); 61 | 62 | // Move the table back to its original parent in the DOM. 63 | wrapper.insertBefore($this); 64 | wrapper.remove(); 65 | 66 | // Clean up modified header/footer cells. 67 | $this.children('thead, tfoot').children('tr').children('th, td').each(function() { 68 | if ($(this).hasClass('tablebodyscroll-body-hide-cell')) 69 | { 70 | $(this).removeClass('tablebodyscroll-body-hide-cell'); 71 | 72 | var div = $(this).children('.tablebodyscroll-body-hide-cell'); 73 | div.insertBefore(div.contents()).remove(); 74 | } 75 | }); 76 | } 77 | }); 78 | 79 | if (typeof(options) === 'string' && options === 'destroy') return this; 80 | 81 | var settings = $.extend({}, $.fn.TableBodyScroll.defaults, options); 82 | 83 | return this.each(function() { 84 | var $this = $(this); 85 | 86 | // Wrap the table. 87 | var origparent = $this.parent(); 88 | var scrollerindicator = $('
').addClass('tablebodyscroll-scroller-indicator').addClass('tablebodyscroll-scroller-indicator-hide'); 89 | var scrollershadowtop = $('
').addClass('tablebodyscroll-scroller-shadow-top'); 90 | var scrollershadowbottom = $('
').addClass('tablebodyscroll-scroller-shadow-bottom'); 91 | var scroller3 = $('
').addClass('tablebodyscroll-scroller3').insertBefore($this).append($this); 92 | var scroller2 = $('
').addClass('tablebodyscroll-scroller2').insertBefore(scroller3).append(scroller3); 93 | var scroller = $('
').addClass('tablebodyscroll-scroller').insertBefore(scroller2).append(scroller2).append(scrollerindicator).append(scrollershadowtop).append(scrollershadowbottom); 94 | var wrapper = $('
').addClass('tablebodyscroll').insertBefore(scroller).append(scroller); 95 | 96 | // Generate header and footer tables. 97 | // Cloning has several mostly minor unresolveable issues but there is no other way to accurately make just the body of the table scroll. 98 | var origtheads = null; 99 | var newheadtable = null, newtheadcells = null, origtheadcells = null; 100 | 101 | var origtfoots = null; 102 | var newfoottable = null, newtfootcells = null, origtfootcells = null; 103 | 104 | var CloneHeadFoot = function() { 105 | origtheads = $this.children('thead'); 106 | origtheadcells = origtheads.children('tr').children('th, td'); 107 | if (origtheads.length) 108 | { 109 | origtheadcells.each(function() { 110 | if (!$(this).hasClass('tablebodyscroll-body-hide-cell')) 111 | { 112 | $(this).addClass('tablebodyscroll-body-hide-cell').append($('
').append($(this).contents())); 113 | } 114 | }); 115 | 116 | if (newheadtable) newheadtable.remove(); 117 | var newtheads = origtheads.clone(true, true); 118 | newtheads.find('id').removeAttr('id'); 119 | newheadtable = $('
').attr('class', $this.attr('class')).addClass('tablebodyscroll-head').insertBefore(scroller).append(newtheads); 120 | wrapper.addClass('tablebodyscroll-has-head'); 121 | newtheadcells = newtheads.children('tr').children('th, td'); 122 | } 123 | else 124 | { 125 | wrapper.removeClass('tablebodyscroll-has-head'); 126 | } 127 | 128 | origtfoots = $this.children('tfoot'); 129 | origtfootcells = origtfoots.children('tr').children('th, td'); 130 | if (origtfoots.length) 131 | { 132 | origtfootcells.each(function() { 133 | if (!$(this).hasClass('tablebodyscroll-body-hide-cell')) 134 | { 135 | $(this).addClass('tablebodyscroll-body-hide-cell').append($('
').append($(this).contents())); 136 | } 137 | }); 138 | 139 | if (newfoottable) newfoottable.remove(); 140 | var newtfoots = origtfoots.clone(true, true); 141 | newtfoots.find('id').removeAttr('id'); 142 | newfoottable = $('
').attr('class', $this.attr('class')).addClass('tablebodyscroll-foot').insertAfter(scroller).append(newtfoots); 143 | wrapper.addClass('tablebodyscroll-has-foot'); 144 | newtfootcells = newtfoots.children('tr').children('th, td'); 145 | } 146 | else 147 | { 148 | wrapper.removeClass('tablebodyscroll-has-foot'); 149 | } 150 | }; 151 | 152 | var scrollbarheight = 17; 153 | 154 | var HandleScroll = function() { 155 | var tempheight = $this.outerHeight(); 156 | if (tempheight < 1) return; 157 | 158 | // Calculate new shadow. 159 | var currshadow = scroller.attr('data-tablebodyscroll-shadow') || 'shadow-none'; 160 | var currpos = scroller2.scrollTop(); 161 | var scrollerheight = scroller2.height(); 162 | 163 | var newshadow; 164 | if (currpos > 1 && currpos + scrollerheight - scrollbarheight < tempheight - 1) newshadow = 'shadow-both'; 165 | else if (currpos > 1) newshadow = 'shadow-top'; 166 | else if (currpos + scrollerheight - scrollbarheight < tempheight - 1) newshadow = 'shadow-bottom'; 167 | else newshadow = 'shadow-none'; 168 | 169 | //console.log('currshadow = ' + currshadow + ', newshadow = ' + newshadow + ', currpos = ' + currpos + ', scrollerheight = ' + scrollerheight + ', scrollbarheight = ' + scrollbarheight + ', total = ' + (currpos + scrollerheight - scrollbarheight) + ', table height = ' + tempheight); 170 | 171 | if (currshadow !== newshadow) scroller.removeClass('tablebodyscroll-' + currshadow).addClass('tablebodyscroll-' + newshadow).attr('data-tablebodyscroll-shadow', newshadow); 172 | 173 | // Adjust scroll indicator. 174 | var child = scrollerindicator.get(0); 175 | 176 | child.style.top = ((currpos / (tempheight - scrollerheight + scrollbarheight)) * (scrollerheight - scrollbarheight - scrollerindicator.height())) + 'px'; 177 | } 178 | 179 | var lastparentwidth = 0, lasttablewidth = 0; 180 | 181 | var HandleResize = function() { 182 | var currpos = scroller2.scrollTop(); 183 | var tempheight = $this.outerHeight(); 184 | 185 | var maxheight = (settings.heightunit == '%' ? Math.floor($(settings.percentelem).height() * settings.height / 100) + 'px' : settings.height + settings.heightunit); 186 | scroller.css('height', maxheight); 187 | maxheight = scroller.height(); 188 | 189 | if (maxheight > tempheight) scroller.height(tempheight); 190 | 191 | // Move the table back to its original parent in the DOM, measure the width, and move it back. 192 | origparent.append($this); 193 | var tempwidth = $this.outerWidth(); 194 | scroller3.append($this); 195 | 196 | // Set the width of the scroller to the width of the table so that the inset shadows show properly and horizontal scrolling is correct. 197 | scroller.width(tempwidth); 198 | var origparentwidth = origparent.width(); 199 | var newparentwidth = (origparentwidth < tempwidth ? origparentwidth : tempwidth); 200 | scroller3.width(newparentwidth); 201 | 202 | //console.log('table height = ' + tempheight + ', max height = ' + maxheight + ', width = ' + tempwidth + ', origparentwidth = ' + origparentwidth); 203 | 204 | // Notify listeners. 205 | if (lastparentwidth != newparentwidth || lasttablewidth != tempwidth) 206 | { 207 | lastparentwidth = newparentwidth; 208 | lasttablewidth = tempwidth; 209 | 210 | setTimeout(function() { $this.trigger('tablebodyscroll:sizechanged'); }, 0); 211 | } 212 | 213 | // Resize thead and tfoot elements. 214 | if (origtheads.length) 215 | { 216 | for (var x = 0; x < origtheadcells.length; x++) 217 | { 218 | var origcell = origtheadcells.get(x); 219 | var newcell = newtheadcells.get(x); 220 | 221 | if (origcell && newcell) 222 | { 223 | var tempwidth2; 224 | 225 | // Deals with Google Chrome(!) + jQuery off-by-one errors. 226 | if (origcell.currentStyle) tempwidth2 = origcell.currentStyle.margin; 227 | else if (window.getComputedStyle) tempwidth2 = window.getComputedStyle(origcell, null).getPropertyValue('width'); 228 | else tempwidth2 = $(origcell).width(); 229 | 230 | $(newcell).css({ 'min-width': tempwidth2 }); 231 | } 232 | } 233 | } 234 | 235 | if (origtfoots.length) 236 | { 237 | for (var x = 0; x < origtfootcells.length; x++) 238 | { 239 | var origcell = origtfootcells.get(x); 240 | var newcell = newtfootcells.get(x); 241 | 242 | if (origcell && newcell) 243 | { 244 | var tempwidth2; 245 | 246 | // Deals with Google Chrome(!) + jQuery off-by-one errors. 247 | if (window.getComputedStyle) tempwidth2 = window.getComputedStyle(origcell, null).getPropertyValue('width'); 248 | else if (origcell.currentStyle) tempwidth2 = origcell.currentStyle.margin; 249 | else tempwidth2 = $(origcell).width(); 250 | 251 | $(newcell).css({ 'min-width': tempwidth2 }); 252 | } 253 | } 254 | } 255 | 256 | // Adjust scroller offsets. 257 | var parent = scroller.get(0); 258 | var child = scroller2.get(0); 259 | scrollbarheight = (child.offsetHeight - child.clientHeight); 260 | child.style.bottom = -scrollbarheight + "px"; 261 | 262 | var dir = (window.getComputedStyle ? window.getComputedStyle(parent, null).getPropertyValue('direction') : parent.currentStyle.direction); 263 | 264 | if (dir == 'ltr') child.style.right = -(child.offsetWidth - child.clientWidth) + "px"; 265 | else 266 | { 267 | child.style.left = -(child.offsetWidth - child.clientWidth) + "px"; 268 | child.style.right = '0px'; 269 | } 270 | 271 | // Update the scroller's shadows. 272 | scroller2.scrollTop(currpos); 273 | HandleScroll(); 274 | }; 275 | 276 | CloneHeadFoot(); 277 | 278 | var showingindicator = false; 279 | 280 | var DelayHideIndicator = debounce(function() { 281 | scrollerindicator.addClass('tablebodyscroll-scroller-indicator-hide'); 282 | scrollerindicator.removeClass('tablebodyscroll-scroller-indicator-show'); 283 | 284 | showingindicator = false; 285 | }, 1500); 286 | 287 | var ShowIndicator = function() { 288 | if (!showingindicator) 289 | { 290 | var currshadow = scroller.attr('data-tablebodyscroll-shadow') || 'shadow-none'; 291 | 292 | if (currshadow !== 'shadow-none') 293 | { 294 | scrollerindicator.addClass('tablebodyscroll-scroller-indicator-show'); 295 | scrollerindicator.removeClass('tablebodyscroll-scroller-indicator-hide'); 296 | 297 | showingindicator = true; 298 | } 299 | } 300 | 301 | if (showingindicator) DelayHideIndicator(); 302 | }; 303 | 304 | scroller2.on('scroll.tablebodyscroll', debounce2(function() { 305 | HandleScroll(); 306 | 307 | ShowIndicator(); 308 | }, 20, 50)); 309 | 310 | scroller2.on('mousemove.tablebodyscroll', debounce2(function() { 311 | ShowIndicator(); 312 | }, 20, 50)); 313 | 314 | scroller2.on('keypress.tablebodyscroll', debounce2(function() { 315 | ShowIndicator(); 316 | }, 20, 50)); 317 | 318 | $this.on('tablebodyscroll:resize', debounce2(function() { 319 | HandleResize(); 320 | }, 20, 100)); 321 | 322 | setTimeout(HandleResize, 0); 323 | 324 | $this.on('tablebodyscroll:columnschanged', function() { 325 | // Rebuild header and footer tables and resize. 326 | CloneHeadFoot(); 327 | 328 | HandleResize(); 329 | }); 330 | 331 | if (settings.postinit) settings.postinit(this, settings); 332 | }); 333 | } 334 | 335 | $.fn.TableBodyScroll.defaults = { 336 | 'height' : 60, 337 | 'heightunit' : '%', 338 | 'percentelem' : window, 339 | 'postinit' : null 340 | }; 341 | }(jQuery)); 342 | -------------------------------------------------------------------------------- /support/admin.css: -------------------------------------------------------------------------------- 1 | html, body { height: 100%; margin: 0px; padding: 0px; overflow: hidden; background-color: #FFFFFF; } 2 | body { font-family: Verdana, Arial, Helvetica, sans-serif; position: relative; color: #222222; } 3 | 4 | #contentwrap { height: 100%; overflow: auto; outline: none; } 5 | #contentwrap .proptitlewrap { background-color: #222222; color: #FAFAFA; padding: 0.85em; box-shadow: 0px 3px 3px 0px rgba(0,0,0,0.15); } 6 | #contentwrap .proptitle { max-width: 800px; margin-left: auto; margin-right: auto; font-weight: bold; font-size: 1.3em; } 7 | #contentwrap #navbutton { vertical-align: middle; display: none; padding: 0.23em 0; border: 1px solid #CCCCCC; border-radius: 5px; cursor: pointer; } 8 | #contentwrap #navbutton .navbuttonline { display: block; margin: 0.23em 0.4em; width: 1.0em; height: 2px; background-color: #FAFAFA; border-radius: 2px; } 9 | #contentwrap #navbutton:hover { color: #FFFFFF; border: 1px solid #E0E0E0; background-color: #2A2A2A; } 10 | #contentwrap #navbutton:hover .navbuttonline { background-color: #FFFFFF; } 11 | 12 | #contentwrap .propmessagewrap { border-top: 1px solid transparent; border-bottom: 1px solid transparent; padding: 0.5em 1.0em; box-shadow: 0px 3px 3px 0px rgba(0,0,0,0.15); } 13 | #contentwrap .propmessage { max-width: 800px; margin-left: auto; margin-right: auto; } 14 | #contentwrap .propmessagesuccess { border-color: #B2DBA1; background-color: #DFF0D8; background-repeat: repeat-x; color: #3C763D; } 15 | #contentwrap .propmessageerror { border-color: #DCA7A7; background-color: #F2DEDE; background-repeat: repeat-x; color: #A94442; } 16 | #contentwrap .propmessageinfo { border-color: #9ACFEA; background-color: #D9EDF7; background-repeat: repeat-x; color: #31708F; } 17 | 18 | #contentwrap .propdescwrap { padding: 1.0em 1.0em 0; } 19 | #contentwrap .propdesc { max-width: 800px; margin-left: auto; margin-right: auto; } 20 | #contentwrap .propmainwrap { padding: 1.0em; } 21 | #contentwrap .propmain { max-width: 800px; margin-left: auto; margin-right: auto; } 22 | 23 | #menuwrap { float: left; width: 250px; min-width: 200px; max-width: 15%; height: 100%; overflow: auto; border-right: 1px solid #CCCCCC; font-size: 0.9em; background-color: #222222; color: #FAFAFA; display: flex; flex-direction: column; } 24 | #menuwrap .logo { text-align: center; user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; cursor: default; } 25 | #menuwrap .logo:last-child { flex-grow: 1; display: flex; } 26 | #menuwrap .logo > * { display: inline-block; margin: auto auto 0 auto; padding-top: 1.0em; border-right: 1px solid transparent; } 27 | #menuwrap .logo img { max-width: 100%; display: inline-block; } 28 | #menuwrap .logo + .menu { margin-top: 0; } 29 | #menuwrap .menu { margin-top: 1.0em; border-top: 1px solid #444444; padding-top: 1.2em; } 30 | #menuwrap .menu:first-child { margin-top: 0; border-top: 0 none; padding-top: 1.0em; } 31 | #menuwrap .menu .titlewrap { margin: 0 1.0em 0.85em; } 32 | #menuwrap .menu .title { font-size: 1.2em; font-weight: bold; padding-bottom: 0.2em; border-bottom: 2px solid #888888; } 33 | #menuwrap .menu a { display: block; padding: 0.5em 1.0em; color: #FAFAFA; text-decoration: none; } 34 | #menuwrap .menu a:hover { background-color: #444444; color :#FFFFFF; } 35 | 36 | #contentwrap.showmenu { white-space: nowrap; } 37 | #contentwrap.showmenu #navbutton { display: table-cell; } 38 | #contentwrap.showmenu .proptitletext { padding-left: 1.0em; } 39 | #contentwrap #navoverflowwrap { display: none; } 40 | #contentwrap.showmenu { overflow: hidden; } 41 | #contentwrap.showmenu #navoverflowwrap { display: block; position: absolute; width: 100%; height: 100%; z-index: 10000; cursor: pointer; background-color: #000000; opacity: 0.25; } 42 | 43 | #contentwrap:not(.nomenu) .proptitle { max-width: none; margin-left: 0; margin-right: 0; display: table-row; } 44 | #contentwrap:not(.nomenu) .proptitletext { display: table-cell; vertical-align: middle; } 45 | #contentwrap:not(.nomenu) .propmessage, #contentwrap:not(.nomenu) .propdesc, #contentwrap:not(.nomenu) .propmain { max-width: none; margin-left: 0; margin-right: 0; } 46 | 47 | @media (max-width: 1000px) { 48 | #menuwrap { display: none; } 49 | #menuwrap.showmenu { display: flex; } 50 | #contentwrap:not(.nomenu) #navbutton { display: table-cell; } 51 | #contentwrap:not(.nomenu) .proptitletext { padding-left: 1.0em; } 52 | } 53 | 54 | a { color: #4E88C2; text-decoration: none; } 55 | a:hover { color: #297ACC; text-decoration: underline; } 56 | 57 | .formitem { margin-top: 1.0em; } 58 | .formitem:first-child { margin-top: 0; } 59 | 60 | .formitemtitle { margin-bottom: 0.2em; font-weight: bold; } 61 | 62 | .formitemdata { position: relative; } 63 | 64 | .formitemdata table.formitemtable { border-collapse: collapse; } 65 | .formitemdata table.formitemtable > thead > tr > th, .formitemdata table.formitemtable > tbody > tr > td { padding: 0.3em 0.5em; border-left: 1px solid #CCCCCC; border-right: 1px solid #CCCCCC; vertical-align: top; } 66 | .formitemdata table.formitemtable > thead > tr > th { background-color: #222222; color: #FAFAFA; font-weight: normal; } 67 | .formitemdata table.formitemtable > thead > tr > th:first-child { border-left: 1px solid #222222; } 68 | .formitemdata table.formitemtable > thead > tr > th:last-child { border-right: 1px solid #222222; } 69 | .formitemdata table.formitemtable > tbody > tr:first-child > td { border-top: none; } 70 | .formitemdata table.formitemtable > tbody > tr:nth-child(even) { background-color: #F6F6F6; } 71 | .formitemdata table.formitemtable > tbody > tr:last-child { border-bottom: 1px solid #CCCCCC; } 72 | .formitemdata table.formitemtable > tbody > tr > td.nowrap { white-space: nowrap; } 73 | 74 | .formitemdata .textitemwrap > input { outline: none; } 75 | .formitemdata .textitemwrap > input.text { box-sizing: border-box; width: 100%; font-size: 0.9em; padding: 0.3em; border: 1px solid #BBBBBB; } 76 | .formitemdata .textitemwrap > input.text:focus, .formitemdata .textitemwrap > input.text:hover { border: 1px solid #888888; } 77 | 78 | .formitemdata .textareawrap > textarea { box-sizing: border-box; width: 100%; font-size: 0.9em; padding: 0.3em; border: 1px solid #BBBBBB; outline: none; } 79 | .formitemdata .textareawrap > textarea:focus, .formitemdata .textareawrap > textarea:hover { border: 1px solid #888888; } 80 | 81 | .formitemdata .selectitemwrap > select { box-sizing: border-box; width: 100%; font-size: 0.9em; padding: 0.3em; border: 1px solid #BBBBBB; outline: none; } 82 | .formitemdata .selectitemwrap > select:focus, .formitemdata .selectitemwrap > select:hover { border: 1px solid #888888; } 83 | 84 | .formitemdata .radioitemwrap, .formitemdata .checkboxitemwrap { margin-left: 1.7em; text-indent: -1.7em; } 85 | 86 | .formitemdata .staticwrap { font-size: 0.9em; } 87 | 88 | .fieldtablewrap { margin-top: 1.0em; } 89 | .fieldtablewrap > table.rowwrap { border-collapse: collapse; width: 100%; } 90 | .fieldtablewrap > table.rowwrap > tbody > tr > td { padding: 1.0em 1.0em 0 0; vertical-align: top; } 91 | .fieldtablewrap > table.rowwrap > tbody > tr:first-child > td { padding-top: 0; } 92 | .formfieldsresponsive .fieldtablewrap > table.rowwrap > tbody > tr > td:nth-last-child(2) { padding-right: 0; } 93 | .fieldtablewrap > table.rowwrap > tbody > tr > td:last-child { padding-right: 0; } 94 | .fieldtablewrap .formitemtitle { white-space: nowrap; } 95 | 96 | hr { margin: 1.0em 0 0 0; border: none; border-top: 1px solid #CCCCCC; } 97 | 98 | .formitemdesc { color: #333333; margin-top: 0.1em; margin-left: 0.5em; font-size: 0.9em; } 99 | 100 | .formitemresult { margin-left: 0.5em; font-size: 0.9em; } 101 | .formitemresult .formitemerror { background: url('flex_forms_error.png') 0 0.1em no-repeat; padding-left: 25px; color: #A94442; font-weight: bold; } 102 | 103 | form.ff_form .formsubmit { margin-top: 1.2em; margin-right: 1.0em; } 104 | form.ff_form .formsubmit input { margin-right: 1.0em; padding: 0.3em 1.0em; font-weight: bold; font-size: 1.0em; background-color: #222222; color: #FAFAFA; border: 1px solid #222222; } 105 | form.ff_form .formsubmit input:hover { background-color: #444444; color :#FFFFFF; } 106 | 107 | @media (max-width: 420px) { 108 | .fieldtablewrap { margin-top: 0; } 109 | .fieldtablewrap > table.rowwrap { display: block; } 110 | .fieldtablewrap > table.rowwrap > tbody { display: block; } 111 | .fieldtablewrap > table.rowwrap > tbody > tr { display: block; } 112 | .fieldtablewrap > table.rowwrap > tbody > tr > td { display: block; padding: 0; margin-top: 1.0em; max-width: 100%; } 113 | .formfieldsresponsive .fieldtablewrap > table.rowwrap > tbody > tr > td:last-child { display: none; } 114 | } 115 | 116 | 117 | /* FlexForms Extras styles for Admin Pack */ 118 | 119 | .formaccordionwrap.ui-accordion h3.ui-accordion-header { margin-top: 1.0em; border: 1px solid #CCCCCC; background: #F6F6F6; font-weight: bold; color: #222222; } 120 | .formaccordionwrap.ui-accordion:first-child h3.ui-accordion-header:first-child { margin-top: 0; } 121 | .formaccordionwrap.ui-accordion h3.ui-accordion-header.ui-state-hover { border: 1px solid #C5C5C5; background: #F0F0F0; font-weight: bold; color: #222222; } 122 | .formaccordionwrap.ui-accordion h3.ui-accordion-header .ui-icon { background-image: url("jquery_ui_themes/adminpack/images/ui-icons_333333_256x240.png"); } 123 | .formaccordionwrap.ui-accordion h3.ui-accordion-header.ui-state-active { border: 1px solid #444444; background: #222222; font-weight: bold; color: #ffffff; } 124 | .formaccordionwrap.ui-accordion h3.ui-accordion-header.ui-state-active .ui-icon { background-image: url("jquery_ui_themes/adminpack/images/ui-icons_fafafa_256x240.png"); } 125 | .formaccordionwrap.ui-accordion h3.ui-accordion-header.ui-state-active.ui-state-hover { border: 1px solid #444444; background: #333333; font-weight: bold; color: #ffffff; } 126 | 127 | .formaccordionwrap.ui-accordion .ui-helper-reset { line-height: normal; } 128 | .formaccordionwrap.ui-accordion .formaccordionitems.ui-widget-content a { color: #4E88C2; text-decoration: none; } 129 | .formaccordionwrap.ui-accordion .formaccordionitems.ui-widget-content a:hover { color: #297ACC; text-decoration: underline; } 130 | .formaccordionwrap.ui-accordion .formaccordionitems.ui-accordion-content { padding: 0 1.5em 1.0em; } 131 | .formaccordionwrap.ui-accordion .formaccordionitems.ui-accordion-content > .formitem:first-child { margin-top: 1.0em; } 132 | 133 | .formitemdata input.date { box-sizing: border-box; width: 100%; font-size: 0.9em; padding: 0.3em; border: 1px solid #BBBBBB; } 134 | .formitemdata input.date:focus, .formitemdata input.date:hover { border: 1px solid #888888; } 135 | 136 | .ui-state-default.ui-state-highlight, .ui-widget-content .ui-state-default.ui-state-highlight { border: 1px solid #c5c5c5; background: #f6f6f6; color: #454545; } 137 | .ui-state-active.ui-state-highlight, .ui-widget-content .ui-state-active.ui-state-highlight { border: 1px solid #444444; background: #222222; color: #ffffff; } 138 | .ui-state-hover.ui-state-highlight, .ui-widget-content .ui-state-hover.ui-state-highlight { border: 1px solid #444444; background: #333333; color: #ffffff; } 139 | 140 | .formitemdata .uix-multiselect .ui-widget-header div.header-text { white-space: normal; } 141 | .formitemdata .uix-multiselect .ui-widget-header { padding-top: 0.3em; padding-bottom: 0.3em; } 142 | .formitemdata .uix-multiselect .ui-widget-header .uix-control-right { padding-top: 0.8em; } 143 | 144 | .formitemdata .ui-multiselect { padding: 0.3em; } 145 | .formitemdata .ui-multiselect.ui-widget.ui-state-default { border: 1px solid #444444; background: #333333; color: #ffffff; } 146 | .formitemdata .ui-multiselect.ui-widget.ui-state-default span.ui-icon { background-image: url("jquery_ui_themes/adminpack/images/ui-icons_ffffff_256x240.png"); } 147 | .formitemdata .ui-multiselect.ui-widget.ui-state-active { border: 1px solid #444444; background: #222222; color: #ffffff; } 148 | .formitemdata .ui-multiselect.ui-widget.ui-state-hover { border: 1px solid #444444; background: #222222; color: #ffffff; } 149 | .formitemdata .ui-multiselect span.ui-icon { margin-top: 0.2em; } 150 | 151 | .formitemdata .select2-container { display: block; } 152 | .formitemdata .select2-container-multi .select2-choices .select2-search-choice { line-height: 17px; } 153 | .formitemdata .select2-search-choice-close { top: 5px; } 154 | .select2-results .select2-highlighted { background-color: #444444 !important; } 155 | 156 | .formitemdata .draghandle { cursor: move; } 157 | .formitemdata .dragactive { background-color: #E3E3E3; } 158 | 159 | .formitemdata table.tablecards > thead > th:nth-last-child(2) { border-right: 1px solid #222222; } 160 | .formitemdata table.tablecards.tablecard-show > thead > th:nth-last-child(2) { border-right: 1px solid #CCCCCC; } 161 | .formitemdata table.tablecard-show { width: 100%; } 162 | .formitemdata table.tablecard-show-nohead > tbody > tr:first-child > td { border-top: 1px solid #CCCCCC; } 163 | 164 | .formitemdata .tablebodyscroll-scroller3 > table.tablecard-show-nohead > thead > tr { display: none; } 165 | 166 | .formitemdata .tablebodyscroll-shadow-top .tablebodyscroll-scroller-shadow-top, .formitemdata .tablebodyscroll-shadow-both .tablebodyscroll-scroller-shadow-top { border-top: 1px solid #CCCCCC; } 167 | 168 | 169 | /* FlexForms Modules styles for Admin Pack */ 170 | 171 | .formitemdata table.tablecard-show .calendar_day_of_week { margin-top: 0.5em; border-top: 1px solid #E0E0E0; padding-top: 0.5em; font-weight: bold; } 172 | .formitemdata table.tablecard-show .calendar_day_of_week:first-child { margin-top: 0; border-top: none; padding-top: 0; } 173 | 174 | .formitemdata .tablefiltersearchwrap { margin-bottom: 0.5em; } 175 | .formitemdata table.ff_tablefilter > tbody > tr.visible { background-color: #FFFFFF; } 176 | .formitemdata table.ff_tablefilter > tbody > tr.visible.altrow { background-color: #F6F6F6; } 177 | .formitemdata table.ff_tablefilter > tbody > tr.visible.lastrow { border-bottom: 1px solid #CCCCCC; } 178 | -------------------------------------------------------------------------------- /support/multiselect-widget/jquery.multiselect.min.js: -------------------------------------------------------------------------------- 1 | /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ 2 | /* 3 | * jQuery MultiSelect UI Widget 2.0.0 4 | * Copyright (c) 2012 Eric Hynds 5 | * 6 | * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ 7 | * 8 | * Depends: 9 | * - jQuery 1.4.2+ 10 | * - jQuery UI 1.8 widget factory 11 | * 12 | * Optional: 13 | * - jQuery UI effects 14 | * - jQuery UI position utility 15 | * 16 | * Dual licensed under the MIT and GPL licenses: 17 | * http://www.opensource.org/licenses/mit-license.php 18 | * http://www.gnu.org/licenses/gpl.html 19 | * 20 | */ 21 | (function($,undefined){var multiselectID=0;var $doc=$(document);$.widget("ech.multiselect",{options:{header:true,height:175,minWidth:225,classes:"",checkAllText:"Check all",uncheckAllText:"Uncheck all",noneSelectedText:"Select options",showCheckAll:true,showUncheckAll:true,selectedText:"# selected",selectedList:0,closeIcon:"ui-icon-circle-close",show:null,hide:null,autoOpen:false,multiple:true,position:{},appendTo:null,menuWidth:null,selectedListSeparator:", ",disableInputsOnToggle:true,groupColumns:false},_getAppendEl:function(){var element=this.options.appendTo;if(element){element=element.jquery||element.nodeType?$(element):this.document.find(element).eq(0)}if(!element||!element[0]){element=this.element.closest(".ui-front, dialog")}if(!element.length){element=this.document[0].body}return element},_create:function(){var el=this.element;var o=this.options;this.speed=$.fx.speeds._default;this._isOpen=false;this.inputIdCounter=0;this._namespaceID=this.eventNamespace||"multiselect"+multiselectID;var button=(this.button=$('')).addClass("ui-multiselect ui-widget ui-state-default ui-corner-all").addClass(o.classes).attr({title:el.attr("title"),tabIndex:el.attr("tabIndex"),id:el.attr("id")?el.attr("id")+"_ms":null}).prop("aria-haspopup",true).insertAfter(el);this.buttonlabel=$("").html(o.noneSelectedText).appendTo(button);this.menu=$("
").addClass("ui-multiselect-menu ui-widget ui-widget-content ui-corner-all").addClass(o.classes).appendTo(this._getAppendEl());this.header=$("
").addClass("ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix").appendTo(this.menu);this.headerLinkContainer=$("