/**
* YvanUI
*
* Copyright (c) 2018 www.yvanui.com. All rights reserved.
* @author luoyifan@qq.com
* @time 2018-11-27 11:16:00
*/
(function ($) {
var idx = 1;
function createBox(target) {
//_2
var $dom = $(
'
\n' +
'
\n' +
'
\n' +
'
\n' +
'
'
).insertAfter(target);
var t = $(target);
t.addClass("radiobutton-f").hide();
var name = t.attr("name");
if (name) {
//安排新的 input 框,取代他的名字
t.removeAttr("name").attr("radiobuttonName", name);
$dom.find(".radiobutton-value").attr("name", name);
}
return $dom;
}
function init(target) {
//_6
var state = $.data(target, "radiobutton");
var opts = state.options;
var $dom = state.radiobutton;
var id = "_yvan_radiobutton_" + (++idx);
$dom.find(".radiobutton-value").attr("id", id);
if (opts.label) {
$dom.find('div').html(opts.label);
} else {
$dom.find('div').html('');
}
$(target).radiobutton("setValue", opts.value);
setValue(target, opts.checked);
setDisable(target, opts.disabled);
}
function bindEvent(target) {
//_e
var state = $.data(target, "radiobutton");
var opts = state.options;
var $dom = state.radiobutton;
$dom.unbind(".radiobutton").bind("click.radiobutton", function () {
if (!opts.disabled) {
setValue(target, true);
}
});
}
function setValue(target, value) {
if (value) {
var f = $(target).closest('form');
var name = $(target).attr('radiobuttonName');
f.find(".radiobutton-f[radiobuttonName=\"" + name + "\"]").each(function () {
if (this !== target) {
setV(this, false);
}
});
setV(target, true);
} else {
setV(target, false);
}
function setV(b, value) {
//_c
var state = $.data(b, "radiobutton");
var opts = state.options;
var $dom = state.radiobutton;
$dom.find(".radiobutton-value")._propAttr("checked", value);
if (value) {
$dom.addClass('yvan-radioed');
$dom.find('i').remove();
$('')
.insertAfter($dom.find(".radiobutton-value")[0]);
} else {
$dom.removeClass('yvan-radioed');
$dom.find('i').remove();
$('')
.insertAfter($dom.find(".radiobutton-value")[0]);
}
if (opts.checked !== value) {
opts.checked = value;
opts.onChange.call(b, value);
}
}
}
function setDisable(target, value) {
//_d
var state = $.data(target, "radiobutton");
var opts = state.options;
var $dom = state.radiobutton;
var rv = $dom.find(".radiobutton-value");
opts.disabled = value;
if (value) {
$(target).add(rv)._propAttr("disabled", true);
$dom.addClass('yvan-radio-disabled').addClass('yvan-disabled');
} else {
$(target).add(rv)._propAttr("disabled", false);
$dom.removeClass('yvan-radio-disabled').removeClass('yvan-disabled');
}
}
$.fn.radiobutton = function (options, param) {
if (typeof options == 'string') {
return $.fn.radiobutton.methods[options](this, param);
}
options = options || {};
return this.each(function () {
var state = $.data(this, 'radiobutton');
if (state) {
$.extend(state.options, options);
} else {
state = $.data(this, 'radiobutton', {
options: $.extend({},
$.fn.radiobutton.defaults,
$.fn.radiobutton.parseOptions(this), options),
radiobutton: createBox(this)
});
}
state.options.originalChecked = state.options.checked;
init(this); //_6
bindEvent(this); //_e
//_13
});
};
$.fn.radiobutton.methods = {
options: function (jq) {
var opts = jq.data("radiobutton");
return $.extend(opts.options, { value: opts.radiobutton.find(".radiobutton-value").val() });
}, radiobutton: function (jq, value) {
var state = $.data(jq[0], "radiobutton");
return state.radiobutton;
}, setValue: function (jq, value) {
return jq.each(function () {
$(this).val(value);
$.data(this, "radiobutton").radiobutton.find(".radiobutton-value").val(value);
});
}, isChecked: function (jq, value) {
return $.data(jq[0], "radiobutton").radiobutton.find(".radiobutton-value").is(':checked');
}, enable: function (jq) {
return jq.each(function () {
setDisable(this, false);
});
}, disable: function (jq) {
return jq.each(function () {
setDisable(this, true);
});
}, check: function (jq) {
return jq.each(function () {
setValue(this, true);
});
}, uncheck: function (jq) {
return jq.each(function () {
setValue(this, false);
});
}, clear: function (jq) {
return jq.each(function () {
setValue(this, false);
});
}, reset: function (jq) {
return jq.each(function () {
var _28 = $(this).radiobutton("options");
setValue(this, _28.originalChecked);
});
}
};
$.fn.radiobutton.parseOptions = function (html) {
var t = $(html);
return $.extend({},
$.parser.parseOptions(html, ["label", { labelWidth: "number" }]),
{
value: (t.val() || undefined),
checked: (t.attr("checked") ? true : undefined),
disabled: (t.attr("disabled") ? true : undefined)
});
};
$.fn.radiobutton.defaults = {
value: null,
disabled: false,
checked: false,
label: null,
onChange: function (value) {
}
};
})(jQuery);