var DEBUG = true; var INPUTCOLOR = "#dddddd"; //colore del bordo dell'input di default var INPUTERROR = "1px solid #FF5500"; //var LOCALAREA = ; var LANG = 'it'; var URLSITO = 'https://www.dalsacrestano.it/'; /* ALERT ********************************/ function alertSwal(ty,ti,mex,fn){ //type = warning, error, success, info, question if(fn==undefined) fn=function(){}; swal({ title: ti, text: mex, type: ty, timer: 6000}, function(confirm){ setTimeout(fn,200); }); }; function confirmSwal(mex,fn,fn2){ swal({ title: "Avviso", html: mex, type: 'warning', showCancelButton: true, confirmButtonText: 'Ok', cancelButtonText: 'Annulla' }, function(confirm){ if(confirm){ setTimeout(fn,200); }else{ setTimeout(fn2,200); } }); } function viewLoader(mex){ var ldr = document.getElementById('nonsolospinner'); var ldrdiv = document.getElementById('nonsolospinnerdiv'); getChildTag(ldr,'DIV')[0].innerHTML = mex; //ldr.firstChild.innerHTML = mex; ldr.style.display = "block"; ldrdiv.style.display = "block"; } function hideLoader(cont,dbg){ if(dbg){ if(typeof(cont)!='string') cont = JSON.stringify(cont); var ldr = document.getElementById('nonsolospinner'); ldr.firstChild.innerHTML = cont; }else{ var ldr = document.getElementById('nonsolospinner'); var ldrdiv = document.getElementById('nonsolospinnerdiv'); ldr.style.display = "none"; ldrdiv.style.display = "none"; ldr.firstChild.innerHTML = ''; } } /* DEBUG ********************************/ function ja(o){ alert(JSON.stringify(o)); console.log(JSON.stringify(o)); } function sja(o){ var str = ''; for(var i in o){ if(str!='') str +=','; str += i +":" + typeof o[i]; } alert(str); } /* FORM ********************************/ function normalizeCampo(obj){ obj.style.borderColor = INPUTCOLOR; } function emphasizeCampo(obj){ obj.style.border = INPUTERROR; }; function ctrlKey(e,o){ if(e.keyCode==13) document.getElementById(o).click(); } function toUri(obj){ var strUri=''; if(obj.name!="" && obj.name!=undefined){ switch(obj.type){ case 'checkbox': case 'radio': if((obj.type === 'radio' || obj.type === 'checkbox') && obj.checked) { var val=(obj.value!=='')? obj.value : '1'; strUri += '&'+obj.name+'='+encodeURIComponent(val); }else{ strUri += '&'+obj.name+'='; } break; default: strUri += '&'+obj.name+'='+encodeURIComponent(obj.value); break; } } return strUri; } function buildUri(obj){ var strUri =''; for(var n=0; n0) fields['dataId'] = []; for(var n=0; n stringify of objects //mode=mix => key= stringify for array and key=value for the rest //mode=php => key[]=val1&...key[]=valn for array and key=value for the rest if(mode==undefined) mode = 'php'; var strUri = ''; var objUri = {}; var mixUri = ''; for(var i in this.nodes){ var v = this.getValue(i); objUri[i.replace('[]','')]=v; if(v.constructor === Array){ v.forEach(function(e){ strUri += '&'+i+'='+encodeURIComponent(e); }); mixUri += '&'+encodeURIComponent(i.replace('[]',''))+'='+encodeURIComponent(JSON.stringify(v)); }else{ strUri += '&'+encodeURIComponent(i)+'='+encodeURIComponent(v); mixUri += '&'+encodeURIComponent(i)+'='+encodeURIComponent(v); } } switch(mode){ case 'json': return JSON.stringify(objUri); break; case 'mix': return mixUri; break; case 'php': return strUri; break; } }, form.normalize = function(){ for(var i in form.nodes){ var a = form.nodes[i]; for(var j=0;j= 0) return true; return false; } } function controlForm(frm,nome,fld1,fld2,tipo){ if(tipo==undefined) tipo = ''; switch(tipo){ case "":// controlla se il campo e vuoto false (quindi ="" o =0...tanti zeri) if(frm.getValue(fld1) == false){ alertSwal('warning',nome, 'campo mancante',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; } return true; break; case "_":// controlla se il campo = vuoto con "" if(frm.getValue(fld1) == ""){ alertSwal('warning',nome, 'campo mancante',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; } return true; break; case "@": // controlla la validita del campo mail if(!indirizzoEmailValido(frm.getValue(fld1))){ alertSwal('warning',nome, 'formato non valido',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; } return true; break; case "hS":// controlla se il campo autoSuggest = vuoto if(frm.getValue(fld2) == ""){ if(frm.getValue(fld1) == false){ alertSwal('warning',nome, 'campo mancante',frm.focus.bind(frm,fld1)); }else{ alertSwal('warning',nome, 'Non presente tra i dati disponibili',frm.focus.bind(frm,fld1)); } frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "date": if(frm.getValue(fld1) == "" || frm.getValue(fld1) == "00-00-0000"){ alertSwal('warning',nome, 'campo mancante',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "date<": if(frm.getValue(fld2) != "" && frm.getValue(fld1) != ""){//&& frm.getValue(fld2) != "00-00-0000" && frm.getValue(fld1) != "00-00-0000" var arr1 = frm.getValue(fld1).split("-"); var arr2 = frm.getValue(fld2).split("-"); var d1 = new Date(arr1[2],arr1[1]-1,arr1[0]); var d2 = new Date(arr2[2],arr2[1]-1,arr2[0]); var r1 = d1.getTime(); var r2 = d2.getTime(); if(r1 > r2){ alertSwal('warning',nome, 'Le date sono invertite',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; } return true; }else{ return true; } break; case "ore<": if(frm.getValue(fld2)!="" && frm.getValue(fld1)!=""){//&& frm.getValue(fld2)!="00:00" && frm.getValue(fld1)!="00:00"){ var arr1 = frm.getValue(fld1).split(":"); var arr2 = frm.getValue(fld2).split(":"); arr1[0]= parseInt(arr1[0],10); arr1[1]= parseInt(arr1[1],10); arr2[0]= parseInt(arr2[0],10); arr2[1]= parseInt(arr2[1],10); if(arr1[0] > arr2[0] || (arr1[0] == arr2[0] && arr1[1] > arr2[1])){ alertSwal('warning',nome, 'Gli orari sono invertiti',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; } return true; }else{ return true; } break; case "!-1": // controlla se il valore del campo e' !-1 if(frm.getValue(fld1)=='-1'){ alertSwal('warning',nome, 'campo mancante',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "=": // confronta due campi if(frm.getValue(fld2) != frm.getValue(fld1)){ alertSwal('warning',nome, "non coincidono",frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; frm.getElement(fld2).value = ""; return false; }else{ return true; } break; case "c<": // controlla se il campo e' piu' corto di un tot if(frm.getValue(fld1).length < fld2){ alertSwal('warning',nome, 'lunghezza minima: '+fld2,frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "piva": // controlla partita iva var r = new RegExp("^[0-9]{11}$"); if(!r.test(frm.getValue(fld1))){ alertSwal('warning',nome, 'Formato non valido',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "cf": // controlla codice fiscale var r = new RegExp("^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$"); if(!r.test(frm.getValue(fld1))){ alertSwal('warning',nome, 'Formato non valido',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; case "iban": // controlla IBAN var r = new RegExp("^[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}$"); //var r = new RegExp("/^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$/i"); if(!r.test(frm.getValue(fld1))){ alertSwal('warning',nome, 'Formato non valido',frm.focus.bind(frm,fld1)); frm.getElement(fld1).style.border = INPUTERROR; return false; }else{ return true; } break; // TODO case "h": // controlla se il campo hidden = vuoto if(document.getElementById(id2).value == false){ alertWinScroll(id, 400, ""+nome+": campo mancante"); document.getElementById(id).focus(); document.getElementById(id).style.border = "1px solid #FF9900"; return false; }else{ return true; } break; case "c": // controlla se il campo e' piu' lungo di un tot if(document.getElementById(id).value.length > id2){ var c = "caratteri"; if(id2==1) c = "carattere"; alertWinScroll(id, 400, ""+nome+": il campo deve contenere un massimo di "+id2+" "+c); document.getElementById(id).focus(); document.getElementById(id).style.border = "1px solid #FF9900"; return false; }else{ return true; } break; case "n=": // controlla se il campo e' lungo n if(document.getElementById(id).value.length != id2){ var c = "caratteri"; if(id2==1) c = "carattere"; alertWinScroll(id, 400, ""+nome+": il campo deve contenere " +id2+ " "+c); document.getElementById(id).focus(); document.getElementById(id).style.border = "1px solid #FF0000"; return false; }else{ return true; } break; case "n": // controlla se il campo e' un numero if(isNaN(document.getElementById(id).value.replace(',','.'))){ alertWin(nome+": il campo deve contenere solo numeri"); document.getElementById(id).focus(); document.getElementById(id).style.border = "1px solid #FF0000"; return false; }else{ return true; } case "v>": // controlla se il valore del campo e' > di tot if(parseInt(document.getElementById(id).value)=": // controlla se il valore del campo e' >= di tot if(parseInt(document.getElementById(id).value)"+nome+": formato non valido"); document.getElementById(id).focus(); document.getElementById(id).style.border = "1px solid #FF9900"; return false; break; case "img": // controllo se il file = una img obj = document.getElementById(id); var extensions = new Array(); extensions[1] = "jpg"; extensions[0] = "jpeg"; extensions[2] = "gif"; extensions[3] = "png"; /*extensions[4] = "bmp";*/ var image_file = obj.value; var image_length = image_file.length; var pos = image_file.lastIndexOf('.') + 1; var ext = image_file.substring(pos, image_length); var final_ext = ext.toLowerCase(); for (i = 0; i < extensions.length; i++){ if(extensions[i] == final_ext){ return true; } } alertWin("Seleziona un'immagine con una delle seguenti estensioni:\n\n gif, jpeg, jpg"); return false; break; default: alertWin("tipo non riconosciuto"); return false; } } // ********************* Modale ****************** // Eventi nella pagina function addEvent(obj, evType, fn){ if(obj.addEventListener){ obj.addEventListener(evType, fn, true); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else { return false; } } function once(e,fn) { target = (e.currentTarget) ? e.currentTarget : e.srcElement; if(target.removeEventListener){ target.removeEventListener(e.type, fn); }else{ target.detachEvent('on'+e.type, fn); } target['on'+e.type]=null;//inline event var args = Array.prototype.slice.call(arguments); var dump = args.shift(); dump = args.shift(); fn.apply(this, args); try { var new_e = new e.constructor(e.type, e); target.dispatchEvent(new_e); }catch(err) {} } function isMobile() { try{ document.createEvent("TouchEvent"); return true; } catch(e){ return false; } } /* Matematica ********************************/ /*** Returns a random integer between min (inclusive) and max (inclusive)*/ function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } /* Data tempo ********************************/ function dataIntervalPickerMod(dateFrom, dateTo, days, autoOpen, updateTo, maxAnno, pos, dataMin) { // // nuova versione diverso da ncc if(typeof(dataMin)=="string"){ var dataLim = dataMin.split('-'); var minDate = moment([dataLim[0],dataLim[1]-1,dataLim[2],0,0,0,0]); }else{ // altrimenti mette come min 1970-01-01 var minDate = new Date('1970-01-01'); } var dateF; var dateT; if(typeof dateFrom == 'string'){ dateF = $('#'+dateFrom); }else{ dateF = $(dateFrom); }; if(typeof dateTo == 'string'){ dateT = $('#'+dateTo); }else{ dateT = $(dateTo); }; if(dateF.val()==""){var dpevent = "dp.change";}else{var dpevent = "dp.hide";} dateF.datetimepicker({ locale: LANG, format: 'DD-MM-YYYY', widgetPositioning: { horizontal: 'auto', vertical: pos }, icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, minDate: minDate, useCurrent: false, ignoreReadonly: true //debug:true //}).on('dp.change', function (ev) { }).on(dpevent, function (ev) { $(dateF[0]).trigger("change"); if(maxAnno){ var anno = moment(ev.date,"DD/MM/YYYY").year(); var mese = moment(ev.date,"DD/MM/YYYY").month(); if(mese<7){ var maxDate = new Date(anno+'-12-31'); }else{ anno++; var maxDate = new Date(anno+'-06-30'); } }else{ var maxDate = new Date('2068-12-31'); } try { dateT.data("DateTimePicker").destroy(); } catch (e) {} dateT.datetimepicker({ locale: LANG, format: 'DD-MM-YYYY', widgetPositioning: { horizontal: 'auto', vertical: pos }, icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, minDate: ev.date, maxDate: maxDate, useCurrent: false, ignoreReadonly: true //debug:true }).on('dp.change', function (ev) { $(dateT[0]).trigger("change"); }); setTimeout(function (){ //dateT.focus.bind(dateT); if(updateTo){ var newDate = dateF.data("DateTimePicker").date(); newDate.add(days, "days"); dateT.data("DateTimePicker").date(newDate); }else{ if(dateT.val()==""){ var newDate = dateF.data("DateTimePicker").date(); newDate.add(days, "days"); dateT.data("DateTimePicker").date(newDate); } } dateT.focus(); }, 500); }); if(autoOpen){ dateF[0].onfocus=function(){}; dateF.blur(); dateF.focus(); } } function dataPicker(id,open,current){ if(open==undefined) open=0;// istanzia ed apri il picker if(current==undefined) current=true;//On show, use the current date/time var obj; if(typeof id == 'string'){ obj = $('#'+id); }else{ obj = $(id); }; obj.datetimepicker({ locale:'it', format: 'DD-MM-YYYY', icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, ignoreReadonly: true, useCurrent:current //,debug:true }).on('dp.change', function (ev) { $(obj[0]).trigger( "change" ); //obj.trigger( "change" ); }); if(open){ obj[0].onfocus=function(){}; obj.blur(); obj.focus(); }; } function dataPickerMin(id,open,dataF){ if($('#'+dataF).val()=="") return false; dataLim = $('#'+dataF).val().split('-'); if(open==undefined) open=0;// istanzia ed apri il picker var obj; if(typeof id == 'string'){ obj = $('#'+id); }else{ obj = $(id); }; obj.datetimepicker({ locale:'it', format: 'DD-MM-YYYY', icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, minDate: moment([dataLim[2],dataLim[1]-1,dataLim[0],0,0,0,0]), useCurrent: false, ignoreReadonly: true //,debug:true }).on('dp.change', function (ev) { $(obj[0]).trigger( "change" ); //obj.trigger( "change" ); }); //newDate = new Date(dataLim[2]+'-'+dataLim[1]+'-'+dataLim[0]+'T00:00:00'); //obj.data("DateTimePicker").date(newDate); if(open){ obj[0].onfocus=function(){}; obj.blur(); obj.focus(); }; } function timePicker(id,open,current){ if(open==undefined) open=0; if(current==undefined) current=true; var obj; if(typeof id == 'string'){ obj = $('#'+id); }else{ obj = $(id); }; obj.datetimepicker({ locale:'it', format: 'H:mm', // use this format if you want the 24hours timepicker //format: 'h:mm A', //use this format if you want the 12hours timpiecker with AM/PM toggle icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, useCurrent:current, //On show, use the current date/time ignoreReadonly: true //,debug:true }).on('dp.change', function (ev) { $(obj[0]).trigger( "change" ); }); if(open){ // istanzia ed apri il picker obj[0].onfocus=function(){}; obj.blur(); obj.focus(); }; } function yearPicker(id,open,current){ if(open==undefined) open=0;// istanzia ed apri il picker if(current==undefined) current=true;//On show, use the current date/time var obj; if(typeof id == 'string'){ obj = $('#'+id); }else{ obj = $(id); }; obj.datetimepicker({ locale:'it', format: 'DD-MM-YYYY', icons: { time: "fa fa-clock-o", date: "fa fa-calendar", up: "fa fa-chevron-up", down: "fa fa-chevron-down", previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-screenshot', clear: 'fa fa-trash', close: 'fa fa-remove', inline: true }, viewMode: 'years', defaultDate: '2001', ignoreReadonly: true, useCurrent:current //,debug:true }).on('dp.change', function (ev) { $(obj[0]).trigger( "change" ); //obj.trigger( "change" ); }); if(open){ obj[0].onfocus=function(){}; obj.blur(); obj.focus(); }; } // ******************Form prenotazione********************* function initPlaces(obj) { var autocomplete = new google.maps.places.Autocomplete(obj, { types: ['geocode'] }); //,componentRestrictions: {country: 'it'} autocomplete.setComponentRestrictions({ 'country': ['it', 'ch'] }); autocomplete.addListener('place_changed', fillInAddress.bind(obj, autocomplete)); } function fillInAddress(autocomplete) { var place = autocomplete.getPlace(); if (place.geometry) { var inps = getChildTag(this.parentNode, "INPUT"); for (var i = 0; i < inps.length; i++) { if (inps[i].name == this.name + 'lat') { inps[i].value = String(Math.round(place.geometry.location.lat() * 10000000) / 10000000); } if (inps[i].name == this.name + 'lng') { inps[i].value = String(Math.round(place.geometry.location.lng() * 10000000) / 10000000); } } } } //********************Contattaci****************** function contatta(obj){ var frm = formica(obj); flag = true; flag = flag && controlForm(frm, "nome",'nome'); flag = flag && controlForm(frm, "cognome",'cognome'); flag = flag && controlForm(frm, "email",'blabla','','@'); flag = flag && controlForm(frm, "privacy policy",'privacy'); var strUri = frm.buildUri('php'); strUri += "&lang=it"; if(flag){ viewLoader('invio in corso'); $.post('https://www.dalsacrestano.it/inviaContatti',strUri,function(){},'json') .done(function(resp){ var fn = function (){ frm.getElement('nome').value = ""; frm.getElement('cognome').value = ""; frm.getElement('tel').value = ""; frm.getElement('blabla').value = ""; frm.getElement('messaggio').value = ""; } if(resp.s=="ok"){ alertSwal('success',"richiesta inviata", "sarai rincontattato al più presto", fn); }else{ alertSwal('error','',"errore contatto"); } }) .fail(function(){alertSwal('error','', "errore connessione");}) .always(function(resp){hideLoader(resp,0);}); } } function contattaShort(obj){ var frm = formica(obj); flag = true; flag = flag && controlForm(frm, "email",'blabla','','@'); flag = flag && controlForm(frm, "messaggio",'messaggio','','_'); //flag = flag && controlForm(frm, "acconsento al trattamento dei dati",'acconsento'); var strUri = frm.buildUri('php'); strUri += "&lang=it"; if(flag){ viewLoader('invio in corso'); $.post('https://www.dalsacrestano.it/inviaContatti',strUri,function(){},'json') .done(function(resp){ var fn = function (){ frm.getElement('blabla').value = ""; frm.getElement('messaggio').value = ""; } if(resp.s=="ok"){ alertSwal('success',"richiesta inviata", "sarai rincontattato al più presto", fn); }else{ alertSwal('error','',"errore contatto"); } }) .fail(function(){alertSwal('error','', "errore connessione");}) .always(function(resp){hideLoader(resp,0);}); } } function aderisciAzienda(obj){ var frm = formica(obj); flag = true; flag = flag && controlForm(frm, "nome",'nome'); flag = flag && controlForm(frm, "azienda",'azienda'); flag = flag && controlForm(frm, "sede",'citta'); flag = flag && controlForm(frm, "indirizzo",'indirizzo'); flag = flag && controlForm(frm, "cap",'cap'); flag = flag && controlForm(frm, "provincia",'provincia'); flag = flag && controlForm(frm, "partita iva",'piva'); flag = flag && controlForm(frm, "telefono",'telefono'); flag = flag && controlForm(frm, "email",'blabla','','@'); flag = flag && controlForm(frm, "privacy policy",'privacy'); var strUri = frm.buildUri('php'); strUri += "&lang=it"; if(flag){ viewLoader('invio in corso'); $.post('https://www.dalsacrestano.it/aderisciAzienda',strUri,function(){},'json') .done(function(resp){ var fn = function (){ frm.getElement('nome').value = ""; frm.getElement('azienda').value = ""; frm.getElement('citta').value = ""; frm.getElement('indirizzo').value = ""; frm.getElement('cap').value = ""; frm.getElement('provincia').value = ""; frm.getElement('piva').value = ""; frm.getElement('telefono').value = ""; frm.getElement('blabla').value = ""; } if(resp.s=="ok"){ alertSwal('success',"richiesta inviata", "grazie per la collaborazione, sarai rincontattato al più presto", fn); }else{ alertSwal('error','',"errore contatto"); } }) .fail(function(){alertSwal('error','', "errore connessione");}) .always(function(resp){hideLoader(resp,0);}); } } function aderisciPrivato(obj){ var frm = formica(obj); flag = true; flag = flag && controlForm(frm, "nome",'nome'); flag = flag && controlForm(frm, "citta nascita",'cittanascita'); flag = flag && controlForm(frm, "data nascita",'datanascita'); flag = flag && controlForm(frm, "citta residenza",'cittaresidenza'); flag = flag && controlForm(frm, "indirizzo",'indirizzo'); flag = flag && controlForm(frm, "cap",'cap'); flag = flag && controlForm(frm, "provincia",'provincia'); flag = flag && controlForm(frm, "codice fiscale",'codicefiscale'); flag = flag && controlForm(frm, "telefono",'telefono'); flag = flag && controlForm(frm, "email",'blabla','','@'); flag = flag && controlForm(frm, "privacy policy",'privacy'); var strUri = frm.buildUri('php'); strUri += "&lang=it"; if(flag){ viewLoader('invio in corso'); $.post('https://www.dalsacrestano.it/aderisciPrivato',strUri,function(){},'json') .done(function(resp){ var fn = function (){ frm.getElement('nome').value = ""; frm.getElement('cittanascita').value = ""; frm.getElement('datanascita').value = ""; frm.getElement('cittaresidenza').value = ""; frm.getElement('indirizzo').value = ""; frm.getElement('cap').value = ""; frm.getElement('provincia').value = ""; frm.getElement('codicefiscale').value = ""; frm.getElement('telefono').value = ""; frm.getElement('blabla').value = ""; } if(resp.s=="ok"){ alertSwal('success',"richiesta inviata", "grazie per la collaborazione, sarai rincontattato al più presto", fn); }else{ alertSwal('error','',"errore contatto"); } }) .fail(function(){alertSwal('error','', "errore connessione");}) .always(function(resp){hideLoader(resp,0);}); } } function creaGalleryFullscreen(containerId, openFullscreen = '') { const $container = $('#' + containerId); if (!$container.length) return console.error('Container non trovato:', containerId); // Aggiunge data-index e cursore alle immagini $container.children().each(function(i){ $(this).attr('data-index', i).css('cursor', 'zoom-in'); }); // Estrae URL delle immagini dallo sfondo const imageUrls = []; $container.children().each(function() { const bg = $(this).css('background-image'); const url = bg.replace(/^url\(["']?/, '').replace(/["']?\)$/, ''); if (url) imageUrls.push(url); }); // Creazione slider unico per questa gallery (ID unico) const sliderId = 'slider-' + containerId; let $slider = $('#' + sliderId); if (!$slider.length) { $slider = $(` `); $('body').append($slider); // CSS globale (solo estetica) if ($('#gallery-fullscreen-styles').length === 0) { const styles = ` .slider-container {position:fixed;top:0;left:0;width:100vw;height:100vh;background:#111;z-index:9999;display:flex;justify-content:center;align-items:center;overflow:hidden;touch-action:pan-y;user-select:none;} .slider-wrapper {display:flex;height:100%;width:100%;transition:transform 0.3s ease;will-change:transform;} .slide {flex:0 0 100%;height:100%;position:relative;opacity:1;transition:opacity 0.3s ease;overflow:hidden;display:flex;justify-content:center;align-items:center;} .slide img {width:100%;height:100%;object-fit:contain;user-select:none;-webkit-user-drag:none;pointer-events:auto;transition:transform 0.3s ease;touch-action:none;cursor:grab;} .slide img.dragging {cursor:grabbing;} .nav-btn { position:absolute; top:50%; transform: translateY(-50%); background:rgba(17,17,17,0.5); border:none; color:white; font-size:3rem; cursor:pointer; user-select:none; z-index:50; border-radius:10px; } .prev, .next {opacity:0.6;transition:opacity 0.4s ease-in-out;} .prev:hover, .next:hover {opacity:1;} .prev-btn {left:15px;} .next-btn {right:15px;} .top-bar {position:absolute;top:0;left:0;width:100%;height:40px;background:rgba(0,0,0,0.5);display:flex;align-items:center;padding:0 15px;box-sizing:border-box;z-index:20;color:white;user-select:none;} .fullscreen-btn, .zoom-btn, .close-btn {background:none;border:none;padding:0;margin:0 6px;color:white;cursor:pointer;opacity:0.6;transition:opacity 0.4s ease-in-out;} .close-btn:hover, .zoom-btn:hover, .fullscreen-btn:hover {opacity:1;} .counter {opacity:0.7;} .slider-container *:focus {outline:none !important;} .slider-container a,.slider-container button {outline:none !important;text-decoration:none;} .slider-container img,.slider-container .slide,.slider-container .slider-wrapper{-webkit-user-drag:none;user-select:none;-webkit-tap-highlight-color:transparent;} .slider-container img:active {outline:none;border:none;} .slider-container {-webkit-touch-callout:none;} @media (max-aspect-ratio: 1/1) { .slide { border-right: 5px solid #111; /* stesso colore dello sfondo della slider B */ border-left: 5px solid #111; box-sizing: border-box; } } `; $('head').append(''); } } // Riempie il wrapper con le immagini const $wrapper = $slider.find('.slider-wrapper'); $wrapper.empty(); imageUrls.forEach(url => $wrapper.append(`
`)); const $slides = $wrapper.children(); const total = $slides.length; let current = 0, isAnimating = false; let isDragging = false, dragStartX = 0, dragCurrentX = 0; let currentScale = 1, panX = 0, panY = 0, isPanning = false, panStartX = 0, panStartY = 0; function limitPan() { const maxX = (currentScale-1) * window.innerWidth / 2; const maxY = (currentScale-1) * window.innerHeight / 2; panX = Math.min(maxX, Math.max(-maxX, panX)); panY = Math.min(maxY, Math.max(-maxY, panY)); } function applyTransform() { $slides.eq(current).find('img').css('transform',`translate(${panX}px,${panY}px) scale(${currentScale})`); } function resetZoomPan(idx) { panX = 0; panY = 0; currentScale = 1; $slides.eq(idx).find('img').css('transform',''); } function updateVisuals(offsetVw) { $wrapper.css('transform',`translateX(${offsetVw}vw)`); $slides.each((i,el)=>{ const slideCenter=i*100; const dist=Math.abs(slideCenter+offsetVw); let opacity=1-Math.min(dist/100,1); $(el).css('opacity',opacity); }); } function goToSlide(index){ if (isAnimating || index === current) return; isAnimating = true; if (index < 0) index = total-1; if (index >= total) index = 0; resetZoomPan(current); const startOffset = -current*100, endOffset = -index*100, duration = 300; let startTime = null; function animate(time){ if (!startTime) startTime = time; const elapsed = time - startTime; let progress = Math.min(elapsed/duration, 1); updateVisuals(startOffset + (endOffset - startOffset) * progress); if(progress < 1) requestAnimationFrame(animate); else { current = index; isAnimating = false; $slider.find('.counter').text((current+1)+'/'+total); } } requestAnimationFrame(animate); } // Click sulle immagini della gallery $container.children().on('click', function(){ current = parseInt($(this).attr('data-index')); $slider.show(); $('body').css('overflow','hidden'); updateVisuals(-current*100); resetZoomPan(current); $slider.find('.counter').text((current+1)+'/'+total); if(openFullscreen==='full' && !document.fullscreenElement) document.documentElement.requestFullscreen(); }); // Eventi pulsanti $slider.find('.prev-btn').on('click', () => goToSlide(current-1)); $slider.find('.next-btn').on('click', () => goToSlide(current+1)); $slider.find('#zoom-in-' + containerId).on('click', () => { if(currentScale<3){ currentScale++; limitPan(); applyTransform(); } }); $slider.find('#zoom-out-' + containerId).on('click', () => { if(currentScale>1){ currentScale--; limitPan(); applyTransform(); } }); $slider.find('#fullscreen-' + containerId).on('click', () => { if(!document.fullscreenElement) document.documentElement.requestFullscreen(); else document.exitFullscreen(); }); $slider.find('#close-' + containerId).on('click', () => { $slider.hide(); resetZoomPan(current); $('body').css('overflow',''); if(document.fullscreenElement) document.exitFullscreen(); }); // Swipe / Drag $slides.each((i, el) => { const $img = $(el).find('img'); $img.on('mousedown touchstart', e => { if(currentScale > 1){ // Pan per immagine ingrandita, sia mouse che touch isPanning = true; if(e.type === 'mousedown'){ panStartX = e.clientX - panX; panStartY = e.clientY - panY; } else if(e.type === 'touchstart'){ panStartX = e.originalEvent.touches[0].clientX - panX; panStartY = e.originalEvent.touches[0].clientY - panY; } $img.addClass('dragging'); return; } // Drag slider normale (solo se non zoom) isDragging = true; dragStartX = e.type === 'mousedown' ? e.clientX : e.originalEvent.touches[0].clientX; dragCurrentX = dragStartX; }); $img.on('mousemove touchmove', e => { if(isPanning){ const clientX = e.type==='mousemove'? e.clientX : e.originalEvent.touches[0].clientX; const clientY = e.type==='mousemove'? e.clientY : e.originalEvent.touches[0].clientY; panX = clientX - panStartX; panY = clientY - panStartY; limitPan(); applyTransform(); } else if(isDragging){ const clientX = e.type==='mousemove'? e.clientX : e.originalEvent.touches[0].clientX; dragCurrentX = clientX; const offset = dragCurrentX - dragStartX; updateVisuals(-current*100 + offset/window.innerWidth*100); } }); $img.on('mouseup touchend touchcancel', e => { if(isPanning){ isPanning=false; $img.removeClass('dragging'); return; } if(!isDragging) return; const offset = dragCurrentX - dragStartX; if(offset > 50) goToSlide(current-1); else if(offset < -50) goToSlide(current+1); else goToSlide(current); isDragging=false; }); }); // Key events specifici a questo slider $(document).on('keydown.' + sliderId, e => { if($slider.is(':visible')){ if(e.key==='Escape') $slider.find('#close-' + containerId).click(); if(e.key==='ArrowLeft') goToSlide(current-1); if(e.key==='ArrowRight') goToSlide(current+1); } }); $(document).on('mousemove.' + sliderId, e => { if(!isPanning) return; panX=e.clientX-panStartX; panY=e.clientY-panStartY; limitPan(); applyTransform(); }); $(document).on('mouseup.' + sliderId, () => { if(!isPanning) return; isPanning=false; $slides.eq(current).find('img').removeClass('dragging'); }); updateVisuals(0); } function creaGalleryFullscreen_u(containerId, mode = '') { const $thumbs = $('#' + containerId); if (!$thumbs.length) return console.error('Container non trovato:', containerId); // Aggiunge data-index e cursore alle immagini $thumbs.children().each(function(i) { $(this).attr('data-index', i) .css('cursor', "url('data:image/svg+xml;utf8,') 10 10, zoom-in"); }); // Creiamo il markup della gallery fullscreen const $slider = $(`
1/${$thumbs.children().length}
`); $('body').append($slider); // CSS dinamico per questa istanza const sliderCSS = ` `; $('head').append(sliderCSS); const $wrapper = $slider.find('.slider-wrapper'); // Creiamo le slide dalla thumbnail $thumbs.children().each(function(i) { const bg = $(this).css('background-image').replace(/url\((['"])?(.*?)\1\)/gi, '$2'); $wrapper.append(`
Slide ${i+1}
`); }); const $slides = $wrapper.children(); const total = $slides.length; let current = 0; let isAnimating = false; let slideshowTimer = null; let slideshowDelay = 5000; let isSlideshowPlaying = false; // Drag / pinch / pan variables let isDragging = false, dragStartX = 0, dragCurrentX = 0; let isPinching = false, initialPinchDistance = 0; let currentScale = 1, panX = 0, panY = 0; let isPanning = false, panStartX = 0, panStartY = 0; let lastTapTime = 0, doubleTapScaleSteps = [1, 2, 3], doubleTapScaleIndex = 0; function getDistance(touches) { const dx = touches[0].clientX - touches[1].clientX; const dy = touches[0].clientY - touches[1].clientY; return Math.sqrt(dx * dx + dy * dy); } function limitPan() { const maxX = (currentScale - 1) * window.innerWidth / 2; const maxY = (currentScale - 1) * window.innerHeight / 2; panX = Math.min(maxX, Math.max(-maxX, panX)); panY = Math.min(maxY, Math.max(-maxY, panY)); } function applyTransform() { $slides.eq(current).find('img').css('transform', `translate(${panX}px,${panY}px) scale(${currentScale})`); } function resetZoomPan(index) { panX = 0; panY = 0; currentScale = 1; $slides.eq(index).find('img').css('transform', ''); } function updateVisuals(offsetVw) { $wrapper.css('transform', `translateX(${offsetVw}vw)`); $slides.each((i, el) => { const dist = Math.abs(i * 100 + offsetVw); $(el).css('opacity', 1 - Math.min(dist / 100, 1)); }); } function goToSlide(index) { if (isAnimating || index === current) return; isAnimating = true; if (index < 0) index = total - 1; if (index >= total) index = 0; resetZoomPan(current); const startOffset = -current * 100; const endOffset = -index * 100; const duration = 300; let startTime = null; function animate(time) { if (!startTime) startTime = time; let progress = Math.min((time - startTime) / duration, 1); let offset = startOffset + (endOffset - startOffset) * progress; updateVisuals(offset); if (progress < 1) { requestAnimationFrame(animate); } else { current = index; isAnimating = false; } } requestAnimationFrame(animate); $slider.find('.counter').text(`${index+1}/${total}`); } function closeGallery() { stopSlideshow(); resetProgressBar(); // reset stato isDragging = false; isPanning = false; isPinching = false; isAnimating = false; // reset zoom/pan slide corrente resetZoomPan(current); // reset slider posizione current = 0; updateVisuals(0); // esci dal fullscreen se attivo if (document.fullscreenElement) { document.exitFullscreen(); } // nascondi la gallery requestAnimationFrame(() => { $slider.hide(); }); } function canDragSlide() { return !isPinching && currentScale === 1; } // Mostra slider al click sulla thumb $thumbs.children().on('click', function() { current = $(this).index(); // PATCH: reset completo stato prima di mostrare isDragging = false; isPanning = false; isPinching = false; isAnimating = false; currentScale = 1; panX = 0; panY = 0; doubleTapScaleIndex = 0; // reset transform immagini $slides.find('img').css('transform', ''); // forza transition corretta $wrapper.css('transition', 'transform 0.3s ease'); // aggiorna posizione updateVisuals(-current * 100); // mostra $slider.show(); // FOCUS FORZATO → frecce subito attive $slider.focus(); // aggiorna counter DOPO show (Safari) $slider.find('.counter').text(`${current + 1}/${total}`); // fullscreen se richiesto if (mode === 'full' && !document.fullscreenElement) { $slider[0].requestFullscreen(); } }); function startSlideshow() { if (isSlideshowPlaying) return; isSlideshowPlaying = true; startProgressBar(); slideshowTimer = setInterval(() => { if (!isAnimating) { goToSlide(current + 1); startProgressBar(); // riparte per la nuova slide } }, slideshowDelay); // icona play → pause $slider.find('.play-btn') .removeClass('bi-play-fill') .addClass('bi-pause-fill'); } function stopSlideshow() { isSlideshowPlaying = false; if (slideshowTimer) { clearInterval(slideshowTimer); slideshowTimer = null; } stopProgressBar(); resetProgressBar(); // icona pause → play $slider.find('.play-btn') .removeClass('bi-pause-fill') .addClass('bi-play-fill'); } function resetProgressBar() { const $bar = $slider.find('.progress-bar'); $bar.stop(true); $bar.css({ width: '0%' }); } function startProgressBar() { const $bar = $slider.find('.progress-bar'); resetProgressBar(); // forza reflow per Safari $bar[0].offsetHeight; // anima fino al 100% in slideshowDelay $bar.animate( { width: '100%' }, slideshowDelay, 'linear' ); } function stopProgressBar() { const $bar = $slider.find('.progress-bar'); $bar.stop(true); } // Eventi touch/mouse $slider.on('touchstart mousedown', function(e) { if (isAnimating) return; const touches = e.originalEvent.touches; const now = Date.now(); if (touches && touches.length === 1) { if (now - lastTapTime < 300) { doubleTapScaleIndex++; if (doubleTapScaleIndex >= doubleTapScaleSteps.length) doubleTapScaleIndex = 0; currentScale = doubleTapScaleSteps[doubleTapScaleIndex]; panX = panY = 0; applyTransform(); lastTapTime = 0; e.preventDefault(); return; } lastTapTime = now; } if (touches && touches.length === 2) { isPinching = true; initialPinchDistance = getDistance(touches); panStartX = (touches[0].clientX + touches[1].clientX) / 2 - panX; panStartY = (touches[0].clientY + touches[1].clientY) / 2 - panY; } else if (touches && touches.length === 1) { if (currentScale > 1) { isPanning = true; panStartX = touches[0].clientX - panX; panStartY = touches[0].clientY - panY; } else if (canDragSlide()) { isDragging = true; dragStartX = touches[0].clientX; dragCurrentX = dragStartX; $wrapper.css('transition', 'none'); $wrapper[0].offsetHeight; // force reflow Safari } } else if (e.type === 'mousedown') { if (currentScale > 1) { isPanning = true; panStartX = e.clientX - panX; panStartY = e.clientY - panY; $slides.eq(current).find('img').addClass('dragging'); } else { isDragging = true; dragStartX = e.clientX; dragCurrentX = dragStartX; $wrapper.css('transition', 'none'); $wrapper[0].offsetHeight; // force reflow Safari } } }); let isPanDirty = false; // Eventi che aggiornano panX/panY ma NON la trasformazione direttamente $slider.on('touchmove mousemove', function(e) { if (isAnimating) return; const touches = e.originalEvent.touches; if (touches && touches.length === 2 && isPinching) { const newDist = getDistance(touches); let scaleChange = (newDist / initialPinchDistance) - 1; scaleChange *= 0.02; currentScale = Math.min(Math.max(1, currentScale * (1 + scaleChange)), 4); panX = (touches[0].clientX + touches[1].clientX)/2 - panStartX; panY = (touches[0].clientY + touches[1].clientY)/2 - panStartY; limitPan(); isPanDirty = true; } else if ((touches && touches.length === 1 && isPanning) || (!touches && isPanning && e.type === 'mousemove')) { const clientX = touches ? touches[0].clientX : e.clientX; panX = clientX - panStartX; panY = (touches ? touches[0].clientY : e.clientY) - panStartY; limitPan(); isPanDirty = true; } else if ((touches && touches.length === 1 && isDragging) || (!touches && isDragging && e.type === 'mousemove')) { const clientX = touches ? touches[0].clientX : e.clientX; dragCurrentX = clientX; const deltaX = dragCurrentX - dragStartX; const offset = -current*100 + (deltaX/window.innerWidth)*100; updateVisuals(offset); } if (e.type.startsWith('touch')) e.preventDefault(); }); $slider.on('touchend touchcancel mouseup', function(e) { const touches = e.originalEvent.touches; if (isPinching && (!touches || touches.length < 2)) { isPinching = false; limitPan(); applyTransform(); } if (isPanning && (!touches || touches.length === 0)) { isPanning = false; $slides.eq(current).find('img').removeClass('dragging'); if (currentScale <= 1) resetZoomPan(current); } if (isDragging && (!touches || touches.length === 0)) { isDragging = false; $wrapper.css('transition', 'transform 0.3s ease'); const deltaX = dragCurrentX - dragStartX; if (deltaX > 0){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current - 1); } else if (deltaX < 0){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current + 1); } else{ goToSlide(current); } } }); // Pulsanti $slider.find('.prev-btn').on('click', () => { if (!isAnimating){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current - 1); } }); $slider.find('.next-btn').on('click', () => { if (!isAnimating){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current + 1); } }); $slider.find('.fullscreen-btn').on('click', () => { if (!document.fullscreenElement) document.documentElement.requestFullscreen(); else document.exitFullscreen(); }); $slider.find('.zoom-btn').eq(0).on('click', () => { if (currentScale < 3) { currentScale++; limitPan(); applyTransform(); } }); $slider.find('.zoom-btn').eq(1).on('click', () => { if (currentScale > 1) { currentScale--; limitPan(); applyTransform(); } }); $slider.find('.play-btn').on('click', () => { if (isSlideshowPlaying) { stopSlideshow(); } else { startSlideshow(); } }); $slider.find('.close-btn').on('click', function() { closeGallery(); }); $slider.on('keydown', (e) => { if (isAnimating) return; if (e.key === 'ArrowLeft'){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current - 1); } else if (e.key === 'ArrowRight'){ if (isSlideshowPlaying) { stopSlideshow(); // ferma interval } goToSlide(current + 1); } }); function panLoop() { if (isPanDirty) { $slides.eq(current).find('img').css('transform', `translate(${panX}px, ${panY}px) scale(${currentScale})`); isPanDirty = false; } requestAnimationFrame(panLoop); } // Avvia il loop una volta sola requestAnimationFrame(panLoop); // Mostra counter iniziale updateVisuals(-current * 100); resetProgressBar(); }