/*! ========================================================================
 * Bootstrap Toggle: bootstrap-toggle.js v2.2.0
 * http://www.bootstraptoggle.com
 * ========================================================================
 * Copyright 2014 Min Hur, The New York Times Company
 * Licensed under MIT
 * ======================================================================== */


+function ($) {
    'use strict';

    // TOGGLE PUBLIC CLASS DEFINITION
    // ==============================

    var Toggle = function (element, options) {
        this.$element  = $(element)
            this.options   = $.extend({}, this.defaults(), options)
            this.render()
    }

    Toggle.VERSION  = '2.2.0'

        Toggle.DEFAULTS = {
            on: 'On',
            off: 'Off',
            onstyle: 'primary',
            offstyle: 'default',
            size: 'normal',
            style: '',
            width: null,
            height: null
        }

    Toggle.prototype.defaults = function() {
        return {
            on: this.$element.attr('data-on') || Toggle.DEFAULTS.on,
            off: this.$element.attr('data-off') || Toggle.DEFAULTS.off,
            onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle,
            offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle,
            size: this.$element.attr('data-size') || Toggle.DEFAULTS.size,
            style: this.$element.attr('data-style') || Toggle.DEFAULTS.style,
            width: this.$element.attr('data-width') || Toggle.DEFAULTS.width,
            height: this.$element.attr('data-height') || Toggle.DEFAULTS.height
        }
    }

    Toggle.prototype.render = function () {
        this._onstyle = 'btn-' + this.options.onstyle
            this._offstyle = 'btn-' + this.options.offstyle
            var size = this.options.size === 'large' ? 'btn-lg'
            : this.options.size === 'small' ? 'btn-sm'
            : this.options.size === 'mini' ? 'btn-xs'
            : ''
            var $toggleOn = $('<label class="btn">').html(this.options.on)
            .addClass(this._onstyle + ' ' + size)
            var $toggleOff = $('<label class="btn">').html(this.options.off)
            .addClass(this._offstyle + ' ' + size + ' active')
            var $toggleHandle = $('<span class="toggle-handle btn btn-default">')
            .addClass(size)
            var $toggleGroup = $('<div class="toggle-group">')
            .append($toggleOn, $toggleOff, $toggleHandle)
            var $toggle = $('<div class="toggle btn" data-toggle="toggle">')
            .addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' )
            .addClass(size).addClass(this.options.style)

            this.$element.wrap($toggle)
            $.extend(this, {
                $toggle: this.$element.parent(),
            $toggleOn: $toggleOn,
            $toggleOff: $toggleOff,
            $toggleGroup: $toggleGroup
            })
        this.$toggle.append($toggleGroup)

            var width = this.options.width || Math.max($toggleOn.outerWidth(), $toggleOff.outerWidth())+($toggleHandle.outerWidth()/2)
            var height = this.options.height || Math.max($toggleOn.outerHeight(), $toggleOff.outerHeight())
            $toggleOn.addClass('toggle-on')
            $toggleOff.addClass('toggle-off')
            this.$toggle.css({ width: width, height: height })
            if (this.options.height) {
                $toggleOn.css('line-height', $toggleOn.height() + 'px')
                    $toggleOff.css('line-height', $toggleOff.height() + 'px')
            }
        this.update(true)
            this.trigger(true)
    }

    Toggle.prototype.toggle = function () {
        if (this.$element.prop('checked')) this.off()
        else this.on()
    }

    Toggle.prototype.on = function (silent) {
        if (this.$element.prop('disabled')) return false
            this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle)
                this.$element.prop('checked', true)
                if (!silent) this.trigger()
    }

    Toggle.prototype.off = function (silent) {
        if (this.$element.prop('disabled')) return false
            this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off')
                this.$element.prop('checked', false)
                if (!silent) this.trigger()
    }

    Toggle.prototype.enable = function () {
        this.$toggle.removeAttr('disabled')
            this.$element.prop('disabled', false)
    }

    Toggle.prototype.disable = function () {
        this.$toggle.attr('disabled', 'disabled')
            this.$element.prop('disabled', true)
    }

    Toggle.prototype.update = function (silent) {
        if (this.$element.prop('disabled')) this.disable()
        else this.enable()
            if (this.$element.prop('checked')) this.on(silent)
            else this.off(silent)
    }

    Toggle.prototype.trigger = function (silent) {
        this.$element.off('change.bs.toggle')
            if (!silent) this.$element.change()
                this.$element.on('change.bs.toggle', $.proxy(function() {
                    this.update()
                }, this))
    }

    Toggle.prototype.destroy = function() {
        this.$element.off('change.bs.toggle')
            this.$toggleGroup.remove()
            this.$element.removeData('bs.toggle')
            this.$element.unwrap()
    }

    // TOGGLE PLUGIN DEFINITION
    // ========================

    function Plugin(option) {
        return this.each(function () {
            var $this   = $(this)
            var data    = $this.data('bs.toggle')
            var options = typeof option == 'object' && option

            if (!data) $this.data('bs.toggle', (data = new Toggle(this, options)))
            if (typeof option == 'string' && data[option]) data[option]()
        })
    }

    var old = $.fn.bootstrapToggle

        $.fn.bootstrapToggle             = Plugin
        $.fn.bootstrapToggle.Constructor = Toggle

        // TOGGLE NO CONFLICT
        // ==================

        $.fn.toggle.noConflict = function () {
            $.fn.bootstrapToggle = old
                return this
        }

    // TOGGLE DATA-API
    // ===============

    $(function() {
        $('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle()
    })

    $(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) {
        var $checkbox = $(this).find('input[type=checkbox]')
        $checkbox.bootstrapToggle('toggle')
        e.preventDefault()
    })

}(jQuery);
