function spxloader(tag) {
	$(tag).innerHTML= '<img src="style/img/spinner.gif">';
}
function setvisible(tag, isshow){
  if (isshow) {
  	$(tag).setStyle('visibility', 'visible') ;
  } else {
  	$(tag).setStyle('visibility', 'hidden') ;
  }
}
function setvisibleinp(tag, isshow){
  setvisible(tag, isshow);
  setvisible(tag+'_l', isshow);
}
function checkdate(input, ismax){
if (input=="")
  return true;
var validformat1=/^\d{2}\/\d{2}\/\d{4}$/ 
var validformat2=/^\d{2}\/\d{2}\/\d{2}$/ 
var validformat3=/^\d{2}\-\d{2}\-\d{4}$/ 
var validformat4=/^\d{2}\-\d{2}\-\d{2}$/ 
var returnval=false
if (!validformat1.test(input) && !validformat2.test(input) && !validformat3.test(input) && !validformat4.test(input))
return false;
var dayfield=""
var monthfield=""
var yearfield=""
if (input.indexOf("/")>-1) {
  dayfield=input.split("/")[0]
  monthfield=input.split("/")[1]
  yearfield=input.split("/")[2]
} else if (input.indexOf("-")>-1) {
  dayfield=input.split("-")[0]
  monthfield=input.split("-")[1]
  yearfield=input.split("-")[2]
}
if (yearfield.length==2) {
  yearfield= parseInt(yearfield,10);
  if (yearfield<50)
    yearfield+= 2000;
  else	
    yearfield+= 1900;
}
if (yearfield<1800)
  return false;

var dayobj = new Date(yearfield, monthfield-1, dayfield)
if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield));
else returnval= !ismax || dayobj.getTime() <= (new Date()).getTime();
return returnval;
}

function checkint(input){
if (input=="")
  return true;
var validformat=/^\d+$/ ;
return validformat.test(input);
}

function checktime(input){
	if (input=="")
	  return true;
	var validformat=/^\d{2}:\d{2}$/ 
	return validformat.test(input);
}

function checkmoney(input){
if (input=="")
  return true;
var validformat=/^[-+]?\d{1,7}(\,\d{1,2})?$/ ;
return validformat.test(input);
}

var ckForm = function checkForm(nomeform) {
	//var num = nomeform.elements.length;
	var campi = $(nomeform).getElements('input, select, textarea');
	var num = campi.length;
	var campinull = false ;
    var msg='';
	campi.each(function(el, i){
		var nome = el.get('name');
        var relvalue = el.get('rel'); 
        str= el.get('value');
        len= str.length;
        if ($(nome)!=null && $(nome).getStyle('visibility') == 'hidden') {
        	relvalue= "";
        }
        if(relvalue == "required" || relvalue == "required,date" || relvalue == "required,date,max" || relvalue == "required,int" || relvalue == "required,money" || relvalue == "required,time") {
             for (t=0; t<len && str.charAt(t)==' '; t++);
	            if(t==len || str == ''){
	                $(nome).setStyle('background-color', '#FFAAAA') ;
	                msg= "compila i campi in rosso";
	            } else {
	                $(nome).setStyle('background-color', 'white') ;
	            }
        } 
	    if ((relvalue == "date" || relvalue == "date,max" || relvalue == "required,date" || relvalue == "required,date,max")) {
	           if (!checkdate(str,relvalue == "date,max" || relvalue == "required,date,max")) {
	                $(nome).setStyle('background-color', '#FFAAAA') ;
		        	msg= "campo data errato (gg/mm/aaaa)";
	            } else if (relvalue == "date" || len>0) {
	                $(nome).setStyle('background-color', 'white') ;
	            }
		} else if ((relvalue == "int" || relvalue == "required,int")) {
	           if (!checkint(str)) {
	                $(nome).setStyle('background-color', '#FFAAAA') ;
		        	msg= "campo non numerico";
	            } else if (relvalue == "int" || len>0) {
	                $(nome).setStyle('background-color', 'white') ;
	            }
		} else if ((relvalue == "money" || relvalue == "required,money")) {
	           if (!checkmoney(str)) {
	                $(nome).setStyle('background-color', '#FFAAAA') ;
		        	msg= "campo non numerico";
	            } else if (relvalue == "money" || len>0) {
	                $(nome).setStyle('background-color', 'white') ;
	            }
		} else if ((relvalue == "time" || relvalue == "required,time")) {
	           if (!checktime(str)) {
	                $(nome).setStyle('background-color', '#FFAAAA') ;
		        	msg= "campo non ora (hh:mm)";
	            } else if (relvalue == "time" || len>0) {
	                $(nome).setStyle('background-color', 'white') ;
	            }
		}
	});
    if(msg=="") {
    	$("message").innerHTML = '';
    	return true;
    }
    	
    if ($("message")==null) 
    	alert(msg);
    else
         $("message").innerHTML = "<p class=\"error\">"+msg+"</p>";
    return false;
}

