123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /*
- * jQuery Custom Forms Plugin 1.0
- * www.ZURB.com
- * Copyright 2010, ZURB
- * Free to use under the MIT license.
- * http://www.opensource.org/licenses/mit-license.php
- */
- jQuery(document).ready(function ($) {
-
- function appendCustomMarkup(type) {
- $('form.custom input:' + type).each(function () {
- var $this = $(this).hide(),
- $span = $this.next('span.custom.' + type);
- if ($span.length === 0) {
- $span = $('<span class="custom ' + type + '"></span>').insertAfter($this);
- }
- $span.toggleClass('checked', $this.is(':checked'));
- });
- }
- appendCustomMarkup('checkbox');
- appendCustomMarkup('radio');
- function appendCustomSelect(sel) {
- var $this = $(sel),
- $customSelect = $this.next('div.custom.dropdown'),
- $options = $this.find('option'),
- maxWidth = 0,
- $li;
- if ($customSelect.length === 0) {
- $customSelect = $('<div class="custom dropdown"><a href="#" class="selector"></a><ul></ul></div>"');
- $options.each(function () {
- $li = $('<li>' + $(this).html() + '</li>');
- $customSelect.find('ul').append($li);
- });
- $customSelect.prepend('<a href="#" class="current">' + $options.first().html() + '</a>');
- $this.after($customSelect);
- $this.hide();
-
- } else {
- // refresh the ul with options from the select in case the supplied markup doesn't match
- $customSelect.find('ul').html('');
- $options.each(function () {
- $li = $('<li>' + $(this).html() + '</li>');
- $customSelect.find('ul').append($li);
- });
- }
- $options.each(function (index) {
- if (this.selected) {
- $customSelect.find('li').eq(index).addClass('selected');
- $customSelect.find('.current').html($(this).html());
- }
- });
- $customSelect.find('li').each(function () {
- $customSelect.addClass('open');
- if ($(this).outerWidth() > maxWidth) {
- maxWidth = $(this).outerWidth();
- }
- $customSelect.removeClass('open');
- });
- $customSelect.css('width', maxWidth + 18 + 'px');
- $customSelect.find('ul').css('width', maxWidth + 16 + 'px');
- }
- $('form.custom select').each(function () {
- appendCustomSelect(this);
- });
-
- });
- (function ($) {
-
- function refreshCustomSelect($select) {
- var maxWidth = 0,
- $customSelect = $select.next();
- $options = $select.find('option');
- $customSelect.find('ul').html('');
-
- $options.each(function () {
- $li = $('<li>' + $(this).html() + '</li>');
- $customSelect.find('ul').append($li);
- });
-
- // re-populate
- $options.each(function (index) {
- if (this.selected) {
- $customSelect.find('li').eq(index).addClass('selected');
- $customSelect.find('.current').html($(this).html());
- }
- });
-
- // fix width
- $customSelect.removeAttr('style')
- .find('ul').removeAttr('style');
- $customSelect.find('li').each(function () {
- $customSelect.addClass('open');
- if ($(this).outerWidth() > maxWidth) {
- maxWidth = $(this).outerWidth();
- }
- $customSelect.removeClass('open');
- });
- $customSelect.css('width', maxWidth + 18 + 'px');
- $customSelect.find('ul').css('width', maxWidth + 16 + 'px');
-
- }
-
- function toggleCheckbox($element) {
- var $input = $element.prev(),
- input = $input[0];
- input.checked = ((input.checked) ? false : true);
- $element.toggleClass('checked');
-
- $input.trigger('change');
- }
-
- function toggleRadio($element) {
- var $input = $element.prev(),
- input = $input[0];
- $('input:radio[name="' + $input.attr('name') + '"]').each(function () {
- $(this).next().removeClass('checked');
- });
- input.checked = ((input.checked) ? false : true);
- $element.toggleClass('checked');
-
- $input.trigger('change');
- }
-
- $('form.custom span.custom.checkbox').live('click', function (event) {
- event.preventDefault();
- event.stopPropagation();
-
- toggleCheckbox($(this));
- });
-
- $('form.custom span.custom.radio').live('click', function (event) {
- event.preventDefault();
- event.stopPropagation();
-
- toggleRadio($(this));
- });
-
- $('form.custom select').live('change', function (event) {
- refreshCustomSelect($(this));
- });
-
- $('form.custom label').live('click', function (event) {
- var $associatedElement = $('#' + $(this).attr('for')),
- $customCheckbox,
- $customRadio;
- if ($associatedElement.length !== 0) {
- if ($associatedElement.attr('type') === 'checkbox') {
- event.preventDefault();
- $customCheckbox = $(this).find('span.custom.checkbox');
- toggleCheckbox($customCheckbox);
- } else if ($associatedElement.attr('type') === 'radio') {
- event.preventDefault();
- $customRadio = $(this).find('span.custom.radio');
- toggleRadio($customRadio);
- }
- }
- });
- $('form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector').live('click', function (event) {
- var $this = $(this),
- $dropdown = $this.closest('div.custom.dropdown');
-
- event.preventDefault();
- $dropdown.toggleClass('open');
-
- if ($dropdown.hasClass('open')) {
- $(document).bind('click.customdropdown', function (event) {
- $dropdown.removeClass('open');
- $(document).unbind('.customdropdown');
- });
- } else {
- $(document).unbind('.customdropdown');
- }
- });
-
- $('form.custom div.custom.dropdown li').live('click', function (event) {
- var $this = $(this),
- $customDropdown = $this.closest('div.custom.dropdown'),
- $select = $customDropdown.prev(),
- selectedIndex = 0;
-
- event.preventDefault();
- event.stopPropagation();
-
- $this
- .closest('ul')
- .find('li')
- .removeClass('selected');
- $this.addClass('selected');
-
- $customDropdown
- .removeClass('open')
- .find('a.current')
- .html($this.html());
-
- $this.closest('ul').find('li').each(function (index) {
- if ($this[0] == this) {
- selectedIndex = index;
- }
-
- });
- $select[0].selectedIndex = selectedIndex;
-
- $select.trigger('change');
- });
- })(jQuery);
|