// JavaScript Document
//version 1.57
function NS_calendar(){
	var widthCella=22;
	var heightCella=18;
	var altezzaTestata=20;

	var calfun = {
		callBack: null, //cambiare se si vuole richiamare il callback una funzione dopo aver selezionato una data
		hideDatePrecedenti: false, //rendere non selezionabili le date precedenti alla data indicata (utile per booking), false se non si vuole applicare la funzione, altrimenti inserire la data di riferimento in formato aaaa-mm-aa
		textReadOnly: false, //rende read-only il campo text-input
		divCal: null,
		disabled: false, //rende disabile il campo text-input e non fa comparire il calendario
		doc_write: true, //utilizza document.write
		CalObj: null, //andrà a contenere lo stesso codice scritto (eventualmente) da document.write
		posSx: false, //indica se si deve aprire con posizione sulla sinistra
		lingua: "it_IT", //per la lingua (introdotta da 1.54)
		icona: {img: "calendario.gif", w: "auto", h: "auto"},//personalizzare icona (introdotta da 1.55)
		AlertOn: true, //per abilitare gli alert (introdotta da 1.56)
		
		initValue: '', //valore iniziale
		id: '', //id valore
		Make: function(id, text_select, value, classe, style, classInput, styleInput, path, annoMin, annoMax,dataLibera){
			/*
				id = id che deve avere l'elemento di input
				text_select = 0 -> input sarà di tipo text, 1 ci saranno 3 select (una per il giorno, una per il mese, una per l'anno
				value = il valore che deve assumare in formato aaaa-mm-gg
				class = eventuale nome dello stile css, FALSE se non c'è
				style = eventuale style css da associare o FALSE per impostare quello di default
				classInput = eventuale nome dello stile css da applicare al tag input, FALSE se non c'è
				styleInput = eventuale style css da associare al tag input o FALSE per impostare quello di default
				path = path cartella calendario
				annoMin = anno minimo da cui deve partire la select ed eventuale controllo
				annoMax = come anno minimo ma x il valore max
				dataLibera = se TRUE allora la data sarà controllato che la data sia compresa tra il range di annoMin e annoMax, altrimenti sarà a libera selezione
			*/
			if(value=="0000-00-00") value='';
			this.initValue = value;
			this.id = id;
			var bgcolor = "#FFFFFF";
			var overcolor = "#ae4647";
			var bordercolor = "#FFFFFF";
			var colorText = "#000000";
			if(path.substr(path.length-1,1)!="/") path+="/";
			var cal="";
			if(text_select==0){
				var dvalue = value.length>0 ? this.formatData(value) : "";
				cal += '<input type="text" value="'+dvalue+'" id="NE_calendar_text_'+id+'" name="NE_calendar_text_'+id+'" ';
				if(classInput) cal += 'class="'+classInput+'" ';
				if(styleInput) cal += 'style="'+styleInput+'" ';
				cal += 'onchange="NS_calendar().checkData(this,\''+id+'\','+annoMin+','+annoMax+','+dataLibera+');" maxlength="10"';
				cal += this.textReadOnly || this.disabled ? ' READONLY' : '';
				cal += ' /> ';
			}else{ 
				//compilare
			}
			
			var display_img = this.disabled ? "display: none;" : "";
			if(this.icona.img.indexOf("/")==-1){
				var icona = path+this.icona.img;
			}else{
				var icona = this.icona.img;
			}
			var ico_w = this.icona.w=="auto" ? "auto" : this.icona.w+"px";
			var ico_h = this.icona.h=="auto" ? "auto" : this.icona.h+"px";
			
			cal += '<a href="javascript:NS_calendar().Open(\''+id+'\');"><img id="NE_'+id+'" src="'+icona+'" style="width: '+ico_w+'; '+display_img+'height: '+ico_h+'; border: none; vertical-align: middle;" onmouseout="$(\'NE_lay_'+id+'\').attivo=false; NS_calendar().checkOver(\"'+id+'\");" /></a>';
			cal += '<input type="hidden" value="'+value+'" id="'+id+'" name="'+id+'" />';
			
			cal += '<span id="NE_calendar_alert_'+id+'" style="margin-left: 5px; color: #ae4647; font-weight: bold; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; "></span>';

			/*cal += '<div id="NE_lay_'+id+'" onmouseover="this.attivo=true;" onmouseout="this.attivo=false;" style="';
			if(!style) style = 'border: 1px solid '+bordercolor+'; background-color:'+bgcolor+';';

			cal += style+' visibility: hidden; margin-top: '+himg+'px; height: 0px; width: 0px; position: absolute; overflow: hidden;"';
			if(classe) cal += ' class="'+classe+'"';
			cal += '></div>';*/
			
			if(this.doc_write)
				document.write(cal);
			
			this.CalObj = cal;
			
			var divCal = document.createElement('div');
			divCal.id = "NE_lay_"+id;
			divCal.onmouseover=function(){
				this.attivo=true;
			}
			divCal.onmouseout=function(){
				this.attivo=false;
			}
			
			if(!style){
				divCal.style.border="1px solid "+bordercolor;
				divCal.style.backgroundColor=bgcolor;
			}
			divCal.style.visibility="hidden";
			divCal.style.marginTop=ico_h;
			divCal.style.height="0px";
			divCal.style.width="0px";
			divCal.style.position="absolute";
			divCal.style.overflow="hidden";
			if(classe) divCal.className=classe;
			$('NE_'+id).divCal = divCal;
			//l'appendChild viene fatto al momento della chiamata ad Open( per un bug con explorer
			
			$('NE_'+id).writeTable = function(){
				var dati = this.NS_calendar.ajax.text.split(",");
				//alert(dati);//for debug
				var path = this.NS_calendar.path;
				var table = '<div style="text-align: center; color: #FFFFFF; font-weight: normal; background-image:url('+path+'bg.gif); height: '+altezzaTestata+'px; line-height: '+altezzaTestata+'px;">';
				table += '<a href="javascript:NS_calendar().changeData(\''+this.NS_calendar.id+'\',-1);"><img src="'+path+'freccia_sx.gif" style="width: '+altezzaTestata+'px; height: '+altezzaTestata+'px; border: none; float:left; clear:left;" /></a>';
				table += '<a href="javascript:NS_calendar().changeData(\''+this.NS_calendar.id+'\',1);"><img src="'+path+'freccia_dx.gif" style="width: 20px; height: 20px; border: none; float:right; clear:right" /></a>';
				
				table +='<span style="display: block; margin:auto; width: 120px; text-align:center;">'+dati[43]+' <a id="NE_calendar_anno_'+id+'" href="javascript:NS_calendar().showAnnoSel(\''+id+'\',0);" style="color: #FFFFFF; font-weight: bold; text-decoration: none;">'+dati[44]+'</a>';
				
				//select anno
				table +='<select id="NE_calendar_select_'+id+'" style="display:none; font-size: 9px; width: 50px;" onchange="NS_calendar().changeData(\''+this.NS_calendar.id+'\',this.options[this.options.selectedIndex].value);" onblur="NS_calendar().showAnnoSel(\''+id+'\',1);">';
				for(var i=annoMin;i<=annoMax;i++){
					var sel = i==dati[44] ? " selected" : "";
					table += '<option value="'+i+'"'+sel+'>'+i+'</option>';	
				}
				
				table +='</select>';
				table +='</span>';
				
				table += '</div>';

				if(dati[45]){
					var giorniSett = dati[45].split("|");	
				}else{
					var giorniSett = new Array("Lu","Ma","Me","Gi","Ve","Sa","Do");
				}				
				table += '<div style="clear: both;">';
				for(var i=0;i<7;i++)
					table += '<div style="float: left; width: '+widthCella+'px; line-height: '+heightCella+'px; height: '+heightCella+'px; color: '+colorText+'; font-weight: bold; text-align: center;">'+giorniSett[i]+'</div>';
				table +='</div>';
				
				
				if(this.NS_calendar.hideDatePrecedenti){
					var y_hdp = parseInt(this.NS_calendar.hideDatePrecedenti.substr(0,4));
					var m_hdp = this.NS_calendar.hideDatePrecedenti.substr(5,2);
					m_hdp = m_hdp.substr(0,1)=="0" ? parseInt(m_hdp.substr(1,1)) : parseInt(m_hdp);
					var d_hdp = this.NS_calendar.hideDatePrecedenti.substr(8,2);
					d_hdp = d_hdp.substr(0,1)=="0" ? parseInt(d_hdp.substr(1,1)) : parseInt(d_hdp);
				}
				
				giorni = dati;
				var data_rif = false;
				for(i=0;i<6;i++){
					table += '<div style="clear: both;">';
					for(var j=0;j<7;j++){
						g=giorni[(i*7)+j];

						g=g.split("|");

						var lg = g[1].substr(0,1)=="0" ? g[1].substr(1,1) : g[1];
						
						var y_rif = parseInt(g[0].substr(0,4));
						var m_rif = g[0].substr(5,2);
						m_rif = m_rif.substr(0,1)=="0" ? parseInt(m_rif.substr(1,1)) : parseInt(m_rif);
						
						if(this.NS_calendar.hideDatePrecedenti && ( (y_hdp==y_rif && m_hdp==m_rif && parseInt(lg)<d_hdp) || (y_hdp==y_rif && m_rif<m_hdp) || y_rif<y_hdp ) ){
							table += '<div';
							lg = '<span style="text-decoration: line-through; color: #CCCCCC;">'+lg+'</span>';
						}else{
							table += '<div onclick="NS_calendar().selData(\''+this.NS_calendar.id+'\',\''+g[0]+'\');" onmouseover="this.style.backgroundColor=\''+overcolor+'\'; this.style.color=\''+bgcolor+'\'; if(document.all) this.style.cursor=\'hand\'; else this.style.cursor=\'pointer\';" onmouseout="this.style.backgroundColor=\'\'; this.style.color=\''+g[2]+'\';"';
						}

						table += ' style="float: left; width: '+widthCella+'px; line-height: '+heightCella+'px; height: '+heightCella+'px; text-align: center; color: '+g[2]+';">'+lg+'</div>';
					}
					table += "</div>";
				}
	
				l=$('NE_lay_'+this.NS_calendar.id);
				l.innerHTML=table;
				l.data_rif = giorni[42];				
			};
			$('NE_'+id).NS_calendar = {
				id: id,
				path: path,
				hideDatePrecedenti: this.hideDatePrecedenti,
				ajax: NS_Ajax(),
				lingua: this.lingua,
				aperto: false,
				callBack: this.callBack
			};
		},
		
		showAnnoSel: function(id,x){
			var v1 = x==1 ? "" : "none";
			var v2 = x==1 ? "none" : "";
			$('NE_calendar_anno_'+id).style.display=v1;
			$('NE_calendar_select_'+id).style.display=v2;
		},
		
		checkOver: function(id){
			var l=$('NE_lay_'+id);
			clearTimeout(l.checkOverIdTime);
			if(!l.attivo) NS_calendar().Close(id);
			else l.checkOverIdTime = setTimeout("NS_calendar().checkOver('"+id+"')",1000);
		},

		Open: function(id){
			o=$("NE_"+id);

			if( !$('NE_lay_'+id) ){
				document.body.appendChild(o.divCal);
			}
			if(o.NS_calendar){
				if(!o.NS_calendar.aperto){
					this.changeData(id,0);
					margini = NS_positionObj(o);
					NS_fade('NE_lay_'+id,0,100,0.3,null);
					if(this.posSx){
						margini[0] -= (widthCella*7)-8;	
					}
					this.dimScheda(id,margini[0],margini[1],0,0,(widthCella*7)+8,(heightCella*7)+altezzaTestata+4);
				}
			}
		},
		
		dimScheda: function(id,posX,posY,w,h,wFin,hFin){	
			var MS=25;
			var o=$("NE_lay_"+id);
			//clearTimeout(o.movIdTime);
			var os = o.style;
			
			os.top=posY+"px";
			os.left=posX+"px";
			os.zIndex=10000; //si intende come il + alto
			var wc = (wFin-w)/3;
			var hc = (hFin-h)/3;
			var fase = 0;
			if(w+wc<wFin-10){
				os.width=(w+wc)+"px";
				w+=wc;
			}else{
				os.width=wFin+"px";
				fase++;
			}
			if(h+hc<hFin-10){
				os.height=(h+hc)+"px";
				h+=hc;
			}else{
				os.height=hFin+"px";
				fase++;
			}
			if(fase<2) o.movIdTime = setTimeout("NS_calendar().dimScheda(\""+id+"\","+posX+","+posY+","+w+","+h+","+wFin+","+hFin+")",MS);
			else{
				$('NE_'+id).NS_calendar.aperto=true;
				o.attivo=true;
				NS_calendar().checkOver(id);
			}
		},
		
		checkData: function(e,id,annoMin,annoMax,dataLibera){
			var v=e.value;
			if(e.value.length==0){
				$(id).value="";
				return true;
			}
			v = v.replace("/","-");
			v = v.replace("/","-"); //due volte perché il metodo replace sostituisce solo la prima occorrenza
			v = v.replace(".","-");
			v = v.replace(".","-");
			var dati = v.split("-");
			if(dati.length!=3){
				e.value = $(id).value==0 ? "" : this.formatData($(id).value);
				this.Alert(id,"Data non valida");
				return false;
			}
			
			var giorno = dati[0];
			var mese = dati[1];
			var anno = dati[2];
		

			if(giorno.length==1) giorno="0"+giorno;
			if(mese.length==1) mese="0"+mese;
			if(anno.length<3){
				var tmp;
				if(anno.length==1) tmp = "190"+anno;
				else tmp = "19"+anno;
				tmp = parseInt(tmp);
				if(tmp<1920){
					if(anno.length==1) anno = "200"+anno;
					else anno = "20"+anno;
				}else anno = tmp;
			}else{
				while(anno.length<4)
					anno = "0"+anno;
			}

			var data = giorno+"-"+mese+"-"+anno;
			
			var pat = /(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d/;
			var pat = /\d\d[- \/.]\d\d[- \/.]\d\d\d\d/;
			if(!data.match(pat)){
				e.value = $(id).value==0 ? "" : this.formatData($(id).value);
				this.Alert(id,"Formato data non valido");
				return false;
			}
	
			var a = parseInt(anno);
			if(!dataLibera && (a<annoMin || a>annoMax)){
				this.Alert(id,"Periodo "+annoMin+" - "+annoMax);
				a = a<annoMin ? annoMin : a;
				a = a>annoMax ? annoMax : a;
				anno = a.toString();
			}
			var g = giorno.substr(0,1)==0 ? parseInt(giorno.substr(1,1)) : parseInt(giorno);
			var m = mese.substr(0,1)==0 ? parseInt(mese.substr(1,1)) : parseInt(mese);
			
			//controllo bisestile
			if(g>31) g=31;
			if(m>12) m=12;
			if(g<1) g=1;
			if(m<1) m=1;

			if(a%4==0){
				if(a%100==0){
					if(a%400==0) bisestile=true;
					else bisestile=false;
				}bisestile=true;
			}else bisestile=false;
		
			//controllo giorno
			if(m==2 && g>28){
				if(bisestile) g=29;
				else g=28;
			}
			if((m==4 || m==6 || m==9 || m==11) && g==31) g=30;
			if(g<10) g="0"+g;
			if(m<10) m="0"+m;
			
			e.value=g+"-"+m+"-"+anno;
			$(id).value=anno+"-"+m+"-"+g;
			
			var datasel = g+"-"+m+"-"+anno;
			if($("NE_"+id).NS_calendar.callBack){
				eval($("NE_"+id).NS_calendar.callBack+"(\""+datasel+"\")");
			}
		},
		
		Reset: function(){
			$('NE_calendar_text_'+this.id).value = this.initValue.length>0 ? this.formatData(this.initValue) : "";
			$(this.id).value = this.initValue;
		},
		
		changeData: function(id,spostamento){
			var data = $(id).value;
			var l = $("NE_lay_"+id);
			var data_rif = l.data_rif;
			var o=$('NE_'+id);
			l.attivo = true;
			o.NS_calendar.ajax.Reset();
			var str = "data="+data+"&spostamento="+spostamento+"&data_rif="+data_rif+"&lingua="+o.NS_calendar.lingua;
			o.NS_calendar.ajax.Send(str,o.NS_calendar.path+"calendario.php","get","$('NE_"+id+"').writeTable");
		},
		
		Alert: function(id,msg){
			if(this.AlertOn){
				var l=$("NE_calendar_alert_"+id);
				if(msg){
					l.innerHTML = msg;
					l.idTime = setTimeout("NS_calendar().Alert('"+id+"',false)",1500);
				}else{
					l.innerHTML = "";
					clearTimeout(l.idTime);
				}
			}
		},
		
		selData: function(id,value){
			$(id).value = value;
			var datasel = $("NE_calendar_text_"+id).value = NS_calendar().formatData(value);
			NS_calendar().Close(id);
			$("NE_calendar_text_"+id).onchange();
			if($("NE_"+id).NS_calendar.callBack){
				eval($("NE_"+id).NS_calendar.callBack+"(\""+datasel+"\")");
			}
		},
		
		Close: function(id){
			try{
				var l=$('NE_lay_'+id);
				l.data_rif="";
				l.attivo=false;
				l.data_rif="";
				var ls = l.style;
				ls.visibility="hidden";
				ls.height=ls.width="0px";
				
				$("NE_"+id).NS_calendar.aperto=false;
				document.body.removeChild(l);
			}catch(e){}
		},
		
		formatData: function(data){
			var a = data.substr(0,4);
			var m = data.substr(5,2);
			var g = data.substr(8,2);
			return(g+"-"+m+"-"+a);
		}
	};
	return calfun;
}