var Site = new Class({
	Implements: [Events, Options],
	options: {
		usr_option: 'user_preferences', //elemento con prefereze user
		page: 'page', //elemento pagina
		slide_elements: 'slide'	
	},
	cntwin: [],
	initialize: function(options){
		if($(this.options.usr_option)){this.userPreferences = new UserPreferences()};
		$$('a.help').addEvent('click', function(e) {
			e.stop();
			return new MavDialog({
				'footer':false,
				'force': true,
				'title': this.get('title'),
				'url': this.get('href')+'&ajax=1',
				'width': 'auto',
				'titleCloseTitle': 'Chiudi',
				'title': 'HELP',
				'url': this.get('href'),
				'draggable': true
			});
			});
		
		$$('a.dialog').addEvent('click', function(e) {
			e.stop();
			return new MavDialog({
				'footer':false,
				'force': true,
				'title': this.get('title'),
				'url': this.get('href')+'&ajax=1',
				'width': this.get('width')!=null?this.get('width'):'auto',
				'titleCloseTitle': 'Chiudi',
				'draggable': true,
				'onShow': function() {
					
					$$('input.DatePicker').each( function(el){
						new DatePicker(el);
					});	

				}
			});
			});
		
		
		if($$('.'+this.options.slide_elements))
		{
			$$('.'+this.options.slide_elements).reverse().each(function(item){this.doSlide(item)}, this);
		}
		if($('form_step')){this.form_ele = new FormStep({'form_ele':'form_step'})};
		if($$('.blocco'))  this.tagsIns($$('.blocco'));
		if($$('.multi'))  this.contWins($$('.multi'));
	
		$$('input.DatePicker').each( function(el){
			new DatePicker(el);
		});	
		
	},
	doSlide: function(el)
	{
		el.mySlide = new Fx.Slide(el.getNext(), {duration: 200, wrapper:el});
		if(el.hasClass('open')) 
		{
			el.mySlide.show();
		}
		else 
		{
			el.mySlide.hide();
		}
		el.addEvent('click', 
			function(){
				var pre = el.getParent().getParent().getParent().getPrevious(".slide");
				if(pre) el.mySlide.toggle().chain(function(){pre.mySlide.show()}) ;
				else this.mySlide.toggle();
				this.toggleClass('open');
			}
		);
	},
	contWins: function(eles)
	{
		eles.each( function(item, k) 
			{
				this.cntwin[k] = new ContWin({'elementClick':item, 'content':item.getNext('.blocco'), 'disp':'cont'});
			}.bind(this)
		)
	},
	tagsIns: function(groups)
	{
		groups.each(function(el){
			var fields = el.getElements('input');
			var fparent = el.getParent();
			fields.each( function(e){
					if(e.checked) {
						e.lab = new Element('p', { 'text': e.getParent().getElement('label[for="'+e.get('id')+'"]').get('text')});
						e.lab.inject(fparent,'bottom');
					}
				}
			);
			fields.addEvent(
				'change', function(){
					if(this.checked) {
						this.lab = new Element('p', { 'text': this.getParent().getElement('label[for="'+this.get('id')+'"]').get('text')});
						this.lab.inject(fparent,'bottom');
					} else {	
						this.lab.destroy();
					}
				}
			);
		})
	}
});

