(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 ( jQuery.browser.msie ) {
					jQuery(element).trigger("click");
				} else {
					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) {
					//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"
						});
					}
					
					
					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);
					}
					
					if (jQuery.browser.msie) {
						jQuery(newElement).bind("mousedown", onMouseDown);
					} else {
						//
					}
					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);