(function($){	
	$.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 = $.extend({
				width: 15,
				height: 15,
				uncheckedClass: "RadioButton-unchecked",
				checkedClass: "RadioButton-checked"
			}, opt);
			
			var newElement = undefined;
			
			var onMouseDown = function() {
				if (element.disabled) return false;
				if (!element.checked) {
					element.checked = true;
					$(element).trigger("change");
					
					$(element).triggerHandler("click");
				}
				
				return false;
			};
			
			var setClass = function() {
				var c = "";
				if (element.checked) {
					$(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
					c = options.checkedClass;
				} else {
					$(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
					c = options.uncheckedClass;
				}
				
				if (element.disabled) {
					$(newElement).addClass(c + "-disabled");
				} else {
					$(newElement).removeClass(c + "-disabled");
				}
			};
			
			var onChange = function() {
				if (currentValue == element.checked) return false;
				setClass();
				currentValue = element.checked;
				myFamily.trigger("we_changed");
				
				return false;
			};
			
			var onStateChange = function() {
				setClass();
			};	
			
			var init = function() {
				if ($(element).prev().is("div.RadioButton")) {
					newElement = $(element).prev();
				} else {
					newElement = $('<div id="RadioButton-'+element.id+'" class="RadioButton '+options.uncheckedClass+'"></div>');
					$(element).before(newElement);
				}
				
				if (newElement != undefined) {
					$(newElement).css({
						marginLeft: $(element).css("marginLeft"),
						marginRight: $(element).css("marginRight"),
						marginTop: $(element).css("marginTop"),
						marginBottom: $(element).css("marginBottom")
					});
					
					//hide original checkbox - set display:none cause bugs on Opera!
					if ($.browser.msie) {
						//IE 8, using margin left to hide cause bugs
						$(element).hide();
					} else {
						$(element).css({
							position: "absolute",
							marginLeft: "-5000px"
						});
					}
					
					myFamily = $("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) {
						$(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
					} else {
						$(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
					}
					
					if ($.browser.msie) {
						$(newElement).bind("mousedown", onMouseDown);
					} else {
						//
					}
					
					$(newElement).bind("mousedown", onMouseDown);
					$(element).bind("we_changed", onChange);
					$(element).bind("change", onChange);
					$(element).bind("state_changed", onStateChange);
					
					//bind form reset
					if ($(element).parents("form").length) {
						$(element).parents("form").bind("reset", function(){
							element.checked = initialValue;
							$(element).trigger("change");
						});
					}
					
					if (element.id != "") {
						labels = $("label[for='"+element.id+"']");
						labels.mousedown(function(event) {
							if (!element.disabled) {
								event.preventDefault();
								event.stopPropagation();
								if ($.browser.msie) {
									$(newElement).trigger("mousedown");
								}
								return false;
							}
						});
						
						if (!$.browser.msie) {
							if ($(newElement).parents("label[for='"+element.id+"']").length < 1) {
								$(newElement).bind("mousedown", onMouseDown);
							}
						}
					} else {
						if (!$.browser.msie) {
							if ($(newElement).parents("label[for='"+element.id+"']").length < 1) {
								$(newElement).bind("mousedown", onMouseDown);
							}
						}
					}
					
					$(element).trigger("we_changed");
				}
			}
			
			init();
		});
	}
	
	$.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 = $.extend({
				width: 15,
				height: 15,
				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();
				$(element).trigger("change");
				$(element).triggerHandler("click");
				return false;
			};
			
			var setClass = function() {
				var c = "";
				if (element.checked) {
					$(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
					c = options.checkedClass;
				} else {
					$(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
					c = options.uncheckedClass;
				}
				
				if (element.disabled) {
					$(newElement).addClass(c + "-disabled");
				} else {
					$(newElement).removeClass(c + "-disabled");
				}
			};
			
			var onChange = function() {
				if (element.checked == currentValue) return;
				setClass();
				currentValue = element.checked;
			};
			
			var onStateChange = function() {
				setClass();
			};	
			
			var init = function() {
				if ($(element).prev().is("div.Checkbox")) {
					newElement = $(element).prev();
				} else {
					newElement = $('<div id="Checkbox-'+element.id+'" class="Checkbox '+options.uncheckedClass+'"></div>');
					$(element).before(newElement);
				}
				
				if (newElement != undefined) {
					$(newElement).css({
						marginLeft: $(element).css("marginLeft"),
						marginRight: $(element).css("marginRight"),
						marginTop: $(element).css("marginTop"),
						marginBottom: $(element).css("marginBottom")
					});
					
					//hide original checkbox - set display:none cause bugs on Opera!
					
					if ($.browser.msie) {
						//IE 8, using margin left to hide cause bugs
						$(element).hide();
					} else {
						$(element).css({
							position: "absolute",
							marginLeft: "-5000px"
						});
					}
					
					
					initialValue = element.checked;
					currentValue = initialValue;
					
					if (element.checked) {
						$(newElement).addClass(options.checkedClass).removeClass(options.uncheckedClass);
					} else {
						$(newElement).addClass(options.uncheckedClass).removeClass(options.checkedClass);
					}
					
					if ($.browser.msie) {
						$(newElement).bind("mousedown", onMouseDown);
					} else {
						//
					}
					$(element).bind("change", onChange);
					$(element).bind("state_changed", onStateChange);
					
					//form reset
					if ($(element).parents("form").length) {
						$(element).parents("form").bind("reset", function(){
							element.checked = initialValue;
							$(element).trigger("change");
						});
					}
					
					
					if (element.id != "") {
						labels = $("label[for='"+element.id+"']");
						labels.each (function() {
							var f = $(this).attr("for");
							$(this).mousedown(function(event) {
								event.preventDefault();
								event.stopPropagation();
								if (!element.disabled) {
									if ($.browser.msie) {
										$(newElement).trigger("mousedown");
									}
								}
								return false;
							});
						});
						
						if (!$.browser.msie) {
							if ($(newElement).parents("label[for='"+element.id+"']").length < 1) {
								$(newElement).bind("mousedown", onMouseDown);
							}
						}
					} else {
						if (!$.browser.msie) {
							if ($(newElement).parents("label[for='"+element.id+"']").length < 1) {
								$(newElement).bind("mousedown", onMouseDown);
							}
						}
					}
					
					$(element).trigger("change");
				}
			}
			
			init();
		});
	}
})(jQuery);