var caboa;

$(document).ready(function () {

caboa = (function() {
	var base_app;
	var iframe_ctr=0;
	$("body").append($("<div class='centro'></div>"));
	var centro = $("div.centro"); 
	var me = {
		set_base: function(s) {
			base_app = s;
		},
		get_base: function(check) {
			if ((check === true)&&(base_app == ""))
				return "/";
			return base_app;
		},
		send_raw: function( u, p, f ) {
			$.ajax({
			    url: u,
			    type: "PUT",
			    data: $.toJSON(p),
			    processData: false,
				dataType: "json",
				contentType: "application/json; charset=utf-8",
				success: f
			});
		},
		send: function( u, p, f ) {
			me.send_raw(u,p, function(o) {
				if (!o.successo) {
					me.alert(o.motivo);
					return;
				}
				return f(o.valore);
			});		
		},
		api_url: function(u) {
			return base_app+"api/"+u;
		},
		rest: {
			send: function( m, u, q, p, f, catch_fail ) {
				var ok, ko;
				
				if (catch_fail === null) {
					catch_fail = false;
				}
				
				if (f) {
					if (catch_fail) {
						ok = function(o) {f(true,o);}; 
						ko = function(o) {f(false,o);}; 
					} else {
						ok = function(o,textStatus) {
							f(o);
						}; 
						ko = function(o,textStatus,et) {
							caboa.alert("errore:"+o.statusText);
						}; 
					}
				}

				return restClient( m, me.api_url(u), q, p, ok, ko );

			},
			get: function (u,q,f, catch_fail) {
				return me.rest.send("GET",u,q,null,f, catch_fail);
			},
			put: function (u,q,p,f, catch_fail) {
				return me.rest.send("PUT",u,q,p,f, catch_fail);
			},
			post: function (u,q,p,f, catch_fail) {
				return me.rest.send("POST",u,q,p,f, catch_fail);
			},
			dele: function (u,q,f, catch_fail) {
				return me.rest.send("DELETE",u,q,null,f, catch_fail);
			},
			upload: function (fo,u,q,p,f, catch_fail) {
				var url = me.api_url(u);
				if (q === null) {
					q = {};
				}
				q.formato = "xjson";
				q.encaps="1";
				url += "?json="+encodeURIComponent($.toJSON(q));
				var my = $("iframe", fo);
				if (!my.length) {				
					my = $("<iframe name=\""+("_iframe_rest_"+(++iframe_ctr))+"\" \/>").appendTo(fo);
				}
				fo[0].target=my.attr("name");

				my.load(function() {
					var sor;
					var o;
					try {
						if (my[0].contentDocument) {
							sor = my[0].contentDocument;
						} else {
							sor = my[0].contentWindow.document;
						}
							
						if (sor.XMLDocument) {
							sor = sor.XMLDocument.getElementsByTagName("d")[0].text;
						} else {
							sor = sor.documentElement.textContent;
						}
	
						if (sor) {
							o = $.secureEvalJSON(sor);
						} else {
							o = {status: 500, statusText: "internal server error", content: null};
						}
					} catch (err) {
							o = {status: 500, statusText: "risposta malformata alla richiesta d'upload: "+err, content: null};
					}
					
					my.unbind("load");
					my.attr({src: "about:blank"});

					var ev;
					if (ev !== undefined) {
						ev.remove();
					}
					if (f) {
						if (catch_fail) {
							if (o.status < 400) {
								return f(true,o.content);
							}
							return f(false,o.content);
						} else {
							if (o.status < 400) {
								return f(o.content);
							}
							caboa.alert("Errore nel trasferimento dei files, riprovare più tardi. Se il problema persiste, segnalarlo agli sviluppatori.");
						}
					}
						
				});
				
				if (p !== null) {
					var ev = $("input[name='json']", fo[0]);
					if (ev.length<1) {
						ev = $("<input type='hidden' name='json' \/>").appendTo(fo[0]);
					}
					ev.val($.toJSON(p));
				} 
				fo[0].action=url;
				fo[0].submit();
			}
		},
		popup: {
			tipo: "",
			open: function (t,m) {
				if ($("div.popup", centro).length>0) {
					$("div.popup", centro).remove();
				}
				me.popup.tipo = t;
				
				centro
					.stop(false,true)
					.append("<div class='popup_glass' \/>")
					.append("<div class='popup' \/>")
					.css({visibility: "hidden", display: "block"});
				var p = $("div.popup", centro);
				
				$("<div class='buttonbar' \/>").appendTo(p);

				if (m) {
					$("<span>"+m+"<\/span>").appendTo(p);
				}
				return p;
			},
			addbutton: function (t,f) {
				$("<button class='main glass'>"+t+"<\/button>")
					.click(f)
					.appendTo($("div.popup>div.buttonbar", centro));
			},
			show: function() {
				var m = $("div.popup>span");

				m.css({
					top: "50%",
					marginTop: Math.floor(-m.height()/2)+"px"
				});
				centro.css({visibility: "visible", display: "none"});

				centro.fadeIn(500);
			},
			close: function () {
				if (me.popup.timer !== null) {
					window.clearInterval(me.popup.timer);
				}
				//centro.hide().empty();return;
				centro.fadeOut(500, function (){
					centro.empty();
				});
			},
			timer: null
		},
		alert: function (m, f) {
			me.popup.open('alert', m);

			me.popup.addbutton("ok", function() {
				me.popup.close();
				if (f !== undefined)
					f();
			});
						
			me.popup.show();				
		},
		waitBar: {
			open: function(m) {
				var p=me.popup.open('waitbar', m?m:"attendere prego");
				var r=0;
				var ic = $("<img src='"+base_app+"/admin/img/striscia-trans.png'>").appendTo(p);
				ic.css({
					position: "absolute",
					top: "50%",
					marginTop: "-16px",
					right: "4px",
					clip: "rect(0px 32px 32px 0px)",
					overflow: "hidden" 
				});
				
				me.popup.show();				
				me.popup.timer = window.setInterval(function() {
					r = (r+1)%5;
					ic.css({
						marginTop: (-16-32*r)+"px",
						clip: "rect("+(32*r)+"px 32px "+(32*(r+1))+"px 0px)"
					});
				}, 150);
				
			},
			close: function() {
				if (me.popup.tipo == 'waitbar') {
					me.popup.close();
				}
			}
		},
		confirm: function(m,y,n) {
			me.popup.open('confirm', m);

			me.popup.addbutton("si", function() {
				me.popup.close();
				if (y !== undefined) {
					y(true);
				}
			});
			me.popup.addbutton("no", function() {
				me.popup.close();
				if (n !== undefined) {
					n(false);
				}
			});

			me.popup.show();
		},
		trigger: {
			completato: true,
			annulla: false,
			async: null
		},
		triggerClass: function() {
			this.pre = function() { return caboa.trigger.completato; };
			this.post = function() { return caboa.trigger.completato; };
		},
		voceMenuClass: function(menu, id, base) {
			var me = {
				isopen: false,
				scheda: null,
				form: null,
				init: function() { return caboa.trigger.completato; },
				carica: new caboa.triggerClass(), 
				salva: new caboa.triggerClass(), 
				cancella: new caboa.triggerClass(),
				nuovo: new caboa.triggerClass(),
				show: new caboa.triggerClass(),
				hide: new caboa.triggerClass(),
				
				open: function() {				
					if (menu.aperto == id) {
						return;
					}

					if (menu.aperto !== null) {
						menu.close(menu.aperto);
					}
					
					menu.aperto = id;
					me.show.pre();
					me.isopen = true;
					$("ul.menu>li.menu_"+id).addClass("aperto");

					if (me.scheda !== null) {
						me.scheda.stop(false,true).fadeIn(300);
						me.show.post()
					}
				},
				
				close: function() {
					menu.aperto = null;

					me.isopen = false;
					me.hide.pre();

					if (me.scheda !== null) {
						me.scheda.fadeOut(300, me.hide.post );
					}
					
					$("ul.menu>li.menu_"+id).removeClass("aperto");
				},
				
				check_form: function(e) {
					var f = me.form;
					if (f === null) {
						return true;
					}

					for (var el in e) { 
						var campo = $("#"+el,f);
						if ((e[el] === null)||(e[el].test === undefined)||(e[el].test === null)) {
							e[el] = {
								test: function(s) { return !caboa.valida.vuota(s,f); },
								msg: el+": obbligatorio"
							};
						}
						
						if (!e[el].test(campo.val(),f)) {
							caboa.alert(e[el].msg);
							campo.parent().addClass("errore");
							me.open();
							return false;
						}
						
						campo.parent().removeClass("errore");
					}
					
					return true;
				}
			};
			
			$.extend(true, me, base);
			me.scheda.hide();

			return me;
		},
		menuClass: function( _voci ) {
			var el = $("div.navbar>ul.menu.interno");
			if ($(el).length<1) {
				el = $("<ul class='menu.interno' \/>").appendTo($("div.navbar"));
			}
			var voci = _voci;
			this.aperto = null;
			
			if ((voci === null)||(voci === undefined)) {
				voci = {};
			}

			var me = {
				annullato: false,
				aggiungi: function (v) {
					for (var s in v) {
						if (v.hasOwnProperty(s)) {
							voci[s] = new caboa.voceMenuClass(me,s,v[s]);
						}
					}
					return voci[s];
				},
				cerca: function (s) {
					return voci[s];
				},
				show: function () {
					$(el).empty();
					$.each(voci, function(v) {
						$(el).append($("<li class=\"menu_"+v+"\" title=\""+voci[v].descrizione+"\">"+voci[v].titolo+"</li>").click(
							function(o) {
								caboa.stato.val("menu",v);
								caboa.stato.scrivi_ancora();
								me.open(v);
							}
						));
					});
				},
				hide: function () {
					$(el).empty();
				},
				open: function (n) {
					if ((n === undefined)||(n === null)) {
						n = null;
						var prima = true;
						for (var s in voci) {
							if (voci.hasOwnProperty(s)) {
								if (voci[s].isdefault) {
									n = s;
									break;
								} else if (prima) {
									n = s;
									prima = false;
								}
							}
						}
						if (n === null) {//menu vuoto
							return;
						}
					}
					if (voci[n] === undefined) {
						return;
					}
					voci[n].open();					
				},
				close: function (n) {
					if ((n === undefined)||(n === null)) {
						if (this.aperto === null) {
							return;
						}
						n = this.aperto;
					}
					if (voci[n] === undefined) {
						return;
					}
					voci[n].close();
				},
				eseguiTriggerVoci: function(x1, x2, f, r) {
					var prev = null;
					if (r === undefined) {
						r = null;
					}
					for (var s in voci) {
						if (voci.hasOwnProperty(s)) {
							if (r == prev) {
								var fv = (!x2)?voci[s][x1]:voci[s][x1][x2];
								var rc = fv.call(voci[s], function () { return me.eseguiTriggerVoci(x1, x2, f, s); });
								
								switch (rc) {
								case caboa.trigger.completato:
									r = s;
									break;
								case caboa.trigger.async:
									return rc;
								case caboa.trigger.annulla:
									me.annulla();
									return rc;
								default:
									me.annulla();
									return caboa.trigger.annulla;
								}
							}
							prev = s;
						}
					}
					
					if ($.isFunction(f)) {
						f();
					}
					return caboa.trigger.completato;
				},
				cambiato: function() {
					for (var s in voci) {
						if (voci.hasOwnProperty(s) && voci[s].ui.cambiata()) {
							return true;
						}
					}

					return false;
				},
				nuovo: function(r) {
					var prev = null;
					for (var s in voci) { 
						if (voci.hasOwnProperty(s)) {
							if (r == prev) {
								var rc = voci[s].nuovo(function() {me.nuovo(s);});
								if (rc != caboa.trigger.completato) {
									return rc;
								}
								r = s;
							}
							prev = s;
						}
					}
				},
				annulla: function() {
					me.annullato = true;
					me.termina();
				}
			};
			
			return me;
			
		},
		risorsaClass: function(a) {
			var me=this;
			this.isdirty = false;
			this.uri = a;
			this.uri_id = function() { return caboa.id; };
			this.risorsa_id = function() { return caboa.id; };
			this.record = {};
			this.record_db = {};
			this.isupload = false;
				
			this.trigger = {
				nuovo: new caboa.triggerClass(),
				carica: new caboa.triggerClass(),
				salva: new caboa.triggerClass(),
				cancella: new caboa.triggerClass()
			};
			
			this.nuovo = function(procedi) {
				var f;
				if (me.trigger.nuovo.pre(f = function() {
					me.record = {};
					me.record_db = {};
					me.id = null;
					if (me.trigger.nuovo.post(procedi) != caboa.trigger.async) {
						procedi();
					}
				}) != caboa.trigger.async) {
					f();
				}
			};
			
			this.carica = function(procedi) {
				var f;
				if (this.uri_id() === null) {
					return procedi();
				}
				if (me.trigger.carica.pre(f = function() {
					caboa.rest.get( me.uri+"/"+me.uri_id(), null, function(o) {
						me.record = o;
						me.record_db = me.record;
						me.id = me.risorsa_id();
						if (me.trigger.carica.post(procedi) != caboa.trigger.async) {
							procedi();
						}
					});
				}) != caboa.trigger.async) {
					f();
				}
			};
			
			this.salva = function(procedi) {
				var f;
				var u = this.uri_id(); 
				var aggiorna_record = function(o) {
					if (o) {
						me.record = $.extend(true, me.record, o);
					}
					me.record_db = me.record;
					me.id = me.risorsa_id();
					if (me.trigger.salva.post(procedi) != caboa.trigger.async) {
						procedi();
					}
				};

				if (me.trigger.salva.pre(f = function() {
					if (me.isupload) {
						if (u === null) {
							console.log("id non specificato in form upload per risorsa",me);
							return procedi();
						}
						caboa.rest.upload( me.form, me.uri+"/"+u, null, me.record, aggiorna_record); 
					} else if (u !== null) {
						caboa.rest.put(me.uri+"/"+u, null, me.record, aggiorna_record);
					} else {
						caboa.rest.post(me.uri, null, me.record, aggiorna_record);
					}
				}) != caboa.trigger.async) {
					f();
				}
			};
			
			this.cancella = function(procedi) {
				var f;
				if (me.trigger.cancella.pre(f = function() {
					caboa.rest.dele(me.uri+"/"+me.uri_id(), null, function(o) {
						me.record = {};
						me.record_db = me.record;
						me.id = null;
						if (me.trigger.cancella.post(procedi) != caboa.trigger.async) {
							procedi();
						}
					});
				}) != caboa.trigger.async) {
					f();
				}
			};

		},
		
		usa_risorsa: function (o) {
			var a=o.nome;

			if (caboa.risorsa[a] === undefined) {
				caboa.risorsa[a] = new caboa.risorsaClass(a);
				estendi(caboa.risorsa[a], o );
			}
			
			return caboa.risorsa[a];  
		},

		esegui: function(hks, f) {
			var procedi = function(f, r) {
				if (r === undefined) {
					r = null;
				}
				var prev=null;
				for (var a in caboa.risorsa) {
					if (caboa.risorsa.hasOwnProperty(a)) {
						if (r != prev) {
							prev = a;
							continue;
						}
						if (!caboa.risorsa[a].isdirty) {
							r = prev;
							continue;
						}
						hks.esegui_risorsa(a, function() {
							procedi(f, a);
						});
						return;
					}
				}
				f();
			};

			caboa.waitBar.open(hks.msg);

			for (var a in caboa.risorsa) {
				if (caboa.risorsa.hasOwnProperty(a)) {
					caboa.risorsa[a].isdirty = false;
				}
			}
			
			caboa.menu.annullato = false;	
			caboa.menu.termina = function() {
				caboa.waitBar.close();
				if ($.isFunction(f)) {
					f();
				}
			};
			
			caboa.menu.eseguiTriggerVoci(hks.trigger, "pre", function() {
				procedi(function() {
					caboa.menu.eseguiTriggerVoci(hks.trigger, "post",
						caboa.menu.termina 
					);
				});
			});

		},
		init: function(f) {
			caboa.waitBar.open("attendere prego");
			return caboa.menu.eseguiTriggerVoci("init", null, function() {
				caboa.waitBar.close();
				if ($.isFunction(f)) {
					f();
				}
			});
		},
		nuovo: function(f) {
			caboa.id = null;
			return me.esegui({
				trigger: "nuovo",
				msg: "attendere prego",
				esegui_risorsa: function(r,procedi) { return caboa.risorsa[r].nuovo(procedi); }
			}, f);		
		},
		carica: function(f) {
			return me.esegui({
				trigger: "carica",
				msg: "caricamento in corso",
				esegui_risorsa: function(r,procedi) { return caboa.risorsa[r].carica(procedi); }
			}, f);		
		},
		salva: function(f) {
			return me.esegui({
				trigger: "salva",
				msg: "salvataggio in corso",
				esegui_risorsa: function(r,procedi) { return caboa.risorsa[r].salva(procedi); }
			}, f);		
		},
		cancella: function(f) {
			return me.esegui({
				trigger: "cancella",
				msg: "cancellazione in corso",
				esegui_risorsa: function(r,procedi) { return caboa.risorsa[r].cancella(procedi); }
			}, f);		
		},
		statoClass: function() {
			var re,ve;
			var variabili = {};
			
			this.scrivi_ancora = function() {
				var u = [];
				for (var i in variabili) {
					if (variabili.hasOwnProperty(i)) {
						u.push(i+"="+variabili[i]);
					}
				}
				if (u.length>0) {
					location.hash = "#"+u.join("&");
				} else {
					location.hash = "";
				}
			};
			
			this.leggi_ancora = function() {
				variabili = {};
				if (!(re = /^#(.+)$/.exec(location.hash))) {
					return;
				}
					
				var v = re[1].split("&");
				for (var i in v) {
					if (v.hasOwnProperty(i)) {
						if ((ve = /^(.+)=(.*)$/.exec(v[i]))) {
							variabili[ve[1]] = ve[2];
						} else {
							variabili[v[i]] = true;
						}
					}
				}
			};
			
			this.remove = function(v) {
				delete variabili[v];
			};
			
			this.val = function(v, s) {
				if (typeof(v) == "object") {
					$.extend(true, variabili, v);
				} else if (s === undefined) {
					return variabili[v];
				} else {
					variabili[v] = s;
				}
			};
			
			this.leggi_ancora();
			
		},
		areaClass: function() {	
			this.isopen = false;
			this.open = function (voce) {
				$("body>div.sito>div.area>div.moduli").show();
				caboa.menu.show();
				caboa.menu.open(voce);
				this.isopen = true;
			};
			this.close = function () {
				if (!this.isopen) {
					return;
				}
				caboa.menu.close();
				caboa.menu.hide();
				$("body>div.sito>div.area>div.moduli").hide();
			};
		},
		risorsa: {},
		aggiornaUI: function() {
			var ok = false;
			var az;
			switch ((az=caboa.stato.val("azione"))) {
			case "cerca":
				if (caboa.searchBox === undefined) {
					break;
				}
				ok = true;

				function esegui_cambio() {
					if (caboa.area !== undefined) {
						caboa.area.close();
					}
					caboa.searchBox.open();
					caboa.stato.scrivi_ancora();
				}
				
				if ((caboa.area !== undefined) && caboa.area.isopen && caboa.menu.cambiato()) {
					caboa.confirm("Le modifiche effettuate saranno perse, continuare?", 
						esegui_cambio,
						caboa.stato.leggi_ancora
					);
					return;
				}
				
				esegui_cambio();
				
				break;
			case "modifica":
				if (caboa.area === undefined) {
					break;
				}
				ok = true;

				caboa.stato.scrivi_ancora();

				if (caboa.searchBox) {
					caboa.searchBox.close();
				}
				var newid = caboa.stato.val("id");
				
				if (!newid) {
					caboa.nuovo();
					caboa.area.open(caboa.stato.val("menu"));
				} else if (!caboa.id || (caboa.id != newid)) {
					caboa.id = newid;
					caboa.carica(function() {
						caboa.area.open(caboa.stato.val("menu"));
					});
				} else if (caboa.id == newid) {
					caboa.area.open(caboa.stato.val("menu"));
				}
				break;
			case "home":
				window.location = base_app+"admin";
				break;
			default:
				console.log("non capisco stato",az);
				break;
			}
			if (!ok && 0) {
				window.location = "../../";
			}
		},
		valida: (function() {
			var re={
				vuota: /^\s*$/,
				email: /^[A-Z0-9._%\-]+@[A-Z0-9.\-]+\.[A-Z]{2,4}$/i,
				url: /^(?:ht|f)tps?\:\/\/(?:\w+:\w+@)?(?:(?:[\-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[\-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[\-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[\-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[\-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[\-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[\-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$/
			};
			
			function valida_re(n, s, ismand) {
				if (!ismand) {
					ismand = false;
				}
				if (re.vuota.test(s)) {
					return !ismand;
				}
				return re[n].test(s);
			}
			
			return (me = {
				email: function(s, ismand) {
					return valida_re("email", s, ismand);
				},
				url: function(s, ismand) {
					return valida_re("url", s, ismand);
				},
				vuota: function(s) {
					return re.vuota.test(s);
				}
			}); 
		}()),
		uiClass: function(s, o) {
			var me = {
				text_f: [],
				bool_f: [],
				rte_f: [],
				azzera_base: function() {
					if (s.form && s.form.length) {
						s.form[0].reset();
					}
					
					for (var i in me.rte_f) {
						if (me.rte_f.hasOwnProperty(i)) {
							$("#"+me.rte_f[i]).html("");
						}
					}
				},
				carica_base: function() {
					var i;
					var r = s.risorsa.record; 
					for (i in me.text_f) {
						if (me.text_f.hasOwnProperty(i)) {
							$("#"+me.text_f[i]).val(r[me.text_f[i]]);
						}
					}
			
					for (i in me.bool_f) {
						if (me.bool_f.hasOwnProperty(i)) {
							$("#"+me.bool_f[i]).attr("checked",r[me.bool_f[i]]);
						}
					}
					
					for (i in me.rte_f) {
						if (me.rte_f.hasOwnProperty(i)) {
							$("#"+me.rte_f[i]).html(r[me.rte_f[i]]);
						}
					}
						
					return r;
				},
				salva_base: function() {
					var i;
					var r={};
					
					for (i in me.text_f) {
						if (me.text_f.hasOwnProperty(i)) {
							r[me.text_f[i]] = $("#"+me.text_f[i]).val();
						}
					}
			
					for (i in me.bool_f) {
						if (me.bool_f.hasOwnProperty(i)) {
							r[me.bool_f[i]] = $("#"+me.bool_f[i]+":checked").val() !== undefined;
						}
					}
						
					for (i in me.rte_f) {
						if (me.rte_f.hasOwnProperty(i)) {
							r[me.rte_f[i]] = $("#"+me.rte_f[i]).html();
						}
					}
					return r;
				},
				cambiata_base: function() {
					function sottoinsieme(a,b) {
						if (!a && !b) {
							return true;
						}
						if (!a || !b) {
							return false;
						}
						if ((typeof a != typeof b)||(typeof a != "object")||(a.length > b.length)) {
							return false;
						}
						for (var i in a) {
							if (a.hasOwnProperty(i)) {
								if (!a[i] && !b[i]) {
									continue;
								}
								if (typeof a[i] != "object") {
									if (a[i] != b[i]) {
										return false;
									}
								} else if (!sottoinsieme(a[i], b[i])) {
									return false;
								}
							}
						}
						return true;
					}
					
					return !sottoinsieme(me.salva(), s.risorsa.record_db);
					
				},

				azzera: function() {
					me.azzera_base();
				},
				carica: function() {
					me.carica_base();
				},
				salva: function() {
					return me.salva_base();
				},
				cambiata: function() {
					return me.cambiata_base();
				},
				controlla: function() {
					return true;
				}
			};
	
			$.extend(true,me,o);
	
			return me;
		},
		autosave_object: function (url) {
			var transazione=0;
			var me=this;

			this.successo = function(ticket) {};

			this.fallimento = function(ticket) {};

			this.ripetizione = function(ticket) {};

			this.salva = function(query, variabili) {
				var ticket=++transazione;
				var autosave;

				(autosave = function(){
					caboa.rest.put(url,query,variabili,
						function(successo,o) {
							if (successo)
								return me.successo(ticket);
							if (ticket < piano.transazione) {
								return;
							}
							me.fallimento(ticket);
							return window.setTimeout(function(){
								me.ripetizione(ticket);
								autosave();
							},5000);
						},true
					);
				})();				
			};

			return this;

		}

	};
	
	return me; 
}());

	caboa.stato = new caboa.statoClass();
	caboa.menu =  new caboa.menuClass();

});
