(function(jQuery)
{

    jQuery.fn.RadioButton = function(options)
    {
        var opt = options;
        return this.each(function(options)
        {
            var element = this;
            var myFamily = undefined;
            var labels = undefined;
            var initialValue = false;
            var currentValue = false;

            var options = jQuery.extend({
                width: 13,
                height: 13,
                uncheckedClass: "RadioButton-unchecked",
                checkedClass: "RadioButton-checked"
            }, opt);

            var newElement = undefined;

            var onMouseDown = function()
            {
                if (jQuery(element).is(":disabled")) return false;
                if (!element.checked)
                {
                    element.checked = true;
                    myFamily.trigger("we_changed");
                    jQuery(element).trigger("change");
                };

                return false;
            };

            var setClass = function()
            {
                var c = "";
                if (element.checked)
                {
                    jQuery(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
                    c = options.checkedClass;
                } else
                {
                    jQuery(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
                    c = options.uncheckedClass;
                }

                if (element.disabled)
                {
                    jQuery(newElement).addClass(c + "-disabled");
                } else
                {
                    jQuery(newElement).removeClass(c + "-disabled");
                }
            };

            var onChange = function()
            {
                if (currentValue == element.checked) return false;
                setClass();
                currentValue = element.checked;
                return false;
            };

            var onStateChange = function()
            {
                setClass();
            };

            var init = function()
            {
                if (jQuery(element).prev().is("div.RadioButton"))
                {
                    newElement = jQuery(element).prev();
                } else
                {
                    newElement = jQuery('<div id="RadioButton-' + element.id + '" class="RadioButton ' + options.uncheckedClass + '"></div>');
                    jQuery(element).before(newElement);
                }

                if (newElement != undefined)
                {
                    //hide original checkbox - set display:none cause bugs on Opera!
                    if (jQuery.browser.msie)
                    {
                        //IE 8, using margin left to hide cause bugs
                        jQuery(element).hide();
                    } else
                    {
                        jQuery(element).css({
                            position: "absolute",
                            marginLeft: "-5000px"
                        });
                    }

                    myFamily = jQuery("input:radio[name='" + element.name + "']");
                    if (myFamily.length > 0)
                    {
                        if (myFamily.filter(":checked").length < 1)
                        {
                            myFamily.get(0).checked = true;
                        }
                    }

                    initialValue = element.checked;
                    currentValue = initialValue;

                    if (element.checked)
                    {
                        jQuery(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
                    } else
                    {
                        jQuery(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
                    }

                    jQuery(newElement).bind("mousedown", onMouseDown);
                    jQuery(element).bind("we_changed", onChange);
                    jQuery(element).bind("change", onChange);
                    jQuery(element).bind("state_changed", onStateChange);
                    //bind form reset
                    if (jQuery(element).parents("form").length)
                    {
                        jQuery(element).parents("form").bind("reset", function()
                        {
                            element.checked = initialValue;
                            jQuery(element).trigger("change");
                        });
                    }

                    if (element.id != "")
                    {
                        labels = jQuery("label[for='" + element.id + "']");
                        labels.each(function()
                        {
                            var f = jQuery(this).attr("for");
                            jQuery(this).mousedown(function(event)
                            {
                                if (!jQuery(element).is(":disabled"))
                                {
                                    event.preventDefault();
                                    event.stopPropagation();
                                    jQuery(newElement).trigger("mousedown");
                                    return false;
                                }
                            });
                        });
                    }

                    jQuery(element).trigger("we_changed");
                }
            }

            init();
        });
    }

    jQuery.fn.Checkbox = function(options)
    {
        var opt = options;
        return this.each(function(options)
        {
            var element = this;
            var labels = undefined;
            var initialValue = false;
            var currentValue = false;

            var options = jQuery.extend({
                width: 16,
                height: 13,
                uncheckedClass: "Checkbox-unchecked",
                checkedClass: "Checkbox-checked"
            }, opt);

            var newElement = undefined;

            var onMouseDown = function()
            {
                if (element.disabled) return false;
                if (!element.checked)
                {
                    element.checked = true;
                } else
                {
                    element.checked = false;
                }
                currentValue = element.checked;
                setClass();
                jQuery(element).trigger("change");
                return false;
            };

            var setClass = function()
            {
                var c = "";
                if (element.checked)
                {
                    jQuery(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
                    c = options.checkedClass;
                } else
                {
                    jQuery(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
                    c = options.uncheckedClass;
                }

                if (element.disabled)
                {
                    jQuery(newElement).addClass(c + "-disabled");
                } else
                {
                    jQuery(newElement).removeClass(c + "-disabled");
                }
            };

            var onChange = function()
            {
                if (element.checked == currentValue) return;
                setClass();
                currentValue = element.checked;
            };

            var onStateChange = function()
            {
                setClass();
            };

            var init = function()
            {
                if (jQuery(element).prev().is("div.Checkbox"))
                {
                    newElement = jQuery(element).prev();
                } else
                {
                    newElement = jQuery('<div id="Checkbox-' + element.id + '" class="Checkbox ' + options.uncheckedClass + '"></div>');
                    jQuery(element).before(newElement);
                }

                if (newElement != undefined)
                {

                    jQuery(element).css({
                        position: "absolute",
                        marginLeft: "-5000px"
                    });

                    initialValue = element.checked;
                    currentValue = initialValue;

                    if (element.checked)
                    {
                        jQuery(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
                    } else
                    {
                        jQuery(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
                    }


                    jQuery(element).bind("change", onChange);
                    jQuery(element).bind("state_changed", onStateChange);

                    

                    //form reset
                    if (jQuery(element).parents("form").length)
                    {
                        jQuery(element).parents("form").bind("reset", function()
                        {
                            element.checked = initialValue;
                            jQuery(element).trigger("change");
                        });
                    }


                    if (element.id != "")
                    {
                        labels = jQuery("label[for='" + element.id + "']");
                        labels.each(function()
                        {
                            var f = jQuery(this).attr("for");
                            jQuery(this).mousedown(function(event)
                            {
                                event.preventDefault();
                                event.stopPropagation();
                                if (!element.disabled)
                                {
                                    if (jQuery.browser.msie)
                                    {
                                        jQuery(newElement).trigger("mousedown");
                                    }
                                }
                                return false;
                            });
                        });
                    }

                    jQuery(element).trigger("change");
                }
            }

            init();
        });
    }

    jQuery.fn.InputBox = function(options)
    {
        var opt = options;
        return this.each(function(options)
        {
            var element = this;
            var wrapper;

            jQuery(element).wrap(jQuery("<span />").addClass("inputBox"));
            jQuery(element).parent().wrapInner(jQuery("<span />").addClass("inputBox-container"));
        });
    }

    jQuery.fn.TextareaBox = function(options)
    {
        var opt = options;
        return this.each(function(options)
        {
            var element = this;
            var wrapper, resizeTimeout;
            var eW, eH;

            var doSkin = function()
            {
                jQuery(element).wrap(jQuery("<span />").addClass("textareaBox"));
                jQuery(element).parent().wrapInner(jQuery("<span />").addClass("textareaBox-container"));

                wrapper = jQuery(element).parents(".textareaBox-container");
                wrapper
					.append(jQuery("<span />").addClass("cbr"))
					.append(jQuery("<span />").addClass("cbb"))
					.append(jQuery("<span />").addClass("cbc"));

                doResize(true);
            };

            var doResize = function(f)
            {
                var w, h;

                w = jQuery(element).outerWidth();
                h = jQuery(element).outerHeight();

                if (!f && w == eW && h == eH)
                {
                    return true;
                }

                eW = w; eH = h;

                jQuery(wrapper).css({
                    width: w + "px",
                    height: h + "px"
                });

                w = jQuery(wrapper).innerWidth();
                h = jQuery(wrapper).innerHeight();

                jQuery(".cbr", wrapper).css({
                    height: h + "px",
                    right: 0,
                    top: 0
                });
                jQuery(".cbb", wrapper).css({
                    width: w + "px",
                    left: 0,
                    bottom: 0
                });
                jQuery(".cbc", wrapper).css({
                    right: 0,
                    bottom: 0
                });
            };

            doSkin();
        });
    }
})(jQuery);