var UserPreferences =  new Class ({
	Extends: Site,
	options: {
		page_width: Cookie.read('page_style'),
		font_size: Cookie.read('font_size'),
		page_fixed:'user_preferences_fixed',
		page_max:'user_preferences_max',
		font_area:'user_font_area',
		font_slider:'user_font_slider'
	},
	initialize: function(){
		$(this.options.usr_option).setStyle('display','block');
		$(this.options.page_fixed).addEvent('click', function(e){e.stop(); this.setPreference('page_style','fix')}.bind(this));
		$(this.options.page_max).addEvent('click', function(e){e.stop(); this.setPreference('page_style','max')}.bind(this));
		this.options.font_size = Cookie.read('font_size') || '12'; 
		this.setPreference('page_style','max');
		this.mySlide = new Slider($(this.options.font_area), $(this.options.font_slider), {  
			steps: 10,
			range: [10,20],
			wheel: 0.5,
			snap: 0.5,
			onChange: function(size){
				Cookie.write('font_size',size);
				$$('body').setStyle('font-size',size + 'px');
			}
		}).set(this.options.font_size);
	},
	ckCookie: function(){
		if ( Cookie.read('page_style') == 'max') { 
			$(this.options.page).addClass('max');
			$(this.options.page_fixed).removeClass('active');
			$(this.options.page_max).addClass('active'); 
		} else { 
			$(this.options.page).removeClass('max');
			$(this.options.page_fixed).addClass('active');
			$(this.options.page_max).removeClass('active');
		};
		$$('body').setStyle('font-size', this.options.font_size + 'px')
	},
	setPreference: function(key, value){
		this.prefCookie = Cookie.write(key, value);
		this.ckCookie();
	}

});

