// JavaScript Document
MooTools.lang.setLanguage("it-IT");

window.addEvent('domready',function(){$$('a[href=#]').each(function(el){el.addEvent('click', function(e) {e.stop();});});});

Form.Validator.Balloon = new Class({
	
	Extends: Form.Validator,
	
	options: {
		color: 'grey',
		cssPath: 'include/formcheck/',
		contWidth: 150,
		offsetX: -50,
		offsetY: 0,
		scrollToErrorsOnSubmit: true,
		scrollFxOptions: {
			transition: 'quad:out',
			offset: {
				y: -20
			}
		}
	},

	initialize: function(form, options){
		// Richiamo il metodo padre
		this.parent(form, options);
		
		// Aggiungo all'evento della validazione
		// (che occorre per ogni criterio di validazione, quindi anche più volte per ogni campo)
		this.addEvent('onElementValidate', function(isValid, field, className, warn){
			var validator = this.getValidator(className);
			if (!isValid && validator.getError(field)){
				if (warn) field.addClass('warning');
				// Se c'è l'errore chiamo makeAdvice
				this.makeAdvice(className, field, validator.getError(field), warn);
			}
		});

		// Aggiungo il foglio di stile al DOM
		var cssPath = this.options.cssPath;
		if (cssPath.substr(-1,1) != '/') cssPath+='/';
		new Element('link', {
			'rel': "stylesheet",
			'type': "text/css",
			'href': cssPath+this.options.color+'/validator.css'
		}).inject(document.getElement('head'));
	},

	getFieldId : function(field){
		return field.id ? field.id : field.id = 'input_' + field.name;
	},

	validateField: function(field, force){
		//Prima creo il contenitore
		this.createContainer(field);
		
		if (this.options.serial && $chk(this.element.getElement('.validation-failed'))) {
			if (this.element.getElement('.validation-failed') != field)
				return true;
		}
		
		// Chiamo il metodo del Form.Validator che oltre a dirmi se passa o no
		// chiama l'evento onElementValidate che chiama a sua volta il makeAdvice
		// che popola un array con i vari errori di validazione
		var result = this.parent(field, force);
		
		if (result) {
			// Se la validazione passa nascondo il container
			this.hideAdvice(field);
		}
		else {
			// Altrimenti inserisco gli errori nel container
			this.insertAdvice(field);
			// e mostro il container
			this.showAdvice(field);
		}
		
		// Ritorno l'esito della validazione (se qualcuno volesse farla manualmente)
		return result;
	},
	
	createContainer: function(field) {
		// Crea il contenitore se non esiste già
		var c;
		if (c = field.retrieve('advices-container', false)) {
			if (!$chk(c.getElement('div.err'))) {
				field.eliminate('advices-container');
			}
		}
		
		if (!field.retrieve('advices-container', false)) {
			// Codice html della struttura del balloon, più veloce che stare a creare tutti gli elementi
			var errorHtml = '<div class="top"><div class="tl"></div><div class="tr"></div><div class="t"></div></div>';
			errorHtml += '<div class="center"><div class="l"><div class="r"><div class="c"><a class="close"></a><div class="err">';
			errorHtml += '</div></div></div></div></div>';
			errorHtml += '<div class="bottom"><div class="bl"></div><div class="br"></div><div class="b"></div></div>';
			
			var el2Wrap = field.getParent().get('tag') == 'label' ? field.getParent() : field;
			// Creo il padre per utilizzare il posizionamento assoluto relativamente ad esso
			// Se c'è la label è un casino, perchè non si riesce a chiudere la finestra 
			// dato che il click sulla x (che sarebbe interna alla label)  riporta il focus sull'input, 
			// quindi cliccando poi altrove si riverificherebbe il blur e la validazione che fallendo 
			// riapre il balloon. Così all'infinito. Creo quindi il padre esterno alla label.
			var p = new Element('span').wraps(el2Wrap);
			p.setStyle('position', 'relative');
			
			// Creo il div come elemento DOM così da poterlo memorizzare su field.
			var div = new Element('div', {
				'class': 'validation-advice',
				'styles': { 
					//'display': 'none',
					'visibility': 'hidden',
					'position': 'absolute',
					//'bottom': 0, //field.getCoordinates(p).bottom,
					'left': field.getCoordinates(p).right + this.options.offsetX,
					'width': this.options.contWidth+'px'
				},
				'html': errorHtml
			});
			// Memorizzo il div al field, così da poterlo recuperare facilmente.
			field.store('advices-container',div);
			
			// Lo inserisco nel padre
			div.inject(p);
			if (div.fade) div.fade('hide');
			
			// Attivo la x che chiude la finestra
			var fv = this;
			div.getElement('a.close').addEvent('click', function(e) {
				fv.resetField(field);
			});
		}
		
		// Svuoto l'array dei messaggi se esiste, altrimenti ne creo uno.
		var am;
		if (typeof(am = field.retrieve('advices-messages', false)) == 'array') {
			am.empty();
		}
		else {
			field.store('advices-messages', new Array())
		}
	},

	makeAdvice: function(className, field, error, warn){
		
		// Ricavo l'errore
		var errorMsg = (warn)?this.warningPrefix:this.errorPrefix;
			errorMsg += (this.options.useTitles) ? field.title || error:error;
		var cssClass = (warn) ? 'warning-message' : 'validation-message';
		var fv = this;
		
		// Creo il p del messaggio dell'errore
		var advice = new Element('p', {
			html: errorMsg,
			id: 'advice-' + className + '-' + this.getFieldId(field)
		}).addClass(cssClass);
		
		// Accodo l'errore all'array degli errori
		field.retrieve('advices-messages', new Array()).include(advice);
	},

	insertAdvice: function(field){
		// Messaggi salvati con makeAdvice
		var adviceMsg = field.retrieve('advices-messages', new Array());
		
		// Contenitore creato durante la prima vaidazione (ne prendo il div che conterrà  i messaggi)
		var cont = field.retrieve('advices-container', new Element('div')).getElement('div.err');
		// Svuoto il contenitore
		cont.empty();
		// e lo riempo con i nuovi messaggi
		adviceMsg.each(function(el) {
			el.inject(cont);
		});
	},

	showAdvice: function(field){
		// Contenitore creato durante la prima vaidazione
		var advice = field.retrieve('advices-container', new Element('div'));
		
		// Calcolo la posizione verticale
		var p = field.getParent('span');
		var h = advice.getCoordinates().height;
		var t = field.getCoordinates(p).top;
		advice.setStyle('top', (t-h-this.options.offsetY)+'px');
		
		// Mostro il contenitore tramite fade (se esiste)
		if (advice.fade) advice.fade('in');
		else advice.setStyle('visibility', 'visible');
	},

	hideAdvice: function(field){
		// Contenitore creato durante la prima vaidazione
		var advice = field.retrieve('advices-container', new Element('div'));
		
		// Nascondo il contenitore tramite fade (se esiste)
		if (advice.fade) advice.fade('out');
		else advice.setStyle('visibility', 'hidden');
	},

	resetField: function(field){
		// Preso pari pari da Form.Validator.Inline
		field = document.id(field);
		if (!field) return this;
		this.parent(field);
		// Fino a qui
		// A differenza dell'altro devo nascondere solo il contenitore
		// e non tutti i messaggi singolarmente.
		this.hideAdvice(field);
		return this;
	}
});


