(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: 13,
				height: 13,
				uncheckedClass: "RadioButton-unchecked",
				checkedClass: "RadioButton-checked"
			}, opt);
			
			var newElement = undefined;
			
			var onMouseDown = function() {
				if ($(element).is(":disabled")) return false;
				if (!element.checked) {
					element.checked = true;
					myFamily.trigger("we_changed");
					$(element).trigger("change");
				};
				
				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;
				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) {
					//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);
					}
					
					$(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.each (function() {
							var f = $(this).attr("for");
							$(this).mousedown(function(event) {
								if (!$(element).is(":disabled")) {
									event.preventDefault();
									event.stopPropagation();
									$(newElement).trigger("mousedown");
									return false;
								}
							});
						});
					}
					
					$(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: 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();
				$(element).trigger("change");
				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) {
					//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;
							});
						});
					}
					
					$(element).trigger("change");
				}
			}
			
			init();
		});
	}
	
	$.fn.InputBox = function(options) {
		var opt = options;
		return this.each(function(options) {
			var element = this;
			var wrapper;
			var controlHeight = 26;
			var fixIE = ($.browser.msie && $.browser.version < 8);
			var ie6 = ($.browser.msie && $.browser.version < 7);
			
			$(element).wrap( $("<span />").addClass("inputBox") );
			$(element).parent().wrapInner( $("<span />").addClass("inputBox-container") );
			
			var h = $(element).outerHeight();
			if (fixIE) {
				$(element).parent().parent().css({
					display:"inline-block",
					height:h+"px"
				});
				
			}
			
			var pt = $(element).parent().offset().top - $(element).offset().top;
			
			$(element).parent().css({
				paddingTop:pt+"px"
			});
			
			var pb = h - $(element).parent().innerHeight();
			$(element).parent().css({
				paddingBottom:pb+"px"
			});
			
			if ($.browser.safari) {
				$(element).parent().css({
					paddingTop:(pt+pb)+"px",
					paddingBottom:0
				});
			}
			
			var hh = $(element).parent().innerHeight();
			var pt2 = parseInt((controlHeight - hh)/2);
			var pb2 = controlHeight - hh - pt2;
			
			pb2 += pb;
			pt2 += pt;
			
			$(element).parent().css({
				paddingTop:pt2+"px",
				paddingBottom:pb2+"px"
			});
			
			if (ie6) {
				pb2 -= 2;
			}
			
			$(element).parent().parent().css({
				paddingTop:pt2+"px",
				paddingBottom:pb2+"px"
			});
			
			if (fixIE && !ie6) {
				$(element).css({
					marginTop:-1+"px",
					marginBottom:"2px"
				});
			}
			
			if ($.browser.safari) {
				$(element).css({
					verticalAlign:"bottom"
				});
			} else {
				$(element).css({
					verticalAlign:"baseline"
				});
			}
			
			$(element).focus(function(){
				$(this).parent().parent().addClass("inputBox_focus");
			});
			$(element).blur(function(){
				$(this).parent().parent().removeClass("inputBox_focus");
			});
		});
	}
	
	$.fn.TextareaBox = function(options) {
		var opt = options;
		return this.each(function(options) {
			var element = this;
			var wrapper, resizeTimeout;
			var eW, eH;
			
			var doSkin = function() {
				$(element).wrap( $("<span />").addClass("textareaBox") );
				$(element).parent().wrapInner( $("<span />").addClass("textareaBox-container") );
			
				wrapper = $(element).parents(".textareaBox-container");
				wrapper
					.append( $("<span />").addClass("cbr") )
					.append( $("<span />").addClass("cbb") )
					.append( $("<span />").addClass("cbc") );
				
				doResize(true);
			};
			
			var doResize = function(f) {
				var w,h;
				
				w = $(element).outerWidth();
				h = $(element).outerHeight();
				
				if (!f && w == eW && h == eH) {
					return true;
				}
				
				eW = w; eH = h;
				
				$(wrapper).css({
					width:w+"px",
					height:h+"px"
				});
				
				w = $(wrapper).innerWidth();
				h = $(wrapper).innerHeight();
				
				$(".cbr", wrapper).css({
					height:h+"px",
					right:0,
					top:0
				});
				$(".cbb", wrapper).css({
					width:w+"px",
					left:0,
					bottom:0
				});
				$(".cbc", wrapper).css({
					right:0,
					bottom:0
				});
			};
			
			doSkin();
		});
	}
	
	$.fn.DefText = function(options) {
		var opt = $.extend({
			changedClass: "jDefText_changed"
		},options);
		
		return this.each(function(options) {
			var onFocus = false;
			var elem = this;
			
			var options = $.extend({
				changedClass: "jDefText_changed"
			}, opt);
			
			$(this).bind("focus.jDefText", function(){
				onFocus = true;
				if (this.value == this.defaultValue) {
					this.value = "";
				}
				$(this).addClass(options.changedClass);
			});
			$(this).bind("blur.jDefText", function(){
				onFocus = false;
				if (this.value == "") {
					this.value = this.defaultValue;
					$(this).removeClass(options.changedClass);
				}
			});
			$(this).bind("change.jDefText", function(){
				if (!onFocus) {
					$(this).triggerHandler("focus");
					$(this).triggerHandler("blur");
				}
			});
			//form reset
			if ($(this).parents("form").length) {
				$(this).parents("form").bind("reset.jDefText", function(){
					elem.value = elem.defaultValue;
					$(elem).removeClass(options.changedClass);
				});
			}
			if (this.value == this.defaultValue) {
				$(this).removeClass(options.changedClass);
			} else {
				$(this).addClass(options.changedClass);
			}
		})
	};

})(jQuery);