(function(global, factory){
"use strict";
if(typeof module==="object"&&typeof module.exports==="object"){
module.exports=global.document ?
factory(global, true) :
function(w){
if(!w.document){
throw new Error("jQuery requires a window with a document");
}
return factory(w);
};}else{
factory(global);
}})(typeof window!=="undefined" ? window:this, function(window, noGlobal){
"use strict";
var arr=[];
var getProto=Object.getPrototypeOf;
var slice=arr.slice;
var flat=arr.flat ? function(array){
return arr.flat.call(array);
}:function(array){
return arr.concat.apply([], array);
};
var push=arr.push;
var indexOf=arr.indexOf;
var class2type={};
var toString=class2type.toString;
var hasOwn=class2type.hasOwnProperty;
var fnToString=hasOwn.toString;
var ObjectFunctionString=fnToString.call(Object);
var support={};
var isFunction=function isFunction(obj){
return typeof obj==="function"&&typeof obj.nodeType!=="number" &&
typeof obj.item!=="function";
};
var isWindow=function isWindow(obj){
return obj!=null&&obj===obj.window;
};
var document=window.document;
var preservedScriptAttributes={
type: true,
src: true,
nonce: true,
noModule: true
};
function DOMEval(code, node, doc){
doc=doc||document;
var i, val,
script=doc.createElement("script");
script.text=code;
if(node){
for(i in preservedScriptAttributes){
val=node[ i ]||node.getAttribute&&node.getAttribute(i);
if(val){
script.setAttribute(i, val);
}}
}
doc.head.appendChild(script).parentNode.removeChild(script);
}
function toType(obj){
if(obj==null){
return obj + "";
}
return typeof obj==="object"||typeof obj==="function" ?
class2type[ toString.call(obj) ]||"object" :
typeof obj;
}
var version="3.7.1",
rhtmlSuffix=/HTML$/i,
jQuery=function(selector, context){
return new jQuery.fn.init(selector, context);
};
jQuery.fn=jQuery.prototype={
jquery: version,
constructor: jQuery,
length: 0,
toArray: function(){
return slice.call(this);
},
get: function(num){
if(num==null){
return slice.call(this);
}
return num < 0 ? this[ num + this.length ]:this[ num ];
},
pushStack: function(elems){
var ret=jQuery.merge(this.constructor(), elems);
ret.prevObject=this;
return ret;
},
each: function(callback){
return jQuery.each(this, callback);
},
map: function(callback){
return this.pushStack(jQuery.map(this, function(elem, i){
return callback.call(elem, i, elem);
}) );
},
slice: function(){
return this.pushStack(slice.apply(this, arguments) );
},
first: function(){
return this.eq(0);
},
last: function(){
return this.eq(-1);
},
even: function(){
return this.pushStack(jQuery.grep(this, function(_elem, i){
return(i + 1) % 2;
}) );
},
odd: function(){
return this.pushStack(jQuery.grep(this, function(_elem, i){
return i % 2;
}) );
},
eq: function(i){
var len=this.length,
j=+i +(i < 0 ? len:0);
return this.pushStack(j >=0&&j < len ? [ this[ j ] ]:[]);
},
end: function(){
return this.prevObject||this.constructor();
},
push: push,
sort: arr.sort,
splice: arr.splice
};
jQuery.extend=jQuery.fn.extend=function(){
var options, name, src, copy, copyIsArray, clone,
target=arguments[ 0 ]||{},
i=1,
length=arguments.length,
deep=false;
if(typeof target==="boolean"){
deep=target;
target=arguments[ i ]||{};
i++;
}
if(typeof target!=="object"&&!isFunction(target) ){
target={};}
if(i===length){
target=this;
i--;
}
for(; i < length; i++){
if(( options=arguments[ i ])!=null){
for(name in options){
copy=options[ name ];
if(name==="__proto__"||target===copy){
continue;
}
if(deep&&copy&&(jQuery.isPlainObject(copy) ||
(copyIsArray=Array.isArray(copy) )) ){
src=target[ name ];
if(copyIsArray&&!Array.isArray(src) ){
clone=[];
}else if(!copyIsArray&&!jQuery.isPlainObject(src) ){
clone={};}else{
clone=src;
}
copyIsArray=false;
target[ name ]=jQuery.extend(deep, clone, copy);
}else if(copy!==undefined){
target[ name ]=copy;
}}
}}
return target;
};
jQuery.extend({
expando: "jQuery" +(version + Math.random()).replace(/\D/g, ""),
isReady: true,
error: function(msg){
throw new Error(msg);
},
noop: function(){},
isPlainObject: function(obj){
var proto, Ctor;
if(!obj||toString.call(obj)!=="[object Object]"){
return false;
}
proto=getProto(obj);
if(!proto){
return true;
}
Ctor=hasOwn.call(proto, "constructor")&&proto.constructor;
return typeof Ctor==="function"&&fnToString.call(Ctor)===ObjectFunctionString;
},
isEmptyObject: function(obj){
var name;
for(name in obj){
return false;
}
return true;
},
globalEval: function(code, options, doc){
DOMEval(code, { nonce: options&&options.nonce }, doc);
},
each: function(obj, callback){
var length, i=0;
if(isArrayLike(obj) ){
length=obj.length;
for(; i < length; i++){
if(callback.call(obj[ i ], i, obj[ i ])===false){
break;
}}
}else{
for(i in obj){
if(callback.call(obj[ i ], i, obj[ i ])===false){
break;
}}
}
return obj;
},
text: function(elem){
var node,
ret="",
i=0,
nodeType=elem.nodeType;
if(!nodeType){
while(( node=elem[ i++ ]) ){
ret +=jQuery.text(node);
}}
if(nodeType===1||nodeType===11){
return elem.textContent;
}
if(nodeType===9){
return elem.documentElement.textContent;
}
if(nodeType===3||nodeType===4){
return elem.nodeValue;
}
return ret;
},
makeArray: function(arr, results){
var ret=results||[];
if(arr!=null){
if(isArrayLike(Object(arr) )){
jQuery.merge(ret,
typeof arr==="string" ?
[ arr ]:arr
);
}else{
push.call(ret, arr);
}}
return ret;
},
inArray: function(elem, arr, i){
return arr==null ? -1:indexOf.call(arr, elem, i);
},
isXMLDoc: function(elem){
var namespace=elem&&elem.namespaceURI,
docElem=elem&&(elem.ownerDocument||elem).documentElement;
return !rhtmlSuffix.test(namespace||docElem&&docElem.nodeName||"HTML");
},
merge: function(first, second){
var len=+second.length,
j=0,
i=first.length;
for(; j < len; j++){
first[ i++ ]=second[ j ];
}
first.length=i;
return first;
},
grep: function(elems, callback, invert){
var callbackInverse,
matches=[],
i=0,
length=elems.length,
callbackExpect = !invert;
for(; i < length; i++){
callbackInverse = !callback(elems[ i ], i);
if(callbackInverse!==callbackExpect){
matches.push(elems[ i ]);
}}
return matches;
},
map: function(elems, callback, arg){
var length, value,
i=0,
ret=[];
if(isArrayLike(elems) ){
length=elems.length;
for(; i < length; i++){
value=callback(elems[ i ], i, arg);
if(value!=null){
ret.push(value);
}}
}else{
for(i in elems){
value=callback(elems[ i ], i, arg);
if(value!=null){
ret.push(value);
}}
}
return flat(ret);
},
guid: 1,
support: support
});
if(typeof Symbol==="function"){
jQuery.fn[ Symbol.iterator ]=arr[ Symbol.iterator ];
}
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
function(_i, name){
class2type[ "[object " + name + "]" ]=name.toLowerCase();
});
function isArrayLike(obj){
var length = !!obj&&"length" in obj&&obj.length,
type=toType(obj);
if(isFunction(obj)||isWindow(obj) ){
return false;
}
return type==="array"||length===0 ||
typeof length==="number"&&length > 0&&(length - 1) in obj;
}
function nodeName(elem, name){
return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase();
}
var pop=arr.pop;
var sort=arr.sort;
var splice=arr.splice;
var whitespace="[\\x20\\t\\r\\n\\f]";
var rtrimCSS=new RegExp(
"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
"g"
);
jQuery.contains=function(a, b){
var bup=b&&b.parentNode;
return a===bup||!!(bup&&bup.nodeType===1&&(
a.contains ?
a.contains(bup) :
a.compareDocumentPosition&&a.compareDocumentPosition(bup) & 16
));
};
var rcssescape=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
function fcssescape(ch, asCodePoint){
if(asCodePoint){
if(ch==="\0"){
return "\uFFFD";
}
return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
}
return "\\" + ch;
}
jQuery.escapeSelector=function(sel){
return(sel + "").replace(rcssescape, fcssescape);
};
var preferredDoc=document,
pushNative=push;
(function(){
var i,
Expr,
outermostContext,
sortInput,
hasDuplicate,
push=pushNative,
document,
documentElement,
documentIsHTML,
rbuggyQSA,
matches,
expando=jQuery.expando,
dirruns=0,
done=0,
classCache=createCache(),
tokenCache=createCache(),
compilerCache=createCache(),
nonnativeSelectorCache=createCache(),
sortOrder=function(a, b){
if(a===b){
hasDuplicate=true;
}
return 0;
},
booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
"loop|multiple|open|readonly|required|scoped",
identifier="(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
attributes="\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
"*([*^$|!~]?=)" + whitespace +
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
whitespace + "*\\]",
pseudos=":(" + identifier + ")(?:\\((" +
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
".*" +
")\\)|)",
rwhitespace=new RegExp(whitespace + "+", "g"),
rcomma=new RegExp("^" + whitespace + "*," + whitespace + "*"),
rleadingCombinator=new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" +
whitespace + "*"),
rdescend=new RegExp(whitespace + "|>"),
rpseudo=new RegExp(pseudos),
ridentifier=new RegExp("^" + identifier + "$"),
matchExpr={
ID: new RegExp("^#(" + identifier + ")"),
CLASS: new RegExp("^\\.(" + identifier + ")"),
TAG: new RegExp("^(" + identifier + "|[*])"),
ATTR: new RegExp("^" + attributes),
PSEUDO: new RegExp("^" + pseudos),
CHILD: new RegExp(
"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
bool: new RegExp("^(?:" + booleans + ")$", "i"),
needsContext: new RegExp("^" + whitespace +
"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
},
rinputs=/^(?:input|select|textarea|button)$/i,
rheader=/^h\d$/i,
rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rsibling=/[+~]/,
runescape=new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace +
"?|\\\\([^\\r\\n\\f])", "g"),
funescape=function(escape, nonHex){
var high="0x" + escape.slice(1) - 0x10000;
if(nonHex){
return nonHex;
}
return high < 0 ?
String.fromCharCode(high + 0x10000) :
String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
},
unloadHandler=function(){
setDocument();
},
inDisabledFieldset=addCombinator(
function(elem){
return elem.disabled===true&&nodeName(elem, "fieldset");
},
{ dir: "parentNode", next: "legend" }
);
function safeActiveElement(){
try {
return document.activeElement;
} catch(err){ }}
try {
push.apply((arr=slice.call(preferredDoc.childNodes) ),
preferredDoc.childNodes
);
arr[ preferredDoc.childNodes.length ].nodeType;
} catch(e){
push={
apply: function(target, els){
pushNative.apply(target, slice.call(els) );
},
call: function(target){
pushNative.apply(target, slice.call(arguments, 1) );
}};}
function find(selector, context, results, seed){
var m, i, elem, nid, match, groups, newSelector,
newContext=context&&context.ownerDocument,
nodeType=context ? context.nodeType:9;
results=results||[];
if(typeof selector!=="string"||!selector ||
nodeType!==1&&nodeType!==9&&nodeType!==11){
return results;
}
if(!seed){
setDocument(context);
context=context||document;
if(documentIsHTML){
if(nodeType!==11&&(match=rquickExpr.exec(selector) )){
if(( m=match[ 1 ]) ){
if(nodeType===9){
if(( elem=context.getElementById(m) )){
if(elem.id===m){
push.call(results, elem);
return results;
}}else{
return results;
}}else{
if(newContext&&(elem=newContext.getElementById(m) ) &&
find.contains(context, elem) &&
elem.id===m){
push.call(results, elem);
return results;
}}
}else if(match[ 2 ]){
push.apply(results, context.getElementsByTagName(selector) );
return results;
}else if(( m=match[ 3 ])&&context.getElementsByClassName){
push.apply(results, context.getElementsByClassName(m) );
return results;
}}
if(!nonnativeSelectorCache[ selector + " " ] &&
(!rbuggyQSA||!rbuggyQSA.test(selector) )){
newSelector=selector;
newContext=context;
if(nodeType===1 &&
(rdescend.test(selector)||rleadingCombinator.test(selector) )){
newContext=rsibling.test(selector)&&testContext(context.parentNode) ||
context;
if(newContext!=context||!support.scope){
if(( nid=context.getAttribute("id") )){
nid=jQuery.escapeSelector(nid);
}else{
context.setAttribute("id",(nid=expando) );
}}
groups=tokenize(selector);
i=groups.length;
while(i--){
groups[ i ]=(nid ? "#" + nid:":scope") + " " +
toSelector(groups[ i ]);
}
newSelector=groups.join(",");
}
try {
push.apply(results,
newContext.querySelectorAll(newSelector)
);
return results;
} catch(qsaError){
nonnativeSelectorCache(selector, true);
} finally {
if(nid===expando){
context.removeAttribute("id");
}}
}}
}
return select(selector.replace(rtrimCSS, "$1"), context, results, seed);
}
/**
* Create key-value caches of limited size
* @returns {function(string, object)} Returns the Object data after storing it on itself with
*	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
*	deleting the oldest entry
*/
function createCache(){
var keys=[];
function cache(key, value){
if(keys.push(key + " ") > Expr.cacheLength){
delete cache[ keys.shift() ];
}
return(cache[ key + " " ]=value);
}
return cache;
}
function markFunction(fn){
fn[ expando ]=true;
return fn;
}
function assert(fn){
var el=document.createElement("fieldset");
try {
return !!fn(el);
} catch(e){
return false;
} finally {
if(el.parentNode){
el.parentNode.removeChild(el);
}
el=null;
}}
function createInputPseudo(type){
return function(elem){
return nodeName(elem, "input")&&elem.type===type;
};}
function createButtonPseudo(type){
return function(elem){
return(nodeName(elem, "input")||nodeName(elem, "button") ) &&
elem.type===type;
};}
function createDisabledPseudo(disabled){
return function(elem){
if("form" in elem){
if(elem.parentNode&&elem.disabled===false){
if("label" in elem){
if("label" in elem.parentNode){
return elem.parentNode.disabled===disabled;
}else{
return elem.disabled===disabled;
}}
return elem.isDisabled===disabled ||
elem.isDisabled!==!disabled &&
inDisabledFieldset(elem)===disabled;
}
return elem.disabled===disabled;
}else if("label" in elem){
return elem.disabled===disabled;
}
return false;
};}
function createPositionalPseudo(fn){
return markFunction(function(argument){
argument=+argument;
return markFunction(function(seed, matches){
var j,
matchIndexes=fn([], seed.length, argument),
i=matchIndexes.length;
while(i--){
if(seed[(j=matchIndexes[ i ]) ]){
seed[ j ] = !(matches[ j ]=seed[ j ]);
}}
});
});
}
function testContext(context){
return context&&typeof context.getElementsByTagName!=="undefined"&&context;
}
function setDocument(node){
var subWindow,
doc=node ? node.ownerDocument||node:preferredDoc;
if(doc==document||doc.nodeType!==9||!doc.documentElement){
return document;
}
document=doc;
documentElement=document.documentElement;
documentIsHTML = !jQuery.isXMLDoc(document);
matches=documentElement.matches ||
documentElement.webkitMatchesSelector ||
documentElement.msMatchesSelector;
if(documentElement.msMatchesSelector &&
preferredDoc!=document &&
(subWindow=document.defaultView)&&subWindow.top!==subWindow){
subWindow.addEventListener("unload", unloadHandler);
}
support.getById=assert(function(el){
documentElement.appendChild(el).id=jQuery.expando;
return !document.getElementsByName ||
!document.getElementsByName(jQuery.expando).length;
});
support.disconnectedMatch=assert(function(el){
return matches.call(el, "*");
});
support.scope=assert(function(){
return document.querySelectorAll(":scope");
});
support.cssHas=assert(function(){
try {
document.querySelector(":has(*,:jqfake)");
return false;
} catch(e){
return true;
}});
if(support.getById){
Expr.filter.ID=function(id){
var attrId=id.replace(runescape, funescape);
return function(elem){
return elem.getAttribute("id")===attrId;
};};
Expr.find.ID=function(id, context){
if(typeof context.getElementById!=="undefined"&&documentIsHTML){
var elem=context.getElementById(id);
return elem ? [ elem ]:[];
}};}else{
Expr.filter.ID=function(id){
var attrId=id.replace(runescape, funescape);
return function(elem){
var node=typeof elem.getAttributeNode!=="undefined" &&
elem.getAttributeNode("id");
return node&&node.value===attrId;
};};
Expr.find.ID=function(id, context){
if(typeof context.getElementById!=="undefined"&&documentIsHTML){
var node, i, elems,
elem=context.getElementById(id);
if(elem){
node=elem.getAttributeNode("id");
if(node&&node.value===id){
return [ elem ];
}
elems=context.getElementsByName(id);
i=0;
while(( elem=elems[ i++ ]) ){
node=elem.getAttributeNode("id");
if(node&&node.value===id){
return [ elem ];
}}
}
return [];
}};}
Expr.find.TAG=function(tag, context){
if(typeof context.getElementsByTagName!=="undefined"){
return context.getElementsByTagName(tag);
}else{
return context.querySelectorAll(tag);
}};
Expr.find.CLASS=function(className, context){
if(typeof context.getElementsByClassName!=="undefined"&&documentIsHTML){
return context.getElementsByClassName(className);
}};
rbuggyQSA=[];
assert(function(el){
var input;
documentElement.appendChild(el).innerHTML =
"<a id='" + expando + "' href='' disabled='disabled'></a>" +
"<select id='" + expando + "-\r\\' disabled='disabled'>" +
"<option selected=''></option></select>";
if(!el.querySelectorAll("[selected]").length){
rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
}
if(!el.querySelectorAll("[id~=" + expando + "-]").length){
rbuggyQSA.push("~=");
}
if(!el.querySelectorAll("a#" + expando + "+*").length){
rbuggyQSA.push(".#.+[+~]");
}
if(!el.querySelectorAll(":checked").length){
rbuggyQSA.push(":checked");
}
input=document.createElement("input");
input.setAttribute("type", "hidden");
el.appendChild(input).setAttribute("name", "D");
documentElement.appendChild(el).disabled=true;
if(el.querySelectorAll(":disabled").length!==2){
rbuggyQSA.push(":enabled", ":disabled");
}
input=document.createElement("input");
input.setAttribute("name", "");
el.appendChild(input);
if(!el.querySelectorAll("[name='']").length){
rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" +
whitespace + "*(?:''|\"\")");
}});
if(!support.cssHas){
rbuggyQSA.push(":has");
}
rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|") );
sortOrder=function(a, b){
if(a===b){
hasDuplicate=true;
return 0;
}
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if(compare){
return compare;
}
compare=(a.ownerDocument||a)==(b.ownerDocument||b) ?
a.compareDocumentPosition(b) :
1;
if(compare & 1 ||
(!support.sortDetached&&b.compareDocumentPosition(a)===compare) ){
if(a===document||a.ownerDocument==preferredDoc &&
find.contains(preferredDoc, a) ){
return -1;
}
if(b===document||b.ownerDocument==preferredDoc &&
find.contains(preferredDoc, b) ){
return 1;
}
return sortInput ?
(indexOf.call(sortInput, a) - indexOf.call(sortInput, b) ) :
0;
}
return compare & 4 ? -1:1;
};
return document;
}
find.matches=function(expr, elements){
return find(expr, null, null, elements);
};
find.matchesSelector=function(elem, expr){
setDocument(elem);
if(documentIsHTML &&
!nonnativeSelectorCache[ expr + " " ] &&
(!rbuggyQSA||!rbuggyQSA.test(expr) )){
try {
var ret=matches.call(elem, expr);
if(ret||support.disconnectedMatch ||
elem.document&&elem.document.nodeType!==11){
return ret;
}} catch(e){
nonnativeSelectorCache(expr, true);
}}
return find(expr, document, null, [ elem ]).length > 0;
};
find.contains=function(context, elem){
if(( context.ownerDocument||context)!=document){
setDocument(context);
}
return jQuery.contains(context, elem);
};
find.attr=function(elem, name){
if(( elem.ownerDocument||elem)!=document){
setDocument(elem);
}
var fn=Expr.attrHandle[ name.toLowerCase() ],
val=fn&&hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?
fn(elem, name, !documentIsHTML) :
undefined;
if(val!==undefined){
return val;
}
return elem.getAttribute(name);
};
find.error=function(msg){
throw new Error("Syntax error, unrecognized expression: " + msg);
};
jQuery.uniqueSort=function(results){
var elem,
duplicates=[],
j=0,
i=0;
hasDuplicate = !support.sortStable;
sortInput = !support.sortStable&&slice.call(results, 0);
sort.call(results, sortOrder);
if(hasDuplicate){
while(( elem=results[ i++ ]) ){
if(elem===results[ i ]){
j=duplicates.push(i);
}}
while(j--){
splice.call(results, duplicates[ j ], 1);
}}
sortInput=null;
return results;
};
jQuery.fn.uniqueSort=function(){
return this.pushStack(jQuery.uniqueSort(slice.apply(this) ));
};
Expr=jQuery.expr={
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }},
preFilter: {
ATTR: function(match){
match[ 1 ]=match[ 1 ].replace(runescape, funescape);
match[ 3 ]=(match[ 3 ]||match[ 4 ]||match[ 5 ]||"")
.replace(runescape, funescape);
if(match[ 2 ]==="~="){
match[ 3 ]=" " + match[ 3 ] + " ";
}
return match.slice(0, 4);
},
CHILD: function(match){
match[ 1 ]=match[ 1 ].toLowerCase();
if(match[ 1 ].slice(0, 3)==="nth"){
if(!match[ 3 ]){
find.error(match[ 0 ]);
}
match[ 4 ]=+(match[ 4 ] ?
match[ 5 ] +(match[ 6 ]||1) :
2 *(match[ 3 ]==="even"||match[ 3 ]==="odd")
);
match[ 5 ]=+(( match[ 7 ] + match[ 8 ])||match[ 3 ]==="odd");
}else if(match[ 3 ]){
find.error(match[ 0 ]);
}
return match;
},
PSEUDO: function(match){
var excess,
unquoted = !match[ 6 ]&&match[ 2 ];
if(matchExpr.CHILD.test(match[ 0 ]) ){
return null;
}
if(match[ 3 ]){
match[ 2 ]=match[ 4 ]||match[ 5 ]||"";
}else if(unquoted&&rpseudo.test(unquoted) &&
(excess=tokenize(unquoted, true) ) &&
(excess=unquoted.indexOf(")", unquoted.length - excess) - unquoted.length) ){
match[ 0 ]=match[ 0 ].slice(0, excess);
match[ 2 ]=unquoted.slice(0, excess);
}
return match.slice(0, 3);
}},
filter: {
TAG: function(nodeNameSelector){
var expectedNodeName=nodeNameSelector.replace(runescape, funescape).toLowerCase();
return nodeNameSelector==="*" ?
function(){
return true;
} :
function(elem){
return nodeName(elem, expectedNodeName);
};},
CLASS: function(className){
var pattern=classCache[ className + " " ];
return pattern ||
(pattern=new RegExp("(^|" + whitespace + ")" + className +
"(" + whitespace + "|$)") ) &&
classCache(className, function(elem){
return pattern.test(typeof elem.className==="string"&&elem.className ||
typeof elem.getAttribute!=="undefined" &&
elem.getAttribute("class") ||
""
);
});
},
ATTR: function(name, operator, check){
return function(elem){
var result=find.attr(elem, name);
if(result==null){
return operator==="!=";
}
if(!operator){
return true;
}
result +="";
if(operator==="="){
return result===check;
}
if(operator==="!="){
return result!==check;
}
if(operator==="^="){
return check&&result.indexOf(check)===0;
}
if(operator==="*="){
return check&&result.indexOf(check) > -1;
}
if(operator==="$="){
return check&&result.slice(-check.length)===check;
}
if(operator==="~="){
return(" " + result.replace(rwhitespace, " ") + " ")
.indexOf(check) > -1;
}
if(operator==="|="){
return result===check||result.slice(0, check.length + 1)===check + "-";
}
return false;
};},
CHILD: function(type, what, _argument, first, last){
var simple=type.slice(0, 3)!=="nth",
forward=type.slice(-4)!=="last",
ofType=what==="of-type";
return first===1&&last===0 ?
function(elem){
return !!elem.parentNode;
} :
function(elem, _context, xml){
var cache, outerCache, node, nodeIndex, start,
dir=simple!==forward ? "nextSibling":"previousSibling",
parent=elem.parentNode,
name=ofType&&elem.nodeName.toLowerCase(),
useCache = !xml&&!ofType,
diff=false;
if(parent){
if(simple){
while(dir){
node=elem;
while(( node=node[ dir ]) ){
if(ofType ?
nodeName(node, name) :
node.nodeType===1){
return false;
}}
start=dir=type==="only"&&!start&&"nextSibling";
}
return true;
}
start=[ forward ? parent.firstChild:parent.lastChild ];
if(forward&&useCache){
outerCache=parent[ expando ]||(parent[ expando ]={});
cache=outerCache[ type ]||[];
nodeIndex=cache[ 0 ]===dirruns&&cache[ 1 ];
diff=nodeIndex&&cache[ 2 ];
node=nodeIndex&&parent.childNodes[ nodeIndex ];
while(( node=++nodeIndex&&node&&node[ dir ] ||
(diff=nodeIndex=0)||start.pop()) ){
if(node.nodeType===1&&++diff&&node===elem){
outerCache[ type ]=[ dirruns, nodeIndex, diff ];
break;
}}
}else{
if(useCache){
outerCache=elem[ expando ]||(elem[ expando ]={});
cache=outerCache[ type ]||[];
nodeIndex=cache[ 0 ]===dirruns&&cache[ 1 ];
diff=nodeIndex;
}
if(diff===false){
while(( node=++nodeIndex&&node&&node[ dir ] ||
(diff=nodeIndex=0)||start.pop()) ){
if(( ofType ?
nodeName(node, name) :
node.nodeType===1) &&
++diff){
if(useCache){
outerCache=node[ expando ] ||
(node[ expando ]={});
outerCache[ type ]=[ dirruns, diff ];
}
if(node===elem){
break;
}}
}}
}
diff -=last;
return diff===first||(diff % first===0&&diff / first >=0);
}};},
PSEUDO: function(pseudo, argument){
var args,
fn=Expr.pseudos[ pseudo ]||Expr.setFilters[ pseudo.toLowerCase() ] ||
find.error("unsupported pseudo: " + pseudo);
if(fn[ expando ]){
return fn(argument);
}
if(fn.length > 1){
args=[ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
markFunction(function(seed, matches){
var idx,
matched=fn(seed, argument),
i=matched.length;
while(i--){
idx=indexOf.call(seed, matched[ i ]);
seed[ idx ] = !(matches[ idx ]=matched[ i ]);
}}) :
function(elem){
return fn(elem, 0, args);
};}
return fn;
}},
pseudos: {
not: markFunction(function(selector){
var input=[],
results=[],
matcher=compile(selector.replace(rtrimCSS, "$1") );
return matcher[ expando ] ?
markFunction(function(seed, matches, _context, xml){
var elem,
unmatched=matcher(seed, null, xml, []),
i=seed.length;
while(i--){
if(( elem=unmatched[ i ]) ){
seed[ i ] = !(matches[ i ]=elem);
}}
}) :
function(elem, _context, xml){
input[ 0 ]=elem;
matcher(input, null, xml, results);
input[ 0 ]=null;
return !results.pop();
};}),
has: markFunction(function(selector){
return function(elem){
return find(selector, elem).length > 0;
};}),
contains: markFunction(function(text){
text=text.replace(runescape, funescape);
return function(elem){
return(elem.textContent||jQuery.text(elem) ).indexOf(text) > -1;
};}),
lang: markFunction(function(lang){
if(!ridentifier.test(lang||"") ){
find.error("unsupported lang: " + lang);
}
lang=lang.replace(runescape, funescape).toLowerCase();
return function(elem){
var elemLang;
do {
if(( elemLang=documentIsHTML ?
elem.lang :
elem.getAttribute("xml:lang")||elem.getAttribute("lang") )){
elemLang=elemLang.toLowerCase();
return elemLang===lang||elemLang.indexOf(lang + "-")===0;
}} while(( elem=elem.parentNode)&&elem.nodeType===1);
return false;
};}),
target: function(elem){
var hash=window.location&&window.location.hash;
return hash&&hash.slice(1)===elem.id;
},
root: function(elem){
return elem===documentElement;
},
focus: function(elem){
return elem===safeActiveElement() &&
document.hasFocus() &&
!!(elem.type||elem.href||~elem.tabIndex);
},
enabled: createDisabledPseudo(false),
disabled: createDisabledPseudo(true),
checked: function(elem){
return(nodeName(elem, "input")&&!!elem.checked) ||
(nodeName(elem, "option")&&!!elem.selected);
},
selected: function(elem){
if(elem.parentNode){
elem.parentNode.selectedIndex;
}
return elem.selected===true;
},
empty: function(elem){
for(elem=elem.firstChild; elem; elem=elem.nextSibling){
if(elem.nodeType < 6){
return false;
}}
return true;
},
parent: function(elem){
return !Expr.pseudos.empty(elem);
},
header: function(elem){
return rheader.test(elem.nodeName);
},
input: function(elem){
return rinputs.test(elem.nodeName);
},
button: function(elem){
return nodeName(elem, "input")&&elem.type==="button" ||
nodeName(elem, "button");
},
text: function(elem){
var attr;
return nodeName(elem, "input")&&elem.type==="text" &&
(( attr=elem.getAttribute("type") )==null ||
attr.toLowerCase()==="text");
},
first: createPositionalPseudo(function(){
return [ 0 ];
}),
last: createPositionalPseudo(function(_matchIndexes, length){
return [ length - 1 ];
}),
eq: createPositionalPseudo(function(_matchIndexes, length, argument){
return [ argument < 0 ? argument + length:argument ];
}),
even: createPositionalPseudo(function(matchIndexes, length){
var i=0;
for(; i < length; i +=2){
matchIndexes.push(i);
}
return matchIndexes;
}),
odd: createPositionalPseudo(function(matchIndexes, length){
var i=1;
for(; i < length; i +=2){
matchIndexes.push(i);
}
return matchIndexes;
}),
lt: createPositionalPseudo(function(matchIndexes, length, argument){
var i;
if(argument < 0){
i=argument + length;
}else if(argument > length){
i=length;
}else{
i=argument;
}
for(; --i >=0;){
matchIndexes.push(i);
}
return matchIndexes;
}),
gt: createPositionalPseudo(function(matchIndexes, length, argument){
var i=argument < 0 ? argument + length:argument;
for(; ++i < length;){
matchIndexes.push(i);
}
return matchIndexes;
})
}};
Expr.pseudos.nth=Expr.pseudos.eq;
for(i in { radio: true, checkbox: true, file: true, password: true, image: true }){
Expr.pseudos[ i ]=createInputPseudo(i);
}
for(i in { submit: true, reset: true }){
Expr.pseudos[ i ]=createButtonPseudo(i);
}
function setFilters(){}
setFilters.prototype=Expr.filters=Expr.pseudos;
Expr.setFilters=new setFilters();
function tokenize(selector, parseOnly){
var matched, match, tokens, type,
soFar, groups, preFilters,
cached=tokenCache[ selector + " " ];
if(cached){
return parseOnly ? 0:cached.slice(0);
}
soFar=selector;
groups=[];
preFilters=Expr.preFilter;
while(soFar){
if(!matched||(match=rcomma.exec(soFar) )){
if(match){
soFar=soFar.slice(match[ 0 ].length)||soFar;
}
groups.push(( tokens=[]) );
}
matched=false;
if(( match=rleadingCombinator.exec(soFar) )){
matched=match.shift();
tokens.push({
value: matched,
type: match[ 0 ].replace(rtrimCSS, " ")
});
soFar=soFar.slice(matched.length);
}
for(type in Expr.filter){
if(( match=matchExpr[ type ].exec(soFar) )&&(!preFilters[ type ] ||
(match=preFilters[ type ](match) )) ){
matched=match.shift();
tokens.push({
value: matched,
type: type,
matches: match
});
soFar=soFar.slice(matched.length);
}}
if(!matched){
break;
}}
if(parseOnly){
return soFar.length;
}
return soFar ?
find.error(selector) :
tokenCache(selector, groups).slice(0);
}
function toSelector(tokens){
var i=0,
len=tokens.length,
selector="";
for(; i < len; i++){
selector +=tokens[ i ].value;
}
return selector;
}
function addCombinator(matcher, combinator, base){
var dir=combinator.dir,
skip=combinator.next,
key=skip||dir,
checkNonElements=base&&key==="parentNode",
doneName=done++;
return combinator.first ?
function(elem, context, xml){
while(( elem=elem[ dir ]) ){
if(elem.nodeType===1||checkNonElements){
return matcher(elem, context, xml);
}}
return false;
} :
function(elem, context, xml){
var oldCache, outerCache,
newCache=[ dirruns, doneName ];
if(xml){
while(( elem=elem[ dir ]) ){
if(elem.nodeType===1||checkNonElements){
if(matcher(elem, context, xml) ){
return true;
}}
}}else{
while(( elem=elem[ dir ]) ){
if(elem.nodeType===1||checkNonElements){
outerCache=elem[ expando ]||(elem[ expando ]={});
if(skip&&nodeName(elem, skip) ){
elem=elem[ dir ]||elem;
}else if(( oldCache=outerCache[ key ]) &&
oldCache[ 0 ]===dirruns&&oldCache[ 1 ]===doneName){
return(newCache[ 2 ]=oldCache[ 2 ]);
}else{
outerCache[ key ]=newCache;
if(( newCache[ 2 ]=matcher(elem, context, xml) )){
return true;
}}
}}
}
return false;
};}
function elementMatcher(matchers){
return matchers.length > 1 ?
function(elem, context, xml){
var i=matchers.length;
while(i--){
if(!matchers[ i ](elem, context, xml) ){
return false;
}}
return true;
} :
matchers[ 0 ];
}
function multipleContexts(selector, contexts, results){
var i=0,
len=contexts.length;
for(; i < len; i++){
find(selector, contexts[ i ], results);
}
return results;
}
function condense(unmatched, map, filter, context, xml){
var elem,
newUnmatched=[],
i=0,
len=unmatched.length,
mapped=map!=null;
for(; i < len; i++){
if(( elem=unmatched[ i ]) ){
if(!filter||filter(elem, context, xml) ){
newUnmatched.push(elem);
if(mapped){
map.push(i);
}}
}}
return newUnmatched;
}
function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector){
if(postFilter&&!postFilter[ expando ]){
postFilter=setMatcher(postFilter);
}
if(postFinder&&!postFinder[ expando ]){
postFinder=setMatcher(postFinder, postSelector);
}
return markFunction(function(seed, results, context, xml){
var temp, i, elem, matcherOut,
preMap=[],
postMap=[],
preexisting=results.length,
elems=seed ||
multipleContexts(selector||"*",
context.nodeType ? [ context ]:context, []),
matcherIn=preFilter&&(seed||!selector) ?
condense(elems, preMap, preFilter, context, xml) :
elems;
if(matcher){
matcherOut=postFinder||(seed ? preFilter:preexisting||postFilter) ?
[] :
results;
matcher(matcherIn, matcherOut, context, xml);
}else{
matcherOut=matcherIn;
}
if(postFilter){
temp=condense(matcherOut, postMap);
postFilter(temp, [], context, xml);
i=temp.length;
while(i--){
if(( elem=temp[ i ]) ){
matcherOut[ postMap[ i ] ] = !(matcherIn[ postMap[ i ] ]=elem);
}}
}
if(seed){
if(postFinder||preFilter){
if(postFinder){
temp=[];
i=matcherOut.length;
while(i--){
if(( elem=matcherOut[ i ]) ){
temp.push(( matcherIn[ i ]=elem) );
}}
postFinder(null,(matcherOut=[]), temp, xml);
}
i=matcherOut.length;
while(i--){
if(( elem=matcherOut[ i ]) &&
(temp=postFinder ? indexOf.call(seed, elem):preMap[ i ]) > -1){
seed[ temp ] = !(results[ temp ]=elem);
}}
}}else{
matcherOut=condense(
matcherOut===results ?
matcherOut.splice(preexisting, matcherOut.length) :
matcherOut
);
if(postFinder){
postFinder(null, results, matcherOut, xml);
}else{
push.apply(results, matcherOut);
}}
});
}
function matcherFromTokens(tokens){
var checkContext, matcher, j,
len=tokens.length,
leadingRelative=Expr.relative[ tokens[ 0 ].type ],
implicitRelative=leadingRelative||Expr.relative[ " " ],
i=leadingRelative ? 1:0,
matchContext=addCombinator(function(elem){
return elem===checkContext;
}, implicitRelative, true),
matchAnyContext=addCombinator(function(elem){
return indexOf.call(checkContext, elem) > -1;
}, implicitRelative, true),
matchers=[ function(elem, context, xml){
var ret=(!leadingRelative&&(xml||context!=outermostContext) )||(
(checkContext=context).nodeType ?
matchContext(elem, context, xml) :
matchAnyContext(elem, context, xml) );
checkContext=null;
return ret;
} ];
for(; i < len; i++){
if(( matcher=Expr.relative[ tokens[ i ].type ]) ){
matchers=[ addCombinator(elementMatcher(matchers), matcher) ];
}else{
matcher=Expr.filter[ tokens[ i ].type ].apply(null, tokens[ i ].matches);
if(matcher[ expando ]){
j=++i;
for(; j < len; j++){
if(Expr.relative[ tokens[ j ].type ]){
break;
}}
return setMatcher(
i > 1&&elementMatcher(matchers),
i > 1&&toSelector(
tokens.slice(0, i - 1)
.concat({ value: tokens[ i - 2 ].type===" " ? "*":"" })
).replace(rtrimCSS, "$1"),
matcher,
i < j&&matcherFromTokens(tokens.slice(i, j) ),
j < len&&matcherFromTokens(( tokens=tokens.slice(j) )),
j < len&&toSelector(tokens)
);
}
matchers.push(matcher);
}}
return elementMatcher(matchers);
}
function matcherFromGroupMatchers(elementMatchers, setMatchers){
var bySet=setMatchers.length > 0,
byElement=elementMatchers.length > 0,
superMatcher=function(seed, context, xml, results, outermost){
var elem, j, matcher,
matchedCount=0,
i="0",
unmatched=seed&&[],
setMatched=[],
contextBackup=outermostContext,
elems=seed||byElement&&Expr.find.TAG("*", outermost),
dirrunsUnique=(dirruns +=contextBackup==null ? 1:Math.random()||0.1),
len=elems.length;
if(outermost){
outermostContext=context==document||context||outermost;
}
for(; i!==len&&(elem=elems[ i ])!=null; i++){
if(byElement&&elem){
j=0;
if(!context&&elem.ownerDocument!=document){
setDocument(elem);
xml = !documentIsHTML;
}
while(( matcher=elementMatchers[ j++ ]) ){
if(matcher(elem, context||document, xml) ){
push.call(results, elem);
break;
}}
if(outermost){
dirruns=dirrunsUnique;
}}
if(bySet){
if(( elem = !matcher&&elem) ){
matchedCount--;
}
if(seed){
unmatched.push(elem);
}}
}
matchedCount +=i;
if(bySet&&i!==matchedCount){
j=0;
while(( matcher=setMatchers[ j++ ]) ){
matcher(unmatched, setMatched, context, xml);
}
if(seed){
if(matchedCount > 0){
while(i--){
if(!(unmatched[ i ]||setMatched[ i ]) ){
setMatched[ i ]=pop.call(results);
}}
}
setMatched=condense(setMatched);
}
push.apply(results, setMatched);
if(outermost&&!seed&&setMatched.length > 0 &&
(matchedCount + setMatchers.length) > 1){
jQuery.uniqueSort(results);
}}
if(outermost){
dirruns=dirrunsUnique;
outermostContext=contextBackup;
}
return unmatched;
};
return bySet ?
markFunction(superMatcher) :
superMatcher;
}
function compile(selector, match ){
var i,
setMatchers=[],
elementMatchers=[],
cached=compilerCache[ selector + " " ];
if(!cached){
if(!match){
match=tokenize(selector);
}
i=match.length;
while(i--){
cached=matcherFromTokens(match[ i ]);
if(cached[ expando ]){
setMatchers.push(cached);
}else{
elementMatchers.push(cached);
}}
cached=compilerCache(selector,
matcherFromGroupMatchers(elementMatchers, setMatchers) );
cached.selector=selector;
}
return cached;
}
function select(selector, context, results, seed){
var i, tokens, token, type, find,
compiled=typeof selector==="function"&&selector,
match = !seed&&tokenize(( selector=compiled.selector||selector) );
results=results||[];
if(match.length===1){
tokens=match[ 0 ]=match[ 0 ].slice(0);
if(tokens.length > 2&&(token=tokens[ 0 ]).type==="ID" &&
context.nodeType===9&&documentIsHTML&&Expr.relative[ tokens[ 1 ].type ]){
context=(Expr.find.ID(token.matches[ 0 ].replace(runescape, funescape),
context
)||[])[ 0 ];
if(!context){
return results;
}else if(compiled){
context=context.parentNode;
}
selector=selector.slice(tokens.shift().value.length);
}
i=matchExpr.needsContext.test(selector) ? 0:tokens.length;
while(i--){
token=tokens[ i ];
if(Expr.relative[(type=token.type) ]){
break;
}
if(( find=Expr.find[ type ]) ){
if(( seed=find(
token.matches[ 0 ].replace(runescape, funescape),
rsibling.test(tokens[ 0 ].type) &&
testContext(context.parentNode)||context
)) ){
tokens.splice(i, 1);
selector=seed.length&&toSelector(tokens);
if(!selector){
push.apply(results, seed);
return results;
}
break;
}}
}}
(compiled||compile(selector, match) )(
seed,
context,
!documentIsHTML,
results,
!context||rsibling.test(selector)&&testContext(context.parentNode)||context
);
return results;
}
support.sortStable=expando.split("").sort(sortOrder).join("")===expando;
setDocument();
support.sortDetached=assert(function(el){
return el.compareDocumentPosition(document.createElement("fieldset") ) & 1;
});
jQuery.find=find;
jQuery.expr[ ":" ]=jQuery.expr.pseudos;
jQuery.unique=jQuery.uniqueSort;
find.compile=compile;
find.select=select;
find.setDocument=setDocument;
find.tokenize=tokenize;
find.escape=jQuery.escapeSelector;
find.getText=jQuery.text;
find.isXML=jQuery.isXMLDoc;
find.selectors=jQuery.expr;
find.support=jQuery.support;
find.uniqueSort=jQuery.uniqueSort;
})();
var dir=function(elem, dir, until){
var matched=[],
truncate=until!==undefined;
while(( elem=elem[ dir ])&&elem.nodeType!==9){
if(elem.nodeType===1){
if(truncate&&jQuery(elem).is(until) ){
break;
}
matched.push(elem);
}}
return matched;
};
var siblings=function(n, elem){
var matched=[];
for(; n; n=n.nextSibling){
if(n.nodeType===1&&n!==elem){
matched.push(n);
}}
return matched;
};
var rneedsContext=jQuery.expr.match.needsContext;
var rsingleTag=(/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i);
function winnow(elements, qualifier, not){
if(isFunction(qualifier) ){
return jQuery.grep(elements, function(elem, i){
return !!qualifier.call(elem, i, elem)!==not;
});
}
if(qualifier.nodeType){
return jQuery.grep(elements, function(elem){
return(elem===qualifier)!==not;
});
}
if(typeof qualifier!=="string"){
return jQuery.grep(elements, function(elem){
return(indexOf.call(qualifier, elem) > -1)!==not;
});
}
return jQuery.filter(qualifier, elements, not);
}
jQuery.filter=function(expr, elems, not){
var elem=elems[ 0 ];
if(not){
expr=":not(" + expr + ")";
}
if(elems.length===1&&elem.nodeType===1){
return jQuery.find.matchesSelector(elem, expr) ? [ elem ]:[];
}
return jQuery.find.matches(expr, jQuery.grep(elems, function(elem){
return elem.nodeType===1;
}) );
};
jQuery.fn.extend({
find: function(selector){
var i, ret,
len=this.length,
self=this;
if(typeof selector!=="string"){
return this.pushStack(jQuery(selector).filter(function(){
for(i=0; i < len; i++){
if(jQuery.contains(self[ i ], this) ){
return true;
}}
}) );
}
ret=this.pushStack([]);
for(i=0; i < len; i++){
jQuery.find(selector, self[ i ], ret);
}
return len > 1 ? jQuery.uniqueSort(ret):ret;
},
filter: function(selector){
return this.pushStack(winnow(this, selector||[], false) );
},
not: function(selector){
return this.pushStack(winnow(this, selector||[], true) );
},
is: function(selector){
return !!winnow(
this,
typeof selector==="string"&&rneedsContext.test(selector) ?
jQuery(selector) :
selector||[],
false
).length;
}});
var rootjQuery,
rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
init=jQuery.fn.init=function(selector, context, root){
var match, elem;
if(!selector){
return this;
}
root=root||rootjQuery;
if(typeof selector==="string"){
if(selector[ 0 ]==="<" &&
selector[ selector.length - 1 ]===">" &&
selector.length >=3){
match=[ null, selector, null ];
}else{
match=rquickExpr.exec(selector);
}
if(match&&(match[ 1 ]||!context) ){
if(match[ 1 ]){
context=context instanceof jQuery ? context[ 0 ]:context;
jQuery.merge(this, jQuery.parseHTML(match[ 1 ],
context&&context.nodeType ? context.ownerDocument||context:document,
true
));
if(rsingleTag.test(match[ 1 ])&&jQuery.isPlainObject(context) ){
for(match in context){
if(isFunction(this[ match ]) ){
this[ match ](context[ match ]);
}else{
this.attr(match, context[ match ]);
}}
}
return this;
}else{
elem=document.getElementById(match[ 2 ]);
if(elem){
this[ 0 ]=elem;
this.length=1;
}
return this;
}}else if(!context||context.jquery){
return(context||root).find(selector);
}else{
return this.constructor(context).find(selector);
}}else if(selector.nodeType){
this[ 0 ]=selector;
this.length=1;
return this;
}else if(isFunction(selector) ){
return root.ready!==undefined ?
root.ready(selector) :
selector(jQuery);
}
return jQuery.makeArray(selector, this);
};
init.prototype=jQuery.fn;
rootjQuery=jQuery(document);
var rparentsprev=/^(?:parents|prev(?:Until|All))/,
guaranteedUnique={
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend({
has: function(target){
var targets=jQuery(target, this),
l=targets.length;
return this.filter(function(){
var i=0;
for(; i < l; i++){
if(jQuery.contains(this, targets[ i ]) ){
return true;
}}
});
},
closest: function(selectors, context){
var cur,
i=0,
l=this.length,
matched=[],
targets=typeof selectors!=="string"&&jQuery(selectors);
if(!rneedsContext.test(selectors) ){
for(; i < l; i++){
for(cur=this[ i ]; cur&&cur!==context; cur=cur.parentNode){
if(cur.nodeType < 11&&(targets ?
targets.index(cur) > -1 :
cur.nodeType===1 &&
jQuery.find.matchesSelector(cur, selectors) )){
matched.push(cur);
break;
}}
}}
return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched):matched);
},
index: function(elem){
if(!elem){
return(this[ 0 ]&&this[ 0 ].parentNode) ? this.first().prevAll().length:-1;
}
if(typeof elem==="string"){
return indexOf.call(jQuery(elem), this[ 0 ]);
}
return indexOf.call(this,
elem.jquery ? elem[ 0 ]:elem
);
},
add: function(selector, context){
return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context) )
)
);
},
addBack: function(selector){
return this.add(selector==null ?
this.prevObject:this.prevObject.filter(selector)
);
}});
function sibling(cur, dir){
while(( cur=cur[ dir ])&&cur.nodeType!==1){}
return cur;
}
jQuery.each({
parent: function(elem){
var parent=elem.parentNode;
return parent&&parent.nodeType!==11 ? parent:null;
},
parents: function(elem){
return dir(elem, "parentNode");
},
parentsUntil: function(elem, _i, until){
return dir(elem, "parentNode", until);
},
next: function(elem){
return sibling(elem, "nextSibling");
},
prev: function(elem){
return sibling(elem, "previousSibling");
},
nextAll: function(elem){
return dir(elem, "nextSibling");
},
prevAll: function(elem){
return dir(elem, "previousSibling");
},
nextUntil: function(elem, _i, until){
return dir(elem, "nextSibling", until);
},
prevUntil: function(elem, _i, until){
return dir(elem, "previousSibling", until);
},
siblings: function(elem){
return siblings(( elem.parentNode||{}).firstChild, elem);
},
children: function(elem){
return siblings(elem.firstChild);
},
contents: function(elem){
if(elem.contentDocument!=null &&
getProto(elem.contentDocument) ){
return elem.contentDocument;
}
if(nodeName(elem, "template") ){
elem=elem.content||elem;
}
return jQuery.merge([], elem.childNodes);
}}, function(name, fn){
jQuery.fn[ name ]=function(until, selector){
var matched=jQuery.map(this, fn, until);
if(name.slice(-5)!=="Until"){
selector=until;
}
if(selector&&typeof selector==="string"){
matched=jQuery.filter(selector, matched);
}
if(this.length > 1){
if(!guaranteedUnique[ name ]){
jQuery.uniqueSort(matched);
}
if(rparentsprev.test(name) ){
matched.reverse();
}}
return this.pushStack(matched);
};});
var rnothtmlwhite=(/[^\x20\t\r\n\f]+/g);
function createOptions(options){
var object={};
jQuery.each(options.match(rnothtmlwhite)||[], function(_, flag){
object[ flag ]=true;
});
return object;
}
jQuery.Callbacks=function(options){
options=typeof options==="string" ?
createOptions(options) :
jQuery.extend({}, options);
var
firing,
memory,
fired,
locked,
list=[],
queue=[],
firingIndex=-1,
fire=function(){
locked=locked||options.once;
fired=firing=true;
for(; queue.length; firingIndex=-1){
memory=queue.shift();
while ( ++firingIndex < list.length){
if(list[ firingIndex ].apply(memory[ 0 ], memory[ 1 ])===false &&
options.stopOnFalse){
firingIndex=list.length;
memory=false;
}}
}
if(!options.memory){
memory=false;
}
firing=false;
if(locked){
if(memory){
list=[];
}else{
list="";
}}
},
self={
add: function(){
if(list){
if(memory&&!firing){
firingIndex=list.length - 1;
queue.push(memory);
}
(function add(args){
jQuery.each(args, function(_, arg){
if(isFunction(arg) ){
if(!options.unique||!self.has(arg) ){
list.push(arg);
}}else if(arg&&arg.length&&toType(arg)!=="string"){
add(arg);
}});
})(arguments);
if(memory&&!firing){
fire();
}}
return this;
},
remove: function(){
jQuery.each(arguments, function(_, arg){
var index;
while(( index=jQuery.inArray(arg, list, index) ) > -1){
list.splice(index, 1);
if(index <=firingIndex){
firingIndex--;
}}
});
return this;
},
has: function(fn){
return fn ?
jQuery.inArray(fn, list) > -1 :
list.length > 0;
},
empty: function(){
if(list){
list=[];
}
return this;
},
disable: function(){
locked=queue=[];
list=memory="";
return this;
},
disabled: function(){
return !list;
},
lock: function(){
locked=queue=[];
if(!memory&&!firing){
list=memory="";
}
return this;
},
locked: function(){
return !!locked;
},
fireWith: function(context, args){
if(!locked){
args=args||[];
args=[ context, args.slice ? args.slice():args ];
queue.push(args);
if(!firing){
fire();
}}
return this;
},
fire: function(){
self.fireWith(this, arguments);
return this;
},
fired: function(){
return !!fired;
}};
return self;
};
function Identity(v){
return v;
}
function Thrower(ex){
throw ex;
}
function adoptValue(value, resolve, reject, noValue){
var method;
try {
if(value&&isFunction(( method=value.promise) )){
method.call(value).done(resolve).fail(reject);
}else if(value&&isFunction(( method=value.then) )){
method.call(value, resolve, reject);
}else{
resolve.apply(undefined, [ value ].slice(noValue) );
}} catch(value){
reject.apply(undefined, [ value ]);
}}
jQuery.extend({
Deferred: function(func){
var tuples=[
[ "notify", "progress", jQuery.Callbacks("memory"),
jQuery.Callbacks("memory"), 2 ],
[ "resolve", "done", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), 0, "resolved" ],
[ "reject", "fail", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), 1, "rejected" ]
],
state="pending",
promise={
state: function(){
return state;
},
always: function(){
deferred.done(arguments).fail(arguments);
return this;
},
"catch": function(fn){
return promise.then(null, fn);
},
pipe: function(){
var fns=arguments;
return jQuery.Deferred(function(newDefer){
jQuery.each(tuples, function(_i, tuple){
var fn=isFunction(fns[ tuple[ 4 ] ])&&fns[ tuple[ 4 ] ];
deferred[ tuple[ 1 ] ](function(){
var returned=fn&&fn.apply(this, arguments);
if(returned&&isFunction(returned.promise) ){
returned.promise()
.progress(newDefer.notify)
.done(newDefer.resolve)
.fail(newDefer.reject);
}else{
newDefer[ tuple[ 0 ] + "With" ](
this,
fn ? [ returned ]:arguments
);
}});
});
fns=null;
}).promise();
},
then: function(onFulfilled, onRejected, onProgress){
var maxDepth=0;
function resolve(depth, deferred, handler, special){
return function(){
var that=this,
args=arguments,
mightThrow=function(){
var returned, then;
if(depth < maxDepth){
return;
}
returned=handler.apply(that, args);
if(returned===deferred.promise()){
throw new TypeError("Thenable self-resolution");
}
then=returned &&
(typeof returned==="object" ||
typeof returned==="function") &&
returned.then;
if(isFunction(then) ){
if(special){
then.call(returned,
resolve(maxDepth, deferred, Identity, special),
resolve(maxDepth, deferred, Thrower, special)
);
}else{
maxDepth++;
then.call(returned,
resolve(maxDepth, deferred, Identity, special),
resolve(maxDepth, deferred, Thrower, special),
resolve(maxDepth, deferred, Identity,
deferred.notifyWith)
);
}}else{
if(handler!==Identity){
that=undefined;
args=[ returned ];
}
(special||deferred.resolveWith)(that, args);
}},
process=special ?
mightThrow :
function(){
try {
mightThrow();
} catch(e){
if(jQuery.Deferred.exceptionHook){
jQuery.Deferred.exceptionHook(e,
process.error);
}
if(depth + 1 >=maxDepth){
if(handler!==Thrower){
that=undefined;
args=[ e ];
}
deferred.rejectWith(that, args);
}}
};
if(depth){
process();
}else{
if(jQuery.Deferred.getErrorHook){
process.error=jQuery.Deferred.getErrorHook();
}else if(jQuery.Deferred.getStackHook){
process.error=jQuery.Deferred.getStackHook();
}
window.setTimeout(process);
}};}
return jQuery.Deferred(function(newDefer){
tuples[ 0 ][ 3 ].add(resolve(
0,
newDefer,
isFunction(onProgress) ?
onProgress :
Identity,
newDefer.notifyWith
)
);
tuples[ 1 ][ 3 ].add(resolve(
0,
newDefer,
isFunction(onFulfilled) ?
onFulfilled :
Identity
)
);
tuples[ 2 ][ 3 ].add(resolve(
0,
newDefer,
isFunction(onRejected) ?
onRejected :
Thrower
)
);
}).promise();
},
promise: function(obj){
return obj!=null ? jQuery.extend(obj, promise):promise;
}},
deferred={};
jQuery.each(tuples, function(i, tuple){
var list=tuple[ 2 ],
stateString=tuple[ 5 ];
promise[ tuple[ 1 ] ]=list.add;
if(stateString){
list.add(function(){
state=stateString;
},
tuples[ 3 - i ][ 2 ].disable,
tuples[ 3 - i ][ 3 ].disable,
tuples[ 0 ][ 2 ].lock,
tuples[ 0 ][ 3 ].lock
);
}
list.add(tuple[ 3 ].fire);
deferred[ tuple[ 0 ] ]=function(){
deferred[ tuple[ 0 ] + "With" ](this===deferred ? undefined:this, arguments);
return this;
};
deferred[ tuple[ 0 ] + "With" ]=list.fireWith;
});
promise.promise(deferred);
if(func){
func.call(deferred, deferred);
}
return deferred;
},
when: function(singleValue){
var
remaining=arguments.length,
i=remaining,
resolveContexts=Array(i),
resolveValues=slice.call(arguments),
primary=jQuery.Deferred(),
updateFunc=function(i){
return function(value){
resolveContexts[ i ]=this;
resolveValues[ i ]=arguments.length > 1 ? slice.call(arguments):value;
if(!(--remaining) ){
primary.resolveWith(resolveContexts, resolveValues);
}};};
if(remaining <=1){
adoptValue(singleValue, primary.done(updateFunc(i) ).resolve, primary.reject,
!remaining);
if(primary.state()==="pending" ||
isFunction(resolveValues[ i ]&&resolveValues[ i ].then) ){
return primary.then();
}}
while(i--){
adoptValue(resolveValues[ i ], updateFunc(i), primary.reject);
}
return primary.promise();
}});
var rerrorNames=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
jQuery.Deferred.exceptionHook=function(error, asyncError){
if(window.console&&window.console.warn&&error&&rerrorNames.test(error.name) ){
window.console.warn("jQuery.Deferred exception: " + error.message,
error.stack, asyncError);
}};
jQuery.readyException=function(error){
window.setTimeout(function(){
throw error;
});
};
var readyList=jQuery.Deferred();
jQuery.fn.ready=function(fn){
readyList
.then(fn)
.catch(function(error){
jQuery.readyException(error);
});
return this;
};
jQuery.extend({
isReady: false,
readyWait: 1,
ready: function(wait){
if(wait===true ? --jQuery.readyWait:jQuery.isReady){
return;
}
jQuery.isReady=true;
if(wait!==true&&--jQuery.readyWait > 0){
return;
}
readyList.resolveWith(document, [ jQuery ]);
}});
jQuery.ready.then=readyList.then;
function completed(){
document.removeEventListener("DOMContentLoaded", completed);
window.removeEventListener("load", completed);
jQuery.ready();
}
if(document.readyState==="complete" ||
(document.readyState!=="loading"&&!document.documentElement.doScroll) ){
window.setTimeout(jQuery.ready);
}else{
document.addEventListener("DOMContentLoaded", completed);
window.addEventListener("load", completed);
}
var access=function(elems, fn, key, value, chainable, emptyGet, raw){
var i=0,
len=elems.length,
bulk=key==null;
if(toType(key)==="object"){
chainable=true;
for(i in key){
access(elems, fn, i, key[ i ], true, emptyGet, raw);
}}else if(value!==undefined){
chainable=true;
if(!isFunction(value) ){
raw=true;
}
if(bulk){
if(raw){
fn.call(elems, value);
fn=null;
}else{
bulk=fn;
fn=function(elem, _key, value){
return bulk.call(jQuery(elem), value);
};}}
if(fn){
for(; i < len; i++){
fn(
elems[ i ], key, raw ?
value :
value.call(elems[ i ], i, fn(elems[ i ], key) )
);
}}
}
if(chainable){
return elems;
}
if(bulk){
return fn.call(elems);
}
return len ? fn(elems[ 0 ], key):emptyGet;
};
var rmsPrefix=/^-ms-/,
rdashAlpha=/-([a-z])/g;
function fcamelCase(_all, letter){
return letter.toUpperCase();
}
function camelCase(string){
return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
}
var acceptData=function(owner){
return owner.nodeType===1||owner.nodeType===9||!( +owner.nodeType);
};
function Data(){
this.expando=jQuery.expando + Data.uid++;
}
Data.uid=1;
Data.prototype={
cache: function(owner){
var value=owner[ this.expando ];
if(!value){
value={};
if(acceptData(owner) ){
if(owner.nodeType){
owner[ this.expando ]=value;
}else{
Object.defineProperty(owner, this.expando, {
value: value,
configurable: true
});
}}
}
return value;
},
set: function(owner, data, value){
var prop,
cache=this.cache(owner);
if(typeof data==="string"){
cache[ camelCase(data) ]=value;
}else{
for(prop in data){
cache[ camelCase(prop) ]=data[ prop ];
}}
return cache;
},
get: function(owner, key){
return key===undefined ?
this.cache(owner) :
owner[ this.expando ]&&owner[ this.expando ][ camelCase(key) ];
},
access: function(owner, key, value){
if(key===undefined ||
(( key&&typeof key==="string")&&value===undefined) ){
return this.get(owner, key);
}
this.set(owner, key, value);
return value!==undefined ? value:key;
},
remove: function(owner, key){
var i,
cache=owner[ this.expando ];
if(cache===undefined){
return;
}
if(key!==undefined){
if(Array.isArray(key) ){
key=key.map(camelCase);
}else{
key=camelCase(key);
key=key in cache ?
[ key ] :
(key.match(rnothtmlwhite)||[]);
}
i=key.length;
while(i--){
delete cache[ key[ i ] ];
}}
if(key===undefined||jQuery.isEmptyObject(cache) ){
if(owner.nodeType){
owner[ this.expando ]=undefined;
}else{
delete owner[ this.expando ];
}}
},
hasData: function(owner){
var cache=owner[ this.expando ];
return cache!==undefined&&!jQuery.isEmptyObject(cache);
}};
var dataPriv=new Data();
var dataUser=new Data();
var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash=/[A-Z]/g;
function getData(data){
if(data==="true"){
return true;
}
if(data==="false"){
return false;
}
if(data==="null"){
return null;
}
if(data===+data + ""){
return +data;
}
if(rbrace.test(data) ){
return JSON.parse(data);
}
return data;
}
function dataAttr(elem, key, data){
var name;
if(data===undefined&&elem.nodeType===1){
name="data-" + key.replace(rmultiDash, "-$&").toLowerCase();
data=elem.getAttribute(name);
if(typeof data==="string"){
try {
data=getData(data);
} catch(e){}
dataUser.set(elem, key, data);
}else{
data=undefined;
}}
return data;
}
jQuery.extend({
hasData: function(elem){
return dataUser.hasData(elem)||dataPriv.hasData(elem);
},
data: function(elem, name, data){
return dataUser.access(elem, name, data);
},
removeData: function(elem, name){
dataUser.remove(elem, name);
},
_data: function(elem, name, data){
return dataPriv.access(elem, name, data);
},
_removeData: function(elem, name){
dataPriv.remove(elem, name);
}});
jQuery.fn.extend({
data: function(key, value){
var i, name, data,
elem=this[ 0 ],
attrs=elem&&elem.attributes;
if(key===undefined){
if(this.length){
data=dataUser.get(elem);
if(elem.nodeType===1&&!dataPriv.get(elem, "hasDataAttrs") ){
i=attrs.length;
while(i--){
if(attrs[ i ]){
name=attrs[ i ].name;
if(name.indexOf("data-")===0){
name=camelCase(name.slice(5) );
dataAttr(elem, name, data[ name ]);
}}
}
dataPriv.set(elem, "hasDataAttrs", true);
}}
return data;
}
if(typeof key==="object"){
return this.each(function(){
dataUser.set(this, key);
});
}
return access(this, function(value){
var data;
if(elem&&value===undefined){
data=dataUser.get(elem, key);
if(data!==undefined){
return data;
}
data=dataAttr(elem, key);
if(data!==undefined){
return data;
}
return;
}
this.each(function(){
dataUser.set(this, key, value);
});
}, null, value, arguments.length > 1, null, true);
},
removeData: function(key){
return this.each(function(){
dataUser.remove(this, key);
});
}});
jQuery.extend({
queue: function(elem, type, data){
var queue;
if(elem){
type=(type||"fx") + "queue";
queue=dataPriv.get(elem, type);
if(data){
if(!queue||Array.isArray(data) ){
queue=dataPriv.access(elem, type, jQuery.makeArray(data) );
}else{
queue.push(data);
}}
return queue||[];
}},
dequeue: function(elem, type){
type=type||"fx";
var queue=jQuery.queue(elem, type),
startLength=queue.length,
fn=queue.shift(),
hooks=jQuery._queueHooks(elem, type),
next=function(){
jQuery.dequeue(elem, type);
};
if(fn==="inprogress"){
fn=queue.shift();
startLength--;
}
if(fn){
if(type==="fx"){
queue.unshift("inprogress");
}
delete hooks.stop;
fn.call(elem, next, hooks);
}
if(!startLength&&hooks){
hooks.empty.fire();
}},
_queueHooks: function(elem, type){
var key=type + "queueHooks";
return dataPriv.get(elem, key)||dataPriv.access(elem, key, {
empty: jQuery.Callbacks("once memory").add(function(){
dataPriv.remove(elem, [ type + "queue", key ]);
})
});
}});
jQuery.fn.extend({
queue: function(type, data){
var setter=2;
if(typeof type!=="string"){
data=type;
type="fx";
setter--;
}
if(arguments.length < setter){
return jQuery.queue(this[ 0 ], type);
}
return data===undefined ?
this :
this.each(function(){
var queue=jQuery.queue(this, type, data);
jQuery._queueHooks(this, type);
if(type==="fx"&&queue[ 0 ]!=="inprogress"){
jQuery.dequeue(this, type);
}});
},
dequeue: function(type){
return this.each(function(){
jQuery.dequeue(this, type);
});
},
clearQueue: function(type){
return this.queue(type||"fx", []);
},
promise: function(type, obj){
var tmp,
count=1,
defer=jQuery.Deferred(),
elements=this,
i=this.length,
resolve=function(){
if(!(--count) ){
defer.resolveWith(elements, [ elements ]);
}};
if(typeof type!=="string"){
obj=type;
type=undefined;
}
type=type||"fx";
while(i--){
tmp=dataPriv.get(elements[ i ], type + "queueHooks");
if(tmp&&tmp.empty){
count++;
tmp.empty.add(resolve);
}}
resolve();
return defer.promise(obj);
}});
var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
var rcssNum=new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
var cssExpand=[ "Top", "Right", "Bottom", "Left" ];
var documentElement=document.documentElement;
var isAttached=function(elem){
return jQuery.contains(elem.ownerDocument, elem);
},
composed={ composed: true };
if(documentElement.getRootNode){
isAttached=function(elem){
return jQuery.contains(elem.ownerDocument, elem) ||
elem.getRootNode(composed)===elem.ownerDocument;
};}
var isHiddenWithinTree=function(elem, el){
elem=el||elem;
return elem.style.display==="none" ||
elem.style.display==="" &&
isAttached(elem) &&
jQuery.css(elem, "display")==="none";
};
function adjustCSS(elem, prop, valueParts, tween){
var adjusted, scale,
maxIterations=20,
currentValue=tween ?
function(){
return tween.cur();
} :
function(){
return jQuery.css(elem, prop, "");
},
initial=currentValue(),
unit=valueParts&&valueParts[ 3 ]||(jQuery.cssNumber[ prop ] ? "":"px"),
initialInUnit=elem.nodeType &&
(jQuery.cssNumber[ prop ]||unit!=="px"&&+initial) &&
rcssNum.exec(jQuery.css(elem, prop) );
if(initialInUnit&&initialInUnit[ 3 ]!==unit){
initial=initial / 2;
unit=unit||initialInUnit[ 3 ];
initialInUnit=+initial||1;
while(maxIterations--){
jQuery.style(elem, prop, initialInUnit + unit);
if(( 1 - scale) *(1 -(scale=currentValue() / initial||0.5) ) <=0){
maxIterations=0;
}
initialInUnit=initialInUnit / scale;
}
initialInUnit=initialInUnit * 2;
jQuery.style(elem, prop, initialInUnit + unit);
valueParts=valueParts||[];
}
if(valueParts){
initialInUnit=+initialInUnit||+initial||0;
adjusted=valueParts[ 1 ] ?
initialInUnit +(valueParts[ 1 ] + 1) * valueParts[ 2 ] :
+valueParts[ 2 ];
if(tween){
tween.unit=unit;
tween.start=initialInUnit;
tween.end=adjusted;
}}
return adjusted;
}
var defaultDisplayMap={};
function getDefaultDisplay(elem){
var temp,
doc=elem.ownerDocument,
nodeName=elem.nodeName,
display=defaultDisplayMap[ nodeName ];
if(display){
return display;
}
temp=doc.body.appendChild(doc.createElement(nodeName) );
display=jQuery.css(temp, "display");
temp.parentNode.removeChild(temp);
if(display==="none"){
display="block";
}
defaultDisplayMap[ nodeName ]=display;
return display;
}
function showHide(elements, show){
var display, elem,
values=[],
index=0,
length=elements.length;
for(; index < length; index++){
elem=elements[ index ];
if(!elem.style){
continue;
}
display=elem.style.display;
if(show){
if(display==="none"){
values[ index ]=dataPriv.get(elem, "display")||null;
if(!values[ index ]){
elem.style.display="";
}}
if(elem.style.display===""&&isHiddenWithinTree(elem) ){
values[ index ]=getDefaultDisplay(elem);
}}else{
if(display!=="none"){
values[ index ]="none";
dataPriv.set(elem, "display", display);
}}
}
for(index=0; index < length; index++){
if(values[ index ]!=null){
elements[ index ].style.display=values[ index ];
}}
return elements;
}
jQuery.fn.extend({
show: function(){
return showHide(this, true);
},
hide: function(){
return showHide(this);
},
toggle: function(state){
if(typeof state==="boolean"){
return state ? this.show():this.hide();
}
return this.each(function(){
if(isHiddenWithinTree(this) ){
jQuery(this).show();
}else{
jQuery(this).hide();
}});
}});
var rcheckableType=(/^(?:checkbox|radio)$/i);
var rtagName=(/<([a-z][^\/\0>\x20\t\r\n\f]*)/i);
var rscriptType=(/^$|^module$|\/(?:java|ecma)script/i);
(function(){
var fragment=document.createDocumentFragment(),
div=fragment.appendChild(document.createElement("div") ),
input=document.createElement("input");
input.setAttribute("type", "radio");
input.setAttribute("checked", "checked");
input.setAttribute("name", "t");
div.appendChild(input);
support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;
div.innerHTML="<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
div.innerHTML="<option></option>";
support.option = !!div.lastChild;
})();
var wrapMap={
thead: [ 1, "<table>", "</table>" ],
col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
tr: [ 2, "<table><tbody>", "</tbody></table>" ],
td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
_default: [ 0, "", "" ]
};
wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;
wrapMap.th=wrapMap.td;
if(!support.option){
wrapMap.optgroup=wrapMap.option=[ 1, "<select multiple='multiple'>", "</select>" ];
}
function getAll(context, tag){
var ret;
if(typeof context.getElementsByTagName!=="undefined"){
ret=context.getElementsByTagName(tag||"*");
}else if(typeof context.querySelectorAll!=="undefined"){
ret=context.querySelectorAll(tag||"*");
}else{
ret=[];
}
if(tag===undefined||tag&&nodeName(context, tag) ){
return jQuery.merge([ context ], ret);
}
return ret;
}
function setGlobalEval(elems, refElements){
var i=0,
l=elems.length;
for(; i < l; i++){
dataPriv.set(elems[ i ],
"globalEval",
!refElements||dataPriv.get(refElements[ i ], "globalEval")
);
}}
var rhtml=/<|&#?\w+;/;
function buildFragment(elems, context, scripts, selection, ignored){
var elem, tmp, tag, wrap, attached, j,
fragment=context.createDocumentFragment(),
nodes=[],
i=0,
l=elems.length;
for(; i < l; i++){
elem=elems[ i ];
if(elem||elem===0){
if(toType(elem)==="object"){
jQuery.merge(nodes, elem.nodeType ? [ elem ]:elem);
}else if(!rhtml.test(elem) ){
nodes.push(context.createTextNode(elem) );
}else{
tmp=tmp||fragment.appendChild(context.createElement("div") );
tag=(rtagName.exec(elem)||[ "", "" ])[ 1 ].toLowerCase();
wrap=wrapMap[ tag ]||wrapMap._default;
tmp.innerHTML=wrap[ 1 ] + jQuery.htmlPrefilter(elem) + wrap[ 2 ];
j=wrap[ 0 ];
while(j--){
tmp=tmp.lastChild;
}
jQuery.merge(nodes, tmp.childNodes);
tmp=fragment.firstChild;
tmp.textContent="";
}}
}
fragment.textContent="";
i=0;
while(( elem=nodes[ i++ ]) ){
if(selection&&jQuery.inArray(elem, selection) > -1){
if(ignored){
ignored.push(elem);
}
continue;
}
attached=isAttached(elem);
tmp=getAll(fragment.appendChild(elem), "script");
if(attached){
setGlobalEval(tmp);
}
if(scripts){
j=0;
while(( elem=tmp[ j++ ]) ){
if(rscriptType.test(elem.type||"") ){
scripts.push(elem);
}}
}}
return fragment;
}
var rtypenamespace=/^([^.]*)(?:\.(.+)|)/;
function returnTrue(){
return true;
}
function returnFalse(){
return false;
}
function on(elem, types, selector, data, fn, one){
var origFn, type;
if(typeof types==="object"){
if(typeof selector!=="string"){
data=data||selector;
selector=undefined;
}
for(type in types){
on(elem, type, selector, data, types[ type ], one);
}
return elem;
}
if(data==null&&fn==null){
fn=selector;
data=selector=undefined;
}else if(fn==null){
if(typeof selector==="string"){
fn=data;
data=undefined;
}else{
fn=data;
data=selector;
selector=undefined;
}}
if(fn===false){
fn=returnFalse;
}else if(!fn){
return elem;
}
if(one===1){
origFn=fn;
fn=function(event){
jQuery().off(event);
return origFn.apply(this, arguments);
};
fn.guid=origFn.guid||(origFn.guid=jQuery.guid++);
}
return elem.each(function(){
jQuery.event.add(this, types, fn, data, selector);
});
}
jQuery.event={
global: {},
add: function(elem, types, handler, data, selector){
var handleObjIn, eventHandle, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData=dataPriv.get(elem);
if(!acceptData(elem) ){
return;
}
if(handler.handler){
handleObjIn=handler;
handler=handleObjIn.handler;
selector=handleObjIn.selector;
}
if(selector){
jQuery.find.matchesSelector(documentElement, selector);
}
if(!handler.guid){
handler.guid=jQuery.guid++;
}
if(!(events=elemData.events) ){
events=elemData.events=Object.create(null);
}
if(!(eventHandle=elemData.handle) ){
eventHandle=elemData.handle=function(e){
return typeof jQuery!=="undefined"&&jQuery.event.triggered!==e.type ?
jQuery.event.dispatch.apply(elem, arguments):undefined;
};}
types=(types||"").match(rnothtmlwhite)||[ "" ];
t=types.length;
while(t--){
tmp=rtypenamespace.exec(types[ t ])||[];
type=origType=tmp[ 1 ];
namespaces=(tmp[ 2 ]||"").split(".").sort();
if(!type){
continue;
}
special=jQuery.event.special[ type ]||{};
type=(selector ? special.delegateType:special.bindType)||type;
special=jQuery.event.special[ type ]||{};
handleObj=jQuery.extend({
type: type,
origType: origType,
data: data,
handler: handler,
guid: handler.guid,
selector: selector,
needsContext: selector&&jQuery.expr.match.needsContext.test(selector),
namespace: namespaces.join(".")
}, handleObjIn);
if(!(handlers=events[ type ]) ){
handlers=events[ type ]=[];
handlers.delegateCount=0;
if(!special.setup ||
special.setup.call(elem, data, namespaces, eventHandle)===false){
if(elem.addEventListener){
elem.addEventListener(type, eventHandle);
}}
}
if(special.add){
special.add.call(elem, handleObj);
if(!handleObj.handler.guid){
handleObj.handler.guid=handler.guid;
}}
if(selector){
handlers.splice(handlers.delegateCount++, 0, handleObj);
}else{
handlers.push(handleObj);
}
jQuery.event.global[ type ]=true;
}},
remove: function(elem, types, handler, selector, mappedTypes){
var j, origCount, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
elemData=dataPriv.hasData(elem)&&dataPriv.get(elem);
if(!elemData||!(events=elemData.events) ){
return;
}
types=(types||"").match(rnothtmlwhite)||[ "" ];
t=types.length;
while(t--){
tmp=rtypenamespace.exec(types[ t ])||[];
type=origType=tmp[ 1 ];
namespaces=(tmp[ 2 ]||"").split(".").sort();
if(!type){
for(type in events){
jQuery.event.remove(elem, type + types[ t ], handler, selector, true);
}
continue;
}
special=jQuery.event.special[ type ]||{};
type=(selector ? special.delegateType:special.bindType)||type;
handlers=events[ type ]||[];
tmp=tmp[ 2 ] &&
new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
origCount=j = handlers.length;
while(j--){
handleObj=handlers[ j ];
if(( mappedTypes||origType===handleObj.origType) &&
(!handler||handler.guid===handleObj.guid) &&
(!tmp||tmp.test(handleObj.namespace) ) &&
(!selector||selector===handleObj.selector ||
selector==="**"&&handleObj.selector) ){
handlers.splice(j, 1);
if(handleObj.selector){
handlers.delegateCount--;
}
if(special.remove){
special.remove.call(elem, handleObj);
}}
}
if(origCount&&!handlers.length){
if(!special.teardown ||
special.teardown.call(elem, namespaces, elemData.handle)===false){
jQuery.removeEvent(elem, type, elemData.handle);
}
delete events[ type ];
}}
if(jQuery.isEmptyObject(events) ){
dataPriv.remove(elem, "handle events");
}},
dispatch: function(nativeEvent){
var i, j, ret, matched, handleObj, handlerQueue,
args=new Array(arguments.length),
event=jQuery.event.fix(nativeEvent),
handlers=(
dataPriv.get(this, "events")||Object.create(null)
)[ event.type ]||[],
special=jQuery.event.special[ event.type ]||{};
args[ 0 ]=event;
for(i=1; i < arguments.length; i++){
args[ i ]=arguments[ i ];
}
event.delegateTarget=this;
if(special.preDispatch&&special.preDispatch.call(this, event)===false){
return;
}
handlerQueue=jQuery.event.handlers.call(this, event, handlers);
i=0;
while(( matched=handlerQueue[ i++ ])&&!event.isPropagationStopped()){
event.currentTarget=matched.elem;
j=0;
while(( handleObj=matched.handlers[ j++ ]) &&
!event.isImmediatePropagationStopped()){
if(!event.rnamespace||handleObj.namespace===false ||
event.rnamespace.test(handleObj.namespace) ){
event.handleObj=handleObj;
event.data=handleObj.data;
ret=(( jQuery.event.special[ handleObj.origType ]||{}).handle ||
handleObj.handler).apply(matched.elem, args);
if(ret!==undefined){
if(( event.result=ret)===false){
event.preventDefault();
event.stopPropagation();
}}
}}
}
if(special.postDispatch){
special.postDispatch.call(this, event);
}
return event.result;
},
handlers: function(event, handlers){
var i, handleObj, sel, matchedHandlers, matchedSelectors,
handlerQueue=[],
delegateCount=handlers.delegateCount,
cur=event.target;
if(delegateCount &&
cur.nodeType &&
!(event.type==="click"&&event.button >=1) ){
for(; cur!==this; cur=cur.parentNode||this){
if(cur.nodeType===1&&!(event.type==="click"&&cur.disabled===true) ){
matchedHandlers=[];
matchedSelectors={};
for(i=0; i < delegateCount; i++){
handleObj=handlers[ i ];
sel=handleObj.selector + " ";
if(matchedSelectors[ sel ]===undefined){
matchedSelectors[ sel ]=handleObj.needsContext ?
jQuery(sel, this).index(cur) > -1 :
jQuery.find(sel, this, null, [ cur ]).length;
}
if(matchedSelectors[ sel ]){
matchedHandlers.push(handleObj);
}}
if(matchedHandlers.length){
handlerQueue.push({ elem: cur, handlers: matchedHandlers });
}}
}}
cur=this;
if(delegateCount < handlers.length){
handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) });
}
return handlerQueue;
},
addProp: function(name, hook){
Object.defineProperty(jQuery.Event.prototype, name, {
enumerable: true,
configurable: true,
get: isFunction(hook) ?
function(){
if(this.originalEvent){
return hook(this.originalEvent);
}} :
function(){
if(this.originalEvent){
return this.originalEvent[ name ];
}},
set: function(value){
Object.defineProperty(this, name, {
enumerable: true,
configurable: true,
writable: true,
value: value
});
}});
},
fix: function(originalEvent){
return originalEvent[ jQuery.expando ] ?
originalEvent :
new jQuery.Event(originalEvent);
},
special: {
load: {
noBubble: true
},
click: {
setup: function(data){
var el=this||data;
if(rcheckableType.test(el.type) &&
el.click&&nodeName(el, "input") ){
leverageNative(el, "click", true);
}
return false;
},
trigger: function(data){
var el=this||data;
if(rcheckableType.test(el.type) &&
el.click&&nodeName(el, "input") ){
leverageNative(el, "click");
}
return true;
},
_default: function(event){
var target=event.target;
return rcheckableType.test(target.type) &&
target.click&&nodeName(target, "input") &&
dataPriv.get(target, "click") ||
nodeName(target, "a");
}},
beforeunload: {
postDispatch: function(event){
if(event.result!==undefined&&event.originalEvent){
event.originalEvent.returnValue=event.result;
}}
}}
};
function leverageNative(el, type, isSetup){
if(!isSetup){
if(dataPriv.get(el, type)===undefined){
jQuery.event.add(el, type, returnTrue);
}
return;
}
dataPriv.set(el, type, false);
jQuery.event.add(el, type, {
namespace: false,
handler: function(event){
var result,
saved=dataPriv.get(this, type);
if(( event.isTrigger & 1)&&this[ type ]){
if(!saved){
saved=slice.call(arguments);
dataPriv.set(this, type, saved);
this[ type ]();
result=dataPriv.get(this, type);
dataPriv.set(this, type, false);
if(saved!==result){
event.stopImmediatePropagation();
event.preventDefault();
return result;
}}else if(( jQuery.event.special[ type ]||{}).delegateType){
event.stopPropagation();
}}else if(saved){
dataPriv.set(this, type, jQuery.event.trigger(saved[ 0 ],
saved.slice(1),
this
));
event.stopPropagation();
event.isImmediatePropagationStopped=returnTrue;
}}
});
}
jQuery.removeEvent=function(elem, type, handle){
if(elem.removeEventListener){
elem.removeEventListener(type, handle);
}};
jQuery.Event=function(src, props){
if(!(this instanceof jQuery.Event) ){
return new jQuery.Event(src, props);
}
if(src&&src.type){
this.originalEvent=src;
this.type=src.type;
this.isDefaultPrevented=src.defaultPrevented ||
src.defaultPrevented===undefined &&
src.returnValue===false ?
returnTrue :
returnFalse;
this.target=(src.target&&src.target.nodeType===3) ?
src.target.parentNode :
src.target;
this.currentTarget=src.currentTarget;
this.relatedTarget=src.relatedTarget;
}else{
this.type=src;
}
if(props){
jQuery.extend(this, props);
}
this.timeStamp=src&&src.timeStamp||Date.now();
this[ jQuery.expando ]=true;
};
jQuery.Event.prototype={
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
isSimulated: false,
preventDefault: function(){
var e=this.originalEvent;
this.isDefaultPrevented=returnTrue;
if(e&&!this.isSimulated){
e.preventDefault();
}},
stopPropagation: function(){
var e=this.originalEvent;
this.isPropagationStopped=returnTrue;
if(e&&!this.isSimulated){
e.stopPropagation();
}},
stopImmediatePropagation: function(){
var e=this.originalEvent;
this.isImmediatePropagationStopped=returnTrue;
if(e&&!this.isSimulated){
e.stopImmediatePropagation();
}
this.stopPropagation();
}};
jQuery.each({
altKey: true,
bubbles: true,
cancelable: true,
changedTouches: true,
ctrlKey: true,
detail: true,
eventPhase: true,
metaKey: true,
pageX: true,
pageY: true,
shiftKey: true,
view: true,
"char": true,
code: true,
charCode: true,
key: true,
keyCode: true,
button: true,
buttons: true,
clientX: true,
clientY: true,
offsetX: true,
offsetY: true,
pointerId: true,
pointerType: true,
screenX: true,
screenY: true,
targetTouches: true,
toElement: true,
touches: true,
which: true
}, jQuery.event.addProp);
jQuery.each({ focus: "focusin", blur: "focusout" }, function(type, delegateType){
function focusMappedHandler(nativeEvent){
if(document.documentMode){
var handle=dataPriv.get(this, "handle"),
event=jQuery.event.fix(nativeEvent);
event.type=nativeEvent.type==="focusin" ? "focus":"blur";
event.isSimulated=true;
handle(nativeEvent);
if(event.target===event.currentTarget){
handle(event);
}}else{
jQuery.event.simulate(delegateType, nativeEvent.target,
jQuery.event.fix(nativeEvent) );
}}
jQuery.event.special[ type ]={
setup: function(){
var attaches;
leverageNative(this, type, true);
if(document.documentMode){
attaches=dataPriv.get(this, delegateType);
if(!attaches){
this.addEventListener(delegateType, focusMappedHandler);
}
dataPriv.set(this, delegateType,(attaches||0) + 1);
}else{
return false;
}},
trigger: function(){
leverageNative(this, type);
return true;
},
teardown: function(){
var attaches;
if(document.documentMode){
attaches=dataPriv.get(this, delegateType) - 1;
if(!attaches){
this.removeEventListener(delegateType, focusMappedHandler);
dataPriv.remove(this, delegateType);
}else{
dataPriv.set(this, delegateType, attaches);
}}else{
return false;
}},
_default: function(event){
return dataPriv.get(event.target, type);
},
delegateType: delegateType
};
jQuery.event.special[ delegateType ]={
setup: function(){
var doc=this.ownerDocument||this.document||this,
dataHolder=document.documentMode ? this:doc,
attaches=dataPriv.get(dataHolder, delegateType);
if(!attaches){
if(document.documentMode){
this.addEventListener(delegateType, focusMappedHandler);
}else{
doc.addEventListener(type, focusMappedHandler, true);
}}
dataPriv.set(dataHolder, delegateType,(attaches||0) + 1);
},
teardown: function(){
var doc=this.ownerDocument||this.document||this,
dataHolder=document.documentMode ? this:doc,
attaches=dataPriv.get(dataHolder, delegateType) - 1;
if(!attaches){
if(document.documentMode){
this.removeEventListener(delegateType, focusMappedHandler);
}else{
doc.removeEventListener(type, focusMappedHandler, true);
}
dataPriv.remove(dataHolder, delegateType);
}else{
dataPriv.set(dataHolder, delegateType, attaches);
}}
};});
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function(orig, fix){
jQuery.event.special[ orig ]={
delegateType: fix,
bindType: fix,
handle: function(event){
var ret,
target=this,
related=event.relatedTarget,
handleObj=event.handleObj;
if(!related||(related!==target&&!jQuery.contains(target, related) )){
event.type=handleObj.origType;
ret=handleObj.handler.apply(this, arguments);
event.type=fix;
}
return ret;
}};});
jQuery.fn.extend({
on: function(types, selector, data, fn){
return on(this, types, selector, data, fn);
},
one: function(types, selector, data, fn){
return on(this, types, selector, data, fn, 1);
},
off: function(types, selector, fn){
var handleObj, type;
if(types&&types.preventDefault&&types.handleObj){
handleObj=types.handleObj;
jQuery(types.delegateTarget).off(handleObj.namespace ?
handleObj.origType + "." + handleObj.namespace :
handleObj.origType,
handleObj.selector,
handleObj.handler
);
return this;
}
if(typeof types==="object"){
for(type in types){
this.off(type, selector, types[ type ]);
}
return this;
}
if(selector===false||typeof selector==="function"){
fn=selector;
selector=undefined;
}
if(fn===false){
fn=returnFalse;
}
return this.each(function(){
jQuery.event.remove(this, types, fn, selector);
});
}});
var
rnoInnerhtml=/<script|<style|<link/i,
rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,
rcleanScript=/^\s*<!\[CDATA\[|\]\]>\s*$/g;
function manipulationTarget(elem, content){
if(nodeName(elem, "table") &&
nodeName(content.nodeType!==11 ? content:content.firstChild, "tr") ){
return jQuery(elem).children("tbody")[ 0 ]||elem;
}
return elem;
}
function disableScript(elem){
elem.type=(elem.getAttribute("type")!==null) + "/" + elem.type;
return elem;
}
function restoreScript(elem){
if(( elem.type||"").slice(0, 5)==="true/"){
elem.type=elem.type.slice(5);
}else{
elem.removeAttribute("type");
}
return elem;
}
function cloneCopyEvent(src, dest){
var i, l, type, pdataOld, udataOld, udataCur, events;
if(dest.nodeType!==1){
return;
}
if(dataPriv.hasData(src) ){
pdataOld=dataPriv.get(src);
events=pdataOld.events;
if(events){
dataPriv.remove(dest, "handle events");
for(type in events){
for(i=0, l=events[ type ].length; i < l; i++){
jQuery.event.add(dest, type, events[ type ][ i ]);
}}
}}
if(dataUser.hasData(src) ){
udataOld=dataUser.access(src);
udataCur=jQuery.extend({}, udataOld);
dataUser.set(dest, udataCur);
}}
function fixInput(src, dest){
var nodeName=dest.nodeName.toLowerCase();
if(nodeName==="input"&&rcheckableType.test(src.type) ){
dest.checked=src.checked;
}else if(nodeName==="input"||nodeName==="textarea"){
dest.defaultValue=src.defaultValue;
}}
function domManip(collection, args, callback, ignored){
args=flat(args);
var fragment, first, scripts, hasScripts, node, doc,
i=0,
l=collection.length,
iNoClone=l - 1,
value=args[ 0 ],
valueIsFunction=isFunction(value);
if(valueIsFunction ||
(l > 1&&typeof value==="string" &&
!support.checkClone&&rchecked.test(value) )){
return collection.each(function(index){
var self=collection.eq(index);
if(valueIsFunction){
args[ 0 ]=value.call(this, index, self.html());
}
domManip(self, args, callback, ignored);
});
}
if(l){
fragment=buildFragment(args, collection[ 0 ].ownerDocument, false, collection, ignored);
first=fragment.firstChild;
if(fragment.childNodes.length===1){
fragment=first;
}
if(first||ignored){
scripts=jQuery.map(getAll(fragment, "script"), disableScript);
hasScripts=scripts.length;
for(; i < l; i++){
node=fragment;
if(i!==iNoClone){
node=jQuery.clone(node, true, true);
if(hasScripts){
jQuery.merge(scripts, getAll(node, "script") );
}}
callback.call(collection[ i ], node, i);
}
if(hasScripts){
doc=scripts[ scripts.length - 1 ].ownerDocument;
jQuery.map(scripts, restoreScript);
for(i=0; i < hasScripts; i++){
node=scripts[ i ];
if(rscriptType.test(node.type||"") &&
!dataPriv.access(node, "globalEval") &&
jQuery.contains(doc, node) ){
if(node.src&&(node.type||"").toLowerCase()!=="module"){
if(jQuery._evalUrl&&!node.noModule){
jQuery._evalUrl(node.src, {
nonce: node.nonce||node.getAttribute("nonce")
}, doc);
}}else{
DOMEval(node.textContent.replace(rcleanScript, ""), node, doc);
}}
}}
}}
return collection;
}
function remove(elem, selector, keepData){
var node,
nodes=selector ? jQuery.filter(selector, elem):elem,
i=0;
for(;(node=nodes[ i ])!=null; i++){
if(!keepData&&node.nodeType===1){
jQuery.cleanData(getAll(node) );
}
if(node.parentNode){
if(keepData&&isAttached(node) ){
setGlobalEval(getAll(node, "script") );
}
node.parentNode.removeChild(node);
}}
return elem;
}
jQuery.extend({
htmlPrefilter: function(html){
return html;
},
clone: function(elem, dataAndEvents, deepDataAndEvents){
var i, l, srcElements, destElements,
clone=elem.cloneNode(true),
inPage=isAttached(elem);
if(!support.noCloneChecked&&(elem.nodeType===1||elem.nodeType===11) &&
!jQuery.isXMLDoc(elem) ){
destElements=getAll(clone);
srcElements=getAll(elem);
for(i=0, l=srcElements.length; i < l; i++){
fixInput(srcElements[ i ], destElements[ i ]);
}}
if(dataAndEvents){
if(deepDataAndEvents){
srcElements=srcElements||getAll(elem);
destElements=destElements||getAll(clone);
for(i=0, l=srcElements.length; i < l; i++){
cloneCopyEvent(srcElements[ i ], destElements[ i ]);
}}else{
cloneCopyEvent(elem, clone);
}}
destElements=getAll(clone, "script");
if(destElements.length > 0){
setGlobalEval(destElements, !inPage&&getAll(elem, "script") );
}
return clone;
},
cleanData: function(elems){
var data, elem, type,
special=jQuery.event.special,
i=0;
for(;(elem=elems[ i ])!==undefined; i++){
if(acceptData(elem) ){
if(( data=elem[ dataPriv.expando ]) ){
if(data.events){
for(type in data.events){
if(special[ type ]){
jQuery.event.remove(elem, type);
}else{
jQuery.removeEvent(elem, type, data.handle);
}}
}
elem[ dataPriv.expando ]=undefined;
}
if(elem[ dataUser.expando ]){
elem[ dataUser.expando ]=undefined;
}}
}}
});
jQuery.fn.extend({
detach: function(selector){
return remove(this, selector, true);
},
remove: function(selector){
return remove(this, selector);
},
text: function(value){
return access(this, function(value){
return value===undefined ?
jQuery.text(this) :
this.empty().each(function(){
if(this.nodeType===1||this.nodeType===11||this.nodeType===9){
this.textContent=value;
}});
}, null, value, arguments.length);
},
append: function(){
return domManip(this, arguments, function(elem){
if(this.nodeType===1||this.nodeType===11||this.nodeType===9){
var target=manipulationTarget(this, elem);
target.appendChild(elem);
}});
},
prepend: function(){
return domManip(this, arguments, function(elem){
if(this.nodeType===1||this.nodeType===11||this.nodeType===9){
var target=manipulationTarget(this, elem);
target.insertBefore(elem, target.firstChild);
}});
},
before: function(){
return domManip(this, arguments, function(elem){
if(this.parentNode){
this.parentNode.insertBefore(elem, this);
}});
},
after: function(){
return domManip(this, arguments, function(elem){
if(this.parentNode){
this.parentNode.insertBefore(elem, this.nextSibling);
}});
},
empty: function(){
var elem,
i=0;
for(;(elem=this[ i ])!=null; i++){
if(elem.nodeType===1){
jQuery.cleanData(getAll(elem, false) );
elem.textContent="";
}}
return this;
},
clone: function(dataAndEvents, deepDataAndEvents){
dataAndEvents=dataAndEvents==null ? false:dataAndEvents;
deepDataAndEvents=deepDataAndEvents==null ? dataAndEvents:deepDataAndEvents;
return this.map(function(){
return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
});
},
html: function(value){
return access(this, function(value){
var elem=this[ 0 ]||{},
i=0,
l=this.length;
if(value===undefined&&elem.nodeType===1){
return elem.innerHTML;
}
if(typeof value==="string"&&!rnoInnerhtml.test(value) &&
!wrapMap[(rtagName.exec(value)||[ "", "" ])[ 1 ].toLowerCase() ]){
value=jQuery.htmlPrefilter(value);
try {
for(; i < l; i++){
elem=this[ i ]||{};
if(elem.nodeType===1){
jQuery.cleanData(getAll(elem, false) );
elem.innerHTML=value;
}}
elem=0;
} catch(e){}}
if(elem){
this.empty().append(value);
}}, null, value, arguments.length);
},
replaceWith: function(){
var ignored=[];
return domManip(this, arguments, function(elem){
var parent=this.parentNode;
if(jQuery.inArray(this, ignored) < 0){
jQuery.cleanData(getAll(this) );
if(parent){
parent.replaceChild(elem, this);
}}
}, ignored);
}});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(name, original){
jQuery.fn[ name ]=function(selector){
var elems,
ret=[],
insert=jQuery(selector),
last=insert.length - 1,
i=0;
for(; i <=last; i++){
elems=i===last ? this:this.clone(true);
jQuery(insert[ i ])[ original ](elems);
push.apply(ret, elems.get());
}
return this.pushStack(ret);
};});
var rnumnonpx=new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
var rcustomProp=/^--/;
var getStyles=function(elem){
var view=elem.ownerDocument.defaultView;
if(!view||!view.opener){
view=window;
}
return view.getComputedStyle(elem);
};
var swap=function(elem, options, callback){
var ret, name,
old={};
for(name in options){
old[ name ]=elem.style[ name ];
elem.style[ name ]=options[ name ];
}
ret=callback.call(elem);
for(name in options){
elem.style[ name ]=old[ name ];
}
return ret;
};
var rboxStyle=new RegExp(cssExpand.join("|"), "i");
(function(){
function computeStyleTests(){
if(!div){
return;
}
container.style.cssText="position:absolute;left:-11111px;width:60px;" +
"margin-top:1px;padding:0;border:0";
div.style.cssText =
"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
"margin:auto;border:1px;padding:1px;" +
"width:60%;top:1%";
documentElement.appendChild(container).appendChild(div);
var divStyle=window.getComputedStyle(div);
pixelPositionVal=divStyle.top!=="1%";
reliableMarginLeftVal=roundPixelMeasures(divStyle.marginLeft)===12;
div.style.right="60%";
pixelBoxStylesVal=roundPixelMeasures(divStyle.right)===36;
boxSizingReliableVal=roundPixelMeasures(divStyle.width)===36;
div.style.position="absolute";
scrollboxSizeVal=roundPixelMeasures(div.offsetWidth / 3)===12;
documentElement.removeChild(container);
div=null;
}
function roundPixelMeasures(measure){
return Math.round(parseFloat(measure) );
}
var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
reliableTrDimensionsVal, reliableMarginLeftVal,
container=document.createElement("div"),
div=document.createElement("div");
if(!div.style){
return;
}
div.style.backgroundClip="content-box";
div.cloneNode(true).style.backgroundClip="";
support.clearCloneStyle=div.style.backgroundClip==="content-box";
jQuery.extend(support, {
boxSizingReliable: function(){
computeStyleTests();
return boxSizingReliableVal;
},
pixelBoxStyles: function(){
computeStyleTests();
return pixelBoxStylesVal;
},
pixelPosition: function(){
computeStyleTests();
return pixelPositionVal;
},
reliableMarginLeft: function(){
computeStyleTests();
return reliableMarginLeftVal;
},
scrollboxSize: function(){
computeStyleTests();
return scrollboxSizeVal;
},
reliableTrDimensions: function(){
var table, tr, trChild, trStyle;
if(reliableTrDimensionsVal==null){
table=document.createElement("table");
tr=document.createElement("tr");
trChild=document.createElement("div");
table.style.cssText="position:absolute;left:-11111px;border-collapse:separate";
tr.style.cssText="box-sizing:content-box;border:1px solid";
tr.style.height="1px";
trChild.style.height="9px";
trChild.style.display="block";
documentElement
.appendChild(table)
.appendChild(tr)
.appendChild(trChild);
trStyle=window.getComputedStyle(tr);
reliableTrDimensionsVal=(parseInt(trStyle.height, 10) +
parseInt(trStyle.borderTopWidth, 10) +
parseInt(trStyle.borderBottomWidth, 10) )===tr.offsetHeight;
documentElement.removeChild(table);
}
return reliableTrDimensionsVal;
}});
})();
function curCSS(elem, name, computed){
var width, minWidth, maxWidth, ret,
isCustomProp=rcustomProp.test(name),
style=elem.style;
computed=computed||getStyles(elem);
if(computed){
ret=computed.getPropertyValue(name)||computed[ name ];
if(isCustomProp&&ret){
ret=ret.replace(rtrimCSS, "$1")||undefined;
}
if(ret===""&&!isAttached(elem) ){
ret=jQuery.style(elem, name);
}
if(!support.pixelBoxStyles()&&rnumnonpx.test(ret)&&rboxStyle.test(name) ){
width=style.width;
minWidth=style.minWidth;
maxWidth=style.maxWidth;
style.minWidth=style.maxWidth=style.width=ret;
ret=computed.width;
style.width=width;
style.minWidth=minWidth;
style.maxWidth=maxWidth;
}}
return ret!==undefined ?
ret + "" :
ret;
}
function addGetHookIf(conditionFn, hookFn){
return {
get: function(){
if(conditionFn()){
delete this.get;
return;
}
return(this.get=hookFn).apply(this, arguments);
}};}
var cssPrefixes=[ "Webkit", "Moz", "ms" ],
emptyStyle=document.createElement("div").style,
vendorProps={};
function vendorPropName(name){
var capName=name[ 0 ].toUpperCase() + name.slice(1),
i=cssPrefixes.length;
while(i--){
name=cssPrefixes[ i ] + capName;
if(name in emptyStyle){
return name;
}}
}
function finalPropName(name){
var final=jQuery.cssProps[ name ]||vendorProps[ name ];
if(final){
return final;
}
if(name in emptyStyle){
return name;
}
return vendorProps[ name ]=vendorPropName(name)||name;
}
var
rdisplayswap=/^(none|table(?!-c[ea]).+)/,
cssShow={ position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform={
letterSpacing: "0",
fontWeight: "400"
};
function setPositiveNumber(_elem, value, subtract){
var matches=rcssNum.exec(value);
return matches ?
Math.max(0, matches[ 2 ] -(subtract||0) ) +(matches[ 3 ]||"px") :
value;
}
function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal){
var i=dimension==="width" ? 1:0,
extra=0,
delta=0,
marginDelta=0;
if(box===(isBorderBox ? "border":"content") ){
return 0;
}
for(; i < 4; i +=2){
if(box==="margin"){
marginDelta +=jQuery.css(elem, box + cssExpand[ i ], true, styles);
}
if(!isBorderBox){
delta +=jQuery.css(elem, "padding" + cssExpand[ i ], true, styles);
if(box!=="padding"){
delta +=jQuery.css(elem, "border" + cssExpand[ i ] + "Width", true, styles);
}else{
extra +=jQuery.css(elem, "border" + cssExpand[ i ] + "Width", true, styles);
}}else{
if(box==="content"){
delta -=jQuery.css(elem, "padding" + cssExpand[ i ], true, styles);
}
if(box!=="margin"){
delta -=jQuery.css(elem, "border" + cssExpand[ i ] + "Width", true, styles);
}}
}
if(!isBorderBox&&computedVal >=0){
delta +=Math.max(0, Math.ceil(elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice(1) ] -
computedVal -
delta -
extra -
0.5
))||0;
}
return delta + marginDelta;
}
function getWidthOrHeight(elem, dimension, extra){
var styles=getStyles(elem),
boxSizingNeeded = !support.boxSizingReliable()||extra,
isBorderBox=boxSizingNeeded &&
jQuery.css(elem, "boxSizing", false, styles)==="border-box",
valueIsBorderBox=isBorderBox,
val=curCSS(elem, dimension, styles),
offsetProp="offset" + dimension[ 0 ].toUpperCase() + dimension.slice(1);
if(rnumnonpx.test(val) ){
if(!extra){
return val;
}
val="auto";
}
if(( !support.boxSizingReliable()&&isBorderBox ||
!support.reliableTrDimensions()&&nodeName(elem, "tr") ||
val==="auto" ||
!parseFloat(val)&&jQuery.css(elem, "display", false, styles)==="inline") &&
elem.getClientRects().length){
isBorderBox=jQuery.css(elem, "boxSizing", false, styles)==="border-box";
valueIsBorderBox=offsetProp in elem;
if(valueIsBorderBox){
val=elem[ offsetProp ];
}}
val=parseFloat(val)||0;
return(val +
boxModelAdjustment(
elem,
dimension,
extra||(isBorderBox ? "border":"content"),
valueIsBorderBox,
styles,
val
)
) + "px";
}
jQuery.extend({
cssHooks: {
opacity: {
get: function(elem, computed){
if(computed){
var ret=curCSS(elem, "opacity");
return ret==="" ? "1":ret;
}}
}},
cssNumber: {
animationIterationCount: true,
aspectRatio: true,
borderImageSlice: true,
columnCount: true,
flexGrow: true,
flexShrink: true,
fontWeight: true,
gridArea: true,
gridColumn: true,
gridColumnEnd: true,
gridColumnStart: true,
gridRow: true,
gridRowEnd: true,
gridRowStart: true,
lineHeight: true,
opacity: true,
order: true,
orphans: true,
scale: true,
widows: true,
zIndex: true,
zoom: true,
fillOpacity: true,
floodOpacity: true,
stopOpacity: true,
strokeMiterlimit: true,
strokeOpacity: true
},
cssProps: {},
style: function(elem, name, value, extra){
if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){
return;
}
var ret, type, hooks,
origName=camelCase(name),
isCustomProp=rcustomProp.test(name),
style=elem.style;
if(!isCustomProp){
name=finalPropName(origName);
}
hooks=jQuery.cssHooks[ name ]||jQuery.cssHooks[ origName ];
if(value!==undefined){
type=typeof value;
if(type==="string"&&(ret=rcssNum.exec(value) )&&ret[ 1 ]){
value=adjustCSS(elem, name, ret);
type="number";
}
if(value==null||value!==value){
return;
}
if(type==="number"&&!isCustomProp){
value +=ret&&ret[ 3 ]||(jQuery.cssNumber[ origName ] ? "":"px");
}
if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){
style[ name ]="inherit";
}
if(!hooks||!("set" in hooks) ||
(value=hooks.set(elem, value, extra) )!==undefined){
if(isCustomProp){
style.setProperty(name, value);
}else{
style[ name ]=value;
}}
}else{
if(hooks&&"get" in hooks &&
(ret=hooks.get(elem, false, extra) )!==undefined){
return ret;
}
return style[ name ];
}},
css: function(elem, name, extra, styles){
var val, num, hooks,
origName=camelCase(name),
isCustomProp=rcustomProp.test(name);
if(!isCustomProp){
name=finalPropName(origName);
}
hooks=jQuery.cssHooks[ name ]||jQuery.cssHooks[ origName ];
if(hooks&&"get" in hooks){
val=hooks.get(elem, true, extra);
}
if(val===undefined){
val=curCSS(elem, name, styles);
}
if(val==="normal"&&name in cssNormalTransform){
val=cssNormalTransform[ name ];
}
if(extra===""||extra){
num=parseFloat(val);
return extra===true||isFinite(num) ? num||0:val;
}
return val;
}});
jQuery.each([ "height", "width" ], function(_i, dimension){
jQuery.cssHooks[ dimension ]={
get: function(elem, computed, extra){
if(computed){
return rdisplayswap.test(jQuery.css(elem, "display") ) &&
(!elem.getClientRects().length||!elem.getBoundingClientRect().width) ?
swap(elem, cssShow, function(){
return getWidthOrHeight(elem, dimension, extra);
}) :
getWidthOrHeight(elem, dimension, extra);
}},
set: function(elem, value, extra){
var matches,
styles=getStyles(elem),
scrollboxSizeBuggy = !support.scrollboxSize() &&
styles.position==="absolute",
boxSizingNeeded=scrollboxSizeBuggy||extra,
isBorderBox=boxSizingNeeded &&
jQuery.css(elem, "boxSizing", false, styles)==="border-box",
subtract=extra ?
boxModelAdjustment(
elem,
dimension,
extra,
isBorderBox,
styles
) :
0;
if(isBorderBox&&scrollboxSizeBuggy){
subtract -=Math.ceil(elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice(1) ] -
parseFloat(styles[ dimension ]) -
boxModelAdjustment(elem, dimension, "border", false, styles) -
0.5
);
}
if(subtract&&(matches=rcssNum.exec(value) ) &&
(matches[ 3 ]||"px")!=="px"){
elem.style[ dimension ]=value;
value=jQuery.css(elem, dimension);
}
return setPositiveNumber(elem, value, subtract);
}};});
jQuery.cssHooks.marginLeft=addGetHookIf(support.reliableMarginLeft,
function(elem, computed){
if(computed){
return(parseFloat(curCSS(elem, "marginLeft") ) ||
elem.getBoundingClientRect().left -
swap(elem, { marginLeft: 0 }, function(){
return elem.getBoundingClientRect().left;
})
) + "px";
}}
);
jQuery.each({
margin: "",
padding: "",
border: "Width"
}, function(prefix, suffix){
jQuery.cssHooks[ prefix + suffix ]={
expand: function(value){
var i=0,
expanded={},
parts=typeof value==="string" ? value.split(" "):[ value ];
for(; i < 4; i++){
expanded[ prefix + cssExpand[ i ] + suffix ] =
parts[ i ]||parts[ i - 2 ]||parts[ 0 ];
}
return expanded;
}};
if(prefix!=="margin"){
jQuery.cssHooks[ prefix + suffix ].set=setPositiveNumber;
}});
jQuery.fn.extend({
css: function(name, value){
return access(this, function(elem, name, value){
var styles, len,
map={},
i=0;
if(Array.isArray(name) ){
styles=getStyles(elem);
len=name.length;
for(; i < len; i++){
map[ name[ i ] ]=jQuery.css(elem, name[ i ], false, styles);
}
return map;
}
return value!==undefined ?
jQuery.style(elem, name, value) :
jQuery.css(elem, name);
}, name, value, arguments.length > 1);
}});
function Tween(elem, options, prop, end, easing){
return new Tween.prototype.init(elem, options, prop, end, easing);
}
jQuery.Tween=Tween;
Tween.prototype={
constructor: Tween,
init: function(elem, options, prop, end, easing, unit){
this.elem=elem;
this.prop=prop;
this.easing=easing||jQuery.easing._default;
this.options=options;
this.start=this.now=this.cur();
this.end=end;
this.unit=unit||(jQuery.cssNumber[ prop ] ? "":"px");
},
cur: function(){
var hooks=Tween.propHooks[ this.prop ];
return hooks&&hooks.get ?
hooks.get(this) :
Tween.propHooks._default.get(this);
},
run: function(percent){
var eased,
hooks=Tween.propHooks[ this.prop ];
if(this.options.duration){
this.pos=eased=jQuery.easing[ this.easing ](
percent, this.options.duration * percent, 0, 1, this.options.duration
);
}else{
this.pos=eased=percent;
}
this.now=(this.end - this.start) * eased + this.start;
if(this.options.step){
this.options.step.call(this.elem, this.now, this);
}
if(hooks&&hooks.set){
hooks.set(this);
}else{
Tween.propHooks._default.set(this);
}
return this;
}};
Tween.prototype.init.prototype=Tween.prototype;
Tween.propHooks={
_default: {
get: function(tween){
var result;
if(tween.elem.nodeType!==1 ||
tween.elem[ tween.prop ]!=null&&tween.elem.style[ tween.prop ]==null){
return tween.elem[ tween.prop ];
}
result=jQuery.css(tween.elem, tween.prop, "");
return !result||result==="auto" ? 0:result;
},
set: function(tween){
if(jQuery.fx.step[ tween.prop ]){
jQuery.fx.step[ tween.prop ](tween);
}else if(tween.elem.nodeType===1&&(
jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName(tween.prop) ]!=null) ){
jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
}else{
tween.elem[ tween.prop ]=tween.now;
}}
}};
Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={
set: function(tween){
if(tween.elem.nodeType&&tween.elem.parentNode){
tween.elem[ tween.prop ]=tween.now;
}}
};
jQuery.easing={
linear: function(p){
return p;
},
swing: function(p){
return 0.5 - Math.cos(p * Math.PI) / 2;
},
_default: "swing"
};
jQuery.fx=Tween.prototype.init;
jQuery.fx.step={};
var
fxNow, inProgress,
rfxtypes=/^(?:toggle|show|hide)$/,
rrun=/queueHooks$/;
function schedule(){
if(inProgress){
if(document.hidden===false&&window.requestAnimationFrame){
window.requestAnimationFrame(schedule);
}else{
window.setTimeout(schedule, jQuery.fx.interval);
}
jQuery.fx.tick();
}}
function createFxNow(){
window.setTimeout(function(){
fxNow=undefined;
});
return(fxNow=Date.now());
}
function genFx(type, includeWidth){
var which,
i=0,
attrs={ height: type };
includeWidth=includeWidth ? 1:0;
for(; i < 4; i +=2 - includeWidth){
which=cssExpand[ i ];
attrs[ "margin" + which ]=attrs[ "padding" + which ]=type;
}
if(includeWidth){
attrs.opacity=attrs.width=type;
}
return attrs;
}
function createTween(value, prop, animation){
var tween,
collection=(Animation.tweeners[ prop ]||[]).concat(Animation.tweeners[ "*" ]),
index=0,
length=collection.length;
for(; index < length; index++){
if(( tween=collection[ index ].call(animation, prop, value) )){
return tween;
}}
}
function defaultPrefilter(elem, props, opts){
var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
isBox="width" in props||"height" in props,
anim=this,
orig={},
style=elem.style,
hidden=elem.nodeType&&isHiddenWithinTree(elem),
dataShow=dataPriv.get(elem, "fxshow");
if(!opts.queue){
hooks=jQuery._queueHooks(elem, "fx");
if(hooks.unqueued==null){
hooks.unqueued=0;
oldfire=hooks.empty.fire;
hooks.empty.fire=function(){
if(!hooks.unqueued){
oldfire();
}};}
hooks.unqueued++;
anim.always(function(){
anim.always(function(){
hooks.unqueued--;
if(!jQuery.queue(elem, "fx").length){
hooks.empty.fire();
}});
});
}
for(prop in props){
value=props[ prop ];
if(rfxtypes.test(value) ){
delete props[ prop ];
toggle=toggle||value==="toggle";
if(value===(hidden ? "hide":"show") ){
if(value==="show"&&dataShow&&dataShow[ prop ]!==undefined){
hidden=true;
}else{
continue;
}}
orig[ prop ]=dataShow&&dataShow[ prop ]||jQuery.style(elem, prop);
}}
propTween = !jQuery.isEmptyObject(props);
if(!propTween&&jQuery.isEmptyObject(orig) ){
return;
}
if(isBox&&elem.nodeType===1){
opts.overflow=[ style.overflow, style.overflowX, style.overflowY ];
restoreDisplay=dataShow&&dataShow.display;
if(restoreDisplay==null){
restoreDisplay=dataPriv.get(elem, "display");
}
display=jQuery.css(elem, "display");
if(display==="none"){
if(restoreDisplay){
display=restoreDisplay;
}else{
showHide([ elem ], true);
restoreDisplay=elem.style.display||restoreDisplay;
display=jQuery.css(elem, "display");
showHide([ elem ]);
}}
if(display==="inline"||display==="inline-block"&&restoreDisplay!=null){
if(jQuery.css(elem, "float")==="none"){
if(!propTween){
anim.done(function(){
style.display=restoreDisplay;
});
if(restoreDisplay==null){
display=style.display;
restoreDisplay=display==="none" ? "":display;
}}
style.display="inline-block";
}}
}
if(opts.overflow){
style.overflow="hidden";
anim.always(function(){
style.overflow=opts.overflow[ 0 ];
style.overflowX=opts.overflow[ 1 ];
style.overflowY=opts.overflow[ 2 ];
});
}
propTween=false;
for(prop in orig){
if(!propTween){
if(dataShow){
if("hidden" in dataShow){
hidden=dataShow.hidden;
}}else{
dataShow=dataPriv.access(elem, "fxshow", { display: restoreDisplay });
}
if(toggle){
dataShow.hidden = !hidden;
}
if(hidden){
showHide([ elem ], true);
}
anim.done(function(){
if(!hidden){
showHide([ elem ]);
}
dataPriv.remove(elem, "fxshow");
for(prop in orig){
jQuery.style(elem, prop, orig[ prop ]);
}});
}
propTween=createTween(hidden ? dataShow[ prop ]:0, prop, anim);
if(!(prop in dataShow) ){
dataShow[ prop ]=propTween.start;
if(hidden){
propTween.end=propTween.start;
propTween.start=0;
}}
}}
function propFilter(props, specialEasing){
var index, name, easing, value, hooks;
for(index in props){
name=camelCase(index);
easing=specialEasing[ name ];
value=props[ index ];
if(Array.isArray(value) ){
easing=value[ 1 ];
value=props[ index ]=value[ 0 ];
}
if(index!==name){
props[ name ]=value;
delete props[ index ];
}
hooks=jQuery.cssHooks[ name ];
if(hooks&&"expand" in hooks){
value=hooks.expand (value);
delete props[ name ];
for(index in value){
if(!(index in props) ){
props[ index ]=value[ index ];
specialEasing[ index ]=easing;
}}
}else{
specialEasing[ name ]=easing;
}}
}
function Animation(elem, properties, options){
var result,
stopped,
index=0,
length=Animation.prefilters.length,
deferred=jQuery.Deferred().always(function(){
delete tick.elem;
}),
tick=function(){
if(stopped){
return false;
}
var currentTime=fxNow||createFxNow(),
remaining=Math.max(0, animation.startTime + animation.duration - currentTime),
temp=remaining / animation.duration||0,
percent=1 - temp,
index=0,
length=animation.tweens.length;
for(; index < length; index++){
animation.tweens[ index ].run(percent);
}
deferred.notifyWith(elem, [ animation, percent, remaining ]);
if(percent < 1&&length){
return remaining;
}
if(!length){
deferred.notifyWith(elem, [ animation, 1, 0 ]);
}
deferred.resolveWith(elem, [ animation ]);
return false;
},
animation=deferred.promise({
elem: elem,
props: jQuery.extend({}, properties),
opts: jQuery.extend(true, {
specialEasing: {},
easing: jQuery.easing._default
}, options),
originalProperties: properties,
originalOptions: options,
startTime: fxNow||createFxNow(),
duration: options.duration,
tweens: [],
createTween: function(prop, end){
var tween=jQuery.Tween(elem, animation.opts, prop, end,
animation.opts.specialEasing[ prop ]||animation.opts.easing);
animation.tweens.push(tween);
return tween;
},
stop: function(gotoEnd){
var index=0,
length=gotoEnd ? animation.tweens.length:0;
if(stopped){
return this;
}
stopped=true;
for(; index < length; index++){
animation.tweens[ index ].run(1);
}
if(gotoEnd){
deferred.notifyWith(elem, [ animation, 1, 0 ]);
deferred.resolveWith(elem, [ animation, gotoEnd ]);
}else{
deferred.rejectWith(elem, [ animation, gotoEnd ]);
}
return this;
}}),
props=animation.props;
propFilter(props, animation.opts.specialEasing);
for(; index < length; index++){
result=Animation.prefilters[ index ].call(animation, elem, props, animation.opts);
if(result){
if(isFunction(result.stop) ){
jQuery._queueHooks(animation.elem, animation.opts.queue).stop =
result.stop.bind(result);
}
return result;
}}
jQuery.map(props, createTween, animation);
if(isFunction(animation.opts.start) ){
animation.opts.start.call(elem, animation);
}
animation
.progress(animation.opts.progress)
.done(animation.opts.done, animation.opts.complete)
.fail(animation.opts.fail)
.always(animation.opts.always);
jQuery.fx.timer(jQuery.extend(tick, {
elem: elem,
anim: animation,
queue: animation.opts.queue
})
);
return animation;
}
jQuery.Animation=jQuery.extend(Animation, {
tweeners: {
"*": [ function(prop, value){
var tween=this.createTween(prop, value);
adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
return tween;
} ]
},
tweener: function(props, callback){
if(isFunction(props) ){
callback=props;
props=[ "*" ];
}else{
props=props.match(rnothtmlwhite);
}
var prop,
index=0,
length=props.length;
for(; index < length; index++){
prop=props[ index ];
Animation.tweeners[ prop ]=Animation.tweeners[ prop ]||[];
Animation.tweeners[ prop ].unshift(callback);
}},
prefilters: [ defaultPrefilter ],
prefilter: function(callback, prepend){
if(prepend){
Animation.prefilters.unshift(callback);
}else{
Animation.prefilters.push(callback);
}}
});
jQuery.speed=function(speed, easing, fn){
var opt=speed&&typeof speed==="object" ? jQuery.extend({}, speed):{
complete: fn||!fn&&easing ||
isFunction(speed)&&speed,
duration: speed,
easing: fn&&easing||easing&&!isFunction(easing)&&easing
};
if(jQuery.fx.off){
opt.duration=0;
}else{
if(typeof opt.duration!=="number"){
if(opt.duration in jQuery.fx.speeds){
opt.duration=jQuery.fx.speeds[ opt.duration ];
}else{
opt.duration=jQuery.fx.speeds._default;
}}
}
if(opt.queue==null||opt.queue===true){
opt.queue="fx";
}
opt.old=opt.complete;
opt.complete=function(){
if(isFunction(opt.old) ){
opt.old.call(this);
}
if(opt.queue){
jQuery.dequeue(this, opt.queue);
}};
return opt;
};
jQuery.fn.extend({
fadeTo: function(speed, to, easing, callback){
return this.filter(isHiddenWithinTree).css("opacity", 0).show()
.end().animate({ opacity: to }, speed, easing, callback);
},
animate: function(prop, speed, easing, callback){
var empty=jQuery.isEmptyObject(prop),
optall=jQuery.speed(speed, easing, callback),
doAnimation=function(){
var anim=Animation(this, jQuery.extend({}, prop), optall);
if(empty||dataPriv.get(this, "finish") ){
anim.stop(true);
}};
doAnimation.finish=doAnimation;
return empty||optall.queue===false ?
this.each(doAnimation) :
this.queue(optall.queue, doAnimation);
},
stop: function(type, clearQueue, gotoEnd){
var stopQueue=function(hooks){
var stop=hooks.stop;
delete hooks.stop;
stop(gotoEnd);
};
if(typeof type!=="string"){
gotoEnd=clearQueue;
clearQueue=type;
type=undefined;
}
if(clearQueue){
this.queue(type||"fx", []);
}
return this.each(function(){
var dequeue=true,
index=type!=null&&type + "queueHooks",
timers=jQuery.timers,
data=dataPriv.get(this);
if(index){
if(data[ index ]&&data[ index ].stop){
stopQueue(data[ index ]);
}}else{
for(index in data){
if(data[ index ]&&data[ index ].stop&&rrun.test(index) ){
stopQueue(data[ index ]);
}}
}
for(index=timers.length; index--;){
if(timers[ index ].elem===this &&
(type==null||timers[ index ].queue===type) ){
timers[ index ].anim.stop(gotoEnd);
dequeue=false;
timers.splice(index, 1);
}}
if(dequeue||!gotoEnd){
jQuery.dequeue(this, type);
}});
},
finish: function(type){
if(type!==false){
type=type||"fx";
}
return this.each(function(){
var index,
data=dataPriv.get(this),
queue=data[ type + "queue" ],
hooks=data[ type + "queueHooks" ],
timers=jQuery.timers,
length=queue ? queue.length:0;
data.finish=true;
jQuery.queue(this, type, []);
if(hooks&&hooks.stop){
hooks.stop.call(this, true);
}
for(index=timers.length; index--;){
if(timers[ index ].elem===this&&timers[ index ].queue===type){
timers[ index ].anim.stop(true);
timers.splice(index, 1);
}}
for(index=0; index < length; index++){
if(queue[ index ]&&queue[ index ].finish){
queue[ index ].finish.call(this);
}}
delete data.finish;
});
}});
jQuery.each([ "toggle", "show", "hide" ], function(_i, name){
var cssFn=jQuery.fn[ name ];
jQuery.fn[ name ]=function(speed, easing, callback){
return speed==null||typeof speed==="boolean" ?
cssFn.apply(this, arguments) :
this.animate(genFx(name, true), speed, easing, callback);
};});
jQuery.each({
slideDown: genFx("show"),
slideUp: genFx("hide"),
slideToggle: genFx("toggle"),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }}, function(name, props){
jQuery.fn[ name ]=function(speed, easing, callback){
return this.animate(props, speed, easing, callback);
};});
jQuery.timers=[];
jQuery.fx.tick=function(){
var timer,
i=0,
timers=jQuery.timers;
fxNow=Date.now();
for(; i < timers.length; i++){
timer=timers[ i ];
if(!timer()&&timers[ i ]===timer){
timers.splice(i--, 1);
}}
if(!timers.length){
jQuery.fx.stop();
}
fxNow=undefined;
};
jQuery.fx.timer=function(timer){
jQuery.timers.push(timer);
jQuery.fx.start();
};
jQuery.fx.interval=13;
jQuery.fx.start=function(){
if(inProgress){
return;
}
inProgress=true;
schedule();
};
jQuery.fx.stop=function(){
inProgress=null;
};
jQuery.fx.speeds={
slow: 600,
fast: 200,
_default: 400
};
jQuery.fn.delay=function(time, type){
time=jQuery.fx ? jQuery.fx.speeds[ time ]||time:time;
type=type||"fx";
return this.queue(type, function(next, hooks){
var timeout=window.setTimeout(next, time);
hooks.stop=function(){
window.clearTimeout(timeout);
};});
};
(function(){
var input=document.createElement("input"),
select=document.createElement("select"),
opt=select.appendChild(document.createElement("option") );
input.type="checkbox";
support.checkOn=input.value!=="";
support.optSelected=opt.selected;
input=document.createElement("input");
input.value="t";
input.type="radio";
support.radioValue=input.value==="t";
})();
var boolHook,
attrHandle=jQuery.expr.attrHandle;
jQuery.fn.extend({
attr: function(name, value){
return access(this, jQuery.attr, name, value, arguments.length > 1);
},
removeAttr: function(name){
return this.each(function(){
jQuery.removeAttr(this, name);
});
}});
jQuery.extend({
attr: function(elem, name, value){
var ret, hooks,
nType=elem.nodeType;
if(nType===3||nType===8||nType===2){
return;
}
if(typeof elem.getAttribute==="undefined"){
return jQuery.prop(elem, name, value);
}
if(nType!==1||!jQuery.isXMLDoc(elem) ){
hooks=jQuery.attrHooks[ name.toLowerCase() ] ||
(jQuery.expr.match.bool.test(name) ? boolHook:undefined);
}
if(value!==undefined){
if(value===null){
jQuery.removeAttr(elem, name);
return;
}
if(hooks&&"set" in hooks &&
(ret=hooks.set(elem, value, name) )!==undefined){
return ret;
}
elem.setAttribute(name, value + "");
return value;
}
if(hooks&&"get" in hooks&&(ret=hooks.get(elem, name) )!==null){
return ret;
}
ret=jQuery.find.attr(elem, name);
return ret==null ? undefined:ret;
},
attrHooks: {
type: {
set: function(elem, value){
if(!support.radioValue&&value==="radio" &&
nodeName(elem, "input") ){
var val=elem.value;
elem.setAttribute("type", value);
if(val){
elem.value=val;
}
return value;
}}
}},
removeAttr: function(elem, value){
var name,
i=0,
attrNames=value&&value.match(rnothtmlwhite);
if(attrNames&&elem.nodeType===1){
while(( name=attrNames[ i++ ]) ){
elem.removeAttribute(name);
}}
}});
boolHook={
set: function(elem, value, name){
if(value===false){
jQuery.removeAttr(elem, name);
}else{
elem.setAttribute(name, name);
}
return name;
}};
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(_i, name){
var getter=attrHandle[ name ]||jQuery.find.attr;
attrHandle[ name ]=function(elem, name, isXML){
var ret, handle,
lowercaseName=name.toLowerCase();
if(!isXML){
handle=attrHandle[ lowercaseName ];
attrHandle[ lowercaseName ]=ret;
ret=getter(elem, name, isXML)!=null ?
lowercaseName :
null;
attrHandle[ lowercaseName ]=handle;
}
return ret;
};});
var rfocusable=/^(?:input|select|textarea|button)$/i,
rclickable=/^(?:a|area)$/i;
jQuery.fn.extend({
prop: function(name, value){
return access(this, jQuery.prop, name, value, arguments.length > 1);
},
removeProp: function(name){
return this.each(function(){
delete this[ jQuery.propFix[ name ]||name ];
});
}});
jQuery.extend({
prop: function(elem, name, value){
var ret, hooks,
nType=elem.nodeType;
if(nType===3||nType===8||nType===2){
return;
}
if(nType!==1||!jQuery.isXMLDoc(elem) ){
name=jQuery.propFix[ name ]||name;
hooks=jQuery.propHooks[ name ];
}
if(value!==undefined){
if(hooks&&"set" in hooks &&
(ret=hooks.set(elem, value, name) )!==undefined){
return ret;
}
return(elem[ name ]=value);
}
if(hooks&&"get" in hooks&&(ret=hooks.get(elem, name) )!==null){
return ret;
}
return elem[ name ];
},
propHooks: {
tabIndex: {
get: function(elem){
var tabindex=jQuery.find.attr(elem, "tabindex");
if(tabindex){
return parseInt(tabindex, 10);
}
if(rfocusable.test(elem.nodeName) ||
rclickable.test(elem.nodeName) &&
elem.href
){
return 0;
}
return -1;
}}
},
propFix: {
"for": "htmlFor",
"class": "className"
}});
if(!support.optSelected){
jQuery.propHooks.selected={
get: function(elem){
var parent=elem.parentNode;
if(parent&&parent.parentNode){
parent.parentNode.selectedIndex;
}
return null;
},
set: function(elem){
var parent=elem.parentNode;
if(parent){
parent.selectedIndex;
if(parent.parentNode){
parent.parentNode.selectedIndex;
}}
}};}
jQuery.each([
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function(){
jQuery.propFix[ this.toLowerCase() ]=this;
});
function stripAndCollapse(value){
var tokens=value.match(rnothtmlwhite)||[];
return tokens.join(" ");
}
function getClass(elem){
return elem.getAttribute&&elem.getAttribute("class")||"";
}
function classesToArray(value){
if(Array.isArray(value) ){
return value;
}
if(typeof value==="string"){
return value.match(rnothtmlwhite)||[];
}
return [];
}
jQuery.fn.extend({
addClass: function(value){
var classNames, cur, curValue, className, i, finalValue;
if(isFunction(value) ){
return this.each(function(j){
jQuery(this).addClass(value.call(this, j, getClass(this) ));
});
}
classNames=classesToArray(value);
if(classNames.length){
return this.each(function(){
curValue=getClass(this);
cur=this.nodeType===1&&(" " + stripAndCollapse(curValue) + " ");
if(cur){
for(i=0; i < classNames.length; i++){
className=classNames[ i ];
if(cur.indexOf(" " + className + " ") < 0){
cur +=className + " ";
}}
finalValue=stripAndCollapse(cur);
if(curValue!==finalValue){
this.setAttribute("class", finalValue);
}}
});
}
return this;
},
removeClass: function(value){
var classNames, cur, curValue, className, i, finalValue;
if(isFunction(value) ){
return this.each(function(j){
jQuery(this).removeClass(value.call(this, j, getClass(this) ));
});
}
if(!arguments.length){
return this.attr("class", "");
}
classNames=classesToArray(value);
if(classNames.length){
return this.each(function(){
curValue=getClass(this);
cur=this.nodeType===1&&(" " + stripAndCollapse(curValue) + " ");
if(cur){
for(i=0; i < classNames.length; i++){
className=classNames[ i ];
while(cur.indexOf(" " + className + " ") > -1){
cur=cur.replace(" " + className + " ", " ");
}}
finalValue=stripAndCollapse(cur);
if(curValue!==finalValue){
this.setAttribute("class", finalValue);
}}
});
}
return this;
},
toggleClass: function(value, stateVal){
var classNames, className, i, self,
type=typeof value,
isValidValue=type==="string"||Array.isArray(value);
if(isFunction(value) ){
return this.each(function(i){
jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal),
stateVal
);
});
}
if(typeof stateVal==="boolean"&&isValidValue){
return stateVal ? this.addClass(value):this.removeClass(value);
}
classNames=classesToArray(value);
return this.each(function(){
if(isValidValue){
self=jQuery(this);
for(i=0; i < classNames.length; i++){
className=classNames[ i ];
if(self.hasClass(className) ){
self.removeClass(className);
}else{
self.addClass(className);
}}
}else if(value===undefined||type==="boolean"){
className=getClass(this);
if(className){
dataPriv.set(this, "__className__", className);
}
if(this.setAttribute){
this.setAttribute("class",
className||value===false ?
"" :
dataPriv.get(this, "__className__")||""
);
}}
});
},
hasClass: function(selector){
var className, elem,
i=0;
className=" " + selector + " ";
while(( elem=this[ i++ ]) ){
if(elem.nodeType===1 &&
(" " + stripAndCollapse(getClass(elem) ) + " ").indexOf(className) > -1){
return true;
}}
return false;
}});
var rreturn=/\r/g;
jQuery.fn.extend({
val: function(value){
var hooks, ret, valueIsFunction,
elem=this[ 0 ];
if(!arguments.length){
if(elem){
hooks=jQuery.valHooks[ elem.type ] ||
jQuery.valHooks[ elem.nodeName.toLowerCase() ];
if(hooks &&
"get" in hooks &&
(ret=hooks.get(elem, "value") )!==undefined
){
return ret;
}
ret=elem.value;
if(typeof ret==="string"){
return ret.replace(rreturn, "");
}
return ret==null ? "":ret;
}
return;
}
valueIsFunction=isFunction(value);
return this.each(function(i){
var val;
if(this.nodeType!==1){
return;
}
if(valueIsFunction){
val=value.call(this, i, jQuery(this).val());
}else{
val=value;
}
if(val==null){
val="";
}else if(typeof val==="number"){
val +="";
}else if(Array.isArray(val) ){
val=jQuery.map(val, function(value){
return value==null ? "":value + "";
});
}
hooks=jQuery.valHooks[ this.type ]||jQuery.valHooks[ this.nodeName.toLowerCase() ];
if(!hooks||!("set" in hooks)||hooks.set(this, val, "value")===undefined){
this.value=val;
}});
}});
jQuery.extend({
valHooks: {
option: {
get: function(elem){
var val=jQuery.find.attr(elem, "value");
return val!=null ?
val :
stripAndCollapse(jQuery.text(elem) );
}},
select: {
get: function(elem){
var value, option, i,
options=elem.options,
index=elem.selectedIndex,
one=elem.type==="select-one",
values=one ? null:[],
max=one ? index + 1:options.length;
if(index < 0){
i=max;
}else{
i=one ? index:0;
}
for(; i < max; i++){
option=options[ i ];
if(( option.selected||i===index) &&
!option.disabled &&
(!option.parentNode.disabled ||
!nodeName(option.parentNode, "optgroup") )){
value=jQuery(option).val();
if(one){
return value;
}
values.push(value);
}}
return values;
},
set: function(elem, value){
var optionSet, option,
options=elem.options,
values=jQuery.makeArray(value),
i=options.length;
while(i--){
option=options[ i ];
if(option.selected =
jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1
){
optionSet=true;
}
}
if(!optionSet){
elem.selectedIndex=-1;
}
return values;
}}
}});
jQuery.each([ "radio", "checkbox" ], function(){
jQuery.valHooks[ this ]={
set: function(elem, value){
if(Array.isArray(value) ){
return(elem.checked=jQuery.inArray(jQuery(elem).val(), value) > -1);
}}
};
if(!support.checkOn){
jQuery.valHooks[ this ].get=function(elem){
return elem.getAttribute("value")===null ? "on":elem.value;
};}});
var location=window.location;
var nonce={ guid: Date.now() };
var rquery=(/\?/);
jQuery.parseXML=function(data){
var xml, parserErrorElem;
if(!data||typeof data!=="string"){
return null;
}
try {
xml=(new window.DOMParser()).parseFromString(data, "text/xml");
} catch(e){}
parserErrorElem=xml&&xml.getElementsByTagName("parsererror")[ 0 ];
if(!xml||parserErrorElem){
jQuery.error("Invalid XML: " + (
parserErrorElem ?
jQuery.map(parserErrorElem.childNodes, function(el){
return el.textContent;
}).join("\n") :
data
));
}
return xml;
};
var rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,
stopPropagationCallback=function(e){
e.stopPropagation();
};
jQuery.extend(jQuery.event, {
trigger: function(event, data, elem, onlyHandlers){
var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
eventPath=[ elem||document ],
type=hasOwn.call(event, "type") ? event.type:event,
namespaces=hasOwn.call(event, "namespace") ? event.namespace.split("."):[];
cur=lastElement=tmp=elem=elem||document;
if(elem.nodeType===3||elem.nodeType===8){
return;
}
if(rfocusMorph.test(type + jQuery.event.triggered) ){
return;
}
if(type.indexOf(".") > -1){
namespaces=type.split(".");
type=namespaces.shift();
namespaces.sort();
}
ontype=type.indexOf(":") < 0&&"on" + type;
event=event[ jQuery.expando ] ?
event :
new jQuery.Event(type, typeof event==="object"&&event);
event.isTrigger=onlyHandlers ? 2:3;
event.namespace=namespaces.join(".");
event.rnamespace=event.namespace ?
new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") :
null;
event.result=undefined;
if(!event.target){
event.target=elem;
}
data=data==null ?
[ event ] :
jQuery.makeArray(data, [ event ]);
special=jQuery.event.special[ type ]||{};
if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem, data)===false){
return;
}
if(!onlyHandlers&&!special.noBubble&&!isWindow(elem) ){
bubbleType=special.delegateType||type;
if(!rfocusMorph.test(bubbleType + type) ){
cur=cur.parentNode;
}
for(; cur; cur=cur.parentNode){
eventPath.push(cur);
tmp=cur;
}
if(tmp===(elem.ownerDocument||document) ){
eventPath.push(tmp.defaultView||tmp.parentWindow||window);
}}
i=0;
while(( cur=eventPath[ i++ ])&&!event.isPropagationStopped()){
lastElement=cur;
event.type=i > 1 ?
bubbleType :
special.bindType||type;
handle=(dataPriv.get(cur, "events")||Object.create(null) )[ event.type ] &&
dataPriv.get(cur, "handle");
if(handle){
handle.apply(cur, data);
}
handle=ontype&&cur[ ontype ];
if(handle&&handle.apply&&acceptData(cur) ){
event.result=handle.apply(cur, data);
if(event.result===false){
event.preventDefault();
}}
}
event.type=type;
if(!onlyHandlers&&!event.isDefaultPrevented()){
if(( !special._default ||
special._default.apply(eventPath.pop(), data)===false) &&
acceptData(elem) ){
if(ontype&&isFunction(elem[ type ])&&!isWindow(elem) ){
tmp=elem[ ontype ];
if(tmp){
elem[ ontype ]=null;
}
jQuery.event.triggered=type;
if(event.isPropagationStopped()){
lastElement.addEventListener(type, stopPropagationCallback);
}
elem[ type ]();
if(event.isPropagationStopped()){
lastElement.removeEventListener(type, stopPropagationCallback);
}
jQuery.event.triggered=undefined;
if(tmp){
elem[ ontype ]=tmp;
}}
}}
return event.result;
},
simulate: function(type, elem, event){
var e=jQuery.extend(new jQuery.Event(),
event,
{
type: type,
isSimulated: true
}
);
jQuery.event.trigger(e, null, elem);
}});
jQuery.fn.extend({
trigger: function(type, data){
return this.each(function(){
jQuery.event.trigger(type, data, this);
});
},
triggerHandler: function(type, data){
var elem=this[ 0 ];
if(elem){
return jQuery.event.trigger(type, data, elem, true);
}}
});
var
rbracket=/\[\]$/,
rCRLF=/\r?\n/g,
rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,
rsubmittable=/^(?:input|select|textarea|keygen)/i;
function buildParams(prefix, obj, traditional, add){
var name;
if(Array.isArray(obj) ){
jQuery.each(obj, function(i, v){
if(traditional||rbracket.test(prefix) ){
add(prefix, v);
}else{
buildParams(
prefix + "[" +(typeof v==="object"&&v!=null ? i:"") + "]",
v,
traditional,
add
);
}});
}else if(!traditional&&toType(obj)==="object"){
for(name in obj){
buildParams(prefix + "[" + name + "]", obj[ name ], traditional, add);
}}else{
add(prefix, obj);
}}
jQuery.param=function(a, traditional){
var prefix,
s=[],
add=function(key, valueOrFunction){
var value=isFunction(valueOrFunction) ?
valueOrFunction() :
valueOrFunction;
s[ s.length ]=encodeURIComponent(key) + "=" +
encodeURIComponent(value==null ? "":value);
};
if(a==null){
return "";
}
if(Array.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a) )){
jQuery.each(a, function(){
add(this.name, this.value);
});
}else{
for(prefix in a){
buildParams(prefix, a[ prefix ], traditional, add);
}}
return s.join("&");
};
jQuery.fn.extend({
serialize: function(){
return jQuery.param(this.serializeArray());
},
serializeArray: function(){
return this.map(function(){
var elements=jQuery.prop(this, "elements");
return elements ? jQuery.makeArray(elements):this;
}).filter(function(){
var type=this.type;
return this.name&&!jQuery(this).is(":disabled") &&
rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type) &&
(this.checked||!rcheckableType.test(type) );
}).map(function(_i, elem){
var val=jQuery(this).val();
if(val==null){
return null;
}
if(Array.isArray(val) ){
return jQuery.map(val, function(val){
return { name: elem.name, value: val.replace(rCRLF, "\r\n") };});
}
return { name: elem.name, value: val.replace(rCRLF, "\r\n") };}).get();
}});
var
r20=/%20/g,
rhash=/#.*$/,
rantiCache=/([?&])_=[^&]*/,
rheaders=/^(.*?):[ \t]*([^\r\n]*)$/mg,
rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent=/^(?:GET|HEAD)$/,
rprotocol=/^\/\//,
prefilters={},
transports={},
allTypes="*/".concat("*"),
originAnchor=document.createElement("a");
originAnchor.href=location.href;
function addToPrefiltersOrTransports(structure){
return function(dataTypeExpression, func){
if(typeof dataTypeExpression!=="string"){
func=dataTypeExpression;
dataTypeExpression="*";
}
var dataType,
i=0,
dataTypes=dataTypeExpression.toLowerCase().match(rnothtmlwhite)||[];
if(isFunction(func) ){
while(( dataType=dataTypes[ i++ ]) ){
if(dataType[ 0 ]==="+"){
dataType=dataType.slice(1)||"*";
(structure[ dataType ]=structure[ dataType ]||[]).unshift(func);
}else{
(structure[ dataType ]=structure[ dataType ]||[]).push(func);
}}
}};}
function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR){
var inspected={},
seekingTransport=(structure===transports);
function inspect(dataType){
var selected;
inspected[ dataType ]=true;
jQuery.each(structure[ dataType ]||[], function(_, prefilterOrFactory){
var dataTypeOrTransport=prefilterOrFactory(options, originalOptions, jqXHR);
if(typeof dataTypeOrTransport==="string" &&
!seekingTransport&&!inspected[ dataTypeOrTransport ]){
options.dataTypes.unshift(dataTypeOrTransport);
inspect(dataTypeOrTransport);
return false;
}else if(seekingTransport){
return !(selected=dataTypeOrTransport);
}});
return selected;
}
return inspect(options.dataTypes[ 0 ])||!inspected[ "*" ]&&inspect("*");
}
function ajaxExtend(target, src){
var key, deep,
flatOptions=jQuery.ajaxSettings.flatOptions||{};
for(key in src){
if(src[ key ]!==undefined){
(flatOptions[ key ] ? target:(deep||(deep={}) ))[ key ]=src[ key ];
}}
if(deep){
jQuery.extend(true, target, deep);
}
return target;
}
function ajaxHandleResponses(s, jqXHR, responses){
var ct, type, finalDataType, firstDataType,
contents=s.contents,
dataTypes=s.dataTypes;
while(dataTypes[ 0 ]==="*"){
dataTypes.shift();
if(ct===undefined){
ct=s.mimeType||jqXHR.getResponseHeader("Content-Type");
}}
if(ct){
for(type in contents){
if(contents[ type ]&&contents[ type ].test(ct) ){
dataTypes.unshift(type);
break;
}}
}
if(dataTypes[ 0 ] in responses){
finalDataType=dataTypes[ 0 ];
}else{
for(type in responses){
if(!dataTypes[ 0 ]||s.converters[ type + " " + dataTypes[ 0 ] ]){
finalDataType=type;
break;
}
if(!firstDataType){
firstDataType=type;
}}
finalDataType=finalDataType||firstDataType;
}
if(finalDataType){
if(finalDataType!==dataTypes[ 0 ]){
dataTypes.unshift(finalDataType);
}
return responses[ finalDataType ];
}}
function ajaxConvert(s, response, jqXHR, isSuccess){
var conv2, current, conv, tmp, prev,
converters={},
dataTypes=s.dataTypes.slice();
if(dataTypes[ 1 ]){
for(conv in s.converters){
converters[ conv.toLowerCase() ]=s.converters[ conv ];
}}
current=dataTypes.shift();
while(current){
if(s.responseFields[ current ]){
jqXHR[ s.responseFields[ current ] ]=response;
}
if(!prev&&isSuccess&&s.dataFilter){
response=s.dataFilter(response, s.dataType);
}
prev=current;
current=dataTypes.shift();
if(current){
if(current==="*"){
current=prev;
}else if(prev!=="*"&&prev!==current){
conv=converters[ prev + " " + current ]||converters[ "* " + current ];
if(!conv){
for(conv2 in converters){
tmp=conv2.split(" ");
if(tmp[ 1 ]===current){
conv=converters[ prev + " " + tmp[ 0 ] ] ||
converters[ "* " + tmp[ 0 ] ];
if(conv){
if(conv===true){
conv=converters[ conv2 ];
}else if(converters[ conv2 ]!==true){
current=tmp[ 0 ];
dataTypes.unshift(tmp[ 1 ]);
}
break;
}}
}}
if(conv!==true){
if(conv&&s.throws){
response=conv(response);
}else{
try {
response=conv(response);
} catch(e){
return {
state: "parsererror",
error: conv ? e:"No conversion from " + prev + " to " + current
};}}
}}
}}
return { state: "success", data: response };}
jQuery.extend({
active: 0,
lastModified: {},
etag: {},
ajaxSettings: {
url: location.href,
type: "GET",
isLocal: rlocalProtocol.test(location.protocol),
global: true,
processData: true,
async: true,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
converters: {
"* text": String,
"text html": true,
"text json": JSON.parse,
"text xml": jQuery.parseXML
},
flatOptions: {
url: true,
context: true
}},
ajaxSetup: function(target, settings){
return settings ?
ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
ajaxExtend(jQuery.ajaxSettings, target);
},
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
ajaxTransport: addToPrefiltersOrTransports(transports),
ajax: function(url, options){
if(typeof url==="object"){
options=url;
url=undefined;
}
options=options||{};
var transport,
cacheURL,
responseHeadersString,
responseHeaders,
timeoutTimer,
urlAnchor,
completed,
fireGlobals,
i,
uncached,
s=jQuery.ajaxSetup({}, options),
callbackContext=s.context||s,
globalEventContext=s.context &&
(callbackContext.nodeType||callbackContext.jquery) ?
jQuery(callbackContext) :
jQuery.event,
deferred=jQuery.Deferred(),
completeDeferred=jQuery.Callbacks("once memory"),
statusCode=s.statusCode||{},
requestHeaders={},
requestHeadersNames={},
strAbort="canceled",
jqXHR={
readyState: 0,
getResponseHeader: function(key){
var match;
if(completed){
if(!responseHeaders){
responseHeaders={};
while(( match=rheaders.exec(responseHeadersString) )){
responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
(responseHeaders[ match[ 1 ].toLowerCase() + " " ]||[])
.concat(match[ 2 ]);
}}
match=responseHeaders[ key.toLowerCase() + " " ];
}
return match==null ? null:match.join(", ");
},
getAllResponseHeaders: function(){
return completed ? responseHeadersString:null;
},
setRequestHeader: function(name, value){
if(completed==null){
name=requestHeadersNames[ name.toLowerCase() ] =
requestHeadersNames[ name.toLowerCase() ]||name;
requestHeaders[ name ]=value;
}
return this;
},
overrideMimeType: function(type){
if(completed==null){
s.mimeType=type;
}
return this;
},
statusCode: function(map){
var code;
if(map){
if(completed){
jqXHR.always(map[ jqXHR.status ]);
}else{
for(code in map){
statusCode[ code ]=[ statusCode[ code ], map[ code ] ];
}}
}
return this;
},
abort: function(statusText){
var finalText=statusText||strAbort;
if(transport){
transport.abort(finalText);
}
done(0, finalText);
return this;
}};
deferred.promise(jqXHR);
s.url=(( url||s.url||location.href) + "")
.replace(rprotocol, location.protocol + "//");
s.type=options.method||options.type||s.method||s.type;
s.dataTypes=(s.dataType||"*").toLowerCase().match(rnothtmlwhite)||[ "" ];
if(s.crossDomain==null){
urlAnchor=document.createElement("a");
try {
urlAnchor.href=s.url;
urlAnchor.href=urlAnchor.href;
s.crossDomain=originAnchor.protocol + "//" + originAnchor.host!==urlAnchor.protocol + "//" + urlAnchor.host;
} catch(e){
s.crossDomain=true;
}}
if(s.data&&s.processData&&typeof s.data!=="string"){
s.data=jQuery.param(s.data, s.traditional);
}
inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
if(completed){
return jqXHR;
}
fireGlobals=jQuery.event&&s.global;
if(fireGlobals&&jQuery.active++===0){
jQuery.event.trigger("ajaxStart");
}
s.type=s.type.toUpperCase();
s.hasContent = !rnoContent.test(s.type);
cacheURL=s.url.replace(rhash, "");
if(!s.hasContent){
uncached=s.url.slice(cacheURL.length);
if(s.data&&(s.processData||typeof s.data==="string") ){
cacheURL +=(rquery.test(cacheURL) ? "&":"?") + s.data;
delete s.data;
}
if(s.cache===false){
cacheURL=cacheURL.replace(rantiCache, "$1");
uncached=(rquery.test(cacheURL) ? "&":"?") + "_=" +(nonce.guid++) +
uncached;
}
s.url=cacheURL + uncached;
}else if(s.data&&s.processData &&
(s.contentType||"").indexOf("application/x-www-form-urlencoded")===0){
s.data=s.data.replace(r20, "+");
}
if(s.ifModified){
if(jQuery.lastModified[ cacheURL ]){
jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[ cacheURL ]);
}
if(jQuery.etag[ cacheURL ]){
jqXHR.setRequestHeader("If-None-Match", jQuery.etag[ cacheURL ]);
}}
if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){
jqXHR.setRequestHeader("Content-Type", s.contentType);
}
jqXHR.setRequestHeader("Accept",
s.dataTypes[ 0 ]&&s.accepts[ s.dataTypes[ 0 ] ] ?
s.accepts[ s.dataTypes[ 0 ] ] +
(s.dataTypes[ 0 ]!=="*" ? ", " + allTypes + "; q=0.01":"") :
s.accepts[ "*" ]
);
for(i in s.headers){
jqXHR.setRequestHeader(i, s.headers[ i ]);
}
if(s.beforeSend &&
(s.beforeSend.call(callbackContext, jqXHR, s)===false||completed) ){
return jqXHR.abort();
}
strAbort="abort";
completeDeferred.add(s.complete);
jqXHR.done(s.success);
jqXHR.fail(s.error);
transport=inspectPrefiltersOrTransports(transports, s, options, jqXHR);
if(!transport){
done(-1, "No Transport");
}else{
jqXHR.readyState=1;
if(fireGlobals){
globalEventContext.trigger("ajaxSend", [ jqXHR, s ]);
}
if(completed){
return jqXHR;
}
if(s.async&&s.timeout > 0){
timeoutTimer=window.setTimeout(function(){
jqXHR.abort("timeout");
}, s.timeout);
}
try {
completed=false;
transport.send(requestHeaders, done);
} catch(e){
if(completed){
throw e;
}
done(-1, e);
}}
function done(status, nativeStatusText, responses, headers){
var isSuccess, success, error, response, modified,
statusText=nativeStatusText;
if(completed){
return;
}
completed=true;
if(timeoutTimer){
window.clearTimeout(timeoutTimer);
}
transport=undefined;
responseHeadersString=headers||"";
jqXHR.readyState=status > 0 ? 4:0;
isSuccess=status >=200&&status < 300||status===304;
if(responses){
response=ajaxHandleResponses(s, jqXHR, responses);
}
if(!isSuccess &&
jQuery.inArray("script", s.dataTypes) > -1 &&
jQuery.inArray("json", s.dataTypes) < 0){
s.converters[ "text script" ]=function(){};}
response=ajaxConvert(s, response, jqXHR, isSuccess);
if(isSuccess){
if(s.ifModified){
modified=jqXHR.getResponseHeader("Last-Modified");
if(modified){
jQuery.lastModified[ cacheURL ]=modified;
}
modified=jqXHR.getResponseHeader("etag");
if(modified){
jQuery.etag[ cacheURL ]=modified;
}}
if(status===204||s.type==="HEAD"){
statusText="nocontent";
}else if(status===304){
statusText="notmodified";
}else{
statusText=response.state;
success=response.data;
error=response.error;
isSuccess = !error;
}}else{
error=statusText;
if(status||!statusText){
statusText="error";
if(status < 0){
status=0;
}}
}
jqXHR.status=status;
jqXHR.statusText=(nativeStatusText||statusText) + "";
if(isSuccess){
deferred.resolveWith(callbackContext, [ success, statusText, jqXHR ]);
}else{
deferred.rejectWith(callbackContext, [ jqXHR, statusText, error ]);
}
jqXHR.statusCode(statusCode);
statusCode=undefined;
if(fireGlobals){
globalEventContext.trigger(isSuccess ? "ajaxSuccess":"ajaxError",
[ jqXHR, s, isSuccess ? success:error ]);
}
completeDeferred.fireWith(callbackContext, [ jqXHR, statusText ]);
if(fireGlobals){
globalEventContext.trigger("ajaxComplete", [ jqXHR, s ]);
if(!(--jQuery.active) ){
jQuery.event.trigger("ajaxStop");
}}
}
return jqXHR;
},
getJSON: function(url, data, callback){
return jQuery.get(url, data, callback, "json");
},
getScript: function(url, callback){
return jQuery.get(url, undefined, callback, "script");
}});
jQuery.each([ "get", "post" ], function(_i, method){
jQuery[ method ]=function(url, data, callback, type){
if(isFunction(data) ){
type=type||callback;
callback=data;
data=undefined;
}
return jQuery.ajax(jQuery.extend({
url: url,
type: method,
dataType: type,
data: data,
success: callback
}, jQuery.isPlainObject(url)&&url) );
};});
jQuery.ajaxPrefilter(function(s){
var i;
for(i in s.headers){
if(i.toLowerCase()==="content-type"){
s.contentType=s.headers[ i ]||"";
}}
});
jQuery._evalUrl=function(url, options, doc){
return jQuery.ajax({
url: url,
type: "GET",
dataType: "script",
cache: true,
async: false,
global: false,
converters: {
"text script": function(){}},
dataFilter: function(response){
jQuery.globalEval(response, options, doc);
}});
};
jQuery.fn.extend({
wrapAll: function(html){
var wrap;
if(this[ 0 ]){
if(isFunction(html) ){
html=html.call(this[ 0 ]);
}
wrap=jQuery(html, this[ 0 ].ownerDocument).eq(0).clone(true);
if(this[ 0 ].parentNode){
wrap.insertBefore(this[ 0 ]);
}
wrap.map(function(){
var elem=this;
while(elem.firstElementChild){
elem=elem.firstElementChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function(html){
if(isFunction(html) ){
return this.each(function(i){
jQuery(this).wrapInner(html.call(this, i) );
});
}
return this.each(function(){
var self=jQuery(this),
contents=self.contents();
if(contents.length){
contents.wrapAll(html);
}else{
self.append(html);
}});
},
wrap: function(html){
var htmlIsFunction=isFunction(html);
return this.each(function(i){
jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i):html);
});
},
unwrap: function(selector){
this.parent(selector).not("body").each(function(){
jQuery(this).replaceWith(this.childNodes);
});
return this;
}});
jQuery.expr.pseudos.hidden=function(elem){
return !jQuery.expr.pseudos.visible(elem);
};
jQuery.expr.pseudos.visible=function(elem){
return !!(elem.offsetWidth||elem.offsetHeight||elem.getClientRects().length);
};
jQuery.ajaxSettings.xhr=function(){
try {
return new window.XMLHttpRequest();
} catch(e){}};
var xhrSuccessStatus={
0: 200,
1223: 204
},
xhrSupported=jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported&&("withCredentials" in xhrSupported);
support.ajax=xhrSupported = !!xhrSupported;
jQuery.ajaxTransport(function(options){
var callback, errorCallback;
if(support.cors||xhrSupported&&!options.crossDomain){
return {
send: function(headers, complete){
var i,
xhr=options.xhr();
xhr.open(options.type,
options.url,
options.async,
options.username,
options.password
);
if(options.xhrFields){
for(i in options.xhrFields){
xhr[ i ]=options.xhrFields[ i ];
}}
if(options.mimeType&&xhr.overrideMimeType){
xhr.overrideMimeType(options.mimeType);
}
if(!options.crossDomain&&!headers[ "X-Requested-With" ]){
headers[ "X-Requested-With" ]="XMLHttpRequest";
}
for(i in headers){
xhr.setRequestHeader(i, headers[ i ]);
}
callback=function(type){
return function(){
if(callback){
callback=errorCallback=xhr.onload =
xhr.onerror=xhr.onabort=xhr.ontimeout =
xhr.onreadystatechange=null;
if(type==="abort"){
xhr.abort();
}else if(type==="error"){
if(typeof xhr.status!=="number"){
complete(0, "error");
}else{
complete(
xhr.status,
xhr.statusText
);
}}else{
complete(
xhrSuccessStatus[ xhr.status ]||xhr.status,
xhr.statusText,
(xhr.responseType||"text")!=="text"  ||
typeof xhr.responseText!=="string" ?
{ binary: xhr.response } :
{ text: xhr.responseText },
xhr.getAllResponseHeaders()
);
}}
};};
xhr.onload=callback();
errorCallback=xhr.onerror=xhr.ontimeout=callback("error");
if(xhr.onabort!==undefined){
xhr.onabort=errorCallback;
}else{
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
window.setTimeout(function(){
if(callback){
errorCallback();
}});
}};}
callback=callback("abort");
try {
xhr.send(options.hasContent&&options.data||null);
} catch(e){
if(callback){
throw e;
}}
},
abort: function(){
if(callback){
callback();
}}
};}});
jQuery.ajaxPrefilter(function(s){
if(s.crossDomain){
s.contents.script=false;
}});
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, " +
"application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function(text){
jQuery.globalEval(text);
return text;
}}
});
jQuery.ajaxPrefilter("script", function(s){
if(s.cache===undefined){
s.cache=false;
}
if(s.crossDomain){
s.type="GET";
}});
jQuery.ajaxTransport("script", function(s){
if(s.crossDomain||s.scriptAttrs){
var script, callback;
return {
send: function(_, complete){
script=jQuery("<script>")
.attr(s.scriptAttrs||{})
.prop({ charset: s.scriptCharset, src: s.url })
.on("load error", callback=function(evt){
script.remove();
callback=null;
if(evt){
complete(evt.type==="error" ? 404:200, evt.type);
}});
document.head.appendChild(script[ 0 ]);
},
abort: function(){
if(callback){
callback();
}}
};}});
var oldCallbacks=[],
rjsonp=/(=)\?(?=&|$)|\?\?/;
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function(){
var callback=oldCallbacks.pop()||(jQuery.expando + "_" +(nonce.guid++) );
this[ callback ]=true;
return callback;
}});
jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR){
var callbackName, overwritten, responseContainer,
jsonProp=s.jsonp!==false&&(rjsonp.test(s.url) ?
"url" :
typeof s.data==="string" &&
(s.contentType||"")
.indexOf("application/x-www-form-urlencoded")===0 &&
rjsonp.test(s.data)&&"data"
);
if(jsonProp||s.dataTypes[ 0 ]==="jsonp"){
callbackName=s.jsonpCallback=isFunction(s.jsonpCallback) ?
s.jsonpCallback() :
s.jsonpCallback;
if(jsonProp){
s[ jsonProp ]=s[ jsonProp ].replace(rjsonp, "$1" + callbackName);
}else if(s.jsonp!==false){
s.url +=(rquery.test(s.url) ? "&":"?") + s.jsonp + "=" + callbackName;
}
s.converters[ "script json" ]=function(){
if(!responseContainer){
jQuery.error(callbackName + " was not called");
}
return responseContainer[ 0 ];
};
s.dataTypes[ 0 ]="json";
overwritten=window[ callbackName ];
window[ callbackName ]=function(){
responseContainer=arguments;
};
jqXHR.always(function(){
if(overwritten===undefined){
jQuery(window).removeProp(callbackName);
}else{
window[ callbackName ]=overwritten;
}
if(s[ callbackName ]){
s.jsonpCallback=originalSettings.jsonpCallback;
oldCallbacks.push(callbackName);
}
if(responseContainer&&isFunction(overwritten) ){
overwritten(responseContainer[ 0 ]);
}
responseContainer=overwritten=undefined;
});
return "script";
}});
support.createHTMLDocument=(function(){
var body=document.implementation.createHTMLDocument("").body;
body.innerHTML="<form></form><form></form>";
return body.childNodes.length===2;
})();
jQuery.parseHTML=function(data, context, keepScripts){
if(typeof data!=="string"){
return [];
}
if(typeof context==="boolean"){
keepScripts=context;
context=false;
}
var base, parsed, scripts;
if(!context){
if(support.createHTMLDocument){
context=document.implementation.createHTMLDocument("");
base=context.createElement("base");
base.href=document.location.href;
context.head.appendChild(base);
}else{
context=document;
}}
parsed=rsingleTag.exec(data);
scripts = !keepScripts&&[];
if(parsed){
return [ context.createElement(parsed[ 1 ]) ];
}
parsed=buildFragment([ data ], context, scripts);
if(scripts&&scripts.length){
jQuery(scripts).remove();
}
return jQuery.merge([], parsed.childNodes);
};
jQuery.fn.load=function(url, params, callback){
var selector, type, response,
self=this,
off=url.indexOf(" ");
if(off > -1){
selector=stripAndCollapse(url.slice(off) );
url=url.slice(0, off);
}
if(isFunction(params) ){
callback=params;
params=undefined;
}else if(params&&typeof params==="object"){
type="POST";
}
if(self.length > 0){
jQuery.ajax({
url: url,
type: type||"GET",
dataType: "html",
data: params
}).done(function(responseText){
response=arguments;
self.html(selector ?
jQuery("<div>").append(jQuery.parseHTML(responseText) ).find(selector) :
responseText);
}).always(callback&&function(jqXHR, status){
self.each(function(){
callback.apply(this, response||[ jqXHR.responseText, status, jqXHR ]);
});
});
}
return this;
};
jQuery.expr.pseudos.animated=function(elem){
return jQuery.grep(jQuery.timers, function(fn){
return elem===fn.elem;
}).length;
};
jQuery.offset={
setOffset: function(elem, options, i){
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
position=jQuery.css(elem, "position"),
curElem=jQuery(elem),
props={};
if(position==="static"){
elem.style.position="relative";
}
curOffset=curElem.offset();
curCSSTop=jQuery.css(elem, "top");
curCSSLeft=jQuery.css(elem, "left");
calculatePosition=(position==="absolute"||position==="fixed") &&
(curCSSTop + curCSSLeft).indexOf("auto") > -1;
if(calculatePosition){
curPosition=curElem.position();
curTop=curPosition.top;
curLeft=curPosition.left;
}else{
curTop=parseFloat(curCSSTop)||0;
curLeft=parseFloat(curCSSLeft)||0;
}
if(isFunction(options) ){
options=options.call(elem, i, jQuery.extend({}, curOffset) );
}
if(options.top!=null){
props.top=(options.top - curOffset.top) + curTop;
}
if(options.left!=null){
props.left=(options.left - curOffset.left) + curLeft;
}
if("using" in options){
options.using.call(elem, props);
}else{
curElem.css(props);
}}
};
jQuery.fn.extend({
offset: function(options){
if(arguments.length){
return options===undefined ?
this :
this.each(function(i){
jQuery.offset.setOffset(this, options, i);
});
}
var rect, win,
elem=this[ 0 ];
if(!elem){
return;
}
if(!elem.getClientRects().length){
return { top: 0, left: 0 };}
rect=elem.getBoundingClientRect();
win=elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};},
position: function(){
if(!this[ 0 ]){
return;
}
var offsetParent, offset, doc,
elem=this[ 0 ],
parentOffset={ top: 0, left: 0 };
if(jQuery.css(elem, "position")==="fixed"){
offset=elem.getBoundingClientRect();
}else{
offset=this.offset();
doc=elem.ownerDocument;
offsetParent=elem.offsetParent||doc.documentElement;
while(offsetParent &&
(offsetParent===doc.body||offsetParent===doc.documentElement) &&
jQuery.css(offsetParent, "position")==="static"){
offsetParent=offsetParent.parentNode;
}
if(offsetParent&&offsetParent!==elem&&offsetParent.nodeType===1){
parentOffset=jQuery(offsetParent).offset();
parentOffset.top +=jQuery.css(offsetParent, "borderTopWidth", true);
parentOffset.left +=jQuery.css(offsetParent, "borderLeftWidth", true);
}}
return {
top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
};},
offsetParent: function(){
return this.map(function(){
var offsetParent=this.offsetParent;
while(offsetParent&&jQuery.css(offsetParent, "position")==="static"){
offsetParent=offsetParent.offsetParent;
}
return offsetParent||documentElement;
});
}});
jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(method, prop){
var top="pageYOffset"===prop;
jQuery.fn[ method ]=function(val){
return access(this, function(elem, method, val){
var win;
if(isWindow(elem) ){
win=elem;
}else if(elem.nodeType===9){
win=elem.defaultView;
}
if(val===undefined){
return win ? win[ prop ]:elem[ method ];
}
if(win){
win.scrollTo(!top ? val:win.pageXOffset,
top ? val:win.pageYOffset
);
}else{
elem[ method ]=val;
}}, method, val, arguments.length);
};});
jQuery.each([ "top", "left" ], function(_i, prop){
jQuery.cssHooks[ prop ]=addGetHookIf(support.pixelPosition,
function(elem, computed){
if(computed){
computed=curCSS(elem, prop);
return rnumnonpx.test(computed) ?
jQuery(elem).position()[ prop ] + "px" :
computed;
}}
);
});
jQuery.each({ Height: "height", Width: "width" }, function(name, type){
jQuery.each({
padding: "inner" + name,
content: type,
"": "outer" + name
}, function(defaultExtra, funcName){
jQuery.fn[ funcName ]=function(margin, value){
var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),
extra=defaultExtra||(margin===true||value===true ? "margin":"border");
return access(this, function(elem, type, value){
var doc;
if(isWindow(elem) ){
return funcName.indexOf("outer")===0 ?
elem[ "inner" + name ] :
elem.document.documentElement[ "client" + name ];
}
if(elem.nodeType===9){
doc=elem.documentElement;
return Math.max(elem.body[ "scroll" + name ], doc[ "scroll" + name ],
elem.body[ "offset" + name ], doc[ "offset" + name ],
doc[ "client" + name ]
);
}
return value===undefined ?
jQuery.css(elem, type, extra) :
jQuery.style(elem, type, value, extra);
}, type, chainable ? margin:undefined, chainable);
};});
});
jQuery.each([
"ajaxStart",
"ajaxStop",
"ajaxComplete",
"ajaxError",
"ajaxSuccess",
"ajaxSend"
], function(_i, type){
jQuery.fn[ type ]=function(fn){
return this.on(type, fn);
};});
jQuery.fn.extend({
bind: function(types, data, fn){
return this.on(types, null, data, fn);
},
unbind: function(types, fn){
return this.off(types, null, fn);
},
delegate: function(selector, types, data, fn){
return this.on(types, selector, data, fn);
},
undelegate: function(selector, types, fn){
return arguments.length===1 ?
this.off(selector, "**") :
this.off(types, selector||"**", fn);
},
hover: function(fnOver, fnOut){
return this
.on("mouseenter", fnOver)
.on("mouseleave", fnOut||fnOver);
}});
jQuery.each(("blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu").split(" "),
function(_i, name){
jQuery.fn[ name ]=function(data, fn){
return arguments.length > 0 ?
this.on(name, null, data, fn) :
this.trigger(name);
};}
);
var rtrim=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
jQuery.proxy=function(fn, context){
var tmp, args, proxy;
if(typeof context==="string"){
tmp=fn[ context ];
context=fn;
fn=tmp;
}
if(!isFunction(fn) ){
return undefined;
}
args=slice.call(arguments, 2);
proxy=function(){
return fn.apply(context||this, args.concat(slice.call(arguments) ));
};
proxy.guid=fn.guid=fn.guid||jQuery.guid++;
return proxy;
};
jQuery.holdReady=function(hold){
if(hold){
jQuery.readyWait++;
}else{
jQuery.ready(true);
}};
jQuery.isArray=Array.isArray;
jQuery.parseJSON=JSON.parse;
jQuery.nodeName=nodeName;
jQuery.isFunction=isFunction;
jQuery.isWindow=isWindow;
jQuery.camelCase=camelCase;
jQuery.type=toType;
jQuery.now=Date.now;
jQuery.isNumeric=function(obj){
var type=jQuery.type(obj);
return(type==="number"||type==="string") &&
!isNaN(obj - parseFloat(obj) );
};
jQuery.trim=function(text){
return text==null ?
"" :
(text + "").replace(rtrim, "$1");
};
if(typeof define==="function"&&define.amd){
define("jquery", [], function(){
return jQuery;
});
}
var
_jQuery=window.jQuery,
_$=window.$;
jQuery.noConflict=function(deep){
if(window.$===jQuery){
window.$=_$;
}
if(deep&&window.jQuery===jQuery){
window.jQuery=_jQuery;
}
return jQuery;
};
if(typeof noGlobal==="undefined"){
window.jQuery=window.$=jQuery;
}
return jQuery;
});
jQuery.noConflict();
(function(factory){
"use strict";
if(typeof define==="function"&&define.amd){
define([ "jquery" ], function(jQuery){
return factory(jQuery, window);
});
}else if(typeof module==="object"&&module.exports){
module.exports=factory(require("jquery"), window);
}else{
factory(jQuery, window);
}})(function(jQuery, window){
"use strict";
jQuery.migrateVersion="3.4.1";
function compareVersions(v1, v2){
var i,
rVersionParts=/^(\d+)\.(\d+)\.(\d+)/,
v1p=rVersionParts.exec(v1)||[ ],
v2p=rVersionParts.exec(v2)||[ ];
for(i=1; i <=3; i++){
if(+v1p[ i ] > +v2p[ i ]){
return 1;
}
if(+v1p[ i ] < +v2p[ i ]){
return -1;
}}
return 0;
}
function jQueryVersionSince(version){
return compareVersions(jQuery.fn.jquery, version) >=0;
}
var disabledPatches=Object.create(null);
jQuery.migrateDisablePatches=function(){
var i;
for(i=0; i < arguments.length; i++){
disabledPatches[ arguments[ i ] ]=true;
}};
jQuery.migrateEnablePatches=function(){
var i;
for(i=0; i < arguments.length; i++){
delete disabledPatches[ arguments[ i ] ];
}};
jQuery.migrateIsPatchEnabled=function(patchCode){
return !disabledPatches[ patchCode ];
};
(function(){
if(!window.console||!window.console.log){
return;
}
if(!jQuery||!jQueryVersionSince("3.0.0") ||
jQueryVersionSince("5.0.0") ){
window.console.log("JQMIGRATE: jQuery 3.x-4.x REQUIRED");
}
if(jQuery.migrateWarnings){
window.console.log("JQMIGRATE: Migrate plugin loaded multiple times");
}
window.console.log("JQMIGRATE: Migrate is installed" +
(jQuery.migrateMute ? "":" with logging active") +
", version " + jQuery.migrateVersion);
})();
var warnedAbout={};
jQuery.migrateDeduplicateWarnings=true;
jQuery.migrateWarnings=[];
if(jQuery.migrateTrace===undefined){
jQuery.migrateTrace=true;
}
jQuery.migrateReset=function(){
warnedAbout={};
jQuery.migrateWarnings.length=0;
};
function migrateWarn(code, msg){
var console=window.console;
if(jQuery.migrateIsPatchEnabled(code) &&
(!jQuery.migrateDeduplicateWarnings||!warnedAbout[ msg ]) ){
warnedAbout[ msg ]=true;
jQuery.migrateWarnings.push(msg + " [" + code + "]");
if(console&&console.warn&&!jQuery.migrateMute){
console.warn("JQMIGRATE: " + msg);
if(jQuery.migrateTrace&&console.trace){
console.trace();
}}
}}
function migrateWarnProp(obj, prop, value, code, msg){
Object.defineProperty(obj, prop, {
configurable: true,
enumerable: true,
get: function(){
migrateWarn(code, msg);
return value;
},
set: function(newValue){
migrateWarn(code, msg);
value=newValue;
}});
}
function migrateWarnFuncInternal(obj, prop, newFunc, code, msg){
var finalFunc,
origFunc=obj[ prop ];
obj[ prop ]=function(){
if(msg){
migrateWarn(code, msg);
}
finalFunc=jQuery.migrateIsPatchEnabled(code) ?
newFunc :
(origFunc||jQuery.noop);
return finalFunc.apply(this, arguments);
};}
function migratePatchAndWarnFunc(obj, prop, newFunc, code, msg){
if(!msg){
throw new Error("No warning message provided");
}
return migrateWarnFuncInternal(obj, prop, newFunc, code, msg);
}
function migratePatchFunc(obj, prop, newFunc, code){
return migrateWarnFuncInternal(obj, prop, newFunc, code);
}
if(window.document.compatMode==="BackCompat"){
migrateWarn("quirks", "jQuery is not compatible with Quirks Mode");
}
var findProp,
class2type={},
oldInit=jQuery.fn.init,
oldFind=jQuery.find,
rattrHashTest=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
rattrHashGlob=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
rtrim=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
migratePatchFunc(jQuery.fn, "init", function(arg1){
var args=Array.prototype.slice.call(arguments);
if(jQuery.migrateIsPatchEnabled("selector-empty-id") &&
typeof arg1==="string"&&arg1==="#"){
migrateWarn("selector-empty-id", "jQuery('#') is not a valid selector");
args[ 0 ]=[];
}
return oldInit.apply(this, args);
}, "selector-empty-id");
jQuery.fn.init.prototype=jQuery.fn;
migratePatchFunc(jQuery, "find", function(selector){
var args=Array.prototype.slice.call(arguments);
if(typeof selector==="string"&&rattrHashTest.test(selector) ){
try {
window.document.querySelector(selector);
} catch(err1){
selector=selector.replace(rattrHashGlob, function(_, attr, op, value){
return "[" + attr + op + "\"" + value + "\"]";
});
try {
window.document.querySelector(selector);
migrateWarn("selector-hash",
"Attribute selector with '#' must be quoted: " + args[ 0 ]);
args[ 0 ]=selector;
} catch(err2){
migrateWarn("selector-hash",
"Attribute selector with '#' was not fixed: " + args[ 0 ]);
}}
}
return oldFind.apply(this, args);
}, "selector-hash");
for(findProp in oldFind){
if(Object.prototype.hasOwnProperty.call(oldFind, findProp) ){
jQuery.find[ findProp ]=oldFind[ findProp ];
}}
migratePatchAndWarnFunc(jQuery.fn, "size", function(){
return this.length;
}, "size",
"jQuery.fn.size() is deprecated and removed; use the .length property");
migratePatchAndWarnFunc(jQuery, "parseJSON", function(){
return JSON.parse.apply(null, arguments);
}, "parseJSON",
"jQuery.parseJSON is deprecated; use JSON.parse");
migratePatchAndWarnFunc(jQuery, "holdReady", jQuery.holdReady,
"holdReady", "jQuery.holdReady is deprecated");
migratePatchAndWarnFunc(jQuery, "unique", jQuery.uniqueSort,
"unique", "jQuery.unique is deprecated; use jQuery.uniqueSort");
migrateWarnProp(jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos",
"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos");
migrateWarnProp(jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos",
"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos");
if(jQueryVersionSince("3.1.1") ){
migratePatchAndWarnFunc(jQuery, "trim", function(text){
return text==null ?
"" :
(text + "").replace(rtrim, "$1");
}, "trim",
"jQuery.trim is deprecated; use String.prototype.trim");
}
if(jQueryVersionSince("3.2.0") ){
migratePatchAndWarnFunc(jQuery, "nodeName", function(elem, name){
return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase();
}, "nodeName",
"jQuery.nodeName is deprecated");
migratePatchAndWarnFunc(jQuery, "isArray", Array.isArray, "isArray",
"jQuery.isArray is deprecated; use Array.isArray"
);
}
if(jQueryVersionSince("3.3.0") ){
migratePatchAndWarnFunc(jQuery, "isNumeric", function(obj){
var type=typeof obj;
return(type==="number"||type==="string") &&
!isNaN(obj - parseFloat(obj) );
}, "isNumeric",
"jQuery.isNumeric() is deprecated"
);
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".
split(" "),
function(_, name){
class2type[ "[object " + name + "]" ]=name.toLowerCase();
});
migratePatchAndWarnFunc(jQuery, "type", function(obj){
if(obj==null){
return obj + "";
}
return typeof obj==="object"||typeof obj==="function" ?
class2type[ Object.prototype.toString.call(obj) ]||"object" :
typeof obj;
}, "type",
"jQuery.type is deprecated");
migratePatchAndWarnFunc(jQuery, "isFunction",
function(obj){
return typeof obj==="function";
}, "isFunction",
"jQuery.isFunction() is deprecated");
migratePatchAndWarnFunc(jQuery, "isWindow",
function(obj){
return obj!=null&&obj===obj.window;
}, "isWindow",
"jQuery.isWindow() is deprecated"
);
}
if(jQuery.ajax){
var oldAjax=jQuery.ajax,
rjsonp=/(=)\?(?=&|$)|\?\?/;
migratePatchFunc(jQuery, "ajax", function(){
var jQXHR=oldAjax.apply(this, arguments);
if(jQXHR.promise){
migratePatchAndWarnFunc(jQXHR, "success", jQXHR.done, "jqXHR-methods",
"jQXHR.success is deprecated and removed");
migratePatchAndWarnFunc(jQXHR, "error", jQXHR.fail, "jqXHR-methods",
"jQXHR.error is deprecated and removed");
migratePatchAndWarnFunc(jQXHR, "complete", jQXHR.always, "jqXHR-methods",
"jQXHR.complete is deprecated and removed");
}
return jQXHR;
}, "jqXHR-methods");
if(!jQueryVersionSince("4.0.0") ){
jQuery.ajaxPrefilter("+json", function(s){
if(s.jsonp!==false&&(rjsonp.test(s.url) ||
typeof s.data==="string" &&
(s.contentType||"")
.indexOf("application/x-www-form-urlencoded")===0 &&
rjsonp.test(s.data)
)){
migrateWarn("jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated");
}});
}}
var oldRemoveAttr=jQuery.fn.removeAttr,
oldToggleClass=jQuery.fn.toggleClass,
rmatchNonSpace=/\S+/g;
migratePatchFunc(jQuery.fn, "removeAttr", function(name){
var self=this,
patchNeeded=false;
jQuery.each(name.match(rmatchNonSpace), function(_i, attr){
if(jQuery.expr.match.bool.test(attr) ){
self.each(function(){
if(jQuery(this).prop(attr)!==false){
patchNeeded=true;
return false;
}});
}
if(patchNeeded){
migrateWarn("removeAttr-bool",
"jQuery.fn.removeAttr no longer sets boolean properties: " + attr);
self.prop(attr, false);
}});
return oldRemoveAttr.apply(this, arguments);
}, "removeAttr-bool");
migratePatchFunc(jQuery.fn, "toggleClass", function(state){
if(state!==undefined&&typeof state!=="boolean"){
return oldToggleClass.apply(this, arguments);
}
migrateWarn("toggleClass-bool", "jQuery.fn.toggleClass(boolean) is deprecated");
return this.each(function(){
var className=this.getAttribute&&this.getAttribute("class")||"";
if(className){
jQuery.data(this, "__className__", className);
}
if(this.setAttribute){
this.setAttribute("class",
className||state===false ?
"" :
jQuery.data(this, "__className__")||""
);
}});
}, "toggleClass-bool");
function camelCase(string){
return string.replace(/-([a-z])/g, function(_, letter){
return letter.toUpperCase();
});
}
var origFnCss, internalCssNumber,
internalSwapCall=false,
ralphaStart=/^[a-z]/,
rautoPx=/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
if(jQuery.swap){
jQuery.each([ "height", "width", "reliableMarginRight" ], function(_, name){
var oldHook=jQuery.cssHooks[ name ]&&jQuery.cssHooks[ name ].get;
if(oldHook){
jQuery.cssHooks[ name ].get=function(){
var ret;
internalSwapCall=true;
ret=oldHook.apply(this, arguments);
internalSwapCall=false;
return ret;
};}});
}
migratePatchFunc(jQuery, "swap", function(elem, options, callback, args){
var ret, name,
old={};
if(!internalSwapCall){
migrateWarn("swap", "jQuery.swap() is undocumented and deprecated");
}
for(name in options){
old[ name ]=elem.style[ name ];
elem.style[ name ]=options[ name ];
}
ret=callback.apply(elem, args||[]);
for(name in options){
elem.style[ name ]=old[ name ];
}
return ret;
}, "swap");
if(jQueryVersionSince("3.4.0")&&typeof Proxy!=="undefined"){
jQuery.cssProps=new Proxy(jQuery.cssProps||{}, {
set: function(){
migrateWarn("cssProps", "jQuery.cssProps is deprecated");
return Reflect.set.apply(this, arguments);
}});
}
if(jQueryVersionSince("4.0.0") ){
internalCssNumber={
animationIterationCount: true,
columnCount: true,
fillOpacity: true,
flexGrow: true,
flexShrink: true,
fontWeight: true,
gridArea: true,
gridColumn: true,
gridColumnEnd: true,
gridColumnStart: true,
gridRow: true,
gridRowEnd: true,
gridRowStart: true,
lineHeight: true,
opacity: true,
order: true,
orphans: true,
widows: true,
zIndex: true,
zoom: true
};
if(typeof Proxy!=="undefined"){
jQuery.cssNumber=new Proxy(internalCssNumber, {
get: function(){
migrateWarn("css-number", "jQuery.cssNumber is deprecated");
return Reflect.get.apply(this, arguments);
},
set: function(){
migrateWarn("css-number", "jQuery.cssNumber is deprecated");
return Reflect.set.apply(this, arguments);
}});
}else{
jQuery.cssNumber=internalCssNumber;
}}else{
internalCssNumber=jQuery.cssNumber;
}
function isAutoPx(prop){
return ralphaStart.test(prop) &&
rautoPx.test(prop[ 0 ].toUpperCase() + prop.slice(1) );
}
origFnCss=jQuery.fn.css;
migratePatchFunc(jQuery.fn, "css", function(name, value){
var camelName,
origThis=this;
if(name&&typeof name==="object"&&!Array.isArray(name) ){
jQuery.each(name, function(n, v){
jQuery.fn.css.call(origThis, n, v);
});
return this;
}
if(typeof value==="number"){
camelName=camelCase(name);
if(!isAutoPx(camelName)&&!internalCssNumber[ camelName ]){
migrateWarn("css-number",
"Number-typed values are deprecated for jQuery.fn.css(\"" +
name + "\", value)");
}}
return origFnCss.apply(this, arguments);
}, "css-number");
var origData=jQuery.data;
migratePatchFunc(jQuery, "data", function(elem, name, value){
var curData, sameKeys, key;
if(name&&typeof name==="object"&&arguments.length===2){
curData=jQuery.hasData(elem)&&origData.call(this, elem);
sameKeys={};
for(key in name){
if(key!==camelCase(key) ){
migrateWarn("data-camelCase",
"jQuery.data() always sets/gets camelCased names: " + key);
curData[ key ]=name[ key ];
}else{
sameKeys[ key ]=name[ key ];
}}
origData.call(this, elem, sameKeys);
return name;
}
if(name&&typeof name==="string"&&name!==camelCase(name) ){
curData=jQuery.hasData(elem)&&origData.call(this, elem);
if(curData&&name in curData){
migrateWarn("data-camelCase",
"jQuery.data() always sets/gets camelCased names: " + name);
if(arguments.length > 2){
curData[ name ]=value;
}
return curData[ name ];
}}
return origData.apply(this, arguments);
}, "data-camelCase");
if(jQuery.fx){
var intervalValue, intervalMsg,
oldTweenRun=jQuery.Tween.prototype.run,
linearEasing=function(pct){
return pct;
};
migratePatchFunc(jQuery.Tween.prototype, "run", function(){
if(jQuery.easing[ this.easing ].length > 1){
migrateWarn(
"easing-one-arg",
"'jQuery.easing." + this.easing.toString() + "' should use only one argument"
);
jQuery.easing[ this.easing ]=linearEasing;
}
oldTweenRun.apply(this, arguments);
}, "easing-one-arg");
intervalValue=jQuery.fx.interval;
intervalMsg="jQuery.fx.interval is deprecated";
if(window.requestAnimationFrame){
Object.defineProperty(jQuery.fx, "interval", {
configurable: true,
enumerable: true,
get: function(){
if(!window.document.hidden){
migrateWarn("fx-interval", intervalMsg);
}
if(!jQuery.migrateIsPatchEnabled("fx-interval") ){
return intervalValue;
}
return intervalValue===undefined ? 13:intervalValue;
},
set: function(newValue){
migrateWarn("fx-interval", intervalMsg);
intervalValue=newValue;
}});
}}
var oldLoad=jQuery.fn.load,
oldEventAdd=jQuery.event.add,
originalFix=jQuery.event.fix;
jQuery.event.props=[];
jQuery.event.fixHooks={};
migrateWarnProp(jQuery.event.props, "concat", jQuery.event.props.concat,
"event-old-patch",
"jQuery.event.props.concat() is deprecated and removed");
migratePatchFunc(jQuery.event, "fix", function(originalEvent){
var event,
type=originalEvent.type,
fixHook=this.fixHooks[ type ],
props=jQuery.event.props;
if(props.length){
migrateWarn("event-old-patch",
"jQuery.event.props are deprecated and removed: " + props.join());
while(props.length){
jQuery.event.addProp(props.pop());
}}
if(fixHook&&!fixHook._migrated_){
fixHook._migrated_=true;
migrateWarn("event-old-patch",
"jQuery.event.fixHooks are deprecated and removed: " + type);
if(( props=fixHook.props)&&props.length){
while(props.length){
jQuery.event.addProp(props.pop());
}}
}
event=originalFix.call(this, originalEvent);
return fixHook&&fixHook.filter ?
fixHook.filter(event, originalEvent) :
event;
}, "event-old-patch");
migratePatchFunc(jQuery.event, "add", function(elem, types){
if(elem===window&&types==="load"&&window.document.readyState==="complete"){
migrateWarn("load-after-event",
"jQuery(window).on('load'...) called after load event occurred");
}
return oldEventAdd.apply(this, arguments);
}, "load-after-event");
jQuery.each([ "load", "unload", "error" ], function(_, name){
migratePatchFunc(jQuery.fn, name, function(){
var args=Array.prototype.slice.call(arguments, 0);
if(name==="load"&&typeof args[ 0 ]==="string"){
return oldLoad.apply(this, args);
}
migrateWarn("shorthand-removed-v3",
"jQuery.fn." + name + "() is deprecated");
args.splice(0, 0, name);
if(arguments.length){
return this.on.apply(this, args);
}
this.triggerHandler.apply(this, args);
return this;
}, "shorthand-removed-v3");
});
jQuery.each(( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu").split(" "),
function(_i, name){
migratePatchAndWarnFunc(jQuery.fn, name, function(data, fn){
return arguments.length > 0 ?
this.on(name, null, data, fn) :
this.trigger(name);
},
"shorthand-deprecated-v3",
"jQuery.fn." + name + "() event shorthand is deprecated");
});
jQuery(function(){
jQuery(window.document).triggerHandler("ready");
});
jQuery.event.special.ready={
setup: function(){
if(this===window.document){
migrateWarn("ready-event", "'ready' event is deprecated");
}}
};
migratePatchAndWarnFunc(jQuery.fn, "bind", function(types, data, fn){
return this.on(types, null, data, fn);
}, "pre-on-methods", "jQuery.fn.bind() is deprecated");
migratePatchAndWarnFunc(jQuery.fn, "unbind", function(types, fn){
return this.off(types, null, fn);
}, "pre-on-methods", "jQuery.fn.unbind() is deprecated");
migratePatchAndWarnFunc(jQuery.fn, "delegate", function(selector, types, data, fn){
return this.on(types, selector, data, fn);
}, "pre-on-methods", "jQuery.fn.delegate() is deprecated");
migratePatchAndWarnFunc(jQuery.fn, "undelegate", function(selector, types, fn){
return arguments.length===1 ?
this.off(selector, "**") :
this.off(types, selector||"**", fn);
}, "pre-on-methods", "jQuery.fn.undelegate() is deprecated");
migratePatchAndWarnFunc(jQuery.fn, "hover", function(fnOver, fnOut){
return this.on("mouseenter", fnOver).on("mouseleave", fnOut||fnOver);
}, "pre-on-methods", "jQuery.fn.hover() is deprecated");
var rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
makeMarkup=function(html){
var doc=window.document.implementation.createHTMLDocument("");
doc.body.innerHTML=html;
return doc.body&&doc.body.innerHTML;
},
warnIfChanged=function(html){
var changed=html.replace(rxhtmlTag, "<$1></$2>");
if(changed!==html&&makeMarkup(html)!==makeMarkup(changed) ){
migrateWarn("self-closed-tags",
"HTML tags must be properly nested and closed: " + html);
}};
jQuery.UNSAFE_restoreLegacyHtmlPrefilter=function(){
jQuery.migrateEnablePatches("self-closed-tags");
};
migratePatchFunc(jQuery, "htmlPrefilter", function(html){
warnIfChanged(html);
return html.replace(rxhtmlTag, "<$1></$2>");
}, "self-closed-tags");
jQuery.migrateDisablePatches("self-closed-tags");
var origOffset=jQuery.fn.offset;
migratePatchFunc(jQuery.fn, "offset", function(){
var elem=this[ 0 ];
if(elem&&(!elem.nodeType||!elem.getBoundingClientRect) ){
migrateWarn("offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element");
return arguments.length ? this:undefined;
}
return origOffset.apply(this, arguments);
}, "offset-valid-elem");
if(jQuery.ajax){
var origParam=jQuery.param;
migratePatchFunc(jQuery, "param", function(data, traditional){
var ajaxTraditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional;
if(traditional===undefined&&ajaxTraditional){
migrateWarn("param-ajax-traditional",
"jQuery.param() no longer uses jQuery.ajaxSettings.traditional");
traditional=ajaxTraditional;
}
return origParam.call(this, data, traditional);
}, "param-ajax-traditional");
}
migratePatchAndWarnFunc(jQuery.fn, "andSelf", jQuery.fn.addBack, "andSelf",
"jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()");
if(jQuery.Deferred){
var oldDeferred=jQuery.Deferred,
tuples=[
[ "resolve", "done", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "resolved" ],
[ "reject", "fail", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "rejected" ],
[ "notify", "progress", jQuery.Callbacks("memory"),
jQuery.Callbacks("memory") ]
];
migratePatchFunc(jQuery, "Deferred", function(func){
var deferred=oldDeferred(),
promise=deferred.promise();
function newDeferredPipe(){
var fns=arguments;
return jQuery.Deferred(function(newDefer){
jQuery.each(tuples, function(i, tuple){
var fn=typeof fns[ i ]==="function"&&fns[ i ];
deferred[ tuple[ 1 ] ](function(){
var returned=fn&&fn.apply(this, arguments);
if(returned&&typeof returned.promise==="function"){
returned.promise()
.done(newDefer.resolve)
.fail(newDefer.reject)
.progress(newDefer.notify);
}else{
newDefer[ tuple[ 0 ] + "With" ](
this===promise ? newDefer.promise():this,
fn ? [ returned ]:arguments
);
}});
});
fns=null;
}).promise();
}
migratePatchAndWarnFunc(deferred, "pipe", newDeferredPipe, "deferred-pipe",
"deferred.pipe() is deprecated");
migratePatchAndWarnFunc(promise, "pipe", newDeferredPipe, "deferred-pipe",
"deferred.pipe() is deprecated");
if(func){
func.call(deferred, deferred);
}
return deferred;
}, "deferred-pipe");
jQuery.Deferred.exceptionHook=oldDeferred.exceptionHook;
}
return jQuery;
});
document.addEventListener("DOMContentLoaded", function (){
var lastScrollTop=0;
if(document.getElementById('header')){
window.addEventListener('scroll', function (){
var st=window.pageYOffset||document.documentElement.scrollTop;
if(st > lastScrollTop){
document.getElementById('header').classList.add('scroll-down');
}else if(st < lastScrollTop){
document.getElementById('header').classList.remove('scroll-down');
}
lastScrollTop=st <=0 ? 0:st;
if(window.scrollY > 100){
document.getElementById('header').classList.add('cs-header-fixed-top');
document.body.classList.add('header-is-fixed');
}else{
document.getElementById('header').classList.remove('cs-header-fixed-top');
document.body.style.paddingTop='0';
document.body.classList.remove('header-is-fixed');
}});
}
document.querySelectorAll('.cs-tab').forEach((el)=> {
el.addEventListener('click', function (event){
const list=document.getElementsByClassName('cs-tab');
for (let item of list){
item.dataset.selected='false';
}
const list_tab=document.getElementsByClassName('cs-post-tab');
for (let item of list_tab){
item.classList.add('d-none');
}
document.getElementById(event.target.getAttribute('data-category')).classList.remove('d-none');
event.target.setAttribute('data-selected', 'true');
console.log(event.target.getAttribute('data-selected'))
})
})
});
document.addEventListener("DOMContentLoaded", function(){
(function (){
'use strict'
var forms=document.querySelectorAll('.needs-validation')
Array.prototype.slice.call(forms)
.forEach(function (form){
form.addEventListener('submit', function (event){
if(!form.checkValidity()){
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
var form=document.getElementById('sendRequest');
if(form){
form.addEventListener('submit', function(event){
document.getElementById('spinner').innerHTML='<div class="spinner-border" role="status"><span class="sr-only"></span></div>'
document.getElementById('submitButton').classList.add('disabled')
if(form.checkValidity()===false){
event.preventDefault();
event.stopPropagation();
document.getElementById('spinner').innerHTML='';
document.getElementById('submitButton').classList.remove('disabled');
}else{
form.classList.add('was-validated');
event.preventDefault();
event.stopPropagation();
grecaptcha.ready(function(){
grecaptcha.execute('6Lcn69kgAAAAABT82xVWxshJNDp7RcrSVLxQsT17', {action: 'submit'}).then(function(token){
var formData=new FormData()
formData.append('action', document.getElementById('ActionForm').value)
formData.append('user_name', document.getElementById('InfoFormName').value)
formData.append('user_course',  document.getElementById('InfoFormCourse')?.value ?? '')
formData.append('user_course_link', document.getElementById('InfoFormCourseLink')?.value ?? '')
formData.append('user_surname',  document.getElementById('InfoFormSurname').value)
formData.append('user_phone', document.getElementById('InfoFormPhone')?.value ?? '')
formData.append('user_email', document.getElementById('InfoFormEmail').value)
formData.append('user_newsletter', document.getElementById('InfoFormNewsletter').checked ?? false)
formData.append('user_message', document.getElementById('InfoFormMessage')?.value ?? '')
if(document.getElementById('sendRequestFile')){
for (let i=0; i < document.getElementById('sendRequestFile').files.length; i++){
let file=document.getElementById('sendRequestFile').files.item(i);
console.log(file.name);
formData.append('user_file_' +  i, file);
}
formData.append('user_file', document.getElementById('sendRequestFile').files.length);
}
if(document.getElementById('InfoFormOrder')){
formData.append('user_order', document.getElementById('InfoFormOrder').value ?? '');
}
var ajaxurl=document.getElementById('adminUrl').value;
$.ajax({
method: 'post',
processData: false,
contentType: false,
cache: false,
data: formData,
enctype: 'multipart/form-data',
url: ajaxurl,
success: function (response){
console.log(response.body)
document.getElementById('spinner').innerHTML=''
setTimeout(()=> {
document.getElementById('successResponse').innerHTML='Email inviata con successo'
document.getElementById('successResponseContainer').classList.remove('d-none')
}, 600)
document.getElementById('successResponseContainer').classList.add('d-none')
document.getElementById('successResponse').innerHTML=''
document.getElementById('submitButton').classList.remove('disabled')
}});
});
});
}});
}
var form_newsletter=document.getElementById('sendRequestNewsletter');
if(form_newsletter){
form_newsletter.addEventListener('submit', function(event){
document.getElementById('spinnerNewsletter').innerHTML='<div class="spinner-border" role="status"><span class="sr-only"></span></div>'
document.getElementById('submitButton').classList.add('disabled')
if(form_newsletter.checkValidity()===false){
event.preventDefault();
event.stopPropagation();
document.getElementById('spinnerNewsletter').innerHTML='';
document.getElementById('submitButton').classList.remove('disabled');
}else{
form_newsletter.classList.add('was-validated');
event.preventDefault();
event.stopPropagation();
var formData=new FormData();
formData.append('action', 'send_newsletter')
formData.append('email', document.getElementById('newsletterEmail').value)
var ajaxurl=document.getElementById('adminUrl').value;
$.ajax({
method: 'post',
processData: false,
contentType: false,
cache: false,
data: formData,
enctype: 'multipart/form-data',
url: ajaxurl,
success: function (response){
document.getElementById('spinnerNewsletter').innerHTML=''
setTimeout(()=> {
document.getElementById('successResponseNewsletter').innerHTML='Iscrizione effettuata'
document.getElementById('successResponseNewsletterContainer').classList.remove('d-none')
}, 600)
document.getElementById('successResponseNewsletterContainer').classList.add('d-none')
document.getElementById('successResponseNewsletter').innerHTML=''
document.getElementById('submitButton').classList.remove('disabled')
}});
}});
}
var form_newsletter_modal=document.getElementById('sendRequestNewsletterModal');
if(form_newsletter_modal){
form_newsletter_modal.addEventListener('submit', function(event){
document.getElementById('spinnerNewsletterModal').innerHTML='<div class="spinner-border" role="status"><span class="sr-only"></span></div>'
document.getElementById('submitButton').classList.add('disabled')
if(form_newsletter_modal.checkValidity()===false){
event.preventDefault();
event.stopPropagation();
document.getElementById('spinnerNewsletterModal').innerHTML='';
}else{
form_newsletter_modal.classList.add('was-validated');
event.preventDefault();
event.stopPropagation();
var formData=new FormData();
formData.append('action', 'send_newsletter')
formData.append('email', document.getElementById('newsletterEmailModal').value)
var ajaxurl=document.getElementById('adminUrl').value;
$.ajax({
method: 'post',
processData: false,
contentType: false,
cache: false,
data: formData,
enctype: 'multipart/form-data',
url: ajaxurl,
success: function (response){
document.getElementById('spinnerNewsletterModal').innerHTML=''
setTimeout(()=> {
document.getElementById('successResponseNewsletterModal').innerHTML='Iscrizione effettuata'
document.getElementById('successResponseNewsletterModalContainer').classList.remove('d-none')
}, 600)
document.getElementById('successResponseNewsletterModalContainer').classList.add('d-none')
document.getElementById('successResponseNewsletterModal').innerHTML=''
document.getElementById('submitButtonModal').classList.remove('disabled')
}});
}});
}
const files=document.getElementById('sendRequestFile');
if(files){
files.addEventListener('change', (event)=> {
document.getElementById('fileUploaded').innerHTML='';
for (const [key, value] of Object.entries(event.target.files)){
document.getElementById('fileUploaded').innerHTML +='<p class="mb-1" data-file="' + key + '">' + value.name + '</p>';
}})
}})
function dropHandler(ev){
console.log('File(s) dropped');
ev.preventDefault();
if(ev.dataTransfer.items){
for (let i=0; i < ev.dataTransfer.items.length; i++){
if(ev.dataTransfer.items[i].kind==='file'){
document.getElementById('drop_zone').style.border="";
document.getElementById('drop_zone').style.backgroundColor="";
const file=ev.dataTransfer.items[i].getAsFile();
document.getElementById('sendRequestFile').files=ev.dataTransfer.files;
console.log('... file[' + i + '].name=' + file.name);
document.getElementById('fileUploaded').innerHTML='';
for (const [key, value] of Object.entries(document.getElementById('sendRequestFile').files)){
document.getElementById('fileUploaded').innerHTML +='<p class="mb-1" data-file="' + key + '">' + value.name + '</p>';
}}
}}else{
for (let i=0; i < ev.dataTransfer.files.length; i++){
console.log('... file[' + i + '].name=' + ev.dataTransfer.files[i].name);
}}
}
function dragOverHandler(ev){
console.log('File(s) in drop zone');
ev.preventDefault();
document.getElementById('drop_zone').style.border="2px solid #56af43";
document.getElementById('drop_zone').style.backgroundColor="#868686";
}
function clickHandler(ev){
document.getElementById('sendRequestFile').click();
};
document.addEventListener("DOMContentLoaded", function (){
if(!document.body.classList.contains("position-loaded")){
document.body.classList.add("position-loaded");
const currentPositions=document.querySelectorAll(".current-position");
for (let i=0; i < currentPositions.length; i++){
currentPositions[i].addEventListener("click", function (e){
e.preventDefault();
var isJustPosition=currentPositions[i].classList.contains("just-position");
if(directBooking&&!isJustPosition){
return;
}
navigator.geolocation.getCurrentPosition(function (pos){
var lat=pos.coords.latitude;
var lng=pos.coords.longitude;
var latlng=lat + "," + lng;
var inputPos =
currentPositions[i].previousElementSibling &&
currentPositions[i].previousElementSibling.querySelector
? currentPositions[i].previousElementSibling.querySelector('input[type="text"]'
)
: null;
if(inputPos==null){
inputPos =
currentPositions[i].parentNode.querySelector('input[type="text"]'
);
if(inputPos==null){
inputPos =
currentPositions[i].parentNode.parentNode.querySelector('input[type="text"]'
);
}}
if(!inputPos||inputPos.disabled){
return;
}
var isBookingAddress=inputPos.classList.contains("booking-address");
if(isBookingAddress){
var latField=inputPos.parentNode.querySelector(".booking-lat");
var lngField=inputPos.parentNode.querySelector(".booking-lng");
if(!latField){
latField=document.createElement("input");
latField.type="hidden";
latField.className="booking-lat";
inputPos.parentNode.insertBefore(latField, inputPos.nextSibling);
}
if(!lngField){
lngField=document.createElement("input");
lngField.type="hidden";
lngField.className="booking-lng";
inputPos.parentNode.insertBefore(lngField, latField.nextSibling);
}
latField.value=lat;
lngField.value=lng;
}
var justPosition=isJustPosition;
var cta=inputPos.parentNode.parentNode.querySelector(".cta");
if(cta==null){
cta =
inputPos.parentNode.parentNode.parentNode.querySelector(".cta"
);
}
if(!isJustPosition){
justPosition=false;
getLocationLatLng(latlng, inputPos, justPosition);
}else if(isBookingAddress){
inputPos.classList.add("input-loading");
if(cta){
cta.classList.add("cta-loading");
}
getLocationLatLng(latlng, inputPos, true, true);
}else{
inputPos.value=latlng;
if(justPosition){
inputPos.disabled=true;
if(cta){
cta.classList.add("cta-loading");
}}
inputPos.classList.add("input-loading");
}},
function (err){
alert('Non è stato possibile recuperare la tua posizione. Riprova più tardi.');
console.warn(`ERROR(${err.code}): ${err.message}`);
},
{
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 300_000,
}
);
});
var cta=currentPositions[i].parentNode.parentNode.querySelector(".cta");
if(cta==null)
cta =
currentPositions[i].parentNode.parentNode.parentNode.querySelector(".cta"
);
if(cta!=null){
cta.addEventListener("click", function (e){
if(!directBooking){
if(!this.classList.contains("cta-loading")){
var inputPos =
currentPositions[i].previousElementSibling &&
currentPositions[i].previousElementSibling.querySelector
? currentPositions[i].previousElementSibling.querySelector('input[type="text"]'
)
: null;
if(inputPos==null){
inputPos =
currentPositions[i].parentNode.querySelector('input[type="text"]'
);
if(inputPos==null){
inputPos =
currentPositions[i].parentNode.parentNode.querySelector('input[type="text"]'
);
}}
if(inputPos.value==""){
}else{
this.classList.add("cta-loading");
inputPos.disabled=true;
if(this.classList.contains("landing-shortcode-search")){
getClinics(inputPos, true);
}else{
getClinics(inputPos);
}}
}
e.preventDefault();
}});
}}
if(document.getElementById("location-search-input")!=null){
document
.getElementById("location-search-input")
.addEventListener("keydown", function (event){
if(event.keyCode===13){
event.preventDefault();
document.getElementById("location-search-button").click();
}});
}
if(document.getElementById("call-current-position-input")!=null){
document
.getElementById("call-current-position-input")
.addEventListener("keydown", function (event){
if(event.keyCode===13){
event.preventDefault();
document.getElementById("call-current-position-btn").click();
}});
}
if(document.querySelector(".centri input")!=null){
document
.querySelector(".centri input")
.addEventListener("keydown", function (event){
if(event.keyCode===13){
event.preventDefault();
document.querySelector(".centri button").click();
}});
}
var bookingAddresses=document.querySelectorAll(".page-booking input.address"
);
for (let e=0; e < bookingAddresses.length; e++){
bookingAddresses[e].addEventListener("keydown", function (event){
if(event.keyCode===13){
event.preventDefault();
this.parentNode.querySelector("button.booking-search").click();
}});
}
function getLocationLatLng(latlng, input, justPosition, skipCtaClick){
input.classList.add("input-loading");
var grecaptcha_key=document
.getElementById("g-recaptcha")
.getAttribute("src")
.split("render=")[1];
grecaptcha.ready(function (){
grecaptcha
.execute(grecaptcha_key, { action: "submit" })
.then(function (token){
let myData =
"action=dp_get_location_latlng&g-recaptcha-response=" +
token +
"&latlng=" +
latlng;
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4&&this.status==200){
input.value=xhttp.responseText;
var cta=input.parentNode.parentNode.querySelector(".cta");
if(cta==null)
cta =
input.parentNode.parentNode.parentNode.querySelector(".cta"
);
if(!skipCtaClick&&cta){
cta.click();
}
if(justPosition||skipCtaClick){
input.disabled=false;
input.classList.remove("input-loading");
if(cta){
cta.classList.remove("cta-loading");
}}
}};
let link=document.getElementById("ajaxurl").getAttribute("href");
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded; charset=UTF-8"
);
xhttp.send(myData);
});
});
}
function getClinics(input, isShortcode=false){
if(!input.classList.contains("search-nolimit")){
var shortcodeLimit=18;
var shortcodeRange=false;
if(document.querySelector("#shortcode-search-box-container")){
if(input.getAttribute("numero-centri")!=="" &&
input.getAttribute("numero-centri")!==null &&
input.getAttribute("numero-centri")!=false &&
input.getAttribute("numero-centri") > 0
)
shortcodeLimit=input.getAttribute("numero-centri");
}
if(document.querySelector("#shortcode-search-box-container")){
if(input.getAttribute("raggio")!=="" &&
input.getAttribute("raggio")!==null &&
input.getAttribute("raggio")!=false &&
parseFloat(input.getAttribute("raggio").replace(",", ".")) > 0
)
shortcodeRange=Math.floor(parseFloat(input.getAttribute("raggio").replace(",", "."))
);
}
var grecaptcha_key=document
.getElementById("g-recaptcha")
.getAttribute("src")
.split("render=")[1];
grecaptcha.ready(function (){
grecaptcha
.execute(grecaptcha_key, { action: "submit" })
.then(function (token){
let estetica=input.classList.contains("search-estetica")
? "&estetica"
: "";
let count=isShortcode ? "&count=" + shortcodeLimit:"&count=6";
var range=shortcodeRange
? "&range=" + shortcodeRange
: "&range=false";
let myData =
"action=dp_get_clinics&g-recaptcha-response=" +
token +
"&address=" +
input.value +
estetica +
count +
range;
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4&&this.status==200){
var clinics=xhttp.responseText;
input.disabled=false;
input.classList.remove("input-loading");
var cta=input.parentNode.parentNode.querySelector(".cta");
if(cta==null)
cta =
input.parentNode.parentNode.parentNode.querySelector(".cta"
);
cta.classList.remove("cta-loading");
if(isShortcode){
compileClinicsShortcode(clinics, input);
const updatePagedCards=new CustomEvent(
"updatePagedCards",
{
bubbles: true,
cancelable: true,
}
);
document.dispatchEvent(updatePagedCards);
}else{
compileClinics(clinics, input);
}}
};
let link=document
.getElementById("ajaxurl")
.getAttribute("href");
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded; charset=UTF-8"
);
xhttp.send(myData);
});
});
}else{
compileClinics("", input);
}}
function compileClinics(locations, input){
if(document.querySelector(".section-2.tab-yes .locator-results-mine")!=null
){
document
.querySelector(".section-2.tab-yes .locator-results-mine")
.classList.add("hide");
var resultsContainerEl =
input.parentNode.parentNode.parentNode.querySelector(".locator-results"
);
if(resultsContainerEl!=null){
var itemsTemplate=Handlebars.compile(input.parentNode.parentNode.parentNode.querySelector(".locator-results-html"
).innerHTML
);
var resultItemContext={ locations: JSON.parse(locations) };
resultsContainerEl.innerHTML=itemsTemplate(resultItemContext);
bookingBoxes();
}}else if(!document.body.classList.contains("post-type-archive-centro")
){
var resultsContainerEl =
input.parentNode.parentNode.parentNode.querySelector(".locator-results"
);
if(input.closest(".offcanvas-body")){
var newQueryString=editQueryParameters();
var link=input
.closest(".offcanvas-body")
.querySelector(".offcanvas-locator-button");
link.href =
location.protocol +
"//" +
location.hostname +
"/centri/" +
newQueryString +
"location=" +
encodeURIComponent(input.value);
if(!link.classList.contains("show")){
link.classList.add("show");
}}
if(resultsContainerEl!=null){
var itemsTemplate=Handlebars.compile(input.parentNode.parentNode.parentNode.querySelector(".locator-results-html"
).innerHTML
);
var resultItemContext={ locations: JSON.parse(locations) };
resultsContainerEl.innerHTML=itemsTemplate(resultItemContext);
bookingBoxes();
}}else if(document.body.classList.contains("post-type-archive-centro")){
var resultsContainerEl =
input.parentNode.parentNode.parentNode.querySelector(".locator-results"
);
if(input.closest(".offcanvas-body")){
var newQueryString=editQueryParameters();
var link=input
.closest(".offcanvas-body")
.querySelector(".offcanvas-locator-button");
link.href =
location.protocol +
"//" +
location.hostname +
"/centri/" +
newQueryString +
"location=" +
encodeURIComponent(input.value);
if(!link.classList.contains("show")){
link.classList.add("show");
}}
if(input.closest(".tab-content.centri")){
var newQueryString=editQueryParameters();
const stateObj={};
var newURI =
location.protocol +
"//" +
location.hostname +
"/centri/" +
newQueryString +
"location=" +
encodeURIComponent(input.value);
history.replaceState(stateObj, "", newURI);
}
if(resultsContainerEl!=null){
var itemsTemplate=Handlebars.compile(input.parentNode.parentNode.parentNode.querySelector(".locator-results-html"
).innerHTML
);
var resultItemContext={ locations: JSON.parse(locations) };
resultsContainerEl.innerHTML=itemsTemplate(resultItemContext);
bookingBoxes();
}}
}
function editQueryParameters(){
var queryString=window.location.search;
var urlparts=queryString.substring(1).split("&");
newQueryString="?";
if(queryString!==null||queryString!==""){
for (var i=0; i < urlparts.length; i++){
if(urlparts[i].includes("location")) continue;
newQueryString=newQueryString + urlparts[i] + "&";
}}
return newQueryString;
}
function compileClinicsShortcode(locations, input){
Handlebars.registerHelper("chunk", function (context, options){
let out="";
const size=6;
for (let i=0; i < context.length; i +=size){
out +='<div class="col-single-box item">';
out +=context
.slice(i, i + size)
.map(options.fn)
.join("");
out +="</div>";
}
return out;
});
var itemsTemplate=Handlebars.compile(input.parentNode.parentNode.parentNode.querySelector(".locator-results-html-desk"
).innerHTML
);
var resultItemContext={ locations: JSON.parse(locations) };
var resultsContainerEl=input
.closest("#shortcode-maps-container")
.querySelector(".locator-results-desk");
if(resultsContainerEl!=null){
resultsContainerEl.innerHTML=itemsTemplate(resultItemContext);
}
var itemsTemplate=Handlebars.compile(input.parentNode.parentNode.parentNode.querySelector(".locator-results-html"
).innerHTML
);
var resultsContainerEl=input
.closest("#shortcode-maps-container")
.querySelector(".locator-results-mobile");
if(resultsContainerEl!=null){
resultsContainerEl.innerHTML=itemsTemplate(resultItemContext);
}}
function updateDots(event){
var totalItems=event.item.count;
var currentItem=event.item.index + 1;
if($(event.target).hasClass("owl-loaded")){
$(event.target)
.find(".owl-dot")
.each(function (index){
$(this).text(index + 1);
});
}}
}});
function bookingBoxes(){
const pageBooking=document.querySelector(".page-booking");
if(pageBooking!=null){
var formSection2_yes=pageBooking.querySelector(".booking-section.section-2.tab-yes"
);
var formSection2_no=pageBooking.querySelector(".booking-section.section-2.tab-no"
);
var formSection3=pageBooking.querySelector(".booking-section.section-3");
var formSection4=pageBooking.querySelector(".booking-section.section-4");
var bookingLocations=formSection2_yes.querySelectorAll(".box-location");
for (let i=0; i < bookingLocations.length; i++){
if(bookingLocations[i].classList.contains("has-event")){
continue;
}
bookingLocations[i].addEventListener("click", function (){
this.classList.add("has-event");
var code=this.dataset.code;
title=this.querySelector(".box-location-title").innerHTML;
address=this.querySelector(".box-location-address");
if(address!=null){
address=address.innerHTML;
formSection2_yes.querySelector(".details p").innerHTML =
title + "<br>" + address;
}else{
formSection2_yes.querySelector(".details p").innerHTML=title;
}
formSection2_yes.classList.remove("active");
formSection2_yes.classList.add("done");
formSection2_no.querySelector(".details p").innerHTML=title;
formSection2_no.classList.remove("active");
formSection2_no.classList.add("done");
var isDirectBooking=(typeof window.selectedCardDirectBooking!=="undefined" ? window.selectedCardDirectBooking:(typeof selectedCardDirectBooking!=="undefined" ? selectedCardDirectBooking:null))==="1";
if(isDirectBooking&&formSection3!=null){
formSection3.classList.add("active");
formSection4.classList.remove("active");
}else{
formSection3.classList.remove("active");
formSection4.classList.add("active");
if(typeof bookingData!=="undefined") bookingData.times=[];
}
bookingData.location={};
bookingData.location.code=code;
bookingData.location.title=title;
bookingData.location.address=address;
dataLayer.push({
event: "FP_step3_centro",
FP_step3_centro_value: title,
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
});
}}
};
jQuery(function(){
const owlReview=jQuery(".cs-review");
const owlNews=jQuery(".cs-news");
const owlTratt=jQuery(".cs-tratt");
const owlPrimary=jQuery(".cs-primary");
const owlPrimaryContent=jQuery(".cs-primary-content");
if(owlReview.length){
owlReview.owlCarousel({
autoplay: false,
loop: true,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
responsive: {
0: {
items: 1,
stagePadding: 70
},
768: {
items: 3,
stagePadding: 0
},
992: {
items: 3
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
}
if(owlNews.length){
owlNews.each(function(){
draggable=jQuery(this).find('.dp-card-review').length > 2;
jQuery(this).owlCarousel({
autoplay: false,
loop: draggable,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
touchDrag:true,
mouseDrag:draggable,
responsive: {
0: {
items: 1
},
768: {
items: 2
},
992: {
items: 2
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
if(!draggable){
jQuery(this).closest('.container').find('.row:first-child').remove();
}});
}
if(owlTratt.length){
owlTratt.owlCarousel({
autoplay: false,
loop: true,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
responsive: {
0: {
items: 1,
stagePadding: 70
},
768: {
items: 3,
stagePadding: 0
},
992: {
items: 4
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
}
if(owlPrimary.length){
draggable=owlPrimary.find('.slide-image-container').length > 1;
owlPrimary.owlCarousel({
autoplay: false,
loop: false,
dots: true,
nav: true,
slideTransition: "linear",
onTranslated: setSlide,
touchDrag:draggable,
mouseDrag:draggable,
responsive: {
0: {
items: 1
},
},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
}
if(owlPrimaryContent.length){
owlPrimaryContent.owlCarousel({
autoplay: false,
loop: false,
dots: false,
nav: false,
touchDrag: false,
mouseDrag: false,
slideTransition: "linear",
responsive: {
0: {
items: 1
},
},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
if(jQuery('#primaryContentSlide .owl-item').length > 1||jQuery('body').hasClass('home')){
jQuery('#primarySlide + .dp-slider-content').css({'visibility': 'hidden', 'position': 'absolute'});
jQuery('#primarySlide + .dp-slider-content').show();
setTimeout(function(){
jQuery('#primarySlide + .dp-slider-content').css({'visibility': '', 'position': ''});
}, 500);
}}
function setSlide(event){
owlPrimaryContent.trigger("to.owl.carousel", event.page.index);
}
if(document.getElementById('trattRight')){
document.getElementById('trattRight').addEventListener('click', ()=> {
owlTratt.trigger("prev.owl.carousel");
});
}
if(document.getElementById('trattLeft')){
document.getElementById('trattLeft').addEventListener('click', ()=> {
owlTratt.trigger("next.owl.carousel");
});
}
if(document.getElementById('newsRight')){
document.getElementById('newsRight').addEventListener('click', ()=> {
owlNews.trigger("prev.owl.carousel");
});
}
if(document.getElementById('newsLeft')){
document.getElementById('newsLeft').addEventListener('click', ()=> {
owlNews.trigger("next.owl.carousel");
});
}
if(document.getElementById('newsLeft')){
document.getElementById('newsSecondRight').addEventListener('click', ()=> {
owlNews.trigger("prev.owl.carousel");
});
}
if(document.getElementById('newsSecondLeft')){
document.getElementById('newsSecondLeft').addEventListener('click', ()=> {
owlNews.trigger("next.owl.carousel");
});
}
if(document.getElementById('aboutMeRight')){
document.getElementById('aboutMeRight').addEventListener('click', ()=> {
owlReview.trigger("prev.owl.carousel");
});
}
if(document.getElementById('aboutMeLeft')){
document.getElementById('aboutMeLeft').addEventListener('click', ()=> {
owlReview.trigger("next.owl.carousel");
});
}
if(document.getElementById('primaryLeft')){
document.getElementById('primaryLeft').addEventListener('click', ()=> {
owlPrimary.trigger("next.owl.carousel");
owlPrimaryContent.trigger("next.owl.carousel");
});
}
if(document.getElementById('primaryRight')){
document.getElementById('primaryRight').addEventListener('click', ()=> {
owlPrimary.trigger("prev.owl.carousel");
owlPrimaryContent.trigger("prev.owl.carousel");
});
}
window.addEventListener('resize', checkSliderCard, true);
checkSliderCard();
function checkSliderCard(){
var dpCardSlider=document.querySelector('.dp-card-slider');
var owlResizer=document.querySelector('.owl-resizer');
if(dpCardSlider!=null){
var setCardOnTop=false;
if(window.outerWidth >=992){
if(window.outerHeight < 800){
setCardOnTop=true;
}}
if(setCardOnTop){
owlResizer.classList.add('active');
}else{
owlResizer.classList.remove('active');
}}
}});
function initMap(){
var mapContainer=document.querySelector('.map-container');
if(mapContainer!=null){
var gmapsKey=new URLSearchParams(document.getElementById('g-maps').getAttribute('src').split('?')[1]);
if(document.querySelector('.page-centri')!=null){
centriInitMap();
}else{
var title=mapContainer.querySelector('h1')!=null ? mapContainer.querySelector('h1').innerHTML:'';
var lat=parseFloat(mapContainer.dataset.lat);
var lng=parseFloat(mapContainer.dataset.lng);
centroInitMap(gmapsKey.get('key'), title, lat, lng);
}}
var options={
componentRestrictions: {country: "it"}};
var autocomplete=document.querySelectorAll('.autocomplete');
for(let i=0; i<autocomplete.length; i++){
new google.maps.places.Autocomplete(autocomplete[i], options);
}};
function centroInitMap(mapsApiKey, title, lat, lng){
const mapStyle=[
{
"featureType": "water",
"elementType": "geometry",
"stylers": [
{
"color": "#193341"
}
]
},
{
"featureType": "landscape",
"elementType": "geometry",
"stylers": [
{
"color": "#2c5a71"
}
]
},
{
"featureType": "road",
"elementType": "geometry",
"stylers": [
{
"color": "#29768a"
},
{
"lightness": -37
}
]
},
{
"featureType": "poi",
"elementType": "geometry",
"stylers": [
{
"color": "#406d80"
}
]
},
{
"featureType": "transit",
"elementType": "geometry",
"stylers": [
{
"color": "#406d80"
}
]
},
{
"elementType": "labels.text.stroke",
"stylers": [
{
"visibility": "on"
},
{
"color": "#3e606f"
},
{
"weight": 2
},
{
"gamma": 0.84
}
]
},
{
"elementType": "labels.text.fill",
"stylers": [
{
"color": "#ffffff"
}
]
},
{
"featureType": "administrative",
"elementType": "geometry",
"stylers": [
{
"weight": 0.6
},
{
"color": "#1a3541"
}
]
},
{
"elementType": "labels.icon",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "poi.park",
"elementType": "geometry",
"stylers": [
{
"color": "#2c5a71"
}
]
}
];
const configuration={
"locations": [
{"title":title,"coords":{"lat":lat,"lng":lng}}
],
"mapOptions": {"center":{"lat":lat,"lng":lng},"fullscreenControl":true,"mapTypeControl":false,"streetViewControl":false,"zoom":16,"zoomControl":true,"maxZoom":16, "mapTypeId": "myStyle"},
"mapsApiKey": mapsApiKey
};
const locator=this;
locator.locations=configuration.locations||[];
locator.capabilities=configuration.capabilities||{};
const mapEl=document.getElementById('centro-map');
if(mapEl==null)
return;
const panelEl=document.getElementById('locations-panel');
locator.panelListEl=document.getElementById('locations-panel-list');
const resultsContainerEl=document.getElementById('location-results-list');
locator.searchLocation=null;
locator.searchLocationMarker=null;
locator.selectedLocationIdx=null;
locator.userCountry=null;
locator.map=new google.maps.Map(mapEl, configuration.mapOptions);
locator.map.mapTypes.set('myStyle', new google.maps.StyledMapType(mapStyle, { name: 'Map Style' }));
const selectResultItem=function(locationIdx, panToMarker, scrollToResult){
locator.selectedLocationIdx=locationIdx;
for (let locationElem of resultsContainerEl.children){
locationElem.classList.remove('selected');
if(getResultIndex(locationElem)===locator.selectedLocationIdx){
locationElem.classList.add('selected');
if(scrollToResult){
panelEl.scrollTop=locationElem.offsetTop;
}}
}
if(panToMarker&&(locationIdx!=null)){
locator.map.panTo(locator.locations[locationIdx].coords);
}};
var svg=[
'<?xml version="1.0"?>',
'<svg width="26" height="31" viewBox="0 0 26 31" fill="none" xmlns="http://www.w3.org/2000/svg">',
'<path d="M25.2329 12.6165C25.2329 22.4293 12.6165 30.8402 12.6165 30.8402C12.6165 30.8402 0 22.4293 0 12.6165C4.98607e-08 9.27036 1.32923 6.06132 3.69527 3.69527C6.06132 1.32923 9.27036 0 12.6165 0C15.9625 0 19.1716 1.32923 21.5376 3.69527C23.9037 6.06132 25.2329 9.27036 25.2329 12.6165Z" fill="#79E2D9"/>',
'<path d="M12.6166 16.822C14.9392 16.822 16.8221 14.9391 16.8221 12.6165C16.8221 10.2939 14.9392 8.41104 12.6166 8.41104C10.294 8.41104 8.41113 10.2939 8.41113 12.6165C8.41113 14.9391 10.294 16.822 12.6166 16.822Z" fill="#215682"/>',
'</svg>'
].join('\n');
const markers=locator.locations.map(function(location, index){
const marker=new google.maps.Marker({
position: location.coords,
map: locator.map,
title: location.title,
icon: { url: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg) },
optimized: false
});
marker.addListener('click', function(){
selectResultItem(index, false, true);
});
return marker;
});
locator.updateBounds=function(){
const bounds=new google.maps.LatLngBounds();
if(locator.searchLocationMarker){
bounds.extend(locator.searchLocationMarker.getPosition());
}
for (let i=0; i < markers.length; i++){
bounds.extend(markers[i].getPosition());
}
locator.map.fitBounds(bounds);
};
if(locator.locations.length){
locator.updateBounds();
}
const getLocationDistance=function(location){
if(!locator.searchLocation) return null;
if(location.travelDistanceValue!=null){
return location.travelDistanceValue;
}
return google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(location.coords),
locator.searchLocation.location);
};
const getResultIndex=function(elem){
return parseInt(elem.getAttribute('data-location-index'));
};
locator.renderResultsList=function(){
let locations=locator.locations.slice();
for (let i=0; i < locations.length; i++){
locations[i].index=i;
}
if(locator.searchLocation){
locations.sort(function(a, b){
return getLocationDistance(a) - getLocationDistance(b);
});
}};
locator.renderResultsList();
if(window.innerWidth > 991){
const center=new google.maps.LatLng(lat+0.0015, lng-0.005);
locator.map.panTo(center);
}}
jQuery(function(){
const owlOpinioni=jQuery(".owl-carousel.dp-opinioni");
const owlCentroImmagini=jQuery(".dp-centro-immagini");
const owlStaff=jQuery(".dp-staff");
const owlTreatments=jQuery(".dp-treatments");
if(owlOpinioni.length){
owlOpinioni.owlCarousel({
autoplay: false,
loop: true,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
responsive: {
0: {
items: 1
},
768: {
items: 3
},
992: {
items: 3
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
}
if(owlCentroImmagini.length){
owlCentroImmagini.owlCarousel({
autoplay: false,
loop: true,
margin: 0,
dots: true,
nav: false,
slideTransition: "linear",
items: 1
});
}
if(owlStaff.length){
draggable=owlStaff.find('.dp-card-review').length > 4;
owlStaff.owlCarousel({
autoplay: false,
loop: true,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
responsive: {
0: {
items: 1,
stagePadding: 70
},
768: {
items: 3,
stagePadding: 0
},
992: {
items: 4
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
if(!draggable){
jQuery('#staffRight, #staffLeft').removeClass('d-md-block').hide();
}}
if(owlTreatments.length){
draggable=owlTreatments.find('.dp-card-review').length > 4;
owlTreatments.owlCarousel({
autoplay: false,
loop: true,
margin: 20,
dots: true,
nav: true,
slideTransition: "linear",
responsive: {
0: {
items: 1,
stagePadding: 70
},
768: {
items: 4,
stagePadding: 0
}},
navText:[
`<span class="icon-arrow_left"></span>`,
`<span class="icon-arrow_right"></span>`
]
});
if(!draggable){
jQuery('#treatmentsRight, #treatmentsLeft').removeClass('d-md-block').hide();
}}
document.querySelectorAll('[id="opinioniRight"]').forEach((btn)=> {
btn.addEventListener('click', ()=> owlOpinioni.trigger("prev.owl.carousel"));
});
document.querySelectorAll('[id="opinioniLeft"]').forEach((btn)=> {
btn.addEventListener('click', ()=> owlOpinioni.trigger("next.owl.carousel"));
});
if(document.getElementById('staffRight')){
document.getElementById('staffRight').addEventListener('click', ()=> {
owlStaff.trigger("prev.owl.carousel");
});
}
if(document.getElementById('staffLeft')){
document.getElementById('staffLeft').addEventListener('click', ()=> {
owlStaff.trigger("next.owl.carousel");
});
}
if(document.getElementById('treatmentsRight')){
document.getElementById('treatmentsRight').addEventListener('click', ()=> {
owlTreatments.trigger("prev.owl.carousel");
});
}
if(document.getElementById('treatmentsLeft')){
document.getElementById('treatmentsLeft').addEventListener('click', ()=> {
owlTreatments.trigger("next.owl.carousel");
});
}});
function centriInitMap(lat=null, lng=null){
const mapStyle=[
{
"featureType": "water",
"elementType": "geometry",
"stylers": [
{
"color": "#193341"
}
]
},
{
"featureType": "landscape",
"elementType": "geometry",
"stylers": [
{
"color": "#2c5a71"
}
]
},
{
"featureType": "road",
"elementType": "geometry",
"stylers": [
{
"color": "#29768a"
},
{
"lightness": -37
}
]
},
{
"featureType": "poi",
"elementType": "geometry",
"stylers": [
{
"color": "#406d80"
}
]
},
{
"featureType": "transit",
"elementType": "geometry",
"stylers": [
{
"color": "#406d80"
}
]
},
{
"elementType": "labels.text.stroke",
"stylers": [
{
"visibility": "on"
},
{
"color": "#3e606f"
},
{
"weight": 2
},
{
"gamma": 0.84
}
]
},
{
"elementType": "labels.text.fill",
"stylers": [
{
"color": "#ffffff"
}
]
},
{
"featureType": "administrative",
"elementType": "geometry",
"stylers": [
{
"weight": 0.6
},
{
"color": "#1a3541"
}
]
},
{
"elementType": "labels.icon",
"stylers": [
{
"visibility": "off"
}
]
},
{
"featureType": "poi.park",
"elementType": "geometry",
"stylers": [
{
"color": "#2c5a71"
}
]
}
];
var svg=[
'<?xml version="1.0"?>',
'<svg width="26" height="31" viewBox="0 0 26 31" fill="none" xmlns="http://www.w3.org/2000/svg">',
'<path d="M25.2329 12.6165C25.2329 22.4293 12.6165 30.8402 12.6165 30.8402C12.6165 30.8402 0 22.4293 0 12.6165C4.98607e-08 9.27036 1.32923 6.06132 3.69527 3.69527C6.06132 1.32923 9.27036 0 12.6165 0C15.9625 0 19.1716 1.32923 21.5376 3.69527C23.9037 6.06132 25.2329 9.27036 25.2329 12.6165Z" fill="#79E2D9"/>',
'<path d="M12.6166 16.822C14.9392 16.822 16.8221 14.9391 16.8221 12.6165C16.8221 10.2939 14.9392 8.41104 12.6166 8.41104C10.294 8.41104 8.41113 10.2939 8.41113 12.6165C8.41113 14.9391 10.294 16.822 12.6166 16.822Z" fill="#215682"/>',
'</svg>'
].join('\n');
var mapOptions={
zoom: 6,
center: {lat: 42.655583, lng: 12.846389},
mapTypeId: "myStyle",
fullscreenControl: true,
mapTypeControl: false,
streetViewControl: false
};
if(lat!=null&&lng!=null){
mapOptions.zoom=9;
mapOptions.center={lat: lat, lng: lng};}
var map=new google.maps.Map(document.querySelector('.map-container'), mapOptions);
map.mapTypes.set('myStyle', new google.maps.StyledMapType(mapStyle, { name: 'Map Style' }));
var markers=[];
var markersLtLong=[];
if(document.querySelector('#centri-list').getAttribute('data-distance-max'))
window.mapConstants.maxKm=parseInt(document.querySelector('#centri-list').getAttribute('data-distance-max'));
window.currentMax=window.currentMax||window.mapConstants.minKm;
if(window.currentMax <=window.mapConstants.maxKm)
maxDistance=window.currentMax;
locations=document.querySelectorAll('#centri-list .box-location');
var initState=document.querySelector(".tab-content.locator-results").getAttribute("data-init")=='true';
var bounds=new google.maps.LatLngBounds();
while(maxDistance <  window.mapConstants.maxKm){
markers=[];
markersLtLong=[];
for(let i=0; i<locations.length; i++){
loc_lat=locations[i].getAttribute('data-lat');
loc_lng=locations[i].getAttribute('data-lng');
distance=locations[i].getAttribute('data-distance');
if(distance==null||parseInt(distance) <=maxDistance){
markers.push({
position: { lat: parseFloat(loc_lat), lng: parseFloat(loc_lng) },
content: '<div class="tab-content"><div class="tab-box"><div class="box-location">'+locations[i].innerHTML+'</div></div></div>'
});
}}
if(markers.length >=window.mapConstants.minResults){
break;
}else if(!initState&&markers.length < window.mapConstants.minResults){
maxDistance=maxDistance + window.mapConstants.stepKm;
}}
if(markers.length===1){
google.maps.event.addListenerOnce(map, "bounds_changed", function (){
this.setZoom(13);
});
};
if(markers.length > 0){
for (var i=0; i < markers.length; i++)
bounds.extend(new google.maps.LatLng(markers[i].position.lat,markers[i].position.lng));
map.fitBounds(bounds);
}else{
map.zoom=11;
}
if(!initState){
var feedbackTxt=document.querySelector(".locator-results--feedback");
if(markers.length > 0)
feedbackTxt.innerHTML="Sono stati trovati " + markers.length + " centri nel raggio di " + maxDistance + " Km";
else
feedbackTxt.innerHTML="Nessun centro trovato per la ricerca corrente nel raggio di " + maxDistance + " Km ";
setAccordionHeaderStickyVariable();
}
var currentInfowindow=null;
var markerObjects=[];
let lastSelectedMarker=null;
for (var i=0; i < markers.length; i++){
let marker=new google.maps.Marker({
position: markers[i].position,
map: map,
icon: { url: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg) }});
let infowindow=new google.maps.InfoWindow({
content: markers[i].content
});
if(markers.length===1){
var vw=getClientWidth();
let lat=marker.position.lat();
let lng=marker.position.lng();
let targetElement=document.querySelector(`#centri-list .box-location[data-lat="${lat}"][data-lng="${lng}"]`)?.closest('.tab-box');
if(targetElement){
let accordionItem=targetElement.closest(".accordion");
if(accordionItem){
let accordionButton=accordionItem.querySelector("button.accordion-button");
if(accordionButton&&accordionButton.classList.contains("collapsed")){
accordionButton.click();
}
let scrollAndHighlight=function(){
setTimeout(function (){
let accordionItemOffset=accordionItem.offsetTop - accordionItem.querySelector(".accordion-header").clientHeight;
let totalOffset=accordionItemOffset + (targetElement.offsetTop - targetElement.clientHeight) + 300;
let scrollContainer=document.querySelector(".store-locator-container .col-4.col-lg-4");
if(scrollContainer){
scrollContainer.scroll({ top: totalOffset, behavior: 'smooth' });
}
document.querySelectorAll(".box-location.highlight").forEach(el=> el.classList.remove("highlight"));
targetElement.classList.add("highlight");
}, 300);
setTimeout(()=> targetElement.classList.remove("highlight"), 3000);
};
let centriList=document.querySelector("#centri-list");
if(vw <=991&&centriList&&getComputedStyle(centriList).display==="none"){
lastSelectedMarker={ scrollAndHighlight };}else{
scrollAndHighlight();
}}
}}
markerObjects.push({ marker, infowindow });
marker.addListener('click', function(){
var vw=getClientWidth();
if(currentInfowindow){
currentInfowindow.close();
}
infowindow.open(map, marker);
map.panTo(marker.position);
currentInfowindow=infowindow;
let lat=marker.position.lat();
let lng=marker.position.lng();
let targetElement=document.querySelector(`#centri-list .box-location[data-lat="${lat}"][data-lng="${lng}"]`)?.closest('.tab-box');
let test=document.querySelector(`#centri-list .box-location[data-lat="${lat}"][data-lng="${lng}"]`);
if(targetElement){
let accordionItem=targetElement.closest(".accordion");
if(accordionItem){
let accordionButton=accordionItem.querySelector("button.accordion-button");
if(accordionButton&&accordionButton.classList.contains("collapsed")){
accordionButton.click();
}
let scrollAndHighlight=function(){
setTimeout(function (){
let accordionItemOffset=accordionItem.offsetTop - accordionItem.querySelector(".accordion-header").clientHeight;
let totalOffset=accordionItemOffset + (targetElement.offsetTop - targetElement.clientHeight) + 300;
let scrollContainer=document.querySelector(".store-locator-container .col-4.col-lg-4");
if(scrollContainer){
scrollContainer.scroll({ top: totalOffset, behavior: 'smooth' });
}
document.querySelectorAll(".box-location.highlight").forEach(el=> el.classList.remove("highlight"));
test.classList.add("highlight");
}, 300);
setTimeout(()=> test.classList.remove("highlight"), 3000);
};
let centriList=document.querySelector("#centri-list");
if(vw <=991&&centriList&&getComputedStyle(centriList).display==="none"){
lastSelectedMarker={ scrollAndHighlight };}else{
scrollAndHighlight();
}}
}});
}
document.querySelector("#centri-list-tab").addEventListener("click", function(){
if(lastSelectedMarker){
setTimeout(lastSelectedMarker.scrollAndHighlight, 500);
}});
document.querySelectorAll("#centri-list .box-location .cta-link").forEach(link=> {
link.addEventListener("click", function (e){
e.stopPropagation();
});
});
document.querySelectorAll("#centri-list .box-location").forEach(item=> {
item.addEventListener("click", function (){
let lat=parseFloat(item.getAttribute("data-lat"));
let lng=parseFloat(item.getAttribute("data-lng"));
if(!isNaN(lat)&&!isNaN(lng)){
let targetLatLng=new google.maps.LatLng(lat, lng);
if(typeof map!=="undefined"&&map instanceof google.maps.Map){
let currentZoom=map.getZoom();
let targetZoom=currentZoom < 14 ? 14:currentZoom;
map.setZoom(targetZoom);
map.panTo(targetLatLng);
let markerObj=markerObjects.find(obj=>
obj.marker.position.lat()===lat&&obj.marker.position.lng()===lng
);
if(markerObj){
if(currentInfowindow) currentInfowindow.close();
markerObj.infowindow.open(map, markerObj.marker);
currentInfowindow=markerObj.infowindow;
}}
let accordionItem=item.closest(".accordion-item");
if(accordionItem){
let accordionButton=accordionItem.querySelector("button.accordion-button");
if(accordionButton&&accordionButton.classList.contains("collapsed")){
accordionButton.click();
}}
}});
});
}
document.addEventListener("DOMContentLoaded", function(){
const calcSubmit=document.querySelector('.tab-content.centri .cta');
if(calcSubmit!=null){
calcSubmit.addEventListener('click', function(){
address=this.parentNode.querySelector('input');
if(address.value!=''){
address.disabled=true;
address.classList.add('input-loading');
calcSubmit.classList.add('cta-loading');
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
let myData='action=dp_get_latlng_by_address&g-recaptcha-response=' + token + '&address=' + address.value;
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
var latlng=xhttp.responseText;
address.disabled=false;
address.classList.remove('input-loading');
calcSubmit.classList.remove('cta-loading');
var lat=null, lng=null;
if(isJson(latlng)){
latlng=JSON.parse(latlng);
lat=latlng.lat;
lng=latlng.lng;
}else{
if(latlng.indexOf(',')!=-1){
latlng=address.trim().split(',');
lat=latlng[0];
lng=latlng[1];
}}
if(lat!=null&&lng!=null){
locations=document.querySelectorAll('#centri-list .box-location');
if(document.querySelector('#centri-list').getAttribute('data-distance-max'))
window.mapConstants.maxKm=parseInt(document.querySelector('#centri-list').getAttribute('data-distance-max'));
window.currentMax=window.currentMax||window.mapConstants.minKm;
if(window.currentMax <=window.mapConstants.maxKm)
maxDistance=window.currentMax;
while(maxDistance <  window.mapConstants.maxKm){
for(let i=0; i<locations.length; i++){
loc_lat=locations[i].getAttribute('data-lat');
loc_lng=locations[i].getAttribute('data-lng');
distance=calcDistance(lat, lng, loc_lat, loc_lng);
locations[i].querySelector('.box-location-distance').innerHTML='<span>' + Math.round(distance) + ' Km</span>';
locations[i].parentNode.style.order=Math.round(distance);
locations[i].setAttribute('data-distance', Math.round(distance));
locations[i].parentNode.style.display=(Math.round(distance) > maxDistance) ? 'none':'block';
locations[i].parentNode.setAttribute("location-active", (Math.round(distance) <=maxDistance) ? 'true':'false');
}
var locationsActive=document.querySelectorAll(".tab-box[location-active='true']");
if(locationsActive.length >=window.mapConstants.minResults){
break;
}else if(locationsActive.length < locations.length&&locationsActive.length < window.mapConstants.minResults){
maxDistance=maxDistance + window.mapConstants.stepKm;
}}
accordions=document.querySelectorAll('#centri-list .accordion');
for(let i=0; i<accordions.length; i++){
accordions[i].classList.remove("accordion-active");
accordions[i].querySelector(".accordion-collapse").classList.remove("show");
accordions[i].querySelector(".accordion-button").classList.add("collapsed");
accordions[i].querySelector(".accordion-button").setAttribute("aria-expanded", "false");
regionHasLocation=false;
locations=accordions[i].querySelectorAll('.tab-box');
for(let e=0; e<locations.length; e++){
if(locations[e].style.display=='block'){
regionHasLocation=true;
}}
accordions[i].style.display=regionHasLocation ? 'block':'none';
if(regionHasLocation){
accordions[i].classList.add("accordion-active");
accordions[i].querySelector(".accordion-collapse").classList.add("show");
accordions[i].querySelector(".accordion-button").classList.remove("collapsed");
accordions[i].querySelector(".accordion-button").setAttribute("aria-expanded", "true");
}}
document.querySelector('.store-locator-container .col-4').scrollTo(0,0);
document.querySelector(".tab-content.locator-results").setAttribute("data-init", false);
centriInitMap(lat, lng);
}}
};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
xhttp.send(myData);
});
});
}});
}
const completeMap=document.querySelector(".complete-map");
if(completeMap){
var searchInput=completeMap.querySelector(".tab-content.centri input");
if(searchInput.value&&searchInput!=""){
var cta=searchInput.parentNode.parentNode.querySelector(".cta");
cta.click();
}
switchMapToMobile();
setHeaderHeightVariable();
window.addEventListener("resize", setHeaderHeightVariable);
window.addEventListener("resize", switchMapToMobile);
}
function isJson(str){
try {
JSON.parse(str);
} catch (e){
return false;
}
return true;
}
function calcDistance(lat1, lon1, lat2, lon2){
const earthRadius=6371;
const dLat=(lat2 - lat1) * Math.PI / 180;
const dLon=(lon2 - lon1) * Math.PI / 180;
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c=2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance=earthRadius * c;
return distance;
}
function switchMapToMobile (){
var vw=getClientWidth();
if(vw <=991){
if(!completeMap.classList.contains("complete-map--mobile")){
completeMap.classList.add("complete-map--mobile");
completeMap.querySelector("#centri-list")
.classList.remove("show", "active");
completeMap
.querySelector(".store-locator-container ")
.prepend(completeMap.querySelector(".row-search"));
completeMap
.querySelector("#centri-list")
.after(completeMap.querySelector("#centri-map"));
}}else{
if(completeMap.classList.contains("complete-map--mobile")){
completeMap.classList.remove("complete-map--mobile");
completeMap.querySelector("#centri-list")
.classList.add("show", "active");
completeMap.querySelector("#centri-map")
.classList.add("show", "active");
completeMap
.querySelector(".store-locator-container .col-4 .row")
.prepend(completeMap.querySelector(".row-search"));
completeMap
.querySelector(".col-8 .locator-results")
.prepend(completeMap.querySelector("#centri-map"));
}}
}
function setHeaderHeightVariable (){
var vw=getClientWidth();
if(vw < 992){
var headerHeight=document.querySelector(".header-mobile .d-flex").offsetHeight;
document.documentElement.style.setProperty("--header-height", headerHeight + "px");
}else{
var headerHeight=document.querySelector(".header .d-flex").offsetHeight;
document.documentElement.style.setProperty("--header-height", headerHeight + "px");
}}
});
function setAccordionHeaderStickyVariable (){
var vw=getClientWidth();
if(vw > 991){
var offsetForSticky=document.querySelector(".row-search");
var accordionHeaders=document.querySelectorAll(".accordion-header");
for(var i=0; i<accordionHeaders.length; i++)
accordionHeaders[i].style.setProperty("--accordion-header-sticky", offsetForSticky.clientHeight + "px");
}}
function getClientWidth (){
return Math.max(document.documentElement.clientWidth||0, window.innerWidth||0);
};
document.addEventListener("DOMContentLoaded", function(){
if(!document.body.classList.contains('header-loaded')&&!document.body.classList.contains('page-template-page-landing')&&!document.body.classList.contains('area-pazienti')&&!document.body.classList.contains('page-template-page-booking')){
document.body.classList.add('header-loaded');
const parentMenu=document.querySelectorAll('#nav-main .cta.has-submenu .action');
const overlayMenu=document.querySelector('#menu-page-overlay');
const activeMenuClass='actived';
for(let i=0; i<parentMenu.length; i++){
parentMenu[i].addEventListener('click', function(){
var menuElement=this.parentNode;
if(menuElement.classList.contains(activeMenuClass)){
menuElement.classList.remove(activeMenuClass);
}else{
menuElement.classList.add(activeMenuClass);
}
overlayMenu.style.display=overlayMenu.style.display!='block' ? 'block':'none';
});
}
overlayMenu.addEventListener('click', function(){
for(let i=0; i<parentMenu.length; i++){
if(parentMenu[i].parentNode.classList.contains(activeMenuClass)){
parentMenu[i].parentNode.classList.remove(activeMenuClass);
}}
this.style.display='none';
});
const headerMobileStickyClass='header-mobile-sticky';
const menuClose=document.querySelectorAll('#menu-mobile .menu-close');
const submenuMobile=document.querySelectorAll('#menu-mobile .submenu-mobile');
const menuMain=document.querySelector('#menu-mobile-main');
const menuMobile=document.querySelector('#menu-mobile');
const submenuLink=document.querySelectorAll('#menu-mobile .menu-link.has-submenu');
const menuBack=document.querySelectorAll('#menu-mobile .menu-back');
const menuChooseLink=document.querySelectorAll('#menu-mobile .choose-links .choose-link');
const headerMobileMain=document.querySelector('#header-mobile-main');
const headerMobileMainHeight=headerMobileMain.clientHeight;
var lastScrollTop=0;
document.querySelector('.open-menu-mobile').addEventListener('click', function(e){
document.querySelector('#menu-mobile').style.display='block';
document.body.classList.add('overflow-hidden');
e.preventDefault();
});
for(let i=0; i<menuClose.length; i++){
menuClose[i].addEventListener('click', function(e){
for(let r=0; r<submenuMobile.length; r++){
submenuMobile[r].style.display='none';
}
menuMain.style.display='block';
menuMobile.style.display='none';
document.body.classList.remove('overflow-hidden');
e.preventDefault();
});
}
for(let i=0; i<submenuLink.length; i++){
submenuLink[i].addEventListener('click', function(){
var menu=this.getAttribute('data-menu');
for(let r=0; r<submenuMobile.length; r++){
if(submenuMobile[r].getAttribute('data-menu')==menu){
menuMain.style.display='none';
submenuMobile[r].style.display='block';
}}
});
}
for(let i=0; i<menuBack.length; i++){
menuBack[i].addEventListener('click', function(){
for(let r=0; r<submenuMobile.length; r++){
submenuMobile[r].style.display='none';
}
menuMain.style.display='block';
});
}
for(let i=0; i<menuChooseLink.length; i++){
menuChooseLink[i].addEventListener('click', function(e){
if(!this.classList.contains(activeMenuClass)){
var submenu=this.getAttribute('data-submenu');
for(let r=0; r<menuChooseLink.length; r++){
if(menuChooseLink[r].classList.contains(activeMenuClass)){
menuChooseLink[r].classList.remove(activeMenuClass);
}}
this.classList.add(activeMenuClass);
var navs=closest(this, '.submenu-mobile');
navs=navs.querySelector('.multiple-navs');
var navigations=navs.querySelectorAll('nav');
for(let r=0; r<navigations.length; r++){
if(navigations[r].classList.contains(activeMenuClass)){
navigations[r].classList.remove(activeMenuClass);
}}
navs.querySelector('nav.' + submenu).classList.add(activeMenuClass);
}
e.preventDefault();
});
}
window.addEventListener('scroll', function(){
var st=window.scrollY;
if(lastScrollTop > headerMobileMainHeight&&st < lastScrollTop&&headerMobileMainHeight>0){
if(!headerMobileMain.classList.contains(headerMobileStickyClass)){
headerMobileMain.classList.add(headerMobileStickyClass);
document.body.style.marginTop=headerMobileMainHeight + 80 + 'px';
document.body.classList.add(headerMobileStickyClass);
}}else{
if(headerMobileMain.classList.contains(headerMobileStickyClass)){
headerMobileMain.classList.remove(headerMobileStickyClass);
document.body.style.marginTop=0;
document.body.classList.remove(headerMobileStickyClass);
}}
lastScrollTop=st;
});
function closest(el, selector){
var matchesSelector=el.matches||el.webkitMatchesSelector||el.mozMatchesSelector||el.msMatchesSelector;
while (el){
if(matchesSelector.call(el, selector)){
break;
}
el=el.parentElement;
}
return el;
}
const searchOverlay=document.querySelector('.search-overlay');
const searchInputBox=document.querySelector('.search-input-box');
const searchInputBoxMobile=document.querySelector('.search-input-box-mobile');
const searchLinks=document.querySelectorAll('.search-link');
for(let i=0; i<searchLinks.length; i++){
searchLinks[i].addEventListener('click', function(e){
if(this.classList.contains('menu-link')){
searchOverlay.style.display='block';
}else{
if(searchLinks[i].parentNode.classList.contains('search-opened')){
searchLinks[i].parentNode.classList.remove('search-opened');
}else{
searchLinks[i].parentNode.classList.add('search-opened');
}}
e.preventDefault();
});
}
searchOverlay.querySelector('.search-overlay-close').addEventListener('click', function(){
searchOverlay.style.display='none';
});
}});
document.addEventListener("DOMContentLoaded", function(){
const dpIndex=document.querySelector('.dp-index');
if(dpIndex!=null){
var cumulativeOffset=function(element){
var top=0, left=0;
do {
top +=element.offsetTop||0;
left +=element.offsetLeft||0;
element=element.offsetParent;
} while(element);
return {
top: top,
left: left
};};
dpIndexItems=dpIndex.querySelectorAll('.dp-list-items');
for(let i=0; i<dpIndexItems.length; i++){
if(document.querySelector('#index-'+(i+1))!=null){
if(dpIndexItems[i].querySelector('p a').innerHTML==''){
dpIndexItems[i].querySelector('p a').innerHTML=document.querySelector('#index-'+(i+1)).innerHTML;
}}else{
dpIndexItems[i].remove();
}}
var dpIndexPosition=cumulativeOffset(dpIndex).top;
var dpIndexHeight=dpIndex.offsetHeight;
var dpIndexClone=dpIndex.cloneNode(true);
var dpCurrentIndex=dpIndexClone.querySelector('.current-index');
dpIndexClone.classList.add('fixed');
document.body.appendChild(dpIndexClone);
window.addEventListener('scroll', dpIndexToggle);
dpIndexClone.querySelector('.current-index').addEventListener('click', function(){
if(dpIndexClone.classList.contains('opened')){
dpIndexClone.classList.remove('opened');
}else{
dpIndexClone.classList.add('opened');
}});
dpIndexItems=document.querySelectorAll('.dp-index .dp-list-items');
for(let i=0; i<dpIndexItems.length; i++){
dpIndexItems[i].querySelector('p a').addEventListener('click', function(e){
e.preventDefault();
const href=this.getAttribute("href");
const offsetTop=document.querySelector(href).offsetTop - document.getElementById('header').offsetHeight - document.getElementById('header-mobile').offsetHeight;
scroll({
top: offsetTop,
behavior: "smooth"
});
});
}
cloneLinks=dpIndexClone.querySelectorAll('a');
for(let i=0; i<cloneLinks.length; i++){
cloneLinks[i].addEventListener('click', function(e){
dpIndexClone.classList.remove('opened');
e.preventDefault();
});
}
dpIndexToggle();
window.addEventListener('resize', dpIndexResize, true);
dpIndexResize();
}
function dpIndexToggle(){
var scrollY=window.scrollY;
if(scrollY > dpIndexPosition - dpIndexHeight){
if(!dpIndexClone.classList.contains('show')){
dpIndexClone.classList.add('show');
}
var titles=document.querySelectorAll('h1, h2, h3, h4, h5, h6');
var stopTitles=false;
for(let i=0; i<titles.length; i++){
if(scrollY <=titles[i].offsetTop&&!stopTitles){
currentIndexID=titles[i].getAttribute('id');
if(currentIndexID!=null){
for(let i=0; i<dpIndexItems.length; i++){
dpIndexItem=dpIndexItems[i].querySelector('p a');
if(dpIndexItem.getAttribute("href").split('#')[1]==currentIndexID){
dpCurrentIndex.innerHTML=dpIndexItem.innerHTML;
}}
}
stopTitles=true;
}}
}else{
if(dpIndexClone.classList.contains('show')){
dpIndexClone.classList.remove('show');
}}
}
function dpIndexResize(){
var ct=document.querySelector('.content-text .sticky');
if(ct!=null){
ct.style.marginTop=0;
document.getElementById('index-1').style.marginTop=0;
if(window.innerWidth >=992){
dpIndexResizePosition=cumulativeOffset(dpIndex).top + dpIndex.offsetHeight;
ctPosition=cumulativeOffset(ct).top;
if(ctPosition < dpIndexResizePosition+35){
padded=document.body.classList.contains('admin-bar') ? -15:15;
newPosition=dpIndexResizePosition - ctPosition + padded;
if(newPosition < 0) newPosition=0;
ct.style.marginTop=newPosition + 'px';
if(window.innerWidth < 1200){
document.getElementById('index-1').style.marginTop=0;
}else{
document.getElementById('index-1').style.marginTop=newPosition + 'px';
}}
}}
}
setTimeout(function (){
const iubBtn=document.querySelector('.iubenda-tp-btn');
if(iubBtn){
iubBtn.style.setProperty('z-index', '999', 'important');
}}, 3000);
});
class SectionSlot {
constructor(options={}){
this.container=options.container||document.getElementById("booking-owl-reservation");
this.mapContainer=options.mapContainer||document.querySelector(".grid-booking-box-3");
this.box1Container=options.box1Container||document.querySelector(".grid-booking-box-1");
this.box2Container=options.box2Container||document.querySelector(".grid-booking-box-2");
this.containerId=options.containerId||(this.container&&this.container.id)||"booking-owl-reservation";
this.navContainerId=options.navContainerId||"custom_slider_nav";
this.clinicSlotsContainerId=options.clinicSlotsContainerId||"clinic-slots-container";
this.retryCount=0;
this.reservationArgs=null;
this.mapCreated=false;
this.reservationData={};
this.clinicsData={};
this.map=null;
this.selectedSlot=null;
this.slotCarousel=null;
this.selectedDay=null;
this.selectedClinicName=null;
this.selectedType=null;
this.selectedType=null;
this._allInfoWindows=[];
this.onSlotConfirmed=options.onSlotConfirmed||null;
this.noMoreSlots=false;
this._activeLoaderHost=null;
}
setReservationData(args){
if(typeof args==='object'&&args!==null){
this.reservationData=Object.assign({}, this.reservationData, args);
}}
getReservationData(key){
if(typeof key==='undefined'){
return this.reservationData;
}
return this.reservationData[key];
}
setClinicsData(args){
if(typeof args==='object'&&args!==null){
this.clinicsData=Object.assign({}, this.clinicsData, args);
}}
getClinicsData(key){
if(typeof key==='undefined'){
return this.clinicsData;
}
return this.clinicsData[key];
}
setClinicEsigenza(type){
this.selectedType=type;
}
getClinicEsigenza(){
return this.selectedType;
}
callReservationYes(dataArgs, callback){
jQuery.ajax({
url: ajaxurl,
type: "POST",
data: {
action: "dp_booking_slots",
data: JSON.stringify(dataArgs),
},
success: function (response){
if(typeof callback==="function"){
callback(response);
}
if(response&&response.data){
this.setClinicsData(response.data.Cliniche);
this.setReservationData(response.data.FreeOperatorSlots);
}}.bind(this),
error: function (xhr, status, error){
console.error(error);
},
});
}
initializeCarouselBooking(){
const container=this.container||document.getElementById(this.containerId);
if(container){
container.addEventListener("click", (event)=> {
const target=event.target.closest('.day');
if(target&&container.contains(target)){
this.handleDayClick(target);
}});
}
const $container=jQuery("#" + this.containerId);
if($container.hasClass("owl-carousel")){
$container.trigger("destroy.owl.carousel");
this.slotCarousel=$container.owlCarousel({
loop: false,
margin: 24,
nav: true,
dots: false,
navContainer: "#" + this.navContainerId,
navText: [
`<svg
width="19"
height="13"
viewBox="0 0 19 13"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_593_283)">
<path
d="M17.75 6.5L0.5 6.5"
stroke="url(#paint0_linear_593_283)"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M6.5 12.5L0.500001 6.5L6.5 0.500002"
stroke="url(#paint1_linear_593_283)"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<defs>
<linearGradient
id="paint0_linear_593_283"
x1="nan"
y1="nan"
x2="nan"
y2="nan"
gradientUnits="userSpaceOnUse"
>
<stop offset="0.02" stop-color="#1D3B54" />
<stop offset="1" stop-color="#215682" />
</linearGradient>
<linearGradient
id="paint1_linear_593_283"
x1="8.72"
y1="5.42"
x2="-0.46"
y2="9.9"
gradientUnits="userSpaceOnUse"
>
<stop offset="0.02" stop-color="#1D3B54" />
<stop offset="1" stop-color="#215682" />
</linearGradient>
<clipPath id="clip0_593_283">
<rect
width="18.25"
height="13"
fill="white"
transform="translate(18.25 13) rotate(-180)"
/>
</clipPath>
</defs>
</svg>`,
`<svg
width="19"
height="13"
viewBox="0 0 19 13"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_593_279)">
<path
d="M0.5 6.5H17.75"
stroke="url(#paint0_linear_593_279)"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M11.75 0.5L17.75 6.5L11.75 12.5"
stroke="url(#paint1_linear_593_279)"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<defs>
<linearGradient
id="paint0_linear_593_279"
x1="nan"
y1="nan"
x2="nan"
y2="nan"
gradientUnits="userSpaceOnUse"
>
<stop offset="0.02" stop-color="#1D3B54" />
<stop offset="1" stop-color="#215682" />
</linearGradient>
<linearGradient
id="paint1_linear_593_279"
x1="9.53"
y1="7.58"
x2="18.71"
y2="3.1"
gradientUnits="userSpaceOnUse"
>
<stop offset="0.02" stop-color="#1D3B54" />
<stop offset="1" stop-color="#215682" />
</linearGradient>
<clipPath id="clip0_593_279">
<rect width="18.25" height="13" fill="white" />
</clipPath>
</defs>
</svg><div class="lds-ripple"><div></div><div></div></div>`
],
responsive: {
0: {
items: 3,
},
600: {
items: 3,
},
1000: {
items: 3,
},
},
});
}
this.initSlotCarousel();
}
initialiseMobileBookingcarousel(){
const $container=jQuery("#" + this.clinicSlotsContainerId);
if(window.innerWidth <=991){
$container.owlCarousel({
items: 1,
nav: true,
dots: false,
margin: 16,
navText: [
`<svg width="19" height="13" viewBox="0 0 19 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_655_982)">
<path d="M17.75 6.5L0.5 6.5" stroke="url(#paint0_linear_655_982)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.5 12.5L0.500001 6.5L6.5 0.500002" stroke="url(#paint1_linear_655_982)" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<linearGradient id="paint0_linear_655_982" x1="nan" y1="nan" x2="nan" y2="nan" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<linearGradient id="paint1_linear_655_982" x1="8.72" y1="5.42" x2="-0.46" y2="9.9" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<clipPath id="clip0_655_982">
<rect width="18.25" height="13" fill="white" transform="translate(18.25 13) rotate(-180)"/>
</clipPath>
</defs>
</svg>`,
`<svg width="19" height="13" viewBox="0 0 19 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_655_977)">
<path d="M0.5 6.5H17.75" stroke="url(#paint0_linear_655_977)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.75 0.5L17.75 6.5L11.75 12.5" stroke="url(#paint1_linear_655_977)" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<linearGradient id="paint0_linear_655_977" x1="nan" y1="nan" x2="nan" y2="nan" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<linearGradient id="paint1_linear_655_977" x1="9.53" y1="7.58" x2="18.71" y2="3.1" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<clipPath id="clip0_655_977">
<rect width="18.25" height="13" fill="white"/>
</clipPath>
</defs>
</svg>
`
],
});
}else{
if($container.hasClass("owl-carousel")){
$container.trigger("destroy.owl.carousel");
$container.removeClass("owl-carousel owl-theme");
}}
this.initSlotCarousel();
}
handleDayClick(dayElem){
const dayAttribute=dayElem.getAttribute("data-date");
this.selectedDay=dayAttribute;
const scope=(this.container&&typeof this.container.closest==="function")
? this.container.closest(".grid-booking-3box")
: null;
const allDays=scope ? scope.querySelectorAll('.day'):document.querySelectorAll('.day');
allDays.forEach(day=> day.classList.remove('active'));
dayElem.classList.add('active');
this.createClinicBoxes(dayAttribute);
if(this.mapCreated){
const reservationData=this.getReservationData(dayAttribute);
if(!reservationData||typeof reservationData!=="object"){
return;
}
let clinics={};
Object.keys(reservationData).forEach((key)=> {
clinics[key]=this.getClinicsData(key);
});
this.clearAllMarkers();
this.createClinicMarkers(clinics);
}}
initSlotCarousel(){
const nextButton=this.box1Container ? this.box1Container.querySelector('.owl-next'):document.querySelector('.grid-booking-box-1 .owl-next');
if(nextButton){
nextButton.addEventListener('click', ()=> {
if(nextButton.classList.contains('ready-to-load')){
nextButton.classList.remove('ready-to-load');
nextButton.classList.remove('disabled');
nextButton.classList.add('cta', 'cta-loading');
this.addColumnToSlotCarousel();
}
if(nextButton.classList.contains('disabled')){
nextButton.classList.add('ready-to-load');
}});
}}
addColumnToSlotCarousel(){
if(this.noMoreSlots){
const nextButton=this.box1Container ? this.box1Container.querySelector('.owl-next'):document.querySelector('.grid-booking-box-1 .owl-next');
if(nextButton){
nextButton.classList.remove('cta', 'cta-loading');
}
return;
}
const newDate=nextFifteenday(reservationArgs.DataInizio);
reservationArgs.DataInizio=newDate;
this.callReservationYes(reservationArgs, (response)=> {
if(response&&response.data&&response.data.FreeOperatorSlots){
const freeSlots=response.data.FreeOperatorSlots;
if(Object.keys(freeSlots).length===0){
this.noMoreSlots=true;
const nextButton=this.box1Container ? this.box1Container.querySelector('.owl-next'):document.querySelector('.grid-booking-box-1 .owl-next');
if(nextButton){
nextButton.classList.remove('cta', 'cta-loading');
nextButton.classList.add('disabled');
}
return;
}
Object.keys(freeSlots).forEach((date)=> {
const html=this.generateSlotHtml(date, freeSlots[date]);
this.slotCarousel.trigger('add.owl.carousel', [html]);
});
this.slotCarousel.trigger('refresh.owl.carousel');
}else{
this.noMoreSlots=true;
const nextButton=this.box1Container ? this.box1Container.querySelector('.owl-next'):document.querySelector('.grid-booking-box-1 .owl-next');
if(nextButton){
nextButton.classList.remove('cta', 'cta-loading');
nextButton.classList.add('disabled');
}}
});
const nextButton=this.box1Container ? this.box1Container.querySelector('.owl-next'):document.querySelector('.grid-booking-box-1 .owl-next');
setTimeout(()=> {
if(nextButton){
nextButton.classList.remove('cta', 'cta-loading');
}}, 3000);
}
createClinicBoxes(day){
const box3Container=this.box2Container||document.querySelector(".grid-booking-box-2");
const allSlots=this.getReservationData(day);
if(!box3Container) return;
box3Container.innerHTML="";
const dateObj=new Date(day);
const dayName=dateObj.toLocaleDateString("it-IT", { weekday: "long" });
const dayNum=dateObj.toLocaleDateString("it-IT", { day: "2-digit" });
const monthName=dateObj.toLocaleDateString("it-IT", { month: "long" });
const capitalize=s => s.charAt(0).toUpperCase() + s.slice(1);
const dayNameCap=capitalize(dayName);
const monthNameCap=capitalize(monthName);
const fullDate=`${dayNameCap} <span class="w-date c-blue">${dayNum} ${monthNameCap}</span>`;
const infoDateHtml=`
<div class="info-date">
<span class="green-point"></span>
${fullDate}
</div>`;
box3Container.insertAdjacentHTML("beforeend", infoDateHtml);
const container='<div class="owl-carousel owl-theme" id="' + this.clinicSlotsContainerId + '"></div>';
box3Container.insertAdjacentHTML("beforeend", container);
const rowContainer=box3Container.querySelector('#' + this.clinicSlotsContainerId);
if(allSlots&&typeof allSlots==='object'&&Object.keys(allSlots).length > 0){
Object.entries(allSlots).forEach(([clinicaId, slotList])=> {
let clinica=this.getClinicsData(clinicaId);
if(!clinica&&typeof clinicaId==='number') clinica=this.getClinicsData(String(clinicaId));
if(!clinica&&typeof clinicaId==='string'&&/^\d+$/.test(clinicaId)) clinica=this.getClinicsData(clinicaId.padStart(3, '0'));
if(!clinica) return;
const titolo=clinica.title;
const indirizzo=clinica.address;
const linkMaps=`https://www.google.com/maps/search/?api=1&query=maida&query_place_id=${clinica.gmaps_place_id}`;
let clinicInfoHtml=`
<div class="clinic-info item">
<h4>${titolo}</h4>
<div class="address"><span>${this.getAddressSvg()}</span>${indirizzo}</div>
<div class="maps-link-container">
<span>${this.getMapSvg()}</span>
<a class="maps-link" href="${linkMaps}" target="_blank">Mappa</a>
</div>
<button class="mobile-set-time">Scegli orario</button>
</div>
`;
let slotsHtml='<div class="clinic-slots">';
slotList.forEach(slot=> {
const orarioInizio=slot.DataInizioSlot;
slotsHtml +=`
<div class="slot-btn time" data-time="${orarioInizio}">
<strong>${orarioInizio}</strong>
</div>
`;
});
slotsHtml +='</div>';
const clinicRowHtml=`
<div class="clinic-row" data-clinica-indirizzo="${indirizzo}" data-clinica-nome="${titolo}" data-clinica-id="${clinicaId}">
${clinicInfoHtml}
${slotsHtml}
</div>
`;
rowContainer.insertAdjacentHTML("beforeend", clinicRowHtml);
});
this.initMobileSetTimeModal();
this.initialiseMobileBookingcarousel();
}else{
box3Container.insertAdjacentHTML("beforeend", "<p>Nessuno slot disponibile per questa data.</p>");
}
const slotBtns=box3Container.querySelectorAll('.slot-btn.time');
slotBtns.forEach(btn=> {
btn.addEventListener('click', (e)=> {
this.handleSlotClick(e.currentTarget);
});
});
}
selectFirstAvailableDay(){
const scope=this.container||document;
const days=(scope&&scope.querySelectorAll) ? scope.querySelectorAll('.day'):document.querySelectorAll('.day');
const alreadyActive=Array.from(days).some(day=> day.classList.contains('active'));
if(days.length > 0&&!alreadyActive){
setTimeout(()=> {
this.handleDayClick(days[0]);
}, 500);
}}
handleSlotClick(slotBtn){
const formSection4=document.querySelector(".booking-section.section-4");
const subtitleSection4=formSection4.querySelector(".subtitle");
subtitleSection4.classList.add("d-none");
const dayDate=this.selectedDay ? this.selectedDay:null;
const clinicRow=slotBtn.closest('.clinic-row');
this.selectedClinicName=clinicRow ? clinicRow.getAttribute('data-clinica-nome'):null;
this.selectedClinicAddress=clinicRow ? clinicRow.getAttribute('data-clinica-indirizzo'):null;
const clinicId=clinicRow ? clinicRow.getAttribute('data-clinica-id'):null;
const time=slotBtn.getAttribute('data-time');
const slotList=this.reservationData[dayDate]&&this.reservationData[dayDate][clinicId];
const selectedSlotObj=Array.isArray(slotList)
? slotList.find(slot=> slot.DataInizioSlot===time)
: null;
if(selectedSlotObj){
document.querySelectorAll('.slot-btn.time.active').forEach(btn=> btn.classList.remove('active'));
slotBtn.classList.add('active');
this.selectedSlot=selectedSlotObj;
if(this._allMarkers&&Array.isArray(this._allMarkers)){
this._allMarkers.forEach(marker=> {
if(marker&&marker.title){
let markerClinicId=null;
for (const [id, clinic] of Object.entries(this.clinicsData)){
if(clinic&&clinic.title&&marker.title===clinic.title){
markerClinicId=id;
break;
}}
if(markerClinicId===clinicId){
marker.setIcon({
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(this.getSvgActive()),
scaledSize: new google.maps.Size(28, 39),
anchor: new google.maps.Point(14, 39)
});
}else{
marker.setIcon({
url: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(this.getSvgStd()),
scaledSize: new google.maps.Size(28, 39),
anchor: new google.maps.Point(14, 39)
});
}}
});
}
const allExtra=clinicRow.parentNode.querySelectorAll('.slot-extra-info');
allExtra.forEach(div=> {
$(div).stop(true, true).slideUp(250, function (){
div.remove();
});
});
setTimeout(()=> {
this.createAndShowExtra(clinicRow, selectedSlotObj);
}, 260);
}else{
this.selectedSlot=null;
}}
createAndShowExtra(clinicRow, selectedSlotObj){
const extraDiv=document.createElement('div');
extraDiv.className='slot-extra-info';
extraDiv.style.display='none';
extraDiv.innerHTML=`  <div class="slot-data">${selectedSlotObj.DataInizioSlot} - ${clinicRow.getAttribute('data-clinica-nome')}</div>
<span class="confirm-slot-btn">
<span class="confirm-text">Conferma</span>
<svg
width="7"
height="13"
viewBox="0 0 7 13"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M0.5 0.5L6.5 6.5L0.5 12.5"
stroke="white"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</span>`;
clinicRow.parentNode.insertBefore(extraDiv, clinicRow.nextSibling);
$(extraDiv).slideDown(250);
extraDiv.querySelector('.confirm-slot-btn').addEventListener('click', ()=> {
this.showSummary(false);
this.handleConfirmSlotClick(selectedSlotObj, clinicRow);
});
}
handleConfirmSlotClick(slotObj, clinicRow){
if(this.selectedDay&&clinicRow.getAttribute('data-clinica-id')){
const clinicId=clinicRow ? clinicRow.getAttribute('data-clinica-id'):null;
if(typeof this.onSlotConfirmed==='function'){
this.onSlotConfirmed({
slot: slotObj,
clinicId: clinicId,
day: this.selectedDay
});
}}
}
showSummary(show){
const s4FormContainer=document.querySelector(".section-4__form-container");
const s4Summary=document.querySelector(".section-4__summary");
const summaryType=s4Summary.querySelector("#summary-esigenza");
const summaryClinics=s4Summary.querySelector("#summary-clinica");
const summaryDate=s4Summary.querySelector("#summary-data");
const summaryTime=s4Summary.querySelector("#summary-ora");
const summaryClinicAddress=s4Summary.querySelector("#summary-address");
const dateObj=new Date(this.selectedDay);
const formattedDate=`${dateObj.getDate().toString().padStart(2, '0')}/${(dateObj.getMonth() + 1).toString().padStart(2, '0')}/${dateObj.getFullYear()}`;
if(show){
summaryType.textContent=this.getClinicEsigenza()||"";
summaryClinics.textContent=this.selectedClinicName||"";
summaryDate.textContent=formattedDate||"";
summaryTime.textContent=this.selectedSlot ? "ore " + this.selectedSlot.DataInizioSlot:"";
summaryClinicAddress.textContent=this.selectedClinicAddress||"";
s4FormContainer.classList.add("col-lg-8");
s4Summary.classList.remove("d-none");
}else{
s4FormContainer.classList.remove("col-lg-8");
s4Summary.classList.add("d-none");
}}
initBookingMap(clinicsObj, mapDiv){
if(!window.google||!window.google.maps) return;
var keys=Object.keys(clinicsObj);
if(keys.length===0) return;
var searchCoords=this.getBookingAddressCoords();
let center;
if(searchCoords&&searchCoords.length > 0&&searchCoords[0]&&searchCoords[1]){
center={
lat: parseFloat(searchCoords[0].Latitudine),
lng: parseFloat(searchCoords[0].Longitudine),
};}else{
var firstClinic=clinicsObj[keys[0]];
center={
lat: parseFloat(firstClinic.position.lat),
lng: parseFloat(firstClinic.position.lng),
};}
var mapOptions={
mapTypeId: "bookingMapStyle",
disableDefaultUI: true,
zoom: 14,
clickableIcons: false,
draggable: false,
scrollwheel: false,
disableDoubleClickZoom: true,
gestureHandling: 'none',
center: center
};
this.map=new google.maps.Map(mapDiv, mapOptions);
this.map.mapTypes.set("bookingMapStyle",
new google.maps.StyledMapType(shortcodeMapStyle, {
name: "Booking Map Style",
})
);
this.mapCreated=true;
const clinicMarkers=this.createClinicMarkers(clinicsObj, "clinic");
let searchMarkers={};
if(searchCoords&&searchCoords.length > 0&&keys.length > 1){
const searchMarkersObj={};
searchCoords.forEach(function (coord, index){
if(coord&&coord.Latitudine&&coord.Longitudine){
searchMarkersObj["search_" + index]={
position: {
lat: parseFloat(coord.Latitudine),
lng: parseFloat(coord.Longitudine)
}};}});
searchMarkers=this.createClinicMarkers(searchMarkersObj, "search");
}
const allMarkers=[
...Object.values(clinicMarkers||{}),
...Object.values(searchMarkers||{})
];
if(allMarkers.length > 1){
const bounds=new google.maps.LatLngBounds();
allMarkers.forEach(marker=> {
bounds.extend(marker.getPosition());
});
this.map.fitBounds(bounds);
}else if(allMarkers.length===1){
this.map.panTo(allMarkers[0].getPosition());
this.map.setZoom(12);
}}
createClinicMarkers(clinicsObj, type="clinic"){
const markers={};
if(!this._allMarkers) this._allMarkers=[];
if(!this._allInfoWindows) this._allInfoWindows=[];
Object.keys(clinicsObj).forEach((key)=> {
const clinic=clinicsObj[key];
console.log(clinic);
if(clinic &&
clinic.position &&
clinic.position.lat &&
clinic.position.lng
){
const marker=new google.maps.Marker({
position: {
lat: parseFloat(clinic.position.lat),
lng: parseFloat(clinic.position.lng),
},
map: this.map,
icon: {
url:
type==="clinic"
? "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(this.getSvgStd())
: "data:image/svg+xml;charset=UTF-8," + encodeURIComponent(this.getSearchLocationSvg()),
...(type==="search"
? { scaledSize: new google.maps.Size(27, 27), anchor: new google.maps.Point(13.5, 13.5) }
: {}),
},
title: clinic.title||"",
});
if(type==="clinic"){
const healthDirectorHtml=(clinic.health_director)
? `<br><span class="box-location-address dp-text-xs-important"><span class="icon-Emoji me-1 dp-text-m"></span>Dir. Sanitario ${clinic.health_director}</span>`
: "";
const infoContent=`<div style='font-size:15px; display: flex; flex-direction: column; gap: 5px;'><strong>${clinic.title||""}</strong><br>${clinic.address||""}${healthDirectorHtml}</div>`;
const infoWindow=new google.maps.InfoWindow({
content: infoContent
});
this._allInfoWindows.push(infoWindow);
marker.addListener('click', ()=> {
if(this._allInfoWindows&&Array.isArray(this._allInfoWindows)){
this._allInfoWindows.forEach(iw=> {
try { iw.close(); } catch (e){ }});
}
if(typeof infoWindow.open==='function'&&infoWindow.open.length===1){
infoWindow.open(marker.getMap(), marker);
}else{
infoWindow.open({
anchor: marker,
map: marker.getMap(),
shouldFocus: false,
disableAutoPan: true
});
}
if(window.innerWidth > 991){
const clinicaId=clinic.id||clinic.clinicaId||clinic.ClinicaId||clinic.Codice||clinic.cod||clinic.COD||key;
const row=document.querySelector(`.clinic-row[data-clinica-id="${clinicaId}"]`);
if(row){
row.scrollIntoView({ behavior: "smooth", block: "center" });
if(row._highlightTimeout){
clearTimeout(row._highlightTimeout);
row.classList.remove('highlighted');
}
void row.offsetWidth;
row.classList.add('highlighted');
row._highlightTimeout=setTimeout(()=> {
row.classList.remove('highlighted');
row._highlightTimeout=null;
}, 2000);
}}
});
}
markers[key]=marker;
if(type=="clinic"){
this._allMarkers.push(marker);
}}
});
return markers;
}
clearAllMarkers(){
if(this._allMarkers&&Array.isArray(this._allMarkers)){
this._allMarkers.forEach(marker=> {
if(marker&&typeof marker.setMap==='function'){
marker.setMap(null);
}});
}
this._allMarkers=[];
}
generateSlotHtml(date){
let html='<div class="item">';
html +='<div class="day" data-date="' + date + '">';
const day=this.formatDateItalianShort(date);
html +='<span class="w-day">' + day.dayName + ' <span class="w-date">' + day.dayDate + "</span>";
html +="</div>";
html +="</div>";
return html;
}
showLoader(overrideHost){
const host=overrideHost||this.box1Container;
if(!host) return;
const existingLoader=host.querySelector(".booking-loader");
if(existingLoader){
existingLoader.remove();
}
this._activeLoaderHost=host;
const loader=document.createElement("div");
loader.className="booking-loader";
const loaderSpinner=document.createElement("div");
loaderSpinner.className="loader";
loader.appendChild(loaderSpinner);
host.style.position="relative";
host.appendChild(loader);
if(!overrideHost&&this.box2Container) this.box2Container.style.display="none";
}
hideLoader(){
const host=this._activeLoaderHost||this.box1Container;
const loader=host&&host.querySelector ? host.querySelector(".booking-loader"):null;
if(loader){
loader.remove();
}
this._activeLoaderHost=null;
if(this.box2Container) this.box2Container.style.display="grid";
}
getBookingAddressCoords(){
var coords=[];
var addressInputs=document.querySelectorAll(".autocomplete.booking-address"
);
addressInputs.forEach(function (input){
var latField=input.parentNode.querySelector(".booking-lat");
var lngField=input.parentNode.querySelector(".booking-lng");
if(latField&&lngField&&latField.value&&lngField.value){
coords.push({
Latitudine: latField.value.toString(),
Longitudine: lngField.value.toString(),
});
}else{
coords.push(null);
}});
return coords;
}
getSvgStd(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="39" viewBox="0 0 28 39" fill="none">',
'<path d="M13.9651 0.000414856C24.6085 -0.0793662 31.4922 11.3638 26.148 20.579C22.6761 26.566 18.711 32.2674 15.0071 38.122C14.3284 39.1946 13.8654 39.361 13.1236 38.1924C9.32142 32.2039 5.20435 26.3942 1.72551 20.2259C-3.38072 11.1737 3.48221 0.0797035 13.9651 0.000414856ZM13.8561 21.5103C18.1074 21.6058 21.6637 18.1994 21.7486 13.9508C21.8306 9.86076 18.4573 6.33119 14.3195 6.17803C10.0495 6.01945 6.4645 9.35795 6.34011 13.609C6.21573 17.8576 9.59931 21.4152 13.8561 21.5108V21.5103Z" fill="#565658"/>',
"</svg>",
].join("");
}
getSvgActive(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="39" viewBox="0 0 28 39" fill="none">',
'<path d="M13.9651 0.000414856C24.6085 -0.0793662 31.4922 11.3638 26.148 20.579C22.6761 26.566 18.711 32.2674 15.0071 38.122C14.3284 39.1946 13.8654 39.361 13.1236 38.1924C9.32142 32.2039 5.20435 26.3942 1.72551 20.2259C-3.38072 11.1737 3.48221 0.0797035 13.9651 0.000414856ZM13.8561 21.5103C18.1074 21.6058 21.6637 18.1994 21.7486 13.9508C21.8306 9.86076 18.4573 6.33119 14.3195 6.17803C10.0495 6.01945 6.4645 9.35795 6.34011 13.609C6.21573 17.8576 9.59931 21.4152 13.8561 21.5108V21.5103Z" fill="#66C1BF"/>',
"</svg>",
].join("");
}
getSearchLocationSvg(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="27" height="27" viewBox="0 0 27 27" fill="none">',
'<circle cx="13.5" cy="13.5" r="13.5" fill="#295782" fill-opacity="0.3"/>',
'<circle cx="13.5" cy="13.5" r="8.5" fill="#295782"/>',
"</svg>",
].join("");
}
getAddressSvg(){
return `<svg width="9" height="13" viewBox="0 0 9 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.4888 0.000138285C7.90988 -0.0264554 10.1225 3.78793 8.40472 6.85967C7.28874 8.85534 6.01427 10.7558 4.82372 12.7073C4.60557 13.0649 4.45675 13.1203 4.21829 12.7308C2.99617 10.7346 1.67283 8.79805 0.554627 6.74197C-1.08666 3.72457 1.11928 0.0265678 4.4888 0.000138285ZM4.45373 7.17009C5.82023 7.20194 6.96334 6.06645 6.99063 4.65026C7.01696 3.28692 5.93272 2.1104 4.60271 2.05934C3.23019 2.00648 2.07787 3.11932 2.03789 4.53633C1.99791 5.95253 3.08549 7.13841 4.45373 7.17026V7.17009Z" fill="#295782"/>
</svg>`;
}
getMapSvg(){
return `<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.164159 9.94177C0.265179 10.0081 0.39356 10.0175 0.504051 9.96913L3.57256 8.60511L6.64106 9.96913C6.64632 9.97124 6.65264 9.96913 6.6579 9.97229C6.74419 10.0112 6.8431 10.0091 6.92834 9.96598C6.9336 9.96387 6.94097 9.96598 6.94623 9.96177L9.80217 8.53354C9.8611 8.50407 9.91161 8.45882 9.94633 8.40198C9.98106 8.34515 10 8.28095 10 8.21464V0.357829C10 0.233635 9.93581 0.118914 9.83058 0.0536602C9.72535 -0.011594 9.59381 -0.0179089 9.48332 0.0378729L6.77786 1.39137L3.71567 0.031558C3.71567 0.031558 3.70515 0.029453 3.69988 0.027348C3.6862 0.0220856 3.67252 0.0178757 3.65779 0.0147182C3.64306 0.0105083 3.62938 0.00840329 3.61465 0.00629832C3.58518 0.00419334 3.55677 0.00419334 3.52731 0.00629832C3.51257 0.00840329 3.49784 0.0115607 3.48416 0.0147182C3.46943 0.0178757 3.45575 0.0220856 3.44207 0.027348C3.43681 0.029453 3.4305 0.029453 3.42629 0.031558L0.212564 1.45978C0.149426 1.4882 0.0957592 1.53346 0.0578765 1.59134C0.0199937 1.64923 0 1.71659 0 1.78605V9.64181C0 9.76285 0.0610334 9.87546 0.162054 9.94072L0.164159 9.94177ZM9.28338 7.99362L7.1409 9.06505V2.00707L9.28338 0.935644V7.99362ZM6.42744 9.09347L3.92823 7.98204V0.908279L6.42744 2.01865V9.09241V9.09347ZM0.715564 2.01865L3.21477 0.908279V7.98204L0.715564 9.09241V2.01865Z" fill="#295782"/>
</svg>`;
}
_slotListForClinicOnDay(daySlots, clinicId){
if(!daySlots||typeof daySlots!=="object") return [];
if(daySlots[clinicId]!==undefined) return daySlots[clinicId];
const s=String(clinicId);
if(daySlots[s]!==undefined) return daySlots[s];
if(/^\d+$/.test(s)&&daySlots[s.padStart(3, "0")]!==undefined){
return daySlots[s.padStart(3, "0")];
}
return [];
}
initMobileSetTimeModal(){
document.addEventListener('click', (e)=> {
const btn=e.target.closest('.mobile-set-time');
if(!btn) return;
const clinicRow=btn.closest('.clinic-row');
if(!clinicRow) return;
const rowGrid=clinicRow.closest('.grid-booking-3box');
const selfGrid =
this.container&&typeof this.container.closest==='function'
? this.container.closest('.grid-booking-3box')
: null;
if(!rowGrid||!selfGrid||rowGrid!==selfGrid) return;
const clinicId=clinicRow.getAttribute('data-clinica-id');
const scope=selfGrid;
const dayElem=scope.querySelector('.day.active');
const dayDate=dayElem ? dayElem.getAttribute('data-date'):null;
if(!clinicId||!dayDate) return;
const daySlots=this.getReservationData(dayDate);
const slotList=this._slotListForClinicOnDay(daySlots, clinicId);
let clinic=this.getClinicsData(clinicId);
if(!clinic&&typeof clinicId==='string'&&/^\d+$/.test(clinicId)){
clinic=this.getClinicsData(clinicId.padStart(3, '0'));
}
if(!clinic) return;
this.openMobileSlotModal(clinic, slotList, dayDate);
});
}
updateMobileSlotModalFooter(clinic, selectedSlot, summaryElem, confirmBtnElem){
if(selectedSlot){
document.querySelector('.modal-summary-time').innerHTML=selectedSlot.DataInizioSlot;
confirmBtnElem.disabled=false;
}else{
confirmBtnElem.disabled=true;
}}
openMobileSlotModal(clinic, slotList, dayDate){
let existing=document.getElementById('mobile-slot-modal');
if(existing) existing.remove();
let slotsHtml='';
slotList.forEach(slot=> {
slotsHtml +=`<div class="modal-slot-btn" data-time="${slot.DataInizioSlot}">${slot.DataInizioSlot}</div>`;
});
const day=this.formatDateItalianShort(dayDate);
const modalHtml=`
<div class="modal-header">
<button class="modal-back-btn"><svg width="19" height="13" viewBox="0 0 19 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_655_982)">
<path d="M17.75 6.5L0.5 6.5" stroke="url(#paint0_linear_655_982)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.5 12.5L0.500001 6.5L6.5 0.500002" stroke="url(#paint1_linear_655_982)" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<linearGradient id="paint0_linear_655_982" x1="nan" y1="nan" x2="nan" y2="nan" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<linearGradient id="paint1_linear_655_982" x1="8.72" y1="5.42" x2="-0.46" y2="9.9" gradientUnits="userSpaceOnUse">
<stop offset="0.02" stop-color="#1D3B54"/>
<stop offset="1" stop-color="#215682"/>
</linearGradient>
<clipPath id="clip0_655_982">
<rect width="18.25" height="13" fill="white" transform="translate(18.25 13) rotate(-180)"/>
</clipPath>
</defs>
</svg>
Torna indietro</button>
</div>
<div class="modal-list-wrap">
${slotsHtml}
</div>
<div class="modal-footer">
<div class="modal-summary">${clinic.title}</div>
<div class="modal-summary">
<span>
${day.dayName}
</span>
<span>
${day.dayDate}
</span>
</div>
<div class="modal-summary modal-summary-time"></div>
<button class="modal-confirm-btn" disabled>Conferma</button>
</div>`;
const modal=document.createElement('div');
modal.id='mobile-slot-modal';
modal.className='mobile-slot-modal';
modal.innerHTML=modalHtml;
document.body.appendChild(modal);
const backBtn=modal.querySelector('.modal-back-btn');
backBtn.addEventListener('click', ()=> modal.remove());
const slotBtns=modal.querySelectorAll('.modal-slot-btn');
const summary=modal.querySelector('.modal-summary');
const confirmBtn=modal.querySelector('.modal-confirm-btn');
let selectedSlot=null;
slotBtns.forEach(btn=> {
btn.addEventListener('click', ()=> {
slotBtns.forEach(b=> b.classList.remove('selected'));
btn.classList.add('selected');
selectedSlot=slotList.find(slot=> slot.DataInizioSlot===btn.getAttribute('data-time'));
this.updateMobileSlotModalFooter(clinic, selectedSlot, summary, confirmBtn);
});
});
confirmBtn.addEventListener('click', ()=> {
if(selectedSlot){
const clinicRowLike={
getAttribute: function (attr){
if(attr==='data-clinica-id') return clinic.id||clinic.clinicaId||clinic.ClinicaId||clinic.Codice||clinic.cod||clinic.COD||null;
if(attr==='data-clinica-nome') return clinic.title||clinic.nome||clinic.Nome||null;
return null;
}};
this.selectedSlot=selectedSlot;
this.selectedClinicName=clinic.title||clinic.nome||clinic.Nome||"";
this.selectedClinicAddress=clinic.address||clinic.indirizzo||clinic.Indirizzo||"";
this.selectedDay=dayDate;
this.handleConfirmSlotClick(selectedSlot, clinicRowLike);
modal.remove();
}});
}
formatDateItalianShort(date){
const capitalize=s => s.charAt(0).toUpperCase() + s.slice(1);
const dayName=capitalize(new Date(date).toLocaleDateString("it-IT", {
weekday: "short",
}));
const dayDate=capitalize(new Date(date).toLocaleDateString("it-IT", {
day: "2-digit",
month: "short",
}));
return { dayName: dayName, dayDate: dayDate };}};
class BookingSelezioneCentri {
constructor(container, options={}){
this.container=typeof container==='string'
? document.querySelector(container)
: container;
if(!this.container){
console.error('Container non trovato per BookingSelezioneCentri');
return;
}
this.options={
minChars: options.minChars||3,
apiUrl: options.apiUrl||null,
placeholder: options.placeholder||'Cerca una clinica...',
onSelect: options.onSelect||null,
...options
};
this.input=null;
this.resultsContainer=null;
this.selectedClinic=null;
this.searchTimeout=null;
this.isLoading=false;
this.init();
}
init(){
this.createInput();
this.createResultsContainer();
this.attachEvents();
}
createInput(){
console.log("CreateInput");
this.input=document.createElement('input');
this.input.type='text';
this.input.className='booking-selezione-centri-input';
this.input.placeholder=this.options.placeholder;
this.input.setAttribute('autocomplete', 'off');
this.container.appendChild(this.input);
}
createResultsContainer(){
this.resultsContainer=document.createElement('div');
this.resultsContainer.className='booking-selezione-centri-results';
this.resultsContainer.style.display='none';
this.container.appendChild(this.resultsContainer);
}
attachEvents(){
this.input.addEventListener('input', (e)=> {
this.handleInput(e);
});
document.addEventListener('click', (e)=> {
if(!this.container.contains(e.target)){
this.hideResults();
}});
this.input.addEventListener('keydown', (e)=> {
this.handleKeydown(e);
});
}
handleInput(e){
const searchTerm=e.target.value.trim();
if(this.searchTimeout){
clearTimeout(this.searchTimeout);
}
if(searchTerm.length < this.options.minChars){
this.hideResults();
return;
}
this.searchTimeout=setTimeout(()=> {
this.searchClinics(searchTerm);
}, 300);
}
handleKeydown(e){
const results=this.resultsContainer.querySelectorAll('.booking-selezione-centri-result-item');
if(results.length===0) return;
const currentActive=this.resultsContainer.querySelector('.booking-selezione-centri-result-item.active');
let nextActive=null;
if(e.key==='ArrowDown'){
e.preventDefault();
if(currentActive){
nextActive=currentActive.nextElementSibling;
}else{
nextActive=results[0];
}}else if(e.key==='ArrowUp'){
e.preventDefault();
if(currentActive){
nextActive=currentActive.previousElementSibling;
}else{
nextActive=results[results.length - 1];
}}else if(e.key==='Enter'&&currentActive){
e.preventDefault();
currentActive.click();
return;
}else if(e.key==='Escape'){
this.hideResults();
return;
}
if(nextActive){
results.forEach(item=> item.classList.remove('active'));
nextActive.classList.add('active');
nextActive.scrollIntoView({ block: 'nearest' });
}}
searchClinics(searchTerm){
if(this.isLoading) return;
this.isLoading=true;
this.showLoading();
this.fetchBookingClinics(searchTerm, (results)=> {
const mappedResults=Array.isArray(results)
? results.map(clinic=> ({
id_clinica: clinic.ID,
nome_clinica: clinic.title,
indirizzo_clinica: clinic.address||'',
cod: clinic.cod||''
}))
: [];
this.displayResults(mappedResults);
this.isLoading=false;
});
}
fetchBookingClinics(searchTerm, callback){
jQuery.ajax({
url: ajaxurl,
type: "POST",
data: {
action: "dp_booking_search_clinics",
data: JSON.stringify({ search: searchTerm }),
},
success: function (response){
if(response.success&&Array.isArray(response.data)){
if(typeof callback==="function"){
callback(response.data);
}}else{
if(typeof callback==="function"){
callback([]);
}}
},
error: function (xhr, status, error){
console.error(error);
if(typeof callback==="function"){
callback([]);
}},
});
}
showLoading(){
this.resultsContainer.innerHTML='<div class="booking-selezione-centri-loading">Caricamento...</div>';
this.resultsContainer.style.display='block';
}
displayResults(results){
if(results.length===0){
this.resultsContainer.innerHTML='<div class="booking-selezione-centri-no-results">Nessun risultato trovato</div>';
this.resultsContainer.style.display='block';
return;
}
this.resultsContainer.innerHTML='';
results.forEach((clinic)=> {
const resultItem=document.createElement('div');
resultItem.className='booking-selezione-centri-result-item';
resultItem.setAttribute('data-clinic-id', clinic.id_clinica);
resultItem.innerHTML=`
<div class="booking-selezione-centri-result-name">${this.highlightText(clinic.nome_clinica, this.input.value)}</div>
<div class="booking-selezione-centri-result-address">${this.highlightText(clinic.indirizzo_clinica, this.input.value)}</div>
`;
resultItem.addEventListener('click', ()=> {
this.selectClinic(clinic);
});
resultItem.addEventListener('mouseenter', ()=> {
this.resultsContainer.querySelectorAll('.booking-selezione-centri-result-item').forEach(item=> {
item.classList.remove('active');
});
resultItem.classList.add('active');
});
this.resultsContainer.appendChild(resultItem);
});
this.resultsContainer.style.display='block';
}
highlightText(text, searchTerm){
if(!searchTerm) return text;
const regex=new RegExp(`(${this.escapeRegex(searchTerm)})`, 'gi');
return text.replace(regex, '<mark>$1</mark>');
}
escapeRegex(string){
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
hideResults(){
this.resultsContainer.style.display='none';
}
selectClinic(clinic){
this.selectedClinic=clinic;
this.input.value=clinic.nome_clinica;
this.hideResults();
if(this.options.onSelect&&typeof this.options.onSelect==='function'){
this.options.onSelect(clinic);
}
const event=new CustomEvent('clinicSelected', {
detail: { clinic: clinic }});
this.container.dispatchEvent(event);
}
getSelectedClinic(){
return this.selectedClinic;
}
reset(){
this.input.value='';
this.selectedClinic=null;
this.hideResults();
}
destroy(){
if(this.searchTimeout){
clearTimeout(this.searchTimeout);
}
if(this.input){
this.input.remove();
}
if(this.resultsContainer){
this.resultsContainer.remove();
}}
}
if(typeof window!=='undefined'){
window.BookingSelezioneCentri=BookingSelezioneCentri;
};
(function (global){
"use strict";
var FORM_ID_DIRECT="booking_online";
var FORM_ID_RICONTATTO="form_ricontatto";
var RICONTATTO_LEAD_STORAGE_KEY="dp_booking_ricontatto_generate_lead";
var RICONTATTO_LEAD_PENDING_KEY="dp_booking_ricontatto_thankyou_pending";
var DIRECT_CLOSE_STORAGE_KEY="dp_booking_direct_close_convert_lead";
var DIRECT_CLOSE_PENDING_KEY="dp_booking_direct_thankyou_pending";
var FUNNEL_STEP_BY_NAME={
identificazione_ospite: 1,
selezione_account: 1,
tipologia_visita: 2,
specialistica: 3,
centro_o_zona: 4,
preferenza_orario: 5,
selezione_slot: 6,
selezione_slot_primo_appuntamento: 6,
selezione_slot_secondo_appuntamento: 7,
richiesta_ricontatto_da_slot: 6,
riepilogo_appuntamenti: 8,
dati_personali_e_conferma: 9,
conferma_prenotazione: 10,
};
function resolveFunnelStepNumber(nomeStep){
var key=normalizeValue(nomeStep);
if(Object.prototype.hasOwnProperty.call(FUNNEL_STEP_BY_NAME, key)){
return FUNNEL_STEP_BY_NAME[key];
}
return 1;
}
function isBookingGraziePrenotaPath(){
if(!global.location||!global.location.pathname) return false;
return global.location.pathname.indexOf("grazie-prenota")!==-1;
}
function installBookingThankyouDuplicateGuard(){
if(!isBookingGraziePrenotaPath()) return;
var ricontattoPending=false;
var directPending=false;
try {
ricontattoPending =
global.sessionStorage.getItem(RICONTATTO_LEAD_PENDING_KEY)==="1";
directPending=global.sessionStorage.getItem(DIRECT_CLOSE_PENDING_KEY)==="1";
} catch (e){
return;
}
if(!ricontattoPending&&!directPending) return;
if(ricontattoPending) global.__dpBookingRicontattoThankyouGuardActive=true;
if(directPending) global.__dpBookingDirectThankyouGuardActive=true;
var dl=(global.dataLayer=global.dataLayer||[]);
if(dl.__dpThankyouPushGuardInstalled) return;
dl.__dpThankyouPushGuardInstalled=true;
var originalPush=dl.push;
dl.__dpThankyouOriginalPush=originalPush;
dl.push=function (){
var allowed=[];
for (var i=0; i < arguments.length; i++){
var item=arguments[i];
if(shouldBlockDuplicateThankyouEvent(item)) continue;
allowed.push(item);
}
if(!allowed.length) return 0;
return originalPush.apply(dl, allowed);
};}
function pushThankyouPayloadBypassGuard(payload, kind){
var dl=global.dataLayer;
if(!dl) return;
if(kind==="ricontatto") global.__dpBookingRicontattoCompleteLeadPushed=true;
if(kind==="direct") global.__dpBookingDirectCloseConvertPushed=true;
if(typeof dl.__dpThankyouOriginalPush==="function"){
dl.__dpThankyouOriginalPush.call(dl, payload);
return;
}
if(typeof dl.push==="function") dl.push(payload);
}
function isCompleteRicontattoGenerateLead(item){
return !!(
item &&
item.event==="generate_lead" &&
item.formID===FORM_ID_RICONTATTO &&
item.tipologia_visita
);
}
function isCompleteDirectCloseConvert(item){
return !!(
item &&
item.event==="close_convert_lead" &&
item.formID===FORM_ID_DIRECT &&
item.tipologia_visita
);
}
function shouldBlockDuplicateThankyouEvent(item){
if(!item) return false;
if(global.__dpBookingDirectThankyouGuardActive&&item.event==="generate_lead"){
return true;
}
if(global.__dpBookingRicontattoThankyouGuardActive&&item.event==="close_convert_lead"){
return true;
}
if(global.__dpBookingRicontattoThankyouGuardActive&&item.event==="generate_lead"){
if(global.__dpBookingRicontattoCompleteLeadPushed) return true;
if(isCompleteRicontattoGenerateLead(item)){
global.__dpBookingRicontattoCompleteLeadPushed=true;
return false;
}
return true;
}
if(global.__dpBookingDirectThankyouGuardActive&&item.event==="close_convert_lead"){
if(global.__dpBookingDirectCloseConvertPushed) return true;
if(isCompleteDirectCloseConvert(item)){
global.__dpBookingDirectCloseConvertPushed=true;
return false;
}
return true;
}
return false;
}
installBookingThankyouDuplicateGuard();
var funnelTrackingActive=false;
var persistedTipologiaVisita="";
var persistedSpecialistica="";
var persistedEmailCustomer="";
function stripHtml(value){
if(value==null||value==="") return "";
var str=String(value);
if(str.indexOf("<")!==-1&&global.document&&global.document.createElement){
var tmp=global.document.createElement("div");
tmp.innerHTML=str;
str=tmp.textContent||tmp.innerText||"";
}
return str.trim();
}
function normalizeValue(value){
if(value==null||value==="") return "";
var str=String(value).trim().toLowerCase();
str=str
.replace(/[àáâä]/g, "a")
.replace(/[èéêë]/g, "e")
.replace(/[ìíîï]/g, "i")
.replace(/[òóôö]/g, "o")
.replace(/[ùúûü]/g, "u")
.replace(/ñ/g, "n")
.replace(/ç/g, "c");
return str
.replace(/[^a-z0-9\s_-]/g, "")
.replace(/[\s-]+/g, "_")
.replace(/_+/g, "_")
.replace(/^_|_$/g, "");
}
function pushDataLayer(payload){
var dl=global.dataLayer;
if(typeof dl!=="undefined"&&dl&&typeof dl.push==="function"){
dl.push(payload);
}}
function isDirectBookingFlagTrue(){
if(switchedToRicontattoMidFunnel) return false;
if(typeof global.directBooking!=="undefined"&&global.directBooking===true) return true;
if(global.window&&global.window.directBooking===true) return true;
if(typeof global.selectedCardDirectBooking!=="undefined"&&global.selectedCardDirectBooking==="1"){
return true;
}
if(global.window&&global.window.selectedCardDirectBooking==="1") return true;
if(typeof global.bookingReservationDirectBookingParam==="function"){
return global.bookingReservationDirectBookingParam()==="1";
}
return false;
}
function hasSelectedEsigenzaCard(){
return !!(
global.document&&global.document.querySelector(".card-esigenza.selected")
);
}
var lastFormModeCard=null;
var switchedToRicontattoMidFunnel=false;
function getFormIdFromCard(card){
if(!card) return null;
var attr=card.getAttribute("data-direct-booking");
if(attr==="1") return FORM_ID_DIRECT;
if(attr==="0") return FORM_ID_RICONTATTO;
return null;
}
function syncFormModeFromCard(card){
if(switchedToRicontattoMidFunnel) return;
if(!card){
card =
global.document&&global.document.querySelector(".card-esigenza.selected");
}
if(!card) return;
lastFormModeCard=card;
var attr=card.getAttribute("data-direct-booking");
if(attr==null) return;
global.selectedCardDirectBooking=attr;
global.directBooking=attr==="1";
if(global.window){
global.window.selectedCardDirectBooking=attr;
global.window.directBooking=attr==="1";
}}
function getActiveFormId(){
if(switchedToRicontattoMidFunnel) return FORM_ID_RICONTATTO;
var fromCard=getFormIdFromCard(
lastFormModeCard ||
(global.document&&global.document.querySelector(".card-esigenza.selected"))
);
if(fromCard) return fromCard;
if(!hasSelectedEsigenzaCard()){
return FORM_ID_DIRECT;
}
return isDirectBookingFlagTrue() ? FORM_ID_DIRECT:FORM_ID_RICONTATTO;
}
function getBookingData(){
if(typeof global.bookingData!=="undefined"&&global.bookingData) return global.bookingData;
if(global.window&&global.window.bookingData) return global.window.bookingData;
return {};}
function isAreaPazientiContext(){
if(global.location&&global.location.href.indexOf("area-pazienti")!==-1) return true;
return !!(
global.document &&
global.document.body &&
global.document.body.classList.contains("area-pazienti-dashboard")
);
}
function getCustomerType(){
var bd=getBookingData();
if(isAreaPazientiContext()){
if(global.apGuestLikeFrontendFlow===true) return "guest";
if(global.sessionStorage&&global.sessionStorage.getItem("access_token")) return "paziente";
if(bd.customer===true) return "paziente";
return "guest";
}
if(bd.customer===true) return "paziente";
return "guest";
}
function getTipologiaVisitaFromDom(){
var selectedCard=global.document&&global.document.querySelector(".card-esigenza.selected");
if(selectedCard){
var titleEl=selectedCard.querySelector(".box-location-title");
if(titleEl){
var fromCard=normalizeValue(stripHtml(titleEl.textContent||titleEl.innerText||titleEl.innerHTML||""));
if(fromCard) return fromCard;
}}
var section1=global.document&&global.document.querySelector(".booking-section.section-1");
if(section1){
var detailsStrong=section1.querySelector(".details p strong");
if(detailsStrong){
var fromDetails=normalizeValue(stripHtml(detailsStrong.textContent||detailsStrong.innerText||""));
if(fromDetails) return fromDetails;
}}
return "";
}
function resolveTipologiaVisita(){
var bd=getBookingData();
var fromData=normalizeValue(stripHtml(bd.service||""));
if(fromData){
persistedTipologiaVisita=fromData;
return fromData;
}
if(persistedTipologiaVisita) return persistedTipologiaVisita;
var fromDom=getTipologiaVisitaFromDom();
if(fromDom){
persistedTipologiaVisita=fromDom;
return fromDom;
}
return "";
}
function setTipologiaVisita(rawValue){
var cleaned=stripHtml(rawValue);
if(!cleaned) return;
persistedTipologiaVisita=normalizeValue(cleaned);
var bd=getBookingData();
if(bd&&typeof bd==="object"){
bd.service=cleaned;
}}
function getTipologiaVisita(){
return resolveTipologiaVisita();
}
function isSpecialisticaFlow(){
var bd=getBookingData();
var service=String(bd.service||"").toLowerCase();
if(service.indexOf("specialistica")!==-1) return true;
if(Array.isArray(bd.areaSpecializzazioneIds)&&bd.areaSpecializzazioneIds.length > 0) return true;
var section =
global.document&&global.document.querySelector(".booking-section.section-1-specialista");
return !!(section&&(section.classList.contains("done")||section.classList.contains("active")));
}
function getSpecialisticaFromDom(){
var section =
global.document&&global.document.querySelector(".booking-section.section-1-specialista");
if(!section) return "";
var selected=section.querySelector(".card-specialista.selected");
if(selected){
var titleEl=selected.querySelector(".box-location-title");
if(titleEl){
var fromCard=normalizeValue(stripHtml(titleEl.textContent||titleEl.innerText||""));
if(fromCard) return fromCard;
}}
var detailsP=section.querySelector(".row.details .col-7 p");
if(detailsP&&detailsP.textContent){
var fromDetails=normalizeValue(stripHtml(detailsP.textContent));
if(fromDetails) return fromDetails;
}
return "";
}
function resolveSpecialistica(){
if(!isSpecialisticaFlow()) return "";
if(persistedSpecialistica) return persistedSpecialistica;
var fromDom=getSpecialisticaFromDom();
if(fromDom){
persistedSpecialistica=fromDom;
return fromDom;
}
return "";
}
function setSpecialistica(rawValue){
var cleaned=stripHtml(rawValue);
if(!cleaned) return;
persistedSpecialistica=normalizeValue(cleaned);
}
function getSpecialistica(){
return resolveSpecialistica();
}
function captureFromSelectedCard(card){
if(!card){
card=global.document&&global.document.querySelector(".card-esigenza.selected");
}
if(!card) return;
var titleEl=card.querySelector(".box-location-title");
if(titleEl){
setTipologiaVisita(titleEl.textContent||titleEl.innerText||titleEl.innerHTML||"");
}}
function getPrivacyVars(bd){
bd=bd||getBookingData();
return {
convenzione: "no",
assicurazione: "no",
informativag: bd.marketing ? "si":"no",
informativap: bd.profile ? "si":"no",
};}
function normalizeEmail(value){
if(value==null||value==="") return "";
return String(value).trim();
}
function getApUserData(){
if(global.bookingApUserData&&typeof global.bookingApUserData==="object"){
return global.bookingApUserData;
}
if(global.sessionStorage){
try {
var raw=global.sessionStorage.getItem("userData");
return raw ? JSON.parse(raw):null;
} catch (e){
return null;
}}
return null;
}
function getLoggedInAccountEmail(){
if(typeof global.bookingApResolveEmailForAccount==="function"){
return normalizeEmail(global.bookingApResolveEmailForAccount("main"));
}
var ud=getApUserData();
if(ud &&
ud.PatientWebCard &&
ud.PatientWebCard.Paziente &&
ud.PatientWebCard.Paziente.PazienteEmail
){
return normalizeEmail(ud.PatientWebCard.Paziente.PazienteEmail);
}
if(typeof global.bookingApGetDecodedAccessToken==="function"){
var tok=global.bookingApGetDecodedAccessToken();
if(tok&&tok.email) return normalizeEmail(tok.email);
}
return "";
}
function getEmailFromSection0Dom(){
var emailInput=global.document&&global.document.getElementById("booking-email");
if(emailInput&&emailInput.value){
return normalizeEmail(emailInput.value);
}
var checked =
global.document &&
global.document.querySelector('input[name="booking_account"]:checked');
if(!checked) return "";
var accountId=checked.getAttribute("data-account")||"main";
if(typeof global.bookingApResolveEmailForAccount==="function"){
return normalizeEmail(global.bookingApResolveEmailForAccount(accountId));
}
return "";
}
function resolveEmailCustomer(){
var bd=getBookingData();
var fromData=normalizeEmail(bd.email);
if(fromData){
persistedEmailCustomer=fromData;
return fromData;
}
if(persistedEmailCustomer) return persistedEmailCustomer;
if(!isAreaPazientiContext()) return "";
var fromDom=getEmailFromSection0Dom();
if(fromDom){
persistedEmailCustomer=fromDom;
if(bd&&typeof bd==="object"){
bd.email=fromDom;
}
return fromDom;
}
var fallback=getLoggedInAccountEmail();
if(fallback){
persistedEmailCustomer=fallback;
return fallback;
}
return "";
}
function setEmailCustomer(rawValue){
var email=normalizeEmail(rawValue);
if(!email) return;
persistedEmailCustomer=email;
var bd=getBookingData();
if(bd&&typeof bd==="object"){
bd.email=email;
}}
function getEmailCustomer(){
return resolveEmailCustomer();
}
function buildBasePayload(){
var payload={
formID: getActiveFormId(),
tipologia_visita: getTipologiaVisita(),
specialistica: getSpecialistica(),
customer_type: getCustomerType(),
};
if(isAreaPazientiContext()){
payload.email_customer=resolveEmailCustomer();
}
return payload;
}
function ensureFunnelTrackingActive(){
if(funnelTrackingActive) return;
if(isDirectBookingFlagTrue()){
activateDirectFlow();
}else if(hasSelectedEsigenzaCard()){
activateRicontattoFlow();
}}
function activateDirectFlow(){
funnelTrackingActive=true;
pushDataLayer({ formID: FORM_ID_DIRECT });
}
function activateRicontattoFlow(){
funnelTrackingActive=true;
pushDataLayer({ formID: FORM_ID_RICONTATTO });
}
function shouldTrack(){
return funnelTrackingActive;
}
function resetSteps(){
persistedTipologiaVisita="";
persistedSpecialistica="";
switchedToRicontattoMidFunnel=false;
}
function trackStep(nomeStep, extra){
ensureFunnelTrackingActive();
if(!shouldTrack()) return;
extra=extra||{};
if(extra.sync_card){
syncFormModeFromCard(extra.sync_card);
delete extra.sync_card;
}else{
syncFormModeFromCard();
}
if(extra.tipologia_visita_raw){
setTipologiaVisita(extra.tipologia_visita_raw);
delete extra.tipologia_visita_raw;
}
if(extra.specialistica_raw){
setSpecialistica(extra.specialistica_raw);
delete extra.specialistica_raw;
}
captureFromSelectedCard();
var payload=Object.assign({}, buildBasePayload(), getPrivacyVars(), {
event: "booking_online",
numero_step: resolveFunnelStepNumber(nomeStep),
nome_step: normalizeValue(nomeStep),
}, extra||{});
pushDataLayer(payload);
}
function buildCloseConvertLeadPayload(email, nomeStep, extra){
return Object.assign({}, buildBasePayload(), getPrivacyVars(), {
event: "close_convert_lead",
formID: FORM_ID_DIRECT,
email_customer: email||resolveEmailCustomer()||getBookingData().email||"",
numero_step: resolveFunnelStepNumber(nomeStep||"conferma_prenotazione"),
nome_step: normalizeValue(nomeStep||"conferma_prenotazione"),
}, extra||{});
}
function trackCloseConvertLead(email, nomeStep, extra){
pushDataLayer(buildCloseConvertLeadPayload(email, nomeStep, extra));
}
function buildGenerateLeadPayload(email, nomeStep, extra){
return Object.assign({}, buildBasePayload(), getPrivacyVars(), {
event: "generate_lead",
formID: FORM_ID_RICONTATTO,
email_customer: email||resolveEmailCustomer()||getBookingData().email||"",
numero_step: resolveFunnelStepNumber(nomeStep||"conferma_prenotazione"),
nome_step: normalizeValue(nomeStep||"conferma_prenotazione"),
}, extra||{});
}
function trackGenerateLead(email, nomeStep, extra){
pushDataLayer(buildGenerateLeadPayload(email, nomeStep, extra));
}
function isBookingGraziePrenotaPage(){
return isBookingGraziePrenotaPath();
}
function getThankyouPageMeta(){
var el =
global.document&&global.document.getElementById("dp-booking-thankyou-meta");
if(!el) return null;
return {
reservation_direct_booking: el.getAttribute("data-reservation-direct-booking")||"",
email: el.getAttribute("data-email")||"",
};}
function persistRicontattoGenerateLeadForThankyou(dataContent){
if(dataContent&&dataContent.service){
setTipologiaVisita(dataContent.service);
}
if(dataContent&&dataContent.email){
setEmailCustomer(dataContent.email);
}
captureFromSelectedCard();
var email =
(dataContent&&dataContent.email) ||
getBookingData().email ||
resolveEmailCustomer() ||
"";
var payload=buildGenerateLeadPayload(email, "conferma_prenotazione");
if(!payload.tipologia_visita&&dataContent&&dataContent.service){
payload.tipologia_visita=normalizeValue(stripHtml(dataContent.service));
}
if(!global.sessionStorage) return payload;
try {
global.sessionStorage.setItem(RICONTATTO_LEAD_STORAGE_KEY, JSON.stringify(payload));
global.sessionStorage.setItem(RICONTATTO_LEAD_PENDING_KEY, "1");
} catch (e){
}
return payload;
}
function clearRicontattoThankyouLeadStorage(){
if(!global.sessionStorage) return;
try {
global.sessionStorage.removeItem(RICONTATTO_LEAD_STORAGE_KEY);
global.sessionStorage.removeItem(RICONTATTO_LEAD_PENDING_KEY);
} catch (e){
}}
function persistDirectCloseConvertForThankyou(dataContent){
if(dataContent&&dataContent.service){
setTipologiaVisita(dataContent.service);
}
if(dataContent&&dataContent.email){
setEmailCustomer(dataContent.email);
}
captureFromSelectedCard();
var email =
(dataContent&&dataContent.email) ||
getBookingData().email ||
resolveEmailCustomer() ||
"";
var payload=buildCloseConvertLeadPayload(email, "conferma_prenotazione");
if(!payload.tipologia_visita&&dataContent&&dataContent.service){
payload.tipologia_visita=normalizeValue(stripHtml(dataContent.service));
}
if(!global.sessionStorage) return payload;
try {
global.sessionStorage.setItem(DIRECT_CLOSE_STORAGE_KEY, JSON.stringify(payload));
global.sessionStorage.setItem(DIRECT_CLOSE_PENDING_KEY, "1");
} catch (e){
}
return payload;
}
function clearDirectThankyouCloseStorage(){
if(!global.sessionStorage) return;
try {
global.sessionStorage.removeItem(DIRECT_CLOSE_STORAGE_KEY);
global.sessionStorage.removeItem(DIRECT_CLOSE_PENDING_KEY);
} catch (e){
}}
function fireBookingRicontattoThankyouPageLead(){
var meta=getThankyouPageMeta();
if(!meta||meta.reservation_direct_booking!=="0") return false;
if(!global.sessionStorage) return false;
var pending=false;
try {
pending=global.sessionStorage.getItem(RICONTATTO_LEAD_PENDING_KEY)==="1";
} catch (e){
return false;
}
if(!pending) return false;
var raw=null;
try {
raw=global.sessionStorage.getItem(RICONTATTO_LEAD_STORAGE_KEY);
} catch (e){
return false;
}
if(!raw) return false;
var payload;
try {
payload=JSON.parse(raw);
} catch (e2){
clearRicontattoThankyouLeadStorage();
return false;
}
if(!payload||typeof payload!=="object"){
clearRicontattoThankyouLeadStorage();
return false;
}
if(meta.email){
payload.email_customer=normalizeEmail(meta.email);
}
pushThankyouPayloadBypassGuard(payload, "ricontatto");
clearRicontattoThankyouLeadStorage();
return true;
}
function fireBookingDirectThankyouPageCloseConvert(){
var meta=getThankyouPageMeta();
if(!meta||meta.reservation_direct_booking==="0") return false;
if(!global.sessionStorage) return false;
var pending=false;
try {
pending=global.sessionStorage.getItem(DIRECT_CLOSE_PENDING_KEY)==="1";
} catch (e){
return false;
}
if(!pending) return false;
var raw=null;
try {
raw=global.sessionStorage.getItem(DIRECT_CLOSE_STORAGE_KEY);
} catch (e){
return false;
}
if(!raw) return false;
var payload;
try {
payload=JSON.parse(raw);
} catch (e2){
clearDirectThankyouCloseStorage();
return false;
}
if(!payload||typeof payload!=="object"){
clearDirectThankyouCloseStorage();
return false;
}
if(meta.email){
payload.email_customer=normalizeEmail(meta.email);
}
pushThankyouPayloadBypassGuard(payload, "direct");
clearDirectThankyouCloseStorage();
return true;
}
function initBookingThankyouPageEvents(){
if(!isBookingGraziePrenotaPage()) return;
if(fireBookingRicontattoThankyouPageLead()||fireBookingDirectThankyouPageCloseConvert()){
return;
}
global.setTimeout(function (){
fireBookingRicontattoThankyouPageLead()||fireBookingDirectThankyouPageCloseConvert();
}, 100);
}
function shouldDeferRicontattoLeadToThankyouPage(options){
return !!(options&&options.deferToThankyouPage&&!isDirectBookingFlagTrue());
}
function shouldDeferDirectCloseToThankyouPage(options){
return !!(options&&options.deferToThankyouPage&&isDirectBookingFlagTrue());
}
function isSuccessfulDirectBooking(dataContent){
if(dataContent&&dataContent.bookData&&dataContent.bookData.success===true) return true;
if(dataContent&&dataContent.thankyou&&typeof dataContent.thankyou==="object") return true;
return isDirectBookingFlagTrue()&&funnelTrackingActive;
}
function prepareThankyouConversionData(dataContent){
if(dataContent&&dataContent.service){
setTipologiaVisita(dataContent.service);
}
if(dataContent&&dataContent.email){
setEmailCustomer(dataContent.email);
}else if(isAreaPazientiContext()){
var apEmail=resolveEmailCustomer();
if(apEmail) setEmailCustomer(apEmail);
}
captureFromSelectedCard();
}
function fireInlineThankYouConversion(dataContent){
prepareThankyouConversionData(dataContent);
var email =
(dataContent&&dataContent.email) ||
resolveEmailCustomer() ||
getBookingData().email ||
"";
if(isDirectBookingFlagTrue()){
if(!funnelTrackingActive){
activateDirectFlow();
}
trackCloseConvertLead(email, "conferma_prenotazione");
return true;
}
if(!funnelTrackingActive){
activateRicontattoFlow();
}
trackGenerateLead(email, "conferma_prenotazione");
return true;
}
function fireThankYou(dataContent, options){
options=options||{};
if(!options.deferToThankyouPage&&(isAreaPazientiContext()||options.inlineThankyou)){
return fireInlineThankYouConversion(dataContent);
}
ensureFunnelTrackingActive();
var email =
(dataContent&&dataContent.email) ||
getBookingData().email ||
resolveEmailCustomer() ||
"";
if(isDirectBookingFlagTrue()){
if(shouldDeferDirectCloseToThankyouPage(options)){
if(!funnelTrackingActive){
activateDirectFlow();
}
persistDirectCloseConvertForThankyou(dataContent);
return true;
}
if(!funnelTrackingActive&&!isSuccessfulDirectBooking(dataContent)) return false;
trackCloseConvertLead(email, "conferma_prenotazione");
return true;
}
if(shouldDeferRicontattoLeadToThankyouPage(options)){
if(!funnelTrackingActive){
activateRicontattoFlow();
}
persistRicontattoGenerateLeadForThankyou(dataContent);
return true;
}
if(!funnelTrackingActive) return false;
trackGenerateLead(email, "conferma_prenotazione");
return true;
}
function fireConfirmation(dataContent){
return fireThankYou(dataContent);
}
function onDirectBookingCardSelected(){
switchedToRicontattoMidFunnel=false;
activateDirectFlow();
}
function onRicontattoFlowFromCard(){
switchedToRicontattoMidFunnel=true;
activateRicontattoFlow();
}
function onRicontattoSwitch(){
switchedToRicontattoMidFunnel=true;
global.directBooking=false;
if(global.window) global.window.directBooking=false;
global.selectedCardDirectBooking="0";
if(global.window) global.window.selectedCardDirectBooking="0";
if(!funnelTrackingActive){
activateRicontattoFlow();
return;
}
pushDataLayer({ formID: FORM_ID_RICONTATTO });
}
function isMidFunnelRicontattoSwitch(){
return switchedToRicontattoMidFunnel;
}
function activateGuestFlow(){
funnelTrackingActive=true;
pushDataLayer({ formID: FORM_ID_DIRECT });
}
function activatePatientFlow(){
funnelTrackingActive=true;
pushDataLayer({ formID: FORM_ID_DIRECT });
}
function activateOnlineFlow(){
activateDirectFlow();
}
function deactivateOnlineFlow(){
onRicontattoSwitch();
}
global.bookingOnlineDataLayer={
FORM_ID: FORM_ID_DIRECT,
FORM_ID_RICONTATTO: FORM_ID_RICONTATTO,
normalizeValue: normalizeValue,
getActiveFormId: getActiveFormId,
isDirectBooking: isDirectBookingFlagTrue,
isRicontattoFlow: function (){
return !isDirectBookingFlagTrue();
},
activateOnlineFlow: activateOnlineFlow,
activateDirectFlow: activateDirectFlow,
activateRicontattoFlow: activateRicontattoFlow,
deactivateOnlineFlow: deactivateOnlineFlow,
activateGuestFlow: activateGuestFlow,
activatePatientFlow: activatePatientFlow,
resetSteps: resetSteps,
trackStep: trackStep,
trackCloseConvertLead: trackCloseConvertLead,
trackGenerateLead: trackGenerateLead,
fireThankYou: fireThankYou,
fireInlineThankYouConversion: fireInlineThankYouConversion,
fireConfirmation: fireConfirmation,
onDirectBookingCardSelected: onDirectBookingCardSelected,
onRicontattoFlowFromCard: onRicontattoFlowFromCard,
onRicontattoSwitch: onRicontattoSwitch,
isMidFunnelRicontattoSwitch: isMidFunnelRicontattoSwitch,
shouldTrack: shouldTrack,
isSuccessfulDirectBooking: isSuccessfulDirectBooking,
getCustomerType: getCustomerType,
getTipologiaVisita: getTipologiaVisita,
getSpecialistica: getSpecialistica,
setTipologiaVisita: setTipologiaVisita,
setSpecialistica: setSpecialistica,
captureFromSelectedCard: captureFromSelectedCard,
syncFormModeFromCard: syncFormModeFromCard,
getFormIdFromCard: getFormIdFromCard,
getPrivacyVars: getPrivacyVars,
setEmailCustomer: setEmailCustomer,
getEmailCustomer: getEmailCustomer,
resolveEmailCustomer: resolveEmailCustomer,
resolveFunnelStepNumber: resolveFunnelStepNumber,
buildGenerateLeadPayload: buildGenerateLeadPayload,
buildCloseConvertLeadPayload: buildCloseConvertLeadPayload,
fireBookingRicontattoThankyouPageLead: fireBookingRicontattoThankyouPageLead,
fireBookingDirectThankyouPageCloseConvert: fireBookingDirectThankyouPageCloseConvert,
};
if(global.document){
if(global.document.readyState==="loading"){
global.document.addEventListener("DOMContentLoaded", initBookingThankyouPageEvents);
}else{
initBookingThankyouPageEvents();
}}
})(typeof window!=="undefined" ? window:this);
const shortcodeMapStyle=[
{
elementType: "geometry",
stylers: [
{
color: "#f5f5f5",
},
],
},
{
elementType: "labels.icon",
stylers: [
{
visibility: "off",
},
],
},
{
elementType: "labels.text.fill",
stylers: [
{
color: "#616161",
},
],
},
{
elementType: "labels.text.stroke",
stylers: [
{
color: "#f5f5f5",
},
],
},
{
featureType: "administrative.land_parcel",
elementType: "labels.text.fill",
stylers: [
{
color: "#bdbdbd",
},
],
},
{
featureType: "landscape.man_made",
elementType: "geometry.fill",
stylers: [
{
color: "#f8f8fa",
},
],
},
{
featureType: "landscape.natural",
elementType: "geometry.fill",
stylers: [
{
color: "#f8f8fa",
},
],
},
{
featureType: "poi",
elementType: "geometry",
stylers: [
{
color: "#eeedf2",
},
],
},
{
featureType: "poi",
elementType: "geometry.fill",
stylers: [
{
color: "#eeedf2",
},
],
},
{
featureType: "poi",
elementType: "labels.text.fill",
stylers: [
{
color: "#757575",
},
],
},
{
featureType: "poi.park",
elementType: "geometry",
stylers: [
{
color: "#e5e5e5",
},
],
},
{
featureType: "poi.park",
elementType: "geometry.fill",
stylers: [
{
color: "#eeedf2",
},
],
},
{
featureType: "poi.park",
elementType: "labels.text.fill",
stylers: [
{
color: "#9e9e9e",
},
],
},
{
featureType: "road",
elementType: "geometry",
stylers: [
{
color: "#ffffff",
},
],
},
{
featureType: "road.arterial",
elementType: "geometry.fill",
stylers: [
{
color: "#dad8e3",
},
],
},
{
featureType: "road.arterial",
elementType: "labels.text.fill",
stylers: [
{
color: "#757575",
},
],
},
{
featureType: "road.highway",
elementType: "geometry",
stylers: [
{
color: "#dad8e3",
},
],
},
{
featureType: "road.highway",
elementType: "geometry.fill",
stylers: [
{
color: "#dad8e3",
},
],
},
{
featureType: "road.highway",
elementType: "labels.text.fill",
stylers: [
{
color: "#616161",
},
],
},
{
featureType: "road.local",
elementType: "geometry.fill",
stylers: [
{
color: "#dad8e3",
},
],
},
{
featureType: "road.local",
elementType: "labels.text.fill",
stylers: [
{
color: "#9e9e9e",
},
],
},
{
featureType: "transit.line",
elementType: "geometry",
stylers: [
{
color: "#e5e5e5",
},
],
},
{
featureType: "transit.station",
elementType: "geometry",
stylers: [
{
color: "#eeedf2",
},
],
},
{
featureType: "water",
elementType: "geometry",
stylers: [
{
color: "#c9c9c9",
},
],
},
{
featureType: "water",
elementType: "labels.text.fill",
stylers: [
{
color: "#9e9e9e",
},
],
},
];
var bookForOther;
var slotCarousel;
var reservationArgs;
var currentClinics;
var directBooking;
var prestazioneId;
var selectedCardDirectBooking;
var mapDiv;
var retryCount=0;
var bookingSlotsData={};
var bookingClinicsData={};
var bookingSelectedSlot=null;
function nextFifteenday(date){
const currentDate=new Date(date);
currentDate.setDate(currentDate.getDate() + 16);
const yyyy=currentDate.getFullYear();
const mm=String(currentDate.getMonth() + 1).padStart(2,
"0"
);
const dd=String(currentDate.getDate()).padStart(2, "0");
const hh=String(currentDate.getHours()).padStart(2, "0");
const min=String(currentDate.getMinutes()).padStart(2,
"0"
);
const ss=String(currentDate.getSeconds()).padStart(2,
"0"
);
return `${yyyy}-${mm}-${dd}T${hh}:${min}:${ss}Z`;
}
function addColumnToSlotCarousel(){
const newDate=nextFifteenday(reservationArgs.DataInizio);
reservationArgs.DataInizio=newDate;
callReservationYes(reservationArgs, function (response){
if(response&&response.data&&response.data.FreeOperatorSlots){
const freeSlots=response.data.FreeOperatorSlots;
Object.keys(freeSlots).forEach(function (date){
const html=generateSlotHtml(date, freeSlots[date]);
slotCarousel.trigger('add.owl.carousel', [html]);
});
slotCarousel.trigger('refresh.owl.carousel');
}});
const nextButton=document.querySelector('.grid-booking-box-1 .owl-next');
setTimeout(()=> {
nextButton.classList.remove('cta', 'cta-loading');
}, 3000);
}
function generateSlotHtml(date, dayData){
let html='<div class="item" data-date="' + date + '">';
html +='<div class="day" data-date="' + date + '">';
const dayName=new Date(date).toLocaleDateString("it-IT", {
weekday: "short",
});
const dayDate=new Date(date).toLocaleDateString("it-IT", {
day: "2-digit",
month: "short",
});
html +='<span class="w-day">' + dayName + " " + dayDate + "</span>";
html +="</div>";
html +="</div>";
return html;
}
function initSlotCarousel(){
const nextButton=document.querySelector('.grid-booking-box-1 .owl-next');
if(nextButton){
nextButton.addEventListener('click', function (){
if(this.classList.contains('ready-to-load')){
this.classList.remove('ready-to-load');
this.classList.remove('disabled');
this.classList.add('cta', 'cta-loading');
addColumnToSlotCarousel();
}});
nextButton.addEventListener('click', function (){
if(this.classList.contains('disabled')){
this.classList.add('ready-to-load');
}});
}}
function callReservationYes(dataArgs, callback){
jQuery.ajax({
url: ajaxurl,
type: "POST",
data: {
action: "dp_booking_slots",
data: JSON.stringify(dataArgs),
},
success: function (response){
if(!response||!response.data){
if(typeof callback==="function"){
callback(response);
}
return;
}
bookingSlotsData={ ...bookingSlotsData, ...response.data.FreeOperatorSlots };
bookingClinicsData=response.data.Cliniche;
if(typeof callback==="function"){
callback(response);
}},
error: function (xhr, status, error){
console.error(error);
},
});
}
if(typeof window.normalizeDirectBookingApiError!=="function"){
window.DIRECT_BOOKING_APP_CONFLICT_USER_MESSAGE =
"Non è possibile finalizzare la prenotazione. Contatta il tuo Centro o chiama il numero verde <a href='tel:+39800326326'>800 326 326</a>. Se preferisci ti contattiamo noi.";
window.isAppTypeFuError=function (data){
if(!data) return false;
if(typeof data==="string"){
return data.indexOf("APP_TYPE_FU")!==-1;
}
if(typeof data!=="object") return false;
var status=data.Status&&typeof data.Status==="object" ? data.Status:null;
var detail=data.errorDetail!=null ? String(data.errorDetail).trim():"";
var code=data.errorCode!=null ? String(data.errorCode).trim():"";
var nestedDetail=status&&status.ErrorDetail!=null ? String(status.ErrorDetail).trim():"";
var nestedCode=status&&status.ErrorCode!=null ? String(status.ErrorCode).trim():"";
var nestedFallback = !!(status&&status.FallbackToHubspot===true);
return data.fallbackToHubspot===true||nestedFallback||code==="APP_TYPE_FU"||nestedCode==="APP_TYPE_FU"||detail==="APP_TYPE_FU"||nestedDetail==="APP_TYPE_FU";
};
window.normalizeDirectBookingApiError=function (data, fallback){
if(!data||typeof data!=="object") return fallback;
var msg=data.message!=null ? String(data.message):"";
var detail=data.errorDetail!=null ? String(data.errorDetail):"";
var status=data.Status&&typeof data.Status==="object" ? data.Status:null;
var nestedMsg=status&&status.Message!=null ? String(status.Message):"";
var nestedDetail=status&&status.ErrorDetail!=null ? String(status.ErrorDetail):"";
if(detail==="APP_ALREADY_EXISTS" ||
msg==="V2_APPOINTMENT_CREATION_ERROR" ||
nestedDetail==="APP_ALREADY_EXISTS" ||
nestedMsg==="V2_APPOINTMENT_CREATION_ERROR"
){
return window.DIRECT_BOOKING_APP_CONFLICT_USER_MESSAGE;
}
if(msg) return msg;
return fallback;
};
window.resolveDirectBookingAjaxErrorMessage=function (xhr, fallback){
if(xhr&&xhr.responseJSON&&xhr.responseJSON.data){
return window.normalizeDirectBookingApiError(xhr.responseJSON.data, fallback);
}
return fallback;
};}
window.bookingShouldShowRicontattoAfterDirectBookingError=function (errData){
if(!errData||typeof errData!=="object") return false;
var msg=errData.message!=null ? String(errData.message).trim():"";
var detail=errData.errorDetail!=null ? String(errData.errorDetail).trim():"";
if(detail==="APP_ALREADY_EXISTS"||msg==="V2_APPOINTMENT_CREATION_ERROR") return true;
var st=errData.Status&&typeof errData.Status==="object" ? errData.Status:null;
if(!st) return false;
var nd=st.ErrorDetail!=null ? String(st.ErrorDetail).trim():"";
var nm=st.Message!=null ? String(st.Message).trim():"";
return nd==="APP_ALREADY_EXISTS"||nm==="V2_APPOINTMENT_CREATION_ERROR";
};
function sendPostRequestBooking(data){
data.prestazioneId=prestazioneId;
const dataArgs=data;
document.body.classList.add("overlay-loading-show");
jQuery.ajax({
url: ajaxurl,
type: "POST",
data: {
action: "dp_booking_slots_request",
data: JSON.stringify(dataArgs),
},
success: function (response){
if(response&&typeof response==='object'){
if(response.success===true){
data.bookData=response;
data.thankyou=response.data.thankYouData;
if(data.areaPazienti===true){
bookingSubmitAreaPazienti(data);
}else{
bookingSubmitFrontend(data);
}
var tyRootAp=document.getElementById("prenota-thankyou");
var bookingSummaryAp=tyRootAp ? tyRootAp.querySelector(".booking-summary"):document.querySelector(".booking-summary");
if(bookingSummaryAp){
bookingFillInlineThankyouSummary(data);
}}
}},
error: function (xhr, status, error){
document.body.classList.remove("overlay-loading-show");
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] booking-slots.sendPostRequestBooking.error.raw", {
status: xhr&&xhr.status,
responseJSON: xhr&&xhr.responseJSON,
responseText: xhr&&xhr.responseText,
areaPazienti: !!(data&&data.areaPazienti),
});
}
if(xhr.responseJSON&&xhr.responseJSON.data){
var errData=xhr.responseJSON.data;
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] booking-slots.sendPostRequestBooking.error.data", errData);
}
if(typeof window.isAppTypeFuError==="function"&&window.isAppTypeFuError(errData)){
var fallbackData=Object.assign({}, data, { thankyouReason: "APP_TYPE_FU" });
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] APP_TYPE_FU detected in booking-slots, triggering fallback", {
fallbackData: fallbackData,
hasBookingSubmitAreaPazienti: typeof bookingSubmitAreaPazienti==="function",
});
}
if(typeof window!=="undefined"){
window.directBooking=false;
window.selectedCardDirectBooking="0";
}
if(typeof directBooking!=="undefined"){
directBooking=false;
}
if(typeof selectedCardDirectBooking!=="undefined"){
selectedCardDirectBooking="0";
}
if(fallbackData.areaPazienti===true&&typeof bookingSubmitAreaPazienti==="function"){
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] booking-slots fallback -> bookingSubmitAreaPazienti");
}
bookingSubmitAreaPazienti(fallbackData);
}else if(typeof bookingSubmitFrontend==="function"){
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] booking-slots fallback -> bookingSubmitFrontend");
}
bookingSubmitFrontend(fallbackData);
}
return false;
}
if(xhr.responseJSON.data.requireCF){
handleRequireCF();
return false;
}
var fb =
errData&&errData.message!=null&&String(errData.message).trim()!==""
? String(errData.message)
: "Si è verificato un errore.";
var normalizedMsg=window.normalizeDirectBookingApiError(errData, fb);
var directConflictMsg=window.DIRECT_BOOKING_APP_CONFLICT_USER_MESSAGE||"";
var showRic =
(!!directConflictMsg&&normalizedMsg===directConflictMsg) ||
(typeof normalizedMsg==="string" &&
normalizedMsg.indexOf("Non è possibile finalizzare la prenotazione")!==-1) ||
(typeof window.bookingShouldShowRicontattoAfterDirectBookingError==="function" &&
window.bookingShouldShowRicontattoAfterDirectBookingError(errData));
showErrorMessage(normalizedMsg, {
showRicontattoBtn: showRic,
});
bookingScroll();
return false;
}else{
var formSection4=document.querySelector(".booking-section.section-4");
var errorDiv=formSection4.querySelector(".error-message")||document.createElement("div");
errorDiv.className="error-message";
errorDiv.style.color="red";
errorDiv.innerHTML="Errore di connessione. Verifica la tua connessione e riprova.";
if(!formSection4.querySelector(".error-message")){
formSection4.querySelector("form").prepend(errorDiv);
}
return false;
}},
});
}
function handleRequireCF(){
let cfModal=document.querySelector('#cf-modal');
if(!cfModal){
cfModal=document.createElement('div');
cfModal.id='cf-modal';
cfModal.innerHTML=`
<div class="cf-modal-box">
<button type="button" id="cf-modal-close" class="cf-modal-close" aria-label="Chiudi">&times;</button>
<h3 class="cf-modal-title">Abbiamo bisogno del tuo Codice Fiscale per identificarti meglio</h3>
<label for="cf-modal-input">Inserisci il tuo codice fiscale</label>
<span class="input">
<input type="text" id="cf-modal-input">
</span>
<div id="cf-modal-error"></div>
<a href="#" id="booking-cf" class="cta transparent">Conferma</a>
</div>
`;
document.body.appendChild(cfModal);
document.body.style.overflow='hidden';
cfModal.querySelector('#cf-modal-close').onclick=function (){
cfModal.style.display='none';
document.body.style.overflow='';
};
cfModal.querySelector('#booking-cf').onclick=function (e){
e.preventDefault();
var cfValue=cfModal.querySelector('#cf-modal-input').value.trim().toUpperCase();
var regCf=/^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$/i;
var errorDiv=cfModal.querySelector('#cf-modal-error');
if(!regCf.test(cfValue)){
errorDiv.textContent='Codice Fiscale non valido.';
errorDiv.style.display='block';
return;
}
errorDiv.style.display='none';
var cfField=document.querySelector('#booking-cf');
if(cfField){
cfField.value=cfValue;
cfField.parentNode.style.display='';
}
cfModal.style.display='none';
document.body.style.overflow='';
};}else{
cfModal.style.display='flex';
document.body.style.overflow='hidden';
}}
function bookingScroll(){
activeSections=document.querySelectorAll(".booking-section.active");
maxTop=0;
for (let i=0; i < activeSections.length; i++){
if(maxTop < activeSections[i].offsetTop){
maxTop=activeSections[i].offsetTop;
}}
scroll({
top: maxTop - 190,
behavior: "smooth",
});
}
function createClinicBoxes(selectedSlots, dateHour, dateDay){
const box3Container=document.querySelector(".grid-booking-box-3");
var hourOnly=dateHour.split(":")[0];
if(!box3Container) return;
const clinicsData=bookingClinicsData;
const slotsData=bookingSlotsData;
if(!clinicsData||!slotsData){
console.error("Missing clinic or slots data");
return;
}
box3Container.innerHTML="";
if(selectedSlots.length > 0){
const date=new Date(dateDay);
let weekDay=date.toLocaleDateString("it-IT", { weekday: "long" });
weekDay=weekDay.charAt(0).toUpperCase() + weekDay.slice(1);
const dayNumber=date.toLocaleDateString("it-IT", { day: "numeric" });
const month=date.toLocaleDateString("it-IT", { month: "long" });
let timeRange="";
const hour=parseInt(dateHour);
const startHour=hour.toString().padStart(2, "0");
const endHour=(hour + 1).toString().padStart(2, "0");
timeRange=`${startHour}:00 - ${endHour}:00`;
const headerHtml=`
<div class="time-header">
<h3>
${weekDay}
<span class="date">${dayNumber} ${month}</span>
ore ${timeRange}
</h3>
</div>
`;
box3Container.insertAdjacentHTML("beforeend", headerHtml);
}
const slotsByClinic={};
selectedSlots.forEach((slot)=> {
const clinicId=slot.clinicaId;
if(!slotsByClinic[clinicId]){
slotsByClinic[clinicId]=[];
}
slotsByClinic[clinicId].push(slot);
});
Object.keys(slotsByClinic).forEach((clinicId)=> {
const clinicSlots=slotsByClinic[clinicId];
const clinicInfo=clinicsData[clinicId];
if(!clinicInfo){
console.error(`No clinic info found for clinic ID: ${clinicId}`);
return;
}
const boxHtml=`
<div class="clinic-box" data-clinic-id="${clinicId}">
<div class="clinic-header">
<svg xmlns="http://www.w3.org/2000/svg" width="19" height="26" viewBox="0 0 19 26" fill="none">
<path d="M9.47616 0.000276569C16.6983 -0.0529106 21.3692 7.57584 17.7429 13.7193C15.387 17.7106 12.6965 21.5115 10.1832 25.4146C9.72267 26.1296 9.4085 26.2406 8.9051 25.4615C6.32512 21.4692 3.53145 17.596 1.17086 13.4839C-2.29401 7.44911 2.36288 0.0531354 9.47616 0.000276569ZM9.40214 14.3401C12.2869 14.4038 14.7001 12.1329 14.7577 9.30048C14.8133 6.57382 12.5244 4.22078 9.71664 4.11867C6.81914 4.01296 4.38653 6.23861 4.30213 9.07263C4.21773 11.905 6.51369 14.2768 9.40214 14.3405V14.3401Z" fill="#66C1BF"/>
</svg>
<div class="clinic-info">
<h4>${clinicInfo.title}</h4>
<p class="clinic-address">${clinicInfo.address}</p>
</div>
<a href="https://www.google.com/maps/search/?api=1&query=maida&query_place_id=${clinicInfo.gmaps_place_id}" target="_blank" class="go-maps">
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 17 17" fill="none">
<path d="M0.27907 16.901C0.450805 17.0137 0.669052 17.0298 0.856887 16.9475L6.07335 14.6287L11.2898 16.9475C11.2987 16.9511 11.3095 16.9475 11.3184 16.9529C11.4651 17.0191 11.6333 17.0155 11.7782 16.9422C11.7871 16.9386 11.7996 16.9422 11.8086 16.935L16.6637 14.507C16.7639 14.4569 16.8497 14.38 16.9088 14.2834C16.9678 14.1868 17 14.0776 17 13.9649V0.608309C17 0.39718 16.8909 0.202154 16.712 0.0912223C16.5331 -0.0197097 16.3095 -0.0304451 16.1216 0.0643839L11.5224 2.36533L6.31664 0.0536486C6.31664 0.0536486 6.29875 0.0500701 6.2898 0.0464917C6.26655 0.0375455 6.24329 0.0303886 6.21825 0.0250209C6.1932 0.017864 6.16995 0.0142856 6.1449 0.0107071C6.09481 0.00712868 6.04651 0.00712868 5.99642 0.0107071C5.97138 0.0142856 5.94633 0.0196533 5.92308 0.0250209C5.89803 0.0303886 5.87478 0.0375455 5.85152 0.0464917C5.84258 0.0500701 5.83184 0.0500701 5.82469 0.0536486L0.36136 2.48163C0.254025 2.52994 0.162791 2.60688 0.09839 2.70528C0.0339893 2.80369 0 2.9182 0 3.03629V16.3911C0 16.5968 0.103757 16.7883 0.275492 16.8992L0.27907 16.901ZM15.7818 13.5891L12.1395 15.4106V3.41203L15.7818 1.59059V13.5891ZM10.9267 15.4589L6.678 13.5695V1.54407L10.9267 3.43171V15.4571V15.4589ZM1.21646 3.43171L5.46512 1.54407V13.5695L1.21646 15.4571V3.43171Z" fill="#295782"/>
</svg>
</a>
</div>
<div class="clinic-slots">
${clinicSlots
.map((slot)=> {
const bookingStateData=slotsData[dateDay][hourOnly][clinicId];
let currentBookingState=null;
bookingStateData.forEach((el)=> {
if(el.DataInizioSlot===slot.orarioInizio){
currentBookingState=el;
}});
return `
<div class="single-slot">
<div class="slot-btn time"
data-clinic-id="${clinicId}"
time-start="${slot.orarioInizio}"
${new Date(slot.orarioInizio).toLocaleTimeString("it-IT", {
hour: "2-digit",
minute: "2-digit",
})}>${slot.orarioInizio}
</div>
<button class="prenota-btn"
data-clinic-id="${clinicId}"
data-slot='${JSON.stringify(currentBookingState
)}'>Prenota visita
</button>
</div>
`;
})
.join("")}
</div>
</div>
`;
box3Container.insertAdjacentHTML("beforeend", boxHtml);
});
box3Container.querySelectorAll(".slot-btn").forEach((btn)=> {
btn.addEventListener("click", function (){
box3Container
.querySelectorAll(".slot-btn")
.forEach((b)=> b.classList.remove("active"));
this.classList.add("active");
});
});
box3Container.querySelectorAll(".prenota-btn").forEach((btn)=> {
btn.addEventListener("click", function (){
const formSection4=document.querySelector(".booking-section.section-4");
const formSection5=document.querySelector(".booking-section.section-5");
const errorDiv=formSection4.querySelector(".error");
if(errorDiv){
errorDiv.classList.remove("active");
const errorMessage=errorDiv.querySelector("p");
if(errorMessage){
errorMessage.innerHTML="";
}}
bookingSelectedSlot=this.getAttribute("data-slot");
formSection5.classList.remove("active");
formSection5.classList.add("done");
showSummary(true);
formSection4.classList.add("active");
const clinicId=this.getAttribute("data-clinic-id");
const clinicInfo=clinicsData[clinicId];
if(clinicInfo){
formSection5.querySelector(".details p").textContent=clinicInfo.title;
}
bookingScroll();
});
});
}
function showLoader(){
const box1Container=document.querySelector(".grid-booking-box-1");
const box2Container=document.querySelector(".grid-booking-box-2");
const existingLoader=document.querySelector(".booking-loader");
if(existingLoader){
existingLoader.remove();
}
const loader=document.createElement("div");
loader.className="booking-loader";
const loaderSpinner=document.createElement("div");
loaderSpinner.className="loader";
loader.appendChild(loaderSpinner);
box1Container.style.position="relative";
box1Container.appendChild(loader);
box2Container.style.display="none";
}
function hideLoader(){
const loader=document.querySelector(".booking-loader");
if(loader){
loader.remove();
const box2Container=document.querySelector(".grid-booking-box-2");
box2Container.style.display="grid";
}}
function initializeCarouselBooking(){
const $container=jQuery("#booking-owl-reservation");
$container.on("click", ".time", function (){
const $time=jQuery(this);
const slots=JSON.parse($time.attr("data-slots"));
const dateHour=$time.attr("data-hour");
const dateDay=$time.attr("data-date");
$container.find(".time").removeClass("active");
$time.addClass("active");
createClinicBoxes(slots, dateHour, dateDay);
});
if($container.hasClass("owl-carousel")){
$container.trigger("destroy.owl.carousel");
slotCarousel=$container.owlCarousel({
loop: false,
margin: 24,
nav: true,
dots: false,
navContainer: "#custom_slider_nav",
navText: [
`<svg class="custom-nav" xmlns="http://www.w3.org/2000/svg" width="34" height="34" viewBox="0 0 34 34" fill="none">
<circle cx="17" cy="17" r="17" fill="#295782" fill-opacity="0.1"/>
<path d="M12.0011 17.029C12.0091 17.1588 12.0695 17.283 12.1697 17.3778L17.8957 22.8191C18.1343 23.0451 18.5367 23.059 18.7959 22.8497C19.0536 22.6405 19.0695 22.2875 18.8309 22.0601L13.5026 16.9983L18.8293 11.9366C19.0695 11.7106 19.0536 11.3576 18.7959 11.1483C18.5383 10.939 18.1358 10.953 17.8957 11.179L12.1697 16.6202C12.052 16.7305 11.9916 16.8783 12.0011 17.0304L12.0011 17.029Z" fill="#295782"/>
</svg>`,
`<svg xmlns="http://www.w3.org/2000/svg" width="34" height="34" viewBox="0 0 34 34" fill="none">
<circle cx="17" cy="17" r="17" transform="rotate(-180 17 17)" fill="#295782" fill-opacity="0.1"/>
<path d="M21.9989 16.971C21.9909 16.8412 21.9305 16.717 21.8303 16.6222L16.1043 11.1809C15.8657 10.9549 15.4633 10.941 15.2041 11.1503C14.9464 11.3595 14.9305 11.7125 15.1691 11.9399L20.4974 17.0017L15.1707 22.0634C14.9305 22.2894 14.9464 22.6424 15.2041 22.8517C15.4617 23.061 15.8642 23.047 16.1043 22.821L21.8303 17.3798C21.948 17.2695 22.0084 17.1217 21.9989 16.9696L21.9989 16.971Z" fill="#295782"/>
</svg><div class="lds-ripple"><div></div><div></div></div>`,
],
responsive: {
0: {
items: 3,
},
600: {
items: 5,
},
1000: {
items: 7,
},
},
});
}
initSlotCarousel();
}
function bookingHideCallbackRequestBtn(){
document.querySelectorAll(".booking-callback-request-btn").forEach(function (btn){
btn.classList.add("d-none");
});
}
try {
window.bookingHideCallbackRequestBtn=bookingHideCallbackRequestBtn;
} catch (e){}
function showErrorMessage(message, options){
options=options||{};
var directConflictMsg=window.DIRECT_BOOKING_APP_CONFLICT_USER_MESSAGE||"";
var showRicontattoBtn = !!options.showRicontattoBtn;
if(!showRicontattoBtn &&
directConflictMsg &&
typeof message==="string" &&
(message===directConflictMsg ||
message.indexOf("Non è possibile finalizzare la prenotazione")!==-1)
){
showRicontattoBtn=true;
}
const formSection4=document.querySelector(".booking-section.section-4");
const formSection5=document.querySelector(".booking-section.section-5");
if(formSection5){
formSection5.classList.remove("active");
}
if(formSection4){
formSection4.classList.add("active");
formSection4.style.setProperty("display", "flex", "important");
const errorDiv=formSection4.querySelector(".error");
if(errorDiv){
const errorMessage=errorDiv.querySelector("p");
if(errorMessage) errorMessage.innerHTML=message;
errorDiv.classList.add("active");
}
var callbackBtn=formSection4.querySelector(".booking-callback-request-btn");
if(callbackBtn){
if(showRicontattoBtn){
callbackBtn.classList.remove("d-none");
}else{
callbackBtn.classList.add("d-none");
}}
document.querySelector(".grid-booking-box-3").innerHTML="";
showLoader();
callReservationYes(reservationArgs, function (response){
if(response&&response.data&&response.data.FreeOperatorSlots){
const owlContainer=document.querySelector("#booking-owl-reservation");
if(owlContainer){
jQuery(owlContainer).trigger('destroy.owl.carousel');
owlContainer.innerHTML='';
Object.keys(response.data.FreeOperatorSlots).forEach(function (date){
const html=generateSlotHtml(date, response.data.FreeOperatorSlots[date]);
owlContainer.insertAdjacentHTML('beforeend', html);
});
initializeCarouselBooking();
document.querySelector(".grid-booking-box-2").style.display="block";
document.querySelector(".grid-booking-box-3").style.display="flex";
}}
hideLoader();
});
}
bookingScroll();
}
function getBookingAddressCoords(){
var coords=[];
var addressInputs=document.querySelectorAll(".autocomplete.booking-address"
);
addressInputs.forEach(function (input){
var latField=input.parentNode.querySelector(".booking-lat");
var lngField=input.parentNode.querySelector(".booking-lng");
if(latField&&lngField&&latField.value&&lngField.value){
coords.push({
Latitudine: latField.value.toString(),
Longitudine: lngField.value.toString(),
});
}else{
coords.push(null);
}});
return coords;
}
function initBookingAddressAutocomplete(){
console.log("initBookingAddressAutocomplete");
var addressInputs=document.querySelectorAll(".autocomplete.booking-address"
);
console.log("addressInputs", addressInputs);
addressInputs.forEach(function (input){
var latField=input.parentNode.querySelector(".booking-lat");
var lngField=input.parentNode.querySelector(".booking-lng");
if(!latField){
latField=document.createElement("input");
latField.type="hidden";
latField.className="booking-lat";
input.parentNode.insertBefore(latField, input.nextSibling);
}
if(!lngField){
lngField=document.createElement("input");
lngField.type="hidden";
lngField.className="booking-lng";
input.parentNode.insertBefore(lngField, latField.nextSibling);
}
setTimeout(function (){
if(!input._autocomplete &&
window.google &&
window.google.maps &&
window.google.maps.places
){
var options={
componentRestrictions: { country: "it" },
};
input._autocomplete=new window.google.maps.places.Autocomplete(input,
options
);
input._autocomplete.addListener("place_changed", function (){
var place=input._autocomplete.getPlace();
if(place.geometry&&place.geometry.location){
latField.value=place.geometry.location.lat();
lngField.value=place.geometry.location.lng();
}else{
latField.value="";
lngField.value="";
}});
}}, 500);
});
}
function handleCardEsigenzaClick(card, card_esigenza){
selectedCardDirectBooking=card.getAttribute("data-direct-booking");
var formSection5=document.querySelector(".booking-section.section-5");
var datepickerContainer=document.querySelector(".booking-date-container");
var s2_ry=document.querySelector(".section-2 .reservation_yes");
var s2_rn=document.querySelector(".section-2 .reservation_no");
card_esigenza.forEach(function (c){
c.classList.remove("selected");
});
card.classList.add("selected");
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.captureFromSelectedCard(card);
window.bookingOnlineDataLayer.syncFormModeFromCard(card);
}
if(selectedCardDirectBooking==="1"){
showBookingFields(true);
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onDirectBookingCardSelected();
}
if(!window.location.href.includes('area-pazienti')){
bookingCustomerNo();
}
var timesRows=document.querySelectorAll(".times .row");
if(timesRows.length){
timesRows.forEach(function (row, idx){
if(idx <=3){
row.style.display="flex";
var cols=row.querySelectorAll(".col-4");
cols.forEach(function (col){
col.remove();
});
}else{
row.style.display="none";
}});
}else{
timesRows.forEach(function (row){
row.style.display="flex";
});
}
directBooking=true;
formSection5.style.setProperty("display", "flex", "important");
if(datepickerContainer&&datepickerContainer.classList.contains("disabled")){
{
datepickerContainer.classList.remove("disabled");
}}
if(s2_ry&&s2_ry.classList.contains("disabled")){
{
s2_ry.classList.remove("disabled");
}}
if(s2_rn&&!s2_rn.classList.contains("disabled")){
{
s2_rn.classList.add("disabled");
}}
}else{
directBooking=false;
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onRicontattoFlowFromCard();
}
showBookingFields(false);
formSection5.style.setProperty("display", "none", "important");
if(datepickerContainer&&!datepickerContainer.classList.contains("disabled")){
{
datepickerContainer.classList.add("disabled");
}}
if(s2_ry&&!s2_ry.classList.contains("disabled")){
{
s2_ry.classList.add("disabled");
}}
if(s2_rn&&s2_rn.classList.contains("disabled")){
{
s2_rn.classList.remove("disabled");
}}
}}
function initBookingMap(clinicsObj, mapDiv){
if(!window.google||!window.google.maps) return;
var keys=Object.keys(clinicsObj);
if(keys.length===0) return;
var searchCoords=getBookingAddressCoords();
if(searchCoords&&searchCoords.length > 0&&searchCoords[0]&&searchCoords[1]){
center={
lat: parseFloat(searchCoords[0].Latitudine),
lng: parseFloat(searchCoords[0].Longitudine),
};}else{
var firstClinic=clinicsObj[keys[0]];
searchCoords=[{
Latitudine: parseFloat(firstClinic.position.lat),
Longitudine: parseFloat(firstClinic.position.lng),
}];
}
var mapOptions={
mapTypeId: "bookingMapStyle",
disableDefaultUI: true,
zoom: 14,
clickableIcons: false,
draggable: false,
scrollwheel: false,
disableDoubleClickZoom: true,
gestureHandling: 'none'
};
var map=new google.maps.Map(mapDiv, mapOptions);
map.mapTypes.set("bookingMapStyle",
new google.maps.StyledMapType(shortcodeMapStyle, {
name: "Booking Map Style",
})
);
window.bookingMarkers={};
keys.forEach(function (key){
var clinic=clinicsObj[key];
if(clinic &&
clinic.position &&
clinic.position.lat &&
clinic.position.lng
){
var marker=new google.maps.Marker({
position: {
lat: parseFloat(clinic.position.lat),
lng: parseFloat(clinic.position.lng),
},
map: map,
icon: {
url:
"data:image/svg+xml;charset=UTF-8," +
encodeURIComponent(getSvgStd()),
},
title: clinic.title||"",
});
var healthDirectorHtml=(clinic.health_director)
? "<br><span class=\"box-location-address dp-text-xs-important\"><span class=\"icon-Emoji me-1 dp-text-m\"></span>Dir. Sanitario " + clinic.health_director + "</span>"
: "";
var infoWindow=new google.maps.InfoWindow({
content:
"<strong>" +
(clinic.title||"") +
"</strong><br>" +
(clinic.address||"") +
healthDirectorHtml,
});
marker.addListener("click", function (){
infoWindow.open(map, marker);
});
window.bookingMarkers[key]={
marker: marker,
infoWindow: infoWindow,
active: false,
};}});
if(searchCoords&&searchCoords.length > 0&&keys.length > 1){
searchCoords.forEach(function (coord, index){
if(coord&&coord.Latitudine&&coord.Longitudine){
var searchMarker=new google.maps.Marker({
position: {
lat: parseFloat(coord.Latitudine),
lng: parseFloat(coord.Longitudine),
},
map: map,
icon: {
url:
"data:image/svg+xml;charset=UTF-8," +
encodeURIComponent(getSearchLocationSvg()),
scaledSize: new google.maps.Size(27, 27),
anchor: new google.maps.Point(13.5, 13.5),
},
zIndex: 1000,
});
window.bookingMarkers["search_" + index]={
marker: searchMarker,
isSearchLocation: true,
};}});
}
if(Object.keys(window.bookingMarkers).length > 2){
var bounds=new google.maps.LatLngBounds();
Object.values(window.bookingMarkers).forEach(function (markerObj){
bounds.extend(markerObj.marker.getPosition());
});
map.fitBounds(bounds);
}else{
var singleClinic=clinicsObj[keys[0]];
if(singleClinic&&singleClinic.position){
map.setCenter({
lat: parseFloat(singleClinic.position.lat),
lng: parseFloat(singleClinic.position.lng)
});
map.setZoom(12);
}}
jQuery("#booking-owl-reservation").on("click",
".time",
function (){
var $this=jQuery(this);
var clinicsData=$this
.attr("data-clinics")
.replace(/&quot;/g, '"');
var clinics=JSON.parse(clinicsData);
Object.keys(window.bookingMarkers).forEach(function (
key
){
if(!window.bookingMarkers[key].isSearchLocation){
window.bookingMarkers[key].marker.setIcon({
url:
"data:image/svg+xml;charset=UTF-8," +
encodeURIComponent(getSvgStd()),
});
window.bookingMarkers[key].active=false;
}});
clinics.forEach(function (clinicId){
if(window.bookingMarkers[clinicId]){
window.bookingMarkers[clinicId].marker.setIcon({
url:
"data:image/svg+xml;charset=UTF-8," +
encodeURIComponent(getSvgActive()),
});
window.bookingMarkers[clinicId].active=true;
}});
jQuery("#booking-owl-reservation .time").removeClass("active"
);
$this.addClass("active");
}
);
}
function getSvgStd(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="39" viewBox="0 0 28 39" fill="none">',
'<path d="M13.9651 0.000414856C24.6085 -0.0793662 31.4922 11.3638 26.148 20.579C22.6761 26.566 18.711 32.2674 15.0071 38.122C14.3284 39.1946 13.8654 39.361 13.1236 38.1924C9.32142 32.2039 5.20435 26.3942 1.72551 20.2259C-3.38072 11.1737 3.48221 0.0797035 13.9651 0.000414856ZM13.8561 21.5103C18.1074 21.6058 21.6637 18.1994 21.7486 13.9508C21.8306 9.86076 18.4573 6.33119 14.3195 6.17803C10.0495 6.01945 6.4645 9.35795 6.34011 13.609C6.21573 17.8576 9.59931 21.4152 13.8561 21.5108V21.5103Z" fill="#565658"/>',
"</svg>",
].join("");
}
function getSvgActive(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="39" viewBox="0 0 28 39" fill="none">',
'<path d="M13.9651 0.000414856C24.6085 -0.0793662 31.4922 11.3638 26.148 20.579C22.6761 26.566 18.711 32.2674 15.0071 38.122C14.3284 39.1946 13.8654 39.361 13.1236 38.1924C9.32142 32.2039 5.20435 26.3942 1.72551 20.2259C-3.38072 11.1737 3.48221 0.0797035 13.9651 0.000414856ZM13.8561 21.5103C18.1074 21.6058 21.6637 18.1994 21.7486 13.9508C21.8306 9.86076 18.4573 6.33119 14.3195 6.17803C10.0495 6.01945 6.4645 9.35795 6.34011 13.609C6.21573 17.8576 9.59931 21.4152 13.8561 21.5108V21.5103Z" fill="#66C1BF"/>',
"</svg>",
].join("");
}
function getSearchLocationSvg(){
return [
'<svg xmlns="http://www.w3.org/2000/svg" width="27" height="27" viewBox="0 0 27 27" fill="none">',
'<circle cx="13.5" cy="13.5" r="13.5" fill="#295782" fill-opacity="0.3"/>',
'<circle cx="13.5" cy="13.5" r="8.5" fill="#295782"/>',
"</svg>",
].join("");
}
function clearBookingErrors(){
const errorDiv=document.querySelector(".booking-section.section-4 .error");
if(errorDiv){
errorDiv.classList.remove("active");
const errorMessage=errorDiv.querySelector("p");
if(errorMessage){
errorMessage.innerHTML="";
}}
}
function getFormattedData(selectedDate){
let date;
if(selectedDate){
date=`${selectedDate}T00:00:00Z`;
}else{
var now=new Date();
var yyyy=now.getFullYear();
var mm=String(now.getMonth() + 1).padStart(2, "0");
var dd=String(now.getDate()).padStart(2, "0");
date=`${yyyy}-${mm}-${dd}T00:00:00Z`;
}
return date;
}
function bookingCustomerYes(){
var tab_no=document.querySelectorAll(".tab-no");
var tab_yes=document.querySelectorAll(".tab-yes");
for (let i=0; i < tab_no.length; i++){
tab_no[i].style.display="none";
}
for (let i=0; i < tab_yes.length; i++){
tab_yes[i].style.display="flex";
}}
function bookingCustomerNo(){
var tab_no=document.querySelectorAll(".tab-no");
var tab_yes=document.querySelectorAll(".tab-yes");
for (let i=0; i < tab_no.length; i++){
tab_no[i].style.display="flex";
}
for (let i=0; i < tab_yes.length; i++){
tab_yes[i].style.display="none";
}}
function directBookingCustomerYes(){
var tab_no=document.querySelectorAll(".tab-no");
var tab_yes=document.querySelectorAll(".tab-yes");
var tab_yes_direct=document.querySelector("#section-selection-by-comune");
for (let i=0; i < tab_no.length; i++){
tab_no[i].style.display="none";
}
for (let i=0; i < tab_yes.length; i++){
tab_yes[i].style.display="none";
}
tab_yes_direct.classList.add("active");
}
function bookingShowAreaPazientiPrenotaInlineThankyou(dataContent){
if(typeof bookingFillInlineThankyouSummary==="function"){
bookingFillInlineThankyouSummary(dataContent);
}
var prenEl=document.getElementById("prenota");
var tyEl=document.getElementById("prenota-thankyou");
if(prenEl){
prenEl.classList.remove("active");
}
if(tyEl){
tyEl.classList.add("active");
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.fireInlineThankYouConversion(dataContent);
}
document.body.classList.remove("overlay-loading-show");
}
try {
window.bookingShowAreaPazientiPrenotaInlineThankyou=bookingShowAreaPazientiPrenotaInlineThankyou;
} catch (e){}
function bookingSubmitAreaPazienti(dataContent){
var grecaptcha_key=document
.getElementById("g-recaptcha")
.getAttribute("src")
.split("render=")[1];
grecaptcha.ready(function (){
grecaptcha
.execute(grecaptcha_key, { action: "submit" })
.then(function (token){
document.body.classList.add("overlay-loading-show");
const urlParams=new URLSearchParams(window.location.search);
const gclid_field=urlParams.get("gclid");
dataContent.gclid_field =
gclid_field!=null ? gclid_field:"";
var reservationDirectBooking =
dataContent&&dataContent.reservation_direct_booking!=null
? String(dataContent.reservation_direct_booking)
: typeof window.bookingReservationDirectBookingParam==="function"
? window.bookingReservationDirectBookingParam()
: window.selectedCardDirectBooking==="0"||window.directBooking===false
? "0"
: "1";
dataContent.reservation_direct_booking=reservationDirectBooking;
let myDataJSON=JSON.stringify({
"g-recaptcha-response": token,
data: dataContent,
});
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4){
if(typeof console!=="undefined"&&console.log){
console.log("[AP-DEBUG] booking-slots.bookingSubmitAreaPazienti.dp_booking.response", {
status: this.status,
responseText: xhttp.responseText,
thankyouReason: dataContent&&dataContent.thankyouReason,
});
}}
if(this.readyState==4&&this.status==200){
bookingShowAreaPazientiPrenotaInlineThankyou(dataContent);
sessionStorage.setItem("apPostBookingSyncMeta",
JSON.stringify({ startedAt: Date.now(), source: "booking-slots" })
);
var syncPromise =
typeof window!=="undefined" &&
typeof window.syncAreaPazientiPatientCard==="function"
? window.syncAreaPazientiPatientCard()
: syncAreaPazientiPatientCardFallback();
Promise.resolve(syncPromise);
}};
const link=new URL(
document.getElementById("booking_ajax_url").value
);
link.searchParams.set("action", "dp_booking");
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type",
"application/json; charset=UTF-8"
);
xhttp.send(myDataJSON);
});
});
}
function syncAreaPazientiPatientCardFallback(maxAttempts, retryDelayMs){
var attempts=typeof maxAttempts==="number" ? maxAttempts:10;
var delay=typeof retryDelayMs==="number" ? retryDelayMs:1500;
var runOnce=function (){
return new Promise(function (resolve, reject){
var token=sessionStorage.getItem("access_token");
var ajaxNode=document.getElementById("ajaxurl");
var ajaxHref=ajaxNode ? ajaxNode.getAttribute("href"):null;
if(!token||!ajaxHref){
reject(new Error("Missing token or ajax endpoint"));
return;
}
var url=new URL(ajaxHref);
url.searchParams.set("action", "dp_get_card");
var payload=JSON.stringify({ token: token });
var req=new XMLHttpRequest();
req.onreadystatechange=function (){
if(this.readyState!==4) return;
if(this.status!==200){
if(this.status===401||this.status===403){
sessionStorage.removeItem("userData");
sessionStorage.removeItem("access_token");
sessionStorage.removeItem("id_token");
window.location.href="/area-pazienti/?login";
reject(new Error("Unauthorized dp_get_card"));
return;
}
reject(new Error("dp_get_card HTTP " + this.status));
return;
}
try {
var response=JSON.parse(req.responseText);
if(!response||!response.Data){
reject(new Error("Invalid dp_get_card payload"));
return;
}
if(!hasLinkedPatientCardFallback(response.Data)){
reject(new Error("Patient not linked yet"));
return;
}
sessionStorage.setItem("userData", JSON.stringify(response.Data));
if(response.PublicWebMasterTables){
sessionStorage.setItem("PublicWebMasterTables",
JSON.stringify(response.PublicWebMasterTables)
);
}
window.dispatchEvent(new CustomEvent("dp:patient-data-updated", {
detail: { source: "bookingSubmitAreaPazientiLegacy", response: response },
})
);
sessionStorage.removeItem("apPostBookingSyncMeta");
resolve(response);
} catch (err){
reject(err);
}};
req.open("POST", url, true);
req.setRequestHeader("Content-type", "application/json; charset=UTF-8");
req.send(payload);
});
};
var step=function (index){
return runOnce().catch(function (err){
if(index >=attempts - 1) throw err;
return new Promise(function (resolve){
setTimeout(resolve, delay);
}).then(function (){
return step(index + 1);
});
});
};
return step(0).catch(function (err){
if(typeof console!=="undefined"&&console.warn){
console.warn("Area pazienti legacy sync post-booking failed", err);
}});
}
try {
window.syncAreaPazientiPatientCardFallback=syncAreaPazientiPatientCardFallback;
} catch (e){}
function hasLinkedPatientCardFallback(data){
return !!(
data &&
data.PatientWebCard &&
data.PatientWebCard.Paziente &&
data.PatientWebCard.Paziente.PazienteId!=null &&
String(data.PatientWebCard.Paziente.PazienteId).trim()!==""
);
}
function bookingReservationDirectBookingParam(){
var fromWindow =
typeof window!=="undefined"&&window.selectedCardDirectBooking!=null&&window.selectedCardDirectBooking!==""
? String(window.selectedCardDirectBooking)
: null;
var fromGlobal =
typeof selectedCardDirectBooking!=="undefined" &&
selectedCardDirectBooking!=null &&
selectedCardDirectBooking!==""
? String(selectedCardDirectBooking)
: null;
var cardVal=fromGlobal!=null ? fromGlobal:fromWindow;
if(cardVal==="0") return "0";
if(cardVal==="1") return "1";
if(typeof directBooking!=="undefined"&&directBooking===false) return "0";
if(typeof directBooking!=="undefined"&&directBooking===true) return "1";
if(typeof window!=="undefined"&&window.directBooking===false) return "0";
if(typeof window!=="undefined"&&window.directBooking===true) return "1";
return "1";
}
try {
window.bookingReservationDirectBookingParam=bookingReservationDirectBookingParam;
} catch (e){}
function bookingResolveClinicAddressFromLocationValue(loc){
function isClinicCodeValue(value){
return /^\d{1,6}$/.test(String(value!=null ? value:"").trim());
}
if(loc==null) return "";
if(typeof loc!=="object") return String(loc).trim();
var title=String(loc.title!=null ? loc.title:"").trim();
var address=String(loc.address!=null ? loc.address:"").trim();
var code=String(loc.code!=null ? loc.code:"").trim();
var clinicsMap =
(typeof bookingClinicsData!=="undefined"&&bookingClinicsData) ||
(typeof window!=="undefined"&&window.bookingClinicsData ? window.bookingClinicsData:null) ||
{};
var byCode=(code&&clinicsMap[code])||(code&&/^\d+$/.test(code)&&clinicsMap[code.padStart(3, "0")])||null;
var byCodeTitle=byCode&&byCode.title ? String(byCode.title).trim():"";
var byCodeAddress=byCode&&byCode.address ? String(byCode.address).trim():"";
if(address&&!isClinicCodeValue(address)) return address;
if(title&&!isClinicCodeValue(title)){
return [title, address].filter(function (v){ return v&&!isClinicCodeValue(v); }).join(" - ")||title;
}
if(byCodeAddress) return byCodeAddress;
if(byCodeTitle) return byCodeTitle;
if(address) return address;
if(title) return title;
return code;
}
try {
window.bookingResolveClinicAddressFromLocationValue=bookingResolveClinicAddressFromLocationValue;
} catch (e){}
function bookingResolveThankyouClinicOrZone(dataContent){
var clinicAddr="";
if(dataContent&&dataContent.location!=null){
clinicAddr=bookingResolveClinicAddressFromLocationValue(dataContent.location);
}
if(!clinicAddr&&dataContent&&dataContent.locations){
var locs=dataContent.locations;
clinicAddr=Array.isArray(locs)
? locs
.map(function (x){
return x!=null ? String(x).trim():"";
})
.filter(function (x){
return x!=="";
})
.join(" - ")
: String(locs).trim();
}
if(!clinicAddr&&typeof document!=="undefined"){
var zoneSec=document.getElementById("section-selection-by-comune");
if(zoneSec){
var parts=[];
zoneSec.querySelectorAll(".autocomplete.booking-address").forEach(function (inp){
var v=inp&&(inp.value||"").trim();
if(v){
parts.push(v);
}});
if(parts.length){
clinicAddr=parts.join(" - ");
}}
}
return clinicAddr;
}
try {
window.bookingResolveThankyouClinicOrZone=bookingResolveThankyouClinicOrZone;
} catch (e){}
function bookingIsFlow8TemporaryZonaDatiPath(card){
if(!card) return false;
return card.getAttribute("data-evodent-id")==="8"&&card.getAttribute("data-direct-booking")==="0";
}
try {
window.bookingIsFlow8TemporaryZonaDatiPath=bookingIsFlow8TemporaryZonaDatiPath;
} catch (e){}
function bookingSyncZonaPreferenzaToBookingData(sectionEl, targetData){
if(!sectionEl||!targetData) return;
var parts=[];
sectionEl.querySelectorAll(".autocomplete.booking-address").forEach(function (inp){
var v=inp&&(inp.value||"").trim();
if(v) parts.push(v);
});
if(parts.length){
targetData.locations=parts.slice();
targetData.location=parts.join("\n\n");
}}
try {
window.bookingSyncZonaPreferenzaToBookingData=bookingSyncZonaPreferenzaToBookingData;
} catch (e){}
function bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals(){
if(typeof window!=="undefined"){
window.directBooking=false;
window.selectedCardDirectBooking="0";
}
if(typeof directBooking!=="undefined"){
directBooking=false;
}
if(typeof selectedCardDirectBooking!=="undefined"){
selectedCardDirectBooking="0";
}}
function bookingSwitchToRicontattoFromDirectMidFlow(bookingData){
bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals();
var bd=bookingData||(typeof window!=="undefined" ? window.bookingData:null);
if(bd&&typeof bd==="object"){
delete bd.bookData;
delete bd.thankyou;
delete bd.reservation;
delete bd.selectedSlot;
delete bd.selectedClinicId;
delete bd.selectedDay;
bd.times=[];
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onRicontattoSwitch();
}}
function bookingIsRicontattoSubmitMode(){
if(typeof window.bookingOnlineDataLayer!=="undefined"&&window.bookingOnlineDataLayer.isRicontattoFlow()){
return true;
}
if(typeof window!=="undefined"&&window.selectedCardDirectBooking==="0"){
return true;
}
if(typeof window!=="undefined"&&window.directBooking===false){
return true;
}
if(typeof selectedCardDirectBooking!=="undefined"&&selectedCardDirectBooking==="0"){
return true;
}
if(typeof directBooking!=="undefined"&&directBooking===false){
return true;
}
return false;
}
function bookingBuildRicontattoSubmitPayload(bookingData){
var payload=Object.assign({}, bookingData||{});
delete payload.bookData;
delete payload.thankyou;
delete payload.reservation;
delete payload.selectedSlot;
delete payload.selectedClinicId;
delete payload.selectedDay;
payload.times=[];
return payload;
}
try {
window.bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals =
bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals;
window.bookingApplyNonDirectRicontattoGlobals=bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals;
window.bookingSwitchToRicontattoFromDirectMidFlow=bookingSwitchToRicontattoFromDirectMidFlow;
window.bookingIsRicontattoSubmitMode=bookingIsRicontattoSubmitMode;
window.bookingBuildRicontattoSubmitPayload=bookingBuildRicontattoSubmitPayload;
} catch (e){}
function bookingBuildThankyouRedirectParams(dataContent, contactOnlyFollowup){
var dbFlag=bookingReservationDirectBookingParam();
var thankyouReason =
dataContent&&dataContent.thankyouReason!=null
? String(dataContent.thankyouReason)
: "";
if(dataContent&&dataContent.areaPazienti===true){
var tyAp=dataContent.thankyou&&typeof dataContent.thankyou==="object" ? dataContent.thankyou:null;
var hasDirectThankyouData =
!!(
tyAp &&
(
(tyAp.slot_time&&String(tyAp.slot_time).trim()!=="") ||
(tyAp.clinic_address&&String(tyAp.clinic_address).trim()!=="") ||
(tyAp.clinic_link&&String(tyAp.clinic_link).trim()!=="") ||
(tyAp.name&&String(tyAp.name).trim()!=="")
)
);
if(hasDirectThankyouData){
dbFlag="1";
}}
if(contactOnlyFollowup===true){
return {
thankyou_contact_only: "1",
email: "",
customer: "",
reservation_name: "",
reservation_type: "",
reservation_date: "",
reservation_clinic_address: "",
reservation_clinic_url: "",
reservation_direct_booking: dbFlag,
thankyou_reason: thankyouReason,
};}
var ty=dataContent&&dataContent.thankyou;
var name="";
var type="";
var dateStr="";
var clinicAddr="";
var clinicUrl="";
if(ty&&typeof ty==="object"){
name=ty.name||"";
type=ty.type||"";
dateStr=ty.slot_time||"";
clinicAddr=ty.clinic_address||"";
clinicUrl=ty.clinic_link||"";
}
if(!name&&dataContent){
name=((dataContent.firstname||"") + " " + (dataContent.lastname||"")).trim();
}
if(!type&&dataContent&&dataContent.service){
type=dataContent.service;
}
if(!dateStr&&dataContent&&dataContent.times){
dateStr=Array.isArray(dataContent.times) ? dataContent.times.join(", "):String(dataContent.times);
}
if(!clinicAddr&&dataContent){
clinicAddr=bookingResolveThankyouClinicOrZone(dataContent);
}
return {
email: (dataContent&&dataContent.email)||"",
customer: typeof bookingData!=="undefined"&&bookingData.customer ? "si":"no",
reservation_name: name,
reservation_type: type,
reservation_date: dateStr,
reservation_clinic_address: clinicAddr,
reservation_clinic_url: clinicUrl,
reservation_direct_booking: dbFlag,
thankyou_reason: thankyouReason,
};}
try {
window.bookingBuildThankyouRedirectParams=bookingBuildThankyouRedirectParams;
} catch (e){}
function bookingFillInlineThankyouSummary(dataContent){
if(!dataContent) return;
var p=bookingBuildThankyouRedirectParams(dataContent, false);
var isDirectBooking=p.reservation_direct_booking!=="0";
var isAppTypeFuThankyou=String(p.thankyou_reason||"").trim()==="APP_TYPE_FU";
var sp=document.getElementById("summary-patient");
if(sp) sp.textContent=p.reservation_name||"";
var st=document.getElementById("summary-visit-type");
if(st) st.textContent=p.reservation_type||"";
var sd=document.getElementById("summary-datetime");
if(sd) sd.textContent=p.reservation_date||"";
var sc=document.getElementById("summary-clinic");
if(sc) sc.textContent=p.reservation_clinic_address||"";
var sdr=document.getElementById("summary-datetime-row");
if(sdr) sdr.style.display=isDirectBooking ? "":"none";
var summaryMainTitle=document.getElementById("summary-main-title");
if(summaryMainTitle){
summaryMainTitle.textContent=isDirectBooking
? "Grazie, la tua prenotazione è andata a buon fine!"
: (isAppTypeFuThankyou
? "Richiesta inviata! Verrai ricontattato da un nostro operatore."
: "Grazie! Verrai ricontattato da un nostro operatore.");
}
var summaryBookingTitle=document.getElementById("summary-booking-title");
if(summaryBookingTitle){
summaryBookingTitle.textContent=isDirectBooking ? "Riepilogo prenotazione":"Riepilogo richiesta";
}
var summaryContactFollowupRow=document.getElementById("summary-contact-followup-row");
if(summaryContactFollowupRow){
summaryContactFollowupRow.classList.toggle("d-none", isDirectBooking);
if(!isDirectBooking){
summaryContactFollowupRow.textContent=isAppTypeFuThankyou
? "La tua richiesta è stata correttamente inviata ma l’appuntamento non è ancora confermato. Un nostro operatore ti contatterà a breve per finalizzare la prenotazione."
: "Ti ricontatteremo a breve per finalizzare la tua richiesta.";
}else{
summaryContactFollowupRow.textContent="";
}}
var summaryEmailConfirmRow=document.getElementById("summary-email-confirm-row");
if(summaryEmailConfirmRow){
summaryEmailConfirmRow.style.display=isDirectBooking ? "":"none";
}
var thankWrap=document.getElementById("prenota-thankyou");
var clinicBtn=thankWrap ? thankWrap.querySelector(".goClinic"):document.querySelector(".goClinic");
if(clinicBtn){
if(p.reservation_clinic_url){
clinicBtn.href=p.reservation_clinic_url;
clinicBtn.classList.remove("d-none");
}else{
clinicBtn.classList.add("d-none");
clinicBtn.href="#";
}}
var bs=thankWrap ? thankWrap.querySelector(".booking-summary"):document.querySelector(".booking-summary");
if(bs) bs.classList.remove("d-none");
}
try {
window.bookingFillInlineThankyouSummary=bookingFillInlineThankyouSummary;
} catch (e){}
function bookingSetOverlayLoading(isVisible){
if(!document||!document.body||!document.body.classList) return;
if(isVisible){
document.body.classList.add("overlay-loading-show");
}else{
document.body.classList.remove("overlay-loading-show");
}}
function bookingVerifyNormalizeEsit(payload){
if(payload&&typeof payload==="object"){
if(payload.data &&
typeof payload.data==="object" &&
(typeof payload.data.esit!=="undefined"||typeof payload.data.verified!=="undefined")
){
payload=payload.data;
}
var raw=typeof payload.esit!=="undefined" ? payload.esit:payload.verified;
if(typeof raw!=="undefined"){
if(raw===true||raw==="true"||raw===1||raw==="1"){
return true;
}
if(raw===false||raw==="false"||raw===0||raw==="0"){
return false;
}}
}
return false;
}
function bookingGetAjaxBaseUrl(){
var el=document.getElementById("booking_ajax_url");
return el ? el.value:"";
}
function bookingVerifyCheckTarget(email){
return new Promise(function (resolve, reject){
var base=bookingGetAjaxBaseUrl();
if(!base||!email){
resolve(false);
return;
}
var link=new URL(base);
link.searchParams.set("action", "dp_booking_verify_check");
link.searchParams.set("target", String(email).trim());
var req=new XMLHttpRequest();
req.onreadystatechange=function (){
if(req.readyState!==4) return;
if(req.status < 200||req.status >=300){
reject(new Error("verify/check http " + req.status));
return;
}
try {
var parsed=JSON.parse(req.responseText||"{}");
resolve(bookingVerifyNormalizeEsit(parsed));
} catch (err){
reject(err);
}};
req.open("GET", link, true);
req.send();
});
}
function bookingVerifySendTarget(phoneTarget){
return new Promise(function (resolve, reject){
var base=bookingGetAjaxBaseUrl();
if(!base||!phoneTarget){
resolve(false);
return;
}
var link=new URL(base);
link.searchParams.set("action", "dp_booking_verify_send");
var req=new XMLHttpRequest();
req.onreadystatechange=function (){
if(req.readyState!==4) return;
if(req.status < 200||req.status >=300){
reject(new Error("verify/send http " + req.status));
return;
}
try {
var parsed=JSON.parse(req.responseText||"{}");
resolve(bookingVerifyNormalizeEsit(parsed));
} catch (err){
reject(err);
}};
req.open("POST", link, true);
req.setRequestHeader("Content-type", "application/json; charset=UTF-8");
req.send(JSON.stringify({ data: { target: phoneTarget }}));
});
}
function bookingEnsureVerifyModal(){
var root=document.getElementById("verify-modal");
if(!root) return null;
return {
root: root,
backdrop: root.querySelector(".verify-modal__backdrop"),
close: root.querySelector("#verify-modal-close"),
message: root.querySelector("#verify-modal-message"),
proceed: root.querySelector("#verify-modal-proceed"),
};}
function bookingOpenVerifyModal(message){
return new Promise(function (resolve){
var modal=bookingEnsureVerifyModal();
if(!modal||!modal.root||!modal.proceed){
resolve(false);
return;
}
if(modal.message){
modal.message.textContent=message||"A breve riceverai un SMS con le istruzioni per la verifica. Segui i passaggi indicati e torna qui per continuare.";
}
modal.root.classList.remove("d-none");
modal.root.setAttribute("aria-hidden", "false");
function cleanup(){
modal.proceed.removeEventListener("click", onProceedClick);
if(modal.close) modal.close.removeEventListener("click", onCloseClick);
if(modal.backdrop) modal.backdrop.removeEventListener("click", onCloseClick);
modal.root.classList.add("d-none");
modal.root.setAttribute("aria-hidden", "true");
}
function onProceedClick(e){
e.preventDefault();
cleanup();
resolve(true);
}
function onCloseClick(e){
e.preventDefault();
cleanup();
resolve(false);
}
modal.proceed.addEventListener("click", onProceedClick);
if(modal.close) modal.close.addEventListener("click", onCloseClick);
if(modal.backdrop) modal.backdrop.addEventListener("click", onCloseClick);
});
}
function bookingBuildPhoneTarget(dataContent){
var prefix=dataContent&&dataContent.phone_prefix ? String(dataContent.phone_prefix):"";
var phone=dataContent&&dataContent.phone ? String(dataContent.phone):"";
var full=(prefix + phone).replace(/\s+/g, "");
if(!full) return "";
if(full.charAt(0)!=="+"&&/^\d{8,20}$/.test(full)){
full="+" + full;
}
return full;
}
function bookingRunVerifyCheckLoopAfterProceed(checkTarget, message){
return bookingOpenVerifyModal(message).then(function (shouldCheck){
if(!shouldCheck){
return false;
}
bookingSetOverlayLoading(true);
return bookingVerifyCheckTarget(checkTarget).then(function (checkOk){
if(checkOk){
return true;
}
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, message);
}).catch(function (){
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, message);
});
});
}
function bookingRunPreConfirmVerification(dataContent){
if(document.body.classList.contains("area-pazienti-dashboard")){
return Promise.resolve(true);
}
if(typeof bookingReservationDirectBookingParam==="function"){
var dbFlag=bookingReservationDirectBookingParam();
if(dbFlag==="0"){
return Promise.resolve(true);
}}
var phoneTarget=bookingBuildPhoneTarget(dataContent);
var checkTarget=phoneTarget;
var modalMessage="A breve riceverai un SMS con le istruzioni per la verifica. Segui i passaggi indicati e torna qui per continuare.";
bookingSetOverlayLoading(true);
return bookingVerifyCheckTarget(checkTarget).then(function (checkOk){
if(checkOk){
return true;
}
return bookingVerifySendTarget(phoneTarget).then(function (){
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, modalMessage);
}).catch(function (){
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, modalMessage);
});
}).catch(function (){
return bookingVerifySendTarget(phoneTarget).then(function (){
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, modalMessage);
}).catch(function (){
bookingSetOverlayLoading(false);
return bookingRunVerifyCheckLoopAfterProceed(checkTarget, modalMessage);
});
});
}
try {
window.bookingRunPreConfirmVerification=bookingRunPreConfirmVerification;
} catch (e){}
function bookingSubmitFrontend(dataContent){
var contactOnlyFollowup=dataContent.thankyouContactOnlyRequest===true;
delete dataContent.thankyouContactOnlyRequest;
var forServer=Object.assign({}, dataContent);
var grecaptcha_key=document
.getElementById("g-recaptcha")
.getAttribute("src")
.split("render=")[1];
grecaptcha.ready(function (){
grecaptcha
.execute(grecaptcha_key, { action: "submit" })
.then(function (token){
document.body.classList.add("overlay-loading-show");
const urlParams=new URLSearchParams(window.location.search);
const gclid_field=urlParams.get("gclid");
forServer.gclid_field=gclid_field!=null ? gclid_field:"";
var reservationDirectBooking =
forServer&&forServer.reservation_direct_booking!=null
? String(forServer.reservation_direct_booking)
: typeof window.bookingReservationDirectBookingParam==="function"
? window.bookingReservationDirectBookingParam()
: window.selectedCardDirectBooking==="0"||window.directBooking===false
? "0"
: "1";
forServer.reservation_direct_booking=reservationDirectBooking;
let myDataJSON=JSON.stringify({
"g-recaptcha-response": token,
data: forServer,
});
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4&&this.status==200){
if(forServer.areaPazienti===true){
bookingShowAreaPazientiPrenotaInlineThankyou(dataContent);
sessionStorage.setItem("apPostBookingSyncMeta",
JSON.stringify({ startedAt: Date.now(), source: "booking-slots-bookingSubmitFrontend" })
);
var syncFn =
typeof window!=="undefined"&&typeof window.syncAreaPazientiPatientCard==="function"
? window.syncAreaPazientiPatientCard
: typeof syncAreaPazientiPatientCardFallback==="function"
? syncAreaPazientiPatientCardFallback
: null;
if(syncFn){
Promise.resolve(syncFn());
}}else{
if(typeof window.bookingOnlineDataLayer!=="undefined" &&
!contactOnlyFollowup
){
window.bookingOnlineDataLayer.fireThankYou(dataContent, {
deferToThankyouPage: true,
});
}
goThankyou(
"/grazie-prenota/",
bookingBuildThankyouRedirectParams(contactOnlyFollowup ? forServer:dataContent, contactOnlyFollowup)
);
}}
};
const link=new URL(
document.getElementById("booking_ajax_url").value
);
link.searchParams.set("action", "dp_booking");
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type",
"application/json; charset=UTF-8"
);
xhttp.send(myDataJSON);
});
});
}
function bookFormatData(date){
var rawDate=date;
var dateObj=new Date(rawDate);
var day=String(dateObj.getDate()).padStart(2, '0');
var month=String(dateObj.getMonth() + 1).padStart(2, '0');
var year=dateObj.getFullYear();
var hours=String(dateObj.getHours()).padStart(2, '0');
var minutes=String(dateObj.getMinutes()).padStart(2, '0');
var formatted=`${day}/${month}/${year} ${hours}:${minutes}`;
return formatted;
}
function bookingGetSection4SubmitCtaLabel(){
var btn=document.querySelector(".booking-section.section-4 a.submit");
if(!btn) return "";
var spans=btn.querySelectorAll(".sz-16");
for (var i=0; i < spans.length; i++){
if(!spans[i].classList.contains("d-none")){
var t=spans[i].textContent&&spans[i].textContent.trim();
if(t) return t;
}}
var tAll=(btn.textContent||"").trim();
return tAll;
}
function bookingSyncTermsDisclaimerCtaText(){
var label=bookingGetSection4SubmitCtaLabel();
document.querySelectorAll(".terms-disclaimer-cta-text").forEach(function (el){
el.textContent=label;
});
}
try {
window.bookingSyncTermsDisclaimerCtaText=bookingSyncTermsDisclaimerCtaText;
window.bookingGetSection4SubmitCtaLabel=bookingGetSection4SubmitCtaLabel;
} catch (e){}
function showBookingFields(direct){
var fields_y=document.querySelectorAll(".direct-field-y");
var fields_n=document.querySelectorAll(".direct-field-n");
if(direct){
fields_y.forEach(function (el){
el.classList.remove('d-none');
});
fields_n.forEach(function (el){
el.classList.add('d-none');
});
}else{
fields_y.forEach(function (el){
el.classList.add('d-none');
});
fields_n.forEach(function (el){
el.classList.remove('d-none');
});
}
bookingSyncTermsDisclaimerCtaText();
}
try {
window.showBookingFields=showBookingFields;
} catch (e){}
function resetFormFields(formElement){
if(!formElement) return;
const fields=formElement.querySelectorAll("input, select, textarea");
fields.forEach(function (el){
if(el.type==="checkbox"||el.type==="radio"){
el.checked=el.defaultChecked;
}else if(el.tagName==="SELECT"){
el.selectedIndex=0;
}else{
el.value=el.defaultValue||"";
}});
}
document.addEventListener("DOMContentLoaded", function (){
if(typeof bookingSyncTermsDisclaimerCtaText==="function"){
bookingSyncTermsDisclaimerCtaText();
}});
(function (window){
"use strict";
var FLOW8={
H3_IGIENE: "Seleziona giorno e ora della tua igiene dentale",
H3_CHECKUP: "Seleziona giorno e ora della visita di controllo",
HTML_NO_SLOTS: '<div class="no-slots-message"><p>Nessuno slot disponibile</p></div>',
HTML_ERR_SLOTS: '<div class="no-slots-message"><p>Errore durante il recupero degli slot</p></div>',
SUB_NEG: "Informazione importante",
SUB_POS: "Inserisci i tuoi dati + Rational: condizioni del servizio",
MSG_NEG_ELIGIBILITY:
"<p>Per garantire la tua salute orale, prima dell'igiene dentale è necessaria una <strong>visita di controllo</strong></p>" +
"<p>Procedendo potrai prenotarle entrambe: prima la tua visita di controllo a cui seguirà una seduta di igiene dentale</p>",
};
class BookingFlowControlloIgieneOrale {
constructor(config){
var assign={
pageBooking: null,
bookingData: null,
formSection2Yes: null,
formSection2No: null,
formSection3: null,
formSection4: null,
formSection5: null,
formSection6: null,
formSection7: null,
formSectionSelectByComune: null,
formSection1Specialista: null,
subtitleSection4No: null,
subtitleSection4Yes: null,
formSection4SubmitLabelNo: null,
formSection4SubmitLabelYes: null,
section4DefaultLabelNo: "",
section4DefaultLabelYes: "",
sectionSlot: null,
sectionSlotStep2: null,
bookingScroll: function (){ },
};
Object.keys(assign).forEach(function (k){
this[k]=config[k]!=null ? config[k]:assign[k];
}, this);
this.section4DefaultLabelNo=config.section4DefaultLabelNo||"";
this.section4DefaultLabelYes=config.section4DefaultLabelYes||"";
this.flowApiAction=config.flowApiAction||"dp_booking_flow8_step1_check";
this.followupSlotsApiAction=config.followupSlotsApiAction||"dp_booking_flow8_followup_slots";
this.igieneSlotsApiAction=config.igieneSlotsApiAction||"dp_booking_flow8_igiene_slots";
this.appointmentsApiAction=config.appointmentsApiAction||"dp_booking_flow8_appointments";
this.passEvodentSessionBearer=config.passEvodentSessionBearer===true;
this.useDashboardBookingThankyou=config.useDashboardBookingThankyou===true;
this.subtitle4YesDefaultText=this.getSubtitleText(this.subtitleSection4Yes);
this.bindSectionSelectionByComuneCta();
this.bindFlow8ConfirmAppointments();
this.bindFlow8BackToEligibility();
this.bindFlow8TurnOffDirectBooking();
this._flow8ChangeClinicWrap=null;
this._flow8ChangeClinicInput=null;
}
_flow8EvodentBearerFromSession(){
if(typeof sessionStorage==="undefined") return "";
var id=sessionStorage.getItem("id_token");
var acc=sessionStorage.getItem("access_token");
if(id&&String(id).trim()) return String(id).trim();
if(acc&&String(acc).trim()) return String(acc).trim();
return "";
}
_flow8GetEsito(d){
if(!d||typeof d!=="object") return undefined;
if(typeof d.esito!=="undefined") return d.esito;
if(typeof d.Esito!=="undefined") return d.Esito;
return undefined;
}
_flow8EsitoIsPositive(d){
var e=this._flow8GetEsito(d);
if(e==null) return false;
if(typeof e==="string"){
var sp=e.trim().toLowerCase();
return sp=="true"||sp=="1";
}
return e==true||e==1;
}
_flow8EsitoIsNegative(d){
var e=this._flow8GetEsito(d);
if(e==null) return false;
if(typeof e==="string"){
var sn=e.trim().toLowerCase();
return sn=="false"||sn=="0"||sn=="no";
}
return e==false||e==0;
}
_flow8ResponseHasClinicaId(d){
if(!d||typeof d!=="object") return false;
var id=d.clinicaId!=null ? d.clinicaId:d.ClinicaId;
if(id==null) return false;
return String(id).trim()!=="";
}
_flow8JwtPayload(){
var jwt=this._flow8Jwt();
if(!jwt||typeof jwt!=="string") return null;
try {
var p=jwt.split(".")[1];
if(!p) return null;
var b=p.replace(/-/g, "+").replace(/_/g, "/");
while (b.length % 4) b +="=";
return JSON.parse(atob(b));
} catch (e){
return null;
}}
_flow8PazienteIdForBookingApi(){
if(!this.passEvodentSessionBearer) return "";
return this._resolveFlow8PazienteId();
}
_resolveFlow8PazienteId(){
var bd=this.bookingData;
if(bd&&bd.pazienteId!=null&&String(bd.pazienteId).trim()!==""){
return String(bd.pazienteId).trim();
}
var elig=bd&&bd.igieneEligibility;
if(elig&&typeof elig==="object"){
var ep=elig.PazienteId!=null ? elig.PazienteId:elig.pazienteId;
if(ep!=null&&String(ep).trim()!=="") return String(ep).trim();
}
if(bd&&bd.apGuestLikeFrontendFlow===true){
return "";
}
try {
var rawUd=sessionStorage.getItem("userData");
if(rawUd){
var ud=JSON.parse(rawUd);
if(ud&&ud.PatientWebCard&&ud.PatientWebCard.Paziente){
var pidCard=ud.PatientWebCard.Paziente.PazienteId;
if(pidCard!=null&&String(pidCard).trim()!=="") return String(pidCard).trim();
}}
} catch (e){ }
var pl=this._flow8JwtPayload();
if(pl&&typeof pl==="object"){
var jp=pl.pazienteId!=null ? pl.pazienteId:pl.PazienteId;
if(jp!=null&&String(jp).trim()!=="") return String(jp).trim();
if(pl.profile!=null&&String(pl.profile).trim()!=="") return String(pl.profile).trim();
}
if(typeof sessionStorage!=="undefined"){
var accTok=sessionStorage.getItem("access_token");
if(accTok&&String(accTok).trim()){
try {
var part=String(accTok).split(".")[1];
if(part){
var b64=part.replace(/-/g, "+").replace(/_/g, "/");
while (b64.length % 4) b64 +="=";
var pa=JSON.parse(atob(b64));
if(pa&&pa.profile!=null&&String(pa.profile).trim()!=="") return String(pa.profile).trim();
var jpa=pa.pazienteId!=null ? pa.pazienteId:pa.PazienteId;
if(jpa!=null&&String(jpa).trim()!=="") return String(jpa).trim();
}} catch (e2){ }}
}
return "";
}
_getClinicaIdForPositiveIgieneSlots(){
if(this.bookingData.location&&this.bookingData.location.code!=null&&String(this.bookingData.location.code).trim()!==""){
return String(this.bookingData.location.code).trim();
}
var d=this.bookingData.igieneEligibility;
if(d&&typeof d==="object"){
var id=d.clinicaId!=null ? d.clinicaId:d.ClinicaId;
if(id!=null&&String(id).trim()!=="") return String(id).trim();
}
var pl=this._flow8JwtPayload();
if(pl){
var jcid=pl.clinicaId!=null ? pl.clinicaId:pl.ClinicaId;
if(jcid!=null&&String(jcid).trim()!=="") return String(jcid).trim();
}
return "";
}
_syncFlow8ResultRefs(row){
if(!row){
this._flow8ChangeClinicWrap=null;
this._flow8ChangeClinicInput=null;
return;
}
this._flow8ChangeClinicWrap=row.querySelector(".flow8-change-clinic-option");
if(!this._flow8ChangeClinicWrap){
this._flow8ChangeClinicInput=null;
return;
}
this._flow8ChangeClinicInput =
this._flow8ChangeClinicWrap.querySelector("input.flow8-change-clinic-cb") ||
this._flow8ChangeClinicWrap.querySelector('input[type="checkbox"]');
}
getSubtitleText(node){
if(!node) return "";
var p=node.querySelector("p");
return p ? p.textContent:"";
}
_clearFlow8SummaryError(){
if(!this.formSection7) return;
var err=this.formSection7.querySelector(".flow8-summary-error");
if(!err) return;
err.classList.remove("active");
var p=err.querySelector("p");
if(p) p.innerHTML="";
}
_showFlow8SummaryError(htmlOrText){
if(!this.formSection7) return;
var err=this.formSection7.querySelector(".flow8-summary-error");
if(!err) return;
var p=err.querySelector("p");
if(p) p.innerHTML=htmlOrText!=null ? String(htmlOrText):"";
err.classList.add("active");
this.bookingScroll();
try {
err.scrollIntoView({ behavior: "smooth", block: "nearest" });
} catch (e){ }}
setSubtitleText(node, text){
if(!node) return;
var p=node.querySelector("p");
if(p) p.textContent=text;
}
_getAjaxUrl(){
var el=document.getElementById("booking_ajax_url");
return el ? el.value:"";
}
_bookingOriginHeaderUrl(){
try {
var l=window.location;
return l.protocol + "//" + l.host + l.pathname;
} catch (e){
return window.location.origin||"";
}}
_flow8Jwt(){
var jwt=this.bookingData.flow8ApiToken||this.bookingData.igieneEligibilityJwt||"";
if(jwt) return jwt;
if(this.bookingData&&this.bookingData.apGuestLikeFrontendFlow===true){
return "";
}
if(this.passEvodentSessionBearer){
return this._flow8EvodentBearerFromSession()||"";
}
return "";
}
_phoneFull(){
return (this.bookingData.phone_prefix||"") + (this.bookingData.phone||"");
}
_patientFieldsForIgieneApi(){
return {
PazienteNome: this.bookingData.firstname||"",
PazienteCognome: this.bookingData.lastname||"",
PazienteEmail: this.bookingData.email||"",
PazienteTelefono: this._phoneFull(),
};}
_syncMarketingProfile(){
var m=document.querySelector("#booking-marketing");
var p=document.querySelector("#booking-profile");
this.bookingData.marketing=m ? m.checked:false;
this.bookingData.profile=p ? p.checked:false;
}
getPhpSessionId(){
var m=document.cookie.match(/(?:^|;\s*)PHPSESSID=([^;]+)/);
return m ? decodeURIComponent(m[1]):"";
}
_pad2(n){
return n < 10 ? "0" + n:String(n);
}
_getBookingDateParsed(){
var el=document.querySelector("#booking-date");
var raw=el ? el.value:"";
var dateIn=typeof getFormattedData==="function" ? getFormattedData(raw):null;
return { dateIn: dateIn, start: dateIn ? new Date(dateIn):new Date() };}
_formatDateYmdMidnight(d){
return d.getFullYear() + "-" + this._pad2(d.getMonth() + 1) + "-" + this._pad2(d.getDate()) + "T00:00:00";
}
_mergedClinicsData(){
var merged={};
if(typeof window.bookingClinicsData==="object"&&window.bookingClinicsData) Object.assign(merged, window.bookingClinicsData);
if(this.sectionSlot&&this.sectionSlot.clinicsData) Object.assign(merged, this.sectionSlot.clinicsData);
if(this.sectionSlotStep2&&this.sectionSlotStep2.clinicsData) Object.assign(merged, this.sectionSlotStep2.clinicsData);
return merged;
}
_setFlow8EligibilitySubtitle(text){
if(this.subtitleSection4No) this.subtitleSection4No.classList.add("d-none");
if(this.subtitleSection4Yes){
this.subtitleSection4Yes.classList.remove("d-none");
this.subtitleSection4Yes.style.display="";
this.setSubtitleText(this.subtitleSection4Yes, text);
this.subtitleSection4Yes.classList.toggle("flow8-subtitle-sub-neg", text===FLOW8.SUB_NEG);
}}
_flow8GridSelectors(){
return {
mapParent: document.querySelector(".grid-booking-box-3"),
box4: document.querySelector(".grid-booking-box-4.d-none"),
};}
_owlHtml(containerId, html){
var c=document.getElementById(containerId);
if(c) c.innerHTML=html;
}
_ajaxErrorMessage(xhr, fallback){
if(typeof window.resolveDirectBookingAjaxErrorMessage==="function"){
return window.resolveDirectBookingAjaxErrorMessage(xhr, fallback);
}
if(xhr&&xhr.responseJSON&&xhr.responseJSON.data){
var d=xhr.responseJSON.data;
var msg=d.message!=null ? String(d.message):"";
var detail=d.errorDetail!=null ? String(d.errorDetail):"";
if(detail==="APP_ALREADY_EXISTS"||msg==="V2_APPOINTMENT_CREATION_ERROR"){
return "Non è possibile finalizzare la prenotazione. Contatta il tuo Centro o chiama il numero verde <a href='tel:+39800326326'>800 326 326</a>. Se preferisci ti contattiamo noi.";
}
if(msg) return msg;
}
return fallback;
}
_escapeHtmlForFlow8(str){
if(str==null) return "";
return String(str)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}
_formatFlow8LastVisitDate(isoStr){
if(isoStr==null||isoStr==="") return "";
var dt=new Date(String(isoStr));
if(isNaN(dt.getTime())) return "";
return (
dt.toLocaleDateString("it-IT", { day: "numeric", month: "long", year: "numeric" }) +
" alle ore " +
dt.toLocaleTimeString("it-IT", { hour: "2-digit", minute: "2-digit" })
);
}
_resolveClinicTitleFromEligibility(clinicaId){
if(clinicaId==null||clinicaId==="") return "";
return this.getClinicInfo(String(clinicaId), this._mergedClinicsData()).title||"";
}
buildFlow8PositiveEligibilityHtml(d){
var iso=d.data!=null ? d.data:d.Data;
var clinicaId=d.clinicaId!=null ? d.clinicaId:d.ClinicaId;
var datePart=this._formatFlow8LastVisitDate(iso);
var nomeWp =
d.clinicaNome!=null&&String(d.clinicaNome).trim()
? String(d.clinicaNome).trim()
: d.clinica_nome!=null&&String(d.clinica_nome).trim()
? String(d.clinica_nome).trim()
: "";
var clinicPart=nomeWp||this._resolveClinicTitleFromEligibility(clinicaId);
if(!datePart) datePart="—";
if(!clinicPart&&clinicaId!=null&&clinicaId!==""){
clinicPart="il nostro centro (cod. " + String(clinicaId) + ")";
}
if(!clinicPart) clinicPart="—";
return (
"<p>Visita di controllo <strong>" +
this._escapeHtmlForFlow8(datePart) +
"</strong> presso <strong>" +
this._escapeHtmlForFlow8(clinicPart) +
"</strong></p>" +
"<p>Scegli quando vuoi prenotare la tua <strong>igiene dentale</strong></p>"
);
}
setSelectedFlowId(evodentId){
this.bookingData.customFlowId=evodentId!=null ? String(evodentId):null;
}
isSelected(){
return this.bookingData&&this.bookingData.customFlowId==="8";
}
shouldSkipRequiredValidation(){
return false;
}
ensureSectionSelectionOrderForFlow8(){
if(!this.formSection4||!this.formSectionSelectByComune) return;
if(this.formSectionSelectByComune.compareDocumentPosition(this.formSection4) & Node.DOCUMENT_POSITION_FOLLOWING){
this.formSection4.insertAdjacentElement("afterend", this.formSectionSelectByComune);
}
var chain=[
[this.formSectionSelectByComune, this.formSection5],
[this.formSection5, this.formSection6],
[this.formSection6, this.formSection7],
];
chain.forEach(function (pair){
var a=pair[0];
var b=pair[1];
if(a&&b && a.nextElementSibling!==b) a.insertAdjacentElement("afterend", b);
});
}
_deactivateBookingSteps2345(){
[this.formSection2Yes, this.formSection2No, this.formSection3, this.formSection5].forEach(function (el){
if(el) el.classList.remove("active");
});
if(this.formSectionSelectByComune){
this.formSectionSelectByComune.classList.remove("active", "done");
}}
_hideFlow8SelectionByComune(){
var el=this.formSectionSelectByComune;
if(!el) return;
el.style.setProperty("display", "none", "important");
el.setAttribute("aria-hidden", "true");
}
_showFlow8SelectionByComune(){
var el=this.formSectionSelectByComune;
if(!el) return;
el.style.removeProperty("display");
el.setAttribute("aria-hidden", "false");
}
_getFlow8Section4LoaderWrap(){
return this.formSection4 ? this.formSection4.querySelector(".flow8-section4-loader-wrap"):null;
}
_ensureSection4LoaderMarkup(host){
if(!host) return;
host.style.position="relative";
if(!host.querySelector(".booking-loader")){
var wrap=document.createElement("div");
wrap.className="booking-loader";
var spin=document.createElement("div");
spin.className="loader";
wrap.appendChild(spin);
host.appendChild(wrap);
}}
showRequestLoader(){
var row=this._getFlow8Section4LoaderWrap();
if(!row) return;
var host=row.querySelector(".flow8-section4-loader-host");
this._ensureSection4LoaderMarkup(host);
row.classList.remove("d-none");
row.style.removeProperty("display");
row.setAttribute("aria-busy", "true");
}
hideRequestLoader(){
var row=this._getFlow8Section4LoaderWrap();
if(!row) return;
row.classList.add("d-none");
row.setAttribute("aria-busy", "false");
}
toggleContentFromSubtitle(hide){
if(!this.formSection4) return;
var c=this.formSection4.querySelector(".container");
if(!c) return;
var afterSub=false;
Array.from(c.children).forEach(function (node){
if(!afterSub&&(node.classList.contains("subtitle")||node.querySelector(".subtitle"))) afterSub=true;
var keep =
node.classList.contains("flow8-api-result") ||
node.classList.contains("flow8-inline-loader") ||
node.classList.contains("flow8-section4-loader-wrap");
if(!afterSub||keep) return;
node.classList.toggle("d-none", hide);
node.style.display=hide ? "none":"";
});
}
showStepDatiFormContent(){
this.toggleContentFromSubtitle(false);
}
hideStepDatiFormContent(){
this.toggleContentFromSubtitle(true);
}
clearUiForDefaultFlow(){
this.bookingData.flow8SlotsShown=false;
this.bookingData.flow8RicontattoContactPath=false;
this.restoreDefaultLabels();
this.hideRequestLoader();
if(this.subtitleSection4No) this.subtitleSection4No.classList.add("d-none");
if(this.subtitleSection4Yes){
this.subtitleSection4Yes.classList.remove("d-none");
this.subtitleSection4Yes.classList.remove("flow8-subtitle-sub-neg");
}
this.setSubtitleText(this.subtitleSection4Yes, this.subtitle4YesDefaultText);
this.showStepDatiFormContent();
this.hideResultContainer();
this._showFlow8SelectionByComune();
var backWrap=this.formSection7&&this.formSection7.querySelector(".flow8-back-to-eligibility-wrap");
if(backWrap) backWrap.classList.add("d-none");
this._syncFlow8SoloIgieneSlotsSectionClass();
}
_syncFlow8SoloIgieneSlotsSectionClass(){
if(!this.bookingData) return;
var solo = !!(this.bookingData.flow8HygieneOnlyPath&&!this.bookingData.flow8NegativePath);
[this.formSection6, this.formSection7].forEach(function (el){
if(el) el.classList.toggle("solo-igiene", solo);
});
}
resetState(){
this.bookingData.customFlowId=null;
this.bookingData.flow8SlotsShown=false;
this.bookingData.flow8HygieneOnlyPath=false;
this.bookingData.flow8RicontattoContactPath=false;
this.clearUiForDefaultFlow();
}
restoreDefaultLabels(){
if(this.formSection4SubmitLabelNo) this.formSection4SubmitLabelNo.textContent=this.section4DefaultLabelNo;
if(this.formSection4SubmitLabelYes) this.formSection4SubmitLabelYes.textContent=this.section4DefaultLabelYes;
}
setStep1ButtonLabel(){
if(this.formSection4SubmitLabelNo) this.formSection4SubmitLabelNo.textContent="Avanti";
if(this.formSection4SubmitLabelYes) this.formSection4SubmitLabelYes.textContent="Avanti";
document.querySelectorAll(".direct-field-y").forEach(function (el){
el.textContent="Avanti";
});
}
ensureResultContainer(){
var existing=this.formSection4.querySelector(".flow8-api-result");
if(existing){
this._syncFlow8ResultRefs(existing);
return existing;
}
var cbId="flow8-change-clinic-" + String(Math.random()).replace(/\D/g, "").slice(0, 12);
var resultRow=document.createElement("div");
resultRow.className="row flow8-api-result d-none";
resultRow.innerHTML =
'<div class="col-12 col-lg-8 px-0">' +
'<div class="flow8-api-result-box"></div>' +
'<div class="flow8-api-result-actions mt-3 d-none">' +
'<div class="form-check flow8-change-clinic-option d-none">' +
'<input type="checkbox" class="form-check-input flow8-change-clinic-cb" id="' +
cbId +
'" autocomplete="off" />' +
'<label class="form-check-label" for="' +
cbId +
'">Voglio scegliere un\'altra zona o centro (verrà richiesta anche la visita di controllo)</label>' +
"</div>" +
'<div class="flow8-api-result-buttons-row">' +
'<a href="#" class="cta cta-btn-grandient cta-dark flow8-proceed-btn"><span class="sz-16">Continua</span></a>' +
'<span class="flow8-api-result-buttons-or d-none" aria-hidden="true">Oppure</span>' +
'<a href="#" class="cta transparent flow8-change-clinic-trigger-btn d-none"><span class="sz-16">Scegli un\'altra zona o centro</span></a>' +
"</div>" +
"</div></div>";
var mobileRow=this.formSection4.querySelector(".row.mobile-center");
if(mobileRow&&mobileRow.parentNode) mobileRow.parentNode.insertBefore(resultRow, mobileRow);
else {
var c=this.formSection4.querySelector(".container");
if(c) c.appendChild(resultRow);
}
var btn=resultRow.querySelector(".flow8-proceed-btn");
var triggerAlt=resultRow.querySelector(".flow8-change-clinic-trigger-btn");
var self=this;
if(triggerAlt){
triggerAlt.addEventListener("click", function (e){
e.preventDefault();
var changeCb=self._flow8ChangeClinicInput;
if(changeCb) changeCb.checked=true;
if(btn) btn.click();
});
}
if(btn)
btn.addEventListener("click", function (e){
e.preventDefault();
var changeWrap=self._flow8ChangeClinicWrap;
var changeCb=self._flow8ChangeClinicInput;
var forceNegativePath =
changeCb &&
changeCb.checked===true &&
self.bookingData.flow8HygieneOnlyPath===true &&
self.bookingData.flow8NegativePath!==true &&
changeWrap &&
!changeWrap.classList.contains("d-none");
if(forceNegativePath){
self.bookingData.flow8HygieneOnlyPath=false;
self.bookingData.flow8NegativePath=true;
self._syncFlow8SoloIgieneSlotsSectionClass();
self.goToSectionSelectionByComune(false);
return;
}
if(self.bookingData.flow8NegativePath===true){
self.goToSectionSelectionByComune(false);
}else{
self.onFlow8PositiveContinueClick();
}});
this._syncFlow8ResultRefs(resultRow);
return resultRow;
}
hideResultContainer(){
var row=this.formSection4.querySelector(".flow8-api-result");
if(!row) return;
row.classList.add("d-none");
var box=row.querySelector(".flow8-api-result-box");
if(box) box.innerHTML="";
var act=row.querySelector(".flow8-api-result-actions");
if(act){
act.classList.add("d-none");
var changeWrap=act.querySelector(".flow8-change-clinic-option");
var changeCb =
(changeWrap&&(changeWrap.querySelector("input.flow8-change-clinic-cb")||changeWrap.querySelector('input[type="checkbox"]'))) ||
null;
if(changeWrap) changeWrap.classList.add("d-none");
if(changeCb) changeCb.checked=false;
var altTr=act.querySelector(".flow8-change-clinic-trigger-btn");
if(altTr) altTr.classList.add("d-none");
var orEl=act.querySelector(".flow8-api-result-buttons-or");
if(orEl) orEl.classList.add("d-none");
}
this._syncFlow8ResultRefs(row);
}
renderApiError(msg){
var row=this.ensureResultContainer();
var box=row.querySelector(".flow8-api-result-box");
if(!box) return;
box.innerHTML =
"<p><strong>Errore</strong></p><p>" + (msg||"Si è verificato un errore durante il controllo.") + "</p>";
row.classList.remove("d-none");
this._showFlow8SelectionByComune();
}
_buildFlow8NegativeEligibilityMessageHtml(d){
if(d&&typeof d==="object"){
if(typeof d.html==="string"&&d.html.trim()) return d.html;
if(typeof d.message==="string"&&d.message.trim()) return "<p>" + d.message + "</p>";
}
return FLOW8.MSG_NEG_ELIGIBILITY;
}
renderApiResult(response){
var row=this.ensureResultContainer();
var box=row.querySelector(".flow8-api-result-box");
var act=row.querySelector(".flow8-api-result-actions");
if(!box) return;
var d=response&&response.data;
if(d&&typeof d==="object"){
this.bookingData.igieneEligibility=d;
this.bookingData.igieneEligibilityJwt=d.JWT||null;
var rawEsito=this._flow8GetEsito(d);
this.bookingData.igieneEligibilityEsito=typeof rawEsito!=="undefined" ? rawEsito:null;
this.bookingData.flow8ApiToken=d.JWT||null;
this.bookingData.flow8NegativePath=this._flow8EsitoIsNegative(d);
}
var neg = !!(d&&this._flow8EsitoIsNegative(d));
var pos = !!(d&&this._flow8EsitoIsPositive(d));
var html="";
console.log("bookingdata", this.bookingData);
console.log("neg", neg);
console.log("pos", pos);
if(pos){
this.bookingData.flow8HygieneOnlyPath=true;
this.bookingData.flow8NegativePath=false;
if(typeof d.html==="string"&&d.html.trim()){
html=d.html;
}else if(typeof d.message==="string"&&d.message.trim()){
html="<p>" + d.message + "</p>";
}else{
html=this.buildFlow8PositiveEligibilityHtml(d);
}}else if(neg){
this.bookingData.flow8HygieneOnlyPath=false;
this.bookingData.flow8NegativePath=true;
this._setFlow8EligibilitySubtitle(FLOW8.SUB_NEG);
html=this._buildFlow8NegativeEligibilityMessageHtml(d);
}else if(d){
this.bookingData.flow8HygieneOnlyPath=false;
if(typeof d.html==="string"&&d.html.trim()) html=d.html;
else if(typeof d.message==="string"&&d.message.trim()) html="<p>" + d.message + "</p>";
else if(typeof this._flow8GetEsito(d)!=="undefined"){
var ex=this._flow8GetEsito(d);
html =
"<p><strong>Controllo completato.</strong></p><p>Esito: " +
(this._flow8EsitoIsPositive(d) ? "positivo":this._flow8EsitoIsNegative(d) ? "negativo":String(ex)) +
".</p>";
}}
box.innerHTML=html||"<p><strong>Errore durante la chiamata API.</strong></p>";
if(act) act.classList.toggle("d-none", !(neg||pos));
this._syncFlow8ResultRefs(row);
var changeClinicWrap=this._flow8ChangeClinicWrap;
var changeClinicInput=this._flow8ChangeClinicInput;
var triggerAltBtn=act&&act.querySelector(".flow8-change-clinic-trigger-btn");
var orBetweenBtns=act&&act.querySelector(".flow8-api-result-buttons-or");
if(pos&&changeClinicWrap&&changeClinicInput){
changeClinicWrap.classList.remove("d-none");
changeClinicInput.checked=false;
if(triggerAltBtn) triggerAltBtn.classList.remove("d-none");
if(orBetweenBtns) orBetweenBtns.classList.remove("d-none");
}else if(changeClinicWrap&&changeClinicInput){
changeClinicWrap.classList.add("d-none");
changeClinicInput.checked=false;
if(triggerAltBtn) triggerAltBtn.classList.add("d-none");
if(orBetweenBtns) orBetweenBtns.classList.add("d-none");
}
if(pos){
this._hideFlow8SelectionByComune();
}else{
this._showFlow8SelectionByComune();
}
row.classList.remove("d-none");
this._syncFlow8SoloIgieneSlotsSectionClass();
}
onFlow8PositiveContinueClick(){
if(!this.bookingData.flow8HygieneOnlyPath) return;
var clinicaId=this._getClinicaIdForPositiveIgieneSlots();
if(!clinicaId){
this.goToSectionSelectionByComune(true);
return;
}
this._enterPositiveFlowSkipComune(clinicaId);
}
_enterPositiveFlowSkipComune(clinicaId){
this.ensureSectionSelectionOrderForFlow8();
this.hideRequestLoader();
this.hideResultContainer();
if(this.formSection4){
this.formSection4.classList.remove("active");
this.formSection4.classList.add("done");
}
this._deactivateBookingSteps2345();
this.bookingData.flow8NegativePath=false;
this.bookingData.flow8HygieneOnlyPath=true;
if(!this.bookingData.location) this.bookingData.location={};
this.bookingData.location.code=clinicaId;
if(this.formSectionSelectByComune){
this.formSectionSelectByComune.classList.remove("active");
this.formSectionSelectByComune.classList.add("done");
}
this._syncFlow8SoloIgieneSlotsSectionClass();
this.callPositivePathInitialIgieneSlots();
}
onFlow8PositiveAfterComuneCta(){
if(!this.bookingData.flow8HygieneOnlyPath) return;
this.callPositivePathInitialIgieneSlots();
}
buildInitialPositiveIgieneSlotsPayload(){
var parsed=this._getBookingDateParsed();
var dataInizio=this._formatDateYmdMidnight(parsed.start);
var clinicaSingle=this._getClinicaIdForPositiveIgieneSlots();
var cid=clinicaSingle ? [clinicaSingle]:[];
var p=Object.assign({
JWT: this._flow8Jwt(),
SessioneId: this.getPhpSessionId(),
ClinicaId: cid,
DataInizio: dataInizio,
PreferenzeOrario: ["ASAP"],
PageUrl: this.bookingData.pageUrl||window.location.href,
Source: "Website",
PhoneNumber: this._phoneFull(),
origin: this._bookingOriginHeaderUrl(),
},
this._patientFieldsForIgieneApi()
);
var pidAp0=this._flow8PazienteIdForBookingApi();
if(pidAp0) p.PazienteId=pidAp0;
var coords=this.getSelectionByComuneCoords();
if(coords[0]) p.Posizione1=coords[0];
if(coords[1]) p.Posizione2=coords[1];
if(this.passEvodentSessionBearer){
var evIg=this._flow8EvodentBearerFromSession();
if(evIg) p.evodent_bearer_token=evIg;
}
return p;
}
handlePositivePathHygieneSlotsResponse(response){
var g=this._flow8GridSelectors();
var h3=this.formSection5&&this.formSection5.querySelector("h3");
this._applySlotsResponse(this.sectionSlot, "booking-owl-reservation", response, {
h3El: h3,
h3Text: FLOW8.H3_IGIENE,
mapParent: g.mapParent,
mapId: "google-booking-map",
box4: g.box4,
});
this.bookingData.flow8SlotsShown=true;
}
_activateSection5ForSlots(h3Text){
if(!this.formSection5) return;
this.formSection5.style.setProperty("display", "flex", "important");
this.formSection5.classList.add("active");
var h3=this.formSection5.querySelector("h3");
if(h3) h3.textContent=h3Text;
}
callPositivePathInitialIgieneSlots(){
var url=this._getAjaxUrl();
if(!url||!this.formSection5||!this.sectionSlot) return;
if(this.bookingData.flow8HygieneOnlyPath&&!this.bookingData.flow8NegativePath){
this._hideFlow8SelectionByComune();
}
if(this.formSectionSelectByComune){
this.formSectionSelectByComune.classList.remove("active");
this.formSectionSelectByComune.classList.add("done");
}
this._activateSection5ForSlots(FLOW8.H3_IGIENE);
this._syncFlow8SoloIgieneSlotsSectionClass();
this.sectionSlot.showLoader();
this.bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onDirectBookingCardSelected();
window.bookingOnlineDataLayer.trackStep("selezione_slot");
}
var self=this;
jQuery.ajax({
url: url,
type: "POST",
data: { action: this.igieneSlotsApiAction, data: JSON.stringify(this.buildInitialPositiveIgieneSlotsPayload()) },
success: function (res){
self.sectionSlot.hideLoader();
if(res&&res.success&&res.data){
self.handlePositivePathHygieneSlotsResponse(res);
}else{
self._owlHtml("booking-owl-reservation", FLOW8.HTML_NO_SLOTS);
}
self.bookingScroll();
},
error: function (){
self.sectionSlot.hideLoader();
self._owlHtml("booking-owl-reservation", FLOW8.HTML_ERR_SLOTS);
self.bookingScroll();
},
});
}
callStep1Api(){
var url=this._getAjaxUrl();
if(!url){
this.hideRequestLoader();
this.renderApiError("Endpoint AJAX non configurato.");
return;
}
this._syncMarketingProfile();
var pageUrlNoQuery=window.location.protocol + "//" + window.location.host + window.location.pathname;
var stepData={
firstname: this.bookingData.firstname||"",
lastname: this.bookingData.lastname||"",
email: this.bookingData.email||"",
phone: this.bookingData.phone||"",
phone_prefix: this.bookingData.phone_prefix||"",
cf: this.bookingData.cf||"",
marketing: this.bookingData.marketing,
profile: this.bookingData.profile,
prestazione_id: this.bookingData.customFlowId||"",
area_specializzazione_ids: Array.isArray(this.bookingData.areaSpecializzazioneIds)
? this.bookingData.areaSpecializzazioneIds
: [],
pageUrl: pageUrlNoQuery,
origin: pageUrlNoQuery,
};
if(this.passEvodentSessionBearer){
var evBearer=this._flow8EvodentBearerFromSession();
if(evBearer) stepData.evodent_bearer_token=evBearer;
}
var payload={
action: this.flowApiAction,
data: JSON.stringify(stepData),
};
this.hideResultContainer();
var self=this;
jQuery.ajax({
url: url,
type: "POST",
data: payload,
success: function (res){
self.hideRequestLoader();
self.renderApiResult(res);
self.bookingScroll();
},
error: function (xhr){
self.hideRequestLoader();
self.renderApiError(self._ajaxErrorMessage(xhr, "Errore durante la chiamata API."));
self.bookingScroll();
},
});
}
handleSubmitIfFlow8(hasError){
if(!this.isSelected()||hasError) return false;
if(this.bookingData.flow8RicontattoContactPath) return false;
this.showRequestLoader();
this.hideStepDatiFormContent();
this.callStep1Api();
return true;
}
enterFlow8RicontattoFromSlots(){
if(!this.isSelected()||!this.formSection4) return;
this.bookingData.flow8RicontattoContactPath=true;
this.bookingData.flow8SlotsShown=false;
if(typeof window.bookingSwitchToRicontattoFromDirectMidFlow==="function"){
window.bookingSwitchToRicontattoFromDirectMidFlow(this.bookingData);
}else{
window.directBooking=false;
window.selectedCardDirectBooking="0";
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onRicontattoSwitch();
}}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("richiesta_ricontatto_da_slot");
}
this.hideRequestLoader();
this.hideResultContainer();
this.restoreDefaultLabels();
this.showStepDatiFormContent();
if(this.pageBooking) this.pageBooking.classList.remove("sos");
this._hideFlow8SelectionByComune();
this._deactivateBookingSteps2345();
if(this.formSection5){
this.formSection5.classList.remove("active");
this.formSection5.classList.add("done");
var h3=this.formSection5.querySelector("h3");
if(h3) h3.textContent="Richiesta di essere ricontattato";
}
if(this.formSection6){
this.formSection6.classList.remove("active");
this.formSection6.classList.add("done");
this.formSection6.style.setProperty("display", "none", "important");
}
if(this.formSection7){
this.formSection7.classList.remove("active", "done");
this.formSection7.style.setProperty("display", "none", "important");
}
if(typeof window.showBookingFields==="function") window.showBookingFields(false);
if(this.subtitleSection4No) this.subtitleSection4No.classList.add("d-none");
if(this.subtitleSection4Yes) this.subtitleSection4Yes.classList.remove("d-none");
var sumBox=this.formSection4.querySelector(".summary-box");
if(sumBox) sumBox.classList.add("d-none");
this.formSection4.classList.remove("done");
this.formSection4.classList.add("active");
this.bookingScroll();
}
bindFlow8TurnOffDirectBooking(){
var pb=this.pageBooking;
if(!pb) return;
var self=this;
pb.addEventListener("click", function (e){
var a=e.target&&e.target.closest&&e.target.closest("a.turn-of-direct-booking");
if(!a) return;
if(!self.isSelected()) return;
e.preventDefault();
e.stopPropagation();
self.enterFlow8RicontattoFromSlots();
});
}
handleAfterEsigenzaSelection(showSpecialista){
if(!this.isSelected()) return false;
this.ensureSectionSelectionOrderForFlow8();
this.setStep1ButtonLabel();
this._deactivateBookingSteps2345();
if(showSpecialista&&this.formSection1Specialista){
this.bookingData.areaSpecializzazioneIds=[];
this.formSection1Specialista.classList.remove("d-none");
this.formSection1Specialista.setAttribute("aria-hidden", "false");
this.formSection1Specialista.classList.add("active");
this.bookingScroll();
return true;
}
this.showStepDati();
return true;
}
handleAfterSpecialistaSelection(){
if(!this.isSelected()) return false;
this.ensureSectionSelectionOrderForFlow8();
this.setStep1ButtonLabel();
this.showStepDati();
return true;
}
showStepDati(){
this.hideRequestLoader();
this.showStepDatiFormContent();
if(this.formSection1Specialista){
this.formSection1Specialista.classList.add("d-none");
this.formSection1Specialista.setAttribute("aria-hidden", "true");
this.formSection1Specialista.classList.remove("active", "done");
}
if(this.formSection4) this.formSection4.classList.add("active");
if(this.subtitleSection4No) this.subtitleSection4No.classList.add("d-none");
if(this.subtitleSection4Yes) this.subtitleSection4Yes.classList.remove("d-none");
if(this.pageBooking) this.pageBooking.classList.remove("sos");
if(this.isSelected()){
this._showFlow8SelectionByComune();
}
this.bookingScroll();
}
goToSectionSelectionByComune(fromPositiveFlow){
if(!this.formSectionSelectByComune) return;
this._showFlow8SelectionByComune();
this.ensureSectionSelectionOrderForFlow8();
this.hideRequestLoader();
this.hideResultContainer();
if(this.formSection4){
this.formSection4.classList.remove("active");
this.formSection4.classList.add("done");
}
this._deactivateBookingSteps2345();
if(fromPositiveFlow){
this.bookingData.flow8NegativePath=false;
this.bookingData.flow8HygieneOnlyPath=true;
}else{
this.bookingData.flow8NegativePath=true;
}
this.formSectionSelectByComune.classList.remove("done");
this.formSectionSelectByComune.classList.add("active");
this.bookingScroll();
this._syncFlow8SoloIgieneSlotsSectionClass();
}
bindSectionSelectionByComuneCta(){
if(!this.formSectionSelectByComune) return;
var cta=this.formSectionSelectByComune.querySelector(".cta");
if(!cta) return;
var self=this;
cta.addEventListener("click", function (e){
if(!self.isSelected()) return;
if(!self.bookingData.flow8NegativePath&&!self.bookingData.flow8HygieneOnlyPath) return;
e.preventDefault();
e.stopImmediatePropagation();
var coords=self.getSelectionByComuneCoords();
var hasZone=coords&&coords.length > 0;
var cb=self.formSectionSelectByComune.querySelector("#clinic-search");
var hasClinic=cb&&cb.checked&&self.bookingData.location&&self.bookingData.location.code;
var errRow=self.formSectionSelectByComune.querySelector(".selection-by-comune-error");
var errDiv=errRow&&errRow.querySelector(".error");
var errP=errDiv&&errDiv.querySelector("p");
if(!hasZone&&!hasClinic){
if(errDiv) errDiv.classList.add("active");
if(errP) errP.textContent="Inserisci una zona di preferenza o seleziona un centro";
return;
}
if(errDiv) errDiv.classList.remove("active");
if(errP) errP.textContent="";
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}
if(self.bookingData.flow8NegativePath){
self.callFollowupSlotsApi();
}else{
self.onFlow8PositiveAfterComuneCta();
}});
}
getSelectionByComuneCoords(){
if(!this.formSectionSelectByComune) return [];
var out=[];
this.formSectionSelectByComune.querySelectorAll(".autocomplete.booking-address").forEach(function (input){
var lat=input.parentNode.querySelector(".booking-lat");
var lng=input.parentNode.querySelector(".booking-lng");
if(lat&&lng&&lat.value&&lng.value){
out.push({ Latitudine: String(lat.value), Longitudine: String(lng.value) });
}});
if(out.length) return out;
if(typeof getBookingAddressCoords==="function"){
return getBookingAddressCoords().filter(Boolean);
}
return out;
}
buildFollowupSlotsPayload(){
var parsed=this._getBookingDateParsed();
var start=parsed.start;
var dateIn=parsed.dateIn;
var end=new Date(start.getTime());
end.setDate(end.getDate() + 60);
var coords=this.getSelectionByComuneCoords();
var cid=this.bookingData.location&&this.bookingData.location.code ? this.bookingData.location.code:null;
var p={
SessioneId: this.getPhpSessionId(),
DataInizio: dateIn,
DataFine: end.toISOString().split(".")[0] + "Z",
ClinicaId: cid ? [cid]:[],
PreferenzeOrario: ["ASAP"],
PageUrl: this.bookingData.pageUrl||window.location.href,
Source: "Website",
PhoneNumber: this._phoneFull(),
AreaSpecializzazioneId: Array.isArray(this.bookingData.areaSpecializzazioneIds) ? this.bookingData.areaSpecializzazioneIds:[],
JWT: this._flow8Jwt(),
origin: this._bookingOriginHeaderUrl(),
};
if(coords[0]) p.Posizione1=coords[0];
if(coords[1]) p.Posizione2=coords[1];
if(this.passEvodentSessionBearer){
var evFu=this._flow8EvodentBearerFromSession();
if(evFu) p.evodent_bearer_token=evFu;
}
var pidFu=this._flow8PazienteIdForBookingApi();
if(pidFu) p.PazienteId=pidFu;
return p;
}
_applySlotsResponse(sectionSlot, containerId, response, mapOpts){
var container=document.getElementById(containerId);
if(!container||!sectionSlot) return;
container.innerHTML="";
var free=response&&response.data ? response.data.FreeOperatorSlots:null;
if(!free||!Object.keys(free).length){
container.innerHTML='<div class="no-slots-message"><p>Nessuno slot disponibile</p></div>';
return;
}
sectionSlot.reservationData=Object.assign({}, free);
sectionSlot.clinicsData =
response.data.Cliniche&&typeof response.data.Cliniche==="object" ? Object.assign({}, response.data.Cliniche):{};
Object.keys(free).forEach(function (date){
container.innerHTML +=sectionSlot.generateSlotHtml(date);
});
sectionSlot.initializeCarouselBooking();
sectionSlot.selectFirstAvailableDay();
if(mapOpts.h3El) mapOpts.h3El.textContent=mapOpts.h3Text;
var mapParent=mapOpts.mapParent;
if(mapParent&&response.data&&response.data.Cliniche){
mapParent.innerHTML="";
var div=document.createElement("div");
div.id=mapOpts.mapId;
if(mapOpts.mapMinHeight) div.style.minHeight=mapOpts.mapMinHeight;
mapParent.appendChild(div);
sectionSlot.initBookingMap(response.data.Cliniche, div);
if(mapOpts.onMapReady) mapOpts.onMapReady(sectionSlot);
if(mapOpts.box4) mapOpts.box4.classList.remove("d-none");
}}
handleFollowupSlotsResponse(response){
var g=this._flow8GridSelectors();
var h3=this.formSection5&&this.formSection5.querySelector("h3");
this._applySlotsResponse(this.sectionSlot, "booking-owl-reservation", response, {
h3El: h3,
h3Text: FLOW8.H3_CHECKUP,
mapParent: g.mapParent,
mapId: "google-booking-map",
box4: g.box4,
});
this.bookingData.flow8SlotsShown=true;
}
callFollowupSlotsApi(){
var url=this._getAjaxUrl();
if(!url) return;
this.formSectionSelectByComune.classList.remove("active");
this.formSectionSelectByComune.classList.add("done");
this._activateSection5ForSlots(FLOW8.H3_CHECKUP);
this.sectionSlot.showLoader();
this.bookingScroll();
var self=this;
jQuery.ajax({
url: url,
type: "POST",
data: { action: this.followupSlotsApiAction, data: JSON.stringify(this.buildFollowupSlotsPayload()) },
success: function (res){
self.sectionSlot.hideLoader();
self.handleFollowupSlotsResponse(res);
self.bookingScroll();
},
error: function (){
self.sectionSlot.hideLoader();
self._owlHtml("booking-owl-reservation", FLOW8.HTML_ERR_SLOTS);
self.bookingScroll();
},
});
}
_dataInizioForIgieneSlots(slot, day){
var t=slot&&slot.DataInizioSlot ? String(slot.DataInizioSlot):"";
if(t.length===5) t +=":00";
var fallback=(day||"") + "T" + t;
if(!day||!t) return fallback;
var d=new Date(day + "T" + t);
if(isNaN(d.getTime())) return fallback;
if(this.bookingData.flow8NegativePath){
d.setTime(d.getTime() + 2 * 60 * 60 * 1000);
}
return (
d.getFullYear() +
"-" +
this._pad2(d.getMonth() + 1) +
"-" +
this._pad2(d.getDate()) +
"T" +
this._pad2(d.getHours()) +
":" +
this._pad2(d.getMinutes()) +
":" +
this._pad2(d.getSeconds())
);
}
buildIgieneSlotsPayload(slot, clinicId, day){
var payload=Object.assign({
JWT: this._flow8Jwt(),
SessioneId: this.getPhpSessionId(),
ClinicaId: clinicId ? [clinicId]:[],
DataInizio: this._dataInizioForIgieneSlots(slot, day),
PreferenzeOrario: ["ASAP"],
PageUrl: this.bookingData.pageUrl||window.location.href,
Source: "Website",
PhoneNumber: this._phoneFull(),
origin: this._bookingOriginHeaderUrl(),
},
this._patientFieldsForIgieneApi()
);
if(this.bookingData.flow8NegativePath){
var c=this.getSelectionByComuneCoords();
if(c[0]) payload.Posizione1=c[0];
if(c[1]) payload.Posizione2=c[1];
}else{
var pid=this._flow8PazienteIdForBookingApi();
if(pid) payload.PazienteId=pid;
}
if(this.passEvodentSessionBearer){
var evIg2=this._flow8EvodentBearerFromSession();
if(evIg2) payload.evodent_bearer_token=evIg2;
}
return payload;
}
handleIgieneSlotsResponse(response){
if(!this.sectionSlotStep2||!this.formSection6) return;
var h3=this.formSection6.querySelector("h3");
var mapParent=this.formSection6.querySelector(".grid-booking-box-3");
var box4=this.formSection6.querySelector(".grid-booking-box-4.d-none");
this._applySlotsResponse(this.sectionSlotStep2, "booking-owl-reservation-step2", response, {
h3El: h3,
h3Text: FLOW8.H3_IGIENE,
mapParent: mapParent,
mapId: "google-booking-map-step2",
mapMinHeight: "360px",
box4: box4,
onMapReady: function (slot){
setTimeout(function (){
if(slot&&slot.map&&window.google&&window.google.maps&&window.google.maps.event){
window.google.maps.event.trigger(slot.map, "resize");
}}, 150);
},
});
}
_step2LoaderTarget(){
return this.sectionSlotStep2||this.sectionSlot;
}
callIgieneSlotsApi(slot, clinicId, day){
var url=this._getAjaxUrl();
if(!url) return;
this.formSection5.classList.remove("active");
this.formSection5.classList.add("done");
if(this.formSection6){
this.formSection6.style.setProperty("display", "flex", "important");
this.formSection6.classList.add("active");
var h3=this.formSection6.querySelector("h3");
if(h3) h3.textContent=FLOW8.H3_IGIENE;
this._syncFlow8SoloIgieneSlotsSectionClass();
}
var loader=this._step2LoaderTarget();
if(loader) loader.showLoader();
this.bookingScroll();
var self=this;
jQuery.ajax({
url: url,
type: "POST",
data: { action: this.igieneSlotsApiAction, data: JSON.stringify(this.buildIgieneSlotsPayload(slot, clinicId, day)) },
success: function (res){
var lt=self._step2LoaderTarget();
if(lt) lt.hideLoader();
self.handleIgieneSlotsResponse(res);
self.bookingScroll();
},
error: function (){
var lt=self._step2LoaderTarget();
if(lt) lt.hideLoader();
self._owlHtml("booking-owl-reservation-step2", FLOW8.HTML_ERR_SLOTS);
self.bookingScroll();
},
});
}
onFirstSlotConfirmed(payload){
if(this.bookingData.flow8HygieneOnlyPath&&!this.bookingData.flow8NegativePath){
this.bookingData.flow8FirstAppointment=null;
this.showFlow8HygieneOnlySummary();
return;
}
this.bookingData.flow8FirstAppointment={
slot: payload.slot,
clinicId: payload.clinicId,
day: payload.day,
};
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("selezione_slot_primo_appuntamento");
}
this.callIgieneSlotsApi(payload.slot, payload.clinicId, payload.day);
}
getClinicInfo(clinicId, clinicsData){
if(!clinicsData||!clinicId) return { title: "", address: "", gmaps_place_id: "" };
var c=clinicsData[clinicId];
if(!c&&typeof clinicId==="string"&&/^\d+$/.test(clinicId)) c=clinicsData[clinicId.padStart(3, "0")];
return c
? {
title: c.title||"",
address: c.address||"",
gmaps_place_id: c.gmaps_place_id||"",
}
: { title: "", address: "", gmaps_place_id: "" };}
_flow8AddressSvg(){
return (
'<svg width="9" height="13" viewBox="0 0 9 13" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<path d="M4.4888 0.000138285C7.90988 -0.0264554 10.1225 3.78793 8.40472 6.85967C7.28874 8.85534 6.01427 10.7558 4.82372 12.7073C4.60557 13.0649 4.45675 13.1203 4.21829 12.7308C2.99617 10.7346 1.67283 8.79805 0.554627 6.74197C-1.08666 3.72457 1.11928 0.0265678 4.4888 0.000138285ZM4.45373 7.17009C5.82023 7.20194 6.96334 6.06645 6.99063 4.65026C7.01696 3.28692 5.93272 2.1104 4.60271 2.05934C3.23019 2.00648 2.07787 3.11932 2.03789 4.53633C1.99791 5.95253 3.08549 7.13841 4.45373 7.17026V7.17009Z" fill="#295782"/>' +
"</svg>"
);
}
_flow8MapSvg(){
return (
'<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<path d="M0.164159 9.94177C0.265179 10.0081 0.39356 10.0175 0.504051 9.96913L3.57256 8.60511L6.64106 9.96913C6.64632 9.97124 6.65264 9.96913 6.6579 9.97229C6.74419 10.0112 6.8431 10.0091 6.92834 9.96598C6.9336 9.96387 6.94097 9.96598 6.94623 9.96177L9.80217 8.53354C9.8611 8.50407 9.91161 8.45882 9.94633 8.40198C9.98106 8.34515 10 8.28095 10 8.21464V0.357829C10 0.233635 9.93581 0.118914 9.83058 0.0536602C9.72535 -0.011594 9.59381 -0.0179089 9.48332 0.0378729L6.77786 1.39137L3.71567 0.031558C3.71567 0.031558 3.70515 0.029453 3.69988 0.027348C3.6862 0.0220856 3.67252 0.0178757 3.65779 0.0147182C3.64306 0.0105083 3.62938 0.00840329 3.61465 0.00629832C3.58518 0.00419334 3.55677 0.00419334 3.52731 0.00629832C3.51257 0.00840329 3.49784 0.0115607 3.48416 0.0147182C3.46943 0.0178757 3.45575 0.0220856 3.44207 0.027348C3.43681 0.029453 3.4305 0.029453 3.42629 0.031558L0.212564 1.45978C0.149426 1.4882 0.0957592 1.53346 0.0578765 1.59134C0.0199937 1.64923 0 1.71659 0 1.78605V9.64181C0 9.76285 0.0610334 9.87546 0.162054 9.94072L0.164159 9.94177ZM9.28338 7.99362L7.1409 9.06505V2.00707L9.28338 0.935644V7.99362ZM6.42744 9.09347L3.92823 7.98204V0.908279L6.42744 2.01865V9.09241V9.09347ZM0.715564 2.01865L3.21477 0.908279V7.98204L0.715564 9.09241V2.01865Z" fill="#295782"/>' +
"</svg>"
);
}
_flow8CalendarSvg(){
return (
'<svg width="11" height="11" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<path d="M7 2h2v2h6V2h2v2h3a2 2 0 012 2v14a2 2 0 01-2 2H4a2 2 0 01-2-2V6a2 2 0 012-2h3V2zm11 8H6v10h12V10z" fill="#295782"/>' +
"</svg>"
);
}
_flow8ClockSvg(){
return (
'<svg width="11" height="11" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<circle cx="12" cy="12" r="9" stroke="#295782" stroke-width="2"/>' +
'<path d="M12 7v5l3 2" stroke="#295782" stroke-width="2" stroke-linecap="round" fill="none"/>' +
"</svg>"
);
}
_flow8MapsUrl(clinica){
if(clinica&&clinica.gmaps_place_id){
return "https://www.google.com/maps/search/?api=1&query=maida&query_place_id=" + encodeURIComponent(String(clinica.gmaps_place_id));
}
if(clinica&&clinica.address){
return "https://www.google.com/maps/search/?api=1&query=" + encodeURIComponent(String(clinica.address));
}
return "#";
}
_fillFlow8SummaryCard(card, clinica, dayStr, slot){
if(!card) return;
var addrIcon=card.querySelector(".flow8-summary-icon-address");
var mapIcon=card.querySelector(".flow8-summary-icon-map");
var dateIcon=card.querySelector(".flow8-summary-icon-date");
var timeIcon=card.querySelector(".flow8-summary-icon-time");
if(addrIcon) addrIcon.innerHTML=this._flow8AddressSvg();
if(mapIcon) mapIcon.innerHTML=this._flow8MapSvg();
if(dateIcon) dateIcon.innerHTML=this._flow8CalendarSvg();
if(timeIcon) timeIcon.innerHTML=this._flow8ClockSvg();
var nameEl=card.querySelector(".flow8-card-clinica");
var addressEl=card.querySelector(".flow8-card-address");
var dataEl=card.querySelector(".flow8-card-data");
var oraEl=card.querySelector(".flow8-card-ora");
var mapA=card.querySelector(".flow8-maps-link");
var mapsRow=card.querySelector(".maps-link-container");
if(nameEl) nameEl.textContent=clinica.title||"";
if(addressEl) addressEl.textContent=clinica.address||"";
if(dataEl) dataEl.textContent=dayStr||"";
if(oraEl) oraEl.textContent=slot&&slot.DataInizioSlot ? "ore " + slot.DataInizioSlot:"";
if(mapA){
var mapUrl=this._flow8MapsUrl(clinica);
mapA.setAttribute("href", mapUrl);
if(mapsRow) mapsRow.classList.toggle("d-none", mapUrl==="#");
}}
formatDayForDisplay(dayStr){
if(!dayStr) return "";
var d=new Date(dayStr + "T12:00:00");
return isNaN(d.getTime()) ? "":d.toLocaleDateString("it-IT", { day: "2-digit", month: "long", year: "numeric" });
}
formatDayShortNumeric(dayStr){
if(!dayStr) return "";
var m=String(dayStr).match(/^(\d{4})-(\d{2})-(\d{2})/);
if(m) return m[3] + "/" + m[2] + "/" + m[1];
var d=new Date(dayStr + "T12:00:00");
if(isNaN(d.getTime())) return "";
return this._pad2(d.getDate()) + "/" + this._pad2(d.getMonth() + 1) + "/" + d.getFullYear();
}
showFlow8HygieneOnlySummary(){
var appt={
slot: this.bookingData.selectedSlot,
clinicId: this.bookingData.selectedClinicId,
day: this.bookingData.selectedDay,
};
if(!appt.slot||!appt.day||!this.formSection7) return;
this._clearFlow8SummaryError();
var c=this.getClinicInfo(appt.clinicId, this.sectionSlot.clinicsData);
var checkCard=this.formSection7.querySelector(".flow8-card-checkup");
var igieneCard=this.formSection7.querySelector(".flow8-card-igiene");
if(checkCard) checkCard.classList.add("d-none");
if(igieneCard) igieneCard.classList.remove("d-none");
this._fillFlow8SummaryCard(igieneCard, c, this.formatDayShortNumeric(appt.day), appt.slot);
if(this.formSection5){
this.formSection5.classList.remove("active");
this.formSection5.classList.add("done");
}
if(this.formSection6){
this.formSection6.classList.remove("active");
this.formSection6.classList.add("done");
}
this.formSection7.style.setProperty("display", "flex", "important");
this.formSection7.classList.add("active");
var backWrap=this.formSection7.querySelector(".flow8-back-to-eligibility-wrap");
if(backWrap) backWrap.classList.add("d-none");
this._syncFlow8SoloIgieneSlotsSectionClass();
this.bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("riepilogo_appuntamenti");
}}
_restoreFlow8NegativeEligibilityViewFromSummary(){
if(!this.formSection4||!this.bookingData.igieneEligibility) return;
this.hideRequestLoader();
this.ensureSectionSelectionOrderForFlow8();
if(this.formSection7){
this.formSection7.classList.remove("active");
this.formSection7.style.setProperty("display", "none", "important");
}
if(this.formSection5){
this.formSection5.classList.remove("active", "done");
this.formSection5.style.setProperty("display", "none", "important");
}
if(this.formSection6){
this.formSection6.classList.remove("active", "done");
this.formSection6.style.setProperty("display", "none", "important");
}
this.bookingData.flow8NegativePath=true;
this.bookingData.flow8HygieneOnlyPath=false;
this._syncFlow8SoloIgieneSlotsSectionClass();
this.formSection4.classList.remove("done");
this.formSection4.classList.add("active");
this.hideStepDatiFormContent();
var row=this.ensureResultContainer();
var box=row.querySelector(".flow8-api-result-box");
var act=row.querySelector(".flow8-api-result-actions");
if(!box) return;
box.innerHTML=this._buildFlow8NegativeEligibilityMessageHtml(this.bookingData.igieneEligibility);
if(act) act.classList.remove("d-none");
this._syncFlow8ResultRefs(row);
if(this._flow8ChangeClinicWrap) this._flow8ChangeClinicWrap.classList.add("d-none");
if(this._flow8ChangeClinicInput) this._flow8ChangeClinicInput.checked=false;
var altFromSummary=row.querySelector(".flow8-change-clinic-trigger-btn");
if(altFromSummary) altFromSummary.classList.add("d-none");
var orFromSummary=row.querySelector(".flow8-api-result-buttons-or");
if(orFromSummary) orFromSummary.classList.add("d-none");
row.classList.remove("d-none");
this._hideFlow8SelectionByComune();
this._setFlow8EligibilitySubtitle(FLOW8.SUB_NEG);
this.bookingScroll();
}
showFlow8SummarySection(){
var first=this.bookingData.flow8FirstAppointment;
var second={
slot: this.bookingData.selectedSlot,
clinicId: this.bookingData.selectedClinicId,
day: this.bookingData.selectedDay,
};
if(!first||!second.slot||!second.day||!this.formSection7) return;
var checkCard=this.formSection7.querySelector(".flow8-card-checkup");
var igieneCard=this.formSection7.querySelector(".flow8-card-igiene");
if(checkCard) checkCard.classList.remove("d-none");
if(igieneCard) igieneCard.classList.remove("d-none");
var c1=this.getClinicInfo(first.clinicId, this.sectionSlot.clinicsData);
var c2=this.getClinicInfo(second.clinicId, this.sectionSlotStep2.clinicsData);
this._fillFlow8SummaryCard(checkCard, c1, this.formatDayShortNumeric(first.day), first.slot);
this._fillFlow8SummaryCard(igieneCard, c2, this.formatDayShortNumeric(second.day), second.slot);
if(this.formSection6){
this.formSection6.classList.remove("active");
this.formSection6.classList.add("done");
}
this.formSection7.style.setProperty("display", "flex", "important");
this.formSection7.classList.add("active");
var backWrap=this.formSection7.querySelector(".flow8-back-to-eligibility-wrap");
if(backWrap){
backWrap.classList.toggle("d-none", this.bookingData.flow8NegativePath!==true);
}
this._syncFlow8SoloIgieneSlotsSectionClass();
this.bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("riepilogo_appuntamenti");
}}
bindFlow8ConfirmAppointments(){
var btn=this.formSection7&&this.formSection7.querySelector(".flow8-confirm-appointments");
if(!btn) return;
var self=this;
btn.addEventListener("click", function (e){
e.preventDefault();
self._clearFlow8SummaryError();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("dati_personali_e_conferma");
}
if(typeof window.bookingRunPreConfirmVerification==="function"){
window
.bookingRunPreConfirmVerification(self.bookingData||{})
.then(function (canProceed){
if(!canProceed){
document.body.classList.remove("overlay-loading-show");
return;
}
self.callFlow8AppointmentsApi();
})
.catch(function (){
document.body.classList.remove("overlay-loading-show");
});
return;
}
self.callFlow8AppointmentsApi();
});
}
bindFlow8BackToEligibility(){
var wrap=this.formSection7&&this.formSection7.querySelector(".flow8-back-to-eligibility-wrap");
var btn=wrap&&wrap.querySelector(".flow8-back-to-eligibility");
if(!btn) return;
var self=this;
btn.addEventListener("click", function (e){
e.preventDefault();
if(self.bookingData.flow8NegativePath!==true) return;
self._restoreFlow8NegativeEligibilityViewFromSummary();
});
}
_flow8BuildAppuntamentiOperatore(day, slot){
if(!slot||!day) return [];
var timeStart=slot.DataInizioSlot!=null ? String(slot.DataInizioSlot):"00:00";
var timeEnd=slot.DataFineSlot!=null ? String(slot.DataFineSlot):"00:00";
if(timeStart.length===5) timeStart +=":00";
if(timeEnd.length===5) timeEnd +=":00";
var oraInizio=day + "T" + timeStart;
var oraFine=day + "T" + timeEnd;
if(slot.AppuntamentiOperatore&&slot.AppuntamentiOperatore.length){
return slot.AppuntamentiOperatore.map(function (op){
return {
OperatoreId: op.OperatoreId!=null ? op.OperatoreId:0,
OraInizioAppuntamento: op.OraInizioAppuntamento||oraInizio,
OraFineAppuntamento: op.OraFineAppuntamento||oraFine,
};});
}
return [
{
OperatoreId: slot.OperatoreId!=null ? slot.OperatoreId:0,
OraInizioAppuntamento: oraInizio,
OraFineAppuntamento: oraFine,
},
];
}
_flow8ApiAppuntamentoItem(tipo, day, slot){
var item={
TipoAppuntamento: tipo,
DataAppuntamento: day + "T00:00:00",
AppuntamentiOperatore: this._flow8BuildAppuntamentiOperatore(day, slot),
};
if(slot&&slot.AppuntamentoOrigineId!=null&&slot.AppuntamentoOrigineId!==""){
item.AppuntamentoOrigineId=slot.AppuntamentoOrigineId;
}
return item;
}
buildFlow8AppointmentsPayload(){
this._syncMarketingProfile();
var second={
slot: this.bookingData.selectedSlot,
clinicId: this.bookingData.selectedClinicId,
day: this.bookingData.selectedDay,
};
var base={
JWT: this._flow8Jwt(),
SessioneId: this.getPhpSessionId(),
PazienteNome: this.bookingData.firstname||"",
PazienteCognome: this.bookingData.lastname||"",
PazienteEmail: this.bookingData.email||"",
PazienteTelefono: this._phoneFull(),
PazienteCodiceFiscale: this.bookingData.cf||"",
PageUrl: this.bookingData.pageUrl||window.location.href,
origin: this._bookingOriginHeaderUrl(),
PazientiPrivacy_1_Informativa: this.bookingData.informativa!==false,
PazientiPrivacy_2_DirittiModifica: this.bookingData.dirittiModifica!==false,
PazientiPrivacy_3_Marketing: this.bookingData.marketing===true,
PazientiPrivacy_4_Profilazione: this.bookingData.profile===true,
PazientiPrivacy_5_FirmaGrafometrica: this.bookingData.grafometrica===true,
};
var appuntamenti=[];
var clinicaId="";
if(this.bookingData.flow8HygieneOnlyPath){
if(!second.slot||!second.day) return null;
appuntamenti.push(this._flow8ApiAppuntamentoItem("igiene", second.day, second.slot));
clinicaId=String(second.clinicId||(second.slot.ClinicaId!=null ? second.slot.ClinicaId:"")||"").trim();
}else{
var first=this.bookingData.flow8FirstAppointment;
if(!first||!first.slot||!first.day||!second.slot||!second.day) return null;
appuntamenti.push(this._flow8ApiAppuntamentoItem("checkup_followup", first.day, first.slot));
appuntamenti.push(this._flow8ApiAppuntamentoItem("igiene", second.day, second.slot));
clinicaId=String(
first.clinicId||second.clinicId||(first.slot&&first.slot.ClinicaId)||(second.slot&&second.slot.ClinicaId)||""
).trim();
}
base.ClinicaId=clinicaId;
base.Appuntamenti=appuntamenti;
var pidAppts=this._flow8PazienteIdForBookingApi();
if(pidAppts) base.PazienteId=pidAppts;
if(this.passEvodentSessionBearer){
var evAppts=this._flow8EvodentBearerFromSession();
if(evAppts) base.evodent_bearer_token=evAppts;
}
return base;
}
_buildFlow8GoThankyouParams(){
var bd=this.bookingData;
var thankyouReason=bd&&bd.thankyouReason!=null ? String(bd.thankyouReason):"";
var dbFlagFlow8 =
typeof window.bookingReservationDirectBookingParam==="function"
? window.bookingReservationDirectBookingParam()
: "1";
var second =
bd.selectedSlot&&bd.selectedDay
? { slot: bd.selectedSlot, clinicId: bd.selectedClinicId, day: bd.selectedDay }
: null;
if(!second||!second.slot) return null;
var name=((bd.firstname||"") + " " + (bd.lastname||"")).trim();
if(bd.flow8HygieneOnlyPath){
var cSolo=this.getClinicInfo(second.clinicId, this.sectionSlot&&this.sectionSlot.clinicsData);
var d2=this.formatDayShortNumeric(second.day);
var t2=second.slot&&second.slot.DataInizioSlot ? String(second.slot.DataInizioSlot):"";
var u=this._flow8MapsUrl(cSolo);
return {
email: bd.email||"",
customer: bd.customer ? "si":"no",
reservation_name: name,
reservation_type: "Igiene dentale",
reservation_date: d2 + (t2 ? " ore " + t2:""),
reservation_clinic_address: cSolo.address||"",
reservation_clinic_url: u!=="#" ? u:"",
reservation_direct_booking: dbFlagFlow8,
thankyou_reason: thankyouReason,
};}
var first=bd.flow8FirstAppointment;
if(!first||!first.slot) return null;
var c1=this.getClinicInfo(first.clinicId, this.sectionSlot&&this.sectionSlot.clinicsData);
var c2=this.getClinicInfo(second.clinicId, this.sectionSlotStep2&&this.sectionSlotStep2.clinicsData);
var day1=this.formatDayShortNumeric(first.day);
var day2=this.formatDayShortNumeric(second.day);
var t1=first.slot&&first.slot.DataInizioSlot ? String(first.slot.DataInizioSlot):"";
var t2b=second.slot&&second.slot.DataInizioSlot ? String(second.slot.DataInizioSlot):"";
var dateStr =
"Controllo: " +
day1 +
(t1 ? " ore " + t1:"") +
" · Igiene: " +
day2 +
(t2b ? " ore " + t2b:"");
var addr;
if(c1.address&&c2.address&&c1.address===c2.address){
addr=c1.address;
}else{
addr=[
c1.address ? "Controllo: " + c1.address:"",
c2.address ? "Igiene: " + c2.address:"",
]
.filter(Boolean)
.join(" · ");
}
var url2=this._flow8MapsUrl(c2);
var url1=this._flow8MapsUrl(c1);
var clinicUrl=url2!=="#" ? url2:url1!=="#" ? url1:"";
return {
email: bd.email||"",
customer: bd.customer ? "si":"no",
reservation_name: name,
reservation_type: "Visita di controllo e igiene dentale",
reservation_date: dateStr,
reservation_clinic_address: addr,
reservation_clinic_url: clinicUrl,
reservation_direct_booking: dbFlagFlow8,
thankyou_reason: thankyouReason,
};}
_showDashboardPrenotaThankyou(params){
var p=params||{};
var isDirectBooking=p.reservation_direct_booking!=="0";
var isAppTypeFuThankyou=String(p.thankyou_reason||"").trim()==="APP_TYPE_FU";
var prenota=document.getElementById("prenota");
var thankWrap=document.getElementById("prenota-thankyou");
if(!prenota||!thankWrap){
var ty=document.querySelector(".thankyou");
if(ty){
ty.classList.add("active");
ty.scrollIntoView({ behavior: "smooth" });
}
this.bookingScroll();
return;
}
var sp=document.getElementById("summary-patient");
if(sp) sp.textContent=p.reservation_name||"";
var st=document.getElementById("summary-visit-type");
if(st) st.textContent=p.reservation_type||"";
var sd=document.getElementById("summary-datetime");
if(sd) sd.textContent=p.reservation_date||"";
var sdr=document.getElementById("summary-datetime-row");
if(sdr) sdr.style.display=isDirectBooking ? "":"none";
var sc=document.getElementById("summary-clinic");
if(sc) sc.textContent=p.reservation_clinic_address||"";
var summaryMainTitle=document.getElementById("summary-main-title");
if(summaryMainTitle){
summaryMainTitle.textContent=isDirectBooking
? "Grazie, la tua prenotazione è andata a buon fine!"
: isAppTypeFuThankyou
? "Richiesta inviata! Verrai ricontattato da un nostro operatore."
: "Grazie! Verrai ricontattato da un nostro operatore.";
}
var summaryBookingTitle=document.getElementById("summary-booking-title");
if(summaryBookingTitle){
summaryBookingTitle.textContent=isDirectBooking ? "Riepilogo prenotazione":"Riepilogo richiesta";
}
var summaryContactFollowupRow=document.getElementById("summary-contact-followup-row");
if(summaryContactFollowupRow){
summaryContactFollowupRow.classList.toggle("d-none", isDirectBooking);
if(!isDirectBooking){
summaryContactFollowupRow.textContent=isAppTypeFuThankyou
? "La tua richiesta è stata correttamente inviata ma l’appuntamento non è ancora confermato. Un nostro operatore ti contatterà a breve per finalizzare la prenotazione."
: "Ti ricontatteremo a breve per finalizzare la tua richiesta.";
}else{
summaryContactFollowupRow.textContent="";
}}
var summaryEmailConfirmRow=document.getElementById("summary-email-confirm-row");
if(summaryEmailConfirmRow){
summaryEmailConfirmRow.style.display=isDirectBooking ? "":"none";
}
var clinicBtn=thankWrap.querySelector(".goClinic");
if(clinicBtn){
if(p.reservation_clinic_url){
clinicBtn.href=p.reservation_clinic_url;
clinicBtn.classList.remove("d-none");
}else{
clinicBtn.classList.add("d-none");
clinicBtn.href="#";
}}
var bookingSummary=thankWrap.querySelector(".booking-summary");
if(bookingSummary) bookingSummary.classList.remove("d-none");
var emailEl=document.getElementById("email_customer");
if(emailEl&&this.bookingData&&this.bookingData.email){
emailEl.setAttribute("href", "mailto:" + this.bookingData.email);
emailEl.textContent=this.bookingData.email;
}
prenota.classList.remove("active");
thankWrap.classList.add("active");
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.fireInlineThankYouConversion(this.bookingData);
}
this.bookingScroll();
thankWrap.scrollIntoView({ behavior: "smooth" });
}
_isFlow8AppTypeFuError(data){
if(typeof window.isAppTypeFuError==="function"){
return window.isAppTypeFuError(data);
}
if(!data||typeof data!=="object") return false;
var msg=data.message!=null ? String(data.message).trim():"";
var detail=data.errorDetail!=null ? String(data.errorDetail).trim():"";
var code=data.errorCode!=null ? String(data.errorCode).trim():"";
return data.fallbackToHubspot===true||code==="APP_TYPE_FU"||msg==="APP_TYPE_FU"||detail==="APP_TYPE_FU";
}
_submitFlow8AsHubspotFallback(reasonCode){
if(!this.bookingData||typeof this.bookingData!=="object") return false;
this.bookingData.thankyouReason=reasonCode||"APP_TYPE_FU";
if(typeof window!=="undefined"){
window.directBooking=false;
window.selectedCardDirectBooking="0";
}
if(typeof globalThis!=="undefined"){
globalThis.directBooking=false;
globalThis.selectedCardDirectBooking="0";
}
var isAreaPazientiFlow =
this.bookingData.areaPazienti===true ||
(typeof document!=="undefined"&&document.body&&document.body.classList.contains("area-pazienti-dashboard"));
if(isAreaPazientiFlow&&typeof window.bookingSubmitAreaPazienti==="function"){
window.bookingSubmitAreaPazienti(this.bookingData);
return true;
}
if(typeof window.bookingSubmitFrontend==="function"){
window.bookingSubmitFrontend(this.bookingData);
return true;
}
return false;
}
callFlow8AppointmentsApi(){
var url=this._getAjaxUrl();
if(!url) return;
var btn=this.formSection7&&this.formSection7.querySelector(".flow8-confirm-appointments");
var lock=function (on){
if(!btn) return;
btn.classList.toggle("disabled", on);
btn.style.pointerEvents=on ? "none":"";
};
lock(true);
var self=this;
this._clearFlow8SummaryError();
var payload=this.buildFlow8AppointmentsPayload();
if(!payload||!payload.Appuntamenti||!payload.Appuntamenti.length||!payload.ClinicaId){
lock(false);
this._showFlow8SummaryError("Controlla i dati inseriti e riprova. Se il problema persiste, ricarica la pagina.");
return;
}
document.body.classList.add("overlay-loading-show");
jQuery.ajax({
url: url,
type: "POST",
data: { action: this.appointmentsApiAction, data: JSON.stringify(payload) },
success: function (res){
if(res&&res.success&&res.data){
self._clearFlow8SummaryError();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.fireThankYou(self.bookingData, {
deferToThankyouPage: !self.useDashboardBookingThankyou,
});
}
var params=self._buildFlow8GoThankyouParams();
if(self.useDashboardBookingThankyou){
document.body.classList.remove("overlay-loading-show");
lock(false);
if(!params){
var bd=self.bookingData;
params={
reservation_name: ((bd.firstname||"") + " " + (bd.lastname||"")).trim(),
reservation_type: bd.flow8HygieneOnlyPath ? "Igiene dentale":"Visita di controllo e igiene dentale",
reservation_date: "",
reservation_clinic_address: "",
reservation_clinic_url: "",
reservation_direct_booking:
typeof window.bookingReservationDirectBookingParam==="function"
? window.bookingReservationDirectBookingParam()
: "1",
};}
self._showDashboardPrenotaThankyou(params);
return;
}
if(typeof window.goThankyou==="function"&&params){
window.goThankyou("/grazie-prenota/", params);
return;
}
document.body.classList.remove("overlay-loading-show");
lock(false);
if(self.formSection7){
self.formSection7.classList.remove("active");
self.formSection7.classList.add("done");
}
var ty=document.querySelector(".thankyou");
if(ty){
ty.classList.add("active");
ty.scrollIntoView({ behavior: "smooth" });
}
self.bookingScroll();
return;
}
document.body.classList.remove("overlay-loading-show");
lock(false);
if(self._isFlow8AppTypeFuError(res&&res.data ? res.data:null)){
self._clearFlow8SummaryError();
self._submitFlow8AsHubspotFallback("APP_TYPE_FU");
return;
}
var apiFb =
res&&res.data&&res.data.message!=null&&String(res.data.message).trim()!==""
? String(res.data.message)
: "Al momento non è stato possibile completare la prenotazione. Riprova tra qualche minuto.";
var apiDisplay =
typeof window.normalizeDirectBookingApiError==="function"
? window.normalizeDirectBookingApiError(res.data, apiFb)
: apiFb;
self._showFlow8SummaryError(apiDisplay);
},
error: function (xhr){
document.body.classList.remove("overlay-loading-show");
lock(false);
if(self._isFlow8AppTypeFuError(xhr&&xhr.responseJSON ? xhr.responseJSON.data:null)){
self._clearFlow8SummaryError();
self._submitFlow8AsHubspotFallback("APP_TYPE_FU");
return;
}
self._showFlow8SummaryError(self._ajaxErrorMessage(xhr, "Errore durante la prenotazione. Riprova."));
},
});
}}
window.BookingFlowControlloIgieneOrale=BookingFlowControlloIgieneOrale;
})(typeof window!=="undefined" ? window:this);
window.bookingData=window.bookingData||{};
var bookingData=window.bookingData;
let selectCityContainerSelectClinicID;
let selectCityContainerZone;
function pageBookingNotNull(pageBooking){
const formSection1=pageBooking.querySelector(".booking-section.section-1");
const card_esigenza=formSection1.querySelectorAll(".card-esigenza");
const formSection2_yes=pageBooking.querySelector(".booking-section.section-2.tab-yes");
const formSection2_no=pageBooking.querySelector(".booking-section.section-2.tab-no");
const formSection3=pageBooking.querySelector(".booking-section.section-3");
const formSection4=pageBooking.querySelector(".booking-section.section-4");
const formSection5=pageBooking.querySelector(".booking-section.section-5");
const formSection6=pageBooking.querySelector(".booking-section.section-6");
const formSection7=pageBooking.querySelector(".booking-section.section-7");
const formSectionSelectByComune=pageBooking.querySelector("#section-selection-by-comune");
const formSectionStart=pageBooking.querySelector('.booking-section.section-start');
const selectedDate=document.querySelector("#booking-date");
const selectCityContainer=document.querySelector('#container-selection-by-comune');
const box3Container=document.querySelector(".grid-bookingslot-box-3");
const checkboxClinicSearch=formSectionSelectByComune.querySelector('#clinic-search');
const slotNotFound=document.querySelector(".turn-of-direct-booking");
const subtitleSection4no=formSection4.querySelector(".subtitle.no");
const subtitleSection4yes=formSection4.querySelector(".subtitle.yes");
const formSection4Submit=formSection4 ? formSection4.querySelector(".submit"):null;
const formSection4SubmitLabelNo=formSection4Submit ? formSection4Submit.querySelector(".direct-field-n"):null;
const formSection4SubmitLabelYes=formSection4Submit ? formSection4Submit.querySelector(".direct-field-y"):null;
const section4DefaultLabelNo=formSection4SubmitLabelNo ? formSection4SubmitLabelNo.textContent:"";
const section4DefaultLabelYes=formSection4SubmitLabelYes ? formSection4SubmitLabelYes.textContent:"";
if(formSection4Submit){
formSection4Submit.classList.add("cta-btn-grandient", "cta-dark");
}
const resetStep=[formSectionStart, formSection1, formSection2_yes, formSectionSelectByComune, formSection2_no, formSection3, formSection4, formSection5, formSection6, formSection7];
const formSection1Specialista=pageBooking.querySelector(".booking-section.section-1-specialista");
const returnStep0=[formSection1, formSection1Specialista, formSection2_yes, formSection2_no, formSection3, formSection4, formSection5, formSection6, formSection7, formSectionSelectByComune];
const returnStep1=[formSection1Specialista, formSection2_yes, formSection2_no, formSection3, formSection4, formSection5, formSection6, formSection7, formSectionSelectByComune];
const returnStep2=[formSection3, formSection4, formSection5, formSection6, formSection7, formSectionSelectByComune];
const returnStepComuni=[formSection2_yes, formSection2_no, formSection3, formSection4, formSection5, formSection6, formSection7];
let flowControlloIgiene=null;
const sectionSlot=new SectionSlot({
onSlotConfirmed: function ({ slot, clinicId, day }){
bookingData.selectedSlot=slot;
bookingData.selectedClinicId=clinicId;
bookingData.selectedDay=day;
if(flowControlloIgiene&&(flowControlloIgiene.isSelected()||bookingData.flow8SlotsShown)){
flowControlloIgiene.onFirstSlotConfirmed({ slot, clinicId, day });
return;
}
formSection5.classList.remove("active");
formSection5.classList.add("done");
formSection4.classList.add("active");
bookingScroll();
sectionSlot.showSummary(true);
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("selezione_slot");
}}
});
const sectionSlotStep2=new SectionSlot({
container: document.getElementById("booking-owl-reservation-step2"),
mapContainer: formSection6 ? formSection6.querySelector(".grid-booking-box-3"):null,
box1Container: formSection6 ? formSection6.querySelector(".grid-booking-box-1"):null,
box2Container: formSection6 ? formSection6.querySelector(".grid-booking-box-2"):null,
containerId: "booking-owl-reservation-step2",
navContainerId: "custom_slider_nav_step2",
clinicSlotsContainerId: "clinic-slots-container-step2",
onSlotConfirmed: function ({ slot, clinicId, day }){
bookingData.selectedSlot=slot;
bookingData.selectedClinicId=clinicId;
bookingData.selectedDay=day;
if(flowControlloIgiene&&flowControlloIgiene.isSelected()&&bookingData.flow8FirstAppointment){
flowControlloIgiene.showFlow8SummarySection();
return;
}
formSection6.classList.remove("active");
formSection6.classList.add("done");
formSection4.classList.add("active");
bookingScroll();
sectionSlotStep2.showSummary(true);
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("selezione_slot_secondo_appuntamento");
}}
});
flowControlloIgiene=new window.BookingFlowControlloIgieneOrale({
pageBooking: pageBooking,
bookingData: bookingData,
formSection2Yes: formSection2_yes,
formSection2No: formSection2_no,
formSection3: formSection3,
formSection4: formSection4,
formSection5: formSection5,
formSection6: formSection6,
formSection7: formSection7,
formSectionSelectByComune: formSectionSelectByComune,
formSection1Specialista: formSection1Specialista,
subtitleSection4No: subtitleSection4no,
subtitleSection4Yes: subtitleSection4yes,
formSection4SubmitLabelNo: formSection4SubmitLabelNo,
formSection4SubmitLabelYes: formSection4SubmitLabelYes,
section4DefaultLabelNo: section4DefaultLabelNo,
section4DefaultLabelYes: section4DefaultLabelYes,
sectionSlot: sectionSlot,
bookingScroll: bookingScroll,
flowApiAction: "dp_booking_flow8_step1_check",
followupSlotsApiAction: "dp_booking_flow8_followup_slots",
igieneSlotsApiAction: "dp_booking_flow8_igiene_slots",
appointmentsApiAction: "dp_booking_flow8_appointments",
sectionSlotStep2: sectionSlotStep2,
});
if(slotNotFound){
slotNotFound.addEventListener("click", function (e){
if(flowControlloIgiene&&flowControlloIgiene.isSelected()){
e.preventDefault();
e.stopPropagation();
flowControlloIgiene.enterFlow8RicontattoFromSlots();
return;
}
e.preventDefault();
if(typeof window.bookingSwitchToRicontattoFromDirectMidFlow==="function"){
window.bookingSwitchToRicontattoFromDirectMidFlow(bookingData);
}else{
directBooking=false;
selectedCardDirectBooking="0";
window.directBooking=false;
window.selectedCardDirectBooking="0";
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onRicontattoSwitch();
}}
showBookingFields(false);
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("richiesta_ricontatto_da_slot");
}
formSection5.classList.remove("active");
formSection5.classList.add("done");
var h3s5=formSection5.querySelector("h3");
if(h3s5) h3s5.innerText="Richiesta di essere ricontattato";
if(subtitleSection4no) subtitleSection4no.classList.add("d-none");
if(subtitleSection4yes) subtitleSection4yes.classList.remove("d-none");
var sumBox=formSection4.querySelector(".summary-box");
if(sumBox) sumBox.classList.add("d-none");
formSection4.classList.add("active");
bookingScroll();
});
}
const selezioneCentri=new BookingSelezioneCentri(selectCityContainer, {
placeholder: 'Cerca una clinica...',
onSelect: (clinic)=> {
console.log('Clinica selezionata:', clinic);
if(!bookingData.location) bookingData.location={};
selectCityContainerSelectClinicID=clinic.cod;
bookingData.location.code=selectCityContainerSelectClinicID;
},
});
if(checkboxClinicSearch){
function updateZoneFieldsVisibility(){
if(!bookingData.location) bookingData.location={};
if(checkboxClinicSearch.checked){
selectCityContainer.classList.remove('d-none');
bookingData.location.code=null;
}else{
selectCityContainer.classList.add('d-none');
bookingData.location.code=selectCityContainerSelectClinicID;
}}
checkboxClinicSearch.addEventListener('change', updateZoneFieldsVisibility);
updateZoneFieldsVisibility();
}
selectedCardDirectBooking=null;
bookingData.flow8FrontendTemporaryZonaDati=false;
formSection5.style.setProperty("display", "none", "important");
if(formSection6) formSection6.style.setProperty("display", "none", "important");
initBookingAddressAutocomplete();
function clearFlow8TemporaryZonaDatiPath(){
bookingData.flow8FrontendTemporaryZonaDati=false;
}
function activateFlow8TemporaryZonaDatiPath(card){
bookingData.flow8FrontendTemporaryZonaDati=true;
flowControlloIgiene.resetState();
flowControlloIgiene.setSelectedFlowId(null);
flowControlloIgiene.clearUiForDefaultFlow();
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
if(formSection3) formSection3.classList.remove("active", "done");
if(formSection4) formSection4.classList.remove("active", "done");
if(formSection5) formSection5.classList.remove("active", "done");
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.classList.remove("active", "done");
}
var titleEl=card.querySelector(".box-location-title");
var title=titleEl ? titleEl.textContent.trim():"";
var evodentId=card.getAttribute("data-evodent-id");
bookingData.service=title;
if(evodentId){
bookingData.prestazioneId=evodentId;
if(typeof prestazioneId!=="undefined"){
prestazioneId=evodentId;
}}
if(title){
sectionSlot.setClinicEsigenza(title);
}
directBookingCustomerYes();
bookingScroll();
}
function isFlow8TemporaryZonaDatiCard(card){
return typeof window.bookingIsFlow8TemporaryZonaDatiPath==="function"&&window.bookingIsFlow8TemporaryZonaDatiPath(card);
}
card_esigenza.forEach(function (card){
card.addEventListener("click", function (){
handleCardEsigenzaClick(this, card_esigenza);
if(isFlow8TemporaryZonaDatiCard(this)){
activateFlow8TemporaryZonaDatiPath(this);
return;
}
clearFlow8TemporaryZonaDatiPath();
flowControlloIgiene.setSelectedFlowId(card.getAttribute("data-evodent-id"));
if(flowControlloIgiene.isSelected()){
return;
}
if(card.getAttribute("data-direct-booking")==="1"){
var visitTitleEl=card.querySelector(".box-location-title");
var visitTitle=visitTitleEl ? (visitTitleEl.textContent||"").trim():"";
if(visitTitle){
bookingData.service=visitTitle;
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.setTipologiaVisita(visitTitle);
}}
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
if(card.getAttribute("data-show-specialista-section")==="1"&&formSection1Specialista){
bookingData.areaSpecializzazioneIds=[];
formSection1Specialista.classList.remove("d-none");
formSection1Specialista.setAttribute("aria-hidden", "false");
formSection1Specialista.classList.add("active");
if(formSectionSelectByComune) formSectionSelectByComune.classList.remove("active");
}else{
directBookingCustomerYes();
}
bookingScroll();
}});
});
var setupFormStepStart=function (e){
clearFlow8TemporaryZonaDatiPath();
flowControlloIgiene.resetState();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.resetSteps();
}
formSectionStart.querySelector("h3").innerText="Sei Registrato in Area Pazienti?";
resetStep.forEach(function (section){
if(section&&section.classList.contains('done')) section.classList.remove('done');
if(section&&section.classList.contains('active')) section.classList.remove('active');
});
if(box3Container) box3Container.innerHTML='';
formSectionStart.classList.remove('done');
formSectionStart.classList.add('active');
bookingSosNo();
bookingScroll();
if(e){
e.preventDefault();
}};
setupFormStepStart();
if(formSectionStart&&formSectionStart.querySelector('.changesection')){
formSectionStart.querySelector('.changesection').addEventListener('click', setupFormStepStart);
}
if(formSectionStart&&formSectionStart.querySelector('.cta.continue')){
formSectionStart.querySelector('.cta.continue').addEventListener('click', function (e){
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.activateGuestFlow();
window.bookingOnlineDataLayer.trackStep("identificazione_ospite");
}
formSectionStart.classList.remove('active');
formSectionStart.classList.add('done');
formSection1.classList.remove('done');
formSection1.classList.add('active');
formSectionStart.querySelector("h3").innerText="Prenotazione come ospite";
bookingScroll();
e.preventDefault();
});
}
function resetSection1Specialista(){
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.classList.remove("active");
formSection1Specialista.classList.remove("done");
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
bookingData.areaSpecializzazioneIds=[];
}}
var setupFormStep1=function (e){
clearFlow8TemporaryZonaDatiPath();
flowControlloIgiene.resetState();
returnStep0.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
bookingData.areaSpecializzazioneIds=[];
}
if(box3Container) box3Container.innerHTML="";
formSection1.classList.remove("done");
formSection1.classList.add("active");
bookingCustomerNo();
bookingSosNo();
bookingScroll();
if(e){
e.preventDefault();
}};
formSection1
.querySelector(".changesection")
.addEventListener("click", setupFormStep1);
formSection1
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep1.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
resetSection1Specialista();
formSection1.classList.remove("done");
formSection1.classList.add("active");
bookingCustomerNo();
bookingSosNo();
bookingScroll();
e.preventDefault();
});
formSectionSelectByComune
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStepComuni.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
formSectionSelectByComune.classList.remove("done");
formSectionSelectByComune.classList.add("active");
bookingSosNo();
bookingScroll();
e.preventDefault();
});
formSection2_yes
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep2.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
formSection2_yes.classList.remove("done");
formSection2_yes.classList.add("active");
formSection2_no.classList.remove("done");
formSection2_no.classList.add("active");
bookingScroll();
e.preventDefault();
});
formSection2_no
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep2.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
formSection2_yes.classList.remove("done");
formSection2_yes.classList.add("active");
formSection2_no.classList.remove("done");
formSection2_no.classList.add("active");
bookingScroll();
e.preventDefault();
});
formSection3
.querySelector(".changesection")
.addEventListener("click", function (e){
formSection4.classList.remove("active");
formSection3.classList.remove("done");
formSection3.classList.add("active");
if(formSection5.classList.contains("active"))
formSection5.classList.remove("active");
if(box3Container) box3Container.innerHTML="";
bookingScroll();
e.preventDefault();
});
formSection5
.querySelector(".changesection")
.addEventListener("click", function (e){
formSection5.querySelector("h3").innerText="Seleziona";
formSection3.classList.remove("active");
formSection3.classList.remove("done");
formSection4.classList.remove("active");
formSection5.classList.remove("active");
if(selectedCardDirectBooking==="1"){
formSection5.style.setProperty("display", "flex", "important");
formSection5.classList.add("active");
const box2Container=document.querySelector(".grid-booking-box-2");
if(box2Container) box2Container.style.display="grid";
if(box3Container) box3Container.style.display="flex";
formSection5.querySelector(".changesection").style.display="none";
}else{
formSection3.classList.add("active");
}
bookingScroll();
e.preventDefault();
});
formSection5
.querySelector(".changesection")
.addEventListener("click", function (e){
formSection5.querySelector("h3").innerText="Seleziona";
formSection3.classList.remove("active");
formSection3.classList.remove("done");
formSection4.classList.remove("active");
formSection5.classList.remove("active");
if(selectedCardDirectBooking==="1"){
formSection5.style.setProperty("display", "flex", "important");
formSection5.classList.add("active");
const box2Container=document.querySelector(".grid-booking-box-2");
if(box2Container) box2Container.style.display="grid";
if(box3Container) box3Container.style.display="flex";
formSection5.querySelector(".changesection").style.display="none";
}else{
formSection3.classList.add("active");
}
bookingScroll();
e.preventDefault();
});
formSection1Specialista
.querySelector(".changesection")
.addEventListener("click", function (e){
formSection3.classList.remove("active");
formSection3.classList.remove("done");
formSection4.classList.remove("active");
formSection4.classList.remove("done");
formSection5.classList.remove("active");
formSection5.classList.remove("done");
formSectionSelectByComune.classList.remove("active");
formSectionSelectByComune.classList.remove("done");
formSection1Specialista.classList.remove("done");
formSection1Specialista.classList.add("active");
bookingScroll();
e.preventDefault();
});
var bookingLocations=formSection1.querySelectorAll(".box-location");
for (let i=0; i < bookingLocations.length; i++){
bookingLocations[i].addEventListener("click", function (){
var cardEsigenza=this.closest(".card-esigenza");
if(cardEsigenza&&isFlow8TemporaryZonaDatiCard(cardEsigenza)){
handleCardEsigenzaClick(cardEsigenza, card_esigenza);
activateFlow8TemporaryZonaDatiPath(cardEsigenza);
var box=cardEsigenza.querySelector(".box-location");
var subtitleTmp=box&&box.querySelector(".box-location-address");
var titleTmp=box&&box.querySelector(".box-location-title");
var subtitleHtmlTmp=subtitleTmp ? subtitleTmp.innerHTML:"";
var titleTextTmp=titleTmp ? (titleTmp.textContent||"").trim():"";
var titleHtmlTmp=titleTmp ? titleTmp.innerHTML:"";
formSection1.querySelector(".details p").innerHTML =
"<strong>" + titleHtmlTmp + "</strong>" + (subtitleHtmlTmp ? ", " + subtitleHtmlTmp:"");
if(typeof dataLayer!=="undefined"&&dataLayer.push){
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: titleHtmlTmp,
});
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleTextTmp||titleHtmlTmp,
});
}
return;
}
if(cardEsigenza){
handleCardEsigenzaClick(cardEsigenza, card_esigenza);
}
var showSpecialista=cardEsigenza&&cardEsigenza.getAttribute("data-show-specialista-section")==="1";
var selectedEvodentId=cardEsigenza ? cardEsigenza.getAttribute("data-evodent-id"):null;
clearFlow8TemporaryZonaDatiPath();
flowControlloIgiene.setSelectedFlowId(selectedEvodentId);
subtitle=this.querySelector(".box-location-address");
if(subtitle!=null){
subtitle=subtitle.innerHTML;
}
title=this.querySelector(".box-location-title").innerHTML;
var titleText=this.querySelector(".box-location-title").textContent
? this.querySelector(".box-location-title").textContent.trim()
: "";
formSection1.querySelector(".details p").innerHTML =
"<strong>" +
title +
"</strong>" +
(subtitle ? ", " + subtitle:"");
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(flowControlloIgiene.handleAfterEsigenzaSelection(showSpecialista)){
sectionSlot.setClinicEsigenza(title);
bookingData.service=title;
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: title,
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleText||title,
});
}
return;
}
flowControlloIgiene.clearUiForDefaultFlow();
titleslug=title.toLowerCase().split(" ").join("-");
switch (titleslug){
case "urgenze":
bookingSosYes();
break;
case "urgenza":
bookingSosYes();
break;
default:
formSection2_no.classList.add("active");
break;
}
bookingScroll();
sectionSlot.setClinicEsigenza(title);
bookingData.service=title;
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: title,
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleText||title,
});
}});
}
if(formSection1Specialista){
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (card){
card.addEventListener("click", function (){
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
this.classList.add("selected");
var titleEl=this.querySelector(".box-location-title");
var title=titleEl ? titleEl.textContent.trim():"";
var detailsP=formSection1Specialista.querySelector(".row.details .col-7 p");
if(detailsP) detailsP.textContent=title;
var id=this.getAttribute("data-area-specializzazione-id");
bookingData.areaSpecializzazioneIds=id ? [parseInt(id, 10)]:[];
formSection1Specialista.classList.remove("active");
formSection1Specialista.classList.add("done");
if(flowControlloIgiene.handleAfterSpecialistaSelection()){
return;
}
formSectionSelectByComune.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("specialistica", {
specialistica_raw: title,
});
}});
});
}
(function bindSwitchFromSpecialistaToGenerale(){
if(!formSection1Specialista||!formSection1) return;
var notifySwitchGenerale=formSection1Specialista.querySelector(".notify-yellow__switch-generale-link");
if(!notifySwitchGenerale) return;
function switchFromSpecialistaToGeneraleFlow(){
if(!formSection1Specialista.classList.contains("active")) return;
var genCard =
formSection1.querySelector('.card-esigenza[data-booking-generale-flow="1"]') ||
Array.prototype.find.call(formSection1.querySelectorAll(".card-esigenza"), function (c){
return (
c.getAttribute("data-show-specialista-section")!=="1" &&
c.getAttribute("data-direct-booking")==="1"
);
});
if(!genCard) return;
var newFlowId=genCard.getAttribute("data-evodent-id");
if(isFlow8TemporaryZonaDatiCard(genCard)){
activateFlow8TemporaryZonaDatiPath(genCard);
}else{
clearFlow8TemporaryZonaDatiPath();
flowControlloIgiene.setSelectedFlowId(newFlowId);
if(!flowControlloIgiene.isSelected()){
flowControlloIgiene.clearUiForDefaultFlow();
}}
resetSection1Specialista();
handleCardEsigenzaClick(genCard, card_esigenza);
var box=genCard.querySelector(".box-location");
var titleEl=box&&box.querySelector(".box-location-title");
var subEl=box&&box.querySelector(".box-location-address");
var titleHtml=titleEl ? titleEl.innerHTML:"";
var subtitleHtml=subEl ? subEl.innerHTML:"";
var detailsP=formSection1.querySelector(".details p");
if(detailsP){
detailsP.innerHTML =
"<strong>" + titleHtml + "</strong>" + (subtitleHtml ? ", " + subtitleHtml:"");
}
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
if(bookingData.flow8FrontendTemporaryZonaDati){
}else if(flowControlloIgiene.isSelected()){
flowControlloIgiene.ensureSectionSelectionOrderForFlow8();
flowControlloIgiene.goToSectionSelectionByComune(false);
}else{
directBookingCustomerYes();
}
bookingData.service=titleEl ? titleEl.textContent.trim():"";
sectionSlot.setClinicEsigenza(titleHtml);
if(typeof dataLayer!=="undefined"&&dataLayer.push){
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: titleHtml,
});
}
bookingScroll();
}
notifySwitchGenerale.addEventListener("click", function (e){
e.preventDefault();
switchFromSpecialistaToGeneraleFlow();
});
})();
document
.querySelector("#booking_time_choose")
.addEventListener("change", function (){
formSection3.querySelector(".times").style.display=this.checked
? "flex"
: "none";
if(this.checked){
this.parentNode.parentNode.classList.add("line-bordered");
}else{
this.parentNode.parentNode.classList.remove("line-bordered");
}});
document
.querySelector("#booking_time_asap")
.addEventListener("change", function (){
formSection3.querySelector(".times").style.display="none";
this.parentNode.parentNode.classList.remove("line-bordered");
});
formSection2_no
.querySelector(".cta")
.addEventListener("click", function (e){
var title=[];
titles=this.parentNode.querySelectorAll(".address");
for (let i=0; i < titles.length; i++){
title.push(titles[i].value);
}
var title=title.filter(function (el){
return el!=null&&el!="";
});
if(title.length){
this.parentNode.querySelector(".hint").style.display="none";
formSection2_no.querySelector(".details p").innerHTML =
title.join("<br>");
formSection2_no.classList.remove("active");
formSection2_yes.classList.add("done");
formSection2_no.classList.remove("active");
formSection2_no.classList.add("done");
if(selectedCardDirectBooking==="1"){
formSection3.classList.add("active");
}else{
formSection4.classList.add("active");
bookingData.times=[];
}
bookingScroll();
bookingData.location=title.join("\n\n");
bookingData.locations=title;
console.log("bookingData", bookingData);
dataLayer.push({
event: "FP_step3_centro",
FP_step3_centro_value: title.join(" - "),
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}}else{
this.parentNode.querySelector(".hint").style.display="block";
}
e.preventDefault();
});
formSectionSelectByComune.querySelector(".cta").addEventListener("click", function (e){
var addressInputs=formSectionSelectByComune.querySelectorAll(".autocomplete.booking-address");
var hasZone=false;
for (var i=0; i < addressInputs.length; i++){
var latField=addressInputs[i].parentNode.querySelector(".booking-lat");
var lngField=addressInputs[i].parentNode.querySelector(".booking-lng");
if(latField&&lngField&&latField.value&&lngField.value){
hasZone=true;
break;
}}
var checkboxClinic=formSectionSelectByComune.querySelector("#clinic-search");
var hasClinic=checkboxClinic&&checkboxClinic.checked&&(selectCityContainerSelectClinicID||(bookingData.location&&bookingData.location.code));
var isValid=hasZone||hasClinic;
var errorRow=formSectionSelectByComune.querySelector(".selection-by-comune-error");
var errorDiv=errorRow ? errorRow.querySelector(".error"):null;
var errorP=errorDiv ? errorDiv.querySelector("p"):null;
if(!isValid){
e.preventDefault();
if(errorDiv) errorDiv.classList.add("active");
if(errorP) errorP.textContent="Inserisci una zona di preferenza o seleziona un centro";
return;
}
if(errorDiv) errorDiv.classList.remove("active");
if(errorP) errorP.textContent="";
formSectionSelectByComune.classList.remove("active");
formSectionSelectByComune.classList.add("done");
if(bookingData.flow8FrontendTemporaryZonaDati){
if(typeof window.bookingSyncZonaPreferenzaToBookingData==="function"){
window.bookingSyncZonaPreferenzaToBookingData(formSectionSelectByComune, bookingData);
}
if(formSection3) formSection3.classList.remove("active", "done");
if(formSection5) formSection5.classList.remove("active", "done");
formSection4.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}
e.preventDefault();
return;
}
formSection3.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}
e.preventDefault();
});
formSection3
.querySelector(".cta")
.addEventListener("click", function (e){
title=[];
bookingData.timesAsap =
document.querySelector("#booking_time_asap").checked;
if(bookingData.asap){
title.push(document.querySelector('label[for="booking_time_asap"]').innerHTML
);
}
bookingData.timesChoose=document.querySelector("#booking_time_choose"
).checked;
if(bookingData.timesChoose){
hours=formSection3.querySelectorAll(".times .form-check-input");
for (let i=0; i < hours.length; i++){
if(hours[i].checked){
title.push(hours[i].value);
}}
}
if(title.length==0){
title.push(document.querySelector('label[for="booking_time_asap"]').innerHTML
);
}
bookingData.times=title;
var cleanedTitle=title.map(function (t){
return t.replace(/^(lunedì|martedì|mercoledì|giovedì|venerdì|sabato|domenica)\s*/i,
""
);
});
formSection3.querySelector(".details p").innerHTML =
cleanedTitle.join("<br>");
var rowDetails=formSection3.querySelector(".row-details");
if(rowDetails) rowDetails.style.display="none";
var timesBox=formSection3.querySelector(".times");
if(timesBox) timesBox.style.display="none";
formSection3.classList.remove("active");
formSection3.classList.add("done");
var coords=getBookingAddressCoords();
if(selectedCardDirectBooking=="1"){
formSection5.classList.add("active");
var clinicaId=null;
if(bookingData.location&&bookingData.location.code){
clinicaId=bookingData.location.code;
}
var selectedCard=null;
card_esigenza.forEach(function (card){
if(card.classList.contains("selected")){
selectedCard=card;
}});
if(selectedCard){
prestazioneId=selectedCard.getAttribute("data-evodent-id");
}
var DataInizio=getFormattedData(selectedDate.value);
reservationArgs={
ClinicaId: clinicaId ? [clinicaId]:[],
DataInizio: DataInizio,
PageUrl: bookingData.pageUrl||window.location.href,
PrestazioneId: prestazioneId||null,
AreaSpecializzazioneId: Array.isArray(bookingData.areaSpecializzazioneIds) ? bookingData.areaSpecializzazioneIds:[],
Source: "Website",
PhoneNumber: "",
PreferenzeOrario: [],
};
if(coords&&coords.length){
let posCount=1;
coords.forEach(function (coord){
if(coord){
reservationArgs['Posizione' + posCount]={
Latitudine: coord.Latitudine,
Longitudine: coord.Longitudine,
};
posCount++;
}});
}
if(document.querySelector("#booking_time_asap").checked){
reservationArgs.PreferenzeOrario.push("ASAP");
}else{
for (let i=0; i < hours.length; i++){
if(hours[i].checked){
var onlyHour;
if(/dopo le 18/i.test(hours[i].value)){
onlyHour=">18";
}else{
var match=hours[i].value.match(/(\d{1,2})\s*-\s*(\d{1,2})/);
onlyHour=match ? match[1] + "-" + match[2]:hours[i].value;
}
reservationArgs.PreferenzeOrario.push(onlyHour);
}}
if(reservationArgs.PreferenzeOrario.length===0){
reservationArgs.PreferenzeOrario.push("ASAP");
}}
sectionSlot.showLoader();
function handleReservationResponse(response){
var container=document.getElementById("booking-owl-reservation");
if(!container) return;
container.innerHTML="";
var freeSlots=response.data ? response.data.FreeOperatorSlots:null;
if(!freeSlots||Object.keys(freeSlots).length===0){
let message="Carica altri slot";
retryCount=typeof retryCount==='number' ? retryCount:0;
retryCount++;
if(retryCount > 2){
message="Cambia filtri";
}
container.innerHTML=`
<div class=\"no-slots-message\">
<p>${message}</p>
<button class=\"btn-primary btn-booking-retry\">Carica altri slot</button>
</div>
`;
sectionSlot.hideLoader();
const retryButton=container.querySelector(".btn-booking-retry");
if(retryButton){
retryButton.addEventListener("click", function (){
var noSlotContainer=document.querySelector(".no-slots-message");
noSlotContainer.classList.add("disabled");
container.innerHTML="";
sectionSlot.showLoader();
const currentDate=new Date(reservationArgs.DataInizio);
currentDate.setDate(currentDate.getDate() + 14);
reservationArgs.DataInizio=currentDate.toISOString().split("T")[0] + "T00:00:00Z";
sectionSlot.callReservationYes(reservationArgs, handleReservationResponse);
setTimeout(()=> sectionSlot.hideLoader(), 1000);
setTimeout(function (){
noSlotContainer.classList.remove("disabled");
}, 1000);
});
}
return;
}else{
sectionSlot.hideLoader();
retryCount=0;
Object.keys(freeSlots).forEach(function (date){
const html=sectionSlot.generateSlotHtml(date);
container.innerHTML +=html;
});
sectionSlot.initializeCarouselBooking();
}
sectionSlot.selectFirstAvailableDay();
var mapContainer=document.querySelector(".grid-booking-box-3");
if(mapContainer&&response.data&&response.data.Cliniche){
mapContainer.innerHTML="";
var mapDiv=document.createElement("div");
mapDiv.id="google-booking-map";
mapContainer.appendChild(mapDiv);
sectionSlot.initBookingMap(response.data.Cliniche, mapDiv);
document.querySelector(".grid-booking-box-4.d-none").classList.remove("d-none");
}}
sectionSlot.callReservationYes(reservationArgs, handleReservationResponse);
}else{
formSection4.classList.add("active");
}
bookingScroll();
dataLayer.push({
event: "FP_step4_appuntamento",
FP_step4_appuntamento_value: title.join("\r\n"),
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("preferenza_orario");
}
e.preventDefault();
});
function bookingSection4ValidateAndSyncForSubmit(){
var hasError=false;
var skipRequiredValidation=flowControlloIgiene.shouldSkipRequiredValidation();
var regName=/^[a-zA-ZàèéìíîïòóôùúûñÁÉÍÓÚÜÑ\s\']+$/;
var regCf=/^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$/i;
var regEmail =
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
firstname=formSection4.querySelector("#booking-firstname");
lastname=formSection4.querySelector("#booking-lastname");
phone=formSection4.querySelector("#booking-phone");
phone_prefix=formSection4.querySelector("#booking-phone-dial-code");
email=formSection4.querySelector("#booking-email");
cf=document.querySelector("#booking-cf");
if(!skipRequiredValidation&&!regName.test(firstname.value)){
if(firstname.parentNode.classList.contains("valid")){
firstname.parentNode.classList.remove("valid");
}
firstname.parentNode.classList.add("error");
hasError=true;
}else{
if(firstname.parentNode.classList.contains("error")){
firstname.parentNode.classList.remove("error");
}
firstname.parentNode.classList.add("valid");
}
if(!skipRequiredValidation&&!regName.test(lastname.value)){
if(lastname.parentNode.classList.contains("valid")){
lastname.parentNode.classList.remove("valid");
}
lastname.parentNode.classList.add("error");
hasError=true;
}else{
if(lastname.parentNode.classList.contains("error")){
lastname.parentNode.classList.remove("error");
}
lastname.parentNode.classList.add("valid");
}
if(!skipRequiredValidation &&
phone.value.length < 9 ||
!skipRequiredValidation &&
phone.value.length > 10 ||
!skipRequiredValidation &&
(phone.value.charAt(0)!=3&&phone.value.charAt(0)!=0) ||
!skipRequiredValidation &&
!/^\d+$/.test(phone.value)
){
if(phone.parentNode.classList.contains("valid")){
phone.parentNode.classList.remove("valid");
}
phone.parentNode.classList.add("error");
hasError=true;
}else{
if(phone.parentNode.classList.contains("error")){
phone.parentNode.classList.remove("error");
}
phone.parentNode.classList.add("valid");
}
if(!skipRequiredValidation&&!regEmail.test(email.value)){
if(email.parentNode.classList.contains("valid")){
email.parentNode.classList.remove("valid");
}
email.parentNode.classList.add("error");
hasError=true;
}else{
if(email.parentNode.classList.contains("error")){
email.parentNode.classList.remove("error");
}
email.parentNode.classList.add("valid");
}
if(cf){
if(cf.value&&!regCf.test(cf.value)){
if(cf.parentNode.classList.contains("valid")){
cf.parentNode.classList.remove("valid");
}
cf.parentNode.classList.add("error");
hasError=true;
}else{
if(cf.parentNode.classList.contains("error")){
cf.parentNode.classList.remove("error");
}
cf.parentNode.classList.add("valid");
}}
bookingData.firstname=firstname.value;
bookingData.lastname=lastname.value;
bookingData.phone=phone.value;
bookingData.phone_prefix=phone_prefix.value;
bookingData.email=email.value;
bookingData.cf=cf ? cf.value:"";
if(pageBooking.classList.contains("sos")){
bookingData.sos=true;
bookingData.message =
document.querySelector("#booking-message").value;
}else{
bookingData.sos=false;
bookingData.message="";
}
bookingData.marketing =
document.querySelector("#booking-marketing").checked;
bookingData.profile =
document.querySelector("#booking-profile").checked;
bookingData.pageUrl=window.location.href;
bookingData.pageTitle=document.title;
return hasError;
}
formSection4
.querySelector(".submit")
.addEventListener("click", function (e){
if(typeof window.bookingHideCallbackRequestBtn==="function"){
window.bookingHideCallbackRequestBtn();
}
var hasError=bookingSection4ValidateAndSyncForSubmit();
if(flowControlloIgiene.handleSubmitIfFlow8(hasError)){
e.preventDefault();
return;
}
if(!hasError){
document
.getElementById("email_customer")
.setAttribute("href", "mailto:" + bookingData.email);
document.getElementById("email_customer").innerHTML =
bookingData.email;
dataLayer.push({
event: "FP_step5_inviorichiesta",
convezione: "no",
assicurazione: "no",
informativag: bookingData.marketing ? "si":"no",
informativap: bookingData.profile ? "si":"no",
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("dati_personali_e_conferma");
}
var proceedWithBookingSubmit=function (){
var isRicontattoSubmit =
typeof window.bookingIsRicontattoSubmitMode==="function" &&
window.bookingIsRicontattoSubmitMode();
if(!isRicontattoSubmit){
sendPostRequestBooking(bookingData);
}else{
var payloadRicontatto =
typeof window.bookingBuildRicontattoSubmitPayload==="function"
? window.bookingBuildRicontattoSubmitPayload(bookingData)
: bookingData;
bookingSubmitFrontend(payloadRicontatto);
}};
if(typeof window.bookingRunPreConfirmVerification==="function"){
window.bookingRunPreConfirmVerification(bookingData)
.then(function (canProceed){
if(!canProceed){
document.body.classList.remove("overlay-loading-show");
return;
}
proceedWithBookingSubmit();
})
.catch(function (){
document.body.classList.remove("overlay-loading-show");
});
}else{
proceedWithBookingSubmit();
}}else{
bookingScroll();
}
e.preventDefault();
});
var formSection4CallbackBtn=formSection4.querySelector(".booking-callback-request-btn");
if(formSection4CallbackBtn){
formSection4CallbackBtn.addEventListener("click", function (e){
e.preventDefault();
var errCb=bookingSection4ValidateAndSyncForSubmit();
if(flowControlloIgiene.handleSubmitIfFlow8(errCb)){
return;
}
if(errCb){
bookingScroll();
return;
}
if(typeof window.bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals==="function"){
window.bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals();
}else{
if(typeof window!=="undefined"){
window.directBooking=false;
window.selectedCardDirectBooking="0";
}
if(typeof directBooking!=="undefined"){
directBooking=false;
}
if(typeof selectedCardDirectBooking!=="undefined"){
selectedCardDirectBooking="0";
}}
var payload=Object.assign({}, bookingData);
delete payload.bookData;
delete payload.thankyou;
delete payload.times;
delete payload.selectedSlot;
delete payload.selectedClinicId;
delete payload.selectedDay;
if(typeof window.bookingResolveThankyouClinicOrZone==="function"){
var clinicOrZone=window.bookingResolveThankyouClinicOrZone(payload);
if(clinicOrZone){
payload.location=clinicOrZone;
}}
if(typeof bookingSubmitFrontend==="function"){
bookingSubmitFrontend(payload);
}});
}
function bookingSosYes(){
formSection4.classList.add("active");
pageBooking.classList.add("sos");
}
function bookingSosNo(){
pageBooking.classList.remove("sos");
}}
document.addEventListener("DOMContentLoaded", function (){
if(document.body.classList.contains("area-pazienti-dashboard")){
return;
}
var specialistHelpBoxes=document.querySelectorAll(".specialista-help");
if(specialistHelpBoxes.length){
var helpPopupPortal=document.createElement("div");
helpPopupPortal.className="specialista-help-popup-portal";
helpPopupPortal.hidden=true;
document.body.appendChild(helpPopupPortal);
var activeHelpTrigger=null;
var mobileHelpPopupQuery=window.matchMedia("(max-width: 767px)");
function isUsingHelpPortal(){
return !!mobileHelpPopupQuery.matches;
}
function positionHelpPopupPortal(trigger){
if(!trigger||helpPopupPortal.hidden) return;
var triggerRect=trigger.getBoundingClientRect();
var viewportPadding=12;
helpPopupPortal.style.left="0px";
helpPopupPortal.style.top="0px";
helpPopupPortal.style.visibility="hidden";
var popupWidth=helpPopupPortal.offsetWidth||260;
var left=window.scrollX + triggerRect.right - popupWidth;
var minLeft=window.scrollX + viewportPadding;
var maxLeft=window.scrollX + window.innerWidth - popupWidth - viewportPadding;
if(maxLeft < minLeft){
maxLeft=minLeft;
}
if(left < minLeft){
left=minLeft;
}
if(left > maxLeft){
left=maxLeft;
}
var top=window.scrollY + triggerRect.bottom + 6;
helpPopupPortal.style.left=left + "px";
helpPopupPortal.style.top=top + "px";
helpPopupPortal.style.visibility="visible";
}
function closeHelpPopupPortal(){
helpPopupPortal.hidden=true;
helpPopupPortal.style.visibility="";
helpPopupPortal.innerHTML="";
activeHelpTrigger=null;
}
function openHelpPopupPortal(box){
var sourcePopup=box ? box.querySelector(".specialista-help-popup"):null;
var trigger=box ? box.querySelector(".specialista-help-trigger"):null;
if(!sourcePopup||!trigger){
closeHelpPopupPortal();
return;
}
helpPopupPortal.innerHTML=sourcePopup.innerHTML;
helpPopupPortal.hidden=false;
activeHelpTrigger=trigger;
positionHelpPopupPortal(trigger);
}
function setHelpPopupState(box, isOpen){
if(!box) return;
var popup=box.querySelector(".specialista-help-popup");
var trigger=box.querySelector(".specialista-help-trigger");
var card=box.closest(".card-esigenza, .card-specialista");
if(popup) popup.hidden=isOpen ? isUsingHelpPortal():true;
if(trigger) trigger.setAttribute("aria-expanded", isOpen ? "true":"false");
if(card){
card.classList.toggle("specialista-help-open", !!isOpen);
}
if(isOpen){
box.setAttribute("open", "");
}else{
box.removeAttribute("open");
}}
function closeAllHelpPopups(){
specialistHelpBoxes.forEach(function (box){
setHelpPopupState(box, false);
});
closeHelpPopupPortal();
}
function syncOpenHelpPopupRendering(){
var openBox=null;
specialistHelpBoxes.forEach(function (box){
if(!openBox&&box.hasAttribute("open")){
openBox=box;
}});
if(!openBox){
closeHelpPopupPortal();
return;
}
if(isUsingHelpPortal()){
var openInlinePopup=openBox.querySelector(".specialista-help-popup");
if(openInlinePopup) openInlinePopup.hidden=true;
openHelpPopupPortal(openBox);
}else{
closeHelpPopupPortal();
var desktopPopup=openBox.querySelector(".specialista-help-popup");
if(desktopPopup) desktopPopup.hidden=false;
}}
document.addEventListener("click", function (e){
var target=e.target&&e.target.closest ? e.target:null;
var trigger=target ? target.closest(".specialista-help-trigger"):null;
if(trigger){
e.preventDefault();
e.stopPropagation();
if(typeof e.stopImmediatePropagation==="function"){
e.stopImmediatePropagation();
}
var owner=trigger.closest(".specialista-help");
if(!owner) return;
var willOpen = !owner.hasAttribute("open");
closeAllHelpPopups();
if(willOpen){
setHelpPopupState(owner, true);
if(isUsingHelpPortal()){
openHelpPopupPortal(owner);
}}
return;
}
var insidePortal=target ? target.closest(".specialista-help-popup-portal"):null;
if(insidePortal){
return;
}
var insideHelp=target ? target.closest(".specialista-help"):null;
if(!insideHelp){
closeAllHelpPopups();
}}, true);
document.addEventListener("keydown", function (e){
if(e.key==="Escape"){
closeAllHelpPopups();
}});
window.addEventListener("scroll", function (){
if(isUsingHelpPortal()&&activeHelpTrigger&&!helpPopupPortal.hidden){
positionHelpPopupPortal(activeHelpTrigger);
}}, true);
window.addEventListener("resize", function (){
syncOpenHelpPopupRendering();
});
}
if(!document.body.classList.contains("booking-loaded")){
document.body.classList.add("booking-loaded");
}
const pageBooking=document.querySelector(".page-booking");
if(pageBooking!=null){
pageBookingNotNull(pageBooking);
}});
(function (){
"use strict";
function initSection4PrivacyDefaults(){
var host=document.querySelector(".booking-section.section-4");
if(!host) return;
function sync(){
if(!host.classList.contains("active")) return;
var m=document.getElementById("booking-marketing");
var p=document.getElementById("booking-profile");
if(m&&!m.disabled) m.checked=true;
if(p&&!p.disabled) p.checked=true;
}
new MutationObserver(sync).observe(host, { attributes: true, attributeFilter: ["class"] });
sync();
}
if(document.readyState==="loading"){
document.addEventListener("DOMContentLoaded", initSection4PrivacyDefaults);
}else{
initSection4PrivacyDefaults();
}})();
document.addEventListener("DOMContentLoaded", function (){
function initSpecialistaHelpPopups(){
var specialistHelpBoxes=document.querySelectorAll(".specialista-help");
if(!specialistHelpBoxes.length){
return;
}
var helpPopupPortal=document.createElement("div");
helpPopupPortal.className="specialista-help-popup-portal";
helpPopupPortal.hidden=true;
document.body.appendChild(helpPopupPortal);
var activeHelpTrigger=null;
var mobileHelpPopupQuery=window.matchMedia("(max-width: 767px)");
function isUsingHelpPortal(){
return !!mobileHelpPopupQuery.matches;
}
function positionHelpPopupPortal(trigger){
if(!trigger||helpPopupPortal.hidden) return;
var triggerRect=trigger.getBoundingClientRect();
var viewportPadding=12;
helpPopupPortal.style.left="0px";
helpPopupPortal.style.top="0px";
helpPopupPortal.style.visibility="hidden";
var popupWidth=helpPopupPortal.offsetWidth||260;
var left=window.scrollX + triggerRect.right - popupWidth;
var minLeft=window.scrollX + viewportPadding;
var maxLeft =
window.scrollX + window.innerWidth - popupWidth - viewportPadding;
if(maxLeft < minLeft){
maxLeft=minLeft;
}
if(left < minLeft){
left=minLeft;
}
if(left > maxLeft){
left=maxLeft;
}
var top=window.scrollY + triggerRect.bottom + 6;
helpPopupPortal.style.left=left + "px";
helpPopupPortal.style.top=top + "px";
helpPopupPortal.style.visibility="visible";
}
function closeHelpPopupPortal(){
helpPopupPortal.hidden=true;
helpPopupPortal.style.visibility="";
helpPopupPortal.innerHTML="";
activeHelpTrigger=null;
}
function openHelpPopupPortal(box){
var sourcePopup=box ? box.querySelector(".specialista-help-popup"):null;
var trigger=box ? box.querySelector(".specialista-help-trigger"):null;
if(!sourcePopup||!trigger){
closeHelpPopupPortal();
return;
}
helpPopupPortal.innerHTML=sourcePopup.innerHTML;
helpPopupPortal.hidden=false;
activeHelpTrigger=trigger;
positionHelpPopupPortal(trigger);
}
function setHelpPopupState(box, isOpen){
if(!box) return;
var popup=box.querySelector(".specialista-help-popup");
var trigger=box.querySelector(".specialista-help-trigger");
var card=box.closest(".card-esigenza, .card-specialista");
if(popup) popup.hidden=isOpen ? isUsingHelpPortal():true;
if(trigger)
trigger.setAttribute("aria-expanded", isOpen ? "true":"false");
if(card){
card.classList.toggle("specialista-help-open", !!isOpen);
}
if(isOpen){
box.setAttribute("open", "");
}else{
box.removeAttribute("open");
}}
function closeAllHelpPopups(){
specialistHelpBoxes.forEach(function (box){
setHelpPopupState(box, false);
});
closeHelpPopupPortal();
}
function syncOpenHelpPopupRendering(){
var openBox=null;
specialistHelpBoxes.forEach(function (box){
if(!openBox&&box.hasAttribute("open")){
openBox=box;
}});
if(!openBox){
closeHelpPopupPortal();
return;
}
if(isUsingHelpPortal()){
var openInlinePopup=openBox.querySelector(".specialista-help-popup");
if(openInlinePopup) openInlinePopup.hidden=true;
openHelpPopupPortal(openBox);
}else{
closeHelpPopupPortal();
var desktopPopup=openBox.querySelector(".specialista-help-popup");
if(desktopPopup) desktopPopup.hidden=false;
}}
document.addEventListener("click",
function (e){
var target=e.target&&e.target.closest ? e.target:null;
var trigger=target ? target.closest(".specialista-help-trigger"):null;
if(trigger){
e.preventDefault();
e.stopPropagation();
if(typeof e.stopImmediatePropagation==="function"){
e.stopImmediatePropagation();
}
var owner=trigger.closest(".specialista-help");
if(!owner) return;
var willOpen = !owner.hasAttribute("open");
closeAllHelpPopups();
if(willOpen){
setHelpPopupState(owner, true);
if(isUsingHelpPortal()){
openHelpPopupPortal(owner);
}}
return;
}
var insidePortal=target
? target.closest(".specialista-help-popup-portal")
: null;
if(insidePortal){
return;
}
var insideHelp=target ? target.closest(".specialista-help"):null;
if(!insideHelp){
closeAllHelpPopups();
}},
true
);
document.addEventListener("keydown", function (e){
if(e.key==="Escape"){
closeAllHelpPopups();
}});
window.addEventListener("scroll",
function (){
if(isUsingHelpPortal()&&activeHelpTrigger&&!helpPopupPortal.hidden){
positionHelpPopupPortal(activeHelpTrigger);
}},
true
);
window.addEventListener("resize", function (){
syncOpenHelpPopupRendering();
});
}
initSpecialistaHelpPopups();
if(!document.body.classList.contains("booking-loaded") &&
document.body.classList.contains("area-pazienti-dashboard")
){
document.body.classList.add("booking-loaded");
const pageBooking=document.querySelector(".page-booking");
if(pageBooking!=null){
function apHasLinkedPatientCard(data){
return !!(
data &&
data.PatientWebCard &&
data.PatientWebCard.Paziente &&
data.PatientWebCard.Paziente.PazienteId!=null &&
String(data.PatientWebCard.Paziente.PazienteId).trim()!==""
);
}
function apEnsureBookingUserDataAndInit(){
var rawUserData=sessionStorage.getItem("userData");
var parsedUserData=null;
var shouldRecoverNow = !!sessionStorage.getItem("apPostBookingSyncMeta");
try {
parsedUserData=rawUserData ? JSON.parse(rawUserData):null;
} catch (errUserData){
parsedUserData=null;
}
if(apHasLinkedPatientCard(parsedUserData)){
initBookingApForm(pageBooking);
return;
}
if(!shouldRecoverNow){
initBookingApForm(pageBooking);
return;
}
var token=sessionStorage.getItem("access_token");
var ajaxUrlNode=document.getElementById("ajaxurl");
var ajaxHref=ajaxUrlNode ? ajaxUrlNode.getAttribute("href"):null;
if(!token||!ajaxHref){
sessionStorage.removeItem("apPostBookingSyncMeta");
initBookingApForm(pageBooking);
return;
}
var recoveryUrl=new URL(ajaxHref);
recoveryUrl.searchParams.set("action", "dp_get_card");
var recoveryPayload=JSON.stringify({ token: token });
var recoveryReq=new XMLHttpRequest();
recoveryReq.onreadystatechange=function (){
if(this.readyState!==4) return;
if(this.status!==200){
sessionStorage.removeItem("apPostBookingSyncMeta");
initBookingApForm(pageBooking);
return;
}
try {
var response=JSON.parse(recoveryReq.responseText);
if(!response||!response.Data||!apHasLinkedPatientCard(response.Data)){
sessionStorage.removeItem("apPostBookingSyncMeta");
initBookingApForm(pageBooking);
return;
}
response.Data.expiry=false;
sessionStorage.setItem("userData", JSON.stringify(response.Data));
if(response.PublicWebMasterTables){
sessionStorage.setItem("PublicWebMasterTables",
JSON.stringify(response.PublicWebMasterTables)
);
}
sessionStorage.removeItem("apPostBookingSyncMeta");
initBookingApForm(pageBooking);
} catch (errRecovery){
sessionStorage.removeItem("apPostBookingSyncMeta");
initBookingApForm(pageBooking);
}};
recoveryReq.open("POST", recoveryUrl, true);
recoveryReq.setRequestHeader("Content-type", "application/json; charset=UTF-8");
recoveryReq.send(recoveryPayload);
}
if(sessionStorage.getItem("access_token")==null){
var accessToken=getTokenFromHash("access_token");
if(accessToken){
sessionStorage.setItem("access_token", accessToken);
sessionStorage.setItem("id_token", getTokenFromHash("id_token"));
document.body.classList.add("blankpage");
document.body.classList.add("overlay-loading-show");
const formLoginData=new FormData();
formLoginData.append("token", accessToken);
var tokenSelector=sessionStorage.getItem("TokenSelector");
if(tokenSelector){
formLoginData.append("action", "dp_get_card_validate");
formLoginData.append("tokenselector", tokenSelector);
}else{
formLoginData.append("action", "dp_get_card");
}
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4&&this.status==200){
var response=xhttp.responseText;
response=JSON.parse(response);
response.Data.expiry=false;
sessionStorage.removeItem("TokenSelector");
sessionStorage.setItem("userData", JSON.stringify(response.Data));
sessionStorage.setItem("PublicWebMasterTables",
JSON.stringify(response.PublicWebMasterTables)
);
window.location.href="/prenota-visita/";
}};
let link=document.getElementById("ajaxurl").getAttribute("href");
xhttp.open("POST", link, true);
xhttp.send(formLoginData);
}else{
document.body.classList.add("blankpage");
document.body.classList.add("overlay-loading-show");
window.location.href="/prenota-visita/?login";
return;
}}else{
apEnsureBookingUserDataAndInit();
}}
}
function bookingScroll(){
activeSections=document.querySelectorAll(".booking-section.active");
maxTop=0;
for (let i=0; i < activeSections.length; i++){
if(maxTop < activeSections[i].offsetTop){
maxTop=activeSections[i].offsetTop;
}}
scroll({
top: maxTop - 190,
behavior: "smooth",
});
}
function getTokenFromHash(nametoken){
var hash=window.location.hash.substr(1);
var params=hash.split("&");
for (var i=0; i < params.length; i++){
var param=params[i].split("=");
if(param[0]===nametoken){
return param[1];
}}
return null;
}
function getDecodedToken(token){
var base64Url=token.split(".")[1];
var base64=base64Url.replace(/-/g, "+").replace(/_/g, "/");
var jsonPayload=decodeURIComponent(
window
.atob(base64)
.split("")
.map(function (c){
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
})
.join("")
);
return JSON.parse(jsonPayload);
}
function getUserCliniche(){
if(typeof userData.PatientWebCard.Cliniche!=="undefined"){
var cliniche=userData.PatientWebCard.Cliniche;
var masterCliniche=master.Cliniche;
for (let i=0; i < cliniche.length; i++){
for (let e=0; e < masterCliniche.length; e++){
if(cliniche[i].ClinicaId==masterCliniche[e].ClinicaId){
cliniche[i].ClinicaPartitaIva=masterCliniche[e].ClinicaPartitaIva;
}}
}
return cliniche;
}
return [];
}});
function initBookingApForm(pageBooking){
window.bookingData=window.bookingData||{};
var bookingData=window.bookingData;
var selectCityContainerSelectClinicID=null;
const formSection1=pageBooking.querySelector(".booking-section.section-1");
const card_esigenza=formSection1.querySelectorAll(".card-esigenza");
const formSection0=pageBooking.querySelector(".booking-section.section-0");
const formSection2_yes=pageBooking.querySelector(".booking-section.section-2.tab-yes");
const formSection2_no=pageBooking.querySelector(".booking-section.section-2.tab-no");
const formSection3=pageBooking.querySelector(".booking-section.section-3");
const formSection4=pageBooking.querySelector(".booking-section.section-4");
const formSection5=pageBooking.querySelector(".booking-section.section-5");
const formSection6=pageBooking.querySelector(".booking-section.section-6");
const formSection6Flow8=pageBooking.querySelector("#section-igiene-slots");
const formSection7=pageBooking.querySelector(".booking-section.section-7");
const formSectionSelectByComune=pageBooking.querySelector("#section-selection-by-comune");
const sectionSlotStep2Host=formSection6Flow8||formSection6;
const selectedDate=document.querySelector("#booking-date");
const zoneFields=document.querySelector('.zone-fields');
const box3Container=document.querySelector(".grid-bookingslot-box-3");
const selectCityContainer=document.querySelector("#container-selection-by-comune");
const slotNotFound=document.querySelector(".turn-of-direct-booking");
const bookingLocations=formSection1.querySelectorAll(".box-location");
const subtitleSection4no=formSection4.querySelector(".subtitle.no");
const subtitleSection4yes=formSection4.querySelector(".subtitle.yes");
const subtitleSection4=subtitleSection4no||formSection4.querySelector(".subtitle");
const formSection1Specialista=pageBooking.querySelector(".booking-section.section-1-specialista");
const returnStep0=[
formSection1,
formSection1Specialista,
formSection2_yes,
formSection2_no,
formSection3,
formSection4,
formSection5,
formSection6,
formSection6Flow8!==formSection6 ? formSection6Flow8:null,
formSection7,
formSectionSelectByComune,
].filter(Boolean);
const returnStep1=[
formSection1Specialista,
formSection2_yes,
formSection2_no,
formSection3,
formSection4,
formSection5,
formSection6,
formSection6Flow8!==formSection6 ? formSection6Flow8:null,
formSection7,
formSectionSelectByComune,
].filter(Boolean);
const returnStep2=[
formSection3,
formSection4,
formSection5,
formSection6,
formSection6Flow8!==formSection6 ? formSection6Flow8:null,
formSection7,
formSectionSelectByComune,
].filter(Boolean);
const returnStep5=[
formSection3,
formSection4,
formSection5,
formSection6,
formSection6Flow8!==formSection6 ? formSection6Flow8:null,
formSection7,
].filter(Boolean);
let flowControlloIgiene=null;
function apGetDecodedAccessToken(){
var token=sessionStorage.getItem("access_token");
if(!token||typeof token!=="string") return null;
try {
var base64Url=token.split(".")[1];
if(!base64Url) return null;
var base64=base64Url.replace(/-/g, "+").replace(/_/g, "/");
var jsonPayload=decodeURIComponent(
window
.atob(base64)
.split("")
.map(function (c){
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
})
.join("")
);
return JSON.parse(jsonPayload);
} catch (errTok){
return null;
}}
var rawUserDataStr=sessionStorage.getItem("userData");
var rawMasterStr=sessionStorage.getItem("PublicWebMasterTables");
var userData=null;
var master=null;
try {
userData=rawUserDataStr ? JSON.parse(rawUserDataStr):null;
} catch (eUd){
userData=null;
}
try {
master=rawMasterStr ? JSON.parse(rawMasterStr):null;
} catch (eMs){
master=null;
}
if(!userData) userData={};
if(!master) master={};
window.bookingApUserData=userData;
window.bookingApGetDecodedAccessToken=apGetDecodedAccessToken;
function apResolveEmailForAccount(accountId){
var email="";
accountId=accountId||"main";
if(userData.PatientWebCard&&userData.PatientWebCard.Paziente&&!apGuestLikeFrontendFlow){
var bookingAccount=null;
if(accountId==="main"||accountId==="other"){
bookingAccount=userData.PatientWebCard.Paziente;
}else{
var correlati=userData.PatientWebCard.Correlati||[];
for (var ci=0; ci < correlati.length; ci++){
if(String(accountId)===String(correlati[ci].PazienteCorrelatoId)){
bookingAccount=correlati[ci];
break;
}}
}
if(bookingAccount&&bookingAccount.PazienteEmail){
email=String(bookingAccount.PazienteEmail).trim();
}}
if(!email){
var tok=apGetDecodedAccessToken();
if(tok&&tok.email){
email=String(tok.email).trim();
}}
return email;
}
window.bookingApResolveEmailForAccount=apResolveEmailForAccount;
function apSyncEmailCustomerToDataLayer(accountId){
var email=apResolveEmailForAccount(accountId);
if(!email) return;
bookingData.email=email;
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.setEmailCustomer(email);
}}
function apPatientWebCardHasPazienteId(ud){
return !!(
ud &&
ud.PatientWebCard &&
ud.PatientWebCard.Paziente &&
ud.PatientWebCard.Paziente.PazienteId!=null &&
String(ud.PatientWebCard.Paziente.PazienteId).trim()!==""
);
}
var apGuestLikeFrontendFlow =
userData.PatientWebCard!=null&&!apPatientWebCardHasPazienteId(userData);
bookingData.apGuestLikeFrontendFlow=apGuestLikeFrontendFlow;
function resetSection1Specialista(){
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.classList.remove("active");
formSection1Specialista.classList.remove("done");
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
bookingData.areaSpecializzazioneIds=[];
}}
const sectionSlot=new SectionSlot({
onSlotConfirmed: function ({ slot, clinicId, day }){
bookingData.selectedSlot=slot;
bookingData.selectedClinicId=clinicId;
bookingData.selectedDay=day;
if(clinicId&&(!bookingData.location||typeof bookingData.location!=="object"||!bookingData.location.code)){
if(!bookingData.location||typeof bookingData.location!=="object"){
bookingData.location={};}
bookingData.location.code=clinicId;
if(bookingData.locations&&bookingData.locations.length){
bookingData.location.title=Array.isArray(bookingData.locations) ? bookingData.locations[0]:bookingData.locations;
}}
if(flowControlloIgiene&&(flowControlloIgiene.isSelected()||bookingData.flow8SlotsShown)){
flowControlloIgiene.onFirstSlotConfirmed({ slot, clinicId, day });
return;
}
formSection5.classList.remove("active");
formSection5.classList.add("done");
formSection4.classList.add("active");
sectionSlot.showSummary(true);
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("selezione_slot");
}}
});
const sectionSlotStep2=new SectionSlot({
container: document.getElementById("booking-owl-reservation-step2"),
mapContainer: sectionSlotStep2Host ? sectionSlotStep2Host.querySelector(".grid-booking-box-3"):null,
box1Container: sectionSlotStep2Host ? sectionSlotStep2Host.querySelector(".grid-booking-box-1"):null,
box2Container: sectionSlotStep2Host ? sectionSlotStep2Host.querySelector(".grid-booking-box-2"):null,
containerId: "booking-owl-reservation-step2",
navContainerId: "custom_slider_nav_step2",
clinicSlotsContainerId: "clinic-slots-container-step2",
onSlotConfirmed: function ({ slot, clinicId, day }){
bookingData.selectedSlot=slot;
bookingData.selectedClinicId=clinicId;
bookingData.selectedDay=day;
if(flowControlloIgiene&&flowControlloIgiene.isSelected()&&bookingData.flow8FirstAppointment){
flowControlloIgiene.showFlow8SummarySection();
return;
}
var step2Section=formSection6Flow8||formSection6;
if(step2Section){
step2Section.classList.remove("active");
step2Section.classList.add("done");
}
formSection4.classList.add("active");
bookingScroll();
sectionSlotStep2.showSummary(true);
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("selezione_slot_secondo_appuntamento");
}}
});
var formSection4SubmitAp=formSection4.querySelector(".submit");
if(formSection4SubmitAp){
formSection4SubmitAp.classList.add("cta-btn-grandient", "cta-dark");
}
var formSection4CallbackAncAp=formSection4.querySelector(".booking-callback-request-btn");
if(formSection4CallbackAncAp){
formSection4CallbackAncAp.classList.add("cta-btn-grandient", "cta-dark");
}
if(typeof window.BookingFlowControlloIgieneOrale==="function"){
flowControlloIgiene=new window.BookingFlowControlloIgieneOrale({
pageBooking: pageBooking,
bookingData: bookingData,
formSection2Yes: formSection2_yes,
formSection2No: formSection2_no,
formSection3: formSection3,
formSection4: formSection4,
formSection5: formSection5,
formSection6: sectionSlotStep2Host,
formSection7: formSection7,
formSectionSelectByComune: formSectionSelectByComune,
formSection1Specialista: formSection1Specialista,
subtitleSection4No: subtitleSection4no,
subtitleSection4Yes: subtitleSection4yes,
formSection4SubmitLabelNo: formSection4.querySelector(".submit .direct-field-n"),
formSection4SubmitLabelYes: formSection4.querySelector(".submit .direct-field-y"),
section4DefaultLabelNo: formSection4.querySelector(".submit .direct-field-n") ? formSection4.querySelector(".submit .direct-field-n").textContent:"",
section4DefaultLabelYes: formSection4.querySelector(".submit .direct-field-y") ? formSection4.querySelector(".submit .direct-field-y").textContent:"",
sectionSlot: sectionSlot,
bookingScroll: bookingScroll,
flowApiAction: "dp_booking_flow8_step1_check",
followupSlotsApiAction: "dp_booking_flow8_followup_slots",
igieneSlotsApiAction: "dp_booking_flow8_igiene_slots",
appointmentsApiAction: "dp_booking_flow8_appointments",
sectionSlotStep2: sectionSlotStep2,
passEvodentSessionBearer: !apGuestLikeFrontendFlow,
useDashboardBookingThankyou: true,
});
}
if(selectCityContainer&&typeof BookingSelezioneCentri==="function"){
new BookingSelezioneCentri(selectCityContainer, {
placeholder: "Cerca una clinica...",
onSelect: function (clinic){
if(!bookingData.location) bookingData.location={};
selectCityContainerSelectClinicID=clinic.cod;
bookingData.location.code=selectCityContainerSelectClinicID;
},
});
}
var checkboxClinicSearch=formSectionSelectByComune ? formSectionSelectByComune.querySelector("#clinic-search"):null;
if(checkboxClinicSearch&&selectCityContainer){
function updateZoneFieldsVisibilityAp(){
if(!bookingData.location) bookingData.location={};
if(checkboxClinicSearch.checked){
selectCityContainer.classList.remove("d-none");
bookingData.location.code=null;
}else{
selectCityContainer.classList.add("d-none");
bookingData.location.code=selectCityContainerSelectClinicID;
}}
checkboxClinicSearch.addEventListener("change", updateZoneFieldsVisibilityAp);
updateZoneFieldsVisibilityAp();
}
if(slotNotFound){
slotNotFound.addEventListener("click", function (e){
if(flowControlloIgiene&&flowControlloIgiene.isSelected()){
e.preventDefault();
e.stopPropagation();
flowControlloIgiene.enterFlow8RicontattoFromSlots();
return;
}
e.preventDefault();
if(typeof window.bookingSwitchToRicontattoFromDirectMidFlow==="function"){
window.bookingSwitchToRicontattoFromDirectMidFlow(bookingData);
}else if(typeof window.bookingApplyNonDirectRicontattoGlobals==="function"){
window.bookingApplyNonDirectRicontattoGlobals();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.onRicontattoSwitch();
}}
if(typeof window.showBookingFields==="function"){
window.showBookingFields(false);
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("richiesta_ricontatto_da_slot");
}
formSection5.classList.remove("active");
formSection5.classList.add("done");
var h3s5=formSection5.querySelector("h3");
if(h3s5) h3s5.innerText="Richiesta di essere ricontattato";
if(subtitleSection4no) subtitleSection4no.classList.add("d-none");
if(subtitleSection4yes) subtitleSection4yes.classList.remove("d-none");
var sumBox=formSection4.querySelector(".summary-box");
if(sumBox) sumBox.classList.add("d-none");
formSection4.classList.add("active");
bookingScroll();
});
}
formSection5.style.setProperty("display", "none", "important");
if(formSection6) formSection6.style.setProperty("display", "none", "important");
initBookingAddressAutocomplete();
selectedCardDirectBooking=null;
bookingData.flow8FrontendTemporaryZonaDati=false;
function clearFlow8TemporaryZonaDatiPathAp(){
bookingData.flow8FrontendTemporaryZonaDati=false;
}
function isFlow8TemporaryZonaDatiCardAp(card){
return typeof window.bookingIsFlow8TemporaryZonaDatiPath==="function"&&window.bookingIsFlow8TemporaryZonaDatiPath(card);
}
function apSyncDirectBookingUiFlagsFromCard(card){
if(!card) return;
var isDirectBooking=card.getAttribute("data-direct-booking")==="1";
var searchClinics=document.querySelector(".search-clinics");
if(searchClinics){
searchClinics.classList.toggle("disabled", isDirectBooking);
}
var rowClinics=document.querySelector(".locator-results-mine");
if(rowClinics){
rowClinics.classList.toggle("direct-booking", isDirectBooking);
}
var rowSearchZone=document.querySelector(".row-search-zone");
if(rowSearchZone){
rowSearchZone.classList.toggle("disabled", !isDirectBooking);
}
window.selectedCardDirectBooking=card.getAttribute("data-direct-booking");
}
function activateFlow8TemporaryZonaDatiPathAp(card){
bookingData.flow8FrontendTemporaryZonaDati=true;
if(flowControlloIgiene){
flowControlloIgiene.resetState();
flowControlloIgiene.setSelectedFlowId(null);
flowControlloIgiene.clearUiForDefaultFlow();
}
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSection2_yes) formSection2_yes.classList.remove("active", "done");
if(formSection2_no) formSection2_no.classList.remove("active", "done");
if(formSection3) formSection3.classList.remove("active", "done");
if(formSection4) formSection4.classList.remove("active", "done");
if(formSection5) formSection5.classList.remove("active", "done");
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.classList.remove("active", "done");
}
var titleEl=card.querySelector(".box-location-title");
var title=titleEl ? titleEl.textContent.trim():"";
var evodentId=card.getAttribute("data-evodent-id");
bookingData.service=title;
if(evodentId){
bookingData.prestazioneId=evodentId;
if(typeof prestazioneId!=="undefined"){
prestazioneId=evodentId;
}}
if(title){
sectionSlot.setClinicEsigenza(title);
}
apSyncDirectBookingUiFlagsFromCard(card);
if(formSectionSelectByComune){
formSectionSelectByComune.classList.remove("done");
}
directBookingCustomerYes();
bookingScroll();
}
card_esigenza.forEach(function (card){
card.addEventListener("click", function (){
handleCardEsigenzaClick(this, card_esigenza);
if(isFlow8TemporaryZonaDatiCardAp(this)){
activateFlow8TemporaryZonaDatiPathAp(this);
return;
}
clearFlow8TemporaryZonaDatiPathAp();
window.selectedCardDirectBooking=this.getAttribute("data-direct-booking");
if(flowControlloIgiene){
flowControlloIgiene.setSelectedFlowId(this.getAttribute("data-evodent-id"));
if(flowControlloIgiene.isSelected()){
return;
}}
if(this.getAttribute("data-direct-booking")==="1"){
var visitTitleEl=card.querySelector(".box-location-title");
var visitTitle=visitTitleEl ? (visitTitleEl.textContent||"").trim():"";
if(visitTitle){
bookingData.service=visitTitle;
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.setTipologiaVisita(visitTitle);
}}
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
if(this.getAttribute("data-show-specialista-section")==="1"&&formSection1Specialista){
bookingData.areaSpecializzazioneIds=[];
formSection1Specialista.classList.remove("d-none");
formSection1Specialista.setAttribute("aria-hidden", "false");
formSection1Specialista.classList.add("active");
if(formSectionSelectByComune) formSectionSelectByComune.classList.remove("active");
}else{
directBookingCustomerYes();
}
bookingScroll();
return;
}
var isDirectBooking=this.getAttribute("data-direct-booking")==="1";
var searchClinics=document.querySelector('.search-clinics');
if(searchClinics){
searchClinics.classList.toggle('disabled', isDirectBooking);
}
var rowClinics=document.querySelector('.locator-results-mine');
if(rowClinics){
rowClinics.classList.toggle('direct-booking', isDirectBooking);
}
var rowSearchZone=document.querySelector('.row-search-zone');
if(rowSearchZone){
rowSearchZone.classList.toggle('disabled', !isDirectBooking);
}});
});
var zoneSelection=document.querySelector('#check-zone-section');
if(zoneSelection&&zoneFields){
zoneSelection.addEventListener('change', function (){
if(zoneSelection.checked){
zoneFields.classList.remove('disabled');
}else{
zoneFields.classList.add('disabled');
}});
if(zoneSelection.checked){
zoneFields.classList.remove('disabled');
}else{
zoneFields.classList.add('disabled');
}}
var numAccounts=1;
isProspect=false;
var decodedToken=null;
if(userData.PatientWebCard==null||apGuestLikeFrontendFlow){
if(userData.PatientWebCard==null){
isProspect=true;
}
document.querySelector("#booking_customer_yes").checked=false;
document.querySelector("#booking_customer_no").checked=true;
bookingCustomerNo();
decodedToken=apGetDecodedAccessToken()||{};
var mainLabel =
(decodedToken.given_name||"") + " " + (decodedToken.family_name||"");
mainLabel=mainLabel.trim()||"Account";
var accountsHtml =
'<div class="form-check"><input class="form-check-input" type="radio" name="booking_account" id="booking_customer_account_main" data-account="main" checked><label class="form-check-label" for="booking_customer_account_main">' +
mainLabel +
"</label></div>";
}else{
formSection1.classList.add("cards-yes-active");
document.querySelector("#booking_customer_yes").checked=true;
document.querySelector("#booking_customer_no").checked=false;
bookingCustomerYes();
var accountsHtml =
'<div class="form-check"><input class="form-check-input" type="radio" name="booking_account" id="booking_customer_account_main" data-account="main" checked><label class="form-check-label" for="booking_customer_account_main">' +
userData.PatientWebCard.Paziente.PazienteNome +
" " +
userData.PatientWebCard.Paziente.PazienteCognome +
"</label></div>";
for (let i=0; i < userData.PatientWebCard.Correlati.length; i++){
numAccounts++;
accountsHtml +=
'<div class="form-check"><input class="form-check-input" type="radio" name="booking_account" id="booking_customer_account_' +
i +
'" data-account="' +
userData.PatientWebCard.Correlati[i].PazienteCorrelatoId +
'"><label class="form-check-label" for="booking_customer_account_' +
i +
'">' +
userData.PatientWebCard.Correlati[i].PazienteNome +
" " +
userData.PatientWebCard.Correlati[i].PazienteCognome +
"</label></div>";
}
accountsHtml +='<div class="form-check"><input class="form-check-input" type="radio" name="booking_account" id="booking_customer_account_other" data-account="other"><label class="form-check-label" for="booking_customer_account_other">Qualcun altro</label></div>';
}
document.querySelector(".accounts-list").innerHTML=accountsHtml;
document.querySelectorAll('input[name="booking_account"]').forEach(function (radio){
radio.addEventListener('change', function (){
const bookedByFields=document.querySelectorAll('.bookedby-field');
if(document.getElementById("booking_customer_account_other").checked){
bookedByFields.forEach(field=> field.classList.add('active'));
}else{
bookedByFields.forEach(field=> field.classList.remove('active'));
}
var accountIdChange=this.getAttribute("data-account")||"main";
apSyncEmailCustomerToDataLayer(accountIdChange);
});
});
apSyncEmailCustomerToDataLayer("main");
var setupFormStep0=function (e){
clearFlow8TemporaryZonaDatiPathAp();
if(flowControlloIgiene) flowControlloIgiene.resetState();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.resetSteps();
}
returnStep0.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(formSection1Specialista){
formSection1Specialista.classList.add("d-none");
formSection1Specialista.setAttribute("aria-hidden", "true");
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
bookingData.areaSpecializzazioneIds=[];
}
if(box3Container) box3Container.innerHTML="";
formSection0.classList.remove("done");
formSection0.classList.add("active");
if(document.querySelector("#booking_customer_yes").checked){
bookingCustomerYes();
}
if(document.querySelector("#booking_customer_no").checked){
bookingCustomerNo();
}
bookingSosNo();
bookingScroll();
if(e){
e.preventDefault();
}};
setupFormStep0();
formSection0
.querySelector(".changesection")
.addEventListener("click", setupFormStep0);
formSection1
.querySelector(".changesection")
.addEventListener("click", function (e){
clearFlow8TemporaryZonaDatiPathAp();
if(flowControlloIgiene) flowControlloIgiene.resetState();
returnStep1.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
resetSection1Specialista();
formSection1.classList.remove("done");
formSection1.classList.add("active");
if(document.querySelector("#booking_customer_yes").checked){
bookingCustomerYes();
}
if(document.querySelector("#booking_customer_no").checked){
bookingCustomerNo();
}
bookingSosNo();
bookingScroll();
e.preventDefault();
});
formSection2_yes
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep2.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
formSection2_yes.classList.remove("done");
formSection2_yes.classList.add("active");
formSection2_no.classList.remove("done");
formSection2_no.classList.add("active");
bookingScroll();
e.preventDefault();
});
formSection2_no
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep2.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
if(box3Container) box3Container.innerHTML="";
formSection2_yes.classList.remove("done");
formSection2_yes.classList.add("active");
formSection2_no.classList.remove("done");
formSection2_no.classList.add("active");
bookingScroll();
e.preventDefault();
});
formSection3
.querySelector(".changesection")
.addEventListener("click", function (e){
clearBookingErrors();
formSection4.classList.remove("active");
formSection3.classList.remove("done");
formSection3.classList.add("active");
if(formSection5.classList.contains("active"))
formSection5.classList.remove("active");
if(box3Container) box3Container.innerHTML="";
bookingScroll();
e.preventDefault();
});
formSection5
.querySelector(".changesection")
.addEventListener("click", function (e){
returnStep5.forEach(function (section){
if(section&&section.classList.contains("done")) section.classList.remove("done");
if(section&&section.classList.contains("active")) section.classList.remove("active");
});
formSection5.classList.add("active");
formSection5.querySelector("h3").innerText="Seleziona";
bookingScroll();
e.preventDefault();
});
formSection1Specialista
.querySelector(".changesection")
.addEventListener("click", function (e){
formSection3.classList.remove("active");
formSection3.classList.remove("done");
formSection4.classList.remove("active");
formSection4.classList.remove("done");
formSection5.classList.remove("active");
formSection5.classList.remove("done");
if(formSectionSelectByComune){
formSectionSelectByComune.classList.remove("active");
formSectionSelectByComune.classList.remove("done");
}
if(formSection6){
formSection6.classList.remove("active");
formSection6.classList.remove("done");
}
if(formSection6Flow8&&formSection6Flow8!==formSection6){
formSection6Flow8.classList.remove("active");
formSection6Flow8.classList.remove("done");
}
if(formSection7){
formSection7.classList.remove("active");
formSection7.classList.remove("done");
}
formSection2_yes.classList.remove("active");
formSection2_yes.classList.remove("done");
formSection2_no.classList.remove("active");
formSection2_no.classList.remove("done");
formSection1Specialista.classList.remove("done");
formSection1Specialista.classList.add("active");
bookingScroll();
e.preventDefault();
});
if(formSectionSelectByComune){
var comuneCta=formSectionSelectByComune.querySelector(".cta");
if(comuneCta){
comuneCta.addEventListener("click", function (e){
if(flowControlloIgiene&&flowControlloIgiene.isSelected()){
return;
}
var addressInputs=formSectionSelectByComune.querySelectorAll(".autocomplete.booking-address");
var hasZone=false;
for (var zi=0; zi < addressInputs.length; zi++){
var latField=addressInputs[zi].parentNode.querySelector(".booking-lat");
var lngField=addressInputs[zi].parentNode.querySelector(".booking-lng");
if(latField&&lngField&&latField.value&&lngField.value){
hasZone=true;
break;
}}
var checkboxClinicAp=formSectionSelectByComune.querySelector("#clinic-search");
var hasClinic =
checkboxClinicAp &&
checkboxClinicAp.checked &&
(selectCityContainerSelectClinicID||(bookingData.location&&bookingData.location.code));
var isValid=hasZone||hasClinic;
var errorRowAp=formSectionSelectByComune.querySelector(".selection-by-comune-error");
var errorDivAp=errorRowAp ? errorRowAp.querySelector(".error"):null;
var errorPAp=errorDivAp ? errorDivAp.querySelector("p"):null;
if(!isValid){
e.preventDefault();
if(errorDivAp) errorDivAp.classList.add("active");
if(errorPAp) errorPAp.textContent="Inserisci una zona di preferenza o seleziona un centro";
return;
}
if(errorDivAp) errorDivAp.classList.remove("active");
if(errorPAp) errorPAp.textContent="";
formSectionSelectByComune.classList.remove("active");
formSectionSelectByComune.classList.add("done");
if(bookingData.flow8FrontendTemporaryZonaDati){
if(typeof window.bookingSyncZonaPreferenzaToBookingData==="function"){
window.bookingSyncZonaPreferenzaToBookingData(formSectionSelectByComune, bookingData);
}
if(formSection3) formSection3.classList.remove("active", "done");
if(formSection5) formSection5.classList.remove("active", "done");
formSection4.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}
e.preventDefault();
return;
}
formSection3.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}
e.preventDefault();
});
}}
for (let i=0; i < bookingLocations.length; i++){
bookingLocations[i].addEventListener("click", function (){
var cardEsigenza=this.closest(".card-esigenza");
if(cardEsigenza&&isFlow8TemporaryZonaDatiCardAp(cardEsigenza)){
handleCardEsigenzaClick(cardEsigenza, card_esigenza);
activateFlow8TemporaryZonaDatiPathAp(cardEsigenza);
subtitle=this.querySelector(".box-location-address");
if(subtitle!=null){
subtitle=subtitle.innerHTML;
}
title=this.querySelector(".box-location-title").innerHTML;
var titleTextAp=this.querySelector(".box-location-title").textContent
? this.querySelector(".box-location-title").textContent.trim()
: "";
formSection1.querySelector(".details p").innerHTML =
"<strong>" + title + "</strong>" + (subtitle ? ", " + subtitle:"");
if(typeof dataLayer!=="undefined"&&dataLayer.push){
dataLayer.push({ event: "FP_step2_esigenza", FP_step2_esigenza_value: title });
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleTextAp||title,
});
}
return;
}
if(cardEsigenza){
handleCardEsigenzaClick(cardEsigenza, card_esigenza);
}
clearFlow8TemporaryZonaDatiPathAp();
var showSpecialista=cardEsigenza&&cardEsigenza.getAttribute("data-show-specialista-section")==="1";
var selectedEvodentId=cardEsigenza ? cardEsigenza.getAttribute("data-evodent-id"):null;
if(flowControlloIgiene) flowControlloIgiene.setSelectedFlowId(selectedEvodentId);
subtitle=this.querySelector(".box-location-address");
if(subtitle!=null){
subtitle=subtitle.innerHTML;
}
title=this.querySelector(".box-location-title").innerHTML;
var titleTextAp=this.querySelector(".box-location-title").textContent
? this.querySelector(".box-location-title").textContent.trim()
: "";
formSection1.querySelector(".details p").innerHTML =
"<strong>" + title + "</strong>" + (subtitle ? ", " + subtitle:"");
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(flowControlloIgiene&&flowControlloIgiene.handleAfterEsigenzaSelection(showSpecialista)){
sectionSlot.setClinicEsigenza(title);
bookingData.service=title;
dataLayer.push({ event: "FP_step2_esigenza", FP_step2_esigenza_value: title });
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleTextAp||title,
});
}
return;
}
if(flowControlloIgiene) flowControlloIgiene.clearUiForDefaultFlow();
if(showSpecialista&&formSection1Specialista){
bookingData.areaSpecializzazioneIds=[];
formSection1Specialista.classList.remove("d-none");
formSection1Specialista.setAttribute("aria-hidden", "false");
formSection1Specialista.classList.add("active");
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){
c.classList.remove("selected");
});
bookingScroll();
sectionSlot.setClinicEsigenza(title);
bookingData.service=title;
dataLayer.push({ event: "FP_step2_esigenza", FP_step2_esigenza_value: title });
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleTextAp||title,
});
}
return;
}
titleslug=title.toLowerCase().split(" ").join("-");
switch (titleslug){
case "urgenze":
bookingSosYes();
break;
case "urgenza":
bookingSosYes();
break;
default:
formSection2_yes.classList.add("active");
formSection2_no.classList.add("active");
break;
}
bookingScroll();
sectionSlot.setClinicEsigenza(title);
bookingData.service=title;
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: title,
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: cardEsigenza,
tipologia_visita_raw: titleTextAp||title,
});
}});
}
if(formSection1Specialista){
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (card){
card.addEventListener("click", function (){
formSection1Specialista.querySelectorAll(".card-specialista").forEach(function (c){ c.classList.remove("selected"); });
this.classList.add("selected");
var titleEl=this.querySelector(".box-location-title");
var title=titleEl ? titleEl.textContent.trim():"";
var detailsP=formSection1Specialista.querySelector(".row.details .col-7 p");
if(detailsP) detailsP.textContent=title;
var id=this.getAttribute("data-area-specializzazione-id");
bookingData.areaSpecializzazioneIds=id ? [parseInt(id, 10)]:[];
formSection1Specialista.classList.remove("active");
formSection1Specialista.classList.add("done");
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("specialistica", {
specialistica_raw: title,
});
}
if(flowControlloIgiene&&flowControlloIgiene.handleAfterSpecialistaSelection()){
bookingScroll();
return;
}
var isDirectBookingSpecialista =
(window.selectedCardDirectBooking||selectedCardDirectBooking)==="1";
if(isDirectBookingSpecialista){
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
directBookingCustomerYes();
}else{
formSection2_yes.classList.add("active");
formSection2_no.classList.add("active");
}
bookingScroll();
});
});
}
(function bindSwitchFromSpecialistaToGeneraleAp(){
if(!formSection1Specialista||!formSection1) return;
var notifySwitchGenerale=formSection1Specialista.querySelector(".notify-yellow__switch-generale-link");
if(!notifySwitchGenerale) return;
function switchFromSpecialistaToGeneraleFlowAp(){
if(!formSection1Specialista.classList.contains("active")) return;
var genCard =
formSection1.querySelector('.card-esigenza[data-booking-generale-flow="1"]') ||
Array.prototype.find.call(formSection1.querySelectorAll(".card-esigenza"), function (c){
return (
c.getAttribute("data-show-specialista-section")!=="1" &&
c.getAttribute("data-direct-booking")==="1"
);
});
if(!genCard) return;
if(isFlow8TemporaryZonaDatiCardAp(genCard)){
resetSection1Specialista();
handleCardEsigenzaClick(genCard, card_esigenza);
activateFlow8TemporaryZonaDatiPathAp(genCard);
}else{
clearFlow8TemporaryZonaDatiPathAp();
if(flowControlloIgiene){
flowControlloIgiene.setSelectedFlowId(genCard.getAttribute("data-evodent-id"));
if(!flowControlloIgiene.isSelected()){
flowControlloIgiene.clearUiForDefaultFlow();
}}
resetSection1Specialista();
handleCardEsigenzaClick(genCard, card_esigenza);
apSyncDirectBookingUiFlagsFromCard(genCard);
}
var box=genCard.querySelector(".box-location");
var titleEl=box&&box.querySelector(".box-location-title");
var subEl=box&&box.querySelector(".box-location-address");
var titleHtml=titleEl ? titleEl.innerHTML:"";
var subtitleHtml=subEl ? subEl.innerHTML:"";
var detailsP=formSection1.querySelector(".details p");
if(detailsP){
detailsP.innerHTML =
"<strong>" + titleHtml + "</strong>" + (subtitleHtml ? ", " + subtitleHtml:"");
}
formSection1.classList.remove("active");
formSection1.classList.add("done");
if(formSectionSelectByComune&&!bookingData.flow8FrontendTemporaryZonaDati){
formSectionSelectByComune.classList.remove("active");
formSectionSelectByComune.classList.remove("done");
}
if(formSection2_yes) formSection2_yes.classList.remove("active");
if(formSection2_no) formSection2_no.classList.remove("active");
if(bookingData.flow8FrontendTemporaryZonaDati){
}else if(flowControlloIgiene&&flowControlloIgiene.isSelected()){
flowControlloIgiene.ensureSectionSelectionOrderForFlow8();
flowControlloIgiene.goToSectionSelectionByComune(false);
}else if(apGuestLikeFrontendFlow&&genCard.getAttribute("data-direct-booking")==="1"){
directBookingCustomerYes();
}else{
var titleslug=(titleEl ? titleEl.textContent:"")
.toLowerCase()
.trim()
.split(/\s+/)
.join("-");
switch (titleslug){
case "urgenze":
case "urgenza":
bookingSosYes();
break;
default:
if(formSection2_yes) formSection2_yes.classList.add("active");
if(formSection2_no) formSection2_no.classList.add("active");
break;
}}
bookingData.service=titleEl ? titleEl.textContent.trim():"";
sectionSlot.setClinicEsigenza(titleHtml);
if(typeof dataLayer!=="undefined"&&dataLayer.push){
dataLayer.push({
event: "FP_step2_esigenza",
FP_step2_esigenza_value: titleHtml,
});
}
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.setTipologiaVisita(bookingData.service);
window.bookingOnlineDataLayer.trackStep("tipologia_visita", {
sync_card: genCard,
tipologia_visita_raw: bookingData.service,
});
}
bookingScroll();
}
notifySwitchGenerale.addEventListener("click", function (e){
e.preventDefault();
switchFromSpecialistaToGeneraleFlowAp();
});
})();
document
.querySelector("#booking_time_choose")
.addEventListener("change", function (){
formSection3.querySelector(".times").style.display=this.checked
? "flex"
: "none";
if(this.checked){
this.parentNode.parentNode.classList.add("line-bordered");
}else{
this.parentNode.parentNode.classList.remove("line-bordered");
}});
document
.querySelector("#booking_time_asap")
.addEventListener("change", function (){
formSection3.querySelector(".times").style.display="none";
this.parentNode.parentNode.classList.remove("line-bordered");
});
document
.querySelector("#booking_customer_yes")
.addEventListener("change", function (){
bookingCustomerYes();
formSection1.classList.add("cards-yes-active");
formSection1.classList.remove("cards-no-active");
});
document
.querySelector("#booking_customer_no")
.addEventListener("change", function (){
bookingCustomerNo();
formSection1.classList.add("cards-no-active");
formSection1.classList.remove("cards-yes-active");
});
formSection0
.querySelector(".cta")
.addEventListener("click", function (e){
title=document.querySelector('input[name="booking_account"]:checked + label'
).innerHTML;
if(document.querySelector("#booking_customer_yes").checked){
bookingData.customer=true;
}else{
bookingData.customer=false;
}
formSection0.querySelector(".details p").innerHTML=title;
formSection0.classList.remove("active");
formSection0.classList.add("done");
formSection1.classList.add("active");
bookingScroll();
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.activatePatientFlow();
window.bookingOnlineDataLayer.trackStep("selezione_account");
}
var accountId=document
.querySelector('input[name="booking_account"]:checked')
.getAttribute("data-account");
var bookingAccount=null;
if(!isProspect&&!apGuestLikeFrontendFlow){
if(accountId=="main"||accountId=="other"){
bookingAccount=userData.PatientWebCard.Paziente;
}else{
for (
let i=0;
i < userData.PatientWebCard.Correlati.length;
i++
){
if(accountId==userData.PatientWebCard.Correlati[i].PazienteCorrelatoId
){
bookingAccount=userData.PatientWebCard.Correlati[i];
}}
}}
if(bookingAccount){
document.getElementById("booking-firstname").value =
bookingAccount.PazienteNome;
document.getElementById("booking-lastname").value =
bookingAccount.PazienteCognome;
document.getElementById("booking-phone").value =
bookingAccount.PazienteTelefono;
document.getElementById("booking-email").value =
bookingAccount.PazienteEmail;
document.getElementById("booking-marketing").checked =
typeof bookingAccount.PazientiPrivacy_3_Marketing!=="undefined"
? bookingAccount.PazientiPrivacy_3_Marketing
: false;
document.getElementById("booking-profile").checked =
typeof bookingAccount.PazientiPrivacy_4_Profilazione!=="undefined"
? bookingAccount.PazientiPrivacy_4_Profilazione
: false;
var accPid =
bookingAccount.PazienteId!=null&&String(bookingAccount.PazienteId).trim()!==""
? bookingAccount.PazienteId
: bookingAccount.PazienteCorrelatoId;
if(accPid!=null&&String(accPid).trim()!==""){
bookingData.pazienteId=String(accPid).trim();
}}
if(isProspect||apGuestLikeFrontendFlow){
decodedToken=apGetDecodedAccessToken()||decodedToken||{};
document.getElementById("booking-firstname").value =
decodedToken.given_name||"";
document.getElementById("booking-lastname").value =
decodedToken.family_name||"";
document.getElementById("booking-email").value =
decodedToken.email||"";
document.getElementById("booking-phone").value =
decodedToken.telephone||"";
document.getElementById("booking-marketing").checked =
decodedToken.market_consent
? decodedToken.market_consent.toString().toLowerCase()=="true"
: false;
document.getElementById("booking-profile").checked =
decodedToken.profiling_consent
? decodedToken.profiling_consent.toString().toLowerCase()=="true"
: false;
if(!apGuestLikeFrontendFlow&&decodedToken.profile!=null&&String(decodedToken.profile).trim()!==""){
bookingData.pazienteId=String(decodedToken.profile).trim();
}else if(apGuestLikeFrontendFlow){
delete bookingData.pazienteId;
}}
var emailFromForm=document.getElementById("booking-email");
var resolvedEmail =
emailFromForm&&emailFromForm.value
? String(emailFromForm.value).trim()
: apResolveEmailForAccount(accountId);
if(resolvedEmail){
bookingData.email=resolvedEmail;
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.setEmailCustomer(resolvedEmail);
}}
dataLayer.push({
event: "FP_step1_paziente",
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
e.preventDefault();
});
if(numAccounts==1){
formSection0.querySelector(".cta").click();
formSection0.classList.add("hide");
}
formSection2_no
.querySelector(".cta")
.addEventListener("click", function (e){
var title=[];
titles=this.parentNode.querySelectorAll(".address");
for (let i=0; i < titles.length; i++){
title.push(titles[i].value);
}
var title=title.filter(function (el){
return el!=null&&el!="";
});
if(title.length){
this.parentNode.querySelector(".hint").style.display="none";
formSection2_no.querySelector(".details p").innerHTML =
title.join("<br>");
formSection2_no.classList.remove("active");
formSection2_yes.classList.add("done");
formSection2_no.classList.remove("active");
formSection2_no.classList.add("done");
var isDirectBookingCard=(window.selectedCardDirectBooking||selectedCardDirectBooking)==="1";
if(isDirectBookingCard){
formSection3.classList.add("active");
}else{
formSection4.classList.add("active");
bookingData.times=[];
}
bookingScroll();
bookingData.location=title.join("\n\n");
bookingData.locations=title;
dataLayer.push({
event: "FP_step3_centro",
FP_step3_centro_value: title.join(" - "),
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}}else{
this.parentNode.querySelector(".hint").style.display="block";
}
e.preventDefault();
});
pageBooking.querySelectorAll(".s2-direct-booking").forEach(function (s2Btn){
s2Btn.addEventListener("click", function (e){
if(directBooking){
var addresses=[];
var addressInputs=formSection2_yes.querySelectorAll('.address');
for (let i=0; i < addressInputs.length; i++){
if(addressInputs[i].value) addresses.push(addressInputs[i].value);
}
var clinics=[];
var clinicInputs=formSection2_yes.querySelectorAll('.clinic:checked');
for (let i=0; i < clinicInputs.length; i++){
clinics.push(clinicInputs[i].value);
}
var selections=[...addresses, ...clinics].filter(Boolean);
if(selections.length){
formSection2_yes.querySelector('.details p').innerHTML=selections.join('<br>');
formSection2_yes.classList.remove('active');
formSection2_yes.classList.add('done');
var isDirectBookingCardS2=(window.selectedCardDirectBooking||selectedCardDirectBooking)==="1";
if(isDirectBookingCardS2){
formSection3.classList.add('active');
}else{
formSection4.classList.add("active");
bookingData.times=[];
}
bookingScroll();
bookingData.locations=selections;
dataLayer.push({
event: "FP_step3_centro",
FP_step3_centro_value: selections.join(" - "),
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("centro_o_zona");
}}else{
}
e.preventDefault();
}else{
e.preventDefault();
}});
});
formSection3
.querySelector(".cta")
.addEventListener("click", function (e){
title=[];
bookingData.timesAsap =
document.querySelector("#booking_time_asap").checked;
if(bookingData.timesAsap){
title.push(document.querySelector('label[for="booking_time_asap"]')
.innerHTML
);
}
bookingData.timesChoose=document.querySelector("#booking_time_choose"
).checked;
if(bookingData.timesChoose){
hours=formSection3.querySelectorAll(".times .form-check-input");
for (let i=0; i < hours.length; i++){
if(hours[i].checked){
title.push(hours[i].value);
}}
}
if(title.length==0){
title.push(document.querySelector('label[for="booking_time_asap"]')
.innerHTML
);
}
bookingData.times=title;
var cleanedTitle=title.map(function (t){
return t.replace(/^(lunedì|martedì|mercoledì|giovedì|venerdì|sabato|domenica)\s*/i,
""
);
});
formSection3.querySelector(".details p").innerHTML =
cleanedTitle.join("<br>");
formSection3.classList.remove("active");
formSection3.classList.add("done");
var coords=getBookingAddressCoords();
if((window.selectedCardDirectBooking||selectedCardDirectBooking)=="1"){
formSection5.classList.add("active");
var clinicaId=null;
if(bookingData.location&&bookingData.location.code){
clinicaId=bookingData.location.code;
}
var selectedCard=null;
card_esigenza.forEach(function (card){
if(card.classList.contains("selected")){
selectedCard=card;
}});
if(selectedCard){
prestazioneId=selectedCard.getAttribute("data-evodent-id");
}
var DataInizio=getFormattedData(selectedDate.value);
reservationArgs={
ClinicaId: clinicaId ? [clinicaId]:[],
DataInizio: DataInizio,
PageUrl: bookingData.pageUrl||window.location.href,
PrestazioneId: prestazioneId||null,
AreaSpecializzazioneId: Array.isArray(bookingData.areaSpecializzazioneIds) ? bookingData.areaSpecializzazioneIds:[],
Source: "Website",
PhoneNumber: "",
PreferenzeOrario: [],
};
if(coords&&coords.length){
var posCount=1;
coords.forEach(function (coord){
if(coord){
reservationArgs["Posizione" + posCount]={
Latitudine: coord.Latitudine,
Longitudine: coord.Longitudine,
};
posCount++;
}});
}
if(document.querySelector("#booking_time_asap").checked){
reservationArgs.PreferenzeOrario.push("ASAP");
}else{
for (let i=0; i < hours.length; i++){
if(hours[i].checked){
var onlyHour;
if(/dopo le 18/i.test(hours[i].value)){
onlyHour=">18";
}else{
var match=hours[i].value.match(/(\d{1,2})\s*-\s*(\d{1,2})/);
onlyHour=match ? match[1] + "-" + match[2]:hours[i].value;
}
reservationArgs.PreferenzeOrario.push(onlyHour);
}}
}
sectionSlot.showLoader();
function handleReservationResponse(response){
var container=document.getElementById("booking-owl-reservation");
if(!container) return;
container.innerHTML="";
var freeSlots=response.data ? response.data.FreeOperatorSlots:null;
if(!freeSlots||Object.keys(freeSlots).length===0){
let message="Carica altri slot";
retryCount=typeof retryCount==='number' ? retryCount:0;
retryCount++;
if(retryCount > 2){
message="Cambia filtri";
}
container.innerHTML=`
<div class=\"no-slots-message\">
<p>${message}</p>
<button class=\"btn-primary btn-booking-retry\">Carica altri slot</button>
</div>
`;
sectionSlot.hideLoader();
const retryButton=container.querySelector(".btn-booking-retry");
if(retryButton){
retryButton.addEventListener("click", function (){
var noSlotContainer=document.querySelector(".no-slots-message");
noSlotContainer.classList.add("disabled");
container.innerHTML="";
sectionSlot.showLoader();
const currentDate=new Date(reservationArgs.DataInizio);
currentDate.setDate(currentDate.getDate() + 14);
reservationArgs.DataInizio=currentDate.toISOString().split("T")[0] + "T00:00:00Z";
sectionSlot.callReservationYes(reservationArgs, handleReservationResponse);
setTimeout(sectionSlot.hideLoader, 1000);
setTimeout(function (){
noSlotContainer.classList.remove("disabled");
}, 1000);
});
}
return;
}else{
sectionSlot.hideLoader();
retryCount=0;
Object.keys(freeSlots).forEach(function (date){
const html=sectionSlot.generateSlotHtml(date);
container.innerHTML +=html;
});
sectionSlot.initializeCarouselBooking();
}
sectionSlot.selectFirstAvailableDay();
var mapContainer=document.querySelector(".grid-booking-box-3");
if(mapContainer&&response.data&&response.data.Cliniche){
mapContainer.innerHTML="";
var mapDiv=document.createElement("div");
mapDiv.id="google-booking-map";
mapContainer.appendChild(mapDiv);
sectionSlot.initBookingMap(response.data.Cliniche, mapDiv);
document.querySelector(".grid-booking-box-4.d-none").classList.remove("d-none");
}}
sectionSlot.callReservationYes(reservationArgs, handleReservationResponse);
}else{
formSection4.classList.add("active");
}
bookingScroll();
dataLayer.push({
event: "FP_step4_appuntamento",
FP_step4_appuntamento_value: title.join("\r\n"),
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("preferenza_orario");
}
e.preventDefault();
});
function apBookingSection4ValidateAndSyncForSubmit(){
var hasError=false;
var skipRequiredValidation=flowControlloIgiene&&typeof flowControlloIgiene.shouldSkipRequiredValidation==="function"&&flowControlloIgiene.shouldSkipRequiredValidation();
var regName=/^[a-zA-ZàèéìíîïòóôùúûñÁÉÍÓÚÜÑ\s\']+$/;
var regCf=/^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$/i;
var regEmail =
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
var cfVal="";
firstname=formSection4.querySelector("#booking-firstname");
lastname=formSection4.querySelector("#booking-lastname");
phone=formSection4.querySelector("#booking-phone");
phone_prefix=formSection4.querySelector("#booking-phone-dial-code");
email=formSection4.querySelector("#booking-email");
cf=document.querySelector("#booking-cf");
bookedby_phone_final=formSection4.querySelector("#bookedby-phone-final");
bookedby_firstname=formSection4.querySelector("#bookedby-firstname");
bookedby_lastname=formSection4.querySelector("#bookedby-lastname");
bookedby_phone=formSection4.querySelector("#bookedby-phone");
bookedby_phone_prefix=formSection4.querySelector("#bookedby-phone-dial-code");
bookedby_email=formSection4.querySelector("#bookedby-email");
if(!skipRequiredValidation&&!regName.test(firstname.value)){
if(firstname.parentNode.classList.contains("valid")){
firstname.parentNode.classList.remove("valid");
}
firstname.parentNode.classList.add("error");
hasError=true;
}else{
if(firstname.parentNode.classList.contains("error")){
firstname.parentNode.classList.remove("error");
}
firstname.parentNode.classList.add("valid");
}
if(!skipRequiredValidation&&!regName.test(lastname.value)){
if(lastname.parentNode.classList.contains("valid")){
lastname.parentNode.classList.remove("valid");
}
lastname.parentNode.classList.add("error");
hasError=true;
}else{
if(lastname.parentNode.classList.contains("error")){
lastname.parentNode.classList.remove("error");
}
lastname.parentNode.classList.add("valid");
}
if(!skipRequiredValidation &&
(phone.value.length < 9 ||
phone.value.length > 10 ||
(phone.value.charAt(0)!=3&&phone.value.charAt(0)!=0) ||
!/^\d+$/.test(phone.value))
){
if(phone.parentNode.classList.contains("valid")){
phone.parentNode.classList.remove("valid");
}
phone.parentNode.classList.add("error");
hasError=true;
}else{
if(phone.parentNode.classList.contains("error")){
phone.parentNode.classList.remove("error");
}
phone.parentNode.classList.add("valid");
}
if(!skipRequiredValidation&&!regEmail.test(email.value)){
if(email.parentNode.classList.contains("valid")){
email.parentNode.classList.remove("valid");
}
email.parentNode.classList.add("error");
hasError=true;
}else{
if(email.parentNode.classList.contains("error")){
email.parentNode.classList.remove("error");
}
email.parentNode.classList.add("valid");
}
if(cf){
if(cf.value&&!regCf.test(cf.value)){
if(cf.parentNode.classList.contains("valid")){
cf.parentNode.classList.remove("valid");
cfVal=cf.value;
}
cf.parentNode.classList.add("error");
hasError=true;
}else{
if(cf.parentNode.classList.contains("error")){
cf.parentNode.classList.remove("error");
}
cf.parentNode.classList.add("valid");
}}else if(!apGuestLikeFrontendFlow &&
userData &&
userData.PatientWebCard &&
userData.PatientWebCard.Paziente &&
userData.PatientWebCard.Paziente.PazienteCF
){
cfVal=userData.PatientWebCard.Paziente.PazienteCF;
}
var bookingCustomerAccountOther=document.getElementById("booking_customer_account_other");
if(bookingCustomerAccountOther&&bookingCustomerAccountOther.checked){
if(!regName.test(bookedby_firstname.value)){
if(bookedby_firstname.parentNode.classList.contains("valid")){
bookedby_firstname.parentNode.classList.remove("valid");
}
bookedby_firstname.parentNode.classList.add("error");
hasError=true;
}else{
if(bookedby_firstname.parentNode.classList.contains("error")){
bookedby_firstname.parentNode.classList.remove("error");
}
bookedby_firstname.parentNode.classList.add("valid");
}
if(!regName.test(bookedby_lastname.value)){
if(bookedby_lastname.parentNode.classList.contains("valid")){
bookedby_lastname.parentNode.classList.remove("valid");
}
bookedby_lastname.parentNode.classList.add("error");
hasError=true;
}else{
if(bookedby_lastname.parentNode.classList.contains("error")){
bookedby_lastname.parentNode.classList.remove("error");
}
bookedby_lastname.parentNode.classList.add("valid");
}
if(bookedby_phone.value.length < 9 ||
bookedby_phone.value.length > 10 ||
(bookedby_phone.value.charAt(0)!=3&&bookedby_phone.value.charAt(0)!=0) ||
!/^\d+$/.test(bookedby_phone.value)
){
if(bookedby_phone.parentNode.classList.contains("valid")){
bookedby_phone.parentNode.classList.remove("valid");
}
bookedby_phone.parentNode.classList.add("error");
hasError=true;
}else{
if(bookedby_phone.parentNode.classList.contains("error")){
bookedby_phone.parentNode.classList.remove("error");
}
bookedby_phone.parentNode.classList.add("valid");
}
if(!regEmail.test(bookedby_email.value)){
if(bookedby_email.parentNode.classList.contains("valid")){
bookedby_email.parentNode.classList.remove("valid");
}
bookedby_email.parentNode.classList.add("error");
hasError=true;
}else{
if(bookedby_email.parentNode.classList.contains("error")){
bookedby_email.parentNode.classList.remove("error");
}
bookedby_email.parentNode.classList.add("valid");
}}
var bookingForOther=bookingCustomerAccountOther&&bookingCustomerAccountOther.checked;
bookingData.firstname=bookingForOther ? bookedby_firstname.value:firstname.value;
bookingData.lastname=bookingForOther ? bookedby_lastname.value:lastname.value;
bookingData.phone=bookingForOther ? bookedby_phone.value:phone.value;
bookingData.phone_prefix=bookingForOther ? bookedby_phone_prefix.value:phone_prefix.value;
bookingData.email=bookingForOther ? bookedby_email.value:email.value;
bookingData.cf=bookingForOther ? "":cfVal;
if(pageBooking.classList.contains("sos")){
bookingData.sos=true;
bookingData.message =
document.querySelector("#booking-message").value;
}else{
bookingData.sos=false;
bookingData.message="";
}
bookingData.marketing =
document.querySelector("#booking-marketing").checked;
bookingData.profile =
document.querySelector("#booking-profile").checked;
bookingData.pageUrl=window.location.href;
bookingData.pageTitle=document.title;
if(bookingForOther){
bookingData.bookedby=true;
bookingData.bookedby_firstname=bookedby_firstname.value;
bookingData.bookedby_lastname=bookedby_lastname.value;
bookingData.bookedby_phone=bookedby_phone.value;
bookingData.bookedby_phone_prefix=bookedby_phone_prefix.value;
bookingData.bookedby_email=bookedby_email.value;
}else{
bookingData.bookedby=false;
bookingData.bookedby_firstname="";
bookingData.bookedby_lastname="";
bookingData.bookedby_phone="";
bookingData.bookedby_phone_prefix="";
bookingData.bookedby_email="";
}
return hasError;
}
formSection4
.querySelector(".submit")
.addEventListener("click", function (e){
if(typeof window.bookingHideCallbackRequestBtn==="function"){
window.bookingHideCallbackRequestBtn();
}
var hasError=apBookingSection4ValidateAndSyncForSubmit();
var bookingCustomerAccountOther=document.getElementById("booking_customer_account_other");
var bookingForOther=bookingCustomerAccountOther&&bookingCustomerAccountOther.checked;
if(flowControlloIgiene&&typeof flowControlloIgiene.handleSubmitIfFlow8==="function"&&flowControlloIgiene.handleSubmitIfFlow8(hasError)){
e.preventDefault();
return;
}
if(!hasError){
document
.getElementById("email_customer")
.setAttribute("href", "mailto:" + bookingData.email);
document.getElementById("email_customer").innerHTML =
bookingData.email;
dataLayer.push({
event: "FP_step5_inviorichiesta",
convezione: "no",
assicurazione: "no",
informativag: bookingData.marketing ? "si":"no",
informativap: bookingData.profile ? "si":"no",
FP_step1_paziente_value: bookingData.customer ? "si":"no",
});
if(typeof window.bookingOnlineDataLayer!=="undefined"){
window.bookingOnlineDataLayer.trackStep("dati_personali_e_conferma");
}
var isRicontattoSubmitAp =
typeof window.bookingIsRicontattoSubmitMode==="function" &&
window.bookingIsRicontattoSubmitMode();
if(!isRicontattoSubmitAp){
if(!bookingForOther &&
!apGuestLikeFrontendFlow &&
userData &&
userData.PatientWebCard &&
userData.PatientWebCard.Paziente
){
bookingData.pazienteId=userData.PatientWebCard.Paziente.PazienteId;
bookingData.informativa=userData.PatientWebCard.Paziente.PazientiPrivacy_1_Informativa;
bookingData.dirittiModifica=userData.PatientWebCard.Paziente.PazientiPrivacy_2_DirittiModifica;
bookingData.marketing=userData.PatientWebCard.Paziente.PazientiPrivacy_3_Marketing;
bookingData.profile=userData.PatientWebCard.Paziente.PazientiPrivacy_4_Profilazione;
bookingData.grafometrica=userData.PatientWebCard.Paziente.PazientiPrivacy_5_FirmaGrafometrica;
}else{
console.error('PatientWebCard non disponibile:', userData);
bookingData.pazienteId=null;
bookingData.informativa=false;
bookingData.dirittiModifica=false;
bookingData.marketing=false;
bookingData.profile=false;
bookingData.grafometrica=false;
}
bookingData.areaPazienti=true;
var send=sendPostRequestBooking(bookingData);
if(send){
bookingData.reservation=send;
}else{
bookingScroll();
}}else{
var payloadRicontattoAp =
typeof window.bookingBuildRicontattoSubmitPayload==="function"
? window.bookingBuildRicontattoSubmitPayload(bookingData)
: bookingData;
if(typeof window.bookingResolveThankyouClinicOrZone==="function"){
var clinicZoneAp=window.bookingResolveThankyouClinicOrZone(payloadRicontattoAp);
if(clinicZoneAp){
payloadRicontattoAp.location=clinicZoneAp;
}}
bookingSubmitAreaPazienti(payloadRicontattoAp);
}}else{
bookingScroll();
}
e.preventDefault();
});
var formSection4CallbackBtnAp=formSection4.querySelector(".booking-callback-request-btn");
if(formSection4CallbackBtnAp){
formSection4CallbackBtnAp.addEventListener("click", function (e){
e.preventDefault();
var errAp=apBookingSection4ValidateAndSyncForSubmit();
if(flowControlloIgiene &&
typeof flowControlloIgiene.handleSubmitIfFlow8==="function" &&
flowControlloIgiene.handleSubmitIfFlow8(errAp)
){
return;
}
if(errAp){
bookingScroll();
return;
}
if(typeof window.bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals==="function"){
window.bookingApplyMedicinaEsteticaNonDirectRicontattoGlobals();
}else{
if(typeof window!=="undefined"){
window.directBooking=false;
window.selectedCardDirectBooking="0";
}
if(typeof directBooking!=="undefined"){
directBooking=false;
}
if(typeof selectedCardDirectBooking!=="undefined"){
selectedCardDirectBooking="0";
}}
var payloadAp=Object.assign({}, bookingData);
delete payloadAp.bookData;
delete payloadAp.thankyou;
delete payloadAp.times;
delete payloadAp.selectedSlot;
delete payloadAp.selectedClinicId;
delete payloadAp.selectedDay;
if(typeof window.bookingResolveThankyouClinicOrZone==="function"){
var clinicOrZoneAp=window.bookingResolveThankyouClinicOrZone(payloadAp);
if(clinicOrZoneAp){
payloadAp.location=clinicOrZoneAp;
}}
if(typeof bookingSubmitAreaPazienti==="function"){
bookingSubmitAreaPazienti(payloadAp);
}else if(typeof bookingSubmitFrontend==="function"){
payloadAp.areaPazienti=true;
bookingSubmitFrontend(payloadAp);
}});
}
function bookingSosYes(){
formSection4.classList.add("active");
pageBooking.classList.add("sos");
}
function bookingSosNo(){
pageBooking.classList.remove("sos");
}};
document.addEventListener("DOMContentLoaded", function (){
if(!document.body.classList.contains('footer-loaded')){
document.body.classList.add('footer-loaded');
const footerAccordion=document.querySelectorAll('.cs-footer h4');
for (let i=0; i < footerAccordion.length; i++){
footerAccordion[i].addEventListener('click', function (e){
var parent=this.parentNode;
if(parent.classList.contains('active')){
parent.classList.remove('active')
}else{
parent.classList.add('active')
}});
}
let floatingCta=document.querySelector('.floating-cta');
let ctaMain=document.querySelector('#cta-main');
if(ctaMain){
ctaMain.addEventListener('click', function (){
floatingCta.classList.toggle('cta-open');
});
}
var chatbotTriggers=document.querySelectorAll('#action-btn-chatbot');
chatbotTriggers.forEach(function (chatbotTrigger){
chatbotTrigger.addEventListener('click', function (e){
if(window.IndigoAIChat&&typeof window.IndigoAIChat.setOpen==='function'){
let oldChatbotTrigger=document.getElementById('iaw-trigger');
let expanded=oldChatbotTrigger&&oldChatbotTrigger.getAttribute('aria-expanded');
if(expanded==='true'){
window.IndigoAIChat.setOpen(false);
if(floatingCta) floatingCta.classList.remove('cta-open');
}else{
window.IndigoAIChat.setOpen(true);
if(floatingCta) floatingCta.classList.add('cta-open');
}}
});
});
function waitForChatTrigger(callback){
var interval=setInterval(function (){
var oldChatbotTrigger=document.getElementById('iaw-trigger');
if(oldChatbotTrigger){
clearInterval(interval);
callback(oldChatbotTrigger);
}}, 300);
}
waitForChatTrigger(function (oldChatbotTrigger){
var floatingCta=document.querySelector('.floating-cta');
const observer=new MutationObserver(function (mutations){
mutations.forEach(function (mutation){
if(mutation.type==='attributes'&&mutation.attributeName==='aria-expanded'){
const expanded=oldChatbotTrigger.getAttribute('aria-expanded');
if(expanded==='true'){
if(floatingCta) floatingCta.classList.add('cta-open');
}else{
if(floatingCta) floatingCta.classList.remove('cta-open');
}}
});
});
observer.observe(oldChatbotTrigger, { attributes: true });
});
}});
document.addEventListener("DOMContentLoaded", function(){
const bootstrapDropdowns=document.querySelectorAll('.dropdown-menu li a');
for(let i=0; i<bootstrapDropdowns.length; i++){
bootstrapDropdowns[i].addEventListener('click', function(e){
var dropdown=findAncestor(this, '.dropdown');
dropdown.querySelector('.btn').innerHTML=this.innerHTML;
dropdown.querySelector('.btn').value=this.getAttribute('data-value');
e.preventDefault();
});
}
function findAncestor (el, sel){
while ((el=el.parentElement)&&!((el.matches||el.matchesSelector).call(el,sel)));
return el;
}});
var urgenzeData={};
document.addEventListener("DOMContentLoaded", function (){
const urgenzeForm=document.querySelector("#request-urgenze-form");
if(urgenzeForm!=null){
urgenzeForm.querySelector(".cta").addEventListener("click", function (e){
var hasError=false;
var regName=/^[a-zA-ZàèéìíîïòóôùúûñÁÉÍÓÚÜÑ\s\']+$/;
var regEmail =
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
firstname=urgenzeForm.querySelector('input[name="firstname"]');
lastname=urgenzeForm.querySelector('input[name="lastname"]');
phone=urgenzeForm.querySelector('input[name="phone"]');
email=urgenzeForm.querySelector('input[name="email"]');
message=urgenzeForm.querySelector('textarea[name="message"]');
if(!regName.test(firstname.value)){
if(firstname.parentNode.classList.contains("valid")){
firstname.parentNode.classList.remove("valid");
}
firstname.parentNode.classList.add("error");
hasError=true;
}else{
if(firstname.parentNode.classList.contains("error")){
firstname.parentNode.classList.remove("error");
}
firstname.parentNode.classList.add("valid");
}
if(!regName.test(lastname.value)){
if(lastname.parentNode.classList.contains("valid")){
lastname.parentNode.classList.remove("valid");
}
lastname.parentNode.classList.add("error");
hasError=true;
}else{
if(lastname.parentNode.classList.contains("error")){
lastname.parentNode.classList.remove("error");
}
lastname.parentNode.classList.add("valid");
}
if(phone.value.length < 9 ||
phone.value.length > 10 ||
(phone.value.charAt(0)!=3&&phone.value.charAt(0)!=0) ||
!/^\d+$/.test(phone.value)
){
if(phone.parentNode.classList.contains("valid")){
phone.parentNode.classList.remove("valid");
}
phone.parentNode.classList.add("error");
hasError=true;
}else{
if(phone.parentNode.classList.contains("error")){
phone.parentNode.classList.remove("error");
}
phone.parentNode.classList.add("valid");
}
if(!regEmail.test(email.value)){
if(email.parentNode.classList.contains("valid")){
email.parentNode.classList.remove("valid");
}
email.parentNode.classList.add("error");
hasError=true;
}else{
if(email.parentNode.classList.contains("error")){
email.parentNode.classList.remove("error");
}
email.parentNode.classList.add("valid");
}
if(!hasError){
urgenzeData.firstname=firstname.value;
urgenzeData.lastname=lastname.value;
urgenzeData.phone=phone.value;
urgenzeData.email=email.value;
urgenzeData.message=message.value;
urgenzeData.marketing =
urgenzeForm.querySelector("#urgenze-marketing").checked;
urgenzeData.profile =
urgenzeForm.querySelector("#urgenze-profile").checked;
urgenzeSubmit(urgenzeData);
}
e.preventDefault();
});
}
function urgenzeSubmit(dataContent){
var grecaptcha_key=document
.getElementById("g-recaptcha")
.getAttribute("src")
.split("render=")[1];
grecaptcha.ready(function (){
grecaptcha
.execute(grecaptcha_key, { action: "submit" })
.then(function (token){
document.body.classList.add("overlay-loading-show");
const urlParams=new URLSearchParams(window.location.search);
const gclid_field=urlParams.get("gclid");
dataContent.gclid_field=gclid_field!=null ? gclid_field:"";
dataContent.path=window.location.pathname;
let myDataJSON=JSON.stringify({
"g-recaptcha-response": token,
data: dataContent,
});
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function (){
if(this.readyState==4&&this.status==200){
goThankyou("/grazie-urgenze/", { email: dataContent.email });
}};
const link=new URL(
document.getElementById("ajaxurl").getAttribute("href")
);
link.searchParams.set("action", "dp_urgenze");
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type",
"application/json; charset=UTF-8"
);
xhttp.send(myDataJSON);
});
});
}});
document.addEventListener("DOMContentLoaded", function(){
if(document.body.classList.contains('page-template-page-work')&&!document.body.classList.contains('work-loaded')){
document.body.classList.add('work-loaded');
function getAnnounces(){
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
let myData='action=dp_get_announces&g-recaptcha-response=' + token;
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
var announces=xhttp.responseText;
try {
announces=JSON.parse(announces);
} catch (e){
console.log(e);
return;
}
bindAnnounces(announces);
}};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
xhttp.send(myData);
});
});
}
getAnnounces();
function bindAnnounces(announces){
var announce, validAnnounces=[], jobsLi='', categoriesLi='', provincesLi='', projects=[], functions=[], provinces=[], workModal=document.getElementById('workModal');
var workCategoryPlaceholder=document.querySelector('#work-category').innerHTML;
var workProvincePlaceholder=document.querySelector('#work-province').innerHTML;
for(let i=0; i<announces.length; i++){
announce=announces[i];
expire=announce.expires.replace(/ *\([^)]*\) */g, "");
expire=expire.split('-');
newDate=new Date(expire[2], expire[1]-1, expire[0]);
timestamp=newDate.getTime();
if(timestamp - Date.now() > 0){
validAnnounces.push(announce);
}}
for(let i=0; i<validAnnounces.length; i++){
announce=validAnnounces[i];
if(announce.project_label!=null&&projects.indexOf(announce.project_label)===-1){
projects.push(announce.project_label)
}
}
for(let i=0; i<projects.length; i++){
jobsLi +='<li><a class="dropdown-item" href="#" data-value="'+projects[i]+'">'+projects[i]+'</a></li>';
}
document.getElementById('work-job').parentNode.querySelector('ul').innerHTML=jobsLi;
var filters=document.querySelectorAll('.search-work .col-md-4');
for(let i=0; i<filters.length; i++){
if(i > 0){
filters[i].classList.add('inactive');
}}
const searchWorkDropdowns=document.querySelector('#work-job').parentNode.querySelectorAll('.dropdown-menu li a');
for(let i=0; i<searchWorkDropdowns.length; i++){
searchWorkDropdowns[i].addEventListener('click', function(event){
var dropdown=findAncestor(this, '.dropdown');
dropdown.querySelector('.btn').innerHTML=this.innerHTML;
dropdown.querySelector('.btn').value=this.getAttribute('data-value');
if(dropdown.querySelector('.btn').getAttribute('id')=='work-job'){
var currentJob=this.getAttribute('data-value');
enableCategories=[];
categoriesLi='';
var boxes=document.querySelectorAll('#candidature .work-boxes .box');
for(let e=0; e<boxes.length; e++){
boxes[e].parentNode.classList.remove('active');
boxes[e].parentNode.classList.remove('inactive');
boxes[e].parentNode.classList.remove('hidden');
if(boxes[e].getAttribute('data-job')==currentJob){
boxes[e].parentNode.classList.add('active');
cat=boxes[e].getAttribute('data-category');
if(enableCategories.indexOf(cat)===-1){
enableCategories.push(cat);
}}else{
boxes[e].parentNode.classList.add('inactive');
}}
for(let e=0; e<filters.length; e++){
if(e > 1){
filters[e].classList.add('inactive');
}else{
filters[e].classList.remove('inactive');
}}
for(let e=0; e<enableCategories.length; e++){
categoriesLi +='<li><a class="dropdown-item" href="#" data-value="'+enableCategories[e]+'">'+enableCategories[e]+'</a></li>';
}
document.querySelector('#work-category').innerHTML=workCategoryPlaceholder;
document.querySelector('#work-category').parentNode.querySelector('ul').innerHTML=categoriesLi;
workPagination();
workCategoryDropdown=document.querySelector('#work-category').parentNode.querySelectorAll('.dropdown-menu li a');
for(let e=0; e<workCategoryDropdown.length; e++){
workCategoryDropdown[e].addEventListener('click', function(event){
var dropdown=findAncestor(this, '.dropdown');
dropdown.querySelector('.btn').innerHTML=this.innerHTML;
dropdown.querySelector('.btn').value=this.getAttribute('data-value');
var currentCategory=this.getAttribute('data-value');
enableProvince=[];
provinceLi='';
for(let e=0; e<boxes.length; e++){
boxes[e].parentNode.classList.remove('active');
boxes[e].parentNode.classList.remove('inactive');
boxes[e].parentNode.classList.remove('hidden');
if(boxes[e].getAttribute('data-job')==currentJob&&boxes[e].getAttribute('data-category')==currentCategory){
boxes[e].parentNode.classList.add('active');
province=boxes[e].getAttribute('data-province');
if(enableProvince.indexOf(province)===-1){
enableProvince.push(province);
}}else{
boxes[e].parentNode.classList.add('inactive');
}}
for(let e=0; e<filters.length; e++){
filters[e].classList.remove('inactive');
}
for(let e=0; e<enableProvince.length; e++){
provinceLi +='<li><a class="dropdown-item" href="#" data-value="'+enableProvince[e]+'">'+enableProvince[e]+'</a></li>';
}
document.querySelector('#work-province').innerHTML=workProvincePlaceholder;
document.querySelector('#work-province').parentNode.querySelector('ul').innerHTML=provinceLi;
workPagination();
workProvinceDropdown=document.querySelector('#work-province').parentNode.querySelectorAll('.dropdown-menu li a');
for(let e=0; e<workProvinceDropdown.length; e++){
workProvinceDropdown[e].addEventListener('click', function(event){
var dropdown=findAncestor(this, '.dropdown');
dropdown.querySelector('.btn').innerHTML=this.innerHTML;
dropdown.querySelector('.btn').value=this.getAttribute('data-value');
var currentProvince=this.getAttribute('data-value');
for(let e=0; e<boxes.length; e++){
boxes[e].parentNode.classList.remove('active');
boxes[e].parentNode.classList.remove('inactive');
boxes[e].parentNode.classList.remove('hidden');
if(boxes[e].getAttribute('data-job')==currentJob&&boxes[e].getAttribute('data-category')==currentCategory&&boxes[e].getAttribute('data-province')==currentProvince){
boxes[e].parentNode.classList.add('active');
}else{
boxes[e].parentNode.classList.add('inactive');
}}
workPagination();
event.preventDefault();
});
}
event.preventDefault();
});
}}
event.preventDefault();
});
}
const announcesContainerEl=document.querySelector('#candidature .work-boxes');
if(announcesContainerEl!=null){
var itemsTemplate=Handlebars.compile(document.querySelector('.work-boxes-html').innerHTML);
var resultItemContext={ announces: validAnnounces };
announcesContainerEl.innerHTML=itemsTemplate(resultItemContext);
workPagination();
var announcesBoxes=announcesContainerEl.querySelectorAll('.box');
for(let i=0; i<announcesBoxes.length; i++){
announcesBoxes[i].addEventListener('click', function(e){
var id=this.getAttribute('data-id');
for(let e=0; e<validAnnounces.length; e++){
if(validAnnounces[e].id==id){
var announce=validAnnounces[e], announceContent;
workModal.querySelector('.teaser h2').innerHTML=announce.title;
workModal.querySelector('.teaser .location-name').innerHTML=announce.county;
announceContent=workModal.querySelector('.work-content');
announceContent.innerHTML='';
announceContent.innerHTML +=sanitizeAnnounceHtml(announce.position_description);
announceContent.innerHTML +=sanitizeAnnounceHtml(announce.requirements_description);
announceContent.innerHTML +=sanitizeAnnounceHtml(announce.other_information_description);
workModal.querySelector('.work-form').innerHTML='<iframe src="'+announce.registration_iframe_url+'"></iframe>';
}}
e.preventDefault();
});
}
document.querySelector('.search-work').classList.add('work-loaded');
}}
function findAncestor (el, sel){
while ((el=el.parentElement)&&!((el.matches||el.matchesSelector).call(el,sel)));
return el;
}
function sanitizeAnnounceHtml(html){
var t=document.createElement('template');
t.innerHTML=html;
content=t.content;
p=content.childNodes;
content.innerHTML='';
for(let i=0; i<p.length; i++){
if(p[i].innerHTML.trim()!=''&&p[i].innerHTML.trim()!='<br>')
content.innerHTML +='<'+p[i].localName+'>'+p[i].innerHTML+'</'+p[i].localName+'>';
}
return content.innerHTML;
}
function workPagination(){
var boxes_per_page=6;
var boxes=document.querySelectorAll('.work-boxes .active');
var totPages=Math.ceil(boxes.length / boxes_per_page);
var pagination=document.querySelector('.work-boxes-pagination .pager');
var pages='';
for(let i=0; i<boxes.length; i++){
if(i >=boxes_per_page){
boxes[i].classList.add('hidden');
}}
for(let i=1; i<=totPages; i++){
current=(i==1) ? ' current':'';
if(i==3||i==totPages-1){
pages +='<span class="dots">...</span>';
}
pages +='<span class="page'+current+'">'+i+'</span>';
}
pagination.innerHTML='<span class="prev"></span>' + pages + '<span class="next"></span>';
var pages=pagination.querySelectorAll('span');
for(let i=0; i<pages.length; i++){
pages[i].addEventListener('click', function(){
if(!this.classList.contains('current')&&!this.classList.contains('dots')){
var currentPage=parseInt(pagination.querySelector('.current').innerHTML);
var pageClick=null;
if(this.classList.contains('prev')&&currentPage > 1){
pageClick=currentPage - 1;
}
if(this.classList.contains('next')&&currentPage < pages.length-4){
pageClick=currentPage + 1;
}
if(this.classList.contains('page')){
pageClick=parseInt(this.innerHTML);
}
if(pageClick!=null){
for(let e=0; e<pages.length; e++){
if(pages[e].innerHTML==currentPage){
pages[e].classList.remove('current');
}
if(pages[e].innerHTML==pageClick){
pages[e].classList.add('current');
}}
minLimit=(pageClick-1)*boxes_per_page;
maxLimit=minLimit+boxes_per_page;
for(let e=0; e<boxes.length; e++){
boxes[e].classList.remove('hidden');
if(e < minLimit||e >=maxLimit){
boxes[e].classList.add('hidden');
}}
}
updatePaginationPager();
}});
}
function updatePaginationPager(){
myCurrent=parseInt(pagination.querySelector('.current').innerHTML);
dots=pagination.querySelectorAll('.dots');
if(dots.length){
dots[0].classList.remove('hidden');
if(myCurrent < 5||pages.length<=9){
dots[0].classList.add('hidden');
}
if(dots.length > 1){
dots[1].classList.remove('hidden');
if(myCurrent==pages.length-6||myCurrent==pages.length-7||myCurrent==pages.length-8||pages.length<=9){
dots[1].classList.add('hidden');
}}
for(let i=0; i<pages.length; i++){
if(!pages[i].classList.contains('dots')){
pages[i].classList.remove('hidden');
if(i > 1&&i<pages.length-3){
if(i!=myCurrent&&i!=myCurrent+1&&i!=myCurrent+2&&pages.length > 9){
pages[i].classList.add('hidden');
}}
}}
if(myCurrent <=5){
pages[2].classList.remove('hidden');
}
if(myCurrent==pages.length-8){
pages[pages.length-5].classList.remove('hidden');
}}
}
updatePaginationPager();
}}
if(document.querySelector('#primaryContentSlide .cta')!=null){
document.querySelector('#primaryContentSlide .cta').addEventListener('click', function(e){
if(this.getAttribute('href')=='#candidature'){
minus=(window.innerWidth > 991) ? 200:0
scroll({
top: document.getElementById('candidature').offsetTop - minus,
behavior: "smooth"
});
e.preventDefault();
}
if(this.getAttribute('href')=='#recensioni'){
minus=(window.innerWidth > 991) ? 200:0
scroll({
top: document.getElementById('index-2').offsetTop - minus,
behavior: "smooth"
});
e.preventDefault();
}});
}});
(function (){
var isDesktop=function (){ return window.matchMedia("(min-width: 768px)").matches; };
function initRsMobile(){
if(typeof jQuery==="undefined") return;
var wrap=jQuery(".review-slider .rs-slider-mobile");
if(!wrap.length) return;
wrap.find(".rs-tab").on("click", function (){
var tab=jQuery(this).attr("data-tab");
wrap.find(".rs-tab").removeClass("rs-active").attr("aria-selected", "false");
jQuery(this).addClass("rs-active").attr("aria-selected", "true");
wrap.find(".rs-panel").removeClass("rs-active");
var activePanel=wrap.find(".rs-panel[data-tab=\"" + tab + "\"]").addClass("rs-active");
setTimeout(checkCardTruncation, 80);
});
function setMobileCardsHeight(owlEl){
owlEl.find(".rs-card").removeClass("rs-expanded").css("height", "");
owlEl.find(".rs-card-more").text("Mostra di più").attr("aria-expanded", "false");
checkCardTruncation();
}
wrap.find(".rs-owl-mobile").each(function (){
var el=jQuery(this);
if(el.hasClass("owl-loaded")) return;
el.owlCarousel({
items: 1,
margin: 12,
loop: el.find(".item").length > 1,
nav: false,
dots: true,
autoplay: false,
onTranslated: function (){
setTimeout(function (){ setMobileCardsHeight(el); }, 150);
},
onChanged: function (){
setTimeout(function (){ setMobileCardsHeight(el); }, 150);
},
onDragged: function (){
setTimeout(function (){ setMobileCardsHeight(el); }, 150);
}});
el.on("translated.owl.carousel dragged.owl.carousel changed.owl.carousel", function (){
setTimeout(function (){ setMobileCardsHeight(el); }, 150);
});
});
setTimeout(checkCardTruncation, 200);
}
function initReviewSliders(){
if(typeof jQuery==="undefined") return;
var section=jQuery(".review-slider");
if(!section.length) return;
var desktopBlock=section.find(".rs-slider-desktop");
var rsOwl=desktopBlock.find(".rs-owl");
if(!rsOwl.length) return;
rsOwl.each(function (){
var el=jQuery(this);
if(el.hasClass("owl-loaded")) return;
el.owlCarousel({
items: 2,
margin: 16,
loop: el.find(".item").length > 2,
nav: false,
dots: false,
autoplay: false,
navText: ["‹", "›"],
responsive: {
0: { items: 1 },
768: { items: 2 },
992: { items: 2 }}
});
el.on("changed.owl.carousel", function (){
el.find(".rs-card").removeClass("rs-expanded");
el.find(".rs-card-more").text("Mostra di più").attr("aria-expanded", "false");
resetCardHeights(el);
setTimeout(function (){
equalizeVisibleSlideCards(el);
checkCardTruncation();
}, 80);
});
});
section.find(".rs-summary-prev").on("click", function (){
rsOwl.each(function (){ jQuery(this).trigger("prev.owl.carousel"); });
});
section.find(".rs-summary-next").on("click", function (){
rsOwl.each(function (){ jQuery(this).trigger("next.owl.carousel"); });
});
}
function checkCardTruncation(){
if(typeof jQuery==="undefined") return;
jQuery(".rs-card").each(function (){
var card=jQuery(this);
var textEl=card.find(".rs-card-text")[0];
var btn=card.find(".rs-card-more");
if(!textEl||!btn.length) return;
if(card.hasClass("rs-expanded")) return;
if(textEl.scrollHeight > textEl.clientHeight){
btn.addClass("is-visible").attr("aria-expanded", "false");
}else{
btn.removeClass("is-visible");
}});
}
function equalizeCardHeights(sliderEl){
if(!sliderEl||!sliderEl.length) return;
sliderEl.each(function (){
var el=jQuery(this);
if(el.hasClass("rs-owl-mobile")) return;
var cards=el.find(".rs-card");
if(!cards.length) return;
var panel=el.closest(".rs-panel");
if(panel.length&&panel.css("display")==="none") return;
cards.css("height", "auto");
var maxH=0;
cards.each(function (){
var h=this.offsetHeight;
if(h > maxH) maxH=h;
});
if(maxH > 0) cards.css("height", maxH + "px");
});
}
function resetCardHeights(sliderEl){
if(!sliderEl||!sliderEl.length) return;
sliderEl.find(".rs-card").css("height", "");
}
function equalizeVisibleSlideCards(carouselEl){
if(!carouselEl||!carouselEl.length) return;
if(carouselEl.hasClass("rs-owl-mobile")) return;
var cards=carouselEl.find(".owl-item.active .rs-card");
if(!cards.length){
cards=carouselEl.find(".owl-item.center .rs-card");
}
if(!cards.length){
equalizeCardHeights(carouselEl);
return;
}
cards.css("height", "auto");
var maxH=0;
cards.each(function (){
var h=this.offsetHeight;
if(h > maxH) maxH=h;
});
if(maxH > 0) cards.css("height", maxH + "px");
}
function runEqualizationForSlider(slider){
if(!slider||!slider.length) return;
resetCardHeights(slider);
setTimeout(function (){
equalizeCardHeights(slider);
setTimeout(checkCardTruncation, 50);
}, 80);
}
function bindCardMore(){
if(typeof jQuery==="undefined") return;
jQuery(document).on("click", ".rs-card-more", function (){
var btn=jQuery(this);
var card=btn.closest(".rs-card");
var slider=card.closest(".rs-owl-mobile, .rs-owl");
var isGmbOpinioni=card.closest(".opinioni-pazienti").length > 0;
if(card.hasClass("rs-expanded")){
card.removeClass("rs-expanded");
btn.text("Mostra di più").attr("aria-expanded", "false");
if(slider.length&&!isGmbOpinioni){
var isMobile=slider.hasClass("rs-owl-mobile");
if(isMobile){
resetCardHeights(slider);
}else{
runEqualizationForSlider(slider);
}}
}else{
card.addClass("rs-expanded");
btn.text("Mostra di meno").attr("aria-expanded", "true");
if(slider.length&&!isGmbOpinioni){
var isMobile=slider.hasClass("rs-owl-mobile");
if(!isMobile){
equalizeCardHeights(slider);
setTimeout(checkCardTruncation, 50);
}}
}});
}
function init(){
if(isDesktop()){
initReviewSliders();
}else{
initRsMobile();
}
bindCardMore();
setTimeout(checkCardTruncation, 200);
jQuery(window).on("resize", function (){
jQuery(".rs-card").removeClass("rs-expanded");
jQuery(".rs-card-more").text("Mostra di più").attr("aria-expanded", "false").removeClass("is-visible");
resetCardHeights(jQuery(".review-slider .rs-owl-mobile, .review-slider .rs-owl"));
setTimeout(checkCardTruncation, 150);
});
}
if(document.readyState==="loading"){
document.addEventListener("DOMContentLoaded", init);
}else{
init();
}})();
document.addEventListener('DOMContentLoaded', function (){
document.querySelectorAll('.dp-cta-bar[data-form-anchor]').forEach(function (bar){
var anchorId=bar.getAttribute('data-form-anchor');
if(!anchorId){
return;
}
var primaryCta=bar.querySelector('.dp-cta--primary');
if(!primaryCta){
return;
}
primaryCta.addEventListener('click', function (e){
var target=document.getElementById(anchorId);
if(!target){
return;
}
e.preventDefault();
var offset=16;
var header=document.getElementById('header');
if(header){
offset +=header.offsetHeight;
}
var headerMobile=document.getElementById('header-mobile');
if(headerMobile){
offset +=headerMobile.offsetHeight;
}
var top=target.getBoundingClientRect().top + window.pageYOffset - offset;
window.scrollTo({ top: top, behavior: 'smooth' });
});
});
});
function landingSubmit(form, subject, recipients, thankyou, validExtensions=['doc', 'docx', 'pdf', 'png']){
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
document.body.classList.add('overlay-loading-show');
const urlParams=new URLSearchParams(window.location.search);
const gclid_field=urlParams.get('gclid');
form.gclid_field=(gclid_field!=null) ? gclid_field:'';
var formData=new FormData();
formData.append('action', 'dp_landing');
formData.append('g-recaptcha-response', token);
formData.append('data', JSON.stringify(form));
formData.append('subject', subject);
formData.append('recipients', JSON.stringify(recipients));
var fileInput=document.getElementById('request-landing-file');
if(fileInput!=null){
var hint=fileInput.parentNode.querySelector('.hint');
if(hint!=null){
hint.remove();
}
var file=fileInput.files[0];
if(file){
var isValidFile=false;
var fileExtension=file.name.split('.').pop();
for(let i=0; i<validExtensions.length; i++){
if(fileExtension==validExtensions[i]){
isValidFile=true;
}}
if(!isValidFile){
var error='I formati validi sono: ' + validExtensions.join(', ');
}else{
var fileSizeMB=file.size / (1024 * 1024);
if(fileSizeMB > 20){
isValidFile=false;
var error='La dimensione massima deve essere 20MB';
}}
if(isValidFile){
formData.append('file', file);
}
if(!isValidFile){
var spanElement=document.createElement('span');
spanElement.textContent=error;
spanElement.classList.add('hint');
spanElement.style.display='block';
spanElement.style.marginBottom=0;
fileInput.insertAdjacentElement('afterend', spanElement);
document.body.classList.remove('overlay-loading-show');
return;
}}
}
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
var emailInput=document.getElementById('request-landing-email');
var emailValue=emailInput ? emailInput.value:null;
goThankyou(thankyou, {email: emailValue});
}};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.send(formData);
});
});
}
function goThankyou(path, params, method='post'){
const form=document.createElement('form');
form.method=method;
form.action=path;
for (const key in params){
if(params.hasOwnProperty(key)){
const hiddenField=document.createElement('input');
hiddenField.type='hidden';
hiddenField.name=key;
hiddenField.value=params[key];
form.appendChild(hiddenField);
}}
document.body.appendChild(form);
form.submit();
};
document.addEventListener("DOMContentLoaded", function(){
if(!document.body.classList.contains('area-pazienti-login-loaded')&&document.body.classList.contains('area-pazienti')&&!document.body.classList.contains('area-pazienti-dashboard')){
document.body.classList.add('area-pazienti-login-loaded');
if(!document.body.classList.contains('area-pazienti-register')){
if(!sessionStorage.getItem('userData')){
const currentUrl=window.location.href;
const urlObj=new URL(currentUrl);
const params=new URLSearchParams(urlObj.search);
if(!params.has('matchPatient')&&!params.has('TokenSelector')&&!params.has('ts')){
window.location.href='/area-pazienti/?login';
}}else{
window.location.href='/area-pazienti/dashboard/';
}}
var login=document.getElementById('login');
var register=document.getElementById('register');
if(login!=null){
var formLogin=login.querySelector('.form-login form');
var formRecover=login.querySelector('.form-recover form');
formLogin.addEventListener('submit', function(e){
const formLoginData=new FormData(formLogin);
formLogin.querySelector('.error').innerHTML='';
formLogin.querySelector('.error').classList.add('hide');
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
document.body.classList.add('overlay-loading-show');
formLoginData.append('action', 'dp_login');
formLoginData.append('g-recaptcha-response', token);
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
var response=xhttp.responseText;
if(isJSON(response)){
response=JSON.parse(response);
if(!response.esit){
document.body.classList.remove('overlay-loading-show');
formLogin.querySelector('.error').innerHTML=response.errorDesc;
formLogin.querySelector('.error').classList.remove('hide');
}else{
response.Data.expiry=(formLoginData.get('remember')) ? false:(new Date().getTime() + (60 * 60 * 1000));
sessionStorage.setItem('userData', JSON.stringify(response.Data));
window.location.href='/area-pazienti/dashboard/';
}}else{
document.body.classList.remove('overlay-loading-show');
formLogin.querySelector('.error').innerHTML=response;
formLogin.querySelector('.error').classList.remove('hide');
}}
};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.send(formLoginData);
});
});
e.preventDefault();
});
formRecover.addEventListener('submit', function(e){
const formRecoverData=new FormData(formRecover);
formRecover.querySelector('.error').innerHTML='';
formRecover.querySelector('.error').classList.add('hide');
formRecover.querySelector('.valid').innerHTML='';
formRecover.querySelector('.valid').classList.add('hide');
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
document.body.classList.add('overlay-loading-show');
formRecoverData.append('action', 'dp_recover');
formRecoverData.append('g-recaptcha-response', token);
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
document.body.classList.remove('overlay-loading-show');
var response=xhttp.responseText;
if(isJSON(response)){
response=JSON.parse(response);
if(!response.esit){
formRecover.querySelector('.error').innerHTML=response.errorDesc;
formRecover.querySelector('.error').classList.remove('hide');
}else{
formRecover.querySelector('.valid').innerHTML='È stata inviata una mail per recuperare la password';
formRecover.querySelector('.valid').classList.remove('hide');
}}else{
formRecover.querySelector('.error').innerHTML=response;
formRecover.querySelector('.error').classList.remove('hide');
}}
};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.send(formRecoverData);
});
});
e.preventDefault();
});
}
if(register!=null){
var formRegister=register.querySelector('.form-register form');
formRegister.addEventListener('submit', function(e){
const formRegisterData=new FormData(formRegister);
formRegister.querySelector('.error').innerHTML='';
formRegister.querySelector('.error').classList.add('hide');
var grecaptcha_key=document.getElementById('g-recaptcha').getAttribute('src').split('render=')[1];
grecaptcha.ready(function(){
grecaptcha.execute(grecaptcha_key, {action: 'submit'}).then(function(token){
document.body.classList.add('overlay-loading-show');
formRegisterData.append('action', 'dp_register');
formRegisterData.append('g-recaptcha-response', token);
var xhttp=new XMLHttpRequest();
xhttp.onreadystatechange=function(){
if(this.readyState==4&&this.status==200){
document.body.classList.remove('overlay-loading-show');
var response=xhttp.responseText;
if(isJSON(response)){
response=JSON.parse(response);
if(!response.esit){
formRegister.querySelector('.error').innerHTML=response.errorDesc;
formRegister.querySelector('.error').classList.remove('hide');
}else{
register.querySelector('.form-register').classList.add('hide');
register.querySelector('.thankyou').classList.remove('hide');;
}}else{
formRegister.querySelector('.error').innerHTML=response;
formRegister.querySelector('.error').classList.remove('hide');
}}
};
let link=document.getElementById('ajaxurl').getAttribute('href');
xhttp.open("POST", link, true);
xhttp.send(formRegisterData);
});
});
e.preventDefault();
});
}
var loginLinks=document.querySelectorAll('.show-login-form');
for(let i=0; i<loginLinks.length; i++){
loginLinks[i].addEventListener('click', function(e){
login.classList.remove('hide');
register.classList.add('hide');
login.querySelector('.form-login').classList.remove('hide');
login.querySelector('.form-recover').classList.add('hide');
e.preventDefault();
});
}
var recoverLinks=document.querySelectorAll('.show-recover-form');
for(let i=0; i<recoverLinks.length; i++){
recoverLinks[i].addEventListener('click', function(e){
login.classList.remove('hide');
register.classList.add('hide');
login.querySelector('.form-login').classList.add('hide');
login.querySelector('.form-recover').classList.remove('hide');
e.preventDefault();
});
}
var registerLinks=document.querySelectorAll('.show-register-form');
for(let i=0; i<registerLinks.length; i++){
registerLinks[i].addEventListener('click', function(e){
login.classList.add('hide');
register.classList.remove('hide');
e.preventDefault();
});
}}
function checkExpiry(){
var expired=false;
var key='userData';
var itemStr=sessionStorage.getItem(key);
if(!itemStr&&document.body.classList.contains('page-template-page-register')){
return null;
}
if(!itemStr){
window.location.href='/area-pazienti/?login';
return null;
}
if(isJSON(itemStr)){
var item=JSON.parse(itemStr);
if(item.expiry){
var now=new Date();
if(now.getTime() > item.expiry){
sessionStorage.removeItem(key);
expired=true;
}}
if(sessionStorage.getItem(key)&&document.body.classList.contains('area-pazienti')&&!document.body.classList.contains('area-pazienti-dashboard')){
document.body.classList.add('overlay-loading-show');
window.location.href='/area-pazienti/dashboard/';
return null;
}}else{
sessionStorage.removeItem(key);
expired=true;
}
if(expired&&document.body.classList.contains('page-template-page-register')){
return null;
}
if(expired&&document.body.classList.contains('area-pazienti')){
document.body.classList.add('overlay-loading-show');
window.location.href='/area-pazienti/?login';
return null;
}}
function isJSON(str){
try {
JSON.parse(str);
return true;
} catch (e){
return false;
}}
});