function eliminaRiga(id, messaggio, op) {
	var f, i;
	if (window.confirm(messaggio)) {
		f = new Element('form', {
				'action': addQSLink("op",op),
				'method': 'post',
				'styles': { 'display': 'none' }
			});
		i = new Element('input', {
				'type' : 'hidden',
				'name': 'id',
				'value': id
			});
		
		i.inject(f);
		
		f.inject(document.body);
		
		f.submit();
		
	}
}

function makeScrollable(selector) {
	/*
	Impostare overflow:auto ai div coinvolti
	farà funzionare il tutto anche senza javascript!
	
	Aggiungere i seguenti stili css:
		.sliderCont {
			// Contenitore di slider + frecce
			float: right // posizione dello slider
		}
		.frSu, .frGiu {
			// frecce
		}
		.slider {
			// slider
		}
		.knob {
			// pomello che si muove
		}
	*/
	$$(selector).each(function(el) {
		el.setStyle('overflow','hidden');
		
		var scrollCorpo;
		var inScroll = false;
		var currPos = 0;
		var mySlider;
		
		var div = new Element('div');
		var cont = new Element('div',{
			'class': 'scrollContainer'
		});
		
		var sliderCont = new Element('div',{
			'class': 'sliderCont'
		});
		var frSu = new Element('a',{
			'class': 'frSu',
			'href': '#',
			'events': {
				'click': function(e) {
					e.stop();
					currPos -=10;
					if (currPos < 0)
						currPos = 0;
					mySlider.set(currPos);
				}
			}
		});
		var frGiu = new Element('a',{
			'class': 'frGiu',
			'href': '#',
			'events': {
				'click': function(e) {
					e.stop();
					currPos +=10;
					if (currPos > (altCon - altFin))
						currPos = altCon - altFin;
					mySlider.set(currPos);
				}
			}
		});
		var slider = new Element('div',{
			'class': 'slider'
		});
		var knob = new Element('div',{
			'class': 'knob'
		});
		knob.inject(slider);
		
		frSu.inject(sliderCont);
		slider.inject(sliderCont);
		frGiu.inject(sliderCont);
		
		div.setStyles({
			'width': 'auto',			  
			'height': el.getStyle('height'),
			'overflow': 'hidden'
		});
		div.wraps(el);
		
		var frH = parseInt(frSu.getStyle('height')) + parseInt(frGiu.getStyle('height'));
		frH += parseInt(frSu.getStyle('margin-top')) + parseInt(frGiu.getStyle('margin-top'));
		frH += parseInt(frSu.getStyle('padding-top')) + parseInt(frGiu.getStyle('padding-top'));
		frH += parseInt(frSu.getStyle('border-top-width')) + parseInt(frGiu.getStyle('border-top-width'));
		frH += parseInt(frSu.getStyle('margin-bottom')) + parseInt(frGiu.getStyle('margin-bottom'));
		frH += parseInt(frSu.getStyle('padding-bottom')) + parseInt(frGiu.getStyle('padding-bottom'));
		frH += parseInt(frSu.getStyle('border-bottom-width')) + parseInt(frGiu.getStyle('border-bottom-width'));
		
		slider.setStyle('height', (el.getCoordinates().height - frH)+'px');
		
		el.setStyles({
			'width': 'auto',
			'height': 'auto',
			'overflow': 'visible'
		});
		
		var altFin = div.getCoordinates().height;
		var altCon = el.getCoordinates().height;
		
		if (altCon > altFin) {
			cont.wraps(div);
			sliderCont.inject(cont,'top');
			scrollCorpo = new Fx.Scroll(div, {
									link: 'cancel'
								});
	
			scrollCorpo.addEvent('start', function() { 
									inScroll = true;
								});
	
			scrollCorpo.addEvent('complete', function() { 
									inScroll = false;
									mySlider.set(currPos);
								});
	
			mySlider = new Slider(slider, knob, {
				onChange: function(pos){
						scrollCorpo.set(0,pos);
						currPos = pos;
					},
				mode: 'vertical',
				steps: altCon - altFin
			});
			
			cont.addEvent('mousewheel', function(e) {
				e.stop();
	
				if (e.wheel < 0) {
					currPos +=10;
					if (currPos > (altCon - altFin))
						currPos = altCon - altFin;
					mySlider.set(currPos);
				}
				if (e.wheel > 0) {
					currPos -=10;
					if (currPos < 0)
						currPos = 0;
					mySlider.set(currPos);
				}
			});
		}
	});
}

