;(function($){
	$.fn.weinBerater = function(options) {
		return $(this).each(function(){
			var $container = $(this);
			var _action = $(this).attr("rel");
			$(document).ready(function(){
				$.ajax({
					url : _action,
					type : 'POST',
					dataType : 'html',
					success: function(data) {
						$container.get(0).innerHTML=data;
						$container.rebindChangeEvent();
					}
				});
			});
			
		});
	};
	
	$.fn.rebindChangeEvent = function(){
		var $container = $(this);
		var _action = $(this).attr("rel");
		$(this).find("input,select,textarea").change(function(){
			$.ajax({
				url : _action,
				type : 'POST',
				data: $container.formToArray(),
				dataType : 'html',
				success: function(data) {
					$container.get(0).innerHTML=data;
					$container.rebindChangeEvent();
				}
			});
		});
	};
	
	$.fn.formToArray = function() {
		var a=[];
		$(this).find("input,select,textarea").each(function(){
			var el = $(this).get(0);
			var n = el.name;
			if (n){
				var v = $.fieldValue(el, true);
				if (v && v.constructor == Array) {
					for(var j=0, jmax=v.length; j < jmax; j++){
						a.push({name: n, value: v[j]});
					}
				} else if (v !== null && typeof v != 'undefined'){
					a.push({name: n, value: v});
				}
			}
		});
		return a;
	};
		
	$.fn.fieldValue = function(successful) {
		for (var val=[], i=0, max=this.length; i < max; i++) {
			var el = this[i];
			var v = $.fieldValue(el, successful);
			if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)){
				continue;
			}
			v.constructor == Array ? $.merge(val, v) : val.push(v);
		}
		return val;
	};
	
	$.fieldValue = function(el, successful) {
		var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
		if (typeof successful == 'undefined') successful = true;
	 
		if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
			(t == 'checkbox' || t == 'radio') && !el.checked ||
			(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
			tag == 'select' && el.selectedIndex == -1)){
				return null;
		}
		if (tag == 'select') {
			var index = el.selectedIndex;
			if (index < 0) return null;
			var a = [], ops = el.options;
			var one = (t == 'select-one');
			var max = (one ? index+1 : ops.length);
			for(var i=(one ? index : 0); i < max; i++) {
				var op = ops[i];
				if (op.selected) {
					var v = op.value;
					if (!v) // extra pain for IE...
						v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
					if (one) return v;
					a.push(v);
				}
			}
			return a;
		}
		return el.value;
	};
	
	$.fn.clearForm = function() {
		return this.each(function() {
			$('input,select,textarea', this).clearFields();
		});
	};
	
	$.fn.clearFields = $.fn.clearInputs = function() {
		return this.each(function() {
			var t = this.type, tag = this.tagName.toLowerCase();
			if (t == 'text' || t == 'password' || tag == 'textarea'){
				this.value = '';
			} else if (t == 'checkbox' || t == 'radio') {
				this.checked = false;
			} else if (tag == 'select') {
				this.selectedIndex = -1;
			}
		});
	};
	 
	$.fn.enable = function(b) {
		if (b == undefined) b = true;
		return this.each(function() {
			this.disabled = !b;
		});
	};
	
	$.fn.selected = function(select) {
		if (select == undefined) select = true;
		return this.each(function() {
			var t = this.type;
			if (t == 'checkbox' || t == 'radio')
				this.checked = select;
			else if (this.tagName.toLowerCase() == 'option') {
				var $sel = $(this).parent('select');
				if (select && $sel[0] && $sel[0].type == 'select-one') {
					$sel.find('option').selected(false);
				}
				this.selected = select;
			}
		});
	};
})(jQuery);
