/*global jQuery */

"use strict";

(function ($) {
	function Radio(radio, conf) {
		var publ = {}, priv = {};


		priv.defaults = {
			styledRadioClass: 'styledRadio'
		};


		priv.init = function (radio, conf) {
			priv.initVariables();

			priv.storeSettings(conf);
			priv.storeElements();

			priv.main();
		};


		priv.initVariables = function () {
			priv.radio       = null;
			priv.label       = null;
			priv.settings    = null;
			priv.styledRadio = null;
			priv.radioState  = null;
		};


		priv.storeSettings = function (conf) {
			priv.settings = $.extend(priv.defaults, conf);

			priv.settings.styledRadioSelector = '.' + priv.settings.styledRadioClass;
		};


		priv.storeElements = function () {
			priv.radio = $(radio);
			priv.label = $('label[for=' + priv.radio.attr('id') + ']');
		};


		priv.main = function () {
			priv.createStyledRadio();
			priv.storeStyledRadio();
			priv.radio.hide();
			priv.addEventHandlers();
		};


		priv.createStyledRadio = function () {
			priv.radio.wrap('<div class="' + priv.settings.styledRadioClass + '" />').wrap('<div class="' + priv.getRadioState() + '" />');
		};


		priv.getRadioState = function () {
			if (priv.radio.attr('checked')) {
				return 'checked';
			}
			return 'unchecked';
		};


		priv.storeStyledRadio = function () {
			priv.styledRadio = priv.radio.closest(priv.settings.styledRadioSelector);
			priv.radioState  = priv.radio.parent();
		};


		priv.addEventHandlers = function () {
			priv.radio.bind('uncheck', function () {
				priv.uncheck();
			});

			priv.styledRadio.bind('click', function () {
				priv.uncheckAll();
				priv.check();
			});

			if ($.browser.msie) {
				priv.addLabelEventHandler();
			}
		};


		priv.addLabelEventHandler = function () {
			priv.label.bind('click', function () {
				priv.uncheckAll();
				priv.check();
			});
		};


		priv.uncheckAll = function () {
			$('input[name=' + priv.radio.attr('name') + ']').trigger('uncheck');
		};


		priv.check = function () {
			priv.radio.attr('checked', true);
			priv.radioState.addClass('checked').removeClass('unchecked');
		};


		priv.uncheck = function () {
			priv.radio.attr('checked', false);
			priv.radioState.addClass('unchecked').removeClass('checked');
		};


		priv.init(radio, conf);


		return publ;
	}

	$.fn.styledRadio = function (conf) {
		var instances = [];

		this.each(function () {
			instances.push(new Radio(this, conf));
		});

		return (instances === 1) ? instances[0] : instances;
	};
}(jQuery));
