/** * * Copyright (c) 2009 Tony Dewan (http://www.tonydewan.com/) * Licensed under the MIT License: * http://www.opensource.org/licenses/mit-license.php * * Project home: * http://www.tonydewan.com/code/checkToggle/ * */ (function($) { /** * Version 1.0 * Replaces checkboxes with a toggle switch. * usage: $("input[type='checkbox']").checkToggle(settings); * * @name checkToggle * @type jquery * @param Hash settings Settings * @param String settings[on_label] Text used for the left-side (on) label. Defaults to "On" * @param String settings[off_label] Text used for the right-side (off) label. Defaults to "Off" * @param String settings[on_bg_color] Hex background color for On state * @param String settings[off_bg_color] Hex background color for Off state * @param String settings[skin_dir] Document relative (or absolute) path to the skin directory * @param Bool settings[bypass_skin] Flags whether to bypass the inclusion of the skin.css file. Used if you've included the skin styles somewhere else already. */ $.fn.checkToggle = function(action, settings) { if (typeof(action) == 'object' || typeof(action) == 'undefined') { settings = action || {}; action = 'initialize'; } settings = $.extend({ on_label : 'Yes', on_label_color : '#333333', on_bg_color : '#8FE38D', off_label : 'No', off_label_color : '#cccccc', off_bg_color: '#F8837C', skin_dir : "skin/", bypass_skin : false, on_callback : function(el) {}, off_callback : function(el) {} }, settings); // FIXME (Didier Lafforgue) it works but it doesn't scale if we handle another locale if (typeof I18nLocale != 'undefined' && I18nLocale == 'fr') { settings.on_label = 'Oui'; settings.off_label = 'Non'; } function showUncheckedState(element) { element.parent().prev().css("color",settings.off_label_color); element.parent().next().css("color",settings.on_label_color); element.parent().css("background-color", settings.off_bg_color).removeClass('on'); element.parent().parent().prev().removeAttr("checked").trigger('change'); element.removeClass("left").addClass("right"); } function showCheckedState(element) { element.parent().prev().css("color",settings.on_label_color); element.parent().next().css("color",settings.off_label_color); element.parent().css("background-color", settings.on_bg_color).addClass('on'); element.parent().parent().prev().attr("checked", "checked").trigger('change'); element.removeClass("right").addClass("left"); } function toggle(element){ var checked = $(element).parent().parent().prev().is(':checked'); // if it's set to on if(checked){ $(element).animate({marginLeft: '0px'}, 100, // callback function function(){ showUncheckedState($(element)); if (typeof $.fn.publish != 'undefined') $.publish('toggle.' + $(element).parent().parent().prev().attr('id') + '.unchecked', []); settings.off_callback(); }); } else { $(element).animate({marginLeft: '15px'}, 100, // callback function function(){ showCheckedState($(element)); if (typeof $.fn.publish != 'undefined') $.publish('toggle.' + $(element).parent().parent().prev().attr('id') + '.checked', []); settings.on_callback(); }); } }; return this.each(function () { if (action == 'initialize') {// initialize the UI element if ($(this).hasClass('simple')) return; // hide the checkbox $(this).css('display','none'); // insert the new toggle markup if($(this).attr("checked") == "checked" || $(this).attr("checked") == true){ $(this).after('