//classe per menu contestuali
var ContWin = new Class({
	Implements: [Events, Options],
	options: {
		ajax: false,
		disp: 'modal', // modal cont ele
		maskColor: '#333',
		maskOpacity: 0.1,
		popColor:'#fff',
		popWidth: 400,
		frameHeight: 250,
		frameHeightPadding: 0,
		tabs: true,
		buttons: true,
		resize: true
		//content,
		//target,
		//elementClick,
	},
	initialize: function(options){
		this.setOptions(options);
		if(this.options.disp == "cont") this.showContextualWindow();
		if(this.options.disp == "ele") this.loadData(this.options.target, this.options.content);
	},
	showContextualWindow: function() {
		// funzionamento a tendina 1click e si chiude
		var cont = this.options.content;
		var ele = this.ele = this.options.elementClick;
		cont.setStyles({'display':'none','position':'absolute', 'background-color':this.options.popColor});
		cont.addClass('contextual');
		ele.setStyle('cursor', 'pointer');
		ele.tog = 0 ;
		//cont.dispose().inject($(document.body), 'bottom');
		ele.addEvents({
			'click': function(e){
				this.blur();
				if(!ele.tog) {
					window.site.cntwin.each(function(e){e.ele.fireEvent('close'); e.ele.tog = 0})
					var contpos = ele.getCoordinates();
					cont.setStyles({
						'display':'block',
						'top': contpos.top+contpos.height,
						'left': contpos.left
					});
					ele.tog = 1;
				}
				else {
					ele.fireEvent('close');
					ele.tog = 0;
				}
				return false;
			},
			'close': function() {
				cont.setStyle('display', 'none');
			}
		});		if(this.options.buttons) 
		{
			this.select = new Element('span',{'class':'button','text': 'chiudi'	});
			//this.close = new Element('span',{'class':'button','text': 'annulla'});
			this.buttons = new Element('div',{'class':'buttonsbar'});
			//TODO ottimizzare la button bar
			// aggiunta events 
			//this.close.addEvent('click', function(){ele.fireEvent('close')});
			this.select.addEvent('click', function(){ele.fireEvent('close')});
			
			this.select.inject(this.buttons,'inside');
			//this.close.inject(this.buttons,'inside');
			this.buttons.inject(cont,'bottom')
		
		}
	},
	loadData: function(up, dt) {
		up.addClass('ajax-loading');
		var myHTMLRequest = new Request.HTML({
			update:up,
			onComplete: function() { 
				up.removeClass('ajax-loading');
			}.bind(this)
		}).get(dt)
	},
	showWindow: function() {
		this.mask = new Element('div',{'styles':{
			'position':'absolute', 'top':0, 'left':0,
			'opacity':this.options.maskOpacity,
			'height': window.getScrollSize().y,
			'width':'100%',
			'background':this.options.maskColor,
			'z-index':9999
		}});
		this.select = new Element('span',{'class':'button','text': 'seleziona'	});
		this.close = new Element('span',{'class':'button','text': 'annulla'});
		this.tabs = new Element('div',{'class':'tabs','text': 'tabs .... tabs '});
		this.frame = new Element('div',{'styles':{
			'height':this.options.frameHeight },
			'class':'frame'
		});
		this.buttons = new Element('div',{'class':'buttonsbar'});
		this.resize = new Element('div',{'class':'resize'});
		this.pop = new Element('div',{'styles':{
			'background':this.options.popColor,
			'position':'absolute',
			'width':this.options.popWidth,
			'margin':0,
			'z-index':10000},
			'id':'popwin'
		});
		
		// aggiunta events 
		this.close.addEvent('click',this.hideWindow.bind(this));
		this.select.addEvent('click',this.sel.bind(this));
		this.mask.addEvent('click',this.hideWindow.bind(this));
		
		// inserimento degli elementi nel DOM
		document.body.appendChild(this.mask);
		document.body.appendChild(this.pop);
		//tabs
		if (this.options.tabs) {
			this.tabs.inject(this.pop,'top');
			var drag_inst = new Drag(this.pop,{'handle':this.tabs});
		}
		//resizable
		if (this.options.resize) {
			this.resize.inject(this.pop,'bottom');
			var resize_inst = this.pop.makeResizable({
				'handle':this.resize,
				onDrag: function(el){
				        this.setHeights(el.getSize().y);
					}.bind(this)
			});
		}
		this.frame.inject(this.pop,'inside');
		//pulsanti
		if (this.options.buttons) {
			this.select.inject(this.buttons,'inside');
			this.close.inject(this.buttons,'inside');
			this.buttons.inject(this.pop,'bottom')
		}
		//posizionamento della finestra
		this.centerWindow(this.pop);
		// riposizionamento al resize del browser
		window.addEvent('resize', function(){this.centerWindow(this.pop)}.bind(this));
		
		//if(this.options.cols) this.insertCol(this.options.link); da sostituire 
	},
	hideWindow: function() {
		window.removeEvents('resize');
		this.pop.dispose();
		this.mask.dispose();
		return false;
	},
	sel: function() {
		this.pop.dispose();
		this.mask.dispose();
		// funzioni varie
		alert(this.selected[0]);
	},
	centerWindow: function(ele) {
		var elp = ele.getSize();
		var positionOptions = {
				"top": (window.getSize().y / 2) + window.getScroll().y - (elp.y / 2)+"px",
				"left":(window.getSize().x / 2) - (elp.x / 2)+"px"
		}
		// set the new styles
		ele.setStyles(positionOptions);
	},
	setHeights: function(h) {
		var newheight = h-this.tabs.getSize().y-this.buttons.getSize().y-this.options.frameHeightPadding ;
		this.frame.setStyle('height', newheight);
	}
});

