PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/themes/libero/js/rst-selectbox/jquery.rs.selectbox.js

https://gitlab.com/meixnertobias/thaimaidaiproductionwp
JavaScript | 247 lines | 176 code | 25 blank | 46 comment | 49 complexity | b22a542b68af7f71b644d4fff394c8a3 MD5 | raw file
  1. /*
  2. * Plugin name: Redsand Jquery Custom Select-box UI
  3. * Author: phannhuthan
  4. * Uri: http://redsand.vn
  5. * Version: 3.5
  6. * Last modify: 8/6/2013
  7. */
  8. /* param
  9. options = {
  10. titleAsDefault: true,
  11. height: 200,
  12. selectedHtmlFilter: function(html){
  13. return html;
  14. },
  15. itemHtmlFilter: function(html, value){
  16. return html;
  17. },
  18. itemTemplate: function(html, value){
  19. return '<span class="rs-select-item">' + html + '</span>';
  20. },
  21. change: function(event, new_value, custom_ui, select){
  22. ...
  23. },
  24. afterInit: function(custom_ui, select){
  25. ...
  26. },
  27. afterShow: function(custom_ui, select){
  28. ...
  29. },
  30. beforeShow: function(custom_ui, select){
  31. }
  32. }
  33. */
  34. (function(old) {
  35. jQuery.fn.attr = function() {
  36. if(arguments.length === 0) {
  37. if(this.length === 0) {
  38. return null;
  39. }
  40. var obj = {};
  41. jQuery.each(this[0].attributes, function() {
  42. if(this.specified) {
  43. obj[this.name] = this.value;
  44. }
  45. });
  46. return obj;
  47. }
  48. return old.apply(this, arguments);
  49. };
  50. })(jQuery.fn.attr);
  51. (function ($) {
  52. $.fn.rsSelectBox = function (options, value) {
  53. if (options == "value") {
  54. if (value != undefined) {
  55. if (this.is('select')) {
  56. this.val(value);
  57. this.prev().find('.rs-select-options').children().eq(this.find('option:selected').index()).trigger('click');
  58. }
  59. else {
  60. this.next().val(value);
  61. this.find('.rs-select-options').children().eq(this.next().find('option:selected').index()).trigger('click');
  62. }
  63. return this;
  64. }
  65. return this.is('select') ? this.val() : this.next().val();
  66. }
  67. options = $.extend({
  68. titleAsDefault: true,
  69. height: 200,
  70. change: false,
  71. selectedHtmlFilter: function (html) {
  72. return html;
  73. },
  74. itemHtmlFilter: function(html, value){
  75. return html;
  76. },
  77. itemTemplate: function(html, value, attr){
  78. if( value != '' )
  79. return '<span '+ attr +' class="rs-select-item">' + html + '</span>';
  80. else
  81. return '<span '+ attr +' class="rs-select-item hidden">' + html + '</span>';
  82. },
  83. afterInit: false,
  84. afterShow: false,
  85. beforeShow: false
  86. }, options);
  87. this.filter('select').each(function () {
  88. var slto = $(this);
  89. var sltn, sltt, sltv, slti, opts, items;
  90. if (!slto.is('.rs-select-hidden')) {
  91. sltn = '<div class="rs-select-box">';
  92. sltn += '<div class="rs-select-inner">';
  93. sltn += '<div class="rs-select-selected">';
  94. sltn += '<div class="rs-select-value"></div>';
  95. // sltn += '<div class="rs-select-arrow"></div>';
  96. sltn += '</div>';
  97. sltn += '<div class="rs-select-options"></div>';
  98. sltn += '</div>';
  99. sltn += '</div>';
  100. slto.before(sltn);
  101. }
  102. sltn = slto.prev('.rs-select-box');
  103. sltt = sltn.find('.rs-select-selected');
  104. sltv = sltn.find('.rs-select-value');
  105. //slti = sltn.find('.rs-select-inner');
  106. opts = sltn.find('.rs-select-options');
  107. sltn.addClass(slto.attr('class')).removeClass('rs-select-hidden').attr('title', slto.attr('title'));
  108. opts.empty().css('overflow', 'auto');
  109. opts.css('max-height', options.height);
  110. slto.addClass('rs-select-hidden').find('option').each(function () {
  111. var object = $(this).attr();
  112. delete object.class;
  113. var attr = '';
  114. $.each(object, function(key, value){
  115. attr += key +'="'+ object[key] +'" ';
  116. });
  117. if( object["data-color"] != undefined ) {
  118. var html = '<span style="background-color: '+ object["data-color"] +';" class="rst-color"></span>';
  119. } else {
  120. var html = options.itemHtmlFilter($(this).text(), $(this).val());
  121. }
  122. var temp = options.itemTemplate(html, $(this).val(), attr);
  123. opts.append(temp);
  124. });
  125. items = opts.children();
  126. if (options.titleAsDefault && (slto.find('option').length == 0 || slto.attr('title') && slto.find('option[selected]').length == 0 && slto.find('option:selected').index() == 0)){
  127. sltv.text(options.selectedHtmlFilter(slto.attr('title')));
  128. }
  129. else {
  130. items.eq(slto.find('option:selected').index()).addClass('active');
  131. sltv.text(options.selectedHtmlFilter(slto.find('option:selected').text()));
  132. }
  133. sltn.toggleClass('has-value', sltv.text() == slto.find('option:selected').text() && slto.val() != "");
  134. if (slto.is(':disabled')) sltn.addClass('disabled');
  135. sltn.toggleClass('has-scrollbar', opts.show().scrollTop(1).scrollTop() > 0);
  136. // opts.scrollTop(0).hide();
  137. items.unbind('click.rs-select-box').bind('click.rs-select-box', function () {
  138. if (!slto.is(':disabled')) {
  139. if( !$(this).hasClass('active') ) {
  140. var opt = slto.find('option').eq($(this).index());
  141. if (!$(this).is('.active')) {
  142. slto.find(':selected').attr('selected', false).removeAttr('selected');
  143. opt.attr('selected', true);
  144. items.filter('.active').removeClass('active');
  145. $(this).addClass('active');
  146. sltv.text(options.selectedHtmlFilter(opt.text()));
  147. if (options.change) options.change(opt.val(), sltn, slto);
  148. sltn.toggleClass('has-value', opt.val() != "");
  149. slto.trigger('change');
  150. }
  151. // opts.slideUp(200);
  152. sltn.removeClass('expanded');
  153. slto.trigger('click');
  154. }
  155. else {
  156. $(this).removeClass('active');
  157. slto.val('');
  158. slto.trigger('change');
  159. }
  160. }
  161. });
  162. slto.unbind('focus.rs-select-box').bind('focus.rs-select-box', function () {
  163. if (!slto.is(':disabled')) {
  164. if (options.beforeShow) {
  165. options.beforeShow(sltn, slto);
  166. }
  167. opts.slideDown(200, function () {
  168. if (options.afterShow && opts.is(':visible')) {
  169. options.afterShow(sltn, slto);
  170. }
  171. });
  172. sltn.addClass('focus expanded');
  173. }
  174. });
  175. slto.unbind('blur.rs-select-box').bind('blur.rs-select-box', function () {
  176. sltn.removeClass('focus');
  177. });
  178. sltt.unbind('click.rs-select-box').bind('click.rs-select-box', function () {
  179. if (!slto.is(':disabled')) {
  180. if (sltn.is('.expanded')) {
  181. // opts.slideUp(200);
  182. sltn.removeClass('expanded');
  183. }
  184. else {
  185. slto.trigger('focus');
  186. }
  187. slto.trigger('click');
  188. }
  189. });
  190. // $(document).unbind('click.rs-select-box').bind('click.rs-select-box', function (event) {
  191. // if (!$(event.target).is('.rs-select-hidden')) {
  192. // $('.rs-select-box').not($(event.target).parents('.rs-select-box')).removeClass('focus expanded').find('.rs-select-options').slideUp(200);
  193. // }
  194. // });
  195. $(document).unbind('keydown.rs-select-box').bind('keydown.rs-select-box', function (event) {
  196. if (sltn.is('.expanded')) {
  197. var sp = items.filter('.active').removeClass('active');
  198. if (event.which == 40) {
  199. sp = sp.next().size() ? sp.next() : items.first();
  200. }
  201. if (event.which == 38) {
  202. sp = sp.prev().size() ? sp.prev() : items.last();
  203. }
  204. if (event.which == 13) {
  205. sp.trigger('click');
  206. }
  207. sp.addClass('active');
  208. sltv.text(sp.text());
  209. event.preventDefault();
  210. }
  211. });
  212. if (options.afterInit) options.afterInit(sltn, slto);
  213. });
  214. this.filter('.rs-select-box').each(function () {
  215. $(this).next().rsSelectBox(options);
  216. });
  217. return this;
  218. }
  219. } (jQuery));