jQuery(function($){
	var fieldsOrder = function ($o){
		var	$field = $o.filter("input,select,textarea").get(0);
		if( !$field ) return [];

		var	aTabIndex = [],
			aPosIndex = [];
		$.each(
			$field.form.elements,
			function (i, o){
				if( o.tagName != "FIELDSET" && !o.disabled ){
					if( o.tabIndex > 0 ){
						aTabIndex.push(o);
					} else {
						aPosIndex.push(o);
					}
				}
			}
		);
		aTabIndex.sort(
			function (a, b){
				return a.tabIndex - b.tabIndex;
			}
		);

		return $.merge(aTabIndex, aPosIndex);
	}
	var fieldPosition = function($o) {
		var	$field = $o.filter("input,select,textarea").get(0);
		var order = fieldsOrder($o);

		for (var i=0; i < order.length; i++)
			if( order[i] == $field ) return i;

		return null;
	};

	$.fn.getTabIndex = function(){
		return fieldPosition(this);
	};
	$.fn.skipField = function(delta){
		var	$field = this.filter("input,select,textarea").get(0);
		var order = fieldsOrder(this);
		var n=order.length;
		for (var i=0; i < order.length; i++)
			if( order[(i-delta)%n] == $field ) {
				return $(order[i]).trigger("focus");
			}
	};

	/*
	 * supporto placeholders per browser vecchi
	 */
	$.extend({
		placeholder : {
			settings : {
				focusClass: 'placeholderFocus',
				activeClass: 'placeholder',
				overrideSupport: false,
				preventRefreshIssues: true
			}
		}
	});

	$.support.placeholder = 'placeholder' in document.createElement('input');

	$.fn.field_val = $.fn.val;
	$.fn.val = function(value) {
		if(!this[0])
			return undefined;

		var $el0 = $(this[0]);

		if (value != undefined)	{
			var rc=$(this).field_val(value);
			
			if (value == '') {
				if (!$el0.hasClass($.placeholder.settings.focusClass))
					$el0.addClass($.placeholder.settings.activeClass).field_val($el0.attr('placeholder'));
			} else
				$el0.removeClass($.placeholder.settings.activeClass);

			return rc;
		}

		if ($el0.hasClass($.placeholder.settings.activeClass) && $el0.field_val() == $el0.attr('placeholder'))
			return '';

		return $el0.field_val();
	};

	// Clear placeholder values upon page reload
	$(window).bind('beforeunload.placeholder', function() {
		var els = $('input.placeholderActive' );
		if (els.length > 0)
			els.field_val("").attr('autocomplete','off');
	});

    // plugin code
	$.fn.placeholder = function(opts) {
		opts = $.extend({},$.placeholder.settings, opts);

		// we don't have to do anything if the browser supports placeholder
		if (!opts.overrideSupport && $.support.placeholder)
			return this;

		return this.each(function() {
			var $el = $(this);

			if (!$el.is('[placeholder]') || $el.is(':password'))
				return;

			// Prevent values from being reapplied on refresh
			if  (opts.preventRefreshIssues)
				$el.attr('autocomplete','off');

			$el.bind('focus.placeholder', function(){
				var $el = $(this);

				if(this.value == $el.attr('placeholder') && $el.hasClass(opts.activeClass))
					$el.field_val("")
						.removeClass(opts.activeClass)
						.addClass(opts.focusClass);
			});
			$el.bind('blur.placeholder', function(){
				var $el = $(this);

				$el.removeClass(opts.focusClass);
				if(this.value == '')
					$el.val($el.attr('placeholder'))
						.addClass(opts.activeClass);
			});

			$el.triggerHandler('blur');

			// Prevent incorrect form values being posted
			$el.parents('form').submit(function(){
				$el.triggerHandler('focus.placeholder');
			});

        });
    };

	$("span.checkbox").each(function(){
		setupCheckbox($(this))
	});
	
	$.widget("ca.combo", {
		options: {
			source: null,
			list: null,
			defaultId: null,
			type: null,
			wrapper: null
		},
		_wrapperHide: function() {
			if (this.options.wrapper === null)
				return;
			this.options.wrapper.fadeTo(200, 0.5);
			$("div.whole",this.options.wrapper).css({display:"block"});
		},
		_wrapperShow: function() {
			if (this.options.wrapper === null)
				return;
			this.options.wrapper.fadeTo(200, 1.0);
			$("div.whole",this.options.wrapper).css({display:"none"});
		},
		_setOption: function(key, value) {
			switch (key) {
			case "disabled":
				if (this.options.wrapper === null) /// gestito in create
					return;
				this.element.autocomplete( "close" );
				if (!value)
					this._wrapperShow();
				else
					this._wrapperHide();
				break;
			default:	
			}
			$.Widget.prototype._setOption.apply( this, arguments );
		},
		value: function() {
			return this.element.val();
		},
		select: function(k) {
			if (this.options.list === null)
				return;
			trovato = null;
			if (typeof k == "number") {
				if (this.options.list[k] !== undefined)
					trovato = k;
			} else if (k !== null) {
				this.element.val("").data({key:null});
				for (var i in this.options.list)
					if (this.options.list[i].id==k) {
						this.element.val(this.options.list[i].value).data({key:this.options.list[i].id});
						trovato=i;
						break;
					}
			};
			
			if (trovato === null) {
				this.element.val("").data({key:null});
				this._trigger("selected");
			} else  {
				this.element.val(this.options.list[trovato].value).data({key:this.options.list[trovato].id});

				this._trigger("selected");
				this._trigger("valid",undefined,this.options.list[trovato]);
			}
		},
		_create: function() {
			var w;
			var self=this;
			var $me=this.element;
			var $clickable;

			$me.width((w=$me.width()-24)-2);

			var attrs = {
				position: "relative",
				float: $me.css("float"),
				marginTop: $me.css("marginTop"),
				marginLeft: $me.css("marginLeft"),
				marginBottom: $me.css("marginBottom"),
				marginRight: $me.css("marginRight")
			};

			self.options.wrapper = $("<div>").css(attrs);
			$me.after(self.options.wrapper);
			
			$("<div>").addClass("simboleria select-sx").css({float:"left"}).appendTo(self.options.wrapper);
			$("<div>").addClass("field19").css({float:"left",width:w}).appendTo(self.options.wrapper);
			$("<div>").addClass("simboleria select-dx").css({float:"left"}).appendTo(self.options.wrapper);

			switch ($me[0].type) {
			case "select-one":
				attrs = ["class","placeholder","style"];
				new_attr = {};
				for (var i in attrs) {
					var v=$me.attr(attrs[i]);
					if (v !== undefined)
						new_attr[attrs[i]] = v;
				}

				this.options.list = new Array();
				for (var i=0;i<$me[0].options.length;i++)
					this.options.list.push({id:$me[0].options[i].value,value:$me[0].options[i].text,"class":$($me[0].options[i]).attr("class")});
				this.options.defaultId = $me[0].selectedIndex;
				
				$nuovo = $("<input>").attr(new_attr).data($me.data());
				$me.remove();
				//$me.removeClass("combo").css({display:none});
				
				if (this.options.type==null)
					this.options.type = "select";

				$me = this.element = $nuovo;
				
				break;
			case "text":
				if (this.options.type==null)
					this.options.type = "combo";
				break;
			}
			$me.addClass("field19").appendTo(self.options.wrapper);

			if ((this.options.disabled==null) && $me.disabled)
				this.options.disabled = true;
			
			$("<div>").addClass("whole").css({display:"none"}).appendTo(self.options.wrapper);

			if (this.options.disabled)
				this._wrapperHide();
			
			if (this.options.type=="select") {
				$clickable = $("div.whole", self.options.wrapper).css({display: "block"});
				this.element.attr({readonly:true});
			} else
				$clickable = $("div.select-dx",self.options.wrapper);

			$me.autocomplete({
				minLength: 0,
				appendTo: this.options.wrapper,
				source: function(request, response) {
				
					var cerca = function(request, response) {
 						var source=self.options.list;
						if (!("term" in request))
							return source;

						var d=[];
						var r=request.term.toLowerCase();
						for (var i in source)
							if (source[i].value.toLowerCase().substr(0,r.length)==r)
								d.push(source[i]);
						if ((d.length == 1)&&(d[0].value.toLowerCase() == r))
							self._trigger("valid",undefined,d[0]);
						else
							self._trigger("invalid");
						response(d);
					};

					if (self.options.list !== null)
						return cerca(request, response);

					if (self.options.source === null)
						response([]);
					self.options.source(function(o){
						self.options.list = o;
						cerca(request, response);
					});
				},
				change: function(ev, o){
					self._trigger("change",o);
					if (!o || !o.item) {
						if (self.options.list === null || self.options.defaultId === null) {
							$me.val("").data({key:null});
							return self._trigger("invalid");							
						}
						o.item = {
							id: self.options.defaultId,
							value: self.options.list[self.options.defaultId].value
						};
						$me.val(o.item.value);
					}

					$me.data({key:o.item.id});
					return self._trigger("valid",undefined,o.item);
				},
				select: function(ev, o){
					if ($me.data("class") !== undefined)
						$me.removeClass($me.data("class"));
					$me.val(o.item.value).data({key:o.item.id});
					if (o.item["class"] !== undefined)
						$me.addClass(o.item["class"]).data({"class": o.item["class"]});
						
					self._trigger("selected");
					self._trigger("valid",undefined,o.item);
					return true;
				}
			});

			$me.data("autocomplete")._resizeMenu = function() {
				this.menu.element.outerWidth(this.element.outerWidth()+19);
			};
			$me.data("autocomplete")._renderItem = function($ul,item) {
				var $li = $("<li></li>");
				var $a = $("<a>"+item.label+"</a>");
				$li.data("item.autocomplete",item);
				
				if (item["class"] != "")
					$a.addClass(item["class"]);
				$li.append($a);
				
				return $li.appendTo($ul);
			},

			$clickable.css({cursor: "pointer"}).click(function(){
				if ($me.autocomplete( "widget" ).is(":visible")) {
					$me.autocomplete( "close" );
					return false;
				}

				$me.autocomplete("search", "");
				return false;
			});

			if (self.options.defaultId !== null && self.options.list !== null && $me.val() == "") {
				var defitem=self.options.list[self.options.defaultId];
				
				$me.data({key:defitem.id}).val(defitem.value);
				if (defitem["class"] !== undefined)
					$me.addClass(defitem["class"]).data({"class": defitem["class"]});
			}
		}
	});

	caboa.hash=(function(){
		var vars=[];
		
		function carica(){
			var re;
			if (!(re=/^#(.+)$/.exec(location.hash))) {
				vars=[];
				return;
			}
			
			var a=re[1].split("&");
			for (var i in a) {
				var k=a[i].split("=");
				var v;
				if (k.length<2)
					v=true;
				else
					v=k[1];

				vars[decodeURIComponent(k[0])] = decodeURIComponent(v);
			}
			
			$(window).trigger("caboa.hash");
			
			return;
		};
		
		function aggiornaHash() {
			var r=new Array();
			for (var i in vars)
				r.push(encodeURIComponent(i)+"="+encodeURIComponent(vars[i]));
			location.hash = r.join("&");
		};
		
		this.onchange = function(f, runonce) {
			$(window).bind("caboa.hash", f);
			if ((runonce !== undefined)&&runonce)
				carica();
		};
		
		this["delete"] = function(k) {
			delete vars[k];
			
			aggiornaHash();
		};
		
		this.get = function(k) {
			return vars[k];
		};
		
		this.put = function(k,v) {
			if (v === undefined)
				v = true;

			vars[k]=v;
			
			aggiornaHash();
		}

		$(window).hashchange(carica);
		carica();

		return this;

	})();	

});

function waitplease(d){
	var copri;
	if (d !== undefined) {
		copri=$("<div>").css({
			position: "absolute",
			zIndex: 100,
			opacity: 0
		}).offset(d.offset()).width(d.width()).height(d.height()).appendTo("body");
	} else {
		copri=$("<div>").css({
			position: "fixed",
			zIndex: 100,
			top: 0, bottom: 0,
			left: 0, right: 0,
			opacity: 0
		}).appendTo("body");
	}
	$("<div>").addClass("whole").css({
		backgroundColor: "rgb(255,255,255)",
		opacity: 0.8
	}).appendTo(copri);
	
	var scatola=$("<div>").css({
		position: "absolute",
		top: "50%",
		left: "50%",
		width: 130,
		height: 40,
		marginLeft: -65,
		marginTop: -20
	}).appendTo(copri);
	
	var box=[];
	for (var i=0;i<4;i++)
		box[i] = $("<div class='box'>").css({
			float: "left",
			marginTop: 10,
			marginLeft: 10,
			width: 20,
			height: 20,
			backgroundColor: "rgb(128,128,128)"
		}).appendTo(scatola);
	
	copri.fadeTo(1000,1.0);
	var n=0;
	var h = setInterval(function(){
		box[(n+3)%4].css({backgroundColor: "rgb(128,128,128)"});
		box[n++%4].css({backgroundColor: "rgb(0,0,0)"});
	},500);
	
	this.close = function() {
		clearInterval(h);
		copri.stop().fadeTo(1000,0.0, function() {
			copri.remove();
		});
	};
	
	return this;
}

function setupCheckbox($o) {
	$o.parent().click(function(){
		$("span.checkbox",$(this)).toggleClass("on");
	}).css({cursor:"pointer"}).each(function(){
		var $me=$("span.checkbox",$(this));
		$me[0].val = function(s) {
			if (s===undefined)
				return $me.hasClass("on");
			if (s)
				$me.addClass("on");
			else
				$me.removeClass("on");
		}
	});
}

function setupRadio($o) {
	$o.parent().click(function(){
		$o.removeClass("on");
		$("span.radio",$(this)).addClass("on").trigger("radio.value");
	}).css({cursor:"pointer"});
}

function toComboSource(a) {
	var s=[];
	for (var i in a)
		s.push({id:i,value:""+a[i]});
	return s;
}