var FormStep = new Class ({
	Implements: [Events, Options],
	options: {
		form_ele: 'form_step', //default
		form_label: 'form_step_label' //ove inserire gli step
		//myScroller
	},
	initialize: function(options){
		this.setOptions(options);
		this.setup();
		this.currentpage = 0;
	},
	setup: function() {
		var frame = $(this.options.form_ele);
		var wrap = new Element('div',{'class':'wrapper'});
		var pages = this.pages = frame.getElements('fieldset');
		var that = this;
		var label_text ="";
		
		var fields = frame.getElements('input, select, textarea');
		var elselect = null ;
		fields.addEvent('focus', function(){
			elselect = this;
			//alert(elselect.get('id'));
		});
		
		frame.addEvent('keydown', function(event){
			
			if(event.key=='tab')
			{
				event.stop();
				if (elselect.getParent()!=null) {
					ele = elselect.getParent().getNext('div');
					if(ele != null) {
					  fld= ele.getElement('input, select, textarea');
					  while (fld!=null && fld.getStyle('visibility') == 'hidden') {
					  	ele = fld.getParent().getNext('div');
					  	if (ele!=null)
					  		fld= ele.getElement('input, select, textarea');
					  	else
					  		fld=null;
					  }
					  if (fld!=null)
					  	fld.focus();
					  else this.next(this.currentpage+1);
					} else this.next(this.currentpage+1);
				}
			}
			if(event.key=='enter' && event.target.get('tag')!='textarea')
			{
				event.stop();
			}
		}.bind(this));
		

		pages.dispose().inject(wrap);
		wrap.inject(frame);
		this.pagewidth = frame.getSize().x;
		pages.addClass('page').setStyle('width', this.pagewidth)
		wrap.setStyle('width', pages.length * this.pagewidth);
		this.myScroller = new Fx.Scroll(frame, {
			duration: 400,
			link: 'cancel',
			transition: Fx.Transitions.Cubic.easeInOut
		});
		pages.each(function(e,k){
			e.num = k;
			label = new Element('a',{'text': e.num+1,'class':'form_page'});
			if(e.num==0) label.addClass("selected");
			label.inject($(this.options.form_label), 'bottom')
		},this)
		var bar = new Element('div',{'class':'bottom_menu'});
		bar.inject(frame, 'after');
		this.previous_bt = new Element('a',{'text':'« indietro','class':'prev'});
		this.previous_bt.inject(bar);
		this.next_bt = new Element('a',{'text':'avanti » ','class':'next'});
		this.next_bt.inject(bar);
		
		this.next_bt.addEvent('click', function(ev){
			ev.stop();
			this.blur();
			that.next(that.currentpage+1);
		});
		this.previous_bt.addEvent('click', function(ev){
			ev.stop();
			this.blur();
			that.previous(that.currentpage-1);
		});
		this.previous_bt.setStyle('display', 'none')
	},
	next: function(n) {
		if(ckForm(this.pages[n-1])){
			this.previous_bt.setStyle('display', 'block')
			if(n < this.pages.length) {
				this.myScroller.start(this.pagewidth*n);
				fields =this.pages[n].getElements('div');
				fields[0].getElement('input, select, textarea').focus();
				this.setPage(n);
			}
			if(n == this.pages.length-1) {
				this.next_bt.setStyle('display', 'none')
			}
		}
	},
	previous: function(n) {
		this.next_bt.setStyle('display', 'block')
		if(n >= 0) {
			this.myScroller.toElement(this.pages[n]);
			this.setPage(n);
		};
		if(n == 0) {
			this.previous_bt.setStyle('display', 'none')
		}
	},
	setPage: function(n) {
		this.currentpage=n;
		$$('.form_page').removeClass("selected");
		$$('.form_page')[n].addClass("selected");
	}
})
window.addEvent('domready', function(){ 
window.site = new Site(); 
});