var pufApri;
var apriFin = function (lnk) {
	var u, t, l, w, h;
	
	w = Math.round(screen.height*2/3);
	h = Math.round(screen.height*2/3);
	l = Math.round((screen.width - w)/2);
	t = Math.round((screen.height - h)/2);
	u = lnk.href;

	if (u != "")
		pufApri = window.open(u,"Immgagine","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width="+w+",height="+h+",top="+t+",left="+l+"");
	
	return false;
	
}

function rollover(img, src) {
	$(img).set('src', src);
}
function addRollover(target, img, src, srcOut) {
	if (!srcOut) srcOut = img.get('src');
	simplePreload(src,srcOut);
	target.addEvent('mouseover', function() {
		$(img).set('src', src);
	});
	target.addEvent('mouseout', function() {
		$(img).set('src', srcOut);
	});
}
function addQSLink(key, value) {
	var qst = location.search.substr(1);
	var dati = new Array();
	if (qst.length > 0) {
		dati=qst.split("&");
	}
	var l = "?";
	for (i=0; i < dati.length; i++) {
		if (dati[i].substr(0,key.length) != key)
			l += dati[i]+"&";
	}
	l += key + "=" + value;
	return l;
}
function addQS(key, value) {
	location = addQSLink(key, value);
}

function simplePreload()
{ 
  var args = simplePreload.arguments;
  if (!document.imageArray) document.imageArray = new Array();
  var arrStart = document.imageArray.length;
  var arrStop = arrStart + args.length;
  for(var i=arrStart; i<arrStop; i++)
  {
	document.imageArray[i] = new Image;
	document.imageArray[i].src = args[i];
  }
}

function wopen(url, name, w, h){
	 w += 32;
	 h += 96;
	 var win = window.open(url,
	  name,
	  'width=' + w + ', height=' + h + ', ' +
	  'location=no, menubar=no, ' +
	  'status=no, toolbar=no, scrollbars=yes, resizable=no');
	 win.resizeTo(w, h);
	 win.focus();
}


