PageSourceSearch

https://www.jeu-tarot-en-ligne.com/Memos/main-js-fr.js?v=1.5.4.9-1790250697

js jeu-tarot-en-ligne.com collected 2026-09-24 12:07:55 UTC 1,300,571 bytes, 31,767 lines download raw bytes

vendor: 5,443 bytes, lines 1-18
1/* requirements-bundle:cd900cef01860b6bcce70c97274c46c9df65d14c */
2var codeVersion = "0.0.0.0.3";
3var logStrings = [];
4if (typeof window.check_webp_feature != "function") {
5 window.check_webp_feature = function(feature, callback) {
6  var tests = {lossy:"UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",lossless:"UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",alpha:"UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",animation:"UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"};
7  if (typeof callback != "function") return;
8  if (!tests[feature]) { callback(feature, false); return; }
9  try {
10   var img = new Image();
11   img.onload = function() { callback(feature, img.width > 0 && img.height > 0); };
12   img.onerror = function() { callback(feature, false); };
13   img.src = "data:image/webp;base64," + tests[feature];
14  } catch (error) { callback(feature, false); }
15 };
16}
17/*! my jOueryV-1.11.1 */
18!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s
vendor: 12,883 bytes, line 18
18=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)}
vendor: 7,667 bytes, line 18
18,input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];
vendor: 4,825 bytes, line 18
18while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)}
vendor: 5,916 bytes, lines 18-19
18,ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
19if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" 
vendor: 16,954 bytes, line 19
19<link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if
vendor: 4,971 bytes, line 19
19(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" 
19<link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
vendor: 18,764 bytes, line 20
20},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML}
vendor: 12,784 bytes, line 20
20,flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
20
21 /* ============================================================
22  * CONFIGURATION DES FONDS
23  * ============================================================ */
24
25 var MEDAILLE_FONDS = {
26  "mensuel-style1": "/images/medailles/mensuel-style1.png",
27  "mensuel-style2": "/images/medailles/mensuel-style2.png",
28  "tournoi-style1": "/images/medailles/tournoi-style1.png",
29  "annuel-style1": "/images/medailles/annuel-style1.png",
30  "annuel-style2": "/images/medailles/annuel-style2.png",
31  "autre-style1": "/images/medailles/autre-style1.png"
32 };
33
34
35 /* ============================================================
36  * STYLES GLOBAUX DES TEXTES
37  *
38  * normal :
39  * rendu dor� actuellement utilis�.
40  *
41  * accessible :
42  * texte blanc tr�s contrast�, contour noir �pais,
43  * ombre r�duite et police sans-serif plus lisible.
44  * ============================================================ */
45
46 var MEDAILLE_STYLES_TEXTE = {
47  normal: {
48  fontFamily: "Arial",
49  fontWeight: "bold",
50
51  utiliserDegrade: true,
52  fillStyle: null,
53
54  strokeStyle: "#5a2d00",
55  lineWidthRatio: 0.006,
56
57  shadowColor: "rgba(0, 0, 0, 0.35)",
58  shadowBlurRatio: 0.005,
59  shadowOffsetXRatio: 0,
60  shadowOffsetYRatio: 0.002
61  },
62
63  sobre: {
64  fontFamily: "Arial",
65  fontWeight: "bold",
66
67  utiliserDegrade: false,
68  fillStyle: "#d7d2c8",
69
70  strokeStyle: "#282522",
71  lineWidthRatio: 0.006,
72
73  shadowColor: "rgba(0, 0, 0, 0.45)",
74  shadowBlurRatio: 0.003,
75  shadowOffsetXRatio: 0,
76  shadowOffsetYRatio: 0.002
77  },
78
79  accessible: {
80  /*
81  * Arial ou Verdana sont g�n�ralement plus lisibles
82  * que les polices d�coratives.
83  */
84  fontFamily: "Arial",
85  fontWeight: "900",
86
87  utiliserDegrade: false,
88  fillStyle: "#ffffff",
89
90  /*
91  * Contour noir beaucoup plus marqu�.
92  */
93  strokeStyle: "#000000",
94  lineWidthRatio: 0.011,
95
96  /*
97  * Ombre l�g�re, car le contour assure d�j� le contraste.
98  */
99  shadowColor: "rgba(0, 0, 0, 0.55)",
100  shadowBlurRatio: 0.003,
101  shadowOffsetXRatio: 0,
102  shadowOffsetYRatio: 0.002
103  }
104 };
105
106 /* ============================================================
107  * POSITIONNEMENT PAR TEMPLATE
108  *
109  * Les deux templates mensuels utilisent les m�mes positions.
110  * Les deux templates annuels utilisent les m�mes positions.
111  *
112  * Les propri�t�s proportionnelles :
113  * - x, y, centreX, centreY
114  * - rayon
115  * - fontSize
116  * - maxWidth
117  * - ecartLignes
118  *
119  * Les d�calages :
120  * - decalageX
121  * - decalageY
122  * - decalageRayon
123  *
124  * sont exprim�s en pixels.
125  * ============================================================ */
126
127 var MEDAILLE_LAYOUTS = {
128  "mensuel-style1": {
129  competition: {
130  rayon: 0.72,
131  angleDebut: 250,
132  angleFin: 290,
133
134  centreX: 0.50,
135  centreY: 0,
136
137  decalageX: 0,
138  decalageY: 292,
139  decalageRayon: 10,
140
141  fontSize: 0.154,
142  kerning: 2,
143
144  remplirArc: true,
145  inward: true
146  },
147
148  classement: {
149  x: 0.50,
150  y: 0.52,
151
152  decalageX: 0,
153  decalageY: 0,
154
155  ligne1FontSize: 0.25,
156  ligne1MaxWidth: 0.35,
157
158  ligne2FontSize: 0.088,
159  ligne2MaxWidth: 0.34,
160
161  ecartLignes: 0.15
162  },
163
164  cartouche: {
165  x: 0.50,
166  y: 0.802,
167
168  decalageX: 0,
169  decalageY: 0,
170
171  maxWidth: 0.30,
172  fontSize: 0.08
173  }
174  },
175
176  "mensuel-style2": {
177  competition: {
178  rayon: 0.72,
179  angleDebut: 250,
180  angleFin: 290,
181
182  centreX: 0.50,
183  centreY: 0,
184
185  decalageX: 0,
186  decalageY: 292,
187  decalageRayon: 10,
188
189  fontSize: 0.154,
190  kerning: 2,
191
192  remplirArc: true,
193  inward: true
194  },
195
196  classement: {
197  x: 0.50,
198  y: 0.52,
199
200  decalageX: 0,
201  decalageY: 0,
202
203  ligne1FontSize: 0.25,
204  ligne1MaxWidth: 0.35,
205
206  ligne2FontSize: 0.088,
207  ligne2MaxWidth: 0.34,
208
209  ecartLignes: 0.15
210  },
211
212  cartouche: {
213  x: 0.50,
214  y: 0.802,
215
216  decalageX: 0,
217  decalageY: 0,
218
219  maxWidth: 0.30,
220  fontSize: 0.08
221  }
222  },
223
224  "annuel-style1": {
225  competition: {
226  rayon: 0.52,
227  angleDebut: 245,
228  angleFin: 295,
229
230  centreX: 0.50,
231  centreY: 0,
232
233  decalageX: 0,
234  decalageY: 225,
235  decalageRayon: 10,
236
237  fontSize: 0.154,
238  kerning: 2,
239
240  remplirArc: true,
241  inward: true
242  },
243
244  classement: {
245  x: 0.50,
246  y: 0.52,
247
248  decalageX: 0,
249  decalageY: 0,
250
251  ligne1FontSize: 0.25,
252  ligne1MaxWidth: 0.35,
253
254  ligne2FontSize: 0.068,
255  ligne2MaxWidth: 0.34,
256
257  ecartLignes: 0.15
258  },
259
260  cartouche: {
261  x: 0.50,
262  y: 0.85,
263
264  decalageX: 0,
265  decalageY: 0,
266
267  maxWidth: 0.30,
268  fontSize: 0.08
269  }
270  },
271
272  "annuel-style2": {
273  competition: {
274  rayon: 0.52,
275  angleDebut: 245,
276  angleFin: 295,
277
278  centreX: 0.50,
279  centreY: 0,
280
281  decalageX: 0,
282  decalageY: 225,
283  decalageRayon: 10,
284
285  fontSize: 0.154,
286  kerning: 2,
287
288  remplirArc: true,
289  inward: true
290  },
291
292  classement: {
293  x: 0.50,
294  y: 0.52,
295
296  decalageX: 0,
297  decalageY: 0,
298
299  ligne1FontSize: 0.25,
300  ligne1MaxWidth: 0.35,
301
302  ligne2FontSize: 0.068,
303  ligne2MaxWidth: 0.34,
304
305  ecartLignes: 0.15
306  },
307
308  cartouche: {
309  x: 0.50,
310  y: 0.85,
311
312  decalageX: 0,
313  decalageY: 0,
314
315  maxWidth: 0.30,
316  fontSize: 0.08
317  }
318  }
319 };
320
321 /* Le mod�le sobre conserve les m�mes zones de texte que le mensuel. */
322 MEDAILLE_LAYOUTS["autre-style1"] =
323  MEDAILLE_LAYOUTS["mensuel-style1"];
324 MEDAILLE_LAYOUTS["tournoi-style1"] =
325  MEDAILLE_LAYOUTS["mensuel-style1"];
326
327
328 /* ============================================================
329  * OUTILS G�N�RAUX
330  * ============================================================ */
331
332 function degToRad(degres) {
333  return degres * Math.PI / 180;
334 }
335
336
337 function valeurDefinie(valeur, valeurParDefaut) {
338  return typeof valeur !== "undefined"
339  ? valeur
340  : valeurParDefaut;
341 }
342
343
344 function fusionnerOptions(base, surcharge) {
345  var resultat = {};
346  var propriete;
347
348  base = base || {};
349  surcharge = surcharge || {};
350
351  for (propriete in base) {
352  if (
353  Object.prototype.hasOwnProperty.call(
354  base,
355  propriete
356  )
357  ) {
358  resultat[propriete] =
359  base[propriete];
360  }
361  }
362
363  for (propriete in surcharge) {
364  if (
365  Object.prototype.hasOwnProperty.call(
366  surcharge,
367  propriete
368  )
369  ) {
370  resultat[propriete] =
371  surcharge[propriete];
372  }
373  }
374
375  return resultat;
376 }
377
378
379 var MEDAILLE_IMAGES_EN_MEMOIRE = {};
380
381
382 function chargerImage(url) {
383  if (MEDAILLE_IMAGES_EN_MEMOIRE[url]) {
384  return MEDAILLE_IMAGES_EN_MEMOIRE[url];
385  }
386
387  MEDAILLE_IMAGES_EN_MEMOIRE[url] =
388  new Promise(function(resolve, reject) {
389  var imagesPrechargees =
390  window.medaillesFondsPrecharges ||
391  {};
392
393  var imagePrechargee =
394  imagesPrechargees[url];
395
396  var image =
397  imagePrechargee ||
398  new Image();
399
400  function imageChargee() {
401  resolve(image);
402  }
403
404  function erreurChargement() {
405  reject(
406  new Error(
407  "Impossible de charger l'image : " +
408  url
409  )
410  );
411  }
412
413  if (
414  imagePrechargee &&
415  image.complete
416  ) {
417  if (image.naturalWidth) {
418  imageChargee();
419  } else {
420  erreurChargement();
421  }
422  return;
423  }
424
425  image.addEventListener(
426  "load",
427  imageChargee,
428  { once: true }
429  );
430
431  image.addEventListener(
432  "error",
433  erreurChargement,
434  { once: true }
435  );
436
437  if (!imagePrechargee) {
438  image.src = url;
439  }
440  });
441
442  return MEDAILLE_IMAGES_EN_MEMOIRE[url];
443  }
444
445
446 function obtenirStyleTexte(nomStyle) {
447  nomStyle = nomStyle || "normal";
448
449  if (!MEDAILLE_STYLES_TEXTE[nomStyle]) {
450  throw new Error(
451  "Style de texte inconnu : " +
452  nomStyle
453  );
454  }
455
456  return MEDAILLE_STYLES_TEXTE[nomStyle];
457 }
458
459
460 function obtenirNomStyleTexte(options) {
461  /*
462  * Le mode de lisibilité améliorée est prioritaire sur le style
463  * demandé par une médaille particulière (normal ou sobre).
464  */
465  if (window.medailleModeLisibiliteAmelioree === true) {
466  return "accessible";
467  }
468
469  return options.styleTexte || "normal";
470 }
471
472
473 function ajusterTaillePolice(
474  ctx,
475  texte,
476  maxWidth,
477  fontSize,
478  fontFamily,
479  fontWeight,
480  minSize
481 ) {
482  minSize = minSize || 10;
483
484  ctx.save();
485
486  while (fontSize > minSize) {
487  ctx.font =
488  fontWeight + " " +
489  fontSize + "px " +
490  fontFamily;
491
492  if (
493  ctx.measureText(texte).width <=
494  maxWidth
495  ) {
496  break;
497  }
498
499  fontSize--;
500  }
501
502  ctx.restore();
503
504  return fontSize;
505 }
506
507
508 function creerDegradeOr(ctx, y, hauteur) {
509  var degrade =
510  ctx.createLinearGradient(
511  0,
512  y - hauteur / 2,
513  0,
514  y + hauteur / 2
515  );
516
517  degrade.addColorStop(
518  0,
519  "#fff8d0"
520  );
521
522  degrade.addColorStop(
523  0.22,
524  "#ffe998"
525  );
526
527  degrade.addColorStop(
528  0.48,
529  "#f9c83e"
530  );
531
532  degrade.addColorStop(
533  0.68,
534  "#d99b17"
535  );
536
537  degrade.addColorStop(
538  0.85,
539  "#ffe986"
540  );
541
542  degrade.addColorStop(
543  1,
544  "#ad6e0c"
545  );
546
547  return degrade;
548 }
549
550
551 /* ============================================================
552  * APPLICATION DU STYLE GLOBAL
553  * ============================================================ */
554
555 function creerOptionsStyleTexte(
556  styleGlobal,
557  W,
558  optionsSpecifiques
559 ) {
560  optionsSpecifiques =
561  optionsSpecifiques || {};
562
563  return {
564  fontFamily:
565  optionsSpecifiques.fontFamily ||
566  styleGlobal.fontFamily,
567
568  fontWeight:
569  optionsSpecifiques.fontWeight ||
570  styleGlobal.fontWeight,
571
572  fillStyle:
573  valeurDefinie(
574  optionsSpecifiques.fillStyle,
575  styleGlobal.fillStyle
576  ),
577
578  utiliserDegrade:
579  valeurDefinie(
580  optionsSpecifiques.utiliserDegrade,
581  styleGlobal.utiliserDegrade
582  ),
583
584  strokeStyle:
585  optionsSpecifiques.strokeStyle ||
586  styleGlobal.strokeStyle,
587
588  lineWidth:
589  valeurDefinie(
590  optionsSpecifiques.lineWidth,
591  Math.max(
592  2,
593  W * styleGlobal.lineWidthRatio
594  )
595  ),
596
597  shadowColor:
598  optionsSpecifiques.shadowColor ||
599  styleGlobal.shadowColor,
600
601  shadowBlur:
602  valeurDefinie(
603  optionsSpecifiques.shadowBlur,
604  Math.max(
605  1,
606  W * styleGlobal.shadowBlurRatio
607  )
608  ),
609
610  shadowOffsetX:
611  valeurDefinie(
612  optionsSpecifiques.shadowOffsetX,
613  W *
614  styleGlobal.shadowOffsetXRatio
615  ),
616
617  shadowOffsetY:
618  valeurDefinie(
619  optionsSpecifiques.shadowOffsetY,
620  W *
621  styleGlobal.shadowOffsetYRatio
622  )
623  };
624 }
625
626
627 /* ============================================================
628  * TEXTE DROIT ET CENTR�
629  * ============================================================ */
630
631 function dessinerTexteCentre(
632  ctx,
633  texte,
634  options
635 ) {
636  if (!texte) {
637  return;
638  }
639
640  var fontSize =
641  ajusterTaillePolice(
642  ctx,
643  texte,
644  options.maxWidth,
645  options.fontSize,
646  options.fontFamily,
647  options.fontWeight,
648  options.minFontSize || 10
649  );
650
651  ctx.save();
652
653  ctx.font =
654  options.fontWeight + " " +
655  fontSize + "px " +
656  options.fontFamily;
657
658  ctx.textAlign = "center";
659  ctx.textBaseline = "middle";
660
661  ctx.lineJoin = "round";
662  ctx.miterLimit = 2;
663
664  ctx.shadowColor =
665  options.shadowColor;
666
667  ctx.shadowBlur =
668  options.shadowBlur;
669
670  ctx.shadowOffsetX =
671  options.shadowOffsetX;
672
673  ctx.shadowOffsetY =
674  options.shadowOffsetY;
675
676  ctx.strokeStyle =
677  options.strokeStyle;
678
679  ctx.lineWidth =
680  options.lineWidth;
681
682  if (options.lineWidth > 0) {
683  ctx.strokeText(
684  texte,
685  options.x,
686  options.y
687  );
688  }
689
690  if (
691  options.utiliserDegrade
692  ) {
693  ctx.fillStyle =
694  creerDegradeOr(
695  ctx,
696  options.y,
697  fontSize * 1.3
698  );
699  } else {
700  ctx.fillStyle =
701  options.fillStyle ||
702  "#ffffff";
703  }
704
705  ctx.fillText(
706  texte,
707  options.x,
708  options.y
709  );
710
711  ctx.restore();
712 }
713
714
715 /* ============================================================
716  * TEXTE SUR ARC
717  * ============================================================ */
718
719 function dessinerTexteSurArc(
720  ctx,
721  texte,
722  options
723 ) {
724  if (!texte) {
725  return;
726  }
727
728  var centreX =
729  options.centreX;
730
731  var centreY =
732  options.centreY;
733
734  var rayon =
735  options.rayon;
736
737  var angleDebut =
738  options.angleDebut;
739
740  var angleFin =
741  options.angleFin;
742
743  var decalageX =
744  valeurDefinie(
745  options.decalageX,
746  0
747  );
748
749  var decalageY =
750  valeurDefinie(
751  options.decalageY,
752  0
753  );
754
755  var decalageRayon =
756  valeurDefinie(
757  options.decalageRayon,
758  0
759  );
760
761  var fontSize =
762  valeurDefinie(
763  options.fontSize,
764  40
765  );
766
767  var fontFamily =
768  options.fontFamily ||
769  "Arial";
770
771  var fontWeight =
772  options.fontWeight ||
773  "bold";
774
775  var minFontSize =
776  valeurDefinie(
777  options.minFontSize,
778  10
779  );
780
781  var kerning =
782  valeurDefinie(
783  options.kerning,
784  1
785  );
786
787  var inward =
788  valeurDefinie(
789  options.inward,
790  true
791  );
792
793  var remplirArc =
794  valeurDefinie(
795  options.remplirArc,
796  false
797  );
798
799  var rayonFinal =
800  rayon + decalageRayon;
801
802  var lettres =
803  Array.from(texte);
804
805  var largeurs = [];
806  var largeurTotale = 0;
807
808  var amplitudeDisponible =
809  Math.abs(
810  angleFin - angleDebut
811  );
812
813  var longueurArcDisponible =
814  amplitudeDisponible *
815  rayonFinal;
816
817  ctx.save();
818
819  while (fontSize > minFontSize) {
820  ctx.font =
821  fontWeight + " " +
822  fontSize + "px " +
823  fontFamily;
824
825  largeurTotale = 0;
826  largeurs = [];
827
828  for (
829  var i = 0;
830  i < lettres.length;
831  i++
832  ) {
833  var largeurLettre =
834  ctx.measureText(
835  lettres[i]
836  ).width;
837
838  if (
839  i < lettres.length - 1
840  ) {
841  largeurLettre +=
842  kerning;
843  }
844
845  largeurs.push(
846  largeurLettre
847  );
848
849  largeurTotale +=
850  largeurLettre;
851  }
852
853  if (
854  largeurTotale <=
855  longueurArcDisponible
856  ) {
857  break;
858  }
859
860  fontSize--;
861  }
862
863  ctx.font =
864  fontWeight + " " +
865  fontSize + "px " +
866  fontFamily;
867
868  ctx.textAlign = "center";
869  ctx.textBaseline = "middle";
870  ctx.lineJoin = "round";
871
872  var amplitudeTexte;
873
874  if (remplirArc) {
875  amplitudeTexte =
876  angleFin -
877  angleDebut;
878  } else {
879  amplitudeTexte =
880  largeurTotale /
881  rayonFinal;
882
883  if (
884  angleFin < angleDebut
885  ) {
886  amplitudeTexte *= -1;
887  }
888  }
889
890  var angleCentral =
891  (angleDebut + angleFin) /
892  2;
893
894  var angleCourant =
895  angleCentral -
896  amplitudeTexte / 2;
897
898  for (
899  var j = 0;
900  j < lettres.length;
901  j++
902  ) {
903  var proportion =
904  largeurs[j] /
905  largeurTotale;
906
907  var angleLettre =
908  amplitudeTexte *
909  proportion;
910
911  var angleMilieu =
912  angleCourant +
913  angleLettre / 2;
914
915  var x =
916  centreX +
917  decalageX +
918  Math.cos(angleMilieu) *
919  rayonFinal;
920
921  var y =
922  centreY +
923  decalageY +
924  Math.sin(angleMilieu) *
925  rayonFinal;
926
927  ctx.save();
928
929  ctx.translate(x, y);
930
931  if (inward) {
932  ctx.rotate(
933  angleMilieu +
934  Math.PI / 2
935  );
936  } else {
937  ctx.rotate(
938  angleMilieu -
939  Math.PI / 2
940  );
941  }
942
943  ctx.shadowColor =
944  options.shadowColor;
945
946  ctx.shadowBlur =
947  options.shadowBlur;
948
949  ctx.shadowOffsetX =
950  options.shadowOffsetX;
951
952  ctx.shadowOffsetY =
953  options.shadowOffsetY;
954
955  ctx.strokeStyle =
956  options.strokeStyle;
957
958  ctx.lineWidth =
959  options.lineWidth;
960
961  if (options.lineWidth > 0) {
962  ctx.strokeText(
963  lettres[j],
964  0,
965  0
966  );
967  }
968
969  if (
970  options.utiliserDegrade
971  ) {
972  ctx.fillStyle =
973  creerDegradeOr(
974  ctx,
975  0,
976  fontSize * 1.3
977  );
978  } else {
979  ctx.fillStyle =
980  options.fillStyle ||
981  "#ffffff";
982  }
983
984  ctx.fillText(
985  lettres[j],
986  0,
987  0
988  );
989
990  ctx.restore();
991
992  angleCourant +=
993  angleLettre;
994  }
995
996  ctx.restore();
997 }
998
999
1000 /* ============================================================
1001  * EXTRACTION DES DEUX LIGNES CENTRALES
1002  *
1003  * Nouveau format :
1004  * ligneCentre1: "129"
1005  * ligneCentre2: "sur 625"
1006  *
1007  * Compatibilit� :
1008  * classement: "129/sur 625"
1009  * ============================================================ */
1010
1011 function extraireTexteCentral(options) {
1012  var ligne1 =
1013  valeurDefinie(
1014  options.ligneCentre1,
1015  ""
1016  );
1017
1018  var ligne2 =
1019  valeurDefinie(
1020  options.ligneCentre2,
1021  ""
1022  );
1023
1024  if (
1025  (!ligne1 || !ligne2) &&
1026  options.classement
1027  ) {
1028  var morceaux =
1029  String(
1030  options.classement
1031  ).split("/");
1032
1033  if (
1034  !ligne1 &&
1035  morceaux.length > 0
1036  ) {
1037  ligne1 =
1038  morceaux[0];
1039  }
1040
1041  if (
1042  !ligne2 &&
1043  morceaux.length > 1
1044  ) {
1045  ligne2 =
1046  morceaux
1047  .slice(1)
1048  .join("/");
1049  }
1050  }
1051
1052  return {
1053  ligne1:
1054  String(ligne1 || ""),
1055
1056  ligne2:
1057  String(ligne2 || "")
1058  };
1059 }
1060
1061
1062 /* ============================================================
1063  * G�N�RATION DE LA M�DAILLE
1064  * ============================================================ */
1065
1066 function genererImageMedaille(options) {
1067  options = options || {};
1068
1069  var template =
1070  options.template ||
1071  "mensuel-style1";
1072
1073  var fondUrl =
1074  options.fondUrl ||
1075  MEDAILLE_FONDS[template];
1076
1077  var layout =
1078  MEDAILLE_LAYOUTS[template];
1079
1080  if (!fondUrl) {
1081  return Promise.reject(
1082  new Error(
1083  "Fond introuvable pour le mod�le : " +
1084  template
1085  )
1086  );
1087  }
1088
1089  if (!layout) {
1090  return Promise.reject(
1091  new Error(
1092  "Configuration introuvable pour le mod�le : " +
1093  template
1094  )
1095  );
1096  }
1097
1098  var styleGlobal;
1099
1100  try {
1101  styleGlobal =
1102  obtenirStyleTexte(
1103  obtenirNomStyleTexte(options)
1104  );
1105  } catch (erreurStyle) {
1106  return Promise.reject(
1107  erreurStyle
1108  );
1109  }
1110
1111  var competition =
1112  (
1113  options.competition ||
1114  "TOURNOI DUPLICATE"
1115  ).toUpperCase();
1116
1117  var texteCentral =
1118  extraireTexteCentral(
1119  options
1120  );
1121
1122  var texteCartouche =
1123  options.texteCartouche ||
1124  "";
1125
1126  /*
1127  * Les r�glages pass�s dans l'appel restent prioritaires.
1128  */
1129  var arcCompetition =
1130  fusionnerOptions(
1131  layout.competition,
1132  options.arcCompetition
1133  );
1134
1135  var reglageClassement =
1136  fusionnerOptions(
1137  layout.classement,
1138  options.reglageClassement
1139  );
1140
1141  var reglageCartouche =
1142  fusionnerOptions(
1143  layout.cartouche,
1144  options.reglageCartouche
1145  );
1146
1147  return chargerImage(fondUrl)
1148  .then(function(imageFond) {
1149  var canvas =
1150  document.createElement(
1151  "canvas"
1152  );
1153
1154  canvas.width =
1155  imageFond.naturalWidth ||
1156  imageFond.width;
1157
1158  canvas.height =
1159  imageFond.naturalHeight ||
1160  imageFond.height;
1161
1162  var ctx =
1163  canvas.getContext(
1164  "2d"
1165  );
1166
1167  if (!ctx) {
1168  throw new Error(
1169  "Le navigateur ne supporte pas Canvas 2D."
1170  );
1171  }
1172
1173  var W = canvas.width;
1174  var H = canvas.height;
1175
1176  ctx.clearRect(
1177  0,
1178  0,
1179  W,
1180  H
1181  );
1182
1183  ctx.drawImage(
1184  imageFond,
1185  0,
1186  0,
1187  W,
1188  H
1189  );
1190
1191
1192  /* ==========================================
1193  * STYLE DU TEXTE DE COMP�TITION
1194  * ========================================== */
1195
1196  var styleCompetition =
1197  creerOptionsStyleTexte(
1198  styleGlobal,
1199  W,
1200  {
1201  fontFamily:
1202  options.policeCompetition,
1203
1204  fillStyle:
1205  arcCompetition.fillStyle,
1206
1207  strokeStyle:
1208  arcCompetition.strokeStyle,
1209
1210  lineWidth:
1211  arcCompetition.lineWidth
1212  }
1213  );
1214
1215
1216  /* ==========================================
1217  * COMP�TITION SUR ARC
1218  * ========================================== */
1219
1220  dessinerTexteSurArc(
1221  ctx,
1222  competition,
1223  {
1224  centreX:
1225  W *
1226  arcCompetition.centreX,
1227
1228  centreY:
1229  H *
1230  arcCompetition.centreY,
1231
1232  rayon:
1233  W *
1234  arcCompetition.rayon,
1235
1236  angleDebut:
1237  degToRad(
1238  arcCompetition.angleDebut
1239  ),
1240
1241  angleFin:
1242  degToRad(
1243  arcCompetition.angleFin
1244  ),
1245
1246  decalageX:
1247  arcCompetition.decalageX,
1248
1249  decalageY:
1250  arcCompetition.decalageY,
1251
1252  decalageRayon:
1253  arcCompetition.decalageRayon,
1254
1255  fontSize:
1256  Math.round(
1257  W *
1258  arcCompetition.fontSize
1259  ),
1260
1261  minFontSize:
1262  Math.round(
1263  W * 0.014
1264  ),
1265
1266  fontFamily:
1267  styleCompetition.fontFamily,
1268
1269  fontWeight:
1270  styleCompetition.fontWeight,
1271
1272  inward:
1273  valeurDefinie(
1274  arcCompetition.inward,
1275  true
1276  ),
1277
1278  remplirArc:
1279  valeurDefinie(
1280  arcCompetition.remplirArc,
1281  true
1282  ),
1283
1284  kerning:
1285  valeurDefinie(
1286  arcCompetition.kerning,
1287  2
1288  ),
1289
1290  utiliserDegrade:
1291  styleCompetition.utiliserDegrade,
1292
1293  fillStyle:
1294  styleCompetition.fillStyle,
1295
1296  strokeStyle:
1297  styleCompetition.strokeStyle,
1298
1299  lineWidth:
1300  styleCompetition.lineWidth,
1301
1302  shadowColor:
1303  styleCompetition.shadowColor,
1304
1305  shadowBlur:
1306  styleCompetition.shadowBlur,
1307
1308  shadowOffsetX:
1309  styleCompetition.shadowOffsetX,
1310
1311  shadowOffsetY:
1312  styleCompetition.shadowOffsetY
1313  }
1314  );
1315
1316
1317  /* ==========================================
1318  * POSITION CENTRALE
1319  * ========================================== */
1320
1321  var centreX =
1322  W *
1323  reglageClassement.x +
1324  valeurDefinie(
1325  reglageClassement.decalageX,
1326  0
1327  );
1328
1329  var centreY =
1330  H *
1331  reglageClassement.y +
1332  valeurDefinie(
1333  reglageClassement.decalageY,
1334  0
1335  );
1336
1337  var ecartLignes =
1338  H *
1339  reglageClassement.ecartLignes;
1340
1341
1342  /* ==========================================
1343  * STYLE PREMI�RE LIGNE
1344  * ========================================== */
1345
1346  var styleLigne1 =
1347  creerOptionsStyleTexte(
1348  styleGlobal,
1349  W,
1350  {
1351  fontFamily:
1352  options.policeClassement,
1353
1354  fontWeight:
1355  "900",
1356
1357  fillStyle:
1358  reglageClassement
1359  .ligne1FillStyle,
1360
1361  strokeStyle:
1362  reglageClassement
1363  .ligne1StrokeStyle,
1364
1365  lineWidth:
1366  reglageClassement
1367  .ligne1LineWidth
1368  }
1369  );
1370
1371
1372  /* ==========================================
1373  * PREMI�RE LIGNE CENTRALE
1374  * ========================================== */
1375
1376  dessinerTexteCentre(
1377  ctx,
1378  texteCentral.ligne1,
1379  {
1380  x:
1381  centreX,
1382
1383  y:
1384  centreY -
1385  ecartLignes / 2,
1386
1387  maxWidth:
1388  W *
1389  reglageClassement
1390  .ligne1MaxWidth,
1391
1392  fontSize:
1393  Math.round(
1394  W *
1395  reglageClassement
1396  .ligne1FontSize
1397  ),
1398
1399  minFontSize:
1400  Math.round(
1401  W * 0.06
1402  ),
1403
1404  fontFamily:
1405  styleLigne1.fontFamily,
1406
1407  fontWeight:
1408  styleLigne1.fontWeight,
1409
1410  utiliserDegrade:
1411  styleLigne1.utiliserDegrade,
1412
1413  fillStyle:
1414  styleLigne1.fillStyle,
1415
1416  strokeStyle:
1417  styleLigne1.strokeStyle,
1418
1419  lineWidth:
1420  styleLigne1.lineWidth,
1421
1422  shadowColor:
1423  styleLigne1.shadowColor,
1424
1425  shadowBlur:
1426  styleLigne1.shadowBlur,
1427
1428  shadowOffsetX:
1429  styleLigne1.shadowOffsetX,
1430
1431  shadowOffsetY:
1432  styleLigne1.shadowOffsetY
1433  }
1434  );
1435
1436
1437  /* ==========================================
1438  * STYLE DEUXI�ME LIGNE
1439  * ========================================== */
1440
1441  var styleLigne2 =
1442  creerOptionsStyleTexte(
1443  styleGlobal,
1444  W,
1445  {
1446  fontFamily:
1447  options.policeLigneCentre2,
1448
1449  fillStyle:
1450  reglageClassement
1451  .ligne2FillStyle,
1452
1453  strokeStyle:
1454  reglageClassement
1455  .ligne2StrokeStyle,
1456
1457  lineWidth:
1458  reglageClassement
1459  .ligne2LineWidth
1460  }
1461  );
1462
1463
1464  /* ==========================================
1465  * DEUXI�ME LIGNE CENTRALE
1466  * ========================================== */
1467
1468  dessinerTexteCentre(
1469  ctx,
1470  texteCentral.ligne2,
1471  {
1472  x:
1473  centreX,
1474
1475  y:
1476  centreY +
1477  ecartLignes / 2,
1478
1479  maxWidth:
1480  W *
1481  reglageClassement
1482  .ligne2MaxWidth,
1483
1484  fontSize:
1485  Math.round(
1486  W *
1487  reglageClassement
1488  .ligne2FontSize
1489  ),
1490
1491  minFontSize:
1492  Math.round(
1493  W * 0.025
1494  ),
1495
1496  fontFamily:
1497  styleLigne2.fontFamily,
1498
1499  fontWeight:
1500  styleLigne2.fontWeight,
1501
1502  utiliserDegrade:
1503  styleLigne2.utiliserDegrade,
1504
1505  fillStyle:
1506  styleLigne2.fillStyle,
1507
1508  strokeStyle:
1509  styleLigne2.strokeStyle,
1510
1511  lineWidth:
1512  styleLigne2.lineWidth,
1513
1514  shadowColor:
1515  styleLigne2.shadowColor,
1516
1517  shadowBlur:
1518  styleLigne2.shadowBlur,
1519
1520  shadowOffsetX:
1521  styleLigne2.shadowOffsetX,
1522
1523  shadowOffsetY:
1524  styleLigne2.shadowOffsetY
1525  }
1526  );
1527
1528
1529  /* ==========================================
1530  * STYLE DU CARTOUCHE
1531  * ========================================== */
1532
1533  var styleCartouche =
1534  creerOptionsStyleTexte(
1535  styleGlobal,
1536  W,
1537  {
1538  fontFamily:
1539  options.policeCartouche,
1540
1541  fillStyle:
1542  reglageCartouche.fillStyle,
1543
1544  strokeStyle:
1545  reglageCartouche.strokeStyle,
1546
1547  lineWidth:
1548  reglageCartouche.lineWidth
1549  }
1550  );
1551
1552
1553  /* ==========================================
1554  * CARTOUCHE INF�RIEUR
1555  * ========================================== */
1556
1557  dessinerTexteCentre(
1558  ctx,
1559  texteCartouche,
1560  {
1561  x:
1562  W *
1563  reglageCartouche.x +
1564  valeurDefinie(
1565  reglageCartouche
1566  .decalageX,
1567  0
1568  ),
1569
1570  y:
1571  H *
1572  reglageCartouche.y +
1573  valeurDefinie(
1574  reglageCartouche
1575  .decalageY,
1576  0
1577  ),
1578
1579  maxWidth:
1580  W *
1581  reglageCartouche
1582  .maxWidth,
1583
1584  fontSize:
1585  Math.round(
1586  W *
1587  reglageCartouche
1588  .fontSize
1589  ),
1590
1591  minFontSize:
1592  Math.round(
1593  W * 0.015
1594  ),
1595
1596  fontFamily:
1597  styleCartouche.fontFamily,
1598
1599  fontWeight:
1600  styleCartouche.fontWeight,
1601
1602  utiliserDegrade:
1603  styleCartouche.utiliserDegrade,
1604
1605  fillStyle:
1606  styleCartouche.fillStyle,
1607
1608  strokeStyle:
1609  styleCartouche.strokeStyle,
1610
1611  lineWidth:
1612  styleCartouche.lineWidth,
1613
1614  shadowColor:
1615  styleCartouche.shadowColor,
1616
1617  shadowBlur:
1618  styleCartouche.shadowBlur,
1619
1620  shadowOffsetX:
1621  styleCartouche.shadowOffsetX,
1622
1623  shadowOffsetY:
1624  styleCartouche.shadowOffsetY
1625  }
1626  );
1627
1628
1629  return {
1630  canvas: canvas,
1631
1632  dataURL:
1633  canvas.toDataURL(
1634  "image/png"
1635  ),
1636
1637  toBlob: function() {
1638  return new Promise(
1639  function(
1640  resolve,
1641  reject
1642  ) {
1643  canvas.toBlob(
1644  function(blob) {
1645   if (blob) {
1646   resolve(
1647   blob
1648   );
1649   } else {
1650   reject(
1651   new Error(
1652   "Impossible de g�n�rer le PNG."
1653   )
1654   );
1655   }
1656  },
1657  "image/png"
1658  );
1659  }
1660  );
1661  }
1662  };
1663  });
1664 }
1665
1666
1667 /* ============================================================
1668  * AFFICHAGE DANS UNE BALISE IMG
1669  * ============================================================ */
1670
1671 function afficherMedailleDansImg(
1672  imgOuId,
1673  options
1674 ) {
1675  var elementImage;
1676
1677  if (
1678  typeof imgOuId === "string"
1679  ) {
1680  elementImage =
1681  document.getElementById(
1682  imgOuId
1683  );
1684  } else {
1685  elementImage =
1686  imgOuId;
1687  }
1688
1689  if (!elementImage) {
1690  return Promise.reject(
1691  new Error(
1692  "�l�ment image introuvable : " +
1693  imgOuId
1694  )
1695  );
1696  }
1697
1698  if (
1699  elementImage.tagName &&
1700  elementImage.tagName
1701  .toLowerCase() !== "img"
1702  ) {
1703  return Promise.reject(
1704  new Error(
1705  "L'�l�ment cible doit �tre une balise <img>."
1706  )
1707  );
1708  }
1709
1710  options = options || {};
1711
1712  elementImage.setAttribute(
1713  "aria-busy",
1714  "true"
1715  );
1716
1717  return genererImageMedaille(
1718  options
1719  )
1720  .then(function(resultat) {
1721  elementImage.src =
1722  resultat.dataURL;
1723
1724  elementImage.alt =
1725  options.alt ||
1726  "M�daille " +
1727  (
1728  options.competition ||
1729  ""
1730  );
1731
1732  elementImage.removeAttribute(
1733  "aria-busy"
1734  );
1735
1736  return resultat;
1737  })
1738  .catch(function(erreur) {
1739  elementImage.removeAttribute(
1740  "aria-busy"
1741  );
1742
1743  console.error(
1744  "Erreur de g�n�ration de la m�daille :",
1745  erreur
1746  );
1747
1748  throw erreur;
1749  });
1750 }
1751
1752
1753 /* ============================================================
1754  * T�L�CHARGEMENT
1755  * ============================================================ */
1756
1757 function telechargerMedaille(
1758  options,
1759  nomFichier
1760 ) {
1761  return genererImageMedaille(
1762  options
1763  )
1764  .then(function(resultat) {
1765  var lien =
1766  document.createElement(
1767  "a"
1768  );
1769
1770  lien.href =
1771  resultat.dataURL;
1772
1773  lien.download =
1774  nomFichier ||
1775  "medaille.png";
1776
1777  document.body.appendChild(
1778  lien
1779  );
1780
1781  lien.click();
1782
1783  document.body.removeChild(
1784  lien
1785  );
1786
1787  return resultat;
1788  });
1789 }
1790
1791 window.genererImageMedaille = genererImageMedaille;
1792 window.afficherMedailleDansImg = afficherMedailleDansImg;
1793 window.telechargerMedaille = telechargerMedaille;
1794
1795 class VisualiseurMedailles {
1796  constructor(elementRacine, donnees) {
1797  if (elementRacine.__visualiseurMedaillesInstance) {
1798   return elementRacine.__visualiseurMedaillesInstance;
1799  }
1800
1801  this.racine = elementRacine;
1802  this.toutesDonnees = donnees.slice();
1803  this.donnees = this.toutesDonnees.slice();
1804
1805  this.scroll = this.racine.querySelector("#medaillesScroll");
1806  this.liste = this.racine.querySelector("#medaillesListe");
1807  this.filtres = this.racine.querySelector("#medaillesFiltres");
1808  this.nom = this.racine.querySelector("#medailleNom");
1809  this.description = this.racine.querySelector("#medailleDescription");
1810  this.statut = this.racine.querySelector("#medailleStatut");
1811  this.agrandissement = this.racine.querySelector("#medailleAgrandie");
1812  this.imageAgrandie = this.racine.querySelector("#imageMedailleAgrandie");
1813  this.fermetureAgrandissement = this.racine.querySelector("#fermerMedailleAgrandie");
1814
1815  this.elements = [];
1816  this.indexActif = -1;
1817  this.indexAgrandie = -1;
1818  this.elementAvantAgrandissement = null;
1819  this.animationDemandee = false;
1820  this.timerCentrage = null;
1821  this.interactionEnCours = false;
1822  this.utiliseBarreDefilement = false;
1823
1824  this.glisserActif = false;
1825  this.positionDepartX = 0;
1826  this.scrollDepart = 0;
1827  this.aBougeEnGlissant = false;
1828
1829  this.initialiserFiltres();
1830  this.creerMedailles();
1831  this.ajouterEvenements();
1832  this.mettreAJourPadding();
1833  this.racine.__visualiseurMedaillesInstance = this;
1834
1835  requestAnimationFrame(() => {
1836   this.centrerMedaille(0, false);
1837   this.mettreAJourEffet();
1838  });
1839  }
1840
1841  normaliserCategorie(categorie) {
1842  return categorie === "annuel" ||
1843   categorie === "mensuel" ||
1844   categorie === "tournoi" ||
1845   categorie === "autre"
1846   ? categorie
1847   : "autre";
1848  }
1849
1850  initialiserFiltres() {
1851  if (!this.filtres) {
1852   return;
1853  }
1854
1855  this.filtres.textContent = "";
1856
1857  const ordreCategories = ["tournoi", "annuel", "mensuel", "autre"];
1858  const categoriesPresentes = ordreCategories.filter((categorie) =>
1859   this.toutesDonnees.some((medaille) =>
1860   this.normaliserCategorie(medaille.categorie) === categorie
1861   )
1862  );
1863
1864  if (categoriesPresentes.length <= 1) {
1865   this.filtres.hidden = true;
1866   return;
1867  }
1868
1869  const libelles = {
1870   toutes: "Toutes",
1871   tournoi: "Tournoi",
1872   annuel: "Annuel",
1873   mensuel: "Mensuel",
1874   autre: "Autre"
1875  };
1876
1877  ["toutes"].concat(categoriesPresentes).forEach((categorie) => {
1878   const bouton = document.createElement("button");
1879   bouton.type = "button";
1880   bouton.className = "visualiseur-medailles__filtre";
1881   bouton.dataset.categorie = categorie;
1882   bouton.textContent = libelles[categorie];
1883   bouton.setAttribute(
1884   "aria-pressed",
1885   categorie === "toutes" ? "true" : "false"
1886   );
1887
1888   if (categorie === "toutes") {
1889   bouton.classList.add("visualiseur-medailles__filtre--actif");
1890   }
1891
1892   bouton.addEventListener("click", () => {
1893   this.appliquerFiltre(categorie);
1894   });
1895
1896   this.filtres.appendChild(bouton);
1897  });
1898
1899  this.filtres.hidden = false;
1900  }
1901
1902  appliquerFiltre(categorie) {
1903  this.fermerMedailleAgrandie(false);
1904
1905  this.donnees = categorie === "toutes"
1906   ? this.toutesDonnees.slice()
1907   : this.toutesDonnees.filter((medaille) =>
1908   this.normaliserCategorie(medaille.categorie) === categorie
1909   );
1910
1911  this.filtres.querySelectorAll(".visualiseur-medailles__filtre")
1912   .forEach((bouton) => {
1913   const actif = bouton.dataset.categorie === categorie;
1914   bouton.classList.toggle(
1915    "visualiseur-medailles__filtre--actif",
1916    actif
1917   );
1918   bouton.setAttribute(
1919    "aria-pressed",
1920    actif ? "true" : "false"
1921   );
1922   });
1923
1924  this.creerMedailles();
1925  this.scroll.scrollLeft = 0;
1926  this.mettreAJourPadding();
1927
1928  requestAnimationFrame(() => {
1929   this.centrerMedaille(0, false);
1930   this.mettreAJourEffet();
1931  });
1932  }
1933
1934  creerMedailles() {
1935  this.liste.textContent = "";
1936  this.elements = [];
1937  this.indexActif = -1;
1938
1939  const fragment = document.createDocumentFragment();
1940
1941  this.donnees.forEach((medaille, index) => {
1942   const bouton = document.createElement("button");
1943
1944   bouton.type = "button";
1945   bouton.className = "medaille";
1946   bouton.dataset.index = index;
1947   bouton.dataset.categorie =
1948   this.normaliserCategorie(medaille.categorie);
1949   bouton.setAttribute("aria-label", medaille.nom);
1950
1951   if (medaille.statut === "verrouillee") {
1952   bouton.classList.add("medaille--verrouillee");
1953   }
1954
1955   if (medaille.statut === "en_cours") {
1956   bouton.classList.add("medaille--en-cours");
1957   }
1958
1959   const image = document.createElement("img");
1960   image.className = "medaille__image";
1961   image.alt = "";
1962   image.loading = "lazy";
1963   image.draggable = false;
1964
1965   if (medaille.optionsImage) {
1966   afficherMedailleDansImg(image, medaille.optionsImage)
1967    .catch(function() {
1968    bouton.classList.add("medaille--erreur");
1969    });
1970   } else if (medaille.image) {
1971   image.src = medaille.image;
1972   }
1973
1974   bouton.appendChild(image);
1975
1976   bouton.addEventListener("click", () => {
1977   /*
1978    * Evite qu'un glissement de souris soit interpr�t�
1979    * comme un clic sur une m�daille.
1980    */
1981   if (this.aBougeEnGlissant) {
1982    return;
1983   }
1984
1985   this.centrerMedaille(index, true);
1986   this.definirMedailleActive(index);
1987   this.ouvrirMedailleAgrandie(index, bouton, image);
1988   });
1989
1990   fragment.appendChild(bouton);
1991   this.elements.push(bouton);
1992  });
1993
1994  this.liste.appendChild(fragment);
1995  }
1996
1997  ouvrirMedailleAgrandie(index, bouton, image) {
1998  if (
1999   !this.agrandissement ||
2000   !this.imageAgrandie ||
2001   !this.fermetureAgrandissement
2002  ) {
2003   return;
2004  }
2005
2006  const medaille = this.donnees[index];
2007
2008  if (!medaille) {
2009   return;
2010  }
2011
2012  this.indexAgrandie = index;
2013  this.elementAvantAgrandissement = bouton;
2014  this.imageAgrandie.alt = medaille.nom;
2015  this.agrandissement.setAttribute(
2016   "aria-label",
2017   "M�daille agrandie : " + medaille.nom
2018  );
2019
2020  const appliquerSource = () => {
2021   if (this.indexAgrandie !== index) {
2022   return;
2023   }
2024
2025   const source =
2026   image.currentSrc ||
2027   image.getAttribute("src");
2028
2029   if (source) {
2030   this.imageAgrandie.src = source;
2031   }
2032  };
2033
2034  appliquerSource();
2035
2036  if (!image.getAttribute("src")) {
2037   image.addEventListener(
2038   "load",
2039   appliquerSource,
2040   { once: true }
2041   );
2042  }
2043
2044  this.agrandissement.removeAttribute("hidden");
2045  this.racine.classList.add(
2046   "visualiseur-medailles--agrandie"
2047  );
2048
2049  requestAnimationFrame(() => {
2050   this.fermetureAgrandissement.focus();
2051  });
2052  }
2053
2054  fermerMedailleAgrandie(restaurerFocus) {
2055  if (!this.agrandissement || this.agrandissement.hidden) {
2056   return;
2057  }
2058
2059  const elementAFocaliser = this.elementAvantAgrandissement;
2060
2061  this.agrandissement.setAttribute("hidden", "hidden");
2062  this.racine.classList.remove(
2063   "visualiseur-medailles--agrandie"
2064  );
2065  this.imageAgrandie.removeAttribute("src");
2066  this.imageAgrandie.alt = "";
2067  this.indexAgrandie = -1;
2068  this.elementAvantAgrandissement = null;
2069
2070  if (
2071   restaurerFocus !== false &&
2072   elementAFocaliser &&
2073   document.documentElement.contains(elementAFocaliser)
2074  ) {
2075   elementAFocaliser.focus();
2076  }
2077  }
2078
2079  ajouterEvenements() {
2080  this.scroll.addEventListener("scroll", () => {
2081   this.demanderMiseAJour();
2082
2083   clearTimeout(this.timerCentrage);
2084
2085   /*
2086   * Ne jamais recentrer pendant que l'utilisateur maintient
2087   * la souris ou manipule la barre de d�filement.
2088   */
2089   if (this.interactionEnCours) {
2090   return;
2091   }
2092
2093   this.timerCentrage = setTimeout(() => {
2094   if (!this.interactionEnCours) {
2095    this.centrerMedailleLaPlusProche();
2096   }
2097   }, 220);
2098  }, { passive: true });
2099
2100  /*
2101   * Glissement horizontal a la souris par cliquer-glisser.
2102   * Sur un ecran tactile, le navigateur conserve nativement le
2103   * geste horizontal ici et le geste vertical pour la page.
2104   */
2105  this.scroll.addEventListener("pointerdown", (evenement) => {
2106   this.interactionEnCours = true;
2107   clearTimeout(this.timerCentrage);
2108
2109   if (evenement.pointerType === "touch") {
2110   return;
2111   }
2112
2113   /*
2114   * D�tecte un clic dans la zone de la barre horizontale.
2115   * Dans ce cas, on laisse le navigateur g�rer enti�rement
2116   * la barre et on ne lance pas le cliquer-glisser maison.
2117   */
2118   const rectangle = this.scroll.getBoundingClientRect();
2119   const hauteurBarre =
2120   this.scroll.offsetHeight - this.scroll.clientHeight;
2121
2122   this.utiliseBarreDefilement =
2123   hauteurBarre > 0 &&
2124   evenement.clientY >= rectangle.bottom - hauteurBarre - 2;
2125
2126   if (this.utiliseBarreDefilement) {
2127   return;
2128   }
2129
2130   if (evenement.button !== 0) {
2131   return;
2132   }
2133
2134   this.glisserActif = true;
2135   this.aBougeEnGlissant = false;
2136   this.positionDepartX = evenement.clientX;
2137   this.scrollDepart = this.scroll.scrollLeft;
2138
2139  });
2140
2141  this.scroll.addEventListener("pointermove", (evenement) => {
2142   if (!this.glisserActif) {
2143   return;
2144   }
2145
2146   const distance = evenement.clientX - this.positionDepartX;
2147
2148   if (Math.abs(distance) > 6 && !this.aBougeEnGlissant) {
2149   this.aBougeEnGlissant = true;
2150
2151   /*
2152    * La capture n'est activ�e qu'une fois le glissement
2153    * confirm�. Un simple clic reste ainsi destin� au
2154    * bouton de la m�daille.
2155    */
2156   if (
2157    this.scroll.setPointerCapture &&
2158    !this.scroll.hasPointerCapture(evenement.pointerId)
2159   ) {
2160    this.scroll.setPointerCapture(evenement.pointerId);
2161   }
2162   }
2163
2164   this.scroll.scrollLeft = this.scrollDepart - distance;
2165  });
2166
2167  const terminerInteraction = (evenement) => {
2168   const etaitEnGlissement = this.glisserActif;
2169
2170   this.glisserActif = false;
2171   this.interactionEnCours = false;
2172   this.utiliseBarreDefilement = false;
2173
2174   if (
2175   this.scroll.hasPointerCapture &&
2176   this.scroll.hasPointerCapture(evenement.pointerId)
2177   ) {
2178   this.scroll.releasePointerCapture(evenement.pointerId);
2179   }
2180
2181   /*
2182   * Laisse d'abord la barre native terminer son d�placement,
2183   * puis centre doucement la m�daille la plus proche.
2184   */
2185   clearTimeout(this.timerCentrage);
2186   this.timerCentrage = setTimeout(() => {
2187   if (!this.interactionEnCours) {
2188    this.mettreAJourEffet();
2189    this.centrerMedailleLaPlusProche();
2190   }
2191   }, etaitEnGlissement ? 40 : 120);
2192
2193   setTimeout(() => {
2194   this.aBougeEnGlissant = false;
2195   }, 0);
2196  };
2197
2198  this.scroll.addEventListener("pointerup", terminerInteraction);
2199  this.scroll.addEventListener("pointercancel", terminerInteraction);
2200
2201  /*
2202   * Si le bouton est rel�ch� hors du composant apr�s avoir
2203   * manipul� la barre de d�filement.
2204   */
2205  window.addEventListener("pointerup", (evenement) => {
2206   if (this.interactionEnCours) {
2207   terminerInteraction(evenement);
2208   }
2209  });
2210
2211  /*
2212   * Navigation clavier.
2213   */
2214  this.scroll.addEventListener("keydown", (evenement) => {
2215   if (evenement.key === "ArrowRight") {
2216   evenement.preventDefault();
2217   this.centrerMedaille(
2218    Math.min(this.indexActif + 1, this.elements.length - 1),
2219    true
2220   );
2221   }
2222
2223   if (evenement.key === "ArrowLeft") {
2224   evenement.preventDefault();
2225   this.centrerMedaille(
2226    Math.max(this.indexActif - 1, 0),
2227    true
2228   );
2229   }
2230
2231   if (evenement.key === "Home") {
2232   evenement.preventDefault();
2233   this.centrerMedaille(0, true);
2234   }
2235
2236   if (evenement.key === "End") {
2237   evenement.preventDefault();
2238   this.centrerMedaille(this.elements.length - 1, true);
2239   }
2240  });
2241
2242  window.addEventListener("resize", () => {
2243   this.mettreAJourPadding();
2244   this.demanderMiseAJour();
2245  });
2246
2247  if (
2248   this.agrandissement &&
2249   this.fermetureAgrandissement
2250  ) {
2251   this.fermetureAgrandissement.addEventListener(
2252   "click",
2253   () => this.fermerMedailleAgrandie(true)
2254   );
2255
2256   this.agrandissement.addEventListener(
2257   "click",
2258   (evenement) => {
2259    if (evenement.target === this.agrandissement) {
2260    this.fermerMedailleAgrandie(true);
2261    }
2262   }
2263   );
2264
2265   window.addEventListener("keydown", (evenement) => {
2266   if (
2267    evenement.key === "Escape" &&
2268    !this.agrandissement.hidden
2269   ) {
2270    evenement.preventDefault();
2271    this.fermerMedailleAgrandie(true);
2272   }
2273   });
2274  }
2275  }
2276
2277  mettreAJourPadding() {
2278  const largeurScroll = this.scroll.clientWidth;
2279  const largeurMedaille = this.elements[0]
2280   ? this.elements[0].offsetWidth
2281   : 0;
2282
2283  const padding = Math.max(
2284   0,
2285   (largeurScroll / 2) - (largeurMedaille / 2)
2286  );
2287
2288  this.liste.style.paddingLeft = padding + "px";
2289  this.liste.style.paddingRight = padding + "px";
2290  }
2291
2292  demanderMiseAJour() {
2293  if (this.animationDemandee) {
2294   return;
2295  }
2296
2297  this.animationDemandee = true;
2298
2299  requestAnimationFrame(() => {
2300   this.animationDemandee = false;
2301   this.mettreAJourEffet();
2302  });
2303  }
2304
2305  mettreAJourEffet() {
2306  if (this.elements.length === 0) {
2307   return;
2308  }
2309
2310  const rectangleScroll = this.scroll.getBoundingClientRect();
2311  const centreScroll =
2312   rectangleScroll.left + (rectangleScroll.width / 2);
2313
2314  /*
2315   * Plus cette valeur est grande, plus l'agrandissement
2316   * s'�tend sur les m�dailles voisines.
2317   */
2318  const rayonEffet = Math.max(190, rectangleScroll.width * 0.32);
2319
2320  let indexLePlusProche = 0;
2321  let distanceLaPlusProche = Infinity;
2322
2323  this.elements.forEach((element, index) => {
2324   const rectangle = element.getBoundingClientRect();
2325   const centreElement =
2326   rectangle.left + (rectangle.width / 2);
2327
2328   const distance = Math.abs(centreElement - centreScroll);
2329   const progression = Math.max(
2330   0,
2331   1 - (distance / rayonEffet)
2332   );
2333
2334   /*
2335   * Courbe d'agrandissement plus marqu�e au centre.
2336   */
2337   const intensite = Math.pow(progression, 1.65);
2338
2339   const echelle = 0.70 + (intensite * 0.78);
2340   const opacite = 0.38 + (intensite * 0.62);
2341   const decalageY = 15 - (intensite * 15);
2342   const flou = Math.max(0, (1 - intensite) * 0.7);
2343
2344   element.style.setProperty(
2345   "--echelle",
2346   echelle.toFixed(3)
2347   );
2348   element.style.setProperty(
2349   "--opacite",
2350   opacite.toFixed(3)
2351   );
2352   element.style.setProperty(
2353   "--decalage-y",
2354   decalageY.toFixed(1) + "px"
2355   );
2356   element.style.setProperty(
2357   "--flou",
2358   flou.toFixed(2) + "px"
2359   );
2360   element.style.zIndex =
2361   String(Math.round(echelle * 100));
2362
2363   if (distance < distanceLaPlusProche) {
2364   distanceLaPlusProche = distance;
2365   indexLePlusProche = index;
2366   }
2367  });
2368
2369  this.definirMedailleActive(indexLePlusProche);
2370  }
2371
2372  definirMedailleActive(index) {
2373  if (index === this.indexActif) {
2374   return;
2375  }
2376
2377  this.indexActif = index;
2378
2379  this.elements.forEach((element, position) => {
2380   const active = position === index;
2381
2382   element.classList.toggle("medaille--active", active);
2383
2384   if (active) {
2385   element.setAttribute("aria-current", "true");
2386   } else {
2387   element.removeAttribute("aria-current");
2388   }
2389  });
2390
2391  const medaille = this.donnees[index];
2392
2393  this.nom.textContent = medaille.nom;
2394  this.description.textContent = medaille.description;
2395  const statuts = {
2396   obtenue: {
2397   texte: "M�daille obtenue",
2398   classe: "details-medaille__statut--obtenue"
2399   },
2400   en_cours: {
2401   texte: "M�daille en cours",
2402   classe: "details-medaille__statut--en-cours"
2403   },
2404   verrouillee: {
2405   texte: "M�daille verrouill�e",
2406   classe: "details-medaille__statut--verrouillee"
2407   }
2408  };
2409  /*const statut = statuts[medaille.statut] ||
2410   (medaille.obtenue ? statuts.obtenue : statuts.verrouillee);
2411
2412  this.statut.textContent = statut.texte;
2413  this.statut.className =
2414   "details-medaille__statut " + statut.classe;*/
2415  }
2416
2417  centrerMedaille(index, animee) {
2418  const element = this.elements[index];
2419
2420  if (!element) {
2421   return;
2422  }
2423
2424  const position =
2425   element.offsetLeft
2426   + (element.offsetWidth / 2)
2427   - (this.scroll.clientWidth / 2);
2428
2429  this.scroll.scrollTo({
2430   left: position,
2431   behavior: animee ? "smooth" : "auto"
2432  });
2433  }
2434
2435  centrerMedailleLaPlusProche() {
2436  if (this.indexActif < 0) {
2437   return;
2438  }
2439
2440  this.centrerMedaille(this.indexActif, true);
2441  }
2442 }
2443
2444 window.VisualiseurMedailles = VisualiseurMedailles;
2445
2446
2447 function basculerDetailsProfil(bouton) {
2448  var details = document.getElementById(bouton.getAttribute("aria-controls"));
2449  if (!details) return;
2450  var ouvrir = details.hasAttribute("hidden");
2451  if (ouvrir) details.removeAttribute("hidden");
2452  else details.setAttribute("hidden", "hidden");
2453  bouton.setAttribute("aria-expanded", ouvrir ? "true" : "false");
2454 }
2455
2456 function basculerResultatJoueur(bouton) {
2457  var details = document.getElementById(bouton.getAttribute("aria-controls"));
2458  if (!details) return;
2459  var ouvrir = details.hasAttribute("hidden");
2460  if (ouvrir) details.removeAttribute("hidden");
2461  else details.setAttribute("hidden", "hidden");
2462  bouton.setAttribute("aria-expanded", ouvrir ? "true" : "false");
2463 }
2464
2465var webfontLibLoaded = false;
2466
2467function detectIE() {
2468 var ua = window.navigator.userAgent;
2469 
2470 var msie = ua.indexOf('MSIE ');
2471 if (msie > 0) {
2472 // IE 10 or older => return version number
2473 return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
2474 }
2475 
2476 var trident = ua.indexOf('Trident/');
2477 if (trident > 0) {
2478 // IE 11 => return version number
2479 var rv = ua.indexOf('rv:');
2480 return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
2481 }
2482 
2483 var edge = ua.indexOf('Edge/');
2484 if (edge > 0) {
2485 // Edge (IE 12+) => return version number
2486 return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
2487 }
2488 
2489 // other browser
2490 return false;
2491}
2492function backCrypto() {
2493 $('.cryptoDel').remove();
2494 $('#global').show();
2495}
2496function showCryptoPay(typePack,idPack,titre) {
2497 ajax('/workers/cryptoPay.php','idPack='+idPack+'&typePack='+typePack+'&titre='+titre,function (res) {
2498 $('#global').hide();
2499 $('#global').after(res);
2500 });
2501}
2502function returnSub(e,isFormation) {
2503 if(e && e.keyCode == 13) {
2504 sendRecapChatMsg(isFormation);
2505 }
2506}
2507function delDefiMy(idDefi) {
2508 confirme('Etes vous certain de vouloir supprimer ce défi ? Celui-ci ne sera ensuite plus proposé aux joueurs (mais les défis en cours se termineront)',function () {
2509 ajax('/workers/delMyDefi.php','id='+idDefi,function (res) {
2510 alerte(res);
2511 });
2512 });
2513}
2514function copyText(id) {
2515 if (!navigator.clipboard) {
2516 alerte('HTTPS needed');
2517 return;
2518 }
2519 var copyText = document.getElementById(id);
2520 copyText.select();
2521 copyText.setSelectionRange(0, 99999); 
2522 navigator.clipboard.writeText(copyText.value);
2523 alerte("Copied the text: " + copyText.value);
2524}
2525function openPartPubb(self,namePart) {
2526 $('.puBt').removeClass('btn-info').addClass('btn-default');
2527 $(self).removeClass('btn-default').addClass('btn-info');
2528 $('.pubStep').hide();$('.'+namePart).show();
2529 return false;
2530}
2531function normalizePlayerPublicationSearch(value) {
2532 return String(value || '').toLowerCase()
2533 .replace(/[\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5]/g,'a')
2534 .replace(/[\u00e7]/g,'c')
2535 .replace(/[\u00e8\u00e9\u00ea\u00eb]/g,'e')
2536 .replace(/[\u00ec\u00ed\u00ee\u00ef]/g,'i')
2537 .replace(/[\u00f1]/g,'n')
2538 .replace(/[\u00f2\u00f3\u00f4\u00f5\u00f6]/g,'o')
2539 .replace(/[\u0153]/g,'oe')
2540 .replace(/[\u00f9\u00fa\u00fb\u00fc]/g,'u')
2541 .replace(/[\u00fd\u00ff]/g,'y')
2542 .replace(/\s+/g,' ')
2543 .replace(/^\s+|\s+$/g,'');
2544}
2545function setPlayerPublicationFilter(self,filter) {
2546 var filters = $(self).closest('.playerPublicationFilters');
2547 filters.find('.playerPublicationFilterButton')
2548 .removeClass('playerPublicationFilterButton--active')
2549 .attr('aria-pressed','false');
2550 $(self)
2551 .addClass('playerPublicationFilterButton--active')
2552 .attr('aria-pressed','true');
2553 filterPlayerPublications($('#playerPublicationSearchInput').val());
2554 return false;
2555}
2556function filterPlayerPublications(value) {
2557 var query = normalizePlayerPublicationSearch(value);
2558 var publicationFilter = $('.playerPublicationFilterButton--active').attr('data-publication-filter') || 'all';
2559 var visible = 0;
2560
2561 $('.playerPublicationItem').each(function () {
2562 var item = $(this);
2563 var publicationType = item.attr('data-publication-type');
2564 var publicationModerated = item.attr('data-publication-moderated')==='1';
2565 var matchesFilter = publicationFilter==='all' ||
2566 (publicationFilter==='moderated' && publicationModerated) ||
2567 publicationFilter===publicationType;
2568 var matchesSearch = query==='' || normalizePlayerPublicationSearch(item.text()).indexOf(query)!==-1;
2569 var matches = matchesFilter && matchesSearch;
2570 item.toggle(matches);
2571 if (matches) visible++;
2572 });
2573
2574 $('#playerPublicationSearchCount').text(
2575 visible+' publication'+(visible===1?'':'s')
2576 );
2577 $('.playerPublicationNoResult').toggle(visible===0);
2578}
2579var cacheAvts = new Array();
2580function createAvatar(endFunc,avatar,medailles2,annonce,myScore,myuser,annonceTxt,connected,isTourDeJeu,isDonneur,appelC,appelN,noMedals) {
2581 var allParams = ''+avatar+medailles2.join('')+annonce+myScore+myuser+annonceTxt+connected+isTourDeJeu+isDonneur+appelC+appelN+noMedals;
2582 if (cacheAvts[allParams] ) {
2583 //console.log('found avat in cache',myuser);
2584 endFunc(cacheAvts[allParams]);
2585 return;
2586 }
2587 //console.log('recalc avat',allParams);
2588 var ie11 = detectIE() ;
2589 var isIElt11 = ie11>0 && ie11<=11;
2590 
2591 var $bgAnnonce = new Array();
2592 
2593 $bgAnnonce[0]="EquipierVide2";
2594 $bgAnnonce[1]="EquipierPrise2";
2595 $bgAnnonce[2]="EquipierGarde2";
2596 $bgAnnonce[3]="EquipierGardeSans2";
2597 $bgAnnonce[4]="EquipierGardeContre2";
2598 $bgAnnonce[5]="EquipierEquipier2";
2599 $bgAnnonce[6]="EquipierDefeat2";
2600 $bgAnnonce[7]="EquipierVictory2";
2601
2602 var imageObjects = new Array();
2603
2604 var medailles = new Array();
2605
2606 ///workers/medailleMin.php?type=IA&idJoueur=0
2607 var signalFFT = false;
2608 
2609 for (var k in medailles2 ) {
2610 if (medailles2[k]=="FFT")
2611 signalFFT = true;
2612 else
2613 medailles.push('/workers/medailleMin.php?type='+medailles2[k]+'');
2614 }
2615 
2616 var filesToPreload = [
2617 { id:'LedRouge', path:'/img/Jeu/LedRouge.png' },
2618 { id:'LedVert', path:'/img/Jeu/LedVert.png' },
2619 { id:'Donneur', path:'/img/Jeu/Donneur.png' },
2620 { id:'signalFFT', path:'/Jeu-Tarot-en-ligne/Signalisatipon-FFT4.png' },
2621 { id:'TourDeJeu', path:'/img/Jeu/TourDeJeu.png' },
2622 { id:'MaskRondEquipier', path:'/img/Jeu/MaskRondEquipier.png' }
2623 ];
2624 if (!avatar) avatar = '/avatars/Nobody2.jpg';
2625 
2626 filesToPreload.push({id: avatar,path: avatar});
2627 if (myScore) filesToPreload.push({id: 'EquipierScoreBig',path: '/img/Jeu/EquipierScoreBig.png'});
2628 filesToPreload.push({id: "/img/Jeu/"+$bgAnnonce[annonce]+".png",path: "/img/Jeu/"+$bgAnnonce[annonce]+".png"});
2629 for (var k in medailles ) {
2630 filesToPreload.push({id: medailles[k],path: medailles[k]});
2631 }
2632 
2633 var showAppelCouleur = false;
2634 if ( (appelC==1 || appelC==2 || appelC==3 || appelC==4) && (appelN=='V' || appelN=='C' || appelN=='D' || appelN=='R' ) ) {
2635 filesToPreload.push({id: 'appelNum'+appelN,path: '/images/Couleurs/'+appelN+'.png'});
2636 filesToPreload.push({id: 'RE'+appelC,path: '/images/Couleurs/RE'+appelC+'.png'});
2637 showAppelCouleur = true;
2638 }
2639 
2640 var loadedIMG = 0;
2641 
2642 var thenn = function () {
2643
2644
2645 var c;
2646 var ctx;
2647 
2648 c=document.createElement("canvas"); c.width=291; c.height=226;
2649 ctx=c.getContext("2d");
2650 window.canvasAvat = c;
2651 
2652 var imageObj1 = imageObjects["/img/Jeu/"+$bgAnnonce[annonce]+".png"];
2653 var imageObj2 = imageObjects[avatar];
2654
2655 ctx.drawImage(imageObj2, 55, 24, 180, 120);
2656 ctx.drawImage(imageObj1, 0, 0, 291, 226);
2657 
2658 ctx.imageSmoothingEnabled = true;
2659 ctx.imageSmoothingQuality = "high";
2660 
2661 if (signalFFT) {
2662 var signalFFTobj = imageObjects['signalFFT'];
2663  ctx.drawImage(signalFFTobj, 0, 0, signalFFTobj.width , signalFFTobj.height , 218-signalFFTobj.width/2, 1, signalFFTobj.width,signalFFTobj.height);
2664 }
2665 
2666 if (!noMedals) {
2667 for (var k in medailles ) {
2668  var medailleobj = imageObjects[medailles[k]];
2669  
2670  /*var oc = document.createElement('canvas'),
2671  octx = oc.getContext('2d');
2672  oc.width = medailleobj.width * 0.5;
2673  oc.height = medailleobj.height * 0.5;
2674  octx.drawImage(medailleobj, 0, 0, oc.width, oc.height);
2675 
2676  var oc2 = document.createElement('canvas'),
2677  octx2 = oc2.getContext('2d');
2678  oc2.width = oc.width * 0.5;
2679  oc2.height = oc.height * 0.5;
2680  octx2.drawImage(oc, 0, 0, oc2.width, oc2.height);*/
2681
2682  var taileM = 42;
2683  
2684  ctx.filter = 'blur(0.6px)';
2685  ctx.drawImage(medailleobj, 0, 0, medailleobj.width , medailleobj.height , 50-medailleobj.width/2, 100-k*38, taileM*medailleobj.width/medailleobj.height, taileM);
2686 
2687 }
2688 }
2689
2690
2691 webfontLibLoaded = true;
2692 
2693 var leftPseudoAVT = 30;
2694 var led = '';
2695 if (connected==0) { led = 'LedRouge';leftPseudoAVT = 52; }
2696 if (connected==1) { led = 'LedVert';leftPseudoAVT = 52; }
2697 if (led) ctx.drawImage(imageObjects[led], 22, 146, imageObjects[led].width, imageObjects[led].height);
2698 
2699 ctx.filter='blur(0px)';
2700 ctx.font = '24px quicksandregular';
2701 ctx.fillStyle = "#ffffff";
2702 ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
2703 ctx.shadowOffsetX = 0;
2704 ctx.shadowOffsetY = 0;
2705 ctx.shadowBlur = 3;
2706 ctx.textBaseline = 'top';
2707 ctx.textAlign = "left"; 
2708 
2709 
2710 if (isIElt11)
2711  ctx.fillText(myuser, leftPseudoAVT, 144);
2712 else
2713  ctx.fillText(myuser, leftPseudoAVT, 150);
2714
2715 if (annonceTxt) {
2716 if (showAppelCouleur && annonce) {
2717  if (isIElt11)
2718   ctx.fillText(annonceTxt, 60, 186);
2719  else
2720  ctx.fillText(annonceTxt, 60, 192);
2721 } else {
2722  if (isIElt11)
2723   ctx.fillText(annonceTxt, 30, 186);
2724  else
2725  ctx.fillText(annonceTxt, 30, 192);
2726 }
2727 }
2728
2729 var $tTour = 102;
2730 if (isDonneur) {
2731 ctx.drawImage(imageObjects['Donneur'], 220, 102, imageObjects['Donneur'].width, imageObjects['Donneur'].height);
2732 $tTour = 55;
2733 }
2734
2735 if (isTourDeJeu) {
2736 ctx.drawImage(imageObjects['TourDeJeu'], 220 , $tTour, imageObjects['TourDeJeu'].width, imageObjects['TourDeJeu'].height);
2737 }
2738
2739 if (showAppelCouleur && annonce) {
2740 var decTmp = 11;
2741 ctx.drawImage(imageObjects['MaskRondEquipier'], 236-(236-decTmp) , 181, imageObjects['MaskRondEquipier'].width, imageObjects['MaskRondEquipier'].height);
2742 ctx.drawImage(imageObjects['appelNum'+appelN+''], 241-(236-decTmp) , 192, imageObjects['appelNum'+appelN+''].width/imageObjects['appelNum'+appelN+''].height*20,20);
2743 ctx.drawImage(imageObjects['RE'+appelC+''], 257-(236-decTmp) , 192, imageObjects['RE'+appelC+''].width , imageObjects['RE'+appelC+''].height);
2744 }
2745
2746 if (myScore) {
2747 ctx.drawImage(imageObjects['EquipierScoreBig'], 291/2-50 , 1, imageObjects['EquipierScoreBig'].width, imageObjects['EquipierScoreBig'].height);
2748  ctx.fillStyle = "#000000";
2749  ctx.textAlign = "center";
2750  ctx.font = '18px quicksandregular';
2751  ctx.shadowColor = "rgba(0, 0, 0, 0)";
2752  if (isIElt11)
2753  ctx.fillText(myScore, 291/2, 5);
2754  else
2755  ctx.fillText(myScore, 291/2, 9);
2756 }
2757 
2758 var img = c.toDataURL("image/png");
2759 cacheAvts[allParams] = img;
2760 //console.log('save avat',allParams);
2761 endFunc(img);
2762 
2763 //c.remove();
2764 };
2765 
2766
2767 if (!window.cachedIMGavat)
2768 window.cachedIMGavat = new Array();
2769 
2770 var started = 0;
2771 for (var i = 0 ; i < filesToPreload.length ; i++) {
2772 var idIMG = filesToPreload[i].id;
2773 if (window.cachedIMGavat[idIMG]) {
2774 imageObjects[idIMG] = window.cachedIMGavat[idIMG];
2775 } else {
2776 started++;
2777 imageObjects[idIMG] = new Image();
2778 imageObjects[idIMG].retryCount = 0;
2779 imageObjects[idIMG].fallbackApplied = false;
2780 imageObjects[idIMG].key = idIMG;
2781 imageObjects[idIMG].onerror = function(errmsg,t,y,u) {
2782 if (this.retryCount<1) {
2783 this.retryCount++;
2784 if (this.src.split('?').length>1)
2785 this.src = this.src+'&a'; 
2786 else
2787 this.src = this.src+'?a'; 
2788 return;
2789 }
2790 if (!this.fallbackApplied) {
2791 this.fallbackApplied = true;
2792 if (this.key===avatar)
2793 this.src = '/avatars/Unknown.jpg';
2794 else
2795 this.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
2796 return;
2797 }
2798 errorLog ('******* err loading '+errmsg+' '+this.key+' this.src '+this.src,this.src);
2799 console.log('******* err loading '+errmsg+' '+this.key+' this.src '+this.src,errmsg,t,y,u);
2800 };
2801 imageObjects[idIMG].onload = function() {
2802 loadedIMG++;
2803 this.ended = true;
2804 window.cachedIMGavat[this.key] = this;
2805 //console.log(loadedIMG,filesToPreload[i],this.key);
2806 for (var kk in imageObjects) {
2807 if (!imageObjects[kk].ended) {
2808 return;
2809 }
2810 }
2811 thenn();
2812 };
2813 imageObjects[idIMG].src = filesToPreload[i].path;
2814 }
2815 }
2816 if (!started) {
2817 thenn();
2818 }
2819}
2820
2821
2822function seeCreditsMvt() {
2823 var pw = $('#thePWMvtCredits').val();
2824 if (pw=='') {
2825 alerte('Veuillez préciser un mot de passe');
2826 return;
2827 }
2828 ajax('/workers/GetCreditsMvp.php','pw='+pw,function (res) {
2829 $('#credMvtRes').html(res);
2830 });
2831 //ajax('/workers/sendRecapChatMsg.php', 'msg='+msg+'&idPartie='+recapChatMsgIdPartie+'&pliVu='+pliVu, evalRes);
2832}
2833function ldWebfont(endF) {
2834 if (webfontLibLoaded) {
2835 if (endF) endF();
2836 } else {
2837 WebFontConfig = {
2838  custom:{ families: ['quicksandregular'] },
2839  fontactive: function(){if (endF) endF();},
2840 timeout: 60000
2841 };
2842 (function(){
2843 var wf = document.createElement("script");
2844 wf.src = '/js/webfont.js';
2845 wf.async = 'true';
2846 document.head.appendChild(wf);
2847 })();
2848 }
2849}
2850function toggleSrcO(o) {
2851 o.toggleClass('bigAvatJoueur');
2852 var otersrc = o.attr('othersrc');
2853 var prevsrc = o.attr('src');
2854 o.attr('othersrc',prevsrc);
2855 o.attr('src',otersrc);
2856}
2857/* autre */
2858function checkLazyLoads() {
2859 $('.lazyLoad').each(function () {
2860 if ($(this).attr('loadedsrc')) {
2861 $(this).attr('src',$(this).attr('loadedsrc'));
2862 $(this).attr('loadedsrc',null).css('color','');
2863 }
2864 });
2865}
2866 
2867function growBigMsg(idCorres) {
2868 $('.orderedMP').hide();
2869 $('.withCorres'+idCorres).show();
2870 $('.withCorres'+idCorres).addClass('selMPBig');
2871 $('.biggerMP').toggle();
2872}
2873function growSmallMsg(idCorres) {
2874 $('.orderedMP').show();
2875 $('.withCorres'+idCorres).removeClass('selMPBig');
2876 $('.biggerMP').toggle();
2877}
2878 
2879function checkSelectiveLoading() {
2880
2881 $('.selectiveLoadg').each(function () {
2882 if ($(this).attr('loadedsrc')) {
2883 if ( $(this).is(':visible')) {
2884 $(this).attr('src',$(this).attr('loadedsrc'));
2885 $(this).attr('loadedsrc',null).css('color','');
2886 }
2887 }
2888 });
2889}
2890checkSelectiveLoading();
2891
2892function webpfeatureResult(feature, hasWebp) {
2893 var suff = 'jpg';
2894 if (hasWebp) {
2895 suff = 'webp';
2896 }
2897
2898 var PNGsuff = 'png';
2899 if (hasWebp) {
2900 PNGsuff = 'webp';
2901 }
2902 clinOeuil = new Image();clinOeuil.src='/Jeu-Tarot-en-ligne/Home/Jeu de tarot gratuitClin.'+PNGsuff;
2903 clinOeuil2 = new Image();clinOeuil2.src='/Jeu-Tarot-en-ligne/Home/Jeu de Tarot en ligneClin.'+PNGsuff;
2904 
2905 $('.webpimages').each(function () {
2906 if ($(this).attr('normalsrc')) {
2907 //console.log($(this).attr('normalsrc'),$(this).hasClass('loadInvisible'));
2908 if ( $(this).is(':visible') || $(this).hasClass('loadInvisible') ) {
2909 $(this).attr('src',$(this).attr('normalsrc')+'.'+suff);
2910 $(this).attr('normalsrc',null).css('color','');
2911 }
2912 }
2913 });
2914}
2915check_webp_feature('alpha',webpfeatureResult);
2916
2917
2918
2919function addCSS(url) {
2920 var fileref=document.createElement("link")
2921 fileref.setAttribute("rel", "stylesheet")
2922 fileref.setAttribute("type", "text/css")
2923 fileref.setAttribute("href", url);
2924 //document.body.append(fileref);
2925 document.getElementsByTagName("head")[0].appendChild(fileref)
2926}
2927
2928function stickAds(){
2929 var doc = document.documentElement;
2930 var top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
2931 if (top>310) {
2932 var globalH = $('#global').height();
2933 var hh = top-300;
2934 if (hh+650>globalH) {
2935 hh = globalH-650;
2936 if (hh<0) hh = 0;
2937 $('#stickyHome').css('position','').css('margin-top',hh+'px');
2938 return;
2939 }
2940 $('#stickyHome').css('margin-top','0px').css('top','4px').css('position','fixed');
2941 } else {
2942
2943 $('#stickyHome').css('position','').css('margin-top','0px');
2944 }
2945};
2946
2947
2948function sendRecapChatMsg(isFormation) {
2949 if (!recapChatMsgIdPartie) return;
2950 var msg = escape($('#sendChatMsgRecap').val());
2951 var pliVu = '';
2952 if (isFormation)
2953 pliVu = gcookie('recapStep');
2954 if (!msg) return;
2955 //confirme('Etes-vous sûr de vouloir envoyer ce message ?',function () {
2956 ajax('/workers/sendRecapChatMsg.php', 'msg='+msg+'&idPartie='+recapChatMsgIdPartie+'&pliVu='+pliVu, evalRes);
2957 //});
2958}
2959var reloadProXXVC = false;
2960function reloadRecapChatMsg() {
2961 if (!recapChatMsgIdPartie) return;
2962 if (reloadProXXVC) return;
2963 reloadProXXVC = true;
2964 ajax('/workers/reloadRecapChatMsg.php', 'idPartie='+recapChatMsgIdPartie, function (text) {
2965 $('#recapChatContent').html(text);
2966 //ge('recapChatContent')
2967 var objDiv = document.getElementById("recapChatContent");
2968 if (objDiv) objDiv.scrollTop = objDiv.scrollHeight;
2969 reloadProXXVC = false;
2970 });
2971}
2972var recapChatMsgIdPartie = 0;
2973function setIdPartieRecapChatMsg(idPartie) {
2974 if (recapChatMsgIdPartie) {
2975 recapChatMsgIdPartie = 0;
2976 closeConnexion();
2977 }
2978 recapChatMsgIdPartie = idPartie;
2979 reloadRecapChatMsg();
2980}
2981
2982
2983
2984
2985var TOdefidelayedTO = 0;
2986function showDefiChoisiDelayed() {
2987 clearTimeout(TOdefidelayedTO);
2988 TOdefidelayedTO = setTimeout(showDefiChoisi,1400);
2989}
2990function showDefiChoisi(paramsStart) {
2991 clearTimeout(TOdefidelayedTO);
2992
2993 var params = new Array();
2994 if ($('#defiAuteur').val()) {
2995 params.push('defiAuteur='+$('#defiAuteur').val())
2996 }
2997 if ($('#defiTitre').val()) {
2998 params.push('defiTitre='+$('#defiTitre').val())
2999 }
3000 if ($('#defiPosition').val()) {
3001 params.push('defiPosition='+$('#defiPosition').val())
3002 }
3003 if ($('#defiAnnonce').val()) {
3004 params.push('defiAnnonce='+$('#defiAnnonce').val())
3005 }
3006 if ($('#defiParticipations').val()) {
3007 params.push('defiParticipations='+$('#defiParticipations').val())
3008 }
3009 
3010 showPleaseWait();
3011 ajax('/workers/listeDefis.php', params.join('&')+'&'+paramsStart, clstCallback);
3012}
3013function seeSolutionDefiPremium (idPartie,yourIdPartie) {
3014 confirme('Attention : vous abandonnez alors votre récompense, êtes-vous sûr ?',function () {
3015 ajax('/workers/solutionDefis.php', 'idPartie='+idPartie+'&yourIdPartie='+yourIdPartie, evalRes);
3016 });
3017}
3018function giveUpDefiPremium (idDefi) {
3019 confirme('Attention : vous abandonnez alors votre récompense, êtes-vous sûr ?',function () {
3020 $('#defiligne'+idDefi).remove();
3021 ajax('/workers/giveUpDefi.php', 'idDefi='+idDefi, evalRes);
3022 });
3023}
3024function razClst (idUtil) {
3025 confirme('Attention : ce joueur aura tous ses classements actuels remis à zéro ?',function () {
3026 ajax('/workers/resetClstJoueur.php', 'idUtil='+idUtil, evalRes);
3027 });
3028}
3029
3030window.onpopstate = function(event) {
3031 if (hasAGameStarted) return;
3032 //console.log(event);return;
3033 if (event.state && event.state.path) {
3034 /*if (event.state.forumContent) {
3035 if ($('#forumRes').length>0) {
3036 $('#forumRes').html(event.state.forumContent);
3037 return;
3038 }
3039 }*/
3040 document.location = event.state.path;
3041 } else if ($('#forumRes').length) {
3042 document.location.reload();
3043 }
3044
3045 //alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
3046};
3047
3048function showErrInfo(errID) {
3049 $('.errorsLsit .hiddenStep').hide();
3050 $('#Infos'+errID).toggle();
3051 jQuery.ajax({
3052 type: 'POST',
3053 url: '/workers/moderation/errorInfo.php',
3054 data: {
3055  idError:errID
3056 },
3057 success: function(txt) {
3058  $('#InfosDetails'+errID).html(txt);
3059 }
3060 });
3061}
3062var clinOeuil;// = new Image();clinOeuil.src='/Jeu-Tarot-en-ligne/Home/Jeu de tarot gratuitClin.png';
3063var clinOeuil2;// = new Image();clinOeuil2.src='/Jeu-Tarot-en-ligne/Home/Jeu de Tarot en ligneClin.png';
3064
3065function slc() {
3066
3067 $('#imgClHome').mouseover(function() {
3068 if (!clinOeuil) return;
3069 $('#imgClHome').attr('src',clinOeuil.src);
3070 setTimeout(function () {
3071 $('#imgClHome').attr('src','/Jeu-Tarot-en-ligne/Home/Jeu de tarot gratuit.png');
3072 },150);
3073 });
3074 $('#imgClHome2').mouseover(function() {
3075 if (!clinOeuil2) return;
3076 
3077 $('#imgClHome2').attr('src',clinOeuil2.src);
3078 setTimeout(function () {
3079 $('#imgClHome2').attr('src','/Jeu-Tarot-en-ligne/Home/Jeu de Tarot en ligne.png');
3080 },150);
3081 });
3082}
3083function pushMergeAccounts() {
3084 ajax('/workers/partiesEnCours.php', $('#mergeAccounts').serialize(), registerStart);
3085 
3086}
3087var resiZESetHHH = false;
3088
3089function randomDuplicateDistrib() {
3090
3091 ajax('/workers/getDuplicateDistribution.php', null, function (res) {
3092 var tab = res.split('|');
3093 $('#savedDists').val('');
3094 $('#nbJoueurs').val(4);
3095 $('#IDdistribution').val(tab[0]);
3096 $('#NBdistribution').val(tab[1]);
3097 $('#numSequence').val(tab[2]);
3098 $('#preneurDist').val(tab[3]);
3099 $('#formDistrib').submit();
3100 });
3101 return;
3102}
3103function resetPrenDistrib() {
3104 $('#preneurDist').val('');
3105 $('#savedDists').val('0');
3106}
3107function randomDistrib() {
3108
3109 $('#savedDists').val('0');
3110 $('#IDdistribution').val('');
3111 $('#numSequence').val('');
3112 $('#preneurDist').val('');
3113 $('#formDistrib').submit();
3114 return;
3115}
3116function changeSavedDist(params) {
3117 var pp = params.split('_');
3118 
3119 var nbJoueurs = pp[0];
3120 var IDdistribution = pp[1];
3121 var numSequence = pp[2];
3122 var NBdistribution = pp[3];
3123 
3124 $('#nbJoueurs').val(nbJoueurs);
3125 $('#IDdistribution').val(IDdistribution);
3126 $('#numSequence').val(numSequence);
3127 $('#NBdistribution').val(NBdistribution);
3128 $('#preneurDist').val('');
3129 $('#formDistrib').submit();
3130 return;
3131}
3132function nextMelange () {
3133 $('#savedDists').val('0');
3134 $('#NBdistribution').val(parseInt($('#NBdistribution').val())+1);
3135 $('#formDistrib').submit();
3136 return;
3137}
3138
3139function threadMoveToSujet(idSujet,endurl) {
3140 var idDoublon = $('#threadMoveToSujet').val();
3141 if (!idDoublon) {
3142 alerte('Veuillez sélectionner un sujet.');
3143 return;
3144 }
3145 var titreDoublon = $("#threadMoveToSujet option:selected").text();
3146 confirme('Etes-vous sûr de marquer ce sujet comme doublon du sujet &quot;'+titreDoublon+'&quot; ?',function () {
3147 jQuery.ajax({
3148  type: 'POST',
3149  url: '/workers/moderation/forumMoveThreadToSujet.php',
3150  data: {
3151  idDoublon:idDoublon,
3152  idSujet: idSujet
3153  },
3154  success: function(txt) {
3155  alerte(txt,function () {
3156  document.location = endurl;
3157  });
3158  }
3159 });
3160 });
3161}
3162
3163function threadMoveToCat(idSujet,endurl) {
3164 var idCat = $('#threadMoveToCat').val();
3165 if (!idCat) {
3166 alerte('Veuillez sélectionner une catégorie.');
3167 return;
3168 }
3169 var titreCat = $("#threadMoveToCat option:selected").text();
3170 confirme('Etes-vous sûr de déplacer ce sujet dans la catégorie &quot;'+titreCat+'&quot; ?',function () {
3171 jQuery.ajax({
3172  type: 'POST',
3173  url: '/workers/moderation/forumMoveThreadToCat.php',
3174  data: {
3175  idCat:idCat,
3176  idSujet: idSujet
3177  },
3178  success: function(txt) {
3179  alerte(txt,function () {
3180  document.location = endurl;
3181  });
3182  }
3183 });
3184 });
3185}
3186function changeDroitsSujet(idSujet,endurl) {
3187 
3188 var editSujet_droits = $('#editSujet_droits').val();
3189 var editSujet_droits_edition = $('#editSujet_droits_edition').val();
3190 
3191 confirme('Etes-vous sûr de vouloir changer les droits de ce sujet ?',function () {
3192 jQuery.ajax({ 
3193  type: 'POST',
3194  url: '/workers/moderation/forumEditDroits.php',
3195  data: {
3196  idSujet: idSujet,
3197  droitsConsultation: editSujet_droits,
3198  droitsEdition: editSujet_droits_edition
3199  },
3200  success: function(txt) {
3201  alerte(txt,function () {
3202  document.location = endurl;
3203  });
3204  }
3205 });
3206 });
3207}
3208
3209function threadClosed(idSujet,endurl) {
3210 var idStatut = $('#threadStatut').val();
3211 var titreCat = $("#threadStatut option:selected").text();
3212 confirme('Etes-vous sûr de vouloir marquer ce sujet comme &quot;'+titreCat+'&quot; ?',function () {
3213 jQuery.ajax({
3214  type: 'POST',
3215  url: '/workers/moderation/forumCloseThread.php',
3216  data: {
3217  idSujet: idSujet,
3218  idStatut: idStatut
3219  },
3220  success: function(txt) {
3221  alerte(txt,function () {
3222  document.location = endurl;
3223  });
3224  }
3225 });
3226 });
3227}
3228function threadVote(idSujet,endurl) {
3229 var idStatut = $('#threadVote').val();
3230 var titreCat = $("#threadVote option:selected").text();
3231 confirme('Etes-vous sûr de vouloir marquer ce sujet comme &quot;'+titreCat+'&quot; ?',function () {
3232 jQuery.ajax({
3233  type: 'POST',
3234  url: '/workers/moderation/forumVote.php',
3235  data: {
3236  idSujet: idSujet,
3237  idStatut: idStatut
3238  },
3239  success: function(txt) {
3240  alerte(txt,function () {
3241  document.location = endurl;
3242  });
3243  }
3244 });
3245 });
3246}
3247
3248function threadSensible(idSujet,endurl) {
3249 var idStatut = $('#threadSensible').val();
3250 var titreCat = $("#threadSensible option:selected").text();
3251 confirme('Etes-vous sûr de vouloir marquer ce sujet comme &quot;'+titreCat+'&quot; ?',function () {
3252 jQuery.ajax({
3253  type: 'POST',
3254  url: '/workers/moderation/forumSensibilite.php',
3255  data: {
3256  idSujet: idSujet,
3257  idStatut: idStatut
3258  },
3259  success: function(txt) {
3260  alerte(txt,function () {
3261  document.location = endurl;
3262  });
3263  }
3264 });
3265 });
3266}
3267
3268function categorieFollow(idCat) {
3269 $('.followCatBtn').toggle();
3270 jQuery.ajax({
3271 type: 'POST',
3272 url: '/workers/moderation/forumCatFollow.php',
3273 data: {
3274  idCat: idCat
3275 },
3276 success: function(txt) {
3277  console.log(txt);
3278 }
3279 });
3280}
3281
3282function categorieFollowStop(idCat) {
3283 $('.followCatBtn').toggle();
3284 jQuery.ajax({
3285  type: 'POST',
3286  url: '/workers/moderation/forumCatFollowStop.php',
3287  data: {
3288  idCat: idCat
3289  },
3290  success: function(txt) {
3291  console.log(txt);
3292  }
3293 });
3294}
3295
3296function sujetFollow(idSujet) {
3297 var buttons = $('.followSujBtn');
3298 if (buttons.data('follow-pending')) return;
3299 buttons.data('follow-pending',true);
3300 jQuery.ajax({
3301 type: 'POST',
3302 url: '/workers/moderation/forumSujetFollow.php',
3303 data: {
3304  idSujet: idSujet
3305 },
3306 success: function(txt) {
3307 if ($.trim(txt)!='OK') {
3308 alert(txt || 'Le suivi du sujet n a pas pu etre enregistre.');
3309 return;
3310 }
3311 buttons.toggle();
3312  console.log(txt);
3313 },
3314 error: function(xhr) {
3315 alert(xhr.responseText || 'Le suivi du sujet n a pas pu etre enregistre.');
3316 console.log('Erreur lors du suivi du sujet',xhr);
3317 },
3318 complete: function() {
3319 buttons.data('follow-pending',false);
3320 }
3321 });
3322}
3323
3324function sujetFollowStop(idSujet) {
3325 var buttons = $('.followSujBtn');
3326 if (buttons.data('follow-pending')) return;
3327 buttons.data('follow-pending',true);
3328 jQuery.ajax({
3329  type: 'POST',
3330  url: '/workers/moderation/forumSujetFollowStop.php',
3331  data: {
3332  idSujet: idSujet
3333  },
3334  success: function(txt) {
3335 if ($.trim(txt)!='OK') {
3336 alert(txt || 'L arret du suivi n a pas pu etre enregistre.');
3337 return;
3338 }
3339 buttons.toggle();
3340  console.log(txt);
3341  },
3342  error: function(xhr) {
3343 alert(xhr.responseText || 'L arret du suivi n a pas pu etre enregistre.');
3344 console.log('Erreur lors de l arret du suivi du sujet',xhr);
3345  },
3346  complete: function() {
3347 buttons.data('follow-pending',false);
3348  }
3349 });
3350}
3351
3352var forumListAjaxRequests = {};
3353var forumTopicAjaxRequest = null;
3354
3355function forumEncodeFormValue(value) {
3356 return escape(value==null?'':String(value)).split('+').join('%2B');
3357}
3358
3359function forumListStateFromElement(source) {
3360 var node = source ? $(source) : $();
3361 if (!node.length || typeof node.attr('data-forum-cat')==='undefined') {
3362 if (source) {
3363 var root = $(source).closest('.forumCategoryPreview,#forumRes');
3364 node = root.find('.forumListState').first();
3365 } else {
3366 node = $('.forumReturnState').first();
3367 if (!node.length)
3368 node = $('.forumListState').first();
3369 }
3370 }
3371 if (!node.length)
3372 return null;
3373 var page = parseInt(node.attr('data-forum-page'),10);
3374 if (!page || page<1) page = 1;
3375 return {
3376 idCat:node.attr('data-forum-cat') || '',
3377 sort:node.attr('data-forum-sort')==='participation'?'participation':'',
3378 page:page,
3379 search:node.attr('data-forum-search') || '',
3380 baseUrl:node.attr('data-forum-base-url') || '',
3381 preview:node.attr('data-forum-preview')==='1'
3382 };
3383}
3384
3385function forumDefaultListBaseUrl(idCat,titre) {
3386 idCat = idCat==null?'':String(idCat);
3387 if (idCat==='') return '/forum/';
3388 if (idCat==='All') return '/forum-cat/All/Tous-les-sujets';
3389 if (/^[0-9]+$/.test(idCat)) return '/forum-cat/'+idCat+'/'+(titre || 'Categorie');
3390 return '/forum/?idCat='+forumEncodeFormValue(idCat);
3391}
3392
3393function forumBuildListUrl(state) {
3394 var url = state.baseUrl || forumDefaultListBaseUrl(state.idCat,'');
3395 var params = [];
3396 if (state.sort==='participation') params.push('sort=participation');
3397 if (state.page>1) params.push('forumPage='+parseInt(state.page,10));
3398 if (state.search) params.push('forumSearch='+forumEncodeFormValue(state.search));
3399 if (params.length)
3400 url += (url.indexOf('?')===-1?'?':'&')+params.join('&');
3401 return url;
3402}
3403
3404function forumBuildTopicUrl(idSujet,titre,state) {
3405 var url = '/forum-sujet/'+parseInt(idSujet,10)+'/'+titre;
3406 var params = [];
3407 if (state && typeof state.idCat!=='undefined')
3408 params.push('fromCat='+forumEncodeFormValue(state.idCat));
3409 if (state && state.sort==='participation')
3410 params.push('fromSort=participation');
3411 if (state && parseInt(state.page,10)>1)
3412 params.push('fromPage='+parseInt(state.page,10));
3413 if (state && state.search)
3414 params.push('fromSearch='+forumEncodeFormValue(state.search));
3415 if (params.length)
3416 url += '?'+params.join('&');
3417 return url;
3418}
3419
3420function forumLoadingHtml() {
3421 return '<br /><hr/><h2 class="intro-text text-center">Veuillez patienter pendant le chargement...</h2><hr/><br /><br />';
3422}
3423
3424var forumNewTopicDialogId = '';
3425var forumReplyDialogId = '';
3426var forumTopicToolDialogId = '';
3427var forumTopicToolTemplateId = '';
3428function rendreUneCarteRecapAccessible(carte) {
3429 if (!carte || carte.nodeType!==1) return;
3430 carte.setAttribute('tabindex','0');
3431 carte.setAttribute('data-carte-recap-accessible','true');
3432 if (!carte.getAttribute('alt') && !carte.getAttribute('aria-label'))
3433 carte.setAttribute('aria-label','Carte \u00e0 jouer');
3434}
3435
3436function rendreCartesRecapAccessibles(racine) {
3437 var selecteur = 'img.carteRecapSmall, img.cardRecap, .duplicateComparisonCards img';
3438 var conteneur = racine || document;
3439 if (!conteneur.querySelectorAll) return;
3440 var correspond = conteneur.matches || conteneur.msMatchesSelector;
3441 if (correspond && correspond.call(conteneur,selecteur))
3442 rendreUneCarteRecapAccessible(conteneur);
3443 var cartes = conteneur.querySelectorAll(selecteur);
3444 for (var i=0;i<cartes.length;i++)
3445 rendreUneCarteRecapAccessible(cartes[i]);
3446}
3447
3448function initialiserAccessibiliteCartesRecap() {
3449 rendreCartesRecapAccessibles(document);
3450 if (!window.MutationObserver || !document.body) return;
3451 new MutationObserver(function (mutations) {
3452 for (var i=0;i<mutations.length;i++) {
3453 for (var j=0;j<mutations[i].addedNodes.length;j++)
3454 rendreCartesRecapAccessibles(mutations[i].addedNodes[j]);
3455 }
3456 }).observe(document.body,{childList:true,subtree:true});
3457}
3458
3459if (document.readyState==='loading')
3460 document.addEventListener('DOMContentLoaded',initialiserAccessibiliteCartesRecap);
3461else
3462 initialiserAccessibiliteCartesRecap();
3463
3464function forumCloseTopicToolDialog() {
3465 if (!forumTopicToolDialogId) return;
3466 var dialog = $('#'+forumTopicToolDialogId);
3467 if (dialog.length) {
3468 try { dialog.dialog('close'); }
3469 catch (e) { dialog.remove(); }
3470 }
3471 forumTopicToolDialogId = '';
3472 forumTopicToolTemplateId = '';
3473}
3474
3475function forumOpenTopicToolDialog(templateId) {
3476 forumCloseReplyDialog();
3477 if (forumTopicToolDialogId && forumTopicToolTemplateId===templateId &&
3478 document.getElementById(forumTopicToolDialogId)) {
3479 var currentDialog = $('#'+forumTopicToolDialogId);
3480 try {
3481 currentDialog.dialog('moveToTop');
3482 currentDialog.find('select,input,button,a').filter(':visible').first().focus();
3483 } catch (e) {}
3484 return false;
3485 }
3486
3487 forumCloseTopicToolDialog();
3488 var template = $('#'+templateId);
3489 if (!template.length || typeof showBigDialog!=='function') return false;
3490 var title = template.attr('data-dialog-title') || 'Moderation du sujet';
3491 forumTopicToolTemplateId = templateId;
3492 forumTopicToolDialogId = showBigDialog(title,template.html());
3493 if (!forumTopicToolDialogId) {
3494 forumTopicToolTemplateId = '';
3495 return false;
3496 }
3497
3498 var dialog = $('#'+forumTopicToolDialogId);
3499 var viewportWidth = $(window).width() || document.documentElement.clientWidth;
3500 var viewportHeight = $(window).height() || document.documentElement.clientHeight;
3501 var dialogWidth = Math.max(280,Math.min(680,viewportWidth-24));
3502 try {
3503 dialog.dialog('option','width',dialogWidth);
3504 dialog.dialog('option','maxHeight',Math.max(280,viewportHeight-24));
3505 dialog.dialog('option','position',{my:'center',at:'center',of:window});
3506 dialog.dialog('widget').addClass('forumTopicToolDialogShell');
3507 } catch (e) {}
3508
3509 window.setTimeout(function () {
3510 if (!document.getElementById(forumTopicToolDialogId)) return;
3511 dialog.find('select,input,button,a').filter(':visible').first().focus();
3512 },0);
3513 return false;
3514}
3515
3516function forumCloseReplyDialog() {
3517 if (!forumReplyDialogId) return;
3518 var dialog = $('#'+forumReplyDialogId);
3519 if (dialog.length) {
3520 try { dialog.dialog('close'); }
3521 catch (e) { dialog.remove(); }
3522 }
3523 forumReplyDialogId = '';
3524}
3525
3526function forumOpenReplyDialog() {
3527 forumCloseTopicToolDialog();
3528 if (forumReplyDialogId && document.getElementById(forumReplyDialogId)) {
3529 var currentDialog = $('#'+forumReplyDialogId);
3530 try {
3531 currentDialog.dialog('moveToTop');
3532 currentDialog.find('#postReponse_txt').focus();
3533 } catch (e) {}
3534 return false;
3535 }
3536
3537 var template = $('#forumReplyDialogTemplate');
3538 if (!template.length || typeof showBigDialog!=='function') return false;
3539 var title = template.attr('data-dialog-title') || 'Repondre au sujet';
3540 forumReplyDialogId = showBigDialog(title,template.html());
3541 if (!forumReplyDialogId) return false;
3542
3543 var dialog = $('#'+forumReplyDialogId);
3544 var viewportWidth = $(window).width() || document.documentElement.clientWidth;
3545 var viewportHeight = $(window).height() || document.documentElement.clientHeight;
3546 var dialogWidth = Math.max(280,Math.min(760,viewportWidth-24));
3547 try {
3548 dialog.dialog('option','width',dialogWidth);
3549 dialog.dialog('option','maxHeight',Math.max(280,viewportHeight-24));
3550 dialog.dialog('option','position',{my:'center',at:'center',of:window});
3551 dialog.dialog('widget').addClass('forumReplyDialogShell');
3552 } catch (e) {}
3553
3554 if (typeof showHTMLbuttons==='function') showHTMLbuttons();
3555 window.setTimeout(function () {
3556 if (document.getElementById(forumReplyDialogId))
3557 dialog.find('#postReponse_txt').focus();
3558 },0);
3559 return false;
3560}
3561
3562function forumCloseNewTopicDialog() {
3563 if (!forumNewTopicDialogId) return;
3564 var dialog = $('#'+forumNewTopicDialogId);
3565 if (dialog.length) {
3566 try { dialog.dialog('close'); }
3567 catch (e) { dialog.remove(); }
3568 }
3569 forumNewTopicDialogId = '';
3570}
3571
3572function forumOpenNewTopicDialog() {
3573 if (forumNewTopicDialogId && document.getElementById(forumNewTopicDialogId)) {
3574 var currentDialog = $('#'+forumNewTopicDialogId);
3575 try {
3576 currentDialog.dialog('moveToTop');
3577 currentDialog.find('#postSujet_titre').focus();
3578 } catch (e) {}
3579 return false;
3580 }
3581
3582 var template = $('#forumNewTopicDialogTemplate');
3583 if (!template.length || typeof showBigDialog!=='function') return false;
3584 var title = template.attr('data-dialog-title') || 'Nouveau sujet';
3585 forumNewTopicDialogId = showBigDialog(title,template.html());
3586 if (!forumNewTopicDialogId) return false;
3587
3588 var dialog = $('#'+forumNewTopicDialogId);
3589 var viewportWidth = $(window).width() || document.documentElement.clientWidth;
3590 var viewportHeight = $(window).height() || document.documentElement.clientHeight;
3591 var dialogWidth = Math.max(280,Math.min(720,viewportWidth-24));
3592 try {
3593 dialog.dialog('option','width',dialogWidth);
3594 dialog.dialog('option','maxHeight',Math.max(280,viewportHeight-24));
3595 dialog.dialog('option','position',{my:'center',at:'center',of:window});
3596 dialog.dialog('widget').addClass('forumNewTopicDialogShell');
3597 } catch (e) {}
3598
3599 if (typeof showHTMLbuttons==='function') showHTMLbuttons();
3600 window.setTimeout(function () {
3601 if (document.getElementById(forumNewTopicDialogId))
3602 dialog.find('#postSujet_titre').focus();
3603 },0);
3604 return false;
3605}
3606
3607function forumLoadList(state,historyMode) {
3608 if (!state) return false;
3609 state.page = parseInt(state.page,10);
3610 if (!state.page || state.page<1) state.page = 1;
3611 state.sort = state.sort==='participation'?'participation':'';
3612 state.search = state.search || '';
3613 var target = state.preview ? $('#previewCat'+state.idCat) : $('#forumRes');
3614 if (!target.length) return false;
3615 var requestKey = state.preview?'preview-'+state.idCat:'main';
3616 if (forumListAjaxRequests[requestKey] && forumListAjaxRequests[requestKey].readyState!==4)
3617 forumListAjaxRequests[requestKey].abort();
3618 if (!state.preview) {
3619 forumCloseNewTopicDialog();
3620 forumCloseReplyDialog();
3621 forumCloseTopicToolDialog();
3622 $('.qc-cmp-persistent-link').remove();
3623 $('.infoAll').html('');
3624 window.scroll(0,0);
3625 $('li.sel').removeClass('sel');
3626 }
3627 target.html(forumLoadingHtml());
3628 var data = [];
3629 if (state.idCat!=='') data.push('idCat='+forumEncodeFormValue(state.idCat));
3630 data.push('forumPage='+state.page);
3631 data.push('forumSearch='+forumEncodeFormValue(state.search));
3632 data.push('sort='+forumEncodeFormValue(state.sort));
3633 if (!state.preview) data.push('noWorker=1');
3634 forumListAjaxRequests[requestKey] = jQuery.ajax({
3635 type:'POST',
3636 url:'/workers/forum.php',
3637 data:data.join('&'),
3638 success:function(txt) {
3639 target.html(txt);
3640 showHTMLbuttons();
3641 if (!state.preview && historyMode) {
3642 try {
3643 var newurl = forumBuildListUrl(state);
3644 if (historyMode==='search')
3645 window.history.replaceState({path:newurl},'',newurl);
3646 else
3647 window.history.pushState({path:newurl},'',newurl);
3648 } catch (e) { }
3649 }
3650 if (!state.preview && historyMode==='search') {
3651 var searchInput = document.getElementById('searchForumSujet');
3652 if (searchInput) {
3653 searchInput.focus();
3654 if (searchInput.setSelectionRange)
3655 searchInput.setSelectionRange(searchInput.value.length,searchInput.value.length);
3656 }
3657 }
3658 },
3659 error:function(xhr,status) {
3660 if (status==='abort') return;
3661 target.html('<p class="forumHomeNotice">Le chargement du forum a echoue. Veuillez reessayer.</p>');
3662 if (window.console && console.error)
3663 console.error('JS forum list load failed',xhr);
3664 }
3665 });
3666 return false;
3667}
3668
3669function forumNavigateList(link) {
3670 return forumLoadList(forumListStateFromElement(link),'push');
3671}
3672
3673
3674function forumUpdateDocumentTitleFromTopic() {
3675 var heading = document.getElementById('forumTopicHeaderTitle');
3676 if (!heading) return false;
3677 var topicTitle = heading.textContent!==undefined?heading.textContent:heading.innerText;
3678 topicTitle = String(topicTitle || '').replace(/\s+/g,' ').replace(/^\s+|\s+$/g,'');
3679 if (!topicTitle) return false;
3680 document.title = topicTitle;
3681 return true;
3682}
3683
3684function forumAjaxShowSujet (idSujet,idCat,tsort,titre,source,anchor,historyMode,navigationUrl) {
3685 forumCloseReplyDialog();
3686 forumCloseTopicToolDialog();
3687 anchor = String(anchor || '').replace(/^#/,'');
3688 var state = forumListStateFromElement(source);
3689 if (state && (String(state.idCat)===String(idCat) || (!source && $('.forumReturnState').length))) {
3690 idCat = state.idCat;
3691 tsort = state.sort;
3692 } else {
3693 state = {page:1,search:''};
3694 }
3695 state.idCat = idCat==null?'':String(idCat);
3696 state.sort = tsort==='participation'?'participation':'';
3697 $('.qc-cmp-persistent-link').remove();
3698 $('.infoAll').html('');
3699 if (!anchor)
3700 window.scroll(0,0);
3701 $$('forumRes').innerHTML = forumLoadingHtml();
3702 $('li.sel').removeClass('sel');
3703 if (forumTopicAjaxRequest && forumTopicAjaxRequest.readyState!==4)
3704 forumTopicAjaxRequest.abort();
3705 var data = [
3706 'idSujet='+parseInt(idSujet,10),
3707 'noWorker=1',
3708 'fromCat='+forumEncodeFormValue(idCat),
3709 'fromSort='+forumEncodeFormValue(tsort),
3710 'fromPage='+parseInt(state.page || 1,10),
3711 'fromSearch='+forumEncodeFormValue(state.search || '')
3712 ];
3713 if (anchor) data.push('anchor='+forumEncodeFormValue(anchor));
3714 forumTopicAjaxRequest = jQuery.ajax({
3715 type:'POST',
3716 url:'/workers/forum.php',
3717 data:data.join('&'),
3718 success:function(txt) {
3719  $('#forumRes').html(txt);
3720 forumUpdateDocumentTitleFromTopic();
3721  showHTMLbuttons();
3722  if (titre || anchor || navigationUrl) {
3723  try {
3724 var newurl = navigationUrl || (titre ? forumBuildTopicUrl(idSujet,titre,state) : window.location.pathname+window.location.search);
3725 if (anchor && newurl.indexOf('#')===-1) newurl += '#'+anchor;
3726 if (historyMode==='replace')
3727 window.history.replaceState({path:newurl},'',newurl);
3728 else if (historyMode!=='none')
3729 window.history.pushState({path:newurl},'',newurl);
3730  } catch (e) { }
3731  }
3732  setTimeout(forumRevealAnchoredContent,0);
3733 },
3734 error:function(xhr,status) {
3735 if (status==='abort') return;
3736  if (window.console && console.error)
3737  console.error('JS forum topic load failed',xhr);
3738 }
3739 });
3740 return false;
3741}
3742function workerForumCB (t) {
3743
3744 if ($$('forumRes')==null) return;
3745 $$('forumRes').innerHTML = (t);
3746 forumUpdateDocumentTitleFromTopic();
3747 window.scroll(0,0);
3748 showHTMLbuttons();
3749}
3750
3751function forumPublicationResult(response) {
3752 var text = $.trim(response==null?'':String(response));
3753 var parts = text.split('|');
3754 return {
3755 ok:parts[0]==='OK',
3756 message:text,
3757 id:parseInt(parts[1],10) || 0,
3758 slug:parts.length>2?parts.slice(2).join('|'):''
3759 };
3760}
3761
3762function forumReloadCurrentTopic(anchor) {
3763 var topic = $('.forumTopicState').first();
3764 if (!topic.length) return false;
3765 var idSujet = parseInt(topic.attr('data-forum-topic-id'),10) || 0;
3766 if (!idSujet) return false;
3767 var state = forumListStateFromElement();
3768 return forumAjaxShowSujet(
3769 idSujet,
3770 state?state.idCat:'',
3771 state?state.sort:'',
3772 state?(topic.attr('data-forum-topic-slug') || ''):'',
3773 null,
3774 anchor || '',
3775 'replace'
3776 );
3777}
3778
3779function forumPrepareNotificationNavigation() {
3780 if (typeof hasAGameStarted!=='undefined' && hasAGameStarted) return false;
3781 if ($('#forumRes').length) return true;
3782 var global = $('#global');
3783 if (!global.length) return false;
3784 forumCloseNewTopicDialog();
3785 forumCloseReplyDialog();
3786 forumCloseTopicToolDialog();
3787 global.html('<div id="forumRes"></div>');
3788 return true;
3789}
3790
3791function forumNavigateLoadedNotificationTarget(idSujet,anchor,navigationUrl) {
3792 anchor = String(anchor || '').replace(/^#/,'');
3793 if (!/^(?:REP|CMNT)\d+$/.test(anchor)) return false;
3794
3795 var topic = $('.forumTopicState').first();
3796 if (!topic.length || (parseInt(topic.attr('data-forum-topic-id'),10) || 0)!==parseInt(idSujet,10))
3797 return false;
3798 if (!document.getElementById(anchor)) return false;
3799
3800 forumCloseReplyDialog();
3801 forumCloseTopicToolDialog();
3802 try {
3803 window.history.pushState({path:navigationUrl},'',navigationUrl);
3804 } catch (e) {
3805 window.location.hash = anchor;
3806 }
3807 forumRevealAnchoredContent();
3808 return true;
3809}
3810
3811function forumNavigateNotificationUrl(url,event) {
3812 event = event || window.event;
3813 if (event) {
3814 if (event.defaultPrevented || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)
3815 return true;
3816 if (typeof event.which==='number' && event.which>1)
3817 return true;
3818 if (typeof event.button==='number' && event.button>0)
3819 return true;
3820 }
3821
3822 var parsed = document.createElement('a');
3823 parsed.href = url || '';
3824 if (parsed.protocol!==window.location.protocol || parsed.host!==window.location.host)
3825 return true;
3826
3827 var path = parsed.pathname || '/';
3828 if (path.charAt(0)!=='/') path = '/'+path;
3829 var topicMatch = /^\/forum-sujet\/([0-9]+)(?:\/([^/?#]*))?\/?$/.exec(path);
3830 var categoryMatch = /^\/forum-cat\/(All|[0-9]+)(?:\/([^/?#]*))?\/?$/.exec(path);
3831 var isForumRoot = /^\/forum\/?$/.test(path);
3832 if (!topicMatch && !categoryMatch && !isForumRoot)
3833 return true;
3834 if (!forumPrepareNotificationNavigation())
3835 return true;
3836
3837 if (window.tarotSiteNotifications && typeof window.tarotSiteNotifications.clear==='function')
3838 window.tarotSiteNotifications.clear();
3839
3840 if (topicMatch) {
3841 var topicId = parseInt(topicMatch[1],10);
3842 var anchor = /^#(?:REP|CMNT)[0-9]+$/.test(parsed.hash || '') ? parsed.hash.substring(1) : '';
3843 var slug = topicMatch[2] || 'Notif';
3844 var notificationUrl = path+(parsed.search || '')+(parsed.hash || '');
3845 try { slug = decodeURIComponent(slug); } catch (ignored) {}
3846 if (forumNavigateLoadedNotificationTarget(topicId,anchor,notificationUrl))
3847 return false;
3848 forumAjaxShowSujet(
3849 topicId,
3850 '',
3851 '',
3852 slug,
3853 null,
3854 anchor,
3855 'push',
3856 notificationUrl
3857 );
3858 return false;
3859 }
3860
3861 if (categoryMatch) {
3862 var categorySlug = categoryMatch[2] || 'Notif';
3863 try { categorySlug = decodeURIComponent(categorySlug); } catch (ignoredCategory) {}
3864 forumAjaxShowCat(categoryMatch[1],'',categorySlug);
3865 return false;
3866 }
3867
3868 forumAjaxShowCat('','','');
3869 return false;
3870}
3871
3872jQuery(function() {
3873 jQuery(document)
3874 .off('click.forumNotificationNavigation','.siteNotificationToast__open,.notificationCard__open')
3875 .on('click.forumNotificationNavigation','.siteNotificationToast__open,.notificationCard__open',function(event) {
3876 return forumNavigateNotificationUrl(this.href || this.getAttribute('href'),event);
3877 });
3878});
3879var TOSEARCHFORUM = 0;
3880var TOSEARCHFORUMINPUT = null;
3881function forumSubmitSearchSujetForum(form) {
3882 var input = form ? $(form).find('#searchForumSujet').get(0) : document.getElementById('searchForumSujet');
3883 if (!input) return false;
3884 clearTimeout(TOSEARCHFORUM);
3885 TOSEARCHFORUMINPUT = input;
3886 updateSearchSujetForumInt();
3887 return false;
3888}
3889function updateSearchSujetForum(input) {
3890 clearTimeout(TOSEARCHFORUM);
3891 TOSEARCHFORUMINPUT = input || document.getElementById('searchForumSujet');
3892 TOSEARCHFORUM = setTimeout(updateSearchSujetForumInt,700);
3893}
3894function updateSearchSujetForumInt() {
3895 var input = TOSEARCHFORUMINPUT || document.getElementById('searchForumSujet');
3896 var state = forumListStateFromElement(input);
3897 if (!input || !state) return;
3898 state.page = 1;
3899 state.search = $(input).val() || '';
3900 state.preview = false;
3901 forumLoadList(state,'search');
3902}
3903function showForumPage (page,params,getParams)
3904{
3905 $('.qc-cmp-persistent-link').remove();
3906 var message = 'Veuillez patienter pendant le chargement...';
3907 $('.infoAll').html('');
3908 window.scroll(0,0);
3909 $$('forumRes').innerHTML = '<br /><hr/><h2 class="intro-text text-center">
3909'+message+'</h2><hr/><br /><br />'; 
3910 $('li.sel').removeClass('sel');
3911 
3912 var url = '/workers/'+page+'.php';
3913 if (getParams) url += '?'+getParams;
3914 //showPleaseWait();
3915 ajax(url, params, workerForumCB);
3916 return false;
3917}
3918function forumAjaxShowCat (idCat,sort,titre) {
3919 return forumLoadList({
3920 idCat:idCat==null?'':String(idCat),
3921 sort:sort==='participation'?'participation':'',
3922 page:1,
3923 search:'',
3924 baseUrl:forumDefaultListBaseUrl(idCat,titre),
3925 preview:false
3926 },'push');
3927}
3928
3929
3930function forumBgShowSujet (idSujet,obj) {
3931 if (obj.getAttribute('data-forum-state')!='read')
3932 obj.setAttribute('data-forum-state','read');
3933 
3934 if ($('#previewSujet'+idSujet).html()){
3935 $('#previewSujet'+idSujet).html('');
3936 return;
3937 }
3938 jQuery.ajax({
3939 type: 'POST',
3940 url: '/workers/forum.php',
3941 data: {
3942  idSujet: idSujet
3943 },
3944 success: function(txt) {
3945  $('#previewSujet'+idSujet).html(txt);
3946 },
3947 error: function() {
3948  if (console && console.error) {
3949  console.error('JS loadpage failed!');
3950  }
3951 }
3952 });
3953}
3954/*WebFontConfig = {
3955 google: { families: [ 'Pathway+Gothic+One', 'Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' ] }
3956 };
3957 (function() {
3958 var wf = document.createElement('script');
3959 wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
3960 '://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js';
3961 wf.type = 'text/javascript';
3962 wf.async = 'true';
3963 var s = document.getElementsByTagName('script')[0];
3964 s.parentNode.insertBefore(wf, s);
3965 })();*/
3966
3967/*
3968window.requestAnimFrame = (function(){
3969 return window.requestAnimationFrame ||
3970  window.webkitRequestAnimationFrame ||
3971  window.mozRequestAnimationFrame ||
3972  function( callback ){
3973  window.setTimeout(callback, 1000 / 60);
3974  };
3975})();
3976var deltaLoop = 50;
3977var animFrDate = null;
3978function animloop(){
3979 var continueAnimating = false;
3980 var curDatt = new Date().getTime();
3981 if (animFrDate)
3982 deltaLoop = curDatt-animFrDate;
3983 else deltaLoop = 50;
3984 animFrDate = curDatt;
3985 if (deltaLoop>1500) deltaLoop = 1500;
3986 for (var i in myAnimatedProps) {
3987 var objM = myAnimatedProps[i];
3988 var animData = objM.data('animData');
3989 if (animData) {
3990 var tpsRestant = animData.duration-curDatt+animData.startTime;
3991 var iterRestantes = Math.floor(tpsRestant/deltaLoop);
3992 for (var p in animData.props) {
3993 var destV = parseFloat(animData.props[p]);
3994 if (iterRestantes<=0) {
3995 objM.css(p,destV);
3996 } else {
3997 var currV = parseFloat(objM.css(p));
3998 var deltaV = (destV-currV)/iterRestantes;
3999 var newV = currV+deltaV;
4000 objM.css(p,newV);
4001 }
4002 }
4003 if (iterRestantes<=0) {
4004 objM.data('animID',0);
4005 delete myAnimatedProps[i];
4006 if (animData.endFunc)
4007 animData.endFunc();
4008 } else
4009 continueAnimating = true;
4010 } else
4011 delete myAnimatedProps[i];
4012 }
4013 if (continueAnimating)
4014 requestAnimFrame(animloop);
4015 else {
4016 animFrDate = null;
4017 myAnimatedProps = {};
4018 }
4019};
4020var myAnimatedProps = {};
4021var cptmyAnimatedProps = 0;
4022
4023(function( $ ){
4024 $.fn.myAnimate = function(props,duration,endFunc) {
4025 var self = $(this);
4026 if (self.data('animID') ) {
4027 props = $.extend(self.data('animData').props, props);
4028 delete myAnimatedProps[self.data('animID')];
4029 }
4030 cptmyAnimatedProps++;
4031 myAnimatedProps[cptmyAnimatedProps]=self;
4032 self.data('animID',cptmyAnimatedProps);
4033
4034 var animData = {
4035 props:props,
4036 duration:duration,
4037 endFunc:endFunc,
4038 startTime:new Date().getTime()
4039 }
4040 self.data('animData',animData);
4041 requestAnimFrame(animloop);
4042 return this;
4043 }; 
4044 })( jQuery );
4045*/
4046/*********** fonctions site ******/
4047var logStrings = [];
4048function llog(t) {
4049 logStrings.push({txt:t,ts:new Date()});
4050 if (typeof console == "undefined") return;
4051 if (!console) return;
4052 if (console && console.log) {
4053 console.log(t);
4054 }
4055}
4056
4057function alertRes (res) {
4058 if (res!='' && res!='ok' && res!='OK')
4059 alerte(res);
4060}
4061function confirmeSoumission(formulaire,message,bouton) {
4062 if (!formulaire) return false;
4063 if (formulaire.getAttribute('data-confirme-soumission')==='1') {
4064 formulaire.removeAttribute('data-confirme-soumission');
4065 return true;
4066 }
4067 if (typeof formulaire.checkValidity==='function' && !formulaire.checkValidity()) {
4068 if (typeof formulaire.reportValidity==='function')
4069 formulaire.reportValidity();
4070 return false;
4071 }
4072 confirme(message,function () {
4073 if (typeof formulaire.requestSubmit==='function') {
4074 if (bouton) {
4075 formulaire.requestSubmit(bouton);
4076 } else {
4077 formulaire.setAttribute('data-confirme-soumission','1');
4078 formulaire.requestSubmit();
4079 }
4080 } else {
4081 var champBouton = null;
4082 if (bouton && bouton.name) {
4083 champBouton = document.createElement('input');
4084 champBouton.type = 'hidden';
4085 champBouton.name = bouton.name;
4086 champBouton.value = bouton.value;
4087 formulaire.appendChild(champBouton);
4088 }
4089 formulaire.submit();
4090 if (champBouton && champBouton.parentNode)
4091 champBouton.parentNode.removeChild(champBouton);
4092 }
4093 });
4094 return false;
4095}
4096var numErrLogged = 0;
4097var lastErrorType = '';
4098var lastErrorParam = '';
4099function errorLog (type, params) {
4100 if ($('.errorDlg').length>0) return;
4101 if (numErrLogged>3) return;
4102 if (type=="Script error.") return;
4103 if (type=="Script error") return;
4104 if (type && type.split) {
4105 if (type.split('adsbygoogle').length>1) return;
4106 if (type.split('postMessage').length>1) return;
4107 }
4108 lastErrorType = type;
4109 lastErrorParam = params;
4110 sendErrorLog (type, params);
4111 if (gcookie('hideErrorDlg')=='1') return;
4112 return;
4113 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">';
4114 resHTML += 'Une erreur est survenue :<br />';
4115 resHTML += '<pre>'+type+'</pre>';
4116 resHTML += 'Vous pouvez nous écrire une description du problème et nous soumettre le rapport d\'erreur :<br />';
4117 resHTML += '<textarea class="form-control" id="rapportErreurTxt"></textarea>';
4118 resHTML += '<input type="checkbox" onclick="changeRapportNotif(this);" checked="checked"/>Continuer d\'afficher cette fenêtre pour les prochaines erreurs.<br />';
4119 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Fermer"/>';
4120 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="sendError();parentHide($(this));" value="Envoyer le rapport"/>';
4121 
4122 resHTML += '<br /></form>';
4123 showBigDialog('Erreur technique',resHTML);
4124}
4125function customShare(url) {
4126 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">'; 
4127 resHTML += 'Votre partie est disponible à l\'adresse suivante :<br />';
4128 resHTML += '<textarea class="form-control">
4128'+url+'</textarea>';
4129 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Fermer"/>';
4130 
4131 resHTML += '<br /></form>';
4132 showBigDialog('Partage de partie',resHTML);
4133}
4134
4135function copierUrlPartieAncienNavigateur(url) {
4136 var zoneCopie = document.createElement('textarea');
4137 var copieEffectuee = false;
4138 zoneCopie.value = url;
4139 zoneCopie.setAttribute('readonly','readonly');
4140 zoneCopie.style.position = 'fixed';
4141 zoneCopie.style.left = '-9999px';
4142 zoneCopie.style.opacity = '0';
4143 document.body.appendChild(zoneCopie);
4144 zoneCopie.focus();
4145 zoneCopie.select();
4146 zoneCopie.setSelectionRange(0,url.length);
4147 try {
4148 copieEffectuee = document.execCommand('copy');
4149 } catch (e) {
4150 copieEffectuee = false;
4151 }
4152 document.body.removeChild(zoneCopie);
4153 return copieEffectuee;
4154}
4155
4156function partagerUrlPartie(url) {
4157 function copieReussie() {
4158 alerte('Le lien de la partie a été copié dans le presse-papiers.');
4159 }
4160 function copieImpossible() {
4161 if (copierUrlPartieAncienNavigateur(url))
4162 copieReussie();
4163 else
4164 customShare(url);
4165 }
4166
4167 if (navigator.clipboard && typeof navigator.clipboard.writeText==='function') {
4168 try {
4169 var copie = navigator.clipboard.writeText(url);
4170 if (copie && typeof copie.then==='function')
4171 copie.then(copieReussie,copieImpossible);
4172 else
4173 copieImpossible();
4174 } catch (e) {
4175 copieImpossible();
4176 }
4177 } else {
4178 copieImpossible();
4179 }
4180 return false;
4181}
4182function changeRapportNotif (obj) {
4183 if (obj.checked)
4184 scookie('hideErrorDlg',"");
4185 else
4186 scookie('hideErrorDlg',"1");
4187 gcookie('hideErrorDlg')
4188}
4189function copieJoueurInvites(j) {
4190 scookie('copiedPlayers',j);
4191}
4192function sendError () {
4193 sendErrorLog (lastErrorType, lastErrorParam);
4194}
4195var dateStratScrip = new Date().getTime();
4196var lastExecutedScriptForLogs = '';
4197var lastUserEventForLogs = null;
4198
4199function errorLogElementClassName(element) {
4200 if (!element) return '';
4201 if (typeof element.className == 'string') return element.className;
4202 if (element.className && typeof element.className.baseVal == 'string') return element.className.baseVal;
4203 return '';
4204}
4205
4206function rememberUserEventForLogs(event) {
4207 var target = event.target || event.srcElement;
4208 if (target && target.nodeType==3) target = target.parentNode;
4209 var handlerElement = target;
4210 var handlerAttribute = 'on'+event.type;
4211 while (handlerElement && handlerElement!==document) {
4212 if (handlerElement.getAttribute && handlerElement.getAttribute(handlerAttribute)!==null)
4213 break;
4214 handlerElement = handlerElement.parentNode;
4215 }
4216 lastUserEventForLogs = {
4217 at:new Date(),
4218 type:event.type,
4219 targetTag:target && target.tagName ? target.tagName : '',
4220 targetId:target && target.id ? target.id : '',
4221 targetClass:errorLogElementClassName(target),
4222 handlerTag:handlerElement && handlerElement.tagName ? handlerElement.tagName : '',
4223 handlerId:handlerElement && handlerElement.id ? handlerElement.id : '',
4224 handlerClass:errorLogElementClassName(handlerElement),
4225 handlerAttribute:handlerElement && handlerElement.getAttribute ? handlerElement.getAttribute(handlerAttribute) : null
4226 };
4227}
4228
4229if (document.addEventListener) {
4230 var userEventTypesForLogs = ['click','change','submit'];
4231 for (var userEventTypeIndexForLogs=0;userEventTypeIndexForLogs<userEventTypesForLogs.length;userEventTypeIndexForLogs++)
4232 document.addEventListener(userEventTypesForLogs[userEventTypeIndexForLogs],rememberUserEventForLogs,true);
4233}
4234
4235function sendErrorLog (type, params) {
4236 var myParam = {
4237 userAgent:navigator.userAgent,
4238 type:type,
4239 descriptionUtilisateur:escape($('#rapportErreurTxt').val()).split('+').join('%2B'),
4240 logStrings:logStrings,
4241 params:params,
4242 location:window.location.href,
4243 execTime: Math.floor((new Date().getTime()-dateStratScrip)/1000)+' secondes' ,
4244 now:new Date(),
4245 startedAt:new Date(dateStratScrip),
4246 lastExecutedScriptForLogs:lastExecutedScriptForLogs
4247 };
4248 llog(params);
4249 numErrLogged++;
4250 
4251 jQuery.ajax({
4252 type: 'POST',
4253 url: '/workers/logErr.php',
4254 data: {
4255  type: escape(type),
4256  params: myParam
4257 },
4258 success: function() {
4259  llog('JS error report successful.');
4260 },
4261 error: function() {
4262  if (console && console.error) {
4263  console.error('JS error report submission failed!');
4264  }
4265 }
4266 });
4267
4268 // Prevent firing of default error handler.
4269 return true;
4270}
4271function errorDetected(msg, url, lineNo, columnNo, error) {
4272 //if (typeof url.indexOf == 'undefined') return;
4273 if (msg=="Script error.") return true;
4274 // Brave iOS injecte son provider Web3 dans la page. Certaines versions
4275 // tentent de renseigner selectedAddress avant d'avoir cree window.ethereum.
4276 // Cette erreur tierce est rattachee a l'URL du document et passerait donc
4277 // le filtre de domaine ci-dessous.
4278 if ((msg && msg.toString().indexOf('window.ethereum.selectedAddress')!==-1) ||
4279 (error && error.stack && error.stack.toString().indexOf('window.ethereum.selectedAddress')!==-1)) return true;
4280 if (url && typeof url.indexOf !== 'undefined') {
4281 if( url.indexOf('tarot')==-1) return true;
4282 }
4283 var stack = null;
4284 if (error && typeof error.stack !='undefined') stack = error.stack;
4285
4286 if (stack && stack.toString().indexOf('/main.js')>0) return true;
4287 if (stack && stack.toString().indexOf('/cookiecmp.js')>0) return true;
4288 if (stack && stack.toString().indexOf('/cmpui-banner.js')>0) return true;
4289 
4290 var params = {
4291 stack:stack,
4292 msg:msg,
4293 url:url,
4294 lineNo:lineNo,
4295 columnNo:columnNo,
4296 error:error,
4297 lastAjaxRequest:lastAjaxRequest
4298 }
4299 params.lastAjaxResponseOrder = typeof lastAjaxResponseOrder!='undefined' ? lastAjaxResponseOrder : null;
4300 params.lastUserEventForLogs = lastUserEventForLogs;
4301 errorLog (msg, params)
4302}
4303window.onerror = errorDetected;
4304
4305function evalRes(src) {
4306 try {
4307 lastExecutedScriptForLogs = src;
4308 eval(src);
4309 } catch (e) {
4310 /*if (e=='Error: Out of memory') {
4311 alerte('Mémoire insuffisante');
4312 return;
4313 }*/
4314 var params = {
4315 type:'evalRes',
4316 exception:e,
4317 src:src,
4318 stackJ:e.stack,
4319 lastAjaxRequest:lastAjaxRequest
4320 }
4321 params.lastAjaxResponseOrder = typeof lastAjaxResponseOrder!='undefined' ? lastAjaxResponseOrder : null;
4322 params.lastUserEventForLogs = lastUserEventForLogs;
4323 errorLog (e,params);
4324 }
4325}
4326 
4327var isIE = navigator.appName.indexOf("Microsoft") != -1;
4328
4329function CopyToClipboard(obj) {
4330 
4331 window.prompt('Valeur',obj.innerText);
4332}
4333function moderationCopyInfo(button) {
4334 var valueNode = $(button).find('.moderationInfo__valeur').get(0);
4335 var helpNode = $(button).find('.moderationInfo__aide');
4336 if (!valueNode) return false;
4337 var value = (valueNode.textContent || valueNode.innerText || '').replace(/^\s+|\s+$/g,'');
4338 var originalHelp = helpNode.text();
4339 var copyDone = function () {
4340 $(button).addClass('is-copied');
4341 helpNode.attr('aria-live','polite').text('Copié dans le presse-papier');
4342 setTimeout(function () {
4343 $(button).removeClass('is-copied');
4344 helpNode.text(originalHelp);
4345 },1800);
4346 };
4347 var fallbackCopy = function () {
4348 var area = document.createElement('textarea');
4349 area.value = value;
4350 area.setAttribute('readonly','readonly');
4351 area.style.position = 'fixed';
4352 area.style.left = '-9999px';
4353 document.body.appendChild(area);
4354 area.select();
4355 try {
4356 if (document.execCommand('copy')) copyDone();
4357 else alerte('Impossible de copier cette valeur automatiquement.');
4358 } catch (e) {
4359 alerte('Impossible de copier cette valeur automatiquement.');
4360 }
4361 document.body.removeChild(area);
4362 };
4363 if (navigator.clipboard && navigator.clipboard.writeText) {
4364 navigator.clipboard.writeText(value).then(copyDone,fallbackCopy);
4365 } else fallbackCopy();
4366 return false;
4367}
4368function contactAngry () {
4369 var txt=$('#afafafafaf').val().toLowerCase();
4370 if (txt.indexOf('vous êtes super')!=-1 || txt.indexOf('site génial')!=-1 || txt.indexOf('super site')!=-1 || txt.indexOf('bravo')!=-1 || txt.indexOf('je vous aime')!=-1 || txt.indexOf('amour')!=-1 || txt.indexOf('gentillesse')!=-1 || txt.indexOf('merci')!=-1 || txt.indexOf('félicitations')!=-1) {
4371 $('#global').html('<b>Vous avez trouvé l\'oeuf de paques !</b><br>Jouez ici a puissance 4 en multijoueur, mais il vous faut inviter un ami !<br><iframe src="http://mini-games.virtual-pet-game.com/fourinline/" style="width:100%;height:600px;"/>');
4372 $('#afafafafaf').val('');
4373 return;
4374 }
4375 $('#afafafafaf').val('');alerte('Merci.'); 
4376}
4377function modeP(p,trigger) {
4378 $('.hiddenStep').hide();
4379 $('#'+p).show();
4380 if (!trigger)
4381 trigger = $('.moderationNavigation__lien[data-mode-panel="'+p+'"]').get(0);
4382 if (trigger) {
4383 $('.moderationNavigation__lien[data-mode-panel]').removeClass('is-active');
4384 $(trigger).addClass('is-active');
4385 }
4386}
4387function moderationOpenActionTarget(targetId) {
4388 modeP('modeActions');
4389 setTimeout(function () {
4390 var target = $('#'+targetId);
4391 if (!target.length) return;
4392 var section = target.closest('.moderationActionSection');
4393 if (section.length) window.scrollTo(0,Math.max(0,section.offset().top-12));
4394 target.focus();
4395 },0);
4396}
4397function moderationOpenNoteDialog() {
4398 var template = $('#moderationNoteDialogTemplate');
4399 if (!template.length || typeof showBigDialog!='function') {
4400 alerte('Le formulaire de note est indisponible.');
4401 return false;
4402 }
4403 var dialogId = showBigDialog('Prendre une note de mod&eacute;ration',template.html());
4404 if (dialogId) {
4405 window.setTimeout(function () {
4406 $('#'+dialogId).find('.moderationNoteDialog__field').focus();
4407 },0);
4408 }
4409 return false;
4410}
4411function moderationOpenPrivateMessageDialog(messageInitial) {
4412 var template = $('#moderationPrivateMessageDialogTemplate');
4413 if (!template.length || typeof showBigDialog!='function') {
4414 alerte('Le formulaire de message priv&eacute; est indisponible.');
4415 return false;
4416 }
4417 var dialogId = showBigDialog('Envoyer un message priv&eacute;',template.html());
4418 if (dialogId) {
4419 window.setTimeout(function () {
4420 var champ = $('#'+dialogId).find('.moderationPrivateMessageDialog__field');
4421 if (typeof messageInitial!='undefined') champ.val(messageInitial);
4422 champ.focus();
4423 },0);
4424 }
4425 return false;
4426}
4427function signalerUtilMalpoliInt(idUtil,cptBobYY) {
4428 var txt = $$('raisonMode'+cptBobYY).value;
4429 var typ = $$('typeMode'+cptBobYY).value;
4430 //if (txt.length>10) {
4431 ajax('/Contact-organisation-jeu-de-tarot.php', 'ajaxRes=1&contact[dest]='+idUtil+'&contact[message]='+escape(txt).split('+').join('%2B')+'&contact[sujet]='+escape(typ), function (res) {
4432 alerte(res.split('<spanResult/>')[1].split('<p>').join('').split('</p>').join(''),function () {
4433 confirme('Voulez-vous également bloquer ce joueur ?',function () {
4434 ajax('/workers/signalerJoueur.php', 'idUtil='+idUtil+'&raison=Autre', signalementFin);
4435 });
4436 });
4437 });
4438 //} else alert('Message insuffisant');
4439}
4440function signalerUtilMalpoli(idUtil) {
4441 window.scroll(0,0);
4442 var resHTML = '<form class="disableKeyEvents" onsubmit="return false;">';
4443 resHTML +='<select class="form-control" id="typeMode'+cptBobYY+'">';
4444 resHTML +='<option value="Un joueur s\'est mal comporté dans le chat">Langage offensant</option>';
4445 resHTML +='<option value="Biographie incorrecte">Biographie incorrecte</option>';
4446 resHTML +='<option value="Avatar incorrect">Avatar incorrect</option>';
4447 resHTML +='<option value="Pseudonyme incorrect">Pseudonyme incorrect</option>';
4448 resHTML +='<option value="Un joueur se comporte mal dans le jeu">Anti jeu délibéré</option>';
4449 resHTML +='<option value="Un joueur triche">Triche</option>';
4450 resHTML +='</select><br>';
4451 //resHTML +='<b>Votre message sera transmis aux modérateurs.</b><br>';
4452 resHTML +='Veuillez saisir une description du problème (pour un problème en jeu, n\'oubliez pas de préciser la manche) :<br>';
4453 resHTML +='<textarea class="form-control" id="raisonMode'+cptBobYY+'"></textarea>';
4454 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="signalerUtilMalpoliInt('+idUtil+','+cptBobYY+' );parentHide($(this));$(\'#Massist'+idUtil+'\').remove();" />';
4455 resHTML +='</form>';
4456 showBigDialog('Signaler à un modérateur',resHTML);
4457 cptBobYY++;
4458 
4459}
4460function signalerUtilMalpoliModer(idUtil,reason) {
4461 var resHTML = '<form class="disableKeyEvents" onsubmit="return false;">';
4462 //resHTML +='<b>Votre message sera transmis aux modérateurs.</b><br>';
4463 resHTML +='Veuillez saisir le point du règlement du site qui n\'est pas respecté, ou une explication, ou simplement laisser tel quel le texte par défaut :<br>';
4464 resHTML +='<input type="hidden" value="'+reason+'" id="typeMode'+cptBobYY+'"/>';
4465 resHTML +='<textarea class="form-control" id="raisonMode'+cptBobYY+'">Signalement à administrateur, sanction éventuelle</textarea>';
4466 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="signalerUtilMalpoliIntMode(\''+idUtil+'\','+cptBobYY+' );parentHide($(this));" />';
4467 resHTML +='</form>';
4468 showBigDialog('Signaler à Admin',resHTML);
4469 cptBobYY++;
4470 
4471}
4472function signalerUtilMalpoliIntMode(idUtil,cptBobYY) {
4473 var txt = $$('raisonMode'+cptBobYY).value;
4474 var typ = $$('typeMode'+cptBobYY).value;
4475 $('#Massist'+idUtil.split('&')[0]).remove();
4476 
4477 ajax('/Contact-organisation-jeu-de-tarot.php', 'setTraite=1&ajaxRes=1&contact[dest]='+idUtil+'&contact[message]='+escape(txt).split('+').join('%2B')+'&contact[sujet]='+escape(typ)+moderationSignalementsParametres(), function (res) {
4478 //alert(res.split('<spanResult/>')[1].split('<p>').join('').split('</p>').join(''));
4479 });
4480}
4481function moderationTransmettreDossier(idUtil,pseudo,ongletSignalements) {
4482 idUtil = parseInt(idUtil,10) || 0;
4483 if (!idUtil) return;
4484 var numero = cptBobYY++;
4485 var pseudoAffiche = $('<div/>').text(pseudo || ('#'+idUtil)).html();
4486 var contextes = {JEU_ABSENCE:'Absences',JEU_ANTIJEU:'Anti-jeu intentionnel',JEU_AUTRES:'Autres motifs',JEU_ANNONCES:'Annonces irrationnelles'};
4487 var contexte = Object.prototype.hasOwnProperty.call(contextes,ongletSignalements)?contextes[ongletSignalements]:'';
4488 var sanctionOptions = $('#moderationRapportSanctionOptions').html() || '<option value="">Aucune sanction recommand&eacute;e</option>';
4489 var resHTML = '<form class="disableKeyEvents moderationTransmitForm" onsubmit="return false;" aria-describedby="moderationTransmissionInfo'+numero+'">';
4490 resHTML += '<div class="moderationTransmitForm__joueur"><div><span>Joueur concern&eacute;</span><strong>'+pseudoAffiche+'</strong></div>';
4491 if (contexte) resHTML += '<span class="moderationTransmitForm__contexte">'+contexte+'</span>';
4492 resHTML += '</div><p class="moderationTransmitForm__intro" id="moderationTransmissionInfo'+numero+'">L\'administrateur examinera votre proposition et pourra valider ou ajuster la sanction.</p>';
4493 if (contexte) resHTML += '<input type="hidden" id="moderationTransmissionOnglet'+numero+'" value="'+ongletSignalements+'">';
4494 resHTML += '<div class="moderationTransmitForm__champ"><label for="moderationTransmissionSanction'+numero+'">Sanction propos&eacute;e'+(contexte?'':' <span>(facultatif)</span>')+'</label>';
4495 resHTML += '<select class="form-control" id="moderationTransmissionSanction'+numero+'"'+(contexte?' aria-required="true"':'')+'>'+sanctionOptions+'</select></div>';
4496 resHTML += '<div class="moderationTransmitForm__champ"><label for="moderationTransmissionMessage'+numero+'">Motif de la proposition</label>';
4497 resHTML += '<textarea class="form-control" id="moderationTransmissionMessage'+numero+'" rows="4" aria-required="true" aria-describedby="moderationTransmissionAide'+numero+'" placeholder="Faits constat&eacute;s, partie concern&eacute;e et raison de cette sanction"></textarea>';
4498 resHTML += '<p class="moderationTransmitForm__aide" id="moderationTransmissionAide'+numero+'">Ces pr&eacute;cisions seront jointes au dossier pour l\'administrateur.</p></div>';
4499 resHTML += '<p class="moderationTransmitForm__erreur" id="moderationTransmissionErreur'+numero+'" role="alert" hidden></p>';
4500 resHTML += '<div class="moderationTransmitForm__actions"><button class="btn btn-default" type="button" onclick="parentHide($(this));">Annuler</button>';
4501 resHTML += '<button class="btn btn-success" data-transmission-submit type="button" onclick="moderationTransmettreDossierEnvoyer('+idUtil+','+numero+',this);">Transmettre le dossier</button></div></form>';
4502 // Le titre est du texte, pas du HTML : pas d'entites &agrave; dans showBigDialog.
4503 var dialogId = showBigDialog('Proposer une autre sanction',resHTML);
4504 if (dialogId) {
4505 var dialog = $('#'+dialogId);
4506 dialog.closest('.ui-dialog').addClass('moderationTransmitDialog');
4507 dialog.dialog('option','width',Math.min(600,Math.max(280,$(window).width()-24)));
4508 dialog.dialog('option','position',{my:'center',at:'center',of:window});
4509 }
4510 setTimeout(function () { $('#moderationTransmission'+(contexte?'Sanction':'Message')+numero).focus(); },0);
4511}
4512function moderationTransmissionErreur(numero,message,champ) {
4513 var erreur = $('#moderationTransmissionErreur'+numero);
4514 erreur.text(message).prop('hidden',false);
4515 if (champ && champ.length) {
4516 champ.attr('aria-invalid','true');
4517 champ.focus();
4518 }
4519}
4520function moderationTransmettreDossierEnvoyer(idUtil,numero,button) {
4521 var bouton = $(button),form = bouton.closest('form');
4522 if (bouton.prop('disabled')) return;
4523 var champ = $('#moderationTransmissionMessage'+numero),select = $('#moderationTransmissionSanction'+numero);
4524 var message = $.trim(champ.val());
4525 var ongletSignalements = $('#moderationTransmissionOnglet'+numero).val() || '';
4526 var sanction = select.val() || '';
4527 form.find('[aria-invalid]').removeAttr('aria-invalid');
4528 $('#moderationTransmissionErreur'+numero).prop('hidden',true).text('');
4529 if (ongletSignalements && !sanction) {
4530 moderationTransmissionErreur(numero,'Choisissez la sanction que vous proposez.',select);
4531 return;
4532 }
4533 if (message.length<5) {
4534 moderationTransmissionErreur(numero,'Pr\u00e9cisez les faits qui justifient votre proposition.',champ);
4535 return;
4536 }
4537 var controles = form.find('button,textarea,select');
4538 controles.prop('disabled',true);form.attr('aria-busy','true');bouton.text('Transmission\u2026');
4539 function restaurer() { controles.prop('disabled',false);form.removeAttr('aria-busy');bouton.text('Transmettre le dossier'); }
4540 var sujet = 'Rapport de moderation - transmission du dossier';
4541 var params = 'ajaxRes=1&contact[dest]='+encodeURIComponent(idUtil)+
4542 '&contact[message]='+encodeURIComponent(message)+
4543 '&contact[sujet]='+encodeURIComponent(sujet)+
4544 '&contact[sanctionDemandee]='+encodeURIComponent(sanction);
4545 if (ongletSignalements) params += '&setTraite=1&moderationOnglet='+encodeURIComponent(ongletSignalements);
4546 // Pas de relance automatique d'une operation qui cree une proposition.
4547 $.ajax({url:'/Contact-organisation-jeu-de-tarot.php',type:'POST',data:params,success:function (res) {
4548 var resultat = res.indexOf('<spanResult/>')>=0 ? res.split('<spanResult/>')[1] : res;
4549 var texte = $.trim($('<div/>').html(resultat).text());
4550 restaurer();
4551 if ($('<div/>').html(resultat).find('.contactConfirmation').length || resultat.indexOf('Merci pour votre contribution')>=0) {
4552  parentHide($(button));
4553  if (ongletSignalements) $('#Massist'+idUtil).remove();
4554  alerte('Le dossier a bien \u00e9t\u00e9 transmis \u00e0 l\'administration.');
4555 } else {
4556  moderationTransmissionErreur(numero,texte || 'La transmission du dossier n\'a pas pu \u00eatre enregistr\u00e9e.');
4557 }
4558 },error:function () {
4559 restaurer();
4560 moderationTransmissionErreur(numero,'La transmission a \u00e9chou\u00e9. Vos saisies sont conserv\u00e9es ; vous pouvez r\u00e9essayer.');
4561 }});
4562}
4563
4564function moderationRapportLibelleSanction(idTicket,code) {
4565 var option = $('#moderationRapportSanctionSource'+idTicket+' option[value="'+code+'"]');
4566 return option.length ? option.text() : code;
4567}
4568function moderationRapportSanctionReussie(txt,type) {
4569 txt = $.trim(txt || '');
4570 if (type=='avertissement') return txt.indexOf('Un avertissement')===0;
4571 return txt.indexOf('Le compte')===0 || txt.indexOf('Les comptes')===0;
4572}
4573function moderationRapportEnregistrerDecision(idTicket,decision,code,message,fermerDialogue) {
4574 var parties = String(code || '').split(':');
4575 var params = 'idDemande='+encodeURIComponent(idTicket)+
4576 '&decision='+encodeURIComponent(decision)+
4577 '&sanctionType='+encodeURIComponent(parties[0] || '')+
4578 '&sanctionDuree='+encodeURIComponent(parseInt(parties[1],10) || 0)+
4579 '&message='+encodeURIComponent(message || '');
4580 ajax('/workers/moderation/rapportModerationDecision.php',params,function(txt) {
4581 if (txt.substr(0,3)!='OK|') {
4582 stopSupportTicketSending(idTicket);
4583 alerte(txt || 'La decision n\'a pas pu etre enregistree.');
4584 return;
4585 }
4586 if (fermerDialogue) parentHide($(fermerDialogue));
4587 removeTicket(idTicket);
4588 alerte(txt.substr(3));
4589 });
4590}
4591function moderationRapportExecuterSanction(idTicket,idUtil,code,decision,message,fermerDialogue) {
4592 var parties = String(code || '').split(':');
4593 var type = parties[0];
4594 var duree = parseInt(parties[1],10) || 0;
4595 if (!type || !startSupportTicketSending(idTicket)) return;
4596 var libelle = moderationRapportLibelleSanction(idTicket,code);
4597 var motif = encodeURIComponent(message || ('Decision administrative apres examen du rapport de moderation #'+idTicket+' : '+libelle));
4598 var callback = function(txt) {
4599 if (!moderationRapportSanctionReussie(txt,type)) {
4600 stopSupportTicketSending(idTicket);
4601 alerte(txt || 'La sanction n\'a pas pu etre appliquee.');
4602 return;
4603 }
4604 var reponse = decision=='recommandee' ?
4605 ('La sanction recommandee ('+libelle+') a ete appliquee apres examen du dossier.') :
4606 ('Une autre sanction ('+libelle+') a ete appliquee apres examen du dossier. '+message);
4607 moderationRapportEnregistrerDecision(idTicket,decision,code,$.trim(reponse),fermerDialogue);
4608 };
4609 if (type=='avertissement') avertissement(motif,0,idUtil,callback);
4610 else if (type=='chat') banIDchatA(motif,duree,idUtil,callback);
4611 else if (type=='mp') banIDMPA(motif,duree,idUtil,callback);
4612 else if (type=='contact') banContactA(motif,duree,idUtil,callback);
4613 else if (type=='bio') banBioA(motif,duree,idUtil,callback);
4614 else if (type=='forum') banIDforumA(motif,duree,idUtil,callback);
4615 else if (type=='jeu') banIDA(motif,duree,idUtil,callback);
4616 else if (type=='competition') banIDcompetA(motif,duree,idUtil,callback);
4617 else if (type=='multijoueur') banMultijoueurA(motif,duree,idUtil,callback);
4618 else {
4619 stopSupportTicketSending(idTicket);
4620 alerte('Sanction inconnue.');
4621 }
4622}
4623function moderationRapportAppliquerRecommandation(idTicket,idUtil,code) {
4624 var libelle = moderationRapportLibelleSanction(idTicket,code);
4625 confirme('Appliquer la sanction recommand&eacute;e : '+libelle+' ?',function () {
4626 moderationRapportExecuterSanction(idTicket,idUtil,code,'recommandee','',null);
4627 });
4628}
4629function moderationRapportChoisirAutreSanction(idTicket,idUtil) {
4630 var numero = cptBobYY++;
4631 var options = $('#moderationRapportSanctionSource'+idTicket).html();
4632 var html = '<form class="disableKeyEvents" onsubmit="return false;">';
4633 html += '<label for="moderationRapportAutreSanction'+numero+'">Sanction &agrave; appliquer</label>';
4634 html += '<select class="form-control" id="moderationRapportAutreSanction'+numero+'">'+options+'</select><br>';
4635 html += '<label for="moderationRapportAutreMotif'+numero+'">Motif de la d&eacute;cision</label>';
4636 html += '<textarea class="form-control" rows="5" id="moderationRapportAutreMotif'+numero+'" placeholder="Expliquez la sanction retenue"></textarea>';
4637 html += '<input class="btn ptobt btn-default pbtn" type="button" value="Annuler" onclick="parentHide($(this));" />';
4638 html += '<input class="btn ptobt btn-danger pbtn" type="button" value="Appliquer" onclick="moderationRapportValiderAutreSanction('+idTicket+','+idUtil+','+numero+',this);" />';
4639 html += '</form>';
4640 showBigDialog('Appliquer une autre sanction',html);
4641}
4642function moderationRapportValiderAutreSanction(idTicket,idUtil,numero,bouton) {
4643 var code = $('#moderationRapportAutreSanction'+numero).val() || '';
4644 var message = $.trim($('#moderationRapportAutreMotif'+numero).val());
4645 if (!code) return alerte('Veuillez choisir une sanction.');
4646 if (message.length<5) return alerte('Veuillez expliquer la decision retenue.');
4647 moderationRapportExecuterSanction(idTicket,idUtil,code,'alternative',message,bouton);
4648}
4649function moderationRapportRefuser(idTicket) {
4650 var numero = cptBobYY++;
4651 var html = '<form class="disableKeyEvents" onsubmit="return false;">';
4652 html += '<label for="moderationRapportRefusMessage'+numero+'">Motif du refus transmis au mod&eacute;rateur</label>';
4653 html += '<textarea class="form-control" rows="5" id="moderationRapportRefusMessage'+numero+'" placeholder="Expliquez pourquoi la recommandation est refus&eacute;e"></textarea>';
4654 html += '<input class="btn ptobt btn-default pbtn" type="button" value="Annuler" onclick="parentHide($(this));" />';
4655 html += '<input class="btn ptobt btn-danger pbtn" type="button" value="Refuser la recommandation" onclick="moderationRapportValiderRefus('+idTicket+','+numero+',this);" />';
4656 html += '</form>';
4657 showBigDialog('Refuser la sanction recommand&eacute;e',html);
4658}
4659function moderationRapportValiderRefus(idTicket,numero,bouton) {
4660 var message = $.trim($('#moderationRapportRefusMessage'+numero).val());
4661 if (message.length<5) return alerte('Veuillez saisir un motif de refus.');
4662 if (!startSupportTicketSending(idTicket)) return;
4663 moderationRapportEnregistrerDecision(idTicket,'refusee','',message,bouton);
4664}
4665function banPseudo() {
4666 var pseudo = $('#banpseudo').val();
4667 var idJoueur = parseInt($('#banJoueurId').val(),10) || 0;
4668 if (idJoueur>0) {
4669 ajouterBlocageCompte(idJoueur);
4670 return;
4671 }
4672 if (pseudo=='')
4673 return alerte('Veuillez saisir un pseudo');
4674 ajax('/workers/findUser.php', 'pseudo='+pseudo,function(res) {
4675 if (res.split('-').length<2)
4676 alerte(res);
4677 else {
4678 var tab = res.split('-');
4679 ajouterBlocageCompte(tab[0]);
4680 /*$('#searchPseudoID').val(tab[0]);
4681 var html = '<label>Joueur concerné : '+pseudo+'</label> <br>';
4682 html += '<img src="/workers/avatar.php?a&idImage='+tab[1]+'"/>';
4683 $('#searchPseudoBox').html(html);*/
4684 }
4685 
4686 });
4687 //ajax('/workers/joueur.php', 'part=blacklist&pseudoAdd='+pseudo, clstCallback);
4688}
4689function ajouterBlocageCompte(idUtil) {
4690 confirme('Voulez-vous bloquer ce joueur dans le jeu, les messages priv&eacute;s et le chat pendant 24 heures ?',function () {
4691 lnUser(idUtil,'temporaire',true,'','compte_blocage');
4692 });
4693}
4694
4695function showLogsAccess(baseURL,baseURL2, hosts, ip) {
4696 $('#AccessLog').html('');
4697 for (var i in hosts) {
4698 var ipHost = hosts[i];
4699 if (typeof ipHost == 'string') {
4700
4701 ajax('http://'+ipHost+baseURL+ip, '', function (res) {
4702 if (res.trim()!='') {
4703  $('#AccessLog').append('<b>Result</b><br>'+res);
4704 }
4705 });
4706 ajax('http://'+ipHost+baseURL2+ip, '', function (res) {
4707 if (res.trim()!='') {
4708  $('#AccessLog').append('<b>Result</b><br>'+res);
4709 }
4710 });
4711 }
4712 }
4713}
4714function supprimerCompte(disposeCredits,codeVerif,desactiverCompte) {
4715 function confirmerSuppressionImmediate() {
4716 confirme(desactiverCompte ? 'Votre compte sera désactivé et votre adresse email restera réservée. Confirmer ?' : 'ATTENTION : cette opération est immédiate et définitive, êtes-vous sur ?',function () {
4717 document.location = '/?deleteAccount='+encodeURIComponent(codeVerif)+'&pw='+encodeURIComponent($('#thePWDEL').val());
4718 });
4719 }
4720 function confirmerDemandeSuppression() {
4721 confirme('Etes-vous sur de vouloir demander la suppression de votre compte ?',confirmerSuppressionImmediate);
4722 }
4723 if (disposeCredits)
4724 confirme('ATTENTION : vous disposez encore de crédits sur ce compte. Etes-vous sûr ?',confirmerDemandeSuppression);
4725 else
4726 confirmerDemandeSuppression();
4727 return false;
4728}
4729function delCommentModeA(raison, duree, param, succes) {
4730 ajax('/workers/forumCommentDelete.php', 'idComment='+param+'&reason='+raison, function (res) {
4731 if (res=='OK')
4732 document.location.reload();
4733 else alerte(res);
4734 }); 
4735}
4736function delCommentMode(idComment) {
4737 banMode('delCommentModeA',0,idComment );
4738}
4739function delMyComment(idComment) {
4740 confirme('Etes vous sûr de vouloir supprimer ce commentaire ?',function () {
4741 
4742 ajax('/workers/forumCommentDelete.php', 'idComment='+idComment, function (res) {
4743 if (res=='OK')
4744 document.location.reload();
4745 else alerte(res);
4746 }); 
4747 })
4748}
4749function commentReponse(idReponse,idEmot) {
4750 ajax('/workers/forumComment.php', 'idEmot='+idEmot+'&idReponse='+idReponse, function (res) {
4751 if (res!='OK') {
4752 $('#emots'+idReponse).html(res);
4753 }
4754 });
4755}
4756function forumToggleResponseComments(idReponse,forceShow) {
4757 var comments = $('#forumComments'+idReponse);
4758 var hiddenNotice = $('#forumCommentsHidden'+idReponse);
4759 if (!comments.length) return false;
4760
4761 var showComments = typeof forceShow=='boolean' ? forceShow : !comments.is(':visible');
4762 comments.toggle(showComments).attr('aria-hidden',showComments?'false':'true');
4763 hiddenNotice.toggle(!showComments).attr('aria-expanded',showComments?'true':'false');
4764 return false;
4765}
4766function forumToggleReadMessages(button,groupId,targetAnchor) {
4767 var group = $('#'+groupId);
4768 if (!group.length) return false;
4769
4770 var loadState = group.attr('data-forum-read-loaded') || '1';
4771 var anchor = String(targetAnchor || '').toUpperCase();
4772 if (!/^(?:REP|CMNT)\d+$/.test(anchor)) anchor = '';
4773 var targetedLoad = anchor!=='' && loadState!=='1';
4774 var needsLoad = loadState==='0' || loadState==='partial';
4775 if (needsLoad) {
4776 if (group.attr('data-forum-read-loading')==='1') return false;
4777 var wasPartial = loadState==='partial';
4778 var requestData = {
4779 idSujet:parseInt(group.attr('data-forum-read-topic'),10) || 0,
4780 firstResponseId:parseInt(group.attr('data-forum-read-first'),10) || 0,
4781 lastResponseId:parseInt(group.attr('data-forum-read-last'),10) || 0
4782 };
4783 if (targetedLoad) requestData.anchor = anchor;
4784
4785 var forumReadMessagesLoadFailed = function() {
4786 group.removeAttr('data-forum-read-loading');
4787 $(button).removeAttr('aria-busy').find('.forumReadMessagesAction').html(
4788 (wasPartial?'Afficher tout le bloc':'R\u00e9essayer')+
4789 ' <span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span>'
4790 );
4791 };
4792
4793 group.attr('data-forum-read-loading','1');
4794 $(button).attr('aria-busy','true');
4795 $(button).find('.forumReadMessagesAction').html(
4796 'Chargement... <span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>'
4797 );
4798 jQuery.ajax({
4799 type:'POST',
4800 url:'/workers/forumReadMessages.php',
4801 data:requestData,
4802 success:function(txt) {
4803 var responseText = txt==null?'':String(txt);
4804 if (!$.trim(responseText)) {
4805 forumReadMessagesLoadFailed();
4806 return;
4807 }
4808 if (targetedLoad) {
4809 var loadedFragment = $('<div></div>').html(responseText);
4810 if (!loadedFragment.find('#'+anchor).length) {
4811 forumReadMessagesLoadFailed();
4812 return;
4813 }
4814 }
4815
4816 group.html(responseText)
4817 .attr('data-forum-read-loaded',targetedLoad?'partial':'1')
4818 .removeAttr('data-forum-read-loading');
4819 if (targetedLoad)
4820 group.attr('data-forum-read-anchor',anchor);
4821 else
4822 group.removeAttr('data-forum-read-anchor');
4823 group.show().attr('aria-hidden','false');
4824 $(button).removeAttr('aria-busy').attr('aria-expanded','true');
4825 $(button).find('.forumReadMessagesAction').html(
4826 (targetedLoad?'Afficher tout le bloc':'Masquer')+
4827 ' <span class="glyphicon glyphicon-chevron-'+(targetedLoad?'down':'up')+'" aria-hidden="true"></span>'
4828 );
4829 setTimeout(forumRevealAnchoredContent,0);
4830 },
4831 error:function(xhr,status) {
4832 forumReadMessagesLoadFailed();
4833 if (status!=='abort' && window.console && console.error)
4834 console.error('JS forum read messages load failed',xhr);
4835 }
4836 });
4837 return false;
4838 }
4839
4840 var showMessages = !group.is(':visible');
4841 group.toggle(showMessages).attr('aria-hidden',showMessages?'false':'true');
4842 $(button).attr('aria-expanded',showMessages?'true':'false');
4843 $(button).find('.forumReadMessagesAction').html(
4844 (showMessages?'Masquer':'Afficher')+
4845 ' <span class="glyphicon glyphicon-chevron-'+(showMessages?'up':'down')+'" aria-hidden="true"></span>'
4846 );
4847 return false;
4848}
4849function forumRevealAnchoredContent() {
4850 var hash = window.location.hash || '';
4851 if (!/^#(?:REP|CMNT)\d+$/.test(hash)) return false;
4852
4853 var target = $(hash);
4854 if (!target.length) {
4855 var unloadedReadGroup = $('.forumReadMessagesGroup[data-forum-read-loaded="0"],.forumReadMessagesGroup[data-forum-read-loaded="partial"]').first();
4856 if (unloadedReadGroup.length) {
4857 var unloadedGroupId = unloadedReadGroup.attr('id');
4858 var unloadedButton = $('[aria-controls="'+unloadedGroupId+'"]').first();
4859 if (unloadedButton.length)
4860 forumToggleReadMessages(unloadedButton[0],unloadedGroupId,hash.substring(1));
4861 }
4862 return false;
4863 }
4864
4865 var readGroup = target.closest('.forumReadMessagesGroup');
4866 if (readGroup.length && !readGroup.is(':visible')) {
4867 var readGroupId = readGroup.attr('id');
4868 var readButton = $('[aria-controls="'+readGroupId+'"]').first();
4869 if (readButton.length)
4870 forumToggleReadMessages(readButton[0],readGroupId);
4871 else
4872 readGroup.show().attr('aria-hidden','false');
4873 }
4874
4875 var commentsGroup = target.closest('.forumCommentsGroup');
4876 if (commentsGroup.length && !commentsGroup.is(':visible')) {
4877 var commentsId = commentsGroup.attr('id') || '';
4878 var commentsMatch = /^forumComments(\d+)$/.exec(commentsId);
4879 if (commentsMatch)
4880 forumToggleResponseComments(parseInt(commentsMatch[1],10),true);
4881 else
4882 commentsGroup.show().attr('aria-hidden','false');
4883 }
4884
4885 if (!target.is(':visible')) return false;
4886 setTimeout(function() {
4887 target[0].scrollIntoView();
4888 },0);
4889 return true;
4890}
4891jQuery(function() {
4892 forumRevealAnchoredContent();
4893 jQuery(window).off('hashchange.forumAnchor').on('hashchange.forumAnchor',forumRevealAnchoredContent);
4894});
4895function commentSujet(idSujet,idEmot) {
4896 ajax('/workers/forumCommentSujet.php', 'idEmot='+idEmot+'&idSujet='+idSujet, function (res) {
4897 if (res!='OK') {
4898 $('#emotsSujet'+idSujet).html(res);
4899 }
4900 });
4901}
4902
4903function forumReglementCookieName() {
4904 var userId = 0;
4905 if (document.body)
4906 userId = parseInt(document.body.getAttribute('data-user-id'),10) || 0;
4907 return 'forumReglementAccepteV1_'+userId;
4908}
4909function forumReglementAccepte() {
4910 var nom = encodeURIComponent(forumReglementCookieName())+'=';
4911 var cookies = document.cookie ? document.cookie.split(';') : [];
4912 for (var i=0;i<cookies.length;i++) {
4913 var cookie = cookies[i].replace(/^\s+/,'');
4914 if (cookie.indexOf(nom)===0 && cookie.substring(nom.length)==='1')
4915 return true;
4916 }
4917 return false;
4918}
4919function forumMemoriseReglementAccepte() {
4920 var expiration = new Date();
4921 expiration.setFullYear(expiration.getFullYear()+10);
4922 document.cookie = encodeURIComponent(forumReglementCookieName())+
4923 '=1; expires='+expiration.toUTCString()+'; path=/; SameSite=Lax';
4924}
4925function forumAvecAcceptationReglement(siAccepte) {
4926 if (forumReglementAccepte()) {
4927 siAccepte();
4928 return false;
4929 }
4930 var reglementCoche = false;
4931 var message = '<b>Aucun r\u00e8glement de compte ou attaque personnelle sur le forum, insultes interdites, veuillez respecter le r\u00e8glement.</b><br><br>'+
4932 '<u>Signalement de publications</u> : pour chaque publication sur le forum (sujet, r\u00e9ponse \u00e0 un sujet, ou commentaire), vous disposez d\u0027une ic\u00f4ne repr\u00e9sentant un point d\u0027exclamation permettant de signaler un contenu inappropri\u00e9.<br><br>'+
4933 'Vous devez accepter ces r\u00e8gles pour publier sur le forum. Votre acceptation sera m\u00e9moris\u00e9e pour ce compte sur cet appareil.'+
4934 '<p style="margin-top:18px;"><input type="checkbox" id="forumReglementAccepter"> '+
4935 '<label for="forumReglementAccepter"><b>Accepter</b></label></p>';
4936 confirme(message,function () {
4937 if (!reglementCoche)
4938 return;
4939 forumMemoriseReglementAccepte();
4940 siAccepte();
4941 });
4942
4943 function preparerCaseReglement() {
4944 var laCase = $('#forumReglementAccepter');
4945 if (!laCase.length) {
4946 window.setTimeout(preparerCaseReglement,50);
4947 return;
4948 }
4949 var boutonConfirmer = laCase.closest('.modalW').find('#modYes');
4950 boutonConfirmer.prop('disabled',true).attr('aria-disabled','true');
4951 laCase.on('change',function () {
4952 reglementCoche = this.checked===true;
4953 boutonConfirmer
4954 .prop('disabled',!reglementCoche)
4955 .attr('aria-disabled',reglementCoche?'false':'true');
4956 });
4957 }
4958 preparerCaseReglement();
4959 return false;
4960}
4961function commentReponsePersoInt(cptBobYY,idReponse,idReponseCommentaire,bouton,fermerGrandDialog)
4962{
4963 var msg = $('#commentReponse'+cptBobYY).val();
4964 if (!msg)
4965 return false;
4966
4967 msg = escape(msg).split('+').join('%2B');
4968 var params = 'msg='+msg+'&idReponse='+idReponse+'&ajaxNavigation=1';
4969 idReponseCommentaire = parseInt(idReponseCommentaire,10) || 0;
4970 if (idReponseCommentaire>0)
4971 params += '&idReponseCommentaire='+idReponseCommentaire;
4972
4973 forumAvecAcceptationReglement(function () {
4974 if (bouton) $(bouton).prop('disabled',true);
4975 ajax('/workers/forumCommentPerso.php', params, function (res) {
4976 var result = forumPublicationResult(res);
4977 if (!result.ok) {
4978 if (bouton) $(bouton).prop('disabled',false);
4979 alerte(result.message);
4980 return;
4981 }
4982 if (fermerGrandDialog)
4983 $('#myDialog'+cptBobYY).remove();
4984 else if (bouton)
4985 parentHide($(bouton));
4986 forumReloadCurrentTopic(result.id?'CMNT'+result.id:'');
4987 });
4988 });
4989 return false;
4990}
4991function showBigComment(idReponse,idReponseCommentaire) {
4992
4993 dialogNum++;
4994 var dlgID = dialogNum+"IF";
4995 idReponseCommentaire = parseInt(idReponseCommentaire,10) || 0;
4996 
4997 var resHTML = '<form onsubmit="return false;">';
4998 resHTML +='<b>Veuillez saisir votre commentaire.</b><br>';
4999 //resHTML +='Veuillez saisir la raison de votre décision de modération, en citant des extraits de conversation du joueur :<br>';
5000 resHTML +='<div class="htmlbutt" idTxt="commentReponse'+dlgID+'"></div>';
5001 resHTML +='<textarea class="form-control" style="height:500px;" id="commentReponse'+dlgID+'">';
5002 resHTML +='</textarea>';
5003 resHTML +='<input class="btn ptobt btn-success pbtn" type="button" value="Envoyer" onclick="commentReponsePersoInt(\''+dlgID+'\','+idReponse+','+idReponseCommentaire+',this,true); return false;" />';
5004 resHTML +='<input class="btn ptobt btn-danger pbtn" type="button" value="Fermer" onclick="$(\'#myDialog'+dlgID+'\').remove();" />';
5005 resHTML +='</form>';
5006 
5007 
5008 var dialog = document.createElement('div');
5009 dialog.id = 'myDialog'+dlgID;
5010 dialog.className = 'dialogBox dialogWide';
5011 dialog.innerHTML = resHTML;
5012 document.body.appendChild(dialog);
5013 showHTMLbuttons();
5014 $('#commentReponse'+dlgID).val($('#commentReponse'+(cptBobYY-1)).val());
5015 return "myDialog"+dlgID; 
5016}
5017
5018function commentReponsePerso(idReponse,idReponseCommentaire)
5019{
5020 idReponseCommentaire = parseInt(idReponseCommentaire,10) || 0;
5021 var commentTextareaId = 'commentReponse'+cptBobYY;
5022 var resHTML = '<form onsubmit="return false;">';
5023 resHTML +='<b>Veuillez saisir votre commentaire.</b><br>';
5024 //resHTML +='Veuillez saisir la raison de votre décision de modération, en citant des extraits de conversation du joueur :<br>';
5025 resHTML +='<div class="htmlbutt" idTxt="'+commentTextareaId+'"></div>';
5026 resHTML +='<textarea class="form-control" style="height:150px;" id="'+commentTextareaId+'">';
5027 resHTML +='</textarea>';
5028 resHTML +='<input class="btn ptobt btn-success pbtn" type="button" value="Envoyer" onclick="commentReponsePersoInt('+cptBobYY+','+idReponse+','+idReponseCommentaire+',this,false); return false;" />';
5029 resHTML +='<input class="btn ptobt btn-info pbtn" type="button" value="Agrandir" onclick="showBig
5029Comment('+idReponse+','+idReponseCommentaire+');parentHide($(this));" />';
5030 resHTML +='</form>';
5031 showBigDialog('Commenter une réponse',resHTML);
5032 showHTMLbuttons();
5033 window.setTimeout(function () {
5034 $('#'+commentTextareaId).focus();
5035 },0);
5036 //megaModal(resHTML);
5037 cptBobYY++;
5038} 
5039function sendMessageForum(idSujet,fromCat,fromSort) {
5040 var txt = $('#postReponse_txt').val();
5041 if (txt.trim()=='') {
5042 alerte('Veuillez saisir un message');
5043 return false;
5044 }
5045 var allowSmileys = '';
5046 if ($('#enableSmileys').is(':checked'))
5047 allowSmileys = '&enableSmileys=1';
5048
5049 forumAvecAcceptationReglement(function () {
5050 confirme('Etes-vous s\u00fbr de vouloir envoyer cette r\u00e9ponse ? Pensez \u00e0 vous relire.',function () {
5051 $('#postReponse_btn').hide();
5052 ajax('/workers/forumReponse.php', 'reponse='+escape(txt).split('+').join('%2B')+'&idSujet='+idSujet+'&ajaxNavigation=1'+allowSmileys, function (res) {
5053 var result = forumPublicationResult(res);
5054 if (!result.ok) {
5055 $('#postReponse_btn').show();
5056 alerte(result.message);
5057 }
5058 else {
5059 return forumReloadCurrentTopic(result.id?'REP'+result.id:'');
5060 }
5061 });
5062 });
5063 });
5064 return false;
5065}
5066function sendSujetForum(idCat) {
5067 var txt = $('#postSujet_txt').val();
5068 if (txt.trim()=='') {
5069 alerte('Veuillez saisir un message');
5070 return false;
5071 }
5072 var titre = $('#postSujet_titre').val();
5073 if (titre.trim()=='') {
5074 alerte('Veuillez saisir un titre');
5075 return false;
5076 }
5077 var allowSmileys = '';
5078 if ($('#enableSmileys').is(':checked'))
5079 allowSmileys = '&enableSmileys=1';
5080
5081 var addVal = '';
5082 if ($('#postSujet_droits').length)
5083 addVal += '&droitsConsultation='+$('#postSujet_droits').val();
5084 if ($('#postSujet_droits_edition').length)
5085 addVal += '&droitsEdition='+$('#postSujet_droits_edition').val();
5086
5087 forumAvecAcceptationReglement(function () {
5088 confirme('Etes-vous s\u00fbr de vouloir envoyer ce sujet ? Pensez \u00e0 vous relire et \u00e0 ne pas poster un sujet d\u00e9j\u00e0 existant sur le forum.',function () {
5089 confirme('Etes-vous s\u00fbr que ce sujet n\u0027est pas d\u00e9j\u00e0 pr\u00e9sent sur le forum ?', function () {
5090 $('#postSujet_btn').hide();
5091 ajax('/workers/forumSujet.php', 'titre='+escape(titre).split('+').join('%2B')+'&txt='+escape(txt).split('+').join('%2B')+'&idCat='+idCat+'&ajaxNavigation=1'+addVal+allowSmileys, function (res) {
5092 var result = forumPublicationResult(res);
5093 if (!result.ok) {
5094  $('#postSujet_btn').show();
5095  alerte(result.message);
5096 }
5097 else if (result.id)
5098  forumAjaxShowSujet(result.id,idCat,'',result.slug || 'Sujet',null,'','push');
5099 else {
5100  $('#postSujet_btn').show();
5101  alerte('Le sujet a \u00e9t\u00e9 cr\u00e9\u00e9, mais son affichage asynchrone a \u00e9chou\u00e9.');
5102 }
5103 });
5104 });
5105 });
5106 });
5107 return false;
5108}
5109function delReponseA (txt,duree,idReponse,successFn)
5110{
5111 if (!successFn) successFn = alertRes;
5112 ajax('/workers/forumReponseDel.php', 'txt='+txt+'&idReponse='+idReponse, successFn); 
5113} 
5114function undelReponse (idReponse)
5115{
5116 //if (!successFn) successFn = alertRes;
5117 ajax('/workers/forumReponseUndel.php', 'idReponse='+idReponse, function () { document.location.reload(); } ); 
5118} 
5119
5120function delReponse(idReponse) {
5121 var self = $(this);
5122 //banMode(typeBan,duree,idtoban,successFn,defTexte);
5123 banMode('delReponseA',0,idReponse,function () { document.location.reload(); } );
5124 /*confirme('Etes-vous sûr de vouloir supprimer cette réponse ? Cette opération ne pourra plus être annulée.', function () {
5125 
5126 ajax('/workers/forumReponseDel.php', 'idReponse='+idReponse, function () {
5127 document.location.reload();
5128 });
5129 return false;
5130 });*/
5131}
5132function delSujet(idSujet) {
5133
5134 confirme('Etes-vous sûr de vouloir supprimer ce sujet ? Cette opération ne pourra plus être annulée.',function () {
5135 $(this).hide();
5136 ajax('/workers/forumSujetDel.php', 'idSujet='+idSujet, function () {
5137 document.location.reload();
5138 });
5139 return false;
5140 });
5141}
5142function recapNavigationScope(source) {
5143 var root = source ? $(source).closest('.partieRecap') : $();
5144 return root.length ? root : $(document);
5145}
5146function showGameStep(step,source) {
5147 var scope=recapNavigationScope(source);
5148 scope.find('.gameStepBt').removeClass('selStep');
5149 scope.find('.myRec'+step).addClass('selStep');
5150 scope.find('.histo2nd').hide();
5151 scookie('recapStep',step);
5152 scope.find('.etapeJeu').addClass('hiddenStep');
5153 scope.find('.'+step).removeClass('hiddenStep');
5154 if (window.partieRecapNavigation) window.partieRecapNavigation(scope[0],step);
5155}
5156function showRecapManche(manche,source) {
5157 var root=source ? $(source).closest('.partieRecap') : $();
5158 var history=source ? $(source).closest('.partieRecapAsync') : $();
5159 var scope=history.length ? history : (root.length ? root.find('.partieRecap__comparatifs') : $(document));
5160 scookie('recapManche',manche);
5161 scope.find('.recapMacn').addClass('hiddenManche');
5162 scope.find('.recapManche'+manche).removeClass('hiddenManche');
5163 scope.find('.recvMan').removeClass('selStep').attr('aria-pressed','false');
5164 scope.find('.recvMan[data-manche="'+manche+'"]').addClass('selStep').attr('aria-pressed','true');
5165 if (source && $(source).hasClass('recvMan')) $(source).addClass('selStep').attr('aria-pressed','true');
5166 if (window.partieRecapNavigation) window.partieRecapNavigation(root[0],null,manche,history.length>0);
5167}
5168function showRecapToutesEtapes(source) {
5169 var scope=recapNavigationScope(source);
5170 scope.find('.recapGame .selStep').removeClass('selStep');
5171 scope.find('.recapAllSteps').addClass('selStep');
5172 if (window.partieRecapNavigation) window.partieRecapNavigation(scope[0],'All');
5173 scope.find('.recapGame .hiddenStep').removeClass('hiddenStep');
5174 scope.find('.histo1st').addClass('hiddenStep');
5175 scope.find('.histo2nd').show();
5176}
5177
5178function cufonRefresh()
5179{   
5180}
5181function cufonRefreshTO()
5182{
5183}
5184function animateId (id,destX,destY) {
5185 var sizeCard = getPlayedCardSizeHTML();
5186
5187 var neW = sizeCard.w;
5188 var neH = sizeCard.h;
5189 /*if ( $('.cardJeu').length>0) {
5190 neW = $('.cardJeu').width();
5191 neH = $('.cardJeu').height();
5192 }*/
5193 if (destX!=null && destY!=null)
5194 $('#'+id.split('.').join('\\.')).animate({
5195 width:neW,
5196 height:neH,
5197 left: destX+'px',
5198 top: destY+'px'
5199 }, 600, function() {
5200 // Animation complete.
5201 });
5202
5203 if (destY==null)
5204 $('#'+id.split('.').join('\\.')).animate({
5205 left: destX+'px'
5206 }, 600, function() {
5207 // Animation complete.
5208 });
5209
5210 if (destX==null)
5211 $('#'+id.split('.').join('\\.')).animate({
5212 top: destY+'px'
5213 }, 600, function() {
5214 // Animation complete.
5215 });
5216}
5217function animateIdHTML2 (id,destX,destY) {
5218 var sizeCard = getPlayedCardSizeHTML2();
5219
5220 var neW = sizeCard.w;
5221 var neH = sizeCard.h;
5222 /*if ( $('.cardJeu').length>0) {
5223 neW = $('.cardJeu').width();
5224 neH = $('.cardJeu').height();
5225 }*/
5226 if (destX!=null && destY!=null)
5227 $('#'+id.split('.').join('\\.')).animate({
5228 width:neW,
5229 height:neH,
5230 left: destX+'px',
5231 top: destY+'px'
5232 }, 600, function() {
5233 // Animation complete.
5234 });
5235
5236 if (destY==null)
5237 $('#'+id.split('.').join('\\.')).animate({
5238 left: destX+'px'
5239 }, 600, function() {
5240 // Animation complete.
5241 });
5242
5243 if (destX==null)
5244 $('#'+id.split('.').join('\\.')).animate({
5245 top: destY+'px'
5246 }, 600, function() {
5247 // Animation complete.
5248 });
5249}
5250
5251function clstCallback(t) 
5252{
5253 if ($$('global')==null) return;
5254 $$('global').innerHTML = (t);
5255 window.scroll(0,0);
5256 if ($$('script')!=null) eval($$('script').innerHTML);
5257 cufonRefresh() ;
5258 if (typeof showHTMLbuttons === 'function') showHTMLbuttons();
5259 if (typeof initClassementAvatars === 'function') initClassementAvatars($$('global'));
5260 if (typeof window.initNotificationsPage === 'function') window.initNotificationsPage();
5261}
5262function clstCallbackNoScroll(t) 
5263{
5264 if ($$('global')==null) return;
5265 $$('global').innerHTML = (t);
5266 //window.scroll(0,0);
5267 if ($$('script')!=null) eval($$('script').innerHTML);
5268 cufonRefresh() ;
5269 if (typeof showHTMLbuttons === 'function') showHTMLbuttons();
5270 if (typeof window.initNotificationsPage === 'function') window.initNotificationsPage();
5271}
5272function showPleaseWait(message) {
5273 if ($$('global')==null) return;
5274 $('.qc-cmp-persistent-link').remove();
5275 if (!message) message = 'Veuillez patienter pendant le chargement...';
5276 $('.infoAll').html('');
5277 window.scroll(0,0);
5278 $$('global').innerHTML = '<br /><hr/><h2 class="intro-text text-center">
5278'+message+'</h2><hr/><br /><br />'; 
5279 $('li.sel').removeClass('sel');
5280}
5281function delBlacklist (id)
5282{
5283 ajax('/workers/joueur.php', 'part=blacklist&idDelete='+id, clstCallback);
5284} 
5285function delBlacklistForum ()
5286{
5287 ajax('/workers/joueur.php', 'part=blacklist&idDeleteForum=1', clstCallback);
5288}
5289function setBlacklistPermanent(id)
5290{
5291 confirme('Attention, vous allez rendre ce blocage permanent, il ne sera plus supprim&eacute; automatiquement.',function () {
5292 ajax('/workers/joueur.php', 'part=blacklist&permanentBlacklist='+parseInt(id,10)+'&permanent=1', clstCallback);
5293 });
5294}
5295function renewBlacklist (id)
5296{
5297 ajax('/workers/joueur.php', 'part=blacklist&renewBlacklist='+id, clstCallback);
5298} 
5299
5300
5301function showOldClst (pageNum)
5302{
5303 showPleaseWait();
5304 ajax('/workers/classementOld.php', 'pageNum='+pageNum, clstCallback);
5305} 
5306function showOldClst5 (pageNum)
5307{
5308 showPleaseWait();
5309 ajax('/workers/classementOld.php', 'pageNum='+pageNum+'&nbjq=5', clstCallback);
5310} 
5311function showSanctionsList() {
5312 showWorkerPageCB ('baremeSanctions','','',CBbaremeSanctions);
5313}
5314function CBbaremeSanctions(txt) {
5315 var contenu = $('<div></div>').html(txt);
5316 var bareme = contenu.find('#baremeSanctionsList');
5317 if (!bareme.length) {
5318 alerte('Le barème des sanctions est indisponible.');
5319 return;
5320 }
5321 bareme.find('h2').first().remove();
5322 bareme.find('[onclick*="baremeSanctionsList"]').remove();
5323 bareme.removeAttr('id').addClass('baremeSanctionsDialog');
5324 showBigDialog('Barème des sanctions',contenu.html());
5325}
5326function showWorkerPageCB (page,params,getParams,CB)
5327{
5328 var url = '/workers/'+page+'.php';
5329 if (getParams) url += '?'+getParams;
5330 //$(this).hide();
5331 //showPleaseWait();
5332 ajax(url, params, CB);
5333 return false;
5334}
5335
5336function showWorkerPage (page,params,getParams)
5337{
5338 var url = '/workers/'+page+'.php';
5339 if (getParams) url += '?'+getParams;
5340 showPleaseWait();
5341 ajax(url, params, clstCallback);
5342 return false;
5343}
5344function showWorkerPageOffline (page,getParams)
5345{
5346 $('.qc-cmp-persistent-link').remove();
5347 
5348 var url = '/workers/'+page+'.php';
5349 if (getParams) url += '?'+getParams;
5350 
5351 $.ajax({
5352 url: url,
5353 type:'GET',
5354 success: function (t) {
5355 clstCallback(t);
5356 }
5357 }); 
5358 return false;
5359}
5360
5361function showWorkerPageBg (page,params,getParams)
5362{
5363 if (page==='partie' && window.partieRecapOuvrirPage) return window.partieRecapOuvrirPage(params,getParams,clstCallbackNoScroll);
5364 var url = '/workers/'+page+'.php';
5365 if (getParams) url += '?'+getParams;
5366 //showPleaseWait();
5367 ajax(url, params, clstCallbackNoScroll);
5368 return false;
5369}
5370
5371function showClstPage (mode,pageNum,params)
5372{
5373 showPleaseWait();
5374 var postVars = 'pageNum='+pageNum+'&modeClassement='+mode;
5375 if (params)
5376 postVars += '&'+params;
5377 // The server renders this control only for admins; authorization stays server-side.
5378 var sourceClassementAdmin = document.getElementById('classementSourceAdminChoix');
5379 if (sourceClassementAdmin && postVars.indexOf('&classementV3=')===-1) {
5380 postVars += '&classementV3='+(sourceClassementAdmin.value==='1'?'1':'0');
5381 }
5382 var dateClassementDefi = document.getElementById('dateClassementDefiDuJour');
5383 if ((mode=='DefiDuJour' || mode=='DefiSoutienDuJour') &&
5384 postVars.indexOf('&dateClassement=')===-1 && dateClassementDefi && dateClassementDefi.value) {
5385 postVars += '&dateClassement='+encodeURIComponent(dateClassementDefi.value);
5386 }
5387 ajax('/workers/classement.php', postVars , clstCallback);
5388}
5389/*
5390function showGame(id)
5391{
5392 $$('detailPartei').innerHTML = '';
5393 $$('divJoueurs').innerHTML = '';
5394 showWorkerPage ('partie','part=3&idPartie='+id);
5395}*/
5396/*********** fin fonctions site ******/
5397        
5398 
5399
5400function $$ (id)
5401{
5402 return document.getElementById(id);
5403} 
5404
5405var Utf8 = {
5406 
5407 // public method for url encoding
5408 encode : function (string) {
5409 string = string.replace(/\r\n/g,"\n");
5410 var utftext = "";
5411 
5412 for (var n = 0; n < string.length; n++) {
5413 
5414  var c = string.charCodeAt(n);
5415 
5416  if (c < 128) {
5417  utftext += String.fromCharCode(c);
5418  }
5419  else if((c > 127) && (c < 2048)) {
5420  utftext += String.fromCharCode((c >> 6) | 192);
5421  utftext += String.fromCharCode((c & 63) | 128);
5422  }
5423  else {
5424  utftext += String.fromCharCode((c >> 12) | 224);
5425  utftext += String.fromCharCode(((c >> 6) & 63) | 128);
5426  utftext += String.fromCharCode((c & 63) | 128);
5427  }
5428 
5429 }
5430 
5431 return utftext;
5432 },
5433 
5434 // public method for url decoding
5435 decode : function (utftext) {
5436 var string = "";
5437 var i = 0;
5438 var c = c1 = c2 = 0;
5439 
5440 while ( i < utftext.length ) {
5441 
5442  c = utftext.charCodeAt(i);
5443 
5444  if (c < 128) {
5445  string += String.fromCharCode(c);
5446  i++;
5447  }
5448  else if((c > 191) && (c < 224)) {
5449  c2 = utftext.charCodeAt(i+1);
5450  string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
5451  i += 2;
5452  }
5453  else {
5454  c2 = utftext.charCodeAt(i+1);
5455  c3 = utftext.charCodeAt(i+2);
5456  string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
5457  i += 3;
5458  }
5459 
5460 }
5461 
5462 return string;
5463 }
5464 
5465}
5466
5467
5468 
5469function getFormString( formRef, oAndPass, oTypes, oNames ) {
5470 //alert('ppp');
5471 if( oNames ) {
5472 oNames = new RegExp((( oTypes > 3 )?'\\b(':'^(')+oNames.replace(/([\\\/\[\]\(\)\.\+\*\{\}\?\^\$\|])/g,'\\$1').replace(/,/g,'|')+(( oTypes > 3 )?')\\b':')$'),'');
5473 var oExclude = oTypes % 2;
5474 }
5475 //alert(formRef.elements);
5476 for( var x = 0, oStr = '', y = false; formRef.elements[x]; x++ ) {
5477 //alert(formRef.elements[x].type);
5478 if( formRef.elements[x].type ) {
5479  if( oNames ) {
5480  var theAttr = ( oTypes > 3 ) ? formRef.elements[x].className : ( ( oTypes > 1 ) ? formRef.elements[x].id : formRef.elements[x].name );
5481  if( ( oExclude && theAttr && theAttr.match(oNames) ) || ( !oExclude && !( theAttr && theAttr.match(oNames) ) ) ) { continue; }
5482  }
5483  var oE = formRef.elements[x]; var oT = oE.type.toLowerCase();
5484  if ( oE.name)
5485  {    
5486  if( oT == 'hidden' || oT == 'text' || oT == 'textarea' || ( oT == 'password' && oAndPass ) || oT == 'datetime' || oT == 'datetime-local' || oT == 'date' || oT == 'month' || oT == 'week' || oT == 'time' || oT == 'number' || oT == 'range' || oT == 'email' || oT == 'url' ) {
5487   oStr += ( y ? '&' : '' ) + oE.name+ '=' + escape(oE.value).split('+').join('&#43;');//.replace(/,/g,'%c')
5488   y = true;
5489  //alert(oT+oE.value+oE.name);
5490  } else if( oT == 'radio' ) {
5491  //alert(oE.name+"-"+oE.checked+"-"+oE.value+"-"+oE.selected);
5492  if (oE.checked)
5493   oStr += ( y ? '&' : '' ) + oE.name+ '=' + ( oE.checked ? oE.value : '' );
5494   y = true;
5495  } else if( oT == 'checkbox' ) {
5496  // alert(oE.name+"-"+oE.checked+"-"+oE.value+"-"+oE.selected);
5497   oStr += ( y ? '&' : '' ) + oE.name+ '=' + ( oE.checked ? oE.value : '' );
5498   y = true;
5499  } else if( oT == 'select-one' ) {
5500   oStr += ( y ? '&' : '' ) + oE.name+ '=' + escape(oE.value);
5501   y = true;
5502  } else if( oT == 'select-multiple' ) {
5503   for( var oO = oE.options, i = 0; oO[i]; i++ ) {
5504   oStr += ( y ? '&' : '' ) + oE.name+ '=' + ( oO[i].selected ? '1' : '' );
5505   y = true;
5506   }
5507  }
5508  }
5509 }
5510 }
5511 return oStr;
5512} 
5513
5514function echeck(str) {
5515 var at="@"
5516 var dot="."
5517 var lat=str.indexOf(at)
5518 var lstr=str.length
5519 var ldot=str.indexOf(dot)
5520 if (str.indexOf(at)==-1)
5521 return false;
5522 if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr)
5523 return false;
5524 if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr)
5525 return false;
5526 if (str.indexOf(at,(lat+1))!=-1)
5527 return false;
5528 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot)
5529 return false;
5530 if (str.indexOf(dot,(lat+2))==-1)
5531 return false; 
5532 if (str.indexOf(" ")!=-1)
5533 return false;
5534 if (str.indexOf("yopmail")!=-1)
5535 return false;
5536 if (str.indexOf("gmx.fr")!=-1)
5537 return false;
5538 return true   
5539} 
5540 
5541function trim(s)
5542{
5543 var l=0; var r=s.length -1;
5544 while(l < s.length && s[l] == ' ')
5545 { l++; }
5546 while(r > l && s[r] == ' ')
5547 { r-=1; }
5548 return s.substring(l, r+1);
5549} 
5550
5551
5552
5553/* ********************************************** LOGS **********************************************/ 
5554 function log (str)
5555 {       
5556 try {if (console) console.log(str);} catch (err) {};
5557 try {if ($.log) $.log(str);} catch (err) {};
5558 
5559 }
5560 
5561
5562
5563function showPartie (id )
5564{
5565 document.location = '/?idPartie='+id;
5566} 
5567function showDonneFixe(idDonneFixe) {
5568 showWorkerPage ('donneFixe','part=3&idDonneFixe='+idDonneFixe);
5569}
5570
5571function imthere()
5572{
5573 notifyUserActivity();
5574 clearTimeout(confirmerPresenceTON);
5575}
5576
5577var confirmerPresenceTON;
5578var confirmerPresenceDate;
5579var delayConfirmPresence = 15000;
5580
5581function confirmerPresenceTO()
5582{
5583 var d = (new Date()).getTime();
5584 var perc = (delayConfirmPresence-(d-confirmerPresenceDate))/delayConfirmPresence*100;
5585 if (perc<0) {
5586 perc=0;
5587 rpcNoQueue('etape=end&quitRequest=1');
5588 $('#imtherebtn').remove();
5589 } else {
5590
5591 progress(perc, $('#tempsRestantPres'));
5592 confirmerPresenceTON = setTimeout(confirmerPresenceTO,100);
5593 }
5594}
5595
5596var nbDelayedAnswers = 0;
5597function delayedAnswer () {
5598 nbDelayedAnswers++;
5599 llog('Timeout joue carte auto');
5600 
5601 if (nbDelayedAnswers>1) {
5602 //alerte('<b>Inactivité prolongée</b><br>Vous allez être déconnecté du jeu pour inactivité prolongée...');
5603 confirmerPresenceNoPlay()
5604 }
5605 //confirmerPresenceTO();
5606}
5607
5608function confirmerPresenceNoPlay()
5609{
5610 delayConfirmPresence = 4000;
5611 confirmerPresenceDate = (new Date()).getTime();
5612 // if (id!=)
5613 //sendJoueurMessage (txt,idUtil)
5614 var resHTML = '<form onsubmit="return false;">';
5615 resHTML +='Vous allez être déconnecté du jeu pour inactivité prolongé...<br />';
5616 //<button class="btn btn-lg btn-default pbtn" type="submit">Enregistrer</button>
5617 resHTML +='<div id="tempsRestantPres" class="progressBar"><div>&nbsp;</div></div>';
5618 resHTML +='<div class="clear" style="margin-top:10px;"></div>';
5619 resHTML +='<input class="btn ptobt btn-success pbtn" id="imtherebtn" type="button" value="Je suis là !" onclick="imthere();parentHide($(this));" />';
5620 resHTML +='</form>';
5621 showDialog('Inactivité prolongée',resHTML);
5622 confirmerPresenceTO();
5623}
5624
5625function confirmerPresence()
5626{
5627 delayConfirmPresence = 15000;
5628 confirmerPresenceDate = (new Date()).getTime();
5629 // if (id!=)
5630 //sendJoueurMessage (txt,idUtil)
5631 var resHTML = '<form onsubmit="return false;">';
5632 resHTML +='Etes-vous toujours là ?<br />';
5633 //<button class="btn btn-lg btn-default pbtn" type="submit">Enregistrer</button>
5634 resHTML +='<div id="tempsRestantPres" class="progressBar"><div>&nbsp;</div></div>';
5635 resHTML +='<div class="clear" style="margin-top:10px;"></div>';
5636 resHTML +='<input class="btn ptobt btn-success pbtn" id="imtherebtn" type="button" value="Je suis là !" onclick="imthere();parentHide($(this));" />';
5637 resHTML +='</form>';
5638 showDialog('Inactivité prolongée',resHTML);
5639 confirmerPresenceTO();
5640}
5641
5642function delSuspenAdm (id) {
5643
5644 ajax('/workers/moderation/deleteSuspension.php', 'id='+id, alertRes);
5645}
5646
5647var decoAuto = 0;
5648var phaserLoadStarted = false;
5649var phaserLoadComplete = false;
5650
5651function decoAutoFn ()
5652{  
5653 if ( ($$('Jeu')!=null || phaserLoadComplete) && $$('modeJeuSalon')!=null && $$('modeJeuSalon').value!='CPU' && $$('modeJeuSalon').value!='Formation'
5654 && $$('modeJeuSalon').value!='CPU5' && $$('modeJeuSalon').value!='CPU3' && $$('modeJeuSalon').value!='CPU6' && $$('modeJeuSalon').value!='Entrainement3' && $$('modeJeuSalon').value!='Entrainement' && $$('modeJeuSalon').value!='Entrainement5' && $$('modeJeuSalon').value!='Entrainement6' 
5655 && $$('modeJeuSalon').value!='DefiChoisi' && $$('staticMJ')==null )
5656 {
5657 if (siQuitAbandon==1 && gameHasStarted) {
5658 playSound ('Button.mp3?v=2');
5659 confirmerPresence();
5660 return;
5661 } else {
5662 notifyUserActivity();
5663 }
5664 } 
5665 return;
5666}
5667function notifyUserActivity()
5668{
5669 clearTimeout(decoAuto); //btnQuitAction();
5670 decoAuto = setTimeout(decoAutoFn ,160000);
5671}
5672 
5673function doMouseCall() 
5674{
5675 //log("move"); 
5676 notifyUserActivity(); 
5677}
5678if (document.addEventListener){
5679 document.addEventListener('click', doMouseCall, false); 
5680} else if (document.attachEvent){
5681 document.attachEvent('onclick', doMouseCall);
5682}
5683
5684var gameSoundsEnabled = true;
5685function toggleSound() {
5686 if (gameSoundsEnabled) {
5687 $('#muteBtn').css('background-image','url(\'/Jeu-Tarot-en-ligne/Jeu/unmute.png\')');
5688 gameSoundsEnabled = false;
5689 if (typeof arreterCarillonDepart === 'function') arreterCarillonDepart();
5690 scookie('muteMusic',1);
5691 if (typeof bgAudio=='undefined') return;
5692 if (typeof bgAudio.volume=='undefined') return;
5693 bgAudio.volume = 0;
5694 } else {
5695 $('#muteBtn').css('background-image','url(\'/Jeu-Tarot-en-ligne/Jeu/mute.png\')');
5696 gameSoundsEnabled = true;
5697 scookie('muteMusic',0);
5698 if (typeof bgAudio=='undefined') return;
5699 if (typeof bgAudio.volume=='undefined') return;
5700 tweenBgAudioVolume();
5701 }
5702}
5703function shareForumGame (idpartie) {
5704 var resHTML = '<form onsubmit="return false;">';
5705 resHTML +='Veuillez choissir un titre pour la publication :<br />';
5706 //<button class="btn btn-lg btn-default pbtn" type="submit">Enregistrer</button>
5707 //resHTML +='<div id="tempsRestantPres" class="progressBar"><div>&nbsp;</div></div>';
5708 resHTML +='<div class="clear" style="margin-top:10px;"></div>Titre du sujet de conversation : <br>';
5709 resHTML +='<input class="form-control shorty" type="text" value="Analyse partie" id="titrePublicationPartie" />';
5710 resHTML +='<div class="clear" style="margin-top:10px;"></div>Texte du sujet de conversation : <br>';
5711 resHTML +='<textarea class="form-control shorty" id="descPublicationPartie"></textarea>';
5712 resHTML +='<div class="clear" style="margin-top:10px;"></div>';
5713 resHTML +='<input class="btn ptobt btn-success pbtn" type="button" value="Publier !" onclick="shareForumGameInt ('+idpartie+')" />';
5714 resHTML +='</form>';
5715 showDialog('Publication partie',resHTML);
5716
5717}
5718function shareForumGameInt (idpartie) {
5719 var titre = encodeURI($('#titrePublicationPartie').val());
5720 var desc = encodeURI($('#descPublicationPartie').val());
5721 if (titre=='Analyse partie') {
5722 alerte('Veuillez personnaliser le titre du sujet de conversation.');
5723 return;
5724 }
5725 if (desc=='') {
5726 alerte('Veuillez personnaliser le texte du sujet de conversation.');
5727 return;
5728 }
5729 forumAvecAcceptationReglement(function () {
5730 confirme('Etes-vous s\u00fbr de vouloir publier le d\u00e9roulement de cette partie sur le forum ? Les pseudos des joueurs et avatars seront anonymis\u00e9s.',function () {
5731 ajax('/workers/shareGameForum.php', 'idPartie='+idpartie+'&titre='+titre+'&desc='+desc, function (res) {eval(res);});
5732 });
5733 });
5734}
5735function getDocWidth() {
5736 var D = document;
5737 return Math.max(
5738 Math.max(D.body.scrollWidth, D.documentElement.scrollWidth),
5739 Math.max(D.body.offsetWidth, D.documentElement.offsetWidth),
5740 Math.max(D.body.clientWidth, D.documentElement.clientWidth)
5741 );
5742}
5743
5744function getDocHeight() {
5745 var D = document;
5746 return Math.max(
5747 Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
5748 Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
5749 Math.max(D.body.clientHeight, D.documentElement.clientHeight)
5750 );
5751}
5752function getWinHeight () {
5753
5754 var myWidth = 0, myHeight = 0;
5755 if( typeof( window.innerWidth ) == 'number' ) {
5756 //Non-IE
5757 myWidth = window.innerWidth;
5758 myHeight = window.innerHeight;
5759 } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
5760 //IE 6+ in 'standards compliant mode'
5761 myWidth = document.documentElement.clientWidth;
5762 myHeight = document.documentElement.clientHeight;
5763 } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
5764 //IE 4 compatible
5765 myWidth = document.body.clientWidth;
5766 myHeight = document.body.clientHeight;
5767 }
5768 return myHeight;
5769}
5770function getWinWidth() {
5771
5772 var myWidth = 0, myHeight = 0;
5773 if( typeof( window.innerWidth ) == 'number' ) {
5774 //Non-IE
5775 myWidth = window.innerWidth;
5776 myHeight = window.innerHeight;
5777 } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
5778 //IE 6+ in 'standards compliant mode'
5779 myWidth = document.documentElement.clientWidth;
5780 myHeight = document.documentElement.clientHeight;
5781 } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
5782 //IE 4 compatible
5783 myWidth = document.body.clientWidth;
5784 myHeight = document.body.clientHeight;
5785 }
5786 return myWidth;
5787}
5788
5789var minW = 1020;
5790var CheckSizeZoomProcessTO = 0;
5791var blockedA = [
5792  {img:'Concours-Tarot.jpg',url:'http://www.concours-tarot.com',title:'Agenda des concours de tarot'},
5793  //{img:'LesPetitesCharo.gif',url:'https://les-petites-charo.blogspot.com',title:'Meubles artisanaux en carton'},
5794  //{img:'KirelDigital.png',url:'https://www.kirel-digital.com',title:'Agence webmarketing à tours'},
5795  //{img:'Aloe-Vera',url:'www.facebook.com/Aloe-pour-tous-1007849235978094'},
5796  {img:'Diplome.jpg',url:'http://www.mon-diplome.fr',title:'Diplomes humoristiques en ligne'},
5797  {img:'Caisse.jpg',url:'https://kash.click',title:'Logiciel de caisse enregistreuse'},
5798  //{img:'Virtual-Pet-1.jpg',url:'https://www.virtual-pet-game.com',title:'Jeu de chat et chien'},
5799  //{img:'MonPermis.jpg',url:'http://www.permis-gratuit.fr',title:'Permis humoristiques'},
5800  {img:'Belote.jpg',url:'https://www.jeu-belote.fr',title:'Jeu de belote gratuit'},
5801  {img:'Ducale - Jeu de tarot.jpg',url:'https://amzn.to/2L1hYjF',title:'Un jeu de Tarot avec 78 cartes à jouer aux figures et scènes traditionnelles',nofollow:1},
5802  {img:'Grimaud Expert - Jeu de 78 Cartes.jpg',url:'https://amzn.to/2W3WmJA',title:'Coffret de jeu façon Cuir Noir',nofollow:1},
5803  {img:'Le jeu de tarot - De l initiation a la competition.jpg',url:'https://amzn.to/2L7b789',title:'Le jeu de tarot de l initiation a la competition',nofollow:1},
5804  {img:'Le jeu de Tarot Apprendre, progresser, gagner.jpg',url:'https://amzn.to/2zT6Jay',title:'Un livre de Maurice Doury',nofollow:1},
5805  {img:'Les 100 plus belles donnes de tarot.jpg',url:'https://amzn.to/2W2W9q4',title:'Les 100 plus belles donnes de tarot',nofollow:1},
5806  {img:'Jeu de tarot Asterix.jpg',url:'https://amzn.to/2L5QVne',title:'Jeu de tarot Astérix',nofollow:1},
5807  {img:'JeuOptic.jpg',url:'https://amzn.to/3dlYToo',title:'Jeu de tarot Optic',nofollow:1}
5808  ];
5809var blockedANum = 0;
5810
5811function getPubHTML (cpB) {
5812 var html = '<a target="_blank" ';
5813 if (cpB.nofollow) {
5814 html += ' rel="noopener nofollow"';
5815 } else {
5816 html += ' rel="noopener"';
5817 }
5818 html += ' href="'+cpB.url+'" title="'+cpB.title+'"><img alt="'+cpB.title+'" src="/Pubs/'+cpB.img+'" class="blockeurP"/></a>'
5819}
5820
5821function CheckSizeZoom() {
5822 if (!hasAGameStarted) {
5823
5824 /*if ( ($('.adsbygoogle:visible').length==0 ) && $('.adsbygoogle').length>0 ) {
5825 llog( 'Un bloqueur de publicité est présent, ceci peut causer des dysfonctionnements dans le jeu. Si vous souhaitez supprimer les pubs, vous devez disposer de crédits premium et desactiver les publicités dans votre page compte, sinon, désactivez votre bloqueur de publicités en cliquant sur son icone, puis sur le bouton Désactiver.');
5826 $('.adsbygoogle').each(function (elt) {
5827 blockedANum = Math.floor(Math.random()*100);
5828 $(this).removeClass('adsbygoogle');
5829 var cpB = blockedA[blockedANum%blockedA.length];
5830 
5831 $(this).html('<a target="_blank" rel="noopener" href="'+cpB.url+'" title="'+cpB.title+'"><img alt="'+cpB.title+'" src="/Pubs/'+cpB.img+'" 
5831class="blockeurP"/></a>');
5832 $(this).show();
5833 });
5834 }*/
5835 $('.myownads').each(function (elt) {
5836 blockedANum = Math.floor(Math.random()*100);
5837 $(this).removeClass('adsbygoogle');
5838 var cpB = blockedA[blockedANum%blockedA.length];
5839 $(this).html('<a target="_blank" rel="noopener" href="'+cpB.url+'" title="'+cpB.title+'"><img alt="'+cpB.title+'" src="/Pubs/'+cpB.img+'" class="blockeurP"/></a>');
5840 $(this).show();
5841 });
5842 if (window.__tcfapi != undefined) {
5843 window.__tcfapi("getTCData", 2, function (tcData, success) {
5844 if (success) {
5845  //console.log(tcData);
5846  if (tcData.gdprApplies) {
5847  var alltrue = true;
5848  for (var k in tcData.purpose.consents) {
5849  if (!tcData.purpose.consents[k]) alltrue = false;
5850  }
5851  var allfalse = true;
5852  for (var k in tcData.vendor.consents) {
5853  if (tcData.vendor.consents[k]) allfalse = false;
5854  }
5855  if (allfalse || !alltrue) {
5856  llog( 'Publicités de remplacement.');
5857  
5858  $('.ylad').each(function (elt) {
5859  blockedANum = Math.floor(Math.random()*100);
5860  $(this).removeClass('adsbygoogle');
5861  var cpB = blockedA[blockedANum%blockedA.length];
5862  
5863  $(this).html('<a target="_blank" rel="noopener" href="'+cpB.url+'" title="'+cpB.title+'"><img alt="'+cpB.title+'" src="/Pubs/'+cpB.img+'" class="blockeurP"/></a>');
5864  $(this).show();
5865  });
5866  }
5867  }
5868 }
5869 });
5870 }
5871 } else {
5872
5873 resizeChat();
5874 clearTimeout(CheckSizeZoomProcessTO);
5875 CheckSizeZoomProcessTO = setTimeout(onResizeGame,600);
5876 }
5877}
5878function onResizeGame() {
5879
5880 if ($$('monJeu')!=null && etapeCourante !="Terminee")
5881 {  
5882 reorganiseCartes (true);
5883 }
5884 return;
5885}
5886
5887//document.addEventListener ("mousemove", doMouseCall, false);
5888
5889setTimeout(doMouseCall,1000);
5890
5891function showObjShop(cat,id) {
5892 $('.objshop').hide();
5893 ajax('/includes/credits.php', 'part='+cat+'&idItemShop='+id, function (res) {
5894 $('#objShopDetails').html(res);
5895 });
5896}
5897function scookie(name,value)
5898{
5899 var expire=new Date();
5900 expire.setTime(expire.getTime()+60*60*24*30*12*3*1000);
5901 document.cookie=name+'='+escape(value)+';expires='+expire.toGMTString()+"; path=/";
5902 return true;
5903}
5904function gcookie(name)
5905{
5906 if(document.cookie.length>0)
5907 {
5908  start=document.cookie.indexOf(name+"=");
5909  pos = start+name.length+1;
5910  if(start!=0)
5911  {
5912   start=document.cookie.indexOf("; "+name+"=");
5913   pos = start+name.length+3;
5914  }
5915  if(start!=-1)
5916  {
5917   start=pos;
5918   end=document.cookie.indexOf(";",start);
5919   if(end==-1)
5920   {
5921    end=document.cookie.length;
5922   }
5923   return unescape(document.cookie.substring(start,end));
5924  }
5925 }
5926 return '';
5927}
5928var isCardMasqueActivated = true;
5929function disableMask(status) {
5930 if (status)
5931 isCardMasqueActivated = false;
5932}
5933function isMasqueActivated() {
5934 if ( gcookie("noMasque")== 1) return false;
5935 return isCardMasqueActivated;
5936}
5937function clearMaskCookie() {
5938 scookie("noMasque", null);
5939}
5940function toggleMasque2() {
5941 if (!$('#toggleMasque').is(':checked'))
5942 scookie("noMasque", 1);
5943 else
5944 scookie("noMasque", null);
5945 //$.cookie()
5946}
5947function signalementFin(txt) {
5948 var succes = txt.indexOf('OK|')===0;
5949 if (succes) {
5950 txt = txt.substring(3);
5951 if ($$('chat')!=null) rpc('reloadChat=1');
5952 if ($('.blocagesPage').length>0)
5953 ajax('/workers/joueur.php', 'part=blacklist', clstCallback);
5954 }
5955 alerte(txt);
5956 return false;
5957}
5958var listeNoireChatJeu = {};
5959function listeNoireMasquerChatJeu(idUtil) {
5960 idUtil = parseInt(idUtil,10);
5961 if (idUtil>0)
5962 listeNoireChatJeu[idUtil] = true;
5963}
5964function listeNoireDefinirChatJeu(idsUtil) {
5965 listeNoireChatJeu = {};
5966 if (!idsUtil)
5967 return;
5968 for (var i=0;i<idsUtil.length;i++)
5969 listeNoireMasquerChatJeu(idsUtil[i]);
5970}
5971function listeNoireChatJeuMasque(str) {
5972 if (!str)
5973 return false;
5974 var ligne = String(str).split('#');
5975 var idUtil = ligne.length>3?parseInt(ligne[3],10):0;
5976 return idUtil>0 && listeNoireChatJeu[idUtil]===true;
5977}
5978function listeNoireMasquerProfilJeu(idUtil) {
5979 if (typeof selMoteur!='undefined' && selMoteur && typeof selMoteur.masquerProfilUtilisateur=='function')
5980 selMoteur.masquerProfilUtilisateur(parseInt(idUtil,10));
5981}
5982function lnUser (idUtil,motif,blocageChat,explication,origine)
5983{
5984 $('.signalement').hide();
5985 $('.mates'+idUtil+'').hide();
5986 var params = 'idUtil='+parseInt(idUtil,10);
5987 params += '&motif='+encodeURIComponent(motif);
5988 params += '&blocageChat='+(blocageChat?1:0);
5989 params += '&explication='+encodeURIComponent(explication || '');
5990 if (origine)
5991 params += '&origine='+encodeURIComponent(origine);
5992 ajax('/workers/signalerJoueur.php', params, function(txt) {
5993 if (txt.indexOf('OK|')===0) {
5994 if (blocageChat)
5995 listeNoireMasquerChatJeu(idUtil);
5996 var configurationMotif = listeNoireMotifsCache && listeNoireMotifsCache[motif];
5997 if (configurationMotif && configurationMotif.masquageProfil)
5998 listeNoireMasquerProfilJeu(idUtil);
5999 }
6000 signalementFin(txt);
6001 });
6002}
6003function goSignalForum (idUtil,idSujet, idReponse, idComment, txt)
6004{
6005 ajax('/Contact-organisation-jeu-de-tarot.php', 'ajaxRes=1&contact[dest]='+idUtil+'&contact[message]='+escape(txt).split('+').join('%2B')+'&contact[sujet]='+escape('Un joueur s\'est mal comporté sur le forum')+'&contact[idSujet]='+idSujet+'&contact[idReponse]='+idReponse+'&contact[idCommentaire]='+idComment, function (res) {
6006 alerte(res.split('<spanResult/>')[1].split('<p>').join('').split('</p>').join(''),function () {
6007 confirme('Voulez-vous également ajouter ce joueur à vos blocages du forum ?<br>Ce joueur ne pourra plus lire vos publications sur le forum, et vous ne verrez plus les siennes non plus.',function () {
6008 ajax('/workers/signalerJoueurForum.php', 'idUtil='+idUtil+'&raison=Autre', function (res) {
6009 alerte(res,function () {
6010 document.location.reload();
6011 });
6012 });
6013 })
6014 });
6015 });
6016}
6017function blackListForum(idUtil) {
6018 confirme('Voulez-vous ajouter ce joueur à vos blocages du forum ?<br>Un blocage du forum est sans incidence pour le jeu mais vous permet de ne plus voir les messages de ce joueur sur le forum, le joueur bloqué ne pourra plus voir vos publications.',function () {
6019 ajax('/workers/signalerJoueurForum.php', 'idUtil='+idUtil+'&raison=Autre', function (res) {
6020 alerte(res,function () {
6021 document.location.reload();
6022 });
6023 });
6024 })
6025}
6026function signalerMsgForum (idUtil,idSujet, idReponse, idComment, pseudo,msg)
6027{
6028 window.scroll(0,0);
6029 //if (!successFn) successFn = 'alertRes';
6030 var resHTML = '<form class="disableKeyEvents" onsubmit="return false;">';
6031 resHTML +='<b>Signaler le joueur "'+pseudo+'" pour sa participation :</b><br>';//.
6032
6033 if (msg) resHTML +='<pre>'+msg+'</pre><br>';//.
6034 //resHTML +='Veuillez saisir la raison de votre décision de modération, en citant des extraits de conversation du joueur :<br>';
6035 resHTML +='<textarea class="form-control" style="height:150px;" id="raisonSS'+idUtil+'">';
6036 resHTML +='</textarea>';
6037 
6038 resHTML +='<input class="btn ptobt btn-warning pbtn" type="button" value="Annuler" onclick="parentHide($(this));" />';
6039 resHTML +='<input class="btn ptobt btn-danger pbtn" type="button" value="Envoyer le signalement" onclick="goSignalForum('+idUtil+','+idSujet+','+idReponse+','+idComment+',$$(\'raisonSS'+idUtil+'\').value );parentHide($(this));" />';
6040 resHTML +='</form>';
6041 showBigDialog('Signaler une participation illégale de "'+pseudo+'"',resHTML);
6042
6043 
6044} 
6045var listeNoireMotifsCache = null;
6046
6047function listeNoireEchapperHTML(txt) {
6048 return String(txt || '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
6049}
6050function chargerListeNoireMotifs(callback) {
6051 if (listeNoireMotifsCache!==null)
6052 return callback(listeNoireMotifsCache);
6053 ajax('/workers/listeNoireMotifs.php','',function(res) {
6054 try {
6055 listeNoireMotifsCache = (typeof res=='string')?JSON.parse(res):res;
6056 if (!listeNoireMotifsCache || typeof listeNoireMotifsCache!='object')
6057 throw new Error('Reponse motifs invalide');
6058 callback(listeNoireMotifsCache);
6059 } catch (e) {
6060 alerte('La liste des motifs ne peut pas etre chargee.');
6061 }
6062 });
6063}
6064function actualiserMotifListeNoire(suffixe) {
6065 var select = $$('motifListeNoire'+suffixe);
6066 if (!select || !listeNoireMotifsCache)
6067 return;
6068 var motif = listeNoireMotifsCache[select.value];
6069 if (!motif)
6070 return;
6071 var resumeActifs = ['<span>'+motif.dureeLibelle+'</span>'];
6072 if (motif.blocageJeu)
6073 resumeActifs.push('<span>Parties s&eacute;par&eacute;es</span>');
6074 if (motif.blocageChatObligatoire)
6075 resumeActifs.push('<span>Messages masqu&eacute;s</span>');
6076 if (motif.masquageProfil)
6077 resumeActifs.push('<span>Profil masqu&eacute;</span>');
6078 if (motif.signalement)
6079 resumeActifs.push('<span>'+(motif.signalementAutorise?'Signalement transmis':'Signalement indisponible')+'</span>');
6080 if (motif.explicationObligatoire)
6081 resumeActifs.push('<span>Explication requise</span>');
6082
6083 var effets = '';
6084 if (motif.signalement && motif.signalementAutorise) {
6085 effets += '<div class="blocagePopup__avertissement" role="alert">';
6086 effets += '<strong>Attention : ce blocage engendre un signalement.</strong>';
6087 effets += '<span>Les joueurs qui effectuent des signalements sans fondement pourront &eacute;galement &ecirc;tre sanctionn&eacute;s et priv&eacute;s de toute fonctionnalit&eacute; de blocage.</span>';
6088 effets += '</div>';
6089 } else if (motif.signalement) {
6090 effets += '<div class="blocagePopup__avertissement" role="status">';
6091 effets += '<strong>Seul le blocage sera appliqu&eacute;.</strong>';
6092 effets += '<span>'+listeNoireEchapperHTML(motif.signalementIndisponibleRaison || 'Votre droit de signalement est actuellement suspendu.')+'</span>';
6093 effets += '</div>';
6094 }
6095 effets += '<details class="blocagePopup__resume blocagePopup__details">';
6096 effets += '<summary class="blocagePopup__synthese" title="Afficher ou masquer le d&eacute;tail des effets">';
6097 effets += '<span class="blocagePopup__syntheseListe">'+resumeActifs.join('')+'</span>';
6098 effets += '</summary>';
6099 effets += '<p class="blocagePopup__description">'+motif.description+'</p>';
6100 effets += '<div class="blocagePopup__effets" aria-label="D&eacute;tail des effets du blocage">';
6101 effets += '<div class="blocagePopup__effet"><span>Dur&eacute;e</span><strong>'+motif.dureeLibelle+'</strong></div>';
6102 effets += '<div class="blocagePopup__effet"><span>Nombre maximal</span><strong>'+motif.limiteLibelle+'</strong></div>';
6103 effets += '<div class="blocagePopup__effet"><span>Jeu</span><strong>'+(motif.blocageJeu?'Vous ne pourrez plus &ecirc;tre plac&eacute;s ensemble':'Vous pourrez encore &ecirc;tre plac&eacute;s ensemble')+'</strong></div>';
6104 effets += '<div class="blocagePopup__effet"><span>Messages</span><strong>'+(motif.blocageChatObligatoire?'Masqu&eacute;s automatiquement':(motif.blocageChatFacultatif?'Masquage facultatif':'Non masqu&eacute;s'))+'</strong></div>';
6105 effets += '<div class="blocagePopup__effet"><span>Profil</span><strong>'+(motif.masquageProfil?'Avatar et biographie masqu&eacute;s':'Avatar et biographie visibles')+'</strong></div>';
6106 effets += '<div class="blocagePopup__effet '+(motif.signalement?'blocagePopup__effet--alerte':'')+'"><span>Signalement</span><strong>'+(motif.signalement?(motif.signalementAutorise?'Oui':'Non - suspension active'):'Non')+'</strong></div>';
6107 effets += '<div class="blocagePopup__effet"><span>Explication obligatoire</span><strong>'+(motif.explicationObligatoire?'Oui':'Non')+'</strong></div>';
6108 effets += '</div>';
6109 effets += '</details>';
6110 $$('descriptionListeNoire'+suffixe).innerHTML = effets;
6111 if (motif.blocageChatFacultatif)
6112 $('#optionChatListeNoire'+suffixe).show();
6113 else
6114 $('#optionChatListeNoire'+suffixe).hide();
6115 if (motif.explicationObligatoire)
6116 $('#explicationListeNoireBloc'+suffixe).show();
6117 else
6118 $('#explicationListeNoireBloc'+suffixe).hide();
6119}
6120function validerMotifListeNoire(idUtil,suffixe,bouton) {
6121 var select = $$('motifListeNoire'+suffixe);
6122 var motif = listeNoireMotifsCache[select.value];
6123 var explication = $$('explicationListeNoire'+suffixe).value || '';
6124 if (motif.explicationObligatoire && explication.replace(/^\s+|\s+$/g,'')=='') {
6125 alerte('Veuillez saisir une explication.');
6126 return false;
6127 }
6128 var blocageChat = motif.blocageChatObligatoire ||
6129 (motif.blocageChatFacultatif && $$('chatListeNoire'+suffixe).checked);
6130 lnUser(idUtil,select.value,blocageChat,explication);
6131 parentHide($(bouton));
6132 return false;
6133}
6134function signalerJoueur (idUtil,pseudo,motifActuel,chatActuel)
6135{
6136 window.scroll(0,0);
6137 chargerListeNoireMotifs(function(motifs) {
6138 var suffixe = cptBobYY++;
6139 var resHTML = '<form class="disableKeyEvents blocagePopup" onsubmit="return false;">';
6140 resHTML += '<p class="blocagePopup__introduction">Choisissez un motif pour bloquer le joueur <strong>&quot;'+listeNoireEchapperHTML(pseudo)+'&quot;</strong>.</p>';
6141 resHTML += '<div class="blocagePopup__champ">';
6142 resHTML += '<label for="motifListeNoire'+suffixe+'">Motif principal</label>';
6143 resHTML += '<select class="form-control" id="motifListeNoire'+suffixe+'" onchange="actualiserMotifListeNoire('+suffixe+');">';
6144 var groupesMotifs = [
6145 {libelle:'Blocage sans signalement', signalement:false},
6146 {libelle:'Blocage avec signalement', signalement:true}
6147 ];
6148 for (var indexGroupe=0; indexGroupe<groupesMotifs.length; indexGroupe++) {
6149 var groupeMotifs = groupesMotifs[indexGroupe];
6150 resHTML += '<optgroup label="'+groupeMotifs.libelle+'">';
6151 for (var code in motifs) {
6152 if (!motifs.hasOwnProperty(code) || Boolean(motifs[code].signalement)!==groupeMotifs.signalement) continue;
6153 var selected = motifActuel==code?' selected="selected"':'';
6154 var signalementIndisponible = motifs[code].signalement && !motifs[code].signalementAutorise;
6155 resHTML += '<option value="'+code+'"'+selected+'>'+motifs[code].libelle+(signalementIndisponible?' - blocage uniquement':'')+'</option>';
6156 }
6157 resHTML += '</optgroup>';
6158 }
6159 resHTML += '</select>';
6160 resHTML += '</div>';
6161 resHTML += '<div id="descriptionListeNoire'+suffixe+'" aria-live="polite"></div>';
6162 resHTML += '<div class="blocagePopup__option" id="optionChatListeNoire'+suffixe+'">';
6163 resHTML += '<label><input type="checkbox" id="chatListeNoire'+suffixe+'" '+(chatActuel?'checked="checked"':'')+'> <span>Ne plus afficher les messages de ce joueur</span></label>';
6164 resHTML += '</div>';
6165 resHTML += '<div class="blocagePopup__explication" id="explicationListeNoireBloc'+suffixe+'">';
6166 resHTML += '<label for="explicationListeNoire'+suffixe+'">Explication obligatoire</label>';
6167 resHTML += '<textarea class="form-control" rows="5" id="explicationListeNoire'+suffixe+'"></textarea>';
6168 resHTML += '</div>';
6169 resHTML += '<div class="blocagePopup__actions">';
6170 resHTML += '<input class="btn ptobt btn-warning pbtn" type="button" value="Annuler" onclick="parentHide($(this));" />';
6171 resHTML += '<input class="btn ptobt btn-danger pbtn" type="button" value="Valider le blocage" onclick="validerMotifListeNoire('+parseInt(idUtil,10)+','+suffixe+',this);" />';
6172 resHTML += '</div>';
6173 resHTML += '</form>';
6174 showBigDialog('Bloquer '+listeNoireEchapperHTML(pseudo),resHTML);
6175 actualiserMotifListeNoire(suffixe);
6176 });
6177}
6178function effacerMessages (idUtil)
6179{
6180 confirme('Etes-vous sûr de vouloir effacer les messages de ce joueur ?',function () {
6181 ajax('/workers/effacerMessages.php', 'idUtil='+idUtil, alertRes);
6182 $('.correspondance'+idUtil).hide();
6183 });
6184 return false;
6185} 
6186function valideEmail ()
6187{
6188 ajax('/workers/validerEmail.php', '', alertRes);
6189 
6190} 
6191function avertirForum(idtoban,successFn,txt)
6192{
6193 banMode('avertissementForum',1,idtoban,successFn,txt);
6194} 
6195function avertir(idtoban,successFn,txt)
6196{
6197 banMode('avertissement',1,idtoban,successFn,txt);
6198} 
6199function banBio(duree,idtoban,successFn)
6200{
6201 if (duree>0)
6202 banMode('banBioA',duree,idtoban,successFn);
6203 else banMode('banBioA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6204} 
6205
6206function banPlayWithPlayer(idtoban)
6207{
6208 var joueurId = $('#banPlayWithId').val();
6209 var joueurPseudo = $.trim($('#banPlayWith').val());
6210 if (!joueurId && !joueurPseudo) {
6211 alerte('Veuillez selectionner le compte a associer.');
6212 return;
6213 }
6214 if (joueurId && parseInt(joueurId,10)===parseInt(idtoban,10)) {
6215 alerte('Un compte ne peut pas etre associe avec lui-meme.');
6216 return;
6217 }
6218 banMode('banPlayWithA',0,idtoban);
6219} 
6220function banPlayWithA (txt,duree,idtoban)
6221{
6222 //if (!successFn) successFn = alertRes;
6223 ajax('/workers/moderation/banPlayWithA.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+'&withPlayer='+encodeURIComponent($('#banPlayWith').val())+'&withPlayerId='+encodeURIComponent($('#banPlayWithId').val()) , function (txt) {
6224 alerte(txt);
6225 });
6226} 
6227
6228function banContact (duree,idtoban)
6229{
6230 if (duree>0)
6231 banMode('banContactA',duree,idtoban);
6232 else banContactA('',duree,idtoban);
6233}  
6234function banIPchat (duree,idtoban,successFn)
6235{
6236 if (duree>0)
6237 banMode('banIPchatA',duree,idtoban,successFn);
6238 else banMode('banIPchatA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6239}  
6240function banIDchat (duree,idtoban,successFn)
6241{
6242 if (duree>0)
6243 banMode('banIDchatA',duree,idtoban,successFn);
6244 else banMode('banIDchatA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6245}  
6246function banIDforum (duree,idtoban,successFn)
6247{
6248 if (duree>0)
6249 banMode('banIDforumA',duree,idtoban,successFn);
6250 else banIDforumA('',duree,idtoban,successFn);
6251}  
6252function banIDMP (duree,idtoban,successFn)
6253{
6254 if (duree>0)
6255 banMode('banIDMPA',duree,idtoban,successFn);
6256 else banIDMPA('',duree,idtoban,successFn);
6257} 
6258function banIP (duree,idtoban,successFn)
6259{
6260 if (duree>0)
6261 banMode('banIPA',duree,idtoban,successFn);
6262 else banMode('banIPA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6263} 
6264function banID (duree,idtoban,successFn)
6265{
6266 if (duree>0)
6267 banMode('banIDA',duree,idtoban,successFn);
6268 else banMode('banIDA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6269} 
6270function banMultijoueur(duree,idtoban,successFn) {
6271 banMode('banMultijoueurA',duree,idtoban,successFn,null,duree>0?null:'Sanction appliquee par erreur');
6272}
6273var moderationMultijoueurEnCours={};
6274function banMultijoueurA(txt,duree,idtoban,successFn) {
6275 if(moderationMultijoueurEnCours[idtoban])return;
6276 moderationMultijoueurEnCours[idtoban]=true;
6277 var endpoint='/workers/moderation/banMultijoueur.php';
6278 var portee=document.getElementById('moderationMultijoueurPortee');
6279 var contexte=moderationSignalementsParametres()+(portee?'&moderationPortee='+encodeURIComponent(portee.value):'');
6280 fetch(endpoint+'?configuration=1',{credentials:'same-origin'}).then(function(r){return r.json();}).then(function(config){
6281 if(!config.ok)throw new Error(config.message || 'Acces refuse.');
6282 return fetch(endpoint,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:'token='+encodeURIComponent(config.token)+'&idtoban='+encodeURIComponent(idtoban)+'&duree='+encodeURIComponent(duree)+'&txt='+txt+contexte});
6283 }).then(function(r){return r.json();}).then(function(r){if(!r.ok)throw new Error(r.message);delete moderationMultijoueurEnCours[idtoban];(successFn || alertRes)(r.message);}).catch(function(e){delete moderationMultijoueurEnCours[idtoban];if(successFn)successFn('Erreur : '+e.message);else alerte(e.message);});
6284}
6285function banIDcompet (duree,idtoban,successFn)
6286{
6287 if (duree>0)
6288 banMode('banIDcompetA',duree,idtoban,successFn);
6289 else banMode('banIDcompetA',duree,idtoban,successFn,null,'Sanction appliquée par erreur');
6290} 
6291function removeIDformateur (idtoban,successFn)
6292{
6293 banMode('removeIDformateurA',0,idtoban,successFn);
6294} 
6295function lockaccount (idtoban)
6296{
6297 banMode('lockaccountA',0,idtoban);
6298} 
6299function delBio (idUtil)
6300{
6301 banMode('delBioA',0,idUtil,'');
6302 //ajax('/workers/moderation/delBio.php', 'idUtil='+idUtil, alertRes); 
6303} 
6304function previewResponse(idSujet) {
6305 var postedRep = escape($('#postReponse_txt').val()).split('+').join('%2B');
6306 var preview = $('#forumReplyPreview');
6307 preview.attr('aria-busy','true');
6308 ajax('/workers/forumPreview.php', 'txt='+postedRep+'&idSujet='+idSujet, function (res) {
6309 preview.html(res);
6310 preview.attr('aria-busy','false').show();
6311 if (preview.length) preview[0].scrollTop = 0;
6312 });
6313}
6314function previewSujet() {
6315 var postedRep = escape($('#postSujet_txt').val()).split('+').join('%2B');
6316 var preview = $('#previewDiv');
6317 preview.attr('aria-busy','true');
6318 ajax('/workers/forumPreview.php', 'txt='+postedRep, function (res) {
6319 preview.html(res);
6320 preview.attr('aria-busy','false').show();
6321 if (preview.length) preview[0].scrollTop = 0;
6322 });
6323}
6324function reasonBanMode(cptBobYY) {
6325 var res = $$('raisonMode'+cptBobYY).value;
6326 if ($('#joinRaisonDetailAuto'+cptBobYY).is(':checked')) {
6327 res += "<br>"+$('#raisonDetAutoMode'+cptBobYY).html();
6328 }
6329 return encodeURIComponent(res);
6330}
6331function validBanMode(cptBobYY) {
6332 if ($$('raisonMode'+cptBobYY).value.length<5) {
6333 alerte('Veuillez saisir une raison claire et détaillée');
6334 return false;
6335 }
6336 return true;
6337}
6338
6339function banMode(typeBan,duree,idtoban,successFn,defTexte,texteInitial)
6340{
6341 if (!successFn) successFn = 'alertRes';
6342 var resHTML = '<form onsubmit="return false;">';
6343 resHTML +='<b>Veuillez saisir la raison de votre décision de modération.</b><br>';
6344 resHTML +='<a class="button" onclick="showSanctionsList();"><u>Consulter le barème des sanctions</u></a><br><br>';
6345 //resHTML +='Veuillez saisir la raison de votre décision de modération, en citant des extraits de conversation du joueur :<br>';
6346 resHTML +='<textarea class="form-control" style="height:150px;" id="raisonMode'+cptBobYY+'">';
6347 if (texteInitial) resHTML +=texteInitial;
6348 resHTML +='</textarea>';
6349 if (defTexte) {
6350 resHTML +='<input type="checkbox" value="1" checked="checked" id="joinRaisonDetailAuto'+cptBobYY+'"/> Joindre ce message généré automatiquement :<br>';
6351 resHTML +='<div id="raisonDetAutoMode'+cptBobYY+'">';
6352 resHTML +=defTexte;
6353 resHTML +='</div>';
6354 }
6355 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="if (validBanMode('+cptBobYY+')) { '+typeBan+'(reasonBanMode('+cptBobYY+'),'+duree+',\''+idtoban+'\','+successFn+' );parentHide($(this)); } else return false;" />';
6356 resHTML +='</form>';
6357 showBigDialog('Décision de modération',resHTML);
6358 //megaModal(resHTML);
6359 cptBobYY++;
6360} 
6361function modeRes(idCtc,txt) {
6362 if (txt.substr(0,9)=='Erreur : ') {
6363 alerte(txt);
6364 return;
6365 }
6366 $('#answ'+idCtc).show();
6367 $('#actions'+idCtc).hide();
6368 $('#templates'+idCtc).hide();
6369 //$('#debSeb'+idCtc).hide();
6370 if (txt.substr(0,7)=='Bonjour') {
6371 setANW(txt,idCtc);
6372 } else {
6373 $('#anwsTA'+idCtc).val('Bonjour,\r\n'+txt+'\r\nCordialement,\r\nL\'équipe de modération');
6374 }
6375} 
6376function removeIDformateurA (txt,duree,idtoban,successFn)
6377{
6378 if (!successFn) successFn = alertRes;
6379 ajax('/workers/moderation/removeIDformateurA.php', 'txt='+txt+'&idtoban='+idtoban, successFn); 
6380} 
6381function giveIDformateur (idtoban)
6382{
6383 ajax('/workers/moderation/giveIDformateurA.php', 'idtoban='+idtoban, alertRes); 
6384} 
6385var moderationValidationEnCours={};
6386function moderationValidationRequete(valeurs) {
6387 return fetch('/workers/moderation/validation.php?configuration=1',{credentials:'same-origin'}).then(function(res){return res.json();}).then(function(config){
6388 if(!config.ok)throw new Error(config.message || 'Acces refuse.');
6389 valeurs.token=config.token;
6390 var corps=Object.keys(valeurs).map(function(k){return encodeURIComponent(k)+'='+encodeURIComponent(valeurs[k]);}).join('&');
6391 return fetch('/workers/moderation/validation.php',{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:corps});
6392 }).then(function(res){return res.json();}).then(function(res){if(!res.ok)throw new Error(res.message || 'Traitement impossible.');return res;});
6393}
6394function moderationValidationProfil(action,id,motif,nouveauPseudo,callback) {
6395 var cle=action+'-'+id;if(moderationValidationEnCours[cle])return;
6396 moderationValidationEnCours[cle]=true;
6397 moderationValidationRequete({action:action,cible:id,motif:motif,nouveauPseudo:nouveauPseudo || ''}).then(function(res){delete moderationValidationEnCours[cle];(callback || alertRes)(res.message);}).catch(function(err){delete moderationValidationEnCours[cle];alerte(err.message);});
6398}
6399function delBioA (txt,duree,idtoban,successFn)
6400{
6401 if (!successFn) successFn = alertRes;
6402 moderationValidationProfil('retirer_profil',idtoban,decodeURIComponent(txt),'',successFn);
6403 
6404} 
6405function banBioA (txt,duree,idtoban,successFn)
6406{
6407 if (!successFn) successFn = alertRes;
6408 ajax('/workers/moderation/banBio.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn);
6409} 
6410function banContactA (txt,duree,idtoban,successFn)
6411{
6412 if (!successFn) successFn = alertRes;
6413 ajax('/workers/moderation/banContact.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban, successFn);
6414}  
6415function banMulticompte (txt,duree,idtoban,successFn)
6416{
6417 if (!successFn) successFn = alertRes;
6418 ajax('/workers/moderation/banMulticompte.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban, successFn); 
6419} 
6420function banIPchatA (txt,duree,idtoban,successFn)
6421{
6422 if (!successFn) successFn = alertRes;
6423 ajax('/workers/moderation/banIPchat.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn); 
6424}  
6425function banIDchatA (txt,duree,idtoban,successFn)
6426{
6427 if (!successFn) successFn = alertRes;
6428 ajax('/workers/moderation/banIPchat.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn); 
6429}   
6430function banIDforumA (txt,duree,idtoban,successFn)
6431{
6432 if (!successFn) successFn = alertRes;
6433 ajax('/workers/moderation/banIPforum.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban, successFn); 
6434}   
6435function banIDMPA (txt,duree,idtoban,successFn)
6436{
6437 if (!successFn) successFn = alertRes;
6438 ajax('/workers/moderation/banIPMP.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban, successFn); 
6439}  
6440function moderationSignalementsParametres() {
6441 var champ = document.getElementById('moderationSignalementsOnglet');
6442 return champ ? '&moderationOnglet='+encodeURIComponent(champ.value) : '';
6443}
6444function banNothing (idtoban,successFn)
6445{
6446 if (!successFn) successFn = alertRes;
6447 ajax('/workers/moderation/banNothing.php', 'idtoban='+idtoban+moderationSignalementsParametres(), successFn); 
6448}  
6449function banNothingForum (idtoban,successFn)
6450{
6451 if (!successFn) successFn = alertRes;
6452 ajax('/workers/moderation/banNothingForum.php', 'idtoban='+idtoban, successFn); 
6453} 
6454function avertissement (txt,duree,idtoban,successFn)
6455{
6456 if (!successFn) successFn = alertRes;
6457 ajax('/workers/moderation/banavertissement.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn); 
6458} 
6459function avertissementForum (txt,duree,idtoban,successFn)
6460{
6461 if (!successFn) successFn = alertRes;
6462 ajax('/workers/moderation/banavertissement.php', 'isForum=1&txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn); 
6463} 
6464function banIPA (txt,duree,idtoban,successFn)
6465{
6466 if (!successFn) successFn = alertRes;
6467 ajax('/workers/moderation/banIP.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn);
6468} 
6469function banIDA (txt,duree,idtoban,successFn)
6470{
6471 if (!successFn) successFn = alertRes;
6472 ajax('/workers/moderation/banIP.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn);
6473} 
6474function banIDcompetA (txt,duree,idtoban,successFn)
6475{
6476 if (!successFn) successFn = alertRes;
6477 ajax('/workers/moderation/banIDcompet.php', 'txt='+txt+'&duree='+duree+'&idtoban='+idtoban+moderationSignalementsParametres(), successFn);
6478} 
6479function lockaccountA (txt,duree,idUtil)
6480{
6481 ajax('/workers/moderation/banAccount.php', 'txt='+txt+'&idUtil='+idUtil, alertRes);
6482} 
6483function unlockaccount (idUtil)
6484{
6485 ajax('/workers/moderation/unbanAccount.php', 'idUtil='+idUtil, alertRes);
6486} 
6487function updateNoteA (idUtil,button)
6488{
6489 var champ = button ? $(button).closest('form').find('.moderationNoteDialog__field') : $('#notesAdm');
6490 ajax('/workers/moderation/updateNoteA.php', 'idUtil='+idUtil+'&txt='+encodeURIComponent(champ.val()), function (txt) {
6491 if (button) parentHide($(button));
6492 alertRes(txt);
6493 });
6494} 
6495function delAvat (idUtil)
6496{
6497 moderationValidationProfil('retirer_avatar',idUtil,'Avatar contraire au reglement','',alertRes);
6498} 
6499function delAbandon(idUtil)
6500{
6501 ajax('/workers/moderation/delAbandon.php', 'idUtil='+idUtil, alertRes);
6502} 
6503function give1credit(idUtil)
6504{
6505 ajax('/workers/moderation/givecredit.php', 'idUtil='+idUtil+'&nbCredits=1', alertRes);
6506} 
6507function give5credit(idUtil)
6508{
6509 ajax('/workers/moderation/givecredit.php', 'idUtil='+idUtil+'&nbCredits=5', alertRes);
6510} 
6511function modeActionRes(txt) {
6512 moderationOpenPrivateMessageDialog(txt);
6513}
6514function moderationCreditRes(txt) {
6515 if (txt.substr(0,7)=='Maximum') {
6516 alerte(txt);
6517 return;
6518 }
6519 alerte('Opération effectuée');
6520 modeActionRes(txt);
6521}
6522function moderationSanctionRapide(type,duree,idUtil,label) {
6523 var raison = encodeURIComponent('Sanction rapide administrateur : '+label);
6524 if (type=='avertissement') avertissement(raison,0,idUtil,modeActionRes);
6525 else if (type=='jeu') banIDA(raison,duree,idUtil,modeActionRes);
6526 else if (type=='competition') banIDcompetA(raison,duree,idUtil,modeActionRes);
6527 else if (type=='multijoueur') banMultijoueurA(raison,duree,idUtil,alertRes);
6528 else if (type=='chat') banIDchatA(raison,duree,idUtil,modeActionRes);
6529 else if (type=='forum') banIDforumA(raison,duree,idUtil,modeActionRes);
6530 else if (type=='mp') banIDMPA(raison,duree,idUtil,modeActionRes);
6531 else if (type=='bio') banBioA(raison,duree,idUtil,modeActionRes);
6532 else if (type=='contact') banContactA(raison,duree,idUtil);
6533}
6534function moderationShowSanctionCategory(button,categorie) {
6535 var section = $(button).closest('.moderationActionSection');
6536 section.find('.moderationSanctionTab').removeClass('is-active').attr('aria-selected','false');
6537 $(button).addClass('is-active').attr('aria-selected','true');
6538 section.find('.moderationSanctionCard').each(function () {
6539 var visible = $(this).attr('data-sanction-category')==categorie;
6540 $(this).toggleClass('is-category-hidden',!visible).attr('aria-hidden',visible?'false':'true');
6541 });
6542}
6543function moderationRenouvelerDelaiRole(button) {
6544 var bouton = $(button);
6545 if (bouton.prop('disabled')) return;
6546 var statut = bouton.closest('.moderationRoleDelay').find('.moderationRoleDelay__status');
6547 bouton.prop('disabled',true);
6548 statut.text('Renouvellement en cours...');
6549 $.ajax({
6550 url:'/workers/moderation/renouvelerDelaiRole.php',
6551 type:'POST',
6552 dataType:'json',
6553 data:{idUtil:bouton.attr('data-id-util'),role:bouton.attr('data-role'),token:bouton.attr('data-token')},
6554 success:function (res) {
6555  if (res && res.ok) {
6556  bouton.closest('.moderationRoleCard').find('.moderationRoleCard__expiry').text('Expiration : '+res.dateEcheance);
6557  statut.text('D\u00e9lai renouvel\u00e9.');
6558  } else {
6559  statut.text(res && res.message ? res.message : 'Renouvellement impossible.');
6560  }
6561 },
6562 error:function (xhr) {
6563  statut.text(xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : 'Erreur de connexion. Rechargez la fiche pour v\u00e9rifier le d\u00e9lai.');
6564 },
6565 complete:function () { bouton.prop('disabled',false); }
6566 });
6567}
6568function moderationToggleRole(idUtil,role,actif) {
6569 var action = actif?'activer':'désactiver';
6570 confirme('Voulez-vous '+action+' ce rôle ?',function () {
6571 ajax('/workers/moderation/toggleRole.php','idUtil='+idUtil+'&role='+role+'&actif='+(actif?1:0),function (txt) {
6572 if (txt.substr(0,8)!='ROLE_OK|') {
6573 alerte(txt);
6574 return;
6575 }
6576  var resultat;
6577  try { resultat = JSON.parse(txt.substr(8)); }
6578  catch (e) { alerte('Rechargez la fiche pour afficher les r\u00f4les mis \u00e0 jour.'); return; }
6579  $('.moderationRolesSection[data-id-util="'+idUtil+'"]').replaceWith(resultat.html);
6580  var message = resultat.message;
6581 alerte('Rôle mis à jour.');
6582 if (actif && message) modeActionRes(message);
6583 });
6584 });
6585}
6586function enableChatUtil(idUtil,fnn)
6587{
6588 if (!fnn)
6589 fnn = alertRes;
6590
6591 confirme('Etes-vous sur de vouloir activer le chat du joueur ? Ceci modifie ses options configurées en page compte pour lui.',function () {
6592 ajax('/workers/moderation/enableChat.php', 'idUtil='+idUtil, fnn);
6593 });
6594 return true;
6595} 
6596var fnModeCred = null;
6597function modeGivecreditAmicaux(idUtil,fnn)
6598{
6599 fnModeCred = fnn;
6600 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">';
6601 resHTML += 'Saisissez le montant des crédits amicaux à offrir :<br />';
6602 resHTML += '<input type="text" value="1" id="creditsNbre"/><br/>';
6603 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Annuler"/>';
6604 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="sendCreditsAmicaux('+idUtil+');parentHide($(this));" value="Offrir des crédits amicaux"/>';
6605 
6606 resHTML += '<br /></form>';
6607 showBigDialog('Offrir des crédits amicaux',resHTML);
6608} 
6609function givecreditAmicaux(idUtil,num,fnn)
6610{
6611 if (!fnn)
6612 fnn = alertRes;
6613 var nbc = num;
6614 if (!nbc) {
6615 nbc = prompt('Offrir combien de crédits amicaux ?');
6616 if (nbc==null ) return false;
6617 }
6618 ajax('/workers/moderation/givecreditAmicaux.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnn);
6619 return true;
6620} 
6621//modeGivecreditPremium
6622function sendCreditsAmicaux(idUtil)
6623{
6624 var nbc = $('#creditsNbre').val();
6625 if (!nbc) {
6626 alerte("Valeur incorrecte");
6627 }
6628 ajax('/workers/moderation/givecreditAmicaux.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnModeCred);
6629} 
6630
6631function modeGivecredit(idUtil,fnn)
6632{
6633 fnModeCred = fnn;
6634 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">';
6635 resHTML += 'Saisissez le montant des crédits compétition à offrir :<br />';
6636 resHTML += '<input type="text" value="1" id="creditsNbre"/><br/>';
6637 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Annuler"/>';
6638 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="sendCredits('+idUtil+');parentHide($(this));" value="Offrir des crédits compétition"/>';
6639 
6640 resHTML += '<br /></form>';
6641 showBigDialog('Offrir des crédits compétition',resHTML);
6642} 
6643//modeGivecreditPremium
6644function sendCredits(idUtil)
6645{
6646 var nbc = $('#creditsNbre').val();
6647 if (!nbc) {
6648 alerte("Valeur incorrecte");
6649 }
6650 ajax('/workers/moderation/givecredit.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnModeCred);
6651} 
6652
6653
6654function modeGivecreditPremium(idUtil,fnn)
6655{
6656 fnModeCred = fnn;
6657 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">';
6658 resHTML += 'Saisissez le montant des <b>crédits Premium</b> à offrir :<br />';
6659 resHTML += '<input type="text" value="1" id="creditsNbre"/><br/>';
6660 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Annuler"/>';
6661 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="sendCreditsPremium('+idUtil+');parentHide($(this));" value="Offrir des crédits Premium"/>';
6662 
6663 resHTML += '<br /></form>';
6664 showBigDialog('Offrir des crédits premium',resHTML);
6665} 
6666//modeGivecreditPremium
6667function sendCreditsPremium(idUtil)
6668{
6669 var nbc = $('#creditsNbre').val();
6670 if (!nbc) {
6671 alerte("Valeur incorrecte");
6672 }
6673 ajax('/workers/moderation/givecreditPremium.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnModeCred);
6674} 
6675
6676function modeGiveAbandon(idUtil,fnn)
6677{
6678 fnModeCred = fnn;
6679 var resHTML = '<form class="feedback_form errorDlg" onsubmit="return false;">';
6680 resHTML += 'Saisissez le nombre d\'abandons à retirer du compte :<br />';
6681 resHTML += '<p>Le dernier avertissement ou la dernière suspension automatique pour abandon sera aussi supprimé du dossier. Si cette suspension est encore active, elle sera levée. Une seule mesure est supprimée par opération.</p>';
6682 resHTML += '<input type="text" value="1" id="creditsNbre"/><br/>';
6683 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Annuler"/>';
6684 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="sendDelAbandon('+idUtil+');parentHide($(this));" value="Retirer les abandons"/>';
6685 
6686 resHTML += '<br /></form>';
6687 showBigDialog('Retirer des abandons',resHTML);
6688} 
6689//modeGivecreditPremium
6690function sendDelAbandon(idUtil)
6691{
6692 var nbc = $('#creditsNbre').val();
6693 if (!nbc) {
6694 alerte("Valeur incorrecte");
6695 }
6696 ajax('/workers/moderation/delAbandon.php', 'idUtil='+idUtil+'&nbAbandons='+nbc, fnModeCred);
6697 //ajax('/workers/moderation/givecreditPremium.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnModeCred);
6698} 
6699
6700
6701function givecredit(idUtil,num,fnn)
6702{
6703 
6704 
6705 if (!fnn)
6706 fnn = alertRes;
6707 var nbc = num;
6708 if (!nbc) {
6709 nbc = prompt('Offrir combien de crédits compétition ?');
6710 if (nbc==null ) return false;
6711 }
6712 ajax('/workers/moderation/givecredit.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnn);
6713 return true;
6714} 
6715function changePseudoJMode(idUtil,fnn)
6716{
6717 if (!fnn)
6718 fnn = alertRes;
6719 var nbc = prompt('Saisissez le nouveau pseudo :');
6720 if (!nbc ) return false;
6721 moderationValidationProfil('changer_pseudo',idUtil,'Pseudonyme contraire au reglement',nbc,fnn);
6722 return true;
6723} 
6724function givecreditPremium(idUtil,num,fnn)
6725{
6726 if (!fnn)
6727 fnn = alertRes;
6728 var nbc = num;
6729 if (!nbc) {
6730 nbc = prompt('Offrir combien de crédits premium ?');
6731 if (nbc==null ) return false;
6732 }
6733 ajax('/workers/moderation/givecreditPremium.php', 'idUtil='+idUtil+'&nbCredits='+nbc, fnn);
6734 return true;
6735} 
6736function grantModerateur(idUtil,num,fnn)
6737{
6738 if (!fnn)
6739 fnn = alertRes;
6740 
6741 ajax('/workers/moderation/giveModeration.php', 'idUtil='+idUtil+'&droits=Mode', fnn);
6742 return true;
6743} 
6744function grantConsultant(idUtil,num,fnn)
6745{
6746 if (!fnn)
6747 fnn = alertRes;
6748 
6749 ajax('/workers/moderation/giveModeration.php', 'idUtil='+idUtil+'&droits=Consultant', fnn);
6750 return true;
6751} 
6752function grantFormateur(idUtil,num,fnn)
6753{
6754 if (!fnn)
6755 fnn = alertRes;
6756 
6757 ajax('/workers/moderation/giveFormateur.php', 'idUtil='+idUtil, fnn);
6758 return true;
6759} 
6760function giveAbandon(idUtil,num,fnn)
6761{
6762 if (!fnn)
6763 fnn = alertRes;
6764 var nbc = num;
6765 if (nbc==undefined) {
6766 nbc = prompt('Combien ?');
6767 if (nbc==null ) return false;
6768 }
6769 ajax('/workers/moderation/delAbandon.php', 'idUtil='+idUtil+'&nbAbandons='+nbc, fnn);
6770 return true;
6771} 
6772function demandeCtcSatisfaction(id,statut)
6773{
6774 ajax('/workers/moderation/satisfactionUtilisateur.php', 'id='+id+'&statut='+statut, alertRes);
6775 $('#demande'+id).remove();
6776} 
6777var sentnonResoluDemandeAssist = false;
6778var nonResoluLastMsg = '';
6779function nonResoluDemandeAssist()
6780{
6781 if ($('#nonResoluTxt').val().trim().length<30) {
6782 alerte('Minimum 30 caractères');
6783 return;
6784 }
6785 if (sentnonResoluDemandeAssist) return;
6786 if (nonResoluLastMsg=='') return;
6787 sentnonResoluDemandeAssist = true;
6788 ajax('/workers/moderation/satisfactionUtilisateur.php', 'statut=3&id='+$('#nonResoluId').val()+'&txt='+$('#nonResoluTxt').val()+'\r\n'+nonResoluLastMsg+'&sameUser='+$('#nonResoluSameUser').is(':checked'), function (txt) {
6789 if (txt!='OK') {
6790 sentnonResoluDemandeAssist = false;
6791 alerte(txt);
6792 return;
6793 }
6794 document.location.reload();// = '/Contact-organisation-jeu-de-tarot.php';
6795 });
6796} 
6797function filterDemsA()
6798{
6799 if ($('#filterDemsA').is(':checked')) {
6800 $('.unaffected').show();
6801 } else {
6802 $('.unaffected').hide();
6803 }
6804} 
6805function demandeCtcSatisfactionKO(id)
6806{
6807 $('.demsA').hide();
6808 $('.actionBtns').hide();
6809 $('#demande'+id).show();
6810 var replyTxt = '';
6811 replyTxt += '\n\nMessage d\'origine : \n';
6812 replyTxt += $('#txtMsg'+id).html().split('\n').join('').split('<br>').join('\n');
6813 if ($('#repMsg'+id).length>0) {
6814 replyTxt += '\n\n';
6815 replyTxt += $('#repMsg'+id).html().split('\n').join('').split('<u>').join('').split('</u>').join('').split('<br>').join('\n');
6816 }
6817 nonResoluLastMsg = replyTxt;
6818 $('#firstRetourBtn').hide();
6819 $('#nonResoluTxt').val('');
6820 $('#nonResolu').show();
6821 $('#nonResoluId').val(id);
6822 window.scroll(0,0);
6823 /*ajax('/workers/moderation/satisfactionUtilisateur.php', 'id='+id+'&statut='+statut, alertRes);
6824 $('#demande'+id).remove();*/
6825} 
6826function validEditDemandeAssist()
6827{
6828 ajax('/workers/moderation/editDemande.php', 'id='+$('#editDemId').val()+'&txt='+$('#editDemTxt').val(), function () {
6829 document.location = '/Contact-organisation-jeu-de-tarot.php';
6830 });
6831} 
6832function editDemandeAssist(id)
6833{
6834 $('.demsA').hide();
6835 $('#firstRetourBtn').hide();
6836 $('.actionBtns').hide();
6837 $('#demande'+id).show();
6838 $('#editDemTxt').val($('#txtMsg'+id).html().split('\n').join('').split('<br>').join('\n'));
6839 $('#editDemId').val(id);
6840 $('#editDemande').show();
6841 window.scroll(0,0);
6842} 
6843function validerEmailJ(idUtil)
6844{
6845 ajax('/workers/moderation/validerEmailJ.php', 'idUtil='+idUtil, alertRes);
6846} 
6847
6848function dissocierComptesAppareil(idUtil,ensemble,endFunc)
6849{
6850 if (!endFunc) endFunc = alertRes;
6851 ajax('/workers/moderation/dissocierIPs.php', 'idUtil='+idUtil+'&ensemble='+(ensemble?'1':'0'), endFunc);
6852}
6853function lnForumMode(idUtil)
6854{
6855 var optT = 'idUtil='+idUtil+'&dest='+$('#lnForumWith').val()+'&destId='+$('#lnForumWithId').val();
6856 ajax('/workers/moderation/lnForum.php', optT, alertRes);
6857} 
6858function transfertCredits(idUtil)
6859{
6860 var optT = 'idUtil='+idUtil+'&dest='+$('#transfertCreditsTo').val()+'&destId='+$('#transfertCreditsToId').val()+'&montant='+$('#transfertCreditsAmount').val();
6861 ajax('/workers/moderation/transfertCredits.php', optT, alertRes);
6862} 
6863function transfertCreditsPremium(idUtil)
6864{
6865 var optT = 'idUtil='+idUtil+'&dest='+$('#transfertCreditsPremiumTo').val()+'&destId='+$('#transfertCreditsPremiumToId').val()+'&montant='+$('#transfertCreditsPremiumAmount').val();
6866 ajax('/workers/moderation/transfertCreditsPremium.php', optT, alertRes);
6867} 
6868function resetPW(idUtil)
6869{
6870 ajax('/workers/moderation/resetPW.php', 'idUtil='+idUtil, alertRes);
6871} 
6872function annuleModifs(idUtil)
6873{
6874 ajax('/workers/moderation/annuleModifs.php', 'idUtil='+idUtil, alertRes);
6875} 
6876
6877
6878function resetBanList()
6879{
6880 ajax('/workers/resetBanList.php', '', alertRes);
6881} 
6882
6883
6884function FBshare(url) { 
6885 FBLogin(function () {
6886 FB.ui(
6887 {
6888 method: 'share',
6889 href: url,
6890 },
6891 // callback
6892 function(response) {
6893 if (response && !response.error_code) {
6894 //alert('Posting completed.');
6895 } else {
6896 //alert('Error while posting.');
6897 }
6898 }
6899 );
6900 });
6901}
6902
6903function FBFreeLifeRequest (fromID) { 
6904 FBLogin(function () {
6905 FB.ui({method: 'apprequests',
6906 message: 'Pourrais-tu m\'envoyer une partie gratuite sur jeu de tarot ? ',
6907 title: 'Parties de Tournoi gratuites par mes amis'
6908 }, function(response){
6909 ajax('/workers/amiInviteFB.php', 'requestID='+response.request+'&amisList='+response.to.join(','), function (txt) { 
6910 });
6911 });
6912 });
6913}
6914
6915function FBGameRequest (fromID) { 
6916 FBLogin(function () {
6917 FB.ui({method: 'apprequests',
6918 message: 'Joue avec moi au tarot',
6919 title: 'Viens jouer à ce jeu'
6920 }, function(response){
6921 ajax('/workers/amiInviteFB.php', 'requestID='+response.request+'&amisList='+response.to.join(','), function (txt) { 
6922 if (txt!="")
6923 alerte(txt);
6924 });
6925 });
6926 });
6927}
6928
6929function FBSearchFriends () {
6930 FBLogin (function () {
6931 $('.invFB').hide();
6932 $('.invFBO').show();
6933 ajax('/workers/myfriends.php', '', function (txt) { 
6934 $('#friendsRes').html(txt);
6935 });
6936 });
6937}
6938var loginStatusNotified = false;
6939
6940function FBLogin (cb) {
6941 if (typeof FB == 'undefined') return;
6942 if (typeof FB.getLoginStatus == 'undefined') return;
6943 FB.getLoginStatus(function(response) {
6944 if (response.status === 'connected') {
6945 if (loginStatusNotified) {
6946 if (cb!=null) cb();
6947 $('#invFBL').hide();
6948 }else {
6949 $('#invFBL').hide();
6950 ajax('/workers/FBlogin.php', '', cb);
6951 loginStatusNotified = true;
6952 }
6953 }
6954 else {
6955 FB.login(function(){
6956 $('#invFBL').hide();
6957 ajax('/workers/FBlogin.php', '', cb);
6958 loginStatusNotified = true;
6959 }, {display:'dialog',scope: 'public_profile, email'});//, user_friends
6960 }
6961 });
6962}
6963
6964
6965function facebookLogout() {
6966
6967 ajax('/workers/FBlogout.php', '',function() {alerte('Déconnexion effectuée'); });
6968}
6969
6970
6971function sendModerateurMess(idUtil,button)
6972{
6973 var champ = button ? $(button).closest('form').find('.moderationPrivateMessageDialog__field') : $('#corpMsg');
6974 var txt = champ.val();
6975 if (!txt || !txt.trim()) { alerte('Message vide'); return; }
6976 if (champ.data('mpSending')) return;
6977 var request = champ.data('mpRequest');
6978 if (!request || request.txt!==txt || request.idUtil!==idUtil) {
6979 request = {txt:txt,idUtil:idUtil,id:mpSendRequestId()};
6980 champ.data('mpRequest',request);
6981 }
6982 champ.data('mpSending',true);
6983 $.ajax({
6984 url:'/workers/moderation/sendModerateurMess.php',type:'POST',timeout:45000,
6985 data:'idUtil='+idUtil+'&msg='+escape(txt).split('+').join('%2B')+'&clientRequestId='+encodeURIComponent(request.id),
6986 success:function (txt) {
6987  if (txt.trim()!=='Message priv&eacute; envoy&eacute;') {
6988  alerte(txt || "L'envoi n'a pas ete confirme. Vous pouvez reessayer.");
6989  return;
6990  }
6991  champ.removeData('mpRequest');
6992  if (button) parentHide($(button));
6993  else champ.val('');
6994  sendWebPing(idUtil);
6995  mpRefreshMessagesPage();
6996  alertRes(txt);
6997 },
6998 error:function () { alerte("L'envoi n'a pas ete confirme. Reessayez : votre message est conserve."); },
6999 complete:function () { champ.data('mpSending',false); }
7000 });
7001}
7002/*var currentVisible = 'premiereEtape';
7003var prevVisible = 'premiereEtape';*/
7004
7005var openedContactForms = new Array();
7006
7007function resetContactPlayerSearch() {
7008 $('#searchPseudoID').val('');
7009 $('#cibleContact').val('').removeAttr('data-joueur-id');
7010 $('#searchPseudoBox .recherche-joueur-composant__panel').remove();
7011 $('#searchPseudoID2').val('');
7012 $('#cibleContact2').val('').removeAttr('data-joueur-id');
7013 $('#searchPseudoBox2 .recherche-joueur-composant__panel').remove();
7014 $('#choixParticipation').hide();
7015}
7016
7017function changeModerateurRapportCible() {
7018 if ($('#moderateurRapportCible').val()=='1') {
7019 $('#searchPseudoID').val('');
7020 $('#searchPseudoBox').hide();
7021 $('#choixParticipation').hide();
7022 $('#moderateurRapportJoueurAide').hide();
7023 $('#moderateurRapportSanction').val('');
7024 $('#moderateurRapportSanctionBloc').hide();
7025 } else {
7026 resetContactPlayerSearch();
7027 $('#searchPseudoBox').show();
7028 $('#moderateurRapportJoueurAide').show();
7029 $('#moderateurRapportSanctionBloc').show();
7030 }
7031}
7032
7033function contactBkBtn() {
7034
7035 var old = openedContactForms.pop();
7036 
7037 $('div#'+old).hide();
7038 var prev = 'premiereEtape';
7039 if (openedContactForms.length>0)
7040 prev = openedContactForms[openedContactForms.length-1];
7041 $('div#'+prev).show();
7042
7043 $('#searchPseudoBox').hide();
7044 $('#searchPseudoBox2').hide();
7045 $('#signalementConnivenceInfo').hide();
7046 $('#comptePerdu').hide();
7047 $('#signalementBug').hide();
7048 $('#pbMission').hide();
7049 $('#moderateurInfo').hide();
7050 $('#consultantInfo').hide();
7051 $('#moderateurRapport').hide();
7052 $('#moderateurRapportJoueurAide').hide();
7053 $('#formateurInfos').hide();
7054}
7055function ctcTraitementMode() {
7056 $('#contactSupportWarning').show();
7057
7058 $('#moXS').val("0");
7059 $('#serviceTraitement').html("Votre message sera envoyé à notre équipe de modérateurs");
7060}
7061function ctcTraitementSignalementChat() {
7062 $('#contactSupportWarning').show();
7063
7064 $('#moXS').val("0");
7065 $('#serviceTraitement').html("Votre signalement de chat sera analys&eacute; individuellement par une intelligence artificielle fournie par un prestataire externe. Si aucun comportement sanctionnable n'est d&eacute;tect&eacute;, il sera clos sans sanction. Dans le cas contraire, le serveur calculera la mesure pr&eacute;vue par le bar&egrave;me et un mod&eacute;rateur devra la confirmer ou la refuser avant toute application. Vous pourrez suivre l'issue du traitement dans votre historique Contact.");
7066}
7067function ctcTraitementAdmin() {
7068 $('#contactSupportWarning').hide();
7069
7070 $('#moXS').val("1");
7071 $('#serviceTraitement').html("Votre message sera envoyé à l'équipe d'administration");
7072}
7073function selectContactHistoGame(id,titre) {
7074 id = parseInt(id,10) || 0;
7075 $('#contactPartie').val(id || '').attr('data-partie-id',id || '');
7076 $('#IDpartie').val(id || '');
7077 $('#origineIDpartie').val(id ? 'historique' : '');
7078 $('#choixParties').show();
7079}
7080function selectContactParticipation(idSujet, idMessage, idCommentaire ,titre) {
7081 var htmlRes = '<b>Participation en rapport avec votre message</b><br>';
7082 htmlRes += titre;
7083 htmlRes += '<br><a onclick="showChoixParticipation();" class="button">Modifier</a>';
7084 $('#choixParticipation').html(htmlRes);
7085 $('#idSujet').val(idSujet);
7086 $('#idMessage').val(idMessage);
7087 $('#idCommentaire').val(idCommentaire);
7088}
7089function showChoixParticipation() {
7090 $('#choixParticipation').show();
7091 ajax('/workers/participationsRecentes.php', 'idJoueur='+$('#searchPseudoID').val(), function(txt) {
7092 $('#choixParticipation').html(txt);
7093 });
7094}
7095function selTypeParticipation(obj) {
7096 console.log($(obj).val());
7097 if ($(obj).val()==0) {
7098 $('#idSujet').show();
7099 $('#idReponse').hide();
7100 $('#idCommentaire').hide();
7101 } else if ($(obj).val()==1) {
7102 $('#idSujet').hide();
7103 $('#idReponse').show();
7104 $('#idCommentaire').hide();
7105 } else if ($(obj).val()==2) {
7106 $('#idSujet').hide();
7107 $('#idReponse').hide();
7108 $('#idCommentaire').show();
7109 }
7110}
7111function showChoixParties() {
7112 $('#IDpartie').val('');
7113 $('#origineIDpartie').val('');
7114 $('#contactPartie').val('').removeAttr('data-partie-id');
7115 $('#choixParties').show();
7116 if (typeof window.initialiserComposantsRecherchePartie === 'function')
7117 window.initialiserComposantsRecherchePartie(document.getElementById('choixParties'));
7118}
7119function contactFormAnswer(idpart,idlink,textT) {
7120 var openLink = idlink;
7121 resetContactPlayerSearch();
7122 $('#moderateurRapportCible').val("0");
7123 $('#moderateurRapportJoueurAide').hide();
7124 if (openLink=='pbEnJeu' || openLink=='signalerJoueurPartie') {
7125 openLink='contactUs';
7126 showChoixParties();
7127 } else {
7128 $('#choixParties').hide();
7129 }
7130 $('#choixParticipation').hide();
7131 $('#searchPseudoBox').hide();
7132 $('#searchPseudoBox2').hide();
7133 $('#signalementConnivenceInfo').hide();
7134 if (idlink=='signalerJoueurPartie' || idlink=='signalerJoueurForum') {
7135 openLink='contactUs';
7136 $('#searchPseudoBox').show();
7137 }
7138 if (openLink=='signalerJoueurF') {
7139 openLink='contactUs';
7140 $('#searchPseudoBox').show();
7141 }
7142 if (openLink=='comptePerdu') {
7143 openLink='contactUs';
7144 $('#comptePerdu').show();
7145 }
7146 if (openLink=='contactMod') {
7147 openLink='contactUs';
7148 ctcTraitementAdmin();
7149 } else
7150 ctcTraitementMode();
7151 if (idlink=='signalerConnivence') {
7152 openLink='contactUs';
7153 textT='Connivence entre joueurs';
7154 $('#searchPseudoBox').show();
7155 $('#searchPseudoBox2').show();
7156 $('#signalementConnivenceInfo').show();
7157 }
7158 if (idlink=='signalerJoueurPartie' && textT.indexOf('chat')!=-1)
7159 ctcTraitementSignalementChat();
7160 if (openLink=='signalementBug') {
7161 openLink='contactUs';
7162 $('#signalementBug').show();
7163 }
7164 if (openLink=='pbMission') {
7165 openLink='contactUs';
7166 $('#pbMission').show();
7167 }
7168 if (openLink=='moderateur') {
7169 openLink='contactUs';
7170 ctcTraitementAdmin();
7171 $('#moderateurInfo').show();
7172 }
7173 if (openLink=='consultant') {
7174 openLink='contactUs';
7175 ctcTraitementAdmin();
7176 $('#consultantInfo').show();
7177 }
7178 if (openLink=='moderateurRapport') {
7179 openLink='contactUs';
7180 ctcTraitementAdmin();
7181 $('#moderateurRapport').show();
7182 $('#moderateurRapportCible').val("0");
7183 changeModerateurRapportCible();
7184 }
7185 if (openLink=='formateur') {
7186 openLink='contactUs';
7187 $('#formateurInfos').show();
7188 } else {
7189 $('#formateurInfos').hide();
7190 }
7191 $('#sujetContact').val(textT);
7192
7193 openedContactForms.push(openLink);
7194 $('div#'+idpart).hide();
7195 $('div#'+openLink).show();
7196}
7197function vipAdminGiftOpenDialog(templateId) {
7198 var template = $('#'+templateId);
7199 if (!template.length || typeof showBigDialog!='function') {
7200 alerte('Le formulaire de soutien est indisponible.');
7201 return false;
7202 }
7203 var dialogId = showBigDialog('Offrir le statut soutien',template.html());
7204 if (dialogId) {
7205 window.setTimeout(function () {
7206 $('#'+dialogId).find('.vipAdminGiftPreset').focus();
7207 },0);
7208 }
7209 return false;
7210}
7211function vipAdminGiftSubmit(button) {
7212 var container = $(button).closest('.vipAdminGift');
7213 var preset = container.find('.vipAdminGiftPreset').val();
7214 var amount = container.find('.vipAdminGiftAmount').val();
7215 var unit = container.find('.vipAdminGiftUnit').val();
7216 if (preset=='custom' && (!amount || parseInt(amount,10)<=0)) {
7217 alerte('Saisissez une duree personnalisee valide.');
7218 return;
7219 }
7220 var label = container.find('.vipAdminGiftPreset option:selected').text();
7221 if (preset=='custom') label = amount+' '+container.find('.vipAdminGiftUnit option:selected').text();
7222 confirme('Offrir le statut soutien pour '+label+' ? La periode offerte actuelle sera remplacee.',function () {
7223 $(button).attr('disabled','disabled').text('Attribution...');
7224 var data = 'idUtil='+encodeURIComponent(container.attr('data-id-util'))+
7225 '&source='+encodeURIComponent(container.attr('data-source'))+
7226 '&idDemande='+encodeURIComponent(container.attr('data-id-demande'))+
7227 '&token='+encodeURIComponent(container.attr('data-token'))+
7228 '&preset='+encodeURIComponent(preset)+
7229 '&customAmount='+encodeURIComponent(amount)+
7230 '&customUnit='+encodeURIComponent(unit);
7231 ajax('/workers/moderation/giveVip.php',data,function (txt) {
7232 $(button).removeAttr('disabled').text('Offrir le statut soutien');
7233 if (txt.substr(0,3)!='OK\t') {
7234 alerte(txt);
7235 return;
7236 }
7237 $('.vipAdminGift[data-id-util="'+container.attr('data-id-util')+'"][data-source="'+container.attr('data-source')+'"][data-id-demande="'+container.attr('data-id-demande')+'"]').find('.vipAdminGiftStatus').text(txt.substr(3));
7238 alerte(txt.substr(3));
7239 });
7240 });
7241}
7242$(document).on('change','.vipAdminGiftPreset',function () {
7243 var custom = $(this).val()=='custom';
7244 var container = $(this).closest('.vipAdminGift');
7245 container.find('.vipAdminGiftAmount,.vipAdminGiftUnit').toggle(custom);
7246});
7247function assignTicket(idctc,idUtil) {
7248 ajax('/workers/moderation/ticketAssign.php', 'idctc='+idctc+'&idUtil='+idUtil, function(txt) {
7249 if (txt=='OK') {
7250 return;
7251 } else
7252 alerte(txt);
7253 });
7254 $('.CTC'+idctc).remove();
7255}
7256function noShowTicket(idctc) {
7257 var expire=new Date();
7258 expire.setTime(expire.getTime()+1000*60*60*24*7);
7259 llog('time',new Date().toGMTString(),'expire',expire.toGMTString());
7260 document.cookie='noShow['+idctc+']=1;expires='+expire.toGMTString();//+'; path=/support.php';
7261 
7262 removeTicket(idctc);
7263}
7264function noShowTicket60m(idctc) {
7265 var expire=new Date();
7266 expire.setTime(expire.getTime()+1000*60*60*12);
7267 llog('time',new Date().toGMTString(),'expire',expire.toGMTString());
7268 document.cookie='noShow['+idctc+']=1;expires='+expire.toGMTString();//+'; path=/support.php';
7269 
7270 removeTicket(idctc);
7271}
7272function noShowTicketUser(idctc) {
7273 var expire=new Date();
7274 expire.setTime(expire.getTime()+1000*60*60*24);
7275 //llog('time',new Date().toGMTString(),'expire',expire.toGMTString());
7276 var ongletSignalements = document.getElementById('moderationSignalementsOnglet');
7277 var cleSignalements = (ongletSignalements ? ongletSignalements.value+'_' : '')+idctc;
7278 document.cookie='noShowUser['+cleSignalements+']=1;expires='+expire.toGMTString();//+'; path=/support.php';
7279 
7280 $('#Massist'+idctc).remove();
7281}
7282function getTicket(idctc,lectureContinue) {
7283 $('.getTicket'+idctc).html('Chargement...');
7284 $('.getTicket'+idctc).attr('disabled','disabled');
7285 ajax('/workers/moderation/ticketAssign.php', 'idctc='+idctc+(lectureContinue?'&lectureContinue=1':''), function(txt) {
7286 if (txt=='OK') {
7287 $('#charge'+idctc).toggle();$('#actions'+idctc).toggle();
7288 } else {
7289 $('.getTicket'+idctc).attr('disabled',null);
7290 $('.getTicket'+idctc).html('Traiter');
7291 $('#charge'+idctc).hide();
7292 $('#dataS'+idctc).html(txt);
7293 }
7294 },function () {
7295 $('#assist'+idctc).remove();
7296 alerte(txt);
7297 });
7298}
7299function getTicketNoOpen(idctc) {
7300 ajax('/workers/moderation/ticketAssign.php', 'idctc='+idctc, function(txt) {
7301 //llog(txt);
7302 if (txt=='OK') {
7303 
7304 } else {
7305 alerte(txt);
7306 }
7307 });
7308 //$('.CTC'+idctc).remove();
7309}
7310/*function traiteTicket(idctc) {
7311 ajax('/workers/moderation/ticketAssign.php', 'idctc='+idctc, function(txt) {
7312 if (txt=='OK') {
7313 $('#charge'+idctc).toggle();$('#actions'+idctc).toggle();
7314 } else {
7315 $('#charge'+idctc).html(txt);
7316 }
7317 },function () {
7318 $('#assist'+idctc).remove();
7319 alerte(txt);
7320 });
7321}*/
7322function removeTicket(idctc) {
7323 $('[data-support-ticket-en-cours="'+parseInt(idctc,10)+'"]').remove();
7324 $('#assist'+idctc).remove();
7325 if ($('.assistance').length==0) {
7326 setTimeout(function () {
7327 document.location = document.querySelector('.support-abandons')?'/support.php?part=ABANDONS':'/support.php';
7328 },3000);
7329 return;
7330 }
7331 $('.assistance').show();
7332
7333 updateAFF();
7334}
7335function closeTicket(idctc) {
7336 $('#charge'+idctc).show();$('#actions'+idctc).hide();
7337 $('.assistance').show();
7338
7339 updateAFF();
7340}
7341function updateAFF() {
7342 if ( $('#filterDemsA').length==0) return;
7343 if ($('#filterDemsA').is(':checked') ) {
7344 $('.unaffected').show();
7345 } else {
7346 $('.unaffected').hide();
7347 }
7348}
7349var supportTicketSending = {};
7350function startSupportTicketSending(idctc) {
7351 if (supportTicketSending[idctc]) return false;
7352 supportTicketSending[idctc] = true;
7353 $('#assist'+idctc).find('a').addClass('disabled').attr('aria-disabled','true').css('pointer-events','none');
7354 return true;
7355}
7356function stopSupportTicketSending(idctc) {
7357 delete supportTicketSending[idctc];
7358 $('#assist'+idctc).find('a').removeClass('disabled').removeAttr('aria-disabled').css('pointer-events','');
7359}
7360function TRMPerso(idctc,msg) {
7361 if (!startSupportTicketSending(idctc)) return;
7362 var addQ = '';
7363 ajax('/workers/moderation/traiteCTC.php', 'idctc='+idctc+'&msg='+escape(msg).split('+').join('%2B')+addQ, function(txt) {
7364 if (txt!='') {
7365 stopSupportTicketSending(idctc);
7366 alerte(txt);
7367 return;
7368 }
7369 removeTicket(idctc);
7370 });
7371}
7372function TRM(idctc) {
7373 if (!startSupportTicketSending(idctc)) return;
7374 var addQ = '';
7375 if ($('.CTC'+idctc).find('.copyToMode').is(':checked')) {
7376 addQ = '&copyToMode=1';
7377 }
7378 ajax('/workers/moderation/traiteCTC.php', 'idctc='+idctc+'&msg='+escape($('#anwsTA'+idctc).val()).split('+').join('%2B')+addQ, function(txt) {
7379 if (txt!='') {
7380 stopSupportTicketSending(idctc);
7381 alerte(txt);
7382 return;
7383 }
7384 removeTicket(idctc);
7385 });
7386}
7387function TRMResolu(idctc) {
7388 if (!startSupportTicketSending(idctc)) return;
7389 ajax('/workers/moderation/traiteCTC.php', 'resolu=1&idctc='+idctc+'&msg='+escape($('#anwsTA'+idctc).val()).split('+').join('%2B'), function(txt) {
7390 if (txt!='') {
7391 stopSupportTicketSending(idctc);
7392 alerte(txt);
7393 return;
7394 }
7395 removeTicket(idctc);
7396 });
7397}
7398function setMoteurJeu(idctc,moteur) {
7399 ajax('/workers/moderation/setMoteurJeu.php', 'idctc='+idctc+'&moteurJeuSel='+moteur, function(txt) {
7400 if (txt!='') {
7401 modeRes(idctc,txt);
7402 }
7403 //setANW(txt,idctc);
7404 });
7405}
7406function TRM2(idctc) {
7407 if (!startSupportTicketSending(idctc)) return;
7408 var addQ = '';
7409 if ($('.CTC'+idctc).find('.copyToMode').is(':checked')) {
7410 addQ = '&copyToMode=1';
7411 }
7412 ajax('/workers/moderation/traiteCTC.php', 'nontraite=1&idctc='+idctc+'&msg='+escape($('#anwsTA'+idctc).val()).split('+').join('%2B')+addQ, function(txt) {
7413 stopSupportTicketSending(idctc);
7414 if (txt!='') alerte(txt);
7415 });
7416}
7417function setANW(txt,idctc) {
7418 $('#anwsTA'+idctc).val(txt);
7419}
7420function supportAfficherDemandeLiee() {
7421 var hash = window.location.hash || '';
7422 if (!/^#demande-support-[1-9][0-9]*$/.test(hash)) return false;
7423 var cible = $(document.getElementById(hash.substring(1)));
7424 if (!cible.length) return false;
7425 var historique = cible.closest('#historique');
7426 if (historique.length) {
7427 $('.etapeDemande').hide();
7428 historique.show();
7429 openedContactForms = ['historique'];
7430 }
7431 cible.closest('.demsA,.assistance').show();
7432 if (cible.closest('.unaffected').length) {
7433 $('#filterDemsA').prop('checked',true);
7434 filterDemsA();
7435 }
7436 $('.demandeSupportCible').removeClass('demandeSupportCible');
7437 cible.addClass('demandeSupportCible').attr('tabindex','-1');
7438 setTimeout(function() {
7439 cible[0].focus();
7440 cible[0].scrollIntoView({block:'start'});
7441 },0);
7442 return true;
7443}
7444jQuery(function() {
7445 supportAfficherDemandeLiee();
7446 jQuery(window).off('hashchange.supportDemande').on('hashchange.supportDemande',supportAfficherDemandeLiee);
7447});
7448function contactAfficherHistoriqueLie() {
7449 if (supportAfficherDemandeLiee()) return;
7450 var navigation = $('#contactHistoriqueNavigation');
7451 if (navigation.attr('data-historique')!='1') return;
7452 var historique = $('#historique');
7453 if (historique.length) {
7454 $('.etapeDemande').hide();
7455 historique.show();
7456 openedContactForms = ['historique'];
7457 }
7458 var idDemande = parseInt(navigation.attr('data-demande'),10);
7459 var cible = idDemande>0 ? $('#demande'+idDemande) : $();
7460 if (cible.length) {
7461 cible.addClass('contactDemandeCible').attr('tabindex','-1');
7462 cible[0].focus();
7463 cible[0].scrollIntoView({block:'start'});
7464 }
7465}
7466function setUpContactForm() {
7467 openedContactForms = [];
7468 $('.etapeDemande').hide();
7469 $('div#premiereEtape').show();
7470 $('.etapeDemande').each(function () {
7471 var idpart = $(this).attr('id');
7472 $(this).find('.btn-lg').each(function () {
7473 var idlink = $(this).attr('goto');
7474 if (idlink!=null && idlink!='')
7475 $(this).click(function () {var gth = $(this).attr('data-contact-subject') || $(this).html(); contactFormAnswer(idpart,idlink,gth); }); 
7476 });
7477 });
7478 $('#screenWidth').val($(window).width());
7479 $('#screenHeight').val($(window).height());
7480 contactAfficherHistoriqueLie();
7481 var moderationPrefill = $('#moderationContactPrefill');
7482 if (moderationPrefill.length) {
7483 contactFormAnswer('premiereEtape','moderateurRapport',moderationPrefill.attr('data-sujet'));
7484 $('#searchPseudoID').val(moderationPrefill.attr('data-joueur'));
7485 $('#cibleContact').val(moderationPrefill.attr('data-pseudo')).attr('data-joueur-id',moderationPrefill.attr('data-joueur'));
7486 $('#moderateurRapportSanction').val(moderationPrefill.attr('data-sanction'));
7487 $('#messageCtc').focus();
7488 }
7489}
7490
7491function contactFromValide() {
7492 if ($('#choixParties').is(':visible')) {
7493
7494 if ($('#IDpartie').val()=='') {
7495 alerte('Veuillez spécifier une partie');
7496 return false;
7497 }
7498 }
7499 if ($('#choixParticipation').is(':visible')) {
7500
7501 if ($('#idSujet').val()=='' && $('#idReponse').val()=='' && $('#idCommentaire').val()=='' ) {
7502 alerte('Veuillez spécifier une participation');
7503 return false;
7504 }
7505 }
7506 if ($('#moderateurRapport').is(':visible') && $('#moderateurRapportCible').val()!='1' && $('#searchPseudoID').val()=='') {
7507 alerte('Veuillez selectionner le joueur concerne par ce rapport, ou choisir explicitement que le contact ne concerne pas un joueur en particulier.');
7508 return false;
7509 }
7510 if ($('#searchPseudoBox').is(':visible')) {
7511
7512 if ($('#searchPseudoID').val()=='') {
7513 alerte('Veuillez spécifier un joueur');
7514 return false;
7515 }
7516 }
7517 if ($('#searchPseudoBox2').is(':visible')) {
7518 if ($('#searchPseudoID2').val()=='') {
7519 alerte('Veuillez selectionner le deuxieme joueur');
7520 return false;
7521 }
7522 if ($('#searchPseudoID').val()==$('#searchPseudoID2').val()) {
7523 alerte('Veuillez selectionner deux joueurs differents');
7524 return false;
7525 }
7526 }
7527
7528 if ($('#messageCtc').val()=='') {
7529 alerte('Veuillez saisir un message');
7530 return false;
7531 } else return true;
7532}
7533
7534
7535
7536
7537function traiterSignalementConnivence(idctc,action) {
7538 var note = $.trim($('#connivenceNote'+idctc).val() || '');
7539 var libelle = '';
7540 if (action=='associer') libelle = 'associer ces deux comptes';
7541 else if (action=='ne_pas_associer') libelle = 'indiquer que ces deux comptes ne doivent pas etre associes';
7542 else if (action=='transferer') {
7543 libelle = 'transmettre ce signalement a l administration';
7544 if (note.length<5) {
7545 alerte('Ajoutez une note pour expliquer la transmission a l administration.');
7546 return;
7547 }
7548 } else return;
7549
7550 confirme('Confirmer : '+libelle+' ?',function () {
7551 if (!startSupportTicketSending(idctc)) return;
7552 ajax('/workers/moderation/traiterConnivence.php',
7553 'idctc='+encodeURIComponent(idctc)+'&action='+encodeURIComponent(action)+'&note='+encodeURIComponent(note),
7554 function (txt) {
7555 stopSupportTicketSending(idctc);
7556 if (txt.indexOf('OK|')!==0) {
7557 alerte(txt);
7558 return;
7559 }
7560 alerte(txt.substring(3));
7561 removeTicket(idctc);
7562 });
7563 });
7564}
7565function searchPseudoJ(pseudo) {
7566 if (pseudo=='')
7567 return alerte('Veuillez saisir un pseudo');
7568 ajax('/workers/findUser.php', 'pseudo='+pseudo,function(res) {
7569 if (res.split('-').length<2)
7570 alerte(res);
7571 else {
7572 var tab = res.split('-');
7573 $('#searchPseudoID').val(tab[0]);
7574 var html = '<label>Joueur concerné : '+pseudo+'</label> <br>';
7575 html += '<img src="/workers/avatar.php?a&idImage='+tab[1]+'"/>';
7576 html += '<br><a class="btn btn-default btn-sm" onclick="resetContactPlayerSearch();return false;">Modifier</a>';
7577 $('#searchPseudoBox').html(html);
7578 
7579 
7580 if ($('#sujetContact').val()=="Un joueur s'est mal comporté sur le forum") {
7581 $('#choixParticipation').show();
7582 showChoixParticipation();
7583 }
7584 }
7585 
7586 });
7587}
7588
7589function searchPseudoJBan(pseudo) {
7590 if (pseudo=='')
7591 return alerte('Veuillez saisir un pseudo');
7592 ajax('/workers/findUser.php', 'pseudo='+pseudo,function(res) {
7593 if (res.split('-').length<2)
7594 alerte(res);
7595 else {
7596 var tab = res.split('-');
7597 $('#searchPseudoIDBan').val(tab[0]);
7598 var html = '<label>Joueur concerné : '+pseudo+'</label> <br>';
7599 html += '<img src="/workers/avatar.php?a&idImage='+tab[1]+'"/>';
7600 $('#searchPseudoBoxBan').html(html);
7601 $('#actMod').show();
7602 }
7603 
7604 });
7605}
7606
7607function searchPseudoJFriend(pseudo) {
7608 if (pseudo=='')
7609 return alerte('Veuillez saisir un pseudo');
7610 ajax('/workers/findUser.php', 'pseudo='+pseudo,function(res) {
7611 if (res.split('-').length<2)
7612 alerte(res);
7613 else {
7614 var tab = res.split('-');
7615 $('#searchPseudoIDBan').val(tab[0]);
7616 var html = '<label>Joueur concerné : '+pseudo+'</label> <br>';
7617 html += '<img src="/workers/avatar.php?a&idImage='+tab[1]+'"/>';
7618 $('#searchPseudoBoxFriendV').html(html);
7619 $('#actMod').show();
7620 //$('#searchPseudoBoxFriend').hide();
7621 $('#searchPseudoBoxFriendV').show();
7622 }
7623 
7624 });
7625}
7626function searchPseudoJForum(id,pseudo) {
7627 if (pseudo=='')
7628 return alerte('Veuillez saisir un pseudo');
7629 ajax('/workers/findUser.php', 'pseudo='+pseudo,function(res) {
7630 if (res.split('-').length<2)
7631 alerte(res);
7632 else {
7633 var tab = res.split('-');
7634 $('#searchPseudoIDBan'+id).val(tab[0]);
7635 var html = '<label>Joueur concerné : '+pseudo+'</label> <br>';
7636 html += '<img src="/workers/avatar.php?a&idImage='+tab[1]+'"/>';
7637 $('#searchPseudoBoxFriendV'+id).html(html);
7638 $('#actMod'+id).show();
7639 $('#searchPseudoBoxFriend'+id).hide();
7640 $('#searchPseudoBoxFriendV'+id).show();
7641 }
7642 
7643 });
7644}
7645function showNivoMinExplaination() {
7646 showDialog('Niveau de jeu insuffisant','Votre niveau de jeu est insuffisant.<br>Pour gagner des niveau, il faut accomplir les missions qui vous sont proposées en page Jouer.');
7647}
7648var selectedEmotsArray = new Array();
7649
7650function selEmot(obj) {
7651 var numClicked = $(obj).attr('numA');
7652 $('.emotNum'+numClicked).toggleClass("selEmot");//css('opacity',1);
7653 updateSelIconsSel();
7654 
7655 if (selectedEmotsArray.length>=6) {
7656 ajax('/workers/selectEmot.php?selection='+selectedEmotsArray.join('|'),'', function () {});
7657 } else {
7658 if (!$(obj).hasClass("selEmot"))
7659 alerte('Minimum 6 emoticones');
7660 }
7661}
7662
7663function updateSelIconsSel() {
7664 selectedEmotsArray = new Array();
7665 $('.emotCpte').each(function () {
7666 if ($(this).hasClass('selEmot')) {
7667 var alreadyExists = false;
7668 var newNum = $(this).attr('numA');
7669 for (var it in selectedEmotsArray) {
7670 if (selectedEmotsArray[it]==newNum)
7671 alreadyExists = true;
7672 }
7673 if (!alreadyExists)
7674 selectedEmotsArray.push(newNum);
7675 }
7676 });
7677}
7678
7679
7680
7681var selectedSoundTracksArray = new Array();
7682
7683function selSoundtrack(obj) {
7684 var numClicked = $(obj).attr('numA');
7685 $('.soundtrackNum'+numClicked).toggleClass("selSoundtrack");//css('opacity',1);
7686 updateSelsoundtracksSel();
7687 
7688 if (selectedSoundTracksArray.length>=1) {
7689 ajax('/workers/selectSoundtrack.php?selection='+selectedSoundTracksArray.join('|'),'', function (txt) { if (txt) eval(txt); });
7690 } else {
7691 if (!$(obj).hasClass("selSoundtrack"))
7692 alerte('Minimum 1 chanson');
7693 }
7694}
7695function updateSelsoundtracksSel() {
7696 selectedSoundTracksArray = new Array();
7697 $('.soundTrackCpte').each(function () {
7698 if ($(this).hasClass('selSoundtrack')) {
7699 var alreadyExists = false;
7700 var newNum = $(this).attr('numA');
7701 for (var it in selectedSoundTracksArray) {
7702 if (selectedSoundTracksArray[it]==newNum)
7703 alreadyExists = true;
7704 }
7705 if (!alreadyExists)
7706 selectedSoundTracksArray.push(newNum);
7707 }
7708 });
7709}
7710
7711
7712function selAv(obj) {
7713 confirme('Etes-vous sûr de vouloir choisir cette image en tant qu\'avatar ?',function () {
7714 $('.avatarCpte').css('opacity',0.4);
7715 $(obj).css('opacity',1);
7716 ajax('/workers/selectAvatar.php?idImage='+$(obj).attr('numA'),'', function () {
7717 $('#joueurAvatarB, .homePlayerCard--member .homePlayerAvatar').attr('src','/workers/avatar.php?a&idImage='+$(obj).attr('numA'));
7718 
7719 $('.avatarImageNew').each(function () {
7720
7721 var src = $(this).attr('src');
7722 if (src) {
7723 var tmp = src.split('&idImage=');
7724 var tmp2 = tmp[1].split('&');
7725 tmp2[0] = $(obj).attr('numA');
7726 $(this).attr('src',tmp[0]+'&idImage='+tmp2.join('&'));
7727 }
7728 });
7729 });
7730 });
7731}
7732function selDosCartes(obj) {
7733 $('.DosCartesCpte').css('opacity',0.4);
7734 $(obj).css('opacity',1);
7735 ajax('/workers/selectDosCartes.php?idDosCartes='+$(obj).attr('numA'),'',function (res) {if (res) eval(res); });
7736}
7737function selMClstGrp(part) {
7738 $('.clastPart').addClass('hiddenPart');
7739 $('#partClast'+part).removeClass('hiddenPart');
7740 $('#btnClAn,#btnClMois,#btnClJour').removeClass('selectedMJ');
7741 $('#btnCl'+part).addClass('selectedMJ');
7742}
7743function selPlat(obj) {
7744 //if (confirm('Etes-vous sûr de vouloir choisir cette image en tant qu\'image de fond pour le jeu ?')) {
7745
7746 $('.bgCpte').css('opacity',1);
7747 $('.bgCpte').css('border','0px');
7748 $(obj).css('border','1px solid #555');
7749 $(obj).css('opacity',1);
7750 
7751 ajax('/workers/selectPlateau.php?idImage='+$(obj).attr('numA'),'', function () {
7752 //alert('Choix enregistré');
7753 //document.location = '/Compte.php?part=compte';
7754 });
7755 //}
7756}
7757function selCard(obj,v) {
7758 //if (confirm('Etes-vous sûr de vouloir choisir cette image en tant qu\'image de fond pour le jeu ?')) {
7759 $('#jeuCartesSel').val(v);
7760 $('.carteCpte').css('opacity',0.4);
7761 $('.carteCpte').css('border','0px');
7762 $(obj).css('border','1px solid #555');
7763 $(obj).css('opacity',1);
7764 $('#formJeuCartes').submit();
7765 //}
7766}
7767function avatConfirm(numNewImage) {
7768 if (numNewImage!=0)
7769 $('.avatPreview').attr('src','/workers/avatar.php?a&idImage='+numNewImage);
7770 $('.avatPreview').attr('display','');
7771 $('.avatPreview').css('display','');
7772 $('#previewBio').html( $('#modifBio').val() );
7773 $('.togValiP').toggle();
7774}
7775function newAvatConfirm(image,pseudo,medalTypes,playerId) {
7776 if (image!='') {
7777 $('.avatPreview').attr('src',image);
7778 if (pseudo && typeof createAvatar === 'function') {
7779 var medals = typeof buildCanvasAvatarMedals === 'function' ? buildCanvasAvatarMedals(medalTypes,playerId) : [];
7780 var renderPreview = function () {
7781 createAvatar(function (result) {
7782 $('.avatPreview').attr('src',result);
7783 },image,medals,0,'',pseudo,'',2,false,false,0,0,0);
7784 };
7785 if (typeof ldWebfont === 'function') ldWebfont(renderPreview);
7786 else renderPreview();
7787 }
7788 }
7789 $('.avatPreview').attr('display','');
7790 $('.avatPreview').css('display','');
7791 $('#previewBio').html( $('#modifBio').val() );
7792 $('.togValiP').toggle();
7793}
7794var tschavat = 0;
7795function valideModifPerso(tstamp) {
7796 if (tschavat==tstamp) return;
7797 tschavat=tstamp;
7798 $('#avatVPay').html('Veuillez patienter...');
7799 if ($('#inputImgPreview').val()!='') {
7800 ajax('/workers/selectAvatar.php?goProd=1','biographie='+escape($('#modifBio').val()).split('+').join('%2B')+'&avatB64='+$('#inputImgPreview').val(), function () {
7801 document.location = '/Compte.php?part=emoticonsAlbum';
7802 });
7803 } else {
7804
7805 ajax('/workers/selectAvatar.php?goProd=1','biographie='+escape($('#modifBio').val()).split('+').join('%2B'), function () {
7806 document.location = '/Compte.php?part=emoticonsAlbum';
7807 });
7808 }
7809}
7810function setCarW() {
7811 $('.carouselC,.carouselD,.carouselDos,.carouselEmot,.carouselBandeau').each(function () {
7812 if (!$(this).is(':visible')) return;
7813 var parentW = $(this).closest('.togDefI,.togDefID,.carouselA').width();
7814 if (!parentW || parentW < 1) parentW = $('.carouselA').width();
7815 var buttonSpace = 0;
7816 $(this).siblings('button').each(function () {
7817  buttonSpace += $(this).outerWidth(true);
7818 });
7819 var ww = parentW - buttonSpace - 16;
7820 if (!ww || ww < 80) ww = parentW;
7821 $(this).css('width',ww);
7822 });
7823}
7824function setAvatCarousel() {
7825 $(".carouselA .carouselC").filter(":visible").not(".compteCarouselInitialized").addClass("compteCarouselInitialized").jCarouselLite({
7826 btnNext: ".nextAvat",
7827 btnPrev: ".prevAvat",
7828 visible: 5,
7829 speed: 300,
7830 circular:true,
7831 scroll:2
7832 });
7833 $(".carouselA .carouselD").filter(":visible").not(".compteCarouselInitialized").addClass("compteCarouselInitialized").jCarouselLite({
7834 btnNext: ".nextAvatD",
7835 btnPrev: ".prevAvatD",
7836 visible: 5,
7837 speed: 300,
7838 circular:true,
7839 scroll:2
7840 });
7841 $(".carouselDos").filter(":visible").not(".compteCarouselInitialized").addClass("compteCarouselInitialized").jCarouselLite({
7842 btnNext: ".nextAvatDos",
7843 btnPrev: ".prevAvatDos",
7844 visible: 5,
7845 speed: 300,
7846 circular:true,
7847 scroll:2
7848 });
7849 $(".carouselBandeau").filter(":visible").not(".compteCarouselInitialized").addClass("compteCarouselInitialized").jCarouselLite({
7850 btnNext: ".nextBandeau",
7851 btnPrev: ".prevBandeau",
7852 visible: 3,
7853 speed: 300,
7854 circular:true,
7855 scroll:1
7856 });
7857 $(".carouselEmot").filter(":visible").not(".compteCarouselInitialized").addClass("compteCarouselInitialized").jCarouselLite({
7858 btnNext: ".nextEmot",
7859 btnPrev: ".prevEmot",
7860 visible: 5,
7861 speed: 300,
7862 circular:true,
7863 scroll:2
7864 });
7865 setCarW();
7866 $(window).off('resize.compteCarousel').on('resize.compteCarousel', setCarW);
7867}
7868var propositionDefiEnCours = false;
7869function mettreAJourCompteurDefi(champ) {
7870 var longueur = champ && champ.value ? champ.value.length : 0;
7871 $('#finPartieOrdinateurDefiCompteur').text(longueur+' / 120').toggleClass('is-limit',longueur>105);
7872}
7873function terminerPropositionDefi(dejaPubliee) {
7874 var $section = $('#finPartieOrdinateurDefi');
7875 var $confirmation = $('#finPartieOrdinateurDefiConfirmation');
7876 propositionDefiEnCours = false;
7877 if (dejaPubliee) {
7878 $confirmation.find('strong').text('Défi déjà publié');
7879 $confirmation.find('small').text('Cette distribution avait déjà été enregistrée. Une seconde publication a été évitée.');
7880 }
7881 $confirmation.removeAttr('hidden').hide().slideDown(250).focus();
7882 $section.attr('aria-busy','false').slideUp(350,function () {
7883 $(this).remove();
7884 });
7885}
7886function proposerDefi() {
7887 var formulaire = $$('proposerDefi');
7888 var $section = $('#finPartieOrdinateurDefi');
7889 var $titre = $('#distriTitreDefi');
7890 var titre = $.trim($titre.val());
7891 if (!formulaire || propositionDefiEnCours || $section.data('defiPublie')) return false;
7892 if (titre.length<3) {
7893 $titre.attr('aria-invalid','true').focus();
7894 $('#finPartieOrdinateurDefiStatut').text('Saisissez au moins 3 caractères pour publier.').addClass('is-error');
7895 return false;
7896 }
7897 $titre.val(titre).removeAttr('aria-invalid');
7898 $('#finPartieOrdinateurDefiStatut').removeClass('is-error');
7899 confirme('Publier ce défi ? Une seule publication sera possible.',function () {
7900 if (propositionDefiEnCours) return false;
7901 var variables = getFormString(formulaire,true);
7902 var $bouton = $('#finPartieOrdinateurDefiBouton');
7903 propositionDefiEnCours = true;
7904 $section.attr('aria-busy','true').addClass('is-submitting');
7905 $titre.prop('disabled',true);
7906 $bouton.prop('disabled',true).find('span').text('Publication en cours...');
7907 $('#finPartieOrdinateurDefiStatut').text('Enregistrement du défi...');
7908 ajax('/workers/proposerDefi.php', variables, function (txt) {
7909  txt = $.trim(txt);
7910  if (txt=='ok' || txt=='already') {
7911  $section.data('defiPublie',true);
7912  terminerPropositionDefi(txt=='already');
7913  } else {
7914  propositionDefiEnCours = false;
7915  $section.attr('aria-busy','false').removeClass('is-submitting');
7916  $titre.prop('disabled',false);
7917  $bouton.prop('disabled',false).find('span').text('Publier ce défi');
7918  $('#finPartieOrdinateurDefiStatut').text('La publication a échoué. Vous pouvez réessayer.').addClass('is-error');
7919  alerte(txt);
7920  }
7921 });
7922 return false;
7923 });
7924 return false;
7925}
7926function renameDefi(idDefi) {
7927 $('#toggleBestDefisID'+idDefi).hide();
7928 $('.toggleBestDefis'+idDefi).toggle();
7929 $('#defiRenameResult'+idDefi).show();
7930}
7931function renameDefiGO(idDefi) {
7932 $('#toggleBestDefisID'+idDefi).show();
7933 $('.toggleBestDefis'+idDefi).toggle();
7934 $('#defiRenameResult'+idDefi).hide();
7935 var nouveauNomDefi = encodeURIComponent($('#defiRenameVal'+idDefi).val());
7936 ajax('/workers/renameDefi.php', 'idDefi='+idDefi+'&newName='+nouveauNomDefi, function (txt) {
7937 eval(txt);
7938 });
7939}
7940
7941function renameDefiCancel(idDefi) {
7942 $('#toggleBestDefisID'+idDefi).show();
7943 $('.toggleBestDefis'+idDefi).toggle();
7944 $('#defiRenameResult'+idDefi).hide();
7945}
7946function showTentatives(idDefi) {
7947 var self = this;
7948 $('#toggleBestDefisID'+idDefi).hide();
7949 ajax('/workers/showTentatives.php','idDefi='+idDefi, function (res) {
7950 $('#toggleBestDefisID'+idDefi).show();
7951 $('.toggleBestDefis'+idDefi).toggle();
7952 $('#defiScoresResult'+idDefi).html(res);
7953 });
7954}
7955function hideTentatives(idDefi) {
7956 $('.toggleBestDefis'+idDefi).toggle();
7957 $('#defiScoresResult'+idDefi).html('');
7958}
7959
7960// Read-only evidence is fetched once, when the moderator expands a measure.
7961function moderationChargerSanction(element) {
7962 var details = $(element), body = details.children('.sanctionEvidence__body');
7963 if (!element.open || details.data('loaded') || details.data('loading')) return;
7964 details.data('loading',true);
7965 body.attr('aria-busy','true').text('Chargement des details...');
7966 $.ajax({url:'/workers/moderation/sanctionDetails.php',type:'GET',data:{id:details.attr('data-sanction')},dataType:'html'})
7967 .done(function(html) { body.html(html); details.data('loaded',true); })
7968 .fail(function(xhr) {
7969  body.empty().append($('<p>').text(xhr.status===403?'Acces reserve a la moderation.':(xhr.status===404?'Cette sanction est introuvable ou a ete supprimee.':'Impossible de charger les details.')));
7970  if (xhr.status!==403 && xhr.status!==404) $('<button>',{type:'button',text:'Reessayer'}).on('click',function(){moderationChargerSanction(element);}).appendTo(body);
7971 })
7972 .always(function() { details.data('loading',false); body.removeAttr('aria-busy'); });
7973}
7974
7975(function (window, document, $) {
7976 'use strict';
7977 var states = [], observer = null, scanTimer = null;
7978 var fullPageRequest = null, fullPageVersion = 0;
7979 var cacheLimit = 20, cacheLifetime = 10 * 60 * 1000;
7980
7981 function attached(state) { return document.documentElement.contains(state.root); }
7982 function abort(request) { if (request && request.readyState !== 4) request.abort(); }
7983 function current(state, version) { return attached(state) && state.version === version; }
7984 // A response contains the whole game; deal and trick selection is applied locally.
7985 function cacheKey(state) { return state.partie + ':' + state.origine; }
7986 function cached(state, key) {
7987 var entry = state.cache[key];
7988 if (entry && Date.now() - entry.time >= cacheLifetime) {
7989  delete state.cache[key];
7990  state.order = state.order.filter(function (value) { return value !== key; });
7991  return null;
7992 }
7993 return entry;
7994 }
7995 function remember(state, key, entry) {
7996 state.cache[key] = entry;
7997 state.order = state.order.filter(function (value) { return value !== key; });
7998 state.order.push(key);
7999 while (state.order.length > cacheLimit) delete state.cache[state.order.shift()];
8000 }
8001 function selectRows(state, source) {
8002 $(state.root).find('.donne-fixe__partie').each(function () {
8003  var selected = Number(this.getAttribute('data-recap-partie')) === state.partie ||
8004  (source > 0 && Number(this.getAttribute('data-recap-source')) === source);
8005  $(this).toggleClass('donne-fixe__partie--selectionnee', selected);
8006  if (selected) this.setAttribute('aria-current', 'true');
8007  else this.removeAttribute('aria-current');
8008 });
8009 }
8010 function parameters(state) {
8011 return { idPartie: state.partie, idDonneFixe: state.donne, recapManche: state.donne,
8012  recapStep: state.step, fromDefiPremium: state.origine };
8013 }
8014 function message(state, text, retry) {
8015 state.box.innerHTML = '<div class="partieRecapAsync__attente" role="status"></div>' +
8016  (retry ? '<button type="button" class="btn btn-default partieRecapAsync__charger">R&eacute;essayer</button>' : '');
8017 state.box.firstElementChild.textContent = text;
8018 }
8019 function conseils(state, version, key, entry) {
8020 var status = state.box.querySelector('.partieRecapAsync__conseils');
8021 if (!state.box.querySelector('.recapConseilSlot')) { if (status) status.textContent = ''; return; }
8022 function apply(html) {
8023  if (!current(state, version)) return;
8024  var response = document.createElement('div'); response.innerHTML = html;
8025  var content = response.querySelector('.partieRecapConseils');
8026  if (!content || Number(content.getAttribute('data-partie')) !== state.partie) throw new Error('Invalid advice');
8027  $(content).find('[data-recap-conseil]').each(function () {
8028  var slotKey = this.getAttribute('data-recap-conseil');
8029  var slot = state.box.querySelector('.recapConseilSlot[data-recap-conseil="' + slotKey + '"]');
8030  if (slot) slot.innerHTML = this.innerHTML;
8031  });
8032  if (status) status.textContent = '';
8033  entry.advice = html;
8034 }
8035 if (entry.advice) { apply(entry.advice); return; }
8036 state.advice = $.ajax({ url: '/workers/partieConseils.php', type: 'POST', dataType: 'html',
8037  data: parameters(state), timeout: 60000,
8038  success: function (html) {
8039  if (!current(state, version)) return;
8040  try { apply(html); } catch (error) { failed(); }
8041  },
8042  error: function (xhr, reason) { if (reason !== 'abort') failed(); }
8043 });
8044 function failed() {
8045  if (!current(state, version) || !status) return;
8046  status.innerHTML = 'Les conseils ne sont pas disponibles pour le moment. ' +
8047  '<button type="button" class="btn btn-default partieRecapAsync__conseils-retry">R&eacute;essayer</button>';
8048 }
8049 }
8050 function apply(state, version, key, entry) {
8051 if (!current(state, version)) return;
8052 state.box.innerHTML = entry.html;
8053 state.box.setAttribute('aria-busy', 'false');
8054 state.box.style.minHeight = '';
8055 state.loaded = true; state.loading = false; state.entry = entry; state.key = key;
8056 selectRows(state, entry.source);
8057 if (state.step === 'All' && window.showRecapToutesEtapes) window.showRecapToutesEtapes(state.root);
8058 else if (typeof window.showGameStep === 'function') window.showGameStep(state.step, state.root);
8059 if (typeof window.showRecapManche === 'function') {
8060  state.applying = true;
8061  window.showRecapManche(state.donne, state.root);
8062  var manche = state.manche || state.donne;
8063  if (!state.box.querySelector('.recapManche' + manche)) {
8064  var first = state.box.querySelector('.recvMan[data-manche]');
8065  if (first) manche = Number(first.getAttribute('data-manche'));
8066  }
8067  window.showRecapManche(manche, state.box);
8068  state.applying = false;
8069 }
8070 // Give the already usable history a chance to paint before requesting its advice.
8071 window.setTimeout(function () { if (current(state, version)) conseils(state, version, key, entry); }, 0);
8072 }
8073 function load(state) {
8074 if (!attached(state) || state.loading || state.loaded) return;
8075 var version = ++state.version, key = cacheKey(state), entry = cached(state, key);
8076 abort(state.request); abort(state.advice);
8077 if (entry) {
8078  remember(state, key, entry); // Keep recently consulted games in the cache.
8079  apply(state, version, key, entry);
8080  return;
8081 }
8082 state.loading = true; state.loaded = false;
8083 state.box.style.minHeight = Math.min(480, Math.max(160, state.box.offsetHeight)) + 'px';
8084 state.box.setAttribute('aria-busy', 'true');
8085 message(state, 'Chargement du d\u00e9roulement de la partie n\u00b0 ' + state.partie + '\u2026', false);
8086 state.request = $.ajax({ url: '/workers/partieDeroulement.php', type: 'POST', dataType: 'html',
8087  data: parameters(state), timeout: 45000,
8088  success: function (html) {
8089  if (!current(state, version)) return;
8090  var response = document.createElement('div'); response.innerHTML = html;
8091  var content = response.querySelector('.partieRecapAsync__contenu');
8092  if (!content || Number(content.getAttribute('data-partie')) !== state.partie) { failed(); return; }
8093  entry = { html: content.outerHTML, source: Number(content.getAttribute('data-source')), time: Date.now() };
8094  remember(state, key, entry); apply(state, version, key, entry);
8095  },
8096  error: function (xhr, reason) { if (reason !== 'abort') failed(xhr); }
8097 });
8098 function failed(xhr) {
8099  if (!current(state, version)) return;
8100  state.loading = false; state.box.setAttribute('aria-busy', 'false');
8101  var denied = xhr && (xhr.status === 403 || xhr.status === 404);
8102  message(state, denied ? 'Ce d\u00e9roulement n\u2019est pas disponible.' :
8103  'Le d\u00e9roulement n\u2019a pas pu \u00eatre charg\u00e9.', !denied);
8104 }
8105 }
8106 function visible(state) {
8107 if (!state.box.getClientRects().length) return false;
8108 var bounds = state.box.getBoundingClientRect();
8109 return bounds.bottom >= -240 && bounds.top <= window.innerHeight + 240;
8110 }
8111 function init() {
8112 states = states.filter(function (state) {
8113  if (attached(state)) return true;
8114  ++state.version; abort(state.request); abort(state.advice);
8115  if (observer) observer.unobserve(state.box);
8116  return false;
8117 });
8118 $('.partieRecap').each(function () {
8119  if (this._partieRecapState) return;
8120  var box = this.querySelector('.partieRecapAsync'); if (!box) return;
8121  var state = { root: this, box: box, partie: Number(this.getAttribute('data-partie')),
8122  donne: Number(this.getAttribute('data-donne')), origine: Number(this.getAttribute('data-origine-premium')),
8123  originalPartie: Number(this.getAttribute('data-partie')), originalSource: Number(this.getAttribute('data-source')),
8124  manche: Number(this.getAttribute('data-donne')), step: this.getAttribute('data-etape') || 'Init', version: 0, cache: {}, order: [], loaded: false, loading: false };
8125  this._partieRecapState = state; states.push(state);
8126  if (observer) observer.observe(box); else if (visible(state)) load(state);
8127 });
8128 }
8129 window.partieRecapChoisir = function (row, event) {
8130 var root = $(row).closest('.partieRecap')[0]; if (!root) return false;
8131 init(); var state = root._partieRecapState; if (!state) return false;
8132 if (event) { event.stopPropagation(); event.preventDefault(); }
8133 var id = Number(row.getAttribute('data-recap-partie')), donne = Number(row.getAttribute('data-recap-donne'));
8134 if (!id) return false;
8135 if (id === state.partie && donne === state.donne && (state.loaded || state.loading)) return true;
8136 ++state.version; abort(state.request); abort(state.advice);
8137 state.partie = id; state.donne = donne; state.manche = donne; state.loaded = false; state.loading = false;
8138 selectRows(state, Number(row.getAttribute('data-recap-source')));
8139 message(state, 'Partie n\u00b0 ' + id + ' s\u00e9lectionn\u00e9e. Le d\u00e9roulement se chargera \u00e0 l\u2019affichage.', true);
8140 if (cached(state, cacheKey(state)) || visible(state)) load(state);
8141 return true;
8142 };
8143 window.partieRecapNavigation = function (root, step, donne, history) {
8144 var state = root && root._partieRecapState; if (!state) return;
8145 if (step) state.step = step;
8146 if (donne === undefined) return;
8147 if (history) { state.manche = Number(donne); return; }
8148 state.donne = Number(donne);
8149 if (state.applying) return;
8150 state.manche = state.donne;
8151 if (state.loaded && state.box.querySelector('.recapManche' + state.donne)) {
8152  window.showRecapManche(state.donne, state.box);
8153  return;
8154 }
8155 // Another attempt may belong to a different series of competition deals.
8156 ++state.version; abort(state.request); abort(state.advice);
8157 state.partie = state.originalPartie; state.loaded = false; state.loading = false;
8158 selectRows(state, state.originalSource);
8159 message(state, 'Le d\u00e9roulement de cette manche se chargera \u00e0 l\u2019affichage.', true);
8160 if (cached(state, cacheKey(state)) || visible(state)) load(state);
8161 };
8162 // Legacy links outside the component also obey the last navigation requested.
8163 window.partieRecapOuvrirPage = function (params, getParams, callback) {
8164 var version = ++fullPageVersion, global = document.getElementById('global');
8165 var previous = global && global.firstChild;
8166 abort(fullPageRequest);
8167 fullPageRequest = $.ajax({ url: '/workers/partie.php' + (getParams ? '?' + getParams : ''),
8168  type: 'POST', data: params, dataType: 'html', timeout: 45000,
8169  success: function (html) {
8170  if (version === fullPageVersion && global && document.documentElement.contains(global) && global.firstChild === previous) callback(html);
8171  },
8172  error: function (xhr, reason) {
8173  if (reason !== 'abort' && version === fullPageVersion && global && global.firstChild === previous && typeof window.alerte === 'function')
8174   window.alerte('La partie n\u2019a pas pu \u00eatre charg\u00e9e. Vous pouvez r\u00e9essayer.');
8175  }
8176 });
8177 return false;
8178 };
8179 $(function () {
8180 if ('IntersectionObserver' in window) observer = new window.IntersectionObserver(function (entries) {
8181  entries.forEach(function (entry) {
8182  if (entry.isIntersecting) { var root = $(entry.target).closest('.partieRecap')[0]; if (root && root._partieRecapState) load(root._partieRecapState); }
8183  });
8184 }, { rootMargin: '240px 0px' });
8185 $(document).on('click.partieRecap', '.partieRecapAsync__charger', function () {
8186  var state = $(this).closest('.partieRecap')[0]._partieRecapState; if (state) load(state);
8187 }).on('click.partieRecap', '.partieRecapAsync__conseils-retry', function () {
8188  var state = $(this).closest('.partieRecap')[0]._partieRecapState;
8189  if (state) { this.disabled = true; conseils(state, state.version, state.key, state.entry); }
8190 });
8191 if ('MutationObserver' in window) new window.MutationObserver(function () {
8192  if (scanTimer) return;
8193  scanTimer = window.setTimeout(function () { scanTimer = null; init(); }, 20);
8194 }).observe(document.body, { childList: true, subtree: true });
8195 $(window).on('scroll.partieRecap resize.partieRecap', function () {
8196  if (!observer) states.forEach(function (state) { if (visible(state)) load(state); });
8197 });
8198 init();
8199 });
8200 window.initPartieRecap = init;
8201})(window, document, jQuery);
8202
8203(function (window, document) {
8204 'use strict';
8205
8206 var DECK_SCRIPTS = {
8207 0: '/js/imagesHR.js',
8208 1: '/js/images2HR.js',
8209 2: '/js/images3HR.js'
8210 };
8211 var expectedKeys = [];
8212 var decodedImages = {};
8213 var deckSources = {};
8214 var currentModel = null;
8215 var loadingPromise = null;
8216 var ready = false;
8217 var observerStarted = false;
8218 var cardSelector = 'img[data-tarot-card], img[data-tarot-src], img.carteRecapSmall, img.cardRecap, .duplicateComparisonCards img';
8219 var trackedCards = [], visibilityObserver = null, visibilityFrame = null;
8220 var deckVersion = 0, domDeckFailed = false, domDeckLoading = false;
8221 var visibilityMargin = 240;
8222
8223 function twoDigits(value) {
8224 return value < 10 ? '0' + value : String(value);
8225 }
8226
8227 function buildExpectedKeys() {
8228 var suit;
8229 var value;
8230 var prefixes = ['1_Coeur-', '2_Trefle-', '3_Carreau-', '4_Pique-'];
8231 for (suit = 0; suit < prefixes.length; suit++) {
8232 for (value = 1; value <= 14; value++) {
8233 expectedKeys.push(prefixes[suit] + twoDigits(value) + '.png');
8234 }
8235 }
8236 for (value = 1; value <= 21; value++) {
8237 expectedKeys.push('5_Atout-' + twoDigits(value) + '.png');
8238 }
8239 expectedKeys.push('6_Excuse.png');
8240 }
8241
8242 function normalizeName(cardName) {
8243 if (!cardName) return '';
8244 cardName = String(cardName).split('?')[0];
8245 cardName = cardName.substring(cardName.lastIndexOf('/') + 1);
8246 return cardName.replace(/\.gif$/i, '.png');
8247 }
8248
8249 function selectedModel() {
8250 var value = window.tarotCardModel;
8251 var input;
8252 if (value === undefined || value === null || value === '') {
8253 input = document.getElementById('modeleJeuCartes');
8254 value = input ? input.value : 0;
8255 }
8256 value = parseInt(value, 10);
8257 return DECK_SCRIPTS.hasOwnProperty(value) ? value : 0;
8258 }
8259
8260 function dataUrl(data, mime) {
8261 if (!data) return '';
8262 if (String(data).indexOf('data:') === 0) return String(data);
8263 return 'data:' + (mime || 'image/png') + ';base64,' + data;
8264 }
8265
8266 function loadScript(url) {
8267 return new Promise(function (resolve, reject) {
8268 var script = document.createElement('script');
8269 script.async = true;
8270 script.src = url;
8271 script.onload = function () {
8272 script.onload = script.onerror = null;
8273 resolve();
8274 };
8275 script.onerror = function () {
8276 script.onload = script.onerror = null;
8277 reject(new Error('Impossible de charger ' + url));
8278 };
8279 (document.head || document.documentElement).appendChild(script);
8280 });
8281 }
8282
8283 function validateDeck(cache) {
8284 var missing = [];
8285 var index;
8286 if (!cache || typeof cache !== 'object') {
8287 throw new Error('Le paquet de cartes est absent');
8288 }
8289 for (index = 0; index < expectedKeys.length; index++) {
8290 if (!cache[expectedKeys[index]]) missing.push(expectedKeys[index]);
8291 }
8292 if (missing.length) {
8293 throw new Error('Paquet incomplet : ' + missing.join(', '));
8294 }
8295 return true;
8296 }
8297
8298 function backSource() {
8299 if (window.dosDesCartes) return dataUrl(window.dosDesCartes, 'image/png');
8300 if (window.versoCarteHR) return dataUrl(window.versoCarteHR, 'image/png');
8301 if (window.versoCarte) return window.versoCarte;
8302 return '';
8303 }
8304
8305 function decodeImage(name, source) {
8306 return new Promise(function (resolve, reject) {
8307 var image = new Image();
8308 var finished = false;
8309 var timeout = window.setTimeout(function () {
8310 finish(new Error('Delai de decodage depasse pour ' + name));
8311 }, 20000);
8312
8313 function finish(error) {
8314 if (finished) return;
8315 finished = true;
8316 window.clearTimeout(timeout);
8317 image.onload = image.onerror = null;
8318 if (error) reject(error);
8319 else {
8320 decodedImages[name] = image;
8321 resolve(image);
8322 }
8323 }
8324
8325 image.onload = function () {
8326 if (typeof image.decode === 'function') {
8327 image.decode().then(function () { finish(); }, finish);
8328 } else finish();
8329 };
8330 image.onerror = function () {
8331 finish(new Error('Image invalide : ' + name));
8332 };
8333 image.src = source;
8334 });
8335 }
8336
8337 function decodeDeck(cache) {
8338 var jobs = [];
8339 var index;
8340 var key;
8341 decodedImages = {};
8342 deckSources = {};
8343 for (index = 0; index < expectedKeys.length; index++) {
8344 key = expectedKeys[index];
8345 deckSources[key] = dataUrl(cache[key], 'image/png');
8346 jobs.push(decodeImage(key, deckSources[key]));
8347 }
8348 deckSources.Verso = backSource();
8349 if (!deckSources.Verso) throw new Error('Verso de cartes absent');
8350 jobs.push(decodeImage('Verso', deckSources.Verso));
8351 return Promise.all(jobs);
8352 }
8353
8354 function versionedUrl(url) {
8355 var version = window.tarotCardAssetsVersion || window.codeVersion || '1';
8356 return url + '?v=' + encodeURIComponent(version);
8357 }
8358
8359 function loadDeck(model, options) {
8360 var requestedModel = parseInt(model, 10);
8361 var latestBack;
8362 options = options || {};
8363 if (!DECK_SCRIPTS.hasOwnProperty(requestedModel)) requestedModel = 0;
8364 if (ready && currentModel === requestedModel) {
8365 latestBack = backSource();
8366 if (latestBack && latestBack !== deckSources.Verso) {
8367 deckSources.Verso = latestBack;
8368 return decodeImage('Verso',latestBack).then(function () {
8369 deckVersion++; refreshVisibleCards();
8370 return api;
8371 });
8372 }
8373 return Promise.resolve(api);
8374 }
8375 if (loadingPromise && currentModel === requestedModel) return loadingPromise;
8376
8377 currentModel = requestedModel;
8378 ready = false;
8379 domDeckFailed = false;
8380 loadingPromise = loadScript(versionedUrl(DECK_SCRIPTS[requestedModel]))
8381 .then(function () {
8382 validateDeck(window.cacheCarteHR);
8383 return decodeDeck(window.cacheCarteHR);
8384 })
8385 .then(function () {
8386 ready = true;
8387 deckVersion++;
8388 refreshVisibleCards();
8389 return api;
8390 })
8391 .catch(function (error) {
8392 loadingPromise = null;
8393 ready = false;
8394 domDeckFailed = true;
8395 refreshVisibleCards();
8396 if (options.allowLowResolution && window.cacheCarte) {
8397 throw new Error('Le paquet basse resolution ne remplace pas un paquet Phaser complet');
8398 }
8399 throw error;
8400 });
8401 return loadingPromise;
8402 }
8403
8404 function getSrc(cardName) {
8405 var key = normalizeName(cardName);
8406 if (key === 'Verso.png' || key === 'Verso') key = 'Verso';
8407 return deckSources[key] || '';
8408 }
8409
8410 function getImage(cardName) {
8411 var key = normalizeName(cardName);
8412 if (key === 'Verso.png' || key === 'Verso') key = 'Verso';
8413 return decodedImages[key] || null;
8414 }
8415
8416 function cardNameFromImage(image) {
8417 var explicit = image.getAttribute('data-tarot-card');
8418 var src;
8419 var match;
8420 if (explicit) return normalizeName(explicit);
8421 src = image.getAttribute('src') || '';
8422 match = src.match(/([1-5]_(?:Coeur|Trefle|Carreau|Pique|Atout)-\d{2}|6_Excuse)\.(?:gif|png)(?:\?|$)/i);
8423 return match ? normalizeName(match[1] + '.png') : '';
8424 }
8425
8426 function attached(image) {
8427 return document.documentElement.contains(image);
8428 }
8429
8430 function nearViewport(image) {
8431 if (!attached(image) || !image.getClientRects().length) return false;
8432 var rect = image.getBoundingClientRect();
8433 return rect.bottom >= -visibilityMargin && rect.top <= window.innerHeight + visibilityMargin &&
8434 rect.right >= -visibilityMargin && rect.left <= window.innerWidth + visibilityMargin;
8435 }
8436
8437 function setCardSource(card, source, version) {
8438 if (!source || card.version === version) return;
8439 // Compare a small version number, never thousands of large base64 strings.
8440 card.image.src = source;
8441 card.version = version;
8442 }
8443
8444 function prepareVisibleCard(card) {
8445 if (!card.near || !attached(card.image)) return;
8446 if (card.source) {
8447 setCardSource(card, card.source, 0);
8448 } else if (ready) {
8449 setCardSource(card, getSrc(card.key) || card.fallback, deckVersion);
8450 } else if (window.tarotCardAssetsEnabled === false || domDeckFailed) {
8451 setCardSource(card, card.fallback, 0);
8452 } else {
8453 // A visible low-resolution card stays usable while its HD deck downloads.
8454 setCardSource(card, card.fallback, 0);
8455 if (!domDeckLoading) {
8456 domDeckLoading = true;
8457 loadSelectedDeck().then(function () {
8458 domDeckLoading = false;
8459 }, function () {
8460 // loadDeck already restores only the visible fallback images.
8461 domDeckLoading = false;
8462 });
8463 }
8464 }
8465 }
8466
8467 function refreshVisibleCards() {
8468 for (var index = 0; index < trackedCards.length; index++) {
8469 var card = trackedCards[index];
8470 if (card.near) prepareVisibleCard(card);
8471 }
8472 }
8473
8474 function checkVisibility() {
8475 visibilityFrame = null;
8476 for (var index = 0; index < trackedCards.length; index++) {
8477 var card = trackedCards[index];
8478 card.near = nearViewport(card.image);
8479 if (card.near) prepareVisibleCard(card);
8480 }
8481 }
8482
8483 function scheduleVisibilityCheck() {
8484 if (visibilityFrame !== null) return;
8485 visibilityFrame = window.requestAnimationFrame ? window.requestAnimationFrame(checkVisibility) : window.setTimeout(checkVisibility, 30);
8486 }
8487
8488 function registerCard(image) {
8489 // Playing cards are owned by the game engines, which preload their entire deck.
8490 if ((' ' + image.className + ' ').indexOf(' cardJeu ') !== -1) return;
8491 var source = image.getAttribute('data-tarot-src');
8492 if (!source && image.getAttribute('data-tarot-static') === '1') return;
8493 var card = image._tarotLazyCard;
8494 if (card && card.tracked) return;
8495 if (!card) {
8496 var key = cardNameFromImage(image);
8497 if (!source && !key) return;
8498 card = {image: image, key: key, source: source,
8499 fallback: image.getAttribute('data-tarot-fallback') || image.getAttribute('src') || '',
8500 version: -1, near: false, tracked: false};
8501 image._tarotLazyCard = card;
8502 image.setAttribute('decoding', 'async');
8503 }
8504 card.tracked = true;
8505 trackedCards.push(card);
8506 if (visibilityObserver) visibilityObserver.observe(image);
8507 else scheduleVisibilityCheck();
8508 }
8509
8510 function hydrate(root) {
8511 if (!root || !root.querySelectorAll) return;
8512 var matches = root.matches || root.msMatchesSelector;
8513 if (matches && matches.call(root, cardSelector)) registerCard(root);
8514 var images = root.querySelectorAll(cardSelector);
8515 for (var index = 0; index < images.length; index++) registerCard(images[index]);
8516 }
8517
8518 function forgetRemovedCards() {
8519 trackedCards = trackedCards.filter(function (card) {
8520 if (attached(card.image)) return true;
8521 if (visibilityObserver) visibilityObserver.unobserve(card.image);
8522 card.tracked = false; card.near = false;
8523 return false;
8524 });
8525 }
8526
8527 function observe() {
8528 if (observerStarted) return;
8529 observerStarted = true;
8530 if (window.IntersectionObserver) {
8531 visibilityObserver = new window.IntersectionObserver(function (entries) {
8532 for (var index = 0; index < entries.length; index++) {
8533 var entry = entries[index], card = entry.target._tarotLazyCard;
8534 if (!card || !card.tracked) continue;
8535 card.near = entry.isIntersecting && entry.boundingClientRect.width > 0 && entry.boundingClientRect.height > 0;
8536 if (card.near) prepareVisibleCard(card);
8537 }
8538 }, {rootMargin: visibilityMargin + 'px', threshold: 0});
8539 } else {
8540 document.addEventListener('scroll', scheduleVisibilityCheck, true);
8541 window.addEventListener('resize', scheduleVisibilityCheck);
8542 document.addEventListener('toggle', scheduleVisibilityCheck, true);
8543 }
8544 if (window.MutationObserver) new window.MutationObserver(function (mutations) {
8545 var roots = [], removed = false;
8546 for (var index = 0; index < mutations.length; index++) {
8547 var mutation = mutations[index];
8548 if (mutation.removedNodes && mutation.removedNodes.length) removed = true;
8549 for (var added = 0; mutation.addedNodes && added < mutation.addedNodes.length; added++) {
8550 var node = mutation.addedNodes[added];
8551 if (node.nodeType === 1 && attached(node) && roots.indexOf(node) === -1) roots.push(node);
8552 }
8553 }
8554 if (removed) forgetRemovedCards();
8555 // Only scan new subtrees, once, instead of each mutation's complete parent.
8556 for (var root = 0; root < roots.length; root++) {
8557 var nested = false;
8558 for (var parent = 0; parent < roots.length; parent++) {
8559 if (root !== parent && roots[parent].contains(roots[root])) { nested = true; break; }
8560 }
8561 if (!nested) hydrate(roots[root]);
8562 }
8563 if (!visibilityObserver) scheduleVisibilityCheck();
8564 }).observe(document.documentElement, visibilityObserver ? {childList: true, subtree: true} :
8565 {childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'style', 'hidden', 'open']});
8566 hydrate(document);
8567 }
8568
8569 function loadSelectedDeck() {
8570 return loadDeck(selectedModel());
8571 }
8572
8573 buildExpectedKeys();
8574 var api = {
8575 loadDeck: loadDeck,
8576 loadSelectedDeck: loadSelectedDeck,
8577 getSelectedModel: selectedModel,
8578 getSrc: getSrc,
8579 getImage: getImage,
8580 getBackSrc: function () { return deckSources.Verso || backSource(); },
8581 getExpectedKeys: function () { return expectedKeys.slice(0); },
8582 hydrate: hydrate,
8583 isReady: function () { return ready; },
8584 ready: function () { return loadSelectedDeck(); }
8585 };
8586
8587 window.TarotCards = api;
8588 observe();
8589}(window, document));
8590
8591(function (window, document, $) {
8592 'use strict';
8593
8594 var selector = 'img.canvasAvatarJS,img.classementAvatarJS';
8595 var fallbackAvatar = '/avatars/Unknown.jpg';
8596
8597 function buildMedals(types, playerId) {
8598 var medals = [];
8599 if (!types) return medals;
8600 if (typeof types === 'string') types = types.split('|');
8601 for (var i = 0; i < types.length && medals.length < 3; i++) {
8602  var type = types[i];
8603  if (!type) continue;
8604  if (type === 'FFT')
8605  medals.push('FFT');
8606  else
8607  medals.push(type + '&resizeToHeight=44&idJoueur=' + (playerId || 0));
8608 }
8609 return medals;
8610 }
8611
8612 function drawClassementDetail(baseImageSrc, detail, callback) {
8613 if (!detail) {
8614  callback(baseImageSrc);
8615  return;
8616 }
8617
8618 var baseImage = new Image();
8619 baseImage.onload = function () {
8620  var canvas = document.createElement('canvas');
8621  var context = canvas.getContext('2d');
8622  canvas.width = 291;
8623  canvas.height = 226;
8624  context.drawImage(baseImage, 0, 0, canvas.width, canvas.height);
8625  context.font = '21px quicksandregular';
8626  context.textAlign = 'center';
8627  context.textBaseline = 'alphabetic';
8628  context.fillStyle = '#000000';
8629  context.fillText(detail, canvas.width / 2, 210);
8630  context.fillStyle = '#ffffff';
8631  context.fillText(detail, canvas.width / 2, 211);
8632  callback(canvas.toDataURL('image/png'));
8633 };
8634 baseImage.onerror = function () {
8635  callback(baseImageSrc);
8636 };
8637 baseImage.src = baseImageSrc;
8638 }
8639
8640 function createCanvasAvatar(image) {
8641 if (!image || image.getAttribute('data-avatar-started') === '1') return;
8642 image.setAttribute('data-avatar-started', '1');
8643
8644 var avatar = image.getAttribute('data-avatar') || fallbackAvatar;
8645 var displayFallback = image.getAttribute('data-fallback-src') || fallbackAvatar;
8646 var pseudo = image.getAttribute('data-pseudo') || '';
8647 var score = image.getAttribute('data-score') || '';
8648 var annonceText = image.getAttribute('data-annonce-text');
8649 if (annonceText === null) annonceText = image.getAttribute('data-detail') || '';
8650 var annonce = parseInt(image.getAttribute('data-annonce'), 10);
8651 if (isNaN(annonce)) annonce = 5;
8652 var connected = parseInt(image.getAttribute('data-connected'), 10);
8653 if (isNaN(connected)) connected = 2;
8654 var playerId = parseInt(image.getAttribute('data-player-id'), 10) || 0;
8655 var noMedals = image.getAttribute('data-no-medals') === '1';
8656 var detailAtBottom = image.getAttribute('data-detail-bottom') === '1' ||
8657  (' ' + image.className + ' ').indexOf(' classementAvatarJS ') !== -1;
8658 var medals = noMedals ? [] : buildMedals(image.getAttribute('data-medal-types'), playerId);
8659 var createAvatarText = detailAtBottom ? '' : annonceText;
8660 var isTourDeJeu = image.getAttribute('data-is-turn') === '1';
8661 var isDonneur = image.getAttribute('data-is-dealer') === '1';
8662 var appelC = image.getAttribute('data-appel-c') || 0;
8663 var appelN = image.getAttribute('data-appel-n') || 0;
8664
8665 var finished = false;
8666 var timeout = window.setTimeout(function () {
8667  if (!finished && (!image.src || image.naturalWidth === 0)) image.src = displayFallback;
8668 }, 15000);
8669
8670 image.onerror = function () {
8671  if (image.src.indexOf(displayFallback) === -1) image.src = displayFallback;
8672 };
8673
8674 var renderAvatar = function () {
8675  createAvatar(function (baseImageSrc) {
8676  finished = true;
8677  window.clearTimeout(timeout);
8678  drawClassementDetail(baseImageSrc, detailAtBottom ? annonceText : '', function (finalImageSrc) {
8679   image.src = finalImageSrc;
8680   if ((' ' + image.className + ' ').indexOf(' canvasAvatarReady ') === -1)
8681   image.className += ' canvasAvatarReady';
8682  });
8683  }, avatar, medals, annonce, score, pseudo, createAvatarText, connected,
8684  isTourDeJeu, isDonneur, appelC, appelN, noMedals ? 1 : 0);
8685 };
8686
8687 if (image.getAttribute('data-fallback-src')) {
8688  var avatarProbe = new Image();
8689  avatarProbe.onload = renderAvatar;
8690  avatarProbe.onerror = function () {
8691  finished = true;
8692  window.clearTimeout(timeout);
8693  image.src = displayFallback;
8694  };
8695  avatarProbe.src = avatar;
8696 } else {
8697  renderAvatar();
8698 }
8699 }
8700
8701 function startClassementAvatars(root) {
8702 if (typeof createAvatar !== 'function') return;
8703 var container = root && root.querySelectorAll ? root : document;
8704 var images = container.querySelectorAll(selector);
8705 if (container.nodeType === 1) {
8706  var matches = container.matches || container.msMatchesSelector || container.webkitMatchesSelector;
8707  if (matches && matches.call(container, selector)) createCanvasAvatar(container);
8708 }
8709 for (var i = 0; i < images.length; i++) createCanvasAvatar(images[i]);
8710 }
8711
8712 window.initCanvasAvatars = function (root) {
8713 if (typeof ldWebfont === 'function') {
8714  var started = false;
8715  var startOnce = function () {
8716  if (started) return;
8717  started = true;
8718  startClassementAvatars(root);
8719  };
8720  ldWebfont(startOnce);
8721  window.setTimeout(startOnce, 3000);
8722 } else {
8723  startClassementAvatars(root);
8724 }
8725 };
8726
8727 window.initClassementAvatars = window.initCanvasAvatars;
8728 window.buildCanvasAvatarMedals = buildMedals;
8729
8730 $(function () {
8731 window.initCanvasAvatars(document);
8732 var Observer = window.MutationObserver || window.WebKitMutationObserver;
8733 if (Observer && document.body) {
8734  var scheduled = false;
8735  var observer = new Observer(function (mutations) {
8736  if (scheduled) return;
8737  var foundAvatar = false;
8738  for (var i = 0; i < mutations.length && !foundAvatar; i++) {
8739   for (var j = 0; j < mutations[i].addedNodes.length; j++) {
8740   var node = mutations[i].addedNodes[j];
8741   if (node.nodeType !== 1) continue;
8742   var matches = node.matches || node.msMatchesSelector || node.webkitMatchesSelector;
8743   if ((matches && matches.call(node, selector)) ||
8744    (node.querySelector && node.querySelector(selector))) {
8745    foundAvatar = true;
8746    break;
8747   }
8748   }
8749  }
8750  if (!foundAvatar) return;
8751  scheduled = true;
8752  window.setTimeout(function () {
8753   scheduled = false;
8754   window.initCanvasAvatars(document);
8755  }, 0);
8756  });
8757  observer.observe(document.body, {childList: true, subtree: true});
8758 }
8759 });
8760}(window, document, window.jQuery));
8761
8762(function () {
8763 function initScrollToTopButton() {
8764 if (document.getElementById('scrollToTopButton')) return;
8765
8766 var button = document.createElement('button');
8767 button.id = 'scrollToTopButton';
8768 button.className = 'scrollToTopButton';
8769 button.type = 'button';
8770 button.title = 'Retour en haut';
8771 button.setAttribute('aria-label', 'Retour en haut de la page');
8772 button.setAttribute('aria-hidden', 'true');
8773 button.tabIndex = -1;
8774 button.innerHTML = '<svg class="scrollToTopButton__icon" aria-hidden="true" viewBox="0 0 24 24" focusable="false"><path d="M4.5 15.5 12 8l7.5 7.5"/></svg>';
8775 document.body.appendChild(button);
8776
8777 function updateButtonVisibility() {
8778  var scrollTop = window.pageYOffset
8779  || document.documentElement.scrollTop
8780  || document.body.scrollTop
8781  || 0;
8782  var viewportHeight = window.innerHeight
8783  || document.documentElement.clientHeight
8784  || 0;
8785  var isVisible = scrollTop > viewportHeight;
8786
8787  button.className = isVisible
8788  ? 'scrollToTopButton is-visible'
8789  : 'scrollToTopButton';
8790  button.setAttribute('aria-hidden', isVisible ? 'false' : 'true');
8791  button.tabIndex = isVisible ? 0 : -1;
8792 }
8793
8794 button.addEventListener('click', function () {
8795  var reducedMotion = window.tarotReducedMotionEnabled === true
8796  || (window.matchMedia
8797   && window.matchMedia('(prefers-reduced-motion: reduce)').matches);
8798
8799  button.blur();
8800  if (!reducedMotion && 'scrollBehavior' in document.documentElement.style) {
8801  window.scrollTo({ top: 0, behavior: 'smooth' });
8802  } else if (!reducedMotion && window.jQuery) {
8803  window.jQuery('html, body').stop(true).animate({ scrollTop: 0 }, 350);
8804  } else {
8805  window.scrollTo(0, 0);
8806  }
8807 });
8808
8809 window.addEventListener('scroll', updateButtonVisibility, { passive: true });
8810 window.addEventListener('resize', updateButtonVisibility);
8811 updateButtonVisibility();
8812 }
8813
8814 if (document.readyState === 'loading') {
8815 document.addEventListener('DOMContentLoaded', initScrollToTopButton);
8816 } else {
8817 initScrollToTopButton();
8818 }
8819})();
8820
8821
8822function Joueur(posTable,pseudo,isIA) // Constructor
8823{
8824 this.posTable = posTable;
8825 this.pseudo = pseudo;
8826 this.isIA = isIA;
8827 this.cartePosee = '';
8828 this.ecart = '';
8829 this.levees = '';
8830 this.lastouverture = '';
8831 this.nbCartesAff = 0;
8832 this.score = 0;
8833 this.poignee = 0;
8834}
8835
8836Joueur.prototype.setCartes = function(cartes)
8837{
8838 return this.cartes = cartes;
8839};
8840
8841
8842
8843function Partie() // Constructor
8844{
8845 this.joueurs = [];
8846 this.joueurs.push(new Joueur(0,'Vous',false));
8847 this.joueurs.push(new Joueur(1,'IA 1',true));
8848 this.joueurs.push(new Joueur(2,'IA 2',true));
8849 this.joueurs.push(new Joueur(3,'IA 3',true));
8850 /*for (var i=0;i<$nbJPa;i++)
8851 this.joueurs.push(new Joueur(i));
8852 this.joueurs[0].isIA = false;
8853 this.joueurs[1].isIA = true;
8854 this.joueurs[2].isIA = true;
8855 this.joueurs[3].isIA = true;*/
8856 this.nbCartesJouees = 0;
8857 this.typeTour = '';
8858}
8859
8860Partie.prototype.setCartes = function(cartes)
8861{
8862 return this.cartes = cartes;
8863};
8864
8865
8866function twoDigits ($d)
8867{
8868 if ((''+$d).length==1)
8869 return "0"+$d;
8870 else
8871 return $d;
8872}
8873function createCardPile() {
8874 var $cartes = [];
8875 for ($i=1;$i<15;$i++)
8876 $cartes.push("2_Trefle-"+twoDigits($i)+".gif");
8877 for ($i=1;$i<15;$i++)
8878 $cartes.push("4_Pique-"+twoDigits($i)+".gif");
8879 for ($i=1;$i<15;$i++)
8880 $cartes.push("1_Coeur-"+twoDigits($i)+".gif");
8881 for ($i=1;$i<15;$i++)
8882 $cartes.push("3_Carreau-"+twoDigits($i)+".gif");
8883 for ($i=1;$i<22;$i++)
8884 $cartes.push("5_Atout-"+twoDigits($i)+".gif");
8885 $cartes.push("6_Excuse.gif");
8886 return $cartes;
8887}
8888function mainPetitSec($main) {
8889 var $niAtoutNiExcuse = true;
8890 var $petitPresent = false;
8891 for ($i=0;$i<$cartesParJ;$i++) {
8892 var $carte = $main[$i];
8893 if ($carte[0]=="5" ) { //echo "atout";
8894 if ($carte=="5_Atout-01.gif") $petitPresent = true;
8895 else $niAtoutNiExcuse = false;
8896 }
8897 if ($carte=="6_Excuse.gif") $niAtoutNiExcuse = false;
8898 }
8899 return $petitPresent && $niAtoutNiExcuse;
8900}
8901function mainPetitSecJeu($jeu) {
8902
8903 
8904 for ($i=0;$i<$nbJPa;$i++)
8905 {
8906 $jeuTmp = $jeu.slice($i*$cartesParJ,$i*$cartesParJ+$cartesParJ);
8907 if (mainPetitSec($jeuTmp)) return true;
8908 }
8909 return false;
8910}
8911function shuffleArray(array) {
8912 for (var i = array.length - 1; i > 0; i--) {
8913 var j = Math.floor(Math.random() * (i + 1));
8914 var temp = array[i];
8915 array[i] = array[j];
8916 array[j] = temp;
8917 }
8918 return array;
8919}
8920
8921function getCardNameOL($card)
8922{
8923 // 2_Trefle-04.jpg
8924 //6_Excuse.gif
8925 var $cardType = $card[0];
8926 var $cardNum = getCardNumero($card);
8927
8928 var $arrM = [];
8929 var $arrC = [];
8930 $arrM[11] = "un valet";
8931 $arrM[12] = "un cavalier";
8932 $arrM[13] = "une dame"; 
8933 $arrM[14] = "un roi"; 
8934 $arrC[1]="coeur";
8935 $arrC[2]="trèfle";
8936 $arrC[3]="carreau";
8937 $arrC[4]="pique";
8938 
8939 if ( $cardType==6 )
8940 return "l'excuse";
8941 if ( $cardType==5 && $cardNum==1 )
8942 return "le petit"; 
8943 else if ( $cardType==5 )
8944 return "le "+parseInt($cardNum)+" d'atout"; 
8945 else if ( $cardNum==1)
8946 return "un as de "+$arrC[$cardType];
8947 else if ( $cardNum>10)
8948 return $arrM[$cardNum]+" de "+$arrC[$cardType];
8949 else
8950 return "un "+parseInt($cardNum)+" de "+$arrC[$cardType];
8951}
8952
8953
8954function getCardNumero($c)
8955{
8956 if ($c=='') return 0;
8957 if ($c==undefined) return 0;
8958 if ($c[0]=="6") return 0;
8959 var $tabNumCarte = $c.split('-');
8960 if ($tabNumCarte[1]==undefined) return 0;
8961 $tabNumCarte = $tabNumCarte[1];
8962 $tabNumCarte = $tabNumCarte.split('.gif');
8963 $tabNumCarte = $tabNumCarte[0];
8964 return parseInt($tabNumCarte);
8965}
8966
8967function getPointsCarte($carte)
8968{
8969 var pts;
8970 if ($carte=="") return 0;
8971 // Une compensation de l'Excuse vaut une carte de 0,5 point.
8972 if ($carte=="**") return 0.5;
8973 $ty = parseInt($carte[0]);
8974 $numCa = getCardNumero($carte);
8975 
8976 if ( $ty==5 && ($numCa==1 || $numCa==21) ) $pts=4.5;
8977 else if ( $ty==5) $pts=0.5;
8978 else if ( $ty<5 && $numCa<11) $pts = 0.5;
8979 else if ($ty==6) $pts=4.5;
8980 else if ( $ty<5 && $numCa==11) $pts = 1.5;
8981 else if ( $ty<5 && $numCa==12) $pts = 2.5;
8982 else if ( $ty<5 && $numCa==13) $pts = 3.5;
8983 else if ( $ty<5 && $numCa==14) $pts = 4.5;
8984 return $pts;
8985}
8986function getPointsCarteChelem($carte)
8987{
8988 var pts;
8989 if ($carte=="") return 0;
8990 // Une compensation de l'Excuse vaut une carte de 0,5 point.
8991 if ($carte=="**") return 0.5;
8992 $ty = parseInt($carte[0]);
8993 $numCa = getCardNumero($carte);
8994 
8995 if ( $ty==5 && ($numCa==1 || $numCa==21) ) $pts=4.5;
8996 else if ( $ty==5) $pts=0.5;
8997 else if ( $ty<5 && $numCa<11) $pts = 0.5;
8998 else if ($ty==6) $pts=0;
8999 else if ( $ty<5 && $numCa==11) $pts = 1.5;
9000 else if ( $ty<5 && $numCa==12) $pts = 2.5;
9001 else if ( $ty<5 && $numCa==13) $pts = 3.5;
9002 else if ( $ty<5 && $numCa==14) $pts = 4.5;
9003 return $pts;
9004}
9005function getPointsCarteAnnonce2($carte)
9006{
9007 var pts;
9008 if ($carte=="") return 0;
9009 $ty = parseInt($carte[0]);
9010 $numCa = getCardNumero($carte);
9011 
9012 if ( $ty==5 && $numCa==21 ) $pts=10;
9013 else if ( $ty==5 && $numCa==20 ) $pts=5;
9014 else if ( $ty==5 && $numCa==19 ) $pts=4.5;
9015 else if ( $ty==5 && $numCa==18 ) $pts=3.5;
9016 else if ( $ty==5 && $numCa>15 ) $pts=4;
9017 else if ( $ty==5 && $numCa==1 ) $pts=0;
9018 else if ( $ty==5) $pts=2;
9019 else if ( $ty<5 && $numCa<11) $pts = 0;
9020 else if ($ty==6) $pts=7;
9021 else if ( $ty<5 && $numCa==11) $pts = 1;
9022 else if ( $ty<5 && $numCa==12) $pts = 2;
9023 else if ( $ty<5 && $numCa==13) $pts = 3;
9024 else if ( $ty<5 && $numCa==14) $pts = 6;
9025 return $pts;
9026}
9027function getPoigneePrime($numCartesP)
9028{
9029 switch ($numCartesP)
9030 {
9031 //case 5: return 20;
9032 case 10: return 20;
9033 case 13: return 30;
9034 case 15: return 40;
9035 }
9036 return 0;
9037} 
9038function canIPlayCard($carte,$disposeCouleur,$disposeMeilleurAtout,$disposeAtout,$meilleurAtoutPose) {
9039
9040 $cardN = getCardNumero($carte);
9041 if (($carte[0]==partie.typeTour && partie.typeTour!=5) ||
9042 partie.posTable==0 || 
9043 ($carte[0]=="5" && partie.typeTour=="5" && (!$disposeMeilleurAtout || $cardN>$meilleurAtoutPose ) ) ||
9044 ($carte[0]=="5" && !$disposeCouleur && (!$disposeMeilleurAtout || $cardN>$meilleurAtoutPose )) ||
9045 ($carte[0]=="6") ||
9046 (!$disposeAtout && !$disposeCouleur) ||
9047 (!$disposeAtout && partie.typeTour==5) ||
9048 partie.typeTour==6 )
9049 return true;
9050 else return false;
9051}
9052
9053function getPointsCarteIA($carte)
9054{
9055 var $pts = 0;
9056 if ($carte=="") return 0;
9057 $ty = parseInt($carte[0]);
9058 $numCa = getCardNumero($carte);
9059 if ( $ty==5 && ($numCa==1 ) ) $pts=5;
9060 //else if ( $ty==5 && $numCa==21 ) $pts=0.4;
9061 else if ( $ty==5) $pts=0.5;
9062 else if ( $ty<5 && $numCa<11) $pts = 0.5;
9063 else if ($ty==6) $pts=4.5;
9064 else if ( $ty<5 && $numCa==11) $pts = 1.5;
9065 else if ( $ty<5 && $numCa==12) $pts = 2.5;
9066 else if ( $ty<5 && $numCa==13) $pts = 3.5;
9067 else if ( $ty<5 && $numCa==14) $pts = 4.5;
9068 return $pts;
9069}   
9070function trouveCarteRemplacementExcuse ($jeu)
9071{
9072 //$tab = explode("|",$jeu);
9073 var $minPts = 99;
9074 var $res = "";
9075 for (var $i in $jeu)
9076 {
9077 var $ptsCa = getPointsCarte($jeu[$i]);
9078 if ($ptsCa<$minPts)
9079 {
9080  $minPts = $ptsCa;
9081  $res = $jeu[$i];
9082 }
9083 }
9084 return $res;
9085} 
9086
9087function getIAChoixAnnonce($jeu,$annonceCourante)
9088{
9089 //$annoncesMinPoints = array(40,56,71,81);
9090 var $scoJ = 0;
9091
9092 var $nbreAtouts = 0;
9093 var $disposePetit = false;
9094 //$coupesFranche = array(1=>true,2=>true,3=>true,4=>true);
9095 var $disposeRoi = [false,false,false,false,false];//array(1=>false,2=>false,3=>false,4=>false);
9096 var $disposeDame = [false,false,false,false,false];//array(1=>false,2=>false,3=>false,4=>false);
9097 var $nbCartesCouleur = [0,0,0,0,0,0];//array(1=>0,2=>0,3=>0,4=>0);
9098 var $atoutsPossedes = [];
9099 
9100 for (var $n in $jeu )
9101 {
9102 var $carte = $jeu[$n];
9103 var $pts = getPointsCarteAnnonce2($carte);
9104 $scoJ+=$pts;
9105 var typeC = parseInt($carte[0]);
9106 if ( typeC<5) {
9107 $nbCartesCouleur[typeC]++;
9108 if (getCardNumero($carte)==14)
9109 $disposeRoi[typeC] = true;
9110 if (getCardNumero($carte)==13)
9111 $disposeDame[typeC] = true;
9112 }
9113 if ( typeC=="5") {
9114 $nbreAtouts++;
9115 var $numAtout = getCardNumero($carte);
9116 $atoutsPossedes[$numAtout] = 1;
9117 if ($numAtout==1)
9118 $disposePetit = true;
9119 }
9120 }
9121 if ($disposePetit) {
9122 if ($nbreAtouts>=8)
9123 $scoJ+=8;
9124 if ($nbreAtouts==7)
9125 $scoJ+=7;
9126 if ($nbreAtouts==6)
9127 $scoJ+=6;
9128 }
9129 var $compteLongue = false;
9130 for ($i=1;$i<5;$i++) {
9131 if ($disposeRoi[$i] && $disposeDame[$i]) {
9132 $scoJ+=1;
9133 }
9134 if ($nbCartesCouleur[$i]==0) {
9135 $scoJ+=5;
9136 }
9137 if ($nbCartesCouleur[$i]==1) {
9138 $scoJ+=3;
9139 }
9140 if ($nbCartesCouleur[$i]==2) {
9141 $scoJ+=1;
9142 }
9143 if ($nbCartesCouleur[$i]>4 && !$compteLongue) {
9144 $scoJ+=5+($nbCartesCouleur[$i]-5)*2;
9145 $compteLongue = true;
9146 }
9147 }
9148 if ($nbreAtouts<=5) return 0;
9149 //$annoncesMinPoints = array(40,56,71,81);
9150 var $resuu = 0;
9151 if ($scoJ>=43)
9152 $resuu = 1;
9153 if ($scoJ>=54)
9154 $resuu = 2;
9155 if ($scoJ>=67)
9156 $resuu = 3;
9157 if ($scoJ>=78)
9158 $resuu = 4;
9159 if ($resuu>$annonceCourante) return $resuu;
9160 return 0;
9161}
9162
9163
9164 
9165function refreeshCartesChienOffline()
9166{  
9167 for (key in cartesChien) {
9168 if (cartesChien[key] && cartesChien.hasOwnProperty(key) && typeof cartesChien[key].id!='undefined') 
9169 {       
9170  if ($$(cartesChien[key].id)==null) 
9171  {
9172  cartesChien = new Array ();
9173  refreshChienMsgOffline();
9174  return;
9175  }               
9176 }
9177 }
9178 for (key in cartesChien) {
9179 if (cartesChien[key] && typeof cartesChien[key].id!='undefined') {
9180 if (cartesChien.hasOwnProperty(key) ) 
9181  carteSelectionnee(cartesChien[key].id); 
9182 else
9183  carteSelectionnable(cartesChien[key].id);
9184 }
9185 }
9186 refreshChienMsgOffline();
9187 
9188}
9189function refreeshCartesPoigneeOffline()
9190{  
9191 for (key in cartesPoignee) {
9192 if (cartesPoignee.hasOwnProperty(key) && typeof cartesPoignee[key].id!='undefined') 
9193 {       
9194  if ($$(cartesPoignee[key].id)==null) 
9195  {
9196  cartesPoignee = new Array ();
9197  refreshPoigneeMsgOffline(); 
9198  return;
9199  }               
9200 }
9201 }
9202 for (key in cartesPoignee) {
9203 if (cartesPoignee[key] && typeof cartesPoignee[key].id!='undefined') {
9204 if (cartesPoignee.hasOwnProperty(key)) 
9205  carteSelectionnee(cartesPoignee[key].id); 
9206 else
9207  carteSelectionnable(cartesPoignee[key].id); 
9208 }
9209 }
9210 refreshPoigneeMsgOffline();
9211 
9212}
9213var poigneeInit = -1;
9214function initCartesPoigneeOffline (manche) 
9215{
9216 if (manche>poigneeInit)
9217 {
9218 poigneeInit = manche; 
9219 return true;
9220 }
9221 return false;
9222}
9223function refreshChienMsgOffline()
9224{ 
9225 var nbCartesChien = 6;
9226 if (nombreDeJPartie==5) nbCartesChien=3;
9227 var chienCSize = mySizeOf(cartesChien);
9228 
9229 if (chienCSize==nbCartesChien) setMessage('Constitution de l\'écart : ecart valide');
9230 else if (chienCSize>nbCartesChien) setMessage('Constitution de l\'écart : '+(chienCSize-nbCartesChien)+' carte'+((chienCSize-nbCartesChien)!=1?"s":"")+' en trop');
9231 else if (chienCSize==0) setMessage('Sélectionnez les cartes qui composeront l\'écart');
9232 else setMessage('Constitution de l\'écart : Encore '+(nbCartesChien-chienCSize)+' carte'+((nbCartesChien-chienCSize)!=1?"s":"") );
9233 
9234 var key;  
9235 
9236 if ( chienCSize==nbCartesChien)
9237 {
9238 var size = '';
9239 for (key in cartesChien)
9240 {       
9241  if (cartesChien[key] && cartesChien.hasOwnProperty(key)) 
9242  {
9243  if (typeof cartesChien[key].id!='undefined') { 
9244  size+='|'+getCardName(cartesChien[key]); 
9245  } 
9246  }
9247 } 
9248 size=size.substr(1);
9249
9250 if ( !selMoteur.actionExists('Valider l\'écart') ) {
9251  //clearActions();     
9252  selMoteur.clearActions(true);
9253  selMoteur.addAction('Valider l\'écart','valideChienOffline(\''+size+'\');','btn-success');
9254  if (!isChelem)
9255  selMoteur.addAction('Chelem','chelemOffline();','btn-danger',true);
9256 }
9257 }
9258 else
9259 {
9260 selMoteur.clearActions();
9261 }
9262}
9263function refreshPoigneeMsgOffline()
9264{ 
9265 var nbCartesPoignee1 = 10;
9266 var nbCartesPoignee2 = 13;
9267 var nbCartesPoignee3 = 15;
9268 var key; 
9269 /*if (nombreDeJPartie==5) {
9270 nbCartesPoignee1 = 8;
9271 nbCartesPoignee2 = 10;
9272 nbCartesPoignee3 = 13;
9273 }*/
9274 var excuseInPoignee = false;
9275 for (key in cartesPoignee) {
9276 if (cartesPoignee[key] && cartesPoignee.hasOwnProperty(key))
9277 {
9278  if (getCardName(cartesPoignee[key])== '6_Excuse.gif') 
9279  excuseInPoignee = true;
9280 }
9281 }
9282 if (excuseInPoignee )
9283 {   
9284 var cnt = selMoteur.getCards();
9285 for (key in cnt) {
9286  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' && getCardName(cnt[key]).substr(0,1)=='5' && !cartesPoignee.hasOwnProperty(getCardName(cnt[key])) )
9287  {
9288  if ( !selMoteur.actionExists( 'Ne pas annoncer de poignée') || selMoteur.actionExists( 'Valider la poignée') ) {
9289  //clearActions();     
9290  selMoteur.clearActions(true);
9291  setMessage('Annonce de poignée invalide');
9292  selMoteur.addAction('Ne pas annoncer de poignée','validePoigneeOffline(\'\');','btn-success',true);
9293  return;
9294  }
9295  }
9296 }
9297 }
9298 var poigneeSize = mySizeOf(cartesPoignee);
9299 if (poigneeSize==nbCartesPoignee1 || poigneeSize==nbCartesPoignee2 || poigneeSize==nbCartesPoignee3) 
9300 setMessage('Annonce de poignée valide');
9301 else if (poigneeSize>nbCartesPoignee1) setMessage('Annonce de poignée invalide');
9302 else if (poigneeSize==0) setMessage('Vous avez la possibilite d\'annoncer une poignée');
9303 else setMessage('Minimum '+nbCartesPoignee1+' cartes : encore '+(nbCartesPoignee1-poigneeSize)+' carte'+((nbCartesPoignee1-poigneeSize)!=1?"s":"") );
9304 
9305 
9306 if ( poigneeSize==nbCartesPoignee1 || poigneeSize==nbCartesPoignee2 || poigneeSize==nbCartesPoignee3)
9307 {
9308 var size = '';
9309 for (key in cartesPoignee) {
9310  if (cartesPoignee[key] && cartesPoignee.hasOwnProperty(key))
9311  {
9312  if (typeof cartesPoignee[key].id!='undefined') { 
9313  size+='|'+getCardName(cartesPoignee[key]);
9314  }
9315  }
9316 }
9317 size=size.substr(1); 
9318 if ( !selMoteur.actionExists('Valider la poignée')) {//$$('infosJeu').innerHTML.indexOf( 'Valider la poignée</a>')==-1) {     
9319 selMoteur.clearActions(true);
9320 selMoteur.addAction('Ne pas annoncer de poignée','validePoigneeOffline(\'\');','btn-warning',true);
9321 selMoteur.addAction('Valider la poignée','validePoigneeOffline(\''+size+'\');','btn-success');
9322 }
9323 }
9324 //else if ( $$('infosJeu').innerHTML.indexOf( 'Ne pas annoncer de poignée</a>')==-1 || $$('infosJeu').innerHTML.indexOf( 'Valider la poignée</a>')!==-1) 
9325 else if ( !selMoteur.actionExists('Ne pas annoncer de poignée') || selMoteur.actionExists('Valider la poignée') ) 
9326 {          
9327 selMoteur.clearActions(true);
9328 selMoteur.addAction('Ne pas annoncer de poignée','validePoigneeOffline(\'\');','btn-success',true);
9329 }
9330}
9331 
9332function carteChienSelectOffline (obj)
9333{
9334 //clearSounds();
9335 if (!cardActionsActivated) return; 
9336 
9337 if (obj==null) 
9338 {
9339 $.log('Erreur carte chien select obj is null');
9340 return;
9341 }    
9342 var name = getCardName(obj);
9343 if (name.substr(0,1)=='5')
9344 {   
9345 var cnt = selMoteur.getCards();
9346 for (key in cnt) {
9347  if (cnt[key] && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' 
9348  && parseInt(cnt[key].style.top)!=0 
9349  && getCardName(cnt[key]).substr(0,1)!='5' && getCardName(cnt[key]).substr(0,1)!='6' && getCardName(cnt[key]).indexOf("-14.gif")==-1 && !cartesChien.hasOwnProperty(getCardName(cnt[key])) )
9350  {
9351  alert('Vous ne pouvez sélectionner un atout que s\'il ne reste plus d\'autres cartes à sélectionner.');
9352  return;
9353  }
9354 }
9355 }
9356
9357 lastMO = obj;  
9358 
9359 if (!cartesChien.hasOwnProperty(name))//obj.style.top==0 || obj.style.top=='0px')
9360 {
9361 carteSelectionnee(obj.id); 
9362 cartesChien[name] = obj;
9363 }
9364 else
9365 {
9366 carteSelectionnable(obj.id); 
9367 delete cartesChien[name];
9368 }    
9369 refreshChienMsgOffline();    
9370}
9371 
9372function cartePoigneeSelectOffline (obj)
9373{
9374 //clearSounds();
9375 if (!cardActionsActivated) return; 
9376 if (!obj) return;
9377 
9378 var name = getCardName(obj);
9379 if (name=='6_Excuse.gif')
9380 {   
9381 var cnt = selMoteur.getCards();
9382 for (key in cnt) {
9383  if (cnt[key] && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' && getCardName(cnt[key]).substr(0,1)=='5' && !cartesPoignee.hasOwnProperty(getCardName(cnt[key])) )
9384  {
9385  alert('Vous ne pouvez sélectionner l\'excuse que s\'il ne reste plus d\'atouts à sélectionner.');
9386  return;
9387  }
9388 }
9389 }
9390
9391 lastMO = obj;    
9392 if (!cartesPoignee.hasOwnProperty(name))
9393 { 
9394 carteSelectionnee(obj.id);        
9395 cartesPoignee[name] = obj;
9396 }
9397 else
9398 {
9399 carteSelectionnable(obj.id);        
9400 delete cartesPoignee[name];
9401 }    
9402 refreshPoigneeMsgOffline(); 
9403} 
9404
9405
9406function quitOffline()
9407{ 
9408 confirme('ATTENTION : Voulez-vous vraiment quitter la partie ?',function () {
9409 window.onunload = window.onbeforeunload = null;
9410 document.location = '/Fin-de-partie.php?modeJeu=Offline'; 
9411 });
9412}
9413
9414
9415
9416
9417
9418
9419var $cartesParJ = 18;
9420var $cartesChien = 6;
9421var $nbJPa = 4;
9422var partie;
9423var tourDe;
9424
9425
9426function startCPUOfflineGame() {
9427 privateStart();
9428
9429 isOffLineGame = true;
9430 clearTimeout(CBLadocarteca);
9431 resDownloaded = true;
9432 llog('startCPUOfflineGame HighRes has been downloaded');
9433
9434 partie = new Partie();
9435 playMusic();
9436 selMoteur.initEngine(function () {
9437
9438 llog('startCPUOfflineGame engine init end');
9439 whoami(0);
9440 setNoMedals();
9441 showGameBoard('CPU',0,'4',null,false);
9442 //return;
9443 disableMask(0);
9444 showBackground('blancCasse.png');
9445 //enableChat();
9446 window.onunload = closeBrowser;
9447 
9448 selMoteur.setUtilisateur(0,'Vous','/images/Avatars/Avatar-01.jpg','',true,'0','0','-99');
9449 selMoteur.setUtilisateur(1,'IA 1','/images/IAs/IA-7.jpg','',1,'0','0','-1');
9450 selMoteur.setUtilisateur(2,'IA 2','/images/IAs/IA-5.jpg','',1,'0','0','-1');
9451 selMoteur.setUtilisateur(3,'IA 3','/images/IAs/IA-4.jpg','',1,'0','0','-1');
9452 setEtape('Attente');
9453 partie.donneur = Math.floor(Math.random()*4);
9454 partie.main = (partie.donneur+1)%4;
9455 selMoteur.setDonneurPos(partie.donneur);
9456 partie.annonce = 0;
9457 partie.etape = 'Annonces';
9458 partie.posTable = 0;
9459 selMoteur.setPreneur (-1);
9460
9461
9462 distributionOffline();
9463 setTimeout(gameStepAnnonce,2500);
9464 });
9465 //gameStepAnnonce();
9466
9467
9468 
9469}
9470
9471
9472function distributionOffline() {
9473 var $cartes = createCardPile();//.reverse();
9474
9475 var $cff=0; 
9476 do {
9477 $cff++;
9478 $cartes = shuffleArray($cartes); 
9479 } while (mainPetitSecJeu($cartes) && $cff<20);
9480 
9481 for ($i=0;$i<4;$i++)
9482 {
9483 var jeuTmp = $cartes.slice($i*$cartesParJ,$i*$cartesParJ+$cartesParJ);
9484 partie.joueurs[$i].main = jeuTmp;
9485 } 
9486 var $jeuChien = $cartes.slice($nbJPa*$cartesParJ,$nbJPa*$cartesParJ+$cartesChien);
9487 partie.chien = $jeuChien;
9488
9489 selMoteur.clearCards();
9490 for (var i=0;i<$cartesParJ;i++) {
9491 selMoteur.addCard(partie.joueurs[0].main[i]);
9492 }
9493 reorganiseCartes();
9494}
9495
9496
9497var $phrasesAnnonces = [];
9498$phrasesAnnonces[1]="prise";
9499$phrasesAnnonces[2]="garde";
9500$phrasesAnnonces[3]="garde sans";
9501$phrasesAnnonces[4]="garde contre";
9502
9503/*var $phrasesAnnoncesArt = [];
9504$phrasesAnnoncesArt[1]="une prise";
9505$phrasesAnnoncesArt[2]="une garde";
9506$phrasesAnnoncesArt[3]="une garde sans";
9507$phrasesAnnoncesArt[4]="une garde contre";*/
9508
9509function gameStepAnnonce() {
9510
9511 tourDe = (partie.main+partie.posTable)%$nbJPa;
9512 selMoteur.setTurn(tourDe);
9513 if ( partie.joueurs[tourDe].isIA) {
9514 
9515 var IAchoice = getIAChoixAnnonce(partie.joueurs[tourDe].main,partie.annonce);
9516 choixAnnonceOffline(IAchoice,$phrasesAnnonces[IAchoice]);
9517 /*setPrise (tourDe,'Passe');
9518 showMessage('IA '+tourDe+' passe');*/
9519 //clearTO();
9520 } else {
9521
9522 selMoteur.clearActions();
9523 selMoteur.addAction('Passe','choixAnnonceOffline(0,\'Passe\');','btn-success');
9524 if (partie.annonce<1) selMoteur.addAction('Prise','choixAnnonceOffline(1,\'Prise\');','btn-warning');
9525 if (partie.annonce<2) selMoteur.addAction('Garde','choixAnnonceOffline(2,\'Garde\');','btn-warning');
9526 if (partie.annonce<3) selMoteur.addAction('Garde sans','choixAnnonceOffline(3,\'Garde sans\');','btn-danger');
9527 if (partie.annonce<4) selMoteur.addAction('Garde contre','choixAnnonceOffline(4,\'Garde contre\');','btn-danger');
9528 selMoteur.addAction('Chelem','chelemOffline();','btn-danger');
9529 selMoteur.addAction('Redistribuer','redistribuerCPUOffline();','btn-info');
9530 selMoteur.setTurn(0);
9531 showMessage('Faites votre annonce');
9532 }
9533}
9534
9535function redistribuerCPUOffline() {
9536 showMessage("Re-distribution...");
9537 selMoteur.afficheCartes(JSON.stringify(partie["chien"]),"Cartes qui étaient dans le chien");
9538
9539 setTimeout(function () {
9540
9541 for (var ff = 0;ff<4;ff++)
9542 selMoteur.setPrise (ff,'');
9543 selMoteur.hideInfoJeu();
9544 selMoteur.clearCards();
9545 distributionOffline();
9546 partie.annonce = 0;
9547 partie.preneur = -1;
9548 partie.posTable = 0;
9549 partie.donneur = (partie.donneur+1)%4;
9550 partie.main = (partie.donneur+1)%4;
9551 selMoteur.setDonneurPos(partie.donneur);
9552 newRound();
9553 setTimeout(gameStepAnnonce,1000);
9554 },2000);
9555}
9556
9557function choixAnnonceOffline($call,nom) {
9558 var $partie = partie;
9559 selMoteur.clearActions();
9560 if ($call>partie.annonce) {
9561 partie.annonce = $call;
9562 partie.preneur = tourDe;
9563 if (partie.chelem) {
9564 selMoteur.setPrise (tourDe,nom+' + Chelem');
9565 if (tourDe==0)
9566 showMessage('Vous annoncez une '+nom+' + chelem');
9567 else
9568 showMessage(partie.joueurs[tourDe].pseudo+' annonce une '+nom+' + chelem');
9569 
9570 } else {
9571 selMoteur.setPrise (tourDe,nom);
9572 if (tourDe==0)
9573 showMessage('Vous annoncez une '+nom);
9574 else
9575 showMessage(partie.joueurs[tourDe].pseudo+' annonce une '+nom);
9576 
9577 }
9578 } else {
9579 if (tourDe==0)
9580 partie.chelem = 0;
9581 selMoteur.setPrise (tourDe,'Passe');
9582 if (tourDe==0)
9583 showMessage('Vous passez');
9584 else
9585 showMessage(partie.joueurs[tourDe].pseudo+' passe');
9586 }
9587
9588 if ( partie.posTable+1==$nbJPa || $call==4 ) {
9589 if (partie.annonce==0) {
9590
9591 showMessage("Aucune annonce : re-distribution...");
9592 selMoteur.afficheCartes(JSON.stringify(partie["chien"]),"Cartes qui étaient dans le chien");
9593
9594 
9595 setTimeout(function () {
9596 for (var ff = 0;ff<4;ff++)
9597 selMoteur.setPrise (ff,'');
9598 if ($$('infosJeuInfo'))
9599 $$('infosJeuInfo').innerHTML = '';
9600 distributionOffline();
9601 partie.posTable = 0;
9602 partie.donneur = (partie.donneur+1)%4;
9603 partie.main = (partie.donneur+1)%4;
9604 selMoteur.setDonneurPos(partie.donneur);
9605 newRound();
9606 setTimeout(gameStepAnnonce,1000);
9607 },3000);
9608 } else {
9609
9610 setTimeout(function () {
9611 selMoteur.setPreneur (partie.preneur,partie.annonce,partie.chelem);
9612 for (var $i=0;$i<4;$i++)
9613 {
9614 var $joueurPartie = partie.joueurs[$i];
9615 // AJOUTER LE CHIEN DANS LA MAIN DU PRENEUR
9616 if ($partie["annonce"]==4 && $i==(partie.preneur+1)%$nbJPa)
9617 {
9618 $triMain = $joueurPartie["main"];
9619 partie.joueurs[$i].ecart = $partie["chien"].join('|');
9620 }
9621 else if ($partie["annonce"]==3 && $i==partie.preneur)
9622 {
9623 $triMain = $joueurPartie["main"];
9624 partie.joueurs[$i].ecart = $partie["chien"].join('|');
9625 }
9626 else if ($partie["annonce"]<3 && $i==partie.preneur)
9627 $triMain = ($joueurPartie["main"].join('|')+'|'+partie["chien"].join('|')).split('|');//explode("|",$joueurPartie["main"]."|".$partie["chien"]);
9628 else {
9629 $triMain = $joueurPartie["main"];
9630 }
9631 $triMain.sort();
9632 partie.joueurs[$i].main = $triMain;
9633 }
9634
9635 if ($partie["annonce"]<3)
9636 {
9637 if (partie.preneur==0)
9638 selMoteur.afficheCartes(JSON.stringify($partie["chien"]),"Ce chien intègre votre jeu");
9639 else
9640 selMoteur.afficheCartes(JSON.stringify($partie["chien"]),"Ce chien intègre le jeu de "+partie.joueurs[partie.preneur].pseudo);
9641 }
9642 
9643 partie.joueurs[0].main.sort();
9644 selMoteur.clearCards();
9645 for (var i=0;i<partie.joueurs[0].main.length;i++) {
9646 selMoteur.addCard(partie.joueurs[0].main[i]);
9647 }
9648 reorganiseCartes();
9649 
9650 partie.etape = 'Jeu';
9651 partie.posTable = 0;
9652 
9653 if ($partie["annonce"]<3) {
9654
9655 if (partie.preneur==0)
9656 setTimeout(gameStepChien,500);
9657 else
9658 setTimeout(gameStepChien,2500);
9659 } else {
9660
9661 selMoteur.clearCards();
9662 for (var i=0;i<$cartesParJ;i++) {
9663 selMoteur.addCard(partie.joueurs[0].main[i]);
9664 }
9665 reorganiseCartes();
9666 
9667 if (partie.preneur==0)
9668 setTimeout(gameStepJeu,700);
9669 else
9670 setTimeout(gameStepJeu,2500);
9671 }
9672 
9673 },1500);
9674 }
9675 } else {
9676
9677 partie.posTable++;
9678 setTimeout(gameStepAnnonce,1000);
9679 }
9680}
9681function gameStepChien() {
9682 tourDe = partie.preneur;
9683 selMoteur.setTurn(tourDe);
9684 if ( partie.joueurs[tourDe].isIA) {
9685
9686
9687 
9688 
9689 
9690 var $cartesChien = partie.chien;
9691 var $nbCouleurEnMain = [0,0,0,0,0,0,0,0];
9692 var $chienjaipetit = false;
9693 var $cartesChienIAResult = [];
9694 var $IAcartesChienIA = partie.joueurs[tourDe].main;
9695 var $listeCartesTombees = [[],[],[],[],[],[],[],[]];
9696 
9697 for (var $ib=0;$ib<$cartesChien.length;$ib++)
9698 {
9699
9700  for (var $i in $IAcartesChienIA)
9701  { 
9702  var $carte = $IAcartesChienIA[$i];
9703  var typeC = parseInt($carte[0]);
9704  $listeCartesTombees[typeC][getCardNumero($carte)] = 2; 
9705  $nbCouleurEnMain[typeC]++; 
9706  if (getCardNumero($carte)==1 && typeC==5)
9707   $chienjaipetit = true;
9708  }
9709      
9710  var $meilleurScoreIAChien = -99999; 
9711  var $meilleurScoreIAChienCarte = "";
9712
9713  for (var $i in $IAcartesChienIA)
9714  { 
9715  var $carte = $IAcartesChienIA[$i];
9716  
9717  var $scoreCarteActuelle = 0; 
9718  var typeC = parseInt($carte[0]);
9719  
9720  if ((typeC>
97204 || getCardNumero($carte)!="14") && $carte!="5_Atout-21.gif" && $carte!="5_Atout-01.gif" && $carte!="6_Excuse.gif") 
9721  {
9722   //$typeCJJ = intval(substr($carte,0,1));       
9723   if (typeC=="5") $scoreCarteActuelle -= 5000;
9724   if (typeC=="5" && getCardNumero($carte)==1) $scoreCarteActuelle -= 5000;
9725   if (typeC=="6") $scoreCarteActuelle -= 7000;
9726   
9727   if (typeC!=5) {
9728   $carteMaitresse = true;
9729   for (var $g=getCardNumero($carte)+1;$g<15;$g++) {
9730    if ($listeCartesTombees[typeC][$g]!=2)
9731    $carteMaitresse = false;
9732   }
9733   } else
9734   $carteMaitresse = false;
9735   
9736   if ($chienjaipetit) { // si j'ai le petit, coupes franches au max
9737   if (getPointsCarte($carte)!=5) {
9738   if ($carteMaitresse)
9739   $scoreCarteActuelle -= 400;
9740   else
9741   $scoreCarteActuelle += (6-getPointsCarte( $carte ))*2;
9742   
9743   $scoreCarteActuelle += (20-getCardNumero( $carte ));
9744   }
9745   $scoreCarteActuelle += (14-$nbCouleurEnMain[typeC])*20;
9746   } else if ($nbCouleurEnMain[5]>5) { // fort en atouts, coupe franche, equilibrage
9747   if (getPointsCarte($carte)!=5) {
9748   if ($carteMaitresse)
9749   $scoreCarteActuelle -= 400;
9750   else
9751   $scoreCarteActuelle += 3*getPointsCarte( $carte );
9752   $scoreCarteActuelle += (20-getCardNumero( $carte ));
9753   }
9754   if ($nbCouleurEnMain[typeC]<=$cartesChien-$ib)
9755   $scoreCarteActuelle += (14-$nbCouleurEnMain[typeC])*20*2;
9756   else
9757   $scoreCarteActuelle += ($nbCouleurEnMain[typeC])*20;
9758   } else {
9759   if (getPointsCarte($carte)!=5) {
9760   if ($carteMaitresse)
9761   $scoreCarteActuelle -= 400;
9762   else
9763   $scoreCarteActuelle += 3*getPointsCarte( $carte );
9764   $scoreCarteActuelle += (20-getCardNumero( $carte ));
9765   }
9766   $scoreCarteActuelle += ($nbCouleurEnMain[typeC])*20;
9767   }
9768   
9769   if ($scoreCarteActuelle>$meilleurScoreIAChien) 
9770   {
9771   $meilleurScoreIAChien = $scoreCarteActuelle;
9772   $meilleurScoreIAChienCarte = $carte;
9773   }
9774  }
9775  } 
9776  $cartesChienIAResult.push($meilleurScoreIAChienCarte);
9777     
9778  var $cartesChienIA = [];
9779  for (var $i in $IAcartesChienIA)
9780  { 
9781  var $carte = $IAcartesChienIA[$i]; 
9782  if ($carte!=$meilleurScoreIAChienCarte)
9783   $cartesChienIA.push( $carte );
9784  }
9785  $IAcartesChienIA = $cartesChienIA;
9786 }
9787 var $chien = $cartesChienIAResult.join('|');//implode( "|", $cartesChienIAResult); 
9788 
9789 valideChienOffline($chien);
9790 
9791
9792
9793 } else {
9794 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
9795 {
9796 var $carte = partie.joueurs[tourDe].main[$i];
9797 if (($carte[0]>4 || getCardNumero($carte)!="14") && $carte!="5_Atout-21.gif" && $carte!="5_Atout-01.gif" && $carte!="6_Excuse.gif" )
9798 {
9799 selMoteur.setCardAction($carte,'carteChienSelectOffline(this);');
9800 }
9801 else
9802 {
9803 selMoteur.setCardAction($carte,'');
9804 }
9805 }
9806 activateCardActions(true);
9807 refreeshCartesChienOffline();
9808 showMessage('Faites votre écart');
9809 }
9810}
9811function valideChienOffline($chien)
9812{  
9813 selMoteur.clearActions();
9814 selMoteur.clearCards ();
9815
9816 
9817 var $newMain = [];
9818 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
9819 {
9820 var $carte = partie.joueurs[tourDe].main[$i];
9821 if ($chien.indexOf($carte)==-1 && $carte!="")
9822 {
9823  $newMain.push($carte);
9824 }
9825 }
9826 
9827 if (partie["annonce"]<=2 ) {
9828 partie.joueurs[tourDe].main = $newMain;
9829 selMoteur.clearCards();
9830 for (var i=0;i<$cartesParJ;i++) {
9831 selMoteur.addCard(partie.joueurs[0].main[i]);
9832 }
9833 reorganiseCartes();
9834 }
9835 
9836 /* si jamais il y a des atouts dans l ecart */
9837 var $tabChien = $chien.split("|");
9838 var $cartesChienAmontrer = [];
9839 for (var $c in $tabChien)
9840 {
9841 var $carteChien = $tabChien[$c];
9842 if ($carteChien[0]==5)
9843 {
9844  $cartesChienAmontrer.push($carteChien);
9845 }
9846 }
9847 if ($cartesChienAmontrer.length>0)
9848 {
9849 if (tourDe!=0)
9850 selMoteur.afficheCartes(JSON.stringify($cartesChienAmontrer),partie.joueurs[tourDe].pseudo+" place les atouts suivants dans son écart");
9851 //afficheLesCartes($cartesChienAmontrer,partie.joueurs[tourDe].pseudo+" place les atouts suivants dans son écart :" ); 
9852 }
9853
9854 
9855 if (partie["annonce"]<3) {
9856 partie.joueurs[tourDe].ecart = $chien;
9857 //partie.ecart = $chien;
9858 }
9859 partie.posTable = 0;
9860 selMoteur.clearActions();
9861 activateCardActions(false);
9862 
9863 
9864 setTimeout(gameStepJeu,500); 
9865}
9866function validePoigneeOffline($poignee)
9867{       
9868 clearTO () ;
9869 selMoteur.clearActions();
9870
9871 var $nbAtoutsTT = 0;
9872 var $presExcuse = false;
9873 for (var $i in partie.joueurs[tourDe].main)
9874 {
9875 var $carte = partie.joueurs[tourDe].main[$i];
9876 if ($carte[0]==5)
9877  $nbAtoutsTT++;
9878 }
9879 var $tabPoignee = $poignee.split("|");
9880 for (var $ff in $tabPoignee ) {
9881 var $carte = $tabPoignee[$ff];
9882 if ($carte[0]==6)
9883  $presExcuse = true;
9884 }
9885 if ($presExcuse && $nbAtoutsTT+1!=$tabPoignee.length ) {
9886 alert('Invalide');
9887 $poignee="";
9888 }
9889 for (var $ff in $tabPoignee ) {
9890 var $carte = $tabPoignee[$ff];
9891 if ( $carte[0]!="5" && $carte[0]!="6" && $carte!="") {
9892 alert('Invalide2');
9893 $poignee="";
9894 }
9895 }
9896 if ($poignee=="")
9897 partie.joueurs[tourDe].poignee = -1;
9898 else
9899 {
9900 selMoteur.afficheCartes(JSON.stringify($tabPoignee),"Vous annoncez une poignée de "+$tabPoignee.length+" atouts");
9901 partie.joueurs[tourDe].poignee = $tabPoignee.length;
9902 }
9903 selMoteur.clearCardsActions (); 
9904 //rpc('poignee='+poignee);
9905 setTimeout(gameStepJeu,1000); 
9906}
9907function chelemOffline() {
9908 confirme('Etes-vous sûr de vouloir annoncer un chelem ?',function () {
9909 partie.chelem = 1;
9910 selMoteur.removeAction('Chelem');
9911 if (partie.annonce) {
9912 selMoteur.setPrise (tourDe,$phrasesAnnonces[partie.annonce]+' + chelem');
9913  partie.main = partie.preneur;
9914 } else {
9915 selMoteur.setPrise (tourDe,'Chelem');
9916 }
9917 
9918 if (tourDe==0)
9919  showMessage("Vous annoncez un chelem !");
9920 else
9921 showMessage(partie.joueurs[tourDe].pseudo+" annonce un chelem !");
9922 });
9923}
9924function joueCarteJou($joueCarte) {
9925 tourDe = (partie.main+partie.posTable)%$nbJPa;
9926
9927 if (tourDe==0) {
9928 joueCarte($joueCarte);
9929 }
9930}
9931function clearCardsActionsClick(except) {
9932 console.log('clearcardaction');
9933 
9934 selMoteur.timeThatRemains(-1,0);
9935 selMoteur.clearCardsActions ();
9936 selMoteur.clearMasques();
9937 return;
9938}
9939function joueCarte($joueCarte) {
9940 var $partie = partie;
9941
9942 tourDe = (partie.main+partie.posTable)%$nbJPa;
9943 
9944 /*if (partie.joueurs[tourDe].isIA)
9945 showMessage(partie.joueurs[tourDe].pseudo+' joue '+getCardNameOL($joueCarte));
9946 else*/
9947 if (!partie.joueurs[tourDe].isIA)
9948 showMessage('Vous jouez '+getCardNameOL($joueCarte));
9949
9950 if (!partie.joueurs[tourDe].isIA)
9951 console.log('joue carte',getCardNameOL($joueCarte));
9952 
9953 selMoteur.clearActions();
9954 clearCardsActionsClick ();
9955 
9956 surLeTapis($joueCarte , tourDe); 
9957 
9958 if ( partie.posTable==0 || partie.typeTour==6)
9959 {
9960 partie.typeTour = $joueCarte[0];
9961 }
9962 if ($partie["posTable"]==0)
9963 partie.joueurs[tourDe].lastouverture = $joueCarte;
9964 
9965 partie.joueurs[tourDe].cartePosee = $joueCarte;
9966 partie.joueurs[tourDe].nbCartesAff++;
9967 partie.nbCartesJouees++;
9968 
9969 
9970 var delCardPos = -1;
9971 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
9972 {
9973 var $carte = partie.joueurs[tourDe].main[$i];
9974 if ($joueCarte==$carte)
9975 delCardPos = $i;
9976 }
9977 if (delCardPos==-1) {
9978 alert('bug');
9979 }
9980 delete partie.joueurs[tourDe].main[delCardPos];
9981 
9982 if (partie.posTable<3) {
9983
9984 partie.posTable++;
9985 //setTurn((($partie["main"]+$partie["posTable"])%$nbJPa));
9986 setTimeout(gameStepJeu,500);
9987 } else {
9988 var $prenneurPli = 0;
9989 var $prenneurPliAvec = '';
9990 
9991 var $levees = []; 
9992 var $leveesReel = []; 
9993 var $tourPetit = false; 
9994 
9995 for (var $c in partie.joueurs)
9996 {
9997 var $joueurPartie = partie.joueurs[$c];
9998 $typeCJ = $joueurPartie["cartePosee"][0];
9999 $leveesReel.push($joueurPartie["cartePosee"]);
10000 
10001 if ( $joueurPartie["cartePosee"]=="5_Atout-01.gif" ) $tourPetit = true; 
10002  
10003 if ( $joueurPartie["cartePosee"]=="6_Excuse.gif" )
10004 {
10005  if ($partie["nbCartesJouees"]+$nbJPa<$cartesParJ*$nbJPa)
10006  {        
10007  if ($joueurPartie["levees"]=="")
10008  {
10009   $joueurPartie["levees"] ='6_Excuse.gif';
10010   $carteRemplacement = "**";
10011   showMessage("L'excuse revient à "+$joueurPartie["pseudo"]);  
10012  }
10013  else
10014  {
10015   $carteRemplacement = trouveCarteRemplacementExcuse( $joueurPartie["levees"].split('|'));
10016   $joueurPartie["levees"] =$joueurPartie["levees"].replace($carteRemplacement,"6_Excuse.gif");//str_replace($carteRemplacement,"6_Excuse.gif",$joueurPartie["levees"]);
10017   showMessage("L'excuse revient à "+$joueurPartie["pseudo"]+" en échange de "+getCardNameOL($carteRemplacement)); 
10018  }                
10019  partie.joueurs[$c].levees = $joueurPartie["levees"]; 
10020  partie.joueurs[$c].cartePosee = $carteRemplacement;
10021  //$joueurPartie["cartePosee"]=$carteRemplacement;
10022  }
10023  else
10024  { 
10025  var $isChelemAttaqueOk = true;
10026  var $isChelemDefenseOk = true;
10027
10028  for (var $c2 in partie.joueurs)// as $c2 => $j2)
10029  {
10030  var $j2 = partie.joueurs[$c2];
10031  if ($j2.posTable!=$partie.preneur && $j2["levees"].split('|').length>3 ) {
10032  $isChelemAttaqueOk = false;
10033  }
10034  if ($j2.posTable==$partie['preneur'] && $j2["levees"].split('|').length>3 ) {
10035  $isChelemDefenseOk = false;
10036  }
10037  }
10038  if ( ($joueurPartie['posTable']==$partie['preneur'] || $joueurPartie['posTable']==$partie['idEquipier']) && $isChelemAttaqueOk) {
10039  } else if ( ($joueurPartie['posTable']!=$partie['preneur'] && $joueurPartie['posTable']!=$partie['idEquipier']) && $isChelemDefenseOk) {
10040  } else {
10041  showMessage("L'excuse jouee au dernier tour est perdue..."); 
10042  } 
10043  }
10044 }
10045 $levees.push($joueurPartie["cartePosee"]);
10046       
10047 var $joueurCoupe = ($partie["typeTour"]<5 && $typeCJ==5 );
10048 if ($joueurCoupe && parseInt($partie["typeTour"])!=0 )
10049  partie.joueurs[$c][ "coupe"+$partie["typeTour"]]= 1;
10050  
10051 if ( $typeCJ==6 && $partie["nbCartesJouees"]+$nbJPa>=$cartesParJ*$nbJPa && 
10052  ($joueurPartie['posTable']!=$partie['preneur'] && $joueurPartie['posTable']!=$partie['idEquipier']) && $isChelemDefenseOk ) {
10053  $prenneurPli = $joueurPartie["posTable"];
10054  $prenneurPliAvec = $joueurPartie["cartePosee"];
10055  
10056 } else if ( $typeCJ==6 && $partie["nbCartesJouees"]+$nbJPa>=$cartesParJ*$nbJPa && 
10057  ($joueurPartie['posTable']==$partie['preneur'] || $joueurPartie['posTable']==$partie['idEquipier']) && $isChelemAttaqueOk ) {
10058
10059  $prenneurPli = $joueurPartie["posTable"];
10060  $prenneurPliAvec = $joueurPartie["cartePosee"];
10061  
10062 } else if ( $joueurPartie["cartePosee"]>$prenneurPliAvec && ($typeCJ==$partie["typeTour"] || $typeCJ==5) && $typeCJ!=6 )
10063 {
10064  $prenneurPli = $joueurPartie["posTable"];
10065  $prenneurPliAvec = $joueurPartie["cartePosee"];
10066 }
10067
10068 } 
10069 if ($tourPetit) $preneurPetit = $prenneurPli;
10070
10071 partie.posTable=0;
10072 partie.main=$prenneurPli;
10073 partie.typeTour = '';
10074
10075 /*$partieEnCours->setDataVal( "nbCartesJouees", "++"); 
10076 $partieEnCours->setDataVal( "main", $prenneurPli);
10077 $partieEnCours->setDataVal( "typeTour", ''); */
10078
10079 if (partie.joueurs[$prenneurPli]["levees"]=="6_Excuse.gif")
10080 {
10081 // si le joueur a un tour d'avant a recupere l excuse mais na vias pas de cartes a echanger, on rattrappe le coup
10082 $carteRemplacement = trouveCarteRemplacementExcuse($levees); 
10083 partie.joueurs[$prenneurPli].levees = $levees.join('|').replace($carteRemplacement,"6_Excuse.gif" );
10084 for (var $c in partie.joueurs)
10085 {
10086  if (partie.joueurs[$c].levees.indexOf('**')!=-1)
10087  {
10088  partie.joueurs[$c].levees = partie.joueurs[$c].levees.replace("**",$carteRemplacement);
10089  }
10090 }
10091 }
10092 else if (partie.joueurs[$prenneurPli]["levees"]=="")
10093 partie.joueurs[$prenneurPli].levees = $levees.join('|');
10094 else
10095 partie.joueurs[$prenneurPli].levees += '|'+$levees.join('|');
10096 
10097 for ( var $i in partie.joueurs)
10098 partie.joueurs[$i].cartePosee = ''; 
10099 
10100 var $finTxt = "";
10101 if ($prenneurPli==0) {
10102 if ($tourPetit && $partie["nbCartesJouees"]+1>=$cartesParJ*$nbJPa)
10103  $finTxt = "Vous remportez le petit au bout ! ";
10104 else
10105  $finTxt = "Vous remportez le pli"; 
10106 
10107 } else {
10108 if ($tourPetit && $partie["nbCartesJouees"]+1>=$cartesParJ*$nbJPa)
10109  $finTxt = partie.joueurs[$prenneurPli]["pseudo"]+" remporte le petit au bout ! ";
10110 else
10111  $finTxt = partie.joueurs[$prenneurPli]["pseudo"]+" remporte le pli"; 
10112 
10113 }
10114 
10115 showMessage($finTxt);       
10116 selMoteur.clearActions();
10117
10118 
10119 setTimeout(function () {
10120
10121 selMoteur.ramassePoignee($prenneurPli);
10122 setTimeout(function () {
10123 selMoteur.afficheCartes(JSON.stringify($leveesReel),$finTxt);
10124 },1000);
10125 
10126 if ( $partie["nbCartesJouees"]+1<$cartesParJ*$nbJPa)
10127 { 
10128 selMoteur.setTurn($prenneurPli); 
10129 if ($prenneurPli==0)
10130 setTimeout(gameStepJeu,400);
10131 else
10132 setTimeout(gameStepJeu,2000);
10133 }
10134 else
10135 { 
10136 
10137
10138 setTimeout(function () {
10139 
10140 $prime = 0;
10141  
10142  var $isChelemAttaque = true;
10143  var $isChelemDefense = true;
10144  var $scoresP = [0,0,0,0,0,0,0];
10145  var $detteExcuse = 0;
10146  for (var $d in partie.joueurs) {
10147  var $leveesDette = partie.joueurs[$d].levees.split("|");
10148  for (var $k = 0; $k < $leveesDette.length; $k++) {
10149   if ($leveesDette[$k]=="**") $detteExcuse += 0.5;
10150  }
10151  }
10152  for (var $c in partie.joueurs)
10153  {
10154  var $joueurPartie = partie.joueurs[$c];
10155  var $levessAvecEcart = $joueurPartie["ecart"];
10156  $levessAvecEcart += ($levessAvecEcart!=""?"|":"")+$joueurPartie["levees"]; 
10157  
10158  var $leveesJoueur = $levessAvecEcart.split('|');
10159
10160  var $scoJ = 0;
10161  for (var $uu in $leveesJoueur )
10162  {  
10163   var $pts = getPointsCarte($leveesJoueur[$uu]);
10164   $scoJ+=$pts;
10165  } 
10166  
10167  var $scoLevesOnly = 0;
10168  var $leveesJoueurOnly = $joueurPartie["levees"].split('|');//explode("|",$joueurPartie["levees"]);
10169
10170  for (var $uu in $leveesJoueurOnly )
10171   $scoLevesOnly+=getPointsCarteChelem($leveesJoueurOnly[$uu]);
10172  
10173  if ($scoLevesOnly>0) {
10174   if ( $c!=$partie["preneur"] && $c!=$partie["idEquipier"]) {
10175  $isChelemAttaque = false;
10176   } else 
10177   $isChelemDefense = false;
10178  }
10179  // La dette creditee au gagnant du pli reste due par le detenteur de l'Excuse.
10180  if ($leveesJoueurOnly.indexOf("6_Excuse.gif")!=-1) $scoJ -= $detteExcuse;
10181  $scoresP[$c] = $scoJ;            
10182  if ( $joueurPartie["poignee"]!=0 && $joueurPartie["poignee"]!=-1)
10183  {
10184   if ( $partie["maxJoueurs"]!=5)
10185   $prime += getPoigneePrime($joueurPartie["poignee"]);
10186   else
10187   $prime += getPoigneePrime5j($joueurPartie["poignee"]);
10188  }
10189  } 
10190
10191  // CALCUL DU NOMBRE D OUDLERS
10192  var $nombreOudlers = 0; 
10193
10194  var $scoreAttaque = $scoresP[$partie["preneur"]];
10195  
10196  var $leveesPreneurAvecEcart = partie.joueurs[$partie["preneur"]]["ecart"];
10197  $leveesPreneurAvecEcart += ($leveesPreneurAvecEcart!=""?"|":"")+partie.joueurs[$partie["preneur"]]["levees"];
10198  if ( $partie["maxJoueurs"]==5 && $partie["idEquipier"]!=-1) {
10199  $leveesPreneurAvecEcart += ($leveesPreneurAvecEcart!=""?"|":"")+partie.joueurs[$partie["idEquipier"]]["levees"];
10200  $scoreAttaque += $scoresP[$partie["idEquipier"]];
10201  }
10202  
10203  var $jeuPreneur = $leveesPreneurAvecEcart.split("|"); 
10204  for (var $ff in $jeuPreneur ) { 
10205  var $carte2 = $jeuPreneur[$ff];
10206  if ($carte2=="6_Excuse.gif" || $carte2=="5_Atout-21.gif" || $carte2=="5_Atout-01.gif") $nombreOudlers++;
10207  }
10208  
10209  var $mult = 1;
10210  var $objSco = 9999;
10211  switch ($nombreOudlers)
10212  {
10213  case 0:$objSco = 56;break;
10214  case 1:$objSco = 51;break;
10215  case 2:$objSco = 41;break;
10216  case 3:$objSco = 36;break; 
10217  }
10218  switch ($partie["annonce"])
10219  {
10220  case 1:$mult = 1;break;
10221  case 2:$mult = 2;break;
10222  case 3:$mult = 4;break;
10223  case 4:$mult = 6;break;
10224  }
10225      
10226  $detailCalculSco = "";
10227  
10228
10229  if ($partie["annonce"]>2) {
10230  selMoteur.afficheCartes(JSON.stringify($partie["chien"]),"Cartes qui étaient dans le chien");
10231  }
10232  
10233  var $texteFinPartie = 'Partie contre l\'ordinateur terminée,'; 
10234  
10235  $texteFinPartie += "<br>";
10236    
10237  var $marquePts = $mult*(25+Math.abs($scoreAttaque-$objSco));
10238  
10239  if ($partie["preneur"]==0) {
10240
10241  if ($partie["maxJoueurs"]==5 ) {
10242   if ( $partie["idEquipier"]!=-1) 
10243   $texteFinPartie += "Vous réalisez "+$scoreAttaque+"pts avec "+partie.joueurs[$partie["idEquipier"]]["pseudo"]+"<br>";
10244   else 
10245   $texteFinPartie += "Vous réalisez "+$scoreAttaque+"pts<br>";
10246   
10247  } else
10248   $texteFinPartie += "Vous réalisez "+$scoreAttaque+"pts<br>";
10249  } else {
10250
10251  if ($partie["maxJoueurs"]==5 ) {
10252   if ( $partie["idEquipier"]!=-1) 
10253   $texteFinPartie += partie.joueurs[$partie["preneur"]]["pseudo"]+" réalise "+$scoreAttaque+"pts avec "+partie.joueurs[$partie["idEquipier"]]["pseudo"]+"<br>";
10254   else 
10255   $texteFinPartie += partie.joueurs[$partie["preneur"]]["pseudo"]+" réalise "+$scoreAttaque+"pts<br>";
10256   
10257  } else
10258   $texteFinPartie += partie.joueurs[$partie["preneur"]]["pseudo"]+" réalise "+$scoreAttaque+"pts<br>";
10259  }
10260                        
10261  if ( $objSco==$scoreAttaque)
10262  {
10263  //$deltaPts = $marquePts;
10264  $texteFinPartie += "<font style=\"font-weight:bold;\">";
10265  $texteFinPartie += ($partie["preneur"]==0?"Votre":"Son")+" contrat de "+$objSco+"pts est juste fait ";     
10266  $texteFinPartie += " avec "+$nombreOudlers+" oudler"+($nombreOudlers>1?"s":"")+" dans ses plis</font><br>"; 
10267  //$texteFinEntrainement = $texteFinPartie;          
10268  }
10269  else if ( $objSco<$scoreAttaque)
10270  {
10271  //$deltaPts = $marquePts;
10272  $texteFinPartie += "<font style=\"font-weight:bold;\">";
10273  $texteFinPartie += ($partie["preneur"]==0?"Réussite de votre contrat de ":"Et réussit son contrat de ")+$objSco+"pts ";     
10274  $texteFinPartie += " avec "+$nombreOudlers+" oudler"+($nombreOudlers>1?"s":"")+" dans les plis</font><br>"; 
10275  //$texteFinEntrainement = $texteFinPartie; 
10276  $texteFinPartie += "<font style=\"size:16px;\">";          
10277  $texteFinPartie += "(25pts + "+($scoreAttaque-$objSco)+"pts de gain) x "+$mult+"("+$phrasesAnnonces[$partie["annonce"]]+")<br>";          
10278  }
10279  else
10280  {
10281  //$deltaPts = -$marquePts;
10282  $texteFinPartie += "<font style=\"font-weight:bold;\">";
10283  $texteFinPartie += ($partie["preneur"]==0?"Chute de votre contrat de ":"Et chute son contrat de ")+$objSco+"pts "; 
10284  $texteFinPartie += " avec "+$nombreOudlers+" oudler"+($nombreOudlers>1?"s":"")+" dans les plis</font><br>"; 
10285  //$texteFinEntrainement = $texteFinPartie; 
10286  $texteFinPartie += "<font style=\"size:16px;\">";            
10287  $texteFinPartie += "(25pts + "+($objSco-$scoreAttaque)+"pts de perte) x "+$mult+"("+$phrasesAnnonces[$partie["annonce"]]+")<br>";         
10288  } 
10289  
10290  if ($prime)
10291  {
10292  $marquePts += $prime;
10293  if ( $objSco<=$scoreAttaque) 
10294   $texteFinPartie += "Prime pour la poignée annoncée : "+($prime)+"pts<br>";
10295  else
10296   $texteFinPartie += "Perte pour la poignée annoncée : "+($prime)+"pts<br>";
10297  } 
10298    
10299  if ($tourPetit )
10300  {  
10301  if ( $preneurPetit==$partie["preneur"] || $preneurPetit==$partie["idEquipier"])     
10302  {   
10303   $texteFinPartie += "Prime pour le petit au bout : "+($mult*10)+"pts"; 
10304   $texteFinPartie += "<br>";  
10305  } 
10306  else     
10307  {             
10308   $texteFinPartie += "La défense réalise le petit au bout : prime de "+($mult*10)+"pts";
10309   $texteFinPartie += "<br>";  
10310  }
10311  }
10312  if ($partie['chelem'] && $isChelemAttaque) {         
10313   $texteFinPartie += "Chelem annoncé et réalisé : prime de 400pts";
10314   $texteFinPartie += "<br>"; 
10315  if ( $objSco<=$scoreAttaque) 
10316   $marquePts += 400;
10317  else
10318   $marquePts -= 400;
10319  }
10320  else if ($partie['chelem'] && !$isChelemAttaque) {         
10321  $texteFinPartie += "Chelem annoncé mais non réalisé : perte de 200pts";
10322  $texteFinPartie += "<br>"; 
10323  if ( $objSco<=$scoreAttaque) 
10324   $marquePts -= 200;
10325  else
10326   $marquePts += 200;
10327  } else if (!$partie['chelem'] && $isChelemAttaque) {         
10328  $texteFinPartie += "Chelem non annoncé mais réalisé : prime de 200pts";
10329  $texteFinPartie += "<br>"; 
10330  if ( $objSco<=$scoreAttaque) 
10331   $marquePts += 200;
10332  else
10333   $marquePts -= 200;
10334  }
10335  if ($isChelemDefense) {        
10336  $texteFinPartie += "Chelem de la défense : prime de 200pts";
10337  $texteFinPartie += "<br>"; 
10338  $marquePts += 200;
10339  }
10340  if ( $objSco<=$scoreAttaque) 
10341  {  
10342  if ($tourPetit )
10343  {  
10344   if ( $preneurPetit==$partie["preneur"] || $preneurPetit==$partie["idEquipier"])     
10345   {
10346   $marquePts += $mult*10; 
10347   } 
10348   else    
10349   {
10350   $marquePts -= $mult*10; 
10351   }
10352  }
10353  $deltaPts = $marquePts;   
10354  }
10355  else      
10356  {
10357  if ($tourPetit )
10358  {
10359   if ( $preneurPetit==$partie["preneur"] || $preneurPetit==$partie["idEquipier"])     
10360   { 
10361   $marquePts -= $mult*10; 
10362   } 
10363   else     
10364   { 
10365   $marquePts += $mult*10; 
10366   }
10367  }
10368  $deltaPts = -$marquePts;  
10369  } 
10370
10371  $texteFinPartie += "</font>";
10372          
10373  if ( $partie["maxJoueurs"]==5 && $partie["idEquipier"]!=-1) {
10374  
10375  if ( $objSco<=$scoreAttaque) {
10376  $texteFinPartie += partie.joueurs[$partie["preneur"]]["pseudo"]+" marque "+(2*$marquePts)+"pts, ";
10377  $texteFinPartie += partie.joueurs[$partie["idEquipier"]]["pseudo"]+" marque "+(1*$marquePts)+"pts";
10378  $texteFinPartie += ", leurs adversaires perdent "+$marquePts+"pts.<br>";
10379  } else {
10380  $texteFinPartie += partie.joueurs[$partie["preneur"]]["pseudo"]+" perd "+(2*$marquePts)+"pts, ";
10381  $texteFinPartie += partie.joueurs[$partie["idEquipier"]]["pseudo"]+" perd "+(1*$marquePts)+"pts";
10382  $texteFinPartie += ", leurs adversaires gagnent "+$marquePts+"pts.<br>";
10383  }
10384  for (var $i=0;$i<$nbJPa;$i++)
10385  {
10386  if ($i==$partie["idEquipier"])
10387  partie.joueurs[$i].score += $deltaPts;//$partieEnCours->joueurs[$i]->
10387setDataVal( "score", $joueursPartie[$i]["score"]+(1*$deltaPts) );
10388  else if ($i==$partie["preneur"])
10389  partie.joueurs[$i].score += 2*$deltaPts;//$partieEnCours->joueurs[$i]->setDataVal( "score", $joueursPartie[$i]["score"]+(2*$deltaPts) );
10390  else
10391  partie.joueurs[$i].score -= $deltaPts;//$partieEnCours->joueurs[$i]->setDataVal( "score", $joueursPartie[$i]["score"]-$deltaPts );
10392  }
10393  } else {
10394 var $theMult = $nbJPa -1;
10395 if ($partie["preneur"]==0) {
10396
10397   if ( $objSco<=$scoreAttaque)
10398   $texteFinPartie += "Vous marquez "+($theMult*$marquePts)+"pts, vos adversaires perdent "+$marquePts+"pts.";
10399   else
10400   $texteFinPartie += "Vous perdez "+($theMult*$marquePts)+"pts, vos adversaires gagnent "+$marquePts+"pts.";
10401 } else {
10402
10403   if ( $objSco<=$scoreAttaque)
10404   $texteFinPartie += ""+partie.joueurs[$partie["preneur"]]["pseudo"]+" marque "+($theMult*$marquePts)+"pts, ses adversaires perdent "+$marquePts+"pts.";
10405   else
10406   $texteFinPartie += ""+partie.joueurs[$partie["preneur"]]["pseudo"]+" perd "+($theMult*$marquePts)+"pts, ses adversaires gagnent "+$marquePts+"pts.";
10407 }
10408  
10409  for (var $i=0;$i<$nbJPa;$i++)
10410  {
10411  if ($i==$partie["preneur"]) {
10412  partie.joueurs[$i].score += $theMult*$deltaPts;//$partieEnCours->joueurs[$i]->setDataVal( "score", $joueursPartie[$i]["score"]+($theMult*$deltaPts) );
10413  } else {
10414  partie.joueurs[$i].score -= $deltaPts;//$partieEnCours->joueurs[$i]->setDataVal( "score", $joueursPartie[$i]["score"]-$deltaPts );
10415  }
10416  }
10417  }       
10418  for (var $i=0;$i<$nbJPa;$i++)
10419  { 
10420  //partie.joueurs[$i].levees= "";
10421  //partie.joueurs[$i].nbCartesAff=0;
10422  //partie.joueur[$i].etape= "Distribution" ;
10423  partie.joueurs[$i].cartePosee = "" ;    
10424  } 
10425  selMoteur.clearTurn();
10426
10427
10428  for (var $i=0;$i<$nbJPa;$i++)
10429  {
10430  if (partie.joueurs[$i].score>0)
10431  setVictory($i);
10432  else
10433  setDefeat($i);
10434  selMoteur.setScore($i,''+partie.joueurs[$i].score+'pts');
10435
10436  }
10437
10438 if (partie.preneur==0)
10439  selMoteur.afficheCartes(JSON.stringify($leveesPreneurAvecEcart.split("|")),"Vos levées");
10440 else
10441  selMoteur.afficheCartes(JSON.stringify($leveesPreneurAvecEcart.split("|")),"Levées de "+partie.joueurs[partie.preneur].pseudo);
10442  
10443
10444 selMoteur.showMessagePlateauJeu($texteFinPartie);
10445  GEN();
10446  selMoteur.addAction('Fin de partie','closeRecap();','btn-info');
10447 
10448
10449 },2000);
10450 
10451 
10452 
10453 
10454 
10455 
10456 
10457 
10458 
10459 
10460 
10461 
10462 }
10463 },1500);
10464 }
10465}
10466
10467
10468
10469/**/
10470var $nbreCartesMinPoignee = 10;
10471function gameStepJeu() {
10472
10473 tourDe = (partie.main+partie.posTable)%$nbJPa;
10474 selMoteur.setTurn(tourDe);
10475 
10476 var $nombreAtouts = 0;
10477 var $disposeAtout = false;
10478 var $disposeCouleur = false;
10479 var $disposeMeilleurAtout = false;
10480 var $etapeDeclarationPoignee = false;
10481 var $meilleurAtoutPose = 0; 
10482 
10483 for (var $i in partie.joueurs) {//=partie.main;$i<partie.main+partie.posTable;$i++) {
10484 if (partie.joueurs[$i].cartePosee[0]=="5")
10485 {
10486  var $tcarAtout = getCardNumero(partie.joueurs[$i].cartePosee);
10487  if ( $tcarAtout>$meilleurAtoutPose )
10488  $meilleurAtoutPose = $tcarAtout;
10489 } 
10490 } 
10491 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
10492 {
10493 var $carte = partie.joueurs[tourDe].main[$i];
10494 if ($carte[0]=="5") { $disposeAtout = true; $nombreAtouts++; }
10495 if ($carte[0]=="6") { $nombreAtouts++; }
10496 if ($carte[0]=="5" && getCardNumero($carte)>$meilleurAtoutPose ) $disposeMeilleurAtout = true;
10497 if ($carte[0]==partie.typeTour) $disposeCouleur = true;
10498 } 
10499
10500 //console.log('fin'+$nombreAtouts+$disposeMeilleurAtout);
10501
10502 if (!partie.joueurs[tourDe].isIA && partie.joueurs[tourDe].poignee==0 && $nombreAtouts>=$nbreCartesMinPoignee && partie["nbCartesJouees"]<$nbJPa ) {
10503
10504 showMessage('Vous avez la possibilité d\'annoncer une poignée');
10505
10506 var $nbCartes = 0;
10507
10508 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
10509 {
10510 var $carte = partie.joueurs[tourDe].main[$i];
10511  if ($carte[0]=="5" || $carte[0]=="6" ) 
10512  selMoteur.setCardAction($carte,'cartePoigneeSelectOffline(this);');
10513  else
10514  selMoteur.setCardAction($carte,''); 
10515  
10516 }
10517 activateCardActions(true);
10518 var selDefPoignee = $nbreCartesMinPoignee;
10519
10520 if ($nombreAtouts>=13)
10521 selDefPoignee = 13;
10522 if ($nombreAtouts>=15)
10523 selDefPoignee = 15;
10524 
10525 for (var $i in partie.joueurs[tourDe].main)//$jeuJoueur as $i => $carte)
10526 {
10527 var $carte = partie.joueurs[tourDe].main[$i];
10528  if ($carte[0]=="5" || $carte[0]=="6" ) {
10529  if ($nbCartes<selDefPoignee ) { 
10530   $nbCartes++;
10531   cartePoigneeSelectOffline($$('MonJeu'+$carte));
10532  } 
10533  }
10534 }
10535 refreeshCartesPoigneeOffline();
10536 return;
10537 }
10538 
10539 if ( partie.joueurs[tourDe].isIA) {
10540
10541 var $joueCarte;
10542 for (var $i in partie.joueurs[tourDe].main)
10543 {
10544 var $carte = partie.joueurs[tourDe].main[$i];
10545 if (canIPlayCard($carte,$disposeCouleur,$disposeMeilleurAtout,$disposeAtout,$meilleurAtoutPose)) {
10546 $joueCarte = $carte;
10547 }
10548 }
10549 
10550 
10551 
10552 
10553 
10554 var $prenneurPli = 0;
10555 var $prenneurPliAvec = "";
10556 var $levessAvecEcart = "";
10557 var $attaqueADejaJoue = false;
10558 var $attaqueAFiniDeJouer = true;
10559 var $pointsEnJeu = 0;
10560 var $isPetitEnJeu = false;
10561 var $listeCartesTombees;
10562 var $nbMeilleuresCartes = [0,0,0,0,0,0,0];
10563 var $nbCouleurEnMain;
10564 var $cartesTombees = [0,0,0,0,0,0,0,0];
10565
10566 var $nbcartesTombees = [0,0,0,0,0,0,0,0];
10567 var $roisTombes = [0,0,0,0,0,0,0,0];
10568 var $listeCartesTombees = [ [],[],[],[],[],[],[] ];
10569  
10570 for (var $i=0;$i<$nbJPa;$i++) { 
10571 var $typeCJ = partie.joueurs[$i].cartePosee[0];
10572  if ($typeCJ!="6")
10573  $pointsEnJeu += getPointsCarte(partie.joueurs[$i].cartePosee); 
10574 if ($typeCJ==5 && getCardNumero(partie.joueurs[$i].cartePosee)==1)
10575 $isPetitEnJeu = true;
10576 if ( partie.joueurs[$i].posTable==partie.preneur) {
10577  if (partie.joueurs[$i].cartePosee!="")
10578  $attaqueADejaJoue = true;
10579  else 
10580  $attaqueAFiniDeJouer = false; 
10581 }
10582 if ( partie.joueurs[$i].cartePosee>$prenneurPliAvec && ($typeCJ==partie.typeTour || $typeCJ==5) && $typeCJ!=6 )
10583 {
10584  $prenneurPli = partie.joueurs[$i].posTable;
10585  $prenneurPliAvec = partie.joueurs[$i].cartePosee;
10586 }
10587 $levessAvecEcart = partie.joueurs[$i].levees;
10588 if ( partie.joueurs[$i].posTable==partie.preneur )
10589  $levessAvecEcart += ($levessAvecEcart!=""?"|":"")+partie.joueurs[$i].ecart;
10590 var $cartesDuSonChien = $levessAvecEcart.split('|');//explode("|",$levessAvecEcart); 
10591      
10592 for( var $ii in $cartesDuSonChien)
10593 {
10594  var $c = $cartesDuSonChien[$ii];
10595  if ($c!='' && $c!='**') {
10596  $nbcartesTombees[$c[0]]++;
10597  $cartesTombees[$c[0]] = $cartesTombees[$c[0]]+1; 
10598  $listeCartesTombees[$c[0]][getCardNumero($c)] = 1; 
10599  if (getCardNumero($c)==14) $roisTombes[$c[0]] = 1; 
10600  } 
10601 }
10602
10603 var $nbCoupes = {};
10604 var $lesCoupes = {};
10605 
10606 $nbCoupes["attaque"] = [];
10607 $nbCoupes["defense"] = [];
10608 
10609 $lesCoupes["attaque"] = [];
10610 $lesCoupes["defense"] = [];
10611 
10612 for (var $c=1;$c<5;$c++)
10613 {
10614  if (partie.joueurs[$i]["coupe"+$c] ==1 ) 
10615  {
10616  if (partie.joueurs[$i]["posTable"]==partie.preneur || partie.joueurs[$i]["posTable"]==partie.idEquipier) {
10617   $nbCoupes["attaque"][$c]++; 
10618   $lesCoupes["attaque"][$c] = 1; 
10619  } else {
10620   $nbCoupes["defense"][$c]++; 
10621   $lesCoupes["defense"][$c] = 1; 
10622  } 
10623  }
10624 }               
10625 }
10626 var $partie = partie;
10627 var $jaiLePetit = false;
10628 var $jeSeraiLAttaque = false;
10629 var $nbCouleurEnMain = [0,0,0,0,0,0];
10630 
10631 for (var $i in partie.joueurs[tourDe].main )
10632 { 
10633 var $carte = partie.joueurs[tourDe].main[$i];
10634 if (getCardNumero($carte)==1 && $carte[0]==5)
10635 $jaiLePetit = true;
10636 $nbCouleurEnMain[$carte[0]]++; 
10637 }
10638 for (var $n=21;$n>0 && $listeCartesTombees[5][$n]==1;$n--)
10639 {
10640 $nbMeilleuresCartes[5]++;
10641 }
10642 var $lePetitEstDejaTombe = $listeCartesTombees[5][1]>0;
10643 //echo "alert('je dispose des ".$nbMeilleuresCartes[4]." meilleures cartes');";
10644 var $meilleurAtoutPreneur = true;
10645 if ($prenneurPliAvec[0]!="5")
10646 $meilleurAtoutPreneur = false;
10647 if (getCardNumero($prenneurPliAvec)!=(21-$nbMeilleuresCartes[5]))
10648 $meilleurAtoutPreneur = false;
10649 
10650 $preneurPliAttaque = ($prenneurPli==partie.preneur || $prenneurPli==partie.idEquipier);
10651 $jeSuisLAttaque = (partie.joueurs[tourDe]["posTable"]==partie.preneur || partie.joueurs[tourDe]["posTable"]==partie.idEquipier || $jeSeraiLAttaque);
10652 $preneurPliDansMonCamp = $jeSuisLAttaque==$preneurPliAttaque;
10653 var $joueurIADepuisDebut = (partie.joueurs[tourDe]["idUtil"]<0);
10654
10655
10656 var $defenseChassePetit = false;
10657 var $lastOuverturePreneur = '';
10658 var $carteJouee = '';
10659 
10660 if (!$lePetitEstDejaTombe && !$jaiLePetit) {
10661 for ($i=0;$i<$nbJPa;$i++) {
10662  if (partie.joueurs[tourDe]["lastouverture"][0]=="5" &&
10663  partie.joueurs[tourDe]["posTable"]!=partie["preneur"] &&
10664  partie.joueurs[tourDe]["posTable"]!=partie["idEquipier"] && (getCardNumero(partie.joueurs[tourDe]["lastouverture"])!=21 || $cartesTombees[5]>5) )
10665  $defenseChassePetit = true;
10666  if (partie.joueurs[tourDe]["posTable"]==partie["preneur"] )
10667  $lastOuverturePreneur = partie.joueurs[tourDe]["lastouverture"][0];
10668 }
10669 }
10670 //if ($defenseChassePetit) echo "console.log('la defense chasse');";
10671 
10672 $scoreCarteJouee = -99999999;
10673 for (var $i in partie.joueurs[tourDe].main)
10674 { 
10675 var $carte = partie.joueurs[tourDe].main[$i];
10676 if ( canIPlayCard($carte,$disposeCouleur,$disposeMeilleurAtout,$disposeAtout,$meilleurAtoutPose) ) { 
10677  
10678  $scoreCarteActuelle = 1;
10679  $numCarte = getCardNumero($carte);
10680  
10681  $typeCJ = $carte[0]; 
10682  if ( $carte>$prenneurPliAvec && ($typeCJ==$partie["typeTour"] || $typeCJ==5) && $typeCJ!=6 )
10683   $cartePreneuse = true;
10684  else
10685   $cartePreneuse = false;
10686   
10687  if ($jeSuisLAttaque)
10688  {
10689   if ( $cartesTombees[$typeCJ]<5 && $numCarte=="14" && $typeCJ<5 && $prenneurPliAvec[0]!="5" && 
10690   $nbCouleurEnMain[$typeCJ]<6+1.1*$partie["posTable"] && $nbCoupes["defense"][$typeCJ]==0 ) // jouer un roi
10691   $scoreCarteActuelle=5998; 
10692   else if ( $cartesTombees[$typeCJ]<=6 && $nbCoupes["defense"][$typeCJ]==0 && 
10693   $roisTombes[$typeCJ]==1 && $numCarte=="13" && $typeCJ<5 && $prenneurPliAvec[0]!="5" && 
10694   $nbCouleurEnMain[$typeCJ]<5 ) // && $joueurIADepuisDebut jouer un roi si premier tour de la couleur
10695   $scoreCarteActuelle=5998; 
10696   else if ($typeCJ=="5" && $numCarte==1 ) // le petit
10697   {
10698   if ($partie["posTable"]>0 && 
10699   $partie["typeTour"]>0 && 
10700   $partie["typeTour"]<5 && 
10701   $cartesTombees[$partie["typeTour"]]<5 && 
10702   $cartePreneuse)
10703   { // si je coupe sec une couleur
10704    $scoreCarteActuelle =9998; //laPlusGrande
10705   } else if ( $partie["posTable"]>=$nbJPa-1 && ($cartePreneuse || $preneurPliDansMonCamp) )
10706   { // sauve le petit si dernier a jouer et mon camp maitre
10707    $scoreCarteActuelle =9998; //laPlusGrande
10708   }
10709   else if ( ($prenneurPliAvec=="5_Atout-"+(21-$nbMeilleuresCartes[5])+".gif") && $preneurPliDansMonCamp)
10710   { // sauve le petit si mon camp maitre avec carte maitresse
10711    $scoreCarteActuelle = 9998; 
10712   } else { // sauve le petit si mon camp maitre avec carte maitresse
10713    $scoreCarteActuelle = -7000; 
10714   }
10715   }
10716   else if ($typeCJ=="6" ) // L'excuse
10717   {
10718   if (partie.joueurs[tourDe].main.length<3 )// en jamais jouer son excuse au dernier tour 
10719    $scoreCarteActuelle=99999;
10720    else if ( ($jaiLePetit || $lePetitEstDejaTombe || $partie["posTable"]==3 ) && $cartesTombees[$partie["typeTour"]]>2 && ( !$disposeCouleur || $partie["typeTour"]==5 ) && $partie["posTable"]!=0 && $pointsEnJeu/$partie["posTable"]<0.7 ) // || (getPointsCarte($carte)>1 
10721    $scoreCarteActuelle=9990; // conserver ses atouts si peu de points en jeu
10722   else 
10723    $scoreCarteActuelle=-9991; 
10724   }
10725   else if ($partie["posTable"]==0)
10726   {
10727   $atoutsRestantDansMainsAutresJ = 20-$cartesTombees[5]-$nbCouleurEnMain[5];
10728   // chasse au petit
10729   if ( ($nbMeilleuresCartes[5]>4 && $nbCouleurEnMain[5]>8) || 
10730    ((partie.joueurs[tourDe].main.length-$nbCouleurEnMain[5])<2) || // que de l atout sauf une carte
10731    (Math.floor($atoutsRestantDansMainsAutresJ/3)<=$nbMeilleuresCartes[5] && !$jaiLePetit && !$lePetitEstDejaTombe ) ) 
10732   {
10733    //if (!isset($IAlogOnce)) logIAaction ("Mode engagement d attaque aggressif");
10734    if ($typeCJ==5) $scoreCarteActuelle +=5000; // atout de preference
10735    if ($typeCJ==5 && $numCarte==1) $scoreCarteActuelle -=9000; // pas le petit
10736    if ($typeCJ<5) $scoreCarteActuelle+=100*$nbCoupes["defense"][$typeCJ]; // essayer de faire couper la defense
10737    if ($typeCJ<5 && $disposeAtout) $scoreCarteActuelle+=parseInt($nbCouleurEnMain[$typeCJ])*50; // essayer de couper
10738    $scoreCarteActuelle+=$numCarte; // laPlusGrandeDesMoinsDePoints
10739   }
10740   else
10741   {
10742    //if (!isset($IAlogOnce)) logIAaction ("Mode engagement d attaque normal");
10743    
10744    if ($typeCJ==5) {
10745    if (2*$nbCouleurEnMain[5]>partie.joueurs[tourDe].main.length+2)
10746    $scoreCarteActuelle +=400;
10747    else
10748    $scoreCarteActuelle -=6000;
10749    } else {/*
10750    !$jaiLePetit && // pas si j ai le petit
10751    !$lePetitEstDejaTombe && // si le petit est tombe j evite
10752    */
10753    $scoreCarteActuelle+=100*$nbCoupes["defense"][$typeCJ]; // essayer de faire couper la defense
10754    if ( $cartesTombees[$typeCJ]==0 || $cartesTombees[$typeCJ]>10) { // essayer de ne pas decouvrir une couleur
10755     if (!$jaiLePetit && // si j ai pas le petit
10756    !$lePetitEstDejaTombe ) // si le petit est tombe j evite)
10757     $scoreCarteActuelle-=7000;
10758    else
10759     $scoreCarteActuelle-=80; // essayer de ne pas decouvrir une couleur
10760    }
10761    if ( $disposeAtout) $scoreCarteActuelle-=$nbCouleurEnMain[$typeCJ]*80; // essayer de couper
10762    }
10763    $scoreCarteActuelle+=6000-getPointsCarteIA($carte)*1000-$numCarte; // laPlusPetiteDesMoinsDePoints
10764   }
10765   } 
10766   else if ($typeCJ=="5" ) // atout en attaque
10767   {
10768   if ( $cartePreneuse && $partie["posTable"]<3 && ((21-$nbMeilleuresCartes[5])<=$numCarte) && 
10769   ($isPetitEnJeu || ($pointsEnJeu/($partie["posTable"]+1)>2.5 ) ) )
10770   {
10771    //if (!isset($IAlogOnce)) logIAaction ("Mode atout aggressif");
10772    $scoreCarteActuelle+=1000+$numCarte; //laPlusGrande
10773   }
10774   else
10775   {
10776    //if (!isset($IAlogOnce)) logIAaction ("Mode atout normal");
10777    $scoreCarteActuelle+=1000-getPointsCarteIA($carte)*100-$numCarte; //laPlusPetiteDesMoinsDePoints 
10778   }
10779   }
10780   else if ( $cartePreneuse && $partie["posTable"]>=$nbJPa-1)
10781   { 
10782   //if (!isset($IAlogOnce)) logIAaction ("Mode victoire pour sur");
10783   $scoreCarteActuelle+=1000+200+getPointsCarteIA($carte)*100-$numCarte; //laPlusPetiteDesPlusDePoints 
10784   }
10785   else if ( $preneurPliDansMonCamp && ( $meilleurAtoutPreneur || $partie["posTable"]>=$nbJPa-1 || ($cartesTombees[$typeCJ]<10 && $prenneurPliAvec[0]=="5" && $typeCJ<5) ) )
10786   { //$prenneurPliAvec
10787   //if (!isset($IAlogOnce)) logIAaction ("Mode victoire pour sur");
10788   $scoreCarteActuelle+=1000+200+getPointsCarteIA($carte)*100-$numCarte; //laPlusPetiteDesPlusDePoints 
10789   }
10790   else 
10791   {
10792   //if (!isset($IAlogOnce)) logIAaction ("Mode prudence");
10793   $scoreCarteActuelle+=600-getPointsCarteIA($carte)*100-$numCarte; // laPlusPetiteDesMoinsDePoints
10794   }
10795  }
10796  else // je suis en defense
10797  {
10798   $unDefenseurCoupe = false;
10799   $lAttaqueCoupe = false;  
10800   if ( $typeCJ<5)
10801   {
10802   if ($lesCoupes["attaque"][$typeCJ]==1)
10803    $lAttaqueCoupe = true;
10804   if ($lesCoupes["defense"][$typeCJ]==1)
10805    $unDefenseurCoupe = true; 
10806   }
10807   
10808   //le jeu du roi
10809   if ( $cartesTombees[$typeCJ]<4 && $numCarte=="14" && $typeCJ<5 && $prenneurPliAvec[0]!="5" && $nbC
10809ouleurEnMain[$typeCJ]<3 && $nbCoupes["attaque"][$typeCJ]==0 ) // && $joueurIADepuisDebut jouer un roi si premier tour de la couleur
10810   $scoreCarteActuelle=4998; 
10811   //le jeu de la dame
10812   else if ( $cartesTombees[$typeCJ]<=6 && $nbCoupes["attaque"][$typeCJ]==0 && $roisTombes[$typeCJ]==1 && $numCarte=="13" && $typeCJ<5 && $prenneurPliAvec[0]!="5" && $nbCouleurEnMain[$typeCJ]<3 ) // && $joueurIADepuisDebut jouer un roi si premier tour de la couleur
10813   $scoreCarteActuelle=2998;
10814   else if ($typeCJ=="5" && $numCarte==1 ) // petit en defense
10815   {
10816   if ( $attaqueAFiniDeJouer && ($cartePreneuse || $preneurPliDansMonCamp) )// || ($unDefenseurCoupe && !$lAttaqueCoupe)
10817   { // sauve le petit si dernier a jouer et mon camp maitre
10818    $scoreCarteActuelle =10998; //laPlusGrande
10819   }
10820   else if ( ($prenneurPliAvec=="5_Atout-"+(21-$nbMeilleuresCartes[5])+".gif") && $preneurPliDansMonCamp)
10821   { // sauve le petit si mon camp maitre avec carte maitresse
10822    $scoreCarteActuelle = 9998; 
10823   } else { // sauve le petit si mon camp maitre avec carte maitresse
10824    $scoreCarteActuelle = -7000; 
10825   }
10826   }
10827   else if ($typeCJ=="6" )
10828   {
10829   if (partie.joueurs[tourDe].main.length<3 )// en jamais jouer son excuse au dernier tour 
10830    $scoreCarteActuelle=9999;
10831    else if ( (!$disposeCouleur || $partie["typeTour"]==5 ) && $partie["posTable"]!=0 && $pointsEnJeu/$partie["posTable"]<0.7 ) // || (getPointsCarte($carte)>1 
10832    $scoreCarteActuelle=9999; 
10833   else 
10834    $scoreCarteActuelle=1; 
10835   }
10836   else if ($partie["posTable"]==0) // c est moi qui entame
10837   { 
10838   if ($lastOuverturePreneur == $typeCJ)
10839    $scoreCarteActuelle -=2000;
10840
10841   for ($i=0;$i<$nbJPa;$i++) {
10842    if ( partie.joueurs[$i]["posTable"]!=$partie["preneur"] &&
10843    partie.joueurs[$i]["posTable"]!=$partie["idEquipier"] && 
10844    partie.joueurs[$i]["lastouverture"][0]==$typeCJ)
10845    $scoreCarteActuelle +=1500;
10846   }
10847    
10848    
10849   if ($typeCJ==5) { // entamer a l atout
10850    $chasserLePetit = false;
10851    if (!$jaiLePetit && // pas si j ai le petit
10852    !$lePetitEstDejaTombe && // si le petit est tombe j evite
10853    ($numCarte==21-$nbMeilleuresCartes[5]) && // j ai le meilleur atout possible
10854    ($cartesTombees[5]<4 || $cartesTombees[5]+$nbCouleurEnMain[5]>12) &&
10855    $partie["posTable"]<3 )
10856    $chasserLePetit = true;
10857    else {
10858    if ($defenseChassePetit)
10859    $chasserLePetit = true;
10860    }
10861    if ($chasserLePetit) {
10862    if ($numCarte==21-$nbMeilleuresCartes[5])
10863    $scoreCarteActuelle +=8000;
10864    else {
10865    if ($attaqueAFiniDeJouer)
10866    $scoreCarteActuelle +=6000-$numCarte;
10867    else
10868    $scoreCarteActuelle +=6000+$numCarte;
10869    }
10870    } else {
10871    $scoreCarteActuelle -=7000;
10872    }
10873   }
10874   if ( $typeCJ<5 ) {
10875
10876    if ($lePetitEstDejaTombe && (partie.joueurs[tourDe]["posTable"]+1)%$nbJPa!=$partie["preneur"] ) {
10877    $scoreCarteActuelle+=100*$nbCoupes["attaque"][$typeCJ]; // essayer de faire couper l attaque
10878    } else {
10879    $scoreCarteActuelle-=100*$nbCoupes["attaque"][$typeCJ]; // essayer de ne pas faire couper l attaque
10880    }
10881    $scoreCarteActuelle-=100*$nbCoupes["defense"][$typeCJ]; // essayer de pas faire couper la defense
10882    
10883    
10884    if ($cartesTombees[$typeCJ]==0) { // decouvrir une couleur
10885    if ( ($jaiLePetit || $lePetitEstDejaTombe ) && ((partie.joueurs[tourDe]["posTable"]+1)%$nbJPa==$partie["preneur"] || $cartesTombees[5]==0 || (partie.joueurs[tourDe]["posTable"]+2)%$nbJPa==$partie["preneur"] ))
10886    $scoreCarteActuelle+=1600; // essayer de decouvrir une couleur si on est jsute avant le preneur
10887    else
10888    $scoreCarteActuelle-=800; // essayer de ne pas decouvrir une couleur
10889    }
10890    if ($jaiLePetit)
10891    $scoreCarteActuelle+=3000-$nbCouleurEnMain[$typeCJ]*150; // essayer de se faire couper
10892    else
10893    $scoreCarteActuelle+=$nbCouleurEnMain[$typeCJ]*15; // essayer de faire couper
10894    
10895    if (getPointsCarteIA($carte)>0.5) {
10896    $scoreCarteActuelle-=300;
10897    if ($nbCoupes["attaque"][$typeCJ]>0)
10898    $scoreCarteActuelle-=1000*getPointsCarteIA($carte);
10899    }
10900    
10901   }
10902   $scoreCarteActuelle+=6000-getPointsCarteIA($carte)*1000-$numCarte; // laPlusPetiteDesMoinsDePoints 
10903   } 
10904   else if ( ($cartePreneuse || $preneurPliDansMonCamp || ($unDefenseurCoupe && !$lAttaqueCoupe) ) && ($attaqueAFiniDeJouer || ($meilleurAtoutPreneur && $preneurPliDansMonCamp) ) )     
10905   { 
10906   //if (!isset($IAlogOnce)) logIAaction ("Mode victoire pour sur de la defense");
10907   $scoreCarteActuelle+=1000+200+getPointsCarteIA($carte)*100-$numCarte; //laPlusPetiteDesPlusDePoints 
10908   }
10909   else 
10910   {
10911   //if (!isset($IAlogOnce)) logIAaction ("Mode prudence de defense");
10912   $scoreCarteActuelle+=600-getPointsCarteIA($carte)*100-$numCarte; // laPlusPetiteDesMoinsDePoints
10913   }
10914  }
10915  if ( ( $carteJouee=='' || $scoreCarteJouee < $scoreCarteActuelle ) && $carte )
10916  {
10917   $scoreCarteJouee=$scoreCarteActuelle;
10918   $carteJouee = $carte;
10919  }
10920 }
10921 } 
10922 //logIAaction ("Decision : ".$carteJouee);          
10923 $joueCarte = $carteJouee; 
10924 
10925 
10926 
10927 
10928 
10929 
10930 
10931 
10932 
10933 
10934 
10935 
10936 
10937 joueCarte($joueCarte);
10938
10939 } else {
10940 clearCardsActionsClick ();
10941 showMessage('C\'est à vous de jouer !');
10942 console.log('set cards actions');
10943 for (var $i in partie.joueurs[tourDe].main)
10944 {
10945 var $carte = partie.joueurs[tourDe].main[$i];
10946 if (canIPlayCard($carte,$disposeCouleur,$disposeMeilleurAtout,$disposeAtout,$meilleurAtoutPose)) {
10947 selMoteur.setCardAction($carte,'joueCarteJou(\''+$carte+'\');');
10948 } else {
10949
10950 selMoteur.setCardAction($carte,'');
10951 }
10952 }
10953 activateCardActions(true);
10954 }
10955}
10956/*
10957var cardWidth = 120;
10958var cardHeight = 220;*/
10959var cardWidth = 80;
10960var cardHeight = 147;
10961
10962var isIE = navigator.appName.indexOf("Microsoft") != -1;
10963
10964
10965var wsocket;
10966var connectedToSocket = false;
10967var startConnexion = false;
10968
10969var distriHashAreShown = false;
10970
10971function showDistributionHash(str) {
10972 if (!distriHashAreShown) return;
10973 //$('#BTNQUT').attr('title','Code de hachage de distribution : '+str);
10974 selMoteur.addChatLine('Info distribution#Code de hachage '+str+'#');
10975}
10976var messageIntroMasked = false;
10977function showMessageIntro(txt)
10978{
10979 if (messageIntroMasked) return;
10980 // Le rendu du message sert aussi en fin de partie : conserver ici l'etape serveur.
10981 var etapeAvantIntro = etapeCourante;
10982 selMoteur.showMessagePlateauJeu(txt);
10983 etapeCourante = etapeAvantIntro;
10984 selMoteur.introAction();
10985}
10986function hideMessageIntro()
10987{
10988 if (messageIntroMasked) return;
10989 selMoteur.clearActions(); 
10990 selMoteur.clearMessagePlateauJeu();
10991 messageIntroMasked = true;
10992 if (window.rafraichirInvitationsAttente) rafraichirInvitationsAttente();
10993}
10994function setChelem() {
10995 isChelem = true;
10996 selMoteur.removeAction('Chelem');
10997 $('#infosJeu').find('a').last().remove();
10998 rpc('chelem='+isChelem);
10999}
11000var gameAddFriendsButtonsUsed = false;
11001function removeThisFriendsBtns(ids) {
11002 gameAddFriendsButtonsUsed = true;
11003 selMoteur.removeAction("Ajouter ces joueurs à mes amis");
11004}
11005function addThisFriendsBtns(actions) {
11006 if (gameAddFriendsButtonsUsed) return;
11007 //var listFriendsIds = ids.split('-');
11008 selMoteur.addAction('Ajouter ces joueurs à mes amis','removeThisFriendsBtns();'+actions );
11009}
11010
11011function setEndGameQuitAction(theQuitAction) {
11012 $('#BTNQUT').attr('onclick',theQuitAction);
11013 GEN();
11014}
11015function batMode() {
11016 var r=function () { return Math.random()*0.6+0.2;},n=0,d=document,w=window,
11017 i=d.createElement('img'),
11018 z=d.createElement('div'),
11019 zs=z.style,
11020 a=w.innerWidth*r(),b=w.innerHeight*r();
11021 zs.position="fixed";
11022 zs.left=0;
11023 zs.top=0;
11024 zs.opacity=0;
11025 z.appendChild(i);
11026 z.id = 'batMobile';
11027 i.src='data:image/gif;base64,R0lGODlhMAAwAJECAAAAAEJCQv///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQACACwAAAAAMAAwAAACdpSPqcvtD6NcYNpbr4Z5ewV0UvhRohOe5UE+6cq0carCgpzQuM3ut16zvRBAH+/XKQ6PvaQyCFs+mbnWlEq0FrGi15X
11027ZJSmxP8OTRj4DyWY1lKdmV8fyLL3eXOPn6D3f6BcoOEhYaHiImKi4yNjo+AgZKTl5WAAAIfkECQEAAgAsAAAAADAAMAAAAnyUj6nL7Q+jdCDWicF9G1vdeWICao05ciUVpkrZIqjLwCdI16s+5wfck+F8JOBiR/zZZAJk0mAsDp/KIHRKvVqb2KxTu/Vdvt/nGFs2V5Bpta3tBcKp8m5WWL/z5PpbtH/0B/iyNGh4iJiouMjY6PgIGSk5SVlpeYmZqVkAACH5BAkBAAIALAAAAAAwADAAAAJhlI+py+0Po5y02ouz3rz7D4biSJbmiabq6gCs4B5AvM7GTKv4buby7vsAbT9gZ4h0JYmZpXO4YEKeVCk0QkVUlw+uYovE8ibgaVBSLm1Pa3W194rL5/S6/Y7P6/f8vp9SAAAh+QQJAQACACwAAAAAMAAwAAACZZSPqcvtD6OctNqLs968+w+G4kiW5omm6ooALeCusAHHclyzQs3rOz9jAXuqIRFlPJ6SQWRSaIQOpUBqtfjEZpfMJqmrHIFtpbGze2ZywWu0aUwWEbfiZvQdD4sXuWUj7gPos1EAACH5BAkBAAIALAAAAAAwADAAAAJrlI+py+0Po5y02ouz3rz7D4ZiCIxUaU4Amjrr+rDg+7ojXTdyh+e7kPP0egjabGg0EIVImHLJa6KaUam1aqVynNNsUvPTQjO/J84cFA3RzlaJO2495TF63Y7P6/f8vv8PGCg4SFhoeIg4UQAAIfkEBQEAAgAsAAAAADAAMAAAAnaUj6nL7Q+jXGDaW6+GeXsFdFL4UaITnuVBPunKtHGqwoKc0LjN7rdes70QQB/v1ykOj72kMghbPpm51pRKtBaxoteV2SUpsT/Dk0Y+A8lmNZSnZlfH8iy93lzj5+g93+gXKDhIWGh4iJiouMjY6PgIGSk5eVgAADs=';
11028 i.onclick=function(){$(this).remove();$('#global').html('<h1>Joyeux halloween !</h1><p>Bravo ! Vous avez capturé une chauve souris d\'halloween !'); }; 
11029 d.body.appendChild(z);
11030 function R(o,m){return Math.max(Math.min(o+(r()-.5)*400,m-50),50)}
11031 function A(){
11032 var x=R(a,w.innerWidth),y=R(b,w.innerHeight),
11033 d=5*Math.sqrt((a-x)*(a-x)+(b-y)*(b-y));
11034 zs.opacity=n;n=1;
11035 zs.transition=zs.webkitTransition=d/1e3+'s linear';
11036 zs.transform=zs.webkitTransform='translate('+x+'px,'+y+'px)';
11037 i.style.transform=i.style.webkitTransform=(a>x)?'':'scaleX(-1)';
11038 a=x;b=y;
11039 if ($$('batMobile')!=null)
11040 setTimeout(A,d);
11041 };setTimeout(A,r()*3e3);
11042};
11043
11044function cancelCompetitionGame() {
11045 confirme('ATTENTION : Cette opération comptabilise un abandon pour le joueur qui met actuellement trop longtemps à jouer. Voulez-vous vraiment annuler la partie ?',function () {
11046 rpc('cancelCompetitionGame=1');
11047 if (selMoteur) selMoteur.clearActions(); 
11048 });
11049}
11050var roomReconnectTO = 0;
11051var roomReconnectAttempts = 0;
11052var roomConnectionId = null;
11053var roomReconnectDelays = [1000,2000,5000,10000,30000];
11054
11055function closeConnexion() {
11056 roomConnectionId = null;
11057 clearTimeout(roomReconnectTO);
11058 roomReconnectTO = 0;
11059 roomReconnectAttempts = 0;
11060 connectedToSocket = false;
11061 startConnexion = false;
11062 var roomSocket = wsocket;
11063 wsocket = null;
11064 if (roomSocket) roomSocket.close();
11065}
11066function connectToRoom(idRoom,isRetry) {
11067 if (startConnexion) return;
11068 roomConnectionId = idRoom;
11069 clearTimeout(roomReconnectTO);
11070 roomReconnectTO = 0;
11071 if (!isRetry) roomReconnectAttempts = 0;
11072 closeConnexionSalon();
11073 startConnexion = true;
11074 llog('connectToRoom');
11075 var roomSocket = new WebSocket("wss://socket.jeu-tarot-en-ligne.com:9443");
11076 wsocket = roomSocket;
11077
11078 roomSocket.onopen = function (event) {
11079 if (wsocket!==roomSocket) return;
11080 roomSocket.send('{ "type":"joinRoom", "content":"'+idRoom+'"}' );
11081 connectedToSocket = true;
11082 roomReconnectAttempts = 0;
11083 llog('connectedToSocket');
11084 sendPing ();
11085 };
11086 roomSocket.onclose = function (evt) {
11087 if (wsocket!==roomSocket) return;
11088 llog('closed');
11089 startConnexion = false;
11090 connectedToSocket = false;
11091 wsocket = null;
11092 // Retenter aussi si la connexion precedente n'avait jamais atteint onopen.
11093 if (roomReconnectAttempts<roomReconnectDelays.length) {
11094  var delay = roomReconnectDelays[roomReconnectAttempts++];
11095  roomReconnectTO = setTimeout(function () {
11096  roomReconnectTO = 0;
11097  connectToRoom(idRoom,true);
11098  },delay);
11099 }
11100 };
11101
11102 roomSocket.onmessage = function (event) {
11103 if (wsocket!==roomSocket) return;
11104 var message = JSON.parse(event.data);
11105 switch(message.type) {
11106  case "text":
11107  llog(message.content);
11108  break;
11109  case "pingRoom":
11110  getPing ();
11111  break;
11112 }
11113 };
11114}
11115// Le retour du reseau relance une connexion souhaitee, jamais une connexion fermee volontairement.
11116if (window.addEventListener) {
11117 window.addEventListener('online',function () {
11118 if (roomConnectionId!==null && !startConnexion && !connectedToSocket)
11119  connectToRoom(roomConnectionId);
11120 },false);
11121}
11122
11123var wsocketSalon;
11124var connectedToSalonSocket = false;
11125var startSalonConnexion = false;
11126var salonReconnectTO = 0;
11127
11128function connectToSalon(userid) {
11129 try {
11130 connectToSalonInt(userid); 
11131 } catch (u) {}
11132}
11133function closeConnexionSalon() {
11134 clearTimeout(salonReconnectTO);
11135 salonReconnectTO = 0;
11136 connectedToSalonSocket = false;
11137 startSalonConnexion = false;
11138 var salonSocket = wsocketSalon;
11139 wsocketSalon = null;
11140 if (salonSocket) {
11141 salonSocket.close();
11142 llog('sendSalon Close ');
11143 }
11144}
11145function connectToSalonInt(userid) {
11146 if (startSalonConnexion) return;
11147 clearTimeout(salonReconnectTO);
11148 salonReconnectTO = 0;
11149 startSalonConnexion = true;
11150 llog('connectToSalon'+userid);
11151 var salonSocket = new WebSocket("wss://socket.jeu-tarot-en-ligne.com:9443");//ws://socket.jeu-tarot-en-ligne.com:8100");
11152 wsocketSalon = salonSocket;
11153 //wsocketSalon = new WebSocket("wss://localhost:9443");
11154
11155 salonSocket.onopen = function (event) {
11156 if (wsocketSalon!==salonSocket || !startSalonConnexion) {
11157 salonSocket.close();
11158 return;
11159 }
11160 var joinParams = '{ "type":"joinRoom", "content":"SalonTarot","userid":"'+userid+'"}' 
11161 salonSocket.send(joinParams); 
11162 //llog(joinParams);
11163 connectedToSalonSocket = true;
11164 llog('connectedToSalon');
11165 sendPing ();
11166 };
11167 salonSocket.onclose = function (evt) {
11168 llog('closedSalon');
11169 if (wsocketSalon!==salonSocket) return;
11170 var reconnectToSalon = connectedToSalonSocket;
11171 wsocketSalon = null;
11172 startSalonConnexion = false;
11173 connectedToSalonSocket = false;
11174 if (reconnectToSalon) {
11175 clearTimeout(salonReconnectTO);
11176 salonReconnectTO = setTimeout(function() {connectToSalon(userid); } , 1000);
11177 }
11178 };
11179
11180 salonSocket.onmessage=function(event) { 
11181 //llog('onmessage');
11182 var message = JSON.parse(event.data);
11183 //llog(message);
11184 switch(message.type) {
11185 case "pingPlayer":
11186 llog('pingPlayer',message);
11187 //llog('pingPlayer');
11188 refreshSalonExtern();
11189 break; 
11190 case "pingRoom":
11191 refreshSalonExtern();
11192 break; 
11193 }
11194 };
11195
11196}
11197function sendSalonGlobalPing () {
11198 if (connectedToSalonSocket){
11199 wsocketSalon.send('{ "type":"pingRoom"}' ); 
11200 llog('sendSalonPing to '+userid);
11201 }
11202} 
11203function sendSalonPing (userid) {
11204 if (connectedToSalonSocket){
11205 wsocketSalon.send('{ "type":"pingPlayer","userid":"'+userid+'"}' ); 
11206 llog('sendSalonPing to '+userid);
11207 }
11208} 
11209var wsocketWeb;
11210var connectedToWebSocket = false;
11211var startWebConnexion = false;
11212var webSocketUserId = 0;
11213var webSocketReconnectTO = 0;
11214var webSocketAdminAlertShown = false;
11215var webSocketAdminAlertTO = 0;
11216var webSocketLastConnectedAt = 0;
11217var webSocketAdminAlertDelay = 10*60*1000;
11218var webSocketTabChannel = null;
11219var webSocketTabChannelUserId = 0;
11220var webSocketTabOwnsConnection = false;
11221var webSocketTabOpenedAt = window.performance && typeof window.performance.timeOrigin==="number" ? Math.floor(window.performance.timeOrigin) : (new Date()).getTime();
11222var webSocketTabClaimNonce = Math.random();
11223
11224function webSocketTabClaimIsNewer(message) {
11225 var openedAt = parseInt(message.openedAt,10);
11226 var claimNonce = parseFloat(message.claimNonce);
11227 if (isNaN(openedAt) || isNaN(claimNonce)) return false;
11228 return openedAt>webSocketTabOpenedAt || (openedAt===webSocketTabOpenedAt && claimNonce>webSocketTabClaimNonce);
11229}
11230
11231function closeWebSocketTransport() {
11232 clearTimeout(webSocketReconnectTO);
11233 webSocketReconnectTO = 0;
11234 clearTimeout(webSocketAdminAlertTO);
11235 webSocketAdminAlertTO = 0;
11236 startWebConnexion = false;
11237 connectedToWebSocket = false;
11238 var webSocket = wsocketWeb;
11239 wsocketWeb = null;
11240 if (webSocket) {
11241 try { webSocket.close(); } catch (u) {}
11242 }
11243}
11244
11245function configureWebSocketTabChannel(userid) {
11246 if (webSocketTabChannel) {
11247 try { webSocketTabChannel.close(); } catch (u) {}
11248 webSocketTabChannel = null;
11249 }
11250 webSocketTabChannelUserId = 0;
11251 webSocketTabOwnsConnection = true;
11252
11253 if (typeof window.BroadcastChannel!=="function") return;
11254
11255 try {
11256 var channel = new window.BroadcastChannel("tarot-websocket-user-"+userid);
11257 webSocketTabChannel = channel;
11258 webSocketTabChannelUserId = userid;
11259 channel.onmessage = function (event) {
11260 if (webSocketTabChannel!==channel) return;
11261 var message = event && event.data ? event.data : {};
11262 if (parseInt(message.ownerUserId,10)!==webSocketTabChannelUserId) return;
11263 if (message.type==="takeover" && webSocketTabClaimIsNewer(message)) {
11264 webSocketTabOwnsConnection = false;
11265 closeWebSocketTransport();
11266 llog('webSocketTakenOverByNewTab');
11267 } else if (message.type==="pingPlayer" && webSocketTabOwnsConnection) {
11268 sendWebPingDirect(message.userid);
11269 }
11270 };
11271 // Le dernier onglet ouvert devient proprietaire. Il n'y a volontairement
11272 // ni heartbeat ni reprise automatique par un ancien onglet.
11273 channel.postMessage({type:"takeover",ownerUserId:userid,openedAt:webSocketTabOpenedAt,claimNonce:webSocketTabClaimNonce});
11274 } catch (u) {
11275 webSocketTabChannel = null;
11276 webSocketTabChannelUserId = 0;
11277 webSocketTabOwnsConnection = true;
11278 }
11279}
11280
11281function showWebSocketConnectionProblemForAdmin(notifyAdmin) {
11282 if (!notifyAdmin || !webSocketTabOwnsConnection || connectedToWebSocket || webSocketAdminAlertShown || webSocketUserId===0) return;
11283 if (!webSocketLastConnectedAt || (new Date()).getTime()-webSocketLastConnectedAt<webSocketAdminAlertDelay) return;
11284 webSocketAdminAlertShown = true;
11285 alerte('<strong>Probl&egrave;me de connexion WebSocket</strong><br>La connexion au serveur de notifications n\'a pas pu &ecirc;tre &eacute;tablie. Une nouvelle tentative est en cours.');
11286}
11287
11288function scheduleWebSocketConnectionProblemForAdmin(notifyAdmin) {
11289 clearTimeout(webSocketAdminAlertTO);
11290 webSocketAdminAlertTO = 0;
11291 if (!notifyAdmin || !webSocketTabOwnsConnection || connectedToWebSocket || webSocketAdminAlertShown || webSocketUserId===0) return;
11292 var attente = webSocketAdminAlertDelay-((new Date()).getTime()-webSocketLastConnectedAt);
11293 if (attente<=0) {
11294 showWebSocketConnectionProblemForAdmin(notifyAdmin);
11295 return;
11296 }
11297 webSocketAdminAlertTO = setTimeout(function () {
11298 webSocketAdminAlertTO = 0;
11299 showWebSocketConnectionProblemForAdmin(notifyAdmin);
11300 },attente);
11301}
11302
11303function connectToWeb(userid,notifyAdmin) {
11304 userid = parseInt(userid,10);
11305 if (!userid) return;
11306 if (webSocketUserId && webSocketUserId!==userid)
11307 closeWebSocketTransport();
11308 if (webSocketUserId!==userid) {
11309 webSocketLastConnectedAt = (new Date()).getTime();
11310 webSocketAdminAlertShown = false;
11311 }
11312 webSocketUserId = userid;
11313 configureWebSocketTabChannel(userid);
11314 scheduleWebSocketConnectionProblemForAdmin(notifyAdmin===true);
11315 connectToWebForOwner(userid,notifyAdmin===true);
11316}
11317function closeConnexionWeb() {
11318 webSocketTabOwnsConnection = false;
11319 webSocketUserId = 0;
11320 closeWebSocketTransport();
11321 if (webSocketTabChannel) {
11322 try { webSocketTabChannel.close(); } catch (u) {}
11323 webSocketTabChannel = null;
11324 }
11325 webSocketTabChannelUserId = 0;
11326}
11327function scheduleWebSocketReconnect(userid,notifyAdmin) {
11328 if (!webSocketTabOwnsConnection || webSocketUserId!==userid) return;
11329 scheduleWebSocketConnectionProblemForAdmin(notifyAdmin);
11330 clearTimeout(webSocketReconnectTO);
11331 webSocketReconnectTO = setTimeout(function () {
11332 webSocketReconnectTO = 0;
11333 connectToWebForOwner(userid,notifyAdmin);
11334 },1000);
11335}
11336function connectToWebForOwner(userid,notifyAdmin) {
11337 if (!webSocketTabOwnsConnection || webSocketUserId!==userid) return;
11338 try {
11339 connectToWebInt(userid,notifyAdmin);
11340 } catch (u) {
11341 closeWebSocketTransport();
11342 scheduleWebSocketReconnect(userid,notifyAdmin);
11343 }
11344}
11345function connectToWebInt(userid,notifyAdmin) {
11346 userid = parseInt(userid,10);
11347 if (!userid || !webSocketTabOwnsConnection || webSocketUserId!==userid || startWebConnexion) return;
11348 clearTimeout(webSocketReconnectTO);
11349 webSocketReconnectTO = 0;
11350 webSocketUserId = userid;
11351 startWebConnexion = true;
11352 llog('connectToWeb'+userid);
11353 var webSocket = new WebSocket("wss://socket.jeu-tarot-en-ligne.com:9443");
11354 wsocketWeb = webSocket;
11355 //wsocketWeb = new WebSocket("wss://localhost:9443");
11356
11357 webSocket.onopen = function () {
11358 if (wsocketWeb!==webSocket || !webSocketTabOwnsConnection || webSocketUserId!==userid) {
11359 webSocket.close();
11360 return;
11361 }
11362 webSocket.send('{ "type":"joinRoom", "content":"SalonWeb","userid":"'+userid+'"}');
11363 connectedToWebSocket = true;
11364 webSocketLastConnectedAt = (new Date()).getTime();
11365 clearTimeout(webSocketAdminAlertTO);
11366 webSocketAdminAlertTO = 0;
11367 llog('connectedToWeb');
11368 webSocketAdminAlertShown = false;
11369 };
11370 webSocket.onerror = function () {
11371 if (wsocketWeb===webSocket && webSocketTabOwnsConnection && webSocketUserId===userid)
11372 scheduleWebSocketConnectionProblemForAdmin(notifyAdmin);
11373 };
11374
11375 webSocket.onclose = function () {
11376 llog('closedWeb');
11377 if (wsocketWeb!==webSocket) return;
11378 if (connectedToWebSocket)
11379 webSocketLastConnectedAt = (new Date()).getTime();
11380 startWebConnexion = false;
11381 connectedToWebSocket = false;
11382 wsocketWeb = null;
11383 scheduleWebSocketReconnect(userid,notifyAdmin);
11384 };
11385 webSocket.onmessage = function (event) {
11386 if (wsocketWeb!==webSocket || !webSocketTabOwnsConnection) return;
11387 var message;
11388 try {
11389 message = JSON.parse(event.data);
11390 } catch (u) {
11391 return;
11392 }
11393 if (message.type==="pingPlayer" || message.type==="pingRoom")
11394 getNewsUtilNow();
11395 };
11396}
11397function sendWebPingDirect(userid) {
11398 userid = parseInt(userid,10);
11399 if (webSocketTabOwnsConnection && connectedToWebSocket && wsocketWeb && userid>0) {
11400 wsocketWeb.send('{ "type":"pingPlayer","userid":"'+userid+'"}');
11401 llog('sendWebPing to '+userid);
11402 }
11403}
11404function sendWebPing(userid) {
11405 userid = parseInt(userid,10);
11406 if (userid<=0) return;
11407 if (webSocketTabOwnsConnection)
11408 sendWebPingDirect(userid);
11409 else if (webSocketTabChannel) {
11410 try {
11411 webSocketTabChannel.postMessage({type:"pingPlayer",ownerUserId:webSocketTabChannelUserId,userid:userid});
11412 } catch (u) {}
11413 }
11414}
11415function salonClose () {
11416 closeConnexionSalon();
11417} 
11418var timeOutSleep = 0;
11419
11420function getPing () {
11421 if (recapChatMsgIdPartie) {
11422 reloadRecapChatMsg();
11423 return;
11424 }
11425 if (timeOutSleep)
11426 nextDelayIsNull=1;
11427 else
11428 refreshTO (50,true);
11429 //getNews();
11430}
11431function sendPing () {
11432 var roomSocket = wsocket;
11433 if (!connectedToSocket || !roomSocket || roomSocket.readyState!==1) return;
11434 try {
11435 roomSocket.send('{ "type":"pingRoom"}' );
11436 } catch (e) {
11437 // La socket peut se fermer entre la verification et l'envoi.
11438 llog('pingRoom indisponible');
11439 }
11440} 
11441
11442
11443function reinitialiserEtatPartie()
11444{
11445 // Les selections appartiennent a une partie, pas seulement a son numero de manche.
11446 poigneeInit = -1;
11447 cartesPoignee = new Array();
11448 cartesChien = new Array();
11449 cardActionsActivated = false;
11450 lastMO = null;
11451 isChelem = false;
11452 window.nochien = false;
11453
11454 // Ne pas conserver les restrictions et les actions de la table precedente.
11455 messageIntroMasked = false;
11456 showedDislikeBtns = false;
11457 gameAddFriendsButtonsUsed = false;
11458 distriHashAreShown = false;
11459 siQuitAbandon = 0;
11460 webIDGame = 0;
11461 etapeCourante = '';
11462 isReplayedGame = false;
11463 isOffLineGame = false;
11464
11465 // Un message differe de l'ancienne partie ne doit pas remplacer le nouveau.
11466 clearTimeout(msgTimeoutPPalTO);
11467 msgTimeoutPPalTO = 0;
11468 dateMsgTimeoutPPal = 0;
11469 queueMsg = new Array();
11470 annonce = '';
11471}
11472
11473var currentGameId = 0;
11474function setCurrentGameId (id,connectWS)
11475{
11476 if (currentGameId!=id) reinitialiserAlerteDepart();
11477 if (currentGameId!=id && typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu();
11478 if (currentGameId!=id && typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
11479 currentGameId = id;
11480 if (id && connectWS) {
11481 try {
11482 connectToRoom(id); 
11483 } catch (u) {}
11484 }
11485} 
11486
11487function getDistance(obj1, obj2){
11488 var obj1 = document.getElementById(obj1);
11489 var obj2 = document.getElementById(obj2);
11490 var pos1 = getRelativePos(obj1);
11491 var pos2 = getRelativePos(obj2);
11492 var dx = pos1.offsetLeft - pos2.offsetLeft;
11493 var dy = pos1.offsetTop - pos2.offsetTop;
11494 return {x:dx, y:dy};
11495}
11496function getRelativePos(obj){
11497 var pos = {offsetLeft:0,offsetTop:0};
11498 while(obj!=null){
11499 pos.offsetLeft += obj.offsetLeft;
11500 pos.offsetTop += obj.offsetTop;
11501 obj = isIE ? obj.parentElement : obj.offsetParent;
11502 }
11503 return pos;
11504}
11505function getCardJSIMG(cardName) {
11506 if (window.TarotCards && window.TarotCards.isReady()) {
11507 var tarotCardSource = window.TarotCards.getSrc(cardName);
11508 if (tarotCardSource) return tarotCardSource;
11509 }
11510 var res = '';
11511 if (typeof cacheCarteHR!=='undefined') {
11512
11513 res+=cacheCarteHR[cardName.split('gif').join('png')];
11514 return imgPresJSprocess(res);
11515 }
11516 else if (typeof cacheCarte!=='undefined') {
11517
11518 res+=cacheCarte[cardName];
11519 return res;
11520 }
11521 else {
11522 var params = {
11523 stack:new Error().stack,
11524 lastAjaxRequest:lastAjaxRequest,
11525 resLoaded:resLoaded,
11526 resDownloaded:resDownloaded
11527 }
11528 errorLog ('cacheCarteHR undefined', params);
11529 return res;
11530 
11531 }
11532} 
11533function imgPresJSprocess(data) {
11534 /*if (typeof data=='undefined')
11535 return '';*/
11536 return 'data:image/png;base64,'+data;
11537 /*
11538 var res = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAFwCAYAAAD9tjQyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvq';
11539 if (data.substr(0,5)=='iVBOR')
11540 return 'data:image/png;base64,'+data;
11541 res+=data;
11542 return res;*/
11543}
11544
11545var nextDelayIsNull = 0;
11546var newsTO = 0;
11547function refreshTO (delay,bypassconnect)
11548{
11549 clearTO ();
11550 if (callStack==null || callStack.length==0 ) {
11551 if (nextDelayIsNull>0) {
11552  getNews();
11553  nextDelayIsNull=0;
11554 }
11555 else {
11556  if (connectedToSocket && !bypassconnect)
11557  newsTO = setTimeout(getNews,500+delay);
11558  else
11559  newsTO = setTimeout(getNews,delay);
11560 }
11561 }
11562}
11563function clearTO ()
11564{
11565 clearTimeout(newsTO);
11566}
11567function getNews ()
11568{
11569 if (dateDebutPartie==null) return;
11570 clearTO ();
11571 rpc('etape=inGame');//, '', repStartGame
11572}
11573
11574
11575var old,head=0
11576var old,head=0
11577var scrNum=new Date().getTime();
11578
11579var tabAnnonces = new Array ('','Prise','Garde','Garde sans','Garde contre');
11580var tabAnnoncesCrt = new Array ('','Prise','Garde','Garde Ss.','Garde C.');
11581
11582/* *************************************** FORM UTIL *************************/
11583var TOPing;
11584function setPing(delai)
11585{
11586 //log('startPing '+delai);
11587 clearTimeout(TOPing);
11588 //TOPing = setTimeout(sendChatMessage,delai);
11589}
11590
11591
11592
11593
11594
11595/* *************************************** FONCTIONS DE COMMUNICATION *************************/ 
11596var gameMode = '';
11597function setGameMode(gm) {
11598 if (gm)
11599 gameMode = gm;
11600}
11601var ajaxCallXhr = null;
11602var callStack = null; 
11603
11604function rpc(str)
11605{
11606 if (ajaxCallXhr!=null)
11607 {
11608 if (callStack==null)
11609 {
11610  callStack = new Array();
11611  callStack.push(str);
11612 }
11613 else
11614 {   
11615  callStack.push(str);
11616 }
11617 }
11618 else
11619 {
11620 ajaxCallXhr = rpcParalell(str);
11621 }
11622}
11623var uidG = Math.round(Math.random()*999999);
11624
11625function rpcParalell(str)
11626{
11627 if (gameMode=='') {
11628 llog('empty gameMode');
11629 return;
11630 }
11631 clearTimeout(TOPing);     
11632 scrNum++;
11633 var request;
11634 function requestFailed() {
11635 // Une ancienne requete ou un appel hors file ne doit pas liberer la requete active.
11636 if (ajaxCallXhr!==request) return;
11637 ajaxCallXhr = null;
11638 if (callStack!=null && callStack.length>0)
11639  rpc(callStack.shift());
11640 else
11641  refreshTO(1000);
11642 }
11643 if (currentGameId!=0)
11644 request = ajax('/workers/jeu.php?CV='+codeVersion+'&'+str+'&s='+'scr'+scrNum+'&uidG='+uidG+'&idPartie='+currentGameId+'&gameMode='+gameMode, '', receptionRpc, requestFailed);
11645 else
11646 request = ajax('/workers/jeu.php?CV='+codeVersion+'&'+str+'&s='+'scr'+scrNum+'&uidG='+uidG+'&gameMode='+gameMode, '', receptionRpc, requestFailed);
11647 return request;
11648}
11649function rpcNoQueue(str) {
11650
11651 if (gameMode=='') {
11652 llog('empty gameMode');
11653 return;
11654 }
11655 scrNum++;
11656 if (currentGameId!=0)
11657 return ajax('/workers/jeu.php?CV='+codeVersion+'&'+str+'&s='+'scr'+scrNum+'&uidG='+uidG+'&idPartie='+currentGameId+'&gameMode='+gameMode, '', completeCallback);
11658 else
11659 return ajax('/workers/jeu.php?CV='+codeVersion+'&'+str+'&s='+'scr'+scrNum+'&uidG='+uidG+'&gameMode='+gameMode, '', completeCallback);
11660}
11661
11662function receptionRpc(t)
11663{
11664 if (t=='' || t=='<HTML></HTML') {
11665 llog('bad res');
11666 ajaxCallXhr = null;
11667 if (callStack!=null && callStack.length>0)
11668  rpc(callStack.shift());
11669 else
11670  refreshTO(1000);
11671 return;
11672 }
11673 threadProcess(t) ;
11674}
11675var dateStartProcessThread = null;
11676var estimatedLengthProcessThread = 0;
11677
11678function threadProcess(t)
11679{
11680 if (!dateStartProcessThread) dateStartProcessThread = new Date().getTime();
11681 var sleepTab = t.split('sleep();');
11682 if (sleepTab.length>1)
11683 {
11684 evalRes(sleepTab[0]);
11685 var rest = t.substr(t.indexOf('sleep();')+8);
11686 estimatedLengthProcessThread += 500;
11687 var delayBefEnd = estimatedLengthProcessThread-new Date().getTime()+dateStartProcessThread;
11688 //llog('delayBefEnd '+delayBefEnd);
11689 if (delayBefEnd<100) delayBefEnd = 100;
11690 if (delayBefEnd>1200) delayBefEnd = 1000;
11691 timeOutSleep = setTimeout( function () { threadProcess(rest);timeOutSleep = 0; } , delayBefEnd);
11692 
11693 } else {
11694 evalRes((t));
11695 ajaxCallXhr = null;
11696 dateStartProcessThread = null;
11697 estimatedLengthProcessThread = 0;
11698 //delayedInProcessThread = 0;
11699 
11700 if (callStack!=null && callStack.length>0 )
11701 {
11702  var tmpCallst = callStack.shift();
11703  rpc(tmpCallst); 
11704 }
11705 }
11706}   
11707function completeCallback(t)
11708{
11709 var sleepTab = t.split('sleep();');
11710 if (sleepTab.length>1)
11711 {
11712 evalRes(sleepTab[0]);
11713 var rest = t.substr(t.indexOf('sleep();')+8);
11714 setTimeout( function () { completeCallback(rest); } , 500);
11715 }
11716 else
11717 evalRes((t));
11718} 
11719
11720function decodeChatLineObj(txt) {
11721 //$pseudo,$line,$date,$idUtil
11722 var tmp = unescape(txt.split('+').join(' ')).split('#');
11723 return tmp;
11724}
11725
11726
11727
11728
11729var currentRegle = 0;
11730var shouldNavigToRegle = 0;
11731var TOregles = null;
11732var dateLastRegle = 0;
11733
11734function showRegleRobot(num)
11735{
11736 return;
11737 var tmpDate = new Date().getTime();
11738 if (tmpDate-dateLastRegle<15000) return;
11739 shouldNavigToRegle = num;
11740 clearTimeout(TOregles);
11741 TOregles = setTimeout(TOreglesFn,1500);
11742}
11743function TOreglesFn ()
11744{
11745 showRegle(shouldNavigToRegle);
11746}
11747function showRegle(num)
11748{
11749 return;
11750 //log('showRegle'+num);
11751 clearTimeout(TOregles);
11752 if (currentRegle!=num)
11753 {
11754 dateLastRegle = new Date().getTime();
11755 currentRegle=num;
11756 //scrollToAnchor('content','reglesBtn'+num);
11757 }
11758}
11759
11760function scrollToAnchor(div,anchor)
11761{
11762 if (document.getElementById('Jeu')!=null) return;
11763
11764 $('html, body').stop().animate( { scrollTop: $$(anchor).offsetTop }, 750 );
11765} 
11766function sendEmailJoueur(i)
11767{
11768 //$("#dialog").dialog();
11769 var p;
11770 if (p=prompt('Pour envoyer un email à ce joueur, saisissez un message et validez :',''))
11771 {
11772 if (p!=null && p.length>0)
11773 rpcNoQueue('sendMailMsg='+i+'&sendMailMsgTxt='+p);
11774 }
11775 
11776} 
11777function showBackground(img)
11778{ 
11779 if (techniqueLevelAnim==0 && img=='blancCasse.png' && gamePhaser)
11780 img = 'FondMarron.png';
11781 var jeuDiv = $$('backgroundJeu');//Jeu
11782 $(document.body).css('min-height','100%');
11783 $(document.body).css('background','url(\'/images/plateau/'+img+'\') repeat fixed bottom left');
11784 $(document.body).css('-webkit-background-size','cover');
11785 $(document.body).css('-moz-background-size','cover');
11786 $(document.body).css('-moz-background-size','cover');
11787 $(document.body).css('-o-background-size','cover');
11788 $(document.body).css('background-size','cover');
11789}
11790var jeuIsFicheJoueurShown = false;
11791var joueurDetailsScrollStyles = null;
11792
11793function bloquerDefilementJoueurDetails()
11794{
11795 if (joueurDetailsScrollStyles!=null) return;
11796 joueurDetailsScrollStyles = {
11797 bodyOverflow:document.body.style.overflow,
11798 bodyOverflowY:document.body.style.overflowY,
11799 htmlOverflow:document.documentElement.style.overflow,
11800 htmlOverflowY:document.documentElement.style.overflowY
11801 };
11802 document.body.style.overflow = 'hidden';
11803 document.body.style.overflowY = 'hidden';
11804 document.documentElement.style.overflow = 'hidden';
11805 document.documentElement.style.overflowY = 'hidden';
11806}
11807function restaurerDefilementJoueurDetails()
11808{
11809 if (joueurDetailsScrollStyles==null) return;
11810 document.body.style.overflow = joueurDetailsScrollStyles.bodyOverflow;
11811 document.body.style.overflowY = joueurDetailsScrollStyles.bodyOverflowY;
11812 document.documentElement.style.overflow = joueurDetailsScrollStyles.htmlOverflow;
11813 document.documentElement.style.overflowY = joueurDetailsScrollStyles.htmlOverflowY;
11814 joueurDetailsScrollStyles = null;
11815}
11816
11817function unityLoadJoueurDetail(joueurName, imageSrc) {
11818 if (jeuIsFicheJoueurShown) return;
11819 
11820 window.formerScroll = window.scrollY;
11821 window.scroll(0,0);
11822 $('#webBody').hide();
11823 jeuIsFicheJoueurShown = true;
11824 showJoueurDetailsMinLoading();
11825 ajax('/workers/joueur.php?joueur='+joueurName+'&minimized=true&otherSrc='+imageSrc, '', unityreceptionRpcJoueurDetails);
11826
11827}
11828function initialiserScriptsJoueurDetails(conteneur)
11829{
11830 var scripts = conteneur.querySelectorAll('script#script');
11831
11832 for (var i = 0; i < scripts.length; i++)
11833 {
11834 var ancienScript = scripts[i];
11835 var nouveauScript = document.createElement('script');
11836 nouveauScript.text = ancienScript.text || ancienScript.textContent || '';
11837 ancienScript.parentNode.replaceChild(nouveauScript, ancienScript);
11838 }
11839}
11840function initialiserFermetureJoueurDetails(conteneur,fermeture)
11841{
11842 var bouton = conteneur.querySelector('.joueurDetailsMinClose');
11843 var actions = conteneur.querySelector('.joueurDetailsMinActions');
11844 if (actions!=null && actions.querySelector('.btn')==null)
11845 actions.parentNode.style.display = 'none';
11846 conteneur.onclick = function (event) {
11847 if (event && event.target===conteneur) {
11848  fermeture();
11849  return false;
11850 }
11851 };
11852 if (bouton!=null)
11853 {
11854 bouton.onclick = function (event) {
11855  if (event) {
11856  event.preventDefault();
11857  event.stopPropagation();
11858  }
11859  fermeture();
11860  return false;
11861 };
11862 }
11863}
11864function unityreceptionRpcJoueurDetails(t)
11865{
11866 hideJoueurDetailsMinLoading();
11867 bloquerDefilementJoueurDetails();
11868 var divJ = document.createElement('div');
11869 divJ.id = 'detailJoueur';
11870 divJ.innerHTML = t;
11871 $('#webBody').after(divJ);
11872 initialiserScriptsJoueurDetails(divJ);
11873 initialiserFermetureJoueurDetails(divJ,unityclearJoueurDetails);
11874 jeuIsFicheJoueurShown = true;
11875
11876}
11877function unityclearJoueurDetails()
11878{
11879
11880 window.vuplex.postMessage({ type: 'clearDetails' });
11881 
11882 var objDelme = $$('detailJoueur');
11883 if (objDelme!=null)
11884 {
11885 $('#webBody').show();
11886 $('#detailJoueur').remove();
11887 restaurerDefilementJoueurDetails();
11888
11889 if (window.formerScroll!=null) {
11890 window.scroll(0,window.formerScroll);
11891 window.formerScroll = null;
11892 }
11893 }
11894 jeuIsFicheJoueurShown = false;
11895} 
11896
11897
11898function receptionRpcJoueurDetails(t)
11899{
11900 hideJoueurDetailsMinLoading();
11901 window.formerScroll = window.scrollY;
11902 window.scroll(0,0);
11903 
11904 clearJoueurDetails();
11905 var divJ = document.createElement('div');
11906 divJ.id = 'detailJoueur';
11907 divJ.innerHTML = t;
11908
11909 bloquerDefilementJoueurDetails();
11910
11911 document.body.appendChild(divJ);
11912 initialiserScriptsJoueurDetails(divJ);
11913 initialiserFermetureJoueurDetails(divJ,clearJoueurDetails);
11914 jeuIsFicheJoueurShown = true;
11915
11916}
11917function clearJoueurDetails()
11918{
11919 var objDelme = $$('detailJoueur');
11920 if (objDelme!=null)
11921 {
11922 var returnFocus = objDelme._joueurReturnFocus;
11923 $('#webBody').show();
11924 $('#detailJoueur').remove();
11925 restaurerDefilementJoueurDetails();
11926
11927 if (window.formerScroll!=null) {
11928 window.scroll(0,window.formerScroll);
11929 window.formerScroll = null;
11930 }
11931 }
11932 jeuIsFicheJoueurShown = false;
11933 if (returnFocus && document.documentElement.contains(returnFocus)) returnFocus.focus();
11934} 
11935function showJoueurDetailsMinLoading()
11936{
11937 var loader = $$('joueurDetailsMinLoader');
11938 if (loader==null)
11939 {
11940 loader = document.createElement('div');
11941 loader.id = 'joueurDetailsMinLoader';
11942 loader.setAttribute('role','status');
11943 loader.setAttribute('aria-label','Chargement');
11944 loader.setAttribute('data-started-at',new Date().getTime());
11945 bloquerDefilementJoueurDetails();
11946 document.body.appendChild(loader);
11947 }
11948}
11949function hideJoueurDetailsMinLoading()
11950{
11951 var loader = $$('joueurDetailsMinLoader');
11952 if (loader!=null) {
11953 var startedAt = parseInt(loader.getAttribute('data-started-at'),10);
11954 var remaining = isNaN(startedAt)?0:Math.max(0,280-(new Date().getTime()-startedAt));
11955 var removeLoader = function () {
11956 if (loader.parentNode)
11957 loader.parentNode.removeChild(loader);
11958 };
11959 if (remaining>0)
11960 setTimeout(removeLoader,remaining);
11961 else
11962 removeLoader();
11963 }
11964}
11965function showJoueurDetailsMin (pseudo,idJoueur)
11966{
11967 showJoueurDetailsMinLoading();
11968 var urlFicheJoueur = '/workers/joueur.php?joueur='+pseudo+'&minimized=true&webDetail=1';
11969 idJoueur = parseInt(idJoueur,10);
11970 if (!isNaN(idJoueur) && idJoueur!==0)
11971 urlFicheJoueur += '&idJoueur='+encodeURIComponent(idJoueur);
11972 return ajax(urlFicheJoueur, '', receptionRpcJoueurDetails);
11973} 
11974function showFriendDetails (pseudo,idJoueur,onLoaded)
11975{
11976 showJoueurDetailsMinLoading();
11977 var url = '/workers/joueur.php?joueur='+pseudo+'&minimized=true&webDetail=1&myFriend=true';
11978 idJoueur = parseInt(idJoueur,10);
11979 if (!isNaN(idJoueur) && idJoueur>0) url += '&idJoueur='+encodeURIComponent(idJoueur);
11980 return ajax(url,'',function (html) {
11981 receptionRpcJoueurDetails(html);
11982 if (typeof onLoaded==='function') onLoaded();
11983 });
11984}
11985function showJoueurDetails (obj)
11986{
11987 if (!$(obj).data("pseudo")) return;
11988 var pseudoJ = $(obj).data("pseudo");
11989 var oth = $(obj).data("imgSrc");
11990 var idUtilisateurJ = parseInt($(obj).data("idUtilisateur"),10);
11991 if (isNaN(idUtilisateurJ)) {
11992 var spanJoueur = $(obj).find('[id^="spanJoueur"]').first();
11993 idUtilisateurJ = parseInt(spanJoueur.data("idUtilisateur"),10);
11994 }
11995 //var oth = $(obj).find('#avatJE img').attr('src');
11996 var num = $(obj).data("idPos");
11997 
11998 if (isOffLineGame) return false;
11999 notifyUserActivity();
12000 if (pseudoJ=='' || pseudoJ==null ) return;
12001 if ( pseudoJ!='Vide' && pseudoJ!='Libre' && pseudoJ!='Masqué') //return false;
12002 {
12003 if ( $$('detailJoueur')!=null)
12004 {
12005  reorganiseCartes ();
12006  return clearJoueurDetails();
12007 }
12008 else
12009 {
12010  playSoundEffect ('Camera_Zoom.mp3',true,0.9);
12011  showJoueurDetailsMinLoading();
12012  var urlFicheJoueur = '/workers/joueur.php?joueur='+encodeURIComponent(pseudoJ)+'&minimized=true&otherSrc='+encodeURIComponent(oth||'');
12013  if (!isNaN(idUtilisateurJ) && idUtilisateurJ!==0)
12014  urlFicheJoueur += '&idJoueur='+encodeURIComponent(idUtilisateurJ);
12015  return ajax(urlFicheJoueur, '', receptionRpcJoueurDetails);
12016 }
12017 }
12018 else if ( pseudoJ=='Vide')
12019 {
12020 clearTO ();
12021 rpc("addIA="+num);
12022 $('#divJoueur'+num).data("pseudo","IA");
12023 }
12024}
12025
12026
12027var isLowGraphism = false;
12028var etesVousLaFn = true;
12029var gameAdsObserver = null;
12030
12031function removeNonGameFuseAds(root) {
12032 var selector = '[data-fuse]:not([data-fuse="game_mrec"]),[class*="publift-widget-"][class*="-container"]';
12033 var elements = $(root || document).find(selector).add($(root || document).filter(selector));
12034
12035 elements.each(function () {
12036 var element = $(this);
12037 var isGameAd = element.attr('data-fuse')==='game_mrec' ||
12038 element.closest('[data-fuse="game_mrec"]').length>0 ||
12039 element.find('[data-fuse="game_mrec"]').length>0 ||
12040 (typeof this.className==='string' && this.className.indexOf('game_mrec')!==-1);
12041
12042 if (!isGameAd) element.remove();
12043 });
12044}
12045
12046function protectGameFromPageAds() {
12047 removeNonGameFuseAds(document);
12048 if (gameAdsObserver || !window.MutationObserver) return;
12049
12050 gameAdsObserver = new MutationObserver(function (mutations) {
12051 for (var mutationIndex=0;mutationIndex<mutations.length;mutationIndex++) {
12052 var mutation = mutations[mutationIndex];
12053 if (mutation.type==='attributes') removeNonGameFuseAds(mutation.target);
12054 for (var nodeIndex=0;nodeIndex<mutation.addedNodes.length;nodeIndex++) {
12055 var node = mutation.addedNodes[nodeIndex];
12056 if (node.nodeType===1) removeNonGameFuseAds(node);
12057 }
12058 }
12059 });
12060 gameAdsObserver.observe(document.body,{
12061 childList:true,
12062 subtree:true,
12063 attributes:true,
12064 attributeFilter:['class','data-fuse']
12065 });
12066}
12067
12068function setLowGraphisms() {
12069 $(document.body).addClass('lowRes');
12070 isLowGraphism = true;
12071}
12072
12073function decodeHtmlEntitiesForDocumentTitle(value) {
12074 var textarea = document.createElement('textarea');
12075 textarea.innerHTML = value==null ? '' : String(value);
12076 return textarea.value;
12077}
12078
12079function showGameBoard(modeJeu,chatJoueurs,nbJoueurs,etesVousLa,smileyOnly)
12080{
12081 etesVousLaFn = etesVousLa;
12082 $('#batMobile').remove();
12083 document.title = decodeHtmlEntitiesForDocumentTitle(getGameName(modeJeu))+" en cours...";
12084 notifyUserActivity();
12085 nombreDeJPartie = nbJoueurs;
12086 if (hasAGameStarted) return;
12087 hasAGameStarted = true;
12088 window.siteNotificationsPending = [];
12089 if (window.tarotSiteNotifications) window.tarotSiteNotifications.clear();
12090 closeConnexionSalon();
12091 closeConnexionWeb();
12092 
12093 protectGameFromPageAds();
12094 $('.dialogBox').remove();
12095 $('.ui-dialog').remove();
12096 $('#prefooter').remove();
12097 $('.siteHeader').remove();
12098 if ($$('homeLink')) $$('homeLink').onclick='return false;';
12099 $('#navBox').remove();
12100 $('#logoIMG').remove();
12101 $('#IDheader').remove();
12102 $('#IDfooter').remove();
12103 $(document.body).css('background','#FFF');
12104 $(document.body).css('overflow-x','hidden');
12105 $(document.body).css('overflow-y','scroll');
12106 $(document.body).css('text-align','center');
12107 $(document.body).addClass('noselect');
12108
12109 window.onunload = window.onbeforeunload = function(){
12110 return 'Etes vous sûr de vouloir quitter ?';
12111 };
12112
12113 
12114 selMoteur.createGameBoard(modeJeu,chatJoueurs,nbJoueurs,etesVousLa,smileyOnly);
12115 $('#cookieChoiceInfo').remove();
12116 CheckSizeZoom();
12117
12118}
12119function endGameAccountPrompt() {
12120 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu();
12121 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12122 rpcNoQueue('endGameAccountPrompt=1');
12123}
12124var jouerScrollEnAttente = '';
12125function jouerDefilerVersSection(section)
12126{
12127 var selecteurs = {
12128 salon:'#staticMJ .salonModes',
12129 missions:'#missionsDaily'
12130 };
12131 var selecteur = selecteurs[section] || '';
12132 var cible = selecteur ? document.querySelector(selecteur) : null;
12133 if (!cible && (section=='Libre' || section=='Tournoi' || section=='Competition'))
12134 cible = document.querySelector('.DivMJ'+section+':not(.jouerFiltreMasque)');
12135 if (!cible) {
12136 jouerScrollEnAttente = section;
12137 return false;
12138 }
12139
12140 jouerScrollEnAttente = '';
12141 window.setTimeout(function () {
12142 if (!document.documentElement.contains(cible)) return;
12143 var mouvementReduit = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
12144 if (typeof cible.scrollIntoView==='function')
12145 cible.scrollIntoView({behavior:mouvementReduit?'auto':'smooth',block:'start'});
12146 else
12147 window.scrollTo(0,cible.getBoundingClientRect().top+(window.pageYOffset || document.documentElement.scrollTop));
12148 },0);
12149 return true;
12150}
12151function ouvrirSalonJouer()
12152{
12153 jouerScrollEnAttente = 'salon';
12154 return showWorkerPage('inviter');
12155}
12156$(function () {
12157 $(document).off('ajaxComplete.jouerScroll').on('ajaxComplete.jouerScroll',function () {
12158 if (jouerScrollEnAttente) jouerDefilerVersSection(jouerScrollEnAttente);
12159 });
12160});
12161function selMJ (mj) {
12162 $('.selectedMJ').removeClass('selectedMJ');
12163 $('.MJ'+mj).addClass('selectedMJ');
12164
12165 var choixJouer = document.querySelectorAll('.jouerMenuChoix[aria-pressed],.jouerMenuMission[aria-pressed],.jouerMenuSalon[aria-pressed]');
12166 for (var choixIndex=0;choixIndex<choixJouer.length;choixIndex++)
12167 choixJouer[choixIndex].setAttribute('aria-pressed','false');
12168 var titreJouer = document.getElementById('jouerTitre');
12169 var boutonJouer = document.querySelector('a.MJJeu.MJ'+mj+'[data-jouer-titre]');
12170 if (boutonJouer) boutonJouer.setAttribute('aria-pressed','true');
12171 if (titreJouer && boutonJouer) {
12172 var nouveauTitre = boutonJouer.getAttribute('data-jouer-titre');
12173 if (typeof titreJouer.textContent !== 'undefined')
12174 titreJouer.textContent = nouveauTitre;
12175 else
12176 titreJouer.innerText = nouveauTitre;
12177 }
12178
12179 if (typeof window.jouerActualiserEtatFiltre==='function') window.jouerActualiserEtatFiltre();
12180 if (mj=='Tournoi' || mj=='Competition') scookie('memSelMJ2',mj);
12181 if (mj=='Missions' || mj=='Libre' || mj=='Tournoi' || mj=='Competition') jouerDefilerVersSection(mj=='Missions'?'missions':mj);
12182}
12183var curBouMode = gcookie('memSelPM');
12184var curBouTypeC = gcookie('memSelCREB');
12185function selBouti (mj) {
12186 $('.selectedPM').removeClass('selectedPM');
12187 curBouMode = mj;
12188 $('.PM'+curBouMode+'_'+curBouTypeC).addClass('selectedPM');
12189 $('.BT'+curBouMode).addClass('selectedPM');
12190 $('.BTT'+curBouTypeC).addClass('selectedPM');
12191 scookie('memSelPM',mj);
12192}
12193function selBoutiCre (mj) {
12194 if (curBouMode=="") curBouMode = "CB";
12195 $('.selectedPM').removeClass('selectedPM');
12196 curBouTypeC = mj;
12197 $('.PM'+curBouMode+'_'+curBouTypeC).addClass('selectedPM');
12198 $('.BT'+curBouMode).addClass('selectedPM');
12199 $('.BTT'+curBouTypeC).addClass('selectedPM');
12200 scookie('memSelCREB',mj);
12201}
12202var siQuitAbandon = 0;
12203function GSN() {
12204 if (typeof reinitialiserInvitationTableLibre==='function') reinitialiserInvitationTableLibre();
12205 if (siQuitAbandon==1) return;
12206 //notifStart();
12207 siQuitAbandon = 1;
12208 $('#BTNQUT').removeClass('btn-success');
12209 $('#BTNQUT').removeClass('btn-warning');
12210 $('#BTNQUT').addClass('btn-danger');
12211}
12212function GEN() {
12213 if (siQuitAbandon==2) return;
12214 siQuitAbandon = 2;
12215 $('#BTNQUT').addClass('btn-success').removeClass('btn-danger').removeClass('btn-warning');
12216}
12217function GENCPU(contexteDefiCpu) {
12218 GEN();
12219 if (typeof demarrerComparaisonDefiCpu==='function') demarrerComparaisonDefiCpu(contexteDefiCpu);
12220}
12221function GENLIBRE(contexteTableLibre) {
12222 GEN();
12223 if (typeof demarrerInvitationTableLibre==='function') demarrerInvitationTableLibre(contexteTableLibre);
12224}
12225var phaserMedalsDisabled = false;
12226function setNoMedals () {
12227 phaserMedalsDisabled = true;
12228}
12229var isOffLineGame = false;
12230
12231function btnQuitAction()
12232{
12233 if (isOffLineGame) quitOffline();
12234 else
12235 quitGame();
12236}
12237function closeBrowser()
12238{
12239 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu();
12240 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12241 rpcNoQueue('etape=end');
12242 //alert('browserclose'); 
12243}
12244function quitterDefiDuJour()
12245{
12246 confirme('Voulez-vous vraiment quitter la partie ?',function () {
12247 confirme('Voulez-vous abandonner le D&eacute;fi du jour ?<br><small>Si vous annulez, la partie sera conserv&eacute;e et vous pourrez la reprendre.</small>',function () {
12248 rpcNoQueue('etape=end&quitRequest=1&confirmMessageQuit=1&abandonDefiDuJour=1');
12249 },function () {
12250 rpcNoQueue('etape=end&quitRequest=1&confirmMessageQuit=1');
12251 });
12252 });
12253}
12254function quitterDefiPremium()
12255{
12256 confirme('Voulez-vous abandonner ce D&eacute;fi Premium ?<br><small>Si vous confirmez, vous ne pourrez plus rejouer ce d&eacute;fi et un nouveau d&eacute;fi vous sera propos&eacute;.<br>Si vous annulez, vous continuerez la partie en cours sans payer de nouveau.</small>',function () {
12257 rpcNoQueue('etape=end&quitRequest=1&confirmMessageQuit=1&abandonDefiPremium=1');
12258 });
12259}
12260function abandonnerDefiPremiumTermine(idDefi)
12261{
12262 confirme('Voulez-vous abandonner ce D&eacute;fi Premium ?<br><small>Vous ne pourrez plus le rejouer et vous acc&eacute;derez au r&eacute;capitulatif, o&ugrave; la solution pourra &ecirc;tre consult&eacute;e.</small>',function () {
12263 ajax('/workers/giveUpDefi.php','idDefi='+idDefi,function () {
12264 closeRecap('&abandonDefiPremium=1&idDefi='+idDefi);
12265 });
12266 });
12267}
12268function quitterDefiClassique()
12269{
12270 confirme('Abandonner ce d&eacute;fi classique ?<br><small>Cette participation comptera pour <b>0 % au classement</b> et vous ne pourrez plus rejouer ce d&eacute;fi.<br>Le d&eacute;fi co&ucirc;te <b>1 cr&eacute;dit</b>, y compris en cas d&rsquo;abandon. Si ce cr&eacute;dit a d&eacute;j&agrave; &eacute;t&eacute; d&eacute;bit&eacute;, il ne sera pas pr&eacute;lev&eacute; une seconde fois.<br>Annuler permet de continuer la partie. Fermer la fen&ecirc;tre conserve le d&eacute;fi pour le reprendre plus tard.</small>',function () {
12271 rpcNoQueue('etape=end&quitRequest=1&confirmMessageQuit=1&abandonDefiClassique=1');
12272 },null,false,{onOpen:function (modal,boutonConfirmer) { boutonConfirmer.textContent="Abandonner"; }});
12273}
12274function quitGame()
12275{
12276 if (typeof arreterInvitationsAttente==='function') arreterInvitationsAttente();
12277 if (/^Entrainement(?:3|5|6)?$/.test($('#modeJeuSalon').val()) && siQuitAbandon!=2) {
12278 quitterDefiClassique();
12279 return;
12280 }
12281 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu(); 
12282 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12283 if ($('#modeJeuSalon').val()=='DefiChoisi') {
12284 quitterDefiPremium();
12285 return;
12286 }
12287 if (($('#modeJeuSalon').val()=='DefiDuJour' || $('#modeJeuSalon').val()=='DefiSoutienDuJour') && siQuitAbandon!=2) {
12288 quitterDefiDuJour();
12289 return;
12290 }
12291 if (siQuitAbandon==1) {
12292 confirme('ATTENTION : Si vous ne terminez pas une partie, il vous sera compté un abandon. Voulez-vous vraiment quitter la partie ?',function () {
12293 rpcNoQueue('etape=end&quitRequest=1&confirmMessageQuit=1'); 
12294 });
12295 } else {
12296 rpcNoQueue('etape=end&quitRequest=1'); 
12297 }
12298}
12299function endGame()
12300{ 
12301 if (ajaxCallXhr!=null) ajaxCallXhr.abort();
12302 rpcNoQueue('etape=end');
12303 
12304 //finalURL='/index.php';
12305 //new ajax(finalURL, '', repEndGame);
12306} 
12307function gameCanceled ()
12308{  
12309 if ($$('Jeu')==null) return;
12310 //log('Un joueur a abandonn');
12311 alert('Un joueur a abandonné la partie.');
12312 closeGame () ;
12313}
12314function homeAction ()
12315{ 
12316 if ($$('modeJeuSalon')!=null) return false;
12317 return true;
12318}
12319function closeGame (IDdistribution)
12320{
12321 if (typeof arreterInvitationsAttente==='function') arreterInvitationsAttente();
12322 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu();  
12323 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12324 window.onunload = window.onbeforeunload = null;
12325
12326 var gotoLoc = '/Fin-de-partie.php?modeJeu='+$('#modeJeuSalon').val();
12327 if (IDdistribution) gotoLoc += '&IDdistribution='+IDdistribution;
12328 document.location = gotoLoc;
12329 //document.location = '/Fin-de-partie.php?modeJeu='+$('#modeJeuSalon').val();
12330}
12331var isReplayedGame = false;
12332function closeCPUGame (params)
12333{
12334 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu(); 
12335 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12336 window.onunload = window.onbeforeunload = null; 
12337
12338 if (isReplayedGame)
12339 document.location = '/Fin-de-partie.php?'+params+'&isR=1';
12340 else
12341 document.location = '/Fin-de-partie.php?'+params;
12342}
12343var webIDGame = 0;
12344function setWebIdGame(id) {
12345 webIDGame = id;
12346}
12347function closeRecap(IDdistribution) {
12348 if (typeof arreterComparaisonDefiCpu==='function') arreterComparaisonDefiCpu();
12349 if (typeof arreterInvitationTableLibre==='function') arreterInvitationTableLibre();
12350 if (webIDGame==0) return closeGame (IDdistribution);
12351 window.onunload = window.onbeforeunload = null;
12352
12353 var gotoLoc = '/Fin-de-partie.php?idPartie='+webIDGame+'&modeJeu='+$('#modeJeuSalon').val();
12354 if (IDdistribution) gotoLoc += '&IDdistribution='+IDdistribution;
12355 document.location = gotoLoc;
12356}
12357/* *************************************** FONCTIONS DE MISE EN PAGE *************************/
12358var etatRegles = 'ON';
12359function switchRegles(destEtat)
12360{
12361 if (destEtat==null) 
12362 {
12363 if (etatRegles=="ON") destEtat='OFF';
12364 else destEtat='ON';
12365 }
12366 if (destEtat==etatRegles) return;
12367 if (etatRegles=='ON')
12368 {
12369 etatRegles = "OFF";
12370 $$('content').style.borderBottom = '1px solid #aaaaaa';
12371 $$('content').style.borderTop = '1px solid #aaaaaa';
12372 $$('content').innerHTML = $$('content').innerHTML;
12373 }
12374 else
12375 {
12376 etatRegles = "ON";
12377 $$('content').style.borderBottom = '0px solid #bbbbbb';
12378 $$('content').style.borderTop = '0px solid #bbbbbb';     
12379 }
12380 
12381}
12382
12383function setManche(num) {
12384 var bouton = $('#IMGMJB');
12385 var manches = /^\s*(\d+)\s*\/\s*(\d+)\s*$/.exec(String(num));
12386 var plusieursManches = manches && Number(manches[2])>1;
12387 bouton.toggleClass('avecManche', !!plusieursManches).empty();
12388 var label = 'Afficher les r\u00e8gles de ce mode de jeu';
12389 if (plusieursManches) {
12390 var texte = Number(manches[1])+'/'+Number(manches[2]);
12391 $('<span class="numeroManche"></span>').text(texte).appendTo(bouton);
12392 label += ' - Manche '+texte;
12393 }
12394 bouton.attr('aria-label', label);
12395}
12396
12397function focusChat()
12398{
12399 try {
12400 jb.askForChatMessageToSend();
12401 } catch (e) { }
12402 try {
12403 $('#chatInput').focus();
12404 } catch (e) { }
12405} 
12406
12407var chatEnabled = false;
12408function enableChat()
12409{
12410 chatEnabled = true;
12411 $('#chat').css('visibility','visible');
12412} 
12413function blurAll(){
12414 $('#chatInputBtn').focus();
12415 $('#chatInputBtn').blur();
12416 return;
12417 var tmp = document.createElement("input");
12418 tmp.style.display='none';
12419 document.body.appendChild(tmp);
12420 tmp.focus();
12421 document.body.removeChild(tmp);
12422}
12423var shouldBlurInputMessageGame = false;
12424function sendChatMessage(str)
12425{
12426 if ( $$('chatInput')==null) return;
12427 if (!chatEnabled) 
12428 return alert('Veuillez attendre que la partie soit complète.');
12429 //clearSounds();
12430 //clearTO (); 
12431 notifyUserActivity();
12432 
12433 if (str=='')
12434 { 
12435 toggleChatD ();  
12436 return;
12437 }
12438
12439 phaserDecalChat = 0;
12440 
12441 rpcNoQueue('sendChatMsg='+escape(str).split('+').join('%2B'));
12442 $$('chatInput').value='';
12443 
12444 if (shouldBlurInputMessageGame && (isIos() || isAndroidPhaser()))
12445 blurAll();
12446}
12447
12448function carteSelectInt (obj)
12449{ 
12450 carteSelectionnee(obj.id); 
12451 notifyUserActivity();
12452 nbDelayedAnswers = 0;
12453 
12454 cardActionsActivated = false;
12455 selMoteur.timeThatRemains(-1,0);
12456
12457 clearTO () ; 
12458 rpc('joueCarte='+getCardName(obj));
12459}
12460
12461var shalAskForConfirmCardPlay = false;
12462var shalAskForconfirmationPetit = false;
12463var advanceCardPlayDisable = false;
12464
12465function carteSelect (obj,name)
12466{
12467 if (!cardActionsActivated) {
12468 return;
12469 }
12470 if (typeof selMoteur.hideIaCardAdvice=='function')
12471 selMoteur.hideIaCardAdvice();
12472 if (shalAskForConfirmCardPlay || (name=='le petit' && shalAskForconfirmationPetit)) {
12473 confirme('Etes-vous sûr de vouloir jouer '+name+' ?',function () {
12474 carteSelectInt (obj);
12475 });
12476 } else {
12477 carteSelectInt (obj);
12478 }
12479} 
12480
12481
12482function surLeTapis(name,opp)
12483{
12484 if (cartesSurLeTapis[opp]==null )
12485 {    
12486 setTimeout(function () { selMoteur.playOppCard(name,opp); } ,100);
12487 }
12488}
12489
12490function setVictory(num)
12491{
12492 selMoteur.setRoleJoueurClass(num,'roleVictoire');
12493}
12494function setDefeat(num)
12495{
12496 selMoteur.setRoleJoueurClass(num,'roleDefaite');
12497}
12498function setEquipier (i) {
12499 selMoteur.setPriseTxt(i,"Equipier");
12500 selMoteur.setRoleJoueurClass(i,'roleEquipier');
12501}
12502
12503var annonce = ''; 
12504var queueMsg = new Array(); 
12505function showMessage (msg)
12506{
12507 queueMsg.push(msg); 
12508 nextMessage();   
12509}
12510var msgTimeoutPPalTO = 0;
12511var dateMsgTimeoutPPal = 0;
12512
12513function nextMessage()
12514{
12515 clearTimeout(msgTimeoutPPalTO);
12516 var d = new Date();
12517 if (d.getTime()-dateMsgTimeoutPPal>1000)
12518 {
12519 dateMsgTimeoutPPal = d.getTime();
12520 var msg = queueMsg.shift(); 
12521 if (annonce=='') 
12522 {
12523  selMoteur.setGameMainMsg(msg); 
12524 }
12525 else selMoteur.setGameMainMsg(annonce+'<br />'+msg);
12526 }    
12527 if(queueMsg.length>0) 
12528 msgTimeoutPPalTO = setTimeout(nextMessage,1500);
12529}
12530function setMessage (msg)
12531{
12532 if (annonce=='') 
12533 {
12534 selMoteur.setGameMainMsg(msg); 
12535 }
12536 else selMoteur.setGameMainMsg(annonce+'<br />'+msg);
12537} 
12538
12539var zindexTop = 10; 
12540
12541/* *************************************** ANIMATION DES CARTES *************************/
12542var lastMO = null;
12543var lastTO = null;    
12544var oppArray = new Array (150+00,385+00,615+00,845+00);
12545//var oppArray = new Array (150,340,530,730);
12546//var oppArraySelector = new Array (111,351,575,800);
12547var lastOpp = 1;
12548var cardsNum = 0;
12549var whoamiNum = null;
12550
12551 
12552var cartesChien = new Array (); 
12553var cartesPoignee = new Array (); 
12554
12555function mySizeOf (obj) {
12556 var size = 0, key;
12557 for (key in obj) {
12558 if (obj[key] && obj.hasOwnProperty(key) && typeof obj[key].id!='undefined') size++;
12559 }
12560 return size;
12561};
12562function getCardName(obj)
12563{
12564 if (obj && typeof obj.getAttribute=='function') {
12565 var cardName = obj.getAttribute('data-card-name');
12566 if (cardName) return cardName;
12567 }
12568 var idObj = obj.alt;//.substr(6);
12569 return idObj;
12570} 
12571function refreeshCartesChien()
12572{  
12573 for (key in cartesChien) {
12574 if (cartesChien[key] && cartesChien.hasOwnProperty(key) && typeof cartesChien[key].id!='undefined') 
12575 {       
12576  if (!selMoteur.hasCardHand(key)) 
12577  {
12578  cartesChien = new Array (); 
12579  refreshChienMsg();
12580  return;
12581  }               
12582 }
12583 }
12584 for (key in cartesChien) {
12585 if (cartesChien[key] && typeof cartesChien[key].id!='undefined') {
12586 if (cartesChien.hasOwnProperty(key) ) 
12587  carteSelectionnee(cartesChien[key].id); 
12588 else
12589  carteSelectionnable(cartesChien[key].id);
12590 }
12591 }
12592 refreshChienMsg();
12593 
12594}
12595/*function refreeshCartesPoignee()
12596{  
12597 for (key in cartesPoignee) {
12598 if (cartesPoignee.hasOwnProperty(key) && typeof cartesPoignee[key].id!='undefined') 
12599 {       
12600  //if ($$(cartesPoignee[key].id)==null) 
12601  if (!selMoteur.hasCardHand(key)) 
12602  {
12603  alert('reset'+cartesPoignee[key].id);
12604  llog(cartesPoignee,cartesPoignee[key].id,key,phaserCards);
12605  cartesPoignee = new Array ();
12606  refreshPoigneeMsg(); 
12607  return;
12608  }               
12609 }
12610 }
12611 for (key in cartesPoignee) {
12612 if (cartesPoignee[key] && typeof cartesPoignee[key].id!='undefined') {
12613 if (cartesPoignee.hasOwnProperty(key)) 
12614  carteSelectionnee(cartesPoignee[key].id); 
12615 else
12616  carteSelectionnable(cartesPoignee[key].id); 
12617 }
12618 }
12619 refreshPoigneeMsg();
12620 
12621}*/
12622var poigneeInit = -1;
12623function initCartesPoignee (manche) 
12624{
12625 if (manche>poigneeInit)
12626 {
12627 poigneeInit = manche; 
12628 cartesPoignee = new Array ();
12629 return true;
12630 }
12631 return false;
12632}
12633function refreshChienMsg()
12634{ 
12635 var nbCartesChien = 6;
12636 if (nombreDeJPartie==5) nbCartesChien=3;
12637 if (nombreDeJPartie==6) nbCartesChien=3;
12638 var chienCSize = mySizeOf(cartesChien);
12639 
12640 if (chienCSize==nbCartesChien) setMessage('Constitution de l\'écart : ecart valide');
12641 else if (chienCSize>nbCartesChien) setMessage('Constitution de l\'écart : '+(chienCSize-nbCartesChien)+' carte'+((chienCSize-nbCartesChien)!=1?"s":"")+' en trop');
12642 else if (chienCSize==0) setMessage('Sélectionnez les cartes qui composeront l\'écart');
12643 else setMessage('Constitution de l\'écart : Encore '+(nbCartesChien-chienCSize)+' carte'+((nbCartesChien-chienCSize)!=1?"s":"") );
12644 
12645 var key;  
12646 
12647 if ( chienCSize==nbCartesChien)
12648 {
12649 var size = '';
12650 for (key in cartesChien)
12651 {       
12652  if (cartesChien[key] && cartesChien.hasOwnProperty(key)) 
12653  {
12654  if (typeof cartesChien[key].id!='undefined') { 
12655  size+='|'+getCardName(cartesChien[key]); 
12656  } 
12657  }
12658 } 
12659 size=size.substr(1);
12660
12661 if ( !selMoteur.actionExists('Valider l\'écart') ) {// $$('infosJeu').innerHTML.indexOf( 'Valider l\'écart</a>')==-1) {
12662  selMoteur.clearActions(true);
12663  //$$('infosJeu').innerHTML = '';
12664  selMoteur.addAction('Valider l\'écart','valideChien(\''+size+'\');','btn-success');
12665  if (!isChelem && !window.nochien)
12666  selMoteur.addAction('Chelem','chelem();','btn-danger',true);
12667 }
12668 }
12669 else
12670 {
12671 selMoteur.clearActions(true);
12672 }
12673}
12674
12675var phaserDecalChat = 0;
12676function phaserNextChatPage() {
12677 phaserDecalChat += phaserChatElts.fondChat.height-20;
12678 if (phaserDecalChat>phaserChatElts.textChat.height-phaserChatElts.fondChat.height)
12679 phaserDecalChat = phaserChatElts.textChat.height-phaserChatElts.fondChat.height;
12680 
12681 reorganiseCartes();
12682 return;
12683
12684}
12685function phaserPrevChatPage() {
12686 phaserDecalChat -= phaserChatElts.fondChat.height-20;
12687 if (phaserDecalChat<0)
12688 phaserDecalChat = 0;
12689 
12690 reorganiseCartes();
12691 return;
12692 
12693
12694}
12695var tmpIscrntPoivalid = false;
12696function refreshPoigneeMsg()
12697{ 
12698 var nbCartesPoignee1 = 10;
12699 var nbCartesPoignee2 = 13;
12700 var nbCartesPoignee3 = 15;
12701 var key; 
12702 if (nombreDeJPartie==5) {
12703 nbCartesPoignee1 = 8;
12704 nbCartesPoignee2 = 10;
12705 nbCartesPoignee3 = 13;
12706 }
12707 if (nombreDeJPartie==3) {
12708 nbCartesPoignee1 = 13;
12709 nbCartesPoignee2 = 15;
12710 nbCartesPoignee3 = 18;
12711 }
12712 if (nombreDeJPartie==6) {
12713 nbCartesPoignee1 = 7;
12714 nbCartesPoignee2 = 9;
12715 nbCartesPoignee3 = 11;
12716 }
12717 var excuseInPoignee = false;
12718 for (key in cartesPoignee) {
12719 if (cartesPoignee[key] && cartesPoignee.hasOwnProperty(key))
12720 {
12721  if (getCardName(cartesPoignee[key])== '6_Excuse.gif') 
12722  excuseInPoignee = true;
12723 }
12724 }
12725 if (excuseInPoignee )
12726 {   
12727 var cnt = selMoteur.getCards();
12728 for (key in cnt) {
12729 if ( cnt[key] && getCardName(cnt[key]) ) {
12730  if ( cnt[key] && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' && getCardName(cnt[key]).substr(0,1)=='5' && !cartesPoignee.hasOwnProperty(getCardName(cnt[key])) )
12731  {
12732  if ( !selMoteur.actionExists( 'Ne pas annoncer de poignée') || selMoteur.actionExists( 'Valider la poignée') ) {
12733  selMoteur.clearActions(true);
12734  setMessage('Annonce de poignée invalide - Excuse');
12735  selMoteur.addAction('Ne pas annoncer de poignée','validePoignee(\'\');','btn-warning',true);
12736  return;
12737  } else {
12738  setMessage('Annonce de poignée invalide - Excuse');
12739  return;
12740  }
12741  }
12742 }
12743 }
12744 }
12745 var poigneeSize = mySizeOf(cartesPoignee);
12746 if (poigneeSize==nbCartesPoignee1 || poigneeSize==nbCartesPoignee2 || poigneeSize==nbCartesPoignee3) 
12747 setMessage('Annonce de poignée valide');
12748 else if (poigneeSize>nbCartesPoignee1) setMessage('Annonce de poignée invalide');
12749 else if (poigneeSize==0) setMessage('Vous avez la possibilite d\'annoncer une poignée');
12750 else setMessage('Minimum '+nbCartesPoignee1+' cartes : encore '+(nbCartesPoignee1-poigneeSize)+' c
12750arte'+((nbCartesPoignee1-poigneeSize)!=1?"s":"") );
12751 
12752 
12753 if ( poigneeSize==nbCartesPoignee1 || poigneeSize==nbCartesPoignee2 || poigneeSize==nbCartesPoignee3)
12754 {
12755 var size = '';
12756 for (key in cartesPoignee) {
12757  if (cartesPoignee[key] && cartesPoignee.hasOwnProperty(key))
12758  {
12759  if (typeof cartesPoignee[key].id!='undefined') { 
12760  size+='|'+getCardName(cartesPoignee[key]);
12761  }
12762  }
12763 }
12764 size=size.substr(1); 
12765 if ( !selMoteur.actionExists('Valider la poignée')) {//$$('infosJeu').innerHTML.indexOf( 'Valider la poignée</a>')==-1) {
12766 selMoteur.clearActions(true);
12767 selMoteur.addAction('Ne pas annoncer de poignée','validePoignee(\'\');','btn-warning',true);
12768 selMoteur.addAction('Valider la poignée','validePoignee(\''+size+'\');','btn-success');
12769 }
12770 }
12771 else if ( !selMoteur.actionExists('Ne pas annoncer de poignée') || selMoteur.actionExists('Valider la poignée') ) 
12772 {         
12773 selMoteur.clearActions(true);
12774 selMoteur.addAction('Ne pas annoncer de poignée','validePoignee(\'\');','btn-warning',true);
12775 }
12776}
12777function valideChien(chien)
12778{       
12779 clearTO () ;
12780 selMoteur.clearActions();
12781 selMoteur.clearCards ();
12782 selMoteur.clearCardsActions (); 
12783 cartesChien = new Array ();
12784 rpc('chien='+chien);
12785}
12786function validePoignee(poignee)
12787{       
12788 clearTO () ;
12789 selMoteur.clearActions();
12790 
12791 selMoteur.timeThatRemains(-1,0);
12792 selMoteur.clearCardsActions (); 
12793 cartesPoignee = new Array ();
12794 rpc('poignee='+poignee);
12795}
12796 
12797function carteChienSelect (obj)
12798{
12799 //clearSounds();
12800 //console.log('carteChienSelect',obj);
12801 if (!cardActionsActivated) return; 
12802 
12803 if (obj==null) 
12804 {
12805 $.log('Erreur carte chien select obj is null');
12806 return;
12807 }    
12808 var name = getCardName(obj);
12809 if (name.substr(0,1)=='5')
12810 {   
12811 var cnt = selMoteur.getCards();
12812 for (key in cnt) {
12813  if (cnt[key] && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' 
12814  && getCardName(cnt[key]).substr(0,1)!='5' && getCardName(cnt[key]).substr(0,1)!='6' && getCardName(cnt[key]).indexOf("-14.gif")==-1 && !cartesChien.hasOwnProperty(getCardName(cnt[key])) )
12815  {
12816  alerte('Vous ne pouvez sélectionner un atout que s\'il ne reste plus d\'autres cartes à sélectionner.');
12817  return;
12818  }
12819 }
12820 }
12821
12822 lastMO = obj;  
12823 
12824 if (!cartesChien.hasOwnProperty(name))//obj.style.top==0 || obj.style.top=='0px')
12825 {
12826 carteSelectionnee(obj.id); 
12827 cartesChien[name] = obj;
12828 playSoundEffect ('Cards 01.mp3',true,1);
12829 }
12830 else
12831 {
12832 carteSelectionnable(obj.id); 
12833 delete cartesChien[name];
12834 playSoundEffect ('Cards 03.mp3',true,1);
12835 }    
12836 refreshChienMsg(); 
12837 //event.stopPropagation();
12838}
12839 
12840function cartePoigneeSelect (obj)
12841{
12842 //clearSounds();
12843 if (!cardActionsActivated) return; 
12844 
12845 var name = getCardName(obj);
12846 if (name=='6_Excuse.gif' && !cartesPoignee.hasOwnProperty('6_Excuse.gif'))
12847 {   
12848 var cnt = selMoteur.getCards();
12849 for (key in cnt) {
12850  if (cnt[key] && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu' && getCardName(cnt[key]).substr(0,1)=='5' && !cartesPoignee.hasOwnProperty(getCardName(cnt[key])) )
12851  {
12852  alerte('Vous ne pouvez sélectionner l\'excuse que s\'il ne reste plus d\'atouts à sélectionner.');
12853  return;
12854  }
12855 }
12856 }
12857
12858 lastMO = obj;    
12859 if (!cartesPoignee.hasOwnProperty(name))
12860 { 
12861 carteSelectionnee(obj.id);        
12862 cartesPoignee[name] = obj;
12863 }
12864 else
12865 {
12866 carteSelectionnable(obj.id);        
12867 delete cartesPoignee[name];
12868 } 
12869 
12870 refreshPoigneeMsg(); 
12871} 
12872
12873var cardActionsActivated = false;
12874function activateCardActions(etat)
12875{ 
12876 if ($$('monJeu')) {
12877 
12878 var cnt = $$('monJeu').childNodes;
12879 if (!etat)
12880 for (key in cnt) { 
12881 //log('key'+key+'--'+(typeof key)+'-+-'+cnt[key].src+'-+-'+cnt[key].id.substr(0,6) ); 
12882  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu')
12883  carteNeutre (cnt[key].id); 
12884 } 
12885 }
12886 
12887 //log('activateCardActions : '+etat);
12888 cardActionsActivated = etat; 
12889}
12890
12891function animateToWidth (id,destW,ccW,opt,endf) {
12892 var newW = destW-ccW;
12893 var idDest = id.split('.').join('\\.');
12894 var margL = newW/2;
12895 var margR = newW/2;
12896 if (opt=='First') margL = -5;
12897 if (opt=='Last') margR = -5;
12898 $('#'+idDest).stop().animate({
12899 marginLeft: margL,
12900 marginRight: margR
12901 }, 600,endf);
12902 $('#masque'+idDest).stop().animate({
12903 marginLeft: (-margR-ccW ),
12904 marginRight: margR
12905 }, 600);
12906}
12907function adaptJeuToWidth (ccW) {
12908 $('#monJeu').stop().animate({
12909 'padding-left': ccW+'px',
12910 'padding-right': ccW+'px'
12911 }, 600);
12912}
12913
12914function trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes)
12915{ 
12916 var res = ((windowWidth-ccW)/(numCarteLigne-1));
12917 if (res>1.2*ccW)
12918 res = 1.2*ccW;
12919 if (nbLigneCartes==1)
12920 res -= 20/numCarteLigne;
12921 return res;
12922}
12923
12924var cardsBestTop = 0;
12925var TOorganiseCartes = 0;
12926var phaserTweenProcessing = false;
12927var phaserTweenNeedsRefresh = false;
12928var hasResziedWS = true;
12929
12930function reorganiseCartes (fromResize)
12931{
12932 if (fromResize) hasResziedWS = true;
12933 clearTimeout(TOorganiseCartes);
12934 TOorganiseCartes = setTimeout(function () {
12935 if (phaserTweenProcessing) {
12936 phaserTweenNeedsRefresh = true;
12937 return;
12938 }
12939 selMoteur.reorganiseCartesReal(hasResziedWS);
12940 hasResziedWS = false;
12941 },20);
12942} 
12943
12944/*
12945var positionYactif = true;
12946function desactivePositionnemenetCartesHz()
12947{
12948 positionYactif = false;
12949 cardsBestTop = 0; 
12950}
12951function activePositionnemenetCartesHz()
12952{
12953 positionYactif = true;
12954 cardsBestTop = 0; 
12955}
12956function setCardOffset(id,cardsBestTop,offset)
12957{
12958 if ($$(id)==null) return;
12959 if (offset==NaN || offset==undefined) offset = 0;
12960 if ( $('#'+id.split('.').join('\\.')).data('myOffset')==offset && $('#'+id.split('.').join('\\.')).data('cardsBestTop')==cardsBestTop ) return;
12961 $('#'+id.split('.').join('\\.')).data('myOffset',parseInt(offset));
12962 $('#'+id.split('.').join('\\.')).data('cardsBestTop',cardsBestTop);
12963 clearTimeout($('#'+id.split('.').join('\\.')).data('timeout'));
12964 var timeout = setTimeout(function () { applyCardOffset(id); },200);
12965 $('#'+id.split('.').join('\\.')).data('timeout',timeout);
12966}
12967function getCardOffset(id)
12968{
12969 return $('#'+id.split('.').join('\\.')).data('myOffset');
12970}
12971function applyCardOffset(id)
12972{
12973 if ($$(id)==null) return;
12974 $('#'+id).animate( { top: $('#'+id.split('.').join('\\.')).data('cardsBestTop')+$('#'+id.split('.').join('\\.')).data('myOffset') }, 600 );
12975 //var newFx = new Fx.Tween(id, { property: 'top' }).start(parseInt($$(id).style.top), $('#'+id.split('.').join('\\.')).data('cardsBestTop')+$('#'+id.split('.').join('\\.')).data('myOffset') );
12976}
12977function refreshCardBestTop(id)
12978{
12979 var oldTop = parseInt($$(id).style.marginTop);
12980 if (!oldTop>0)
12981 oldTop = 0;
12982
12983 $('#'+id).animate( { marginTop: cardsBestTop }, 300 );
12984 $('#masque'+id).animate( { marginTop: cardsBestTop }, 300 );
12985 //var newFx = new Fx.Tween(id, { property: 'margin-top' }).start(oldTop,cardsBestTop);
12986 //var newFx2 = new Fx.Tween('masque'+id, { property: 'margin-top' }).start(oldTop,cardsBestTop);
12987
12988}*/
12989
12990
12991function carteSelectionnee (id)
12992{
12993 selMoteur.addMasque(id,'MasqueB');
12994}
12995function carteSelectionnable (id)
12996{  
12997 selMoteur.clearMasque(id);         
12998}
12999function carteNonSelectionnable (id)
13000{ 
13001 if (isMasqueActivated())
13002 selMoteur.addMasque(id,'MasqueD');
13003}
13004function carteNeutre (id)
13005{ 
13006 selMoteur.clearMasque(id);
13007}
13008
13009
13010var code_evaled;
13011function eval_global(codetoeval) 
13012{
13013 if (window.execScript)
13014 window.execScript('code_evaled = ' + '(' + codetoeval + ')',''); // execScript doesn't return anything`
13015 else
13016 code_evaled = eval(codetoeval);
13017 return code_evaled;
13018} 
13019
13020
13021
13022
13023
13024   
13025function whoami (num)
13026{
13027 whoamiNum = num;
13028}
13029
13030
13031function delme ()
13032{
13033 for (var i = 0;i<30;i++)
13034 { 
13035 }
13036 setTimeout(moteurStar,100);
13037 
13038}
13039var tabCos = new Array ();
13040function myCos (num) {
13041 var newNum = Math.round(num/2/3.14*100)%100;
13042 if (tabCos[newNum]==null)
13043 tabCos[newNum] = Math.cos( newNum*2*3.14/100 );
13044 return tabCos[newNum];
13045}
13046function mySin (num) {
13047 myCos (3.14/2+num);
13048}
13049
13050var cptStar = 0;
13051var waitBeforeStarCreation = 0;
13052function startWin ()
13053{
13054 cptStar++;
13055 for (var i=0;i<10;i++)
13056 { 
13057 var img = $$('star'+i); 
13058 if (img==null)
13059 {
13060  createStar (i);
13061 }
13062 else
13063 {         
13064  img.style.top = Math.floor(getWinHeight()/2-50+Math.sin(i*3.14*2/10+cptStar/10)*Math.min(150+cptStar*2,200) )+'px';
13065  img.style.left = Math.floor(getWinWidth()/2-50+myCos(i*3.14*2/10+cptStar/10)*Math.min(150+cptStar*2,200) )+'px'; 
13066 }
13067 }
13068 if (cptStar<100)
13069 setTimeout(startWin,100);
13070 else
13071 {
13072 for (var i=0;i<10;i++)
13073 {
13074  var img = $$('star'+i); 
13075  if (img!=null)
13076  {
13077  document.body.removeChild(img);
13078  }
13079 } 
13080 }
13081
13082}
13083function createStar (num)
13084{
13085 var img = document.createElement('img');
13086 img.src = '/Jeu-Tarot-en-ligne/Icones/1321719631_bookmark-new.png';
13087 img.style.position='absolute';
13088 img.style.top='-200px';
13089 img.style.zIndex='50';
13090 img.style.left = '-400px';//Math.floor(Math.random()*screen.width)+'px';
13091 //alert(Math.floor(parseInt(img.style.left)));
13092 img.id = 'star'+num;
13093 document.body.appendChild(img);
13094}
13095
13096
13097var mpSendQueue = [];
13098var mpSendCurrent = null;
13099var mpSendRetryTimer = null;
13100var mpSendRetryDelays = [2000,5000,10000,20000,40000];
13101var mpSendMaxAttempts = mpSendRetryDelays.length+1;
13102
13103function mpSendRequestId()
13104{
13105 var now = new Date().getTime();
13106 return 'mp-'+now.toString(36)+'-'+Math.floor(Math.random()*1000000000).toString(36);
13107}
13108
13109function mpSendScheduleRetry(delay)
13110{
13111 clearTimeout(mpSendRetryTimer);
13112 mpSendRetryTimer = setTimeout(mpSendProcessQueue,delay);
13113}
13114
13115function mpSendNotifyRetry()
13116{
13117 if (mpSendCurrent!=null && !mpSendCurrent.retryNotified) {
13118 mpSendCurrent.retryNotified = true;
13119 alerte('Connexion indisponible. Le message sera renvoy\u00e9 automatiquement.');
13120 }
13121}
13122
13123function mpSendRetryOrFail()
13124{
13125 if (mpSendCurrent==null) return;
13126 mpSendCurrent.inFlight = false;
13127 mpSendNotifyRetry();
13128 if (mpSendCurrent.attempts>=mpSendMaxAttempts) {
13129 mpSendCurrent = null;
13130 alerte('Le message n\'a pas pu \u00eatre envoy\u00e9. V\u00e9rifiez votre connexion puis renvoyez-le.');
13131 mpSendProcessQueue();
13132 return;
13133 }
13134 var delayIndex = Math.max(0,mpSendCurrent.attempts-1);
13135 var delay = mpSendRetryDelays[Math.min(delayIndex,mpSendRetryDelays.length-1)];
13136 mpSendScheduleRetry(delay);
13137}
13138
13139function mpRefreshMessagesPage()
13140{
13141 var page = $$('privateMessagesPage');
13142 if (page==null) return;
13143
13144 var joueur = page.getAttribute('data-joueur');
13145 if (!joueur) return;
13146
13147 var pageAtRequest = page;
13148 var expandedId = null;
13149 var expandedConversation = $(page).find('.selMPBig').first();
13150 if (expandedConversation.length) {
13151 var expandedMatch = String(expandedConversation.attr('class') || '').match(/(?:^|\s)withCorres(-?\d+)(?:\s|$)/);
13152 if (expandedMatch) expandedId = parseInt(expandedMatch[1],10);
13153 }
13154
13155 $.ajax({
13156 url:'/workers/joueur.php?joueur='+joueur,
13157 type:'POST',
13158 data:'part=messages',
13159 cache:false,
13160 success:function (html) {
13161  var currentPage = $$('privateMessagesPage');
13162  if (currentPage==null || currentPage!==pageAtRequest) return;
13163
13164  var response = document.createElement('div');
13165  response.innerHTML = html;
13166  var refreshedPage = response.querySelector
13167  ? response.querySelector('#privateMessagesPage')
13168  : $(response).find('#privateMessagesPage')[0];
13169  if (refreshedPage==null) return;
13170
13171  currentPage.innerHTML = refreshedPage.innerHTML;
13172  if (expandedId!=null && typeof growBigMsg==='function')
13173  growBigMsg(expandedId);
13174  if (typeof cufonRefresh==='function') cufonRefresh();
13175  if (typeof showHTMLbuttons==='function') showHTMLbuttons();
13176 }
13177 });
13178}
13179
13180function mpSendFinish(html)
13181{
13182 var retried = mpSendCurrent!=null && mpSendCurrent.retryNotified;
13183 clearTimeout(mpSendRetryTimer);
13184 mpSendCurrent = null;
13185 sendJoueurMessageResult(html);
13186 if (html=='OK')
13187 mpRefreshMessagesPage();
13188 if (html=='OK' && retried)
13189 alerte('Message envoy\u00e9.');
13190 setTimeout(mpSendProcessQueue,0);
13191}
13192
13193function mpSendProcessQueue()
13194{
13195 clearTimeout(mpSendRetryTimer);
13196 if (mpSendCurrent==null)
13197 mpSendCurrent = mpSendQueue.shift() || null;
13198 if (mpSendCurrent==null || mpSendCurrent.inFlight) return;
13199 if (typeof navigator!='undefined' && navigator.onLine===false) {
13200 mpSendNotifyRetry();
13201 mpSendScheduleRetry(15000);
13202 return;
13203 }
13204
13205 mpSendCurrent.inFlight = true;
13206 mpSendCurrent.attempts++;
13207 var currentRequest = mpSendCurrent;
13208 $.ajax({
13209 url:'/workers/sendMessageUtil.php',
13210 type:'POST',
13211 data:'txt='+escape(currentRequest.txt).split('+').join('%2B')+'&idUtil='+currentRequest.idUtil+
13212  (currentRequest.estReponse?'&reponseMessage=1':'')+
13213  '&clientRequestId='+encodeURIComponent(currentRequest.requestId),
13214 timeout:45000,
13215 success:function (html) {
13216  if (mpSendCurrent!==currentRequest) return;
13217  currentRequest.inFlight = false;
13218  if (html=='OK') {
13219  sendWebPing(currentRequest.idUtil);
13220  mpSendFinish(html);
13221  }
13222  else if (html=='' || html=='<HTML></HTML>' || html=='<html></html>')
13223  mpSendRetryOrFail();
13224  else
13225  mpSendFinish(html);
13226 },
13227 error:function (xhr,statusText) {
13228  if (mpSendCurrent!==currentRequest || statusText=='abort') return;
13229  currentRequest.inFlight = false;
13230  var status = parseInt(xhr.status,10) || 0;
13231  if (status==0 || status==408 || status==425 || status==429 || status>=500)
13232  mpSendRetryOrFail();
13233  else
13234  mpSendFinish('Le message n\'a pas pu \u00eatre envoy\u00e9.');
13235 }
13236 });
13237}
13238
13239if (window.addEventListener) {
13240 window.addEventListener('online',function () {
13241 if (mpSendCurrent!=null && !mpSendCurrent.inFlight)
13242  mpSendScheduleRetry(0);
13243 },false);
13244}
13245
13246function sendJoueurMessage (txt,idUtil,estReponse)
13247{
13248 mpSendQueue.push({
13249 txt:txt,
13250 idUtil:idUtil,
13251 estReponse:estReponse===true,
13252 requestId:mpSendRequestId(),
13253 attempts:0,
13254 inFlight:false,
13255 retryNotified:false
13256 });
13257 mpSendProcessQueue();
13258 return false;
13259}
13260function confirme(texte,ifok,ifko) {
13261 var modeAlerte = arguments.length>3 && arguments[3]===true;
13262 var optionsDialogue = arguments.length>4 && arguments[4] ? arguments[4] : null;
13263 var appelSuivant;
13264 var elementFocusAvant = document.activeElement;
13265 var themeSombre = $('#webBody').hasClass('themeSombre');
13266 var hauteurMax = Math.max(240,Math.floor($(window).height()*0.8));
13267
13268 if (!window.siteModalQueue) window.siteModalQueue = [];
13269 if ($('.modalW').length) {
13270 window.siteModalQueue.push(function () {
13271 confirme(texte,ifok,ifko,modeAlerte,optionsDialogue);
13272 });
13273 return;
13274 }
13275
13276 var modal = document.createElement('div');
13277 modal.className = 'modalW';
13278 modal.setAttribute('role','alertdialog');
13279 modal.setAttribute('aria-modal','true');
13280 modal.setAttribute('aria-label',modeAlerte?'Information':'Confirmation');
13281 modal.setAttribute('aria-describedby','siteModalMessage');
13282
13283 var centrage = document.createElement('div');
13284 var panneau = document.createElement('div');
13285 var logo = document.createElement('img');
13286 var message = document.createElement('div');
13287 var actions = document.createElement('div');
13288 var boutonOui = document.createElement('button');
13289 var boutonNon = null;
13290
13291 $(modal).css({
13292 position:'fixed',
13293 top:'0',
13294 left:'0',
13295 width:'100%',
13296 height:'100%',
13297 padding:'0',
13298 display:'table',
13299 backgroundColor:'#444',
13300 fontSize:'18px',
13301 textAlign:'center',
13302 zIndex:'9999999'
13303 });
13304 try { modal.style.backgroundColor = 'rgba(0,0,0,0.65)'; } catch (e) {}
13305 $(centrage).css({
13306 display:'table-cell',
13307 verticalAlign:'middle',
13308 padding:'16px'
13309 });
13310 $(panneau).css({
13311 display:'inline-block',
13312 boxSizing:'border-box',
13313 width:'90%',
13314 maxWidth:'620px',
13315 maxHeight:hauteurMax+'px',
13316 overflowY:'auto',
13317 padding:'22px',
13318 color:themeSombre?'#fff':'#2d241e',
13319 backgroundColor:themeSombre?'#2e2925':'#fff',
13320 border:'2px solid #5a3825',
13321 borderRadius:'8px',
13322 boxShadow:'0 8px 32px rgba(0,0,0,0.45)',
13323 textAlign:'center'
13324 });
13325
13326 logo.src = themeSombre ?
13327 '/Jeu-Tarot-en-ligne/LogoHeaderSm.png' :
13328 '/Jeu-Tarot-en-ligne/Jeu de tarot en ligne.png';
13329 logo.className = 'modalLogo';
13330 logo.alt = '';
13331 logo.setAttribute('aria-hidden','true');
13332 $(logo).css({maxWidth:'100%',maxHeight:'110px'});
13333
13334 message.id = 'siteModalMessage';
13335 message.innerHTML = texte===null || typeof texte==='undefined' ? '' : String(texte);
13336 var contenuMessage = message.getElementsByTagName('*');
13337 for (var s=contenuMessage.length-1;s>=0;s--) {
13338 var balise = contenuMessage[s];
13339 var nomBalise = balise.tagName.toUpperCase();
13340 if (nomBalise==='SCRIPT' || nomBalise==='IFRAME' || nomBalise==='OBJECT' ||
13341 nomBalise==='EMBED' || nomBalise==='STYLE' || nomBalise==='LINK' || nomBalise==='META') {
13342 if (balise.parentNode) balise.parentNode.removeChild(balise);
13343 continue;
13344 }
13345 for (var a=balise.attributes.length-1;a>=0;a--) {
13346 var attribut = balise.attributes[a];
13347 var nomAttribut = attribut.name.toLowerCase();
13348 var valeurAttribut = String(attribut.value || '');
13349 if (nomAttribut.indexOf('on')===0 || nomAttribut==='srcdoc' ||
13350 ((nomAttribut==='href' || nomAttribut==='src' || nomAttribut==='action' ||
13351 nomAttribut==='formaction' || nomAttribut==='xlink:href') &&
13352 /^\s*(javascript|vbscript):/i.test(valeurAttribut)) ||
13353 (nomAttribut==='style' && /(expression\s*\(|javascript\s*:)/i.test(valeurAttribut))) {
13354 balise.removeAttribute(attribut.name);
13355 }
13356 }
13357 }
13358 $(message).css({margin:'14px 0 20px',lineHeight:'1.5'});
13359
13360 boutonOui.type = 'button';
13361 boutonOui.id = 'modYes';
13362 boutonOui.className = 'btn btn-warning btn-lg pbtn';
13363 boutonOui.appendChild(document.createTextNode(modeAlerte?'OK':'Confirmer'));
13364
13365 if (!modeAlerte) {
13366 boutonNon = document.createElement('button');
13367 boutonNon.type = 'button';
13368 boutonNon.id = 'modNo';
13369 boutonNon.className = 'btn btn-default btn-lg pbtn';
13370 boutonNon.appendChild(document.createTextNode('Annuler'));
13371 $(boutonNon).css({marginLeft:'8px'});
13372 }
13373
13374 actions.appendChild(boutonOui);
13375 if (boutonNon) actions.appendChild(boutonNon);
13376 panneau.appendChild(logo);
13377 panneau.appendChild(message);
13378 panneau.appendChild(actions);
13379 centrage.appendChild(panneau);
13380 modal.appendChild(centrage);
13381 document.body.appendChild(modal);
13382
13383 var ancienOverflow = document.body.style.overflow;
13384 var etatsAria = [];
13385 var enfantsBody = document.body.children;
13386 for (var i=0;i<enfantsBody.length;i++) {
13387 if (enfantsBody[i]!==modal) {
13388 etatsAria.push({
13389 element:enfantsBody[i],
13390 valeur:enfantsBody[i].getAttribute('aria-hidden')
13391 });
13392 enfantsBody[i].setAttribute('aria-hidden','true');
13393 }
13394 }
13395 document.body.style.overflow = 'hidden';
13396
13397 var termine = false;
13398 function ouvrirSuivante() {
13399 window.setTimeout(function () {
13400 if (!$('.modalW').length && window.siteModalQueue.length) {
13401 appelSuivant = window.siteModalQueue.shift();
13402 appelSuivant();
13403 }
13404 },0);
13405 }
13406 function fermer(validation) {
13407 if (termine) return;
13408 termine = true;
13409 var valeurDialogue;
13410 if (validation && optionsDialogue && typeof optionsDialogue.getValue==='function')
13411 valeurDialogue = optionsDialogue.getValue(modal);
13412 $(document).off('keydown.siteModal');
13413 $(modal).remove();
13414 document.body.style.overflow = ancienOverflow;
13415 for (var j=0;j<etatsAria.length;j++) {
13416 if (etatsAria[j].valeur===null)
13417 etatsAria[j].element.removeAttribute('aria-hidden');
13418 else
13419 etatsAria[j].element.setAttribute('aria-hidden',etatsAria[j].valeur);
13420 }
13421 if (elementFocusAvant && typeof elementFocusAvant.focus==='function') {
13422 try { elementFocusAvant.focus(); } catch (e) {}
13423 }
13424 ouvrirSuivante();
13425 if (validation) {
13426 if (typeof ifok==='function') ifok(valeurDialogue);
13427 } else {
13428 if (typeof ifko==='function') ifko();
13429 }
13430 }
13431 function afficherFocus() {
13432 this.style.outline = '3px solid #5a3825';
13433 this.style.outlineOffset = '3px';
13434 this.style.boxShadow = '0 0 0 2px #fff';
13435 }
13436 function masquerFocus() {
13437 this.style.outline = '';
13438 this.style.outlineOffset = '';
13439 this.style.boxShadow = '';
13440 }
13441
13442 $(boutonOui).on('focus',afficherFocus).on('blur',masquerFocus).on('click',function (event) {
13443 event.preventDefault();
13444 fermer(true);
13445 });
13446 if (boutonNon) {
13447 $(boutonNon).on('focus',afficherFocus).on('blur',masquerFocus).on('click',function (event) {
13448 event.preventDefault();
13449 fermer(false);
13450 });
13451 }
13452
13453 $(document).off('keydown.siteModal').on('keydown.siteModal',function (event) {
13454 var touche = event.which || event.keyCode;
13455 var elementsFocus = $(panneau).find(
13456 'a[href],area[href],input:not([disabled]),select:not([disabled]),' +
13457 'textarea:not([disabled]),button:not([disabled]),iframe,[tabindex]'
13458 ).filter(function () {
13459 return $(this).is(':visible') && this.getAttribute('tabindex')!=='-1';
13460 }).get();
13461 var premier = elementsFocus.length ? elementsFocus[0] : boutonOui;
13462 var dernier = elementsFocus.length ? elementsFocus[elementsFocus.length-1] : (boutonNon || boutonOui);
13463 if (touche===27) {
13464 event.preventDefault();
13465 fermer(modeAlerte);
13466 } else if (touche===9) {
13467 if (premier===dernier) {
13468 event.preventDefault();
13469 premier.focus();
13470 } else if (event.shiftKey && document.activeElement===premier) {
13471 event.preventDefault();
13472 dernier.focus();
13473 } else if (!event.shiftKey && document.activeElement===dernier) {
13474 event.preventDefault();
13475 premier.focus();
13476 } else if (document.activeElement!==premier && document.activeElement!==dernier) {
13477 event.preventDefault();
13478 (modeAlerte?premier:dernier).focus();
13479 }
13480 }
13481 });
13482
13483 window.setTimeout(function () {
13484 if (optionsDialogue && typeof optionsDialogue.onOpen==='function')
13485 optionsDialogue.onOpen(modal,boutonOui);
13486 else
13487 (modeAlerte?boutonOui:boutonNon).focus();
13488 },0);
13489}
13490var sitePromptCounter = 0;
13491function prompte(texte,valeur,ifok,ifko,typeInput) {
13492 var typeAutorise = typeInput==='password' || typeInput==='email' ? typeInput : 'text';
13493 var identifiant = 'sitePromptInput'+(++sitePromptCounter);
13494 var champ = document.createElement('input');
13495 champ.type = typeAutorise;
13496 champ.id = identifiant;
13497 champ.className = 'form-control shorty';
13498 champ.value = valeur===null || typeof valeur==='undefined' ? '' : String(valeur);
13499 champ.autocomplete = typeAutorise==='password' ? 'current-password' : (typeAutorise==='email' ? 'email' : 'off');
13500 champ.setAttribute('aria-label',typeAutorise==='password' ? 'Mot de passe' : (typeAutorise==='email' ? 'Adresse email' : 'Valeur'));
13501
13502 var conteneur = document.createElement('div');
13503 conteneur.appendChild(champ);
13504 confirme(
13505 String(texte || '')+conteneur.innerHTML,
13506 ifok,
13507 ifko,
13508 false,
13509 {
13510 getValue:function (modal) {
13511 var saisie = $(modal).find('#'+identifiant).get(0);
13512 return saisie ? saisie.value : '';
13513 },
13514 onOpen:function (modal,boutonValidation) {
13515 var saisie = $(modal).find('#'+identifiant).get(0);
13516 if (!saisie) return;
13517 $(saisie).on('keydown',function (event) {
13518 if ((event.which || event.keyCode)===13) {
13519 event.preventDefault();
13520 boutonValidation.click();
13521 }
13522 });
13523 saisie.focus();
13524 }
13525 }
13526 );
13527}
13528function alerte(texte,ifok) {
13529 confirme(texte,ifok,null,true);
13530}
13531var achatsAgeDialogueOuvert = false;
13532// Keep the existing entry point for shop links and the direct-access page.
13533function ouvrirDialogueDateNaissanceAchats(destination) {
13534 if (typeof window.ouvrirBoutiqueDialogue === 'function') return window.ouvrirBoutiqueDialogue(destination);
13535 if (achatsAgeDialogueOuvert) {
13536 window.ouvrirAgeDialogue();
13537 return false;
13538 }
13539 if (typeof destination!=='string' || destination.charAt(0)!=='/' || destination.indexOf('//')===0)
13540 destination = '/credits.php';
13541
13542 achatsAgeDialogueOuvert = true;
13543 window.ouvrirAgeDialogue(function (resultat) {
13544 if (resultat.majorite==='majeur') {
13545 document.location = destination;
13546 return;
13547 }
13548 alerte('L\'acc&egrave;s &agrave; la boutique est r&eacute;serv&eacute; aux utilisateurs majeurs.',function () {
13549 document.location = '/';
13550 });
13551 }).then(function () {
13552 achatsAgeDialogueOuvert = false;
13553 });
13554 return false;
13555}
13556function redistribuerCPU() {
13557 if (shalAskForConfirmCardPlay) {
13558 confirme('Etes vous sûr de vouloir redistribuer ?',function () {
13559 selMoteur.clearActions();
13560 rpc('redistribuer=1');
13561 });
13562 } else {
13563 selMoteur.clearActions();
13564 rpc('redistribuer=1');
13565 }
13566}
13567
13568var isChelem = false;
13569function choixAnnonce(num,texte)
13570{
13571 notifyUserActivity();
13572 if (num<3 && !shalAskForConfirmCardPlay ) {
13573 selMoteur.clearActions();
13574 clearTO ();
13575 rpc('call='+num+'&chelem='+isChelem);
13576 } else {
13577 var phraseConfirm = 'Etes-vous sûr de vouloir annoncer une '+texte+' ?';
13578 if (texte=='passe') phraseConfirm = 'Etes-vous sûr de vouloir passer ?';
13579 confirme(phraseConfirm,function () {
13580 selMoteur.clearActions();
13581 clearTO ();
13582 rpc('call='+num+'&chelem='+isChelem);
13583 });
13584 /*if (confirm(phraseConfirm)) {
13585 }*/
13586 }
13587}
13588
13589function triCartes() {
13590 //selMoteur.removeAction('Passe');
13591 selMoteur.removeAction('Trier');
13592 rpc('triCartes=1');
13593}
13594function clearCartesChien () {
13595
13596 lastIntitule = '';
13597 selMoteur.hideInfoJeu();
13598}
13599function sendJoueurMessageResult(html)
13600{ 
13601 if (html && html.indexOf('AGE_REQUIRED|')===0) {
13602 alerte(html.substr(13),function () { document.location='/Compte.php?part=compte&majorite=messages#compteDateNaissance'; });
13603 return;
13604 }
13605 if (html=='OK')
13606 {
13607 if ($$('messageToSend')!=null) 
13608  $$('messageToSend').value = '';
13609 }
13610 else
13611 alerte(html);
13612}
13613
13614function newRound() {
13615 isChelem = false;
13616}
13617function chelem() {
13618 confirme('Etes-vous sûr de vouloir annoncer un chelem ?',setChelem); 
13619}
13620function appelRoi(num)
13621{
13622 notifyUserActivity();
13623 selMoteur.clearActions();
13624 clearTO ();
13625 selMoteur.timeThatRemains(-1,0);
13626 rpc('appel='+num);
13627}
13628
13629function setNoEndSound() {
13630 canPlayAlertSound = -1;
13631}
13632var etapeCourante = '';
13633function setEtape(etape)
13634{
13635 suivreAttentePartie(etape);
13636 etapeCourante = etape;
13637 if (etape!=='Salon' && etape!=='Attente' && typeof arreterInvitationsAttente==='function') arreterInvitationsAttente();
13638}
13639
13640function btnSoundAction()
13641{
13642}
13643
13644var showedDislikeBtns = false;
13645function showDislikeBtns()
13646{
13647 if (showedDislikeBtns) return;
13648 selMoteur.addAction('Défi intéressant','voteDefiOK();','btn-success');
13649 selMoteur.addAction('Défi à supprimer','voteDefiKO();','btn-danger');
13650}
13651function voteDefiOK()
13652{
13653 selMoteur.clearActions();
13654 showedDislikeBtns = true;
13655 selMoteur.addAction('Récapitulatifs partie','closeRecap();','btn-info');
13656 rpcNoQueue('voteOK=1');
13657}
13658function voteDefiKO()
13659{
13660 if (confirm('Etes-vous sûr de vouloir signaler ce défi ? 50% de votes négatifs entraineront la suppression du défi.')) {
13661 selMoteur.clearActions();
13662 showedDislikeBtns = true;
13663 selMoteur.addAction('Récapitulatifs partie','closeRecap();','btn-info');
13664 rpcNoQueue('voteKO=1');
13665 }
13666}
13667function defiJouer()
13668{       
13669 clearTO () ;
13670 selMoteur.clearMessagePlateauJeu();
13671 selMoteur.clearActions();
13672 rpc('okLU=1');
13673}
13674function defiChanger(penalitePremium,defisRefuses)
13675{
13676 function changerDefiInt() {
13677 selMoteur.showMessagePlateauJeu("Chargement d'un nouveau d&eacute;fi...");
13678 clearTO ();
13679 selMoteur.clearActions();
13680 selMoteur.clearCards();
13681 selMoteur.hideCoulApp();
13682 selMoteur.setPreneur (-1);
13683 selMoteur.setScore (whoamiNum,'');
13684 selMoteur.setDonneurPos(-1);
13685 var parametresChangement = 'changeDefi=1';
13686 if (defisRefuses)
13687  parametresChangement += '&defisRefuses='+encodeURIComponent(defisRefuses);
13688 rpc(parametresChangement);
13689 }
13690 if (penalitePremium) {
13691 confirme('Attention : changer de d&eacute;fi comptera une tentative de p&eacute;nalit&eacute;. Trois changements au maximum sont autoris&eacute;s avant de devoir jouer. Voulez-vous vraiment changer de d&eacute;fi ?',changerDefiInt);
13692 } else {
13693 changerDefiInt();
13694 }
13695}
13696
13697var emoticons = new Array();
13698emoticons[':)'] = '0';
13699emoticons['8)'] = '1';
13700emoticons['=3'] = '2';
13701emoticons[':-J'] = '3';
13702emoticons[':}'] = '4';
13703emoticons[';]'] = '5';
13704emoticons[':c'] = '6';
13705emoticons['XP'] = '7';
13706emoticons['8D'] = '8';
13707emoticons[':('] = '9';
13708emoticons[':D'] = '10';
13709emoticons[':\')'] = '11';
13710emoticons[':\'-('] = '12';
13711emoticons['I-O'] = '13';
13712emoticons[':\'('] = '14';
13713emoticons[':))'] = '15';
13714emoticons[':)))'] = '16';
13715emoticons[':x'] = '17';
13716emoticons['=\\'] = '18';
13717emoticons[':I'] = '19';
13718emoticons[':O'] = '20';
13719emoticons[':-,'] = '21';
13720emoticons[';D'] = '22';
13721emoticons[':..'] = '23';
13722emoticons['=/'] = '24';
13723emoticons['x)'] = '25';
13724emoticons['X)'] = '26';
13725emoticons[':['] = '27';
13726emoticons['8['] = '28';
13727emoticons['=[['] = '29';
13728emoticons['XO'] = '30';
13729emoticons['X-)'] = '31';
13730emoticons['=-/'] = '32';
13731emoticons['=II'] = '33';
13732emoticons[':II'] = '34';
13733emoticons[':P'] = '35';
13734emoticons[':I['] = '36';
13735emoticons['B)'] = '37';
13736emoticons['8I'] = '38';
13737emoticons['I)'] = '39';
13738emoticons['8X'] = '40';
13739emoticons['8-P'] = '41';
13740emoticons['I/'] = '42';
13741emoticons['B))'] = '43';
13742emoticons['8-I'] = '44';
13743emoticons['D('] = '45';
13744emoticons['D\'('] = '46';
13745emoticons['P)'] = '47';
13746emoticons['P))'] = '48';
13747emoticons['Bonjour !'] = '49';
13748emoticons['Bien joué !'] = '50';
13749emoticons['Dommage...'] = '51';
13750emoticons['Bonsoir'] = '52';
13751emoticons['Bon jeu'] = '53';
13752emoticons['Merci'] = '54';
13753emoticons['Aie'] = '55';
13754emoticons['Super'] = '56';
13755emoticons['Pas de chance'] = '57';
13756emoticons['J\'applaudis !'] = '58';
13757emoticons['C\'est long...'] = '59';
13758emoticons['Je vous embrasse !'] = '60';
13759emoticons['Je pleure !'] = '61';
13760
13761var collectionEmoticonMessagePrefix = '::emoticon::';
13762var collectionEmoticonsCatalogue = {};
13763var myCollectionEmots = [];
13764var collectionEmoticonsDailyCodes = {};
13765
13766function setCollectionEmoticons(catalogue,selection,codes) {
13767 collectionEmoticonsCatalogue = {};
13768 myCollectionEmots = [];
13769 catalogue = catalogue || [];
13770 selection = selection || [];
13771 for (var i=0;i<catalogue.length;i++) {
13772 var definition = catalogue[i];
13773 if (definition && definition.id && definition.image && definition.key)
13774 collectionEmoticonsCatalogue[definition.id] = definition;
13775 }
13776 for (var j=0;j<selection.length;j++) {
13777 if (collectionEmoticonsCatalogue[selection[j]]) myCollectionEmots.push(selection[j]);
13778 }
13779 setCollectionEmoticonDailyCodes(codes);
13780 if (typeof prepareSelectedCollectionEmoticonsPhaser==='function')
13781 prepareSelectedCollectionEmoticonsPhaser();
13782}
13783
13784function setCollectionEmoticonDailyCodes(codes,selection) {
13785 if (selection && typeof selection.length==='number') {
13786 myCollectionEmots = [];
13787 for (var selectionIndex=0;selectionIndex<selection.length;selectionIndex++) {
13788 if (collectionEmoticonsCatalogue[selection[selectionIndex]])
13789 myCollectionEmots.push(selection[selectionIndex]);
13790 }
13791 }
13792 collectionEmoticonsDailyCodes = {};
13793 codes = codes || {};
13794 for (var id in codes) {
13795 if (!Object.prototype.hasOwnProperty.call(codes,id)) continue;
13796 if (myCollectionEmots.indexOf(id)!==-1 && typeof codes[id]==='string')
13797 collectionEmoticonsDailyCodes[id] = codes[id];
13798 }
13799}
13800
13801function resolveGameEmoticon(message) {
13802 if (typeof message!=='string') return null;
13803
13804 var normalizedMessage = message.replace(/^\s+|\s+$/g,'');
13805 try {
13806 normalizedMessage = decodeURIComponent(normalizedMessage);
13807 } catch (erreurDecodageEmoticon) {}
13808
13809 if (Object.prototype.hasOwnProperty.call(emoticons,normalizedMessage)) {
13810 var legacyId = emoticons[normalizedMessage];
13811 return {
13812 type:'legacy',
13813 id:legacyId,
13814 key:'Emoticon'+legacyId,
13815 image:'/images/Emoticon/Emoticon'+legacyId+'.png?v=4'
13816 };
13817 }
13818
13819 var collectionId = normalizedMessage.replace(/\\/g,'/');
13820 var cheminImagesCollection = '/images/Emoticon/collections/';
13821 var positionCheminImage = collectionId.indexOf(cheminImagesCollection);
13822 if (collectionId.indexOf(collectionEmoticonMessagePrefix)===0)
13823 collectionId = collectionId.substring(collectionEmoticonMessagePrefix.length);
13824 else if (positionCheminImage!==-1)
13825 collectionId = collectionId.substring(positionCheminImage+cheminImagesCollection.length);
13826
13827 collectionId = collectionId.split('?')[0].split('#')[0];
13828 var collectionDefinition = Object.prototype.hasOwnProperty.call(collectionEmoticonsCatalogue,collectionId)?collectionEmoticonsCatalogue[collectionId]:null;
13829
13830 /* Certains transports historiques ne conservent que le nom du fichier.
13831 * Ne l'accepter que s'il designe une seule emoticone du catalogue. */
13832 if (!collectionDefinition && collectionId.indexOf('/')===-1 && /\.(png|webp|jpg|jpeg)$/i.test(collectionId)) {
13833 var idTrouve = null;
13834 if (typeof myCollectionEmots!=='undefined') {
13835 for (var selectionIndex=0;selectionIndex<myCollectionEmots.length;selectionIndex++) {
13836 var idSelectionne = myCollectionEmots[selectionIndex];
13837 if (idSelectionne.substring(idSelectionne.lastIndexOf('/')+1)!==collectionId) continue;
13838 if (idTrouve!==null) return null;
13839 idTrouve = idSelectionne;
13840 }
13841 }
13842 if (idTrouve===null) {
13843 for (var idCatalogue in collectionEmoticonsCatalogue) {
13844 if (!Object.prototype.hasOwnProperty.call(collectionEmoticonsCatalogue,idCatalogue)) continue;
13845 if (idCatalogue.substring(idCatalogue.lastIndexOf('/')+1)!==collectionId) continue;
13846 if (idTrouve!==null) return null;
13847 idTrouve = idCatalogue;
13848 }
13849 }
13850 if (idTrouve!==null && Object.prototype.hasOwnProperty.call(collectionEmoticonsCatalogue,idTrouve))
13851 collectionDefinition = collectionEmoticonsCatalogue[idTrouve];
13852 }
13853
13854 if (!collectionDefinition) return null;
13855 return {
13856 type:'collection',
13857 id:collectionDefinition.id,
13858 nom:collectionDefinition.nom,
13859 key:collectionDefinition.key,
13860 image:collectionDefinition.image
13861 };
13862}
13863
13864function findEmot(i) {
13865 for (var ii in emoticons) {
13866 var ic = emoticons[ii];
13867 if (i==ic) return ii;
13868 }
13869 return false;
13870}
13871function checkEmot() {
13872 for (var i=0;i<49;i++) {
13873 if (!findEmot(i)) alert(i);
13874 }
13875 alert('ok');
13876}
13877var myEmots = '';
13878function setMyEmotList(theList) {
13879 myEmots = theList.split('|');
13880}
13881
13882var firstHtmlEmot = '';
13883var ppEmottt = null;
13884
13885function toggleEmot() {
13886 if (!window.isSmileyOnly ) {
13887 $('#actBtnsJ').toggle();
13888 if (firstHtmlEmot == '') {
13889 
13890 var str = '';
13891 ppEmottt = $('#chtput');//.parent();//.html('');
13892 firstHtmlEmot = ppEmottt.html();
13893 //for (var i = 0;i<49;i++) {
13894 for (var ii in myEmots) {
13895 var i = myEmots[ii];
13896 str += '<img onclick="sendEmot('+i+');" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);" src="/images/Emoticon/Emoticon'+i+'.png?v2" class="emotIcon" alt="Envoyer l&#39;&eacute;motic&ocirc;ne '+i+'" role="button" tabindex="0"/>';
13897 //pp.append($('<img onclick="sendEmot('+i+');" src="/images/Emoticon/Emoticon'+i+'.png" class="emotIcon"/>'));
13898 
13899 }
13900 for (var collectionIndex=0;collectionIndex<myCollectionEmots.length;collectionIndex++) {
13901 var collectionId = myCollectionEmots[collectionIndex];
13902 var collectionEmoticon = collectionEmoticonsCatalogue[collectionId];
13903 if (!collectionEmoticon) continue;
13904 var codeDuJour = collectionEmoticonsDailyCodes[collectionId] || '';
13905 str += '<img onclick="sendCollectionEmot(\''+collectionId+'\');" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);" src="'+collectionEmoticon.image+'" alt="Envoyer cette &eacute;motic&ocirc;ne de collection" title="Code du jour : /e '+codeDuJour+'" class="emotIcon collectionEmotIcon" role="button" tabindex="0"/>';
13906 }
13907 ppEmottt.html(str);
13908 ppEmottt.css('pointer-events','initial');
13909 ppEmottt.css('background-color','rgba(255,255,255,.2)');
13910 } else {
13911 ppEmottt.html(firstHtmlEmot);
13912 firstHtmlEmot = '';
13913 ppEmottt.css('pointer-events','');
13914 ppEmottt.css('background-color','');
13915 resetChatInputValidationKeys();
13916 }
13917 }
13918}
13919function readyStart () {
13920 rpc('readyStart=1');
13921 selMoteur.clearActions();
13922}
13923
13924function sendEmot(i) {
13925 var emot = findEmot(i);
13926 rpcNoQueue('sendChatMsg='+escape(emot).split('+').join('%2B'));
13927 //sendChatMessage(emot);
13928 toggleEmot();
13929}
13930function sendCollectionEmot(id) {
13931 if (!Object.prototype.hasOwnProperty.call(collectionEmoticonsCatalogue,id) || myCollectionEmots.indexOf(id)===-1) return;
13932 var code = collectionEmoticonsDailyCodes[id];
13933 if (!code) {
13934 alerte('Le code quotidien de cette emoticone est indisponible.');
13935 return;
13936 }
13937 var message = '/e '+code;
13938 rpcNoQueue('sendChatMsg='+escape(message).split('+').join('%2B'));
13939 toggleEmot();
13940}
13941var chatTemporarilyDisabled = false;
13942var tmpChatDisHtml = '';
13943function TmpChatDis() {
13944 if (!chatTemporarilyDisabled) {
13945 $('#IMGEMOT').hide();
13946 $('#actBtnsJ').hide();
13947 tmpChatDisHtml = $('#chtput').html();
13948 $('#chtput').html('<input id="chatInput" disabled="disabled" value="Chat désactivé pendant la compétition duplicate" type="text">');
13949 chatTemporarilyDisabled = true;
13950 //<input id="chatInput" onfocus="showChatD();" maxlength="255" onclick="showChatD();" type="text">
13951 }
13952}
13953function TmpChatEn() {
13954 if (chatTemporarilyDisabled) {
13955 $('#IMGEMOT').show();
13956 $('#actBtnsJ').show();
13957 $('#chtput').html(tmpChatDisHtml);
13958 tmpChatDisHtml = '';
13959 resetChatInputValidationKeys();
13960 chatTemporarilyDisabled = false;
13961 }
13962}
13963var keyBindAct = false;
13964function resetChatInputValidationKeys() {
13965 var chinp = $$("chatInput");
13966 if (!chinp) return;
13967 if (keyBindAct) return;
13968 keyBindAct = true;
13969
13970 $(document).keydown(function(e) {
13971 if (chatTemporarilyDisabled) return;
13972 if ($('.disableKeyEvents:visible').length>0)
13973 return;
13974 if (e.keyCode == 27 && selMoteur.hideChat ) { // escape key maps to keycode `27`
13975 selMoteur.hideChat();
13976 e.stopPropagation();
13977 e.preventDefault();
13978 return false;
13979 }
13980
13981 if(e.target.id != 'chatInput') {
13982 if (e.which==8) {
13983 var input = $("#chatInput");
13984 input.val(input.val().substr(0,input.val().length-1));
13985 e.preventDefault();
13986 }
13987 }
13988 if (e.keyCode == 13) { // return key maps to keycode `13`
13989
13990 if (!$$("chatInputBtn")) return;
13991 if (typeof $$("chatInputBtn").click!=='undefined' && $("#chatInput").val()!='' ) {
13992  
13993  $$("chatInputBtn").click();
13994 e.stopPropagation();
13995 e.preventDefault();
13996 } else
13997  focusChat();
13998
13999 }
14000 });
14001
14002 $(document.body).on('keypress', function(e) {
14003 if (chatTemporarilyDisabled) return;
14004 if ($('.disableKeyEvents:visible').length>0)
14005 return;
14006 if(e.target.id != 'chatInput') {
14007 // console.log(e.which,e,String.fromCharCode(e.which),String.fromCharCode(e.which).charCodeAt(0));
14008 var input = $("#chatInput");
14009 if (e.key=='Backspace') {
14010  input.val(input.val().substr(0,input.val().length-1));
14011  e.preventDefault();
14012 } else {
14013  if (String.fromCharCode(e.which).charCodeAt(0))
14014  input.val(input.val()+String.fromCharCode(e.which));
14015  input.focus();
14016  e.preventDefault();
14017 }
14018 }
14019 });
14020 
14021 $$("chatInput").onkeydown = (function(e){ 
14022 if (chatTemporarilyDisabled) return; 
14023 var keycode = null;  
14024 if(window.event) {  
14025 keycode = window.event.keyCode;  
14026 }else if(e) {  
14027 keycode = e.which;  
14028 } 
14029 if(keycode == 13){
14030 if (typeof $$("chatInputBtn").click!=='undefined') {
14031 
14032  $$("chatInputBtn").click();
14033  e.stopPropagation();
14034  e.preventDefault();
14035 }
14036 }
14037 });
14038}
14039
14040function getModeJeuIcone(mode) {
14041 // Les anciens tournois reutilisent les nouveaux pictogrammes au bon format.
14042 var correspondances = {
14043 Tournoi: 'TournoiJour4', Tournoi5: 'TournoiJour5', Duplicate5: 'TournoiJour5',
14044 Amical4: 'TournoiJour4', Amical5: 'TournoiJour5', '5joueurs': 'Libre5'
14045 };
14046 var code = Object.prototype.hasOwnProperty.call(correspondances,mode) ? correspondances[mode] : mode;
14047 return '/Jeu-Tarot-en-ligne/IconesJeux/v2/'+encodeURIComponent(code)+'.png?v=detourage-1';
14048}
14049
14050function ouvrirReglesModeJeu(mode) {
14051 mode = mode || (typeof modeJeu!=="undefined" ? modeJeu : "");
14052 if (!mode) return false;
14053 ajax('/workers/regles.php','modeJeu='+encodeURIComponent(mode),function (html) {
14054 var titre = 'R\u00e8gles du mode de jeu';
14055 var dialogId = showDialog('R\u00e8gles - '+titre,html);
14056 var largeur = Math.min(760,Math.max(300,$(window).width()-30));
14057 var $dialogRegles = $('#'+dialogId);
14058 $dialogRegles.dialog('option','width',largeur);
14059 $dialogRegles.dialog('option','maxHeight',Math.max(300,$(window).height()-30));
14060 $dialogRegles.dialog('widget').addClass('reglesModeJeuDialogShell');
14061 });
14062 return false;
14063}
14064
14065function ouvrirReglesModeJeuClavier(event,mode) {
14066 event = event || window.event;
14067 var touche = event.which || event.keyCode;
14068 if (touche!==13 && touche!==32) return true;
14069 if (event.preventDefault) event.preventDefault();
14070 ouvrirReglesModeJeu(mode);
14071 return false;
14072}
14073
14074/* Source ASCII : compatible avec les pages historiques Latin-1. */
14075(function () {
14076 'use strict';
14077 var active = null;
14078
14079 /**
14080 * Affiche le dialogue et renvoie une Promise : {annule:true} en cas de refus, sinon {annule:false,titre,resultat}.
14081 * Sans options : utilise les champs sign\u00e9s du formulaire #proposerDefi.
14082 * Autre int\u00e9gration : { enregistrer: async function ({ titre }) { ... } }.
14083 * Le callback doit rejeter sa Promise en cas d'\u00e9chec.
14084 */
14085 window.afficherDialogueDefi = function (options) {
14086 if (active) return active;
14087 options = options || {};
14088 var enregistrer = options.enregistrer;
14089 if (!enregistrer) {
14090 var source = document.getElementById('proposerDefi');
14091 if (!source) throw new Error('Formulaire sign\u00e9 #proposerDefi introuvable.');
14092 var donnees = new URLSearchParams();
14093 source.querySelectorAll('input[type="hidden"][name]').forEach(function (input) {
14094 donnees.set(input.name, input.value);
14095 });
14096 enregistrer = async function (valeurs) {
14097 var corps = new URLSearchParams(donnees);
14098 corps.set('titre', valeurs.titre);
14099 var reponse = await fetch('/workers/proposerDefi.php', {
14100  method: 'POST', credentials: 'same-origin', body: corps
14101 });
14102 var resultat = (await reponse.text()).trim();
14103 if (!reponse.ok || (resultat !== 'ok' && resultat !== 'already')) {
14104  throw new Error('Enregistrement impossible. R\u00e9essayez.');
14105 }
14106 return { dejaPublie: resultat === 'already' };
14107 };
14108 }
14109 if (typeof enregistrer !== 'function') throw new TypeError('enregistrer doit \u00eatre une fonction.');
14110 if (!document.getElementById('invitation-defi-style')) {
14111 var style = document.createElement('style');
14112 style.id = 'invitation-defi-style';
14113 style.textContent = `
14114 .invitationDefi {box-sizing:border-box;width:min(550px,calc(100vw - 32px));max-width:none;max-height:calc(100dvh - 32px);margin:auto;padding:0;overflow:auto;color:#253d35;background:#fffcf6;border:1px solid #e2ded2;border-radius:22px;box-shadow:0 28px 100px #12231c40;font:15px/1.55 Arial,sans-serif;text-align:left}
14115 .invitationDefi::backdrop {background:rgba(22,32,27,.55);backdrop-filter:blur(5px)}
14116 .invitationDefi * {box-sizing:border-box}
14117 .invitationDefi form {margin:0;padding:34px 34px 27px}
14118 .invitationDefi .defiIntro {text-align:center}
14119 .invitationDefi .defiCartes {position:relative;height:69px;width:105px;margin:0 auto 17px}
14120 .invitationDefi .defiCarte {position:absolute;width:43px;height:59px;top:3px;left:31px;display:grid;place-items:center;border:1px solid #d1c5a8;border-radius:6px;background:#fffdf7;color:#264a3d;font:28px Georgia,serif;box-shadow:0 3px 5px #253d3512}
14121 .invitationDefi .defiCarte:first-child {transform:translate(-24px,6px) rotate(-19deg)}
14122 .invitationDefi .defiCarte:last-child {transform:translate(24px,6px) rotate(19deg);color:#aa734b}
14123 .invitationDefi .defiCarte:nth-child(2) {z-index:1;background:#284d3e;color:#f2d7a0;font-size:24px}
14124 .invitationDefi .defiEyebrow {margin:0 0 9px;color:#7b6544;font-size:15px;font-weight:700;letter-spacing:1.8px;text-transform:uppercase}
14125 .invitationDefi h2 {margin:0;padding:0;color:#253d35;background:none;border:0;font:normal 34px/1.12 Georgia,serif;letter-spacing:-.9px;text-transform:none}
14126 .invitationDefi .defiAccroche {margin:15px auto 0;max-width:370px;color:#656b63;font-size:15px}
14127 .invitationDefi .defiRegles {display:flex;flex-wrap:wrap;justify-content:center;gap:6px 20px;padding:17px 0 0;margin:0;list-style:none;font-size:15px;font-weight:600}
14128 .invitationDefi .defiRegles li {padding:0;margin:0}
14129 .invitationDefi .defiRegles span {color:#64866c;margin-right:5px}
14130 .invitationDefi .defiChamp {margin-top:27px;padding-top:23px;border-top:1px solid #e8e2d6}
14131 .invitationDefi label {display:flex;flex-wrap:wrap;justify-content:space-between;gap:4px 12px;margin:0 0 9px;font-size:15px;font-weight:600}
14132 .invitationDefi label span {color:#656b63;font-size:15px;font-weight:400}
14133 .invitationDefi input {display:block;width:100%;height:49px;margin:0;padding:12px 14px;color:#253d35;background:#fffefa;border:1px solid #cfcfc2;border-radius:9px;font:16px Arial,sans-serif;box-shadow:none}
14134 .invitationDefi input::placeholder {color:#83867d;opacity:1}
14135 .invitationDefi input:focus-visible,.invitationDefi button:focus-visible {outline:3px solid #a4bcab;outline-offset:3px}
14136 .invitationDefi .defiAide {margin:8px 0 0;color:#656b63;font-size:15px}
14137 .invitationDefi .defiSuivi {display:flex;gap:11px;align-items:flex-start;margin:22px 0;color:#656b63;font-size:15px;line-height:1.55}
14138 .invitationDefi .defiSuivi svg {flex-shrink:0;width:19px;height:19px;margin-top:2px;color:#67816d}
14139 .invitationDefi .defiSuivi p {margin:0}
14140 .invitationDefi .defiSuivi strong {font-weight:600;color:#253d35}
14141 .invitationDefi .defiActions {position:sticky;bottom:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;padding:12px 0;background:#fffcf6}
14142 .invitationDefi button {display:block;width:100%;min-height:48px;margin:0;padding:12px 20px;border:1px solid #234735;border-radius:10px;background:#284d3e;color:#fffdf6;font:600 15px Arial,sans-serif;cursor:pointer;box-shadow:0 3px 8px #284d3e15}
14143 .invitationDefi button:hover {background:#1e4032}
14144 .invitationDefi button:disabled {opacity:.65;
14144cursor:wait}
14145 
14146 .invitationDefi .defiErreur {margin:0 0 14px;color:#a4382c;font-size:15px}
14147 .invitationDefi .defiErreur:empty {display:none}
14148 @media(max-width:400px) {.invitationDefi .defiActions {grid-template-columns:1fr}.invitationDefi form {padding:25px 21px 22px}.invitationDefi h2 {font-size:30px}}
14149 `;
14150 document.head.appendChild(style);
14151 }
14152 var precedent = document.activeElement;
14153 var dialogue = document.createElement('dialog');
14154 dialogue.className = 'invitationDefi';
14155 dialogue.setAttribute('aria-labelledby', 'invitation-defi-titre');
14156 dialogue.setAttribute('aria-describedby', 'invitation-defi-description');
14157 dialogue.setAttribute('closedby', 'closerequest');
14158 dialogue.innerHTML = `
14159 <form>
14160 <div class="defiIntro">
14161  <div class="defiCartes" aria-hidden="true"><span class="defiCarte">\u2660</span><span class="defiCarte">\u2605</span><span class="defiCarte">\u2666</span></div>
14162  <p class="defiEyebrow">\u00c0 vous de lancer le d\u00e9fi</p>
14163  <h2 id="invitation-defi-titre">Qui fera mieux<br>que vous ?</h2>
14164  <p id="invitation-defi-description" class="defiAccroche">Proposez votre partie \u00e0 la communaut\u00e9.<br>Les autres joueurs tenteront de <strong>battre votre score</strong> contre l\u2019intelligence artificielle.</p>
14165  <ul class="defiRegles"><li><span aria-hidden="true">\u2713</span>M\u00eame distribution</li><li><span aria-hidden="true">\u2713</span>M\u00eame IA que votre partie</li></ul>
14166 </div>
14167 <div class="defiChamp">
14168  <label for="invitation-defi-nom">Un titre pour votre d\u00e9fi <span>Facultatif</span></label>
14169  <input id="invitation-defi-nom" name="titre" type="text" maxlength="120" autocomplete="off" placeholder="Ex. : \u00c0 vous de faire mieux !" aria-describedby="invitation-defi-aide">
14170  <p class="defiAide" id="invitation-defi-aide">Vous pouvez laisser ce champ vide.</p>
14171 </div>
14172 <div class="defiSuivi">
14173  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 4v16h16M9 15v-4m5 4V7m5 8v-6"/></svg>
14174  <p>Retrouvez les r\u00e9sultats des joueurs qui rel\u00e8vent votre d\u00e9fi dans <strong>votre tableau de bord.</strong></p>
14175 </div>
14176 <p class="defiErreur" role="status" aria-live="polite"></p>
14177 <div class="defiActions"><button type="button" class="defiRefuser" autofocus>Ne pas proposer</button><button type="submit">Proposer le d\u00e9fi</button></div>
14178 </form>`;
14179 // Echappement et refus ferment sans publier ; pas de fermeture pendant l'enregistrement.
14180 dialogue.addEventListener('cancel', function (event) { event.preventDefault(); if (!enCours) fermer({ annule: true }); });
14181 var form = dialogue.querySelector('form'), champ = form.elements.titre;
14182 var bouton = dialogue.querySelector('button[type="submit"]'), refuser = dialogue.querySelector('.defiRefuser'), statut = dialogue.querySelector('.defiErreur');
14183 var enCours = false, terminer;
14184 var promesse = new Promise(function (resolve) { terminer = resolve; });
14185 function fermer(resultat) {
14186 dialogue.close();
14187 dialogue.remove();
14188 active = null;
14189 if (precedent && precedent.isConnected) precedent.focus();
14190 terminer(resultat);
14191 }
14192 refuser.addEventListener('click', function () {
14193 if (!enCours) fermer({ annule: true });
14194 });
14195 form.addEventListener('submit', async function (event) {
14196 event.preventDefault();
14197 if (enCours || !form.reportValidity()) return;
14198 enCours = true;
14199 champ.disabled = bouton.disabled = refuser.disabled = true;
14200 bouton.textContent = 'Enregistrement\u2026';
14201 statut.textContent = '';
14202 dialogue.setAttribute('aria-busy', 'true');
14203 var titre = champ.value.trim();
14204 try {
14205 var resultat = await enregistrer({ titre: titre });
14206 fermer({ annule: false, titre: titre, resultat: resultat });
14207 } catch (erreur) {
14208 enCours = false;
14209 champ.disabled = bouton.disabled = refuser.disabled = false;
14210 bouton.textContent = 'Proposer le d\u00e9fi';
14211 dialogue.setAttribute('aria-busy', 'false');
14212 statut.textContent = erreur instanceof Error ? erreur.message : 'Enregistrement impossible. R\u00e9essayez.';
14213 bouton.focus();
14214 }
14215 });
14216 document.body.appendChild(dialogue);
14217 try { dialogue.showModal(); } catch (erreur) { dialogue.remove(); throw erreur; }
14218 active = promesse;
14219 return promesse;
14220 };
14221}());
14222
14223/* Source ASCII compatible avec les pages Latin-1. */
14224(function () {
14225 'use strict';
14226 var active = null;
14227 function points(n) {
14228 return (n >
14228 0 ? '+' : '') + n.toLocaleString('fr-FR', {maximumFractionDigits: 2}) + ' pts';
14229 }
14230 function afficherDialogueProgression(resultat, tableLibre) {
14231 if (active) return active;
14232 if (!resultat || typeof resultat.scoreJoueur !== 'number' || !isFinite(resultat.scoreJoueur) ||
14233  document.querySelector('.invitationDefi[open]')) return null;
14234 if (tableLibre) {
14235  if ((resultat.mode !== 'Libre4' && resultat.mode !== 'Libre5') || resultat.scoreJoueur === 0) return null;
14236 } else if (typeof resultat.scoreIA !== 'number' || !isFinite(resultat.scoreIA) ||
14237  resultat.scoreIA <= resultat.scoreJoueur) return null;
14238 if (!document.getElementById('promotion-cpu-style')) {
14239  var style = document.createElement('style');
14240  style.id = 'promotion-cpu-style';
14241  style.textContent = [
14242  '.promotionCpu{box-sizing:border-box;width:min(800px,calc(100vw - 24px));max-width:none;max-height:calc(100dvh - 24px);margin:auto;padding:0;overflow:auto;background:#fbf9f2;color:#263e35;border:1px solid #d6dccc;border-radius:22px;box-shadow:0 28px 100px #12231c66;font:15px/1.55 Arial,sans-serif;text-align:left}',
14243  '.promotionCpu::backdrop{background:#142820a8;backdrop-filter:blur(5px)}',
14244  '.promotionCpu *{box-sizing:border-box}.promotionCpu p{margin:0}
14244.promotionCpu button{cursor:pointer;font:inherit}.promotionCpu button:focus-visible{outline:3px solid #9cb8a3;outline-offset:4px}',
14245  '.promotionCpu .progressionHero{position:relative;isolation:isolate;overflow:hidden;padding:32px;background:radial-gradient(ellipse at 100% 0%,#526b49 0,transparent 62%),linear-gradient(130deg,#183f31,#2d5140);color:#fffdf5;border-bottom:3px solid #c9ab69}',
14246  '.promotionCpu .progressionSurtitre{margin:0 110px 14px 0;color:#f3d491;font-size:15px;letter-spacing:1.3px;font-weight:700;text-transform:uppercase}',
14247  '.promotionCpu h2{margin:0;padding:0 100px 0 0;border:0;background:none;color:#fffdf5;font:bold 40px/1.1 Georgia,serif;letter-spacing:-.7px;text-wrap:balance;text-transform:none}',
14248  '.promotionCpu .progressionIntro{margin:14px 0 22px;color:#e3eadd;font-size:16px}',
14249  '.promotionCpu .progressionScores{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.promotionCpu .progressionScore{min-width:132px;padding:10px 16px;border:1px solid #ffffff35;border-radius:12px;background:#102e232e}.promotionCpu .progressionScore span{display:block;color:#d6e1d6;font-size:15px}.promotionCpu .progressionScore strong{font-size:28px;color:#fffdf5}.promotionCpu .progressionScoreIA{border-color:#f3d491;background:#f3d49114}.promotionCpu .progressionScoreIA strong{color:#f5d58e}.promotionCpu .progressionGain{margin-left:7px;color:#f5d58e;font-size:16px;font-weight:700}',
14250  '.promotionCpu .progressionContenu{padding:28px 32px;display:grid;grid-template-columns:minmax(0,1fr);gap:28px;align-items:center}.promotionCpu.avecPublicite .progressionContenu{grid-template-columns:minmax(0,1fr) 300px}',
14251  '.promotionCpu h3{margin:0 0 12px;padding:0;background:none;border:0;color:#263e35;font:700 24px/1.25 Arial,sans-serif;text-transform:none}.promotionCpu .progressionConseil{color:#526056;font-size:16px;line-height:1.6}.promotionCpu .progressionModes{margin-top:22px;padding-top:17px;border-top:1px solid #ddcfad;color:#76551a;font-size:22px;line-height:1.3;font-weight:700;letter-spacing:-.3px}',
14252  '.promotionCpu .progressionPublicite{align-self:start;width:300px;text-align:center}.promotionCpu .progressionPublicite[hidden]{display:none}.promotionCpu .progressionPubLabel{display:block;margin:0 0 8px;color:#737b70;font-size:15px;letter-spacing:1.5px;text-transform:uppercase}.promotionCpu .progressionPubSupport{width:300px;height:250px;background:#f0f1eb;position:relative}.promotionCpu .progressionPubSupport>div{max-width:300px}',
14253  '.promotionCpu .progressionPied{position:sticky;bottom:0;z-index:2;background:#fbf9f2;display:flex;align-items:center;justify-content:flex-end;padding:14px 32px;border-top:1px solid #e0e3d7}.promotionCpu .progressionPlusTard{flex-shrink:0;min-width:120px;padding:11px 28px;border:0;border-radius:9px;background:#284d3e;color:#fffdf5;font-size:16px;font-weight:700;box-shadow:0 3px 9px #1b402521}.promotionCpu .progressionPlusTard:hover{background:#193b2b}',
14254  '.promotionCpu .progressionEmbleme{position:absolute;right:32px;top:28px;width:90px;height:94px;pointer-events:none}.promotionCpu .progressionCarte{position:absolute;top:5px;left:21px;display:grid;place-items:center;width:52px;height:74px;border:1px solid #d9bc79;border-radius:8px;background:#fbf5e7;color:#28513d;font:30px Georgia,serif;box-shadow:0 6px 15px #102f3040}.promotionCpu .progressionCarte:first-child{transform:translate(-18px,9px) rotate(-18deg);background:#d8c591}.promotionCpu .progressionCarte:last-child{transform:translate(18px,8px) rotate(17deg)}.promotionCpu .progressionCarte:nth-child(2){z-index:1;background:#244e3c;color:#f4d899;transform:rotate(-3deg)}',
14255  '@media(prefers-reduced-motion:no-preference){.promotionCpu[open]{animation:progressionEntree .18s ease-out}@keyframes progressionEntree{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}}',
14256  '@media(max-width:640px){.promotionCpu.avecPublicite .progressionContenu{grid-template-columns:minmax(0,1fr)}.promotionCpu .progressionPublicite{justify-self:center}.promotionCpu h2{font-size:32px;padding-right:0}.promotionCpu .progressionEmbleme{display:none}.promotionCpu .progressionSurtitre{margin-right:0}.promotionCpu .progressionHero{padding:24px}.promotionCpu .progressionGain{margin-left:0}}',
14257  '@media(max-width:400px){.promotionCpu{width:calc(100vw - 16px);max-height:calc(100dvh - 16px);border-radius:16px}.promotionCpu .progressionHero{padding:22px 18px}.promotionCpu h2{font-size:27px}.promotionCpu .progressionContenu{padding:20px 12px}.promotionCpu .progressionScore{min-width:117px;padding:8px 12px}.promotionCpu .progressionPied{padding:16px 18px;flex-direction:column;align-items:stretch;text-align:center}.promotionCpu .progressionPublicite{margin-left:-12px;margin-right:-12px}}'
14258  ].join('\n');
14259  document.head.appendChild(style);
14260 }
14261 var precedent = document.activeElement;
14262 var dialogue = document.createElement('dialog');
14263 dialogue.className = 'promotionCpu';
14264 dialogue.setAttribute('aria-labelledby', 'progression-cpu-titre');
14265 dialogue.setAttribute('aria-describedby', 'progression-cpu-intro');
14266 dialogue.innerHTML = [
14267  '<div class="progressionHero"><div class="progressionEmbleme" aria-hidden="true"><span class="progressionCarte">\u2660</span><span class="progressionCarte">\u2666</span><span class="progressionCarte">\u2663</span></div>',
14268  '<p class="progressionSurtitre">R\u00e9sultat de la simulation</p>',
14269  '<h2 id="progression-cpu-titre">\u00c0 votre place, l\u2019IA<br>aurait fait mieux.</h2>',
14270  '<p class="progressionIntro" id="progression-cpu-intro">La simulation reprend vos cartes et votre contrat.</p>',
14271  '<div class="progressionScores"><div class="progressionScore"><span>Votre score</span><strong data-score="joueur"></strong></div>',
14272  '<div class="progressionScore progressionScoreIA"><span>Score simul\u00e9 de l\u2019IA</span><strong data-score="ia"></strong></div><p class="progressionGain" data-score="ecart"></p></div></div>',
14273  '<div class="progressionContenu"><div>',
14274  '<h3>Inspirez-vous des meilleurs.</h3>',
14275  '<p class="progressionConseil">En d\u00e9fi ou en tournoi, comparez vos choix \u00e0 ceux des autres joueurs. D\u00e9couvrez ce qui fait la diff\u00e9rence.</p>',
14276  '<p class="progressionModes">Jouer, comparer, progresser.</p>',
14277  '</div><aside class="progressionPublicite" aria-label="Publicit\u00e9" hidden><span class="progressionPubLabel">Publicit\u00e9</span><div class="progressionPubSupport"></div></aside></div>',
14278  '<div class="progressionPied"><button type="button" class="progressionPlusTard" autofocus>Fermer</button></div>'
14279 ].join('');
14280 dialogue.querySelector('[data-score="joueur"]').textContent = points(resultat.scoreJoueur);
14281 if (tableLibre) {
14282  var victoire = resultat.scoreJoueur > 0;
14283  dialogue.classList.add('promotionTableLibre');
14284  dialogue.setAttribute('data-resultat', victoire ? 'victoire' : 'defaite');
14285  dialogue.querySelector('.progressionSurtitre').textContent = 'Table libre \u00e0 ' + (resultat.mode === 'Libre4' ? '4' : '5') + ' \u00b7 Partie termin\u00e9e';
14286  dialogue.querySelector('#progression-cpu-titre').textContent = victoire ?
14287  'Vous avez gagn\u00e9. Visez plus haut.' : 'Pr\u00e9parez votre prochaine victoire.';
14288  dialogue.querySelector('.progressionIntro').textContent = victoire ?
14289  'Faites compter votre talent, partie apr\u00e8s partie.' :
14290  'Une d\u00e9faite peut aussi faire avancer votre jeu.';
14291  dialogue.querySelector('h3').textContent = victoire ?
14292  'Faites votre place au classement.' : 'Inspirez-vous des meilleurs.';
14293  dialogue.querySelector('.progressionConseil').textContent = victoire ?
14294  'En tournoi et en comp\u00e9tition, mesurez-vous aux autres joueurs. Relevez des d\u00e9fis \u00e0 la hauteur de votre jeu.' :
14295  'En d\u00e9fi ou en tournoi, comparez vos choix \u00e0 ceux des autres joueurs. D\u00e9couvrez ce qui fait la diff\u00e9rence.';
14296  dialogue.querySelector('.progressionScoreIA').remove();
14297  dialogue.querySelector('[data-score="ecart"]').remove();
14298 } else {
14299 dialogue.querySelector('[data-score="ia"]').textContent = points(resultat.scoreIA);
14300 dialogue.querySelector('[data-score="ecart"]').textContent = '+' + (resultat.scoreIA - resultat.scoreJoueur).toLocaleString('fr-FR', {maximumFractionDigits: 2}) + ' points pour l\u2019IA';
14301 }
14302 var ferme = false, publicite = null, marqueur = null, observateur = null;
14303 function fermer() {
14304  if (ferme) return;
14305  ferme = true;
14306  if (observateur) observateur.disconnect();
14307  // Replacer le meme encart : aucun nouveau slot ni script publicitaire.
14308  if (publicite && marqueur && marqueur.parentNode) {
14309  if (typeof marqueur.parentNode.moveBefore === 'function' && marqueur.parentNode.isConnected) {
14310   marqueur.parentNode.moveBefore(publicite, marqueur);marqueur.remove();
14311  } else marqueur.parentNode.replaceChild(publicite, marqueur);
14312  }
14313  if (dialogue.open) dialogue.close();
14314  dialogue.remove();
14315  active = null;
14316  if (precedent && precedent.isConnected) precedent.focus();
14317 }
14318 dialogue.querySelector('.progressionPlusTard').addEventListener('click', fermer);
14319 dialogue.addEventListener('cancel', function (event) {event.preventDefault();fermer();});
14320 dialogue.addEventListener('close', fermer);
14321 document.body.appendChild(dialogue);
14322 try {dialogue.showModal();} catch (e) {dialogue.remove();return null;}
14323 active = {fermer: fermer};
14324 // L'encart d'accueil n'existe que si les regles de la page autorisent la publicite.
14325 // Header_MREC / son equivalent historique sont des rectangles normaux 300 x 250.
14326 if (window.innerWidth >= 318) {
14327  publicite = document.querySelector('[data-fuse="Header_MREC"]') || document.getElementById('div-gpt-ad-1407836299334-0');
14328  if (publicite) {
14329  var verifierPublicite = function () {
14330   if (ferme) return;
14331   var remplie = !!publicite.querySelector('iframe,img,object,embed');
14332   // Laisser le chargement differe se faire dans son emplacement habituel.
14333   if (remplie && !marqueur) {
14334   marqueur = document.createComment('Encart accueil temporairement dans la modale progression');
14335   publicite.parentNode.insertBefore(marqueur, publicite);
14336   var support = dialogue.querySelector('.progressionPubSupport');
14337   if (typeof support.moveBefore === 'function') support.moveBefore(publicite, null);
14338   else support.appendChild(publicite);
14339   }
14340   dialogue.querySelector('.progressionPublicite').hidden = !remplie;
14341   dialogue.classList.toggle('avecPublicite', remplie);
14342  };
14343  observateur = new MutationObserver(verifierPublicite);
14344  observateur.observe(publicite, {childList: true, subtree: true});
14345  verifierPublicite();
14346  }
14347 }
14348 return active;
14349 }
14350 window.afficherDialogueProgressionCpu = function (resultat) {
14351 return afficherDialogueProgression(resultat, false);
14352 };
14353 window.afficherDialogueCompetitionTableLibre = function (resultat) {
14354 return afficherDialogueProgression(resultat, true);
14355 };
14356}());
14357
14358
14359/* Invitation de fin de table libre, sans requete ni simulation. */
14360(function () {
14361 'use strict';
14362 var active = null, vus = [], sortieDePartie = null;
14363 function identitePartie() {
14364 return String(window.currentGameId) + '|' + String(window.gameMode);
14365 }
14366 window.reinitialiserInvitationTableLibre = function () {
14367 sortieDePartie = null;
14368 };
14369 window.arreterInvitationTableLibre = function () {
14370 sortieDePartie = identitePartie();
14371 if (active) active.fermer();
14372 active = null;
14373 };
14374 window.demarrerInvitationTableLibre = function (contexte) {
14375 var mode = typeof gameMode === 'string' && gameMode ? gameMode : window.jQuery('#modeJeuSalon').val();
14376 if (sortieDePartie === identitePartie() || !contexte || (contexte.mode !== 'Libre4' && contexte.mode !== 'Libre5') ||
14377  contexte.mode !== mode || Number(contexte.idPartie) !== Number(window.currentGameId) ||
14378  typeof contexte.fin !== 'string' || typeof contexte.scoreJoueur !== 'number' ||
14379  !isFinite(contexte.scoreJoueur) || contexte.scoreJoueur === 0 || window.isOffLineGame ||
14380  document.visibilityState === 'hidden' || !document.getElementById('BTNQUT') ||
14381  typeof window.afficherDialogueCompetitionTableLibre !== 'function') return;
14382 var cle = contexte.mode + '|' + contexte.idPartie + '|' + contexte.fin;
14383 if (vus.indexOf(cle) !== -1) return;
14384 vus.push(cle);if (vus.length > 16) vus.shift();
14385 if (active) active.fermer();
14386 active = null;
14387 if (document.querySelector('dialog[open]')) return;
14388 active = window.afficherDialogueCompetitionTableLibre(contexte);
14389 };
14390 window.addEventListener('pagehide', window.arreterInvitationTableLibre);
14391}());
14392
14393/* Bouton pilote par l'etat serveur, sans interrogation supplementaire. */
14394(function () {
14395 'use strict';
14396 var contexte = null, envoi = false, delai = 0, timer = null;
14397 var libelle = 'Inviter des joueurs disponibles';
14398 function memePartie(c) {
14399 return c && Number(c.idPartie) === Number(window.currentGameId) && c.mode === window.gameMode;
14400 }
14401 function retirer() {
14402 if (window.selMoteur && typeof selMoteur.removeAction === 'function' &&
14403  (!selMoteur.actionExists || selMoteur.actionExists(libelle))) selMoteur.removeAction(libelle);
14404 }
14405 function afficher() {
14406 if (!memePartie(contexte) || window.isOffLineGame || !window.selMoteur ||
14407  (window.etapeCourante !== 'Salon' && window.etapeCourante !== 'Attente')) {
14408  retirer(); return;
14409 }
14410 if (envoi || Date.now() < delai) { retirer(); return; }
14411 if (!selMoteur.actionExists || !selMoteur.actionExists(libelle))
14412  selMoteur.addAction(libelle, 'envoyerInvitationsAttente();', 'btn-success', true);
14413 }
14414 // Restaurer une action effacee par le panneau sans requete ni changement de contexte.
14415 window.rafraichirInvitationsAttente = afficher;
14416 window.actualiserInvitationsAttente = function (etat) {
14417 contexte = etat;
14418 afficher();
14419 };
14420 window.arreterInvitationsAttente = function () {
14421 contexte = null;
14422 clearTimeout(timer);
14423 retirer();
14424 };
14425 function dureeMessage(secondes) {
14426 return secondes % 60 === 0 ? (secondes / 60) + ' minute' + (secondes > 60 ? 's' : '') :
14427  secondes + ' seconde' + (secondes > 1 ? 's' : '');
14428 }
14429 function messageResultat(r, mode) {
14430 var nb = Math.max(0, Math.floor(Number(r.count) || 0));
14431 var precision = '';
14432 if (/^Challenge[0-3]$/.test(mode))
14433  precision = 'Ils sont dans la m\u00eame \u00e9tape de qualification du Challenge que vous.';
14434 else if (mode === 'Competition4' || mode === 'Competition5')
14435  precision = 'Ils appartiennent \u00e0 la division ' + (mode === 'Competition4' ? 'D2' : 'D1') + '.';
14436 else if (mode === 'Master')
14437  precision = 'Ils disposent de la qualification requise pour le Master.';
14438 else if (/^(Premium|5joueurs|Premium4|Premium5)$/.test(mode))
14439  precision = 'Ils disposent de cr\u00e9dits Premium.';
14440 var texte;
14441 if (nb > 0) {
14442  texte = nb + ' joueur' + (nb > 1 ? 's ont \u00e9t\u00e9 invit\u00e9s' : ' a \u00e9t\u00e9 invit\u00e9') + ' \u00e0 jouer.<br><br>' +
14443  (nb === 1 ? 'Ce joueur remplit' : 'Ces joueurs remplissent') + ' les conditions d\u2019acc\u00e8s \u00e0 ce mode de jeu et ' +
14444  (nb === 1 ? 'accepte' : 'acceptent') + ' de recevoir vos invitations.';
14445  if (precision) texte += ' ' + (nb === 1 ? precision.replace(/^Ils sont/, 'Il est').replace(/^Ils appartiennent/, 'Il appartient').replace(/^Ils disposent/, 'Il dispose') : precision);
14446  texte += '<br><br>Chaque joueur reste libre d\u2019accepter. Une invitation ne garantit pas sa participation.';
14447 } else {
14448  texte = 'Aucun joueur disponible et \u00e9ligible n\u2019a pu \u00eatre invit\u00e9 pour le moment. Aucune inv
14448itation n\u2019a \u00e9t\u00e9 envoy\u00e9e.<br><br>' +
14449  'La recherche tient compte des conditions d\u2019acc\u00e8s au mode de jeu et des pr\u00e9f\u00e9rences d\u2019invitation.';
14450 }
14451 // L'admin previsualise le message joueur, y compris son delai normal.
14452 var attente = r.simulation ? 300 : Math.max(5, Math.ceil(Number(r.retryAfter) || 300));
14453 texte += '<br><br>Nouvel envoi possible dans ' + dureeMessage(attente) + '.';
14454 if (r.simulation) {
14455  texte = '<strong>Pr\u00e9visualisation administrateur \u2014 aucun envoi r\u00e9el.</strong><br><br>' + texte +
14456  '<br><br>Le test peut inclure des comptes hors ligne. Nouvel essai de simulation dans ' +
14457  dureeMessage(Math.max(5, Math.ceil(Number(r.retryAfter) || 30))) + '.';
14458 }
14459 return texte;
14460 }
14461 window.envoyerInvitationsAttente = function () {
14462 if (!memePartie(contexte) || envoi || Date.now() < delai ||
14463  (window.etapeCourante !== 'Salon' && window.etapeCourante !== 'Attente')) return;
14464 var demande = contexte;
14465 envoi = true; retirer();
14466 // Une reponse perdue ne doit pas permettre de multiplier les tentatives.
14467 delai = Date.now() + (demande.simulation ? 30000 : 300000);
14468 window.jQuery.ajax({
14469  url: '/workers/invitationsAttente.php', type: 'POST', contentType: 'application/json',
14470  dataType: 'json', data: JSON.stringify(demande), timeout: 15000
14471 }).done(function (r) {
14472  if (r && typeof r.retryAfter === 'number') delai = Date.now() + Math.max(5, r.retryAfter) * 1000;
14473  if (!contexte || !memePartie(demande)) return;
14474  if (r && r.ok) {
14475  alerte(messageResultat(r, demande.mode));
14476  } else alerte(r && r.message ? r.message : 'Envoi indisponible.');
14477 }).fail(function (xhr) {
14478  var r = xhr.responseJSON;
14479  if (!r && xhr.responseText) { try { r = JSON.parse(xhr.responseText); } catch (ignore) {} }
14480  if (r && typeof r.retryAfter === 'number') delai = Date.now() + Math.max(5, r.retryAfter) * 1000;
14481  if (contexte && memePartie(demande)) alerte(r && r.message ? r.message :
14482  'Impossible de confirmer l\u2019envoi. Veuillez patienter avant de r\u00e9essayer.');
14483 }).always(function () {
14484  envoi = false;
14485  clearTimeout(timer);
14486  timer = setTimeout(afficher, Math.max(0, delai - Date.now()));
14487  afficher();
14488 });
14489 };
14490 window.accepterInvitationAttenteMode = function (mode) {
14491 if (!/^(Premium[45]|Competition[45]|Master|Challenge[0-3]|TournoiJour[45])$/.test(mode)) return;
14492 if (window.gamesStarted) { alerte('Quittez votre partie en cours avant de jouer.'); return; }
14493 newGame(mode);
14494 };
14495 window.addEventListener('pagehide', window.arreterInvitationsAttente);
14496}());
14497
14498/* Comparaison CPU independante de la file RPC du jeu. */
14499(function () {
14500 'use strict';
14501 var courant = null, generation = 0, vus = [];
14502 function modeCourant() {
14503 return typeof gameMode === 'string' && gameMode ? gameMode : window.jQuery('#modeJeuSalon').val();
14504 }
14505 function correspond(contexte) {
14506 return Number(window.currentGameId) === Number(contexte.idPartie) && modeCourant() === contexte.mode;
14507 }
14508 function requete(contexte, action, titre) {
14509 return window.jQuery.ajax({
14510  url: '/workers/defiCpuComparaison.php', type: 'POST', dataType: 'json',
14511  contentType: 'application/json; charset=UTF-8', timeout: 15000,
14512  data: JSON.stringify({action: action, token: contexte.token, idPartie: contexte.idPartie,
14513  mode: contexte.mode, scoreJoueur: contexte.scoreJoueur, titre: titre})
14514 });
14515 }
14516 window.arreterComparaisonDefiCpu = function () {
14517 generation++;
14518 if (courant && courant.xhr) courant.xhr.abort();
14519 if (courant && courant.promotion) courant.promotion.fermer();
14520 courant = null;
14521 };
14522 window.demarrerComparaisonDefiCpu = function (contexte) {
14523 if (!contexte || typeof contexte.token !== 'string' || !/^[a-f0-9]{64}$/.test(contexte.token) ||
14524  typeof contexte.scoreJoueur !== 'number' || !isFinite(contexte.scoreJoueur) ||
14525
14526  window.isOffLineGame || !correspond(contexte) || vus.indexOf(contexte.token) !== -1) return;
14527 window.arreterComparaisonDefiCpu();
14528 vus.push(contexte.token);if (vus.length > 8) vus.shift();
14529 var version = generation, travail = {contexte: contexte, xhr: null};
14530 courant = travail;travail.xhr = requete(contexte, 'comparer');
14531 travail.xhr.done(function (resultat) {
14532  if (version !== generation || courant !== travail || !correspond(contexte) ||
14533  document.visibilityState === 'hidden' || !document.getElementById('BTNQUT') ||
14534  !resultat || resultat.ok !== true || resultat.scoreJoueur !== contexte.scoreJoueur ||
14535  typeof resultat.scoreIA !== 'number' || !isFinite(resultat.scoreIA)) return;
14536  if (resultat.comparaison === 'ia_meilleure' && resultat.scoreIA > contexte.scoreJoueur) {
14537  if (typeof window.afficherDialogueProgressionCpu === 'function')
14538   travail.promotion = window.afficherDialogueProgressionCpu(resultat);
14539  return;
14540  }
14541  if (resultat.comparaison !== 'joueur_meilleur' || resultat.scoreIA >= contexte.scoreJoueur ||
14542  contexte.scoreJoueur <= -150 || contexte.scoreJoueur === 0 ||
14543  typeof window.afficherDialogueDefi !== 'function') return;
14544  window.afficherDialogueDefi({
14545  enregistrer: function (valeurs) {
14546   return new Promise(function (resolve, reject) {
14547   requete(contexte, 'publier', valeurs.titre).done(function (data) {
14548    if (data && data.ok === true) resolve(data);
14549    else reject(new Error(data && data.message || 'Enregistrement impossible. Reessayez.'));
14550   }).fail(function (xhr) {
14551    reject(new Error(xhr.responseJSON && xhr.responseJSON.message || 'Enregistrement impossible. Reessayez.'));
14552   });
14553   });
14554  }
14555  }).then(function (choix) {
14556  if (choix && choix.annule) return;
14557  if (correspond(contexte) && typeof window.showMessage === 'function')
14558   window.showMessage('Votre d\u00e9fi a \u00e9t\u00e9 enregistr\u00e9.');
14559  });
14560 });
14561 };
14562 window.addEventListener('pagehide', window.arreterComparaisonDefiCpu);
14563}());
14564
14565(function () {
14566 var endpoint = '/workers/endGameAccount.php';
14567 function request(data,success,failed) {
14568 $.ajax({
14569  url:endpoint,
14570  type:'POST',
14571  data:data,
14572  dataType:'json',
14573  timeout:15000,
14574  success:function (response) {
14575  if (response && response.status) success(response.status);
14576  else failed();
14577  },
14578  error:failed
14579 });
14580 }
14581
14582 function askPassword(email,continueNavigation) {
14583 prompte(
14584  'Un compte existe déjà avec cette adresse. Saisissez son mot de passe pour vous y connecter.<br>',
14585  '',
14586  function (password) {
14587  if (!password) {
14588   continueNavigation();
14589   return;
14590  }
14591  request(
14592   {action:'login',email:email,password:password},
14593   function (status) {
14594   if (status==='logged_in') {
14595    continueNavigation();
14596    return;
14597   }
14598   if (status==='locked') {
14599    alerte('Trop de tentatives. Reessayez dans dix minutes.',continueNavigation);
14600   } else {
14601    alerte('Mot de passe incorrect.',function () {
14602    askPassword(email,continueNavigation);
14603    });
14604   }
14605   },
14606   continueNavigation
14607  );
14608  },
14609  continueNavigation,
14610  'password'
14611 );
14612 }
14613
14614 function askEmail(continueNavigation) {
14615
14616 var webBody = document.getElementById('webBody');
14617 var dark = webBody && webBody.classList.contains('themeSombre');
14618
14619 var titleColor = dark ? '#f6dfc7' : '#56351f';
14620 var textColor = dark ? '#f2e9df' : '#3d332c';
14621 var mutedColor = dark ? '#cbbdaf' : '#76695f';
14622 var chipBackground = dark ? '#443b34' : '#f6f1eb';
14623 var chipBorder = dark ? '#645549' : '#e6d9cc';
14624 var accent = dark ? '#e0a85a' : '#a76022';
14625
14626 var message =
14627  '<div style="max-width:460px;margin:0 auto;text-align:center">' +
14628
14629  '<div style="' +
14630   'margin:0 0 10px;' +
14631   'color:' + titleColor + ';' +
14632   'font-size:25px;' +
14633   'font-weight:700;' +
14634   'line-height:1.2">' +
14635   'Doublez vos tournois gratuits' +
14636  '</div>' +
14637
14638  '<div style="' +
14639   'color:' + textColor + ';' +
14640   'font-size:16px;' +
14641   'line-height:1.55">' +
14642   'Validez votre adresse e-mail et profitez de ' +
14643   '<strong style="color:' + accent + '">' +
14644   'deux fois plus de parties gratuites en Tournois chaque heure' +
14645   '</strong>.' +
14646  '</div>' +
14647
14648  '<div style="' +
14649   'display:flex;' +
14650   'flex-wrap:wrap;' +
14651   'justify-content:center;' +
14652   'gap:8px;' +
14653   'margin:16px 0 12px">' +
14654
14655   '<span style="padding:7px 11px;border:1px solid ' + chipBorder +
14656   ';border-radius:999px;background:' + chipBackground +
14657   ';color:' + textColor + ';font-size:14px">\u2713 Performances</span>' +
14658
14659   '<span style="padding:7px 11px;border:1px solid ' + chipBorder +
14660   ';border-radius:999px;background:' + chipBackground +
14661   ';color:' + textColor + ';font-size:14px">\u2713 Amis</span>' +
14662
14663   '<span style="padding:7px 11px;border:1px solid ' + chipBorder +
14664   ';border-radius:999px;background:' + chipBackground +
14665   ';color:' + textColor + ';font-size:14px">\u2713 Progression</span>' +
14666
14667  '</div>' +
14668
14669  '<div style="' +
14670   'color:' + mutedColor + ';' +
14671   'font-size:14px;' +
14672   'line-height:1.45">' +
14673   'Ces informations resteront associées à votre compte.' +
14674  '</div>' +
14675
14676  '<div style="' +
14677   'margin-top:18px;' +
14678   'color:' + textColor + ';' +
14679   'font-size:15px;' +
14680   'font-weight:600">' +
14681   'Quelle est votre adresse e-mail ?' +
14682  '</div>' +
14683
14684  '</div>';
14685 prompte(
14686  message,
14687  '',
14688  function (email) {
14689  if ($.trim(email)==='') {
14690   continueNavigation();
14691   return;
14692  }
14693  email = $.trim(email).toLowerCase();
14694  request(
14695   {action:'submit',email:email},
14696   function (status) {
14697   if (status==='existing') {
14698    askPassword(email,continueNavigation);
14699   } else if (status==='pending') {
14700    alerte('Un email de confirmation vient de vous etre envoye. Validez-le pour doubler vos parties gratuites.',continueNavigation);
14701   } else if (status==='invalid') {
14702    alerte('Cette adresse email est invalide.',function () {
14703    askEmail(continueNavigation);
14704    });
14705   } else {
14706    continueNavigation();
14707   }
14708   },
14709   continueNavigation
14710  );
14711  },
14712  continueNavigation,
14713  'email'
14714 );
14715 }
14716
14717 function offerResend(continueNavigation) {
14718 confirme(
14719  'Votre adresse email n\'est pas encore validee. Avez-vous le temps de recevoir un nouvel email et de la confirmer maintenant ?',
14720  function () {
14721  request(
14722   {action:'resend'},
14723   function (status) {
14724   if (status==='resent')
14725    alerte('Un nouvel email de confirmation vient de vous etre envoye.',continueNavigation);
14726   else
14727    continueNavigation();
14728   },
14729   continueNavigation
14730  );
14731  },
14732  continueNavigation
14733 );
14734 }
14735
14736 window.showEndGameEmailDialog = function (status,continueNavigation) {
14737 if (typeof continueNavigation!=='function') return;
14738 if (status==='missing') askEmail(continueNavigation);
14739 else if (status==='pending') offerResend(continueNavigation);
14740 else continueNavigation();
14741 };
14742})();
14743
14744
14745/* *************************************** INSCRIPTION *************************/
14746function showFormationDistrib(endf) {
14747
14748 ajax('/workers/forms/showFormationDistrib.php', getFormString($$('formationOptions'),true), function (res) {
14749 $('#distribInfos').html(res);
14750 if (endf) endf();
14751 });
14752}
14753function showFormationInto(IDdistribution,numSequence,NBdistribution,nbJoueurs,htmlrecipient) {
14754
14755 ajax('/workers/forms/showFormationDistrib.php', 'IDdistribution='+IDdistribution+'&numSequence='+numSequence+'&NBdistribution='+NBdistribution+'&nbJoueurs='+nbJoueurs, function (res) {
14756 $('#'+htmlrecipient).html(res);
14757 });
14758}
14759function getDistribFromDefi() {
14760 if ($('#defiDistrib').val()=="-") {
14761 $('#IDdistribution').val('');
14762 $('#numSequence').val(0);
14763 $('#NBdistribution').val(0);
14764 $('#distribInfos').html('');
14765 return;
14766 } 
14767 if ($('#defiDistrib').val()=="Choix") {
14768 formationRandomDistrib();
14769 $('.choixDistribPerso').show();
14770 } else {
14771 var savedDist = $('#defiDistrib').val().split('_');
14772 if (savedDist.length>1) {
14773
14774 $('.choixDistribPerso').hide();
14775 //var infosDistrib = $('#defiDistrib').val().split('-');
14776 $('#IDdistribution').val(savedDist[1]);
14777 $('#numSequence').val(savedDist[2]);
14778 $('#NBdistribution').val(savedDist[3]);
14779 $('#formationNbJoueurs').val(savedDist[0]);
14780 } else {
14781
14782 $('.choixDistribPerso').hide();
14783 var infosDistrib = $('#defiDistrib').val().split('-');
14784 $('#IDdistribution').val(infosDistrib[0]);
14785 $('#numSequence').val(infosDistrib[1]);
14786 $('#NBdistribution').val(0);
14787 $('#formationNbJoueurs').val(4);
14788 }
14789 }
14790 showFormationDistrib();
14791}
14792function bgLoadDistrib() {
14793 ajax('/includes/distributions.php', $('#formDistrib').serialize() , function (res) {
14794 $('#global').html(res);
14795
14796 var newurl = window.location.protocol + "//" + window.location.host + '/distributions.php?'+$('#formDistrib').serialize();
14797 window.history.pushState({path:newurl},'',newurl);
14798 });
14799 return false;
14800}
14801function deleteSavedDistrib(id) {
14802 ajax('/workers/delDistribFrm.php', 'id='+id , function (res) {
14803 alerte(res);
14804 $('#formDistrib').submit();
14805 });
14806 return false;
14807}
14808function saveDistribFrm() {
14809 ajax('/workers/saveDistribFrm.php', $('#formDistrib').serialize()+'&'+$('#saveDistribForm').serialize() , function (res) {
14810 alerte(res);
14811
14812 $('#formDistrib').submit();
14813 });
14814 return false;
14815}
14816function changeSavedGroup() {
14817 if ($('#selGroup').val()=='-1') {
14818 $('#newgroupe').show();
14819 $('#groupe').val( '' );
14820 
14821 } else {
14822
14823 $('#newgroupe').hide();
14824 $('#groupe').val( $('#selGroup').val() );
14825 }
14826}
14827/*function showPlannedFormations() {
14828 if (!$$('plannedFormations')) return;
14829 ajax('/workers/showPlannedFormations.php', '', function (res) {
14830 $('#plannedFormations').html(res);
14831 });
14832}*/
14833function cancelFormation(id) {
14834 confirme('Etes-vous sûr de vouloir annuler cette formation ?',function () {
14835 appelInviter ('cancelFormation='+id );
14836 });
14837}
14838function formationNextMelange() {
14839 $('#NBdistribution').val(parseInt($('#NBdistribution').val())+1);
14840 showFormationDistrib();
14841}
14842function formationDuplicateDistrib() {
14843 
14844 ajax('/workers/getDuplicateDistribution.php', null, function (res) {
14845 var tab = res.split('|');
14846 $('#IDdistribution').val(tab[0]);
14847 $('#NBdistribution').val(tab[1]);
14848 $('#numSequence').val(tab[2]);
14849 showFormationDistrib(function () {
14850 $('#resMainJ'+tab[3]).css('color','#f00');
14851 });
14852 });
14853}
14854function formationRandomDistrib() {
14855 var ran = Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999);
14856 $('#IDdistribution').val(ran);
14857 ran = Math.ceil(Math.random()*9999999+9999);
14858 $('#NBdistribution').val(ran);
14859 ran = Math.ceil(Math.random()*9999999+9999);
14860 $('#numSequence').val(ran);
14861 showFormationDistrib();
14862}
14863function planifieFormation() {
14864 if ($('#titreFormation').val()=='') {
14865 alerte('Veuillez préciser un titre pour la formation');
14866 return;
14867 }
14868 if ($('#IDdistribution').val()=='' && $('#numSequence').val()=='' && $('#NBdistribution').val()=='0') {
14869 alerte('Veuillez choisir une distribution pour la formation');
14870 return;
14871 }
14872 $('#planFormation').hide();
14873 ajax('/workers/forms/planFormation.php', getFormString($$('formationOptions'),true), eval_global);
14874}
14875function changeNbJoueursFormation() {
14876 var valNbJoueur = $('#formationNbJoueurs').val();
14877 if (valNbJoueur==4) {
14878 $('.formation5Opt').hide();
14879 $('.choixDistribDefi').show();
14880 showFormationDistrib();
14881 } else {
14882 $('#defiDistrib').val("Choix");
14883 $('.choixDistribPerso').show();
14884 $('.formation5Opt').show();
14885 $('.choixDistribDefi').hide();
14886 formationRandomDistrib();
14887 }
14888}
14889
14890var generalNavigationRequest = null;
14891var generalNavigationRequestId = 0;
14892
14893function generalNavigationFallback(url) {
14894 window.location.href = url;
14895}
14896
14897function generalNavigationParseResponse(html) {
14898 var responseDocument = null;
14899
14900 if (window.DOMParser) {
14901 responseDocument = new window.DOMParser().parseFromString(html,'text/html');
14902 } else if (document.implementation && document.implementation.createHTMLDocument) {
14903 responseDocument = document.implementation.createHTMLDocument('');
14904 responseDocument.documentElement.innerHTML = html;
14905 }
14906
14907 return responseDocument;
14908}
14909
14910function generalNavigationRunScripts(container) {
14911 var scriptNodes = container.getElementsByTagName('script');
14912 var scripts = [];
14913 var i;
14914
14915 for (i=0;i<scriptNodes.length;i++) scripts.push(scriptNodes[i]);
14916
14917 for (i=0;i<scripts.length;i++) {
14918 var oldScript = scripts[i];
14919 var newScript = document.createElement('script');
14920 var attributeIndex;
14921
14922 for (attributeIndex=0;attributeIndex<oldScript.attributes.length;attributeIndex++) {
14923  var attribute = oldScript.attributes[attributeIndex];
14924  if (attribute.specified !== false) newScript.setAttribute(attribute.name,attribute.value);
14925 }
14926
14927 if (oldScript.src) newScript.async = false;
14928 else newScript.text = oldScript.text || oldScript.textContent || oldScript.innerHTML;
14929
14930 oldScript.parentNode.replaceChild(newScript,oldScript);
14931 }
14932}
14933
14934function generalNavigationSyncStylesheets(responseDocument) {
14935 var attributeName = 'data-general-navigation-stylesheet';
14936 var currentStylesheets = document.querySelectorAll('link['+attributeName+']');
14937 var responseStylesheets = responseDocument.querySelectorAll('link['+attributeName+']');
14938 var i;
14939
14940 for (i=0;i<currentStylesheets.length;i++) {
14941 if (currentStylesheets[i].parentNode)
14942  currentStylesheets[i].parentNode.removeChild(currentStylesheets[i]);
14943 }
14944
14945 for (i=0;i<responseStylesheets.length;i++) {
14946 document.getElementsByTagName('head')[0].appendChild(responseStylesheets[i].cloneNode(true));
14947 }
14948}
14949
14950function generalNavigationReplaceContent(responseDocument,link) {
14951 var responseGlobal = responseDocument.getElementById('global');
14952 var currentGlobal = document.getElementById('global');
14953 var responseTitle = responseDocument.getElementsByTagName('title');
14954 var isHomeLink = $(link).hasClass('Mhome') || link.id === 'homeLink';
14955 var selectedLink = isHomeLink ? $('#navBox a.Mhome')[0] : link;
14956
14957 if (!responseGlobal || !currentGlobal) return false;
14958
14959 generalNavigationSyncStylesheets(responseDocument);
14960 currentGlobal.innerHTML = responseGlobal.innerHTML;
14961 var responsePlayerSpace = responseDocument.getElementById('playerSpace');
14962 var currentPlayerSpace = document.getElementById('playerSpace');
14963 if (responsePlayerSpace && currentPlayerSpace) {
14964 currentPlayerSpace.innerHTML = responsePlayerSpace.innerHTML;
14965 if (typeof window.layoutPlayerSpace === 'function') window.layoutPlayerSpace();
14966 }
14967 window.scroll(0,0);
14968 generalNavigationRunScripts(currentGlobal);
14969
14970 if (responseTitle.length) document.title = responseTitle[0].textContent || responseTitle[0].innerText;
14971
14972 $('#navBox li.sel').removeClass('sel');
14973 $(selectedLink).closest('li').addClass('sel');
14974
14975 if (typeof cufonRefresh === 'function') cufonRefresh();
14976 if (typeof showHTMLbuttons === 'function') showHTMLbuttons();
14977 if (typeof initCompteOptionsAutoSave === 'function') initCompteOptionsAutoSave();
14978 if (typeof window.initNotificationsPage === 'function') window.initNotificationsPage();
14979 if (isHomeLink) {
14980 if (typeof slc === 'function') slc();
14981 if (typeof stickAds === 'function') window.onscroll = stickAds;
14982 }
14983
14984 return true;
14985}
14986
14987function showGeneralNavigation(link,event) {
14988 var clickEvent = event || window.event;
14989 var nativeUrl = link && link.getAttribute ? link.getAttribute('href') : '';
14990 var staticUrl = nativeUrl || (link && link.getAttribute ? link.getAttribute('data-navigation-url') : '');
14991 var absoluteUrl;
14992 var targetUrl = document.createElement('a');
14993 var requestId;
14994
14995 if (clickEvent && ((typeof clickEvent.isDefaultPrevented === 'function' && clickEvent.isDefaultPrevented()) || clickEvent.defaultPrevented)) return false;
14996 if (!staticUrl) return true;
14997 if (nativeUrl && clickEvent && (clickEvent.ctrlKey || clickEvent.metaKey || clickEvent.shiftKey || clickEvent.altKey)) return true;
14998 if (clickEvent && clickEvent.which && clickEvent.which !== 1) return true;
14999
15000 targetUrl.href = staticUrl;
15001 absoluteUrl = link && link.href ? link.href : targetUrl.href;
15002 if (targetUrl.protocol !== window.location.protocol || targetUrl.host !== window.location.host) return true;
15003
15004 requestId = ++generalNavigationRequestId;
15005 if (generalNavigationRequest) generalNavigationRequest.abort();
15006 showPleaseWait();
15007
15008 generalNavigationRequest = $.ajax({
15009 url:absoluteUrl,
15010 type:'GET',
15011 dataType:'html',
15012 cache:false,
15013 success:function(html) {
15014  var responseDocument;
15015
15016  if (requestId !== generalNavigationRequestId) return;
15017
15018  try {
15019  responseDocument = generalNavigationParseResponse(html);
15020  if (!responseDocument || !generalNavigationReplaceContent(responseDocument,link)) {
15021   generalNavigationFallback(staticUrl);
15022   return;
15023  }
15024
15025  if (window.location.href !== absoluteUrl) {
15026   window.history.pushState({path:absoluteUrl},'',absoluteUrl);
15027  }
15028  } catch (navigationError) {
15029  generalNavigationFallback(staticUrl);
15030  }
15031 },
15032 error:function(xhr,status) {
15033  if (requestId !== generalNavigationRequestId || status === 'abort') return;
15034  generalNavigationFallback(staticUrl);
15035 },
15036 complete:function() {
15037  if (requestId === generalNavigationRequestId) generalNavigationRequest = null;
15038 }
15039 });
15040
15041 return false;
15042}
15043
15044function initGeneralNavigation() {
15045 $('#navBox').on('click.generalNavigation','a.Mhome,#homeLink,a.Mforum,a.Mcredits,a.Mrank',function(event) {
15046 return showGeneralNavigation(this,event);
15047 });
15048}
15049
15050function showReglesPage() {
15051 var link = $('#LIregles a.Mregles')[0];
15052 if (link) return showGeneralNavigation(link,window.event);
15053
15054 $('li.sel').removeClass('sel');
15055 $('#LIregles').addClass('sel');
15056 return showWorkerPageOffline ('regles');
15057}
15058
15059function normaliserPseudoSaisie(texte)
15060{
15061 // Meme composition Latin-1 que pseudosEncodage.php, y compris sans normalize().
15062 var compositions = {"A\u0300":"\u00c0","A\u0301":"\u00c1","A\u0302":"\u00c2","A\u0303":"\u00c3","A\u0308":"\u00c4","A\u030a":"\u00c5","C\u0327":"\u00c7","E\u0300":"\u00c8","E\u0301":"\u00c9","E\u0302":"\u00ca","E\u0308":"\u00cb","I\u0300":"\u00cc","I\u0301":"\u00cd","I\u0302":"\u00ce","I\u0308":"\u00cf","N\u0303":"\u00d1","O\u0300":"\u00d2","O\u0301":"\u00d3","O\u0302":"\u00d4","O\u0303":"\u00d5","O\u0308":"\u00d6","U\u0300":"\u00d9","U\u0301":"\u00da","U\u0302":"\u00db","U\u0308":"\u00dc","Y\u0301":"\u00dd","a\u0300":"\u00e0","a\u0301":"\u00e1","a\u0302":"\u00e2","a\u0303":"\u00e3","a\u0308":"\u00e4","a\u030a":"\u00e5","c\u0327":"\u00e7","e\u0300":"\u00e8","e\u0301":"\u00e9","e\u0302":"\u00ea","e\u0308":"\u00eb","i\u0300":"\u00ec","i\u0301":"\u00ed","i\u0302":"\u00ee","i\u0308":"\u00ef","n\u0303":"\u00f1","o\u0300":"\u00f2","o\u0301":"\u00f3","o\u0302":"\u00f4","o\u0303":"\u00f5","o\u0308":"\u00f6","u\u0300":"\u00f9","u\u0301":"\u00fa","u\u0302":"\u00fb","u\u0308":"\u00fc","y\u0301":"\u00fd","y\u0308":"\u00ff"};
15063 return String(texte).replace(/[A-Za-z][\u0300-\u0308\u030a\u0327]/g,function (suite) {
15064 return compositions[suite] || suite;
15065 }).replace(/^ +| +$/g,'').replace(/ +/g,' ');
15066}
15067function validerChampPseudo(champ)
15068{
15069 if (!champ) return true;
15070 var pseudo = normaliserPseudoSaisie(champ.value);
15071 if (!pseudo || !/^[a-zA-Z0-9 ._\x2D\xC0-\xD6\xD8-\xF6\xF8-\xFF]+$/.test(pseudo)) {
15072 alerte('Ce pseudo contient un caractere non pris en charge.');
15073 return false;
15074 }
15075 if (pseudo.length>25) { alerte('Longueur max : 25 caracteres'); return false; }
15076 champ.value = pseudo;
15077 return true;
15078}
15079function startUpload()
15080{
15081 return validerChampPseudo($$('regPseudo'));
15082}
15083function startUploadCreate()
15084{
15085 if (!validerChampPseudo($$('regPseudo'))) return false;
15086 return sendFormWork('creationCompte');
15087}
15088function focusAccountRecovery(email)
15089{
15090 var recovery = $('#accountRecovery');
15091 var inputs = $('input[name="resend[email]"]');
15092 if (typeof email === 'string' && email !== '') inputs.val(email);
15093 if (recovery.length && recovery[0].scrollIntoView) recovery[0].scrollIntoView(true);
15094 window.setTimeout(function () {
15095 if (inputs.length) inputs.first().focus();
15096 },0);
15097 return false;
15098}
15099function setAccountRecoveryPending(pending)
15100{
15101 $('.accountRecoverySubmit').prop('disabled',pending);
15102 if (pending) $('.accountRecoveryStatus').html('Envoi en cours...');
15103}
15104function submitAccountRecoveryForm(form)
15105{
15106 setAccountRecoveryPending(true);
15107 ajax('/workers/forms/formRecup.php',getFormString(form,true).split('&#43;').join('%2B'),eval_global);
15108 return false;
15109}
15110function requestAccountRecovery(email)
15111{
15112 setAccountRecoveryPending(true);
15113 ajax('/workers/forms/formRecup.php','resend%5Bemail%5D='+encodeURIComponent(email),eval_global);
15114}
15115function existingAccountEmail(email)
15116{
15117 focusAccountRecovery(email);
15118 confirme(
15119 'Cet email est d\u00e9j\u00e0 associ\u00e9 \u00e0 un compte.<br><br>Votre compte existe toujours. Voulez-vous recevoir un lien pour le retrouver ?',
15120 function () { requestAccountRecovery(email); }
15121 );
15122}
15123function accountRecoveryResult(status)
15124{
15125 setAccountRecoveryPending(false);
15126 var message = '';
15127 if (status==='invalid') {
15128 message = 'Veuillez saisir une adresse email valide.';
15129 $('.accountRecoveryStatus').html(message);
15130 alerte(message,function () { focusAccountRecovery(); });
15131 return;
15132 }
15133 if (status==='mail_error') {
15134 message = 'L\'email n\'a pas pu \u00eatre envoy\u00e9 pour le moment. Veuillez r\u00e9essayer dans quelques minutes.';
15135 $('.accountRecoveryStatus').html(message);
15136 alerte(message);
15137 return;
15138 }
15139 message = 'Si un compte correspond \u00e0 cette adresse, un email vient d\u2019\u00eatre envoy\u00e9.<br>V\u00e9rifiez aussi vos courriers ind\u00e9sirables. Le lien reste valable une heure.';
15140 $('.accountRecoveryStatus').html(message);
15141 alerte(message);
15142}
15143function accountPasswordResetResult(status,message)
15144{
15145 if (status==='success') {
15146 alerte('Votre mot de passe a \u00e9t\u00e9 modifi\u00e9. Vous \u00eates maintenant connect\u00e9.',function () {
15147  document.location = '/Compte.php?part=compte';
15148 });
15149 return;
15150 }
15151 $('.accountPasswordResetStatus').html(message);
15152 alerte(message);
15153}
15154function giveUpMode () {
15155 confirme('Etes-vous sûr de vouloir abandonner votre statut ?',function () {
15156 ajax('/workers/giveUpMode.php', 'ok=true', alertRes);
15157 });
15158}
15159function giveUpFormateur () {
15160 confirme('Etes-vous sûr de vouloir abandonner votre statut de formateur ?',function () {
15161 ajax('/workers/giveUpFormateur.php', 'ok=true', alertRes);
15162 });
15163}
15164function giveUpOrganisateur () {
15165 confirme('Etes-vous sûr de vouloir abandonner votre statut d\'organisateur ?',function () {
15166 ajax('/workers/giveUpOrganisateur.php', 'ok=true', alertRes);
15167 });
15168}
15169function giveUpChefGuilde () {
15170 confirme('Etes-vous sûr de vouloir abandonner votre statut de chef de guilde ?',function () {
15171 ajax('/workers/giveUpChefGuilde.php', 'ok=true', alertRes);
15172 });
15173}
15174function getOrganisateur () {
15175 confirme('Etes-vous sûr de vouloir devenir organisateur ?',function () {
15176 ajax('/workers/getOrganisateur.php', 'ok=true', alertRes);
15177 });
15178}
15179function valPseudoCh()
15180{
15181 return validerChampPseudo($$('pseudoChF'));
15182}
15183function register(formId)
15184{          
15185 ajax('/workers/register.php', getFormString($$(formId || 'formLogin'),true), registerResult);
15186 return false;
15187} 
15188function recupCompte()
15189{          
15190 ajax('/workers/recupCompte.php', getFormString($$('formRecup'),true).split('&#43;').join('%2B'), alertRes);
15191 return false;
15192} 
15193function sendFormWork(formName)
15194{          
15195 ajax('/workers/forms/'+formName+'.php', getFormString($$(formName),true).split('&#43;').join('%2B'), eval_global);
15196 return false;
15197} 
15198var compteOptionsSaveTimer = null;
15199var compteOptionsSaving = false;
15200var compteOptionsSaveQueued = false;
15201var compteOptionsLastSaved = '';
15202var compteOptionsSavingParams = '';
15203
15204function compteOptionsSerialize()
15205{
15206 if ($$('cpteTarot') == null) return '';
15207 return getFormString($$('cpteTarot'), true, 1, 'register[pseudo],register[confirmerPseudo]').split('&#43;').join('%2B');
15208}
15209
15210function confirmerPseudoCompte()
15211{
15212 var champ = $('#regPseudo');
15213 var bouton = $('#comptePseudoConfirmer');
15214 var statut = $('#comptePseudoStatus');
15215 if (!champ.length || champ.data('confirmationEnCours')) return false;
15216 var pseudo = normaliserPseudoSaisie(champ.val());
15217 if (!pseudo || pseudo === champ.attr('data-pseudo-actuel')) {
15218 statut.text('Choisissez un nouveau pseudo avant de le confirmer.');
15219 champ.focus();
15220 return false;
15221 }
15222 champ.val(pseudo);
15223 if (!startUpload()) return false;
15224 champ.data('confirmationEnCours',true).prop('readOnly',true);
15225 bouton.prop('disabled',true);
15226 statut.text('Pseudo en attente de confirmation.');
15227 function terminer(message) {
15228 champ.data('confirmationEnCours',false).prop('readOnly',false);
15229 bouton.prop('disabled',false);
15230 statut.text(message);
15231 }
15232 var apercu = $('<span>').text(pseudo).html();
15233 confirme('Enregistrer <strong>'+apercu+'</strong> comme pseudo ?<br>Il sera visible par les autres joueurs. Le changer ensuite co&ucirc;te 5 cr&eacute;dits comp&eacute;tition ou Premium.',function () {
15234 statut.text('Enregistrement du pseudo...');
15235 $.ajax({
15236  url:'/workers/compteOptions.php',
15237  type:'POST',
15238  data:'register[pseudo]='+escape(pseudo).split('+').join('%2B')+'&register[confirmerPseudo]=1',
15239  timeout:15000,
15240  success:function (response) {
15241  response = $.trim(response);
15242  if (!/^OK(?:$|\|)/.test(response)) {
15243   terminer(response.indexOf('ERR|')===0 ? response.substring(4) : "Le pseudo n'a pas pu être enregistré. Réessayez.");
15244   return;
15245  }
15246  statut.text('Pseudo enregistré : '+pseudo+'.');
15247  champ.attr('data-pseudo-actuel',pseudo);
15248  setTimeout(function () { document.location = '/Compte.php?part=compte'; },500);
15249  },
15250  error:function () {
15251  terminer("L'enregistrement n'a pas pu être confirmé. Vérifiez votre connexion puis réessayez.");
15252  }
15253 });
15254 },function () {
15255 terminer('Pseudo non enregistré. Vous pouvez encore le modifier.');
15256 champ.focus();
15257 });
15258 return false;
15259}
15260
15261function compteOptionsStatus(text, statusClass)
15262{
15263 var status = $('#compteOptionsStatus');
15264 if (!status.length) return;
15265 status.removeClass('saving ok error');
15266 if (statusClass) status.addClass(statusClass);
15267 status.text(text);
15268}
15269
15270function compteOptionsAlert(message)
15271{
15272 alerte(message);
15273}
15274
15275function compteOptionsScheduleSave(delay)
15276{
15277 clearTimeout(compteOptionsSaveTimer);
15278 compteOptionsSaveTimer = setTimeout(compteOptionsSave, delay || 120);
15279}
15280
15281function compteOptionsSave()
15282{
15283 if ($$('cpteTarot') == null) return false;
15284
15285 var params = compteOptionsSerialize();
15286 if (params == compteOptionsLastSaved) return false;
15287
15288 if (compteOptionsSaving) {
15289 compteOptionsSaveQueued = true;
15290 return false;
15291 }
15292
15293 compteOptionsSaving = true;
15294 compteOptionsSavingParams = params;
15295 compteOptionsStatus('Sauvegarde...', 'saving');
15296 ajax('/workers/compteOptions.php', params, compteOptionsSaveDone);
15297 return false;
15298}
15299
15300function compteOptionsSaveDone(response)
15301{
15302 var parts;
15303 var mustReload = false;
15304
15305 compteOptionsSaving = false;
15306 response = $.trim(response);
15307
15308 if (response.indexOf('ERR|') == 0) {
15309 compteOptionsStatus('Erreur', 'error');
15310 compteOptionsAlert(response.substring(4));
15311 } else if (response.indexOf('OK') == 0) {
15312 compteOptionsLastSaved = compteOptionsSavingParams;
15313 compteOptionsStatus('OK', 'ok');
15314 var bandeauActionSelectionne = $('input[name="register[styleBandeauAction]"]:checked');
15315 if (bandeauActionSelectionne.length)
15316  window.tarotGameActionMessageStyle = parseInt(bandeauActionSelectionne.val(), 10) || 0;
15317 if ($('#soundEnabled').length && $('#toggleSounds').length)
15318  $('#soundEnabled').val($('#toggleSounds').is(':checked') ? '1' : '');
15319
15320 parts = response.split('|');
15321 for (var i = 1; i < parts.length; i++) {
15322  if (parts[i] == 'RELOAD') mustReload = true;
15323  if (parts[i] == 'MUSIC' && parts[i + 1] && typeof setMusicList == 'function') {
15324  setMusicList(parts[i + 1]);
15325  i++;
15326  }
15327 }
15328 if (mustReload) {
15329  setTimeout(function () {
15330  document.location = '/Compte.php?part=compte';
15331  }, 500);
15332  return;
15333 }
15334 } else {
15335 compteOptionsStatus('Erreur', 'error');
15336 }
15337
15338 if (compteOptionsSaveQueued) {
15339 compteOptionsSaveQueued = false;
15340 compteOptionsScheduleSave(10);
15341 }
15342}
15343
15344function initCompteOptionsAutoSave()
15345{
15346 if (typeof initCompteCoordonnees === 'function') initCompteCoordonnees();
15347 var panel = $('.compteOptions');
15348 if (!panel.length || $('#cpteTarot').length == 0) return;
15349
15350 compteOptionsLastSaved = compteOptionsSerialize();
15351 $('#email').removeAttr('onkeydown');
15352 panel.off('change.compteOptions').on('change.compteOptions', 'input, select, textarea', function () {
15353 if (this.id == 'regPseudo') return;
15354 if (this.id == 'email') $('#shallSave').html('');
15355 compteOptionsScheduleSave(120);
15356 });
15357}
15358
15359$(function () {
15360 initGeneralNavigation();
15361 initCompteOptionsAutoSave();
15362});
15363function registerResult(html)
15364{      
15365 if (html=='OK')
15366 {      
15367 inscription();
15368 }
15369 else
15370 confirme(
15371  html+'<br><br>Vous avez oubli\u00e9 votre pseudo ou votre mot de passe ? Retrouvez votre compte par email.',
15372  function () { focusAccountRecovery(); }
15373 );
15374}
15375function stopUpload(success,idAvat)
15376{
15377 var result = '';
15378 if (success == 1){
15379 $$('IMGAVATCPT').src='/avatars/'+idAvat; 
15380 }
15381 else {
15382 alerte('Erreur');
15383 }
15384 return true;
15385}
15386    
15387function inscription()
15388{
15389 document.location = '/';
15390} 
15391var globalAjaxPreventRefresh = 0;
15392var lastAjaxRequest = [];
15393var lastAjaxResponseOrder = [];
15394var lastAjaxRequestId = 0;
15395
15396function completeAjaxTrace(ajaxTrace, xhr, textStatus, state, responseData, errorThrown) {
15397 var completedAt = new Date();
15398 var responseText = '';
15399 if (xhr && typeof xhr.responseText == 'string')
15400 responseText = xhr.responseText;
15401 else if (typeof responseData == 'string')
15402 responseText = responseData;
15403
15404 ajaxTrace.completedAt = completedAt;
15405 ajaxTrace.durationMs = completedAt.getTime()-ajaxTrace.startedAt.getTime();
15406 ajaxTrace.state = state;
15407 ajaxTrace.textStatus = textStatus || '';
15408 ajaxTrace.status = xhr && typeof xhr.status != 'undefined' ? xhr.status : null;
15409 ajaxTrace.statusText = xhr && xhr.statusText ? xhr.statusText : '';
15410 ajaxTrace.contentType = xhr && xhr.getResponseHeader ? xhr.getResponseHeader('Content-Type') : null;
15411 ajaxTrace.contentLengthHeader = xhr && xhr.getResponseHeader ? xhr.getResponseHeader('Content-Length') : null;
15412 ajaxTrace.responseHeaders = xhr && xhr.getAllResponseHeaders ? xhr.getAllResponseHeaders() : '';
15413 ajaxTrace.responseLength = responseText.length;
15414 ajaxTrace.responseText = responseText;
15415 if (errorThrown)
15416 ajaxTrace.errorThrown = errorThrown.message || String(errorThrown);
15417
15418 lastAjaxResponseOrder.push({
15419 id:ajaxTrace.id,
15420 completedAt:completedAt,
15421 url:ajaxTrace.url,
15422 state:state,
15423 status:ajaxTrace.status,
15424 durationMs:ajaxTrace.durationMs,
15425 responseLength:ajaxTrace.responseLength
15426 });
15427 if (lastAjaxResponseOrder.length>3)
15428 lastAjaxResponseOrder.shift();
15429}
15430
15431
15432function ajax(_url, vars, callbackFunction, failureCallback, retryCount) {
15433 // Une nouvelle requete commence a zero ; seuls ses reessais partagent ce compteur.
15434 var csqerrajax = retryCount || 0;
15435 var d = new Date();
15436 globalAjaxPreventRefresh++;
15437 var url = _url;
15438 /*if (url.split('?').length>1)
15439 url = url+'&srcNum='+(d.getTime()+globalAjaxPreventRefresh);
15440 else
15441 url = url+'?srcNum='+(d.getTime()+globalAjaxPreventRefresh);*/
15442 lastAjaxRequest.push({
15443 startedAt:new Date(),
15444 url: url,
15445 type:'POST',
15446 data:vars});
15447 var ajaxTrace = lastAjaxRequest[lastAjaxRequest.length-1];
15448 ajaxTrace.id = ++lastAjaxRequestId;
15449 ajaxTrace.callback = callbackFunction ? (callbackFunction.name || 'anonymous') : '';
15450
15451 if (lastAjaxRequest.length>3)
15452 lastAjaxRequest.shift();
15453 return $.ajax({
15454 url: url,
15455 type:'POST',
15456 data:vars,
15457 timeout:60000,
15458 success: function (t) {
15459 completeAjaxTrace(ajaxTrace, arguments[2], arguments[1], 'success', t, null);
15460 if ( t!='<HTML></HTML>' && t!='<html></html>' ) {
15461  csqerrajax = 0;
15462  if (callbackFunction)
15463  callbackFunction(t);
15464 } else {
15465  csqerrajax++;
15466  if (csqerrajax<5) {
15467
15468  setTimeout( function () { ajax(url, vars, callbackFunction, failureCallback, csqerrajax); },1000);
15469  } else {
15470  var params = {
15471  url:url,
15472  csqerrajax:csqerrajax,
15473  vars:vars,
15474  lastAjaxRequest:lastAjaxRequest,
15475  receivedRes:t
15476  };
15477  if (failureCallback) failureCallback();
15478  errorLog ('Query Result ERROR', params);
15479  }
15480 }
15481 },
15482 error: function(data) {
15483 completeAjaxTrace(ajaxTrace, data, arguments[1], arguments[1] || 'error', null, arguments[2]);
15484 if (data.statusText=='abort') return;
15485 csqerrajax++;
15486 if (csqerrajax<60) {
15487
15488  setTimeout( function () { ajax(url, vars, callbackFunction, failureCallback, csqerrajax); },1000);
15489 } else {
15490  var params = {
15491  status:data.statusText,
15492  url:url,
15493  vars:vars,
15494  lastAjaxRequest:lastAjaxRequest
15495  };
15496  if (failureCallback) failureCallback();
15497  errorLog ('Erreur de connexion internet', params);
15498  
15499 }
15500 }
15501 }); 
15502}
15503function notifyGameEnd()
15504{
15505 setCurrentGameId (0,false);
15506 dateDebutPartie=null;
15507} 
15508var selectedModeJeu;
15509var selectedSalonDiscussion = 'amis';
15510function getDiscussionSalonParam()
15511{
15512 var select = $$('discussionSalonSelect');
15513 if (select!=null) selectedSalonDiscussion = select.value;
15514 if (selectedSalonDiscussion==null || selectedSalonDiscussion=='') selectedSalonDiscussion = 'amis';
15515 return '&discussionSalon='+encodeURIComponent(selectedSalonDiscussion);
15516}
15517
15518function changeDiscussionSalon()
15519{
15520 var select = $$('discussionSalonSelect');
15521 if (select!=null) selectedSalonDiscussion = select.value;
15522 lastContentD = '...';
15523
15524 appelRefreshDynamicInfos('etape=dynamic');
15525 return false;
15526}
15527function registerStart(html)
15528{
15529 if (String(html).replace(/^\s+|\s+$/g, '')==='AGE_REQUIRED') {
15530 if ($$('global')) $$('global').innerHTML = '<p class="text-center">Indiquez votre tranche d&rsquo;&acirc;ge pour acc&eacute;der &agrave; la page Jouer.</p><p class="text-center"><button type="button" class="btn btn-success" onclick="startGame();">Pr&eacute;ciser mon &acirc;ge</button></p>';
15531 window.confirmerAgeAvantJouer(function () { startGame(); }, true);
15532 return;
15533 } 
15534 if (dateDebutPartie!=null) return;      
15535 if (html=='OK')
15536 {      
15537 newGame ('Libre4');
15538 }
15539 else
15540 { 
15541 if (!$$('global')) return;
15542 $$('global').innerHTML = html;
15543 if (selectedModeJeu!=null && $('#modeJeuSalon').is('select')) {
15544  $('#staticMJ').find('img.selected').removeClass('selected');
15545  $('#salonS'+selectedModeJeu).addClass('selected');
15546  $('#modeJeuSalon').val(selectedModeJeu);
15547  selectModeTxt(selectedModeJeu);
15548 }
15549  synchroniserModeInvitation();
15550 
15551 var cells = $$('global').getElementsByTagName('script');
15552 for (var i = 0; i < cells.length; i++) {
15553  eval(cells[i].innerHTML);
15554  //alert(cells[i].innerHTML);
15555 } 
15556 }
15557}
15558
15559jQuery.cachedScript = function( url, options ) {
15560 
15561 // Allow user to set any option except for dataType, cache, and url
15562 options = $.extend( options || {}, {
15563 dataType: "script",
15564 cache: true,
15565 url: url
15566 });
15567 
15568 // Use $.ajax() since it is more flexible than $.getScript
15569 // Return the jqXHR object so we can chain callbacks
15570 return jQuery.ajax( options );
15571};
15572
15573var resLoaded = false;
15574var resDownloaded = false;
15575var lowImagesDownloaded = false;
15576var errLoadImagesHR = 0;
15577var CBLadocarteca;
15578var toloadhr = 0;
15579
15580function errLoadindHR ( script, textStatus ) { 
15581 clearTimeout(CBLadocarteca);
15582 
15583 if (selMoteur.titreMoteur=='Phaser') {
15584 if (!phaserDownloaded) {
15585
15586 $.cachedScript( '/js/phaser.min.2.10.0.js?v=2' ).done(function( script, textStatus ) {
15587 if (!phaserDownloaded) {
15588 if (Phaser) {
15589 clearTimeout(CBLadocarteca);
15590 phaserDownloaded = true;
15591 llog('Phaser has been downloaded but err');
15592 checkWaitingStart();
15593 } else {
15594 llog('Downloaderror errLoadind Phaser aft err');
15595 errLoadindHR();
15596 
15597 }
15598 }
15599 }).error(function () {
15600 llog('Downloaderror errLoadind Phaser def');
15601 errLoadindHR();
15602 });
15603 }
15604 
15605 }
15606 if (!resDownloaded) {
15607 $.cachedScript( '/js/images.js' ).done(function( script, textStatus ) {
15608 if (!lowImagesDownloaded) {
15609 lowImagesDownloaded = true;
15610 llog('images.js has been downloaded');
15611 }
15612 if (typeof cacheCarte!=='undefined' && selMoteur.titreMoteur!='Phaser') {
15613 resDownloaded = true;
15614 llog('Using low quality');
15615 checkWaitingStart();
15616 }
15617 }).error(function () {
15618 llog('Downloaderror errLoadind images.js');
15619 if (errLoadImagesHR<4) errLoadindHR();
15620 });
15621 
15622 if (typeof cacheCarte!=='undefined' && selMoteur.titreMoteur!='Phaser') {
15623 clearTimeout(CBLadocarteca);
15624 resDownloaded = true;
15625 llog('Using low quality');
15626 checkWaitingStart();
15627 } else {
15628 errLoadImagesHR++;
15629 if (errLoadImagesHR<4) {
15630 dPreloadTestBug++;
15631 resLoaded = false;
15632 preloadStartGame();
15633 showPleaseWait("Nouvelle tentative ("+errLoadImagesHR+"/3)..."); 
15634 //toloadhr = setTimeout(errLoadindHR,1000);
15635 } else {
15636
15637 var params = {
15638 stack:new Error().stack,
15639 lastAjaxRequest:lastAjaxRequest,
15640 resLoaded:resLoaded,
15641 resDownloaded:resDownloaded
15642 }
15643 errorLog ('Erreur de telechargement des ressources', params);
15644 }
15645 }
15646 }
15647}
15648var phaserDownloaded = false;
15649var dPreloadTestBug = 2;
15650function preloadStartGame() {
15651 if (resLoaded) return true;
15652 if (typeof $.cachedScript == 'undefined') return;
15653
15654 if (recapChatMsgIdPartie) {
15655 recapChatMsgIdPartie = 0;
15656 closeConnexion();
15657 }
15658 
15659 resLoaded = true;
15660
15661 if (selMoteur.titreMoteur=='Phaser') {
15662
15663 $.cachedScript( '/js/phaser.min.2.10.0.js' ).done(function( script, textStatus ) {
15664 if (!phaserDownloaded) {
15665 if (Phaser) {
15666 clearTimeout(CBLadocarteca);
15667 phaserDownloaded = true;
15668 llog('Phaser has been downloaded and is ok');
15669 checkWaitingStart();
15670 } else {
15671 llog('Downloaderror Phaser is not defined');
15672 errLoadindHR();
15673 
15674 }
15675 }
15676 }).error(function () {
15677 llog('Downloaderror errLoadind Phaser');
15678 errLoadindHR();
15679 });
15680 } else {
15681 phaserDownloaded = true;
15682 }
15683 
15684 if (window.TarotCards) {
15685 window.TarotCards.loadSelectedDeck().then(function () {
15686 if (!resDownloaded) {
15687 resDownloaded = true;
15688 clearTimeout(CBLadocarteca);
15689 llog('Tarot cards have been downloaded, validated and decoded');
15690 checkWaitingStart();
15691 }
15692 }).catch(function (error) {
15693 llog('Downloaderror TarotCards '+(error && error.message ? error.message : error));
15694 if (window.errorLog) {
15695 errorLog('Erreur de preparation des cartes', {
15696 stack:error && error.stack ? error.stack : '',
15697 model:window.TarotCards.getSelectedModel()
15698 });
15699 }
15700 errLoadindHR();
15701 });
15702 return;
15703 }
15704 
15705 var scriptX = '/js/imagesHR.js?d='+dPreloadTestBug;
15706 if ($('#modeleJeuCartes').val()==1) {
15707 scriptX = '/js/images2HR.js?d='+dPreloadTestBug;
15708 }
15709 if ($('#modeleJeuCartes').val()==2) {
15710 scriptX = '/js/images3HR.js?d='+dPreloadTestBug;
15711 }
15712 $.cachedScript( scriptX ).done(function( script, textStatus ) {
15713 if (!resDownloaded) {
15714 if (typeof cacheCarteHR=='undefined') {
15715 llog('Download done but cacheCarteHR undefined'+scriptX+textStatus);
15716 errLoadindHR();
15717 } else {
15718 clearTimeout(CBLadocarteca);
15719 resDownloaded = true;
15720 llog('HighRes has been downloaded');
15721 checkWaitingStart();
15722 }
15723 }
15724 }).error(function () {
15725 llog('Downloaderror errLoadindHR');
15726 errLoadindHR();
15727 });
15728 
15729
15730 
15731 
15732 CBLadocarteca = setTimeout(errLoadindHR,35000);
15733}
15734
15735var dateDebutPartie;
15736var htmlReglesActions;
15737
15738function startGame(idPartie)
15739{
15740 startGameInt(idPartie);
15741}
15742function startGameInt(idPartie)
15743{
15744 if (window.confirmerAgeAvantJouer && window.confirmerAgeAvantJouer(function () { startGameInt(idPartie); })) return;
15745
15746 
15747 $('#batMobile').remove();
15748 if ($$('global')==null) return;
15749
15750 if (idPartie)
15751 llog('Page jouer idPartie '+idPartie);
15752 else
15753 llog('Page jouer ');
15754 preloadStartGame();
15755 clearTimeout(salonTO);
15756 showPleaseWait(); 
15757 
15758 if (ajaxCallXhr!=null) ajaxCallXhr.abort();
15759 $('#liJeu').addClass('sel');
15760 ajax('/workers/partiesEnCours.php', "etape=start", registerStart);
15761} 
15762function byPassSupport() {
15763 if ($$('global')==null) return;
15764 preloadStartGame();
15765 clearTimeout(salonTO);
15766 showPleaseWait(); 
15767 if (ajaxCallXhr!=null) ajaxCallXhr.abort();
15768 $('#liJeu').addClass('sel');
15769 ajax('/workers/partiesEnCours.php', "oksupport=1&etape=start", registerStart);
15770 
15771}
15772function invitFormation (params)
15773{ 
15774 preloadStartGame();
15775 ajax('/workers/inviter.php?formation', params+'&modeJeuSalon=Formation', registerStart); 
15776} 
15777function appelInviter (params)
15778{ 
15779 if ($$('global')==null) return;
15780
15781 numSalonRefresh = 0;
15782 if ($('#modeJeuSalon').val()==undefined) {
15783 alerte('Une erreur est survenue. Si possible, veuillez signaler la manipulation pour reproduire le bug via le formulaire de contact du site.');
15784 return;
15785 } 
15786 numSalonRefresh = 0;
15787 clearTimeout(salonTO);
15788 if ($('#modeJeuSalon').val()!='')
15789 { 
15790 selectedModeJeu = $('#modeJeuSalon').val(); 
15791 if (selectedModeJeu=='Perso' || selectedModeJeu=='Organisation') {
15792  params += '&nbManches='+$('#nbManches').val(); 
15793  params += '&nbJoueurs='+$('#nbJoueurs').val(); 
15794  params += '&persoDelaiJeu='+$('#persoDelaiJeu').val();
15795  params += '&persoPositionJeu='+$('#persoPositionJeu').val(); 
15796  params += '&persoDistrib='+$('#persoDistrib').val(); 
15797  params += '&PersoIDdistribution='+$('#PersoIDdistribution').val(); 
15798  params += '&PersonumSequence='+$('#PersonumSequence').val(); 
15799  params += '&PersoNBdistribution='+$('#PersoNBdistribution').val(); 
15800  params += '&persoAnnonceJeu='+$('#persoAnnonceJeu').val(); 
15801  params += '&persoPreneurJeu='+$('#persoPreneurJeu').val(); 
15802  params += '&persoAppelRoiJeu='+$('#persoAppelRoiJeu').val(); 
15803  if (selectedModeJeu=='Perso' || selectedModeJeu=='Organisation') params = organisationAjouterParametresManches(params);
15804 }
15805 if ( selectedModeJeu=='Organisation') {
15806  params += '&idPartieOrganisee='+$('#idPartie').val(); 
15807  params += '&nomPartieOrganisee='+$('#titleOrganisation').val(); 
15808 
15809 }
15810 ajax('/workers/inviter.php?perso', params+'&modeJeuSalon='+selectedModeJeu, registerStart);  
15811 }
15812} 
15813/* *************************************** PARTIES PERSOS *************************/
15814function changePersoNbJoueurs () {
15815 
15816 if ($('#nbJoueurs').val()==3) {
15817 $('.persoMin4').hide();
15818 $('.persoMin5').hide();
15819 $('.persoMin6').hide();
15820 } 
15821 else if ($('#nbJoueurs').val()==4) {
15822 $('.persoMin4').show();
15823 $('.persoMin5').hide();
15824 $('.persoMin6').hide();
15825 } else if ($('#nbJoueurs').val()==5) {
15826 $('.persoMin4').show();
15827 $('.persoMin5').show();
15828 $('.persoMin6').hide();
15829 } else {
15830 $('.persoMin4').show();
15831 $('.persoMin5').show();
15832 $('.persoMin6').show();
15833 }
15834 if ($('#nbJoueurs').val()==5) {
15835 $('.perso5Opts').show();
15836 } else {
15837 $('.perso5Opts').hide();
15838 }
15839 organisationMajJoueursParPartie();
15840 changeDistribForPerso ();
15841} 
15842function changePersoAnnonceJeu() {
15843 if ($('#persoAnnonceJeu').val()==0 || $('#persoDistrib').val()==0 || $('#nbManches').val()>1 ) {
15844 $('.persoAnnJOpts').hide();
15845 }
15846 else 
15847 {
15848 $('.persoAnnJOpts').show();
15849 
15850 }
15851}
15852function changePersoAnnonceJeu2() {
15853 if ( $('#persoDistrib').val()==0 || $('#nbManches').val()>1 ) {
15854 $('.persoAnnJOpts2').hide();
15855 }
15856 else 
15857 {
15858 $('.persoAnnJOpts2').show();
15859 
15860 }
15861}
15862function changePersoNbManches () {
15863 var configurationParManche = $('#modeJeuSalon').val()=='Perso' || $('#modeJeuSalon').val()=='Organisation';
15864 if (configurationParManche) {
15865 $('.persoConfigurationSimple').hide();
15866 $('#organisationConfigurationsManches').show();
15867 organisationMajNombreManches();
15868 } else {
15869 $('.persoConfigurationSimple').show();
15870 $('#organisationConfigurationsManches').hide();
15871 if ($('#nbManches').val()>1) $('.uneManche').hide();
15872 else $('.uneManche').show();
15873 }
15874 changeDistribForPerso ();
15875}
15876function organisationAjouterParametresManches(params) {
15877 params += '&organisationModeDistribution='+encodeURIComponent($('#organisationModeDistribution').val());
15878 $('.organisationMancheConfig').each(function () {
15879 var manche = $(this);
15880 function ajouter(nom,valeur) {
15881  params += '&'+nom+'[]='+encodeURIComponent(valeur==null?'':valeur);
15882 }
15883 ajouter('organisationMancheIDdistribution',manche.find('.organisationMancheIDdistribution').val());
15884 ajouter('organisationMancheNumSequence',manche.find('.organisationMancheNumSequence').val());
15885 ajouter('organisationMancheNBdistribution',manche.find('.organisationMancheNBdistribution').val());
15886 ajouter('organisationMancheAnnonce',manche.find('.organisationMancheAnnonce').val());
15887 ajouter('organisationManchePreneur',manche.find('.organisationManchePreneur').val());
15888 ajouter('organisationMancheDonneur',manche.find('.organisationMancheDonneur').val());
15889 ajouter('organisationMancheRoiAppele',manche.find('.organisationMancheRoiAppele').val());
15890 });
15891 return params;
15892}
15893function organisationReinitialiserManche(manche) {
15894 manche.find('.organisationMancheDistribution').prop('selectedIndex',0);
15895 manche.find('.organisationMancheIDdistribution').val('');
15896 manche.find('.organisationMancheNumSequence').val('0');
15897 manche.find('.organisationMancheNBdistribution').val('0');
15898 manche.find('.organisationMancheAnnonce').val('0');
15899 manche.find('.organisationManchePreneur').val('0');
15900 manche.find('.organisationMancheDonneur').val('0');
15901 manche.find('.organisationMancheRoiAppele').val('-1');
15902 manche.find('.organisationMancheDistributionInfos').empty();
15903 organisationMajAnnonceManche(manche.find('.organisationMancheAnnonce')[0]);
15904}
15905function organisationMajNombreManches() {
15906 var nombre = parseInt($('#nbManches').val(),10) || 1;
15907 nombre = Math.max(1,Math.min(9,nombre));
15908 var liste = $('#organisationManchesListe');
15909 if (liste.length===0 || liste.children('.organisationMancheConfig').length===0) return;
15910 while (liste.children('.organisationMancheConfig').length<nombre) {
15911 var modele = liste.children('.organisationMancheConfig').last().clone();
15912 organisationReinitialiserManche(modele);
15913 liste.append(modele);
15914 }
15915 while (liste.children('.organisationMancheConfig').length>nombre) {
15916 liste.children('.organisationMancheConfig').last().remove();
15917 }
15918 liste.children('.organisationMancheConfig').each(function(index) {
15919 $(this).find('.organisationMancheNumero').text(index+1);
15920 });
15921 organisationMajJoueursParPartie();
15922 organisationMajModeDistribution();
15923}
15924function organisationMajModeDistribution() {
15925 var choisie = $('#organisationModeDistribution').val()=='choisie';
15926 $('.organisationMancheChoisie').toggle(choisie);
15927 $('#organisationManchesListe').toggle(choisie);
15928 $('#organisationModeDistributionAide').html(choisie ?
15929 'Choisissez une distribution et les r&ocirc;les pour chaque manche.' :
15930 'Les distributions et les r&ocirc;les seront tir&eacute;s al&eacute;atoirement.');
15931}
15932function organisationMajAnnonceManche(selecteur) {
15933 var manche = $(selecteur).closest('.organisationMancheConfig');
15934 var imposee = parseInt($(selecteur).val(),10)!==0;
15935 manche.find('.organisationManchePreneurWrap').toggle(imposee);
15936 manche.find('.organisationMancheRoiWrap').toggle(imposee && parseInt($('#nbJoueurs').val(),10)===5);
15937 if (!imposee) {
15938 manche.find('.organisationManchePreneur').val('0');
15939 manche.find('.organisationMancheRoiAppele').val('-1');
15940 }
15941}
15942function organisationMajJoueursParPartie() {
15943 if ($('#organisationManchesListe').length===0) return;
15944 var nombre = parseInt($('#nbJoueurs').val(),10) || 4;
15945 $('.organisationManchePreneur option,.organisationMancheDonneur option').each(function() {
15946 var visible = parseInt($(this).attr('data-position'),10)<nombre;
15947 $(this).prop('disabled',!visible).toggle(visible);
15948 });
15949 $('.organisationManchePreneur,.organisationMancheDonneur').each(function() {
15950 if (parseInt($(this).val(),10)>=nombre) $(this).val('0');
15951 });
15952 $('.organisationMancheDistribution option[data-nb-joueurs]').each(function() {
15953 $(this).prop('disabled',parseInt($(this).attr('data-nb-joueurs'),10)!==nombre);
15954 });
15955 $('.organisationMancheDistribution').each(function() {
15956 if ($(this).find('option:selected').prop('disabled')) $(this).prop('selectedIndex',0);
15957 });
15958 $('.organisationMancheAnnonce').each(function() { organisationMajAnnonceManche(this); });
15959}
15960function organisationChoisirDistribution(selecteur) {
15961 var valeur = $(selecteur).val();
15962 if (!valeur) return;
15963 var donnees = valeur.split('_');
15964 if (donnees.length<4 || parseInt(donnees[0],10)!==parseInt($('#nbJoueurs').val(),10)) {
15965 $(selecteur).prop('selectedIndex',0);
15966 alerte('Cette distribution ne correspond pas au nombre de joueurs.');
15967 return;
15968 }
15969 var manche = $(selecteur).closest('.organisationMancheConfig');
15970 manche.find('.organisationMancheIDdistribution').val(donnees[1]);
15971 manche.find('.organisationMancheNumSequence').val(donnees[2]);
15972 manche.find('.organisationMancheNBdistribution').val(donnees[3]);
15973 organisationAfficherDistribution(selecteur);
15974}
15975function organisationMelangeSuivant(bouton) {
15976 var manche = $(bouton).closest('.organisationMancheConfig');
15977 var champ = manche.find('.organisationMancheNBdistribution');
15978 champ.val(Math.min(2147483647,(parseInt(champ.val(),10)||0)+1));
15979 organisationAfficherDistribution(bouton);
15980}
15981function organisationDistributionAleatoire(bouton) {
15982 var manche = $(bouton).closest('.organisationMancheConfig');
15983 var morceaux = [];
15984 for (var i=0;i<5;i++) morceaux.push(Math.floor(Math.random()*9999999)+10000);
15985 manche.find('.organisationMancheDistribution').prop('selectedIndex',0);
15986 manche.find('.organisationMancheIDdistribution').val(morceaux.join(''));
15987 manche.find('.organisationMancheNumSequence').val(Math.floor(Math.random()*9999999)+10000);
15988 manche.find('.organisationMancheNBdistribution').val(Math.floor(Math.random()*9999999)+10000);
15989 organisationAfficherDistribution(bouton);
15990}
15991function organisationAfficherDistribution(source) {
15992 var manche = $(source).closest('.organisationMancheConfig');
15993 var idDistribution = manche.find('.organisationMancheIDdistribution').val();
15994 if (!idDistribution) {
15995 alerte("Choisissez d'abord une distribution.");
15996 return;
15997 }
15998 var parametres =
15999 'IDdistribution='+encodeURIComponent(idDistribution)+
16000 '&numSequence='+encodeURIComponent(manche.find('.organisationMancheNumSequence').val())+
16001 '&NBdistribution='+encodeURIComponent(manche.find('.organisationMancheNBdistribution').val())+
16002 '&nbJoueurs='+encodeURIComponent($('#nbJoueurs').val());
16003 ajax('/workers/forms/showFormationDistrib.php',parametres,function(res) {
16004 manche.find('.organisationMancheDistributionInfos').html(res);
16005 });
16006}
16007function changeDistribForPerso () {
16008 var persoDistrib = $('#persoDistrib');
16009 if (!persoDistrib.length) return;
16010 var savedDist = String(persoDistrib.val() || '0').split('_');
16011 if (savedDist.length>1 && $('#nbManches').val()==1) {
16012
16013 $('.choixDistribPersoPerso').hide();
16014 $('#distribInfosPerso').show();
16015 
16016 $('#PersoIDdistribution').val(savedDist[1]);
16017 $('#PersonumSequence').val(savedDist[2]);
16018 $('#PersoNBdistribution').val(savedDist[3]);
16019 $('#nbJoueurs').val(savedDist[0]);
16020 showPersoDistrib();
16021 //changePersoNbJoueurs ();
16022 
16023 } else {
16024
16025 if ($('#persoDistrib').val()>0) {
16026 $('.choixDistribPersoPerso').show();
16027 $('#distribInfosPerso').show(); 
16028 } else {
16029 $('.choixDistribPersoPerso').hide();
16030 $('#distribInfosPerso').hide();
16031 $('#persoAnnonceJeu').val(0);
16032 $('#persoAppelRoiJeu').val(-1);
16033 }
16034 persoRandomDistrib();
16035 }
16036 changePersoAnnonceJeu2();
16037} 
16038function showPersoDistrib() {
16039
16040 ajax('/workers/forms/showFormationDistrib.php', 'IDdistribution='+$('#PersoIDdistribution').val()+'&numSequence='+$('#PersonumSequence').val()+'&NBdistribution='+$('#PersoNBdistribution').val()+'&nbJoueurs='+$('#nbJoueurs').val(), function (res) {
16041 $('#distribInfosPerso').html(res);
16042 });
16043}
16044
16045function persoNextMelange() {
16046 $('#PersoNBdistribution').val(parseInt($('#PersoNBdistribution').val())+1);
16047 showPersoDistrib();
16048}
16049
16050function persoRandomDistrib() {
16051 var ran = Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999)+''+Math.ceil(Math.random()*9999999+9999);
16052 $('#PersoIDdistribution').val(ran);
16053 ran = Math.ceil(Math.random()*9999999+9999);
16054 $('#PersoNBdistribution').val(ran);
16055 ran = Math.ceil(Math.random()*9999999+9999);
16056 $('#PersonumSequence').val(ran);
16057 showPersoDistrib();
16058}
16059
16060function appelInviterregisterRefreshDynamicInfos (params)
16061{  
16062 numSalonRefresh = 0;
16063 clearTimeout(salonTO);
16064 if ($('#modeJeuSalon').val()!='')
16065 { 
16066 selectedModeJeu = $('#modeJeuSalon').val(); 
16067 params += getDiscussionSalonParam();
16068 ajax('/workers/inviter.php?refreshDyn', params+'&modeJeuSalon='+selectedModeJeu, registerRefreshDynamicInfos);  
16069 }
16070} 
16071
16072var lastContentD = '';
16073function registerRefreshDynamicInfos(html_div)
16074{ 
16075 if (dateDebutPartie!=null) return; 
16076 if ($$('dynamicContent')==null) return;
16077 if (isDisabledRefreshSalon) return;
16078 var html_divTAB = html_div.split('pçàp');
16079 var html = html_divTAB[0];
16080 var chatContent = html_divTAB[1];
16081
16082 if (lastContentD != chatContent && $("#mechacnt").size()!=0 ) {
16083 lastContentD = chatContent;
16084 $$('mechacnt').innerHTML = chatContent;
16085 $("#mechacnt").scrollTop($("#mechacnt")[0].scrollHeight);
16086 }
16087 $$('dynamicContent').innerHTML = html;
16088 if (selectedModeJeu!=null && $$('modeJeuSalon')!=null) $$('modeJeuSalon').value = selectedModeJeu;
16089 if (selectedSalonDiscussion!=null && $$('discussionSalonSelect')!=null) $$('discussionSalonSelect').value = selectedSalonDiscussion;
16090 
16091 var cells = $$('dynamicContent').getElementsByTagName('script');
16092 for (var i = 0; i < cells.length; i++) {
16093 eval(cells[i].innerHTML);
16094 } 
16095 if (!$$('modeJeuSalon')) return;
16096 if ($$('modeJeuSalon').value=='Formation') {
16097 $('.hideFormation').hide();
16098 $('.showFormation').show();
16099 }
16100 else {
16101 $('.hideFormation').show();
16102 $('.showFormation').hide();
16103 }
16104 if ($$('modeJeuSalon').value=='Organisation') {
16105 changeOrganisationPartie();
16106 }
16107}
16108var isDisabledRefreshSalon = false;
16109
16110function appelRefreshDynamicInfos (params)
16111{  
16112 clearTimeout(salonTO);  
16113 params += getDiscussionSalonParam();
16114 
16115 if ($$('modeJeuSalon')!=null)
16116 { 
16117 selectedModeJeu = $$('modeJeuSalon').value; 
16118 if (selectedModeJeu=='Organisation' && $$('idPartie')!=null) params += '&idPartieOrganisee='+$$('idPartie').value; 
16119 if ( $$('groupAmi')!=null) params += '&groupAmi='+$$('groupAmi').value; 
16120 ajax('/workers/inviter.php?appelRefresh', params+'&modeJeuSalon='+$$('modeJeuSalon').value, registerRefreshDynamicInfos);  
16121 }
16122 else
16123 {
16124 ajax('/workers/inviter.php?appelRefreshNoModejeu', params, registerRefreshDynamicInfos);
16125 }
16126}     
16127var salonTO = 0; 
16128function quitGameSalon()
16129{
16130 if ($$('global')==null) return;  
16131 clearTimeout(salonTO);
16132 ajax('/workers/inviter.php', "etape=quitSalon", registerStart); 
16133} 
16134var numSalonRefresh = 0;
16135
16136function toggleRefresh() {
16137 var isCheckedStopRefresh = $('#stopRefresh').is(':checked');
16138 clearTimeout(salonTO);
16139 if (isCheckedStopRefresh) {
16140 isDisabledRefreshSalon = true;
16141 }
16142 else {
16143 isDisabledRefreshSalon = false;
16144 refreshStartGameIntern();
16145 }
16146}
16147function refreshStartGame() {
16148 numSalonRefresh++;
16149 clearTimeout(salonTO);
16150 if (isDisabledRefreshSalon) return;
16151 if (numSalonRefresh<50)
16152 salonTO = setTimeout(refreshStartGameIntern,15000);
16153 else {
16154 salonTO = setTimeout(refreshStartGameIntern,60000);
16155 }
16156}
16157function refreshStartGameIntern()
16158{   
16159 appelRefreshDynamicInfos ("etape=dynamic");
16160}
16161function refreshSalonExtern()
16162{
16163 numSalonRefresh = 0;
16164 appelRefreshDynamicInfos ("etape=dynamic");
16165}
16166function accepterInvit(idJoueur,modeJeu)
16167{
16168 if ($$('global')==null) return;
16169 numSalonRefresh = 0;
16170 notifyGameEnd();
16171 preloadStartGame();
16172 if (ajaxCallXhr!=null) ajaxCallXhr.abort();     
16173 //appelInviter ("etape=start&accepterInvit="+idJoueur+'&gameMode='+modeJeu); 
16174 llog("Accept invit");
16175 ajax('/workers/inviter.php?accept', "etape=start&accepterInvit="+idJoueur+'&gameMode='+modeJeu, registerStart);     
16176}
16177function getGameName(modeJeu) {
16178
16179 var nomJeu = 'Libre4';
16180 if (modeJeu=='Tournoi') nomJeu = 'Tournoi classique à 4 joueurs';
16181 else if (modeJeu=='Tournoi5') nomJeu = 'Tournoi classique à 5 joueurs';
16182 else if (modeJeu=='Libre4') nomJeu = 'Jeu libre à 4 joueurs';
16183 else if (modeJeu=='Libre5') nomJeu = 'Jeu libre à 5 joueurs';
16184 else if (modeJeu=='Amical4') nomJeu = 'Jeu amical à 4 joueurs';
16185 else if (modeJeu=='Amical5') nomJeu = 'Jeu amical à 5 joueurs';
16186 else if (modeJeu=='DonneFixe') nomJeu = 'Tournoi duplicate';
16187 else if (modeJeu=='Competition4') nomJeu = 'Compétition duplicate D2';
16188 else if (modeJeu=='Competition5') nomJeu = 'Compétition duplicate D1';
16189 else if (modeJeu=='Master') nomJeu = 'Compétition des Masters';
16190 else if (modeJeu=='Duplicate4') nomJeu = 'Tournoi duplicate à 4';
16191 else if (modeJeu=='Duplicate5') nomJeu = 'Tournoi duplicate à 5';
16192 else if (modeJeu=='TournoiJour4') nomJeu = 'Tournoi quotidien à 4 joueurs';
16193 else if (modeJeu=='Challenge') nomJeu = 'Compétition Challenge';
16194 else if (modeJeu=='Challenge0') nomJeu = 'Eliminatoire Challenge';
16195 else if (modeJeu=='Challenge1') nomJeu = 'Quart de finale Challenge';
16196 else if (modeJeu=='Challenge2') nomJeu = 'Demi-finale Challenge';
16197 else if (modeJeu=='Challenge3') nomJeu = 'Finale Challenge';
16198 else if (modeJeu=='TournoiJour5') nomJeu = 'Tournoi quotidien à 5 joueurs';
16199 else if (modeJeu=='Premium4') nomJeu = 'Partie premium à 4 joueurs';
16200 else if (modeJeu=='Premium5') nomJeu = 'Partie premium à 5 joueurs';
16201 else if (modeJeu=='5joueurs') nomJeu = 'Partie classée à 5 joueurs';
16202 else if (modeJeu=='CPU') nomJeu = 'Partie contre l\'ordinateur à 4';
16203 else if (modeJeu=='CPU5') nomJeu = 'Partie contre l\'ordinateur à 5';
16204 else if (modeJeu=='CPU3') nomJeu = 'Partie contre l\'ordinateur à 3';
16205 else if (modeJeu=='CPU6') nomJeu = 'Partie contre l\'ordinateur à 6';
16206 else if (modeJeu=='DefiSoutienDuJour') nomJeu = 'D\u00e9fi soutien du jour';
16207 else if (modeJeu=='DefiDuJour') nomJeu = 'Défi du jour';
16208 else if (modeJeu=='Entrainement3') nomJeu = 'D&eacute;fi contre l\'ordinateur &agrave; 3';
16209 else if (modeJeu=='Entrainement5') nomJeu = 'D&eacute;fi contre l\'ordinateur &agrave; 5';
16210 else if (modeJeu=='Entrainement6') nomJeu = 'D&eacute;fi contre l\'ordinateur &agrave; 6';
16211 else if (modeJeu=='Entrainement') nomJeu = 'Défi contre l\'ordinateur';
16212 else if (modeJeu=='DefiChoisi') nomJeu = 'Défi premium';
16213 else if (modeJeu=='Perso') nomJeu = 'Partie personnalisée';
16214 else if (modeJeu=='Organisation') nomJeu = 'Partie organisée';
16215 else if (modeJeu=='Formation') nomJeu = 'Formation';
16216 return nomJeu;
16217}
16218function cancelPremium() {
16219 confirme('Etes-vous sûr de vouloir terminer cette partie ?',function () {
16220
16221 rpc('cancelGame=Y');
16222 });
16223}
16224function continueManche() {
16225 selMoteur.clearActions();
16226}
16227function inviteJoueur(idJoueur)
16228{
16229 var nomJeu = getGameName( $('#modeJeuSalon').val() );
16230
16231 var ttl = 'Etes-vous sûr de vouloir inviter ce joueur en '+nomJeu+' ?';
16232 if ($('#modeJeuSalon').val()=="Organisation") ttl = 'Etes-vous sûr de vouloir ajouter ce joueur à la partie ?<br><b>L\'invitation ne sera pas envoyée.</b>';
16233
16234 confirme(ttl,function () {
16235 notifyGameEnd();
16236 if (ajaxCallXhr!=null) ajaxCallXhr.abort(); 
16237 llog('Invite joueur');
16238 appelInviter ("etape=start&inviteJoueur="+idJoueur+'&gameMode='+$('#modeJeuSalon').val() ); 
16239 });
16240}
16241function createPreparedGame()
16242{
16243
16244 notifyGameEnd();
16245 if (ajaxCallXhr!=null) ajaxCallXhr.abort(); 
16246 llog('Invite joueur');
16247 appelInviter ('etape=start&createPreparedGame=1&gameMode='+$('#modeJeuSalon').val() ); 
16248}
16249var inteRejouerSent = false;
16250function rejouerAvec(strJoueurs,paramsPerso) {
16251 if (inteRejouerSent) return;
16252 numSalonRefresh = 0;
16253 preloadStartGame();
16254 clearTimeout(salonTO);
16255 if ($('#modeJeuSalon').val()!='' && $('#modeJeuSalon').val()!=undefined)
16256 { 
16257 inteRejouerSent = true; 
16258 llog('rejouerAvec');
16259 selectedModeJeu = $('#modeJeuSalon').val(); 
16260 var params = "etape=start&inviteJoueur="+strJoueurs+'&modeJeuSalon='+selectedModeJeu;
16261 if (selectedModeJeu=='Perso' || selectedModeJeu=='Organisation') {
16262  params += '&'+paramsPerso; 
16263 }
16264 ajax('/workers/inviter.php?rejouerAvec',params , function() { 
16265  window.onunload = window.onbeforeunload = null;
16266  document.location = '/Fin-de-partie.php?replay=1&idPartie='+currentGameId+'&modeJeu='+$('#modeJeuSalon').val();
16267  });
16268 
16269 }
16270}
16271function sendJoueurPartie(idUtil,fbuid,reqid) {
16272
16273 ajax('/workers/validePartieOfferte.php', "idUtil="+idUtil+"&fbuid="+fbuid+"&reqid="+reqid, alertRes); 
16274}
16275function confirmerCadeauCredits(idUtil,pseudo,fbuid,reqid)
16276{
16277 // if (id!=)
16278 //sendJoueurMessage (txt,idUtil)
16279 var resHTML = '<form onsubmit="return false;">';
16280 //resHTML +='Envoyer un message à '+pseudo+'<br />';
16281 //<button class="btn btn-lg btn-default pbtn" type="submit">Enregistrer</button>
16282 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="sendJoueurPartie ('+idUtil+','+fbuid+','+reqid+' );parentHide($(this));" />';
16283 resHTML +='</form>';
16284 showDialog('Envoyer une partie de Tournoi gratuite à '+pseudo,resHTML);
16285}
16286var cptBobYY = 0;
16287function sendMsgToJoueur(id,pseudo)
16288{
16289 // if (id!=)
16290 //sendJoueurMessage (txt,idUtil)
16291 var resHTML = '<form class="formChaMP2" onsubmit="return false;">';
16292 //resHTML +='Envoyer un message à '+pseudo+'<br />';
16293 var editorId = 'messageTo'+cptBobYY;
16294 resHTML +='<div class="htmlbutt" idTxt="'+editorId+'"></div>';
16295 resHTML +='<textarea class="form-control replyTB modeTextArea" id="'+editorId+'"></textarea>';
16296 //<button class="btn btn-lg btn-default pbtn" type="submit">Enregistrer</button>
16297 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="sendJoueurMessage ($$(\'messageTo'+cptBobYY+'\').value,'+id+' );parentHide($(this));" />';
16298 resHTML +='</form>';
16299 showBigDialog('Envoyer un message à '+pseudo,resHTML);
16300 showHTMLbuttons();
16301 cptBobYY++;
16302}
16303function amisCurrentSearchParam()
16304{
16305 var input = $('#amisListSearch');
16306 return input.length && $.trim(input.val())!=='' ? '&rechercheAmi='+encodeURIComponent($.trim(input.val())) : '';
16307}
16308function selectGroupeAmis(select,pseudo,sortBy)
16309{
16310 var opt = $(select).find('option:selected');
16311 if (opt.attr('data-all')=='1') {
16312 seeUtilisateur(pseudo,'part=amis&sortBy='+sortBy+amisCurrentSearchParam());
16313 return false;
16314 }
16315 return openGroupeAmis(opt.attr('data-url'),pseudo,sortBy);
16316}
16317function openGroupeAmis(categorieUrl,pseudo,sortBy)
16318{
16319 seeUtilisateur(pseudo,'part=amis&sortBy='+sortBy+'&groupeAmi='+categorieUrl+amisCurrentSearchParam());
16320 return false;
16321}
16322function sortAmisList(select,pseudo)
16323{
16324 seeUtilisateur(pseudo,'part=amis&sortBy='+$(select).val()+amisCurrentSearchParam());
16325 return false;
16326}
16327function searchAmisList(terme,pseudo,sortBy,groupeUrl,groupeActif)
16328{
16329 terme = $.trim(terme || '');
16330 var params = 'part=amis&sortBy='+sortBy;
16331 if (groupeActif) params += '&groupeAmi='+groupeUrl;
16332 if (terme!=='') params += '&rechercheAmi='+encodeURIComponent(terme);
16333 seeUtilisateur(pseudo,params);
16334 return false;
16335}
16336function writeToSelectedGroupeAmis(selectId)
16337{
16338 var select = $('#'+selectId);
16339 var opt = select.find('option:selected');
16340 if (!opt.length || opt.attr('data-all')=='1') {
16341 alerte('Selectionnez un groupe.');
16342 return false;
16343 }
16344 return sendMsgToGroupeAmis(select.val(),opt.attr('data-name'),parseInt(opt.attr('data-count'),10));
16345}
16346function sendMsgToGroupeAmis(categorie,pseudoGroupe,nbAmis)
16347{
16348 nbAmis = parseInt(nbAmis,10);
16349 if (!nbAmis || nbAmis<1) {
16350 alerte('Ce groupe ne contient aucun ami.');
16351 return false;
16352 }
16353 var inputId = 'messageToGroup'+cptBobYY;
16354 var buttonId = 'sendMessageToGroup'+cptBobYY;
16355 var groupeHTML = $('<div/>').text(pseudoGroupe || 'groupe').html();
16356 var resHTML = '<form class="formChaMP" onsubmit="return false;">';
16357 resHTML +='<div class="amisGroupMsgDialogInfo">'+nbAmis+' destinataire'+(nbAmis>
163571?'s':'')+'</div>';
16358 resHTML +='<div class="htmlbutt" idTxt="'+inputId+'"></div>';
16359 resHTML +='<textarea class="form-control replyTB modeTextArea" id="'+inputId+'"></textarea>';
16360 resHTML +='<input class="btn ptobt btn-default pbtn" id="'+buttonId+'" type="button" value="Envoyer" />';
16361 resHTML +='</form>';
16362 var dialogId = showBigDialog('Envoyer un message au groupe '+groupeHTML,resHTML);
16363 showHTMLbuttons();
16364 $('#'+dialogId).find('#'+buttonId).on('click',function () {
16365 sendJoueurMessageGroupe($('#'+inputId).val(),categorie);
16366 parentHide($(this));
16367 });
16368 cptBobYY++;
16369 return false;
16370}
16371function encodeAmiCategorieParam(categorie)
16372{
16373 return escape(categorie).split('+').join('%2B');
16374}
16375function sendJoueurMessageGroupe(txt,categorie)
16376{
16377 ajax('/workers/sendMessageGroupAmis.php', 'txt='+escape(txt).split('+').join('%2B')+'&categorie='+encodeAmiCategorieParam(categorie), sendJoueurMessageGroupeResult);
16378 return false;
16379}
16380function leaveSelectedGroupeAmis(selectId,pseudo,sortBy)
16381{
16382 var opt = $('#'+selectId).find('option:selected');
16383 if (!opt.length || opt.attr('data-all')=='1') {
16384 alerte('Selectionnez un groupe.');
16385 return false;
16386 }
16387 seeUtilisateur(pseudo,'part=amis&sortBy='+sortBy+amisCurrentSearchParam());
16388 return false;
16389}
16390function openAddFriendDialog()
16391{
16392 var sourceFocus = document.activeElement;
16393 var index = cptBobYY++;
16394 var inputId = 'amisAddFriendInput'+index;
16395 var targetId = 'amisAddFriendId'+index;
16396 var actionsId = 'amisAddFriendActions'+index;
16397 var selectedId = 'amisAddFriendSelected'+index;
16398 var html = '<div class="amisAddFriendDialog">';
16399 html += '<p>Recherchez un joueur par son pseudo, puis selectionnez-le dans les resultats.</p>';
16400 html += '<label for="'+inputId+'">Pseudo du joueur</label>';
16401 html += '<input type="text" id="'+inputId+'" class="form-control composantRechercheJoueur" data-sources="tous,recents" data-id-target="'+targetId+'" data-selection-show="'+actionsId+'" autocomplete="off">';
16402 html += '<input type="hidden" id="'+targetId+'">';
16403 html += '<div id="'+actionsId+'" class="amisAddFriendSelection" style="display:none">';
16404 html += '<div>Joueur selectionne : <strong id="'+selectedId+'"></strong></div>';
16405 html += '<div class="amisAddFriendSelection__actions">';
16406 html += '<button type="button" class="btn btn-success" onclick="return requestFriendFromDialog(\''+inputId+'\',\''+targetId+'\',this);">Demander comme ami</button>';
16407 html += '<button type="button" class="btn btn-info" onclick="return showFriendDetailsFromDialog(\''+inputId+'\',\''+targetId+'\',this);">Voir la fiche</button>';
16408 html += '<button type="button" class="btn btn-default" onclick="parentHide($(this));return false;">Fermer</button>';
16409 html += '</div></div></div>';
16410 var dialogId = showDialog('Ajouter un ami',html);
16411 document.getElementById(dialogId)._amisSourceFocus = sourceFocus;
16412 var width = Math.min(620,Math.max(300,$(window).width()-30));
16413 $('#'+dialogId).dialog('option','width',width);
16414 $('#'+dialogId).dialog('widget').addClass('amisAddFriendDialogShell');
16415 if (typeof initialiserComposantsRechercheJoueur==='function')
16416 initialiserComposantsRechercheJoueur(document.getElementById(dialogId));
16417 $('#'+inputId).on('joueurselectionne',function (event) {
16418 var original = event.originalEvent || event;
16419 var detail = original.detail || {};
16420 $('#'+selectedId).text(detail.pseudo || this.value);
16421 $('#'+actionsId).show();
16422 }).focus();
16423 return false;
16424}
16425function showFriendDetailsFromDialog(inputId,targetId,button)
16426{
16427 var idJoueur = parseInt($('#'+targetId).val(),10) || 0;
16428 if (idJoueur<=0) { alerte('Selectionnez un joueur dans les resultats.'); return false; }
16429 var dialog = $(button).closest('.dialogBox');
16430 var sourceFocus = dialog.length ? dialog[0]._amisSourceFocus : null;
16431 showFriendDetails(encodeURIComponent($('#'+inputId).val()),idJoueur,function () {
16432 // Ne fermer la selection que lorsque la fiche a effectivement ete recue.
16433 if (dialog.length) dialog.dialog('close');
16434 var fiche = document.getElementById('detailJoueur');
16435 if (!fiche) return;
16436 fiche._joueurReturnFocus = sourceFocus;
16437 var close = fiche.querySelector('.joueurDetailsMinClose');
16438 if (close) close.focus();
16439 });
16440 return false;
16441}
16442function requestFriendFromDialog(inputId,targetId,button)
16443{
16444 var idUtil = parseInt($('#'+targetId).val(),10) || 0;
16445 var pseudo = $('#'+inputId).val();
16446 if (!idUtil) {
16447 alerte('Selectionnez un joueur dans les resultats.');
16448 return false;
16449 }
16450 confirme('Etes-vous sur de vouloir demander '+pseudo+' en ami ?',function () {
16451 ajouteAmi(idUtil);
16452 parentHide($(button));
16453 });
16454 return false;
16455}
16456function closeAmiGroupPopovers(except)
16457{
16458 $('.amiGroupPopover').each(function () {
16459 if (except && this===except) return;
16460 $(this).prop('hidden',true).siblings('.amiIconAction--group').attr('aria-expanded','false');
16461 });
16462}
16463function toggleAmiGroupPopover(button,event)
16464{
16465 if (event) event.stopPropagation();
16466 var popover = $(button).siblings('.amiGroupPopover').get(0);
16467 if (!popover) return false;
16468 var ouvrir = !!popover.hidden;
16469 closeAmiGroupPopovers(popover);
16470 popover.hidden = !ouvrir;
16471 $(button).attr('aria-expanded',ouvrir?'true':'false');
16472 if (ouvrir) window.setTimeout(function () { $(popover).find('select').focus(); },0);
16473 return false;
16474}
16475$(document).off('click.amisGroupPopover').on('click.amisGroupPopover',function (event) {
16476 if ($(event.target).closest('.amiGroupActionWrap').length===0) closeAmiGroupPopovers();
16477});
16478function toggleAmiFavori(idUtil,favori,pseudo,sortBy,event)
16479{
16480 if (event) event.stopPropagation();
16481 ajax('/workers/ami_favori.php','idUtil='+idUtil+'&favori='+(favori?1:0),function (txt) {
16482 if (txt && txt!='OK') alerte(txt);
16483 else seeUtilisateur(pseudo,'part=amis&sortBy='+sortBy);
16484 });
16485 return false;
16486}
16487function goToAmisPage(page,pseudo,sortBy,groupeUrl,groupeActif,rechercheUrl)
16488{
16489 page = parseInt(page,10);
16490 if (!page || page<1) return false;
16491 var params = 'part=amis&sortBy='+sortBy+'&pageAmis='+page;
16492 if (groupeActif) params += '&groupeAmi='+groupeUrl;
16493 if (rechercheUrl) params += '&rechercheAmi='+rechercheUrl;
16494 seeUtilisateur(pseudo,params);
16495 return false;
16496}
16497function goToFriendRequestsPage(onglet,page,pseudo)
16498{
16499 if ($.inArray(onglet,['amis','recues','envoyees'])===-1) onglet = 'am
16499is';
16500 page = parseInt(page,10);
16501 if (!page || page<1) return false;
16502 var params = 'part=amis&ongletAmis='+encodeURIComponent(onglet);
16503 if (onglet!=='amis') params += '&pageDemandesAmis='+page;
16504 seeUtilisateur(pseudo,params);
16505 return false;
16506}
16507function sendJoueurMessageGroupeResult(html)
16508{
16509 if (html && html.indexOf('AGE_REQUIRED|')===0) {
16510 alerte(html.substr(13),function () { document.location='/Compte.php?part=compte&majorite=guildes#compteDateNaissance'; });
16511 return;
16512 }
16513 if (html=='OK')
16514 alerte('Message envoy\u00e9.');
16515 else
16516 alerte(html);
16517}
16518function encodeGuildeParam(txt)
16519{
16520 return escape(txt).split('+').join('%2B');
16521}
16522function reloadGuildesCompte(pseudo)
16523{
16524 if (pseudo)
16525 seeUtilisateur(pseudo,'part=guildes');
16526}
16527function guildeActionDone(html,pseudo)
16528{
16529 if (html && html.indexOf('AGE_REQUIRED|')===0) {
16530 alerte(html.substr(13),function () { document.location='/Compte.php?part=compte&majorite=guildes#compteDateNaissance'; });
16531 return;
16532 }
16533 if (html && html!='OK')
16534 alerte(html);
16535 reloadGuildesCompte(pseudo);
16536}
16537function createGuilde(nom,description,pseudo)
16538{
16539 nom = $.trim(nom);
16540 if (nom=='') {
16541 alerte('Saisissez un nom de guilde.');
16542 return false;
16543 }
16544 ajax('/workers/guilde.php','action=create&nom='+encodeGuildeParam(nom)+'&description='+encodeGuildeParam(description),function (html) { guildeActionDone(html,pseudo); });
16545 return false;
16546}
16547function inviteJoueurGuilde(idGuilde,pseudoJoueur,pseudo,idJoueur)
16548{
16549 pseudoJoueur = $.trim(pseudoJoueur);
16550 if (pseudoJoueur=='') {
16551 alerte('Saisissez un pseudo.');
16552 return false;
16553 }
16554 ajax('/workers/guilde.php','action=invite&idGuilde='+idGuilde+'&pseudo='+encodeGuildeParam(pseudoJoueur)+'&idUtil='+(parseInt(idJoueur,10)||0),function (html) { guildeActionDone(html,pseudo); });
16555 return false;
16556}
16557function inviteGroupeAmisGuilde(idGuilde,idsAmis,pseudo)
16558{
16559 if (!idsAmis) {
16560 alerte('Selectionnez un groupe d\'amis.');
16561 return false;
16562 }
16563 confirme('Envoyer une invitation de guilde aux amis selectionnes ?',function () {
16564 ajax('/workers/guilde.php','action=inviteAmis&idGuilde='+idGuilde+'&idsUtil='+encodeURIComponent(idsAmis),function (html) { guildeActionDone(html,pseudo); });
16565 });
16566 return false;
16567}
16568function guildeInvitation(action,idInvitation,pseudo)
16569{
16570 ajax('/workers/guilde.php','action='+action+'&idInvitation='+idInvitation,function (html) { guildeActionDone(html,pseudo); });
16571 return false;
16572}
16573function setGuildeRole(idGuilde,idUtil,role,pseudo)
16574{
16575 ajax('/workers/guilde.php','action=setRole&idGuilde='+idGuilde+'&idUtil='+idUtil+'&role='+role,function (html) { guildeActionDone(html,pseudo); });
16576 return false;
16577}
16578function transfererResponsableGuilde(idGuilde,idUtil,pseudoCible,pseudo)
16579{
16580 confirme('Transmettre la responsabilite de la guilde a '+pseudoCible+' ? Vous resterez administrateur.',function () {
16581 ajax('/workers/guilde.php','action=transferChef&idGuilde='+idGuilde+'&idUtil='+idUtil,function (html) { guildeActionDone(html,pseudo); });
16582 });
16583 return false;
16584}
16585function removeGuildeMember(idGuilde,idUtil,pseudo)
16586{
16587 confirme('Retirer ce joueur de la guilde ?',function () {
16588 ajax('/workers/guilde.php','action=remove&idGuilde='+idGuilde+'&idUtil='+idUtil,function (html) { guildeActionDone(html,pseudo); });
16589 });
16590 return false;
16591}
16592function leaveGuilde(idGuilde,pseudo)
16593{
16594 confirme('Quitter cette guilde ?',function () {
16595 ajax('/workers/guilde.php','action=remove&idGuilde='+idGuilde,function (html) { guildeActionDone(html,pseudo); });
16596 });
16597 return false;
16598}
16599function deleteGuilde(idGuilde,pseudo)
16600{
16601 confirme('Supprimer definitivement cette guilde ?',function () {
16602 ajax('/workers/guilde.php','action=delete&idGuilde='+idGuilde,function (html) { guildeActionDone(html,pseudo); });
16603 });
16604 return false;
16605}
16606function sendMsgToGuilde(idGuilde,nomGuilde,nbMembres)
16607{
16608 if (!idGuilde) return false;
16609 nbMembres = parseInt(nbMembres,10);
16610 if (!nbMembres || nbMembres<1) nbMembres = 1;
16611 var inputId = 'messageToGuilde'+cptBobYY;
16612 var guildeHTML = $('<div/>').text(nomGuilde || 'guilde').html();
16613 var resHTML = '<form class="formChaMP" onsubmit="return false;">';
16614 resHTML +='<div class="amisGroupMsgDialogInfo">'+nbMembres+' membre'+(nbMembres>
166141?'s':'')+'</div>';
16615 resHTML +='<div class="htmlbutt" idTxt="'+inputId+'"></div>';
16616 resHTML +='<textarea class="form-control replyTB modeTextArea" id="'+inputId+'"></textarea>';
16617 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Envoyer" onclick="sendGuildeMessage('+idGuilde+',$$(\''+inputId+'\').value);parentHide($(this));" />';
16618 resHTML +='</form>';
16619 showBigDialog('Envoyer un message a la guilde '+guildeHTML,resHTML);
16620 showHTMLbuttons();
16621 cptBobYY++;
16622 return false;
16623}
16624function sendGuildeMessage(idGuilde,txt)
16625{
16626 ajax('/workers/guilde.php','action=sendMessage&idGuilde='+idGuilde+'&txt='+encodeGuildeParam(txt),sendJoueurMessageGroupeResult);
16627 return false;
16628}
16629var intviCpt = 0;
16630function inviteJoueurPseudo()
16631{
16632 var invitationIndex = intviCpt++;
16633 var resHTML = '<form onsubmit="return false;">'; 
16634 resHTML +='Saisissez le pseudo du joueur que vous souhaitez inviter :<br />';
16635 resHTML +='<input class="form-control composantRechercheJoueur" data-sources="tous,amis,recents" data-id-target="invitJoueurId'+invitationIndex+'" type="text" id="invitPseudo'+invitationIndex+'"/><input type="hidden" id="invitJoueurId'+invitationIndex+'"/><br />';
16636 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Inviter" onclick="sendJoueurPseudoInvit ($$(\'invitPseudo'+invitationIndex+'\').value,$$(\'invitJoueurId'+invitationIndex+'\').value );parentHide($(this));" />';
16637 resHTML +='</form>';
16638 var dialogId = showDialog('Inviter un joueur',resHTML);
16639 if (typeof initialiserComposantsRechercheJoueur==='function')
16640 initialiserComposantsRechercheJoueur(document.getElementById(dialogId));
16641 
16642 return;
16643 //pseudo,email             
16644}
16645var intviMailCpt = 0;
16646function inviteJoueurEmail()
16647{
16648 var resHTML = '<form onsubmit="return false;">'; 
16649 resHTML +='Saisissez l\'email de l\'ami que vous souhaitez inviter :<br />';
16650 resHTML +='<input class="form-control" type="text" id="invitEmail'+intviMailCpt+'"/><br />';
16651 resHTML +='<input class="btn ptobt btn-default pbtn" type="button" value="Inviter" onclick="sendJoueurPseudoInvit ($$(\'invitEmail'+intviMailCpt+'\').value );parentHide($(this));" />';
16652 resHTML +='</form>';
16653 showDialog('Inviter un joueur par email',resHTML);
16654 intviCpt++;
16655 
16656 return;
16657 //pseudo,email             
16658}
16659
16660function friendRequestParseResult(txt)
16661{
16662 if (txt && typeof txt==='object' && typeof txt.ok!=='undefined') return txt;
16663 try {
16664 var resultat = JSON.parse(txt);
16665 if (resultat && typeof resultat.ok!=='undefined') return resultat;
16666 } catch (e) {}
16667 return {ok:false,code:'reponse_invalide',message:(typeof txt==='string' && txt)?txt:'Une erreur est survenue. Rechargez la page et r&eacute;essayez.'};
16668}
16669function friendRequestShowResult(txt,silencieux,apresFermeture)
16670{
16671 var resultat = friendRequestParseResult(txt);
16672 if (!silencieux || !resultat.ok) {
16673 alerte(resultat.message || (resultat.ok?'Op&eacute;ration termin&eacute;e.':'L\'op&eacute;ration a &eacute;chou&eacute;.'),apresFermeture);
16674 } else if (apresFermeture) {
16675 apresFermeture();
16676 }
16677 return resultat;
16678}
16679var friendRequestTokenCache = '';
16680var friendRequestTokenLoading = false;
16681var friendRequestTokenCallbacks = [];
16682function friendRequestGetToken(callback)
16683{
16684 if (friendRequestTokenCache!=='') {
16685 callback(friendRequestTokenCache);
16686 return;
16687 }
16688 friendRequestTokenCallbacks.push(callback);
16689 if (friendRequestTokenLoading) return;
16690 friendRequestTokenLoading = true;
16691 ajax('/workers/demandeAmiToken.php','',function (txt) {
16692 var resultat = friendRequestParseResult(txt);
16693 var callbacks = friendRequestTokenCallbacks.slice(0);
16694 friendRequestTokenCallbacks = [];
16695 friendRequestTokenLoading = false;
16696 if (!resultat.ok || !resultat.token) {
16697  alerte(resultat.message || 'La page a expir&eacute;. Rechargez-la avant de r&eacute;essayer.');
16698  return;
16699 }
16700 friendRequestTokenCache = resultat.token;
16701 for (var i=0;i<callbacks.length;i++) callbacks[i](friendRequestTokenCache);
16702 });
16703}
16704function ajouteAmi(idUtil,source)
16705{
16706 source = source || 'profil';
16707 friendRequestGetToken(function (token) {
16708 ajax('/workers/demandeAmis.php', 'idUtil='+parseInt(idUtil,10)+'&source='+encodeURIComponent(source)+'&token='+encodeURIComponent(token), function (txt) {
16709  var resultat = friendRequestShowResult(txt,false);
16710  if (resultat.ok) sendWebPing(idUtil);
16711 });
16712 });
16713 return false;
16714}
16715function ajouteAmiBg(idUtil,source)
16716{
16717 source = source || 'autre';
16718 friendRequestGetToken(function (token) {
16719 ajax('/workers/demandeAmis.php', 'idUtil='+parseInt(idUtil,10)+'&source='+encodeURIComponent(source)+'&token='+encodeURIComponent(token), function (txt) {
16720  var resultat = friendRequestShowResult(txt,true);
16721  if (resultat.ok) sendWebPing(idUtil);
16722 });
16723 });
16724}
16725function friendRequestReload(pseudo,onglet)
16726{
16727 seeUtilisateur(pseudo,'part=amis&ongletAmis='+encodeURIComponent(onglet));
16728}
16729function friendRequestAction(idDemande,action,token,pseudo,onglet)
16730{
16731 ajax('/workers/demandeAmiAction.php','idDemande='+parseInt(idDemande,10)+'&action='+encodeURIComponent(action)+'&token='+encodeURIComponent(token),function (txt) {
16732 friendRequestShowResult(txt,false,function () { friendRequestReload(pseudo,onglet); });
16733 });
16734 return false;
16735}
16736function friendRequestDecision(idDemande,action,token,pseudo)
16737{
16738 if (action==='refuser') {
16739 confirme('Refuser cette demande d\'ami ?',function () {
16740  friendRequestAction(idDemande,action,token,pseudo,'recues');
16741 });
16742 return false;
16743 }
16744 return friendRequestAction(idDemande,action,token,pseudo,'recues');
16745}
16746function friendRequestCancel(idDemande,token,pseudo)
16747{
16748 confirme('Annuler cette demande d\'ami ?',function () {
16749 friendRequestAction(idDemande,'annuler',token,pseudo,'envoyees');
16750 });
16751 return false;
16752}
16753function saveAmiCategorie(idUtil,categorie,pseudo,sortBy)
16754{
16755 categorie = $.trim(categorie);
16756 ajax('/workers/ami_categorie.php', 'idUtil='+idUtil+'&categorie='+encodeAmiCategorieParam(categorie), function (txt) {
16757 if (txt && txt!='OK')
16758 alerte(txt);
16759 else if (pseudo)
16760 seeUtilisateur(pseudo,'part=amis&sortBy='+sortBy);
16761 });
16762 return false;
16763}
16764function newAmiCategorie(idUtil,pseudo,sortBy)
16765{
16766 var inputID = 'categorieAmi'+cptBobYY;
16767 var resHTML = '<form onsubmit="saveAmiCategorie('+idUtil+',$$(\''+inputID+'\').value,\''+pseudo+'\',\''+sortBy+'\');parentHide($(this));return false;">';
16768 resHTML += 'Nom de la nouvelle catégorie :<br />';
16769 resHTML += '<input class="form-control" type="text" id="'+inputID+'"/><br />';
16770 resHTML += '<input class="btn ptobt btn-warning pbtn" type="button" value="Annuler" onclick="parentHide($(this));" />';
16771 resHTML += '<input class="btn ptobt btn-default pbtn" type="button" value="Créer" onclick="saveAmiCategorie('+idUtil+',$$(\''+inputID+'\').value,\''+pseudo+'\',\''+sortBy+'\');parentHide($(this));" />';
16772 resHTML += '</form>';
16773 showBigDialog('Nouvelle catégorie d\'amis',resHTML);
16774 cptBobYY++;
16775}
16776function changeAmiCategorie(idUtil,obj,pseudo,sortBy)
16777{
16778 var oldCategorie = $(obj).attr('data-categorie');
16779 var categorie = $(obj).val();
16780 if (categorie=='__new__') {
16781 $(obj).val(oldCategorie);
16782 newAmiCategorie(idUtil,pseudo,sortBy);
16783 return false;
16784 }
16785 return saveAmiCategorie(idUtil,categorie,pseudo,sortBy);
16786}
16787function deleteAmi(idUtil,pseudo,obj)
16788{
16789 confirme('Etes-vous sûr de vouloir supprimer '+pseudo+' de votre liste d\'amis ?',function () {
16790 if (ajaxCallXhr!=null) ajaxCallXhr.abort();
16791 ajax('/workers/ami_delete.php', 'idUtil='+idUtil, function(res) {
16792 $('.myFriend'+idUtil).remove();
16793 alerte(res);
16794 });
16795 });
16796}
16797function deleteAmiNew(idUtil,pseudo)
16798{
16799 deleteAmi(idUtil,pseudo,null);
16800}
16801function nettoyerListeAmis(token,pseudo,nombre,button)
16802{
16803 nombre = parseInt(nombre,10) || 0;
16804 var pluriel = nombre>1;
16805 var message = 'Ce nettoyage retirera '+nombre+' ami'+(pluriel?'s':'')+' : comptes absents depuis plus d\'un an, joueurs bloques et comptes supprimes. Voulez-vous continuer ?';
16806 confirme(message,function () {
16807 $(button).prop('disabled',true);
16808 ajax('/workers/amis_nettoyer.php','token='+encodeURIComponent(token),function (res) {
16809 res = $.trim(res || '');
16810 if (res.indexOf('OK|')===0) {
16811 var nombreSupprime = parseInt(res.substr(3),10) || 0;
16812 var confirmation = nombreSupprime>0
16813 ? nombreSupprime+' ami'+(nombreSupprime>1?'s ont ete retires':' a ete retire')+' de votre liste.'
16814 : 'Aucun ami ne correspond plus aux criteres de nettoyage.';
16815 alerte(confirmation,function () { seeUtilisateur(pseudo,'part=amis'); });
16816 } else {
16817 $(button).prop('disabled',false);
16818 alerte(res.indexOf('ERREUR|')===0?res.substr(7):res);
16819 }
16820 });
16821 });
16822 return false;
16823}
16824function accepterDemandeAmis (idUtil,codeVerif)
16825{  
16826 clearTimeout(salonTO);
16827 if ($('#modeJeuSalon').length)
16828 showWorkerPage('inviter','accepterAmi='+idUtil+'&codeVerif='+codeVerif);
16829 else
16830 { 
16831 //if ($('#modeJeuSalon').val()!='')
16832 //selectedModeJeu = $('#modeJeuSalon').val(); 
16833 //showWorkerPage('inviter','accepterAmi='+idUtil+'&codeVerif='+codeVerif);
16834 ajax('/workers/accepterAmi.php', 'accepterAmi='+idUtil+'&codeVerif='+codeVerif, evalRes);  
16835 }
16836}
16837function refuserDemandeAmis (idUtil,codeVerif)
16838{
16839 ajax('/workers/accepterAmi.php', 'refuserAmi='+idUtil+'&codeVerif='+codeVerif, evalRes);
16840}
16841function showDemandeAmi (idUtil,_dateInvitation,nomJoueur,codeVerif,image,utilisateurMineur)
16842{
16843 var resHTML = '<form class="feedback_form mates'+idUtil+'" onsubmit="return false;">';
16844 resHTML +='<img class="button MPAvat2" onclick="return showFicheJoueurDyn(\''+nomJoueur+'\');" style="" align="left" src="'+image+'" alt="Voir la fiche de ce joueur"/>';
16845 resHTML += 'Vous avez été invité en ami par '+nomJoueur+'<br />';
16846 resHTML += 'Le <b>'+_dateInvitation+'</b><br><br>';
16847 if (utilisateurMineur) {
16848 resHTML += '<div class="alert alert-warning" role="alert"><strong>Prot&egrave;ge-toi :</strong> accepter cette demande permettra &agrave; cette personne de t&apos;envoyer des messages priv&eacute;s.<br>Si tu ne connais pas cette personne ou si tu as le moindre doute, refuse la demande.<br>Tu peux d&eacute;sactiver toutes les demandes d&apos;amis depuis <a href="/Compte.php?part=compte#demandeAmis">la page Compte</a>.</div>';
16849 }
16850 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));refuserDemandeAmis('+idUtil+',\''+codeVerif+'\');" value="'+(utilisateurMineur?'Refuser (conseill&eacute; en cas de doute)':'Refuser')+'"/>';
16851 resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="parentHide($(this));accepterDemandeAmis('+idUtil+',\''+codeVerif+'\');" value="Accepter"/>';
16852 resHTML +='<input class="btn btn-danger ptobt pbtn" type="button" value="Blocages" onclick="signalerJoueur ('+idUtil+',\''+nomJoueur+'\');parentHide($(this));" />';
16853 
16854 resHTML += '<br /></form>';
16855 showDialog('Demande ami de '+nomJoueur,resHTML);
16856 /*clearTimeout(TOshowInvits);
16857 TOshowInvits = setTimeout(displayInvits,200);*/
16858 playSound ('Button.mp3?v=2');
16859}
16860
16861function parentHide(obj)
16862{
16863 var nbParent = 10;
16864 while ( !obj.hasClass('dialogBox') && nbParent>0 && obj.parent()) {
16865 obj = obj.parent();
16866 }
16867 if (obj.hasClass('dialogBox') && obj.attr('id'))
16868 closeDialog(obj.attr('id'))
16869 /*
16870 if (obj && obj.parent() && obj.parent().parent())
16871 closeDialog(obj.parent().parent().attr('id'))*/
16872}
16873function sendJoueurPseudoInvit (pseudo,idJoueur) 
16874{
16875 if (ajaxCallXhr!=null) ajaxCallXhr.abort(); 
16876 llog('sendJoueurPseudoInvit');
16877 appelInviter ("etape=start&"+(parseInt(idJoueur,10)>0?"inviteJoueur="+parseInt(idJoueur,10):"inviteJoueurPseudo="+pseudo)+'&gameMode='+$('#modeJeuSalon').val());    
16878}
16879function sendJoueurEmailInvit (email) 
16880{
16881 if (!echeck(email)) return;
16882 if (ajaxCallXhr!=null) ajaxCallXhr.abort(); 
16883 llog('sendJoueurEmailInvit');     
16884 appelInviter ("etape=start&inviteJoueurEmail="+email+'&gameMode='+$('#modeJeuSalon').val()); 
16885}
16886var pendingInvitations = new Array();
16887var TOshowInvits = 0;
16888
16889function showInvit (_idPartie,_dateInvitation,_msg,_modeJeu,_descP)
16890{
16891 pendingInvitations.push( { 
16892   idPartie:_idPartie,
16893   dateInvitation:_dateInvitation,
16894   msg:_msg,
16895   modeJeu:_modeJeu,
16896   descP:_descP
16897   });
16898 clearTimeout(TOshowInvits);
16899 TOshowInvits = setTimeout(displayInvits,200);
16900}
16901var cptIv = 0;
16902function displayInvits()
16903{
16904 var iterObj;
16905 var resHTML = '<form onsubmit="return false;">';
16906 if (pendingInvitations.length>0)
16907 {
16908 iterObj = pendingInvitations.shift();
16909 cptIv++;
16910 var nomJeu = 'Libre4';
16911 if (iterObj.modeJeu=='Tournoi') nomJeu = 'Tournoi classique à 4';
16912 else if (iterObj.modeJeu=='Tournoi5') nomJeu = 'Tournoi classique à 5';
16913 else if (iterObj.modeJeu=='Libre4') nomJeu = 'Jeu libre à 4';
16914 else if (iterObj.modeJeu=='Libre5') nomJeu = 'Jeu libre à 5';
16915 else if (iterObj.modeJeu=='Amical4') nomJeu = 'Jeu amical à 4';
16916 else if (iterObj.modeJeu=='Amical5') nomJeu = 'Jeu amical à 5';
16917 else if (iterObj.modeJeu=='DonneFixe') nomJeu = 'Tournoi duplicate';
16918 else if (iterObj.modeJeu=='Competition4') nomJeu = 'Compétition duplicate Division 2';
16919 else if (iterObj.modeJeu=='Competition5') nomJeu = 'Compétition duplicate Division 1';
16920 else if (iterObj.modeJeu=='Master') nomJeu = 'Compétition des Masters';
16921
16922 else if (iterObj.modeJeu=='Duplicate4') nomJeu = 'Tournoi duplicate à 4';
16923 else if (iterObj.modeJeu=='Duplicate5') nomJeu = 'Tournoi duplicate à 5';
16924 else if (iterObj.modeJeu=='Challenge') nomJeu = 'Compétition Challenge';
16925 else if (iterObj.modeJeu=="Challenge0") nomJeu = "Eliminatoire Challenge";
16926 else if (iterObj.modeJeu=="Challenge1") nomJeu = "Quart de finale Challenge";
16927 else if (iterObj.modeJeu=="Challenge2") nomJeu = "Demi-finale Challenge";
16928 else if (iterObj.modeJeu=="Challenge3") nomJeu = "Finale Challenge";
16929 else if (iterObj.modeJeu=='TournoiJour4') nomJeu = 'Tournoi quotidien à 4';
16930 else if (iterObj.modeJeu=='TournoiJour5') nomJeu = 'Tournoi quotidien à 5';
16931 else if (iterObj.modeJeu=='Premium4') nomJeu = 'Compétition premium à 4';
16932 else if (iterObj.modeJeu=='Premium5') nomJeu = 'Compétition premium à 5';
16933 
16934 else if (iterObj.modeJeu=='Premium') nomJeu = 'Partie classée';
16935 else if (iterObj.modeJeu=='Perso') nomJeu = 'Partie perso';
16936 else if (iterObj.modeJeu=='Organisation') nomJeu = 'Partie organisée';
16937 else if (iterObj.modeJeu=='5joueurs') nomJeu = 'Partie à 5';
16938 else if (iterObj.modeJeu=='Formation') nomJeu = 'Formation';
16939 resHTML += '<b>Vous avez été invité à jouer !</b><br>';
16940 if (iterObj.descP==='AttenteMode')
16941  resHTML += 'Des joueurs attendent dans ce mode. Le placement habituel reste applique.<br />';
16942 else if (iterObj.descP)
16943  resHTML += ' <i>'+iterObj.descP+'</i><br />';
16944 resHTML += '<span class="invitationModeIcone" aria-hidden="true"><img class="MJicon" src="'+getModeJeuIcone(iterObj.modeJeu)+'" alt="" width="68" height="68"></span>';
16945 resHTML += '<b>'+nomJeu+'</b><br />';
16946 resHTML += 'Le '+iterObj.dateInvitation+'</b><br>Par : <b>'+iterObj.msg+'<br />';
16947 resHTML += '<input class="btn btn-warning ptobt pbtn" type="button" onclick="parentHide($(this));" value="Refuser"/> ';
16948 if (iterObj.descP==='AttenteMode')
16949  resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="accepterInvitationAttenteMode(\''+iterObj.modeJeu+'\');parentHide($(this));" value="Jouer"/><br />';
16950 else
16951  resHTML += '<input class="btn btn-success ptobt pbtn" type="button" onclick="accepterInvit('+iterObj.idPartie+',\''+iterObj.modeJeu+'\');parentHide($(this));" value="Accepter"/><br />';
16952
16953 resHTML += '</form>';
16954 showDialog('Invitation de jeu '+cptIv,resHTML);
16955 clearTimeout(TOshowInvits);
16956 TOshowInvits = setTimeout(displayInvits,200);
16957 playSound ('Button.mp3?v=2');
16958 }
16959}
16960
16961var cptBob = 0;
16962function showMsgJoueur2(from,pseudo,date,msg)
16963{
16964 //sendJoueurMessage (txt,idUtil)
16965 var resHTML = '<form onsubmit="return false;"><u>'+date+'</u><br />'+msg;
16966 resHTML +='<br /><br />';
16967 resHTML +='<div class="htmlbutt" idTxt="replyTo'+from+'_'+cptBob+'"></div>';
16968 resHTML +='<textarea class="replyTB modeTextArea" id="replyTo'+from+'_'+cptBob+'"></textarea>';
16969 resHTML +='<input class="btn btn-success ptobt pbtn" type="button" value="repondre" onclick="sendJoueurMessage ($$(\'replyTo'+from+'_'+cptBob+'\').value,'+from+' );parentHide($(this));" />';
16970 resHTML +='</form>';
16971 showBigDialog('Message de '+pseudo,resHTML);
16972 showHTMLbuttons();
16973 cptBob++;
16974 playSound ('Button.mp3?v=2');
16975} 
16976function showMsgJoueur(idFrom,pseudo,date,msg,image)
16977{
16978 var from = idFrom;
16979 //sendJoueurMessage (txt,idUtil)
16980 var resHTML = '<form class="feedback_form formChaMP privateMessageDialog mates'+idFrom+'" onsubmit="return false;">';
16981 resHTML +='<section class="privateMessageCard'+(idFrom==-1?' privateMessageCard--system':'')+'">';
16982 if (idFrom!=-1) {
16983 resHTML +='<header class="privateMessageHeader">';
16984 resHTML +='<img class="button MPAvat privateMessageAvatar" onclick="return showFicheJoueurDyn(\''+pseudo+'\');" src="'+image+'" alt="Voir la fiche de ce joueur"/>';
16985 resHTML +='<time class="privateMessageDate">'+date+'</time>';
16986 resHTML +='</header>';
16987 resHTML +='<section class="privateMessageContent">'+msg+'</section>';
16988 resHTML +='</section>';
16989 } else {
16990 resHTML +='<header class="privateMessageHeader"><time class="privateMessageDate">'+date+'</time></header>';
16991 resHTML +='<section class="privateMessageContent">'+msg+'</section>';
16992 resHTML +='</section>';
16993 }
16994 if (idFrom!=-1) {
16995 resHTML +='<div class="privateMessageReply">';
16996 resHTML +='<label class="privateMessageReplyLabel" for="replyTo'+idFrom+'_'+cptBob+'">Votre r&eacute;ponse</label>';
16997 resHTML +='<div class="htmlbutt" idTxt="replyTo'+idFrom+'_'+cptBob+'"></div>';
16998 resHTML +='<textarea class="replyTB modeTextArea" id="replyTo'+idFrom+'_'+cptBob+'" aria-label="Votre r&eacute;ponse"></textarea><div class="clear"></div>';
16999 resHTML +='</div>';
17000 resHTML +='<input class="btn btn-success ptobt pbtn" type="button" value="Répondre" onclick="sendJoueurMessage ($$(\'replyTo'+from+'_'+cptBob+'\').value,'+from+',true);parentHide($(this));" />';
17001 } else {
17002 //resHTML +='<a class="btn btn-success ptobt pbtn" href="/Contact-organisation-jeu-de-tarot.php" />Répondre</a>';
17003 }
17004 resHTML +='<input class="btn btn-info ptobt pbtn" type="button" value="Fermer" onclick="parentHide($(this));" />';
17005 if (idFrom!=-1)
17006 resHTML +='<input class="btn btn-danger ptobt pbtn" type="button" value="Blocage" onclick="signalerJoueur ('+idFrom+',\''+pseudo+'\');parentHide($(this));" />';
17007 resHTML +='</form>';
17008 if (idFrom!=-1) {
17009 showBigDialog('Message de '+pseudo,resHTML);
17010 showHTMLbuttons();
17011 } else {
17012 showBigDialog('Notification',resHTML);
17013 }
17014 cptBob++;
17015 playSound ('Button.mp3?v=2');
17016} 
17017
17018var audioElement = []; 
17019var previewSound = false;
17020
17021function setMusicListVisibility() {
17022 if ($('#toggleSounds').is(":checked") && $('#toggleMusic').is(":checked")) {
17023 $('#musicList').show();
17024 } else {
17025 $('#musicList').hide();
17026 }
17027}
17028function playSoundEffect (soundName,createNew,volume) {
17029 if (!gameSoundsEnabled) return;
17030 playSound (soundName,createNew,volume);
17031}
17032function playSound (soundName,createNew,volume) {
17033 if (document.getElementById('soundEnabled')==null) return;
17034 if (document.getElementById('soundEnabled').value!='1') return;
17035 if (createNew) {
17036
17037 var eltAudio = document.createElement('audio');
17038 eltAudio.setAttribute('src', '/img/Sounds/'+soundName);
17039 eltAudio.setAttribute('autoplay', 'autoplay');
17040 if (volume)
17041 eltAudio.volume = volume; 
17042 else
17043 eltAudio.volume = 0.7; 
17044 eltAudio.addEventListener("load", function() {
17045 eltAudio.play();
17046 }, true);
17047 eltAudio.onended = function(){
17048 try {
17049 eltAudio.remove() //Remove when played.
17050 } catch (e) {}
17051 };
17052 return;
17053 }
17054 if (audioElement[soundName] == null) {
17055 audioElement[soundName] = document.createElement('audio');
17056 audioElement[soundName].setAttribute('src', '/img/Sounds/'+soundName);
17057 audioElement[soundName].setAttribute('autoplay', 'autoplay');
17058 audioElement[soundName].addEventListener("load", function() {
17059 audioElement[soundName].play();
17060 }, true);
17061 } else {
17062 try {
17063 audioElement[soundName].stop();
17064 audioElement[soundName].currentTime = 0;
17065 } catch (e) {};
17066 try {
17067 audioElement[soundName].play();
17068 } catch (e) {}
17069 }
17070}
17071var TOpreviewSoundStop;
17072function previewSoundStop(soundName) {
17073 previewSound.volume = 0;
17074 try {
17075 previewSound.stop();
17076 } catch (e) {};
17077}
17078function previewSoundFile(soundName) {
17079 clearTimeout(TOpreviewSoundStop);
17080 if (previewSound ) {
17081 try {
17082 previewSound.stop();
17083 previewSound.currentTime = 0;
17084 } catch (e) {};
17085 } else {
17086 previewSound = document.createElement('audio');
17087 }
17088 previewSound.volume = 1;
17089 previewSound.autoplay = true;
17090 previewSound.src = '/img/Sounds/Music/'+soundName+'.mp3';
17091 previewSound.addEventListener("load", function() {
17092 previewSound.play();
17093 }, true);
17094 TOpreviewSoundStop = setTimeout(previewSoundStop,5000);
17095}
17096
17097var bgAudio;
17098var musicList;
17099function setMusicList(list) {
17100 musicList = list;
17101}
17102function playMusic(){
17103 if (document.getElementById('soundEnabled')==null) return;
17104 if (document.getElementById('soundEnabled').value!='1') return;
17105 if (!gameSoundsEnabled) return;
17106 if (!isMusicEnabledGame) return;
17107
17108 var tabMusic = musicList.split('_');
17109 var choice = Math.floor(Math.random()*tabMusic.length);
17110 
17111 bgAudio = document.createElement('audio');
17112 bgAudio.style.display = "none";
17113 bgAudio.src = '/img/Sounds/Music/'+tabMusic[choice]+'.mp3';
17114 bgAudio.volume = 0; 
17115 bgAudio.autoplay = true;
17116 bgAudio.onended = function(){
17117 try {
17118 var Newchoice = Math.floor(Math.random()*tabMusic.length);
17119 bgAudio.src = '/img/Sounds/Music/'+tabMusic[Newchoice]+'.mp3';
17120 bgAudio.currentTime = 0;
17121 bgAudio.play();
17122 } catch (e) {};
17123 };
17124 document.body.appendChild(bgAudio);
17125 tweenBgAudioVolume();
17126
17127 if (gcookie('muteMusic')=='1') toggleSound();
17128}
17129function tweenBgAudioVolume () {
17130 if (!gameSoundsEnabled) return;
17131 if (bgAudio.volume>0.3) return;
17132 
17133 bgAudio.volume = bgAudio.volume+1/100;
17134 setTimeout(tweenBgAudioVolume,1000/15);
17135}
17136var gameHasStarted = false;
17137function notifStart() {
17138 if (gameHasStarted) return;
17139 gameHasStarted = true;
17140 var dureeAttente = debutAttentePartie !== null ? Date.now() - debutAttentePartie : 0;
17141 var nombreCoups = dureeAttente > 900000 ? 4 : (dureeAttente > 600000 ? 3 : 2);
17142 debutAttentePartie = null;
17143 if (dureeAttente > 300000 && !window.isOffLineGame) jouerCarillonDepart(nombreCoups);
17144 else playSound ('Button.mp3?v=2');
17145}
17146function stopSound() {
17147 audioElement.pause();
17148 audioElement = null;
17149 //$(audioElement).remove();
17150}
17151function setNoSound(noSound) {
17152 if (String(noSound) !== '1') arreterCarillonDepart();
17153 if (document.getElementById('soundEnabled')==null) return;
17154 document.getElementById('soundEnabled').value=noSound;
17155}
17156var isMusicEnabledGame = false;
17157function enableMusicG() {
17158 isMusicEnabledGame = true;
17159 playMusic();
17160}
17161
17162
17163var joueurNavigationMobileIndex = 0;
17164function initJoueurNavigationMobile()
17165{
17166 var navigations = document.querySelectorAll('.joueurNavigation:not(.joueurNavigation--popup)');
17167 for (var navigationIndex=0;navigationIndex<navigations.length;navigationIndex++) {
17168 var navigation = navigations[navigationIndex];
17169 if (navigation.querySelector('.joueurNavigationMobile')) continue;
17170
17171 var select = document.createElement('select');
17172 var selectId = 'joueurNavigationMobileSelect'+(++joueurNavigationMobileIndex);
17173 var targets = [];
17174 var activeValue = null;
17175 select.id = selectId;
17176 select.className = 'joueurNavigationMobile joueurNavigationMobile__select form-control';
17177 select.setAttribute('aria-label','Choisir une rubrique de la fiche joueur');
17178
17179 for (var groupIndex=0;groupIndex<navigation.children.length;groupIndex++) {
17180  var group = navigation.children[groupIndex];
17181  if (!$(group).hasClass('joueurNavigation__groupe')) continue;
17182  var title = group.querySelector('.joueurNavigation__titre');
17183  var links = group.querySelectorAll('.joueurNavigation__liens > a.btn');
17184  if (!title || !links.length) continue;
17185
17186  var optionGroup = document.createElement('optgroup');
17187  optionGroup.label = $.trim(title.textContent || title.innerText || '');
17188  for (var linkIndex=0;linkIndex<links.length;linkIndex++) {
17189  var link = links[linkIndex];
17190  var option = document.createElement('option');
17191  option.value = ''+targets.length;
17192  option.text = link.hasAttribute('data-gift-nav') ? link.getAttribute('aria-label') : $.trim((link.textContent || link.innerText || '').replace(/\s+/g,' '));
17193  if (activeValue===null && $(link).hasClass('btn-info')) {
17194   activeValue = option.value;
17195   option.selected = true;
17196  }
17197  targets.push(link);
17198  optionGroup.appendChild(option);
17199  }
17200  select.appendChild(optionGroup);
17201 }
17202 if (!targets.length) continue;
17203 if (activeValue===null) {
17204  activeValue = '0';
17205  select.value = activeValue;
17206 }
17207 select.setAttribute('data-current-value',activeValue);
17208 select._joueurNavigationTargets = targets;
17209 select.onchange = function () {
17210  var previousValue = this.getAttribute('data-current-value');
17211  var target = this._joueurNavigationTargets[parseInt(this.value,10)];
17212  if (target) target.click();
17213  if (document.documentElement.contains(this)) {
17214  this.value = previousValue;
17215  this.blur();
17216  }
17217 };
17218
17219 navigation.insertBefore(select,navigation.firstChild);
17220 $(navigation).addClass('joueurNavigation--mobileReady');
17221 }
17222}
17223$(function () {
17224 initJoueurNavigationMobile();
17225 $(document).off('ajaxComplete.joueurNavigationMobile').on('ajaxComplete.joueurNavigationMobile',function () {
17226 initJoueurNavigationMobile();
17227 });
17228});
17229function seeUtilisateur(pseudo,params)
17230{
17231 showPleaseWait();
17232 ajax('/workers/joueur.php?joueur='+pseudo,params, clstCallback);
17233 return false;
17234} 
17235function showFicheJoueur (pseudo) {
17236 showPleaseWait();
17237 ajax('/workers/joueur.php?joueur='+pseudo,'', clstCallback);
17238 return false;
17239} 
17240function showFicheJoueurDyn (pseudo) {
17241
17242 showPleaseWait();
17243 ajax('/workers/joueur.php?joueur='+pseudo,'', clstCallback);
17244}
17245
17246function showInfoJoueur(from,date,msg)
17247{
17248 //sendJoueurMessage (txt,idUtil)
17249 var resHTML = '<form onsubmit="return false;">'+msg;
17250 resHTML +='<br /><br />';
17251 //resHTML +='<textarea id="replyTo'+from+'_'+cptBob+'"></textarea>';
17252 resHTML +='<input class="btn btn-lg btn-default ptobt pbtn" type="button" value="OK" onclick="parentHide($(this));" />';
17253 resHTML +='</form>';
17254 if (dialogFocusIsTextEntry(document.activeElement))
17255 announceAsyncStatus('Message de jeu - '+date,msg);
17256 showDialog('Message de jeu - '+date,resHTML);//date+"<br>"+
17257 cptBob++;
17258}
17259
17260function showBigInfoJoueur(from,date,msg)
17261{
17262 //sendJoueurMessage (txt,idUtil)
17263 var resHTML = '<form onsubmit="return false;">'+msg;
17264 resHTML +='<br /><br />';
17265 //resHTML +='<textarea id="replyTo'+from+'_'+cptBob+'"></textarea>';
17266 resHTML +='<input class="btn btn-lg btn-default ptobt pbtn" type="button" value="OK" onclick="parentHide($(this));" />';
17267 resHTML +='</form>';
17268 if (dialogFocusIsTextEntry(document.activeElement))
17269 announceAsyncStatus('Message de jeu - '+date,msg);
17270 showBigDialog('Message de jeu - '+date,resHTML);//date+"<br>"+
17271 cptBob++;
17272}
17273function cleanID(id) {
17274 id = id.toUpperCase();
17275 id = id.replace( /\t/ , "");
17276 id = id.replace( /\n/ , "");
17277 id = id.replace( /\r/ , "");
17278 id = id.replace( /\b/ , "");
17279 id = id.replace( /\f/ , "");
17280 return id.replace( /[^a-zA-Z0-9]/ , "");
17281}
17282
17283var dialogNum = 0;
17284var fifodlg = [];
17285function dialogFocusIsTextEntry(element)
17286{
17287 if (!element || element.disabled || element.readOnly) return false;
17288 var tagName = String(element.tagName || '').toLowerCase();
17289 return tagName=='textarea' ||
17290 (tagName=='input' && String(element.type || 'text').toLowerCase()=='text');
17291}
17292function restoreDialogTextEntryFocus(element)
17293{
17294 if (!dialogFocusIsTextEntry(element)) return false;
17295 if (element!==document.body && !$.contains(document.documentElement,element)) return false;
17296 try {
17297 element.focus({preventScroll:true});
17298 return document.activeElement===element;
17299 } catch (e) {}
17300 return false;
17301}
17302function announceAsyncStatus(title,html)
17303{
17304 var status = document.getElementById('asyncStatus');
17305 if (!status) return;
17306
17307 var content = document.createElement('div');
17308 content.innerHTML = html || '';
17309 var message = (content.textContent || content.innerText || '')
17310 .replace(/\s+/g,' ')
17311 .replace(/^\s+|\s+$/g,'');
17312 var announcement = (title ? title+'. ' : '')+message;
17313
17314 status.textContent = '';
17315 window.setTimeout(function () {
17316 status.textContent = announcement;
17317 },20);
17318}
17319function chkdlg() {
17320 if (fifodlg.length>0) {
17321 if ($('.dialogBox:visible').length==0) {
17322 var ell = fifodlg.shift();
17323 showDialog(ell.title,ell.html);
17324 }
17325
17326 setTimeout(chkdlg,2000);
17327 }
17328}
17329function showWorkerDialog(page,params,title) {
17330 ajax('/workers/'+page+'.php', params, function (html) {
17331 showDialog(title,html);
17332 });
17333}
17334function showDialog(title,html)
17335{
17336 dialogNum++;
17337 var dlgID = dialogNum+"IQQ";
17338 var previousFocus = document.activeElement;
17339 var preserveTextEntryFocus = dialogFocusIsTextEntry(previousFocus);
17340 var dialog = document.createElement('div');
17341 dialog.id = 'myDialog'+dlgID;
17342 dialog.className = 'dialogBox';
17343 dialog.innerHTML = html;
17344 dialog.title = title;
17345 document.body.appendChild(dialog);
17346 $("#myDialog"+dlgID).dialog({ autoOpen: false});
17347 $("#myDialog"+dlgID).dialog('open');
17348 if (preserveTextEntryFocus)
17349 restoreDialogTextEntryFocus(previousFocus);
17350 return "myDialog"+dlgID; 
17351}
17352function closeDlgs() {
17353 $('#infoBB').remove();
17354 $('.contMain').show();
17355}
17356function showBigDialog_testNew(title,html)
17357{
17358 $('.contMain').hide();
17359 $('#infoBB').remove();
17360 var close = '<img onclick="closeDlgs();" style="float:right;margin-top:4px;" src="/images/Close.png" alt="Fermer">';
17361 $('.contMain').before('<div id="infoBB" class="container ccontMain"><div class="row"><div class="box">'+title+close+'<br>'+html+'</div></div></div>');
17362 return;
17363}
17364function showBigDialog(title,html)
17365{
17366 dialogNum++;
17367 var dlgID = dialogNum+"I";
17368 var dialogID = 'myDialog'+dlgID;
17369 var eventNamespace = '.bigDialog'+dlgID;
17370 var previousFocus = document.activeElement;
17371 var preserveTextEntryFocus = dialogFocusIsTextEntry(previousFocus);
17372 var isClosed = false;
17373 var widgetNode = null;
17374 var tabBoundaryHandler = null;
17375 var expandedDialogInlineHeight = '';
17376 var $autoTextarea = $();
17377 var textareaVerticalSpace = null;
17378 var textareaExtraHeight = 0;
17379 var textareaMinHeight = 0;
17380 var dialog = document.createElement('div');
17381 dialog.id = dialogID;
17382 dialog.className = 'dialogBox';
17383 dialog.innerHTML = html;
17384 dialog.title = title;
17385 document.body.appendChild(dialog);
17386 var $dialog = $('#'+dialogID);
17387
17388 function setDialogCollapsed(collapsed) {
17389 if (!widgetNode) return;
17390 var $widget = $(widgetNode);
17391 var $titlebar = $widget.find('.ui-dialog-titlebar');
17392 var visibleTitle = $widget.find('.ui-dialog-title').text() || title;
17393 var wasCollapsed = $widget.hasClass('bigDialogCollapsed');
17394 if (collapsed && !wasCollapsed)
17395 expandedDialogInlineHeight = widgetNode.style.height || '';
17396 $widget.toggleClass('bigDialogCollapsed',collapsed);
17397 if (!collapsed && wasCollapsed)
17398 widgetNode.style.height = expandedDialogInlineHeight;
17399 $titlebar.attr({
17400 'aria-label':visibleTitle+'. Fenetre deplacable avec Alt et les fleches. ' +
17401 (collapsed ?
17402 'Boite reduite. Cliquez ou appuyez sur Entree ou Espace pour afficher son contenu.' :
17403 'Cliquez ou appuyez sur Entree ou Espace pour reduire la boite.'),
17404 'aria-expanded':collapsed ? 'false' : 'true',
17405 title:collapsed ?
17406 'Cliquer pour afficher le contenu' :
17407 'Cliquer pour reduire la boite. Alt + fleches pour la deplacer'
17408 });
17409 if (!collapsed)
17410 window.setTimeout(function () {
17411 syncTextareaHeight();
17412 keepInViewport();
17413 },0);
17414 }
17415
17416 function setTextareaHeight(height) {
17417 if (!$autoTextarea.length) return;
17418 var node = $autoTextarea[0];
17419 var value = Math.max(textareaMinHeight,height)+'px';
17420 if (node.style.setProperty)
17421 node.style.setProperty('height',value,'important');
17422 else {
17423 var cssText = node.style.cssText.replace(/(^|;)\s*height\s*:[^;]*/ig,'');
17424 node.style.cssText = cssText+';height:'+value+' !important;';
17425 }
17426 }
17427
17428 function prepareAutoTextarea() {
17429 var $textareas = $dialog.find('textarea:visible');
17430 $dialog.find('textarea').css({
17431 boxSizing:'border-box',
17432 width:'100%',
17433 resize:'none'
17434 });
17435 if ($textareas.length!==1) return;
17436
17437 $autoTextarea = $textareas.eq(0);
17438 var outerHeight = $autoTextarea.outerHeight(true);
17439 textareaExtraHeight = outerHeight-$autoTextarea.height();
17440 textareaVerticalSpace = Math.max(0,$dialog.innerHeight()-outerHeight);
17441 textareaMinHeight = parseFloat($autoTextarea.css('min-height')) || 40;
17442 syncTextareaHeight();
17443 }
17444
17445 function syncTextareaHeight() {
17446 if (!$autoTextarea.length || textareaVerticalSpace===null) return;
17447 var availableOuterHeight = $dialog.innerHeight()-textareaVerticalSpace;
17448 setTextareaHeight(availableOuterHeight-textareaExtraHeight);
17449 }
17450
17451 function keepInViewport() {
17452 if (!document.getElementById(dialogID)) return;
17453 var $widget = $dialog.dialog('widget');
17454 var offset = $widget.offset();
17455 var scrollLeft = $(window).scrollLeft();
17456 var scrollTop = $(window).scrollTop();
17457 var viewportWidth = $(window).width() || document.documentElement.clientWidth;
17458 var viewportHeight = $(window).height() || document.documentElement.clientHeight;
17459 var maxLeft = scrollLeft+viewportWidth-$widget.outerWidth();
17460 var maxTop = scrollTop+viewportHeight-$widget.outerHeight();
17461 var left = Math.max(scrollLeft,Math.min(offset.left,Math.max(scrollLeft,maxLeft)));
17462 var top = Math.max(scrollTop,Math.min(offset.top,Math.max(scrollTop,maxTop)));
17463 $widget.css({left:left+'px',top:top+'px'});
17464 }
17465
17466 function restoreFocusAndRemove() {
17467 if (isClosed) return;
17468 isClosed = true;
17469 var $widget = $();
17470 try { $widget = $dialog.dialog('widget'); } catch (e) {}
17471 if (widgetNode && tabBoundaryHandler) {
17472 if (widgetNode.removeEventListener)
17473 widgetNode.removeEventListener('keydown',tabBoundaryHandler,true);
17474 else if (widgetNode.detachEvent)
17475 widgetNode.detachEvent('onkeydown',tabBoundaryHandler);
17476 }
17477 $(window).off(eventNamespace);
17478 window.setTimeout(function () {
17479 try { $dialog.dialog('destroy'); } catch (e) {}
17480 $widget.remove();
17481 $dialog.remove();
17482 if (previousFocus && typeof previousFocus.focus==='function') {
17483 try { previousFocus.focus(); } catch (e) {}
17484 }
17485 },0);
17486 }
17487
17488 var ww = $(window).width();
17489 if (ww>250) ww=250;
17490 $dialog.dialog({
17491 dialogClass:'bigDialog qsdqsdqsd'+dialogNum,
17492 autoOpen:false,
17493 modal:false,
17494 draggable:true,
17495 resizable:true,
17496 minWidth:ww+'px',
17497 width:'550px',
17498 position:{my:'center',at:'center',of:window},
17499 dragStop:function () {
17500 var $widget = $dialog.dialog('widget');
17501 if ($widget.hasClass('bigDialogCollapsed'))
17502 widgetNode.style.height = 'auto';
17503 keepInViewport();
17504 },
17505 resize:function () {
17506 syncTextareaHeight();
17507 },
17508 resizeStop:function () {
17509 syncTextareaHeight();
17510 },
17511 open:function () {
17512 var $widget = $dialog.dialog('widget');
17513 var $titlebar = $widget.find('.ui-dialog-titlebar');
17514 var $closeButton = $widget.find('.ui-dialog-titlebar-close');
17515 var visibleTitle = $widget.find('.ui-dialog-title').text() || title;
17516
17517 widgetNode = $widget[0];
17518 tabBoundaryHandler = function (event) {
17519 event = event || window.event;
17520 var key = event.which || event.keyCode;
17521 if (key!==9) return;
17522
17523 var $inside = $widget.find(':tabbable');
17524 if (!$inside.length) return;
17525 var source = event.target || event.srcElement;
17526 var first = $inside[0];
17527 var last = $inside[$inside.length-1];
17528 var target = null;
17529 var $outside = $('body').find(':tabbable').filter(function () {
17530 return this!==widgetNode && !$.contains(widgetNode,this);
17531 });
17532
17533 if (!$outside.length) return;
17534 if (event.shiftKey && source===first)
17535 target = $outside[$outside.length-1];
17536 else if (!event.shiftKey && source===last)
17537 target = $outside[0];
17538 if (!target) return;
17539
17540 if (event.preventDefault) event.preventDefault();
17541 else event.returnValue = false;
17542 if (event.stopImmediatePropagation) event.stopImmediatePropagation();
17543 else if (event.stopPropagation) event.stopPropagation();
17544 else event.cancelBubble = true;
17545 try { target.focus(); } catch (e) {}
17546 };
17547 if (widgetNode.addEventListener)
17548 widgetNode.addEventListener('keydown',tabBoundaryHandler,true);
17549 else if (widgetNode.attachEvent)
17550 widgetNode.attachEvent('onkeydown',tabBoundaryHandler);
17551
17552 $widget.attr('role','dialog').removeAttr('aria-modal');
17553 $titlebar.attr({
17554 tabindex:'0'
17555 });
17556 $closeButton.attr({
17557 'aria-label':'Fermer '+visibleTitle,
17558 title:'Fermer'
17559 });
17560 if (!$titlebar.find('.bigDialogChevron').length)
17561 $titlebar.prepend('<span class="bigDialogChevron" aria-hidden="true"></span>');
17562 setDialogCollapsed(false);
17563
17564 try {
17565 if ($widget.hasClass('ui-draggable'))
17566 $widget.draggable('option','containment','window');
17567 } catch (e) {}
17568
17569 $widget.off('click'+eventNamespace).on('click'+eventNamespace,function (event) {
17570 if (!$(event.target).closest('.ui-dialog-titlebar').length) return;
17571 if ($(event.target).closest('.ui-dialog-titlebar-close').length) return;
17572 setDialogCollapsed(!$widget.hasClass('bigDialogCollapsed'));
17573 });
17574
17575 $titlebar.off('keydown'+eventNamespace).on('keydown'+eventNamespace,function (event) {
17576 var key = event.which || event.keyCode;
17577 if (!event.altKey && (key===13 || key===32)) {
17578 if ($(event.target).closest('.ui-dialog-titlebar-close').length) return;
17579 setDialogCollapsed(!$widget.hasClass('bigDialogCollapsed'));
17580 event.preventDefault();
17581 return;
17582 }
17583 if (!event.altKey || key<37 || key>40) return;
17584 var step = event.shiftKey ? 30 : 10;
17585 var left = parseFloat($widget.css('left')) || 0;
17586 var top = parseFloat($widget.css('top')) || 0;
17587 if (key===37) left -= step;
17588 if (key===38) top -= step;
17589 if (key===39) left += step;
17590 if (key===40) top += step;
17591 $widget.css({left:left+'px',top:top+'px'});
17592 keepInViewport();
17593 event.preventDefault();
17594 });
17595
17596 $widget.off('mousedown'+eventNamespace+' focusin'+eventNamespace)
17597 .on('mousedown'+eventNamespace+' focusin'+eventNamespace,function () {
17598 try { $dialog.dialog('moveToTop'); } catch (e) {}
17599 });
17600
17601 keepInViewport();
17602 window.setTimeout(function () {
17603 if (!document.getElementById(dialogID)) return;
17604 prepareAutoTextarea();
17605 var activeElement = document.activeElement;
17606 if (dialogFocusIsTextEntry(activeElement) && $.contains($dialog[0],activeElement)) return;
17607 if (preserveTextEntryFocus && restoreDialogTextEntryFocus(previousFocus)) return;
17608 var $target = $dialog.find(
17609 '[autofocus],input:not([type="hidden"]):enabled,textarea:enabled,' +
17610 'select:enabled,button:enabled,a[href]'
17611 ).filter(':visible').first();
17612 if ($target.length)
17613 $target.focus();
17614 else
17615 $closeButton.focus();
17616 },0);
17617 },
17618 close:function () {
17619 restoreFocusAndRemove();
17620 }
17621 });
17622
17623 $dialog.dialog('open');
17624 if (preserveTextEntryFocus)
17625 restoreDialogTextEntryFocus(previousFocus);
17626 $dialog.dialog('widget').css('min-width',ww+'px');
17627 $(window).off('resize'+eventNamespace).on('resize'+eventNamespace,function () {
17628 if (!document.getElementById(dialogID)) {
17629 $(window).off(eventNamespace);
17630 return;
17631 }
17632 keepInViewport();
17633 });
17634 return dialogID;
17635}
17636function closeDialog(id)
17637{
17638 $('#'+id).dialog('close');
17639 $('#'+id).remove();
17640}
17641
17642
17643
17644
17645
17646
17647
17648function HTMLbuttonCode(id) {
17649 const editorId = escapeHTMLAttribute(id);
17650
17651 return `
17652 <div
17653 class="html-editor-toolbar"
17654 data-editor-id="${editorId}"
17655 role="toolbar"
17656 aria-label="Mise en forme du message"
17657 >
17658 <div class="html-editor-toolbar__group">
17659 <button
17660 type="button"
17661 class="html-editor-toolbar__button html-editor-toolbar__button--text"
17662 data-command="bold"
17663 title="Mettre en gras"
17664 aria-label="Mettre en gras"
17665 >
17666 <strong>B</strong>
17667 </button>
17668
17669 <button
17670 type="button"
17671 class="html-editor-toolbar__button html-editor-toolbar__button--text"
17672 data-command="italic"
17673 title="Mettre en italique"
17674 aria-label="Mettre en italique"
17675 >
17676 <em>I</em>
17677 </button>
17678
17679 <button
17680 type="button"
17681 class="html-editor-toolbar__button html-editor-toolbar__button--text"
17682 data-command="underline"
17683 title="Souligner"
17684 aria-label="Souligner"
17685 >
17686 <span class="html-editor-toolbar__underline">U</span>
17687 </button>
17688 </div>
17689
17690 <div class="html-editor-toolbar__separator"></div>
17691
17692 <div class="html-editor-toolbar__group">
17693 <button
17694 type="button"
17695 class="html-editor-toolbar__button"
17696 data-command="table"
17697 title="Insérer un tableau"
17698 aria-label="Insérer un tableau"
17699 >
17700 <span class="html-editor-toolbar__table-icon" aria-hidden="true">
17701 <span></span><span></span><span></span>
17702 <span></span><span></span><span></span>
17703 </span>
17704 </button>
17705 </div>
17706
17707 <div class="html-editor-toolbar__separator"></div>
17708
17709 <div class="html-editor-toolbar__group">
17710 <button
17711 type="button"
17712 class="html-editor-toolbar__button html-editor-toolbar__button--suit html-editor-toolbar__button--heart"
17713 data-command="heart"
17714 title="Insérer un coeur"
17715 aria-label="Insérer un coeur"
17716 >
17717 &hearts;
17718 </button>
17719
17720 <button
17721 type="button"
17722 class="html-editor-toolbar__button html-editor-toolbar__button--suit html-editor-toolbar__button--club"
17723 data-command="club"
17724 title="Insérer un trèfle"
17725 aria-label="Insérer un trèfle"
17726 >
17727 &clubs;
17728 </button>
17729
17730 <button
17731 type="button"
17732 class="html-editor-toolbar__button html-editor-toolbar__button--suit html-editor-toolbar__button--diamond"
17733 data-command="diamond"
17734 title="Insérer un carreau"
17735 aria-label="Insérer un carreau"
17736 >
17737 &diams;
17738 </button>
17739
17740 <button
17741 type="button"
17742 class="html-editor-toolbar__button html-editor-toolbar__button--suit html-editor-toolbar__button--spade"
17743 data-command="spade"
17744 title="Insérer un pique"
17745 aria-label="Insérer un pique"
17746 >
17747 &spades;
17748 </button>
17749 </div>
17750
17751 <div class="html-editor-toolbar__separator"></div>
17752
17753 <div class="html-editor-toolbar__group">
17754 <button
17755 type="button"
17756 class="html-editor-toolbar__button html-editor-toolbar__button--card"
17757 data-command="card"
17758 title="Inserer une carte"
17759 aria-label="Inserer une carte"
17760 aria-expanded="false"
17761 >
17762 <span class="html-editor-toolbar__card-icon" aria-hidden="true"></span>
17763 </button>
17764
17765 <button
17766 type="button"
17767 class="html-editor-toolbar__button html-editor-toolbar__button--game"
17768 data-command="game"
17769 title="Inserer une partie"
17770 aria-label="Inserer une partie"
17771 >
17772 <span class="glyphicon glyphicon-tower" aria-hidden="true"></span>
17773 </button>
17774 <button
17775 type="button"
17776 class="html-editor-toolbar__button html-editor-toolbar__button--player"
17777 data-command="player"
17778 title="Insérer un joueur"
17779 aria-label="Insérer un joueur"
17780 >
17781 <span class="html-editor-toolbar__player-icon" aria-hidden="true"></span>
17782 </button>
17783 </div>
17784 </div>
17785 `;
17786}
17787
17788
17789/**
17790* Évite qu'un identifiant contenant certains caractères
17791* ne casse le HTML généré.
17792*/
17793function escapeHTMLAttribute(value) {
17794 return String(value)
17795 .replace(/&/g, '&amp;')
17796 .replace(/"/g, '&quot;')
17797 .replace(/</g, '&lt;')
17798 .replace(/>/g, '&gt;');
17799}
17800
17801
17802/**
17803* Entoure la sélection avec deux balises.
17804*
17805* Exemple :
17806* texte sélectionné -> <b>texte sélectionné</b>
17807*/
17808function wrapEditorSelection(editor, openingTag, closingTag) {
17809 if (!editor) {
17810 return;
17811 }
17812
17813 const start = typeof editor.selectionStart === 'number'
17814 ? editor.selectionStart
17815 : editor.value.length;
17816
17817 const end = typeof editor.selectionEnd === 'number'
17818 ? editor.selectionEnd
17819 : start;
17820
17821 const selectedText = editor.value.substring(start, end);
17822 const scrollTop = editor.scrollTop;
17823
17824 const replacement = openingTag + selectedText + closingTag;
17825
17826 editor.value =
17827 editor.value.substring(0, start) +
17828 replacement +
17829 editor.value.substring(end);
17830
17831 editor.focus();
17832
17833 if (selectedText.length > 0) {
17834 /*
17835 * Le texte reste sélectionné, sans sélectionner les balises.
17836 * Cela permet d'enchaîner plusieurs formats.
17837 */
17838 editor.setSelectionRange(
17839 start + openingTag.length,
17840 start + openingTag.length + selectedText.length
17841 );
17842 } else {
17843 /*
17844 * Sans sélection, le curseur est placé entre les balises.
17845 */
17846 const cursorPosition = start + openingTag.length;
17847 editor.setSelectionRange(cursorPosition, cursorPosition);
17848 }
17849
17850 editor.scrollTop = scrollTop;
17851 triggerEditorInput(editor);
17852}
17853
17854
17855/**
17856* Insère du contenu à la position du curseur.
17857* Une éventuelle sélection est remplacée.
17858*/
17859function insertIntoEditor(editor, text) {
17860 if (!editor) {
17861 return;
17862 }
17863
17864 const start = typeof editor.selectionStart === 'number'
17865 ? editor.selectionStart
17866 : editor.value.length;
17867
17868 const end = typeof editor.selectionEnd === 'number'
17869 ? editor.selectionEnd
17870 : start;
17871
17872 const scrollTop = editor.scrollTop;
17873
17874 editor.value =
17875 editor.value.substring(0, start) +
17876 text +
17877 editor.value.substring(end);
17878
17879 const cursorPosition = start + text.length;
17880
17881 editor.focus();
17882 editor.setSelectionRange(cursorPosition, cursorPosition);
17883 editor.scrollTop = scrollTop;
17884
17885 triggerEditorInput(editor);
17886}
17887
17888
17889/**
17890* Déclenche l'événement input pour que les éventuels compteurs,
17891* sauvegardes automatiques ou autres traitements soient avertis.
17892*/
17893function triggerEditorInput(editor) {
17894 let event;
17895
17896 if (typeof Event === 'function') {
17897 event = new Event('input', {
17898 bubbles: true
17899 });
17900 } else {
17901 // Compatibilité avec certains anciens navigateurs.
17902 event = document.createEvent('Event');
17903 event.initEvent('input', true, true);
17904 }
17905
17906 editor.dispatchEvent(event);
17907}
17908
17909
17910/*
17911* Contenu inséré par le bouton tableau.
17912* Les balises acceptées restent identiques à celles de l'ancien code.
17913*/
17914const HTML_EDITOR_TABLE = [
17915 '<table>',
17916 '<tr><td>Col 1</td><td>Col 2</td><td>Col 3</td></tr>',
17917 '<tr><td>Col 1</td><td>Col 2</td><td>Col 3</td></tr>',
17918 '</table>'
17919].join('\r\n');
17920
17921
17922/*
17923* On empêche les boutons de voler le focus du textarea.
17924* Cela permet de conserver correctement la sélection.
17925*/
17926document.addEventListener('mousedown', function (event) {
17927 const button = event.target.closest('.html-editor-toolbar__button');
17928
17929 if (button) {
17930 event.preventDefault();
17931 }
17932});
17933
17934
17935/*
17936* Un seul gestionnaire pour toutes les barres d'outils,
17937* y compris celles ajoutées dynamiquement après le chargement.
17938*/
17939document.addEventListener('click', function (event) {
17940 const button = event.target.closest('.html-editor-toolbar__button');
17941
17942 if (!button) {
17943 return;
17944 }
17945
17946 const toolbar = button.closest('.html-editor-toolbar');
17947
17948 if (!toolbar) {
17949 return;
17950 }
17951
17952 const editorId = toolbar.getAttribute('data-editor-id');
17953 const editor = document.getElementById(editorId);
17954 const command = button.getAttribute('data-command');
17955
17956 if (!editor) {
17957 console.error(
17958 'Le champ associé à la barre outils est introuvable :',
17959 editorId
17960 );
17961 return;
17962 }
17963
17964 switch (command) {
17965 case 'bold':
17966 wrapEditorSelection(editor, '<b>', '</b>');
17967 break;
17968
17969 case 'italic':
17970 wrapEditorSelection(editor, '<i>', '</i>');
17971 break;
17972
17973 case 'underline':
17974 wrapEditorSelection(editor, '<u>', '</u>');
17975 break;
17976
17977 case 'table':
17978 insertIntoEditor(editor, HTML_EDITOR_TABLE);
17979 break;
17980
17981 case 'heart':
17982 insertIntoEditor(editor, '<coeur>');
17983 break;
17984
17985 case 'club':
17986 insertIntoEditor(editor, '<trefle>');
17987 break;
17988
17989 case 'diamond':
17990 insertIntoEditor(editor, '<carreau>');
17991 break;
17992
17993 case 'spade':
17994 insertIntoEditor(editor, '<pique>');
17995 break;
17996
17997 case 'card':
17998 if (window.ForumCardPicker) {
17999 window.ForumCardPicker.toggle(toolbar, editor, button);
18000 }
18001 break;
18002
18003 case 'game':
18004 if (typeof window.ouvrirRecherchePartie === 'function') {
18005 window.ouvrirRecherchePartie({
18006 editorId:editorId
18007 });
18008 } else {
18009 console.error('Le composant de recherche de partie est introuvable.');
18010 }
18011 break;
18012 case 'player':
18013 if (typeof openFriends === 'function') {
18014 openFriends(editorId);
18015 } else {
18016 console.error('La fonction openFriends() est introuvable.');
18017 }
18018 break;
18019 }
18020});
18021
18022
18023
18024
18025
18026
18027
18028function openFriends(id) {
18029
18030 $('#sear'+id).remove();
18031 var div = document.createElement('div');
18032 div.id = 'sear'+id;
18033 div.innerHTML = 'Chargement...';
18034 div.className = 'divFriendsForuum';
18035 $('#'+id).before(div);
18036 /*$(div).click(function () {
18037 $(this).remove();
18038 });*/
18039
18040 ajax('/workers/friendsListForum.php', 'id='+id, function (html) {
18041 div.innerHTML =html;//showDialog(title,html);
18042 });
18043}
18044function addJoueurLink(id, pseudo) {
18045 insertIntoEditor(document.getElementById(id), '@'+pseudo+' ');
18046}
18047function showHTMLbuttons() {
18048 $('div.htmlbutt').each(function () {
18049 var idtxt = $(this).attr("idTxt");
18050 var html = HTMLbuttonCode(idtxt);
18051 $(this).html(html);
18052 });
18053 
18054 /*<div onclick="$('#postSujet_txt').val($('#postSujet_txt').val()+'<b></b>');" style="float: left; margin-top: 2px;" unselectable="on">
18054<div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;http://js.nicedit.com/nicEditIcons-latest.gif&quot;); background-position: -54px 0px;" class=" nicEdit-button" unselectable="on"></div></div></div></div>
18055 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;http://js.nicedit.com/nicEditIcons-latest.gif&quot;); background-position: -126px 0px;" class=" nicEdit-button" unselectable="on"></div></div></div></div>
18056 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;http://js.nicedit.com/nicEditIcons-latest.gif&quot;); background-position: -342px 0px;" class=" nicEdit-button" unselectable="on"></div></div></div></div>
18057 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;/images/Couleurs/Table.png&quot;); class=" nicEdit-button" unselectable="on"></div></div></div></div>
18058 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;/images/Couleurs/HTML1.png&quot;); class=" nicEdit-button" unselectable="on"></div></div></div></div>
18059 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;/images/Couleurs/HTML2.png&quot;); class=" nicEdit-button" unselectable="on"></div></div></div></div>
18060 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;/images/Couleurs/HTML3.png&quot;); class=" nicEdit-button" unselectable="on"></div></div></div></div>
18061 <div style="float: left; margin-top: 2px;" unselectable="on"><div style="width: 20px; height: 20px;" class=" nicEdit-buttonContain" unselectable="on"><div style="background-color: rgb(239, 239, 239); border: 1px solid rgb(239, 239, 239);" class=" nicEdit-button-undefined" unselectable="on"><div style="width: 18px; height: 18px; overflow: hidden; cursor: pointer; background-image: url(&quot;/images/Couleurs/HTML4.png&quot;); class=" nicEdit-button" unselectable="on"></div></div></div></div>
18062*/
18063 //$('div.htmlbutt').html( htmlres );
18064}
18065
18066function privateStart()
18067{
18068 reinitialiserAlerteDepart();
18069 if (window.gameInitBeforeStartGame)
18070 window.gameInitBeforeStartGame();
18071 clearTimeout(salonTO);
18072 showPleaseWait("Chargement des ressources"); 
18073 
18074 if (ajaxCallXhr!=null) ajaxCallXhr.abort();
18075 // La requete annulee ne liberera plus la file de commandes.
18076 ajaxCallXhr = null;
18077 callStack = null;
18078 var d = new Date();
18079 dateDebutPartie = (d.getTime());
18080 
18081 clearTimeout(timeOutSleep);
18082 timeOutSleep = 0;
18083 dateStartProcessThread = null;
18084 estimatedLengthProcessThread = 0;
18085 nextDelayIsNull = 0;
18086 reinitialiserEtatPartie();
18087 //clearSounds();
18088 clearTO () ;
18089 cartesSurLeTapis = new Array();
18090 currentGameId = 0;
18091 
18092}
18093function launchGame(idPartie,gameMode)
18094{ 
18095 if (idPartie!=null && idPartie!=undefined ) {
18096
18097 privateStart();
18098 gamesStarted = function () {
18099 llog('launchGame '+idPartie);
18100 setGameMode(gameMode);
18101  rpc('etape=start&idPartie='+idPartie); 
18102 }
18103 checkWaitingStart();
18104 } 
18105}
18106function newGame (modeJeu,parametres)
18107{
18108 privateStart();
18109 // Un raccourci peut lancer une partie sans passer par la page Jouer.
18110 preloadStartGame();
18111 gamesStarted = function () {
18112 llog('newGame '+modeJeu);
18113 setGameMode(modeJeu);
18114 var requeteDemarrage = 'etape=start&modeJeu='+modeJeu;
18115 if (parametres) requeteDemarrage += '&'+parametres;
18116 rpc(requeteDemarrage);
18117 }
18118 checkWaitingStart();
18119} 
18120function startUnityGame(modeJeu,cookie,parametres) {
18121 window.vuplex.postMessage({ type: 'newGame', modeJeu: modeJeu, cookie
18121:cookie, parametres:parametres || '' });
18122}
18123function unityAvatar() {
18124 window.vuplex.postMessage({ type: 'openFile' });
18125}
18126function unityImageResult(b64i) {
18127 if (window.ProfilPersonnalisation && window.ProfilPersonnalisation.nativeImage(b64i)) return;
18128 $('.avatPreview').attr("src","data:image/jpeg;base64,"+b64i);
18129 $('#inputImgPreview').val(b64i);
18130 $('.avatPreview').css('max-width','250px');
18131 $('.avatPreview').css('max-height','150px');
18132 $('.avatPreview').show();
18133 $('#avatVPay').show();
18134 
18135}
18136function replayGameNew(modeJeu,params)
18137{
18138 //var modeJeu = 'CPU';
18139 privateStart();
18140 isReplayedGame = true;
18141 preloadStartGame();
18142 gamesStarted = function () {
18143 llog('Start replay');
18144 setGameMode(modeJeu);
18145 rpc('etape=start&modeJeu='+modeJeu+'&'+params);
18146 }
18147 checkWaitingStart();
18148} 
18149function replayGame(params)
18150{
18151 var modeJeu = 'CPU';
18152 privateStart();
18153 isReplayedGame = true;
18154 preloadStartGame();
18155 gamesStarted = function () {
18156 llog('Start replay');
18157 setGameMode(modeJeu);
18158 rpc('etape=start&modeJeu=CPU&'+params);
18159 }
18160 checkWaitingStart();
18161} 
18162
18163var gamesStarted = null;
18164
18165function checkWaitingStart()
18166{
18167 if (gamesStarted)
18168 showPleaseWait("Téléchargement des ressources graphiques..."); 
18169 if (gamesStarted && resDownloaded && phaserDownloaded) {
18170 showPleaseWait("Initialisation..."); 
18171 llog('Call moteur '+selMoteur.titreMoteur+' initengine');
18172 selMoteur.initEngine(gamesStarted);
18173 //gamesStarted();
18174 }
18175}
18176function changeOrganisationPartie() {
18177 var val = $('#idPartie').val();
18178 if (val!='0') {
18179 $('#persoOpts').hide();
18180 $('#titreOptOrg').hide(); 
18181 
18182 } else {
18183 $('#persoOpts').show();
18184 $('#titreOptOrg').show();
18185 }
18186}
18187function selectModeTxt(mode) {
18188 if (mode=='Tournoi')
18189 $('#h1Invit').html('Inviter des joueurs en Tournoi classique à 4');
18190 else if (mode=='Tournoi5')
18191 $('#h1Invit').html('Inviter des joueurs en Tournoi classique à 5');
18192 else if (mode=='Libre4')
18193 $('#h1Invit').html('Inviter des joueurs en Jeu libre à 4');
18194 else if (mode=='Libre5')
18195 $('#h1Invit').html('Inviter des joueurs en Jeu libre à 5');
18196 else if (mode=='Amical4')
18197 $('#h1Invit').html('Inviter des joueurs en Jeu amical à 4');
18198 else if (mode=='Amical5')
18199 $('#h1Invit').html('Inviter des joueurs en Jeu amical à 5');
18200 else if (mode=='Premium4')
18201 $('#h1Invit').html('Inviter des joueurs en partie premium à 4');
18202 else if (mode=='Premium5')
18203 $('#h1Invit').html('Inviter des joueurs en partie premium à 5');
18204 else if (mode=='5joueurs')
18205 $('#h1Invit').html('Inviter des joueurs en partie à 5 classée');
18206 else if (mode=='DonneFixe')
18207 $('#h1Invit').html('Inviter des joueurs en Tournoi duplicate');
18208 else if (mode=='Duplicate4')
18209 $('#h1Invit').html('Inviter des joueurs en duplicate à 4');
18210 else if (mode=='Duplicate5')
18211 $('#h1Invit').html('Inviter des joueurs en duplicate à 5');
18212 else if (mode=='Perso')
18213 $('#h1Invit').html('Inviter des joueurs en partie perso.');
18214 else if (mode=='Organisation')
18215 $('#h1Invit').html('Inviter des joueurs en partie organisée.');
18216 else if (mode=='Formation')
18217 $('#h1Invit').html('');
18218 else
18219 $('#h1Invit').html('Inviter des joueurs en '+mode);
18220
18221 
18222 if (mode=='Organisation' || mode=='Formation') {
18223 $('.customInvites').hide();
18224 }
18225 else {
18226 $('.customInvites').show();
18227 }
18228 if (mode=='Organisation') {
18229 $('.organisationOpts').show();
18230 $('.hideOrganisation').hide();
18231 changeOrganisationPartie();
18232 }
18233 else {
18234 $('.organisationOpts').hide();
18235 $('.hideOrganisation').show();
18236 }
18237 
18238 if (mode=='Perso' || mode=='Organisation') $('#persoOpts').show();
18239 else $('#persoOpts').hide();
18240 if (mode=='Perso' || mode=='Organisation') changePersoNbManches();
18241 
18242
18243 if (mode=='Formation') {
18244 $('#formationOpts').show();
18245 $('.hideFormation').hide();
18246 $('.showFormation').show();
18247 //showPlannedFormations();
18248 }
18249 else {
18250 $('#formationOpts').hide();
18251 $('.hideFormation').show();
18252 $('.showFormation').hide();
18253 }
18254}
18255function selectMode(obj,mode) {
18256 selectedModeJeu = mode;
18257 $('#staticMJ').find('.mjSS').removeClass('selectedmjSS');
18258 $(obj).addClass('selectedmjSS');
18259 $('#modeJeuSalon').val(mode);
18260 selectModeTxt(mode);
18261}
18262function synchroniserModeInvitation() {
18263 if (!$('.salonModes').length || !$('#modeJeuSalon').is('select')) return;
18264 var boutonModeSelectionne = selectedModeJeu!=null ? $('.salonModes [data-mode="'+selectedModeJeu+'"]') : $();
18265 if (!boutonModeSelectionne.length || boutonModeSelectionne.attr('aria-disabled')=='true') {
18266 selectedModeJeu = 'Libre4';
18267 boutonModeSelectionne = $('.salonModes [data-mode="Libre4"]');
18268 }
18269 $('.salonModes .mjSS').removeClass('selectedmjSS').attr('aria-pressed','false');
18270 boutonModeSelectionne.addClass('selectedmjSS').attr('aria-pressed','true');
18271 $('#modeJeuSalon').val(selectedModeJeu);
18272 selectModeTxt(selectedModeJeu);
18273}
18274function choisirModeInvitation(obj,mode) {
18275 if ($(obj).attr('aria-disabled')=='true') {
18276 var raison = $(obj).attr('data-disabled-reason');
18277 window.setTimeout(synchroniserModeInvitation,0);
18278 if (raison=='competition')
18279 return modeInvitationIndisponible('Ce mode de jeu est indisponible pour votre compte. Votre acc\u00e8s aux comp\u00e9titions est suspendu.');
18280 if (raison=='organisation')
18281 return modeInvitationIndisponible('Ce mode de jeu est indisponible pour votre compte. La planification de parties est r\u00e9serv\u00e9e aux organisateurs.');
18282 return modeInvitationIndisponible();
18283 }
18284 return selectMode(obj,mode);
18285}
18286function selectMode(obj,mode) {
18287 if ($(obj).attr('aria-disabled')=='true') return false;
18288 selectedModeJeu = mode;
18289 $('.salonModes .mjSS').removeClass('selectedmjSS').attr('aria-pressed','false');
18290 $(obj).addClass('selectedmjSS').attr('aria-pressed','true');
18291 $('#modeJeuSalon').val(mode);
18292 selectModeTxt(mode);
18293 return false;
18294}
18295function modeInvitationIndisponible(message) {
18296 alerte(message || 'Ce mode de jeu est indisponible pour votre compte.');
18297 return false;
18298}
18299
18300function delErr (id) {
18301 //if (confirm('sur ?')) {
18302 
18303 $('#erreurn'+id).hide();
18304 ajax('/workers/delErr.php', 'id='+id, alertRes);
18305 //}
18306}
18307
18308
18309// Waiting belongs to one table, never to a round or a reconnected running game.
18310var debutAttentePartie = null;
18311var carillonDepartContexte = null;
18312var carillonDepartBuffer = null;
18313var carillonDepartSource = null;
18314
18315function reinitialiserAlerteDepart() {
18316 debutAttentePartie = null;
18317 gameHasStarted = false;
18318 arreterCarillonDepart();
18319}
18320function suivreAttentePartie(etape) {
18321 if (gameHasStarted || window.isOffLineGame || !window.currentGameId) return;
18322 if (etape === 'Salon' || etape === 'Attente') {
18323 if (debutAttentePartie === null) debutAttentePartie = Date.now();
18324 } else if (etape === 'Terminee' || etape === 'Abandon') {
18325 debutAttentePartie = null;
18326 arreterCarillonDepart();
18327 }
18328 // The server can send Annonces before notifStart in the same response.
18329}
18330function arreterCarillonDepart() {
18331 if (!carillonDepartSource) return;
18332 try { carillonDepartSource.stop(); } catch (ignore) {}
18333 carillonDepartSource.disconnect();
18334 carillonDepartSource = null;
18335}
18336// Original warm bell: rounded attack, soft upper partials, up to four strikes at 0/1/2/3 s.
18337// A single audio buffer keeps the spacing exact even in a background tab.
18338function construireCarillonDepart(sampleRate) {
18339 var samples = new Float32Array(Math.ceil(sampleRate * 3.85));
18340 var peak = 0;
18341 for (var strike = 0; strike < 4; strike++) {
18342 for (var i = 0; i < Math.floor(sampleRate * 0.85); i++) {
18343  var t = i / sampleRate;
18344  var attack = Math.min(1, t / 0.012);
18345  attack = attack * attack * (3 - 2 * attack);
18346  var release = Math.min(1, (0.85 - t) / 0.12);
18347  var phase = 2 * Math.PI * 659.255 * t;
18348  var value = attack * release * (
18349  Math.sin(phase) * Math.exp(-t / 0.27) +
18350  0.28 * Math.sin(phase * 2) * Math.exp(-t / 0.16) +
18351  0.10 * Math.sin(phase * 3.01) * Math.exp(-t / 0.10));
18352  samples[Math.round(strike * sampleRate) + i] = value;
18353  peak = Math.max(peak, Math.abs(value));
18354 }
18355 }
18356 for (var j = 0; j < samples.length; j++) samples[j] *= 0.8 / peak;
18357 return samples;
18358}
18359function preparerCarillonDepart() {
18360 try {
18361 var AudioContext = window.AudioContext || window.webkitAudioContext;
18362 if (!AudioContext) return;
18363 if (!carillonDepartContexte) {
18364  carillonDepartContexte = new AudioContext();
18365  var samples = construireCarillonDepart(carillonDepartContexte.sampleRate);
18366  carillonDepartBuffer = carillonDepartContexte.createBuffer(1, samples.length, carillonDepartContexte.sampleRate);
18367  carillonDepartBuffer.getChannelData(0).set(samples);
18368 }
18369 if (carillonDepartContexte.state === 'suspended') {
18370  var resume = carillonDepartContexte.resume();
18371  if (resume && resume.catch) resume.catch(function () {});
18372 }
18373 } catch (ignore) {}
18374}
18375function jouerCarillonDepart(nombreCoups) {
18376 var enabled = document.getElementById('soundEnabled');
18377 if (!enabled || enabled.value !== '1' || !gameSoundsEnabled) return;
18378 preparerCarillonDepart();
18379 // Never queue an old alert for the next click if the browser blocked audio.
18380 if (!carillonDepartContexte || carillonDepartContexte.state !== 'running' || !carillonDepartBuffer) return;
18381 try {
18382 arreterCarillonDepart();
18383 var source = carillonDepartContexte.createBufferSource();
18384 source.buffer = carillonDepartBuffer;
18385 source.connect(carillonDepartContexte.destination);
18386 source.onended = function () {
18387  source.disconnect();
18388  if (carillonDepartSource === source) carillonDepartSource = null;
18389 };
18390 carillonDepartSource = source;
18391 source.start(0, 0, nombreCoups - 1 + 0.85);
18392 } catch (ignore) { arreterCarillonDepart(); }
18393}
18394document.addEventListener('pointerdown', preparerCarillonDepart, true);
18395document.addEventListener('keydown', preparerCarillonDepart, true);
18396window.addEventListener('pagehide', arreterCarillonDepart);
18397
18398(function () {
18399 'use strict';
18400 var mapsPromise = null;
18401 var mapsSequence = 0;
18402 var countries = {FR:'France',CH:'Suisse',BE:'Belgique',LU:'Luxembourg',MC:'Monaco'};
18403
18404 function department(postal) {
18405 if (!/^[0-9]{5}$/.test(postal)) return '';
18406 if (/^97[1-6]/.test(postal)) return postal.slice(0,3);
18407 if (/^20/.test(postal)) return Number(postal.slice(0,3))<=201?'2A':'2B';
18408 var code = postal.slice(0,2);
18409 return /^(0[1-9]|1[0-9]|2[1-9]|[3-8][0-9]|9[0-5])$/.test(code)?code:'';
18410 }
18411
18412 function component(result,type) {
18413 var items = result.address_components || [];
18414 for (var i=0;i<items.length;i++) if ((items[i].types || []).indexOf(type)!==-1) return items[i].short_name;
18415 return '';
18416 }
18417
18418 function geocodingResult(results,status,address) {
18419 if (status!=='OK') return {geoStatut:status==='ZERO_RESULTS'?'not_found':'unavailable'};
18420 // A town/postcode centroid must never be presented as the player's home.
18421 var matches = (results || []).filter(function (r) {
18422  var types = r.types || [];
18423  return r.geometry && r.geometry.location && r.place_id &&
18424  component(r,'country')===address.pays &&
18425  (types.indexOf('street_address')!==-1 || types.indexOf('premise')!==-1 || types.indexOf('subpremise')!==-1 || types.indexOf('route')!==-1);
18426 });
18427 if (!matches.length) return {geoStatut:'not_found'};
18428 var r = matches[0];
18429 var exact = matches.length===1 && !r.partial_match && component(r,'postal_code')===address.codePostal &&
18430  ['ROOFTOP','RANGE_INTERPOLATED'].indexOf(r.geometry.location_type)!==-1;
18431 var lat = r.geometry.location.lat(), lng = r.geometry.location.lng();
18432 if (!isFinite(lat) || !isFinite(lng) || Math.abs(lat)>90 || Math.abs(lng)>180) return {geoStatut:'not_found'};
18433 return {geoStatut:exact?'located':'approximate',latitude:lat,longitude:lng,placeId:r.place_id};
18434 }
18435
18436 function loadMaps(key) {
18437 if (window.google && window.google.maps && window.google.maps.Geocoder) return Promise.resolve();
18438 if (mapsPromise) return mapsPromise;
18439 mapsPromise = new Promise(function (resolve,reject) {
18440  if (!key) { reject(new Error('Maps unavailable')); return; }
18441  var ownScript = null, poll, timeout, finished = false;
18442  var callback = 'compteMapsReady'+(++mapsSequence);
18443  function finish(error) {
18444  if (finished) return;
18445  finished = true;
18446  window.clearInterval(poll); window.clearTimeout(timeout);
18447  // Keep a harmless callback for scripts that arrive after a timeout.
18448  window[callback] = function () {};
18449  if (error) {
18450   if (ownScript && ownScript.parentNode) ownScript.parentNode.removeChild(ownScript);
18451   reject(error);
18452  } else resolve();
18453  }
18454  function ready() {
18455  if (window.google && window.google.maps && window.google.maps.Geocoder) finish();
18456  }
18457  window[callback] = ready;
18458  poll = window.setInterval(ready,100);
18459  timeout = window.setTimeout(function () { finish(new Error('Maps timeout')); },8000);
18460  if (!document.querySelector('script[src*="maps.googleapis.com/maps/api/js"]')) {
18461  ownScript = document.createElement('script');
18462  ownScript.src = 'https://maps.googleapis.com/maps/api/js?key='+encodeURIComponent(key)+'&libraries=places&language=fr&region=FR&callback='+callback;
18463  ownScript.async = true;
18464  ownScript.onerror = function () { finish(new Error('Maps unavailable')); };
18465  document.head.appendChild(ownScript);
18466  }
18467  ready();
18468 });
18469 mapsPromise = mapsPromise.catch(function (error) { mapsPromise=null; throw error; });
18470 return mapsPromise;
18471 }
18472
18473 function locate(address,key) {
18474 return loadMaps(key).then(function () {
18475  return new Promise(function (resolve) {
18476  var done = false;
18477  function finish(result) { if (done) return; done=true; window.clearTimeout(timer); resolve(result); }
18478  var timer = window.setTimeout(function () { finish({geoStatut:'unavailable'}); },8000);
18479  try {
18480   new window.google.maps.Geocoder().geocode({
18481   address:address.ligne1+', '+address.codePostal+' '+address.ville+', '+countries[address.pays],
18482   componentRestrictions:{country:address.pays,postalCode:address.codePostal},
18483   region:address.pays
18484   },function (results,status) { finish(geocodingResult(results,status,address)); });
18485  } catch (error) { finish({geoStatut:'unavailable'}); }
18486  });
18487 }).catch(function () { return {geoStatut:'unavailable'}; });
18488 }
18489
18490 function uid() {
18491 var bytes = new Uint8Array(16);
18492 if (window.crypto && window.crypto.getRandomValues) window.crypto.getRandomValues(bytes);
18493 else for (var i=0;i<bytes.length;i++) bytes[i]=Math.floor(Math.random()*256);
18494 return Array.prototype.map.call(bytes,function (n) { return ('0'+n.toString(16)).slice(-2); }).join('');
18495 }
18496
18497 function request(payload,token) {
18498 payload=window.jQuery.extend({},payload,{token:token});
18499 return new Promise(function (resolve,reject) {
18500  window.jQuery.ajax({url:'/workers/compteCoordonnees.php',type:'POST',contentType:'application/json; charset=UTF-8',dataType:'json',data:JSON.stringify(payload),timeout:15000,cache:false})
18501  .done(function (result) { if (result && result.ok && result.data) resolve(result.data); else reject(new Error(result && result.message || 'Enregistrement impossible.')); })
18502  .fail(function (xhr) { reject(new Error(xhr.responseJSON && xhr.responseJSON.message || 'Connexion interrompue. Votre saisie est conserv\u00e9e. R\u00e9essayez pour v\u00e9rifier l\u2019enregistrement.')); });
18503 });
18504 }
18505 function localiser(address,config) {
18506 return locate(address,config.googleKey).then(function (geo) {
18507  var payload=window.jQuery.extend({},geo,{action:'geo',id:address.id,version:address.version});
18508  return request(payload,config.token).then(function (data) { return {data:data,geo:geo}; });
18509 });
18510 }
18511 var api={pays:countries,departement:department,requete:request,localiser:localiser,uid:uid};
18512 if (typeof module!=='undefined' && module.exports) module.exports={department:department,geocodingResult:geocodingResult};
18513 if (typeof window!=='undefined') window.TarotAdresses=api;
18514}());
18515
18516/* Reusable address editor, hosted by the site's standard showBigDialog. */
18517(function () {
18518 'use strict';
18519 var active = null;
18520
18521 function openAddress(options) {
18522 options = options || {};
18523 var $ = window.jQuery, api = window.TarotAdresses;
18524 if (!$ || !api || typeof window.showBigDialog!=='function')
18525  return Promise.reject(new Error('Le formulaire d\u2019adresse est indisponible. Rechargez la page.'));
18526 if (active) {
18527  active.dialog.dialog('moveToTop');
18528  active.dialog.find('input:visible:enabled').first().focus();
18529  return active.promise;
18530 }
18531 var initialScrollLeft=window.pageXOffset || 0;
18532 var editing = options.adresse || null;
18533 var title = editing?'Modifier l\u2019adresse':'Nouvelle adresse';
18534 var dialogId = window.showBigDialog(title,'<div class="compteCoordonnees coordDialogue"><p role="status">Chargement du formulaire&hellip;</p></div>');
18535 var dialog = $('#'+dialogId);
18536 var namespace = '.adresseDialogue'+dialogId;
18537 var form = null, wrapper = null, config = null, original = '', clientId = api.uid();
18538 var busy = false, closed = false, forceClose = false, confirming = false, result = null, xhr = null;
18539 var settle;
18540 var promise = new Promise(function (resolve) { settle=resolve; });
18541 active = {dialog:dialog,promise:promise};
18542 dialog.dialog('widget').addClass('adresseDialogueShell');
18543 if (options.cadeau) dialog.dialog('widget').addClass('cadeauxAddressShell');
18544
18545 function fit() {
18546  if (closed) return;
18547  dialog.dialog('option',{width:Math.max(250,Math.min(680,$(window).width()-20)),maxHeight:Math.max(200,$(window).height()-24)});
18548  // The standard shell first opens at 550px and may scroll a small screen.
18549  var widget=dialog.dialog('widget');
18550  widget.css('left',initialScrollLeft+Math.max(0,($(window).width()-widget.outerWidth())/2));
18551  window.scrollTo(initialScrollLeft,window.pageYOffset || 0);
18552  dialog.dialog('option','position',{my:'center',at:'center',of:window});
18553 }
18554 function field(name) { return form.elements[name]; }
18555 function values() {
18556  var data={};
18557  ['libelle','ligne1','ligne2','codePostal','ville','pays','departement'].forEach(function (name) { data[name]=field(name).value.trim(); });
18558  if (field('nomDestinataire')) data.nomDestinataire=field('nomDestinataire').value.trim();
18559  data.parDefaut=field('parDefaut').checked;
18560  return data;
18561 }
18562 function status(message,error) {
18563  if (!wrapper) return;
18564  var target=wrapper.querySelector('[data-coord-dialog-status]');
18565  target.textContent=message;
18566  target.className='coordStatus'+(error?' is-error':'');
18567  if (error) target.scrollIntoView({block:'nearest'});
18568 }
18569 function pending(value) {
18570  busy=value;
18571  dialog.attr('aria-busy',value?'true':'false');
18572  dialog.find('button,input,select').prop('disabled',value);
18573  dialog.dialog('widget').find('.ui-dialog-titlebar-close').prop('disabled',value);
18574 }
18575 function updateCountry(derive) {
18576  var french=field('pays').value==='FR';
18577  wrapper.querySelector('[data-coord-department]').hidden=!french;
18578  var size=['FR','MC'].indexOf(field('pays').value)!==-1?5:4;
18579  field('codePostal').maxLength=size;
18580  field('codePostal').pattern='[0-9]{'+size+'}';
18581  field('codePostal').title=size+' chiffres';
18582  if (!french) field('departement').value='';
18583  else if (derive) field('departement').value=api.departement(field('codePostal').value) || config.departement;
18584  var detected=api.departement(field('codePostal').value);
18585  wrapper.querySelector('[data-coord-department-hint]').textContent=french && field('departement').value?(detected===field('departement').value?'D\u00e9duit du code postal.':'Pr\u00e9rempli depuis votre connexion. Modifiable si besoin.'):'';
18586 }
18587 function complete(data,message,warning) {
18588  var address=data.adresses.filter(function (a) { return a.id===data.adresseId; })[0];
18589  result={adresse:address,data:data,message:message,warning:!!warning};
18590  pending(false); forceClose=true;
18591  dialog.dialog('close');
18592 }
18593 function submit(event) {
18594  event.preventDefault();
18595  if (busy) return;
18596  if (options.cadeau && field('nomDestinataire')) field('nomDestinataire').setCustomValidity(field('nomDestinataire').value.trim()?'':'Renseignez le nom complet du destinataire.');
18597  if (!form.reportValidity()) return;
18598  var data=values();
18599  data.action='save'; data.id=editing?editing.id:0; data.version=editing?editing.version:0; data.clientId=clientId;
18600  pending(true); status('Enregistrement de l\u2019adresse\u2026');
18601  api.requete(data,config.token).then(function (savedData) {
18602  var saved=savedData.adresses.filter(function (a) { return a.id===savedData.adresseId; })[0];
18603  if (!saved || saved.geoStatut==='located' || saved.geoStatut==='approximate') {
18604   complete(savedData,'Adresse enregistr\u00e9e.'); return;
18605  }
18606  status('Adresse enregistr\u00e9e. Recherche de sa position GPS\u2026');
18607  return api.localiser(saved,config).then(function (located) {
18608   var message=located.geo.geoStatut==='located'?'Adresse et position GPS enregistr\u00e9es.':located.geo.geoStatut==='approximate'?'Adresse enregistr\u00e9e. La position GPS est approximative : vous pouvez la v\u00e9rifier sur Google Maps.':'Adresse enregistr\u00e9e. La position GPS n\u2019a pas pu \u00eatre trouv\u00e9e. Vous pourrez relancer la localisation.';
18609   complete(located.data,message);
18610  }).catch(function () {
18611   complete(savedData,'Adresse enregistr\u00e9e. La position GPS n\u2019a pas pu \u00eatre enregistr\u00e9e. Vous pourrez relancer la localisation.',true);
18612  });
18613  }).catch(function (error) { pending(false); status(error.message,true); });
18614 }
18615 function bindForm() {
18616  wrapper=dialog[0].querySelector('[data-adresse-dialogue]');
18617  form=wrapper && wrapper.querySelector('[data-coord-form]');
18618  if (!form) throw new Error('Formulaire incomplet.');
18619  config={token:wrapper.getAttribute('data-token'),googleKey:wrapper.getAttribute('data-google-key'),departement:wrapper.getAttribute('data-departement') || ''};
18620  var initial=editing || options.valeurs || {};
18621  ['libelle','ligne1','ligne2','codePostal','ville','pays','departement'].forEach(function (name) {
18622  field(name).value=typeof initial[name]==='string'?initial[name]:(name==='pays'?'FR':name==='departement'?config.departement:'');
18623  });
18624  if (field('nomDestinataire')) {
18625  field('nomDestinataire').value=initial.nomDestinataire || '';
18626  if (options.cadeau) {
18627   field('nomDestinataire').required=true;
18628   field('nomDestinataire').addEventListener('input',function () { this.setCustomValidity(''); });
18629   var recipientLabel=field('nomDestinataire').parentNode;
18630   if (recipientLabel.firstChild && recipientLabel.firstChild.nodeType===3) recipientLabel.firstChild.nodeValue='Pr\u00e9nom et nom du destinataire ';
18631   field('nomDestinataire').placeholder='Pr\u00e9nom et nom complets';
18632   wrapper.querySelector('.coordHint').textContent='Cette adresse accueillera votre cadeau. Le nom du destinataire sera repris automatiquement pour la livraison.';
18633  }
18634  }
18635  if (options.cadeau) {
18636  var welcome=document.createElement('div'); welcome.className='cadeauxAddressWelcome';
18637  welcome.innerHTML='<span aria-hidden="true">&#10022;</span><div><strong>Une belle surprise, \u00e0 la bonne adresse</strong><p>Votre nom complet, renseign\u00e9 une seule fois.</p></div>';
18638  wrapper.insertBefore(welcome,form);
18639  }
18640  field('parDefaut').checked=editing?!!editing.parDefaut:wrapper.getAttribute('data-premiere')==='1' || initial.parDefaut===true;
18641  updateCountry(!editing && (!!api.departement(field('codePostal').value) || !initial.departement)); original=JSON.stringify(values());
18642  field('pays').addEventListener('change',function () { updateCountry(true); });
18643  field('codePostal').addEventListener('input',function () { updateCountry(true); });
18644  form.addEventListener('submit',submit);
18645  form.querySelector('[data-coord-cancel]').addEventListener('click',function () { dialog.dialog('close'); });
18646  fit();
18647  (options.cadeau && field('nomDestinataire') && !field('nomDestinataire').value?field('nomDestinataire'):field('ligne1')).focus();
18648 }
18649 function load() {
18650  xhr=$.ajax({url:'/workers/adresseFormulaire.php',type:'GET',dataType:'html',cache:false,timeout:15000});
18651  xhr.done(function (html) {
18652  if (closed) return;
18653  dialog.html(html);
18654  try { bindForm(); } catch (error) { loadError(); }
18655  }).fail(function () { if (!closed) loadError(); });
18656 }
18657 function loadError() {
18658  wrapper=null; form=null;
18659  dialog.html('<div class="compteCoordonnees coordDialogue"><p role="alert">Le formulaire ne peut pas &ecirc;tre charg&eacute;. V&eacute;rifiez votre connexion ou reconnectez-vous.</p><button type="button" class="btn" data-adresse-retry>R&eacute;essayer</button></div>');
18660  dialog.find('[data-adresse-retry]').on('click',function () { $(this).prop('disabled',true); load(); }).focus();
18661  fit();
18662 }
18663 dialog.on('dialogbeforeclose'+namespace,function (event) {
18664  if (busy) { event.preventDefault(); return false; }
18665  if (!forceClose && form && JSON.stringify(values())!==original) {
18666  event.preventDefault();
18667  if (!confirming) {
18668   confirming=true;
18669   window.confirme('Abandonner les modifications de cette adresse ?',function () {
18670   confirming=false; forceClose=true; dialog.dialog('close');
18671   },function () { confirming=false; field('ligne1').focus(); });
18672  }
18673  return false;
18674  }
18675 });
18676 var usualClose=dialog.dialog('option','close');
18677 dialog.dialog('option','close',function (event,ui) {
18678  if (usualClose) usualClose.call(this,event,ui);
18679  closed=true;
18680  if (xhr && xhr.readyState!==4) xhr.abort();
18681  $(window).off(namespace);
18682  window.setTimeout(function () { active=null; settle(result); },0);
18683 });
18684 $(window).on('resize'+namespace,fit);
18685 fit(); load();
18686 return promise;
18687 }
18688 window.ouvrirAdresseDialogue=openAddress;
18689}());
18690
18691/* Optional callback runs once after a successful save and dialog cleanup. */
18692(function () {
18693 'use strict';
18694 var active = null, navigationEnAttente = false;
18695 window.ouvrirAgeDialogue = function (apresValidation) {
18696 var $ = window.jQuery;
18697 if (active) {
18698  var previous = active;
18699  if (typeof apresValidation === 'function' && active.callbacks.indexOf(apresValidation) === -1)
18700  active.callbacks.push(apresValidation);
18701  active.dialog.dialog('moveToTop');
18702  if (active.saved) active.dialog.dialog('close');
18703  return previous.promise;
18704 }
18705 var callbacks = typeof apresValidation === 'function' ? [apresValidation] : [];
18706 var id = window.showBigDialog('Votre tranche d\u2019\u00e2ge',
18707  '<form class="ageDialogue">' +
18708  '<div class="ageDialogueIntro"><span class="ageDialogueSymbol" aria-hidden="true">&#9824;</span>' +
18709  '<h2>Faisons connaissance</h2><p>Indiquez votre tranche d\u2019\u00e2ge pour adapter votre exp\u00e9rience de jeu.</p></div>' +
18710  '<fieldset class="ageDialogueChoices"><legend>Vous \u00eates\u2026</legend>' +
18711  '<label class="ageDialogueChoice"><input type="radio" name="trancheAge" value="majeur" required><span><strong>Majeur</strong><small>18 ans ou plus</small></span></label>' +
18712  '<label class="ageDialogueChoice"><input type="radio" name="trancheAge" value="mineur" required><span><strong>Mineur</strong><small>De 5 \u00e0 17 ans</small></span></label></fieldset>' +
18713  '<label class="ageDialogueConfirmation"><input type="checkbox" name="confirmation" required disabled><span>Je confirme que mon choix est exact.</span></label>' +
18714  '<p class="ageDialogueNote">Vous pourrez pr\u00e9ciser votre date de naissance dans la page Compte.</p>' +
18715  '<p class="ageDialogueStatus" role="status" aria-live="polite"></p>' +
18716  '<div class="ageDialogueActions"><button type="button" class="ageDialogueRetry" hidden>R\u00e9essayer</button>' +
18717  '<button type="submit" class="ageDialogueSubmit" disabled>OK</button></div></form>');
18718 var dialog = $('#' + id), form = dialog.find('form')[0];
18719 var radios = dialog.find('[name="trancheAge"]'), confirmation = form.elements.confirmation;
18720 var submit = dialog.find('.ageDialogueSubmit'), status = dialog.find('.ageDialogueStatus'), retry = dialog.find('.ageDialogueRetry');
18721 var token = null, busy = false, closed = false, saved = null, xhr = null;
18722 var settle, namespace = '.ageDialogue' + id;
18723 var promise = new Promise(function (resolve) { settle = resolve; });
18724 active = {dialog:dialog, promise:promise, callbacks:callbacks, saved:null};
18725 dialog.dialog('widget').addClass('ageDialogueShell');
18726 function choice() { return radios.filter(':checked').val(); }
18727 function message(text, error) { status.text(text).toggleClass('is-error', !!error); }
18728 function refresh() {
18729  radios.prop('disabled', busy || !!saved);
18730  radios.each(function () { $(this).closest('label').toggleClass('is-selected', this.checked); });
18731  confirmation.disabled = busy || !choice() || !!saved;
18732  submit.prop('disabled', busy || (!saved && (!token || !choice() || !confirmation.checked)));
18733  submit.text(busy ? 'Enregistrement\u2026' : 'OK');
18734  dialog.attr('aria-busy', busy ? 'true' : 'false');
18735  dialog.dialog('widget').find('.ui-dialog-titlebar-close').prop('disabled', busy);
18736 }
18737 function fit() {
18738  if (closed) return;
18739  dialog.dialog('option', {width:Math.min(500, $(window).width() - 20), minWidth:0,
18740  maxHeight:Math.max(160, $(window).height() - 24), position:{my:'center', at:'center', of:window}});
18741 }
18742 function failure(response, fallback) {
18743  var data = response && response.responseJSON;
18744  message(data && typeof data.message === 'string' ? data.message : fallback, true);
18745 }
18746 function complete(data) {
18747  saved = data; busy = false;
18748  active.saved = data;
18749  var menu = document.querySelector('#liJeu a[data-age-requis]');
18750  if (menu) menu.setAttribute('data-age-requis', '0');
18751  refresh();
18752  if (callbacks.length) { dialog.dialog('close'); return; }
18753  dialog.find('.ageDialogueChoices, .ageDialogueConfirmation, .ageDialogueNote').prop('hidden', true);
18754  dialog.find('.ageDialogueIntro h2').text(data.dejaRenseigne ? 'Votre \u00e2ge est d\u00e9j\u00e0 renseign\u00e9' : 'Merci pour votre r\u00e9ponse');
18755  dialog.find('.ageDialogueIntro p').text(data.dejaRenseigne
18756  ? 'Votre date de naissance a \u00e9t\u00e9 conserv\u00e9e. Vous pouvez la modifier dans la page Compte.'
18757  : 'Votre choix a bien \u00e9t\u00e9 enregistr\u00e9 dans votre compte.');
18758  message(''); fit(); submit.focus();
18759 }
18760 function load() {
18761  retry.prop('hidden', true); message('Chargement\u2026');
18762  xhr = $.ajax({url:'/workers/ageDeclaration.php', type:'GET', dataType:'json', cache:false, timeout:15000});
18763  xhr.done(function (data) {
18764  if (closed) return;
18765  if (!data || !data.ok || typeof data.token !== 'string' || !data.token) {
18766   message('Le formulaire est indisponible. R\u00e9essayez.', true);
18767   retry.prop('hidden', false); return;
18768  }
18769  token = data.token;
18770  // Another tab or the account form may already have supplied the age.
18771  if (callbacks.length && (data.majorite === 'majeur' || data.majorite === 'mineur')) {
18772   complete({ok:true, majorite:data.majorite, dejaRenseigne:true}); return;
18773  }
18774  message(''); refresh();
18775  }).fail(function (response) {
18776  if (closed) return;
18777  failure(response, 'Connexion impossible. V\u00e9rifiez votre connexion et r\u00e9essayez.');
18778  retry.prop('hidden', false);
18779  });
18780 }
18781 radios.on('change', function () {
18782  confirmation.checked = false;
18783  dialog.find('.ageDialogueConfirmation span').text(choice() === 'majeur'
18784  ? 'Je confirme que mon choix est exact et que je suis majeur (18 ans ou plus).'
18785  : 'Je confirme que mon choix est exact et que je suis mineur (de 5 \u00e0 17 ans).');
18786  refresh(); fit();
18787 });
18788 $(confirmation).on('change', refresh);
18789 retry.on('click', function () {
18790  load();
18791  (radios.filter(':checked').length ? radios.filter(':checked') : radios.first()).focus();
18792 });
18793 $(form).on('submit', function (event) {
18794  event.preventDefault();
18795  if (saved) { dialog.dialog('close'); return; }
18796  if (busy || !token || !choice() || !confirmation.checked || !form.reportValidity()) return;
18797  busy = true; refresh(); message('Enregistrement de votre choix\u2026');
18798  xhr = $.ajax({
18799  url:'/workers/ageDeclaration.php', type:'POST', dataType:'json',
18800  contentType:'application/json; charset=UTF-8', timeout:15000,
18801  data:JSON.stringify({choix:choice(), confirmation:true, token:token})
18802  });
18803  xhr.done(function (data) {
18804  if (!data || !data.ok || (data.majorite !== 'majeur' && data.majorite !== 'mineur')) {
18805   busy = false; refresh(); message('L\u2019enregistrement a \u00e9chou\u00e9. R\u00e9essayez.', true); return;
18806  }
18807  complete(data);
18808  }).fail(function (response) {
18809  busy = false;
18810  if (response.status === 403) { token = null; retry.prop('hidden', false); }
18811  refresh(); failure(response, 'Votre choix n\u2019a pas pu \u00eatre confirm\u00e9. R\u00e9essayez.');
18812  });
18813 });
18814 dialog.on('dialogbeforeclose' + namespace, function (event) {
18815  if (busy) { event.preventDefault(); return false; }
18816 });
18817 var usualClose = dialog.dialog('option', 'close');
18818 dialog.dialog('option', 'close', function (event, ui) {
18819  closed = true;
18820  if (xhr && xhr.readyState !== 4) xhr.abort();
18821  $(window).off(namespace); active = null;
18822  if (usualClose) usualClose.call(this, event, ui);
18823  // showBigDialog queues its removal and focus restoration first.
18824  window.setTimeout(function () {
18825  settle(saved);
18826  if (saved) callbacks.forEach(function (callback) {
18827   try { callback(saved); }
18828   catch (error) { window.setTimeout(function () { throw error; }, 0); }
18829  });
18830  }, 0);
18831 });
18832 $(window).on('resize' + namespace, fit);
18833 fit(); load(); radios.first().focus();
18834 return promise;
18835 };
18836 // True means navigation is paused. The menu and server request an age only
18837 // once the current account has completed at least two games.
18838 window.confirmerAgeAvantJouer = function (continuer, forcer) {
18839 var menu = document.querySelector('#liJeu a[data-age-requis]');
18840 if (!forcer && (!menu || menu.getAttribute('data-age-requis') !== '1')) return false;
18841 if (forcer && menu) menu.setAttribute('data-age-requis', '1');
18842 if (navigationEnAttente) { window.ouvrirAgeDialogue(); return true; }
18843 navigationEnAttente = true;
18844 window.ouvrirAgeDialogue(function (resultat) {
18845  navigationEnAttente = false;
18846  continuer(resultat);
18847 }).then(function () { navigationEnAttente = false; });
18848 return true;
18849 };
18850}());
18851
18852/* One dialog for the missing shop prerequisites. All account decisions come from the server. */
18853(function () {
18854 'use strict';
18855 var active = null;
18856 window.ouvrirBoutiqueDialogue = function (destination) {
18857 var $ = window.jQuery;
18858 if (active) { active.dialog.dialog('moveToTop'); return false; }
18859 if (typeof destination !== 'string' || !/^\/credits\.php(?:[?#]|$)/.test(destination)) destination = '/credits.php';
18860 var id = window.showBigDialog('Acc\u00e9der \u00e0 la boutique',
18861  '<form class="boutiqueDialogue" novalidate>' +
18862  '<div class="boutiqueIntro"><span aria-hidden="true">&#9824;</span><h2>Bienvenue dans la boutique</h2>' +
18863  '<p>Compl\u00e9tez uniquement les informations manquantes. Tout se fait ici.</p></div>' +
18864  '<p class="boutiqueAcquis" hidden></p><div class="boutiqueChamps" hidden>' +
18865  '<label class="boutiqueMajeur boutiqueCheck"><input name="majeur" type="checkbox"><span>Je confirme avoir <strong>18 ans ou plus</strong>.</span></label>' +
18866  '<div class="boutiquePseudo boutiqueField"><label>Votre pseudo<input name="pseudo" type="text" maxlength="25" autocomplete="nickname" aria-describedby="boutiquePseudoAide"></label>' +
18867  '<small id="boutiquePseudoAide">Visible par les autres joueurs. Le premier choix est gratuit ; le changer ensuite co\u00fbte 5 cr\u00e9dits.</small></div>' +
18868  '<section class="boutiqueEmail"><div class="boutiqueEmailSaisie boutiqueField"><label>Votre adresse email<input name="email" type="email" maxlength="80" autocomplete="email" inputmode="email" spellcheck="false" autocapitalize="none"></label>' +
18869  '<small>Pour valider votre compte et vous aider en cas de probl\u00e8me avec un achat.</small></div>' +
18870  '<div class="boutiqueEmailAdresse"><strong>Email \u00e0 valider</strong><p class="boutiqueAdresse"></p><button type="button" class="boutiqueModifier boutiqueLink">Modifier l\u2019adresse</button></div>' +
18871  '<div class="boutiqueCode boutiqueField" hidden><label>Code re\u00e7u par email<input name="code" type="text" inputmode="numeric" autocomplete="one-time-code" maxlength="6" pattern="[0-9]{6}" aria-describedby="boutiqueCodeAide"></label>' +
18872  '<small id="boutiqueCodeAide">6 chiffres, valables 15 minutes. Pensez aussi aux courriers ind\u00e9sirables.</small></div>' +
18873  '<div class="boutiqueEmailActions"><button type="button" class="boutiqueVerifier boutiqueLink">J\u2019ai valid\u00e9 mon email : v\u00e9rifier</button>' +
18874  '<button type="button" class="boutiqueRenvoyer boutiqueLink" hidden>Renvoyer le code</button></div></section>' +
18875  '<label class="boutiqueConditions boutiqueCheck"><input name="conditions" type="checkbox"><span>J\u2019accepte les <a href="/Conditions.php" target="_blank" rel="noopener">conditions de vente et d\u2019utilisation</a>.</span></label></div>' +
18876  '<p class="boutiqueStatus" role="status" aria-live="polite">V\u00e9rification de votre compte\u2026</p>' +
18877  '<div class="boutiqueActions"><button type="button" class="boutiqueAnnuler">Plus tard</button><button type="button" class="boutiqueRetry" hidden>R\u00e9essayer</button>' +
18878  '<button type="submit" class="boutiqueSubmit" disabled>Continuer</button></div></form>');
18879 var dialog = $('#' + id), form = dialog.find('form')[0], fields = form.elements;
18880 var state = null, busy = false, saving = false, closed = false, xhr = null, editingEmail = false, resendAt = 0;
18881 var namespace = '.boutique' + id, lastCheck = 0;
18882 var status = dialog.find('.boutiqueStatus'), submit = dialog.find('.boutiqueSubmit');
18883 active = {dialog:dialog};
18884 dialog.dialog('option', 'modal', true);
18885 dialog.dialog('widget').addClass('boutiqueDialogueShell').attr('aria-modal', 'true');
18886 function message(text, error) { status.text(text).toggleClass('is-error', !!error); }
18887 function fit() {
18888  if (closed) return;
18889  dialog.dialog('option', {width:Math.min(520, $(window).width() - 20), minWidth:0,
18890  maxHeight:Math.max(160, $(window).height() - 24), position:{my:'center', at:'center', of:window}});
18891 }
18892 function codeVisible() { return state && state.codeEnvoye && !editingEmail && !state.emailValide; }
18893 function controls() {
18894  var blocked = !state || state.majorite === 'mineur';
18895  dialog.find('input').each(function () { this.disabled = busy || !$(this).is(':visible'); });
18896  dialog.find('button').prop('disabled', busy);
18897  dialog.find('.boutiqueAnnuler').prop('disabled', saving);
18898  submit.prop('disabled', busy || blocked);
18899  dialog.find('.boutiqueRenvoyer').prop('disabled', busy || Date.now() < resendAt);
18900  var seconds = Math.max(0, Math.ceil((resendAt - Date.now()) / 1000));
18901  dialog.find('.boutiqueRenvoyer').text(seconds ? 'Renvoyer dans ' + seconds + ' s' : 'Renvoyer le code');
18902  var waitingToSend = state && !state.emailValide && !codeVisible() && seconds > 0;
18903  if (waitingToSend) submit.prop('disabled', true);
18904  submit.text(busy ? 'Un instant\u2026' : waitingToSend ? 'Recevoir un code dans ' + seconds + ' s' : codeVisible() ? 'Valider et acc\u00e9der \u00e0 la boutique' : state && state.emailValide ? 'Acc\u00e9der \u00e0 la boutique' : 'Enregistrer et recevoir mon code');
18905  dialog.attr('aria-busy', busy ? 'true' : 'false');
18906  dialog.dialog('widget').find('.ui-dialog-titlebar-close').prop('disabled', saving);
18907 }
18908 function show(selector, visible) { dialog.find(selector).prop('hidden', !visible); }
18909 function render(data) {
18910  var previous = state;
18911  state = data;
18912  if (data !== previous) resendAt = Date.now() + (data.renvoiDans || 0) * 1000;
18913  if (!previous) {
18914  editingEmail = !data.email;
18915  fields.email.value = data.email;
18916  } else if (data.email !== previous.email) {
18917  // Preserve an unsaved address during a read-only refresh.
18918  if (!editingEmail || fields.email.value === previous.email) fields.email.value = data.email;
18919  }
18920  if (data.emailValide) editingEmail = false;
18921  var blocked = data.majorite === 'mineur';
18922  show('.boutiqueChamps', !blocked);
18923  show('.boutiqueMajeur', data.majorite === 'inconnue');
18924  show('.boutiquePseudo', data.pseudoRequis);
18925  show('.boutiqueEmail', !data.emailValide);
18926  show('.boutiqueConditions', !data.conditionsAcceptees);
18927  show('.boutiqueEmailSaisie', editingEmail);
18928  show('.boutiqueEmailAdresse', !editingEmail);
18929  show('.boutiqueCode', codeVisible());
18930  show('.boutiqueRenvoyer', codeVisible());
18931  show('.boutiqueVerifier', !!data.email && !editingEmail);
18932  show('.boutiqueSubmit', !blocked);
18933  dialog.find('.boutiqueAdresse').text(data.email);
18934  fields.majeur.required = !blocked && data.majorite === 'inconnue';
18935  fields.pseudo.required = !blocked && data.pseudoRequis;
18936  fields.email.required = !blocked && !data.emailValide && editingEmail;
18937  fields.code.required = !blocked && codeVisible();
18938  fields.conditions.required = !blocked && !data.conditionsAcceptees;
18939  var acquis = [];
18940  if (data.majorite === 'majeur') acquis.push('Majorit\u00e9 confirm\u00e9e');
18941  if (!data.pseudoRequis) acquis.push('Pseudo enregistr\u00e9');
18942  if (data.emailValide) acquis.push('Email valid\u00e9');
18943  dialog.find('.boutiqueAcquis').text(acquis.join(' \u00b7 '));
18944  show('.boutiqueAcquis', !blocked && acquis.length > 0);
18945  if (blocked) message('La boutique est r\u00e9serv\u00e9e aux joueurs de 18 ans et plus. Votre compte indique que vous \u00eates mineur.');
18946  controls(); fit();
18947 }
18948 function validState(data) { return data && data.ok && typeof data.token === 'string' && data.token && typeof data.pret === 'boolean'; }
18949 function navigate(data) {
18950  if (!data.pret) return false;
18951  window.location.assign(destination);
18952  return true;
18953 }
18954 function focusMissing() {
18955  var input = dialog.find('input:visible:enabled').first();
18956  if (input.length) input.focus(); else submit.focus();
18957 }
18958 function load(manual, initial) {
18959  if (busy || closed) return;
18960  lastCheck = Date.now(); busy = true; controls();
18961  show('.boutiqueRetry', false);
18962  if (manual || initial) message('V\u00e9rification de votre compte\u2026');
18963  xhr = $.ajax({url:'/workers/boutiqueAcces.php', type:'GET', dataType:'json', cache:false, timeout:15000});
18964  xhr.done(function (data) {
18965  if (closed) return;
18966  busy = false; saving = false;
18967  if (!validState(data)) { message('Le formulaire est indisponible. R\u00e9essayez.', true); show('.boutiqueRetry', true); controls(); return; }
18968  if (navigate(data)) return;
18969  var newlyVerified = state && !state.emailValide && data.emailValide;
18970  render(data);
18971  if (data.majorite !== 'mineur') message(newlyVerified ? 'Votre email est valid\u00e9. Vous pouvez terminer.' : manual && !data.emailValide ? 'Votre email n\u2019est pas encore valid\u00e9. Utilisez le code ou le lien re\u00e7u par email.' : '');
18972  if (initial) focusMissing();
18973  }).fail(function (response) {
18974  if (closed) return;
18975  busy = false; saving = false; controls(); show('.boutiqueRetry', true);
18976  message(response.responseJSON && response.responseJSON.message || 'Connexion impossible. Vos saisies sont conserv\u00e9es. R\u00e9essayez.', true);
18977  });
18978 }
18979 function save(action) {
18980  if (busy || !state || state.majorite === 'mineur') return;
18981  fields.email.value = $.trim(fields.email.value);
18982  // Resending does not require entering the previous code.
18983  fields.code.required = action === 'verifier';
18984  if (!form.reportValidity()) { fields.code.required = codeVisible(); return; }
18985  var payload = {token:state.token, action:action};
18986  if (action === 'verifier') payload.code = fields.code.value;
18987  else {
18988  if (state.majorite === 'inconnue') payload.majeur = fields.majeur.checked;
18989  if (state.pseudoRequis) payload.pseudo = $.trim(fields.pseudo.value);
18990  if (!state.conditionsAcceptees) payload.conditions = fields.conditions.checked;
18991  if (!state.emailValide) payload.email = editingEmail ? fields.email.value : state.email;
18992  }
18993  busy = true; saving = true; controls(); message(action === 'envoyer' ? 'Enregistrement et envoi du code\u2026' : 'V\u00e9rification et enregistrement\u2026');
18994  xhr = $.ajax({url:'/workers/boutiqueAcces.php', type:'POST', dataType:'json', contentType:'application/json; charset=UTF-8', timeout:20000, data:JSON.stringify(payload)});
18995  xhr.done(function (data) {
18996  if (closed) return;
18997  busy = false; saving = false;
18998  if (!validState(data)) { controls(); message('La r\u00e9ponse est incompl\u00e8te. V\u00e9rifiez votre compte avant de r\u00e9essayer.', true); show('.boutiqueRetry', true); return; }
18999  if (navigate(data)) return;
19000  if (action === 'envoyer') editingEmail = false;
19001  render(data);
19002  if (data.majorite === 'mineur') return;
19003  message(action === 'envoyer' ? 'Code envoy\u00e9. Saisissez-le ci-dessus, ou utilisez le lien de l\u2019email.' : 'Informations enregistr\u00e9es.');
19004  if (codeVisible()) { fields.code.value = ''; fields.code.focus(); } else focusMissing();
19005  }).fail(function (response) {
19006  if (closed) return;
19007  busy = false; saving = false; controls(); fields.code.required = codeVisible();
19008  message(response.responseJSON && response.responseJSON.message || 'La sauvegarde n\u2019a pas pu \u00eatre confirm\u00e9e. Vos saisies sont conserv\u00e9es.', true);
19009  show('.boutiqueRetry', true);
19010  });
19011 }
19012 $(form).on('submit', function (event) {
19013  event.preventDefault();
19014  save(codeVisible() ? 'verifier' : state && state.emailValide ? 'enregistrer' : 'envoyer');
19015 });
19016 dialog.find('.boutiqueModifier').on('click', function () { editingEmail = true; render(state); fields.email.focus(); });
19017 dialog.find('.boutiqueVerifier, .boutiqueRetry').on('click', function () { load(true, false); });
19018 dialog.find('.boutiqueRenvoyer').on('click', function () { save('envoyer'); });
19019 dialog.find('.boutiqueAnnuler').on('click', function () { dialog.dialog('close'); });
19020 dialog.on('dialogbeforeclose' + namespace, function (event) { if (saving) { event.preventDefault(); return false; } });
19021 var usualClose = dialog.dialog('option', 'close');
19022 var timer = window.setInterval(function () { if (!closed) controls(); }, 1000);
19023 dialog.dialog('option', 'close', function (event, ui) {
19024  closed = true; active = null; window.clearInterval(timer);
19025  if (xhr && xhr.readyState !== 4) xhr.abort();
19026  $(window).off(namespace); $(document).off(namespace);
19027  if (usualClose) usualClose.call(this, event, ui);
19028 });
19029 function returnToDialog() {
19030  if (!document.hidden && state && !state.emailValide && state.email && Date.now() - lastCheck > 1500) load(false, false);
19031 }
19032 $(window).on('resize' + namespace, fit).on('focus' + namespace, returnToDialog);
19033 $(document).on('visibilitychange' + namespace, returnToDialog);
19034 fit(); load(false, true);
19035 return false;
19036 };
19037 // Also cover shop links in balances, promotions and game-end screens.
19038 window.jQuery(function ($) {
19039 $(document).on('click.boutiqueAcces', 'a[href]', function (event) {
19040  if (event.isDefaultPrevented() || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || event.which > 1 || this.target === '_blank') return;
19041  var href = this.getAttribute('href'), menu = document.querySelector('.Mcredits');
19042  if (!/^\/credits\.php(?:[?#]|$)/.test(href) || !menu || menu.getAttribute('data-boutique-prete') === '1') return;
19043  event.preventDefault(); window.ouvrirBoutiqueDialogue(href);
19044 });
19045 });
19046}());
19047
19048(function () {
19049 'use strict';
19050 function init() {
19051 var root = document.getElementById('compteCoordonnees');
19052 if (!root || root.getAttribute('data-initialized')) return;
19053 root.setAttribute('data-initialized','1');
19054 var countries=window.TarotAdresses.pays;
19055 var state = {adresses:[],telephone:''}, busy = false, phoneFeedback = false;
19056 var phoneForm = root.querySelector('[data-coord-phone-form]');
19057 var phone = phoneForm.elements.telephone;
19058 var list = root.querySelector('[data-coord-list]');
19059 var statusNode = root.querySelector('[data-coord-status]');
19060 var refresh = root.querySelector('[data-coord-refresh]');
19061 var add = root.querySelector('[data-coord-add]');
19062 phone.setAttribute('aria-describedby','coordTelephoneHint');
19063
19064 function status(message,error) {
19065  var anchor = phoneFeedback ? root.querySelector('[data-coord-phone-save]') : refresh;
19066  anchor.parentNode.insertBefore(statusNode,anchor);
19067  statusNode.textContent = message;
19068  statusNode.className = 'coordStatus'+(error?' is-error':'');
19069 }
19070 function pending(value) {
19071  busy=value;
19072  root.setAttribute('aria-busy',value?'true':'false');
19073  Array.prototype.forEach.call(root.querySelectorAll('button,input,select'),function (item) { item.disabled=value; });
19074 }
19075 function request(payload) { return window.TarotAdresses.requete(payload,root.getAttribute('data-token')); }
19076 function node(tag,text,className) {
19077  var element=document.createElement(tag);
19078  if (text) element.textContent=text;
19079  if (className) element.className=className;
19080  return element;
19081 }
19082 function button(text,action,className) {
19083  var b=node('button',text,'btn'+(className?' '+className:''));
19084  b.type='button'; b.addEventListener('click',function () { if (!busy) action(); });
19085  return b;
19086 }
19087 function accept(data,updatePhone) {
19088  state=data;
19089  if (updatePhone) phone.value=data.telephone;
19090  render();
19091 }
19092 function showGeo(card,a) {
19093  var geo=node('div','','coordGeo');
19094  if (a.latitude!==null && a.longitude!==null) {
19095  geo.appendChild(node('span',a.geoStatut==='approximate'?'Position approximative \u00b7 Google Maps':'Position GPS \u00b7 Google Maps'));
19096  geo.appendChild(node('div',Number(a.latitude).toFixed(6)+', '+Number(a.longitude).toFixed(6)));
19097  var link=node('a','V\u00e9rifier sur Google Maps');
19098  link.href='https://www.google.com/maps/search/?api=1&query='+encodeURIComponent(a.latitude+','+a.longitude)+'&query_place_id='+encodeURIComponent(a.placeId);
19099  link.target='_blank'; link.rel='noopener noreferrer'; geo.appendChild(link);
19100  } else {
19101  geo.textContent=a.geoStatut==='not_found'?'Adresse enregistr\u00e9e \u00b7 position introuvable':a.geoStatut==='pending'?'Adresse enregistr\u00e9e \u00b7 GPS \u00e0 localiser':'Adresse enregistr\u00e9e \u00b7 GPS indisponible';
19102  }
19103  card.appendChild(geo);
19104 }
19105 function render() {
19106  list.textContent='';
19107  if (!state.adresses.length) {
19108  var empty=node('div','','coordEmpty');
19109  empty.appendChild(node('strong','Votre premi\u00e8re adresse, en quelques instants'));
19110  empty.appendChild(node('p','Elle sera automatiquement choisie par d\u00e9faut. Vous pourrez en ajouter d\u2019autres.'));
19111  list.appendChild(empty);
19112  }
19113  state.adresses.slice().sort(function (a,b) { return Number(b.parDefaut)-Number(a.parDefaut) || a.id-b.id; }).forEach(function (a) {
19114  var card=node('article','','coordCard'+(a.parDefaut?' is-default':''));
19115  var title=a.libelle || a.ville;
19116  var header=node('div','','coordCardHeader');
19117  header.appendChild(node('strong',title));
19118  if (a.parDefaut) header.appendChild(node('span','Par d\u00e9faut','coordBadge'));
19119  card.appendChild(header);
19120  card.appendChild(node('address',[a.nomDestinataire,a.ligne1,a.ligne2,a.codePostal+' '+a.ville,countries[a.pays]].filter(
19120Boolean).join('\n')));
19121  showGeo(card,a);
19122  var actions=node('div','','coordActions');
19123  var editButton=button('Modifier',function () { openEditor(a); });
19124  editButton.setAttribute('data-coord-edit',a.id);
19125  editButton.setAttribute('aria-label','Modifier l\u2019adresse '+title);
19126  actions.appendChild(editButton);
19127  if (!a.parDefaut) actions.appendChild(button('Choisir par d\u00e9faut',function () { mutate({action:'default',id:a.id},'Adresse par d\u00e9faut mise \u00e0 jour.'); }));
19128  if (a.geoStatut!=='located') actions.appendChild(button('Relancer la localisation',function () {
19129   pending(true); geocode(a).then(function () { pending(false); });
19130  }));
19131  actions.appendChild(button('Supprimer',function () {
19132   var confirmBox=node('div','','coordActions');
19133   confirmBox.appendChild(node('span','Supprimer cette adresse ?'));
19134   confirmBox.appendChild(button('Oui, supprimer',function () {
19135   mutate({action:'delete',id:a.id,version:a.version},'Adresse supprim\u00e9e.');
19136   },'coordDelete'));
19137   confirmBox.appendChild(button('Annuler',function () { confirmBox.parentNode.replaceChild(actions,confirmBox); editButton.focus(); }));
19138   actions.parentNode.replaceChild(confirmBox,actions);
19139   confirmBox.querySelector('button').focus();
19140  },'coordDelete'));
19141  card.appendChild(actions); list.appendChild(card);
19142  });
19143  pending(busy);
19144 }
19145 function openEditor(address) {
19146  phoneFeedback=false; status('');
19147  window.ouvrirAdresseDialogue({adresse:address}).then(function (result) {
19148  if (!result || document.getElementById('compteCoordonnees')!==root) return;
19149  phoneFeedback=false;
19150  accept(result.data,false);
19151  status(result.message,result.warning);
19152  var target=address?root.querySelector('[data-coord-edit="'+result.adresse.id+'"]'):add;
19153  if (target) target.focus();
19154  }).catch(function (error) { status(error.message,true); });
19155 }
19156 function geocode(a) {
19157  phoneFeedback=false;
19158  status('Adresse enregistr\u00e9e. Recherche de sa position GPS\u2026');
19159  return window.TarotAdresses.localiser(a,{token:root.getAttribute('data-token'),googleKey:root.getAttribute('data-google-key')}).then(function (result) {
19160   var geo=result.geo, data=result.data;
19161   accept(data,false);
19162   status(geo.geoStatut==='located'?'Adresse et position GPS enregistr\u00e9es.':geo.geoStatut==='approximate'?'Adresse enregistr\u00e9e. La position GPS est approximative : vous pouvez la v\u00e9rifier sur Google Maps.':'Adresse enregistr\u00e9e. La position GPS n\u2019a pas pu \u00eatre trouv\u00e9e. Vous pourrez relancer la localisation.',false);
19163  }).catch(function () {
19164  status('Adresse enregistr\u00e9e. La position GPS n\u2019a pas pu \u00eatre enregistr\u00e9e. Relancez la localisation ou actualisez la liste.',true); refresh.hidden=false;
19165  });
19166 }
19167 function mutate(data,message) {
19168  phoneFeedback=data.action==='phone';
19169  pending(true); status('Enregistrement\u2026');
19170  request(data).then(function (result) {
19171  accept(result,data.action==='phone'); status(message); pending(false);
19172  })
19173  .catch(function (error) { pending(false); status(error.message,true); refresh.hidden=false; });
19174 }
19175 function reload() {
19176  if (busy) return;
19177  phoneFeedback=false;
19178  pending(true); status('Chargement de vos coordonn\u00e9es\u2026');
19179  request({action:'list'}).then(function (data) {
19180  accept(data,root.querySelector('[data-coord-content]').hidden);
19181  root.querySelector('[data-coord-content]').hidden=false; refresh.hidden=true;
19182  pending(false); status('');
19183  }).catch(function (error) { pending(false); status(error.message,true); refresh.hidden=false; });
19184 }
19185 add.addEventListener('click',function () { if (!busy) openEditor(); });
19186 refresh.addEventListener('click',reload);
19187 phoneForm.addEventListener('submit',function (event) {
19188  event.preventDefault();
19189  if (busy || !phoneForm.reportValidity()) return;
19190  phoneFeedback=true;
19191  var value=phone.value.trim(), digits=value.replace(/[^0-9]/g,'');
19192  if (value && (!/^\+?[0-9 ().-]+$/.test(value) || digits.length<8 || digits.length>15)) {
19193  status('V\u00e9rifiez le num\u00e9ro : entre 8 et 15 chiffres, avec son indicatif si n\u00e9cessaire.',true); phone.focus(); return;
19194  }
19195  mutate({action:'phone',telephone:value},value?'T\u00e9l\u00e9phone enregistr\u00e9.':'T\u00e9l\u00e9phone retir\u00e9.');
19196 });
19197 reload();
19198 }
19199 if (typeof window!=='undefined') {
19200 window.initCompteCoordonnees=init;
19201 window.jQuery(function () { init(); });
19202 }
19203}());
19204
19205(function () {
19206 'use strict';
19207 var labels={disponible:'\u00c0 ouvrir',choix:'\u00c0 choisir',en_attente:'En attente d\u2019envoi',en_preparation:'Pr\u00e9paration',en_cours:'Commande transmise',fabrication:'En fabrication',expediee:'Exp\u00e9di\u00e9',recue:'Re\u00e7u',annulee:'Commande annul\u
1920700e9e',echec:'Intervention de notre \u00e9quipe',a_verifier:'V\u00e9rification en cours',a_completer:'Coordonn\u00e9es \u00e0 compl\u00e9ter',correction_attente:'Correction en attente',a_payer:'Traitement par notre \u00e9quipe'};
19208 function esc(s) { return String(s==null?'':s).replace(/[&<>"']/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c];}); }
19209 function date(n) { return n?new Date(Number(n)*1000).toLocaleDateString('fr-FR'):''; }
19210 function request(root,data) {
19211 data.token=root.getAttribute('data-token');
19212 return new Promise(function(resolve,reject){
19213  window.jQuery.ajax({url:'/workers/cadeaux.php',type:'POST',contentType:'application/json; charset=UTF-8',dataType:'json',data:JSON.stringify(data),timeout:25000,cache:false})
19214  .done(function(r){if(r && r.ok) resolve(r.data);else reject(new Error(r && r.message || 'Op\u00e9ration indisponible.'));})
19215  .fail(function(xhr){reject(new Error(xhr.responseJSON && xhr.responseJSON.message || 'Connexion interrompue. R\u00e9essayez : votre cadeau est conserv\u00e9.'));});
19216 });
19217 }
19218 function button(action,label,id,extra) { return '<button type="button" class="btn '+(extra || 'btn-default')+'" data-gift-action="'+action+'" data-id="'+esc(id)+'">'+label+'</button>'; }
19219 function present() { return '<div class="cadeauxPresent" aria-hidden="true"><div class="cadeauxPresentBody"></div><div class="cadeauxPresentLid"><i></i><b></b></div><span class="cadeauxPresentTag">&#9824;</span></div>'; }
19220 function picture(s) { return s.apercuUrl?'<img class="cadeauxPicture" src="'+esc(s.apercuUrl)+'" alt="'+esc(s.titre)+'" loading="lazy">':present(); }
19221 function country(c) { return window.TarotAdresses && window.TarotAdresses.pays[c] || c; }
19222 function addressLines(a) { return esc(a.ligne1)+(a.ligne2?'<br>'+esc(a.ligne2):'')+'<br>'+esc(a.codePostal+' '+a.ville)+'<br>'+esc(country(a.pays)); }
19223 function recap(s) {
19224 var r=s.recipient,a=r.address;
19225 return '<div class="cadeauxRecap"><div class="cadeauxRecapObject"><span class="cadeauxEyebrow">VOTRE PETIT BONHEUR</span>'+picture(s)+'<h3>'+esc(s.titre)+'</h3><span class="cadeauxGiftIncluded">Objet & livraison offerts</span></div>'+
19226  '<div class="cadeauxRecapAddress"><span class="cadeauxEyebrow">DESTINATION : CHEZ VOUS</span><div class="cadeauxPostmark" aria-hidden="true">&#9829;</div><h4>'+esc(r.name)+'</h4><p>'+esc(a.line1)+(a.line2?'<br>'+esc(a.line2):'')+'<br>'+esc(a.postalOrZipCode+' '+a.townOrCity)+'<br>'+esc(country(a.countryCode))+'</p><div class="cadeauxRecapContacts"><p><span>T\u00e9l\u00e9phone</span>'+esc(r.phoneNumber)+'</p><p><span>Email de livraison</span>'+esc(r.email)+'</p></div></div></div>';
19227 }
19228 function initPlayer(root) {
19229 if (root.dataset.giftInit) return; root.dataset.giftInit='1';
19230 var content=root.querySelector('[data-gift-content]'),status=root.querySelector('[data-gift-status]'),steps=root.querySelector('[data-gift-steps]');
19231 var inbox=null,busy=false,current=null,selected=null,confirmation=null,draft=null,screen='inbox',confettiTimer;
19232 var reduced=window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)');
19233 function motion(active) {
19234  root.dataset.motion=active?'active':'paused';
19235  var b=root.querySelector('[data-gift-motion]');b.setAttribute('aria-pressed',active?'true':'false');b.textContent=active?'Mettre les animations en pause':'Activer les animations';
19236  if(!active)root.querySelector('[data-gift-confetti]').innerHTML='';
19237 }
19238 motion(!reduced || !reduced.matches);
19239 if(reduced && reduced.addEventListener)reduced.addEventListener('change',function(e){if(e.matches)motion(false);});
19240 function burst() {
19241  if(root.dataset.motion!=='active')return;
19242  var layer=root.querySelector('[data-gift-confetti]');window.clearTimeout(confettiTimer);
19243  var bits='';for(var i=0;i<36;i++)bits+='<i style="--x:'+((i*37)%100)+'%;--drift:'+(((i*53)%240)-120)+'px;--delay:'+(i%8)*45+'ms;--turn:'+((i%2?-1:1)*(240+i*13))+'deg"></i>';
19244  layer.innerHTML=bits;confettiTimer=window.setTimeout(function(){layer.innerHTML='';},2300);
19245 }
19246 function stage(name,step) {
19247  screen=name;root.dataset.stage=name;
19248  var refresh=root.querySelector('[data-gift-refresh]');refresh.hidden=name!=='inbox' && name!=='detail';refresh.textContent=name==='inbox'?'Actualiser mes cadeaux':'Actualiser le suivi';
19249  steps.hidden=!step;
19250  steps.innerHTML=step?'<ol>'+['D\u00e9baller','Choisir','Livraison','Confirmer'].map(function(label,i){return '<li class="'+(i+1<step?'is-done':i+1===step?'is-current':'')+'" '+(i+1===step?'aria-current="step"':'')+'><span>'+(i+1<step?'&#10003;':i+1)+'</span>'+label+'</li>';}).join('')+'</ol>':'';
19251 }
19252 function heading(kicker,title,description) { return '<div class="cadeauxSectionHeading"><span class="cadeauxEyebrow">'+kicker+'</span><h3 tabindex="-1" data-gift-heading>'+title+'</h3>'+(description?'<p>'+description+'</p>':'')+'</div>'; }
19253 function focusHeading() {
19254  var h=content.querySelector('[data-gift-heading]') || content.querySelector('.cadeauxCard h3,.cadeauxEmpty h3');
19255  if(!h)return;h.tabIndex=-1;h.focus({preventScroll:true});
19256  var bounds=h.getBoundingClientRect();if(bounds.top<16 || bounds.bottom>window.innerHeight-16)h.scrollIntoView({block:'start'});
19257 }
19258 function say(message,error) {
19259  status.textContent=message;status.className='cadeauxStatus'+(error?' is-error':'');
19260  if(error){status.tabIndex=-1;status.focus({preventScroll:true});status.scrollIntoView({block:'nearest'});}
19261 }
19262 function pending(on) {
19263  busy=on;root.setAttribute('aria-busy',on?'true':'false');
19264  root.querySelectorAll('button,input,select').forEach(function(el){if(!el.hasAttribute('data-gift-motion'))el.disabled=on;});
19265 }
19266 function run(work) {
19267  if(busy)return;var previousFocus=document.activeElement,restoreFocus=root.contains(previousFocus);pending(true);say('');
19268  Promise.resolve().then(work).then(function(){
19269  pending(false);
19270  if(restoreFocus && document.activeElement===document.body){
19271   if(root.contains(previousFocus) && !previousFocus.disabled)previousFocus.focus({preventScroll:true});else focusHeading();
19272  }
19273  }).catch(function(error){pending(false);say(error.message,true);root.querySelectorAll('.is-opening').forEach(function(el){el.classList.remove('is-opening');});});
19274 }
19275 function navigation(n) {
19276  document.querySelectorAll('[data-gift-nav]').forEach(function(el){
19277  el.hidden=inbox.cadeaux.length===0;el.classList.toggle('cadeauxNavUnread',n>0);
19278  var label='Mes cadeaux'+(n>0?', '+n+' cadeau'+(n>1?'x':'')+' \u00e0 ouvrir':'');el.setAttribute('aria-label',label);
19279  var count=el.querySelector('[data-gift-count]');if(count){count.hidden=n===0;count.textContent=n;}
19280  var nav=el.closest('.joueurNavigation'),select=nav && nav.querySelector('.joueurNavigationMobile');
19281  if(select && select._joueurNavigationTargets){var index=select._joueurNavigationTargets.indexOf(el);if(index>=0){var option=select.querySelector('option[value="'+index+'"]');if(option){option.text=label;option.hidden=el.hidden;option.disabled=el.hidden;}}}
19282  });
19283 }
19284 function summary(g) {
19285  var unopened=!Number(g.dateValidation),annual=g.categorie==='annuelle';
19286  return '<article class="cadeauxCard '+(unopened?'cadeauxUnopened':'cadeauxHistoryCard')+' '+(annual?'is-annual':'is-monthly')+'">'+
19287  '<div class="cadeauxCardArt">'+(unopened?'<span class="cadeauxSpark cadeauxSparkOne" aria-hidden="true">&#10022;</span>'+present()+'<span class="cadeauxSpark cadeauxSparkTwo" aria-hidden="true">&#10022;</span>':picture(g.instantane || {}))+'</div>'+
19288  '<div class="cadeauxCardCopy"><span class="cadeauxBadge">'+(unopened?'&#10022; ':'')+'CADEAU '+(annual?'ANNUEL':'MENSUEL')+'</span><h3>'+(unopened?'Il y a de la joie<br>dans cette bo\u00eete.':esc(g.instantane?g.instantane.titre:'Votre cadeau'))+'</h3>'+
19289  '<p>'+(unopened?'Un joli cadeau vous attend. Le plus beau ?<br>C\u2019est vous qui le choisissez.':'Ouvert le '+date(g.dateValidation))+'</p>'+
19290  (!unopened?'<span class="cadeauxOrderStatus">'+esc(labels[g.statut] || g.statut)+'</span>':'')+
19291  (g.actionRequise==1?'<p class="cadeauxAttention">V\u00e9rifiez vos coordonn\u00e9es pour poursuivre l\u2019envoi.</p>':'')+
19292  '<div class="cadeauxActions">'+(unopened?button('open',Number(g.dateOuverture)?'Reprendre mon choix':'Ouvrir mon cadeau',g.id,'btn-primary'):button('detail','Suivre mon cadeau',g.id))+'</div>'+
19293  (unopened?'<small class="cadeauxCardNote">Offert le '+date(g.dateCreation)+' \u00b7 Juste pour vous</small>':'')+'</div>'+
19294  (unopened?'<span class="cadeauxCorner" aria-hidden="true">&#9829;</span>':'')+'</article>';
19295 }
19296 function renderInbox() {
19297  stage('inbox');current=null;navigation(Number(inbox.disponibles));
19298  var available=inbox.cadeaux.filter(function(g){return !Number(g.dateValidation);}),history=inbox.cadeaux.filter(function(g){return Number(g.dateValidation);});
19299  content.innerHTML=(!inbox.cadeaux.length?'<div class="cadeauxEmpty">'+present()+heading('LA PROCHAINE SURPRISE','Les belles surprises se pr\u00e9parent.','Vos prochains cadeaux vous attendront ici.')+'</
19299div>':'')+
19300  available.map(summary).join('')+(history.length?heading('LA JOIE CONTINUE','Mes cadeaux ouverts','Retrouvez vos souvenirs et suivez leur voyage jusqu\u2019\u00e0 vous.')+history.map(summary).join(''):'');
19301  say('');
19302 }
19303 function reload() {return request(root,{action:'inbox'}).then(function(data){inbox=data;renderInbox();});}
19304 function renderChoices(data) {
19305  current=data.cadeau;stage('choices',2);
19306  content.innerHTML=heading('LE PLUS DIFFICILE, C\u2019EST DE CHOISIR','Lequel vous ferait plaisir ?','Un cadeau '+(current.categorie==='annuelle'?'annuel':'mensuel')+' \u00e0 choisir. La livraison est offerte aussi.')+
19307  (data.lots.length?'<div class="cadeauxChoices">'+data.lots.map(function(l,i){return '<article class="cadeauxChoice" style="--card-delay:'+Math.min(i*65,390)+'ms"><div class="cadeauxChoiceArt"><span class="cadeauxChoiceSpark" aria-hidden="true">&#10022;</span>'+picture(l)+'</div><div class="cadeauxChoiceCopy"><h4>'+esc(l.titre)+'</h4><p>'+esc(l.description)+'</p>'+button('choose','Choisir cet objet',l.id,'btn-primary')+'</div></article>';}).join('')+'</div>':
19308  '<div class="cadeauxEmpty"><span class="cadeauxEmptyStar" aria-hidden="true">&#10022;</span><h4>Votre surprise se pr\u00e9pare</h4><p>Les objets de cette cat\u00e9gorie sont en cours de pr\u00e9paration. Votre cadeau reste disponible : revenez choisir votre objet un peu plus tard.</p></div>')+
19309  '<div class="cadeauxBack">'+button('back','Retour \u00e0 mes cadeaux','')+'</div>';
19310  root._giftChoices=data.lots;focusHeading();
19311 }
19312 function capture() {
19313  var f=content.querySelector('[data-gift-contact]');if(!f)return;
19314  draft={};['idAdresse','telephone','email'].forEach(function(n){draft[n]=f.elements[n].value;});
19315 }
19316 function activeAddress() {
19317  var f=content.querySelector('[data-gift-contact]'),id=f?f.elements.idAdresse.value:draft && draft.idAdresse;
19318  return inbox.adresses.filter(function(a){return String(a.id)===String(id);})[0];
19319 }
19320 function renderContact(addressId) {
19321  stage('contact',3);
19322  var wanted=addressId!==undefined?addressId:draft?draft.idAdresse:current.instantane && current.instantane.idAdresse;
19323  var a=inbox.adresses.filter(function(ad){return String(ad.id)===String(wanted);})[0];
19324  if(wanted===undefined || wanted===null)a=inbox.adresses[0];
19325  var r=current.instantane,d=draft || {telephone:r?r.recipient.phoneNumber:inbox.contact.telephone,email:r?r.recipient.email:inbox.contact.email};
19326  var select='<option value="" '+(!a?'selected':'')+'>Choisir une adresse</option>'+inbox.adresses.map(function(ad){return '<option value="'+esc(ad.id)+'" '+(a && Number(a.id)===Number(ad.id)?'selected':'')+'>'+esc((ad.libelle || ad.nomDestinataire || 'Adresse')+' \u2014 '+ad.ville)+'</option>';}).join('');
19327  var name=a && (a.nomDestinataire || '').trim();
19328  content.innerHTML=heading('UN DERNIER PETIT D\u00c9TAIL',Number(current.dateValidation)?'Compl\u00e9ter mes coordonn\u00e9es':'O\u00f9 envoyer votre cadeau ?','Votre surprise a sa destination. Le nom enregistr\u00e9 dans l\u2019adresse est repris automatiquement.')+
19329  '<div class="cadeauxContactLayout"><aside class="cadeauxSelected">'+picture(selected)+'<span class="cadeauxEyebrow">VOUS AVEZ CHOISI</span><h4>'+esc(selected.titre)+'</h4><span class="cadeauxGiftIncluded">Objet & livraison offerts</span><p>Encore un instant, et ce joli souvenir sera bient\u00f4t \u00e0 vous.</p>'+
19330  (!Number(current.dateValidation)?button('chooseAgain','Changer d\u2019objet',current.id):'')+'</aside>'+
19331  '<form data-gift-contact><div class="cadeauxAddressPanel"><label>Mon adresse de livraison<select class="form-control" name="idAdresse" required>'+select+'</select></label>'+
19332  (a?'<div class="cadeauxAddressCard"><span class="cadeauxPostmark" aria-hidden="true">&#9829;</span><span class="cadeauxEyebrow">\u00c0 L\u2019ATTENTION DE</span><strong data-gift-recipient>'+esc(name || 'Destinataire \u00e0 compl\u00e9ter')+'</strong><p>'+addressLines(a)+'</p></div>':
19333  '<div class="cadeauxAddressMissing"><span aria-hidden="true">&#9993;</span><p>Une adresse pour accueillir votre cadeau.</p></div>')+
19334  (a && !name?'<p class="cadeauxAttention">
19334Ajoutez le pr\u00e9nom et le nom du destinataire dans cette adresse pour continuer.</p>':'')+
19335  '<div class="cadeauxActions">'+button('address','Ajouter une adresse','')+(a?button('editAddress','Modifier cette adresse',a.id):'')+'</div></div>'+
19336  '<div class="cadeauxContactFields"><h4>Pour la livraison</h4><p>Le transporteur pourra vous joindre si n\u00e9cessaire. Votre t\u00e9l\u00e9phone sera aussi enregistr\u00e9 dans \u00ab Mes coordonn\u00e9es \u00bb \u00e0 la confirmation.</p><div class="cadeauxContactGrid">'+
19337  '<label>T\u00e9l\u00e9phone<input class="form-control" type="tel" name="telephone" autocomplete="tel" maxlength="32" required value="'+esc(d.telephone)+'"></label>'+
19338  '<label>Email de livraison<input class="form-control" type="email" name="email" autocomplete="email" maxlength="254" required value="'+esc(d.email)+'"></label></div></div>'+
19339  '<div class="cadeauxFormEnd"><span>Presque pr\u00eat \u00e0 partir !</span><button class="btn btn-primary" type="submit">V\u00e9rifier et continuer</button></div></form></div>'+
19340  '<div class="cadeauxBack">'+button('back','Retour \u00e0 mes cadeaux','')+'</div>';
19341 }
19342 function previewContact() {
19343  capture();var a=activeAddress();
19344  if(!a || !(a.nomDestinataire || '').trim())throw new Error('Compl\u00e9tez le pr\u
1934400e9nom et le nom du destinataire dans cette adresse.');
19345  return request(root,Object.assign({action:'preview',id:current.id,idLot:selected.id || current.idLot},draft)).then(function(data){
19346  confirmation=data.confirmation;stage('confirmation',4);
19347  content.innerHTML=heading('ET SI ON VOUS ENVOYAIT DU BONHEUR ?','Confirmez votre '+(data.correction?'adresse de livraison':'cadeau'),'Un dernier regard sur votre objet et son adresse de livraison.')+recap(data.recapitulatif)+
19348   '<form data-gift-accept><label class="cadeauxConsent"><input type="checkbox" required><span>Je confirme cet objet et l\u2019exactitude de mes coordonn\u00e9es de livraison.</span></label>'+
19349   '<div class="cadeauxConfirmActions">'+button('change','Modifier mes coordonn\u00e9es','')+'<button class="btn btn-primary" type="submit">'+(data.correction?'Confirmer les nouvelles coordonn\u00e9es':'Valider mon cadeau')+'</button></div></form>';
19350  focusHeading();
19351  });
19352 }
19353 function openAddress(edit) {
19354  if(typeof window.ouvrirAdresseDialogue!=='function')throw new Error('Le carnet d\u2019adresses est indisponible. Rechargez la page.');
19355  capture();var a=edit?activeAddress():null;
19356  return window.ouvrirAdresseDialogue({adresse:a || null,cadeau:true}).then(function(result){
19357  if(result){inbox.adresses=result.data.adresses;renderContact(result.adresse.id);focusHeading();say('Adresse enregistr\u00e9e. Le nom du destinataire est d\u00e9j\u00e0 repris pour votre cadeau.');}
19358  });
19359 }
19360 function deliveryProgress(g) {
19361  var index=g.statut==='recue'?3:g.statut==='expediee'?2:['en_preparation','fabrication','en_cours'].indexOf(g.statut)!==-1?1:0;
19362  return '<ol class="cadeauxDeliveryProgress" aria-label="Avancement de votre cadeau">'+['Cadeau valid\u00e9','Pr\u00e9paration','Exp\u00e9dition','Chez vous'].map(function(label,i){return '<li class="'+(i<=index?'is-done':'')+'" '+(i===index?'aria-current="step"':'')+'><span aria-hidden="true">'+(i<=index?'&#10003;':i+1)+'</span>'+label+'</li>';}).join('')+'</ol>';
19363 }
19364 function detail(g,celebrating) {
19365  var keepPosition=screen==='detail' && current && Number(current.id)===Number(g.id) && !celebrating;
19366  current=g;stage('detail');
19367  var shipments=g.livraisons.map(function(s){return '<li><span class="cadeauxParcel" aria-hidden="true">&#10022;</span><div><strong>'+esc(s.transporteur || 'Transporteur')+'</strong><p>'+esc(s.statut==='Shipped'?(g.statut==='recue'?'Votre colis a bien \u00e9t\u00e9 re\u00e7u':'Votre colis est en route'):s.statut==='Cancelled'?'Colis annul\u00e9':'Votre colis se pr\u00e9pare')+
19368  (s.numero?'<br>Num\u00e9ro de suivi : '+esc(s.numero):'')+'</p>'+(s.url?'<a class="btn btn-default" target="_blank" rel="noopener noreferrer" href="'+esc(s.url)+'">Suivre le colis</a>':'')+'</div></li>';}).join('');
19369  content.innerHTML=(celebrating?'<div class="cadeauxCelebration"><span aria-hidden="true">&#10022;</span><div><h3>'+ (g.statut==='recue'?'Le bonheur est arriv\u00e9 !':'C\u2019est confirm\u00e9. Place \u00e0 la joie !')+'</h3><p>'+ (g.statut==='recue'?'Profitez bien de votre cadeau et \u00e0 bient\u00f4t autour d\u2019une table.':'Votre cadeau est r\u00e9serv\u00e9. Son voyage jusqu\u2019\u00e0 vous peut commencer.')+'</p></div><span aria-hidden="true">&#10022;</span></div>':'')+
19370  heading('LE VOYAGE DE VOTRE CADEAU','Cadeau ouvert \u00b7 '+esc(labels[g.statut] || g.statut),'De votre victoire \u00e0 votre bo\u00eete aux lettres, retrouvez chaque \u00e9tape ici.')+deliveryProgress(g)+(g.instantane?recap(g.instantane):'')+
19371  (g.erreurCode?'<div class="cadeauxAttention" role="status"><h4>'+(g.actionRequise==1?'Un petit point \u00e0 v\u00e9rifier':'Notre \u00e9quipe s\u2019en occupe')+'</h4><p>'+esc(g.erreur)+'</p><small>Code : '+esc(g.erreurCode)+'</small>'+
19372   (g.erreurs || []).map(function(e){return '<p>'+esc(e.code)+' : '+esc(e.message)+'</p>';}).join('')+
19373   (g.actionRequise==1?'<div class="cadeauxActions">'+button('correct','Compl\u00e9ter mes coordonn\u00e9es',g.id,'btn-primary')+'</div>':'')+'</div>':'')+
19374  '<div class="cadeauxActions">'+button('detail','Actualiser ce cadeau',g.id)+(g.statut==='expediee'?button('received','J\u2019ai re\u00e7u mon cadeau',g.id,'btn-primary'):'')+'</div>'+
19375  (shipments?'<h4 class="cadeauxShippingTitle">'+(g.statut==='recue'?'Livraison termin\u00e9e':g.statut==='annulee'?'Informations de livraison':'Prochain arr\u00eat : chez vous')+'</h4><ul class="cadeauxShipments">'+shipments+'</ul>':'<p class="cadeauxTrackingHint">Les informations de livraison appara\u00eetront d\u00e8s leur transmission par le transporteur.</p>')+
19376  '<details class="cadeauxEvents"><summary>Historique du cadeau</summary>'+(g.referenceExterne?'<p>R\u00e9f\u00e9rence de commande : '+esc(g.referenceExterne)+'</p>':'')+'<ol>'+g.evenements.map(function(e){return '<li><time>'+date(e.dateCreation)+'</time> '+esc(e.message)+(e.code?' ('+esc(e.code)+')':'')+'</li>';}).join('')+'</ol></details>'+
19377  '<div class="cadeauxHelp"><p>Nous restons \u00e0 vos c\u00f4t\u00e9s.<br><a href="/Contact-organisation-jeu-de-tarot.php">Contacter notre \u00e9quipe</a> \u00b7 Cadeau n\u00b0 '+esc(g.id)+'</p>'+button('back','Retour \u00e0 mes cadeaux','')+'</div>';
19378  if(!keepPosition)focusHeading();else if(document.activeElement===document.body){var refresh=content.querySelector('[data-gift-action=detail]');if(refresh)refresh.focus({preventScroll:true});}if(celebrating)burst();
19379 }
19380 // Keep the layout intact if an old catalogue preview is no longer available.
19381 root.addEventListener('error',function(event){
19382  var img=event.target;if(!img.matches || !img.matches('img.cadeauxPicture'))return;
19383  var fallback=document.createElement('div');fallback.className='cadeauxPicture cadeauxPictureFallback';fallback.setAttribute('aria-hidden','true');fallback.innerHTML=present();
19384  img.parentNode.replaceChild(fallback,img);
19385 },true);
19386 root.addEventListener('click',function(event){
19387  var b=event.target.closest('[data-gift-action],[data-gift-refresh],[data-gift-motion]');
19388  if(!b || !root.contains(b))return;
19389  if(b.hasAttribute('data-gift-motion')){motion(root.dataset.motion!=='active');return;}
19390  if(busy)return;
19391  var action=b.getAttribute('data-gift-action'),id=b.getAttribute('data-id');
19392  run(function(){
19393  if(b.hasAttribute('data-gift-refresh'))return screen==='detail' && current?request(root,{action:'detail',id:current.id}).then(function(g){detail(g);}):reload();
19394  if(action==='back')return reload();
19395  if(action==='open'){
19396   draft=null;var card=b.closest('.cadeauxUnopened');if(card)card.classList.add('is-opening');
19397   say('Le ruban se d\u00e9noue\u2026');
19398   var opening=new Promise(function(resolve){window.setTimeout(resolve,root.dataset.motion==='active'?650:0);});
19399   return Promise.all([request(root,{action:'open',id:id}),opening]).then(function(values){say('');renderChoices(values[0]);burst();});
19400  }
19401  if(action==='chooseAgain'){capture();return request(root,{action:'choices',id:id}).then(renderChoices);}
19402  if(action==='choose'){
19403   selected=root._giftChoices.filter(function(l){return String(l.id)===id;})[0];renderContact();
19404   if(!inbox.adresses.length)return openAddress(false);
19405   var a=activeAddress();
19406   if(a && (a.nomDestinataire || '').trim() && content.querySelector('[data-gift-contact]').checkValidity())return previewContact();
19407   if(a && !(a.nomDestinataire || '').trim())return openAddress(true);
19408   focusHeading();
19409  }
19410  if(action==='address' || action==='editAddress')return openAddress(action==='editAddress');
19411  if(action==='change'){renderContact();focusHeading();}
19412  if(action==='correct'){selected=current.instantane;draft=null;renderContact();focusHeading();}
19413  if(action==='detail')return request(root,{action:'detail',id:id}).then(function(g){detail(g);});
19414  if(action==='received')return request(root,{action:'received',id:id}).then(function(g){detail(g,true);});
19415  });
19416 });
19417 root.addEventListener('change',function(event){if(event.target.name==='idAdresse'){capture();renderContact(draft.idAdresse);var select=content.querySelector('[name=idAdresse]');if(select)select.focus({preventScroll:true});}});
19418 root.addEventListener('submit',function(event){
19419  if(!event.target.matches('[data-gift-contact],[data-gift-accept]'))return;
19420  event.preventDefault();if(busy || !event.target.reportValidity())return;
19421  if(event.target.hasAttribute('data-gift-contact'))run(previewContact);
19422  else run(function(){
19423  return request(root,{action:'accept',id:current.id,confirmation:confirmation,accepte:true}).then(function(g){
19424   inbox.disponibles=Math.max(0,Number(inbox.disponibles)-(Number(current.dateValidation)?0:1));
19425   inbox.cadeaux=inbox.cadeaux.map(function(old){return Number(old.id)===Number(g.id)?g:old;});
19426   navigation(Number(inbox.disponibles));
19427   detail(g,true);
19428  });
19429  });
19430 });
19431 run(reload);
19432 }
19433 function initAdmin(root) {
19434 if(root.dataset.giftInit)return;root.dataset.giftInit='1';
19435 var form=root.querySelector('form'),busy=false;
19436 var list=document.createElement('div');list.setAttribute('data-gift-admin-list','');root.appendChild(list);
19437 function renderAdmin(rows) {
19438  list.innerHTML='<h4>Cadeaux de ce joueur</h4>'+(rows.length?rows.map(function(g){
19439  return '<p><strong>N\u00b0 '+esc(g.id)+' \u00b7 '+(g.categorie==='annuelle'?'Annuel':'Mensuel')+'</strong> \u2014 '+esc(labels[g.statut] || g.statut)+' \u00b7 '+date(g.dateCreation)+
19440   (g.erreurCode?'<br>'+esc(g.erreurCode)+' : '+esc(g.erreur):'')+(g.motif?'<br>Motif : '+esc(g.motif):'')+
19441   (['echec','a_verifier'].indexOf(g.statut)!==-1?' <button type="button" class="btn btn-default" data-gift-admin-retry="'+esc(g.id)+'">Relancer le traitement</button>':'')+'</p>';
19442  }).join(''):'<p>Aucun cadeau offert.</p>');
19443 }
19444 function loadAdmin() {
19445  return request(root,{action:'adminList',idUtil:root.getAttribute('data-player')}).then(renderAdmin).catch(function(error){list.textContent=error.message;});
19446 }
19447 list.addEventListener('click',function(event){
19448  var b=event.target.closest('[data-gift-admin-retry]');if(!b || b.disabled)return;b.disabled=true;
19449  request(root,{action:'adminRetry',id:b.getAttribute('data-gift-admin-retry'),idUtil:root.getAttribute('data-player')}).then(renderAdmin).catch(function(error){root.querySelector('[data-gift-admin-status]').textContent=error.message;b.disabled=false;});
19450 });
19451 loadAdmin();
19452
19453 form.addEventListener('submit',function(event){
19454  event.preventDefault();if(busy || !form.reportValidity())return;busy=true;
19455  var b=form.querySelector('button'),status=root.querySelector('[data-gift-admin-status]');b.disabled=true;
19456  var payload={action:'grant',idUtil:root.getAttribute('data-player'),categorie:form.elements.categorie.value,motif:form.elements.motif.value,attribution:root.getAttribute('data-attribution')};
19457  request(root,payload).then(function(data){
19458  loadAdmin();status.textContent=data.message+' (n\u00b0 '+data.id+')';b.textContent='Cadeau offert';form.querySelectorAll('input,select').forEach(function(el){el.disabled=true;});
19459  }).catch(function(error){status.textContent=error.message;busy=false;b.disabled=false;});
19460 });
19461 }
19462 function init() { document.querySelectorAll('[data-cadeaux]').forEach(initPlayer);document.querySelectorAll('[data-gift-admin]').forEach(initAdmin); }
19463 window.initCadeaux=init;
19464 window.jQuery(function(){
19465 init();
19466 var scheduled=false;
19467 new MutationObserver(function(){if(scheduled)return;scheduled=true;window.setTimeout(function(){scheduled=false;init();},0);}).observe(document.body,{childList:true,subtree:true});
19468 });
19469}());
19470
19471(function(){
19472'use strict';
19473var labels={disponible:'\u00c0 ouvrir',choix:'Choix en cours',en_attente:'En attente d\u2019envoi',en_preparation:'En pr\u00e9paration',en_cours:'Commande transmise',fabrication:'En fabrication',expediee:'Exp\u00e9di\u00e9',recue:'Re\u00e7u',annulee:'Annul\u00e9',echec:'\u00c9chec technique',a_verifier:'\u00c0 v\u00e9rifier',a_completer:'Coordonn\u00e9es \u00e0 compl\u00e9ter',correction_attente:'Correction en attente',a_payer:'Paiement \u00e0 v\u00e9rifier'};
19474var steps={downloadAssets:'R\u00e9cup\u00e9ration des visuels',allocateProductionLocation:'Affectation \u00e0 l\u2019atelier',printReadyAssetsPrepared:'Pr\u00e9paration des fichiers',inProduction:'Fabrication',shipping:'Exp\u00e9dition'};
19475var values={NotStarted:'\u00c0 venir',InProgress:'En cours',Complete:'Termin\u00e9',Completed:'Termin\u00e9',Error:'Erreur'};
19476function esc(v){return String(v==null?'':v).replace(/[&<>"']/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c];});}
19477function date(v){if(!v)return '\u2014';var d=new Date(typeof v==='number' || /^[0-9]+$/.test(String(v))?Number(v)*1000:v);return isNaN(d.getTime())?'\u2014':d.toLocaleString('fr-FR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});}
19478function tone(g){return g.erreurCode || Number(g.actionRequise) || ['echec','a_verifier','annulee','a_payer'].indexOf(g.statut)!==-1?'warning':g.statut==='recue'?'success':g.statut==='expediee'?'shipping':'normal';}
19479function badge(g){return '<span class="csBadge csBadge--'+tone(g)+'">'+esc(labels[g.statut] || g.statut)+'</span>';}
19480function button(action,text,id,primary,locked){return '<button type="button" class="csButton'+(primary?' csPrimary':'')+'" data-cs-action="'+action+'" data-id="'+esc(id)+'"'+(locked?' disabled data-locked':'')+'>'+text+'</button>';}
19481function profile(g){return '<a href="/?joueur='+encodeURIComponent(g.pseudo || '')+'&amp;part=moderationActions" target="_blank" rel="noopener noreferrer">'+esc(g.pseudo || 'Joueur n\u00b0 '+g.idUtil)+'</a>';}
19482function init(root){
19483 if(root.dataset.csInit)return;root.dataset.csInit='1';
19484 var form=root.querySelector('[data-cs-filters]'),status=root.querySelector('[data-cs-status]'),list=root.querySelector('[data-cs-list]'),detail=root.querySelector('[data-cs-detail]');
19485 var busy=false,page=1,selected=null,filters={filtre:'commandes',categorie:'',recherche:''};
19486 function say(text,error){status.textContent=text || '';status.className='csStatus'+(error?' is-error':'');if(error){status.tabIndex=-1;status.focus({preventScroll:true});status.scrollIntoView({block:'nearest'});}}
19487 function focus(node){if(!node)return;node.tabIndex=-1;node.focus({preventScroll:true});var r=node.getBoundingClientRect();if(r.top<10 || r.bottom>innerHeight)node.scrollIntoView({block:'start'});}
19488 function pending(on){busy=on;root.setAttribute('aria-busy',String(on));root.querySelectorAll('button,input,select').forEach(function(el){el.disabled=on || el.hasAttribute('data-locked');});}
19489 function run(work,message){if(busy)return;pending(true);say(message || 'Chargement\u2026');Promise.resolve().then(work).then(function(){pending(false);}).catch(function(e){pending(false);say(e.message,true);});}
19490 function api(action,data){data=data || {};data.action=action;data.token=root.dataset.token;return new Promise(function(resolve,reject){window.jQuery.ajax({url:'/workers/cadeaux.php',type:'POST',contentType:'application/json; charset=UTF-8',dataType:'json',data:JSON.stringify(data),timeout:40000,cache:false}).done(function(r){if(r && r.ok)resolve(r.data);else reject(new Error(r && r.message || 'Op\u00e9ration indisponible.'));}).fail(function(xhr){reject(new Error(xhr.responseJSON && xhr.responseJSON.message || 'Connexion interrompue. Actualisez pour v\u00e9rifier le dernier \u00e9tat enregistr\u00e9.'));});});}
19491 function showList(data){
19492 page=data.page;selected=null;list.hidden=false;detail.hidden=true;root.querySelector('[data-cs-list-refresh]').hidden=false;
19493 root.querySelector('[data-cs-metrics]').innerHTML=[['commandes','Commandes valid\u00e9es'],['a_traiter','\u00c0 surveiller'],['fabrication','En fabrication'],['expediee','En transport'],['recue','Re\u00e7us']].map(function(m){return '<button type="button" class="csMetric'+(m[0]==='a_traiter' && data.compteurs[m[0]]?' is-warning':'')+'" data-cs-action="filter" data-filter="'+m[0]+'"><strong>'+Number(data.compteurs[m[0]] || 0)+'</strong><span>'+m[1]+'</span></button>';}).join('');
19494 root.querySelector('[data-cs-results]').textContent=data.total+' r\u00e9sultat'+(data.total>1?'s':'')+' \u00b7 Liste actualis\u00e9e le '+date(data.dateLecture);
19495 root.querySelector('[data-cs-rows]').innerHTML=data.cadeaux.length?'<div class="csTableWrap"><table class="csTable"><caption class="csSrOnly">Cadeaux, du plus r\u00e9cent au plus ancien</caption><thead><tr><th>
19495Cadeau / joueur</th><th>Objet</th><th>\u00c9tat</th><th>Dernier suivi</th><th>Actions</th></tr></thead><tbody>'+data.cadeaux.map(function(g){return '<tr><td data-label="Cadeau / joueur"><strong>#'+esc(g.id)+' \u00b7 '+profile(g)+'</strong><small>'+(g.categorie==='annuelle'?'Annuel':'Mensuel')+' \u00b7 Joueur n\u00b0 '+esc(g.idUtil)+'</small><small>Attribu\u00e9 : '+date(g.dateCreation)+'</small>'+(Number(g.dateValidation)?'<small>Valid\u00e9 : '+date(g.dateValidation)+'</small>':'')+'</td><td data-label="Objet"><strong>'+esc(g.titre)+'</strong><small class="csReference">'+esc(g.referenceExterne || 'Commande non transmise')+'</small></td><td data-label="\u00c9tat">'+badge(g)+(g.erreurCode?'<small class="csErrorCode">'+esc(g.erreurCode)+'</small>':'')+(Number(g.actionRequise)?'<small>Action du joueur attendue</small>':'')+(g.sansEvolution?'<small class="csWarningText">Sans mise \u00e0 jour depuis 24 h</small>':'')+'</td><td data-label="Dernier suivi">'+date(g.referenceExterne?g.derniereVerification:g.dateModification)+'<small>'+(g.referenceExterne?'Derni\u00e8re v\u00e9rification locale':'Dernier \u00e9tat du cadeau')+'</small></td><td data-label="Actions">'+button('detail','Ouvrir la fiche',g.id)+'</td></tr>';}).join('')+'</tbody></table></div>':'<div class="csEmpty"><h3>Aucun cadeau \u00e0 afficher</h3><p>Aucun cadeau ne correspond \u00e0 ces filtres.</p>'+button('reset','Voir les commandes valid\u00e9es','')+'</div>';
19496 root.querySelector('[data-cs-pages]').innerHTML=button('previous','\u2190 Pr\u00e9c\u00e9dent','',false,page<=1)+'<span>Page '+page+' / '+data.pages+'</span>'+button('next','Suivant \u2192','',false,page>=data.pages);
19497 say('');
19498 }
19499 function load(){return api('supportList',Object.assign({page:page},filters)).then(showList);}
19500 function panel(title,html,cls){return '<section class="csPanel '+(cls || '')+'"><h3>'+title+'</h3>'+html+'</section>';}
19501 function showDetail(g,keepFocus){
19502 selected=g;list.hidden=true;detail.hidden=false;root.querySelector('[data-cs-list-refresh]').hidden=true;
19503 var f=g.fournisseur,s=g.instantane,r=s && s.recipient,a=r && r.address;
19504 var problem=g.erreurCode || f && f.erreurCode;
19505 var problemHtml=problem?'<div class="csAlert"><h3>Un point demande votre attention</h3><p>'+esc(g.erreur || f.erreur)+'</p><code>'+esc(g.erreurCode || f.erreurCode)+'</code>'+(f && f.erreurCode && f.erreurCode!==g.erreurCode?'<p>'+esc(f.erreur)+' <code>'+esc(f.erreurCode)+'</code></p>':'')+(g.erreurs || []).map(function(e){return '<p>'+esc(e.code)+' \u2014 '+esc(e.message)+'</p>';}).join('')+(Number(g.actionRequise)?'<p>Le joueur doit compl\u00e9ter ses coordonn\u00e9es depuis son compte.</p>':'')+'</div>':'';
19506 var recipient=r?'<strong>'+esc(r.name)+'</strong><p>'+esc(a.line1)+(a.line2?'<br>'+esc(a.line2):'')+'<br>'+esc(a.postalOrZipCode+' '+a.townOrCity)+'<br>'+esc(a.countryCode)+'</p><dl><dt>T\u00e9l\u00e9phone</dt><dd>'+esc(r.phoneNumber)+'</dd><dt>Email</dt><dd>'+esc(r.email)+'</dd></dl>':'<p>Le joueur n\u2019a pas encore valid\u00e9 ses coordonn\u00e9es de livraison.</p>';
19507 var production=f?'<div class="csSupplierMeta"><span>\u00c9tat Prodigi connu : <strong>'+esc({InProgress:'En cours',Complete:'Tous les colis exp\u00e9di\u00e9s',Cancelled:'Annul\u00e9e',Draft:'En pr\u00e9paration',AwaitingPayment:'Paiement attendu'}[f.etape] || f.etape || 'Pas encore disponible')+'</strong></span><span>Mise \u00e0 jour fournisseur : '+date(f.miseAJour)+'</span><span>Derni\u00e8re v\u00e9rification locale : '+date(f.derniereVerification)+'</span></div><ol class="csProduction">'+Object.keys(steps).map(function(k){var v=f.details[k] || '';return '<li class="'+(v==='Error'?'is-error':v==='InProgress'?'is-active':v==='Complete' || v==='Completed'?'is-done':'')+'"><span>'+steps[k]+'</span><strong>'+esc(values[v] || v || 'Non communiqu\u00e9')+'</strong></li>';}).join('')+'</ol>':'<p>La commande n\u2019a pas encore \u00e9t\u00e9 transmise \u00e0 Prodigi.</p>';
19508 var shipping=g.livraisons.length?g.livraisons.map(function(ship){return '<article class="csShipment"><div><strong>'+esc(ship.transporteur || 'Transporteur non communiqu\u00e9')+'</strong><span>'+esc(ship.statut==='Shipped'?(g.statut==='recue'?'R\u00e9ception confirm\u00e9e par le joueur':'Colis exp\u00e9di\u00e9'):ship.statut==='Cancelled'?'Colis annul\u00e9':ship.statut || 'En pr\u00e9paration')+'</span></div><p>Exp\u00e9dition : '+date(ship.dateExpedition)+'<br>Num\u00e9ro : <span class="csReference">'+esc(ship.numero || 'En attente')+'</span></p>'+(ship.url?'<a class="csButton" href="'+esc(ship.url)+'" target="_blank" rel="noopener noreferrer">Suivre le colis \u2197</a>':'')+'</article>';}).join(''):'<p>Les colis et num\u00e9ros de suivi appara\u00eetront d\u00e8s leur transmission par Prodigi.</p>';
19509 detail.innerHTML='<div class="csDetailToolbar">'+button('back','\u2190 Retour \u00e0 la liste','')+'<div>'+ (g.peutActualiser?button('refresh','Actualiser depuis Prodigi',g.id,true):'')+(g.peutRelancer?button('retry','Relancer le traitement',g.id):'')+'</div></div><div class="csDetailTitle"><div><span class="csEyebrow">CADEAU '+(g.categorie==='annuelle'?'ANNUEL':'MENSUEL')+'</span><h3 data-cs-heading>Cadeau n\u00b0 '+esc(g.id)+'</h3><p>'+profile(g)+' \u00b7 Joueur n\u00b0 '+esc(g.idUtil)+'</p></div>'+badge(g)+'</div>'+problemHtml+
19510 (g.correctionEnAttente?'<p class="csNotice">De nouvelles coordonn\u00e9es attendent leur transmission. L\u2019adresse affich\u00e9e reste celle de la commande actuelle.</p>':'')+
19511 (g.sansEvolution?'<p class="csNotice">Aucune mise \u00e0 jour locale depuis plus de 24 heures. Actualisez le suivi pour v\u00e9rifier la situation.</p>':'')+
19512 '<div class="csDetailGrid">'+panel('Objet et attribution','<strong>'+esc(s?s.titre:'Objet \u00e0 choisir')+'</strong><dl><dt>
19512Attribu\u00e9 le</dt><dd>'+date(g.dateCreation)+'</dd><dt>Valid\u00e9 le</dt><dd>'+date(g.dateValidation)+'</dd><dt>Offert par</dt><dd>Administrateur n\u00b0 '+esc(g.idAdmin)+'</dd></dl>'+(g.motif?'<p class="csReason">'+esc(g.motif)+'</p>':'')+'<p class="csReference">'+esc(g.referenceExterne || 'Pas encore de r\u00e9f\u00e9rence Prodigi')+'</p>')+panel('Coordonn\u00e9es de livraison',recipient)+'</div>'+panel('Fabrication et pr\u00e9paration',production)+panel('Transport et livraison',shipping)+
19513 '<details class="csHistory"><summary>Historique du cadeau ('+g.evenements.length+')</summary><ol>'+g.evenements.map(function(e){return '<li><time>'+date(e.dateCreation)+'</time><span>'+esc(e.message)+(e.code?' <code>'+esc(e.code)+'</code>':'')+'</span></li>';}).join('')+'</ol></details>';
19514 if(!keepFocus)focus(detail.querySelector('[data-cs-heading]'));else {var b=detail.querySelector('[data-cs-action=refresh]');if(b)b.focus({preventScroll:true});}
19515 say('');
19516 }
19517 form.addEventListener('submit',function(e){e.preventDefault();if(busy)return;page=1;filters={filtre:form.elements.filtre.value,categorie:form.elements.categorie.value,recherche:form.elements.recherche.value.trim()};run(load);});
19518 root.addEventListener('click',function(e){var b=e.target.closest('[data-cs-action]');if(!b || !root.contains(b) || busy || b.disabled)return;var action=b.dataset.csAction,id=b.dataset.id;
19519 run(function(){
19520 if(action==='detail')return api('supportDetail',{id:id}).then(function(g){showDetail(g);});
19521 if(action==='refresh')return api('supportRefresh',{id:id}).then(function(g){showDetail(g,true);var failed=g.fournisseur && g.fournisseur.statut==='a_verifier' && g.fournisseur.erreurCode;say(failed?'Prodigi n\u2019a pas pu confirmer le suivi. Le dernier \u00e9tat connu reste affich\u00e9.':'Le suivi a \u00e9t\u00e9 actualis\u00e9 depuis Prodigi.',!!failed);});
19522 if(action==='retry')return api('supportRetry',{id:id}).then(function(g){showDetail(g);say('La reprise est programm\u00e9e. Le robot reprendra cette m\u00eame commande.');});
19523 if(action==='back'){return load().then(function(){focus(root.querySelector('.csListIntro h3'));});}
19524 if(action==='next')page++;if(action==='previous')page=Math.max(1,page-1);
19525 if(action==='reset'){form.reset();filters={filtre:'commandes',categorie:'',recherche:''};page=1;}
19526 if(action==='filter'){form.elements.filtre.value=b.dataset.filter;filters={filtre:b.dataset.filter,categorie:form.elements.categorie.value,recherche:form.elements.recherche.value.trim()};page=1;}
19527 return load();
19528 },action==='refresh'?'Interrogation de Prodigi\u2026':action==='retry'?'Programmation de la reprise\u2026':'Chargement\u2026');
19529 });
19530 run(load);
19531}
19532window.jQuery(function(){document.querySelectorAll('[data-cadeaux-support]').forEach(init);});
19533}());
19534
19535(function (window, document) {
19536 'use strict';
19537
19538 var IMAGE_ROOT = '/Jeu-Tarot-en-ligne/Cartes-Jeu/processed/';
19539 var FIGURES = {
19540 11: {code: 'V', name: 'Valet'},
19541 12: {code: 'C', name: 'Cavalier'},
19542 13: {code: 'D', name: 'Dame'},
19543 14: {code: 'R', name: 'Roi'}
19544 };
19545 var FAMILIES = [
19546 {key: 'atouts', label: 'Atouts'},
19547 {key: 'coeur', label: 'Coeur', suitCode: 'CO', filePrefix: '1Coeur'},
19548 {key: 'trefle', label: 'Trefle', suitCode: 'T', filePrefix: '2Trefle'},
19549 {key: 'carreau', label: 'Carreau', suitCode: 'CA', filePrefix: '3Carreau'},
19550 {key: 'pique', label: 'Pique', suitCode: 'P', filePrefix: '4Pique'}
19551 ];
19552
19553 function twoDigits(number) {
19554 return number < 10 ? '0' + number : String(number);
19555 }
19556
19557 function cardButton(card) {
19558 var button = document.createElement('button');
19559 var corner = document.createElement('span');
19560 var image = document.createElement('img');
19561 var label = document.createElement('span');
19562 var tag = document.createElement('code');
19563
19564 button.type = 'button';
19565 button.className = 'html-editor-card-picker__card';
19566 button.setAttribute('data-card-tag', card.tag);
19567 button.setAttribute('title', card.name + ' (' + card.tag + ')');
19568 button.setAttribute('aria-label', 'Inserer ' + card.name + ', tag ' + card.tag);
19569
19570 corner.className = 'html-editor-card-picker__corner';
19571 corner.setAttribute('aria-hidden', 'true');
19572 image.setAttribute('data-tarot-card', card.cardName);
19573 image.src = 'data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22130%22 height=%22239%22/%3E';
19574 image.setAttribute('data-tarot-fallback', IMAGE_ROOT + card.image);
19575 image.alt = '';
19576 corner.appendChild(image);
19577
19578 label.className = 'html-editor-card-picker__name';
19579 label.textContent = card.name;
19580
19581 tag.className = 'html-editor-card-picker__tag';
19582 tag.textContent = card.tag;
19583
19584 button.appendChild(corner);
19585 button.appendChild(label);
19586 button.appendChild(tag);
19587 return button;
19588 }
19589
19590 function suitCards(family) {
19591 var cards = [];
19592 var value;
19593 var rank;
19594
19595 for (value = 1; value <= 14; value++) {
19596 rank = FIGURES[value] || {
19597 code: String(value),
19598 name: value === 1 ? 'As' : String(value)
19599 };
19600 cards.push({
19601 tag: '#' + rank.code + '_' + family.suitCode,
19602 name: rank.name + ' de ' + family.label.toLowerCase(),
19603 image: family.filePrefix + twoDigits(value) + '--130x239.png',
19604 cardName: family.filePrefix.charAt(0) + '_' + family.filePrefix.substring(1) + '-' + twoDigits(value) + '.png'
19605 });
19606 }
19607
19608 return cards;
19609 }
19610
19611 function trumpCards() {
19612 var cards = [];
19613 var value;
19614
19615 for (value = 1; value <= 21; value++) {
19616 cards.push({
19617 tag: '#' + value + '_A',
19618 name: value + " d'atout",
19619 image: '5Atout' + twoDigits(value) + '--130x239.png',
19620 cardName: '5_Atout-' + twoDigits(value) + '.png'
19621 });
19622 }
19623
19624 cards.push({
19625 tag: '#EX',
19626 name: 'Excuse',
19627 image: '6Excuse--130x239.png',
19628 cardName: '6_Excuse.png'
19629 });
19630 return cards;
19631 }
19632
19633 function cardsForFamily(family) {
19634 return family.key === 'atouts' ? trumpCards() : suitCards(family);
19635 }
19636
19637 function renderFamily(panel, familyKey) {
19638 var grid = panel.querySelector('.html-editor-card-picker__grid');
19639 var family = FAMILIES[0];
19640 var cards;
19641 var index;
19642
19643 for (index = 0; index < FAMILIES.length; index++) {
19644 if (FAMILIES[index].key === familyKey) {
19645 family = FAMILIES[index];
19646 break;
19647 }
19648 }
19649
19650 cards = cardsForFamily(family);
19651 grid.innerHTML = '';
19652 for (index = 0; index < cards.length; index++) {
19653 grid.appendChild(cardButton(cards[index]));
19654 }
19655
19656 panel.setAttribute('data-family', family.key);
19657 Array.prototype.forEach.call(
19658 panel.querySelectorAll('.html-editor-card-picker__family'),
19659 function (button) {
19660 var selected = button.getAttribute('data-family') === family.key;
19661 button.classList.toggle('is-selected', selected);
19662 button.setAttribute('aria-selected', selected ? 'true' : 'false');
19663 }
19664 );
19665 }
19666
19667 function createPanel(toolbar, editor) {
19668 var panel = document.createElement('div');
19669 var heading = document.createElement('div');
19670 var help = document.createElement('span');
19671 var families = document.createElement('div');
19672 var grid = document.createElement('div');
19673
19674 panel.className = 'html-editor-card-picker';
19675 panel.hidden = true;
19676 panel.setAttribute('data-editor-id', editor.id);
19677 panel.setAttribute('role', 'region');
19678 panel.setAttribute('aria-label', 'Choix d une carte du jeu');
19679
19680 heading.className = 'html-editor-card-picker__heading';
19681 heading.innerHTML = '<strong>Choisir une carte</strong>';
19682 help.className = 'html-editor-card-picker__help';
19683 help.textContent = 'Tag direct : #R_P. Liste : #R_P;#4_A;#EX.';
19684 heading.appendChild(help);
19685
19686 families.className = 'html-editor-card-picker__families';
19687 families.setAttribute('role', 'tablist');
19688 FAMILIES.forEach(function (family) {
19689 var button = document.createElement('button');
19690 button.type = 'button';
19691 button.className = 'html-editor-card-picker__family';
19692 button.setAttribute('data-family', family.key);
19693 button.setAttribute('role', 'tab');
19694 button.textContent = family.label;
19695 families.appendChild(button);
19696 });
19697
19698 grid.className = 'html-editor-card-picker__grid';
19699 panel.appendChild(heading);
19700 panel.appendChild(families);
19701 panel.appendChild(grid);
19702 toolbar.parentNode.insertBefore(panel, toolbar.nextSibling);
19703 renderFamily(panel, 'atouts');
19704 return panel;
19705 }
19706
19707 function closeOtherPanels(panel) {
19708 Array.prototype.forEach.call(
19709 document.querySelectorAll('.html-editor-card-picker:not([hidden])'),
19710 function (otherPanel) {
19711 if (otherPanel === panel) return;
19712 otherPanel.hidden = true;
19713 var otherToolbar = otherPanel.previousElementSibling;
19714 if (otherToolbar) {
19715 otherToolbar.classList.remove('has-open-card-picker');
19716 var otherButton = otherToolbar.querySelector('[data-command="card"]');
19717 if (otherButton) otherButton.setAttribute('aria-expanded', 'false');
19718 }
19719 }
19720 );
19721 }
19722
19723 function toggle(toolbar, editor, toggleButton) {
19724 var panel = toolbar.parentNode.querySelector(
19725 '.html-editor-card-picker[data-editor-id="' + editor.id + '"]'
19726 );
19727
19728 if (!panel) panel = createPanel(toolbar, editor);
19729 closeOtherPanels(panel);
19730 panel.hidden = !panel.hidden;
19731 toolbar.classList.toggle('has-open-card-picker', !panel.hidden);
19732 toggleButton.setAttribute('aria-expanded', panel.hidden ? 'false' : 'true');
19733 }
19734
19735 var cardPreview = null;
19736
19737 function getCardPreview() {
19738 if (cardPreview)
19739 return cardPreview;
19740
19741 cardPreview = document.createElement('span');
19742 cardPreview.className = 'forumCardPreview';
19743 cardPreview.setAttribute('aria-hidden','true');
19744 cardPreview.innerHTML = '<img src="" alt="">';
19745 document.body.appendChild(cardPreview);
19746 return cardPreview;
19747 }
19748
19749 function positionCardPreview(cardTag) {
19750 var preview = getCardPreview();
19751 var source = cardTag.querySelector('.forumCardTag__corner img');
19752 var previewImage;
19753 var cardRect;
19754 var previewRect;
19755 var left;
19756 var top;
19757 var margin = 8;
19758
19759 if (!source)
19760 return;
19761
19762 // Preserve lazy metadata if the user opens the preview before the deck is ready.
19763 previewImage = source.cloneNode(false);
19764 preview.replaceChild(previewImage, preview.querySelector('img'));
19765 previewImage.alt = cardTag.getAttribute('title') || '';
19766 preview.classList.add('is-visible');
19767
19768 cardRect = cardTag.getBoundingClientRect();
19769 previewRect = preview.getBoundingClientRect();
19770 left = cardRect.left + cardRect.width/2 - previewRect.width/2;
19771 left = Math.max(margin,Math.min(
19772 left,
19773 document.documentElement.clientWidth-previewRect.width-margin
19774 ));
19775
19776 if (cardRect.top>=previewRect.height+margin)
19777 top = cardRect.top-previewRect.height-margin;
19778 else
19779 top = cardRect.bottom+margin;
19780 top = Math.max(margin,Math.min(
19781 top,
19782 document.documentElement.clientHeight-previewRect.height-margin
19783 ));
19784
19785 preview.style.left = Math.round(left)+'px';
19786 preview.style.top = Math.round(top)+'px';
19787 }
19788
19789 function hideCardPreview() {
19790 if (cardPreview)
19791 cardPreview.classList.remove('is-visible');
19792 }
19793
19794 document.addEventListener('mouseover',function (event) {
19795 var cardTag = event.target.closest('.forumCardTag');
19796 if (!cardTag || (event.relatedTarget && cardTag.contains(event.relatedTarget)))
19797 return;
19798 positionCardPreview(cardTag);
19799 });
19800
19801 document.addEventListener('mouseout',function (event) {
19802 var cardTag = event.target.closest('.forumCardTag');
19803 if (!cardTag || (event.relatedTarget && cardTag.contains(event.relatedTarget)))
19804 return;
19805 hideCardPreview();
19806 });
19807
19808 document.addEventListener('focusin',function (event) {
19809 var cardTag = event.target.closest('.forumCardTag');
19810 if (cardTag)
19811 positionCardPreview(cardTag);
19812 });
19813
19814 document.addEventListener('focusout',function (event) {
19815 if (event.target.closest('.forumCardTag'))
19816 hideCardPreview();
19817 });
19818
19819 window.addEventListener('scroll',hideCardPreview,true);
19820 window.addEventListener('resize',hideCardPreview);
19821
19822 document.addEventListener('click', function (event) {
19823 var familyButton = event.target.closest('.html-editor-card-picker__family');
19824 var card = event.target.closest('.html-editor-card-picker__card');
19825 var panel;
19826 var editor;
19827 var toolbar;
19828 var toggleButton;
19829
19830 if (familyButton) {
19831 panel = familyButton.closest('.html-editor-card-picker');
19832 renderFamily(panel, familyButton.getAttribute('data-family'));
19833 return;
19834 }
19835
19836 if (!card) return;
19837 panel = card.closest('.html-editor-card-picker');
19838 editor = document.getElementById(panel.getAttribute('data-editor-id'));
19839 if (!editor) return;
19840
19841 if (typeof window.insertIntoEditor === 'function') {
19842 window.insertIntoEditor(editor, card.getAttribute('data-card-tag'));
19843 }
19844
19845 panel.hidden = true;
19846 toolbar = panel.previousElementSibling;
19847 if (toolbar) {
19848 toolbar.classList.remove('has-open-card-picker');
19849 toggleButton = toolbar.querySelector('[data-command="card"]');
19850 if (toggleButton) toggleButton.setAttribute('aria-expanded', 'false');
19851 }
19852 });
19853
19854 window.ForumCardPicker = {
19855 toggle: toggle
19856 };
19857}(window, document));
19858
19859(function () {
19860 'use strict';
19861
19862 var componentCounter = 0;
19863
19864 function currentForumTopicId() {
19865 var match = window.location.pathname.match(/\/forum-sujet\/([0-9]+)/i);
19866 if (match)
19867 return parseInt(match[1],10) || 0;
19868 match = window.location.search.match(/[?&]idSujet=([0-9]+)/i);
19869 return match ? (parseInt(match[1],10) || 0) : 0;
19870 }
19871
19872 function componentOptions(input) {
19873 var editorId = input.getAttribute('data-editor-id') || '';
19874 var topicId = parseInt(input.getAttribute('data-id-sujet'),10) || currentForumTopicId();
19875 var responseId = parseInt(input.getAttribute('data-id-reponse'),10) || 0;
19876 var sources = input.getAttribute('data-sources') || '';
19877
19878 return {
19879 input:input,
19880 targetId:input.id,
19881 idTarget:input.getAttribute('data-id-target') || '',
19882 editorId:editorId,
19883 topicId:topicId,
19884 responseId:responseId,
19885 sources:sources,
19886 initialSource:input.getAttribute('data-source-initiale') || '',
19887 includeBlocked:input.getAttribute('data-include-blocked')==='1',
19888 term:input.value || ''
19889 };
19890 }
19891
19892 function initializeInput(input) {
19893 if (!input || input.getAttribute('data-recherche-joueur-initialisee')==='1')
19894 return;
19895
19896 input.setAttribute('data-recherche-joueur-initialisee','1');
19897 input.setAttribute('autocomplete','off');
19898 if (!input.id) {
19899 componentCounter++;
19900 input.id = 'rechercheJoueurComposant'+componentCounter;
19901 }
19902
19903 var wrapper = document.createElement('span');
19904 wrapper.className = 'recherche-joueur-composant';
19905 if (input.getAttribute('data-compact')==='1')
19906 wrapper.className += ' recherche-joueur-composant--compact';
19907 input.parentNode.insertBefore(wrapper,input);
19908 wrapper.appendChild(input);
19909
19910 var button = document.createElement('button');
19911 button.type = 'button';
19912 button.className = 'btn btn-default recherche-joueur-composant__button';
19913 button.setAttribute('aria-label','Rechercher et choisir un joueur');
19914 button.innerHTML = '<span class="glyphicon glyphicon-search" aria-hidden="true"></span>'+
19915 '<span class="recherche-joueur-composant__button-label"> Choisir</span>';
19916 wrapper.appendChild(button);
19917
19918 button.addEventListener('click',function () {
19919 openPlayerSearch(componentOptions(input));
19920 });
19921
19922 input.addEventListener('keydown',function (event) {
19923 var key = event.which || event.keyCode;
19924 if (key===13) {
19925 event.preventDefault();
19926 openPlayerSearch(componentOptions(input));
19927 }
19928 });
19929
19930 input.addEventListener('input',function () {
19931 input.removeAttribute('data-joueur-id');
19932 var idTarget = input.getAttribute('data-id-target');
19933 if (idTarget && document.getElementById(idTarget))
19934 document.getElementById(idTarget).value = '';
19935 var selectionShow = input.getAttribute('data-selection-show');
19936 if (selectionShow)
19937 $('#'+selectionShow).hide();
19938 });
19939 }
19940
19941 function initializeAll(root) {
19942 root = root || document;
19943 if (root.nodeType===1 && root.classList.contains('composantRechercheJoueur'))
19944 initializeInput(root);
19945 var inputs = root.querySelectorAll ? root.querySelectorAll('.composantRechercheJoueur') : [];
19946 for (var i=0;i<inputs.length;i++)
19947 initializeInput(inputs[i]);
19948 }
19949
19950 function ajaxParameters(options) {
19951 return {
19952 idSujet:options.topicId || 0,
19953 idReponse:options.responseId || 0,
19954 sources:options.sources || '',
19955 sourceInitiale:options.initialSource || '',
19956 cible:options.targetId || '',
19957 cibleId:options.idTarget || '',
19958 editorId:options.editorId || '',
19959 inclureBloques:options.includeBlocked ? 1 : 0
19960 };
19961 }
19962
19963 function loadResults(dialog,source,term) {
19964 var results = dialog.querySelector('.recherche-joueur-dialog__results');
19965 if (!results)
19966 return;
19967
19968 results.innerHTML = '<p class="recherche-joueur-dialog__status">Chargement...</p>';
19969 var parameters = {
19970 action:'search',
19971 source:source,
19972 terme:term || '',
19973 idSujet:dialog.getAttribute('data-id-sujet') || 0,
19974 idReponse:dialog.getAttribute('data-id-reponse') || 0,
19975 cible:dialog.getAttribute('data-cible') || '',
19976 inclureBloques:dialog.getAttribute('data-inclure-bloques') || 0
19977 };
19978
19979 ajax('/workers/rechercheJoueur.php',parameters,function (html) {
19980 results.innerHTML = html;
19981 });
19982 }
19983
19984 function closeSearchPanel(dialog) {
19985 var panel = dialog.closest('.recherche-joueur-composant__panel');
19986 removeSearchPanel(panel);
19987 }
19988
19989 function removeSearchPanel(panel) {
19990 if (!panel)
19991 return;
19992 if (panel._rechercheJoueurResizeObserver)
19993 panel._rechercheJoueurResizeObserver.disconnect();
19994 if (panel._rechercheJoueurToolForm)
19995 panel._rechercheJoueurToolForm.classList.remove('is-player-search-open');
19996 if (panel.parentNode)
19997 panel.parentNode.removeChild(panel);
19998 }
19999
20000 function floatSearchPanel(panel,wrapper) {
20001 var fields = wrapper ? wrapper.closest('.moderationToolForm__fields') : null;
20002 if (!fields)
20003 return;
20004
20005 panel.classList.add('recherche-joueur-composant__panel--floating');
20006 var toolForm = fields.closest('.moderationToolForm');
20007 if (toolForm) {
20008 toolForm.classList.add('is-player-search-open');
20009 panel._rechercheJoueurToolForm = toolForm;
20010 }
20011
20012 var positionPanel = function () {
20013 if (!panel.parentNode || !wrapper.parentNode)
20014 return;
20015 panel.style.left = wrapper.offsetLeft+'px';
20016 panel.style.top = (wrapper.offsetTop+wrapper.offsetHeight+6)+'px';
20017 panel.style.width = wrapper.offsetWidth+'px';
20018 };
20019 positionPanel();
20020
20021 if (typeof ResizeObserver === 'function') {
20022 panel._rechercheJoueurResizeObserver = new ResizeObserver(positionPanel);
20023 panel._rechercheJoueurResizeObserver.observe(wrapper);
20024 }
20025 }
20026
20027 function selectPlayer(dialog,button) {
20028 var playerId = button.getAttribute('data-joueur-id') || '';
20029 var pseudo = button.getAttribute('data-joueur-pseudo') || '';
20030 var targetId = dialog.getAttribute('data-cible') || '';
20031 var idTarget = dialog.getAttribute('data-cible-id') || '';
20032 var editorId = dialog.getAttribute('data-editor-id') || '';
20033 var input = targetId ? document.getElementById(targetId) : null;
20034 var editor = editorId ? document.getElementById(editorId) : null;
20035
20036 if (input) {
20037 input.value = pseudo;
20038 input.setAttribute('data-joueur-id',playerId);
20039 if (idTarget && document.getElementById(idTarget))
20040 document.getElementById(idTarget).value = playerId;
20041 var selectionShow = input.getAttribute('data-selection-show');
20042 if (selectionShow)
20043 $('#'+selectionShow).show();
20044 var changeEvent;
20045 if (typeof Event === 'function')
20046 changeEvent = new Event('change',{bubbles:true});
20047 else {
20048 changeEvent = document.createEvent('Event');
20049 changeEvent.initEvent('change',true,true);
20050 }
20051 input.dispatchEvent(changeEvent);
20052
20053 var selectedEvent;
20054 if (typeof CustomEvent === 'function') {
20055 selectedEvent = new CustomEvent('joueurselectionne',{
20056 bubbles:true,
20057 detail:{id:parseInt(playerId,10) || 0,pseudo:pseudo}
20058 });
20059 input.dispatchEvent(selectedEvent);
20060 }
20061 }
20062
20063 if (editor) {
20064 /*
20065 * Le parseur des mentions utilise l'espace comme separateur.
20066 * Seuls les espaces appartenant au pseudo sont donc encodes ;
20067 * le dernier espace reste le separateur de la mention.
20068 */
20069 var mention = '@'+pseudo.replace(/ /g,'%20')+' ';
20070 if (typeof window.insertIntoEditor === 'function')
20071 window.insertIntoEditor(editor,mention);
20072 else {
20073 editor.value += mention;
20074 editor.focus();
20075 }
20076 }
20077
20078 closeSearchPanel(dialog);
20079 }
20080
20081 function bindDialog(dialog,initialTerm) {
20082 var searchInput = dialog.querySelector('.recherche-joueur-dialog__term');
20083 var searchContainer = dialog.querySelector('.recherche-joueur-dialog__search');
20084 var submitButton = dialog.querySelector('.recherche-joueur-dialog__submit');
20085 var active = dialog.querySelector('.recherche-joueur-dialog__source.is-active');
20086 var source = active ? active.getAttribute('data-source') : 'amis';
20087
20088 if (searchInput && initialTerm)
20089 searchInput.value = initialTerm;
20090
20091 dialog.addEventListener('click',function (event) {
20092 var sourceButton = event.target.closest('.recherche-joueur-dialog__source');
20093 if (sourceButton) {
20094 var buttons = dialog.querySelectorAll('.recherche-joueur-dialog__source');
20095 for (var i=0;i<buttons.length;i++) {
20096 buttons[i].classList.remove('is-active');
20097 buttons[i].setAttribute('aria-selected','false');
20098 }
20099 sourceButton.classList.add('is-active');
20100 sourceButton.setAttribute('aria-selected','true');
20101 source = sourceButton.getAttribute('data-source');
20102 loadResults(dialog,source,searchInput ? searchInput.value : '');
20103 return;
20104 }
20105
20106 var playerButton = event.target.closest('.recherche-joueur-resultat');
20107 if (playerButton)
20108 selectPlayer(dialog,playerButton);
20109 });
20110
20111 if (submitButton) {
20112 submitButton.addEventListener('click',function () {
20113 loadResults(dialog,source,searchInput ? searchInput.value : '');
20114 });
20115 }
20116
20117 if (searchContainer) {
20118 searchContainer.addEventListener('keydown',function (event) {
20119 var key = event.which || event.keyCode;
20120 if (key!==13)
20121 return;
20122 event.preventDefault();
20123 loadResults(dialog,source,searchInput ? searchInput.value : '');
20124 });
20125 }
20126
20127 loadResults(dialog,source,searchInput ? searchInput.value : '');
20128 }
20129
20130 function openPlayerSearch(options) {
20131 options = options || {};
20132 options.topicId = parseInt(options.topicId,10) || currentForumTopicId();
20133 options.responseId = parseInt(options.responseId,10) || 0;
20134 var referenceId = options.targetId || options.editorId || ('libre'+(++componentCounter));
20135 var panelId = 'rechercheJoueurPanel'+String(referenceId).replace(/[^a-z0-9_-]/ig,'_');
20136 var existingPanel = document.getElementById(panelId);
20137 if (existingPanel) {
20138 removeSearchPanel(existingPanel);
20139 return;
20140 }
20141
20142 var anchor = options.input || (
20143 options.editorId ? document.getElementById(options.editorId) : null
20144 );
20145 if (!anchor || !anchor.parentNode)
20146 return;
20147
20148 var panel = document.createElement('div');
20149 panel.id = panelId;
20150 panel.className = 'recherche-joueur-composant__panel';
20151 panel.innerHTML = '<p class="recherche-joueur-dialog__status">Chargement...</p>';
20152 if (options.input) {
20153 var wrapper = options.input.closest('.recherche-joueur-composant');
20154 if (wrapper && wrapper.parentNode) {
20155 wrapper.parentNode.insertBefore(panel,wrapper.nextSibling);
20156 floatSearchPanel(panel,wrapper);
20157 } else
20158 anchor.parentNode.insertBefore(panel,anchor.nextSibling);
20159 } else {
20160 anchor.parentNode.insertBefore(panel,anchor);
20161 }
20162
20163 var parameters = ajaxParameters(options);
20164 parameters.action = 'dialog';
20165
20166 ajax('/workers/rechercheJoueur.php',parameters,function (html) {
20167 if (!document.getElementById(panelId))
20168 return;
20169 panel.innerHTML = html;
20170 var dialog = panel.querySelector('.recherche-joueur-dialog');
20171 if (dialog)
20172 bindDialog(dialog,options.term || '');
20173 });
20174 }
20175
20176 window.initialiserComposantsRechercheJoueur = initializeAll;
20177 window.ouvrirRechercheJoueur = openPlayerSearch;
20178
20179 /*
20180 * Compatibilite avec le bouton "joueur" de l'editeur HTML existant.
20181 * Le contexte forum est detecte dans l'URL ; hors forum, l'onglet
20182 * "participants" n'est donc jamais propose.
20183 */
20184 window.openFriends = function (editorId) {
20185 var editor = document.getElementById(editorId);
20186 openPlayerSearch({
20187 editorId:editorId,
20188 topicId:editor ? (parseInt(editor.getAttribute('data-id-sujet'),10) || 0) : 0,
20189 responseId:editor ? (parseInt(editor.getAttribute('data-id-reponse'),10) || 0) : 0,
20190 sources:'tous,amis,sujet,recents'
20191 });
20192 };
20193
20194 if (document.readyState==='loading')
20195 document.addEventListener('DOMContentLoaded',function () { initializeAll(document); });
20196 else
20197 initializeAll(document);
20198
20199 if (window.MutationObserver) {
20200 var observer = new MutationObserver(function (mutations) {
20201 for (var i=0;i<mutations.length;i++) {
20202 for (var j=0;j<mutations[i].addedNodes.length;j++)
20203 initializeAll(mutations[i].addedNodes[j]);
20204 }
20205 });
20206 observer.observe(document.documentElement,{childList:true,subtree:true});
20207 }
20208}());
20209
20210(function () {
20211 'use strict';
20212
20213 var compteur = 0;
20214
20215 function optionsChamp(input) {
20216 return {
20217 input:input,
20218 targetId:input.id,
20219 idTarget:input.getAttribute('data-id-target') || '',
20220 editorId:input.getAttribute('data-editor-id') || '',
20221 playerId:parseInt(input.getAttribute('data-id-joueur'),10) || 0,
20222 mode:input.getAttribute('data-mode') || '',
20223 page:parseInt(input.getAttribute('data-page'),10) || 0,
20224 pageMode:false
20225 };
20226 }
20227
20228 function initialiserChamp(input) {
20229 if (!input || input.getAttribute('data-recherche-partie-initialisee')==='1')
20230 return;
20231
20232 input.setAttribute('data-recherche-partie-initialisee','1');
20233 input.setAttribute('autocomplete','off');
20234 if (!input.id) {
20235 compteur++;
20236 input.id = 'recherchePartieComposant'+compteur;
20237 }
20238
20239 var wrapper = document.createElement('span');
20240 wrapper.className = 'recherche-partie-composant';
20241 input.parentNode.insertBefore(wrapper,input);
20242 wrapper.appendChild(input);
20243
20244 var button = document.createElement('button');
20245 button.type = 'button';
20246 button.className = 'btn btn-default recherche-partie-composant__button';
20247 button.innerHTML = '<span class="glyphicon glyphicon-search" aria-hidden="true"></span> Choisir';
20248 wrapper.appendChild(button);
20249
20250 button.addEventListener('click',function () {
20251 ouvrirRecherchePartie(optionsChamp(input));
20252 });
20253
20254 input.addEventListener('keydown',function (event) {
20255 var key = event.which || event.keyCode;
20256 if (key===13) {
20257 event.preventDefault();
20258 ouvrirRecherchePartie(optionsChamp(input));
20259 }
20260 });
20261
20262 input.addEventListener('input',function () {
20263 input.removeAttribute('data-partie-id');
20264 var idTarget = input.getAttribute('data-id-target');
20265 if (idTarget && document.getElementById(idTarget))
20266 document.getElementById(idTarget).value = '';
20267 });
20268 }
20269
20270 function ouvrirRecapitulatif(idPartie) {
20271 idPartie = parseInt(idPartie,10) || 0;
20272 if (!idPartie)
20273 return;
20274 if (typeof window.showWorkerPageBg === 'function')
20275 window.showWorkerPageBg('partie','idPartie='+idPartie);
20276 else
20277 window.location.href = '/?idPartie='+idPartie;
20278 }
20279
20280 function selectionnerPartie(panel,idPartie) {
20281 var options = panel._recherchePartieOptions || {};
20282 idPartie = parseInt(idPartie,10) || 0;
20283 if (!idPartie)
20284 return;
20285
20286 if (options.pageMode) {
20287 ouvrirRecapitulatif(idPartie);
20288 return;
20289 }
20290
20291 if (options.editorId) {
20292 var editor = document.getElementById(options.editorId);
20293 if (editor) {
20294 var balise = '<partie'+idPartie+'/>';
20295 if (typeof window.insertIntoEditor === 'function')
20296 window.insertIntoEditor(editor,balise);
20297 else {
20298 editor.value += balise;
20299 editor.focus();
20300 }
20301 }
20302 }
20303
20304 if (options.targetId) {
20305 var input = document.getElementById(options.targetId);
20306 if (input) {
20307 input.value = idPartie;
20308 input.setAttribute('data-partie-id',idPartie);
20309 if (options.idTarget && document.getElementById(options.idTarget))
20310 document.getElementById(options.idTarget).value = idPartie;
20311 var event;
20312 if (typeof Event === 'function')
20313 event = new Event('change',{bubbles:true});
20314 else {
20315 event = document.createEvent('Event');
20316 event.initEvent('change',true,true);
20317 }
20318 input.dispatchEvent(event);
20319 }
20320 }
20321
20322 if (panel.parentNode)
20323 panel.parentNode.removeChild(panel);
20324 }
20325
20326 function chargerResultats(panel,idPartie,page) {
20327 var panneau = panel.querySelector('.recherche-partie-panneau');
20328 var resultats = panel.querySelector('.recherche-partie-panneau__resultats');
20329 if (!panneau || !resultats)
20330 return;
20331
20332 var mode = panneau.getAttribute('data-mode') || '';
20333 page = Math.max(0,parseInt(page,10) || 0);
20334 panneau.setAttribute('data-page',page);
20335 resultats.innerHTML = '<p class="recherche-partie-chargement">Chargement...</p>';
20336
20337 ajax('/workers/recherchePartie.php',{
20338 action:'search',
20339 idJoueur:panneau.getAttribute('data-id-joueur') || 0,
20340 mode:mode,
20341 page:page,
20342 modePage:panneau.getAttribute('data-mode-page') || 0,
20343 idPartie:parseInt(idPartie,10) || 0
20344 },function (html) {
20345 if (panel.parentNode)
20346 resultats.innerHTML = html;
20347 });
20348 }
20349
20350 function lierPanneau(panel) {
20351 var panneau = panel.querySelector('.recherche-partie-panneau');
20352 if (!panneau)
20353 return;
20354
20355 panel.addEventListener('click',function (event) {
20356 var modeButton = event.target.closest('.recherche-partie-panneau__mode');
20357 if (modeButton) {
20358 var buttons = panel.querySelectorAll('.recherche-partie-panneau__mode');
20359 for (var i=0;i<buttons.length;i++)
20360 buttons[i].classList.remove('is-active');
20361 modeButton.classList.add('is-active');
20362 panneau.setAttribute('data-mode',modeButton.getAttribute('data-mode') || '');
20363 chargerResultats(panel,0,0);
20364 return;
20365 }
20366
20367 var submit = event.target.closest('.recherche-partie-panneau__numero-submit');
20368 if (submit) {
20369 var input = panel.querySelector('.recherche-partie-panneau__numero-input');
20370 chargerResultats(panel,input ? input.value : 0,0);
20371 return;
20372 }
20373
20374 var pageButton = event.target.closest('.recherche-partie-panneau__page');
20375 if (pageButton) {
20376 chargerResultats(panel,0,pageButton.getAttribute('data-page'));
20377 return;
20378 }
20379
20380 var partie = event.target.closest('.recherche-partie-resultat');
20381 if (partie)
20382 selectionnerPartie(panel,partie.getAttribute('data-id-partie'));
20383 });
20384
20385 var numeroInput = panel.querySelector('.recherche-partie-panneau__numero-input');
20386 if (numeroInput) {
20387 numeroInput.addEventListener('keydown',function (event) {
20388 var key = event.which || event.keyCode;
20389 if (key===13) {
20390 event.preventDefault();
20391 chargerResultats(panel,numeroInput.value,0);
20392 }
20393 });
20394 }
20395
20396 chargerResultats(panel,0,panneau.getAttribute('data-page') || 0);
20397 }
20398
20399 function chargerPanneau(panel,options) {
20400 panel._recherchePartieOptions = options;
20401 panel.innerHTML = '<p class="recherche-partie-chargement">Chargement...</p>';
20402 ajax('/workers/recherchePartie.php',{
20403 action:'panel',
20404 idJoueur:options.playerId || 0,
20405 mode:options.mode || '',
20406 page:options.page || 0,
20407 modePage:options.pageMode ? 1 : 0
20408 },function (html) {
20409 if (!panel.parentNode)
20410 return;
20411 panel.innerHTML = html;
20412 lierPanneau(panel);
20413 });
20414 }
20415
20416 function ouvrirRecherchePartie(options) {
20417 options = options || {};
20418 var reference = options.targetId || options.editorId || ('libre'+(++compteur));
20419 var panelId = 'recherchePartiePanel'+String(reference).replace(/[^a-z0-9_-]/ig,'_');
20420 var existing = document.getElementById(panelId);
20421 if (existing) {
20422 existing.parentNode.removeChild(existing);
20423 return;
20424 }
20425
20426 var anchor = options.input || (
20427 options.editorId ? document.getElementById(options.editorId) : null
20428 );
20429 if (!anchor || !anchor.parentNode)
20430 return;
20431
20432 var panel = document.createElement('div');
20433 panel.id = panelId;
20434 panel.className = 'recherche-partie-composant__panel';
20435
20436 if (options.input) {
20437 var wrapper = options.input.closest('.recherche-partie-composant');
20438 wrapper.parentNode.insertBefore(panel,wrapper.nextSibling);
20439 } else {
20440 anchor.parentNode.insertBefore(panel,anchor);
20441 }
20442 chargerPanneau(panel,options);
20443 }
20444
20445 function initialiserListe(root) {
20446 if (root.getAttribute('data-recherche-partie-initialisee')==='1')
20447 return;
20448 root.setAttribute('data-recherche-partie-initialisee','1');
20449 var options = {
20450 playerId:parseInt(root.getAttribute('data-id-joueur'),10) || 0,
20451 mode:root.getAttribute('data-mode') || '',
20452 page:parseInt(root.getAttribute('data-page'),10) || 0,
20453 pageMode:true
20454 };
20455 chargerPanneau(root,options);
20456 }
20457
20458 var citationPreview = null;
20459 var citationActive = null;
20460 var citationEpinglee = null;
20461
20462 function obtenirCitationPreview() {
20463 if (citationPreview)
20464 return citationPreview;
20465 citationPreview = document.createElement('div');
20466 citationPreview.className = 'forumPartieCitationPreview';
20467 citationPreview.setAttribute('aria-hidden','true');
20468 document.body.appendChild(citationPreview);
20469 return citationPreview;
20470 }
20471
20472 function positionnerCitationPreview(root) {
20473 var preview = obtenirCitationPreview();
20474 var rootRect;
20475 var previewRect;
20476 var left;
20477 var top;
20478 var marge = 8;
20479
20480 if (!preview.classList.contains('is-visible'))
20481 return;
20482 rootRect = root.getBoundingClientRect();
20483 previewRect = preview.getBoundingClientRect();
20484 left = rootRect.left+rootRect.width/2-previewRect.width/2;
20485 left = Math.max(marge,Math.min(
20486 left,
20487 document.documentElement.clientWidth-previewRect.width-marge
20488 ));
20489 if (rootRect.top>=previewRect.height+marge)
20490 top = rootRect.top-previewRect.height-marge;
20491 else
20492 top = rootRect.bottom+marge;
20493 top = Math.max(marge,Math.min(
20494 top,
20495 document.documentElement.clientHeight-previewRect.height-marge
20496 ));
20497 preview.style.left = Math.round(left)+'px';
20498 preview.style.top = Math.round(top)+'px';
20499 }
20500
20501 function chargerCitation(root) {
20502 var preview = obtenirCitationPreview();
20503 var idPartie = parseInt(root.getAttribute('data-id-partie'),10) || 0;
20504 if (!idPartie)
20505 return;
20506 if (root._citationPartieHtml) {
20507 preview.innerHTML = root._citationPartieHtml;
20508 positionnerCitationPreview(root);
20509 return;
20510 }
20511 if (root._citationPartieLoading)
20512 return;
20513 root._citationPartieLoading = true;
20514 preview.innerHTML = '<p class="recherche-partie-chargement">Chargement de la partie...</p>';
20515 ajax('/workers/recherchePartie.php',{
20516 action:'citation',
20517 idPartie:idPartie
20518 },function (html) {
20519 root._citationPartieLoading = false;
20520 root._citationPartieHtml = html;
20521 if (citationActive===root) {
20522 preview.innerHTML = html;
20523 positionnerCitationPreview(root);
20524 }
20525 });
20526 }
20527
20528 function afficherCitation(root) {
20529 var preview;
20530 var trigger;
20531 if (citationEpinglee && citationEpinglee!==root) {
20532 citationEpinglee.classList.remove('is-pinned');
20533 trigger = citationEpinglee.querySelector('.forumPartieCitation__trigger');
20534 if (trigger)
20535 trigger.setAttribute('aria-expanded','false');
20536 }
20537 citationActive = root;
20538 citationEpinglee = root;
20539 root.classList.add('is-pinned');
20540 trigger = root.querySelector('.forumPartieCitation__trigger');
20541 if (trigger)
20542 trigger.setAttribute('aria-expanded','true');
20543 preview = obtenirCitationPreview();
20544 preview.classList.add('is-visible');
20545 preview.setAttribute('aria-hidden','false');
20546 chargerCitation(root);
20547 positionnerCitationPreview(root);
20548 }
20549
20550 function fermerCitation(root) {
20551 var trigger;
20552 if (citationEpinglee===root) {
20553 citationEpinglee = null;
20554 root.classList.remove('is-pinned');
20555 }
20556 if (citationActive!==root)
20557 return;
20558 trigger = root.querySelector('.forumPartieCitation__trigger');
20559 if (trigger)
20560 trigger.setAttribute('aria-expanded','false');
20561 citationActive = null;
20562 if (citationPreview) {
20563 citationPreview.classList.remove('is-visible');
20564 citationPreview.setAttribute('aria-hidden','true');
20565 }
20566 }
20567
20568 function initialiserCitation(root) {
20569 if (root.getAttribute('data-recherche-partie-initialisee')==='1')
20570 return;
20571 root.setAttribute('data-recherche-partie-initialisee','1');
20572 var idPartie = parseInt(root.getAttribute('data-id-partie'),10) || 0;
20573 if (!idPartie)
20574 return;
20575 if (!root.querySelector('.forumPartieCitation__trigger')) {
20576 root.innerHTML = '<button type="button" class="forumPartieCitation__trigger" '+
20577 'aria-expanded="false">Partie n&deg;'+idPartie+'</button>';
20578 }
20579 }
20580
20581 function initialiserTout(root) {
20582 root = root || document;
20583 if (root.nodeType===1) {
20584 if (root.classList.contains('composantRecherchePartie'))
20585 initialiserChamp(root);
20586 if (root.classList.contains('composantListeParties'))
20587 initialiserListe(root);
20588 if (root.classList.contains('forumPartieCitation'))
20589 initialiserCitation(root);
20590 }
20591
20592 if (!root.querySelectorAll)
20593 return;
20594 var inputs = root.querySelectorAll('.composantRecherchePartie');
20595 var listes = root.querySelectorAll('.composantListeParties');
20596 var citations = root.querySelectorAll('.forumPartieCitation');
20597 var i;
20598 for (i=0;i<inputs.length;i++)
20599 initialiserChamp(inputs[i]);
20600 for (i=0;i<listes.length;i++)
20601 initialiserListe(listes[i]);
20602 for (i=0;i<citations.length;i++)
20603 initialiserCitation(citations[i]);
20604 }
20605
20606 document.addEventListener('click',function (event) {
20607 var trigger = event.target.closest('.forumPartieCitation__trigger');
20608 var root;
20609 var citation = event.target.closest('.forumPartieCitation__button');
20610 if (trigger) {
20611 event.preventDefault();
20612 root = trigger.closest('.forumPartieCitation');
20613 if (citationEpinglee===root) {
20614 fermerCitation(root);
20615 } else {
20616 afficherCitation(root);
20617 }
20618 return;
20619 }
20620 if (citation) {
20621 ouvrirRecapitulatif(citation.getAttribute('data-id-partie'));
20622 return;
20623 }
20624 if (
20625 citationEpinglee &&
20626 !citationEpinglee.contains(event.target) &&
20627 (!citationPreview || !citationPreview.contains(event.target))
20628 )
20629 fermerCitation(citationEpinglee);
20630 });
20631
20632 window.addEventListener('scroll',function () {
20633 if (citationActive)
20634 positionnerCitationPreview(citationActive);
20635 },true);
20636 window.addEventListener('resize',function () {
20637 if (citationActive)
20638 positionnerCitationPreview(citationActive);
20639 });
20640
20641 window.ouvrirRecherchePartie = ouvrirRecherchePartie;
20642 window.initialiserComposantsRecherchePartie = initialiserTout;
20643
20644 if (document.readyState==='loading')
20645 document.addEventListener('DOMContentLoaded',function () { initialiserTout(document); });
20646 else
20647 initialiserTout(document);
20648
20649 if (window.MutationObserver) {
20650 var observer = new MutationObserver(function (mutations) {
20651 for (var i=0;i<mutations.length;i++) {
20652 for (var j=0;j<mutations[i].addedNodes.length;j++)
20653 initialiserTout(mutations[i].addedNodes[j]);
20654 }
20655 });
20656 observer.observe(document.documentElement,{childList:true,subtree:true});
20657 }
20658}());
20659
20660var collectionEmoticonsSelection = [];
20661var collectionEmoticonsSaveTimer = null;
20662
20663function synchroniserSelectionCollectionDepuisAlbum() {
20664 collectionEmoticonsSelection = [];
20665 $('#emoticonAlbum .emoticonAlbumItem.isSelected').each(function () {
20666 var identifiant = $(this).attr('data-id');
20667 if (identifiant && collectionEmoticonsSelection.indexOf(identifiant)===-1)
20668  collectionEmoticonsSelection.push(identifiant);
20669 });
20670}
20671
20672function initialiserAlbumEmoticons() {
20673 synchroniserSelectionCollectionDepuisAlbum();
20674 mettreAJourSelectionCollectionEmoticons();
20675 filtrerAlbumEmoticons();
20676}
20677
20678function toggleCollectionEmoticon(objet) {
20679 synchroniserSelectionCollectionDepuisAlbum();
20680 var bouton = $(objet);
20681 if (!bouton.hasClass('isOwned')) return;
20682 var identifiant = bouton.attr('data-id');
20683 var index = collectionEmoticonsSelection.indexOf(identifiant);
20684 var maximum = parseInt($('#emoticonAlbum').attr('data-selection-max'),10) || 12;
20685
20686 if (index!==-1) {
20687 collectionEmoticonsSelection.splice(index,1);
20688 } else {
20689 if (collectionEmoticonsSelection.length>=maximum) {
20690  alerte('Vous pouvez choisir au maximum '+maximum+' emoticones.');
20691  return;
20692 }
20693 collectionEmoticonsSelection.push(identifiant);
20694 }
20695 mettreAJourSelectionCollectionEmoticons();
20696 enregistrerSelectionCollectionEmoticons();
20697}
20698
20699function mettreAJourSelectionCollectionEmoticons() {
20700 var maximum = parseInt($('#emoticonAlbum').attr('data-selection-max'),10) || 12;
20701 var apercu = $('#emoticonCollectionSelectionPreview');
20702 apercu.empty();
20703
20704 $('#emoticonAlbum .emoticonAlbumItem').each(function () {
20705 var bouton = $(this);
20706 bouton.toggleClass('isSelected',collectionEmoticonsSelection.indexOf(bouton.attr('data-id'))!==-1);
20707 });
20708
20709 for (var i=0;i<collectionEmoticonsSelection.length;i++) {
20710 var identifiant = collectionEmoticonsSelection[i];
20711 $('#emoticonAlbum .emoticonAlbumItem').each(function () {
20712  if ($(this).attr('data-id')!==identifiant) return;
20713  var image = $(this).find('img').first().clone().removeAttr('loading');
20714  $('<button type="button" class="emoticonLoadoutSlot"></button>')
20715  .attr('title','Retirer de la selection')
20716  .append(image)
20717  .on('click',(function (element) {
20718   return function () { toggleCollectionEmoticon(element); };
20719  })(this))
20720  .appendTo(apercu);
20721 });
20722 }
20723
20724 for (var place=collectionEmoticonsSelection.length;place<maximum;place++)
20725 $('<span class="emoticonLoadoutSlot isEmpty"></span>').appendTo(apercu);
20726
20727 $('#emoticonCollectionSelectionCount').text(collectionEmoticonsSelection.length+' / '+maximum);
20728}
20729
20730function enregistrerSelectionCollectionEmoticons() {
20731 var statut = $('#emoticonCollectionSaveStatus');
20732 statut.removeClass('isSaved isError').text('Enregistrement...');
20733 if (collectionEmoticonsSaveTimer) clearTimeout(collectionEmoticonsSaveTimer);
20734 collectionEmoticonsSaveTimer = setTimeout(executerEnregistrementSelectionCollectionEmoticons,200);
20735}
20736
20737function executerEnregistrementSelectionCollectionEmoticons() {
20738 var statut = $('#emoticonCollectionSaveStatus');
20739 ajax('/workers/selectCollectionEmoticons.php','selection='+encodeURIComponent(collectionEmoticonsSelection.join('|')),function (reponse) {
20740 if (reponse.indexOf('ok|')===0) {
20741  statut.addClass('isSaved').text('Selection enregistree automatiquement');
20742 } else {
20743  statut.addClass('isError').text('La selection n\'a pas pu etre enregistree');
20744  alerte(reponse.split('|').slice(1).join('|') || reponse);
20745 }
20746 });
20747}
20748
20749function viderSelectionCollectionEmoticons() {
20750 collectionEmoticonsSelection = [];
20751 mettreAJourSelectionCollectionEmoticons();
20752 enregistrerSelectionCollectionEmoticons();
20753}
20754
20755function choisirFiltreAlbumEmoticons(bouton) {
20756 $('#emoticonAlbum .emoticonAlbumFilterButtons button').removeClass('active');
20757 $(bouton).addClass('active');
20758 filtrerAlbumEmoticons();
20759}
20760
20761function filtrerAlbumEmoticons() {
20762 var album = $('#emoticonAlbum');
20763 if (!album.length) return;
20764 var filtre = album.find('.emoticonAlbumFilterButtons button.active').attr('data-album-filter') || 'toutes';
20765 var pack = album.find('#emoticonAlbumPackFilter').val() || '';
20766 var recherche = (album.find('#emoticonAlbumSearch').val() || '').toLowerCase();
20767
20768 album.find('.emoticonPack').each(function () {
20769 var blocPack = $(this);
20770 var packVisible = !pack || blocPack.attr('data-pack')===pack;
20771 var nombreVisible = 0;
20772 blocPack.find('.emoticonAlbumItem').each(function () {
20773  var item = $(this);
20774  var filtreVisible = filtre==='toutes' || item.attr('data-state')===filtre || item.attr('data-rarity')===filtre;
20775  var rechercheVisible = !recherche || (item.attr('data-name') || '').indexOf(recherche)!==-1;
20776  var visible = packVisible && filtreVisible && rechercheVisible;
20777  item.toggle(visible);
20778  if (visible) nombreVisible++;
20779 });
20780 blocPack.toggle(nombreVisible>0);
20781 });
20782}
20783
20784function decoderReponseCollectionEmoticons(reponse) {
20785 if (reponse && typeof reponse==='object') return reponse;
20786 if (typeof reponse!=='string') return null;
20787 try {
20788 return JSON.parse($.trim(reponse));
20789 } catch (erreur) {
20790 return null;
20791 }
20792}
20793
20794function lancerTirageTestModerateur(bouton) {
20795 var elementBouton = $(bouton);
20796 var resultat = $('#emoticonModeratorTestResult');
20797 elementBouton.prop('disabled',true).text('Tirage en cours...');
20798 resultat.removeClass('isError').html('');
20799
20800 ajax('/workers/moderation/testEmoticonDraw.php','',function (reponse) {
20801 var donnees = decoderReponseCollectionEmoticons(reponse);
20802 if (!donnees) {
20803  resultat.addClass('isError').text('Reponse de test invalide.');
20804 }
20805
20806 if (donnees && donnees.ok) {
20807  resultat.html(donnees.message);
20808  $('#emoticonAlbumAttempts').text(donnees.tentatives);
20809  $('#emoticonAlbumFriendlyCredits').text(donnees.creditsAmicaux);
20810  $('#emoticonAlbumCollectionCount').text(donnees.decouvertes+' / '+donnees.total);
20811  for (var rarete in donnees.garantiesRestantes) {
20812  if (donnees.garantiesRestantes.hasOwnProperty(rarete))
20813   $('#emoticonAlbumPity-'+rarete).text(donnees.garantiesRestantes[rarete]);
20814  }
20815
20816  if (donnees.resultat==='nouvelle' && donnees.emoticon) {
20817  $('#emoticonAlbum .emoticonAlbumItem').each(function () {
20818   if ($(this).attr('data-id')!==donnees.emoticonId) return;
20819   $(this)
20820   .removeClass('isMissing')
20821   .addClass('isOwned')
20822   .attr('data-state','possedees')
20823   .attr('title',donnees.emoticon.nom)
20824   .prop('disabled',false)
20825   .off('click')
20826   .on('click',function () { toggleCollectionEmoticon(this); });
20827   $(this).find('.emoticonAlbumName').text(donnees.emoticon.nom);
20828  });
20829  $('#emoticonAlbum .emoticonPack[data-pack="'+donnees.pack+'"]').find('.emoticonPackProgress').text(donnees.packPossedees+' / '+donnees.packTotal);
20830  filtrerAlbumEmoticons();
20831  }
20832 } else if (donnees) {
20833  resultat.addClass('isError').text(donnees.message || 'Tirage refuse.');
20834 }
20835 elementBouton.prop('disabled',false).text('Lancer un tirage');
20836 });
20837}
20838
20839/* Selection historique des emoticones de base : minimum respecte visuellement. */
20840function selEmot(obj) {
20841 updateSelIconsSel();
20842 var element = $(obj);
20843 var dejaSelectionnee = element.hasClass('selEmot');
20844 if (dejaSelectionnee && selectedEmotsArray.length<=6) {
20845 alerte('Minimum 6 emoticones');
20846 return;
20847 }
20848 element.toggleClass('selEmot');
20849 updateSelIconsSel();
20850 ajax('/workers/selectEmot.php','selection='+encodeURIComponent(selectedEmotsArray.join('|')),function (reponse) {
20851 if ($.trim(reponse)!=='ok') alerte(reponse);
20852 });
20853}
20854
20855function updateSelIconsSel() {
20856 selectedEmotsArray = [];
20857 $('.emotCpte.selEmot').each(function () {
20858 var numero = $(this).attr('numA');
20859 if (selectedEmotsArray.indexOf(numero)===-1) selectedEmotsArray.push(numero);
20860 });
20861 $('#baseEmoticonSelectionCount').text(selectedEmotsArray.length+' selectionnees');
20862}
20863
20864(function (window, document) {
20865 var manager = {
20866 container: null,
20867 publicKey: null,
20868 registration: null,
20869 currentEndpoint: '',
20870
20871 init: function (containerId) {
20872  this.container = document.getElementById(containerId);
20873  if (!this.container) return;
20874  this.bind();
20875  this.refreshState();
20876  this.loadPreferences();
20877 },
20878
20879 initHomePrompt: function () {
20880  var self = this;
20881  var path = window.location.pathname.toLowerCase();
20882  if (path !== '/' && path !== '/index.php') return;
20883  if (!document.body || document.body.getAttribute('data-user-connected') !== '1') return;
20884  if (window.innerWidth >= 800 || !this.isSupported()) return;
20885  if (Notification.permission === 'denied' || this.hasCookie('hidePushPrompt')) return;
20886
20887  navigator.serviceWorker.getRegistration('/').then(function (registration) {
20888  if (registration) {
20889   return registration.pushManager.getSubscription();
20890  }
20891  return null;
20892  }).then(function (subscription) {
20893  if (subscription) return;
20894  self.showHomePrompt();
20895  }).catch(function () {
20896  // The prompt remains hidden if login or subscription checks fail.
20897  });
20898 },
20899
20900 showHomePrompt: function () {
20901  var self = this;
20902  var existing = document.getElementById('pushHomePrompt');
20903  if (existing) return;
20904
20905  var stylesheet = document.createElement('link');
20906  stylesheet.rel = 'stylesheet';
20907  stylesheet.href = '/css/pushHomePrompt.css?v=' + encodeURIComponent(window.codeVersion || '1');
20908
20909  var container = document.createElement('div');
20910  container.id = 'pushHomePrompt';
20911  container.className = 'pushHomePrompt';
20912  container.style.display = 'none';
20913  container.setAttribute('role', 'dialog');
20914  container.setAttribute('aria-labelledby', 'pushHomePromptTitle');
20915  container.innerHTML =
20916  '<div class="pushHomePromptText">' +
20917   '<strong id="pushHomePromptTitle">Restez inform&eacute;</strong>' +
20918   '<span>Activez les notifications pour ne rien manquer.</span>' +
20919   '<span id="pushStatus" class="pushHomePromptStatus" aria-live="polite"></span>' +
20920  '</div>' +
20921  '<div class="pushHomePromptActions">' +
20922   '<button type="button" class="btn btn-success" id="pushEnableBtn">Activer</button>' +
20923   '<button type="button" class="btn btn-default" id="pushHomeDeclineBtn">Non merci</button>' +
20924  '</div>';
20925  document.body.appendChild(container);
20926  this.container = container;
20927
20928  document.getElementById('pushHomeDeclineBtn').onclick = function () {
20929  self.setCookie('hidePushPrompt', '1', 31536000);
20930  self.hideHomePrompt();
20931  };
20932  document.getElementById('pushEnableBtn').onclick = function () {
20933  var enableBtn = document.getElementById('pushEnableBtn');
20934  if (enableBtn) enableBtn.disabled = true;
20935  self.enable().then(function (enabled) {
20936   if (enabled) {
20937   self.hideHomePrompt();
20938   } else if (enableBtn) {
20939   enableBtn.disabled = false;
20940   }
20941  });
20942  };
20943
20944  stylesheet.onload = function () {
20945  container.style.display = '';
20946  container.className += ' pushHomePromptVisible';
20947  };
20948  document.head.appendChild(stylesheet);
20949 },
20950
20951 hideHomePrompt: function () {
20952  var container = document.getElementById('pushHomePrompt');
20953  if (container && container.parentNode) {
20954  container.parentNode.removeChild(container);
20955  }
20956 },
20957
20958 hasCookie: function (name) {
20959  return document.cookie.split(';').some(function (cookie) {
20960  return cookie.replace(/^\s+/, '').indexOf(name + '=') === 0;
20961  });
20962 },
20963
20964 setCookie: function (name, value, maxAge) {
20965  var secure = window.location.protocol === 'https:' ? '; Secure' : '';
20966  document.cookie = name + '=' + encodeURIComponent(value) +
20967  '; Max-Age=' + maxAge + '; Path=/; SameSite=Lax' + secure;
20968 },
20969
20970 bind: function () {
20971  var self = this;
20972  var enableBtn = document.getElementById('pushEnableBtn');
20973  var savePrefsBtn = document.getElementById('pushSavePrefsBtn');
20974  if (enableBtn) enableBtn.onclick = function () {
20975  if (enableBtn.getAttribute('data-push-state') === 'subscribed') {
20976   self.disable();
20977  } else if (enableBtn.getAttribute('data-push-state') === 'available') {
20978   self.enable();
20979  }
20980  };
20981  if (savePrefsBtn) savePrefsBtn.onclick = this.savePreferences.bind(this);
20982 },
20983
20984 isSupported: function () {
20985  return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;
20986 },
20987
20988 setStatus: function (text, isError) {
20989  var status = document.getElementById('pushStatus');
20990  if (!status) return;
20991  status.innerHTML = text;
20992  if (document.getElementById('pushHomePrompt')) {
20993  status.className = isError ?
20994   'pushHomePromptStatus pushHomePromptStatusError' :
20995   'pushHomePromptStatus';
20996  } else {
20997  status.className = isError ? 'pushStatus pushStatusError' : 'pushStatus';
20998  }
20999 },
21000
21001 setPrefsStatus: function (text, isError) {
21002  var status = document.getElementById('pushPreferencesStatus');
21003  if (!status) return;
21004  status.innerHTML = text;
21005  status.className = isError ? 'pushPreferencesStatus pushPreferencesStatus--error' : 'pushPreferencesStatus';
21006 },
21007
21008 setButtons: function (enabled, unavailable) {
21009  var enableBtn = document.getElementById('pushEnableBtn');
21010  if (!enableBtn) return;
21011  enableBtn.disabled = unavailable===true;
21012  if (unavailable===true) {
21013  enableBtn.setAttribute('data-push-state','unavailable');
21014  enableBtn.className = 'btn btn-default pbtn pushMainButton pushMainButton--unavailable';
21015  enableBtn.innerHTML = 'Notifications indisponibles';
21016  } else if (enabled) {
21017  enableBtn.setAttribute('data-push-state','subscribed');
21018  enableBtn.className = 'btn btn-success pbtn pushMainButton pushMainButton--subscribed';
21019  enableBtn.innerHTML = 'Notifications push activ&eacute;es';
21020  enableBtn.setAttribute('title','Cliquer pour les desactiver sur cet appareil');
21021  } else {
21022  enableBtn.setAttribute('data-push-state','available');
21023  enableBtn.className = 'btn btn-success pbtn pushMainButton';
21024  enableBtn.innerHTML = 'Activer les notifications push';
21025  enableBtn.setAttribute('title','Activer les notifications push sur cet appareil');
21026  }
21027 },
21028
21029 getServiceWorkerUrl: function () {
21030  if (window.tarotServiceWorkerUrl) {
21031  return window.tarotServiceWorkerUrl;
21032  }
21033  if (navigator.serviceWorker && navigator.serviceWorker.controller && navigator.serviceWorker.controller.scriptURL) {
21034  return navigator.serviceWorker.controller.scriptURL;
21035  }
21036  return '';
21037 },
21038
21039 getOrRegisterServiceWorker: function () {
21040  var self = this;
21041  return navigator.serviceWorker.getRegistration('/').then(function (registration) {
21042  var serviceWorkerUrl = self.getServiceWorkerUrl();
21043  if (window.tarotServiceWorkerUrl && (!registration || registration.active && registration.active.scriptURL.indexOf(window.tarotServiceWorkerUrl) < 0)) {
21044   return navigator.serviceWorker.register(window.tarotServiceWorkerUrl, { scope: '/' });
21045  }
21046  if (registration) {
21047   return registration;
21048  }
21049  if (!serviceWorkerUrl) {
21050   throw new Error('service worker url missing');
21051  }
21052  return navigator.serviceWorker.register(serviceWorkerUrl, { scope: '/' });
21053  });
21054 },
21055
21056 refreshState: function () {
21057  var self = this;
21058  if (!this.isSupported()) {
21059  this.setStatus('Ce navigateur ne supporte pas les notifications push.', true);
21060  this.setButtons(false, true);
21061  return;
21062  }
21063  if (Notification.permission === 'denied') {
21064  this.setStatus('Les notifications sont bloquees dans les reglages du navigateur.', true);
21065  this.setButtons(false, true);
21066  return;
21067  }
21068
21069  navigator.serviceWorker.getRegistration('/').then(function (registration) {
21070  if (!registration) {
21071   self.setStatus('Notifications disponibles, pas encore activees sur cet appareil.');
21072   self.setButtons(false, false);
21073   return null;
21074  }
21075  self.registration = registration;
21076  self.updateRegistration(registration);
21077  return registration.pushManager.getSubscription();
21078  }).then(function (subscription) {
21079  if (!subscription) {
21080   self.currentEndpoint = '';
21081   self.setStatus('Notifications disponibles, pas encore activees sur cet appareil.');
21082   self.setButtons(false, false);
21083   return;
21084  }
21085  self.currentEndpoint = subscription.endpoint;
21086  self.setStatus('Notifications activees sur cet appareil.');
21087  self.setButtons(true, false);
21088  }).catch(function () {
21089  self.setStatus('Impossible de verifier les notifications sur cet appareil.', true);
21090  self.setButtons(false, true);
21091  });
21092 },
21093
21094 enable: function () {
21095  var self = this;
21096  if (!this.isSupported()) return Promise.resolve(false);
21097  this.setStatus('Activation en cours...');
21098  return Notification.requestPermission().then(function (permission) {
21099  if (permission !== 'granted') {
21100   self.setStatus('Permission non accordee par le navigateur.', true);
21101   self.setButtons(false, Notification.permission === 'denied');
21102   return null;
21103  }
21104  return self.getPublicKey();
21105  }).then(function (publicKey) {
21106  if (!publicKey) return null;
21107  return self.getOrRegisterServiceWorker().then(function (registration) {
21108   self.registration = registration;
21109   return self.waitForActiveRegistration(registration).then(function (activeRegistration) {
21110   self.registration = activeRegistration;
21111   return activeRegistration.pushManager.getSubscription();
21112   }).then(function (existing) {
21113   if (existing) return existing;
21114   return self.registration.pushManager.subscribe({
21115    userVisibleOnly: true,
21116    applicationServerKey: self.urlBase64ToUint8Array(publicKey)
21117   });
21118   });
21119  });
21120  }).then(function (subscription) {
21121  if (!subscription) return;
21122  self.currentEndpoint = subscription.endpoint;
21123  return self.request('POST', '/push/subscribe', {
21124   subscription: subscription.toJSON(),
21125   platform: navigator.platform || ''
21126  });
21127  }).then(function (res) {
21128  if (!res) return;
21129  if (res.ok) {
21130   self.setStatus('Notifications activees sur cet appareil.');
21131   self.setButtons(true, false);
21132   return true;
21133  } else {
21134   self.setStatus('Activation impossible : ' + (res.error || 'erreur serveur'), true);
21135   return false;
21136  }
21137  }).catch(function () {
21138  self.setStatus('Activation impossible sur ce navigateur.', true);
21139  return false;
21140  });
21141 },
21142
21143 updateRegistration: function (registration) {
21144  if (registration && registration.update) {
21145  return registration.update().then(function () {
21146   return registration;
21147  }).catch(function () {
21148   return registration;
21149  });
21150  }
21151  return Promise.resolve(registration);
21152 },
21153
21154 waitForActiveRegistration: function (registration) {
21155  return this.updateRegistration(registration).then(function (updatedRegistration) {
21156  registration = updatedRegistration || registration;
21157  var worker = registration.installing || registration.waiting;
21158  if (!worker) {
21159   return registration;
21160  }
21161  return new Promise(function (resolve) {
21162   var resolved = false;
21163   var done = function () {
21164   if (resolved) return;
21165   resolved = true;
21166   resolve(registration);
21167   };
21168   worker.addEventListener('statechange', function () {
21169   if (worker.state === 'activated') {
21170    done();
21171   }
21172   });
21173   setTimeout(done, 5000);
21174  });
21175  });
21176 },
21177
21178 testLocalNotification: function () {
21179  var self = this;
21180  if (!this.isSupported()) return;
21181  if (Notification.permission !== 'granted') {
21182  this.setStatus('Permission notification non accordee.', true);
21183  return;
21184  }
21185  this.getOrRegisterServiceWorker().then(function (registration) {
21186  return self.waitForActiveRegistration(registration);
21187  }).then(function (registration) {
21188  return registration.showNotification('Jeu de tarot', {
21189   body: 'Notification de test.',
21190   icon: '/images/pwa/push-icon-default-v5.png',
21191   badge: '/images/pwa/push-badge-v3.png',
21192   tag: 'push-test',
21193   data: { url: '/Compte.php?part=notifications' }
21194  });
21195  }).then(function () {
21196  self.setStatus('Notification de test envoyee par le navigateur.');
21197  }).catch(function () {
21198  self.setStatus('Notification de test impossible.', true);
21199  });
21200 },
21201
21202 disable: function () {
21203  var self = this;
21204  this.setStatus('Desactivation en cours...');
21205  navigator.serviceWorker.getRegistration('/').then(function (registration) {
21206  if (!registration) return null;
21207  return registration.pushManager.getSubscription();
21208  }).then(function (subscription) {
21209  var endpoint = self.currentEndpoint;
21210  if (subscription) {
21211   endpoint = subscription.endpoint;
21212   return subscription.unsubscribe().then(function () {
21213   return endpoint;
21214   });
21215  }
21216  return endpoint;
21217  }).then(function (endpoint) {
21218  if (!endpoint) {
21219   self.setStatus('Aucun abonnement actif sur cet appareil.');
21220   self.setButtons(false, false);
21221   return null;
21222  }
21223  return self.request('POST', '/push/unsubscribe', { endpoint: endpoint });
21224  }).then(function (res) {
21225  if (!res) return;
21226  if (res.ok) {
21227   self.currentEndpoint = '';
21228   self.setStatus('Notifications desactivees sur cet appareil.');
21229   self.setButtons(false, false);
21230  } else {
21231   self.setStatus('Desactivation impossible : ' + (res.error || 'erreur serveur'), true);
21232  }
21233  }).catch(function () {
21234  self.setStatus('Desactivation impossible.', true);
21235  });
21236 },
21237
21238 getPublicKey: function () {
21239  var self = this;
21240  if (this.publicKey) {
21241  return Promise.resolve(this.publicKey);
21242  }
21243  return this.request('GET', '/push/vapid-public-key').then(function (res) {
21244  if (!res || !res.ok || !res.publicKey) {
21245   self.setStatus('Cle publique VAPID non configuree.', true);
21246   return null;
21247  }
21248  self.publicKey = res.publicKey;
21249  return self.publicKey;
21250  });
21251 },
21252
21253 loadPreferences: function () {
21254  var self = this;
21255  this.request('GET', '/notifications/preferences').then(function (res) {
21256  if (!res || !res.ok) {
21257   self.setPrefsStatus('Preferences indisponibles.', true);
21258   return;
21259  }
21260  var prefs = res.preferences || {};
21261  var inputs = document.querySelectorAll('[data-notification-pref]');
21262  for (var i = 0; i < inputs.length; i++) {
21263   var key = inputs[i].getAttribute('data-notification-pref');
21264   inputs[i].checked = prefs[key] !== false;
21265  }
21266  if (window.tarotSiteNotifications)
21267   window.tarotSiteNotifications.applyPreferences(prefs);
21268  self.setPrefsStatus('Preferences chargees.');
21269  }).catch(function () {
21270  self.setPrefsStatus('Preferences indisponibles.', true);
21271  });
21272 },
21273
21274 savePreferences: function () {
21275  var self = this;
21276  var prefs = {};
21277  var inputs = document.querySelectorAll('[data-notification-pref]');
21278  for (var i = 0; i < inputs.length; i++) {
21279  prefs[inputs[i].getAttribute('data-notification-pref')] = input
21279s[i].checked;
21280  }
21281  this.setPrefsStatus('Enregistrement...');
21282  this.request('POST', '/notifications/preferences', { preferences: prefs }).then(function (res) {
21283  if (res && res.ok) {
21284   if (window.tarotSiteNotifications)
21285   window.tarotSiteNotifications.applyPreferences(prefs);
21286   self.setPrefsStatus('Preferences enregistrees.');
21287   setTimeout(function () {
21288   if (window.jQuery) window.jQuery('#pushPreferencesModal').modal('hide');
21289   }, 500);
21290  } else {
21291   self.setPrefsStatus('Enregistrement impossible.', true);
21292  }
21293  }).catch(function () {
21294  self.setPrefsStatus('Enregistrement impossible.', true);
21295  });
21296 },
21297
21298 request: function (method, url, data) {
21299  return new Promise(function (resolve, reject) {
21300  var xhr = new XMLHttpRequest();
21301  xhr.open(method, url, true);
21302  xhr.setRequestHeader('Accept', 'application/json');
21303  if (method !== 'GET') {
21304   xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
21305  }
21306  xhr.onreadystatechange = function () {
21307   if (xhr.readyState !== 4) return;
21308   try {
21309   resolve(JSON.parse(xhr.responseText || '{}'));
21310   } catch (e) {
21311   reject(e);
21312   }
21313  };
21314  xhr.onerror = reject;
21315  xhr.send(method === 'GET' ? null : JSON.stringify(data || {}));
21316  });
21317 },
21318
21319 urlBase64ToUint8Array: function (base64String) {
21320  var padding = new Array((4 - base64String.length % 4) % 4 + 1).join('=');
21321  var base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
21322  var rawData = window.atob(base64);
21323  var outputArray = new Uint8Array(rawData.length);
21324  for (var i = 0; i < rawData.length; ++i) {
21325  outputArray[i] = rawData.charCodeAt(i);
21326  }
21327  return outputArray;
21328 }
21329 };
21330
21331 window.tarotPushNotifications = manager;
21332
21333 function initHomePushPrompt() {
21334 manager.initHomePrompt();
21335 }
21336 if (document.readyState === 'loading') {
21337 document.addEventListener('DOMContentLoaded', initHomePushPrompt);
21338 } else {
21339 initHomePushPrompt();
21340 }
21341})(window, document);
21342
21343(function (window, document) {
21344 var notificationFriendToken = '';
21345 var notificationFriendTokenLoading = false;
21346 var notificationFriendTokenCallbacks = [];
21347
21348 function notificationActionResponse(value) {
21349 if (value && typeof value==='object') return value;
21350 try { return JSON.parse(value || '{}'); }
21351 catch (e) { return {ok:false,message:'Une erreur est survenue.'}; }
21352 }
21353
21354 function notificationFriendTokenGet(callback) {
21355 if (notificationFriendToken!=='') {
21356  callback(notificationFriendToken);
21357  return;
21358 }
21359 notificationFriendTokenCallbacks.push(callback);
21360 if (notificationFriendTokenLoading) return;
21361 notificationFriendTokenLoading = true;
21362 ajax('/workers/demandeAmiToken.php','',function (value) {
21363  var response = notificationActionResponse(value);
21364  var callbacks = notificationFriendTokenCallbacks.slice(0);
21365  notificationFriendTokenCallbacks = [];
21366  notificationFriendTokenLoading = false;
21367  if (!response.ok || !response.token) {
21368  for (var i=0;i<callbacks.length;i++) callbacks[i]('');
21369  return;
21370  }
21371  notificationFriendToken = response.token;
21372  for (var i=0;i<callbacks.length;i++) callbacks[i](notificationFriendToken);
21373 });
21374 }
21375
21376 function notificationFriendBadgeDecrease() {
21377 var badges = document.querySelectorAll('.amisNavBadge');
21378 for (var i=0;i<badges.length;i++) {
21379  var count = Math.max(0,(parseInt(badges[i].innerHTML,10) || 0)-1);
21380  if (count===0 && badges[i].parentNode) badges[i].parentNode.removeChild(badges[i]);
21381  else badges[i].innerHTML = count;
21382 }
21383 }
21384
21385 function executeSiteNotificationAction(type,reference,callback) {
21386 reference = parseInt(reference,10) || 0;
21387 if (type!=='demande_ami' || reference<=0) {
21388  callback({ok:false,message:'Cette action n\'est pas disponible.'});
21389  return;
21390 }
21391 notificationFriendTokenGet(function (token) {
21392  if (!token) {
21393  callback({ok:false,message:'La page a expir&eacute;. Rechargez-la avant de r&eacute;essayer.'});
21394  return;
21395  }
21396  ajax('/workers/demandeAmiAction.php','idDemande='+reference+'&action=accepter&token='+encodeURIComponent(token),function (value) {
21397  var response = notificationActionResponse(value);
21398  if (response.ok) notificationFriendBadgeDecrease();
21399  callback(response);
21400  });
21401 });
21402 }
21403
21404 var manager = {
21405 items: [],
21406 knownIds: {},
21407 expandedCategories: {},
21408 maxIndividual: 3,
21409
21410 enqueue: function (notifications) {
21411  if (!notifications || typeof notifications.length === 'undefined') return;
21412  for (var i=0;i<notifications.length;i++) {
21413  var item = notifications[i] || {};
21414  var id = parseInt(item.id,10) || 0;
21415  if (!id || this.knownIds[id]) continue;
21416  this.knownIds[id] = true;
21417  this.items.push(item);
21418  }
21419  this.render();
21420 },
21421
21422 remove: function (id) {
21423  id = parseInt(id,10) || 0;
21424  var remaining = [];
21425  for (var i=0;i<this.items.length;i++) {
21426  if ((parseInt(this.items[i].id,10) || 0)!==id)
21427   remaining.push(this.items[i]);
21428  }
21429  this.items = remaining;
21430  this.render();
21431 },
21432
21433 removeCategory: function (category) {
21434  var remaining = [];
21435  for (var i=0;i<this.items.length;i++) {
21436  if (this.items[i].category!==category)
21437   remaining.push(this.items[i]);
21438  }
21439  this.items = remaining;
21440  delete this.expandedCategories[category];
21441  this.render();
21442 },
21443
21444 clear: function () {
21445  this.items = [];
21446  this.expandedCategories = {};
21447  this.render();
21448 },
21449
21450 preferenceType: function (category) {
21451  var types = {
21452  annonces:'announcements',
21453  compte:'moderation',
21454  support:'moderation',
21455  moderation:'moderation',
21456  forum:'forum',
21457  forum_interactions:'forum_interactions',
21458  competitions:'competitions',
21459  guildes:'guilds',
21460  relations:'relationships',
21461  missions:'missions',
21462  organisation:'announcements',
21463  roles:'moderation',
21464  systeme:'announcements'
21465  };
21466  return types[category] || 'announcements';
21467 },
21468
21469 applyPreferences: function (preferences) {
21470  var remaining = [];
21471  for (var i=0;i<this.items.length;i++) {
21472  var type = this.preferenceType(this.items[i].category || 'systeme');
21473  if (!preferences || preferences[type]!==false)
21474   remaining.push(this.items[i]);
21475  }
21476  this.items = remaining;
21477  this.render();
21478 },
21479
21480 categoryUrl: function (category) {
21481  return '/Compte.php?part=notifications&categorie=' + encodeURIComponent(category || 'systeme');
21482 },
21483
21484 notificationsUrl: function () {
21485  return '/Compte.php?part=notifications';
21486 },
21487
21488 itemUrl: function (item) {
21489  var url = item.url || '';
21490  if (url.indexOf('/Compte.php?part=notifications')===0)
21491  return '';
21492  if (url.charAt(0)==='/' && url.indexOf('//')!==0)
21493  return url;
21494  if (/^https?:\/\//i.test(url))
21495  return url;
21496  return '';
21497 },
21498
21499 escapeHtml: function (value) {
21500  var div = document.createElement('div');
21501  div.appendChild(document.createTextNode(value==null?'':String(value)));
21502  return div.innerHTML;
21503 },
21504
21505 decodeHtmlEntities: function (value) {
21506  var textarea = document.createElement('textarea');
21507  textarea.innerHTML = value==null?'':String(value);
21508  return textarea.value;
21509 },
21510
21511 plainTextHtml: function (value) {
21512  var text = this.decodeHtmlEntities(value==null?'':String(value));
21513  text = text.replace(/<(script|style|iframe|object|embed|svg|math|form)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,'');
21514  text = text.replace(/<\s*br\s*\/?\s*>/gi,'\n');
21515  text = text.replace(/<\/\s*(p|div|li|h[1-6]|blockquote)\s*>/gi,'\n');
21516  text = text.replace(/<[^>]*>/g,'');
21517  return this.escapeHtml(text).replace(/\r\n|\r|\n/g,'<br>');
21518 },
21519
21520 itemActionHtml: function (item) {
21521  if (item.actionType!=='demande_ami' || (parseInt(item.actionReference,10) || 0)<=0) return '';
21522  return '<button type="button" class="siteNotificationToast__primaryAction" data-site-notification-action="demande_ami" data-action-reference="' + (parseInt(item.actionReference,10) || 0) + '"><span aria-hidden="true">&#10003;</span> Accepter</button>';
21523 },
21524
21525 itemHtml: function (item, staticContent) {
21526  var linkedUrl = this.itemUrl(item);
21527  var actionHtml = this.itemActionHtml(item);
21528  var contentAttributes = staticContent?'':' role="link" tabindex="0" data-site-notification-url="' + this.escapeHtml(this.notificationsUrl()) + '"';
21529  return '<article class="siteNotificationToast' + (actionHtml?' siteNotificationToast--actionable':'') + '" data-site-notification-id="' + (parseInt(item.id,10) || 0) + '">' +
21530  '<div class="siteNotificationToast__link' + (staticContent?' siteNotificationToast__link--static':'') + '"' + contentAttributes + '>' +
21531  '<span class="siteNotificationToast__category">' + this.escapeHtml(this.decodeHtmlEntities(item.categoryLabel || item.category || 'Information')) + '</span>' +
21532  '<div class="siteNotificationToast__title"><strong>' + this.escapeHtml(this.decodeHtmlEntities(item.title || 'Notification')) + '</strong></div>' +
21533  '<span class="siteNotificationToast__date">' + this.escapeHtml(this.decodeHtmlEntities(item.date || '')) + '</span>' +
21534  '<div class="siteNotificationToast__message">' + this.plainTextHtml(item.message || '') + '</div>' +
21535  '</div>' +
21536  actionHtml +
21537  (linkedUrl?'<a class="siteNotificationToast__open" href="' + this.escapeHtml(linkedUrl) + '" aria-label="Ouvrir le lien associ&eacute;" title="Ouvrir le lien associ&eacute;">
21537<svg class="notificationLinkIcon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.1 0l2-2A5 5 0 0 0 12 3.9L10.9 5"></path><path d="M14 11a5 5 0 0 0-7.1 0l-2 2A5 5 0 0 0 12 20.1l1.1-1.1"></path></svg></a>':'') +
21538  '<button type="button" class="siteNotificationToast__close" data-close-notification="' + (parseInt(item.id,10) || 0) + '" aria-label="Fermer cette notification" title="Fermer cette notification">&times;</button>' +
21539  '</article>';
21540 },
21541
21542 container: function () {
21543  var panel = document.getElementById('siteNotificationsPanel');
21544  if (panel) return panel;
21545  panel = document.createElement('aside');
21546  panel.id = 'siteNotificationsPanel';
21547  panel.className = 'siteNotificationsPanel';
21548  panel.setAttribute('aria-live','polite');
21549  panel.setAttribute('aria-label','Nouvelles notifications');
21550  document.body.appendChild(panel);
21551  return panel;
21552 },
21553
21554 render: function () {
21555  var panel = this.container();
21556  if (this.items.length===0) {
21557  panel.className = 'siteNotificationsPanel';
21558  panel.innerHTML = '';
21559  return;
21560  }
21561
21562  var countLabel = this.items.length + (this.items.length>1?' nouvelles notifications':' nouvelle notification');
21563  var html = '<header class="siteNotificationsPanel__header">' +
21564  '<span class="siteNotificationsPanel__count" role="status" aria-label="' + countLabel + '">' + this.items.length + '</span>' +
21565  '<button type="button" class="siteNotificationsPanel__clear" aria-label="Fermer toutes les notifications" title="Fermer toutes les notifications">&times;</button>' +
21566  '</header><div class="siteNotificationsPanel__content">';
21567
21568  if (this.items.length<=this.maxIndividual) {
21569  for (var i=0;i<this.items.length;i++) {
21570   html += this.itemHtml(this.items[i],false);
21571  }
21572  } else {
21573  var groups = {}, order = [];
21574  for (var j=0;j<this.items.length;j++) {
21575   var category = this.items[j].category || 'systeme';
21576   if (!groups[category]) {
21577   groups[category] = { count:0,label:this.items[j].categoryLabel || category,items:[] };
21578   order.push(category);
21579   }
21580   groups[category].count++;
21581   groups[category].items.push(this.items[j]);
21582  }
21583  for (var k=0;k<order.length;k++) {
21584   var categoryCode = order[k];
21585   var group = groups[categoryCode];
21586   var groupExpanded = !!this.expandedCategories[categoryCode];
21587   var groupItemsId = 'siteNotificationGroupItems_' + k;
21588   html += '<section class="siteNotificationGroup' + (groupExpanded?' siteNotificationGroup--expanded':'') + '">' +
21589   '<div class="siteNotificationGroup__summary">' +
21590   '<button type="button" class="siteNotificationGroup__toggle" data-toggle-category="' + this.escapeHtml(categoryCode) + '" aria-expanded="' + (groupExpanded?'true':'false') + '" aria-controls="' + groupItemsId + '">' +
21591   '<span class="siteNotificationGroup__count">' + group.count + '</span>' +
21592   '<span class="siteNotificationGroup__label"><strong>' + this.escapeHtml(this.decodeHtmlEntities(group.label)) + '</strong><small>' + (groupExpanded?'Masquer':'Afficher') + ' les notifications</small></span>' +
21593   '<span class="siteNotificationGroup__chevron" aria-hidden="true">&#8250;</span>' +
21594   '</button>' +
21595   '<a class="siteNotificationGroup__open" href="' + this.escapeHtml(this.categoryUrl(categoryCode)) + '" aria-label="Ouvrir cette cat&eacute;gorie dans la page Notifications" title="Ouvrir cette cat&eacute;gorie dans la page Notifications"><svg class="notificationLinkIcon" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.1 0l2-2A5 5 0 0 0 12 3.9L10.9 5"></path><path d="M14 11a5 5 0 0 0-7.1 0l-2 2A5 5 0 0 0 12 20.1l1.1-1.1"></path></svg></a>' +
21596   '<button type="button" class="siteNotificationGroup__close" data-close-category="' + this.escapeHtml(categoryCode) + '" aria-label="Fermer ce groupe" title="Fermer ce groupe">&times;</button>' +
21597   '</div>';
21598   html += '<div class="siteNotificationGroup__items" id="' + groupItemsId + '"' + (groupExpanded?'':' hidden') + '>';
21599   for (var groupItemIndex=0;groupItemIndex<group.items.length;groupItemIndex++)
21600   html += this.itemHtml(group.items[groupItemIndex],true);
21601   html += '</div>';
21602   html += '</section>';
21603  }
21604  }
21605
21606  panel.innerHTML = html + '</div>';
21607  panel.className = 'siteNotificationsPanel siteNotificationsPanel--visible';
21608  this.bindPanel(panel);
21609 },
21610
21611 bindPanel: function (panel) {
21612  var self = this;
21613  var clear = panel.querySelector('.siteNotificationsPanel__clear');
21614  if (clear) clear.onclick = function () { self.clear(); };
21615  var notificationLinks = panel.querySelectorAll('[data-site-notification-url]');
21616  for (var i=0;i<notificationLinks.length;i++) {
21617  notificationLinks[i].onclick = function (event) {
21618   event = event || window.event;
21619   var target = event.target || event.srcElement;
21620   while (target && target!==this) {
21621   if (target.tagName && target.tagName.toLowerCase()==='a')
21622    return true;
21623   target = target.parentNode;
21624   }
21625   window.location.href = this.getAttribute('data-site-notification-url');
21626   return false;
21627  };
21628  notificationLinks[i].onkeydown = function (event) {
21629   event = event || window.event;
21630   if ((event.key && event.key==='Enter') || event.keyCode===13)
21631   return this.onclick(event);
21632  };
21633  }
21634  var closeButtons = panel.querySelectorAll('[data-close-notification]');
21635  for (var j=0;j<closeButtons.length;j++) {
21636  closeButtons[j].onclick = function () {
21637   self.remove(this.getAttribute('data-close-notification'));
21638  };
21639  }
21640  var actionButtons = panel.querySelectorAll('[data-site-notification-action]');
21641  for (var actionIndex=0;actionIndex<actionButtons.length;actionIndex++) {
21642  actionButtons[actionIndex].onclick = function () {
21643   var button = this;
21644   var run = function () {
21645   button.disabled = true;
21646   button.innerHTML = 'Traitement&hellip;';
21647   executeSiteNotificationAction(button.getAttribute('data-site-notification-action'),button.getAttribute('data-action-reference'),function (response) {
21648    if (!response.ok) {
21649    button.disabled = false;
21650    button.innerHTML = '<span aria-hidden="true">&#10003;</span> Accepter';
21651    if (typeof window.alerte==='function') window.alerte(response.message || 'Cette demande ne peut pas &ecirc;tre accept&eacute;e.');
21652    return;
21653    }
21654    var article = button;
21655    while (article && !article.getAttribute('data-site-notification-id')) article = article.parentNode;
21656    var notificationId = article ? (parseInt(article.getAttribute('data-site-notification-id'),10) || 0) : 0;
21657    for (var itemIndex=0;itemIndex<self.items.length;itemIndex++) {
21658    if ((parseInt(self.items[itemIndex].id,10) || 0)===notificationId) {
21659     delete self.items[itemIndex].actionType;
21660     delete self.items[itemIndex].actionReference;
21661    }
21662    }
21663    button.className += ' is-complete';
21664    button.innerHTML = response.code==='deja_traitee'?'D&eacute;j&agrave; trait&eacute;e':'Ami ajout&eacute;';
21665    button.removeAttribute('data-site-notification-action');
21666   });
21667   };
21668   var message = 'Accepter cette demande d\'ami ? Cette personne pourra ensuite vous envoyer des messages priv&eacute;s.';
21669   if (typeof window.confirme==='function') window.confirme(message,run);
21670   else if (window.confirm('Accepter cette demande d\'ami ? Cette personne pourra ensuite vous envoyer des messages priv&eacute;s.')) run();
21671   return false;
21672  };
21673  }
21674  var groupButtons = panel.querySelectorAll('[data-close-category]');
21675  for (var k=0;k<groupButtons.length;k++) {
21676  groupButtons[k].onclick = function () {
21677   self.removeCategory(this.getAttribute('data-close-category'));
21678  };
21679  }
21680  var groupToggles = panel.querySelectorAll('[data-toggle-category]');
21681  for (var toggleIndex=0;toggleIndex<groupToggles.length;toggleIndex++) {
21682  groupToggles[toggleIndex].onclick = function () {
21683   var category = this.getAttribute('data-toggle-category');
21684   var expanded = !self.expandedCategories[category];
21685   if (expanded) self.expandedCategories[category] = true;
21686   else delete self.expandedCategories[category];
21687   this.setAttribute('aria-expanded',expanded?'true':'false');
21688   var section = this.parentNode.parentNode;
21689   if (section && section.classList)
21690   section.classList[expanded?'add':'remove']('siteNotificationGroup--expanded');
21691   var items = document.getElementById(this.getAttribute('aria-controls'));
21692   if (items) items.hidden = !expanded;
21693   var hint = this.querySelector('small');
21694   if (hint) hint.innerHTML = (expanded?'Masquer':'Afficher') + ' les notifications';
21695  };
21696  }
21697 }
21698 };
21699
21700 var pending = window.siteNotificationsPending || [];
21701 window.siteNotificationsPending = [];
21702 window.tarotSiteNotifications = manager;
21703 window.executeSiteNotificationAction = executeSiteNotificationAction;
21704 window.enqueueSiteNotifications = function (notifications) {
21705 manager.enqueue(notifications);
21706 };
21707 if (pending.length) manager.enqueue(pending);
21708})(window, document);
21709
21710(function (window, document) {
21711 function notificationAction(id, action, source, callback, category) {
21712 var status = document.getElementById('notificationsActionStatus');
21713 if (status) {
21714  status.className = 'notificationsActionStatus';
21715  status.innerHTML = '';
21716 }
21717 ajax('/workers/notificationAction.php', 'id=' + encodeURIComponent(id) + '&action=' + encodeURIComponent(action) + '&source=' + encodeURIComponent(source || 'site') + '&category=' + encodeURIComponent(category || ''), function (text) {
21718  var response;
21719  if (text && typeof text==='object') {
21720  response = text;
21721  } else {
21722  try {
21723   response = JSON.parse(text || '{}');
21724  } catch (e) {
21725   var raw = String(text || '');
21726   var start = raw.indexOf('{');
21727   var end = raw.lastIndexOf('}');
21728   try {
21729   response = start>=0 && end>start ? JSON.parse(raw.substring(start,end+1)) : { ok:false };
21730   } catch (ignored) {
21731   response = { ok: false };
21732   }
21733  }
21734  }
21735  if (!response.ok) {
21736  if (status) {
21737   status.className = 'notificationsActionStatus notificationsActionStatus--error';
21738   status.innerHTML = 'Cette action n\'a pas pu &ecirc;tre effectu&eacute;e. Veuillez r&eacute;essayer.';
21739  }
21740  return;
21741  }
21742  callback(response);
21743 });
21744 }
21745
21746 function notificationCurrentCategory() {
21747 var active = document.querySelector('.notificationsFilter--active');
21748 return active ? active.getAttribute('data-notification-filter') || '' : '';
21749 }
21750
21751 function notificationCardLayoutItem(card) {
21752 var parent = card ? card.parentNode : null;
21753 if (parent && parent.className && parent.className.indexOf('notificationCardSlot')!==-1)
21754  return parent;
21755 return card;
21756 }
21757
21758 function notificationCardSetFiltered(card, filtered) {
21759 var item = notificationCardLayoutItem(card);
21760 var filteredClass = item===card?'notificationCard--filtered':'notificationCardSlot--filtered';
21761 if (!item) return;
21762 item.style.display = '';
21763 item.className = item.className.replace(new RegExp('\\s*'+filteredClass,'g'),'');
21764 if (filtered) item.className += ' '+filteredClass;
21765 }
21766
21767 function notificationCardIsVisible(card) {
21768 var item = notificationCardLayoutItem(card);
21769 return item &&
21770  item.className.indexOf('notificationCard--filtered')===-1 &&
21771  item.className.indexOf('notificationCardSlot--filtered')===-1;
21772 }
21773
21774 function notificationRefreshSummary(category) {
21775 var page = document.getElementById('pushNotificationsPage');
21776 if (!page) return;
21777 var cards = page.querySelectorAll('.notificationCard');
21778 var filters = page.querySelectorAll('[data-notification-filter]');
21779 var favoritesVisible = 0, visible = 0, deletableVisible = 0, i, j;
21780 for (i=0;i<cards.length;i++) {
21781  if (notificationCardIsVisible(cards[i])) {
21782  visible++;
21783  if (cards[i].getAttribute('data-favorite')==='1') favoritesVisible++;
21784  else deletableVisible++;
21785  }
21786 }
21787 for (i=0;i<filters.length;i++) {
21788  var filterCategory = filters[i].getAttribute('data-notification-filter') || '';
21789  var count = 0;
21790  for (j=0;j<cards.length;j++) {
21791  if (filterCategory==='' || cards[j].getAttribute('data-category')===filterCategory) count++;
21792  }
21793  var badge = filters[i].getElementsByTagName('span')[0];
21794  if (badge) badge.innerHTML = count;
21795  filters[i].style.display = count===0 && filterCategory!==category ? 'none' : '';
21796 }
21797 var countNode = document.getElementById('notificationsCount');
21798 var empty = document.getElementById('notificationsEmpty');
21799 var favorites = document.getElementById('notificationsFavorites');
21800 var deleteAll = document.getElementById('notificationsDeleteAll');
21801 if (countNode) countNode.innerHTML = cards.length;
21802 if (empty) empty.style.display = visible===0?'':'none';
21803 if (favorites) favorites.style.display = favoritesVisible===0?'none':'';
21804 if (deleteAll) deleteAll.disabled = deletableVisible===0;
21805 }
21806
21807 function notificationFavorite(button, id, source) {
21808 notificationAction(id, 'favorite', source, function (response) {
21809  var card = button;
21810  while (card && !card.getAttribute('data-notification-id')) card = card.parentNode;
21811  if (!card) return;
21812  if (response.favorite!==true) return;
21813  card.setAttribute('data-favorite','1');
21814  if (card.className.indexOf('notificationCard--favorite')===-1)
21815  card.className += ' notificationCard--favorite';
21816  if (button.parentNode) button.parentNode.removeChild(button);
21817  var favoritesList = document.getElementById('notificationsFavoritesList');
21818  var layoutItem = notificationCardLayoutItem(card);
21819  if (favoritesList) {
21820  var favoriteSlot = document.createElement('div');
21821  favoriteSlot.className = 'notificationCardSlot notificationCardSlot--favorite';
21822  favoriteSlot.appendChild(card);
21823  favoritesList.appendChild(favoriteSlot);
21824  if (layoutItem!==card && layoutItem.parentNode)
21825   layoutItem.parentNode.removeChild(layoutItem);
21826  }
21827  notificationFilter(notificationCurrentCategory(),document.querySelector('.notificationsFilter--active'));
21828 });
21829 return false;
21830 }
21831
21832 function notificationFilter(category, button) {
21833 var page = document.getElementById('pushNotificationsPage');
21834 if (!page) return false;
21835 var cards = page.querySelectorAll('.notificationCard');
21836 var buttons = page.querySelectorAll('[data-notification-filter]');
21837 var i;
21838 for (i=0;i<buttons.length;i++)
21839  buttons[i].className = buttons[i].className.replace(/\s*notificationsFilter--active/g,'');
21840 if (button) button.className += ' notificationsFilter--active';
21841 for (i=0;i<cards.length;i++) {
21842  var show = category==='' || cards[i].getAttribute('data-category')===category;
21843  notificationCardSetFiltered(cards[i],!show);
21844 }
21845 notificationRefreshSummary(category);
21846 return false;
21847 }
21848
21849 function notificationDelete(button, id, source) {
21850 button.disabled = true;
21851 notificationAction(id, 'delete', source, function () {
21852  var card = button;
21853  while (card && !card.getAttribute('data-notification-id')) card = card.parentNode;
21854  var layoutItem = notificationCardLayoutItem(card);
21855  if (layoutItem && layoutItem.parentNode) layoutItem.parentNode.removeChild(layoutItem);
21856  var activeFilter = document.querySelector('.notificationsFilter--active');
21857  notificationFilter(notificationCurrentCategory(),activeFilter);
21858 });
21859 return false;
21860 }
21861
21862 function notificationDeleteAll(button) {
21863 var category = notificationCurrentCategory();
21864 var activeFilter = document.querySelector('.notificationsFilter--active');
21865 var categoryLabel = activeFilter ? activeFilter.getAttribute('data-notification-label') || '' : '';
21866 var removeAll = function () {
21867  button.disabled = true;
21868  notificationAction(0, 'delete_all', 'site', function () {
21869  var page = document.getElementById('pushNotificationsPage');
21870  var cards = page ? page.querySelectorAll('.notificationCard') : [];
21871  for (var i=cards.length-1;i>=0;i--) {
21872   if (category!=='' && cards[i].getAttribute('data-category')!==category) continue;
21873   if (cards[i].getAttribute('data-favorite')==='1') continue;
21874   var layoutItem = notificationCardLayoutItem(cards[i]);
21875   if (layoutItem && layoutItem.parentNode) layoutItem.parentNode.removeChild(layoutItem);
21876  }
21877  var status = document.getElementById('notificationsActionStatus');
21878  if (status) {
21879   status.className = 'notificationsActionStatus notificationsActionStatus--success';
21880   status.innerHTML = category==='' ?
21881   'Toutes vos notifications non favorites ont &eacute;t&eacute; supprim&eacute;es. Vos favoris ont &eacute;t&eacute; conserv&eacute;s.' :
21882   'Toutes les notifications non favorites de la cat&eacute;gorie &laquo;&nbsp;' + categoryLabel + '&nbsp;&raquo; ont &eacute;t&eacute; supprim&eacute;es. Vos favoris ont &eacute;t&eacute; conserv&eacute;s.';
21883  }
21884  notificationFilter(category,activeFilter);
21885  },category);
21886 };
21887 var message = category==='' ?
21888  'Effacer toutes vos notifications non favorites, toutes cat&eacute;gories confondues ? Les notifications favorites seront conserv&eacute;es et resteront supprimables manuellement. Cette action est irr&eacute;versible.' :
21889  'Effacer toutes les notifications non favorites de la cat&eacute;gorie &laquo;&nbsp;' + categoryLabel + '&nbsp;&raquo; ? Les notifications favorites et les autres cat&eacute;gories seront conserv&eacute;es. Cette action est irr&eacute;versible.';
21890 if (typeof window.confirme==='function') window.confirme(message,removeAll);
21891 else if (window.confirm(category==='' ?
21892  'Effacer toutes vos notifications non favorites, toutes cat\u00e9gories confondues ? Les notifications favorites seront conserv\u00e9es et resteront supprimables manuellement. Cette action est irr\u00e9versible.' :
21893  'Effacer toutes les notifications non favorites de la cat\u00e9gorie \u00ab ' + categoryLabel + ' \u00bb ? Les notifications favorites et les autres cat\u00e9gories seront conserv\u00e9es. Cette action est irr\u00e9versible.')) removeAll();
21894 return false;
21895 }
21896
21897 function notificationPrimaryAction(button) {
21898 var action = button.getAttribute('data-notification-primary-action') || '';
21899 var reference = parseInt(button.getAttribute('data-action-reference'),10) || 0;
21900 var status = button.parentNode ? button.parentNode.querySelector('.notificationCard__actionStatus') : null;
21901 var run = function () {
21902  if (typeof window.executeSiteNotificationAction!=='function') {
21903  if (status) status.innerHTML = 'Cette action n\'est pas disponible.';
21904  return;
21905  }
21906  button.disabled = true;
21907  button.innerHTML = 'Traitement&hellip;';
21908  if (status) status.innerHTML = '';
21909  window.executeSiteNotificationAction(action,reference,function (response) {
21910  if (!response || !response.ok) {
21911   button.disabled = false;
21912   button.innerHTML = '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span> Accepter la demande';
21913   if (status) status.innerHTML = response && response.message ? response.message : 'Cette demande ne peut pas &ecirc;tre accept&eacute;e.';
21914   return;
21915  }
21916  button.className += ' is-complete';
21917  button.innerHTML = response.code==='deja_traitee'?'D&eacute;j&agrave; trait&eacute;e':'Ami ajout&eacute;';
21918  button.removeAttribute('data-notification-primary-action');
21919  if (status) status.innerHTML = response.message || '';
21920  });
21921 };
21922 var message = 'Accepter cette demande d\'ami ? Cette personne pourra ensuite vous envoyer des messages priv&eacute;s.';
21923 if (typeof window.confirme==='function') window.confirme(message,run);
21924 else if (window.confirm('Accepter cette demande d\'ami ? Cette personne pourra ensuite vous envoyer des messages priv&eacute;s.')) run();
21925 return false;
21926 }
21927
21928 var notificationTestSequence = 0;
21929 function notificationRandomTest() {
21930 var status = document.getElementById('notificationsActionStatus');
21931 if (typeof window.enqueueSiteNotifications!=='function') {
21932  if (status) {
21933  status.className = 'notificationsActionStatus notificationsActionStatus--error';
21934  status.innerHTML = 'Le moteur de notifications JavaScript n\'est pas disponible.';
21935  }
21936  return false;
21937 }
21938 notificationTestSequence++;
21939 var forum = Math.random()<0.5;
21940 var notification = forum ? {
21941  id:-((new Date()).getTime()+notificationTestSequence),
21942  title:'Test : nouveau sujet du forum',
21943  message:'Une discussion de test vient d\'&ecirc;tre publi&eacute;e sur le forum.',
21944  category:'forum',
21945  categoryLabel:'Forum',
21946  date:'A l\'instant',
21947  url:'/forum/'
21948 } : {
21949  id:-((new Date()).getTime()+notificationTestSequence),
21950  title:'Test : notification de partie',
21951  message:'Une partie de test est pr&ecirc;te &agrave; &ecirc;tre consult&eacute;e.',
21952  category:'competitions',
21953  categoryLabel:'Comp&eacute;titions et victoires',
21954  date:'A l\'instant',
21955  url:'/?part=parties'
21956 };
21957 window.enqueueSiteNotifications([notification]);
21958 if (status) {
21959  status.className = 'notificationsActionStatus notificationsActionStatus--success';
21960  status.innerHTML = 'Notification de test affich&eacute;e localement.';
21961 }
21962 return false;
21963 }
21964
21965 function initNotificationsPage() {
21966 var page = document.getElementById('pushNotificationsPage');
21967 if (!page) return;
21968 if (page.getAttribute('data-notifications-page-ready')==='1') return;
21969 page.setAttribute('data-notifications-page-ready','1');
21970 var filters = page.querySelectorAll('[data-notification-filter]');
21971 var actions = page.querySelectorAll('[data-notification-action]');
21972 var primaryActions = page.querySelectorAll('[data-notification-primary-action]');
21973 var deleteAll = document.getElementById('notificationsDeleteAll');
21974 var randomTest = document.getElementById('notificationsRandomTest');
21975 var i;
21976 for (i=0;i<filters.length;i++) {
21977  filters[i].onclick = function () {
21978  return notificationFilter(this.getAttribute('data-notification-filter') || '',this);
21979  };
21980 }
21981 for (i=0;i<actions.length;i++) {
21982  actions[i].onclick = function () {
21983  var card = this;
21984  while (card && !card.getAttribute('data-notification-id')) card = card.parentNode;
21985  if (!card) return false;
21986  var id = parseInt(card.getAttribute('data-notification-id'),10) || 0;
21987  var source = card.getAttribute('data-notification-source') || 'site';
21988  if (this.getAttribute('data-notification-action')==='favorite')
21989   return notificationFavorite(this,id,source);
21990  return notificationDelete(this,id,source);
21991  };
21992 }
21993 for (i=0;i<primaryActions.length;i++) {
21994  primaryActions[i].onclick = function () {
21995  return notificationPrimaryAction(this);
21996  };
21997 }
21998 if (deleteAll) deleteAll.onclick = function () { return notificationDeleteAll(this); };
21999 if (randomTest) randomTest.onclick = function () { return notificationRandomTest(this); };
22000 notificationFilter(notificationCurrentCategory(),document.querySelector('.notificationsFilter--active'));
22001 if (window.tarotPushNotifications)
22002  window.tarotPushNotifications.init('pushNotificationsPage');
22003 }
22004
22005 window.notificationFavorite = notificationFavorite;
22006 window.notificationFilter = notificationFilter;
22007 window.notificationDelete = notificationDelete;
22008 window.notificationDeleteAll = notificationDeleteAll;
22009 window.notificationPrimaryAction = notificationPrimaryAction;
22010 window.notificationRandomTest = notificationRandomTest;
22011 window.initNotificationsPage = initNotificationsPage;
22012 initNotificationsPage();
22013})(window, document);
22014
22015(function () {
22016 "use strict";
22017
22018 var page;
22019 var mapsLoading = false;
22020 var mapsCallbacks = [];
22021 var listMap = null;
22022 var listMarkers = {};
22023 var formMap = null;
22024 var formMarker = null;
22025
22026 function normalise(value) {
22027 value = String(value || "").toLowerCase();
22028 if (value.normalize) value = value.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
22029 return value.replace(/[^a-z0-9]+/g, " ").trim();
22030 }
22031
22032 function parseMapData() {
22033 var node = document.getElementById("concoursMapData");
22034 if (!node) return [];
22035 try { return JSON.parse(node.textContent || "[]"); }
22036 catch (error) { return []; }
22037 }
22038
22039 function mapsError(message) {
22040 var targets = document.querySelectorAll("#concoursMap, #concoursDetailMap, #concoursFormMap");
22041 Array.prototype.forEach.call(targets, function (target) {
22042  if (target && (!target.offsetParent || target.id !== "concoursFormMap" || !target.hidden)) {
22043  target.hidden = false;
22044  target.classList.remove("is-loaded");
22045  target.innerHTML = "";
22046  var notice = document.createElement("div");
22047  notice.className = "concoursMapError";
22048  notice.textContent = message;
22049  target.appendChild(notice);
22050  }
22051 });
22052 }
22053
22054 function loadGoogleMaps(callback) {
22055 if (window.google && window.google.maps) {
22056  callback();
22057  return;
22058 }
22059 mapsCallbacks.push(callback);
22060 if (mapsLoading) return;
22061 var key = page ? page.getAttribute("data-google-key") : "";
22062 if (!key) {
22063  mapsError("La carte est momentanement indisponible. La liste et les liens d'itineraire restent utilisables.");
22064  mapsCallbacks = [];
22065  return;
22066 }
22067 mapsLoading = true;
22068 window.concoursGoogleMapsReady = function () {
22069  mapsLoading = false;
22070  var callbacks = mapsCallbacks.slice();
22071  mapsCallbacks = [];
22072  callbacks.forEach(function (item) { item(); });
22073 };
22074 var script = document.createElement("script");
22075 script.src = "https://maps.googleapis.com/maps/api/js?key=" + encodeURIComponent(key) + "&libraries=places&language=fr&region=FR&callback=concoursGoogleMapsReady";
22076 script.async = true;
22077 script.defer = true;
22078 script.onerror = function () {
22079  mapsLoading = false;
22080  mapsCallbacks = [];
22081  mapsError("Impossible de charger Google Maps. Verifiez votre connexion ou utilisez le lien d'itineraire.");
22082 };
22083 document.head.appendChild(script);
22084 }
22085
22086 function infoWindowContent(item) {
22087 var container = document.createElement("div");
22088 container.className = "concoursMapInfo";
22089 var title = document.createElement("strong");
22090 title.textContent = item.title;
22091 var place = document.createElement("p");
22092 place.textContent = item.city + " (" + item.department + ") - " + item.date;
22093 var link = document.createElement("a");
22094 link.href = item.url;
22095 link.textContent = "Voir la fiche";
22096 container.appendChild(title);
22097 container.appendChild(place);
22098 container.appendChild(link);
22099 return container;
22100 }
22101
22102 function buildListMap() {
22103 var target = document.getElementById("concoursMap");
22104 var data = parseMapData();
22105 if (!target || !data.length || listMap) return;
22106 loadGoogleMaps(function () {
22107  target.innerHTML = "";
22108  target.classList.add("is-loaded");
22109  listMap = new google.maps.Map(target, {
22110  center: {lat: 46.65, lng: 2.45},
22111  zoom: 5,
22112  mapTypeControl: false,
22113  streetViewControl: false,
22114  fullscreenControl: true
22115  });
22116  var bounds = new google.maps.LatLngBounds();
22117  var info = new google.maps.InfoWindow();
22118  data.forEach(function (item) {
22119  var position = {lat: Number(item.lat), lng: Number(item.lng)};
22120  var marker = new google.maps.Marker({map: listMap, position: position, title: item.city});
22121  marker.addListener("click", function () {
22122   info.setContent(infoWindowContent(item));
22123   info.open(listMap, marker);
22124  });
22125  listMarkers[item.id] = marker;
22126  bounds.extend(position);
22127  });
22128  if (!bounds.isEmpty()) {
22129  listMap.fitBounds(bounds);
22130  google.maps.event.addListenerOnce(listMap, "bounds_changed", function () {
22131   if (listMap.getZoom()>9) listMap.setZoom(9);
22132  });
22133  }
22134  window.setTimeout(function () {
22135  google.maps.event.trigger(listMap, "resize");
22136  if (!bounds.isEmpty()) listMap.fitBounds(bounds);
22137  }, 0);
22138 });
22139 }
22140
22141 function visibleCards() {
22142 return Array.prototype.filter.call(document.querySelectorAll("[data-concours-card]"), function (card) {
22143  return !card.hidden;
22144 });
22145 }
22146
22147 function updateMarkerVisibility() {
22148 Object.keys(listMarkers).forEach(function (id) {
22149  var card = document.querySelector('[data-concours-card][data-id="' + id + '"]');
22150  listMarkers[id].setVisible(!card || !card.hidden);
22151 });
22152 }
22153
22154 function applyFilters() {
22155 var textNode = document.getElementById("concoursTextFilter");
22156 var departmentNode = document.getElementById("concoursDepartmentFilter");
22157 var dateNode = document.getElementById("concoursDateFilter");
22158 if (!textNode || !departmentNode || !dateNode) return;
22159 var text = normalise(textNode.value);
22160 var department = departmentNode.value;
22161 var fromDate = dateNode.value;
22162 var count = 0;
22163 Array.prototype.forEach.call(document.querySelectorAll("[data-concours-card]"), function (card) {
22164  var matchesText = !text || normalise(card.getAttribute("data-search")).indexOf(text)!==-1;
22165  var matchesDepartment = !department || card.getAttribute("data-department")===department;
22166  var matchesDate = !fromDate || card.getAttribute("data-date")>=fromDate;
22167  card.hidden = !(matchesText && matchesDepartment && matchesDate);
22168  if (!card.hidden) count++;
22169 });
22170 var countNode = document.getElementById("concoursResultCount");
22171 var emptyNode = document.getElementById("concoursEmpty");
22172 var statusNode = document.getElementById("concoursFilterStatus");
22173 if (countNode) countNode.textContent = count;
22174 if (emptyNode) emptyNode.hidden = count!==0;
22175 if (statusNode) statusNode.textContent = count + (count>1 ? " concours correspondent a votre recherche." : " concours correspond a votre recherche.");
22176 updateMarkerVisibility();
22177 }
22178
22179 function distanceKm(lat1, lng1, lat2, lng2) {
22180 var radius = 6371;
22181 var toRad = Math.PI / 180;
22182 var deltaLat = (lat2-lat1)*toRad;
22183 var deltaLng = (lng2-lng1)*toRad;
22184 var value = Math.sin(deltaLat/2)*Math.sin(deltaLat/2)
22185  + Math.cos(lat1*toRad)*Math.cos(lat2*toRad)*Math.sin(deltaLng/2)*Math.sin(deltaLng/2);
22186 return radius*2*Math.atan2(Math.sqrt(value), Math.sqrt(1-value));
22187 }
22188
22189 function locateUser() {
22190 var button = document.getElementById("concoursNearMe");
22191 var statusNode = document.getElementById("concoursFilterStatus");
22192 if (!navigator.geolocation) {
22193  if (statusNode) statusNode.textContent = "La geolocalisation n'est pas disponible sur cet appareil.";
22194  return;
22195 }
22196 if (button) {
22197  button.disabled = true;
22198  button.textContent = "Localisation...";
22199 }
22200 navigator.geolocation.getCurrentPosition(function (position) {
22201  var cards = Array.prototype.slice.call(document.querySelectorAll("[data-concours-card]"));
22202  cards.forEach(function (card, index) {
22203  if (!card.hasAttribute("data-original-order")) card.setAttribute("data-original-order", index);
22204  var lat = Number(card.getAttribute("data-lat"));
22205  var lng = Number(card.getAttribute("data-lng"));
22206  var distance = isFinite(lat) && isFinite(lng) && lat!==0 && lng!==0
22207   ? distanceKm(position.coords.latitude, position.coords.longitude, lat, lng)
22208   : 999999;
22209  card.setAttribute("data-distance", distance);
22210  var node = card.querySelector("[data-concours-distance]");
22211  if (node) node.textContent = distance<999999 ? Math.round(distance) + " km" : "";
22212  });
22213  cards.sort(function (a, b) { return Number(a.getAttribute("data-distance"))-Number(b.getAttribute("data-distance")); });
22214  var container = document.getElementById("concoursCards");
22215  cards.forEach(function (card) { container.appendChild(card); });
22216  if (statusNode) statusNode.textContent = "Les concours sont classes du plus proche au plus eloigne.";
22217  if (button) {
22218  button.disabled = false;
22219  button.textContent = "Position utilisee";
22220  }
22221 }, function () {
22222  if (statusNode) statusNode.textContent = "Votre position n'a pas ete partagee. Les autres filtres restent disponibles.";
22223  if (button) {
22224  button.disabled = false;
22225  button.textContent = "Autour de moi";
22226  }
22227 }
22227, {enableHighAccuracy: false, timeout: 10000, maximumAge: 300000});
22228 }
22229
22230 function setupList() {
22231 ["concoursTextFilter", "concoursDepartmentFilter", "concoursDateFilter"].forEach(function (id) {
22232  var node = document.getElementById(id);
22233  if (!node) return;
22234  node.addEventListener(id==="concoursTextFilter" ? "input" : "change", applyFilters);
22235 });
22236 var near = document.getElementById("concoursNearMe");
22237 if (near) near.addEventListener("click", locateUser);
22238 Array.prototype.forEach.call(document.querySelectorAll("[data-concours-reset]"), function (button) {
22239  button.addEventListener("click", function () {
22240  document.getElementById("concoursTextFilter").value = "";
22241  document.getElementById("concoursDepartmentFilter").value = "";
22242  document.getElementById("concoursDateFilter").value = "";
22243  applyFilters();
22244  });
22245 });
22246 var panel = document.getElementById("concoursMapPanel");
22247 Array.prototype.forEach.call(document.querySelectorAll("[data-concours-show-map], [data-concours-load-map]"), function (button) {
22248  button.addEventListener("click", function () {
22249  if (panel) panel.classList.add("is-open");
22250  buildListMap();
22251  });
22252 });
22253 Array.prototype.forEach.call(document.querySelectorAll("[data-concours-close-map]"), function (button) {
22254  button.addEventListener("click", function () { if (panel) panel.classList.remove("is-open"); });
22255 });
22256 }
22257
22258 function setupDetailMap() {
22259 var button = document.querySelector("[data-concours-load-detail-map]");
22260 var target = document.getElementById("concoursDetailMap");
22261 var data = parseMapData();
22262 if (!button || !target || !data.length) return;
22263 button.addEventListener("click", function () {
22264  loadGoogleMaps(function () {
22265  var item = data[0];
22266  target.innerHTML = "";
22267  target.classList.add("is-loaded");
22268  var position = {lat: Number(item.lat), lng: Number(item.lng)};
22269  var map = new google.maps.Map(target, {center: position, zoom: 14, mapTypeControl: false, streetViewControl: false});
22270  var marker = new google.maps.Marker({map: map, position: position, title: item.city});
22271  var info = new google.maps.InfoWindow({content: infoWindowContent(item)});
22272  marker.addListener("click", function () { info.open(map, marker); });
22273  window.setTimeout(function () {
22274   google.maps.event.trigger(map, "resize");
22275   map.setCenter(position);
22276  }, 0);
22277  });
22278 });
22279 }
22280
22281 function addressComponent(place, type, mode) {
22282 var components = place.address_components || [];
22283 for (var i=0; i<components.length; i++) {
22284  if (components[i].types.indexOf(type)!==-1) return components[i][mode || "long_name"] || "";
22285 }
22286 return "";
22287 }
22288
22289 function departmentFromPostal(postal) {
22290 postal = String(postal || "").replace(/\D/g, "");
22291 if (postal.indexOf("97")===0 || postal.indexOf("98")===0) return "97";
22292 return postal.substr(0, 2);
22293 }
22294
22295 function setFormValue(id, value) {
22296 var node = document.getElementById(id);
22297 if (node) node.value = value===null || typeof value==="undefined" ? "" : value;
22298 }
22299
22300 function selectFormDepartment(code) {
22301 var department = document.getElementById("concoursDepartment");
22302 if (!department || !code) return;
22303 for (var i=0; i<department.options.length; i++) {
22304  if (department.options[i].value===String(code)) {
22305  department.value = code;
22306  return;
22307  }
22308 }
22309 }
22310
22311 function splitSavedStreet(line) {
22312 line = String(line || "").trim();
22313 var match = line.match(/^([0-9]+(?:\s*(?:bis|ter|quater))?)\s+(.+)$/i);
22314 return match ? {number:match[1], route:match[2]} : {number:"", route:line};
22315 }
22316
22317 function savedAddressText(address) {
22318 var parts = [
22319  address.line1,
22320  address.line2,
22321  String(address.postalCode || "") + " " + String(address.city || ""),
22322  address.country
22323 ];
22324 return parts.filter(function (part) { return String(part || "").trim()!==""; }).join(", ");
22325 }
22326
22327 function renderFormMap(position) {
22328 var mapTarget = document.getElementById("concoursFormMap");
22329 if (!mapTarget || !position) return;
22330 mapTarget.hidden = false;
22331 if (!formMap) {
22332  mapTarget.innerHTML = "";
22333  formMap = new google.maps.Map(mapTarget, {center:position, zoom:15, mapTypeControl:false, streetViewControl:false});
22334 } else {
22335  formMap.setCenter(position);
22336  formMap.setZoom(15);
22337 }
22338 if (formMarker) formMarker.setMap(null);
22339 formMarker = new google.maps.Marker({map:formMap, position:position});
22340 window.setTimeout(function () {
22341  google.maps.event.trigger(formMap, "resize");
22342  formMap.setCenter(position);
22343 }, 0);
22344 }
22345
22346 function setupSavedAddresses() {
22347 var dataNode = document.getElementById("concoursSavedAddressesData");
22348 var buttons = document.querySelectorAll("[data-concours-saved-address]");
22349 var status = document.querySelector("[data-concours-saved-address-status]");
22350 if (!dataNode || !buttons.length) return;
22351 var addresses = [];
22352 try { addresses = JSON.parse(dataNode.textContent || "[]"); }
22353 catch (error) { addresses = []; }
22354 if (!addresses.length) return;
22355
22356 function clearSelection() {
22357  Array.prototype.forEach.call(buttons, function (button) {
22358  button.classList.remove("is-selected");
22359  button.setAttribute("aria-pressed", "false");
22360  });
22361 }
22362
22363 Array.prototype.forEach.call(buttons, function (button) {
22364  button.addEventListener("click", function () {
22365  var address = addresses[parseInt(button.getAttribute("data-concours-saved-address"), 10)];
22366  if (!address) return;
22367  var street = splitSavedStreet(address.line1);
22368  var fullAddress = savedAddressText(address);
22369  setFormValue("concoursAddressSearch", fullAddress);
22370  setFormValue("concoursStreetNumber", street.number);
22371  setFormValue("concoursRoute", street.route);
22372  setFormValue("concoursLine2", address.line2);
22373  setFormValue("concoursPostalCode", address.postalCode);
22374  setFormValue("concoursLocality", address.city);
22375  setFormValue("concoursCountry", address.country || "France");
22376  setFormValue("concoursRegion", "");
22377  setFormValue("concoursResLat", "");
22378  setFormValue("concoursResLng", "");
22379  selectFormDepartment(address.department || departmentFromPostal(address.postalCode));
22380  clearSelection();
22381  button.classList.add("is-selected");
22382  button.setAttribute("aria-pressed", "true");
22383  if (status) status.textContent = "Adresse remplie. Vous pouvez encore modifier le nom de la salle ou tout autre champ.";
22384
22385  var hasCoordinates = address.lat!==null && address.lng!==null && String(address.lat).trim()!=="" && String(address.lng).trim()!=="";
22386  var lat = Number(address.lat), lng = Number(address.lng);
22387  if (hasCoordinates && isFinite(lat) && isFinite(lng) && Math.abs(lat)<=90 && Math.abs(lng)<=180) {
22388   setFormValue("concoursResLat", lat);
22389   setFormValue("concoursResLng", lng);
22390   loadGoogleMaps(function () { renderFormMap({lat:lat, lng:lng}); });
22391  } else {
22392   var mapTarget = document.getElementById("concoursFormMap");
22393   if (formMarker) formMarker.setMap(null);
22394   if (mapTarget) {
22395   mapTarget.hidden = true;
22396   mapTarget.innerHTML = "";
22397   }
22398   formMap = null;
22399   formMarker = null;
22400  }
22401  });
22402 });
22403
22404 ["concoursAddressSearch","concoursStreetNumber","concoursRoute","concoursLine2","concoursPostalCode","concoursLocality","concoursCountry","concoursDepartment"].forEach(function (id) {
22405  var field = document.getElementById(id);
22406  if (field) {
22407  var markAsCustomized = function () {
22408   if (!document.querySelector(".concoursSavedAddress.is-selected")) return;
22409   clearSelection();
22410   if (status) status.textContent = "Adresse personnalisee : vos modifications seront utilisees pour ce concours.";
22411  };
22412  field.addEventListener("input", markAsCustomized);
22413  field.addEventListener("change", markAsCustomized);
22414  }
22415 });
22416 }
22417
22418 function setupAddressAutocomplete() {
22419 var input = document.getElementById("concoursAddressSearch");
22420 if (!input) return;
22421 var initialized = false;
22422 function initialize() {
22423  if (initialized) return;
22424  loadGoogleMaps(function () {
22425  if (initialized) return;
22426  initialized = true;
22427  var autocomplete = new google.maps.places.Autocomplete(input, {
22428   componentRestrictions: {country: "fr"},
22429   fields: ["address_components", "formatted_address", "geometry", "name"]
22430  });
22431  autocomplete.addListener("place_changed", function () {
22432   var place = autocomplete.getPlace();
22433   if (!place || !place.geometry) return;
22434   var postal = addressComponent(place, "postal_code", "short_name");
22435   var city = addressComponent(place, "locality") || addressComponent(place, "postal_town") || addressComponent(place, "administrative_area_level_3");
22436   var values = {
22437   concoursStreetNumber: addressComponent(place, "street_number", "short_name"),
22438   concoursRoute: addressComponent(place, "route"),
22439   concoursPostalCode: postal,
22440   concoursLocality: city,
22441   concoursCountry: addressComponent(place, "country"),
22442   concoursRegion: addressComponent(place, "administrative_area_level_1", "short_name"),
22443   concoursResLat: place.geometry.location.lat(),
22444   concoursResLng: place.geometry.location.lng()
22445   };
22446   Object.keys(values).forEach(function (id) { setFormValue(id, values[id]); });
22447   input.value = place.formatted_address || place.name || input.value;
22448   var departmentCode = departmentFromPostal(postal);
22449   selectFormDepartment(departmentCode);
22450   renderFormMap(place.geometry.location);
22451  });
22452  var help = document.querySelector("[data-concours-address-help]");
22453  if (help) help.textContent = "Choisissez une proposition pour remplir automatiquement le lieu et la carte.";
22454  });
22455 }
22456 input.addEventListener("focus", initialize, {once: true});
22457 input.addEventListener("input", initialize, {once: true});
22458 }
22459
22460 function setupImageUpload() {
22461 var container = document.querySelector("[data-concours-upload]");
22462 if (!container) return;
22463 var form = container.closest ? container.closest("form") : null;
22464 var input = container.querySelector("[data-concours-upload-input]");
22465 var dropzone = container.querySelector("[data-concours-upload-dropzone]");
22466 var preview = container.querySelector("[data-concours-upload-preview]");
22467 var status = container.querySelector("[data-concours-upload-status]");
22468 var tokenInput = container.querySelector("[data-concours-upload-token]");
22469 var removeInput = container.querySelector("[data-concours-upload-remove]");
22470 var removeButton = container.querySelector("[data-concours-upload-remove-button]");
22471 if (!form || !input || !dropzone || !preview || !status || !tokenInput || !removeInput || !removeButton) return;
22472
22473 var csrf = form.querySelector('input[name="concoursToken"]');
22474 var existingSrc = dropzone.getAttribute("data-existing-src") || "";
22475 var objectUrl = "";
22476 var uploading = false;
22477 var dragDepth = 0;
22478
22479 function setStatus(message, state) {
22480  status.textContent = message;
22481  container.classList.remove("is-uploading", "is-success", "has-error");
22482  if (state) container.classList.add(state);
22483 }
22484
22485 function setUploading(value) {
22486  uploading = value;
22487  dropzone.setAttribute("aria-busy", value ? "true" : "false");
22488  Array.prototype.forEach.call(form.querySelectorAll('button[name="concoursOperation"][value="enregistrer"]'), function (button) {
22489  button.disabled = value;
22490  });
22491 }
22492
22493 function releaseObjectUrl() {
22494  if (objectUrl && window.URL && window.URL.revokeObjectURL) window.URL.revokeObjectURL(objectUrl);
22495  objectUrl = "";
22496 }
22497
22498 function showPreview(src) {
22499  releaseObjectUrl();
22500  if (src) {
22501  preview.src = src;
22502  preview.hidden = false;
22503  dropzone.classList.add("has-preview");
22504  } else {
22505  preview.removeAttribute("src");
22506  preview.hidden = true;
22507  dropzone.classList.remove("has-preview");
22508  }
22509 }
22510
22511 function showFilePreview(file) {
22512  releaseObjectUrl();
22513  if (window.URL && window.URL.createObjectURL) {
22514  objectUrl = window.URL.createObjectURL(file);
22515  preview.src = objectUrl;
22516  preview.hidden = false;
22517  dropzone.classList.add("has-preview");
22518  }
22519 }
22520
22521 function updateRemoveButton() {
22522  var hasTemporary = tokenInput.value!=="";
22523  var existingRemoved = removeInput.value==="1";
22524  removeButton.hidden = !hasTemporary && !existingSrc;
22525  if (hasTemporary) removeButton.textContent = existingSrc ? "Annuler le remplacement" : "Retirer l'image";
22526  else if (existingSrc && existingRemoved) removeButton.textContent = "Conserver l'image actuelle";
22527  else removeButton.textContent = "Retirer l'image actuelle";
22528 }
22529
22530 function deleteTemporary(token) {
22531  if (!token || !csrf || !window.fetch) return;
22532  var data = new FormData();
22533  data.append("concoursOperation", "supprimer-image-temporaire");
22534  data.append("concoursToken", csrf.value);
22535  data.append("concoursImageTempToken", token);
22536  window.fetch(form.getAttribute("action") || window.location.href, {
22537  method: "POST",
22538  body: data,
22539  credentials: "same-origin",
22540  headers: {"X-Requested-With": "XMLHttpRequest"}
22541  }).catch(function () {});
22542 }
22543
22544 function validFile(file) {
22545  var allowed = ["image/jpeg", "image/png", "image/gif", "image/webp"];
22546  if (!file || allowed.indexOf(String(file.type || "").toLowerCase())===-1) {
22547  setStatus("Choisissez une image JPG, PNG, GIF ou WebP.", "has-error");
22548  return false;
22549  }
22550  if (file.size<=0 || file.size>8*1024*1024) {
22551  setStatus("L'image doit peser moins de 8 Mo.", "has-error");
22552  return false;
22553  }
22554  return true;
22555 }
22556
22557 function uploadFile(file) {
22558  if (uploading) return;
22559  if (!validFile(file)) return;
22560  var previousToken = tokenInput.value;
22561  tokenInput.value = "";
22562  removeInput.value = "0";
22563  input.setAttribute("name", "concoursImage");
22564  showFilePreview(file);
22565  updateRemoveButton();
22566  setStatus("T\u00e9l\u00e9versement et optimisation de l'image\u2026", "is-uploading");
22567
22568  if (!window.fetch || !window.FormData || !csrf) {
22569  setStatus("Aper\u00e7u pr\u00eat. L'image sera envoy\u00e9e lors de la publication.", "");
22570  return;
22571  }
22572
22573  setUploading(true);
22574  var data = new FormData();
22575  data.append("concoursOperation", "televerser-image");
22576  data.append("concoursToken", csrf.value);
22577  data.append("concoursImage", file, file.name);
22578  if (previousToken) data.append("concoursImagePreviousToken", previousToken);
22579  window.fetch(form.getAttribute("action") || window.location.href, {
22580  method: "POST",
22581  body: data,
22582  credentials: "same-origin",
22583  headers: {"X-Requested-With": "XMLHttpRequest"}
22584  }).then(function (response) {
22585  return response.json().catch(function () { return {}; }).then(function (payload) {
22586   if (!response.ok || !payload.success || !payload.token)
22587   throw new Error(payload.message || "Le t\u00e9l\u00e9versement de l'image a \u00e9chou\u00e9.");
22588   return payload;
22589  });
22590  }).then(function (payload) {
22591  tokenInput.value = payload.token;
22592  input.removeAttribute("name");
22593  setStatus("Image t\u00e9l\u00e9vers\u00e9e, optimis\u00e9e et pr\u00eate \u00e0 \u00eatre publi\u00e9e.", "is-success");
22594  updateRemoveButton();
22595  }).catch(function (error) {
22596  setStatus(error && error.message ? error.message + " Elle sera r\u00e9essay\u00e9e lors de la publication." : "Le t\u00e9l\u00e9versement a \u00e9chou\u00e9. Il sera r\u00e9essay\u00e9 lors de la publication.", "has-error");
22597  }).then(function () {
22598  setUploading(false);
22599  });
22600 }
22601
22602 dropzone.addEventListener("click", function () {
22603  if (!uploading) input.click();
22604 });
22605 input.addEventListener("change", function () {
22606  if (input.files && input.files[0]) uploadFile(input.files[0]);
22607 });
22608 dropzone.addEventListener("dragenter", function (event) {
22609  event.preventDefault();
22610  dragDepth++;
22611  dropzone.classList.add("is-dragging");
22612 });
22613 dropzone.addEventListener("dragover", function (event) {
22614  event.preventDefault();
22615  if (event.dataTransfer) event.dataTransfer.dropEffect = "copy";
22616 });
22617 dropzone.addEventListener("dragleave", function (event) {
22618  event.preventDefault();
22619  dragDepth = Math.max(0, dragDepth-1);
22620  if (!dragDepth) dropzone.classList.remove("is-dragging");
22621 });
22622 dropzone.addEventListener("drop", function (event) {
22623  event.preventDefault();
22624  dragDepth = 0;
22625  dropzone.classList.remove("is-dragging");
22626  var file = event.dataTransfer && event.dataTransfer.files ? event.dataTransfer.files[0] : null;
22627  if (!file) return;
22628  try { input.files = event.dataTransfer.files; } catch (error) {}
22629  uploadFile(file);
22630 });
22631 removeButton.addEventListener("click", function () {
22632  if (uploading) return;
22633  if (tokenInput.value!=="") {
22634  deleteTemporary(tokenInput.value);
22635  tokenInput.value = "";
22636  input.value = "";
22637  input.setAttribute("name", "concoursImage");
22638  removeInput.value = "0";
22639  showPreview(existingSrc);
22640  setStatus(existingSrc ? "Le remplacement est annul\u00e9 : l'image actuelle sera conserv\u00e9e." : "Aucune image s\u00e9lectionn\u00e9e.", "");
22641  } else if (existingSrc) {
22642  var removeExisting = removeInput.value!=="1";
22643  removeInput.value = removeExisting ? "1" : "0";
22644  showPreview(removeExisting ? "" : existingSrc);
22645  setStatus(removeExisting ? "L'image actuelle sera supprim\u00e9e lors de l'enregistrement." : "L'image actuelle sera conserv\u00e9e.", removeExisting ? "has-error" : "");
22646  }
22647  updateRemoveButton();
22648 });
22649 form.addEventListener("submit", function (event) {
22650  if (!uploading) return;
22651  event.preventDefault();
22652  setStatus("Patientez quelques secondes, l'image est encore en cours de pr\u00e9paration.", "is-uploading");
22653 });
22654 window.addEventListener("beforeunload", releaseObjectUrl);
22655 updateRemoveButton();
22656 }
22657
22658 function setupDeleteConfirmation() {
22659 var button = document.querySelector("[data-concours-delete]");
22660 if (!button) return;
22661 button.addEventListener("click", function (event) {
22662  if (!window.confirm("Supprimer definitivement ce concours ?")) event.preventDefault();
22663 });
22664 }
22665
22666 function setupAfterEventConfirmations() {
22667 var confirmations = [
22668  ["[data-concours-after-delete]", "Supprimer cette publication du journal ?"],
22669  ["[data-concours-review-delete]", "Supprimer votre avis sur ce concours ?"],
22670  ["[data-concours-dereference]", "Un email de verification va etre envoye a l'adresse de contact. Continuer ?"],
22671  ["[data-concours-final-delete]", "Derniere confirmation : supprimer definitivement la fiche et toutes ses contributions ?"]
22672 ];
22673 confirmations.forEach(function (item) {
22674  Array.prototype.forEach.call(document.querySelectorAll(item[0]), function (button) {
22675  button.addEventListener("click", function (event) {
22676   if (!window.confirm(item[1])) event.preventDefault();
22677  });
22678  });
22679 });
22680 }
22681
22682 function initialize() {
22683 page = document.querySelector("[data-concours-page]");
22684 if (!page) return;
22685 var mode = page.getAttribute("data-concours-page");
22686 if (mode==="liste") setupList();
22687 if (mode==="detail") {
22688  setupDetailMap();
22689  setupAfterEventConfirmations();
22690 }
22691 if (mode==="suppression") setupAfterEventConfirmations();
22692 if (mode==="ajouter" || mode==="modifier") {
22693  setupSavedAddresses();
22694  setupAddressAutocomplete();
22695  setupImageUpload();
22696  setupDeleteConfirmation();
22697 }
22698 }
22699
22700 if (document.readyState==="loading") document.addEventListener("DOMContentLoaded", initialize);
22701 else initialize();
22702}());
22703
22704 
22705var timeOutSleep;
22706function updateResult(t)
22707{
22708 eval(t);
22709}
22710function loginUpdateResult(t)
22711{
22712 if (t=="OK")
22713 {
22714 document.location = '/';
22715 }
22716 else 
22717 alerte(t);
22718}
22719
22720function changeLogin (user,passwd)
22721{
22722 ajax('/workers/register.php', "register[pseudo]="+user+"&register[passwd]="+passwd, loginUpdateResult);
22723 //return ajax('/workers/mobileUpdate.php?'+str+'&s='+'scr'+scrNum, '', receptionRpc);
22724 //alert('changeLogin'+user+passwd);
22725}
22726function updatePseudo (txt)
22727{
22728 ajax('/workers/mobileUpdate.php', "register[pseudo]="+txt, updateResult);
22729 //alert('updatePseudo'+txt);
22730}
22731function updateBiographie (txt)
22732{
22733 ajax('/workers/mobileUpdate.php', "register[biographie]="+txt, updateResult);
22734 //alert('updateBiographie'+txt);
22735}
22736function updateAvatar (txt)
22737{
22738 ajax('/workers/mobileUpdate.php', "register[avatar]="+txt, updateResult);
22739 //alert('updateAvatar'+txt);
22740} 
22741function receiveAndroidUploadResult(res)
22742{  
22743 if (res.split('|').length>1)
22744 {
22745 var tabRes = res.split('|');
22746 if (tabRes[0]=="OK")
22747 {
22748  updateAvatar(tabRes[1]);
22749 }
22750 else
22751 {
22752  alerte('Erreur : '+tabRes[1]); 
22753 }
22754 }
22755 else
22756 {
22757 alerte('Erreur : '+res); 
22758 }
22759} 
22760function resetZoom()
22761{  
22762 try {            
22763 jb.resetZoom();
22764 } catch (e) {} 
22765} 
22766function pageLoadComplete()
22767{  
22768 try {          
22769 jb.pageLoadComplete(); 
22770 } catch (e) {}
22771} 
22772function menuIdentifie()
22773{
22774 try {          
22775 jb.menuIdentifie(); 
22776 } catch (e) {}
22777} 
22778
22779function isTouchDevice(){
22780 try{
22781 document.createEvent("TouchEvent");
22782 return true;
22783 }catch(e){
22784 return false;
22785 }
22786}
22787function touchScroll(id){
22788//return;
22789 if(isTouchDevice()){ //if touch events exist
22790 var el=document.getElementById(id);
22791 var scrollStartPosY=0;
22792 var scrollStartPosX=0;
22793
22794 document.getElementById(id).addEventListener("touchstart", function(event) {
22795 scrollStartPosY=el.scrollTop+event.touches[0].pageY;
22796 scrollStartPosX=el.scrollLeft+event.touches[0].pageX;
22797 //event.preventDefault(); // Keep this remarked so you can click on buttons and links in the div
22798 },false);
22799
22800 document.getElementById(id).addEventListener("touchmove", function(event) {
22801 // These if statements allow the full page to scroll (not just the div) if they are
22802 // at the top of the div scroll or the bottom of the div scroll
22803 // The -5 and +5 below are in case they are trying to scroll the page sideways
22804 // but their finger moves a few pixels down or up. The event.preventDefault() function
22805 // will not be called in that case so that the whole page can scroll.
22806 if ((this.scrollTop < this.scrollHeight-this.offsetHeight &&
22807  this.scrollTop+event.touches[0].pageY < scrollStartPosY-5) ||
22808  (this.scrollTop != 0 && this.scrollTop+event.touches[0].pageY > scrollStartPosY+5))
22809  event.preventDefault(); 
22810 if ((this.scrollLeft < this.scrollWidth-this.offsetWidth &&
22811  this.scrollLeft+event.touches[0].pageX < scrollStartPosX-5) ||
22812  (this.scrollLeft != 0 && this.scrollLeft+event.touches[0].pageX > scrollStartPosX+5))
22813  event.preventDefault(); 
22814 el.scrollTop=scrollStartPosY-event.touches[0].pageY;
22815 el.scrollLeft=scrollStartPosX-event.touches[0].pageX;
22816 },false);
22817 }
22818} 
22819function touchScrollX(id){
22820//return;
22821 if(isTouchDevice()){ //if touch events exist
22822 var el=document.getElementById(id);
22823 var scrollStartPosY=0;
22824 var scrollStartPosX=0;
22825
22826 document.getElementById(id).addEventListener("touchstart", function(event) {
22827 scrollStartPosY=0;//el.scrollTop+event.touches[0].pageY;
22828 scrollStartPosX=el.scrollLeft+event.touches[0].pageX;
22829 //event.preventDefault(); // Keep this remarked so you can click on buttons and links in the div
22830 },false);
22831
22832 document.getElementById(id).addEventListener("touchmove", function(event) {
22833
22834 if ((this.scrollTop < this.scrollHeight-this.offsetHeight &&
22835  this.scrollTop+event.touches[0].pageY < scrollStartPosY-5) ||
22836  (this.scrollTop != 0 && this.scrollTop+event.touches[0].pageY > scrollStartPosY+5))
22837  event.preventDefault(); 
22838 if ((this.scrollLeft < this.scrollWidth-this.offsetWidth &&
22839  this.scrollLeft+event.touches[0].pageX < scrollStartPosX-5) ||
22840  (this.scrollLeft != 0 && this.scrollLeft+event.touches[0].pageX > scrollStartPosX+5))
22841  event.preventDefault(); 
22842 //el.scrollTop=scrollStartPosY-event.touches[0].pageY;
22843 el.scrollLeft=scrollStartPosX-event.touches[0].pageX;
22844 },false);
22845 }
22846}  
22847
22848var isZoomed = false; 
22849function zoomPlateau(firstCard)
22850{
22851 if (isZoomed) return;
22852 isZoomed = true; 
22853 var scrollLeft = 0; 
22854 $('#wrapper').css('overflow','hidden');
22855 //$(document).css('overflow-y','hidden');
22856 //$('#wrapper').css('overflow-x','auto');
22857 $('#wrapper').css('margin-top','-194px');
22858 //alert(getWinHeight ());   
22859 $('#wrapper').css('width','980');
22860 $('#wrapper').css('height','470');
22861
22862 desactivePositionnemenetCartesHz(); 
22863 $('meta[name=viewport]').attr('content', 'width=50px;height=10px;'); 
22864 //$('#wrapper').css('height',getWinHeight () ); 
22865 if ($$(firstCard)!=null) scrollLeft = parseInt($$(firstCard).style.left)-50;
22866 window.scroll( scrollLeft ,0);
22867
22868 if ($$('fullscreen_on')!=null) document.body.removeChild($$('fullscreen_on'));
22869 
22870 if ($$('fullscreen_off')==null) 
22871 {
22872 var cancelZoom = document.createElement('img'); 
22873 cancelZoom.src = '/Jeu-Tarot-en-ligne/Icones/fullscreen_off.png';
22874 cancelZoom.id='fullscreen_off';
22875 cancelZoom.className='followScroll';
22876 cancelZoom.width='32';
22877 cancelZoom.height='32';
22878 cancelZoom.style.position='absolute';
22879 cancelZoom.style.top='2px';
22880 cancelZoom.style.left='2px';
22881 cancelZoom.onclick = unzoomPalteau;
22882 
22883 document.body.appendChild(cancelZoom);
22884 }     
22885}
22886function followScroll()
22887{
22888 $('.followScroll').css('position','absolute');
22889 $('.followScroll').css('left',window.scrollX+'px' );
22890 $('.followScroll').css('top',window.scrollY+'px' );
22891 for (var i = 0;i<4;i++)
22892 {
22893 $('#newOne'+i).css('position','absolute');
22894 $('#newOne'+i).css('left',(40*i+30+window.scrollX)+'px' );
22895 $('#newOne'+i).css('top',window.scrollY+'px' );
22896 }
22897}
22898//window.onscroll = followScroll;
22899
22900function unzoomPalteau ()
22901{
22902 isZoomed = false;
22903 $('#wrapper').css('overflow','');
22904 $('#wrapper').css('margin-top','0px');
22905 $('#wrapper').css('height','auto');
22906 //$('#wrapper').css('width','980');
22907 //alert('poi');
22908 activePositionnemenetCartesHz();
22909 viewport = document.querySelector("meta[name=viewport]");
22910 viewport.setAttribute('content', 'width=980;');
22911 //resetZoom();
22912 CheckSizeZoom();
22913 window.scroll( 0,100);
22914 
22915 if ($$('fullscreen_off')!=null) document.body.removeChild($$('fullscreen_off'));
22916 if ($$('fullscreen_on')==null) 
22917 {
22918 var cancelZoom = document.createElement('img');
22919 cancelZoom.src = '/Jeu-Tarot-en-ligne/Icones/fullscreen_on.png';
22920 cancelZoom.id='fullscreen_on';
22921 cancelZoom.className='followScroll';
22922 cancelZoom.width='32';
22923 cancelZoom.height='32';
22924 cancelZoom.style.position='absolute';
22925 cancelZoom.style.top='2px';
22926 cancelZoom.style.left='2px';
22927 cancelZoom.onclick = zoomPlateau;
22928 
22929 document.body.appendChild(cancelZoom);
22930 }
22931}
22932
22933/* Accessibilite clavier des commandes chargees par partiesEnCours.php et inviter.php.
22934 Les classes et la structure visuelle existantes restent inchangees. */
22935(function () {
22936 var categorySelector = 'a.MJJeu';
22937 var modeSelector = '.DivMJLibre[onclick], .DivMJTournoi[onclick], .DivMJCompetition[onclick]';
22938 var invitationModeSelector = 'a.mjSS.btnMJH';
22939 var playerSelector = '#divJoueurs .divJoueursDiv[onclick]';
22940 var cardSelector = '#monJeu img.cardJeu, #monJeu img[id^="newOne"], #monJeu img[id^="ramasse"]';
22941 var actionSelector = '#infosJeuActions a.actionBtn[onclick]';
22942 var quitSelector = '#BTNQUT';
22943 var modeAccessKeys = {
22944 Libre: ['I', 'V', 'T', 'X', 'Q', 'N'],
22945 Tournoi: ['E', 'D', 'Q', 'V'],
22946 Competition: ['D', 'U', 'T', 'H', 'P', 'V', 'F']
22947 };
22948
22949 function matchesSelector(element, selector) {
22950 if (!element || element.nodeType !== 1) return false;
22951 var matches = element.matches || element.msMatchesSelector || element.webkitMatchesSelector;
22952 return matches ? matches.call(element, selector) : false;
22953 }
22954
22955 function bindEvent(element, eventName, handler) {
22956 if (element.addEventListener)
22957  element.addEventListener(eventName, handler, false);
22958 else if (element.attachEvent)
22959  element.attachEvent('on' + eventName, function () {
22960  handler.call(element, window.event);
22961  });
22962 }
22963
22964 function hasClassCompat(element, className) {
22965 return element &&
22966  (' ' + element.className + ' ').indexOf(' ' + className + ' ') !== -1;
22967 }
22968
22969 function setAccessKeyHint(button, key) {
22970 if (!button || !key) return;
22971
22972 if (button.getAttribute('data-accesskey-title-ready') !== '1') {
22973  button.setAttribute('data-accesskey-title-ready', '1');
22974  button.setAttribute('data-accesskey-base-title', button.getAttribute('title') || '');
22975 }
22976
22977 var baseTitle = button.getAttribute('data-accesskey-base-title') || '';
22978 var shortcutTitle = 'Raccourci clavier : ' + key;
22979 button.setAttribute('accesskey', key);
22980 button.setAttribute('title',
22981  baseTitle ? baseTitle + ' (' + shortcutTitle + ')' : shortcutTitle);
22982 }
22983
22984 function clearAccessKeyHint(button) {
22985 if (!button) return;
22986
22987 button.removeAttribute('accesskey');
22988 if (button.getAttribute('data-accesskey-title-ready') === '1') {
22989  var baseTitle = button.getAttribute('data-accesskey-base-title') || '';
22990  if (baseTitle)
22991  button.setAttribute('title', baseTitle);
22992  else
22993  button.removeAttribute('title');
22994 }
22995 }
22996
22997 function getCategoryAccessKey(button) {
22998 if (hasClassCompat(button, 'MJLibre')) return 'L';
22999 if (hasClassCompat(button, 'MJTournoi')) return 'A';
23000 if (hasClassCompat(button, 'MJCompetition')) return 'C';
23001 if (hasClassCompat(button, 'MJInviter')) return 'S';
23002 if (hasClassCompat(button, 'MJMissions')) return 'M';
23003 return '';
23004 }
23005
23006 function getModeCategory(button) {
23007 if (hasClassCompat(button, 'DivMJLibre')) return 'Libre';
23008 if (hasClassCompat(button, 'DivMJTournoi')) return 'Tournoi';
23009 if (hasClassCompat(button, 'DivMJCompetition')) return 'Competition';
23010 return '';
23011 }
23012
23013 function refreshModeAccessKeys() {
23014 var buttons = document.querySelectorAll(modeSelector);
23015 var indexes = {Libre: 0, Tournoi: 0, Competition: 0};
23016
23017 for (var i = 0; i < buttons.length; i++)
23018  clearAccessKeyHint(buttons[i]);
23019
23020 for (var j = 0; j < buttons.length; j++) {
23021  if (!hasClassCompat(buttons[j], 'selectedMJ')) continue;
23022
23023  var category = getModeCategory(buttons[j]);
23024  var keys = modeAccessKeys[category] || [];
23025  var key = keys[indexes[category] || 0];
23026  indexes[category] = (indexes[category] || 0) + 1;
23027  if (key) setAccessKeyHint(buttons[j], key);
23028 }
23029 }
23030
23031 function getInvitationModeAccessKey(button) {
23032 var action = button.getAttribute('onclick') || '';
23033 if (action.indexOf("'Libre4'") !== -1) return 'Q';
23034 if (action.indexOf("'Libre5'") !== -1) return 'N';
23035 if (action.indexOf("'Amical4'") !== -1) return 'R';
23036 if (action.indexOf("'Amical5'") !== -1) return 'V';
23037 if (action.indexOf("'Duplicate4'") !== -1) return 'D';
23038 if (action.indexOf("'Perso'") !== -1) return 'P';
23039 if (action.indexOf("'Formation'") !== -1) return 'F';
23040 if (action.indexOf("'Organisation'") !== -1) return 'O';
23041 return '';
23042 }
23043
23044 function activateWithKeyboard(event) {
23045 var key = event.key || event.keyCode;
23046 if (key === 'Enter' || key === ' ' || key === 13 || key === 32) {
23047  event.preventDefault();
23048  this.click();
23049 }
23050 }
23051
23052 function updatePressedCategory(activeButton) {
23053 var buttons = document.querySelectorAll(categorySelector);
23054 for (var i = 0; i < buttons.length; i++)
23055  buttons[i].setAttribute('aria-pressed', buttons[i] === activeButton ? 'true' : 'false');
23056 }
23057
23058 function prepareCategoryButton(button) {
23059 if (button.getAttribute('data-parties-keyboard') === '1') return;
23060 button.setAttribute('data-parties-keyboard', '1');
23061 button.setAttribute('tabindex', '0');
23062 button.setAttribute('role', 'button');
23063 button.setAttribute('aria-pressed', $(button).hasClass('selectedMJ') ? 'true' : 'false');
23064 setAccessKeyHint(button, getCategoryAccessKey(button));
23065 bindEvent(button, 'keydown', activateWithKeyboard);
23066 bindEvent(button, 'click', function () {
23067  updatePressedCategory(this);
23068  window.setTimeout(refreshModeAccessKeys, 0);
23069 });
23070 }
23071
23072 function prepareModeButton(button) {
23073 if (button.getAttribute('data-parties-keyboard') === '1') return;
23074 if ((button.getAttribute('onclick') || '').replace(/\s/g, '') === '') return;
23075
23076 button.setAttribute('data-parties-keyboard', '1');
23077 $(button).addClass('modeJeuKeyboardButton');
23078 button.setAttribute('tabindex', '0');
23079 button.setAttribute('role', 'button');
23080
23081 var heading = button.querySelector('h2.modeJeu');
23082 if (heading)
23083  button.setAttribute('aria-label', 'Jouer : ' + heading.textContent.replace(/\s+/g, ' ').trim());
23084
23085 bindEvent(button, 'keydown', activateWithKeyboard);
23086 }
23087
23088 function updatePressedInvitationMode(activeButton) {
23089 var buttons = document.querySelectorAll(invitationModeSelector);
23090 for (var i = 0; i < buttons.length; i++)
23091  buttons[i].setAttribute('aria-pressed', buttons[i] === activeButton ? 'true' : 'false');
23092 }
23093
23094 function prepareInvitationModeButton(button) {
23095 if (button.getAttribute('data-inviter-keyboard') === '1') return;
23096
23097 button.setAttribute('data-inviter-keyboard', '1');
23098 button.setAttribute('tabindex', '0');
23099 button.setAttribute('role', 'button');
23100 button.setAttribute('aria-pressed', $(button).hasClass('selectedmjSS') ? 'true' : 'false');
23101
23102 var image = button.querySelector('img[title]');
23103 if (image)
23104  button.setAttribute('aria-label', image.getAttribute('title'));
23105
23106 setAccessKeyHint(button, getInvitationModeAccessKey(button));
23107 bindEvent(button, 'keydown', activateWithKeyboard);
23108 bindEvent(button, 'click', function () {
23109  updatePressedInvitationMode(this);
23110 });
23111 }
23112
23113 function updatePlayerAccessibleName(button) {
23114 var playerContent = button.querySelector('.joueurCnterRond');
23115 var playerName = playerContent ? $(playerContent).data('myuser') : '';
23116 if (!playerName) playerName = $(button).data('pseudo');
23117
23118 if (playerName === 'Ajouter une IA')
23119  button.setAttribute('aria-label', 'Ajouter une IA \u00e0 cette place');
23120 else if (playerName === 'Vide')
23121  button.setAttribute('aria-label', 'Place de joueur vide');
23122 else if (playerName === 'Libre')
23123  button.setAttribute('aria-label', 'Place de joueur libre');
23124 else if (playerName === 'Masqu\u00e9')
23125  button.setAttribute('aria-label', 'Joueur masqu\u00e9');
23126 else if (playerName)
23127  button.setAttribute('aria-label', 'Voir les d\u00e9tails du joueur ' + playerName);
23128 else {
23129  var playerNumber = (button.id || '').replace('divJoueur', '');
23130  button.setAttribute('aria-label', 'Joueur ' + (parseInt(playerNumber, 10) + 1) + ' : voir les d\u00e9tails');
23131 }
23132 }
23133
23134 function preparePlayerButton(button) {
23135 if (button.getAttribute('data-player-keyboard') !== '1') {
23136  button.setAttribute('data-player-keyboard', '1');
23137  button.setAttribute('tabindex', '0');
23138  button.setAttribute('role', 'button');
23139  bindEvent(button, 'keydown', activateWithKeyboard);
23140  bindEvent(button, 'focus', function () {
23141  updatePlayerAccessibleName(this);
23142  });
23143
23144  var avatar = button.querySelector('img');
23145  if (avatar) avatar.setAttribute('alt', '');
23146 }
23147
23148 updatePlayerAccessibleName(button);
23149 }
23150
23151 function preparePlayerAncestor(root) {
23152 var current = root;
23153 while (current && current.nodeType === 1) {
23154  if (matchesSelector(current, playerSelector)) {
23155  preparePlayerButton(current);
23156  return;
23157  }
23158  current = current.parentNode;
23159 }
23160 }
23161
23162 function hasMeaningfulAction(action) {
23163 if (typeof action === 'function') return true;
23164 if (action === null || typeof action === 'undefined') return false;
23165
23166 var normalizedAction = String(action).replace(/\s/g, '').toLowerCase();
23167 return normalizedAction !== '' && normalizedAction !== 'null' && normalizedAction !== 'undefined';
23168 }
23169
23170 function cardHasClickAction(card) {
23171 var cardId = card.id || '';
23172
23173 /* Les cartes de la main conservent parfois onclick="undefined" dans le HTML.
23174  Seuls le gestionnaire vivant et le curseur positionne par setCardAction
23175  representent donc correctement leur etat courant. */
23176 if (cardId.indexOf('MonJeu') === 0)
23177  return typeof card.onclick === 'function' && card.style.cursor === 'pointer';
23178
23179 var explicitState = card.getAttribute('data-card-action-state');
23180 if (explicitState === 'enabled') return true;
23181 if (explicitState === 'disabled') return false;
23182
23183 if (cardId.indexOf('masque') === 0) {
23184  var originalCard = document.getElementById(cardId.substring(6));
23185  return originalCard ? cardHasClickAction(originalCard) : false;
23186 }
23187
23188 var inlineAction = card.getAttribute('onclick');
23189 if (inlineAction === null)
23190  return typeof card.onclick === 'function';
23191
23192 if (hasMeaningfulAction(inlineAction))
23193  return true;
23194
23195 return card.getAttribute('data-card-clickable') === '1' && typeof card.onclick === 'function';
23196 }
23197
23198 function getCardAccessibleName(card) {
23199 var cardName = card.getAttribute('alt') || '';
23200 var cardId = card.id || '';
23201
23202 if (!cardName && cardId.indexOf('masque') === 0) {
23203  var originalCard = document.getElementById(cardId.substring(6));
23204  if (originalCard) cardName = originalCard.getAttribute('alt') || '';
23205 }
23206
23207 if (window.moteurHTML2 && typeof window.moteurHTML2.getAccessibleCardName === 'function')
23208  cardName = window.moteurHTML2.getAccessibleCardName(cardName);
23209
23210 return cardName || 'cette carte';
23211 }
23212
23213 function activateGameCardWithKeyboard(event) {
23214 if (this.getAttribute('data-card-action-state') !== 'enabled') return;
23215 activateWithKeyboard.call(this, event);
23216 }
23217
23218 function prepareGameCard(card, forcedClickable) {
23219 var cardId = card.id || '';
23220 var isHandCard = cardId.indexOf('MonJeu') === 0;
23221 var isPlayedCard = cardId.indexOf('newOne') === 0 ||
23222  cardId.indexOf('ramasse') === 0 ||
23223  (' ' + card.className + ' ').indexOf(' cartesTapis ') !== -1;
23224 var isClickable = typeof forcedClickable === 'boolean' ? forcedClickable : cardHasClickAction(card);
23225
23226 /* Les masques ne sont que des calques visuels poses sur une carte.
23227  La carte d'origine reste l'unique element expose au lecteur d'ecran. */
23228 if (cardId.indexOf('masque') === 0) {
23229  card.setAttribute('aria-hidden', 'true');
23230  card.setAttribute('alt', '');
23231  card.removeAttribute('tabindex');
23232  card.removeAttribute('role');
23233  card.removeAttribute('aria-label');
23234  card.removeAttribute('data-card-clickable');
23235  return;
23236 }
23237
23238 card.removeAttribute('aria-hidden');
23239
23240 if (!isClickable) {
23241  card.setAttribute('data-card-action-state', 'disabled');
23242  card.removeAttribute('data-card-clickable');
23243
23244  /* Une carte encore dans la main doit pouvoir etre consultee avec TAB,
23245  meme lorsqu'elle n'est pas jouable a cet instant. */
23246  if (isHandCard) {
23247  card.setAttribute('tabindex', '0');
23248  card.setAttribute('role', 'img');
23249  card.setAttribute('aria-label', getCardAccessibleName(card) + ', non jouable pour le moment');
23250  } else if (isPlayedCard) {
23251  /* Une carte posee reste consultable avec TAB, mais ne devient pas un bouton. */
23252  card.setAttribute('tabindex', '0');
23253  card.setAttribute('role', 'img');
23254  card.setAttribute('aria-label', 'Carte sur le plateau : ' + getCardAccessibleName(card));
23255  } else {
23256  card.removeAttribute('tabindex');
23257  card.removeAttribute('role');
23258  card.removeAttribute('aria-label');
23259  }
23260  return;
23261 }
23262
23263 card.setAttribute('data-card-action-state', 'enabled');
23264 card.setAttribute('data-card-clickable', '1');
23265 card.setAttribute('tabindex', '0');
23266 card.setAttribute('role', 'button');
23267 card.setAttribute('aria-label', 'Choisir ' + getCardAccessibleName(card));
23268
23269 if (!card.tarotKeyboardReady) {
23270  card.tarotKeyboardReady = true;
23271  bindEvent(card, 'keydown', activateGameCardWithKeyboard);
23272 }
23273 }
23274
23275 function prepareGameAction(button) {
23276 if (button.tarotKeyboardReady) return;
23277
23278 button.tarotKeyboardReady = true;
23279 button.setAttribute('tabindex', '0');
23280 button.setAttribute('role', 'button');
23281 bindEvent(button, 'keydown', activateWithKeyboard);
23282 }
23283
23284 function prepareQuitButton(button) {
23285 if (!button) return;
23286
23287 if (!button.tarotQuitKeyboardReady) {
23288  button.tarotQuitKeyboardReady = true;
23289  button.setAttribute('role', 'button');
23290  button.setAttribute('aria-label', 'Quitter la partie');
23291  bindEvent(button, 'keydown', activateWithKeyboard);
23292 }
23293
23294 if (typeof window.siQuitAbandon === 'undefined' || window.siQuitAbandon != 1)
23295  button.setAttribute('tabindex', '0');
23296 else
23297  button.setAttribute('tabindex', '-1');
23298 }
23299
23300 function prepareAllGameCards() {
23301 var cards = document.querySelectorAll(cardSelector);
23302 for (var i = 0; i < cards.length; i++) prepareGameCard(cards[i]);
23303 }
23304
23305 function prepareAllGameActions() {
23306 var actions = document.querySelectorAll(actionSelector);
23307 for (var i = 0; i < actions.length; i++) prepareGameAction(actions[i]);
23308 }
23309
23310 function prepareGameQuitButton() {
23311 prepareQuitButton(document.getElementById('BTNQUT'));
23312 }
23313
23314 function refreshGameControlsBeforeTab(event) {
23315 var key = event.key || event.keyCode;
23316 if (key !== 'Tab' && key !== 9) return;
23317
23318 installGameAccessibilityHooks();
23319 prepareAllGameCards();
23320 prepareAllGameActions();
23321 prepareGameQuitButton();
23322 }
23323
23324 function installGameAccessibilityHooks() {
23325 var engine = window.moteurHTML2;
23326 if (!engine || engine.keyboardAccessibilityInstalled) return;
23327 engine.keyboardAccessibilityInstalled = true;
23328
23329 var originalCreateGameBoard = engine.createGameBoard;
23330 engine.createGameBoard = function () {
23331  var result = originalCreateGameBoard.apply(this, arguments);
23332  var board = document.getElementById('Jeu');
23333  if (board) preparePartiesButtons(board);
23334  return result;
23335 };
23336
23337 var originalAddCard = engine.addCard;
23338 engine.addCard = function (name, action) {
23339  var result = originalAddCard.apply(this, arguments);
23340  var card = document.getElementById('MonJeu' + name);
23341  if (card) prepareGameCard(card, hasMeaningfulAction(action));
23342  prepareAllGameCards();
23343  return result;
23344 };
23345
23346 var originalSetCardAction = engine.setCardAction;
23347 engine.setCardAction = function (name, action) {
23348  var result = originalSetCardAction.apply(this, arguments);
23349  var card = document.getElementById('MonJeu' + name);
23350  if (card) prepareGameCard(card, hasMeaningfulAction(action));
23351  return result;
23352 };
23353
23354 var originalPlayOppCard = engine.playOppCard;
23355 engine.playOppCard = function (name) {
23356  var playedCard = document.getElementById('MonJeu' + name);
23357  var result = originalPlayOppCard.apply(this, arguments);
23358  if (playedCard) prepareGameCard(playedCard, false);
23359  return result;
23360 };
23361
23362 var originalAddMasque = engine.addMasque;
23363 engine.addMasque = function (id, maskType) {
23364  var result = originalAddMasque.apply(this, arguments);
23365  var mask = document.getElementById('masque' + id);
23366  if (mask) prepareGameCard(mask, false);
23367  return result;
23368 };
23369
23370 var originalClearCardsActions = engine.clearCardsActions;
23371 engine.clearCardsActions = function (except) {
23372  var result = originalClearCardsActions.apply(this, arguments);
23373  var cards = document.querySelectorAll(cardSelector);
23374  for (var i = 0; i < cards.length; i++) {
23375  if (cards[i].id !== except && cards[i].id.indexOf('MonJeu') === 0)
23376   prepareGameCard(cards[i], false);
23377  }
23378  return result;
23379 };
23380
23381 var originalAddAction = engine.addAction;
23382 engine.addAction = function () {
23383  var result = originalAddAction.apply(this, arguments);
23384  prepareAllGameActions();
23385  return result;
23386 };
23387 }
23388
23389 function preparePartiesButtons(root) {
23390 if (!root || root.nodeType !== 1) return;
23391 if (!document.querySelector('.DivMJLibre, .DivMJTournoi, .DivMJCompetition') &&
23392  !document.querySelector(invitationModeSelector) &&
23393  !document.querySelector(playerSelector) &&
23394  !document.querySelector(cardSelector) &&
23395  !document.querySelector(actionSelector) &&
23396  !document.querySelector(quitSelector)) return;
23397
23398 if (matchesSelector(root, categorySelector)) prepareCategoryButton(root);
23399 if (matchesSelector(root, modeSelector)) prepareModeButton(root);
23400 if (matchesSelector(root, invitationModeSelector)) prepareInvitationModeButton(root);
23401 if (matchesSelector(root, playerSelector)) preparePlayerButton(root);
23402 else preparePlayerAncestor(root);
23403 if (matchesSelector(root, cardSelector)) prepareGameCard(root);
23404 if (matchesSelector(root, actionSelector)) prepareGameAction(root);
23405 if (matchesSelector(root, quitSelector)) prepareQuitButton(root);
23406
23407 var categories = root.querySelectorAll(categorySelector);
23408 for (var i = 0; i < categories.length; i++) prepareCategoryButton(categories[i]);
23409
23410 var modes = root.querySelectorAll(modeSelector);
23411 for (var j = 0; j < modes.length; j++) prepareModeButton(modes[j]);
23412
23413 var invitationModes = root.querySelectorAll(invitationModeSelector);
23414 for (var k = 0; k < invitationModes.length; k++) prepareInvitationModeButton(invitationModes[k]);
23415
23416 var players = root.querySelectorAll(playerSelector);
23417 for (var l = 0; l < players.length; l++) preparePlayerButton(players[l]);
23418
23419 var cards = root.querySelectorAll(cardSelector);
23420 for (var m = 0; m < cards.length; m++) prepareGameCard(cards[m]);
23421
23422 var actions = root.querySelectorAll(actionSelector);
23423 for (var n = 0; n < actions.length; n++) prepareGameAction(actions[n]);
23424
23425 var quitButtons = root.querySelectorAll(quitSelector);
23426 for (var o = 0; o < quitButtons.length; o++) prepareQuitButton(quitButtons[o]);
23427
23428 refreshModeAccessKeys();
23429 }
23430
23431 function watchPartiesButtons() {
23432 var pageContent = document.getElementById('webBody') || document.getElementById('global');
23433 if (!pageContent) return;
23434
23435 installGameAccessibilityHooks();
23436 preparePartiesButtons(pageContent);
23437
23438 if (!document.tarotKeyboardRefreshReady) {
23439  document.tarotKeyboardRefreshReady = true;
23440  bindEvent(document, 'keydown', refreshGameControlsBeforeTab);
23441 }
23442
23443 if (!window.MutationObserver) return;
23444 var observer = new MutationObserver(function (mutations) {
23445  for (var i = 0; i < mutations.length; i++) {
23446  if (mutations[i].type === 'attributes')
23447   preparePartiesButtons(mutations[i].target);
23448  else {
23449   for (var j = 0; j < mutations[i].addedNodes.length; j++)
23450   preparePartiesButtons(mutations[i].addedNodes[j]);
23451  }
23452  }
23453 });
23454 observer.observe(pageContent, {
23455  childList: true,
23456  subtree: true,
23457  attributes: true,
23458  attributeFilter: ['src', 'id', 'class', 'onclick', 'style']
23459 });
23460 }
23461
23462 if (document.readyState === 'loading') {
23463 if (document.addEventListener)
23464  document.addEventListener('DOMContentLoaded', watchPartiesButtons, false);
23465 else if (window.attachEvent)
23466  window.attachEvent('onload', watchPartiesButtons);
23467 } else
23468 watchPartiesButtons();
23469})();
23470
23471/* Adaptation clavier des composants non natifs limites a la souris. */
23472(function () {
23473 var mouseControlSelector =
23474 '[onclick], a.btn, a.button, #muteBtn, .etapeDemande .btn-lg';
23475
23476 function hasGenericClass(element, className) {
23477 return element &&
23478  (' ' + element.className + ' ').indexOf(' ' + className + ' ') !== -1;
23479 }
23480
23481 function isNativeInteractive(element) {
23482 var tagName = element.tagName.toLowerCase();
23483 if (tagName === 'button' || tagName === 'input' || tagName === 'select' ||
23484  tagName === 'textarea' || tagName === 'option' || tagName === 'summary')
23485  return true;
23486 return tagName === 'a' && !!element.getAttribute('href');
23487 }
23488
23489 function hasUsableMouseAction(element) {
23490 if (element.id === 'muteBtn') return true;
23491
23492 var action = (element.getAttribute('onclick') || '').replace(/\s/g, '').toLowerCase();
23493 if (action && action !== 'undefined' && action !== 'null' &&
23494  action !== 'returnfalse;' && action !== 'false')
23495  return true;
23496
23497 if (element.tagName.toLowerCase() === 'a' &&
23498  (hasGenericClass(element, 'btn') || hasGenericClass(element, 'button')))
23499  return true;
23500
23501 return typeof element.onclick === 'function';
23502 }
23503
23504 function isManagedElsewhere(element) {
23505 return element.id === 'BTNQUT' ||
23506  hasGenericClass(element, 'cardJeu') ||
23507  element.getAttribute('data-parties-keyboard') === '1' ||
23508  element.getAttribute('data-inviter-keyboard') === '1' ||
23509  element.getAttribute('data-player-keyboard') === '1' ||
23510  element.getAttribute('data-forum-keyboard') === '1' ||
23511  element.tarotKeyboardReady ||
23512  element.tarotQuitKeyboardReady;
23513 }
23514
23515 function isInsideSkippedTabArea(element) {
23516 while (element && element.nodeType === 1) {
23517  if (element.getAttribute('data-skip-tab-navigation') === 'true')
23518  return true;
23519  element = element.parentNode;
23520 }
23521 return false;
23522 }
23523
23524 function setGenericAccessibleName(element) {
23525 if (element.getAttribute('aria-label') || element.textContent.replace(/\s+/g, ''))
23526  return;
23527
23528 var label = '';
23529 if (element.id === 'muteBtn')
23530  label = 'Activer ou d\u00e9sactiver le son';
23531 else if (element.id === 'IMGEMOT')
23532  label = 'Ouvrir les \u00e9motic\u00f4nes';
23533 else
23534  label = element.getAttribute('title') || element.getAttribute('alt') || '';
23535
23536 if (!label && element.querySelector) {
23537  var image = element.querySelector('img');
23538  if (image)
23539  label = image.getAttribute('alt') || image.getAttribute('title') || '';
23540 }
23541
23542 if (label)
23543  element.setAttribute('aria-label', label);
23544 }
23545
23546 function triggerGenericClick(element) {
23547 if (typeof element.click === 'function') {
23548  element.click();
23549  return;
23550 }
23551
23552 if (document.createEvent) {
23553  var clickEvent = document.createEvent('MouseEvents');
23554  clickEvent.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0,
23555  false, false, false, false, 0, null);
23556  element.dispatchEvent(clickEvent);
23557 } else if (typeof element.onclick === 'function')
23558  element.onclick();
23559 }
23560
23561 function activateGenericControl(event) {
23562 event = event || window.event;
23563 var key = event.key || event.keyCode;
23564 if (key !== 'Enter' && key !== ' ' && key !== 13 && key !== 32) return;
23565
23566 if (event.preventDefault)
23567  event.preventDefault();
23568 else
23569  event.returnValue = false;
23570 triggerGenericClick(this);
23571 }
23572
23573 function prepareMouseControl(element) {
23574 /* Le moteur de jeu dispose de sa propre gestion clavier, traitee separement. */
23575 if (document.getElementById('Jeu') ||
23576  !element || element.nodeType !== 1 ||
23577  element.getAttribute('data-generic-keyboard') === '1' ||
23578  isNativeInteractive(element) || isManagedElsewhere(element) ||
23579  isInsideSkippedTabArea(element) ||
23580  !hasUsableMouseAction(element) ||
23581  element.getAttribute('aria-hidden') === 'true' ||
23582  element.getAttribute('aria-disabled') === 'true' ||
23583  element.getAttribute('tabindex') === '-1')
23584  return;
23585
23586 element.setAttribute('data-generic-keyboard', '1');
23587 element.setAttribute('tabindex', '0');
23588 if (!element.getAttribute('role'))
23589  element.setAttribute('role', 'button');
23590 element.className += (element.className ? ' ' : '') + 'genericKeyboardControl';
23591 setGenericAccessibleName(element);
23592
23593 if (element.addEventListener)
23594  element.addEventListener('keydown', activateGenericControl, false);
23595 else if (element.attachEvent)
23596  element.attachEvent('onkeydown', function () {
23597  activateGenericControl.call(element, window.event);
23598  });
23599 }
23600
23601 function prepareMouseControls(root) {
23602 if (!root || root.nodeType !== 1) return;
23603
23604 if (root.matches || root.msMatchesSelector || root.webkitMatchesSelector) {
23605  var matches = root.matches || root.msMatchesSelector || root.webkitMatchesSelector;
23606  if (matches.call(root, mouseControlSelector))
23607  prepareMouseControl(root);
23608 } else if (root.getAttribute('onclick') || root.id === 'muteBtn')
23609  prepareMouseControl(root);
23610
23611 if (!root.querySelectorAll) return;
23612 var controls = root.querySelectorAll(mouseControlSelector);
23613 for (var i = 0; i < controls.length; i++)
23614  prepareMouseControl(controls[i]);
23615 }
23616
23617 function watchMouseControls() {
23618 var page = document.body;
23619 if (!page) return;
23620
23621 prepareMouseControls(page);
23622
23623 if (window.MutationObserver) {
23624  var observer = new MutationObserver(function (mutations) {
23625  for (var i = 0; i < mutations.length; i++) {
23626   if (mutations[i].type === 'attributes')
23627   prepareMouseControl(mutations[i].target);
23628   else {
23629   for (var j = 0; j < mutations[i].addedNodes.length; j++)
23630    prepareMouseControls(mutations[i].addedNodes[j]);
23631   }
23632  }
23633  });
23634  observer.observe(page, {
23635  childList: true,
23636  subtree: true,
23637  attributes: true,
23638  attributeFilter: ['onclick']
23639  });
23640 } else if (document.attachEvent)
23641  document.attachEvent('onkeydown', function () {
23642  var event = window.event;
23643  if (event && event.keyCode === 9)
23644   prepareMouseControls(page);
23645  });
23646 }
23647
23648 if (document.readyState === 'loading') {
23649 if (document.addEventListener)
23650  document.addEventListener('DOMContentLoaded', watchMouseControls, false);
23651 else if (window.attachEvent)
23652  window.attachEvent('onload', watchMouseControls);
23653 } else
23654 watchMouseControls();
23655})();
23656
23657/* Les blocs informatifs du pied de page restent utilisables a la souris,
23658 mais ne ralentissent pas la navigation sequentielle au clavier. */
23659(function () {
23660 var skippedAreaSelector = '[data-skip-tab-navigation="true"]';
23661 var tabStopSelector =
23662 'a[href], area[href], button, input, select, textarea, iframe, object, embed, ' +
23663 'audio[controls], video[controls], [contenteditable], [tabindex]';
23664
23665 function removeFromTabOrder(area) {
23666 if (!area || !area.querySelectorAll) return;
23667
23668 var tabStops = area.querySelectorAll(tabStopSelector);
23669 for (var i = 0; i < tabStops.length; i++)
23670  tabStops[i].setAttribute('tabindex', '-1');
23671 }
23672
23673 function prepareSkippedTabAreas() {
23674 if (!document.querySelectorAll) return;
23675
23676 var areas = document.querySelectorAll(skippedAreaSelector);
23677 for (var i = 0; i < areas.length; i++) {
23678  removeFromTabOrder(areas[i]);
23679
23680  if (window.MutationObserver && areas[i].getAttribute('data-skip-tab-ready') !== '1') {
23681  areas[i].setAttribute('data-skip-tab-ready', '1');
23682  new MutationObserver(function (mutations) {
23683   for (var j = 0; j < mutations.length; j++) {
23684   for (var k = 0; k < mutations[j].addedNodes.length; k++) {
23685    var node = mutations[j].addedNodes[k];
23686    if (!node || node.nodeType !== 1) continue;
23687    if (node.matches && node.matches(tabStopSelector))
23688    node.setAttribute('tabindex', '-1');
23689    removeFromTabOrder(node);
23690   }
23691   }
23692  }).observe(areas[i], { childList: true, subtree: true });
23693  }
23694 }
23695 }
23696
23697 if (document.readyState === 'loading') {
23698 if (document.addEventListener)
23699  document.addEventListener('DOMContentLoaded', prepareSkippedTabAreas, false);
23700 else if (window.attachEvent)
23701  window.attachEvent('onload', prepareSkippedTabAreas);
23702 } else
23703 prepareSkippedTabAreas();
23704})();
23705
23706/* Editeur HTML du forum pour le formulaire administrateur des news. */
23707(function () {
23708 function addClassCompat(element, className) {
23709 if ((' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1)
23710  element.className += (element.className ? ' ' : '') + className;
23711 }
23712
23713 function prepareNewsEditor() {
23714 var fields = document.getElementsByName ?
23715  document.getElementsByName('addNewsDesc') : [];
23716 var textarea = fields.length ? fields[0] : null;
23717
23718 if (!textarea || textarea.getAttribute('data-news-editor-ready') === '1') return;
23719
23720 if (!textarea.id)
23721  textarea.id = 'addNewsDescEditor';
23722
23723 textarea.setAttribute('data-news-editor-ready', '1');
23724 textarea.setAttribute('aria-label', 'Description de la news');
23725 addClassCompat(textarea, 'modeTextArea');
23726
23727 var toolbar = document.createElement('div');
23728 toolbar.className = 'htmlbutt';
23729 toolbar.setAttribute('idTxt', textarea.id);
23730 textarea.parentNode.insertBefore(toolbar, textarea);
23731
23732 if (typeof window.showHTMLbuttons === 'function')
23733  window.showHTMLbuttons();
23734 }
23735
23736 function startNewsEditor() {
23737 prepareNewsEditor();
23738
23739 if (window.MutationObserver) {
23740  var page = document.getElementById('webBody') || document.body;
23741  if (!page) return;
23742
23743  var observer = new MutationObserver(function () {
23744  prepareNewsEditor();
23745  });
23746  observer.observe(page, {childList: true, subtree: true});
23747 }
23748 }
23749
23750 if (document.readyState === 'loading') {
23751 if (document.addEventListener)
23752  document.addEventListener('DOMContentLoaded', startNewsEditor, false);
23753 else if (window.attachEvent)
23754  window.attachEvent('onload', startNewsEditor);
23755 } else
23756 startNewsEditor();
23757})();
23758
23759/* Raccourcis du menu principal. Les reperes semantiques sont rendus par PHP. */
23760(function () {
23761 function hasClass(element, className) {
23762 return element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') !== -1;
23763 }
23764
23765 function prepareMenuAccessKeys(navigation) {
23766 if (!navigation) return;
23767
23768 var shortcuts = [
23769  {className: 'Mhome', key: '1'},
23770  {className: 'Mplay', key: '2'},
23771  {className: 'Mrank', key: '3'},
23772  {className: 'Mregles', key: '4'},
23773  {className: 'Mforum', key: '5'},
23774  {className: 'Mcredits', key: '6'},
23775  {className: 'Maccount', key: '7'}
23776 ];
23777 var links = navigation.getElementsByTagName('a');
23778
23779 for (var i = 0; i < shortcuts.length; i++) {
23780  for (var j = 0; j < links.length; j++) {
23781  if (hasClass(links[j], shortcuts[i].className)) {
23782   links[j].setAttribute('accesskey', shortcuts[i].key);
23783
23784   var shortcutTitle = 'Raccourci clavier : ' + shortcuts[i].key;
23785   var currentTitle = links[j].getAttribute('title') || '';
23786   if (currentTitle.indexOf(shortcutTitle) === -1)
23787   links[j].setAttribute('title',
23788    currentTitle ? currentTitle + ' (' + shortcutTitle + ')' : shortcutTitle);
23789   break;
23790  }
23791  }
23792 }
23793 }
23794
23795 function prepareCommonNavigation() {
23796 prepareMenuAccessKeys(document.getElementById('navBox'));
23797 }
23798
23799 if (document.readyState === 'loading') {
23800 if (document.addEventListener)
23801  document.addEventListener('DOMContentLoaded', prepareCommonNavigation, false);
23802 else if (window.attachEvent)
23803  window.attachEvent('onload', prepareCommonNavigation);
23804 } else
23805 prepareCommonNavigation();
23806})();
23807
23808/* Presentation des nouveautes sur la page d'accueil.
23809 Le reperage par titre evite de modifier le fichier PHP historique encode en ANSI. */
23810(function () {
23811 function addEventCompat(element, eventName, handler) {
23812 if (element.addEventListener)
23813  element.addEventListener(eventName, handler, false);
23814 else if (element.attachEvent)
23815  element.attachEvent('on' + eventName, handler);
23816 }
23817
23818 function updateScrollableNews(panel) {
23819 var contents = panel.querySelectorAll('.homeNewsItemContent');
23820 for (var i = 0; i < contents.length; i++) {
23821
23822  if (contents[i].scrollHeight > contents[i].clientHeight + 2) {
23823  contents[i].setAttribute('tabindex', '0');
23824  contents[i].setAttribute('role', 'region');
23825  contents[i].setAttribute('aria-label', 'Contenu complet de cette nouveaut\u00e9');
23826  } else {
23827  contents[i].removeAttribute('tabindex');
23828  contents[i].removeAttribute('role');
23829  contents[i].removeAttribute('aria-label');
23830  }
23831 }
23832 }
23833
23834 function prepareHomeNews() {
23835 var headings = document.querySelectorAll ?
23836  document.querySelectorAll('h2, h3') :
23837  document.getElementsByTagName('h3');
23838 var newsHeading = null;
23839
23840 for (var i = 0; i < headings.length; i++) {
23841  var headingText = headings[i].textContent || headings[i].innerText || '';
23842  headingText = headingText.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '').toLowerCase();
23843  if ((headingText.indexOf('nouveaut') === 0 || headingText.indexOf('les nouveaut') === 0) &&
23844  headingText.indexOf('du jeu') !== -1) {
23845  newsHeading = headings[i];
23846  break;
23847  }
23848 }
23849
23850 if (!newsHeading || !newsHeading.parentNode) return;
23851
23852 var newsPanel = newsHeading.parentNode;
23853 if (newsPanel.getAttribute('data-home-news-ready') === '1') {
23854  updateScrollableNews(newsPanel);
23855  return;
23856 }
23857
23858 newsPanel.setAttribute('data-home-news-ready', '1');
23859 if ((' ' + newsPanel.className + ' ').indexOf(' fulH ') === -1)
23860  newsPanel.className += ' fulH';
23861 if ((' ' + newsPanel.className + ' ').indexOf(' homeNewsPanel ') === -1)
23862  newsPanel.className += ' homeNewsPanel';
23863 newsHeading.id = 'homeNewsTitle';
23864 newsPanel.setAttribute('role', 'region');
23865 newsPanel.setAttribute('aria-labelledby', newsHeading.id);
23866
23867 var children = newsPanel.childNodes;
23868 var currentTitle = null;
23869 var newsIndex = 0;
23870 for (var j = 0; j < children.length; j++) {
23871  if (children[j].nodeType !== 1) continue;
23872
23873  if (children[j].tagName.toLowerCase() === 'h3' ||
23874  children[j].tagName.toLowerCase() === 'h4') {
23875  newsIndex++;
23876  currentTitle = children[j];
23877  currentTitle.className += ' homeNewsItemTitle';
23878  currentTitle.id = 'homeNewsItemTitle' + newsIndex;
23879  } else if (children[j].tagName.toLowerCase() === 'p') {
23880  children[j].className += ' homeNewsItemContent';
23881  if (currentTitle)
23882   children[j].setAttribute('aria-labelledby', currentTitle.id);
23883  }
23884 }
23885
23886 /*var tournamentPanel = document.querySelector ?
23887  document.querySelector('.tournoiHome') :
23888  $('.tournoiHome')[0];
23889 if (tournamentPanel && tournamentPanel.parentNode && tournamentPanel !== newsPanel)
23890  tournamentPanel.parentNode.insertBefore(newsPanel, tournamentPanel);*/
23891
23892 window.setTimeout(function () {
23893  updateScrollableNews(newsPanel);
23894 }, 0);
23895
23896 addEventCompat(window, 'resize', function () {
23897  updateScrollableNews(newsPanel);
23898 });
23899 }
23900
23901 if (document.readyState === 'loading') {
23902 if (document.addEventListener)
23903  document.addEventListener('DOMContentLoaded', prepareHomeNews, false);
23904 else if (window.attachEvent)
23905  window.attachEvent('onload', prepareHomeNews);
23906 } else
23907 prepareHomeNews();
23908})();
23909
23910/*!
23911 * jCarouselLite - v1.1 - 2014-09-28
23912 * http://www.gmarwaha.com/jquery/jcarousellite/
23913 * Copyright (c) 2014 Ganeshji Marwaha
23914 * Licensed MIT (https://github.com/ganeshmax/jcarousellite/blob/master/LICENSE)
23915*/
23916
23917!function(a){a.jCarouselLite={version:"1.1"},a.fn.jCarouselLite=function(b){return b=a.extend({},a.fn.jCarouselLite.options,b||{}),this.each(function(){function c(a){return n||(clearTimeout(A),z=a,b.beforeStart&&b.beforeStart.call(this,i()),b.circular?j(a):k(a),m({start:function(){n=!0},done:function(){b.afterEnd&&b.afterEnd.call(this,i()),b.auto&&h(),n=!1}}),b.circular||l()),!1}function d(){if(n=!1,o=b.vertical?"top":"left",p=b.vertical?"height":"width",q=B.find(">ul"),r=q.find(">li"),x=r.size(),w=x<b.visible?x:b.visible,b.circular){var c=r.slice(x-w).clone(),d=r.slice(0,w).clone();q.prepend(c).append(d),b.start+=w}s=a("li",q),y=s.size(),z=b.start}function e(){B.css("visibility","visible"),s.css({overflow:"hidden","float":b.vertical?"none":"left"}),q.css({margin:"0",padding:"0",position:"relative","list-style":"none","z-index":"1"}),B.css({overflow:"hidden",position:"relative","z-index":"2",left:"0px"}),!b.circular&&b.btnPrev&&0==b.start&&a(b.btnPrev).addClass("disabled")}function f(){t=b.vertical?s.outerHeight(!0):s.outerWidth(!0),u=t*y,v=t*w,s.css({width:s.width(),height:s.height()}),q.css(p,u+"px").css(o,-(z*t)),B.css(p,v+"px")}function g(){b.btnPrev&&a(b.btnPrev).click(function(){return c(z-b.scroll)}),b.btnNext&&a(b.btnNext).click(function(){return c(z+b.scroll)}),b.btnGo&&a.each(b.btnGo,function(d,e){a(e).click(function(){return c(b.circular?w+d:d)})}),b.mouseWheel&&B.mousewheel&&B.mousewheel(function(a,d){return c(d>0?z-b.scroll:z+b.scroll)}),b.auto&&h()}function h(){A=setTimeout(function(){c(z+b.scroll)},b.auto)}function i(){return s.slice(z).slice(0,w)}function j(a){var c;a<=b.start-w-1?(c=a+x+b.scroll,q.css(o,-(c*t)+"px"),z=c-b.scroll):a>=y-w+1&&(c=a-x-b.scroll,q.css(o,-(c*t)+"px"),z=c+b.scroll)}function k(a){0>a?z=0:a>y-w&&(z=y-w)}function l(){a(b.btnPrev+","+b.btnNext).removeClass("disabled"),a(z-b.scroll<0&&b.btnPrev||z+b.scroll>y-w&&b.btnNext||[]).addClass("disabled")}function m(c){n=!0,q.animate("left"==o?{left:-(z*t)}:{top:-(z*t)},a.extend({duration:b.speed,easing:b.easing},c))}var n,o,p,q,r,s,t,u,v,w,x,y,z,A,B=a(this);d(),e(),f(),g()})},a.fn.jCarouselLite.options={btnPrev:null,btnNext:null,btnGo:null,mouseWheel:!1,auto:null,speed:200,easing:null,vertical:!1,circular:!0,visible:3,start:0,scroll:1,beforeStart:null,afterEnd:null}}(jQuery);
23918
23919
23920
23921function rotateImgsHome() {
23922 var $imagesAccueil = $('.imgCarsl[id^="rotateIMG"]');
23923 if ($imagesAccueil.length<2)
23924 return;
23925 var sel = 0;
23926 $imagesAccueil.each(function(index) {
23927 if (!$(this).hasClass('hideCarsl'))
23928 sel = index;
23929 });
23930 $imagesAccueil.eq(sel).addClass('hideCarsl');
23931 $imagesAccueil.eq((sel+1)%$imagesAccueil.length).removeClass('hideCarsl');
23932 
23933 setTimeout(rotateImgsHome,4000);
23934}
23935var getNewsUtilRequest = null;
23936var getNewsUtilRequestPending = false;
23937
23938function getNewsUtilNow() {
23939 if ($('#offlineMode').length>0) return;
23940 if (getNewsUtilRequest!==null) {
23941 getNewsUtilRequestPending = true;
23942 return;
23943 }
23944 getNewsUtilRequest = ajax('/workers/getNews.php','', function (txt) {
23945 evalRes(txt);
23946 });
23947 getNewsUtilRequest.always(function () {
23948 getNewsUtilRequest = null;
23949 if (getNewsUtilRequestPending) {
23950 getNewsUtilRequestPending = false;
23951 getNewsUtilNow();
23952 }
23953 });
23954}
23955
23956function getNewsUtil() {
23957 if ($('#offlineMode').length>0) return;
23958 if (gamesStarted) return;
23959 getNewsUtilNow();
23960 setTimeout(getNewsUtil,60000);
23961}
23962
23963
23964$(window).ready(function() {
23965
23966
23967 setAvatCarousel();
23968 CheckSizeZoom();
23969 $('#divWrap').css('visibility', 'visible');
23970 $( window ).resize(function() {
23971 CheckSizeZoom();
23972 setCarW();
23973 checkSelectiveLoading();
23974 });
23975 if (typeof $('.carousel').carousel != 'undefined')
23976 $('.carousel').carousel({
23977 interval: 5000 //the speed
23978 });
23979 $(".reviews .carousel").jCarouselLite({
23980 visible: 1,
23981 auto: 10000,
23982 speed: 800
23983 });
23984
23985 
23986 if ($('.imgCarsl[id^="rotateIMG"]').length>1) {
23987 setTimeout(rotateImgsHome,5000);
23988 }
23989 setTimeout(function () {
23990
23991 checkLazyLoads();
23992
23993
23994 /*(function(d, s, id){
23995  var js, fjs = d.getElementsByTagName(s)[0];
23996  if (d.getElementById(id)) {return;}
23997  if (typeof d.createElement=='undefined') return;
23998  js = d.createElement(s); js.id = id; js.async = true;
23999  js.src = "/js/images.js";
24000  if (fjs && fjs.parentNode)
24001  fjs.parentNode.insertBefore(js, fjs);
24002 }(document, 'script', 'imagesLowRes'));*/
24003 
24004 
24005 if (document.getElementById('nocookieconsent')==null) {
24006  setTimeout(function () { $('.infoAll').html('https://www.jeu-tarot-en-ligne.com est un jeu net-assembly, SASU au capital de 1.000 euros dont le siège social est situé  101 rue de Sèvres lot 1665, 75272 Paris cedex 6, 80809654900023 RCS Paris, contact [arobase] net-assembly.com'); },2000);
24007 }
24008
24009 
24010 },2)
24011});
24012
24013var moteurHTML = {}
24014moteurHTML.titreMoteur = 'HTML OLD';
24015var selMoteur = moteurHTML;
24016
24017moteurHTML.initEngine = function (endFunc) {
24018 endFunc();
24019}
24020
24021moteurHTML.hasCardHand = function (name)
24022{ 
24023 return $$(name)==null;
24024}
24025
24026moteurHTML.createGameBoard = function (modeJeu,chatJoueurs,nbJoueurs,etesVousLa,smileyOnly)
24027{
24028 moteurHTML.chatJoueurs = chatJoueurs!=0;
24029
24030 var jeuDiv = document.createElement('div');
24031 jeuDiv.id = 'Jeu';
24032 
24033 
24034 var equipeHTML = '<div id="divJoueurs">';
24035 
24036 for (i=0;i<nbJoueurs;i++)
24037 {
24038 equipeHTML += '<div class="jeuEquipier'+nbJoueurs+'j divJoueursDiv" onclick="showJoueurDetails(this);" id="divJoueur'+i+'">';
24039 equipeHTML += '<div class="pseudo'+nbJoueurs+'j pseudoJTxt" id="spanJoueur'+i+'"></div>';
24040 equipeHTML += '<div class="joueurCnter">'; 
24041 equipeHTML += '<div class="infJdiv">'; 
24042 equipeHTML += '<div class="fstLinEq">'; 
24043 equipeHTML += '</div>'; 
24044 equipeHTML += '<div class="gradesJ"></div>'; 
24045 equipeHTML += '<div id="avatJE">';
24046 equipeHTML += '<img style="width:100%;" id="joueur'+i+'" src="/avatars/Nobody2.jpg">';
24047 equipeHTML += '</div>';        
24048 equipeHTML += '</div>';
24049 equipeHTML += '<div class="clear"></div>';        
24050 equipeHTML += '</div>';
24051 
24052 
24053 equipeHTML += '<div id="infJE" class="infosJcomp equipierTaille ToproleAnnonce">'; 
24054 equipeHTML += '<div class="CRA">'; 
24055 equipeHTML += '<img id="j'+i+'_do" class="donneurIcon iconeStatut" src="/images/icones/donneur.png?v=2" title="Ce joueur est donneur"/>'; 
24056 equipeHTML += '<span class="appelRoi" title="Couleur d\'atout"></span>';
24057 equipeHTML += '<span id="j'+i+'_state_0_1" class="absentJoueur iconeStatut" title="Ce joueur est absent"></span>';
24058 equipeHTML += '<div id="roleJoueur'+i+'" class="roleJoueur"></div>'; 
24059 equipeHTML += '</div>'; 
24060 
24061 equipeHTML += '<span class="scoreJD" id="spanScoreJoueur'+i+'"></span>';  
24062 equipeHTML += '</div>';      
24063 equipeHTML += '</div>';  
24064 }
24065 equipeHTML += '</div>'; 
24066 equipeHTML += '<div class="clear"></div>';  
24067 equipeHTML += '<h1 id="messagePlace"></h1>';  
24068 equipeHTML += '<div id="tempsRestant" style="display:none" class="progressBar"><div>&nbsp;</div></div>'; 
24069 equipeHTML += '<div id="monJeu"></div>'; 
24070 equipeHTML += '<div id="messagePlateauJeu" role="region" aria-label="Informations de la partie"></div>';
24071 
24072 equipeHTML += '<div id="infosJeu" >';
24073 equipeHTML += '<div id="infosJeuActions" >'; 
24074 equipeHTML += '</div>';
24075 equipeHTML += '<div id="infosJeuInfo" >'; 
24076 equipeHTML += '</div>';  
24077 equipeHTML += '</div>';
24078 if (chatJoueurs!=0) {
24079 equipeHTML += getChatHTML('<u>Conversation</u>');
24080 } //else {
24081
24082 if (modeJeu!='Premium4' && modeJeu!='Premium5')
24083 equipeHTML += '<div class="clear"></div><div id="fuse-ad-22678250563" data-fuse="game_mrec"></div>';
24084 //}
24085 
24086 
24087 equipeHTML += '<div id="bottomGame">';
24088 
24089 
24090 equipeHTML += '<div class="clear"></div>';
24091 equipeHTML += '<div id="chatBg" style="padding:1px;">'; 
24092 equipeHTML += '<table style="" id="chatTable">'; 
24093 equipeHTML += '<tr>'; 
24094 if (chatJoueurs!=0 && !window.disableEmoticons) {
24095 equipeHTML += '<td onclick="toggleEmot();" id="IMGEMOT" style="background-image: url(\'/images/Emoticon/Emoticon0.png?v=4\');"></td>'; 
24096 } 
24097 equipeHTML += '<td style="padding-left:4px" id="chtput">';  
24098 
24099 //equipeHTML += '<tr><td style="padding-left:4px">';  
24100 
24101 if (chatJoueurs!=0 ) {
24102 if (!smileyOnly)
24103 equipeHTML += '<input id="chatInput" autocomplete="off" onfocus="showChatD();" maxlength="255" onclick="showChatD();" type="text">';
24104 else
24105 equipeHTML += '<input id="chatInput" disabled="disabled" value="'+smileyOnly+'" type="text">';
24106 }
24107 
24108 equipeHTML += '</td><td id="actBtnsJ" style="">'; 
24109 if (chatJoueurs!=0 && !smileyOnly)
24110 equipeHTML += '<a id="chatInputBtn" class="btn btn-default btn-bottomGame" onclick="sendChatMessage($$(\'chatInput\').value);" href="#">Dire</a>'; 
24111 equipeHTML += '</td><td id="IMGMJB" data-mode-jeu="'+modeJeu+'" role="button" tabindex="0" aria-label="Afficher les r&egrave;gles de ce mode de jeu" onclick="ouvrirReglesModeJeu(this.getAttribute(&quot;data-mode-jeu&quot;));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute(&quot;data-mode-jeu&quot;));" title="R&egrave;gles - '+getGameName(modeJeu)+'" style="background-image: url(\''+getModeJeuIcone(modeJeu)+'\');">'; 
24112 if (document.getElementById('soundEnabled') && document.getElementById('soundEnabled').value=='1') {
24113 equipeHTML += '</td><td id="muteBtn" title="Activer/Désactiver le son" style="background-image: url(\'/Jeu-Tarot-en-ligne/Jeu/mute.png\');">';
24114 } 
24115 equipeHTML += '</td><td id="quitTD"><a style="margin-left:4px;margin-right:14px;" id="BTNQUT" class="btn btn-warning btn-bottomGame" onclick="btnQuitAction();" href="#">Quitter</a>';   
24116 equipeHTML += '</td></tr></table>';   
24117 
24118 equipeHTML += '</div>'; 
24119 equipeHTML += '</div>';
24120 equipeHTML += '<div class="clear"></div>'; 
24121 equipeHTML += '<input type="hidden" id="modeJeuSalon" value="'+modeJeu+'"/> ';
24122 jeuDiv.innerHTML = equipeHTML;
24123 
24124 $('#webBody').html('');
24125 $('#webBody').append(jeuDiv);
24126
24127 try {
24128 const fusetag = window.fusetag || (window.fusetag = { que: [] });
24129 fusetag.que.push(function () {
24130 fusetag.destroyZone('bottom_mrec');
24131 });
24132 fusetag.que.push(function () {
24133 fusetag.destroyZone('Header_MREC');
24134 });
24135 fusetag.que.push(function () {
24136 fusetag.destroyZone('Sidear_HREC');
24137 });
24138 fusetag.que.push(function () {
24139  if (modeJeu=='Premium4' || modeJeu=='Premium5') return;
24140  fusetag.pageInit({ forceReset: true });
24141  fusetag.registerZone('fuse-ad-22678250563');
24142 });
24143 } catch (e) {
24144 
24145 }
24146
24147 $('#muteBtn').click(toggleSound);
24148 if (gcookie('muteMusic')=='1') { gameSoundsEnabled=true;toggleSound(); }
24149 
24150 var scrollFix = document.createElement('div');
24151 scrollFix.id = 'scrollFix';
24152 $('#webBody').append(scrollFix);
24153 
24154 if (chatJoueurs!=0 && !smileyOnly) {
24155 resetChatInputValidationKeys();
24156 }
24157 if (smileyOnly===true) {
24158 toggleEmot();
24159 window.isSmileyOnly = true;
24160 $('#IMGEMOT').hide();
24161 }
24162 window.scroll(0,0);
24163}
24164
24165moteurHTML.introAction = function ()
24166{ 
24167}
24168
24169
24170var tempoChatHTML = '';
24171moteurHTML.tempoAddChatLine = function (str)
24172{
24173 if (moteurHTML.chatJoueurs===false) return;
24174 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return; 
24175 tempoChatHTML += "<br />"+decodeChatLineHTML(str);
24176}
24177
24178moteurHTML.flushChatLine = function ()
24179{ 
24180 if (moteurHTML.chatJoueurs===false) return;
24181 if ( $$('chat')==null) return;
24182 $$('chat').innerHTML += tempoChatHTML;
24183 tempoChatHTML = ''; 
24184 $$('chat').scrollTop= $$('chat').scrollHeight;
24185}
24186
24187
24188moteurHTML.addChatLine = function (str)
24189{
24190 if (moteurHTML.chatJoueurs===false) return;
24191 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return;  
24192 if (!window.isSmileyOnly) { 
24193 if ( $$('chat')==null ) return;  
24194 //log('addChatLine'+str);
24195 $$('chat').innerHTML += "<br />"+decodeChatLineHTML(str); 
24196 $$('chat').scrollTop= $$('chat').scrollHeight;
24197 }
24198 var obj = decodeChatLineObj(str);
24199 
24200 $('.divJoueursDiv').each(function() {
24201 if ( this && this.id && $(this).find('.pseudoJTxt').html()==obj[0] )
24202 selMoteur.showMessageJoueur(parseInt(this.id.split('divJoueur').join('')),obj[1]);
24203 });
24204
24205 reorganiseCartes ('fromZomm');
24206}
24207
24208
24209moteurHTML.addCard = function (name, action)
24210{
24211 var srcI = getCardJSIMG(name);
24212
24213 cardsNum++;
24214 if (action=='' || action==null )
24215 $$('monJeu').innerHTML += '<img class="carteMain cardJeu" id="MonJeu'+name+'" alt="'+name+'" onClick="'+action+'" height="'+cardHeight+'" width="'+cardWidth+'" src="'+srcI+'" style="position:relative;top:'+cardsBestTop+'px;margin-left:'+(-cardWidth/2)+'px;margin-right:'+(-cardWidth/2)+'px;">'; 
24216 else
24217 $$('monJeu').innerHTML += '<img class="carteMain cardJeu" alt="'+name+'" id="MonJeu'+name+'" onClick="'+action+'" height="'+cardHeight+'" width="'+cardWidth+'" src="'+srcI+'" style="cursor:pointer;position:absolute;top:'+(cardsBestTop)+'px;margin-left:'+(-cardWidth/2)+'px;margin-right:'+(-cardWidth/2)+'px;">'; //+i*20
24218} 
24219
24220moteurHTML.getCards = function () {
24221 return $$('monJeu').childNodes;
24222}
24223
24224moteurHTML.setCardAction = function (name, action)
24225{ 
24226 
24227 if ($$('MonJeu'+name)==null)
24228 return;
24229 if (action=='' || action==null)
24230 {
24231 $$('MonJeu'+name).onclick = null;
24232 carteNonSelectionnable('MonJeu'+name);
24233 $($$('MonJeu'+name)).css('cursor','');
24234 }
24235 else 
24236 {
24237 $$('MonJeu'+name).onclick = new Function(action) ; 
24238 $($$('MonJeu'+name)).css('cursor','pointer');
24239 }
24240} 
24241
24242
24243var lastUserEmpty = true;
24244
24245//var medaillesTypes = [ "Duplicate","Premium4","Premium5","Assiduite","Missions","Politesse","Banchat","Abandon"];
24246
24247moteurHTML.setUtilisateur = function (num,pseudo, avatar,score,connected,messagesJoueurs,grade,idJoueur)
24248{ 
24249 $('#divJoueur'+num).data("idUtilisateur",parseInt(idJoueur,10));
24250
24251 if ($$('spanJoueur'+num).innerHTML != pseudo)
24252 {
24253 $('#divJoueur'+num+' .gradesJ').html('');
24254 if (idJoueur>0) {
24255 if (!phaserMedalsDisabled) {
24256 var tabMed = grade.split('-');
24257 for (var o=0;o<tabMed.length;o++) {
24258 if (tabMed[o]=='FFT')
24259 $('#divJoueur'+num+' .gradesJ').append( '<img style="opacity:1" class="iconedJ idcoD" src="/Jeu-Tarot-en-ligne/Signalisatipon-FFT4.png"/>');
24260 else {
24261 $('#divJoueur'+num+' .gradesJ').append( '<img style="opacity:1" class="iconedJ idcoD" src="/workers/medailleMin.php?type='+tabMed[o]+'&idJoueur='+idJoueur+'&v='+Math.random()+'"/>');
24262 }
24263 }
24264 }
24265 } else {
24266 if (idJoueur<0 && /^IA(?:\s|$)/.test(pseudo)) {
24267 if (!phaserMedalsDisabled) {
24268  $('#divJoueur'+num+' .gradesJ').append( '<img style="opacity:1" class="iconedJ idcoD" src="/workers/medailleMin.php?type=IA&idJoueur=0&v=1"/>');
24269 }
24270 }
24271 else
24272 $('#divJoueur'+num+' .gradesJ').append( '<img style="opacity:1" class="iconedJ idcoD" src="/workers/medailleMin.php?type=Wait&idJoueur=0&v=1"/>');
24273 
24274 }
24275 // $$('gradeJoueur'+num+'_'+o).src = '/workers/medailleMin.php?type='+tabMed[o]+'&idJoueur='+idJoueur+'&v=1';//'/images/grades/XXX.php?grade='+(grade)+'&v=4';
24276 if (pseudo!='Vide' && pseudo!='Libre')
24277 {  
24278  lastUserEmpty = false;       
24279  $('#spanJoueur'+num).css('cursor','pointer');
24280 }
24281 else
24282 { 
24283  lastUserEmpty = true; 
24284  $('#spanJoueur'+num).css('cursor','');
24285 }
24286 }
24287 if (avatar!='' && avatar!=null)
24288 {
24289 $$('joueur'+num).src = ''+avatar; 
24290 $('#divJoueur'+num+' .joueurCnter').removeClass('roleNobody'); 
24291 }
24292 else
24293 {
24294 if (pseudo=='Vide' || pseudo=='Libre') {
24295  $$('joueur'+num).src = '/avatars/Nobody2.jpg'; 
24296  selMoteur.setRoleJoueurClass(num,'roleNobody');
24297 }
24298 else {
24299  $('#divJoueur'+num+' .joueurCnter').removeClass('roleNobody');
24300  $$('joueur'+num).src = '/avatars/Unknown.jpg?v=2'; 
24301 }
24302 } 
24303    
24304       
24305 if (connected || pseudo=='Vide' || pseudo=='Libre') {
24306 //$('#spanJoueur'+num).css('color','#43391f');
24307 $('#j'+num+'_state_0_1').hide();
24308 }
24309 else {
24310 $('#j'+num+'_state_0_1').css('display','inline-block');
24311 // $('#spanJoueur'+num).css('color','#000'); 
24312 }     
24313 
24314 var d = new Date();
24315
24316 if (pseudo=="Vide" )
24317 {
24318 $$('spanJoueur'+num).innerHTML = pseudo;
24319 if (d.getTime()>dateDebutPartie+30*1000)
24320 {
24321  if ( $$('spanJoueur'+num).innerHTML != 'Ajouter une IA') {
24322 $('#divJoueur'+num+' .gradesJ').html('<img style="opacity:1" class="iconedJ idcoD" src="/workers/medailleMin.php?type=Add&idJoueur=0&v=1"/>'); 
24323  $$('spanJoueur'+num).innerHTML = 'Ajouter une IA';
24324  $('#divJoueur'+num).data("idPos",num);
24325  $('#divJoueur'+num).data("imgSrc",avatar);
24326  $('#divJoueur'+num).data("pseudo",pseudo);
24327  //setScore (num,);
24328  $('#spanScoreJoueur'+num).css('cursor','pointer');
24329  }
24330 }
24331 else
24332 {
24333 if ( $$('spanJoueur'+num).innerHTML != pseudo) {
24334 $('#divJoueur'+num+' .gradesJ').html('<img style="opacity:1" class="iconedJ idcoD" src="/workers/medailleMin.php?type=Wait&idJoueur=0&v=1"/>'); 
24335  $$('spanJoueur'+num).innerHTML = pseudo;
24336  $('#spanScoreJoueur'+num).css('cursor','');
24337 }
24338 }
24339 }
24340 else
24341 { 
24342 $$('spanJoueur'+num).innerHTML = pseudo;
24343 $('#divJoueur'+num).data("pseudo",pseudo);
24344 $('#divJoueur'+num).data("imgSrc",avatar);
24345 /*if ($$('spanScoreJoueur'+num).innerHTML == 'Ajouter une IA' || $$('spanScoreJoueur'+num).innerHTML.substr(0,8) == 'Ajout IA')
24346  setScore (num,''); */         
24347 $('#spanScoreJoueur'+num).css('cursor','');
24348 //$('#spanScoreJoueur'+num).css('color','#000000');
24349 }
24350 
24351 return; 
24352} 
24353
24354
24355 
24356moteurHTML.masquerProfilUtilisateur = function (idUtilisateur)
24357{
24358 var avatarMasque = '/avatars/Blacklist.png';
24359 idUtilisateur = parseInt(idUtilisateur,10);
24360 for (var i=0;i<6;i++) {
24361 if (parseInt($('#divJoueur'+i).data('idUtilisateur'),10)==idUtilisateur) {
24362 $('#divJoueur'+i).data('imgSrc',avatarMasque);
24363 $('#joueur'+i).attr('src',avatarMasque);
24364 }
24365 }
24366}
24367
24368moteurHTML.cartePreselect = function (obj,name) {
24369 notifyUserActivity();
24370 if (advanceCardPlayDisable) return;
24371 if ($$('masque'+obj.id)!=null) {
24372
24373 rpcNoQueue('prochaineCarte=');
24374 $('.masqueCarte').remove();
24375 nextDelayIsNull = 0;
24376 } else {
24377
24378 if (shalAskForConfirmCardPlay || (name=='le petit' && shalAskForconfirmationPetit) ) {
24379 confirme('Etes-vous sûr de vouloir presélectionner '+name+' ?',function () {
24380  rpcNoQueue('prochaineCarte='+getCardName(obj));
24381  $('.masqueCarte').remove();
24382  carteSelectionnee(obj.id); 
24383  nextDelayIsNull = 1;
24384 });
24385 } else {
24386  rpcNoQueue('prochaineCarte='+getCardName(obj));
24387  $('.masqueCarte').remove();
24388  carteSelectionnee(obj.id); 
24389  nextDelayIsNull = 1;
24390 }
24391 
24392 }
24393}
24394
24395
24396   
24397
24398function getPlayedCardSizeHTML() {
24399 var cardWidth;
24400 if ($(window).width()<978 || true) {
24401 var cardHeight = $('.joueurCnter').outerHeight()+$('.pseudoJTxt').outerHeight()*2;//$('.roleJoueur').offset().top-$('#divJoueur0 .joueurCnter').offset().top;
24402 cardWidth = cardHeight*70/129;
24403 if (cardWidth > $('.divJoueursDiv').outerWidth())
24404 cardWidth = $('.divJoueursDiv').outerWidth();
24405 } else {
24406 cardWidth = $('.divJoueursDiv').outerWidth();
24407 }
24408 if (cardWidth>100)
24409 cardWidth = 100;
24410 if ($(window).width()<600) {
24411
24412 if (cardWidth<65)
24413 cardWidth = 65;
24414 } else {
24415
24416 if (cardWidth<75)
24417 cardWidth = 75;
24418 }
24419
24420 return {w:cardWidth,h:cardWidth*129/70};
24421} 
24422
24423
24424function carteEpos (num) {
24425 if ($(window).width()<=600) {
24426
24427 var sizeCard = getPlayedCardSizeHTML();
24428 var oneWidth = $('#divJoueur0').width();
24429
24430 var newPos = $('#divJoueur'+num).offset().left-$('#monJeu').offset().left+oneWidth/2-sizeCard.w/2;//;
24431 return newPos;
24432 }
24433 var sizeCard = getPlayedCardSizeHTML();
24434 var oneWidth = $('#divJoueur0').width();
24435
24436 var newPos = $('#divJoueur'+num).offset().left-$('#monJeu').offset().left+oneWidth-sizeCard.w-2;//;
24437 //var newPos = oneWidth+$('#divJoueur0').offset().left-sizeCard.w;//-($('#divJoueur0').width()-$('.joueurCnter').width())/2+1+$('#divJoueur0').offset().left;
24438
24439 //newPos += oneWidth*num;
24440 return newPos;//-parseInt($('#monJeu').css('margin-left'));
24441}
24442
24443
24444function getCardPlayerTop() {
24445 var sizeCard = getPlayedCardSizeHTML();
24446 var topO = $('.joueurCnter').offset().top-$('#monJeu').offset().top-$('.pseudoJTxt').height();
24447 
24448 if (sizeCard.h>$('#divJoueur0 .joueurCnter').outerHeight()+$('.pseudoJTxt').height()*2)
24449 topO -= (sizeCard.h-$('#divJoueur0 .joueurCnter').outerHeight()-$('.pseudoJTxt').height()*2)/2;//;
24450 
24451 return topO;
24452}
24453
24454function reposPlayedCardsHTML() {
24455 var topO = getCardPlayerTop();
24456 $('.cartesTapis').each(function() {
24457 if (!$(this).hasClass('rammass'))
24458 animateId (this.id,carteEpos($(this).data('pos')),topO);
24459 });
24460}
24461 
24462var cartesSurLeTapis = new Array();
24463
24464moteurHTML.playOppCard = function (name,opp)
24465{
24466 var topO = getCardPlayerTop();
24467 var ccW = 90;
24468 if ($('.carteMain').width()) 
24469 ccW = $('.carteMain').width();
24470 // c'est une carte a moi qui est joue
24471 if (opp==whoamiNum && $$('MonJeu'+name)!=null)
24472 {
24473 $('.masqueCarte').remove();
24474 //clearCardsActions (); 
24475 var myPlayedCard = $$('MonJeu'+name);//MonJeu4_Pique-03.gif
24476 //if (myPlayedCard==null) alert('bug');
24477 cartesSurLeTapis[whoamiNum] = name;
24478 myPlayedCard.style.zIndex=zindexTop;
24479 zindexTop++;          
24480 myPlayedCard.id = 'newOne'+whoamiNum;
24481 myPlayedCard.onclick=null;
24482 $(myPlayedCard).removeClass('carteMain');
24483 
24484 $( myPlayedCard ).animate({
24485  marginLeft: (-ccW/2)+"px",
24486  marginRight: (-ccW/2)+"px",
24487  marginTop: (parseInt($( myPlayedCard ).css('margin-top'))-30)+"px"
24488  },200,function() { 
24489  var offs = $(myPlayedCard).offset();
24490  var sty = 'position:absolute;';
24491  sty += 'top:'+(offs.top+0*parseInt(myPlayedCard.style.marginTop)-$('#monJeu').offset().top)+'px;';
24492  sty += 'left:'+(offs.left+0*parseInt(myPlayedCard.style.marginLeft)-$('#monJeu').offset().left)+'px;';
24493  sty += 'margin-left:0px;';
24494  sty += 'margin-right:0px;';
24495  sty += 'margin-top:0px;';
24496  sty += 'z-index:99;';
24497  myPlayedCard.setAttribute('style',sty);
24498
24499  animateId (myPlayedCard.id,carteEpos(whoamiNum),topO);
24500
24501  $(myPlayedCard).data('pos',opp);
24502  $(myPlayedCard).addClass('cartesTapis');
24503
24504  reorganiseCartes ();
24505  } ); 
24506 lastMO = null;
24507 playSoundEffect('CardPlaced.mp3',true);
24508 return;
24509 }
24510 if (opp==null) 
24511 {
24512 opp=lastOpp;
24513 lastOpp++;
24514 if (lastOpp>3) lastOpp=0;
24515 }
24516 cartesSurLeTapis[opp] = name; 
24517 
24518
24519 var sizeCard = getPlayedCardSizeHTML();
24520
24521 var img = $$('newOne'+opp);
24522 if (img==null)
24523 {
24524 img = document.createElement("IMG");
24525 img.src= getCardJSIMG(name);//cacheCarte[name]; 
24526 img.style.position='absolute';
24527 img.style.left=carteEpos(opp)+'px';
24528 img.style.top=topO+'px'; 
24529 img.width=sizeCard.w; 
24530 img.height= sizeCard.h;
24531 //img.height=cardHeight;
24532 img.id='newOne'+opp;      
24533 img.alt=name; 
24534       
24535 $$('monJeu').appendChild(img);
24536 
24537 $(img).data('pos',opp);
24538 $(img).addClass('cartesTapis');
24539
24540 } else {
24541 img.style.left = carteEpos(opp)+"px";
24542 img.style.top = topO+"px";
24543 img.style.width = sizeCard.w;
24544 img.style.height = sizeCard.h;
24545 
24546 }  
24547 
24548 img.style.zIndex=zindexTop;
24549 zindexTop++; 
24550 
24551 if (Math.random()<0.5)
24552 playSoundEffect('cards_02.mp3',true);
24553 else
24554 playSoundEffect('cards_01.mp3',true);       
24555}
24556moteurHTML.setRoleJoueurClass = function (num,className) {
24557
24558 $('#divJoueur'+num+' .joueurCnter')
24559 .removeClass('roleVictoire')
24560 .removeClass('roleDefaite')
24561 .removeClass('roleAnnonce')
24562 .removeClass('rolePreneur')
24563 .removeClass('rolePreneurPrise')
24564 .removeClass('rolePreneurGarde')
24565 .removeClass('rolePreneurGardesans')
24566 .removeClass('rolePreneurGardecontre')
24567 .removeClass('roleEquipier')
24568 .removeClass('roleNobody')
24569 .removeClass('rolePasse')
24570 .addClass(className);
24571
24572 $('#divJoueur'+num+' .pseudoJTxt')
24573 .removeClass('ToproleVictoire')
24574 .removeClass('ToproleDefaite')
24575 .removeClass('ToproleAnnonce')
24576 .removeClass('ToprolePreneur')
24577 .removeClass('ToprolePreneurPrise')
24578 .removeClass('ToprolePreneurGarde')
24579 .removeClass('ToprolePreneurGardesans')
24580 .removeClass('ToprolePreneurGardecontre')
24581 .removeClass('ToproleEquipier')
24582 .removeClass('ToproleNobody')
24583 .removeClass('ToprolePasse')
24584 .addClass('Top'+className);
24585
24586 $('#divJoueur'+num+' .infosJcomp')
24587 .removeClass('ToproleVictoire')
24588 .removeClass('ToproleDefaite')
24589 .removeClass('ToproleAnnonce')
24590 .removeClass('ToprolePreneur')
24591 .removeClass('ToprolePreneurPrise')
24592 .removeClass('ToprolePreneurGarde')
24593 .removeClass('ToprolePreneurGardesans')
24594 .removeClass('ToprolePreneurGardecontre')
24595 .removeClass('ToproleEquipier')
24596 .removeClass('ToproleNobody')
24597 .removeClass('ToprolePasse')
24598 .addClass('Top'+className);
24599}
24600
24601moteurHTML.setPrise = function (num,txt) 
24602{
24603 if (txt=='Passe')
24604 selMoteur.setRoleJoueurClass(num,'rolePasse');
24605 else if (txt!='')
24606 selMoteur.setRoleJoueurClass(num,'rolePreneur'+txt.split(' ').join(''));
24607 else
24608 selMoteur.setRoleJoueurClass(num,'roleAnnonce');
24609 if (txt!='') {
24610 /*$('.roleJoueur').css('position','static');
24611 $('.roleJoueur').css('position','initial');*/
24612 }
24613 $$('roleJoueur'+num).innerHTML = txt; 
24614 resizeChat();
24615 autoShowCRA();
24616}
24617
24618moteurHTML.setPriseTxt = function (num,txt) 
24619{
24620
24621 $$('roleJoueur'+num).innerHTML = txt; 
24622 autoShowCRA();
24623}
24624
24625moteurHTML.setPreneur = function (num,annonce,chelem)
24626{
24627 var repNbJ = 5;
24628 if ($('#divJoueur0').hasClass('jeuEquipier4j'))
24629 repNbJ = 4;
24630 if ($('#divJoueur0').hasClass('jeuEquipier3j'))
24631 repNbJ = 3;
24632
24633 for ( var i=0;i<repNbJ;i++)
24634 {
24635 if (num==-1)
24636 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
24637 else if (i==num) {
24638 selMoteur.setRoleJoueurClass(i,'rolePreneur'+tabAnnonces[annonce].split(' ').join(''));
24639 } else
24640 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
24641 
24642 if (i==num)
24643 {
24644 if (chelem) {
24645  $$('roleJoueur'+i+'').innerHTML = tabAnnoncesCrt[annonce]+' + chelem'; 
24646 } else     
24647  $$('roleJoueur'+i+'').innerHTML = tabAnnonces[annonce]; 
24648 }
24649 else
24650 {
24651  $$('roleJoueur'+i+'').innerHTML = '';
24652 }
24653 }
24654 resizeChat();
24655 autoShowCRA();
24656}
24657
24658moteurHTML.clearPrise = function (i)
24659{
24660 $$('roleJoueur'+i+'').innerHTML = '&nbsp;';
24661}
24662function autoShowCRA() {
24663 for (var i=0;i<4;i++) {
24664
24665 if ($('#divJoueur'+i+' .CRA').width()<10) {
24666 $('#divJoueur'+i+' .CRA').hide();
24667 } else {
24668 $('#divJoueur'+i+' .CRA').show();
24669 }
24670 }
24671}
24672
24673moteurHTML.setDonneurPos = function (num) {
24674 for (var k=0;k<6;k++)
24675 $('#j'+k+'_do').hide();
24676 $('#j'+num+'_do').css('display','inline-block');
24677 showCRA();
24678}
24679moteurHTML.setScore = function (num,score)
24680{
24681 if ($$('spanScoreJoueur'+num).innerHTML != score) {
24682 $$('spanScoreJoueur'+num).innerHTML = score;
24683 if (score!='') {
24684 $('#spanScoreJoueur'+num).show();
24685 /*$('.infosJcomp').css('position','static');
24686 $('.infosJcomp').css('position','initial');*/
24687 } else {
24688
24689 $('#spanScoreJoueur'+num).hide();
24690 }
24691 }
24692}
24693
24694
24695var numActions = 0;
24696 
24697moteurHTML.clearActions = function (noscroll)
24698{
24699 if (numActions!=0) {
24700 $$('infosJeuActions').innerHTML = '';
24701 //selMoteur.hideInfoJeu();
24702 if (!noscroll) $("html, body").stop().animate({ scrollTop: 0 }, 700);
24703 }
24704 if (noscroll==2) {
24705 $("html, body").stop().animate({
24706 scrollTop: $(document).height()
24707 }, 700);
24708 }
24709 numActions = 0; 
24710}
24711moteurHTML.addAction = function (name,action,myclass,noscroll)
24712{
24713 if (selMoteur.actionExists (name))
24714 return;
24715 
24716 if (numActions==0) {
24717 $('#infosJeu').show();
24718 $('#infosJeuActions').show();
24719 $$('infosJeuActions').innerHTML = '';
24720 showInfoJeu();
24721 }
24722 numActions++;
24723 //if ( $$('infosJeu').innerHTML.indexOf( 'value="'+name+'"')==-1)
24724 $$('infosJeuActions').innerHTML += '<a class="actionBtn '+myclass+' btn btn-actionGame" onclick="'+action+'">'+name+'</a>';
24725 
24726 if (numActions==1) {
24727 reorganiseCartes ('fromZomm');
24728 }
24729 if (!noscroll)
24730 $("html, body").stop().animate({ scrollTop: $('#infosJeuActions').offset().top+$('#infosJeuActions').outerHeight()+$('#chatBg').outerHeight()-$(window).height() }, 1000);
24731
24732}
24733
24734moteurHTML.actionExists = function (name)
24735{
24736 var actions = $$('infosJeuActions');
24737 return !!actions && actions.innerHTML.indexOf( name+'</a>')!=-1;
24738}
24739moteurHTML.removeAction = function (name)
24740{
24741 $('#infosJeuActions a').each(function () {
24742 if ($(this).html()==name) {
24743 //console.log('found ');
24744 $(this).remove();
24745 }
24746 
24747 });
24748 return;
24749}
24750var lastTurnSel = null; 
24751moteurHTML.setTurn = function (num)
24752{
24753 if (etapeCourante =="Terminee")
24754 {
24755 selMoteur.clearTurn();           
24756 }
24757 else
24758 {
24759 if ( $$('selecteurTour')!=null) $$('selecteurTour').style.visibility='visible';
24760 var oneWidth = $('#divJoueur0').width();
24761 var newPos = $('#divJoueur'+num).offset().left+oneWidth/2-$('#selecteurTour').width()/2;
24762 if ( $$('selecteurTour')==null)
24763 {
24764  var selector = document.createElement('IMG');
24765  selector.style.position='absolute';
24766  selector.style.left=parseInt(newPos)+'px';
24767  //selector.style.position='absolute';
24768  selector.style.top='0px';
24769  //selector.style.zIndex='1';
24770  //selector.style.left=newPos;
24771  selector.id='selecteurTour';
24772  if (isLowGraphism)
24773  selector.src='/Jeu-Tarot-en-ligne/Icones/SelecteurOFF.png?v=2';
24774  else
24775  selector.src='/Jeu-Tarot-en-ligne/Icones/Selecteur.png?v=2';
24776  $$('Jeu').appendChild(selector);
24777 }
24778 $('#selecteurTour').stop().animate( { left: newPos,top:$('#webBody').css('margin-top') }, 700 );
24779 /*$('.shakeVert').removeClass('shakeVert');
24780 if (num>=0) {
24781 $('#divJoueur'+num).addClass('shakeVert');
24782 }*/
24783 // var newFx = new Fx.Tween('selecteurTour', { property: 'left' }).start(parseInt($$('selecteurTour').style.left), newPos );
24784 lastTurnSel = num;
24785 }
24786} 
24787moteurHTML.clearTurn = function () 
24788{
24789 if ( $$('selecteurTour')!=null) $$('selecteurTour').style.visibility='hidden';
24790} 
24791
24792
24793
24794var lastIntitule = '';
24795var TOaffCART;
24796
24797moteurHTML.afficheCartes = function (cartes,intitule)
24798{   
24799 if (lastIntitule==intitule && intitule.indexOf('taient dans le chien') === -1) return;
24800 lastIntitule = intitule;
24801 var tWidth = $(window).width(); 
24802 var cartesChien = jQuery.parseJSON(cartes);
24803 var div = document.createElement("DIV");
24804 $$('infosJeuInfo').innerHTML = '';
24805 div.id='carteInfos';
24806
24807 div.innerHTML = '<h4>'+intitule+'</h4>';
24808 var div2 = document.createElement("DIV");
24809 div2.id='carteInfosList';      
24810 div.appendChild(div2); 
24811 for (i=0;i<cartesChien.length;i++)
24812 {
24813 
24814 img = document.createElement("IMG");
24815 img.src= getCardJSIMG(cartesChien[i]);
24816 img.style.position='relative';
24817 //img.style.marginBottom='0px'; 
24818 img.className = 'carteAfficheeInfo cardJeu';
24819 img.width=cardWidth;
24820 img.height=cardHeight;
24821 img.id='carteChien'+i;      
24822 img.alt=cartesChien[i];      
24823 div2.appendChild(img); 
24824 }    
24825 selMoteur.clearActions();   
24826 $$('infosJeuInfo').appendChild(div); 
24827 $('#infosJeu').show(); 
24828 $('#infosJeuInfo').show(); 
24829 showInfoJeu();
24830 //showInfoJeu();
24831 reorganiseCartes ('fromZomm');
24832 //TOaffCART = setTimeout(masqueInfoJeu,8000);
24833} 
24834
24835
24836
24837
24838
24839moteurHTML.clearMessagePlateauJeu = function ()
24840{
24841 var messagePlateauJeu = $$('messagePlateauJeu');
24842 if (messagePlateauJeu==null) return;
24843 messagePlateauJeu.innerHTML = '';
24844}
24845moteurHTML.showMessagePlateauJeu = function (txt,conserverCartes)
24846{
24847 etapeCourante ="Terminee";
24848 if (conserverCartes!==true) {
24849 cardsNum=0;
24850 $$('monJeu').innerHTML = '';
24851 $('#monJeu').css('padding-bottom','0px');
24852 }
24853 var messagePlateauJeu = $$('messagePlateauJeu');
24854 if (messagePlateauJeu==null) return;
24855 messagePlateauJeu.innerHTML = '<div class="txtEndGame">'+txt+'</div>';
24856 resizeChat();
24857}
24858
24859
24860
24861
24862var delTOTO = 0;
24863function progress(percent, $element) {
24864 var progressBarWidth = percent * $element.width() / 100;
24865 $element.find('div').css('width', progressBarWidth );//.html(percent + "%&nbsp;");
24866}
24867var syncTimeDelay = 0;
24868var syncTimeTS = 0;
24869var syncTimeTotal = 0;
24870var syncTimeInterval = 0;
24871
24872moteurHTML.timeThatRemains = function (delay,totalTime,ignoreTurn)
24873{
24874 //log('il reste '+delay+' secondes');
24875 if (delay==-1 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
24876 { 
24877 syncTimeDelay = 0;
24878 syncTimeTS = 0;
24879 syncTimeTotal = 0;
24880 clearInterval(syncTimeInterval);
24881
24882 $('#tempsRestant').css('visibility','hidden');
24883
24884 }
24885 else
24886 { 
24887 var oldDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
24888 //console.log('oldDelay',oldDelay);
24889 //console.log('err',oldDelay-delay);
24890 syncTimeDelay = delay;
24891 syncTimeTS = (new Date().getTime());
24892 syncTimeTotal = totalTime;
24893 clearInterval(syncTimeInterval);
24894 syncTimeInterval = setInterval(function () { intervalTimeRemaining(ignoreTurn); },100);
24895 
24896 var newWidth = 0;
24897 if ( delay>2) newWidth = 10+delay*3;
24898
24899 $('#tempsRestant').show();
24900 $('#tempsRestant').css('visibility','visible');
24901 progress(delay*100/totalTime, $('#tempsRestant')); 
24902 }
24903}
24904var canPlayAlertSound = 0;
24905
24906function intervalTimeRemaining(ignoreTurn) {
24907 var newDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
24908 if (newDelay<0 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
24909 { 
24910 syncTimeDelay = 0;
24911 syncTimeTS = 0;
24912 syncTimeTotal = 0;
24913 clearInterval(syncTimeInterval);
24914
24915 $('#tempsRestant').css('visibility','hidden');
24916 return;
24917 }
24918 if (newDelay<3 && canPlayAlertSound==0) {
24919 if (gameSoundsEnabled) playSoundEffect ('Heartbeat3.mp3',true,0.9);
24920 else playSound ('Button.mp3?v=2');//playSound ('Bip.mp3');
24921 canPlayAlertSound = 1;
24922 } else if (newDelay>5 && canPlayAlertSound==1 ) {
24923 canPlayAlertSound = 0;
24924 }
24925 progress(newDelay*100/syncTimeTotal, $('#tempsRestant'));
24926}
24927
24928
24929
24930
24931
24932moteurHTML.showMessageJoueur = function (idJoueur,message) {
24933 if (window.disableEmoticons) return;
24934 var rand = Math.random();
24935 if (message=="J'applaudis !") playSoundEffect ('Clap_Hands'+Math.floor(rand*5)+'.mp3',true,0.9);
24936 else if (message=="C'est long...") playSoundEffect ('Yawn'+(2+Math.floor(rand*2))+'.mp3',true,0.9);
24937 else if (message=="Je vous embrasse !") playSoundEffect ('Kiss '+Math.ceil(rand*3)+'.mp3',true,0.9);
24938 else if (message=="Je pleure !") playSoundEffect ('Cry_1Cut.mp3',true,0.9);
24939 
24940 var gameEmoticon = resolveGameEmoticon(message);
24941 if (gameEmoticon) {
24942 //$('#divJoueur'+idJoueur).attr('title', message);
24943 var newIcon = $('<img class="emotHTML" style="opacity:0;" alt="" />');
24944 var afficherEmoticon = function () {
24945 if (newIcon.data('emoticonAffichee')) return;
24946 newIcon.data('emoticonAffichee',true);
24947 newIcon.css('margin-left',$('#divJoueur'+idJoueur).width()/2-newIcon.width()/2 );
24948 newIcon.css('opacity',1 );
24949 newIcon.animate({'margin-top':100,opacity:0},2500,function () {
24950 newIcon.remove();
24951 });
24952 };
24953
24954 /* Brancher les evenements avant src : une image deja en cache peut finir
24955 * de charger avant l'ancien $(image).load(...), et rester invisible. */
24956 newIcon.on('load',afficherEmoticon).on('error',function () {
24957 newIcon.remove();
24958 });
24959 $('#divJoueur'+idJoueur).append(newIcon);
24960 newIcon.attr('src',gameEmoticon.image);
24961 if (newIcon[0].complete) {
24962 if (typeof newIcon[0].naturalWidth==='undefined' || newIcon[0].naturalWidth>0)
24963 afficherEmoticon();
24964 else
24965 newIcon.remove();
24966 }
24967
24968 return;
24969 }
24970 
24971 if (typeof $('#divJoueur'+idJoueur).tooltip == 'undefined') return;
24972 if ($('#divJoueur'+idJoueur).attr('title') || $('#divJoueur'+idJoueur).attr('data-original-title')) {
24973 var pop = $('#divJoueur'+idJoueur).data('fifoMsgs');
24974 if (!pop)
24975 pop = [];
24976 if (pop.length<10)
24977 pop.push(message);
24978 $('#divJoueur'+idJoueur).data('fifoMsgs',pop);
24979 return;
24980 }
24981
24982
24983 $('#divJoueur'+idJoueur).attr('title', message);
24984 $('#divJoueur'+idJoueur).attr('data-placement', "bottom");
24985 $('#divJoueur'+idJoueur).attr('data-original-title', message)
24986 .tooltip().tooltip('fixTitle').mouseover();
24987
24988 playSoundEffect ('Female Voice - Psst '+Math.ceil(Math.random()*2)+'.mp3',true,0.5);
24989 
24990 clearTimeout($('#divJoueur'+idJoueur).data('TO'));
24991 var to = setTimeout(function() {
24992 $('#divJoueur'+idJoueur).mouseout().attr('title', '').attr('data-original-title', '');
24993 var pop = $('#divJoueur'+idJoueur).data('fifoMsgs');
24994 if (pop) {
24995 if (pop.length>0) {
24996 var m2 = pop.shift();
24997 $('#divJoueur'+idJoueur).data('fifoMsgs',pop);
24998 setTimeout(function () {
24999 selMoteur.showMessageJoueur(idJoueur,m2);
25000 },200);
25001
25002 }
25003 }
25004 }, 5000);
25005 $('#divJoueur'+idJoueur).data('TO', to);
25006}
25007
25008var nombreDeJPartie = 4;
25009var hasAGameStarted = false;
25010var firstInfoJeuShown = false;
25011
25012function showInfoJeu()
25013{
25014 firstInfoJeuShown = true;
25015 if ($('#chat:visible').length && !$(document.body).hasClass('bigChat')) {
25016 $('#infosJeuInfo').show();
25017 $('#infosJeu').show();
25018 updateHalfChat();
25019 return;
25020 }
25021 $('#infosJeuInfo').show();
25022 $('#infosJeu').show();
25023 updateHalfChat();
25024} 
25025moteurHTML.hideInfoJeu = function ()
25026{
25027 //numActions = 0; 
25028 $$('infosJeuInfo').innerHTML = '';
25029 $('#infosJeuInfo').hide();
25030 updateHalfChat();
25031} 
25032
25033
25034function updateHalfChat()
25035{
25036 if ($('#chat:visible').length && !$(document.body).hasClass('bigChat') && firstInfoJeuShown ) 
25037 $(document.body).addClass('halfChat');
25038 else
25039 $(document.body).removeClass('halfChat');
25040} 
25041
25042function resizeChat() {
25043 if ($('#chat').length==0) return;
25044 if ($(document.body).hasClass('bigChat')) {
25045 if ($('#chat').is(':visible'))
25046 $('#chatBg').addClass('chatBgOpen');
25047 else
25048 $('#chatBg').removeClass('chatBgOpen');
25049 var delt = parseInt($('#chat').css('padding-top'))+parseInt($('#chat').css('padding-bottom'));
25050 if ($('#chat')[0].scrollHeight+$('#chatBg').outerHeight()+$('#chatGradient').height()-delt>$(window).height()) {
25051 $('#chat').height(Math.max($(window).height()-$('#chatBg').outerHeight()-$('#chatGradient').height()-delt,200));
25052 } else {
25053 $('#chat').css('height','');
25054 }
25055 } else {
25056 $('#chatBg').removeClass('chatBgOpen');
25057 if ($(window).width()>600 || !firstInfoJeuShown)
25058 $('#chat').css('height',Math.max(180,$(window).height()-$('#chat').offset().top-$('#chatBg').outerHeight()-14));
25059 else
25060 $('#chat').css('height','');
25061 }
25062 if ($('#chat')[0].scrollHeight>$('#chat').outerHeight()) {
25063
25064 $('#chatGradient').css('padding-right','20px');
25065 } else {
25066 $('#chatGradient').css('padding-right','0px');
25067 
25068 }
25069 $$('chat').scrollTop= $$('chat').scrollHeight;
25070 
25071}
25072function showChatD() {
25073 $('#chat').show();
25074 $('#chatGradient').show();
25075 resizeChat();
25076}
25077moteurHTML.hideChat = function () {
25078 if (!$(document.body).hasClass('bigChat')) return;
25079 $('#chat').hide();
25080 $('#chatGradient').hide();
25081 resizeChat();
25082}
25083function chatGrad() {
25084 var equipeHTML='';
25085 equipeHTML += '<p id="chatGradient" >'; 
25086 equipeHTML += '<img class="closeChatBtn closingBtnChat" src="/images/icones/Close.png" onclick="selMoteur.hideChat()"/>'; 
25087 equipeHTML += '<img class="closeChatBtn" src="/images/icones/Bigger.png" onclick="bigChatD()"/>'; 
25088 equipeHTML += '</p>'; 
25089 return equipeHTML;
25090}
25091function getChatHTML(val) {
25092 var equipeHTML='<div class="chatContainer">';
25093 equipeHTML += chatGrad(); 
25094 equipeHTML += '<p id="chat">'+val+'</p></div>'; 
25095 return equipeHTML;
25096}
25097function bigChatD() {
25098 var equipeHTML=getChatHTML($('#chat').html());
25099 
25100 if ($(document.body).hasClass('bigChat')) {
25101
25102 $('.chatContainer').remove();
25103 $('#infosJeu').after($(equipeHTML));
25104 $(document.body).removeClass('bigChat');
25105 } else {
25106
25107 $('.chatContainer').remove();
25108 $('#bottomGame').prepend($(equipeHTML));
25109 $(document.body).addClass('bigChat');
25110 }
25111 showChatD();
25112 updateHalfChat();
25113 resizeChat();
25114}
25115function toggleChatD() {
25116 if ($('#chat').is(':visible')) selMoteur.hideChat();
25117 else showChatD();
25118}
25119
25120
25121moteurHTML.hideCoulApp = function () {
25122 $('.appelRoi').html('');
25123 $('.roleJoueur').html('');
25124 autoShowCRA();
25125}
25126function showCRA() {
25127 $('.CRA').css('position','static');
25128 $('.CRA').css('position','initial');
25129 $('.CRA').css('top','0px');
25130 resizeChat();
25131 autoShowCRA();
25132}
25133moteurHTML.showCoulApp = function (i,coulNum,txtTete) {
25134 $('.appelRoi').html('');
25135 $('#divJoueur'+i+' .appelRoi').html('<img src="/images/Couleurs
25135/'+txtTete+'.png?v=3" class="coulPren iconeStatut"><img src="/images/Couleurs/'+coulNum+'.png" class="coulPren iconeStatut">');
25136 showCRA();
25137 
25138}
25139
25140
25141
25142moteurHTML.clearMasques = function () {
25143 $('.masqueCarte').remove();
25144}
25145moteurHTML.clearMasque = function (id) {
25146 if ($$('masque'+id)==null) return;
25147 $$('monJeu').removeChild($$('masque'+id));
25148}
25149moteurHTML.addMasque = function (id,masque) {
25150 selMoteur.clearMasque(id);
25151 var img = document.createElement('img');
25152 img.style.cssText= $$(id).style.cssText;
25153 img.style.marginLeft = (-parseInt($$(id).style.marginRight)-$('#'+id.split('.').join('\\.')).width() )+'px';
25154 img.style.marginRight = (parseInt($$(id).style.marginRight))+'px';
25155 img.id = 'masque'+id;
25156 img.width = $('#'+id.split('.').join('\\.')).width();
25157 img.height = cardHeight;
25158 img.src = '/Jeu-Tarot-en-ligne/Masques/'+masque+'.gif';
25159 img.className='masqueCarte MasqueB cardJeu';
25160 img.onclick = function () { $('#'+id.split('.').join('\\.')).trigger('click'); };
25161 
25162 $('#'+id.split('.').join('\\.')).after(img);
25163}
25164
25165
25166
25167
25168moteurHTML.clearCardsActions = function (except)
25169{
25170 selMoteur.timeThatRemains(-1,0);
25171 $('.masqueCarte').remove();
25172 $('#tempsRestant').css('visibility','hidden');
25173 var cnt = $$('monJeu').childNodes;
25174 for (key in cnt) {
25175 if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id!=except && cnt[key].id.substr(0,6)=='MonJeu' ) 
25176 {    
25177  carteNeutre(cnt[key].id);
25178  //cnt[key].style.top = '0px';
25179  cnt[key].onclick = null;
25180  cnt[key].onmouseover = null;
25181 }
25182 }
25183 //unzoomPalteau ();
25184}
25185moteurHTML.clearCards = function ()
25186{   
25187 lastJeuWidth = -1;
25188 moteurHTML.clearMessagePlateauJeu();
25189 $('#monJeu').css('padding-bottom','');
25190 //$$('monJeu').style.height='125px';
25191 selMoteur.timeThatRemains(-1,0);
25192
25193 
25194 $$('monJeu').innerHTML = '';
25195 cardsNum=0;
25196 //unzoomPalteau ();
25197 playSoundEffect('Casino Cards.mp3',true);
25198}
25199
25200
25201
25202moteurHTML.setGameMainMsg = function (txt) {
25203 $$('messagePlace').innerHTML = txt; 
25204}
25205
25206moteurHTML.reorganiseCartesReal = function (fromResize)
25207{ 
25208 //log('reorganiseCartes');
25209 if ($$('monJeu')==null) return;
25210
25211
25212 if ($(window).width()*1.2<$(window).height()) {
25213 $('#webBody').css('margin-top',25);
25214 } else {
25215 $('#webBody').css('margin-top','');
25216 }
25217 //if (fromResize==null) CheckSizeZoom();
25218
25219 if (lastTurnSel!==null) 
25220 selMoteur.setTurn(lastTurnSel);
25221 
25222
25223 
25224 var windowWidth = $("#monJeu").outerWidth()-32;
25225 var ccW = 90;
25226 if ($('.carteMain').width()) {
25227
25228 ccW = $('.carteMain').width();
25229 var numCartesJeu=0;
25230 var cnt = $$('monJeu').childNodes;
25231 for (key in cnt) { 
25232  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu')
25233  numCartesJeu++;
25234 } 
25235 
25236 var cptmp = 0;
25237 var numCarteLigne = numCartesJeu;
25238 var nbLigneCartes = 1;
25239 var spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
25240 while (spacingCards<35) {
25241 nbLigneCartes++;
25242 numCarteLigne = Math.ceil(numCartesJeu/nbLigneCartes);
25243 spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
25244
25245 }
25246 //llog('ccW'+ccW+'nbLigneCartes'+nbLigneCartes+'spacingCards'+spacingCards+'windowWidth'+windowWidth+'numCartesJeu'+numCartesJeu);
25247 
25248 cardsBestTop = 3;
25249 
25250 var isfuncsentResiz = false;
25251
25252 for (key in cnt) {         
25253  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu')
25254  { 
25255  var opt = '';
25256  if (cptmp%numCarteLigne == 0) opt = 'First';
25257  if (cptmp%numCarteLigne == numCarteLigne-1) opt = 'Last';
25258  if (cptmp == numCartesJeu-1) opt = 'Last';
25259  var endf = null;
25260  if (!isfuncsentResiz) {
25261  isfuncsentResiz = true;
25262  //console.log('resizeParam');
25263  endf = function () {resizeChat(); };
25264  }
25265  animateToWidth (cnt[key].id,spacingCards,ccW,opt,endf);
25266  //if (fromResize=='fromZomm') refreshCardBestTop (cnt[key].id);         
25267  cptmp++; 
25268  }
25269 } 
25270 }
25271 if (fromResize=='fromZomm') {
25272 reposPlayedCardsHTML();
25273 }
25274}
25275
25276//var lesCartesVontEtresRamassees = false; 
25277moteurHTML.ramassePoignee = function (joueur)
25278{
25279 //lesCartesVontEtresRamassees = true;
25280  
25281 for (var m=0;m<6;m++)
25282 {
25283 if ($$('newOne'+m)!=null)
25284  $$('newOne'+m).id = 'ramasse'+m ;
25285 }
25286 cartesSurLeTapis = new Array();
25287 setTimeout(function () { ramasseCartesHTML2(joueur); },500);
25288}
25289
25290
25291var posRamassC = new Array (20,101,222,343);
25292
25293moteurHTML.cartePoigneeSelectInit = function (cardName) {
25294 cartePoigneeSelect($$(cardName));
25295}
25296
25297function ramasseCartesHTML2 (joueur)
25298{      
25299 for (var m=0;m<6;m++)
25300 { 
25301 if ($$('ramasse'+m)!=null)
25302 {
25303 $('#ramasse'+m).addClass('rammass');
25304  var obj = getDistance('ramasse'+m,"divJoueur"+joueur); 
25305  var distx = carteEpos(joueur);
25306  
25307  if ($$('ramasse'+m).alt.split('6_Excuse').length<2)
25308  animateId ('ramasse'+m,distx,null)
25309
25310  $$('ramasse'+m).style.marginLeft='0px';
25311  if (m==joueur)
25312  $$('ramasse'+m).style.zIndex='100';
25313 }
25314 }
25315 playSoundEffect('card move sound.mp3',true);
25316 setTimeout(function () { finRamasseCartesHTML(joueur); } ,700); 
25317}
25318function finRamasseCartesHTML (joueur)
25319{
25320 for (var m=0;m<6;m++)
25321 {
25322 $('#ramasse'+m).removeClass('rammass');
25323 if ($$('ramasse'+m)!=null){
25324 if (typeof dosDesCartes !=='undefined')
25325  $$('ramasse'+m).src = imgPresJSprocess(dosDesCartes); 
25326 else if (typeof versoCarteHR !=='undefined')
25327  $$('ramasse'+m).src = imgPresJSprocess(versoCarteHR); 
25328 else
25329  $$('ramasse'+m).src = versoCarte; 
25330 }
25331 }    
25332 setTimeout(function () { finRamasseCartesHTML2(); } ,600); 
25333}
25334var cptLeveesCartes = 0;
25335function finRamasseCartesHTML2 ()
25336{
25337 for (var m=0;m<6;m++)
25338 { 
25339 if ($$('ramasse'+m)!=null)
25340 { 
25341  $$('monJeu').removeChild($$('ramasse'+m));
25342 }
25343 } 
25344 zindexTop = 10;     
25345 
25346} 
25347
25348
25349
25350function decodeChatLineHTML(txt) {
25351 //$pseudo,$line,$date,$idUtil
25352 var tmp = unescape(txt.split('+').join(' ')).split('#');
25353 var res = tmp[0]+": "+tmp[1]+' <font style="font-size:0.9em;opacity:0.5;">'+tmp[2]+'';
25354 if (tmp[4])
25355 res += tmp[4];
25356 res += "</font>";
25357 return res;
25358}
25359
25360
25361
25362var moteurHTML2 = {};
25363moteurHTML2.titreMoteur = 'HTML NEW';
25364
25365
25366// Conseil ponctuel envoye au joueur administrateur ou soutien.
25367moteurHTML2.hideIaCardAdvice = function () {
25368 var advice = moteurHTML2.iaCardAdvice;
25369 if (!advice) return;
25370 clearTimeout(advice.timer);
25371 clearTimeout(advice.positionTimer);
25372 $(advice.card).removeClass('iaCardAdviceTarget');
25373 var describedBy = (advice.card.getAttribute('aria-describedby') || '').split(/\s+/).filter(function (id) { return id && id!='iaCardAdvice'; }).join(' ');
25374 if (describedBy) advice.card.setAttribute('aria-describedby',describedBy);
25375 else advice.card.removeAttribute('aria-describedby');
25376 if (advice.bubble.parentNode) advice.bubble.parentNode.removeChild(advice.bubble);
25377 moteurHTML2.iaCardAdvice = null;
25378};
25379
25380moteurHTML2.iaCardAdviceDisabled = function () {
25381 return /(?:^|;\s*)tarotIaAdviceHidden=1(?:;|$)/.test(document.cookie);
25382};
25383
25384moteurHTML2.showIaCardAdvice = function (name, reason, facts) {
25385 moteurHTML2.hideIaCardAdvice();
25386 if (typeof selMoteur=='undefined' || selMoteur!==moteurHTML2 || moteurHTML2.iaCardAdviceDisabled()) return;
25387 var card = $$('MonJeu'+name);
25388 var hand = $$('monJeu');
25389 if (!card || !hand || !hand.contains(card)) return;
25390 reason = typeof reason=='string' ? reason.replace(/^\s+|\s+$/g,'') : '';
25391 facts = Array.isArray(facts) ? facts.filter(function (fact) { return typeof fact=='string' && fact.replace(/\s/g,'')!=''; }).slice(0,3) : [];
25392 var bubble = document.createElement('div');
25393 bubble.id = 'iaCardAdvice';
25394 bubble.className = 'iaCardAdvice';
25395 bubble.setAttribute('role','group');
25396 bubble.setAttribute('aria-labelledby','iaCardAdviceTitle');
25397 bubble.setAttribute('tabindex','0');
25398 var body = document.createElement('div');
25399 body.className = 'iaCardAdvice__body';
25400 body.title = 'Cliquer pour fermer';
25401 bubble.onclick = function (event) {
25402 if (event) event.stopPropagation();
25403 moteurHTML2.hideIaCardAdvice();
25404 };
25405 bubble.onkeydown = function (event) {
25406 if ((event.keyCode || event.which)==27) {
25407 event.preventDefault();
25408 event.stopPropagation();
25409 moteurHTML2.hideIaCardAdvice();
25410 return false;
25411 }
25412 if (event.target!==this) return true;
25413 return moteurHTML2.activateKeyboardControl(event,this);
25414 };
25415 var cardLabel = moteurHTML2.getAccessibleCardName(name);
25416 var avatar = document.createElement('img');
25417 avatar.className = 'iaCardAdvice__avatar';
25418 avatar.src = '/avatars/processed/IAClassiqueV2-cropExact-72x48.jpg';
25419 avatar.alt = 'IA';
25420 body.appendChild(avatar);
25421 var content = document.createElement('div');
25422 content.className = 'iaCardAdvice__content';
25423 var benefit = document.createElement('small');
25424 benefit.className = 'iaCardAdvice__benefit';
25425 benefit.appendChild(document.createTextNode('Avantage soutien'));
25426 content.appendChild(benefit);
25427 var title = document.createElement('strong');
25428 title.id = 'iaCardAdviceTitle';
25429 title.appendChild(document.createTextNode("J'aurais choisi "+cardLabel));
25430 content.appendChild(title);
25431 if (reason) {
25432 var explanation = document.createElement('div');
25433 explanation.className = 'iaCardAdvice__reason';
25434 explanation.appendChild(document.createTextNode(reason));
25435 content.appendChild(explanation);
25436 }
25437 if (facts.length) {
25438 var context = document.createElement('div');
25439 context.className = 'iaCardAdvice__context';
25440 var heading = document.createElement('span');
25441 heading.appendChild(document.createTextNode('Avant votre coup'));
25442 context.appendChild(heading);
25443 var list = document.createElement('ul');
25444 for (var i=0;i<facts.length;i++) {
25445 var item = document.createElement('li');
25446 item.appendChild(document.createTextNode(facts[i]));
25447 list.appendChild(item);
25448 }
25449 context.appendChild(list);
25450 content.appendChild(context);
25451 }
25452 body.appendChild(content);
25453 var miniature = document.createElement('img');
25454 miniature.className = 'iaCardAdvice__card';
25455 miniature.src = card.currentSrc || card.src;
25456 miniature.alt = cardLabel;
25457 miniature.draggable = false;
25458 body.appendChild(miniature);
25459 bubble.appendChild(body);
25460 var preference = document.createElement('button');
25461 preference.type = 'button';
25462 preference.id = 'iaCardAdviceDisable';
25463 preference.className = 'iaCardAdvice__preference';
25464 var preferenceIcon = document.createElementNS('http://www.w3.org/2000/svg','svg');
25465 preferenceIcon.setAttribute('viewBox','0 0 24 24');
25466 preferenceIcon.setAttribute('class','iaCardAdvice__preferenceIcon');
25467 preferenceIcon.setAttribute('aria-hidden','true');
25468 preferenceIcon.setAttribute('focusable','false');
25469 var iconPath = document.createElementNS('http://www.w3.org/2000/svg','path');
25470 iconPath.setAttribute('d','M3 3l18 18M10.6 10.6a2 2 0 0 0 2.8 2.8M9.9 5.2A11 11 0 0 1 12 5c7 0 10 7 10 7a16 16 0 0 1-3.1 4.1M6.5 6.5A17 17 0 0 0 2 12s3 7 10 7a11 11 0 0 0 5.5-1.5');
25471 preferenceIcon.appendChild(iconPath);
25472 preference.appendChild(preferenceIcon);
25473 var preferenceLabel = document.createElement('span');
25474 preferenceLabel.appendChild(document.createTextNode('Ne plus afficher ces conseils'));
25475 preference.appendChild(preferenceLabel);
25476 preference.onclick = function (event) {
25477 event.stopPropagation();
25478 var currentAdvice = moteurHTML2.iaCardAdvice;
25479 if (!currentAdvice || this.disabled) return;
25480 clearTimeout(currentAdvice.timer);
25481 preference.disabled = true;
25482 confirme('Ne plus afficher les conseils de jeu de l\u2019IA sur ce navigateur ?',function () {
25483 document.cookie = 'tarotIaAdviceHidden=1; Max-Age=31536000; Path=/; SameSite=Lax'+(location.protocol==='https:' ? '; Secure' : '');
25484 moteurHTML2.hideIaCardAdvice();
25485 },function () {
25486 preference.disabled = false;
25487 if (moteurHTML2.iaCardAdvice===currentAdvice) {
25488 currentAdvice.timer = setTimeout(moteurHTML2.hideIaCardAdvice,currentAdvice.duration);
25489 preference.focus();
25490 }
25491 });
25492 };
25493 bubble.appendChild(preference);
25494 var arrow = document.createElement('span');
25495 arrow.className = 'iaCardAdvice__arrow';
25496 arrow.setAttribute('aria-hidden','true');
25497 bubble.appendChild(arrow);
25498 document.body.appendChild(bubble);
25499 $(card).addClass('iaCardAdviceTarget');
25500 card.setAttribute('aria-describedby',((card.getAttribute('aria-describedby') || '')+' iaCardAdvice').replace(/^\s+/,''));
25501 var advice = {card:card,bubble:bubble,duration:facts.length ? 15000 : (reason ? 10000 : 6000)};
25502 moteurHTML2.iaCardAdvice = advice;
25503 // Suivre les animations et le defilement sans changer la main ni ses clics.
25504 function position() {
25505 if (moteurHTML2.iaCardAdvice!==advice) return;
25506 if (selMoteur!==moteurHTML2 || $$('MonJeu'+name)!==card || !document.documentElement.contains(card)) {
25507 moteurHTML2.hideIaCardAdvice();
25508 return;
25509 }
25510 var rect = card.getBoundingClientRect();
25511 if (!rect.width || !rect.height) { moteurHTML2.hideIaCardAdvice(); return; }
25512 var viewport = document.documentElement.clientWidth;
25513 var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
25514 body.style.maxHeight = Math.max(60,viewportHeight-preference.offsetHeight-48)+'px';
25515 var center = rect.left+rect.width/2;
25516 var left = Math.max(8,Math.min(center-bubble.offsetWidth/2,viewport-bubble.offsetWidth-8));
25517 bubble.style.left = left+'px';
25518 var top = rect.bottom+9;
25519 var above = top+bubble.offsetHeight>viewportHeight-8;
25520 if (above) top = Math.max(8,rect.top-bubble.offsetHeight-9);
25521 $(bubble).toggleClass('iaCardAdvice--above',above);
25522 bubble.style.top = top+'px';
25523 arrow.style.left = Math.max(12,Math.min(center-left,bubble.offsetWidth-12))+'px';
25524 advice.positionTimer = setTimeout(position,40);
25525 }
25526 position();
25527 if (moteurHTML2.iaCardAdvice!==advice) return;
25528 advice.timer = setTimeout(moteurHTML2.hideIaCardAdvice,advice.duration);
25529 var announcement = document.createElement('div');
25530 announcement.appendChild(document.createTextNode("IA : j'aurais choisi "+cardLabel+(reason ? '. '+reason : '')+(facts.length ? '. Avant votre coup : '+facts.join(' ') : '')));
25531 moteurHTML2.announce(announcement.innerHTML,false);
25532};
25533
25534moteurHTML2.initEngine = function (endFunc) {
25535 endFunc();
25536}
25537
25538moteurHTML2.hasCardHand = function (name)
25539{ 
25540 return $$(name)==null;
25541}
25542
25543moteurHTML2.activateKeyboardControl = function (event, element)
25544{
25545 event = event || window.event;
25546 var keyCode = event.keyCode || event.which;
25547 if (keyCode!=13 && keyCode!=32) return true;
25548
25549 if (event.preventDefault) event.preventDefault();
25550 else event.returnValue = false;
25551 if (event.stopPropagation) event.stopPropagation();
25552 else event.cancelBubble = true;
25553
25554 if (element && typeof element.click=='function')
25555 element.click();
25556 else if (element && typeof element.onclick=='function')
25557 element.onclick();
25558 return false;
25559}
25560
25561moteurHTML2.updateSoundButtonState = function ()
25562{
25563 var soundButton = $$('muteBtn');
25564 if (!soundButton) return;
25565 soundButton.setAttribute('aria-pressed',gameSoundsEnabled?'true':'false');
25566}
25567
25568moteurHTML2.getAccessibleText = function (value)
25569{
25570 var container = document.createElement('div');
25571 container.innerHTML = value==null?'':String(value);
25572 var text = typeof container.textContent!='undefined'?container.textContent:container.innerText;
25573 return String(text || '').replace(/\s+/g,' ').replace(/^\s+|\s+$/g,'');
25574}
25575
25576moteurHTML2.getAccessibleCardName = function (card)
25577{
25578 var originalName = moteurHTML2.getAccessibleText(card);
25579 var fileName = originalName.replace(/^.*[\\\/]/,'').replace(/[?#].*$/,'');
25580 var typeMatch = /^([1-6])_/.exec(fileName);
25581 if (!typeMatch) return originalName;
25582
25583 var cardType = parseInt(typeMatch[1],10);
25584 if (cardType==6) return "l'excuse";
25585
25586 var valueMatch = /-0*([0-9]+)(?:\.[^.]+)?$/.exec(fileName);
25587 if (!valueMatch) return originalName;
25588
25589 var cardValue = parseInt(valueMatch[1],10);
25590 if (cardType==5)
25591 return cardValue==1 ? 'le petit' : "le "+cardValue+" d'atout";
25592
25593 var colors = {
25594 1: 'coeur',
25595 2: 'trèfle',
25596 3: 'carreau',
25597 4: 'pique'
25598 };
25599 var figures = {
25600 11: 'un valet',
25601 12: 'un cavalier',
25602 13: 'une dame',
25603 14: 'un roi'
25604 };
25605 var color = colors[cardType];
25606 if (!color) return originalName;
25607 if (cardValue==1) return 'un as de '+color;
25608 if (figures[cardValue]) return figures[cardValue]+' de '+color;
25609 return 'un '+cardValue+' de '+color;
25610}
25611
25612moteurHTML2.announce = function (message,urgent)
25613{
25614 var region = $$(urgent?'gameUrgentAnnouncements':'gameAnnouncements');
25615 var text = moteurHTML2.getAccessibleText(message);
25616 if (!region || text=='') return;
25617
25618 region.innerHTML = '';
25619 region.tarotAnnouncementId = (region.tarotAnnouncementId || 0)+1;
25620 var announcementId = region.tarotAnnouncementId;
25621 setTimeout(function () {
25622 if (!region.parentNode || region.tarotAnnouncementId!=announcementId) return;
25623 region.appendChild(document.createTextNode(text));
25624 },20);
25625}
25626
25627moteurHTML2.actionAnnouncementTimer = null;
25628moteurHTML2.scheduleActionsAnnouncement = function ()
25629{
25630 clearTimeout(moteurHTML2.actionAnnouncementTimer);
25631 moteurHTML2.actionAnnouncementTimer = setTimeout(function () {
25632 var actions = [];
25633 $('#infosJeuActions a').each(function () {
25634 var label = moteurHTML2.getAccessibleText(this.innerHTML);
25635 if (label!='') actions.push(label);
25636 });
25637 if (actions.length>0)
25638 moteurHTML2.announce('Actions disponibles : '+actions.join(', '),false);
25639 },80);
25640}
25641
25642moteurHTML2.getPlayerName = function (num)
25643{
25644 var name = $('#spanJoueur'+num).data('myuser');
25645 if (!name || name=='Vide' || name=='Libre')
25646 return 'Joueur '+(parseInt(num,10)+1);
25647 return moteurHTML2.getAccessibleText(name);
25648}
25649
25650moteurHTML2.lastPlayerAnnouncements = {};
25651moteurHTML2.announcePlayerState = function (num,state)
25652{
25653 var text = moteurHTML2.getAccessibleText(state);
25654 if (text=='') {
25655 moteurHTML2.lastPlayerAnnouncements[num] = '';
25656 return;
25657 }
25658 if (moteurHTML2.lastPlayerAnnouncements[num]==text) return;
25659 moteurHTML2.lastPlayerAnnouncements[num] = text;
25660 moteurHTML2.announce(moteurHTML2.getPlayerName(num)+' : '+text,false);
25661}
25662
25663moteurHTML2.getActionMessageStyleClass = function ()
25664{
25665 var styles = ['ribbon','nature','underline','rainbow','double','goldline','woodline','sage','terracotta','ocean','nightgold','parchment','neon','tricolor','sunset','lavender','emerald','dotted','dashed','softshadow','tarot','meadow','glass','bronze','corner'];
25666 var style = parseInt(window.tarotGameActionMessageStyle,10);
25667 if (isNaN(style) || style<0 || style>=styles.length) style = 2;
25668 if (style===0) return 'gameActionMessage--ribbon';
25669 return 'gameActionMessage gameActionMessage--'+styles[style];
25670}
25671
25672moteurHTML2.createGameBoard = function (modeJeu,chatJoueurs,nbJoueurs,etesVousLa,smileyOnly)
25673{
25674 moteurHTML2.chatJoueurs = chatJoueurs!=0;
25675
25676 var jeuDiv = document.createElement('div');
25677 jeuDiv.id = 'Jeu';
25678 jeuDiv.setAttribute('role','main');
25679 jeuDiv.setAttribute('aria-label','Partie de tarot');
25680 jeuDiv.setAttribute('tabindex','-1');
25681 jeuDiv.style.outline = 'none';
25682 
25683 
25684 var equipeHTML = '<div id="gameAnnouncements" class="sr-only" role="status" aria-live="polite" aria-atomic="true"></div>';
25685 equipeHTML += '<div id="gameUrgentAnnouncements" class="sr-only" role="alert" aria-live="assertive" aria-atomic="true"></div>';
25686 equipeHTML += '<div id="divJoueurs" role="region" aria-label="Joueurs">';
25687 
25688 for (i=0;i<nbJoueurs;i++)
25689 {
25690 equipeHTML += '<div class="jeuEquipier'+nbJoueurs+'j newRond'+nbJoueurs+'j divJoueursDiv newRondEquipier" onclick="showJoueurDetails(this);" id="divJoueur'+i+'">';
25691 //equipeHTML += '<div class="pseudo'+nbJoueurs+'j pseudoJTxt" id="spanJoueur'+i+'"></div>';
25692 equipeHTML += '<div class="joueurCnterRond" id="spanJoueur'+i+'">'; 
25693 //equipeHTML += '<span class="scoreJD" id="spanScoreJoueur'+i+'"></span>'; 
25694 //equipeHTML += '<div class="infJdiv">'; 
25695 //equipeHTML += '<div class="fstLinEq">'; 
25696 //equipeHTML += '</div>'; 
25697 //equipeHTML += '<div class="gradesJ"></div>'; 
25698 //equipeHTML += '<div id="avatJE">';
25699 equipeHTML += '<img class="imgRDeq" id="joueur'+i+'" src="/img/Jeu/EquipierVide2.png" alt="">';
25700 //equipeHTML += '</div>';        
25701 //equipeHTML += '</div>';
25702 //equipeHTML += '<div class="clear"></div>';        
25703 equipeHTML += '</div>';
25704 
25705 /*
25706 equipeHTML += '<div id="infJE" class="infosJcomp equipierTaille ToproleAnnonce">'; 
25707 equipeHTML += '<div class="CRA">'; 
25708 equipeHTML += '<img id="j'+i+'_do" class="donneurIcon iconeStatut" src="/images/icones/donneur.png?v=2" title="Ce joueur est donneur"/>'; 
25709 equipeHTML += '<span class="appelRoi" title="Couleur d\'atout"></span>';
25710 equipeHTML += '<span id="j'+i+'_state_0_1" class="absentJoueur iconeStatut" title="Ce joueur est absent"></span>';
25711 equipeHTML += '<div id="roleJoueur'+i+'" class="roleJoueur"></div>'; 
25712 equipeHTML += '</div>'; 
25713  
25714 equipeHTML += '</div>'; */      
25715 equipeHTML += '</div>';  
25716 }
25717 equipeHTML += '</div>'; 
25718 equipeHTML += '<div class="clear"></div>';  
25719 equipeHTML += '<h1 id="messagePlace" class="'+moteurHTML2.getActionMessageStyleClass()+' gameActionMessage--empty" tabindex="-1" role="status" aria-live="polite" aria-atomic="true"></h1>';  
25720 equipeHTML += '<div id="tempsRestant" style="display:none" class="progressBar" role="progressbar" aria-label="Temps restant pour jouer" aria-valuemin="0" aria-valuemax="1" aria-valuenow="0" aria-valuetext="Chronom&egrave;tre arr&ecirc;t&eacute;"><div aria-hidden="true">&nbsp;</div></div>'; 
25721 equipeHTML += '<span id="tempsRestantTexte" class="sr-only" role="timer" aria-live="off" aria-hidden="true">Chronom&egrave;tre arr&ecirc;t&eacute;</span>';
25722 equipeHTML += '<div id="monJeu" role="region" aria-label="Votre main et pli en cours"></div>'; 
25723 equipeHTML += '<div id="messagePlateauJeu" role="region" aria-label="Informations de la partie"></div>';
25724 
25725 equipeHTML += '<div id="infosJeu" >';
25726 equipeHTML += '<div id="infosJeuActions" role="region" aria-label="Actions disponibles">'; 
25727 equipeHTML += '</div>';
25728 equipeHTML += '<div id="infosJeuInfo" role="region" aria-label="Informations de jeu">'; 
25729 equipeHTML += '</div>'; 
25730 equipeHTML += '</div>';
25731 if (chatJoueurs!=0 && !smileyOnly) {
25732 equipeHTML += getChatHTML('<u>Conversation</u>');
25733 } //else {
25734
25735 if (modeJeu!='Premium4' && modeJeu!='Premium5')
25736 equipeHTML += '<div class="clear"></div><div id="fuse-ad-22678250563" data-fuse="game_mrec"></div>';
25737 //}
25738 
25739 
25740 equipeHTML += '<div id="bottomGame">';
25741 
25742 
25743 equipeHTML += '<div class="clear"></div>';
25744 equipeHTML += '<div id="chatBg" style="padding:1px;">'; 
25745 equipeHTML += '<table style="" id="chatTable">'; 
25746 equipeHTML += '<tr>'; 
25747 if (chatJoueurs!=0 && !window.disableEmoticons) {
25748 equipeHTML += '<td onclick="toggleEmot();" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);" id="IMGEMOT" class="gameKeyboardControl" role="button" tabindex="0" aria-label="Afficher les &eacute;motic&ocirc;nes" aria-controls="chtput" title="&Eacute;motic&ocirc;nes" style="background-image: url(\'/images/Emoticon/Emoticon0.png?v=4\');"></td>'; 
25749 } 
25750 equipeHTML += '<td style="padding-left:4px" id="chtput">';  
25751 
25752 /*
25753 equipeHTML += '<table style="" id="chatTable">';  
25754 equipeHTML += '<tr><td style="padding-left:4px">'; */  
25755
25756 if (chatJoueurs!=0 ) {
25757 equipeHTML += '<label class="sr-only" for="chatInput">Message &agrave; envoyer dans le chat</label>';
25758 if (!smileyOnly)
25759 equipeHTML += '<input id="chatInput" autocomplete="off" onfocus="showChatD();" onclick="showChatD();" maxlength="255" type="text">';
25760 else
25761 equipeHTML += '<input id="chatInput" disabled="disabled" value="'+smileyOnly+'" type="text">';
25762 }
25763 
25764 equipeHTML += '</td><td id="actBtnsJ" style="">'; 
25765 if (chatJoueurs!=0 && !smileyOnly)
25766 equipeHTML += '<a id="chatInputBtn" class="btn btn-default btn-bottomGame gameKeyboardControl" role="button" tabindex="0" title="Envoyer le message" onclick="sendChatMessage($$(\'chatInput\').value);" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);">Dire</a>'; 
25767 equipeHTML += '</td><td id="IMGMJB" data-mode-jeu="'+modeJeu+'" class="gameKeyboardControl" role="button" tabindex="0" aria-label="Afficher les r&egrave;gles de ce mode de jeu" onclick="ouvrirReglesModeJeu(this.getAttribute(&quot;data-mode-jeu&quot;));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute(&quot;data-mode-jeu&quot;));" title="R&egrave;gles - '+getGameName(modeJeu)+'" style="background-image: url(\''+getModeJeuIcone(modeJeu)+'\');">'; 
25768 if (document.getElementById('soundEnabled') && document.getElementById('soundEnabled').value=='1') {
25769 equipeHTML += '</td><td id="muteBtn" class="gameKeyboardControl" role="button" tabindex="0" aria-label="Son" aria-pressed="true" title="Activer/D&eacute;sactiver le son" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);" style="background-image: url(\'/Jeu-Tarot-en-ligne/Jeu/mute.png\');">';
25770 } 
25771 equipeHTML += '</td><td id="quitTD"><a style="margin-left:4px;margin-right:14px;" id="BTNQUT" class="btn btn-warning btn-bottomGame" onclick="btnQuitAction();">Quitter</a>';   
25772 equipeHTML += '</td></tr></table>';   
25773 
25774 equipeHTML += '</div>'; 
25775 equipeHTML += '</div>';
25776 equipeHTML += '<div class="clear"></div>'; 
25777 equipeHTML += '<input type="hidden" id="modeJeuSalon" value="'+modeJeu+'"/> ';
25778 jeuDiv.innerHTML = equipeHTML;
25779 $('#webBody').html('');
25780 $('#webBody').append(jeuDiv);
25781 jeuDiv.focus();
25782 
25783
25784 try {
25785 const fusetag = window.fusetag || (window.fusetag = { que: [] });
25786 fusetag.que.push(function () {
25787 fusetag.destroyZone('bottom_mrec');
25788 });
25789 fusetag.que.push(function () {
25790 fusetag.destroyZone('Header_MREC');
25791 });
25792 fusetag.que.push(function () {
25793 fusetag.destroyZone('Sidear_HREC');
25794 });
25795 fusetag.que.push(function () {
25796  if (modeJeu=='Premium4' || modeJeu=='Premium5') return;
25797  fusetag.pageInit({ forceReset: true });
25798  fusetag.registerZone('fuse-ad-22678250563');
25799 });
25800 } catch (e) {
25801 
25802 }
25803 
25804 $('#muteBtn').click(function () {
25805 toggleSound();
25806 moteurHTML2.updateSoundButtonState();
25807 });
25808 if (gcookie('muteMusic')=='1') { gameSoundsEnabled=true;toggleSound(); }
25809 moteurHTML2.updateSoundButtonState();
25810
25811 var scrollFix = document.createElement('div');
25812 scrollFix.id = 'scrollFix';
25813 $('#webBody').append(scrollFix);
25814 
25815 if (chatJoueurs!=0 && !smileyOnly) {
25816 resetChatInputValidationKeys();
25817 }
25818 if (smileyOnly===true) {
25819 toggleEmot();
25820 window.isSmileyOnly = true;
25821 $('#IMGEMOT').hide();
25822 }
25823 window.scroll(0,0);
25824}
25825
25826
25827moteurHTML2.introAction = function ()
25828{ 
25829}
25830
25831
25832var tempoChatHTML = '';
25833moteurHTML2.tempoAddChatLine = function (str)
25834{
25835 if (moteurHTML2.chatJoueurs===false) return;
25836 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return; 
25837 tempoChatHTML += "<br />"+decodeChatLineHTML(str);
25838}
25839
25840moteurHTML2.flushChatLine = function ()
25841{ 
25842 if (moteurHTML2.chatJoueurs===false) return;
25843 if ( $$('chat')==null) return;
25844 $$('chat').innerHTML += tempoChatHTML;
25845 moteurHTML2.announce('Conversation : '+tempoChatHTML,false);
25846 tempoChatHTML = ''; 
25847 $$('chat').scrollTop= $$('chat').scrollHeight;
25848}
25849
25850
25851moteurHTML2.addChatLine = function (str)
25852{
25853 if (moteurHTML2.chatJoueurs===false) return;
25854 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return;
25855 var obj = decodeChatLineObj(str);
25856 var gameEmoticon = resolveGameEmoticon(obj[1]);
25857 if ( $$('chat') ) {
25858
25859 //log('addChatLine'+str);
25860 var chatLineHTML = decodeChatLineHTML(str);
25861 if (gameEmoticon && gameEmoticon.type==='collection')
25862 chatLineHTML = chatLineHTML.split(obj[1]).join('[Emoticone : '+gameEmoticon.nom+']');
25863 $$('chat').innerHTML += "<br />"+chatLineHTML;
25864 moteurHTML2.announce('Conversation : '+chatLineHTML,false);
25865 $$('chat').scrollTop= $$('chat').scrollHeight;
25866 }
25867
25868 $('.divJoueursDiv').each(function() {
25869 var numSX = parseInt(this.id.split('divJoueur').join(''));
25870 if ( this && this.id && $('#spanJoueur'+numSX).data('myuser')==obj[0] )
25871 selMoteur.showMessageJoueur(numSX,obj[1]);
25872 });
25873
25874 reorganiseCartes ();
25875}
25876
25877moteurHTML2.addCard = function (name, action)
25878{
25879 var srcI = getCardJSIMG(name);
25880 var accessibleName = moteurHTML2.getAccessibleCardName(name);
25881 var sizes = getPlayedCardSizeHTML2();
25882 //console.log('addcard',sizes);
25883 cardsNum++;
25884 if (action=='' || action==null )
25885 $$('monJeu').innerHTML += '<img class="carteMain cardJeu" id="MonJeu'+name+'" alt="'+accessibleName+'" data-card-name="'+name+'" onClick="'+action+'" height="239" width="130" src="'+srcI+'" style="position:relative;top:'+cardsBestTop+'px;margin-left:'+(-cardWidth/2)+'px;margin-right:'+(-cardWidth/2)+'px;">'; 
25886 else
25887 $$('monJeu').innerHTML += '<img class="carteMain cardJeu" id="MonJeu'+name+'" alt="'+accessibleName+'" data-card-name="'+name+'" onClick="'+action+'" height="239" width="130" src="'+srcI+'" style="cursor:pointer;position:absolute;top:'+(cardsBestTop)+'px;margin-left:'+(-cardWidth/2)+'px;margin-right:'+(-cardWidth/2)+'px;">'; //+i*20
25888} 
25889
25890moteurHTML2.getCards = function () {
25891 return $$('monJeu').childNodes;
25892}
25893
25894moteurHTML2.setCardAction = function (name, action)
25895{ 
25896 
25897 if ($$('MonJeu'+name)==null)
25898 return;
25899 if (action=='' || action==null)
25900 {
25901 $$('MonJeu'+name).onclick = null;
25902 carteNonSelectionnable('MonJeu'+name);
25903 $($$('MonJeu'+name)).css('cursor','');
25904 }
25905 else 
25906 {
25907 $$('MonJeu'+name).onclick = new Function(action) ; 
25908 $($$('MonJeu'+name)).css('cursor','pointer');
25909 }
25910} 
25911
25912
25913var lastUserEmpty = true;
25914
25915//var medaillesTypes = [ "Duplicate","Premium4","Premium5","Assiduite","Missions","Politesse","Banchat","Abandon"];
25916var rndMEED = Math.random();
25917moteurHTML2.refreshUtilisateur = function (num)
25918{ 
25919 ldWebfont();
25920 var annonce = 0;
25921 if ($('#spanJoueur'+num).data('annonce'))
25922 annonce = $('#spanJoueur'+num).data('annonce');
25923
25924 var appelC = 0;
25925 if ($('#spanJoueur'+num).data('appelC'))
25926 appelC = $('#spanJoueur'+num).data('appelC');
25927
25928 var appelN = 0;
25929 if ($('#spanJoueur'+num).data('appelN'))
25930 appelN = $('#spanJoueur'+num).data('appelN');
25931
25932 var otherInfos = '';
25933 if ($('#spanJoueur'+num).data('otherInfos'))
25934 otherInfos = $('#spanJoueur'+num).data('otherInfos');
25935 
25936 var connected = 0;
25937 if ($('#spanJoueur'+num).data('connected'))
25938 connected = $('#spanJoueur'+num).data('connected');
25939 
25940 var myuser = '';
25941 if ($('#spanJoueur'+num).data('myuser'))
25942 myuser = $('#spanJoueur'+num).data('myuser');
25943
25944 var annonceTxt = '';
25945 if ($('#spanJoueur'+num).data('annonceTxt'))
25946 annonceTxt = $('#spanJoueur'+num).data('annonceTxt');
25947
25948 var myScore = '';
25949 if ($('#spanJoueur'+num).data('myScore'))
25950 myScore = $('#spanJoueur'+num).data('myScore');
25951 
25952 var isDonneur = '0';
25953 if ($('#spanJoueur'+num).data('isDonneur'))
25954 isDonneur = $('#spanJoueur'+num).data('isDonneur');
25955 
25956 var isTourDeJeu = '0';
25957 if ($('#spanJoueur'+num).data('isTourDeJeu'))
25958 isTourDeJeu = $('#spanJoueur'+num).data('isTourDeJeu');
25959 
25960 var noMedals = '';
25961 if (phaserMedalsDisabled) {
25962 noMedals = 1;
25963 }
25964 
25965 var idJoueur = $('#spanJoueur'+num).data('idJoueur');
25966 var grade = $('#spanJoueur'+num).data('mygrade');
25967 var medailles = new Array();
25968 
25969 if (idJoueur>0) {
25970 var tabMed = grade.split('-');
25971 for (var o=0;o<tabMed.length;o++) {
25972 if (tabMed[o]=='FFT')
25973 medailles.push('FFT');
25974 else if (o<3)
25975 medailles.push(''+tabMed[o]+'&resizeToHeight=44&idJoueur='+idJoueur+'&v='+rndMEED);
25976 }
25977 } else {
25978 if (idJoueur<0 && /^IA(?:\s|$)/.test(myuser)) {
25979 if (!phaserMedalsDisabled) {
25980 medailles.push('IA&resizeToHeight=44&idJoueur=0&v='+rndMEED);
25981 }
25982 }
25983 else if (myuser=='Vide') {
25984 var d = new Date();
25985 if (d.getTime()>dateDebutPartie+30*1000)
25986 medailles.push('Add&resizeToHeight=44&idJoueur=0');
25987 else
25988 medailles.push('Wait&resizeToHeight=44&idJoueur=0');
25989 }
25990 
25991 }
25992 //console.log('createAvatar',num,myuser);
25993
25994 //endFunc,avatar,annonce,myScore,myuser,annonceTxt,connected,isTourDeJeu,isDonneur,appelC,appelN,noMedals
25995 createAvatar(function (res) { $('#joueur'+num).attr('src', res ); } , $('#divJoueur'+num).data("imgSrc") ,medailles,annonce, myScore , myuser , annonceTxt ,connected,isTourDeJeu!='0',isDonneur!='0',appelC,appelN,noMedals);
25996}
25997moteurHTML2.setUtilisateur = function (num,pseudo, avatar,score,connected,messagesJoueurs,grade,idJoueur)
25998{ 
25999 $('#spanJoueur'+num).data('idUtilisateur',parseInt(idJoueur,10));
26000 $('#divJoueur'+num).data('idUtilisateur',parseInt(idJoueur,10));
26001 $('#spanJoueur'+num).data('otherInfos','noJpeg=1'+'&idUtil='+idJoueur+'&avatar='+avatar );
26002 if (idJoueur<0 || pseudo=='Vide' || pseudo=='Libre')
26003 $('#spanJoueur'+num).data('connected',2 );
26004 else
26005 $('#spanJoueur'+num).data('connected',(connected?1:0) );
26006 $('#spanJoueur'+num).data('myuser',pseudo );
26007 $('#spanJoueur'+num).data('idJoueur',idJoueur );
26008 $('#spanJoueur'+num).data('mygrade',grade );
26009 //$(obj).data("imgSrc");
26010 if (pseudo!='Vide' && pseudo!='Libre')
26011 {  
26012 lastUserEmpty = false;       
26013 $('#spanJoueur'+num).css('cursor','pointer');
26014 }
26015 else
26016 { 
26017 lastUserEmpty = true; 
26018 $('#spanJoueur'+num).css('cursor','');
26019 }
26020
26021 var d = new Date();
26022
26023 if (pseudo=="Vide" )
26024 {
26025 $('#spanJoueur'+num).data('connected',2 );
26026 if (d.getTime()>dateDebutPartie+30*1000)
26027 {
26028  if ( $('#spanJoueur'+num).data('myuser' ) != 'Ajouter une IA') {
26029
26030  $('#spanJoueur'+num).data('myuser','Ajouter une IA' );
26031  $('#divJoueur'+num).data("idPos",num);
26032  $('#divJoueur'+num).data("imgSrc",avatar);
26033  $('#divJoueur'+num).data("pseudo",pseudo);
26034  //setScore (num,);    
26035  $('#spanJoueur'+num).css('cursor','pointer');
26036  }
26037 }
26038 else
26039 {
26040 if ( $('#spanJoueur'+num).data('myuser' ) != pseudo) {
26041 $('#spanJoueur'+num).data('myuser',pseudo);
26042 $('#spanJoueur'+num).css('cursor','');
26043 }
26044 }
26045 }
26046 else
26047 { 
26048 //$$('spanJoueur'+num).innerHTML = pseudo;
26049 $('#divJoueur'+num).data("imgSrc",avatar);
26050 $('#divJoueur'+num).data("pseudo",pseudo);
26051 $('#spanJoueur'+num).data('myuser',pseudo );
26052 }
26053 moteurHTML2.refreshUtilisateur(num);
26054 
26055 return; 
26056} 
26057
26058
26059 
26060moteurHTML2.masquerProfilUtilisateur = function (idUtilisateur)
26061{
26062 var avatarMasque = '/avatars/Blacklist.png';
26063 idUtilisateur = parseInt(idUtilisateur,10);
26064 for (var i=0;i<6;i++) {
26065 if (parseInt($('#spanJoueur'+i).data('idUtilisateur'),10)==idUtilisateur) {
26066 $('#divJoueur'+i).data('imgSrc',avatarMasque);
26067 $('#spanJoueur'+i).data('otherInfos','noJpeg=1&idUtil='+idUtilisateur+'&avatar='+avatarMasque);
26068 $('#joueur'+i).attr('src',avatarMasque);
26069 moteurHTML2.refreshUtilisateur(i);
26070 }
26071 }
26072}
26073
26074moteurHTML2.cartePreselect = function (obj,name) {
26075 notifyUserActivity();
26076 if (advanceCardPlayDisable) return;
26077 moteurHTML2.hideIaCardAdvice();
26078 if ($$('masque'+obj.id)!=null) {
26079
26080 rpcNoQueue('prochaineCarte=');
26081 $('.masqueCarte').remove();
26082 nextDelayIsNull = 0;
26083 } else {
26084
26085 if (shalAskForConfirmCardPlay || (name=='le petit' && shalAskForconfirmationPetit) ) {
26086 confirme('Etes-vous sûr de vouloir presélectionner '+name+' ?',function () {
26087  rpcNoQueue('prochaineCarte='+getCardName(obj));
26088  $('.masqueCarte').remove();
26089  carteSelectionnee(obj.id); 
26090  nextDelayIsNull = 1;
26091 });
26092 } else {
26093  rpcNoQueue('prochaineCarte='+getCardName(obj));
26094  $('.masqueCarte').remove();
26095  carteSelectionnee(obj.id); 
26096  nextDelayIsNull = 1;
26097 }
26098 
26099 }
26100}
26101
26102
26103   
26104var cchPlCz;
26105function getPlayedCardSizeHTML2() {
26106 if (cchPlCz) return cchPlCz;
26107 var cardWidth;
26108 if ($(window).width()<978 || true) {
26109 var cardHeight = $('.joueurCnterRond').outerHeight();//$('.roleJoueur').offset().top-$('#divJoueur0 .joueurCnterRond').offset().top;
26110 cardWidth = cardHeight*70/129;
26111 if (cardWidth > $('.divJoueursDiv').outerWidth())
26112 cardWidth = $('.divJoueursDiv').outerWidth();
26113 } else {
26114 cardWidth = $('.divJoueursDiv').outerWidth();
26115 }
26116 if (cardWidth>120)
26117 cardWidth = 120;
26118 if ($(window).width()<600) {
26119
26120 if (cardWidth<65)
26121 cardWidth = 65;
26122 } else {
26123
26124 if (cardWidth<75)
26125 cardWidth = 75;
26126 }
26127 cchPlCz = {w:cardWidth,h:cardWidth*129/70};
26128 return cchPlCz;
26129} 
26130
26131
26132function carteEpos2 (num) {
26133 if ($(window).width()<=600) {
26134
26135 var sizeCard = getPlayedCardSizeHTML2();
26136 var oneWidth = $('#divJoueur0').width();
26137
26138 var newPos = $('#divJoueur'+num).offset().left-$('#monJeu').offset().left+oneWidth-sizeCard.w-2;//;
26139 return newPos;
26140 }
26141 var sizeCard = getPlayedCardSizeHTML2();
26142 var oneWidth = $('#divJoueur0').width();
26143
26144 var newPos = $('#divJoueur'+num).offset().left-$('#monJeu').offset().left+oneWidth-sizeCard.w-2;//;
26145 //var newPos = oneWidth+$('#divJoueur0').offset().left-sizeCard.w;//-($('#divJoueur0').width()-$('.joueurCnterRond').width())/2+1+$('#divJoueur0').offset().left;
26146
26147 //newPos += oneWidth*num;
26148 return newPos;//-parseInt($('#monJeu').css('margin-left'));
26149}
26150
26151
26152function getCardPlayerTop2(num) {
26153 var sizeCard = getPlayedCardSizeHTML2();
26154 var topO = $('#spanJoueur'+num).offset().top-$('#monJeu').offset().top;
26155 
26156 if (sizeCard.h>$('#spanJoueur'+num).outerHeight())
26157 topO -= (sizeCard.h-$('#spanJoueur'+num).outerHeight() )/2;//;
26158 
26159 return topO;
26160}
26161
26162function reposPlayedCardsHTML2() {
26163 $('.cartesTapis').each(function() {
26164 if (!$(this).hasClass('rammass')) {
26165 var topO = getCardPlayerTop2( $(this).data('pos') );//$(this).offset().top;//
26166 animateIdHTML2 (this.id,carteEpos2($(this).data('pos')),topO);
26167 }
26168 });
26169}
26170 
26171var cartesSurLeTapis = new Array();
26172
26173moteurHTML2.playOppCard = function (name,opp)
26174{
26175 var topO = getCardPlayerTop2(opp);
26176 var ccW = getPlayedCardSizeHTML2().w;
26177 // c'est une carte a moi qui est jouee
26178 if (opp==whoamiNum && $$('MonJeu'+name)!=null)
26179 {
26180 moteurHTML2.announce(moteurHTML2.getPlayerName(opp)+' joue '+moteurHTML2.getAccessibleCardName(name),false);
26181 $('.masqueCarte').remove();
26182 //clearCardsActions (); 
26183 var myPlayedCard = $$('MonJeu'+name);//MonJeu4_Pique-03.gif
26184 //if (myPlayedCard==null) alert('bug');
26185 cartesSurLeTapis[whoamiNum] = name;
26186 myPlayedCard.style.zIndex=zindexTop;
26187 zindexTop++;          
26188 myPlayedCard.id = 'newOne'+whoamiNum;
26189 myPlayedCard.onclick=null;
26190 myPlayedCard.removeAttribute('onclick');
26191 myPlayedCard.setAttribute('data-card-action-state','disabled');
26192 myPlayedCard.removeAttribute('data-card-clickable');
26193 myPlayedCard.setAttribute('tabindex','0');
26194 myPlayedCard.setAttribute('role','img');
26195 myPlayedCard.setAttribute('aria-label','Carte sur le plateau : '+moteurHTML2.getAccessibleCardName(name));
26196 $(myPlayedCard).removeClass('carteMain');
26197 
26198 $( myPlayedCard ).animate({
26199  marginLeft: (-ccW/2)+"px",
26200  marginRight: (-ccW/2)+"px",
26201  marginTop: (parseInt($( myPlayedCard ).css('margin-top'))-30)+"px"
26202  },200,function() { 
26203  var $monjeu = $('#monJeu');
26204  var windowWidth = $monjeu.outerWidth()-32;
26205  var wi = 130,hi=239;
26206  if (windowWidth<600) {
26207  wi = 105;
26208  hi = 239*105/130;
26209  }
26210  
26211  var offs = $(myPlayedCard).offset();
26212  var sty = 'position:absolute;';
26213  sty += 'top:'+(offs.top+0*parseInt(myPlayedCard.style.marginTop)-$('#monJeu').offset().top)+'px;';
26214  sty += 'left:'+(offs.left+0*parseInt(myPlayedCard.style.marginLeft)-$('#monJeu').offset().left)+'px;';
26215  sty += 'margin-left:0px;';
26216  sty += 'margin-right:0px;';
26217  sty += 'margin-top:0px;';
26218  sty += 'z-index:99;width:'+wi+'px;height:'+hi+'px;';
26219  myPlayedCard.setAttribute('style',sty);
26220
26221  animateIdHTML2 (myPlayedCard.id,carteEpos2(whoamiNum),topO);
26222
26223  $(myPlayedCard).data('pos',opp);
26224  $(myPlayedCard).addClass('cartesTapis');
26225 
26226  reorganiseCartes ();
26227
26228  playSoundEffect('CardPlaced.mp3',true);
26229  } ); 
26230 lastMO = null;
26231 
26232 return;
26233 }
26234 if (opp==null) 
26235 {
26236 opp=lastOpp;
26237 lastOpp++;
26238 if (lastOpp>3) lastOpp=0;
26239 }
26240 moteurHTML2.announce(moteurHTML2.getPlayerName(opp)+' joue '+moteurHTML2.getAccessibleCardName(name),false);
26241 cartesSurLeTapis[opp] = name; 
26242 
26243
26244 var sizeCard = getPlayedCardSizeHTML2();
26245
26246 var img = $$('newOne'+opp);
26247 if (img==null)
26248 {
26249 img = document.createElement("IMG");
26250 img.src= getCardJSIMG(name);//cacheCarte[name]; 
26251 img.style.position='absolute';
26252 img.style.left=carteEpos2(opp)+'px';
26253 img.style.top=topO+'px'; 
26254 img.width=sizeCard.w; 
26255 img.height= sizeCard.h;
26256 //img.height=cardHeight;
26257 img.id='newOne'+opp;      
26258 img.alt=moteurHTML2.getAccessibleCardName(name);
26259 img.setAttribute('data-card-name',name);
26260 img.setAttribute('tabindex','0');
26261 img.setAttribute('role','img');
26262 img.setAttribute('aria-label','Carte sur le plateau : '+moteurHTML2.getAccessibleCardName(name));
26263       
26264 $$('monJeu').appendChild(img);
26265 
26266 $(img).data('pos',opp);
26267 $(img).addClass('cartesTapis');
26268
26269 } else {
26270 img.style.left = carteEpos2(opp)+"px";
26271 img.style.top = topO+"px";
26272 img.style.width = sizeCard.w;
26273 img.style.height = sizeCard.h;
26274 
26275 }  
26276 
26277 img.style.zIndex=zindexTop;
26278 zindexTop++; 
26279
26280 if (Math.random()<0.5)
26281 playSoundEffect('cards_02.mp3',true);
26282 else
26283 playSoundEffect('cards_01.mp3',true);
26284 
26285}
26286moteurHTML2.setRoleJoueurClass = function (num,className) {
26287
26288 $('#spanJoueur'+num).data('annonce',6);
26289 switch (className) {
26290 case 'roleVictoire':
26291 $('#spanJoueur'+num).data('annonce',7);
26292 break;
26293 case 'roleDefaite':
26294 case 'rolePasse':
26295 $('#spanJoueur'+num).data('annonce',6);
26296 break;
26297 case 'rolePreneur':
26298 $('#spanJoueur'+num).data('annonce',1);
26299 break;
26300 case 'rolePreneurPrise':
26301 $('#spanJoueur'+num).data('annonce',1);
26302 break;
26303 case 'rolePreneurGarde':
26304 $('#spanJoueur'+num).data('annonce',2);
26305 break;
26306 case 'rolePreneurGardesans':
26307 $('#spanJoueur'+num).data('annonce',3);
26308 break;
26309 case 'rolePreneurGardecontre':
26310 $('#spanJoueur'+num).data('annonce',4);
26311 break;
26312 case 'roleEquipier':
26313 $('#spanJoueur'+num).data('annonce',5);
26314 break;
26315 case 'roleNobody':
26316 case 'roleAnnonce':
26317 $('#spanJoueur'+num).data('annonce',0);
26318 break;
26319 }
26320 moteurHTML2.refreshUtilisateur(num);
26321 return;
26322 
26323 $('#divJoueur'+num+' .joueurCnterRond')
26324 .removeClass('roleVictoire')
26325 .removeClass('roleDefaite')
26326 .removeClass('roleAnnonce')
26327 .removeClass('rolePreneur')
26328 .removeClass('rolePreneurPrise')
26329 .removeClass('rolePreneurGarde')
26330 .removeClass('rolePreneurGardesans')
26331 .removeClass('rolePreneurGardecontre')
26332 .removeClass('roleEquipier')
26333 .removeClass('roleNobody')
26334 .removeClass('rolePasse')
26335 .addClass(className);
26336
26337 $('#divJoueur'+num+' .pseudoJTxt')
26338 .removeClass('ToproleVictoire')
26339 .removeClass('ToproleDefaite')
26340 .removeClass('ToproleAnnonce')
26341 .removeClass('ToprolePreneur')
26342 .removeClass('ToprolePreneurPrise')
26343 .removeClass('ToprolePreneurGarde')
26344 .removeClass('ToprolePreneurGardesans')
26345 .removeClass('ToprolePreneurGardecontre')
26346 .removeClass('ToproleEquipier')
26347 .removeClass('ToproleNobody')
26348 .removeClass('ToprolePasse')
26349 .addClass('Top'+className);
26350
26351 $('#divJoueur'+num+' .infosJcomp')
26352 .removeClass('ToproleVictoire')
26353 .removeClass('ToproleDefaite')
26354 .removeClass('ToproleAnnonce')
26355 .removeClass('ToprolePreneur')
26356 .removeClass('ToprolePreneurPrise')
26357 .removeClass('ToprolePreneurGarde')
26358 .removeClass('ToprolePreneurGardesans')
26359 .removeClass('ToprolePreneurGardecontre')
26360 .removeClass('ToproleEquipier')
26361 .removeClass('ToproleNobody')
26362 .removeClass('ToprolePasse')
26363 .addClass('Top'+className);
26364}
26365
26366moteurHTML2.setPrise = function (num,txt) 
26367{
26368 if (txt=='Passe')
26369 selMoteur.setRoleJoueurClass(num,'rolePasse');
26370 else if (txt!='')
26371 selMoteur.setRoleJoueurClass(num,'rolePreneur'+txt.split(' ').join(''));
26372 else
26373 selMoteur.setRoleJoueurClass(num,'roleAnnonce');
26374 if (txt!='') {
26375 /*$('.roleJoueur').css('position','static');
26376 $('.roleJoueur').css('position','initial');*/
26377 }
26378 //$$('roleJoueur'+num).innerHTML = txt; 
26379 $('#spanJoueur'+num).data('annonceTxt',txt);
26380 resizeChat();
26381 autoShowCRA();
26382 moteurHTML2.refreshUtilisateur(num);
26383 moteurHTML2.announcePlayerState(num,txt);
26384}
26385
26386moteurHTML2.setPriseTxt = function (num,txt) 
26387{
26388 $('#spanJoueur'+num).data('annonceTxt',txt);
26389
26390 moteurHTML2.refreshUtilisateur(num);
26391 moteurHTML2.announcePlayerState(num,txt);
26392 //$$('roleJoueur'+num).innerHTML = txt; 
26393}
26394
26395moteurHTML2.setPreneur = function (num,annonce,chelem)
26396{
26397 var repNbJ = 5;
26398 if ($('#divJoueur0').hasClass('jeuEquipier4j'))
26399 repNbJ = 4;
26400 if ($('#divJoueur0').hasClass('jeuEquipier3j'))
26401 repNbJ = 3;
26402
26403 /*$('#spanJoueur'+num).data('annonce',annonce);
26404
26405 moteurHTML2.refreshUtilisateur(num);
26406 
26407 return;*/
26408 for ( var i=0;i<repNbJ;i++)
26409 {
26410 if (num==-1) {
26411 
26412 $('#spanJoueur'+i).data('annonceTxt','');
26413 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
26414 }
26415 else if (i==num) {
26416 selMoteur.setRoleJoueurClass(i,'rolePreneur'+tabAnnonces[annonce].split(' ').join(''));
26417 } else
26418 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
26419 
26420 if (i==num)
26421 {
26422 if (chelem) {
26423 $('#spanJoueur'+i).data('annonceTxt',tabAnnoncesCrt[annonce]+' + chelem');
26424  //$$('roleJoueur'+i+'').innerHTML = tabAnnoncesCrt[annonce]+' + chelem'; 
26425 } else {
26426  //$$('roleJoueur'+i+'').innerHTML = tabAnnonces[annonce]; 
26427 $('#spanJoueur'+i).data('annonceTxt',tabAnnoncesCrt[annonce]);
26428 }
26429 }
26430 else
26431 {
26432 $('#spanJoueur'+i).data('annonceTxt','');
26433  //$$('roleJoueur'+i+'').innerHTML = '';
26434 }
26435 moteurHTML2.refreshUtilisateur(i);
26436 }
26437 resizeChat();
26438 autoShowCRA();
26439}
26440
26441moteurHTML2.clearPrise = function (i)
26442{
26443 $$('roleJoueur'+i+'').innerHTML = '&nbsp;';
26444}
26445function autoShowCRA() {
26446 for (var i=0;i<4;i++) {
26447
26448 if ($('#divJoueur'+i+' .CRA').width()<10) {
26449 $('#divJoueur'+i+' .CRA').hide();
26450 } else {
26451 $('#divJoueur'+i+' .CRA').show();
26452 }
26453 }
26454}
26455
26456moteurHTML2.setDonneurPos = function (num) {
26457
26458 moteurHTML2.refreshUtilisateur(num);
26459 for (var k=0;k<6;k++) {
26460
26461 $('#spanJoueur'+k).data('isDonneur',0);
26462 }
26463
26464 $('#spanJoueur'+num).data('isDonneur',1);
26465
26466 for (var k=0;k<6;k++) {
26467 if ($('#spanJoueur'+k).length>0)
26468 moteurHTML2.refreshUtilisateur(k);
26469 }
26470}
26471moteurHTML2.setScore = function (num,score)
26472{
26473 $('#spanJoueur'+num).data('myScore',score );
26474 moteurHTML2.refreshUtilisateur(num);
26475 /*$('#spanJoueur'+num).data('annonceTxt'
26476 if ($$('spanScoreJoueur'+num).innerHTML != score) {
26477 $$('spanScoreJoueur'+num).innerHTML = score;
26478 if (score!='') {
26479 $('#spanScoreJoueur'+num).show();
26480 } else {
26481
26482 $('#spanScoreJoueur'+num).hide();
26483 }
26484 }*/
26485}
26486
26487
26488var numActions = 0;
26489 
26490moteurHTML2.clearActions = function (noscroll)
26491{
26492 if (numActions!=0) {
26493 $$('infosJeuActions').innerHTML = '';
26494 //selMoteur.hideInfoJeu();
26495 if (!noscroll) $("html, body").stop().animate({ scrollTop: 0 }, 700);
26496 }
26497 if (noscroll==2) {
26498 $("html, body").stop().animate({
26499 scrollTop: $(document).height()
26500 }, 700);
26501 }
26502 numActions = 0; 
26503}
26504moteurHTML2.addAction = function (name,action,myclass,noscroll)
26505{
26506 if (numActions>0)
26507 if (selMoteur.actionExists (name))
26508 return;
26509 
26510 if (numActions==0) {
26511 $('#infosJeu').show();
26512 $('#infosJeuActions').show();
26513 $$('infosJeuActions').innerHTML = '';
26514 showInfoJeu();
26515 }
26516 numActions++;
26517 //if ( $$('infosJeu').innerHTML.indexOf( 'value="'+name+'"')==-1)
26518 $$('infosJeuActions').innerHTML += '<a class="actionBtn '+myclass+' btn btn-actionGame" onclick="'+action+'">'+name+'</a>';
26519 moteurHTML2.scheduleActionsAnnouncement();
26520 
26521 if (numActions==1) {
26522 reorganiseCartes ();
26523 }
26524 if (!noscroll)
26525 $("html, body").stop().animate({ scrollTop: $('#infosJeuActions').offset().top+$('#infosJeuActions').outerHeight()+$('#chatBg').outerHeight()-$(window).height() }, 1000);
26526
26527}
26528
26529moteurHTML2.actionExists = function (name)
26530{
26531 var actions = $$('infosJeuActions');
26532 return !!actions && actions.innerHTML.indexOf( name+'</a>')!=-1;
26533}
26534moteurHTML2.removeAction = function (name)
26535{
26536 $('#infosJeuActions a').each(function () {
26537 if ($(this).html()==name) {
26538 //console.log('found ');
26539 $(this).remove();
26540 }
26541 
26542 });
26543 moteurHTML2.scheduleActionsAnnouncement();
26544 return;
26545}
26546var lastTurnSel = null; 
26547moteurHTML2.setTurn = function (num)
26548{
26549 for (var k=0;k<6;k++) {
26550 if (k==num)
26551 $('#spanJoueur'+num).data('isTourDeJeu',1);
26552 else
26553 $('#spanJoueur'+k).data('isTourDeJeu',0);
26554 }
26555
26556 for (var k=0;k<6;k++) {
26557 if ($('#spanJoueur'+k).length>0)
26558 moteurHTML2.refreshUtilisateur(k);
26559 }
26560 
26561 
26562 if (etapeCourante =="Terminee")
26563 {
26564 selMoteur.clearTurn();           
26565 }
26566 else
26567 {
26568 var $selecteurTour = $('#selecteurTour');
26569 
26570 if ( $selecteurTour[0]!=null) $selecteurTour[0].style.visibility='visible';
26571 var oneWidth = $('#divJoueur0').width();
26572 var newPos = $('#divJoueur'+num).offset().left+oneWidth/2-$selecteurTour.width()/2;
26573 
26574 var newPosY;
26575 if ( $(window).width()>800)
26576  newPosY = parseInt($('#divJoueur'+num).offset().top-15);
26577 else
26578  newPosY = parseInt($('#divJoueur'+num).offset().top-5);
26579 if ( $selecteurTour[0]==null)
26580 {
26581  var selector = document.createElement('IMG');
26582  selector.style.position='absolute';
26583  selector.style.left=parseInt(newPos)+'px';
26584  selector.style.top=newPosY+'px';
26585  selector.style.zIndex='-1';
26586  if ( $(window).width()>800)
26587  selector.style.opacity=0.8;
26588  else
26589  selector.style.opacity=0.7;
26590
26591  selector.id='selecteurTour';
26592  if (isLowGraphism)
26593  selector.src='/Jeu-Tarot-en-ligne/Icones/SelecteurOFF.png?v=2';
26594  else
26595  selector.src='/Jeu-Tarot-en-ligne/Icones/Selecteur.png?v=2';
26596  $$('Jeu').appendChild(selector);
26597 }
26598 $selecteurTour.stop().animate( { left: newPos,top:newPosY }, 700 );
26599 
26600 if (lastTurnSel!=num) {
26601  if (typeof whoamiNum!='undefined' && num==whoamiNum)
26602  moteurHTML2.announce('C\u0027est \u00e0 vous de jouer',true);
26603  else
26604  moteurHTML2.announce('Tour de '+moteurHTML2.getPlayerName(num),false);
26605 }
26606 lastTurnSel = num;
26607 }
26608} 
26609moteurHTML2.clearTurn = function () 
26610{
26611 if ( $$('selecteurTour')!=null) $$('selecteurTour').style.visibility='hidden';
26612} 
26613
26614
26615
26616var lastIntitule = '';
26617var TOaffCART;
26618
26619moteurHTML2.afficheCartes = function (cartes,intitule)
26620{   
26621 if (lastIntitule==intitule && intitule.indexOf('taient dans le chien') === -1) return;
26622 lastIntitule = intitule;
26623 var tWidth = $(window).width(); 
26624 var cartesChien = jQuery.parseJSON(cartes);
26625 var accessibleContext = moteurHTML2.getAccessibleText(intitule);
26626 var div = document.createElement("DIV");
26627 $$('infosJeuInfo').innerHTML = '';
26628 div.id='carteInfos';
26629
26630 div.innerHTML = '<h4>'+intitule+'</h4>';
26631 var div2 = document.createElement("DIV");
26632 div2.id='carteInfosList';      
26633 div.appendChild(div2); 
26634 for (i=0;i<cartesChien.length;i++)
26635 {
26636 
26637 img = document.createElement("IMG");
26638 img.src= getCardJSIMG(cartesChien[i]);
26639 img.style.position='relative';
26640 //img.style.marginBottom='0px'; 
26641 img.className = 'carteAfficheeInfo cardJeu';
26642 img.width=cardWidth;
26643 img.height=cardHeight;
26644 img.id='carteChien'+i;      
26645 img.alt=moteurHTML2.getAccessibleCardName(cartesChien[i]);
26646 img.setAttribute('data-card-name',cartesChien[i]);
26647 img.setAttribute('tabindex','0');
26648 img.setAttribute('role','img');
26649 img.setAttribute('aria-label',(accessibleContext!=''?accessibleContext+' : ':'')+img.alt);
26650 div2.appendChild(img); 
26651 }    
26652 selMoteur.clearActions();   
26653 $$('infosJeuInfo').appendChild(div); 
26654 $('#infosJeuInfo').show(); 
26655 $('#infosJeu').show(); 
26656 showInfoJeu();
26657 moteurHTML2.announce('Information de jeu : '+intitule,false);
26658 //showInfoJeu();
26659 reorganiseCartes ();
26660 //TOaffCART = setTimeout(masqueInfoJeu,8000);
26661} 
26662
26663
26664
26665
26666
26667moteurHTML2.clearMessagePlateauJeu = function ()
26668{
26669 var messagePlateauJeu = $$('messagePlateauJeu');
26670 if (messagePlateauJeu==null) return;
26671 messagePlateauJeu.innerHTML = '';
26672}
26673moteurHTML2.showMessagePlateauJeu = function (txt,conserverCartes)
26674{
26675 etapeCourante ="Terminee";
26676 if (conserverCartes!==true) {
26677 cardsNum=0;
26678 $$('monJeu').innerHTML = '';
26679 $('#monJeu').css('padding-bottom','0');
26680 moteurHTML2.jeuPadOK = false;
26681 }
26682 var messagePlateauJeu = $$('messagePlateauJeu');
26683 if (messagePlateauJeu==null) return;
26684 var premiumResult = typeof txt === 'string' && txt.indexOf('<section class="game-message premium-results"') === 0;
26685 messagePlateauJeu.innerHTML = '<div class="txtEndGame'+(premiumResult ? ' txtEndGame--premium' : '')+'">'+txt+'</div>';
26686 moteurHTML2.announce(txt,false);
26687 resizeChat();
26688}
26689
26690
26691
26692
26693var delTOTO = 0;
26694function progress(percent, $element) {
26695 var progressBarWidth = percent * $element.width() / 100;
26696 $element.find('div').css('width', progressBarWidth );//.html(percent + "%&nbsp;");
26697}
26698var syncTimeDelay = 0;
26699var syncTimeTS = 0;
26700var syncTimeTotal = 0;
26701var syncTimeInterval = 0;
26702var syncTimeLastAriaSecond = null;
26703var syncTimeAnnouncedThresholds = {};
26704
26705function stopTimerAccessibility() {
26706 var timer = $$('tempsRestant');
26707 var timerText = $$('tempsRestantTexte');
26708 if (timer) {
26709 timer.setAttribute('aria-valuenow','0');
26710 timer.setAttribute('aria-valuetext','Chronom\u00e8tre arr\u00eat\u00e9');
26711 }
26712 if (timerText) {
26713 timerText.innerHTML = 'Chronom\u00e8tre arr\u00eat\u00e9';
26714 timerText.setAttribute('aria-hidden','true');
26715 }
26716 syncTimeLastAriaSecond = null;
26717 syncTimeAnnouncedThresholds = {};
26718}
26719
26720function updateTimerAccessibility(delay,totalTime,announceStart) {
26721 var timer = $$('tempsRestant');
26722 var timerText = $$('tempsRestantTexte');
26723 if (!timer || !timerText || totalTime<=0) return;
26724
26725 var remaining = Math.max(0,Math.ceil(delay));
26726 if (remaining==syncTimeLastAriaSecond && !announceStart) return;
26727 syncTimeLastAriaSecond = remaining;
26728
26729 var valueText = remaining+' seconde'+(remaining>1?'s':'')+' restante'+(remaining>1?'s':'');
26730 timer.setAttribute('aria-valuemax',String(Math.max(1,Math.ceil(totalTime))));
26731 timer.setAttribute('aria-valuenow',String(remaining));
26732 timer.setAttribute('aria-valuetext',valueText);
26733 timerText.innerHTML = valueText;
26734 timerText.setAttribute('aria-hidden','false');
26735
26736 if (announceStart) {
26737 moteurHTML2.announce('Chronom\u00e8tre d\u00e9marr\u00e9 : '+valueText,false);
26738 return;
26739 }
26740
26741 if ((remaining==10 || remaining==5 || remaining==3 || remaining==1) &&
26742 !syncTimeAnnouncedThresholds[remaining]) {
26743 syncTimeAnnouncedThresholds[remaining] = true;
26744 moteurHTML2.announce('Temps restant : '+valueText,remaining<=5);
26745 }
26746}
26747
26748moteurHTML2.timeThatRemains = function (delay,totalTime,ignoreTurn)
26749{
26750 //log('il reste '+delay+'/'+totalTime+' secondes');
26751 if (delay==-1 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
26752 { 
26753 syncTimeDelay = 0;
26754 syncTimeTS = 0;
26755 syncTimeTotal = 0;
26756 clearInterval(syncTimeInterval);
26757
26758 $('#tempsRestant').css('visibility','hidden');
26759 stopTimerAccessibility();
26760
26761 }
26762 else
26763 { 
26764 var oldDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
26765 var startsNewTimer = syncTimeTS==0 || syncTimeTotal!=totalTime || delay>oldDelay+2;
26766 if (startsNewTimer) {
26767 syncTimeLastAriaSecond = null;
26768 syncTimeAnnouncedThresholds = {};
26769 }
26770 //console.log('oldDelay',oldDelay);
26771 //console.log('err',oldDelay-delay);
26772 syncTimeDelay = delay;
26773 syncTimeTS = (new Date().getTime());
26774 syncTimeTotal = totalTime;
26775 clearInterval(syncTimeInterval);
26776 syncTimeInterval = setInterval(function () { intervalTimeRemaining(ignoreTurn); },100);
26777 
26778 var newWidth = 0;
26779 if ( delay>2) newWidth = 10+delay*3;
26780
26781 $('#tempsRestant').show();
26782 $('#tempsRestant').css('visibility','visible');
26783 progress(delay*100/totalTime, $('#tempsRestant'));
26784 updateTimerAccessibility(delay,totalTime,startsNewTimer);
26785 }
26786}
26787var canPlayAlertSound = 0;
26788
26789function intervalTimeRemaining(ignoreTurn) {
26790 var newDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
26791 if (newDelay<0 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
26792 { 
26793 syncTimeDelay = 0;
26794 syncTimeTS = 0;
26795 syncTimeTotal = 0;
26796 clearInterval(syncTimeInterval);
26797
26798 $('#tempsRestant').css('visibility','hidden');
26799 stopTimerAccessibility();
26800 return;
26801 }
26802 if (newDelay<3 && canPlayAlertSound==0) {
26803 if (gameSoundsEnabled) playSoundEffect ('Heartbeat3.mp3',true,0.9);
26804 else playSound ('Button.mp3?v=2');//playSound ('Bip.mp3');
26805 
26806 canPlayAlertSound = 1;
26807 } else if (newDelay>5 && canPlayAlertSound==1 ) {
26808 canPlayAlertSound = 0;
26809 }
26810 progress(newDelay*100/syncTimeTotal, $('#tempsRestant'));
26811 updateTimerAccessibility(newDelay,syncTimeTotal,false);
26812}
26813
26814
26815
26816
26817
26818moteurHTML2.showMessageJoueur = function (idJoueur,message) {
26819 if (window.disableEmoticons) return;
26820 
26821 var rand = Math.random();
26822 if (message=="J'applaudis !") playSoundEffect ('Clap_Hands'+Math.floor(rand*5)+'.mp3',true,0.9);
26823 else if (message=="C'est long...") playSoundEffect ('Yawn'+(2+Math.floor(rand*2))+'.mp3',true,0.9);
26824 else if (message=="Je vous embrasse !") playSoundEffect ('Kiss '+Math.ceil(rand*3)+'.mp3',true,0.9);
26825 else if (message=="Je pleure !") playSoundEffect ('Cry_1Cut.mp3',true,0.9);
26826 
26827 var gameEmoticon = resolveGameEmoticon(message);
26828 if (gameEmoticon) {
26829 
26830 var newIcon = $('<img class="emotHTML" style="opacity:0;" alt="" />');
26831 var afficherEmoticon = function () {
26832 if (newIcon.data('emoticonAffichee')) return;
26833 newIcon.data('emoticonAffichee',true);
26834 newIcon.css('margin-left',$('#divJoueur'+idJoueur).width()/2-newIcon.width()/2);
26835 newIcon.css('opacity',1 );
26836 newIcon.animate({'margin-top':100,opacity:0},2500,function () {
26837 newIcon.remove();
26838 });
26839 };
26840
26841 /* Brancher les evenements avant src : une image deja en cache peut finir
26842 * de charger avant l'ancien $(image).load(...), et rester invisible. */
26843 newIcon.on('load',afficherEmoticon).on('error',function () {
26844 newIcon.remove();
26845 });
26846 $('#divJoueur'+idJoueur).append(newIcon);
26847 newIcon.attr('src',gameEmoticon.image);
26848 if (newIcon[0].complete) {
26849 if (typeof newIcon[0].naturalWidth==='undefined' || newIcon[0].naturalWidth>0)
26850 afficherEmoticon();
26851 else
26852 newIcon.remove();
26853 }
26854
26855 return;
26856 }
26857 if (typeof $('#divJoueur'+idJoueur).tooltip == 'undefined') return;
26858 if ($('#divJoueur'+idJoueur).attr('title') || $('#divJoueur'+idJoueur).attr('data-original-title')) {
26859 var pop = $('#divJoueur'+idJoueur).data('fifoMsgs');
26860 if (!pop)
26861 pop = [];
26862 if (pop.length<10)
26863 pop.push(message);
26864 $('#divJoueur'+idJoueur).data('fifoMsgs',pop);
26865 return;
26866 }
26867 $('#divJoueur'+idJoueur).attr('title', message);
26868 $('#divJoueur'+idJoueur).attr('data-placement', "bottom");
26869 $('#divJoueur'+idJoueur).attr('data-original-title', message)
26870 .tooltip().tooltip('fixTitle').mouseover();
26871 
26872 playSoundEffect ('Female Voice - Psst '+Math.ceil(Math.random()*2)+'.mp3',true,0.5);
26873 
26874 clearTimeout($('#divJoueur'+idJoueur).data('TO'));
26875 var to = setTimeout(function() {
26876 $('#divJoueur'+idJoueur).mouseout().attr('title', '').attr('data-original-title', '');
26877 var pop = $('#divJoueur'+idJoueur).data('fifoMsgs');
26878 if (pop) {
26879 if (pop.length>0) {
26880 var m2 = pop.shift();
26881 $('#divJoueur'+idJoueur).data('fifoMsgs',pop);
26882 setTimeout(function () {
26883 selMoteur.showMessageJoueur(idJoueur,m2);
26884 },200);
26885
26886 }
26887 }
26888 }, 5000);
26889 $('#divJoueur'+idJoueur).data('TO', to);
26890}
26891
26892var nombreDeJPartie = 4;
26893var hasAGameStarted = false;
26894var firstInfoJeuShown = false;
26895
26896function showInfoJeu()
26897{
26898 firstInfoJeuShown = true;
26899 if ($('#chat:visible').length && !$(document.body).hasClass('bigChat')) {
26900 $('#infosJeuInfo').show();
26901 $('#infosJeu').show();
26902 updateHalfChat();
26903 return;
26904 }
26905 $('#infosJeuInfo').show();
26906 $('#infosJeu').show();
26907 updateHalfChat();
26908} 
26909moteurHTML2.hideInfoJeu = function ()
26910{
26911 //numActions = 0; 
26912 $$('infosJeuInfo').innerHTML = '';
26913 $('#infosJeuInfo').hide();
26914 updateHalfChat();
26915} 
26916
26917
26918
26919function resizeChat() {
26920 var $chat = $('#chat');
26921 if ($chat.length==0) return;
26922 if ($(document.body).hasClass('bigChat')) {
26923 if ($chat.is(':visible'))
26924 $('#chatBg').addClass('chatBgOpen');
26925 else
26926 $('#chatBg').removeClass('chatBgOpen');
26927 var delt = parseInt($chat.css('padding-top'))+parseInt($chat.css('padding-bottom'));
26928 if ($chat[0].scrollHeight+$('#chatBg').outerHeight()+$('#chatGradient').height()-delt>$(window).height()) {
26929 $chat.height(Math.max($(window).height()-$('#chatBg').outerHeight()-$('#chatGradient').height()-delt,200));
26930 } else {
26931 $chat.css('height','');
26932 }
26933 } else {
26934 $('#chatBg').removeClass('chatBgOpen');
26935 if ($(window).width()>600 || !firstInfoJeuShown)
26936 $chat.css('height',Math.max(180,$(window).height()-$chat.offset().top-$('#chatBg').outerHeight()-14));
26937 else
26938 $chat.css('height','');
26939 }
26940 if ($chat[0].scrollHeight>$chat.outerHeight()) {
26941
26942 $('#chatGradient').css('padding-right','20px');
26943 } else {
26944 $('#chatGradient').css('padding-right','0px');
26945 
26946 }
26947 $chat[0].scrollTop= $chat[0].scrollHeight;
26948 
26949}
26950function showChatD() {
26951 $('#chat').show();
26952 $('#chatGradient').show();
26953 resizeChat();
26954}
26955moteurHTML2.hideChat = function () {
26956 if (!$(document.body).hasClass('bigChat')) return;
26957 $('#chat').hide();
26958 $('#chatGradient').hide();
26959 resizeChat();
26960}
26961function chatGrad() {
26962 var equipeHTML='';
26963 equipeHTML += '<p id="chatGradient" >'; 
26964 equipeHTML += '<img class="closeChatBtn closingBtnChat" src="/images/icones/Close.png" alt="Fermer la conversation" role="button" tabindex="0" onclick="selMoteur.hideChat()" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);"/>'; 
26965 equipeHTML += '<img class="closeChatBtn" src="/images/icones/Bigger.png" alt="Changer la taille de la conversation" role="button" tabindex="0" onclick="bigChatD()" onkeydown="return moteurHTML2.activateKeyboardControl(event,this);"/>'; 
26966 equipeHTML += '</p>'; 
26967 return equipeHTML;
26968}
26969function getChatHTML(val) {
26970 var equipeHTML='<div class="chatContainer">';
26971 equipeHTML += chatGrad(); 
26972 equipeHTML += '<p id="chat" role="log" aria-label="Conversation" aria-live="off">'+val+'</p></div>'; 
26973 return equipeHTML;
26974}
26975function bigChatD() {
26976 var equipeHTML=getChatHTML($('#chat').html());
26977 
26978 if ($(document.body).hasClass('bigChat')) {
26979
26980 $('.chatContainer').remove();
26981 $('#infosJeu').after($(equipeHTML));
26982 $(document.body).removeClass('bigChat');
26983 } else {
26984
26985 $('.chatContainer').remove();
26986 $('#bottomGame').prepend($(equipeHTML));
26987 $(document.body).addClass('bigChat');
26988 }
26989 showChatD();
26990 updateHalfChat();
26991 resizeChat();
26992}
26993function toggleChatD() {
26994 if ($('#chat').is(':visible')) selMoteur.hideChat();
26995 else showChatD();
26996}
26997
26998
26999moteurHTML2.hideCoulApp = function () {
27000 if (idCoulAppH) {
27001
27002 $('#spanJoueur'+idCoulAppH).data('appelC','');
27003 $('#spanJoueur'+idCoulAppH).data('appelN','');
27004 moteurHTML2.refreshUtilisateur(idCoulAppH);
27005 idCoulAppH = 0;
27006 }
27007}
27008function showCRA() {
27009 $('.CRA').css('position','static');
27010 $('.CRA').css('position','initial');
27011 $('.CRA').css('top','0px');
27012 resizeChat();
27013 autoShowCRA();
27014}
27015var idCoulAppH;
27016moteurHTML2.showCoulApp = function (i,coulNum,txtTete) {
27017 idCoulAppH = i;
27018 $('#spanJoueur'+i).data('appelC',coulNum);
27019 $('#spanJoueur'+i).data('appelN',txtTete);
27020 moteurHTML2.refreshUtilisateur(i);
27021 //$('.appelRoi').html('');
27022 //$('#divJoueur'+i+' .appelRoi').html('<img src="/images/Couleurs
27022/'+txtTete+'.png?v=3" class="coulPren iconeStatut"><img src="/images/Couleurs/'+coulNum+'.png" class="coulPren iconeStatut">');
27023 //showCRA();
27024 
27025}
27026
27027
27028
27029moteurHTML2.clearMasques = function () {
27030 $('.masqueCarte').remove();
27031}
27032moteurHTML2.clearMasque = function (id) {
27033 if ($$('masque'+id)==null) return;
27034 $$('monJeu').removeChild($$('masque'+id));
27035}
27036moteurHTML2.addMasque = function (id,masque) {
27037 selMoteur.clearMasque(id);
27038 var img = document.createElement('img');
27039 img.style.cssText= $$(id).style.cssText;
27040 img.style.marginLeft = (-parseInt($$(id).style.marginRight)-$('#'+id.split('.').join('\\.')).width() )+'px';
27041 img.style.marginRight = (parseInt($$(id).style.marginRight))+'px';
27042 img.id = 'masque'+id;
27043 img.width = $('#'+id.split('.').join('\\.')).width();
27044 img.height = cardHeight;
27045 img.src = '/Jeu-Tarot-en-ligne/Masques/'+masque+'.gif';
27046 img.className='masqueCarte MasqueB cardJeu';
27047 img.onclick = function () { $('#'+id.split('.').join('\\.')).trigger('click'); };
27048 
27049 $('#'+id.split('.').join('\\.')).after(img);
27050}
27051
27052
27053
27054
27055moteurHTML2.clearCardsActions = function (except)
27056{
27057 selMoteur.timeThatRemains(-1,0);
27058 $('.masqueCarte').remove();
27059 $('#tempsRestant').css('visibility','hidden');
27060 var cnt = $$('monJeu').childNodes;
27061 for (key in cnt) {
27062 if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id!=except && cnt[key].id.substr(0,6)=='MonJeu' ) 
27063 {    
27064  carteNeutre(cnt[key].id);
27065  //cnt[key].style.top = '0px';
27066  cnt[key].onclick = null;
27067  cnt[key].onmouseover = null;
27068 }
27069 }
27070 //unzoomPalteau ();
27071}
27072moteurHTML2.clearCards = function ()
27073{   
27074 moteurHTML2.hideIaCardAdvice();
27075 lastJeuWidth = -1;
27076 moteurHTML2.clearMessagePlateauJeu();
27077 /*if (moteurHTML2.jeuPadOK) {
27078 moteurHTML2.jeuPadOK = false;
27079 $('#monJeu').css('padding-bottom','0');
27080 }*/
27081 //$$('monJeu').style.height='125px';
27082 selMoteur.timeThatRemains(-1,0);
27083
27084 
27085 $$('monJeu').innerHTML = '';
27086 cardsNum=0;
27087 playSoundEffect('Casino Cards.mp3',true);
27088 //unzoomPalteau ();
27089}
27090
27091
27092
27093moteurHTML2.setGameMainMsg = function (txt) {
27094 var messagePlace = $$('messagePlace');
27095 messagePlace.innerHTML = txt;
27096
27097 // Le texte reste entier pour les lecteurs d'ecran et au survol, meme s'il est tronque visuellement.
27098 var completeText = (messagePlace.textContent || messagePlace.innerText || '').replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '');
27099 var hasText = completeText.length>0;
27100 $(messagePlace).toggleClass('gameActionMessage--empty',!hasText);
27101 messagePlace.setAttribute('tabindex',hasText?'0':'-1');
27102 if (hasText) {
27103 messagePlace.setAttribute('title', completeText);
27104 } else {
27105 messagePlace.removeAttribute('title');
27106 }
27107}
27108
27109moteurHTML2.reorganiseCartesReal = function (fromResize)
27110{ 
27111 //log('reorganiseCartes');
27112 if ($$('monJeu')==null) return;
27113
27114 var $monjeu = $('#monJeu');
27115 var windowWidth = $monjeu.outerWidth()-32;
27116
27117 if (!moteurHTML2.jeuPadOK && cardsNum>0) {
27118 moteurHTML2.jeuPadOK = true;
27119 
27120 if (windowWidth<600) {
27121 $('#monJeu').css('padding-bottom',155);
27122 }
27123 else {
27124 $('#monJeu').css('padding-bottom',205);
27125 }
27126 } else if (cardsNum==0 && moteurHTML2.jeuPadOK) {
27127
27128 moteurHTML2.jeuPadOK = false;
27129 $('#monJeu').css('padding-bottom','0');
27130 }
27131 if (fromResize) {
27132 
27133 if ($(window).width()*1.2<$(window).height()) {
27134 $('#webBody').css('margin-top',25);
27135 } else {
27136 $('#webBody').css('margin-top',8);
27137 }
27138 cchPlCz = null;
27139 
27140 }
27141 /*if (fromResize==null) {
27142 CheckSizeZoom();
27143 }*/
27144
27145 if (lastTurnSel!==null) 
27146 selMoteur.setTurn(lastTurnSel);
27147 
27148 var ccW = 130;
27149 if (windowWidth<600) ccW = 105;
27150 if (cardsNum>0) {
27151
27152 //ccW = $('.carteMain').width();
27153 var numCartesJeu=0;
27154 var cnt = $monjeu[0].childNodes;
27155 for (key in cnt) { 
27156  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu')
27157  numCartesJeu++;
27158 } 
27159 
27160 var cptmp = 0;
27161 var numCarteLigne = numCartesJeu;
27162 var nbLigneCartes = 1;
27163 var spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
27164 while (spacingCards<45 && nbLigneCartes<50) {
27165 nbLigneCartes++;
27166 numCarteLigne = Math.ceil(numCartesJeu/nbLigneCartes);
27167 spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
27168 
27169 }
27170 
27171 cardsBestTop = 3;
27172 
27173 var isfuncsentResiz = false;
27174 
27175 for (key in cnt) {         
27176  if (cnt[key]!=null && cnt[key].id!=null && cnt[key].id.substr(0,6)=='MonJeu')
27177  { 
27178  var opt = '';
27179  if (cptmp%numCarteLigne == 0) opt = 'First';
27180  if (cptmp%numCarteLigne == numCarteLigne-1) opt = 'Last';
27181  if (cptmp == numCartesJeu-1) opt = 'Last';
27182  var endf = null;
27183  if (!isfuncsentResiz) {
27184  isfuncsentResiz = true;
27185
27186  endf = function () {resizeChat(); };
27187  }
27188
27189  if (windowWidth<600)
27190  animateToWidthHTML2Small (cnt[key].id,spacingCards,ccW,opt,endf);
27191  else
27192  animateToWidthHTML2 (cnt[key].id,spacingCards,ccW,opt,endf);
27193        
27194  cptmp++; 
27195  }
27196 } 
27197 }
27198 if (fromResize) {
27199 reposPlayedCardsHTML2();
27200 }
27201}
27202
27203function animateToWidthHTML2Small (id,destW,ccW,opt,endf) {
27204 var sizz = getPlayedCardSizeHTML2();
27205 var newW = destW-ccW;
27206 var idDest = id.split('.').join('\\.');
27207 var margL = newW/2;
27208 var margR = newW/2;
27209 if (opt=='First') margL = -5;
27210 if (opt=='Last') margR = -5;
27211 $('#'+idDest).stop().animate({
27212 marginLeft: margL,
27213 marginRight: margR,
27214 marginBottom:-145,
27215 width:105,
27216 height:193
27217 }, 600,endf);
27218 $('#masque'+idDest).stop().animate({
27219 marginLeft: (-margR-ccW ),
27220 marginRight: margR,
27221 marginBottom:-145,
27222 width:105,
27223 height:193
27224 }, 600);
27225}
27226function animateToWidthHTML2 (id,destW,ccW,opt,endf) {
27227 var sizz = getPlayedCardSizeHTML2();
27228 var newW = destW-ccW;
27229 var idDest = id.split('.').join('\\.');
27230 var margL = newW/2;
27231 var margR = newW/2;
27232 if (opt=='First') margL = -5;
27233 if (opt=='Last') margR = -5;
27234 $('#'+idDest).stop().animate({
27235 marginLeft: margL,
27236 marginRight: margR,
27237 marginBottom:-190,
27238 width:130,
27239 height:239
27240 }, 600,endf);
27241 $('#masque'+idDest).stop().animate({
27242 marginLeft: (-margR-ccW ),
27243 marginRight: margR,
27244 marginBottom:-190,
27245 width:130,
27246 height:239
27247 }, 600);
27248}
27249
27250//var lesCartesVontEtresRamassees = false; 
27251moteurHTML2.ramassePoignee = function (joueur)
27252{
27253 //lesCartesVontEtresRamassees = true;
27254 moteurHTML2.announce(moteurHTML2.getPlayerName(joueur)+' remporte la lev\u00e9e',false);
27255  
27256 for (var m=0;m<6;m++)
27257 {
27258 if ($$('newOne'+m)!=null)
27259  $$('newOne'+m).id = 'ramasse'+m ;
27260 }
27261 cartesSurLeTapis = new Array();
27262 setTimeout(function () { ramasseCartes2(joueur); },500);
27263}
27264
27265
27266var posRamassC = new Array (20,101,222,343);
27267
27268moteurHTML2.cartePoigneeSelectInit = function (cardName) {
27269 cartePoigneeSelect($$(cardName));
27270}
27271
27272function ramasseCartes2 (joueur)
27273{      
27274 for (var m=0;m<6;m++)
27275 { 
27276 if ($$('ramasse'+m)!=null)
27277 {
27278  $('#ramasse'+m).addClass('rammass');
27279  var obj = getDistance('ramasse'+m,"divJoueur"+joueur); 
27280  var distx = carteEpos2(joueur);
27281 var topO = getCardPlayerTop2( joueur );//$(this).offset().top;//
27282  
27283  var ramassedCardName = $$('ramasse'+m).getAttribute('data-card-name') || $$('ramasse'+m).alt;
27284  if (ramassedCardName.split('6_Excuse').length<2)
27285  animateIdHTML2 ('ramasse'+m,distx,topO)
27286
27287  $$('ramasse'+m).style.marginLeft='0px';
27288  if (m==joueur)
27289  $$('ramasse'+m).style.zIndex='100';
27290 }
27291 }
27292 playSoundEffect('card move sound.mp3',true);
27293 setTimeout(function () { finRamasseCartesHTNew(joueur); } ,700); 
27294}
27295function finRamasseCartesHTNew (joueur)
27296{
27297 for (var m=0;m<6;m++)
27298 {
27299 $('#ramasse'+m).removeClass('rammass');
27300 if ($$('ramasse'+m)!=null){
27301 
27302 if (typeof dosDesCartes !=='undefined')
27303  $$('ramasse'+m).src = imgPresJSprocess(dosDesCartes); 
27304 else if (typeof versoCarteHR !=='undefined')
27305  $$('ramasse'+m).src = imgPresJSprocess(versoCarteHR); 
27306 else
27307 $$('ramasse'+m).src = versoCarte; 
27308 }
27309 }    
27310 setTimeout(function () { finRamasseCartesHTMLNew(joueur); } ,600); 
27311}
27312var cptLeveesCartes = 0;
27313function finRamasseCartesHTMLNew (joueur)
27314{
27315 for (var m=0;m<6;m++)
27316 { 
27317 if ($$('ramasse'+m)!=null)
27318 { 
27319  $$('monJeu').removeChild($$('ramasse'+m));
27320 }
27321 }     
27322
27323 zindexTop = 10; 
27324} 
27325
27326
27327/*
27328function decodeChatLineHTML(txt) {
27329 //$pseudo,$line,$date,$idUtil
27330 var tmp = unescape(txt).split('+').join(' ').split('#');
27331 return tmp[0]+": "+tmp[1]+' <font style="font-size:0.9em;opacity:0.5;">'+tmp[2]+'</font>';
27332}
27333*/
27334
27335
27336var fontNamePhaser = 'quicksandregular';
27337var moteurPhaser = {}
27338var phaserGBShown = false;
27339moteurPhaser.titreMoteur = 'Phaser';
27340
27341function setPhaserEngine(modeNum) {
27342 if (modeNum>1) {
27343
27344 isTechniqueMode = true;
27345 techniqueLevelAnim = 100;
27346 }
27347 selMoteur = moteurPhaser;
27348}
27349function togglePhaserOffMode() {
27350 if ($('#phaserOffMode').is('checked')) {
27351 setPhaserEngine(0);
27352 
27353 } else {
27354 selMoteur = moteurHTML;
27355 }
27356}
27357function isAndroidPhaser() {
27358 var ua = navigator.userAgent.toLowerCase();
27359 var isAndroid = ua.indexOf("android") > -1; //&& ua.indexOf("mobile");
27360 return isAndroid;
27361}
27362function isIos() {
27363 return /ipad|iphone/gi.test(window.navigator.userAgent);
27364}
27365
27366
27367function setWorldDIM() {
27368 phaserWW_w = $(window).width();
27369
27370 if (isAndroidPhaser() && window.outerHeight<$(window).height()+80) 
27371 phaserWW_h = window.outerHeight;
27372 else
27373 phaserWW_h = $(window).height();//gamePhaser.world.height;//
27374}
27375var phaserWW_w = 800;
27376var phaserWW_h = 600;
27377
27378function getWorldW() {
27379 return phaserWW_w;//$(window).width();//gamePhaser.world.width;//
27380}
27381
27382function getWorldH() {
27383 return phaserWW_h;
27384}
27385
27386var phaserModeleCartes = null;
27387function getModeleCartes() {
27388 if (phaserModeleCartes===null) {
27389 phaserModeleCartes = $('#modeleJeuCartes').val();
27390 return phaserModeleCartes;
27391 }
27392 return phaserModeleCartes;
27393}
27394
27395function dynamicLoadImage( x, y, url, fallback, key,group) {
27396 if (phaserMedalsDisabled) return;
27397 //llog('dynamicLoadImage', x, y, url, fallback, key,group,typeof key);
27398 if (typeof key === 'undefined' || !key) key = 'dynamicLoad_' + url;
27399 if (gamePhaser.cache.checkImageKey(key)) {
27400 var image = gamePhaser.add.image(x, y, key); 
27401 image.anchor.setTo(0.5,0.5); 
27402 return image;
27403 } else {
27404 var image = gamePhaser.add.image(x, y, fallback); 
27405 image.anchor.setTo(0.5,0.5); 
27406 if (group) group.add(image);
27407 var loader = new Phaser.Loader(gamePhaser);
27408 loader.image(key, url);
27409 loader.onFileComplete.addOnce(function (progress, cacheKey, success, totalLoaded, totalFiles) {
27410 if (success && cacheKey) this.loadTexture(cacheKey);
27411 }, image);
27412 loader.start();
27413 return image;
27414 }
27415}
27416function dynamicLoadImageTo( existing,url) {
27417 var firstWidth = existing.width;
27418 var firstHeight = existing.height;
27419 var key = 'dynamicLoad_' + url;
27420
27421 if (gamePhaser.cache.checkImageKey(key)) {
27422 existing.loadTexture(key);
27423 existing.width = firstWidth;
27424 existing.height = firstHeight;
27425 return existing;//gamePhaser.add.image(x, y, key); 
27426 } else {
27427 //var image = gamePhaser.add.image(x, y, fallback);
27428 var loader = new Phaser.Loader(gamePhaser);
27429 loader.image(key, url);
27430 loader.onFileComplete.addOnce(function (progress, cacheKey, success, totalLoaded, totalFiles) {
27431 if (success) {
27432 //llog('loaded uncached image',cacheKey);
27433 setTimeout(function () {
27434
27435 existing.loadTexture(cacheKey);
27436 existing.width = firstWidth;
27437 existing.height = firstHeight;
27438
27439 
27440 //llog('loaded image texture set',cacheKey);
27441 });
27442 } else {
27443 llog('Erreur chgt avat util');
27444 }
27445 }, existing);
27446 //llog('load uncached image',url);
27447 loader.start();
27448 return existing;
27449 }
27450}
27451
27452function getPhaserButtonStyle (myClass) {
27453 var classes = (myClass || 'btn-warning').split(/\s+/);
27454 var style = { textureClass:'btn-warning', tint:null };
27455
27456 for (var i=0;i<classes.length;i++) {
27457 if (classes[i]=='btn-warning' || classes[i]=='btn-danger' || classes[i]=='btn-success' || classes[i]=='btn-info')
27458 style.textureClass = classes[i];
27459 }
27460
27461 // Equivalent Phaser du style CSS .trierBtn, qui ne peut pas etre applique dans le canvas.
27462 if (classes.indexOf('trierBtn')!=-1) {
27463 style.textureClass = 'btn-warning';
27464 style.tint = 0x422d18;
27465 }
27466
27467 return style;
27468}
27469
27470function applyPhaserButtonStyle (button,style) {
27471 if (style.tint!==null)
27472 button.tint = style.tint;
27473}
27474
27475var phaserHtmlTextDecoder;
27476function htmlToPhaserText (value) {
27477 if (value===null || typeof value=='undefined')
27478 return '';
27479
27480 var text = String(value)
27481 .replace(/<br\s*\/?\s*>/gi,'\n')
27482 .replace(/<[^>]*>/g,'');
27483
27484 if (!phaserHtmlTextDecoder)
27485 phaserHtmlTextDecoder = document.createElement('textarea');
27486 phaserHtmlTextDecoder.innerHTML = text;
27487 return phaserHtmlTextDecoder.value;
27488}
27489
27490function createButton (x,y,text,action,myClass) {
27491 var buttonStyle = getPhaserButtonStyle(myClass);
27492 var textureClass = buttonStyle.textureClass;
27493 
27494 var groupBtn = gamePhaser.add.group();
27495 groupBtn.x = Math.round(x);
27496 groupBtn.y = y;
27497 
27498 var quitButton = gamePhaser.add.button(0,0, textureClass+'-border', action, groupBtn );
27499 quitButton.scale.setTo(0.5, 0.5);
27500 quitButton.input.priorityID = 2; // higher priority
27501 groupBtn.add(quitButton);
27502 applyPhaserButtonStyle(quitButton,buttonStyle);
27503 
27504 //llog('createButton',myClass,x,y);
27505 
27506 var quitButton = gamePhaser.add.button(9, 0, textureClass+'-body', action, groupBtn );
27507 quitButton.scale.setTo(0.5, 0.5);
27508 quitButton.input.priorityID = 2; // higher priority
27509 groupBtn.add(quitButton);
27510 applyPhaserButtonStyle(quitButton,buttonStyle);
27511 
27512 var titleBtn = gamePhaser.add.text(9, Math.round(quitButton.height/2), text, { fontSize: '50px', fill: '#fff',font: fontNamePhaser },groupBtn);
27513 //titleBtn.resolution = 1;
27514 titleBtn.anchor.setTo(0,0.5);
27515 titleBtn.scale.setTo(0.5, 0.5);
27516 titleBtn.y = quitButton.height/2;
27517 titleBtn.fontWeight = 'bold';
27518 
27519 quitButton.width = titleBtn.width+2;
27520 //llog('quitButton width',titleBtn.width);
27521
27522 var quitButton = gamePhaser.add.button(9+quitButton.width+2+9/2, 0, textureClass+'-border', action, groupBtn );
27523 quitButton.scale.setTo(-0.5, 0.5);
27524 quitButton.input.priorityID = 2; // higher priority
27525 groupBtn.add(quitButton);
27526 applyPhaserButtonStyle(quitButton,buttonStyle);
27527 
27528 return groupBtn;
27529}
27530
27531
27532var gamePhaser;
27533var phaserSelecteurTour;
27534var phaserMessagePpal;
27535var phaserMessagePpalChevronLeft;
27536var phaserMessagePpalChevronRight;
27537var dataCardsPhaser = [];
27538var cardsShallLoad = 0;
27539var cardsLoaded = 0;
27540var phaserMaskTimer;
27541
27542
27543var globTweenTimer;
27544
27545var groupDesActions;
27546var groupDesActionsBountons;
27547var groupSousActions;
27548var groupCartesAffichess;
27549var fondActions;
27550var scotch;
27551var groupDesCartes;
27552var phaserTableClassique;
27553var groupRuban;
27554var phaserRubanBg;
27555var phaserRubanBg2;
27556var phaserRubanBg2Bg;
27557var phaserRubanBg2Bot;
27558var phaserRubanBg_s;
27559var equipiers_pseudos = [];
27560var equipiers_botTxt = [];
27561var equipiers_avatars = [];
27562var equipiers_cadres = [];
27563var equipiers_leds = [];
27564var equipiers_scoresImg = [];
27565var equipiers_scoresTxt = [];
27566var equipiers_maskrond = [];
27567/*var equipiers_cadresTop = [];
27568var equipiers_cadresBot = [];*/
27569var groupEq = [];
27570
27571var phaserTimerObject;
27572
27573
27574var phaserChatElts;
27575
27576moteurPhaser.initEngine = function (endFunc) {
27577 // Une nouvelle tentative reutilise le moteur deja charge.
27578 if (typeof phaserLoadComplete!='undefined' && phaserLoadComplete) {
27579 endFunc();
27580 return;
27581 }
27582 if (window.TarotCards && window.TarotCards.isReady()) {
27583 var preparedKeys = window.TarotCards.getExpectedKeys();
27584 var preparedIndex;
27585 dataCardsPhaser = [];
27586 cardsShallLoad = preparedKeys.length+1;
27587 cardsLoaded = 0;
27588 for (preparedIndex=0;preparedIndex<preparedKeys.length;preparedIndex++) {
27589 dataCardsPhaser[preparedKeys[preparedIndex]] = window.TarotCards.getImage(preparedKeys[preparedIndex]);
27590 if (!dataCardsPhaser[preparedKeys[preparedIndex]]) {
27591 throw new Error('Carte decodee absente : '+preparedKeys[preparedIndex]);
27592 }
27593 cardsLoaded++;
27594 }
27595 dataCardsPhaser['Verso'] = window.TarotCards.getImage('Verso');
27596 if (!dataCardsPhaser['Verso']) throw new Error('Verso decode absent');
27597 cardsLoaded++;
27598 setTimeout(function () { initEngineInt(endFunc); },0);
27599 return;
27600 }
27601 if (typeof cacheCarteHR == 'undefined') {
27602 setTimeout(function () {
27603 moteurPhaser.initEngine(endFunc);
27604 },1000);
27605 return;
27606 }
27607 for (var i in cacheCarteHR) {
27608 cardsShallLoad++;
27609 var data64 = getCardJSIMG(i);
27610 dataCardsPhaser[i] = new Image();
27611 dataCardsPhaser[i].idIT = i;
27612 dataCardsPhaser[i].onload = function () {
27613 cardsLoaded++;
27614 if (cardsLoaded==cardsShallLoad) {
27615 setTimeout(function () {
27616  initEngineInt(endFunc);
27617 },0);
27618 }
27619 //gamePhaser.cache.addImage(this.idIT,data64,dataCardsPhaser[this.idIT]);
27620 };
27621 dataCardsPhaser[i].src = data64;
27622
27623 }
27624 cardsShallLoad++;
27625 if (typeof dosDesCartes !=='undefined')
27626 var data64 = imgPresJSprocess(dosDesCartes); 
27627 else if (typeof versoCarteHR !=='undefined')
27628 var data64 = imgPresJSprocess(versoCarteHR); 
27629 else
27630 var data64 = versoCarte; 
27631
27632 dataCardsPhaser['Verso'] = new Image();
27633 dataCardsPhaser['Verso'].idIT = 'Verso';
27634 dataCardsPhaser['Verso'].onload = function () {
27635 cardsLoaded++;
27636 if (cardsLoaded==cardsShallLoad) {
27637 setTimeout(function () {
27638 initEngineInt(endFunc);
27639 },0);
27640 }
27641 //gamePhaser.cache.addImage(this.idIT,data64,dataCardsPhaser[this.idIT]);
27642 };
27643 dataCardsPhaser['Verso'].src = data64;
27644}
27645var loadingSprite;
27646var currentProgress = 0;
27647
27648function refreshProgress() {
27649 if (!loadingSprite) return;
27650 //llog("File Complete: " + progress + "% - " + totalLoaded + " out of " + totalFiles);
27651 loadingSprite.text.setText(currentProgress + "%")
27652 //loadingSprite.masque.x--;
27653 loadingSprite.masque.clear();
27654 loadingSprite.masque.beginFill(0xffffff);
27655 loadingSprite.masque.drawRect(-loadingSprite.logo.width/2, -loadingSprite.logo.height/2, loadingSprite.logo.width*currentProgress/100,loadingSprite.logo.height);
27656 //loadingSprite.logo.mask = loadingSprite.masque;
27657}
27658
27659var createTextCalled = false;
27660function initEngineInt(endFunc) {
27661 if (phaserLoadStarted) return;
27662 phaserLoadStarted = true;
27663 llog('initEngine');
27664 $('#webBody').html('');
27665
27666 
27667 $(document.body).css('overflow','hidden');
27668 
27669 var pixRatio = 1;
27670 if (window.devicePixelRatio && !isLowGraphism)
27671 pixRatio = window.devicePixelRatio;
27672 
27673 var config = {
27674 "width": window.innerWidth * pixRatio,//,// * window.devicePixelRatio,//$( window ).width()-20,
27675 "height": window.innerHeight * pixRatio,//,// * window.devicePixelRatio,//$( window ).height()-20,
27676 "renderer": Phaser.AUTO,
27677 "parent": 'webBody',
27678 transparent:true,
27679 antialias:true,//!isLowGraphism,
27680 //"resolution": window.devicePixelRatio,
27681 "state": { preload: preloadEngine, update: updateEngine }
27682 };
27683 gamePhaser = new Phaser.Game(config);
27684 
27685 WebFontConfig = {
27686 //active: function() { gamePhaser.time.events.add(Phaser.Timer.SECOND, function () {} , this); },//createText
27687 fontactive : function(familyName, fvd) { gamePhaser.time.events.add(Phaser.Timer.SECOND, function () {
27688  llog('font active'+familyName+ fvd);
27689  if (familyName==fontNamePhaser) {
27690  setTimeout(createText,1000);
27691  }
27692 } , this); },//createText
27693 fontinactive: function(familyName, fvd) {
27694 llog('Err font font fontinactive'+familyName+ fvd);
27695  if (familyName==fontNamePhaser) {
27696  //errorLog('Erreur chargement police de caractere',fvd);
27697  }
27698 },
27699 custom: {
27700  families: [fontNamePhaser]
27701  },
27702 /*google: {
27703  families: ['Quicksand']//Roboto
27704 },*/
27705 timeout: 60000
27706 
27707 };
27708 function checkEventFix() {
27709 if (createTextCalled) return;
27710 if ($('html').hasClass( 'wf-active' )) {
27711 llog("Event fix ");
27712 createText();
27713 }
27714 }
27715 function updateEngine() {
27716 updatePhaserTimer();
27717 }
27718
27719 function checkCreateText() {
27720 checkEventFix();
27721 if (!createTextCalled) {
27722 //errorLog('Erreur chargement police de caractere par timeout 10',"createText not called after 20s - html class : "+$('html').attr('class') );
27723 createText();
27724 }
27725 }
27726 // This callback is sent the following parameters:
27727 function fileComplete(progress, cacheKey, success, totalLoaded, totalFiles) {
27728
27729 if (phaserLoadComplete) return;
27730 currentProgress = progress;
27731 refreshProgress();
27732
27733 }
27734
27735
27736 function loadComplete() {
27737 //return;
27738 llog("Load Complete ");
27739 if (!loadingSprite) return;
27740 //text.setText("Load Complete");
27741 loadingSprite.logo.destroy();
27742 loadingSprite.logo2.destroy();
27743 loadingSprite.masque.destroy();
27744 loadingSprite.text.destroy();
27745 loadingSprite = null;
27746 phaserLoadComplete = true;
27747 
27748 endFunc();
27749 }
27750 function createText() {
27751 llog('Text loaded engine init ended');
27752 if (createTextCalled) return;
27753 createTextCalled = true;
27754 //gamePhaser.scale.setGameSize($( window ).width() * window.devicePixelRatio, $( window ).height() * window.devicePixelRatio);
27755
27756
27757 // You can listen for each of these events from Phaser.Loader
27758 //gamePhaser.load.onLoadStart.add(loadStart, this);
27759 gamePhaser.load.onFileComplete.add(fileComplete, this);
27760 gamePhaser.load.onLoadComplete.add(loadComplete, this);
27761
27762 loadingSprite = {};
27763 loadingSprite.logo2 = gamePhaser.add.sprite(getWorldW()/2,getWorldH()/2 , 'L
27763ogo');
27764 loadingSprite.logo2.anchor.setTo(0.5,0.5);
27765 loadingSprite.logo2.alpha=0.2;
27766 var scaleLogo = 1;
27767 if (loadingSprite.logo2.width>getWorldW()*0.9)
27768 scaleLogo = getWorldW()*0.9/loadingSprite.logo2.width;
27769 
27770 loadingSprite.logo2.scale.setTo(scaleLogo);
27771 
27772 loadingSprite.logo = gamePhaser.add.sprite(getWorldW()/2,getWorldH()/2 , 'Logo');
27773 loadingSprite.logo.anchor.setTo(0.5,0.5);
27774 loadingSprite.logo.scale.setTo(scaleLogo);
27775 
27776
27777 loadingSprite.masque = gamePhaser.add.graphics(getWorldW()/2,getWorldH()/2);
27778 
27779 loadingSprite.masque.beginFill(0xffffff);
27780 loadingSprite.masque.drawRect(-loadingSprite.logo.width/2, -loadingSprite.logo.height/2, 10,loadingSprite.logo.height);
27781 loadingSprite.masque.anchor.setTo(0.5,0.5);
27782 //loadingSprite.masque.x=-loadingSprite.logo.width/2;
27783 loadingSprite.logo.mask = loadingSprite.masque;
27784 
27785
27786 loadingSprite.text = gamePhaser.add.text(getWorldW()/2, getWorldH()/2+loadingSprite.logo.height/2, '0%', { fontSize: '36px', fill: '#fff',font: fontNamePhaser } );
27787 loadingSprite.text.anchor.setTo(0.5,0);
27788 loadingSprite.text.setShadow(2, 2, 'rgba(0,0,0,0.5)', 2);
27789
27790 $( window ).resize(function() {
27791 setWorldDIM();
27792 reorganiseCartes ("fromZomm");//
27793 }); 
27794 setWorldDIM();
27795 reorganiseCartes ();//
27796 
27797 loadRessources();
27798 
27799 }
27800 function preloadEngine() {
27801 setWorldDIM();
27802 llog('Start preloadEngine');
27803 gamePhaser.stage.disableVisibilityChange = true;
27804 gamePhaser.load.image('Logo', '/Jeu-Tarot-en-ligne/LogoHeaderSm.png');
27805 gamePhaser.load.script('webfont', '/js/webfont.js');
27806 setTimeout(checkCreateText,20000);
27807 setTimeout(checkEventFix,4000);
27808 //this._loadingBar = this.add.sprite(this.world.centerX - 100, this.world.centerY, "Logo"); 
27809
27810 }
27811 function loadRessources() {
27812 //gamePhaser.stage.disableVisibilityChange = true;
27813 gamePhaser.stage.backgroundColor = 0xffffff;
27814
27815 ///images/logo.png 
27816 for (var i=1;i<9;i++)
27817 gamePhaser.load.image('IA-'+i, '/images/IAs/IA-'+i+'.jpg');
27818
27819 gamePhaser.load.image('FFT', '/Jeu-Tarot-en-ligne/Signalisatipon-FFT4.png');
27820 
27821 gamePhaser.load.image('Couleur1', '/images/Couleurs/PhaserB1.png');
27822 gamePhaser.load.image('Couleur2', '/images/Couleurs/PhaserB2.png');
27823 gamePhaser.load.image('Couleur3', '/images/Couleurs/PhaserB3.png');
27824 gamePhaser.load.image('Couleur4', '/images/Couleurs/PhaserB4.png');
27825
27826 gamePhaser.load.image('AppelC', '/images/Couleurs/WC2.png');
27827 gamePhaser.load.image('AppelD', '/images/Couleurs/WD2.png');
27828 gamePhaser.load.image('AppelR', '/images/Couleurs/WR2.png');
27829 gamePhaser.load.image('AppelV', '/images/Couleurs/WV2.png');
27830
27831 gamePhaser.load.image('Note', '/img/Jeu/Note.png');
27832 gamePhaser.load.image('Scotch', '/img/Jeu/Scotch.png');
27833 
27834 gamePhaser.load.image('Donneur', '/img/Jeu/Donneur.png');
27835 gamePhaser.load.image('TourDeJeu', '/img/Jeu/TourDeJeu.png');
27836 
27837 gamePhaser.load.image('Avat_Nobody', '/avatars/Nobody2.jpg');
27838 gamePhaser.load.image('Avat_Unknown', '/avatars/Unknown.jpg');
27839  
27840  
27841 gamePhaser.load.image('Rubans_s', '/Jeu-Tarot-en-ligne/Jeu/Rubans_s.png');
27842 gamePhaser.load.image('Rubans', '/Jeu-Tarot-en-ligne/Jeu/Rubans.png');
27843 gamePhaser.load.image('Ruban2', '/img/Jeu/Bandeau.png');
27844 gamePhaser.load.image('Ruban2Bot', '/img/Jeu/BandeauBot.png');
27845 gamePhaser.load.image('ChevronLeft', '/img/Jeu/BandeauDeco.png');
27846 gamePhaser.load.image('ChevronRight', '/img/Jeu/BandeauDeco2.png');
27847 gamePhaser.load.image('TableClassique', '/img/Jeu/Table1600x1200.png');
27848 
27849 gamePhaser.load.image('MasqueB', '/Jeu-Tarot-en-ligne/Masques/MasqueB.gif');
27850 gamePhaser.load.image('MasqueD', '/Jeu-Tarot-en-ligne/Masques/MasqueD.gif');
27851 gamePhaser.load.image('Selecteur', '/Jeu-Tarot-en-ligne/Icones/Selecteur.png');
27852
27853 gamePhaser.load.image('LedVert', '/img/Jeu/LedVert.png');
27854 gamePhaser.load.image('LedRouge', '/img/Jeu/LedRouge.png');
27855
27856 gamePhaser.load.image('ReTimerPlein', '/img/Jeu/TimerPlein.png');
27857 gamePhaser.load.image('ReTimerVide', '/img/Jeu/TimerVide.png');
27858 gamePhaser.load.image('ChatBot', '/img/Jeu/ChatBot2.png');
27859 gamePhaser.load.image('ChatMid', '/img/Jeu/ChatMid2.png');
27860 gamePhaser.load.image('ChatTop', '/img/Jeu/ChatTop2.png');
27861
27862 gamePhaser.load.image('ChatBot3', '/img/Jeu/ChatBot3.png');
27863 gamePhaser.load.image('ChatMid3', '/img/Jeu/ChatMid3.png');
27864 gamePhaser.load.image('ChatTop3', '/img/Jeu/ChatTop3.png');
27865 
27866 for (var oo=0;oo<63;oo++)
27867 gamePhaser.load.image('Emoticon'+oo, '/images/Emoticon/Emoticon'+oo+'.png?v=4');
27868 for (var collectionIndex=0;collectionIndex<myCollectionEmots.length;collectionIndex++) {
27869 var collectionDefinition = collectionEmoticonsCatalogue[myCollectionEmots[collectionIndex]];
27870 if (collectionDefinition)
27871 gamePhaser.load.image(collectionDefinition.key,collectionDefinition.image);
27872 }
27873
27874 gamePhaser.load.image('Accessoire01', '/img/Jeu/Accessoires/Accessoire01.png');
27875 gamePhaser.load.image('Accessoire02', '/img/Jeu/Accessoires/Accessoire02.png');
27876 gamePhaser.load.image('Accessoire03', '/img/Jeu/Accessoires/Accessoire03.png');
27877 gamePhaser.load.image('Accessoire04', '/img/Jeu/Accessoires/Accessoire04.png');
27878 gamePhaser.load.image('Accessoire05', '/img/Jeu/Accessoires/Accessoire05.png');
27879 gamePhaser.load.image('Accessoire06', '/img/Jeu/Accessoires/Accessoire06.png');
27880 gamePhaser.load.image('Accessoire07', '/img/Jeu/Accessoires/Accessoire07.png');
27881 gamePhaser.load.image('Accessoire08', '/img/Jeu/Accessoires/Accessoire08.png');
27882 gamePhaser.load.image('Accessoire09', '/img/Jeu/Accessoires/Accessoire09.png');
27883 gamePhaser.load.image('Accessoire010', '/img/Jeu/Accessoires/Accessoire10.png');
27884 gamePhaser.load.image('Accessoire011', '/img/Jeu/Accessoires/Accessoire11.png');
27885 gamePhaser.load.image('Accessoire012', '/img/Jeu/Accessoires/Accessoire12.png');
27886 
27887 
27888 gamePhaser.load.image('CarteOmbre', '/img/Jeu/CarteOmbre.png');
27889 //gamePhaser.load.image('RoundedCorner', '/img/Jeu/RoundedCorner.png');
27890 
27891 gamePhaser.load.image('MaskRondEquipier', '/img/Jeu/MaskRondEquipier.png');
27892 gamePhaser.load.image('EquipierScore', '/img/Jeu/EquipierScore.png');
27893
27894 gamePhaser.load.image('iconBigger', '/images/icones/Bigger.png');
27895 gamePhaser.load.image('iconClose', '/images/icones/Close.png');
27896 gamePhaser.load.image('iconDown', '/images/icones/down.png');
27897 
27898 gamePhaser.load.image('roleNobody', '/img/Jeu/EquipierVide2.png');
27899 gamePhaser.load.image('roleAnnonce', '/img/Jeu/EquipierVide2.png');
27900 gamePhaser.load.image('roleEquipier', '/img/Jeu/EquipierEquipier2.png');
27901 gamePhaser.load.image('rolePreneurPrise', '/img/Jeu/EquipierPrise2.png');
27902 gamePhaser.load.image('rolePreneurGarde', '/img/Jeu/EquipierGarde2.png');
27903 gamePhaser.load.image('rolePreneurGardesans', '/img/Jeu/EquipierGardeSans2.png');
27904 gamePhaser.load.image('rolePreneurGardecontre', '/img/Jeu/EquipierGardeContre2.png');
27905 gamePhaser.load.image('roleDefaite', '/img/Jeu/EquipierDefeat2.png');
27906 gamePhaser.load.image('roleVictoire', '/img/Jeu/EquipierVictory2.png');
27907 
27908 gamePhaser.load.image('ToproleNobody', '/images/icones/TopCadreVide.png');
27909
27910 gamePhaser.load.image('btn-warning-border', '/images/Buttons/Btn_Warning_Border.png');
27911 gamePhaser.load.image('btn-warning-body', '/images/Buttons/Btn_Warning_Body.png');
27912 
27913 gamePhaser.load.image('btn-danger-border', '/images/Buttons/Btn_Danger_Border.png');
27914 gamePhaser.load.image('btn-danger-body', '/images/Buttons/Btn_Danger_Body.png');
27915 
27916 gamePhaser.load.image('btn-success-border', '/images/Buttons/Btn_Success_Border.png');
27917 gamePhaser.load.image('btn-success-body', '/images/Buttons/Btn_Success_Body.png');
27918 
27919 gamePhaser.load.image('btn-info-border', '/images/Buttons/Btn_Info_Border.png');
27920 gamePhaser.load.image('btn-info-body', '/images/Buttons/Btn_Info_Body.png');
27921 
27922 gamePhaser.load.image('TimerVide', '/images/icones/TimerVide.png');
27923 gamePhaser.load.image('TimerPlein', '/images/icones/TimerPlein.png');
27924
27925
27926 
27927 if (isLowGraphism)
27928 gamePhaser.load.image('Selecteur', '/Jeu-Tarot-en-ligne/Icones/SelecteurOFF.png');
27929 else
27930 gamePhaser.load.image('Selecteur', '/Jeu-Tarot-en-ligne/Icones/Selecteur.png');
27931 
27932 for (var i in cacheCarteHR) {
27933 var data64 = getCardJSIMG(i);
27934 gamePhaser.cache.addImage(i,data64,dataCardsPhaser[i]);
27935 }
27936 if (typeof dosDesCartes !=='undefined')
27937 var data64 = imgPresJSprocess(dosDesCartes); 
27938 else if (typeof versoCarteHR !=='undefined')
27939 var data64 = imgPresJSprocess(versoCarteHR); 
27940 else
27941 var data64 = versoCarte; 
27942 gamePhaser.cache.addImage('Verso',data64,dataCardsPhaser['Verso']);
27943 gamePhaser.load.start();
27944 
27945 }
27946}
27947var MotherEquipierGroup;
27948function getHeaderHeight() {
27949 if (phaserRubanBg.alpha>0) return phaserRubanBg.height*groupRuban.scale.y-15;
27950 if (phaserRubanBg_s.alpha>0) return phaserRubanBg_s.height*groupRuban.scale.y;
27951 return (phaserRubanBg2Bot.height+phaserRubanBg2Bot.y)*groupRuban.scale.y;
27952}
27953
27954function getMainCartesVisibleH() {
27955 var res = getPlayedCardSize().h;
27956 if (res>getWorldH()/3)
27957 res=getWorldH()/3;
27958
27959
27960 if (!phaserMyTurn) {
27961 res -= 40;
27962 if (getWorldW()<500 || getWorldH()<400)
27963 res -= 40;
27964 }
27965 if (res<85)
27966 res = 85;
27967
27968 if (getWorldW()<400 && getWorldH()<550)
27969 return 78;
27970 if (getWorldH()<400 )
27971 return 78;
27972 if (getWorldW()<600 && getWorldH()<630) {
27973 if (phaserMyTurn)
27974 res = 90;
27975 else
27976 res = 80;
27977 }
27978 return res;
27979 
27980 
27981 if (phaserMyTurn) {
27982 var res = getPlayedCardSize().h;
27983 if (res>getWorldH()/3)
27984 res=getWorldH()/3;
27985 if (res<85)
27986 res = 85;
27987 return res;
27988 }
27989 if (getWorldW()<400)
27990 return 95;
27991 if (getWorldH()<400)
27992 return 85;
27993 return 135;
27994}
27995function getRubanFontSize() {
27996 if (getWorldH()<400 && techniqueLevelAnim<50)
27997 return 45;
27998 return 58;
27999}
28000function getPlateauTxtSize() {
28001
28002 var msgFontSize = 21;
28003 if (getWorldW()<800)
28004 msgFontSize = 20;
28005 if (getWorldH()<800)
28006 msgFontSize = 20;
28007 if (getWorldW()<600)
28008 msgFontSize = 19;
28009 if (getWorldW()<500)
28010 msgFontSize = 18;
28011 if (getWorldH()<500)
28012 msgFontSize = 16;
28013 if (getWorldW()<400)
28014 msgFontSize = 14;
28015 return msgFontSize;
28016}
28017function getCarteAffW() {
28018 if (getWorldW()<500)
28019 return 70;
28020 if (getWorldH()<500)
28021 return 70;
28022 return 100;
28023}
28024
28025function getActionAnchor() {
28026 if (isTechniqueMode) return 0;
28027 else return 0.5;
28028}
28029
28030function geHorizSpacingCards() {
28031 if (techniqueLevelAnim>50) return 60;
28032 /*if (getWorldH()<400)
28033 return 42;*/
28034
28035 if (getModeleCartes()==2) {
28036 if (getWorldW()<800 ) {
28037 return 65;
28038 }
28039 if (getWorldW()<1200 ) {
28040 return 70;
28041 }
28042 return 110;
28043 }
28044 if (getWorldH()<400)
28045 return 30;
28046 if (getWorldW()<500 && getWorldH()<550)
28047 return 30;
28048 if (getWorldW()<550)
28049 return 40;
28050 return 55;
28051}
28052function geVertSpacingCards() {
28053
28054 if (getModeleCartes()==2) {
28055 if (getWorldW()<800 ) {
28056 return 45;
28057 }
28058 if (getWorldW()<1200 ) {
28059 return 60;
28060 }
28061 return 65;
28062 }
28063 var ecartMinCartesTechnique = 50;
28064 var ecartMinCartesClassique = 45;
28065 if (getWorldW()<500 || getWorldH()<400) {
28066 ecartMinCartesClassique = 40;
28067 }
28068 if (getWorldW()<550 && getWorldH()<550)
28069 ecartMinCartesClassique = 30;
28070 var ecartMinCartes = techniqueLevelAnim/100*ecartMinCartesTechnique+(100-techniqueLevelAnim)/100*ecartMinCartesClassique;
28071 return ecartMinCartes;
28072}
28073
28074function getPlateauCardSize() {
28075 var cardWidth0 = 120;
28076 var cardWidth100 = 150;
28077
28078 if (!groupEq[0]) return 130;
28079 
28080 var cardWidth = cardWidth100*techniqueLevelAnim/100+cardWidth0*(100-techniqueLevelAnim)/100;
28081 if (cardWidth>groupEq[0].width)
28082 cardWidth = groupEq[0].width;
28083 if (cardWidth*129/70>groupEq[0].height)
28084 cardWidth = groupEq[0].height/129*70;
28085 if (cardWidth<80)
28086 cardWidth = 80;
28087 if (getWorldW()<500)
28088 cardWidth = 70;
28089 return {w:cardWidth,h:cardWidth*129/70};
28090}
28091
28092//En fait c'est la taille des cartes en main...dsl
28093function getPlayedCardSize() {
28094 
28095 var cardWidth0 = 130;
28096 var cardWidth100 = getPlateauCardSize().w;
28097
28098 if (getModeleCartes()==2) { 
28099 cardWidth0 = 110;
28100 if (getWorldW()<1200 ) {
28101 cardWidth0 = 90;
28102 }
28103 if (getWorldW()<800 ) {
28104 cardWidth0 = 60;
28105 }
28106 return {w:cardWidth0,h:cardWidth0*129/70};
28107 }
28108 if (cardWidth100<100)
28109 cardWidth100 = 100;
28110 
28111 if (getWorldW()<500)
28112 cardWidth0 = 110;
28113
28114 if (getWorldH()<500)
28115 cardWidth0 = 90;
28116 if (getWorldW()<500 && getWorldH()<550)
28117 cardWidth0 = 90;
28118 
28119 var cardWidth = cardWidth100*techniqueLevelAnim/100+cardWidth0*(100-techniqueLevelAnim)/100;
28120 //cardWidth = 300;
28121 return {w:cardWidth,h:cardWidth*129/70};
28122
28123} 
28124
28125function getCartesAfficheesWidth() { // DERNIER PLI
28126
28127 var carteAffW = getCarteAffW();
28128 var wwi0 = Math.min(800,getWorldW()*80/100);
28129 var wwi100 = Math.min(carteAffW+(phaserShownCardsPli.cardsList.length-1)*40+6,getWorldW()*50/100);
28130 if (getWorldW()<500) {
28131 if (groupEq.length>=5)
28132 wwi100 = Math.min(carteAffW+40*5+6,carteAffW+(phaserShownCardsPli.cardsList.length-1)*40+6,getWorldW()*50/100);
28133 else
28134 wwi100 = Math.min(carteAffW+40*4+6,carteAffW+(phaserShownCardsPli.cardsList.length-1)*40+6,getWorldW()*65/100);
28135 }
28136 if (phaserChatElts && getWorldW()>=600) {
28137 wwi0 = (getWorldW()-20)/2-3;
28138 }
28139 if ( getWorldW()<600) {
28140 wwi0 = getWorldW()-20;
28141 }
28142 var wwi = techniqueLevelAnim/100*wwi0+(100-techniqueLevelAnim)/100*wwi100;
28143 return wwi;
28144}
28145function getMessageTexteHeight(hauteurLignesAction) {
28146 var res = getWorldH()-groupEq[whoamiNum].height*2-10-getHeaderHeight();//groupEq[whoamiNum].goY-groupEq[(whoamiNum+2)%4].goY-groupEq[whoamiNum].height;
28147 if (phaserActionBtns.length>0) {
28148 res -= 5+hauteurLignesAction;
28149 }
28150 if (res<110)
28151 res = 110;
28152 if (res>200)
28153 res = 200;
28154 if (res>messagePlateau.textPlateau.height)
28155 res=messagePlateau.textPlateau.height;
28156 if (techniqueLevelAnim>0)
28157 res=messagePlateau.textPlateau.height;
28158 return res;
28159}
28160function getActionsWidth() {
28161
28162 var actionsWidth0 = Math.min(getWorldW()-groupEq[0].width*2-10,480);
28163 var actionsWidth100 = Math.min(getWorldW()-20,800);
28164 /*if (phaserChatElts) {
28165 actionsWidth100 = (getWorldW()-20)/2-3
28166 }*/
28167 var actionsWidth = techniqueLevelAnim==100?actionsWidth100:actionsWidth0;//techniqueLevelAnim/100*actionsWidth100+(100-techniqueLevelAnim)/100*actionsWidth0;
28168 return actionsWidth;
28169}
28170function tweenFond(item,group,x,y,width,height,alpha,radius,endf) {
28171//return;
28172 if (!item) return;
28173 if (item.isTweening) return;
28174 item.isTweening = true;
28175 //llog('tweenFond',x+','+y,width+'x'+height,alpha,radius);
28176 var tww = gamePhaser.add.tween(item);
28177 tww.to({ x:x,y:y,width:width,height:height,alpha:alpha }, 500, Phaser.Easing.Linear.None, true, 0);
28178
28179 tww.onComplete.add(function () {
28180 //llog('recreate fond rounded');
28181 var oldAlpha = item.alpha;
28182 item.destroy();
28183 item = gamePhaser.add.graphics(x,y);
28184 item.beginFill(0xffffff);
28185 item.drawRoundedRect(-width/2, 0, width, height,radius);
28186 item.anchor.setTo(0.5,0); 
28187 item.alpha = oldAlpha;
28188 if (group)
28189 group.add(item);
28190 if (endf)
28191 endf(item);
28192 }, this);
28193}
28194function blurredTextInputPhaser() {
28195 isTextInputFocusedIos=false;
28196}
28197function focusedTextInputPhaser() {
28198 if (isIos()) {
28199 if (!isTextInputFocusedIos) {
28200 isTextInputFocusedIos=true;
28201 }
28202 }
28203 
28204}
28205moteurPhaser.createGameBoard = function (modeJeu,chatJoueurs,nbJoueurs,etesVousLa,smileyOnly)
28206{
28207 moteurPhaser.chatJoueurs = chatJoueurs!=0;
28208 setWorldDIM();
28209 //llog(' * ** * * ** * * ** * * board creation',modeJeu,chatJoueurs,nbJoueurs);
28210 llog('create Game Board '+nbJoueurs+'players');
28211 phaserGBShown = true;
28212 var equipeHTML = '';
28213
28214 equipeHTML += '<div id="bottomGame">';
28215 
28216 
28217 equipeHTML += '<div class="clear"></div>';
28218 equipeHTML += '<div id="chatBg" style="padding:1px;">'; 
28219 equipeHTML += '<table style="" id="chatTable">';  
28220 equipeHTML += '<tr>'; 
28221 if (chatJoueurs!=0 && !window.disableEmoticons ) {
28222 equipeHTML += '<td onclick="toggleEmot();" id="IMGEMOT" style="background-image: url(\'/images/Emoticon/Emoticon0.png?v=4\');"></td>'; 
28223 } 
28224 equipeHTML += '<td style="padding-left:4px" id="chtput">';  
28225
28226 if (chatJoueurs!=0 ) {
28227 if (!smileyOnly)
28228 equipeHTML += '<input id="chatInput" autocomplete="off" onclick="focusedTextInputPhaser();showChatPhaserD();" onfocus="focusedTextInputPhaser();
28228" onblur="blurredTextInputPhaser();" maxlength="255" type="text">';
28229 else
28230 equipeHTML += '<input id="chatInput" disabled="disabled" value="'+smileyOnly+'" type="text">';
28231 }
28232 
28233 equipeHTML += '</td><td id="actBtnsJ" style="">'; 
28234 if (chatJoueurs!=0 && !smileyOnly) {
28235 equipeHTML += '<a id="chatInputBtn" class="btn btn-default btn-bottomGame" onclick="sendChatMessage($$(\'chatInput\').value);" href="#">Dire</a>'; 
28236 }
28237 equipeHTML += '</td><td onclick="ouvrirReglesModeJeu(this.getAttribute(&quot;data-mode-jeu&quot;));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute(&quot;data-mode-jeu&quot;));" role="button" tabindex="0" id="IMGMJB" data-mode-jeu="'+modeJeu+'" aria-label="Afficher les r&egrave;gles de ce mode de jeu" title="R&egrave;gles - '+getGameName(modeJeu)+'" style="background-image: url(\''+getModeJeuIcone(modeJeu)+'\');">'; 
28238 if (document.getElementById('soundEnabled') && document.getElementById('soundEnabled').value=='1') {
28239 equipeHTML += '</td><td id="muteBtn" title="Activer/Désactiver le son" style="background-image: url(\'/Jeu-Tarot-en-ligne/Jeu/mute.png\');">';
28240 } 
28241 equipeHTML += '</td><td id="quitTD"><a style="margin-left:4px;margin-right:14px;" id="BTNQUT" class="btn btn-warning btn-bottomGame" onclick="btnQuitAction();" href="#">Quitter</a>';   
28242 equipeHTML += '</td></tr></table>';   
28243 
28244 equipeHTML += '</div>'; 
28245 equipeHTML += '</div>';
28246 equipeHTML += '<div class="clear"></div>'; 
28247 equipeHTML += '<input type="hidden" id="modeJeuSalon" value="'+modeJeu+'"/> ';
28248 
28249 $(document.body).append(equipeHTML);
28250 
28251
28252 $('#webBody').css('overflow','hidden');
28253 $('#webBody').css('height',getWorldH()+'px');
28254
28255
28256 $('#muteBtn').click(toggleSound);
28257 if (gcookie('muteMusic')=='1') { gameSoundsEnabled=true;toggleSound(); }
28258 
28259 if (chatJoueurs!=0 && !smileyOnly) {
28260 shouldBlurInputMessageGame = true;
28261
28262 resetChatInputValidationKeys();
28263
28264 }
28265 if (smileyOnly===true) {
28266 toggleEmot();
28267 window.isSmileyOnly = true;
28268 $('#IMGEMOT').hide();
28269 }
28270 if (chatJoueurs!=0 ) {
28271
28272 $('#webBody').click(function () {
28273 blurAll();
28274 } );
28275 }
28276 window.scroll(0,0);
28277
28278 var startScrollX = 0,startScrollY = 0;
28279 var pageScroll=0,pageScrollOffset=0, lastTouchY=0;
28280 window.startTouchScroll = function(){ 
28281 $('#webBody canvas').bind('touchmove',function(e){ 
28282 e.preventDefault(); 
28283 e.stopPropagation(); 
28284 var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; 
28285 var elm = $(this).offset(); 
28286 var maxScroll = $(this).height(); 
28287 var x = touch.pageX - elm.left; 
28288 var y = touch.clientY - elm.top; 
28289 if(lastTouchY!=0){  
28290 pageScrollOffset = lastTouchY-y;  
28291 if (pageScroll+pageScrollOffset>$(document).height()-$(window).height()) 
28292 pageScrollOffset=0;  
28293 pageScroll += pageScrollOffset;  
28294 if (pageScroll<0) pageScroll=0; 
28295 } 
28296 lastTouchY = y;  
28297 if(x < $(this).width() && x > 0){  
28298 if(y < $(this).height() && y > 0){  
28299 $('html,body').scrollTop(pageScroll);  
28300 } 
28301 }
28302 }); 
28303 $('#webBody canvas').bind('touchend',function(e){ 
28304 e.preventDefault();
28305 e.stopPropagation(); 
28306 lastTouchY=0; 
28307 }); 
28308 $('#webBody canvas').bind('touchstart',function(e){ 
28309 e.preventDefault(); 
28310 e.stopPropagation();
28311 //startScrollX 
28312 });
28313 }
28314 window.startTouchScroll();
28315 //Phaser.Canvas.setTouchAction(gamePhaser.canvas, "auto"); // disable the default "none"
28316 //gamePhaser.input.touch.preventDefault = false;
28317 
28318 groupCartesAffichess = gamePhaser.add.group();
28319
28320 phaserTableClassique = gamePhaser.add.sprite(getWorldW()/2,getWorldH() , 'TableClassique');
28321 phaserTableClassique.anchor.setTo(0.5,0);
28322 phaserTableClassique.scale.setTo(getWorldW()/phaserTableClassique.width);
28323
28324 var groupAccessoires = gamePhaser.add.group();
28325
28326 groupRuban = gamePhaser.add.group();
28327 groupRuban.y = -100;
28328
28329 
28330 
28331 phaserRubanBg = groupRuban.create(0, 0 , 'Rubans');
28332 phaserRubanBg.anchor.setTo(0.5,0);
28333 phaserRubanBg.visible = false;
28334
28335 phaserRubanBg_s = gamePhaser.add.tileSprite(0, 0, Math.max(getWorldW()*6,15000), 134, 'Rubans_s');
28336 phaserRubanBg_s.anchor.setTo(0.5,-0.05);
28337
28338
28339 var rub2WW = Math.max(getWorldW()*6,15000);
28340 
28341 phaserRubanBg2Bg = gamePhaser.add.graphics(0,0);
28342 //phaserRubanBg2Bg.anchor.setTo(0.5,0);
28343 //phaserRubanBg2Bg.clear();
28344 phaserRubanBg2Bg.beginFill(0xcc3a2f);//
28345 phaserRubanBg2Bg.drawRect(-rub2WW/2,0,rub2WW ,60);
28346 groupRuban.add(phaserRubanBg2Bg);
28347 
28348 phaserRubanBg2 = groupRuban.create(0, 0 , 'Ruban2');
28349 phaserRubanBg2.anchor.setTo(0.5,0);
28350 phaserRubanBg2.width = rub2WW;
28351
28352 phaserRubanBg2Bot = groupRuban.create(0, 60 , 'Ruban2Bot');
28353 phaserRubanBg2Bot.anchor.setTo(0.5,0);
28354 phaserRubanBg2Bot.width = rub2WW;
28355 
28356 phaserMessagePpalChevronLeft = groupRuban.create(0, 56 , 'ChevronLeft');
28357 phaserMessagePpalChevronRight = groupRuban.create(0, 56 , 'ChevronRight');
28358 
28359 groupRuban.add(phaserRubanBg_s);
28360 
28361 groupRuban.x = (getWorldW())/2;
28362 
28363
28364 phaserSelecteurTour = gamePhaser.add.sprite(getWorldW()/2,15 , 'Selecteur');
28365 phaserSelecteurTour.anchor.setTo(0.5,1);
28366 phaserSelecteurTour.scale.setTo( 0.5 );
28367 phaserSelecteurTour.visible=false;
28368 
28369 MotherEquipierGroup = gamePhaser.add.group();
28370 
28371 for (var i=0;i<nbJoueurs;i++)
28372 {
28373 var accessoire = gamePhaser.add.sprite(50,60 , 'Accessoire0'+Math.floor(1+0+Math.random()*(12)) );
28374 accessoire.anchor.setTo(0.5,0.5);
28375 accessoire.scale.setTo(0.7);
28376 accessoire.angle = Math.random()*40-20;
28377 groupAccessoires.add(accessoire);
28378 
28379 groupEq[i] = gamePhaser.add.group();
28380 MotherEquipierGroup.add(groupEq[i]);
28381 groupEq[i].x = getWorldW()/2-290/2;//useless 
28382 groupEq[i].y = 0;
28383 groupEq[i].goX = groupEq[i].x;
28384 groupEq[i].goY = groupEq[i].y;
28385 groupEq[i].accessoire = accessoire;
28386
28387 
28388 equipiers_avatars[i] = gamePhaser.add.button(8+4+40+3, 8+2+4+10, 'Avat_Nobody', actionOnClick);//,0,0,0,groupEq[i] );
28389 equipiers_avatars[i].input.priorityID = 0; // higher priority
28390 groupEq[i].add(equipiers_avatars[i]);
28391
28392 equipiers_avatars[i].scale.setTo(181/equipiers_avatars[i].width);
28393 
28394 equipiers_cadres[i] = groupEq[i].create(0, 0 , 'roleNobody');
28395 
28396 equipiers_leds[i] = groupEq[i].create(22, 146 , 'LedVert');
28397 
28398 equipiers_scoresImg[i] = groupEq[i].create(142, 20 , 'EquipierScore');
28399 equipiers_scoresImg[i].anchor.setTo(0.5,0.5);
28400 equipiers_scoresImg[i].visible = false;
28401 equipiers_scoresTxt[i] = gamePhaser.add.text(142, 21, '0 pts', { fontSize: '16px', fill: '#000',font: fontNamePhaser },groupEq[i]);
28402 equipiers_scoresTxt[i].anchor.setTo(0.5,0.5);
28403 equipiers_scoresTxt[i].visible = false;
28404 
28405 equipiers_maskrond[i] = groupEq[i].create(10, 180 , 'MaskRondEquipier');
28406 equipiers_maskrond[i].visible = false;
28407
28408 
28409
28410 equipiers_pseudos[i] = gamePhaser.add.text(56, 2, 'Joueur '+(1+i), { fontSize: '22px', fill: '#fff',font: fontNamePhaser },groupEq[i]);
28411 equipiers_pseudos[i].anchor.setTo(0,0);
28412 equipiers_pseudos[i].setShadow(2, 2, 'rgba(0,0,0,0.5)', 2);
28413
28414 equipiers_botTxt[i] = gamePhaser.add.text(0, 24+equipiers_cadres[i].height-30-30, '', { fontSize: '22px', fill: '#fff',font: fontNamePhaser },groupEq[i]);
28415 equipiers_botTxt[i].anchor.setTo(0,0);
28416 equipiers_botTxt[i].setShadow(2, 2, 'rgba(0,0,0,0.5)', 2);
28417
28418 var donneur = groupEq[i].create(238, 120 , 'Donneur');
28419 donneur.anchor.setTo(0.5,0.5);
28420 donneur.visible = false;
28421 donneur.scale.setTo(1);
28422 
28423 
28424 var tourDeJeuE = groupEq[i].create(238, 120 , 'TourDeJeu');
28425 tourDeJeuE.anchor.setTo(0.5,0.5);
28426 tourDeJeuE.visible = false;
28427 tourDeJeuE.scale.setTo(1);
28428 
28429 
28430 var maskPseudo = gamePhaser.add.graphics(2+44+3, 0+146);
28431 groupEq[i].add(maskPseudo);
28432 maskPseudo.beginFill(0xffffff);
28433 maskPseudo.drawRect(0, -24, 216,100);
28434 equipiers_pseudos[i].mask = maskPseudo;
28435 equipiers_pseudos[i].donneurIcon = donneur;
28436 groupEq[i].tourDeJeuE = tourDeJeuE;
28437 
28438 $(equipiers_avatars[i]).data("pseudo","Init");
28439 }
28440 if (nbJoueurs==6) MotherEquipierGroup.bringToTop(groupEq[4]);
28441 
28442 var ratioRub = getWorldW()/2600;
28443 if (getWorldW()>1300)
28444 ratioRub = 1/2;
28445 
28446
28447 
28448 
28449 phaserTimerObject = {};
28450 var phasergroupTimer = gamePhaser.add.group();
28451 phaserTimerObject.phasergroupTimer = phasergroupTimer;
28452
28453 phaserTimerObject.phasertimerVide = phasergroupTimer.create(0, 0 , 'TimerVide');
28454 phaserTimerObject.phasertimerPlein= phasergroupTimer.create(0, 0 , 'TimerPlein');
28455
28456 phaserTimerObject.phasertimerVide2 = phasergroupTimer.create(0, -4 , 'ReTimerVide');
28457 phaserTimerObject.phasertimerPlein2= phasergroupTimer.create(0, -4 , 'ReTimerPlein');
28458 
28459 phaserTimerObject.phasertimerVide.scale.setTo(0.5);
28460 phaserTimerObject.phasertimerPlein.scale.setTo(0.5);
28461 phaserTimerObject.phasertimerVide.x = -phaserTimerObject.phasertimerVide.width/2;
28462 phaserTimerObject.phasertimerPlein.x = -phaserTimerObject.phasertimerPlein.width/2;
28463
28464
28465 phaserTimerObject.phasertimerVide2.scale.setTo(0.5);
28466 phaserTimerObject.phasertimerPlein2.scale.setTo(0.5);
28467 phaserTimerObject.phasertimerVide2.x = -phaserTimerObject.phasertimerVide2.width/2;
28468 phaserTimerObject.phasertimerPlein2.x = -phaserTimerObject.phasertimerPlein2.width/2;
28469
28470 phaserTimerObject.phaserMaskTimer = gamePhaser.add.graphics(0, 0);
28471 phasergroupTimer.add(phaserTimerObject.phaserMaskTimer);
28472 phaserTimerObject.phaserMaskTimer.beginFill(0xffffff);
28473 phaserTimerObject.phaserMaskTimer.drawRect(-phaserTimerObject.phasertimerVide.width*3/2, 0,phaserTimerObject.phasertimerVide.width, 210);
28474 phaserTimerObject.phasertimerPlein.mask = phaserTimerObject.phaserMaskTimer;
28475 phasergroupTimer.visible = false;
28476
28477 phaserTimerObject.phaserMaskTimer2 = gamePhaser.add.graphics(0, 0);
28478 phasergroupTimer.add(phaserTimerObject.phaserMaskTimer2);
28479 phaserTimerObject.phaserMaskTimer2.beginFill(0xffffff);
28480 phaserTimerObject.phaserMaskTimer2.drawRect(-phaserTimerObject.phasertimerVide2.width*3/2, 0,phaserTimerObject.phasertimerVide2.width, 210);
28481 phaserTimerObject.phasertimerPlein2.mask = phaserTimerObject.phaserMaskTimer2;
28482 
28483
28484 groupDesCartes = gamePhaser.add.group();
28485
28486 groupSousActions = gamePhaser.add.group();
28487 groupDesActions = gamePhaser.add.group();
28488 groupDesActionsBountons = gamePhaser.add.group();
28489 groupDesActions.add(groupDesActionsBountons);
28490 
28491
28492 
28493 fondActions = groupSousActions.create(getWorldW()/2, getWorldH()/2 , 'Note');
28494 fondActions.anchor.setTo(0.5,0); 
28495 fondActions.alpha = 0;
28496 
28497 scotch = groupSousActions.create(getWorldW()/2, getWorldH()/2 , 'Scotch');
28498 scotch.anchor.setTo(0.5,0.5); 
28499 scotch.alpha = 0;
28500 
28501 /*fondActions = gamePhaser.add.graphics(getWorldW()/2,getWorldH()/2);
28502 fondActions.anchor.setTo(0.5,0);
28503 fondActions.beginFill(0xffffff);
28504 fondActions.drawRoundedRect(-15, 0, 30, 10,2);
28505 fondActions.alpha = 0;
28506 groupSousActions.add(fondActions);*/
28507 phaserMessagePpal = gamePhaser.add.text( 0 , 70, ' ', { fontSize: getRubanFontSize()+'px', fill: '#fff',font: fontNamePhaser, wordWrap: true, wordWrapWidth:getWorldW() },groupRuban);//#ffcc43
28508 phaserMessagePpal.fontWeight = 'bold';
28509 phaserMessagePpal.anchor.setTo(0.5 ,0.5);
28510 phaserMessagePpal.setShadow(2, 2, 'rgba(0,0,0,0.5)', 1);
28511
28512
28513 if (chatJoueurs!=0) {
28514 var groupChat = gamePhaser.add.group();
28515 var txtValue = 'Conversation';
28516 var wwi = Math.min(800,getWorldW()*80/100);
28517 var fondChat = gamePhaser.add.button(getWorldW()/2,320 , 'ToproleNobody', selMoteur.hideChat );
28518 fondChat.anchor.setTo(0.5,0);
28519 fondChat.input.priorityID = 3;
28520 groupChat.add(fondChat);
28521 
28522 var textChat = gamePhaser.add.text(getWorldW()/2, 320, txtValue, { fontSize: '18px', fill: '#444',font: fontNamePhaser, wordWrap: true, wordWrapWidth: wwi });
28523 textChat.anchor.setTo(0,0);
28524 textChat.alpha = 0;
28525 groupChat.add(textChat);
28526 
28527 var textChat2 = gamePhaser.add.text(getWorldW()/2, 320, txtValue, { fontSize: '18px', fill: '#fff',font: fontNamePhaser, wordWrap: true, wordWrapWidth: wwi });
28528 textChat2.anchor.setTo(0,0);
28529 groupChat.add(textChat2);
28530 textChat2.setShadow(1, 1, 'rgba(0,0,0,1)', 2 );
28531 textChat2.alpha = 0;
28532
28533 var nextBtn = gamePhaser.add.button(getWorldW(),350, 'iconDown', phaserNextChatPage );
28534 nextBtn.anchor.setTo(1,0);
28535 nextBtn.angle = 180;
28536 nextBtn.alpha = 0;
28537 nextBtn.input.priorityID = 4;
28538 nextBtn.width = 30;
28539 nextBtn.height = 30;
28540 groupChat.add(nextBtn);
28541
28542 var prevBtn = gamePhaser.add.button(getWorldW(),350, 'iconDown', phaserPrevChatPage );
28543 //prevBtn.scale.setTo(1,-1);
28544 prevBtn.alpha = 0;
28545 prevBtn.anchor.setTo(1,0);
28546 prevBtn.input.priorityID = 4;
28547 prevBtn.width = 30;
28548 prevBtn.height = 30;
28549 groupChat.add(prevBtn);
28550 
28551 
28552 var closeBtn = gamePhaser.add.button(getWorldW(),320, 'iconClose', selMoteur.hideChat);
28553 closeBtn.anchor.setTo(1,0);
28554 closeBtn.width = 30;
28555 closeBtn.height = 30;
28556 groupChat.add(closeBtn);
28557 //groupChat.alpha = 0; 
28558 //textChat.align = 'center';
28559 //
28560 textChat.setTextBounds(0, 0,wwi , 300);
28561 //textChat.setShadow(1, 1, 'rgba(255,255,255,1)', 1 );
28562 
28563 fondChat.width = wwi;
28564 fondChat.height = textChat.height;
28565 fondChat.alpha = 0;
28566 
28567 phaserChatElts = {
28568 groupChat:groupChat,
28569 fondChat:fondChat,
28570 textChat:textChat,
28571 textChat2:textChat2,
28572 closeBtn:closeBtn,
28573 nextBtn:nextBtn,
28574 prevBtn:prevBtn
28575 }
28576 //equipeHTML += getChatHTML('<u>Conversation</u>');
28577 } 
28578 reorganiseCartes ("fromZomm");
28579
28580
28581 function actionOnClick () {
28582 //llog(this);
28583 var self = this;
28584 if (self.tempDisableJoueurBtn) return;
28585 self.tempDisableJoueurBtn = 1;
28586 setTimeout(function () { self.tempDisableJoueurBtn=0; },900);
28587 //llog('actionOnClick');
28588 showJoueurDetails (self);
28589 }
28590
28591}
28592
28593function getLevelAnimValue(pos0,pos100) {
28594 return techniqueLevelAnim/100*pos100+(100-techniqueLevelAnim)/100*pos0;
28595}
28596var tempDisableJoueurBtn = 0;
28597
28598var isTechniqueMode = false;
28599var techniqueLevelAnim = 0;
28600
28601function toggleDisplayMode () {
28602 isTechniqueMode = !isTechniqueMode;
28603 if (isTechniqueMode) 
28604 techniqueLevelAnim = 100;
28605 else
28606 techniqueLevelAnim = 0;
28607 selMoteur.reorganiseCartesReal ();
28608}
28609var phaserTweenDuration;
28610var phaserTweenType;
28611//var horizSpacingCards = 55;
28612var mainNbLignesPhaser = 0;
28613
28614var isTextInputFocusedIos = false;
28615var phaserCurrentJeuIsFicheJoueurShown = false;
28616
28617moteurPhaser.reorganiseCartesReal = function reorganiseCartesReal (fromResize)
28618{ 
28619 //var stack = new Error().stack;
28620
28621 //llog('************************** reorganiseCartesReal fromResize',fromResize,stack);
28622 phaserTweenNeedsRefresh = false;
28623
28624 if (loadingSprite) {
28625 
28626 var pixRatio = 1;
28627 if (window.devicePixelRatio && !isLowGraphism)
28628 pixRatio = window.devicePixelRatio;
28629
28630 var newScaleW = getWorldW();
28631 var newScaleH = getWorldH();//$( window ).height();
28632 
28633 gamePhaser.scale.setGameSize(newScaleW , newScaleH );
28634
28635
28636 if (pixRatio!=1) {
28637 gamePhaser.scale._gameSize.setTo(0, 0, newScaleW * pixRatio, newScaleH * pixRatio);
28638 gamePhaser.scale.game.renderer.resize(newScaleW*pixRatio,newScaleH*pixRatio);
28639 gamePhaser.width = newScaleW*pixRatio;
28640 gamePhaser.height = newScaleH*pixRatio;
28641 gamePhaser.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
28642 gamePhaser.world.scale.setTo(pixRatio);
28643 }
28644 
28645 var scaleLogo = 1;
28646 loadingSprite.logo2.scale.setTo(scaleLogo);
28647 if (loadingSprite.logo2.width>getWorldW()*0.9)
28648 scaleLogo = getWorldW()*0.9/loadingSprite.logo2.width;
28649 
28650 loadingSprite.logo.scale.setTo(scaleLogo);
28651 loadingSprite.logo2.scale.setTo(scaleLogo);
28652 loadingSprite.logo.x = getWorldW()/2;
28653 loadingSprite.logo.y = getWorldH()/2;
28654 loadingSprite.logo2.x = getWorldW()/2;
28655 loadingSprite.logo2.y = getWorldH()/2;
28656 loadingSprite.masque.x = getWorldW()/2;
28657 loadingSprite.masque.y = getWorldH()/2;
28658 loadingSprite.text.x = getWorldW()/2;
28659 loadingSprite.text.y = getWorldH()/2+loadingSprite.logo.height/2;
28660 refreshProgress();
28661 return;
28662 }
28663 if (!phaserGBShown) return;
28664 
28665 
28666 if (techniqueLevelAnim==0 || techniqueLevelAnim==100) {
28667 
28668 phaserTweenDuration = 400;
28669 phaserTweenType = Phaser.Easing.Cubic.Out;
28670 }
28671 else {
28672 if (fromResize!='fromTimeout') return;
28673 phaserTweenDuration = 250;
28674 phaserTweenType = Phaser.Easing.Linear.None;
28675 }
28676 if (!groupEq[0]) {
28677 reorganiseCartes();
28678 llog('err groupEq vide');
28679 //alert('poi'); 
28680 return;
28681 }
28682 if (phaserTweenProcessing) {
28683 phaserTweenNeedsRefresh = true;
28684 return;
28685 }
28686 phaserTweenProcessing = true;
28687 
28688 if (techniqueLevelAnim==100)
28689 $(document.body).css('overflow-y','scroll');
28690 else if ( !jeuIsFicheJoueurShown) {
28691 if (phaserCurrentJeuIsFicheJoueurShown) {
28692 phaserCurrentJeuIsFicheJoueurShown = false;
28693 $(document.body).css('overflow','hidden');
28694 }
28695 } else {
28696 if (!phaserCurrentJeuIsFicheJoueurShown) {
28697 phaserCurrentJeuIsFicheJoueurShown = true;
28698 $(document.body).css('overflow-y','scroll');
28699 } 
28700 }
28701 
28702 var windowWidthTechnique = getWorldW()-32;
28703 var windowWidthClassique = getWorldW()-32;///2;
28704
28705 var windowWidth = techniqueLevelAnim/100*windowWidthTechnique+(100-techniqueLevelAnim)/100*windowWidthClassique;
28706 
28707
28708 /*var ecartMinCartesTechnique = geVertSpacingCards();
28709 var ecartMinCartesClassique = 45;
28710 if (getWorldW()<400 || getWorldH()<400) {
28711 ecartMinCartesClassique = 40;
28712 }*/
28713
28714 var ecartMinCartes = geVertSpacingCards();//techniqueLevelAnim/100*ecartMinCartesTechnique+(100-techniqueLevelAnim)/100*ecartMinCartesClassique;
28715 
28716 var ccW = getPlayedCardSize().w; 
28717 
28718 var numCartesJeu = 0;
28719 var nbLigneCartes = 1;
28720 var numCarteLigne = numCartesJeu;
28721 
28722 if ( phaserCards.length>0) {
28723 numCartesJeu=phaserCards.length;
28724
28725 numCarteLigne = numCartesJeu;
28726
28727 var spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
28728 while (spacingCards<ecartMinCartes) {
28729 nbLigneCartes++;
28730 numCarteLigne = Math.ceil(numCartesJeu/nbLigneCartes);
28731 spacingCards = trouveEcartCartes (numCarteLigne,windowWidth,ccW,nbLigneCartes);
28732
28733 }
28734 }
28735 mainNbLignesPhaser = nbLigneCartes;
28736 
28737 // ********* Equipiers
28738 var ratioEquipiers = 1;
28739 var paddingEquipiers;
28740 if (getWorldW()<700) paddingEquipiers = 10;
28741 else paddingEquipiers = 28;
28742 
28743 var defWidthEquip = 291;
28744 
28745 var equipiersWidth = defWidthEquip*groupEq.length+paddingEquipiers*(groupEq.length-1);
28746 if (getWorldW()<equipiersWidth) {
28747 ratioEquipiers = getWorldW()/equipiersWidth;
28748 }
28749 var rationEquClas = Math.min(1,getWorldW()/5/291,(getWorldH()-140-(nbLigneCartes-1)*geHorizSpacingCards())/2.3/226);
28750 if (rationEquClas<0.5) rationEquClas = 0.5;
28751 if (getWorldW()<500 ) rationEquClas = 0.4;
28752 if ( getWorldH()<500 ) rationEquClas = 0.45;
28753 if ( getWorldH()<400 ) rationEquClas = 0.4;
28754 if ( getWorldH()<300 ) rationEquClas = 0.35;
28755
28756 var aspectRatioMultiL = 1;
28757 if (getWorldW()<500 ) {
28758 if (groupEq.length==5 || groupEq.length==6)
28759 aspectRatioMultiL = 5/3;
28760 else
28761 aspectRatioMultiL = 2;
28762 ratioEquipiers *= aspectRatioMultiL;
28763 }
28764 
28765 ratioEquipiers = getLevelAnimValue(rationEquClas,ratioEquipiers);
28766
28767 var topRuban = 200*ratioEquipiers+10+20+5;
28768 var decalTopEquipierTech = 0;
28769 
28770 if (topRuban<getPlateauCardSize().h) {
28771 decalTopEquipierTech = getPlateauCardSize().h-topRuban;
28772 topRuban=getPlateauCardSize().h;
28773 }
28774 
28775 //var addHeig = 20;
28776 var scaledHeight;
28777 for (var i in groupEq) {
28778 groupEq[i].scale.setTo(ratioEquipiers);
28779 if (equipiers_pseudos[i]) {
28780 equipiers_pseudos[i].fontSize = 24;
28781 equipiers_botTxt[i].fontSize = 24;
28782 if (!equipiers_maskrond[i].visible )
28783 equipiers_botTxt[i].x = 26;
28784 else
28785 equipiers_botTxt[i].x = 56;
28786
28787 equipiers_pseudos[i].y = 147;
28788 scaledHeight = 200;
28789 }
28790 }
28791 var posTechEquip = [];
28792 var decalEq = (getWorldW()-equipiersWidth*ratioEquipiers)/2;
28793 if (getWorldW()<500 ) {
28794 decalEq = (getWorldW()-equipiersWidth*ratioEquipiers/aspectRatioMultiL)/2;
28795 }
28796
28797 var distAccessoire = 1;
28798 if (getWorldW()<600 )
28799 distAccessoire = 0.5;
28800 var posEquipierHaut;
28801 var lastAlpha = 0;
28802 
28803 if (getWorldW()<500 ) {
28804 topRuban += groupEq[0].height-10;
28805 }
28806 for (var i in groupEq)
28807 {
28808 var widthOne = (defWidthEquip+paddingEquipiers)*ratioEquipiers;
28809 var posx = widthOne*i+decalEq-getWorldW()/2+groupEq[i].width/2;
28810 var posy = 20-getWorldH()/2+groupEq[i].height/2-10+decalTopEquipierTech/2;
28811 if (getWorldW()<500 ) {
28812 var indexNext = Math.ceil(groupEq.length/2);
28813 if (i>=indexNext ) {
28814 if (groupEq.length<=4)
28815 posx = -(1+indexNext-i)*widthOne+widthOne-getWorldW()/2+groupEq[i].width/2;
28816 else
28817 posx = widthOne/2-(1+indexNext-i)*widthOne+widthOne-getWorldW()/2+groupEq[i].width/2;
28818 posy += groupEq[0].height-15;
28819 } else {
28820 /*if (groupEq.length<=4)
28821 posx += widthOne/2;*/
28822
28823 if (groupEq.length<=4)
28824 posx = -widthOne*i+widthOne+decalEq-getWorldW()/2+groupEq[i].width/2;
28825 else
28826 posx = -widthOne*i+widthOne*2+decalEq-getWorldW()/2+groupEq[i].width/2;
28827 posy = 0-getWorldH()/2+groupEq[i].height/2;
28828 }
28829 posy +=5;
28830 }
28831 var alpha0 = Math.atan2(posy,posx)/Math.PI*180;
28832 var dist0 = Math.sqrt(Math.pow(posx,2)+Math.pow(posy,2)); 
28833
28834
28835 var pos100x = 10;
28836 var pos100y = 0;
28837
28838 var dist100;
28839 var alpha100;
28840 //var deltaAngleStart = 360/4*whoamiNum*Math.PI/2;
28841 var alphaAccessoire = 0;
28842 if (techniqueLevelAnim==0 && !playCardStarted )
28843 alphaAccessoire = 1;
28844 
28845 if (getWorldW()<600 )
28846 groupEq[i].accessoire.scale.setTo(0.3);
28847 else if (getWorldW()<800 || getWorldH()<700)
28848 groupEq[i].accessoire.scale.setTo(0.4);
28849 else
28850 groupEq[i].accessoire.scale.setTo(0.7);
28851 
28852 if (groupEq.length==3) {
28853
28854 posEquipierHaut = groupEq[i].height;
28855 if (i==(whoamiNum+2)%3) {
28856
28857 
28858 //pos100x = getWorldW()*0.7/2*0.9+groupEq[i].width/2-20;
28859 pos100x = -getWorldW()/2+groupEq[i].width/2;
28860 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
28861 pos100x = -getWorldW()/2+groupEq[i].width/2;
28862 //pos100y = -30-(nbLigneCartes-1)*20;
28863 pos100y = -getWorldH()/3+groupEq[i].height/2+60;
28864 if ( getWorldH()<400 ) {
28865 pos100y -= 55;
28866 }
28867 
28868 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
28869 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
28870 
28871 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
28872 twe.to({ 
28873  alpha:alphaAccessoire,
28874  x:pos100x+getWorldW()/2+groupEq[i].width/2+(10+groupEq[i].accessoire.width/4)*distAccessoire, 
28875  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/4*distAccessoire 
28876 }, phaserTweenDuration, phaserTweenType, true, 0);
28877 /*
28878 pos100x = 0;//0.1*getWorldW();
28879 pos100y = -getWorldH()/2+groupEq[i].height/2+60;
28880 if ( getWorldH()<400 ) {
28881 pos100x -= 100;
28882 pos100y += 20;
28883 }
28884 else if ( getWorldW()<800 && phaserShownCardsPli ) {
28885 pos100x -= 120;
28886 }
28887 if (phaserShownCardsPli && pos100x+groupEq[i].width/2.5>getWorldW()/2-getCartesAfficheesWidth()) {
28888 pos100x = getWorldW()/2-getCartesAfficheesWidth()-groupEq[i].width/2.5;
28889 }
28890 if (pos100x<-getWorldW()/2+groupEq[i].width/2+10)
28891 pos100x = -getWorldW()/2+groupEq[i].width/2+10;
28892 posEquipierHaut = pos100y+getWorldH()/2;
28893 if ( getWorldH()<400 ) {
28894 pos100y -= 55;
28895 }
28896 
28897 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
28898 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
28899 
28900 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
28901 twe.to({ 
28902  alpha:alphaAccessoire,
28903  x:pos100x+groupEq[i].width/2+50*distAccessoire+getWorldW()/2-groupEq[i].accessoire.width/3, 
28904  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/3*distAccessoire 
28905 }, phaserTweenDuration, phaserTweenType, true, 0);*/
28906 
28907 
28908 } else if (i==whoamiNum) {
28909 pos100x = 0;//-0.2*getWorldW()/2;
28910 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-5;
28911 if ( phaserCards.length>0) {
28912 pos100y -= getMainCartesVisibleH();
28913 } else if (phaserChatElts) {
28914 if (getWorldW()<800)
28915 pos100y -= 34;
28916 else
28917 pos100y -= 50;
28918 }
28919 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
28920 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
28921
28922  //groupDesCartes.bringToTop(myPlayedCard);
28923 MotherEquipierGroup.bringToTop(groupEq[i]);
28924  
28925 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
28926 twe.to({ 
28927  alpha:alphaAccessoire,
28928  x:pos100x+groupEq[i].width/2+50*distAccessoire+getWorldW()/2-groupEq[i].accessoire.width/3, 
28929  y:pos100y+getWorldH()/2+groupEq[i].height/2-10*distAccessoire
28930 }, phaserTweenDuration, phaserTweenType, true, 0);
28931 
28932 
28933 } else if (i==(whoamiNum+1)%3) {
28934 pos100x = getWorldW()*0.7/2*0.9+groupEq[i].width/2-20;
28935 if (pos100x > getWorldW()/2-groupEq[i].width/2)
28936 pos100x = getWorldW()/2-groupEq[i].width/2;
28937
28938 pos100y = -getWorldH()/3+groupEq[i].height/2+60;
28939 if ( getWorldH()<400 ) {
28940 pos100y -= 55;
28941 }
28942 
28943 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
28944 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
28945 
28946 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
28947 twe.to({ 
28948  alpha:alphaAccessoire,
28949  x:pos100x+getWorldW()/2-groupEq[i].width/2-(10+groupEq[i].accessoire.width/4)*distAccessoire, 
28950  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/4*distAccessoire 
28951 }, phaserTweenDuration, phaserTweenType, true, 0);
28952 
28953 } else {
28954 llog('errrrrrrrrrrrrrrrr groupEq ',i);
28955 }
28956 
28957 
28958 
28959 
28960 
28961 } else if (groupEq.length==4) {
28962 
28963 if (i==(whoamiNum+2)%4) {
28964 pos100x = 0;//0.1*getWorldW();
28965 pos100y = -getWorldH()/2+groupEq[i].height/2+60;
28966 if ( getWorldH()<400 ) {
28967 pos100x -= 100;
28968 pos100y += 20;
28969 }
28970 else if ( getWorldW()<800 && phaserShownCardsPli ) {
28971 pos100x -= 120;
28972 }
28973 if (phaserShownCardsPli && pos100x+groupEq[i].width/2.5>getWorldW()/2-getCartesAfficheesWidth()) {
28974 pos100x = getWorldW()/2-getCartesAfficheesWidth()-groupEq[i].width/2.5;
28975 }
28976 if (pos100x<-getWorldW()/2+groupEq[i].width/2+10)
28977 pos100x = -getWorldW()/2+groupEq[i].width/2+10;
28978 posEquipierHaut = pos100y+getWorldH()/2;
28979 if ( getWorldH()<400 ) {
28980 pos100y -= 55;
28981 }
28982 
28983 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
28984 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
28985 
28986 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
28987 twe.to({ 
28988  alpha:alphaAccessoire,
28989  x:pos100x+groupEq[i].width/2+50*distAccessoire+getWorldW()/2-groupEq[i].accessoire.width/3, 
28990  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/3*distAccessoire 
28991 }, phaserTweenDuration, phaserTweenType, true, 0);
28992 
28993 
28994 } else if (i==(whoamiNum+3)%4) {
28995
28996 pos100x = -getWorldW()*0.7/2*0.9-groupEq[i].width/2+20;
28997 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
28998 pos100x = -getWorldW()/2+groupEq[i].width/2;
28999 pos100y = -30-(nbLigneCartes-1)*20;
29000 if ( getWorldH()<400 ) {
29001 pos100y += 15;
29002 }
29003 
29004 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180+360;
29005 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29006 
29007 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29008 twe.to({ 
29009  alpha:alphaAccessoire,
29010  x:pos100x+getWorldW()/2+groupEq[i].width/2+groupEq[i].accessoire.width/4*distAccessoire, 
29011  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/4*distAccessoire
29012 }, phaserTweenDuration, phaserTweenType, true, 0);
29013 
29014 
29015 } else if (i==whoamiNum) {
29016 pos100x = 0;//-0.2*getWorldW()/2;
29017 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-5;
29018 if ( phaserCards.length>0) {
29019 pos100y -= getMainCartesVisibleH();
29020 } else if (phaserChatElts) {
29021 if (getWorldW()<800)
29022 pos100y -= 34;
29023 else
29024 pos100y -= 50;
29025 }
29026 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29027 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29028
29029  //groupDesCartes.bringToTop(myPlayedCard);
29030 MotherEquipierGroup.bringToTop(groupEq[i]);
29031  
29032 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29033 twe.to({ 
29034  alpha:alphaAccessoire,
29035  x:pos100x+groupEq[i].width/2+50*distAccessoire+getWorldW()/2-groupEq[i].accessoire.width/3, 
29036  y:pos100y+getWorldH()/2+groupEq[i].height/2-10*distAccessoire
29037 }, phaserTweenDuration, phaserTweenType, true, 0);
29038 
29039 
29040 } else if (i==(whoamiNum+1)%4) {
29041 pos100x = getWorldW()*0.7/2*0.9+groupEq[i].width/2-20;
29042 if (pos100x > getWorldW()/2-groupEq[i].width/2)
29043 pos100x = getWorldW()/2-groupEq[i].width/2;
29044 pos100y = -30-(nbLigneCartes-1)*20;
29045 if ( getWorldH()<400 || getWorldW()<350) {
29046 pos100y += 15;
29047 if (phaserShownCardsPli) {
29048 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10-getMainCartesVisibleH();
29049 }
29050 }
29051 
29052 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29053 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29054 
29055 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29056 twe.to({ 
29057  alpha:alphaAccessoire,
29058  x:pos100x+getWorldW()/2-groupEq[i].width/2-(10+groupEq[i].accessoire.width/4)*distAccessoire, 
29059  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/4*distAccessoire 
29060 }, phaserTweenDuration, phaserTweenType, true, 0);
29061 
29062 } else {
29063 llog('errrrrrrrrrrrrrrrr groupEq ',i);
29064 }
29065 
29066 
29067 
29068 } else if (groupEq.length==5) { //  5 JOUEURS *****************
29069
29070 
29071 
29072 
29073 if (i==(whoamiNum+3)%5) {
29074 
29075
29076 pos100x = -getWorldW()*0.3/2*0.9-groupEq[i].width/2+20;
29077 pos100y = -getWorldH()/2+groupEq[i].height/2+60;
29078 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
29079 pos100x = -getWorldW()/2+groupEq[i].width/2;
29080
29081 if ( getWorldW()<500 ) {
29082 pos100y += 20;
29083 }
29084 if ( getWorldH()<400 ) {
29085 pos100y += 20;
29086 pos100x -= 100;
29087 }
29088 else if (getWorldW()<800 && phaserShownCardsPli ) {
29089 pos100x -= 120;
29090 }
29091 if (pos100x<-getWorldW()/2+groupEq[i].width/2)
29092 pos100x = -getWorldW()/2+groupEq[i].width/2;
29093 
29094 
29095 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29096 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29097 
29098 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29099 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2+groupEq[i].width/2+10+groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+35 }, phaserTweenDuration, phaserTweenType, true, 0);
29100 
29101 } else if (i==(whoamiNum+4)%5) {
29102 
29103
29104 pos100x = -getWorldW()*0.7/2*0.9-groupEq[i].width/2+20;
29105 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
29106 pos100x = -getWorldW()/2+groupEq[i].width/2;
29107 pos100y = -30-(nbLigneCartes-1)*20;
29108 if ( getWorldH()<400 ) {
29109
29110 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29111 if ( phaserCards.length>0) {
29112  pos100y -= getMainCartesVisibleH();
29113 } else if (phaserChatElts) {
29114  if (getWorldW()<800)
29115  pos100y -= 34;
29116  else
29117  pos100y -= 50;
29118 }
29119 pos100y -= 15;
29120 }
29121 
29122 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180+360;
29123 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29124 
29125 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29126 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2+groupEq[i].width/2+groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+35 }, phaserTweenDuration, phaserTweenType, true, 0);
29127 
29128 
29129 } else if (i==whoamiNum) {
29130
29131 pos100x = 0;//-0.2*getWorldW()/2;
29132 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29133 if ( phaserCards.length>0) {
29134 pos100y -= getMainCartesVisibleH();
29135 } else if (phaserChatElts) {
29136 if (getWorldW()<800)
29137  pos100y -= 34;
29138 else
29139  pos100y -= 50;
29140 }
29141 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29142 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29143 
29144 
29145 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29146 twe.to({ alpha:alphaAccessoire,x:pos100x+90+getWorldW()/2, y:pos100y+getWorldH()/2-groupEq[i].height/3+10-groupEq[i].accessoire.height/3*0 }, phaserTweenDuration, phaserTweenType, true, 0);
29147 
29148 } else if (i==(whoamiNum+1)%5) {
29149 pos100x = getWorldW()*0.7/2*0.9+groupEq[i].width/2-20;
29150 if (pos100x > getWorldW()/2-groupEq[i].width/2)
29151 pos100x = getWorldW()/2-groupEq[i].width/2;
29152 pos100y = -30-(nbLigneCartes-1)*20;
29153 if ( getWorldH()<400 ) {
29154
29155 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29156 if ( phaserCards.length>0) {
29157  pos100y -= getMainCartesVisibleH();
29158 } else if (phaserChatElts) {
29159  if (getWorldW()<800)
29160  pos100y -= 34;
29161  else
29162  pos100y -= 50;
29163 }
29164 pos100y -= 15;
29165 }
29166 
29167 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29168 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29169 
29170 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29171 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2-groupEq[i].width/2-10-groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+30 }, phaserTweenDuration, phaserTweenType, true, 0);
29172 
29173 } else if (i==(whoamiNum+2)%5) {
29174 //pos100x = 0;//0.1*getWorldW();
29175 pos100x = getWorldW()*0.3/2*0.9+groupEq[i].width/2-20;
29176 pos100y = -getWorldH()/2+groupEq[i].height/2+60;
29177 if ( getWorldH()<400 ) {
29178 pos100x -= 100;
29179 pos100y += 20;
29180 }
29181 else if (getWorldW()<800 && phaserShownCardsPli ) {
29182 pos100x -= 120;
29183 if (pos100x<-getWorldW()/2+groupEq[i].width/2+30+groupEq[i].width*2/3)
29184  pos100x = -getWorldW()/2+groupEq[i].width/2+30+groupEq[i].width*2/3;
29185 }
29186 if (phaserShownCardsPli && pos100x+groupEq[i].width/3>getWorldW()/2-getCartesAfficheesWidth()) {
29187 pos100x = getWorldW()/2-getCartesAfficheesWidth()-groupEq[i].width/3;
29188 }
29189 posEquipierHaut = pos100y+getWorldH()/2-groupEq[i].height/3;
29190 if ( getWorldH()<400 ) {
29191 pos100y -= 20;
29192 }
29193 if ( getWorldW()<500 ) {
29194 pos100y += 20;
29195 }
29196 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29197 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29198 
29199 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29200 twe.to({ alpha:alphaAccessoire,x:pos100x-60+getWorldW()/2, y:pos100y+getWorldH()/2+groupEq[i].height/3+groupEq[i].accessoire.height/3 }, phaserTweenDuration, phaserTweenType, true, 0);
29201 
29202 } else {
29203 llog('errrrrrrrrrrrrrrrr groupEq ',i);
29204 }
29205 } else if (groupEq.length==6) { //  5 JOUEURS *****************
29206
29207 
29208 
29209 
29210 if (i==(whoamiNum+3)%6) {
29211
29212 pos100x = 0;//0.1*getWorldW();
29213 pos100y = -getWorldH()/2+groupEq[i].height/2+60;
29214 if ( getWorldH()<400 ) {
29215 pos100x -= 100;
29216 pos100y += 20;
29217 }
29218 else if ( getWorldW()<800 && phaserShownCardsPli ) {
29219 pos100x -= 120;
29220 }
29221 if (phaserShownCardsPli && pos100x+groupEq[i].width/2.5>getWorldW()/2-getCartesAfficheesWidth()) {
29222 pos100x = getWorldW()/2-getCartesAfficheesWidth()-groupEq[i].width/2.5;
29223 }
29224 if (pos100x<-getWorldW()/2+groupEq[i].width/2+10)
29225 pos100x = -getWorldW()/2+groupEq[i].width/2+10;
29226 posEquipierHaut = pos100y+getWorldH()/2;
29227 if ( getWorldH()<400 ) {
29228 pos100y -= 55;
29229 }
29230 
29231 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29232 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29233 
29234 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29235 twe.to({ 
29236  alpha:alphaAccessoire,
29237  x:pos100x+groupEq[i].width/2+50*distAccessoire+getWorldW()/2-groupEq[i].accessoire.width/3, 
29238  y:pos100y+getWorldH()/2+groupEq[i].height/2+groupEq[i].accessoire.height/3*distAccessoire 
29239 }, phaserTweenDuration, phaserTweenType, true, 0);
29240 
29241
29242 } else if (i==(whoamiNum+4)%6) {
29243
29244 pos100x = -getWorldW()*0.55/2*0.9-groupEq[i].width/2+20;
29245 pos100y = -getWorldH()/2+groupEq[i].height/2+130;
29246 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
29247 pos100x = -getWorldW()/2+groupEq[i].width/2;
29248
29249 if ( getWorldW()<500 ) {
29250 pos100y += 20;
29251 }
29252 if ( getWorldH()<400 ) {
29253 pos100y += 20;
29254 pos100x -= 100;
29255 }
29256 else if (getWorldW()<800 && phaserShownCardsPli ) {
29257 pos100x -= 120;
29258 }
29259 if (pos100x<-getWorldW()/2+groupEq[i].width/2)
29260 pos100x = -getWorldW()/2+groupEq[i].width/2;
29261 
29262 
29263 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29264 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29265 
29266 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29267 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2+groupEq[i].width/2+10+groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+35 }, phaserTweenDuration, phaserTweenType, true, 0);
29268 
29269 
29270 } else if (i==(whoamiNum+5)%6) {
29271 
29272
29273
29274 pos100x = -getWorldW()*0.7/2*0.9-groupEq[i].width/2+20;
29275 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
29276 pos100x = -getWorldW()/2+groupEq[i].width/2;
29277 pos100y = -30-(nbLigneCartes-1)*20;
29278 if ( getWorldH()<400 ) {
29279
29280 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29281 if ( phaserCards.length>0) {
29282 pos100y -= getMainCartesVisibleH();
29283 } else if (phaserChatElts) {
29284 if (getWorldW()<800)
29285  pos100y -= 34;
29286 else
29287  pos100y -= 50;
29288 }
29289 pos100y -= 15;
29290 }
29291 
29292 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180+360;
29293 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29294 
29295 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29296 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2+groupEq[i].width/2+groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+35 }, phaserTweenDuration, phaserTweenType, true, 0);
29297 
29298 /*pos100x = -getWorldW()*0.7/2*0.9-groupEq[i].width/2+20;
29299 if (pos100x < -getWorldW()/2+groupEq[i].width/2)
29300 pos100x = -getWorldW()/2+groupEq[i].width/2;
29301 pos100y = -30-(nbLigneCartes-1)*20;
29302 if ( getWorldH()<400 ) {
29303
29304 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29305 if ( phaserCards.length>0) {
29306 pos100y -= getMainCartesVisibleH();
29307 } else if (phaserChatElts) {
29308 if (getWorldW()<800)
29309  pos100y -= 34;
29310 else
29311  pos100y -= 50;
29312 }
29313 pos100y -= 15;
29314 }
29315 
29316 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180+360;
29317 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29318 
29319 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29320 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2+groupEq[i].width/2+groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+35 }, phaserTweenDuration, phaserTweenType, true, 0);
29321 */
29322 
29323 } else if (i==whoamiNum) {
29324
29325 pos100x = 0;//-0.2*getWorldW()/2;
29326 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29327 if ( phaserCards.length>0) {
29328 pos100y -= getMainCartesVisibleH();
29329 } else if (phaserChatElts) {
29330 if (getWorldW()<800)
29331 pos100y -= 34;
29332 else
29333 pos100y -= 50;
29334 }
29335 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29336 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29337 
29338 
29339 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29340 twe.to({ alpha:alphaAccessoire,x:pos100x+90+getWorldW()/2, y:pos100y+getWorldH()/2-groupEq[i].height/3+10-groupEq[i].accessoire.height/3*0 }, phaserTweenDuration, phaserTweenType, true, 0);
29341 
29342 } else if (i==(whoamiNum+1)%6) {
29343 pos100x = getWorldW()*0.7/2*0.9+groupEq[i].width/2-20;
29344 if (pos100x > getWorldW()/2-groupEq[i].width/2)
29345 pos100x = getWorldW()/2-groupEq[i].width/2;
29346 pos100y = -30-(nbLigneCartes-1)*20;
29347 if ( getWorldH()<400 ) {
29348
29349 pos100y = getWorldH()/2-groupEq[i].height/2-(nbLigneCartes-1)*geHorizSpacingCards()-10;
29350 if ( phaserCards.length>0) {
29351 pos100y -= getMainCartesVisibleH();
29352 } else if (phaserChatElts) {
29353 if (getWorldW()<800)
29354  pos100y -= 34;
29355 else
29356  pos100y -= 50;
29357 }
29358 pos100y -= 15;
29359 }
29360 
29361 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29362 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29363 
29364 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29365 twe.to({ alpha:alphaAccessoire,x:pos100x+getWorldW()/2-groupEq[i].width/2-10-groupEq[i].accessoire.width/2, y:pos100y+getWorldH()/2+30 }, phaserTweenDuration, phaserTweenType, true, 0);
29366 
29367 } else if (i==(whoamiNum+2)%6) {
29368 //pos100x = 0;//0.1*getWorldW();
29369 pos100x = getWorldW()*0.55/2*0.9+groupEq[i].width/2-20;
29370 pos100y = -getWorldH()/2+groupEq[i].height/2+130;
29371 if ( getWorldH()<400 ) {
29372 pos100x -= 100;
29373 pos100y += 20;
29374 }
29375 else if (getWorldW()<800 && phaserShownCardsPli ) {
29376 pos100x -= 120;
29377 if (pos100x<-getWorldW()/2+groupEq[i].width/2+30+groupEq[i].width*2/3)
29378 pos100x = -getWorldW()/2+groupEq[i].width/2+30+groupEq[i].width*2/3;
29379 }
29380 if (phaserShownCardsPli && pos100x+groupEq[i].width/3>getWorldW()/2-getCartesAfficheesWidth()) {
29381 pos100x = getWorldW()/2-getCartesAfficheesWidth()-groupEq[i].width/3;
29382 }
29383 posEquipierHaut = pos100y+getWorldH()/2-groupEq[i].height/3;
29384 if ( getWorldH()<400 ) {
29385 pos100y -= 20;
29386 }
29387 if ( getWorldW()<500 ) {
29388 pos100y += 20;
29389 }
29390 alpha100 = Math.atan2(pos100y,pos100x)/Math.PI*180;
29391 dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29392 
29393 var twe = gamePhaser.add.tween(groupEq[i].accessoire);
29394 twe.to({ alpha:alphaAccessoire,x:pos100x-60+getWorldW()/2, y:pos100y+getWorldH()/2+groupEq[i].height/3+groupEq[i].accessoire.height/3 }, phaserTweenDuration, phaserTweenType, true, 0);
29395 
29396 } else {
29397 llog('errrrrrrrrrrrrrrrr groupEq ',i);
29398 }
29399 }
29400 
29401 if (techniqueLevelAnim>5)
29402 dist100 = Math.min(getWorldW(),getWorldH()-getMainCartesVisibleH()-(nbLigneCartes-1)*geHorizSpacingCards())/3
29403
29404 if (i>1) alpha0-=360;
29405 /*var pos100x = (getWorldW()/2-groupEq[i].width/2)*Math.cos(alpha100*Math.PI/180);
29406 var pos100y = (getWorldH()-groupEq[i].height*2-200)/2*Math.sin(alpha100*Math.PI/180);
29407 
29408 var dist100 = Math.sqrt(Math.pow(pos100x,2)+Math.pow(pos100y,2)); 
29409 */
29410 var alphaC = getLevelAnimValue(alpha100,alpha0);//alpha0*techniqueLevelAnim/100+alpha100*(100-techniqueLevelAnim)/100;
29411 
29412 
29413 var distC = getLevelAnimValue(dist100,dist0);//dist0*techniqueLevelAnim/100+dist100*(100-techniqueLevelAnim)/100;
29414 //groupEq[i].x = getWorldW()/2+distC*Math.cos(alphaC*Math.PI/180)-groupEq[i].width/2;
29415 //groupEq[i].y = getWorldH()/2+distC*Math.sin(alphaC*Math.PI/180)-groupEq[i].height/2;
29416 //llog('equipier'+i,'alpha',alpha0,'dist',dist0,posx,posy);
29417 groupEq[i].goX = getWorldW()/2+distC*Math.cos(alphaC*Math.PI/180)-groupEq[i].width/2;
29418 groupEq[i].goY = getWorldH()/2+distC*Math.sin(alphaC*Math.PI/180)-groupEq[i].height/2;
29419 var twe = gamePhaser.add.tween(groupEq[i]);
29420 twe.to({ 
29421 x:groupEq[i].goX,
29422 y:groupEq[i].goY }, phaserTweenDuration, phaserTweenType, true, 0);
29423
29424 
29425 
29426 }
29427 var transp = getLevelAnimValue(1,0);//techniqueLevelAnim/100*0+(100-techniqueLevelAnim)/100*1;
29428 var postablex = getWorldW()/2;
29429 var postabley0 = posEquipierHaut-220*getWorldW()/1600;//-220+70+groupEq[0].height*0.45;
29430 if (getWorldW()<800) {
29431 postabley0 -= (800-getWorldW())/4;
29432 }
29433 if (getWorldH()<400) {
29434 postabley0 -= 20;
29435 }
29436 var decalYtable = 0;
29437 if (getWorldW()<600)
29438 decalYtable = 10;
29439 if (phaserShownCardsPli)
29440 decalYtable = 20;
29441 if (getWorldH()<300) 
29442 decalYtable += 35;
29443 if (getWorldW()<300) 
29444 decalYtable += 20;
29445 
29446
29447 if (getWorldW()<600) {
29448 var tableWidthDTmp = getWorldW();
29449 if (getWorldH()>postabley+tableWidthDTmp*1200/1600) {
29450 tableWidthDTmp = (getWorldH()-postabley)*1600/1200;
29451 }
29452 
29453 var scaleTableTmp = tableWidthDTmp/1600;
29454 //llog('scale table **',scaleTableTmp);
29455 if (postabley0<getHeaderHeight()+40-220*scaleTableTmp) {
29456 postabley0=42+40-220*scaleTableTmp;
29457 }
29458 }
29459 
29460 
29461 var postabley100 = getWorldH();
29462 var postabley = getLevelAnimValue(postabley0,postabley100);//techniqueLevelAnim/100*postabley100+(100-techniqueLevelAnim)/100*postabley0;
29463 //phaserTableClassique.alpha = transp;
29464
29465 var tableWidthD = getWorldW();
29466 if (getWorldH()>postabley+tableWidthD*1200/1600) {
29467 tableWidthD = (getWorldH()-postabley)*1600/1200;
29468 }
29469 var tww = gamePhaser.add.tween(phaserTableClassique);
29470 tww.to({ alpha:transp,x:postablex,y:postabley+decalYtable,width:tableWidthD,height:1200/1600*tableWidthD }, phaserTweenDuration, phaserTweenType, true, 0);
29471
29472 
29473 // ********* Ruban
29474 
29475 
29476 var scaleRuban = 1;
29477 if (getWorldW()<800) {
29478 scaleRuban = 1/3;
29479 groupRuban.scale.setTo(scaleRuban);
29480 phaserRubanBg.visible = false;
29481 phaserRubanBg_s.visible = true;
29482 } else {
29483
29484 scaleRuban = getWorldW()/2600;
29485 if (getWorldW()>1300)
29486 scaleRuban = 1/2;
29487 groupRuban.scale.setTo(scaleRuban);
29488 
29489 phaserRubanBg.visible = true;
29490 phaserRubanBg_s.visible = false;
29491 }
29492 //groupRuban.myScale = scaleRuban;
29493
29494 groupRuban.x = (getWorldW())/2;
29495
29496
29497 var twr = gamePhaser.add.tween(groupRuban);
29498 twr.to({ y:topRuban*techniqueLevelAnim/100 }, phaserTweenDuration, phaserTweenType, true, 0);
29499
29500 var twr = gamePhaser.add.tween(phaserRubanBg);
29501 twr.to({ alpha:getLevelAnimValue(0,1) }, phaserTweenDuration, phaserTweenType, true, 0);
29502 var twr = gamePhaser.add.tween(phaserRubanBg_s);
29503 twr.to({ alpha:getLevelAnimValue(0,1) }, phaserTweenDuration, phaserTweenType, true, 0);
29504 var twr = gamePhaser.add.tween(phaserRubanBg2);
29505 twr.to({ alpha:getLevelAnimValue(1,0) }, phaserTweenDuration, phaserTweenType, true, 0);
29506 var twr = gamePhaser.add.tween(phaserRubanBg2Bot);
29507 twr.to({ alpha:getLevelAnimValue(1,0) }, phaserTweenDuration, phaserTweenType, true, 0);
29508 //groupRuban.y = topRuban*techniqueLevelAnim/100;
29509
29510 var largeurRuban = getWorldW()-40;
29511 if (techniqueLevelAnim<50) {
29512
29513 phaserMessagePpal.style.wordWrap = true;
29514 largeurRuban = largeurRuban/scaleRuban;
29515 phaserMessagePpal.fontSize = getRubanFontSize();
29516 phaserMessagePpal.setTextBounds(0, 0,largeurRuban , 100);
29517 phaserMessagePpal.style.wordWrapWidth = largeurRuban;
29518 phaserMessagePpal.setText(phaserMessagePpal.text);
29519 } else {
29520 phaserMessagePpal.style.wordWrap = false;
29521 
29522 }
29523 
29524 phaserMessagePpal.y = getLevelAnimValue(65+(phaserMessagePpal.height-71)/2,70) ;
29525 
29526 var topR2Pos = Math.max(60,phaserMessagePpal.height-10);
29527 if (getWorldH()<400 && techniqueLevelAnim<50)
29528 topR2Pos = Math.max(45,phaserMessagePpal.height-10);
29529 phaserRubanBg2Bot.y = topR2Pos;
29530 
29531 phaserRubanBg2Bg.clear();
29532 if (techniqueLevelAnim<50) {
29533 var rub2WW = Math.max(getWorldW()*6,15000);
29534 phaserRubanBg2Bg.beginFill(0xcc3a2f);
29535 phaserRubanBg2Bg.drawRect(-rub2WW/2,10,rub2WW ,topR2Pos);
29536 }
29537
29538 
29539 var rubanColor = '#ffcc43';
29540 if (techniqueLevelAnim<50)
29541 rubanColor = '#ffffff';
29542 phaserMessagePpal.fill = rubanColor;
29543 
29544 var topTimery = topRuban*techniqueLevelAnim/100+getHeaderHeight()-7;
29545 if (getWorldW()<800)
29546 topTimery += 20*techniqueLevelAnim/100;
29547 else
29548 topTimery += 10*techniqueLevelAnim/100;
29549 
29550 var twr = gamePhaser.add.tween(phaserTimerObject.phasergroupTimer);
29551 twr.to({ x:getWorldW()/2,y:topTimery }, phaserTweenDuration, phaserTweenType, true, 0);
29552
29553 var twr = gamePhaser.add.tween(phaserTimerObject.phasertimerVide);
29554 twr.to({ alpha:getLevelAnimValue(0,1) }, phaserTweenDuration, phaserTweenType, true, 0);
29555
29556 var twr = gamePhaser.add.tween(phaserTimerObject.phasertimerPlein);
29557 twr.to({ alpha:getLevelAnimValue(0,1) }, phaserTweenDuration, phaserTweenType, true, 0);
29558
29559 var twr = gamePhaser.add.tween(phaserTimerObject.phasertimerVide2);
29560 twr.to({ alpha:getLevelAnimValue(1,0) }, phaserTweenDuration, phaserTweenType, true, 0);
29561
29562 var twr = gamePhaser.add.tween(phaserTimerObject.phasertimerPlein2);
29563 twr.to({ alpha:getLevelAnimValue(1,0) }, phaserTweenDuration, phaserTweenType, true, 0);
29564 
29565
29566 if (lastTurnSel!==null) 
29567 selMoteur.setTurn(lastTurnSel);
29568 
29569
29570 var ttalHeight = getHeaderHeight()+topRuban+5;//botActions+80;
29571 
29572 //gamePhaser.add.tween(groupRuban).to({ y:250 }, 2500, Phaser.Easing.Cubic.Out, true, -1).start();
29573
29574
29575 
29576 var topCardTechnique;
29577 var topCardClassique;
29578 //var topCard;
29579
29580
29581 if (phaserChatElts) // decalage du timer si multijoueur
29582 ttalHeight +=15;
29583
29584 if ( phaserCards.length>0) {
29585 var numCartesJeu=phaserCards.length;
29586
29587 //cardsBestTop = 3;
29588 
29589 var isfuncsentResiz = false;
29590
29591 var okwidth = (numCarteLigne-1)*spacingCards+ccW;
29592 
29593
29594 topCardTechnique = ttalHeight+15;//getHeaderHeight()+2;
29595 ttalHeight += getPlayedCardSize().h+5-geHorizSpacingCards();
29596 
29597 /*if (phaserTimerObject.phasergroupTimer.visible)
29598 topCardTechnique +=10;*/
29599 
29600 topCardClassique = getWorldH()-getMainCartesVisibleH()-(nbLigneCartes-1)*geHorizSpacingCards();
29601
29602 var topCard = techniqueLevelAnim/100*topCardTechnique+(100-techniqueLevelAnim)/100*topCardClassique;
29603 
29604 var ecartLignesCartesMain = geHorizSpacingCards();
29605 topCard -= ecartLignesCartesMain;
29606 //ttalHeight += topCard;
29607
29608 var cptmp = 0;
29609 var subtotalLeft = 0;
29610 var posxorig = getWorldW()/2-okwidth/2;
29611 var posx = posxorig;
29612 //llog('posxorig',posxorig,okwidth,numCarteLigne);
29613 
29614 for (var key in phaserCards) { 
29615 if (cptmp%numCarteLigne == 0) {
29616  posx = posxorig;//16;
29617  topCard += ecartLignesCartesMain;
29618  ttalHeight += ecartLignesCartesMain;
29619 } 
29620 var tw = gamePhaser.add.tween(phaserCards[key]);
29621 tw.to({ x:posx,y:topCard,width:ccW,height:getPlayedCardSize().h }, phaserTweenDuration, phaserTweenType, true, 0);
29622 //tw.start();
29623 posx += spacingCards;        
29624 cptmp++; 
29625 
29626 } 
29627 }
29628 ttalHeight += 10;
29629
29630
29631 var topActionsForChat = ttalHeight;
29632
29633 
29634
29635 var actionsPosTop0 = ( (posEquipierHaut+groupEq[0].height/2+5) + (groupEq[whoamiNum].goY -5 ) )/2;
29636 if ( getWorldH()<400 ) actionsPosTop0 -=40;
29637 
29638 var actionsPosTop100 = ttalHeight+15;//posEquipierHaut+10;
29639 //if ( phaserCards.length>0) actionsPosTop100 += getPlayedCardSize().h+5+(nbLigneCartes-1)*geHorizSpacingCards();
29640 var actionsWidth = getActionsWidth();
29641 var actionsPosTop = techniqueLevelAnim/100*actionsPosTop100+(100-techniqueLevelAnim)/100*actionsPosTop0;
29642 
29643 var anchorPos = techniqueLevelAnim/100*0+(100-techniqueLevelAnim)/100*0.5;
29644 //phaserActionBtns.anchor.setTo(0.5,anchorPos);
29645
29646 //llog('actionsPosTop',actionsPosTop);
29647 /*var actionsX0 = getWorldW()/2;
29648 var actionsX100 = getWorldW()/2;
29649 if (phaserChatElts) {
29650 actionsX100 = getWorldW()/2+actionsWidth100/2+3;
29651 }
29652 var actionsX = getLevelAnimValue(actionsX100,actionsX0);*/
29653 
29654 var yanchor = getLevelAnimValue(0.5,0);
29655 var calcHactions = replaceActions (getWorldW()/2,actionsWidth,actionsPosTop,yanchor);
29656 
29657 if (calcHactions.message)
29658 topActionsForChat += calcHactions.message+10;
29659 
29660 if (calcHactions.total) {
29661 ttalHeight += calcHactions.total+10;//getActionListHeight (phaserActionBtns,getWorldW()/2,actionsWidth,actionsPosTop);
29662 }
29663 
29664
29665 if (phaserShownCardsPli ) {
29666
29667
29668 var carteAffW = getCarteAffW();
29669 var pcaffAlpha = getLevelAnimValue(0,0.8);
29670
29671 var pcaffFS0 = 21;
29672 if (getWorldW()<800)
29673 pcaffFS0 = 14;
29674 if (getWorldH()<500)
29675 pcaffFS0 = 14;
29676 
29677 var pcaffFS100 = 16; // attention cest le classique
29678 if (getWorldW()<500)
29679 pcaffFS100 = 14; 
29680 if (getWorldH()<500)
29681 pcaffFS100 = 14;
29682 var pcaffFS = techniqueLevelAnim/100*pcaffFS0+(100-techniqueLevelAnim)/100*pcaffFS100;
29683 
29684 var pcaffY0 = ttalHeight+10;
29685 var pcaffY100 = getHeaderHeight()+2; 
29686 var pcaffY = techniqueLevelAnim/100*pcaffY0+(100-techniqueLevelAnim)/100*pcaffY100;
29687
29688 var wwi = getCartesAfficheesWidth();
29689 
29690 var pcaffX0 = getWorldW()/2;
29691 if (phaserChatElts && getWorldW()>=600) {
29692 pcaffX0 = getWorldW()/2+3+wwi/2;
29693 }
29694 var pcaffX100 = getWorldW()-wwi/2-2; 
29695 var pcaffX = techniqueLevelAnim/100*pcaffX0+(100-techniqueLevelAnim)/100*pcaffX100;
29696
29697 var tw2 = gamePhaser.add.tween(groupCartesAffichess);
29698 tw2.to({ x:pcaffX,y:pcaffY}, phaserTweenDuration, phaserTweenType, true, 0);
29699 
29700
29701
29702 tw2 = gamePhaser.add.tween(phaserShownCardsPli.phaserTxt);
29703 tw2.to({ x:0,y:0,fontSize:pcaffFS,alpha:getLevelAnimValue(0,1)}, phaserTweenDuration, phaserTweenType, true, 0);
29704
29705 tw2 = gamePhaser.add.tween(phaserShownCardsPli.phaserTxt2);
29706 tw2.to({ fontSize:pcaffFS,alpha:getLevelAnimValue(1,0)}, phaserTweenDuration, phaserTweenType, true, 0);
29707
29708 phaserShownCardsPli.phaserTxt2.setShadow(1, 1, 'rgba(0,0,0,1)', 2 );
29709 // if (techniqueLevelAnim<50)Shadow(1, 1, 'rgba(0,0,0,1)', 2 );
29710 //textChat.setShadow(1, 1, 'rgba(255,255,255,1)', 1 );
29711
29712 var textHeight = pcaffFS+6;
29713
29714 var ecartCartesAffR = 40;
29715 if (getWorldW()<600 || getWorldH()<600)
29716 ecartCartesAffR = getCarteAffW()/2.5;
29717 
29718 if (techniqueLevelAnim!=0) {
29719
29720 for (var g in phaserShownCardsPli.cardsList) {
29721 tw2 = gamePhaser.add.tween(phaserShownCardsPli.cardsList[g]);
29722 tw2.to({ 
29723  x:0-(ecartCartesAffR*(phaserShownCardsPli.cardsList.length-1)+carteAffW)/2+g*ecartCartesAffR,
29724  y:0+textHeight,
29725  width:carteAffW,
29726  height:carteAffW*129/70
29727  }, phaserTweenDuration, phaserTweenType, true, 0);
29728 
29729 }
29730 } else {
29731 var arrays = [];
29732 var workingArray = phaserShownCardsPli.cardsList;
29733 var nbCartesParLigneEncart = Math.floor((wwi-carteAffW)/ecartCartesAffR)+1;
29734 while (workingArray.length>nbCartesParLigneEncart) {
29735 arrays.push(workingArray.slice(0,nbCartesParLigneEncart));
29736 workingArray = workingArray.slice(nbCartesParLigneEncart);
29737 }
29738 arrays.push(workingArray);
29739 var decalH = 0;
29740 for (var h in arrays) {
29741 var tmpArr = arrays[h];
29742 var tmpcpt = 0;
29743 for (var g in tmpArr) {
29744  tw2 = gamePhaser.add.tween(tmpArr[g]);
29745  tw2.to({ 
29746  x:0-(ecartCartesAffR*(tmpArr.length-1)+carteAffW)/2+tmpcpt*ecartCartesAffR,
29747  y:0+textHeight+decalH,
29748  width:carteAffW,
29749  height:carteAffW*129/70 
29750  }, phaserTweenDuration, phaserTweenType, true, 0);
29751  
29752  tmpcpt++;
29753 }
29754 decalH +=30;
29755 }
29756 }
29757 //phaserShownCardsPli.phaserTxt.setTextBounds(0, 0,wwi0 , 300);
29758
29759
29760 var roundedRadius = getLevelAnimValue(3,6);
29761 
29762 tweenFond(phaserShownCardsPli.phaserFond,phaserShownCardsPli.groupFondCartesAffichess,0,0,wwi,textHeight+carteAffW*129/70+5,pcaffAlpha,roundedRadius,function (r) {phaserShownCardsPli.phaserFond = r; });
29763 
29764 var largeurMasque = getLevelAnimValue(wwi*2,wwi);
29765 
29766 
29767 var mask;
29768 if (phaserShownCardsPli.maskContent) {
29769 phaserShownCardsPli.maskContent.clear();
29770 mask = phaserShownCardsPli.maskContent;
29771 } else {
29772 mask = gamePhaser.add.graphics(0, 0);
29773 phaserShownCardsPli.groupDessusFondCartesAffichess.mask = mask;
29774 phaserShownCardsPli.maskContent = mask;
29775 groupCartesAffichess.add(mask);
29776 }
29777 mask.beginFill(0xffffff);
29778 mask.drawRect(0-largeurMasque/2+2,0+2, largeurMasque-4,textHeight+239*0.8+10-4);
29779 
29780 ttalHeight += textHeight+239*0.8+10+10;
29781 }
29782 
29783 if (getWorldW()<600) {
29784 topActionsForChat = ttalHeight;
29785 }
29786 
29787 if (phaserChatElts) {
29788
29789 var widthChat = getWorldW()-20;
29790 var widthChat2 = getWorldW()-20;
29791 if ( ( phaserShownCardsPli || phaserActionBtns.length ) && techniqueLevelAnim==100 && getWorldW()>=600) {
29792 widthChat = (getWorldW()-20)/2-3;
29793 }
29794 if ( techniqueLevelAnim==0 && getWorldW()>=600) {
29795 widthChat2 = (getWorldW()-20)/2-8-groupEq[i].width/2;//123456
29796 }
29797 var chatx = widthChat/2+10;
29798 var chatx2 = widthChat2/2+10;
29799 var chaty0;
29800 
29801
29802 function getHeightWithoutChatLine() {
29803 var res = getWorldH()-5;
29804 if (getWorldW()<600) {
29805 res -=34;
29806 } else {
29807 res -=50;
29808 }
29809 return res;
29810 }
29811 var chatTxtSize = 18;
29812 /*if (!isPhaserFondChatShown)
29813 chatTxtSize = 16;*/
29814 if (getWorldW()<600)
29815 chatTxtSize = 14;
29816
29817 var chatTxtSize2 = 16;
29818 if (getWorldW()<600)
29819 chatTxtSize2 = 14;
29820 
29821 phaserChatElts.textChat.setTextBounds(0, 0,widthChat-6 , 500);
29822 phaserChatElts.textChat.style.wordWrapWidth = widthChat-6;
29823 phaserChatElts.textChat.fontSize = chatTxtSize;
29824 
29825
29826 phaserChatElts.textChat2.setTextBounds(0, 0,widthChat2-6 , 500);
29827 phaserChatElts.textChat2.style.wordWrapWidth = widthChat2-6;
29828 phaserChatElts.textChat2.fontSize = chatTxtSize2;
29829 
29830 var height100 = phaserChatElts.textChat.height+6;
29831 
29832
29833
29834 if ( (phaserShownCardsPli || phaserActionBtns.length) && techniqueLevelAnim==100 && getWorldW()>=600) {
29835 height100 = groupCartesAffichess.height;
29836 if (height100<200) {
29837 height100 = 200;
29838 ttalHeight += 100;
29839 }
29840 } else if (techniqueLevelAnim==100) {
29841 if (height100>250)
29842 height100 = 250;
29843 ttalHeight += height100+10;
29844 } else {
29845
29846 if (height100>
29846getHeightWithoutChatLine() )
29847 height100 = getHeightWithoutChatLine();
29848 if (!isPhaserFondChatShown && height100>getHeightWithoutChatLine()/2-groupEq[i].height/2 )
29849 height100 = getHeightWithoutChatLine()/2-groupEq[i].height/2;
29850 }
29851 
29852 var chatTmpy = getHeightWithoutChatLine()-height100-6;
29853
29854 /*if (phaserCards.length==0) {
29855 chaty0 = chatTmpy;
29856 } else {
29857 chaty0 = getWorldH()-getMainCartesVisibleH()-(nbLigneCartes-1)*geHorizSpacingCards()-5-height100;//phaserChatElts.textChat.height-5;
29858 }*/
29859 chaty0 = chatTmpy;
29860
29861 var chaty100 = topActionsForChat+10;
29862 if (chaty100<chatTmpy)
29863 chaty100=chatTmpy;
29864 
29865 var chaty = getLevelAnimValue(chaty0,chaty100);
29866
29867
29868 var tw2 = gamePhaser.add.tween(phaserChatElts.closeBtn);
29869 tw2.to({ alpha:getLevelAnimValue(isPhaserFondChatShown?1:0,0)}, phaserTweenDuration, phaserTweenType, true, 0);
29870 
29871 var showScrollBtns = false;
29872 if (phaserChatElts.textChat.height>phaserChatElts.fondChat.height+40 && isPhaserFondChatShown)
29873 showScrollBtns = true;
29874 var tw2 = gamePhaser.add.tween(phaserChatElts.nextBtn);
29875 tw2.to({ alpha:getLevelAnimValue(showScrollBtns?1:0,0)}, phaserTweenDuration, phaserTweenType, true, 0);
29876 
29877 var tw2 = gamePhaser.add.tween(phaserChatElts.prevBtn);
29878 tw2.to({ alpha:getLevelAnimValue(showScrollBtns?1:0,0)}, phaserTweenDuration, phaserTweenType, true, 0);
29879 
29880 var posTopTexte = chaty+3;
29881 if (phaserChatElts.textChat.height+6>height100) {
29882 posTopTexte -= phaserChatElts.textChat.height+6-height100;
29883 }
29884 var posTopTexte2 = getHeightWithoutChatLine()+3-phaserChatElts.textChat2.height;
29885
29886 if (phaserCards.length>0) {
29887 posTopTexte2 = getWorldH()-getMainCartesVisibleH()-(nbLigneCartes-1)*geHorizSpacingCards()-5-phaserChatElts.textChat2.height;//phaserChatElts.textChat.height-5;
29888 }
29889
29890 posTopTexte2 = getHeaderHeight()+8;//
29891 
29892 var alphaText = 1;
29893 if ( !isPhaserFondChatShown && techniqueLevelAnim==0 )
29894 alphaText = 0;
29895 
29896 var alphaText2 = 1;
29897 if ( getWorldW()<550 || getWorldH()<450 || isPhaserFondChatShown || techniqueLevelAnim!=0 )
29898 alphaText2 = 0;
29899 
29900 
29901 var tw2 = gamePhaser.add.tween(phaserChatElts.textChat);
29902 tw2.to({ x:chatx+3-widthChat/2,y:posTopTexte+phaserDecalChat,alpha:alphaText}, phaserTweenDuration, phaserTweenType, true, 0);
29903
29904 var tw2 = gamePhaser.add.tween(phaserChatElts.textChat2);
29905 tw2.to({ x:chatx2+3-widthChat2/2,y:posTopTexte2,alpha:alphaText2}, phaserTweenDuration, phaserTweenType, true, 0);
29906 
29907 var tw2 = gamePhaser.add.tween(phaserChatElts.fondChat);
29908 tw2.to({ alpha:getLevelAnimValue(isPhaserFondChatShown?1:0,1),x:chatx,y:(isPhaserFondChatShown || techniqueLevelAnim==100)?Math.max(0,chaty):getWorldH(),width:widthChat,height:height100 }, phaserTweenDuration, phaserTweenType, true, 0);
29909 
29910 
29911 var tw2 = gamePhaser.add.tween(phaserChatElts.closeBtn);
29912 tw2.to({ x:chatx+widthChat/2-3,y:Math.max(3,chaty+3)}, phaserTweenDuration, phaserTweenType, true, 0);
29913 var tw2 = gamePhaser.add.tween(phaserChatElts.nextBtn);
29914 tw2.to({ x:chatx+widthChat/2-3-30,y:30+30+Math.max(3,chaty+3)}, phaserTweenDuration, phaserTweenType, true, 0);
29915 var tw2 = gamePhaser.add.tween(phaserChatElts.prevBtn);
29916 tw2.to({ x:chatx+widthChat/2-3,y:60+Math.max(3,chaty+3)}, phaserTweenDuration, phaserTweenType, true, 0);
29917 
29918 phaserChatElts.textChat.setTextBounds(0, 0,widthChat-6 , 500);
29919 phaserChatElts.textChat.style.wordWrapWidth = widthChat-6;
29920 //phaserChatElts.textChat.setText(phaserChatElts.textChat.text);
29921
29922 var mask;
29923 if (phaserChatElts.maskContent) {
29924 phaserChatElts.maskContent.clear();
29925 mask = phaserChatElts.maskContent;
29926 } else {
29927 mask = gamePhaser.add.graphics(0, 0);
29928 phaserChatElts.textChat.mask = mask;
29929 phaserChatElts.maskContent = mask;
29930 //phaserChatElts.groupChat.add(mask);
29931 }
29932 mask.beginFill(0xffffff);
29933 mask.drawRect(chatx+3-widthChat/2,Math.max(3,chaty+3), widthChat-6,height100-6);
29934 
29935 //ttalHeight += phaserChatElts.fondChat.height+20;
29936 }
29937 reposPlayedCards();
29938
29939 if (techniqueLevelAnim!=100)
29940 ttalHeight = 0;
29941
29942 
29943 if (globTweenTimer && globTweenTimer.onComplete)
29944 globTweenTimer.onComplete.removeAll();
29945
29946 globTweenTimer = gamePhaser.add.tween(groupRuban);
29947 globTweenTimer.to({ alpha:1 }, phaserTweenDuration, phaserTweenType, true, 0);
29948
29949 /*if (fromResize=='fromZomm') {
29950 phaserTweenNeedsRefresh = true;
29951 }*/
29952
29953 globTweenTimer.onComplete.add(function () {
29954 phaserTweenProcessing = false; 
29955 if (phaserTweenNeedsRefresh) {
29956 phaserTweenNeedsRefresh = false;
29957 reorganiseCartes ('chained');
29958 } 
29959 }, this);
29960 
29961
29962 /*if (fromResize=='fromZomm') {
29963 return;
29964 }*/
29965
29966 if (isTextInputFocusedIos) return;
29967 
29968
29969 var pixRatio = 1;
29970 if (window.devicePixelRatio && !isLowGraphism)
29971 pixRatio = window.devicePixelRatio;
29972
29973 var newScaleW = getWorldW();// * window.devicePixelRatio;
29974 var newScaleH = Math.max(getWorldH() -2,Math.floor(ttalHeight)+80);// * window.devicePixelRatio;
29975
29976 if (techniqueLevelAnim==100) {
29977 //$('#webBody').css('overflow','hidden');
29978 $('#webBody').css('height',newScaleH+'px');
29979 } 
29980 
29981 if (gamePhaser.scale.myPrevWidth!=newScaleW || gamePhaser.scale.myPrevHeight!=newScaleH ) {
29982
29983 //llog('setGameSize',newScaleW, newScaleH,'old is',gamePhaser.scale.myPrevWidth,gamePhaser.scale.myPrevHeight);
29984 gamePhaser.scale.setGameSize(newScaleW, newScaleH );
29985 gamePhaser.scale.myPrevWidth = newScaleW;
29986 gamePhaser.scale.myPrevHeight = newScaleH;
29987 if (pixRatio!=1) {
29988 gamePhaser.scale.game.renderer.resize(newScaleW*pixRatio,newScaleH*pixRatio);
29989 gamePhaser.width = newScaleW*pixRatio;
29990 gamePhaser.height = newScaleH*pixRatio;
29991 }
29992
29993 //Phaser.Canvas.setTouchAction(gamePhaser.canvas, "auto"); // disable the default "none"
29994 
29995
29996 }
29997
29998 //tw2.onComplete.add(function () {selMoteur.reorganiseCartesReal ('fromZomm')}, this);
29999 
30000 var endf = null;
30001 if (false && !isfuncsentResiz) {
30002 //reposPlayedCards();
30003 isfuncsentResiz = true;
30004 //llog('fromZomm');
30005 reorganiseCartes();
30006
30007 }
30008 return;
30009 
30010 //
30011
30012 
30013 
30014}
30015
30016
30017function decodeChatLine(txt) {
30018 //$pseudo,$line,$date,$idUtil
30019 var tmp = unescape(txt.split('+').join(' ')).split('&lt;').join('<').split('&gt;').join('>').split('#');
30020 var res = tmp[0]+" : "+tmp[1]+' '+tmp[2];
30021 if (tmp[4]) 
30022 res += tmp[4];
30023 return res;
30024}
30025function decodeChatLineNoDate(txt) {
30026 //$pseudo,$line,$date,$idUtil
30027 var tmp = unescape(txt.split('+').join(' ')).split('&lt;').join('<').split('&gt;').join('>').split('#');
30028 return tmp[0]+" : "+tmp[1];
30029}
30030
30031
30032var tempoChat = 'Conversation';
30033moteurPhaser.tempoAddChatLine = function (str)
30034{
30035 if (moteurPhaser.chatJoueurs===false) return;
30036 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return; 
30037 if (!phaserChatElts) return;
30038 if (phaserChatElts.textChat.text.length>tempoChat.length)
30039 tempoChat = phaserChatElts.textChat.text;
30040 var obj = decodeChatLine(str);
30041 tempoChat += "\n"+obj;
30042 tabChatLines.push(decodeChatLineNoDate(str));
30043 if (tabChatLines.length>4)
30044 tabChatLines.shift();
30045}
30046
30047moteurPhaser.flushChatLine = function ()
30048{ 
30049 if (moteurPhaser.chatJoueurs===false) return;
30050 if (!phaserChatElts) return;
30051 if (phaserChatElts) {
30052 var oldText = phaserChatElts.textChat.text;
30053 phaserChatElts.textChat.setText(tempoChat);
30054 phaserChatElts.textChat.addColor('#333333', oldText.length+1);
30055 phaserChatElts.textChat2.setText(tabChatLines.join("\n"));
30056 tempoChat = ''; 
30057 reorganiseCartes ();
30058 }
30059}
30060
30061
30062
30063
30064var firstchatlineadded = false;
30065var tabChatLines = ['Conversation'];
30066
30067moteurPhaser.addChatLine = function (str)
30068{
30069 if (moteurPhaser.chatJoueurs===false) return;
30070 if (typeof listeNoireChatJeuMasque=='function' && listeNoireChatJeuMasque(str)) return;
30071 var obj = decodeChatLineObj(str);
30072 
30073 if (!window.isSmileyOnly) {
30074 if (!phaserChatElts) return; 
30075 //log('addChatLine'+str);
30076 firstchatlineadded = true;
30077 var oldText = phaserChatElts.textChat.text;
30078 
30079 if (phaserChatElts) {
30080 phaserChatElts.textChat.setText(oldText+'\n'+decodeChatLine(str));
30081 tabChatLines.push(decodeChatLineNoDate(str));
30082 if (tabChatLines.length>4)
30083 tabChatLines.shift();
30084 phaserChatElts.textChat2.setText(tabChatLines.join("\n"));
30085 }
30086 }
30087
30088 
30089 var indJoueur = 0;
30090 for ( var i in equipiers_pseudos) {
30091 if (equipiers_pseudos[i].text==obj[0]) {
30092 indJoueur = parseInt(i);
30093 selMoteur.showMessageJoueur(parseInt(i),obj[1].split('&lt;').join('<').split('&gt;').join('>'));
30094 }
30095 }
30096
30097 if (!window.isSmileyOnly) {
30098 var colors = ['#189300','#d87300','#00a2dd','#b102d8','#001489'];
30099 phaserChatElts.textChat.addColor(colors[indJoueur], oldText.length);
30100 //phaserChatElts.textChat.addColor('#888888', oldText.length+obj[0].length+1);
30101 phaserChatElts.textChat.addColor('#333333', oldText.length+obj[0].length+3);
30102 phaserChatElts.textChat.addColor('#999999', oldText.length+obj[0].length+3+1+obj[1].length);
30103 }
30104
30105 reorganiseCartes ('fromZomm');
30106}
30107function phaserClickCard() {
30108 //llog('click card',this);
30109 if (this.myAction) {
30110 if (this.actionDisabled>0)
30111 return;
30112 this.actionDisabled = 1;
30113 var self = this;
30114 eval(this.myAction);
30115 setTimeout( function () { self.actionDisabled = 0; },800);
30116 }
30117}
30118
30119var phaserCards = [];
30120var currPhcardLeft = 0;
30121
30122moteurPhaser.addCard = function (name, action)
30123{
30124 selMoteur.clearMessagePlateauJeu();
30125 currPhcardLeft+=20;
30126
30127 var topCard = getWorldH()/2-70;
30128 if (techniqueLevelAnim<50)
30129 topCard = getWorldH()+70;
30130 var spriteOmbre = gamePhaser.add.sprite(-4, -2 , 'CarteOmbre');
30131 var tmpphcard = gamePhaser.add.button(0 , 0 , name.split('.gif').join('.png'), phaserClickCard );//
30132 var group = gamePhaser.add.group();
30133 groupDesCartes.add(group);
30134 group.x = getWorldW()/2-50;
30135 group.y = topCard;
30136 group.cardObj = tmpphcard;
30137 group.add(spriteOmbre);
30138 group.add(tmpphcard);
30139 
30140 
30141 group.alt = name;
30142 group.id = 'MonJeu'+name;
30143 
30144 tmpphcard.alt = name;
30145 tmpphcard.id = 'MonJeu'+name;
30146 tmpphcard.myAction = action;
30147 
30148 var scaleCard = 100/tmpphcard.width;
30149 tmpphcard.scale.setTo(scaleCard,scaleCard);
30150
30151 spriteOmbre.width = tmpphcard.width;
30152 spriteOmbre.height = tmpphcard.height;
30153 
30154 phaserCards.push(group);
30155 
30156 return;
30157} 
30158moteurPhaser.getCards = function () {
30159 return phaserCards;
30160}
30161
30162moteurPhaser.hasCardHand = function (name)
30163{ 
30164 for (var i in phaserCards) {
30165 if (phaserCards[i].alt==name) {
30166 return true;
30167 }
30168 }
30169 return false;
30170}
30171
30172moteurPhaser.setCardAction = function (name, action)
30173{ 
30174 //var _name = name.split('.gif').join('.png');
30175 //llog("setcardaction",name, action);
30176 for (var i in phaserCards) {
30177 if (phaserCards[i].alt==name) {
30178 phaserCards[i].cardObj.actionDisabled = 0;
30179 if (action=='' || action==null) {
30180 phaserCards[i].cardObj.myAction = null;
30181 carteNonSelectionnable('MonJeu'+name);
30182 }
30183 else {
30184 phaserCards[i].cardObj.myAction = action;
30185 }
30186 return;
30187 }
30188 }
30189} 
30190
30191
30192
30193moteurPhaser.clearCardsActions = function ()
30194{
30195 selMoteur.timeThatRemains(-1,0);
30196 for (var i in phaserCards) {
30197 phaserCards[i].cardObj.myAction = null;
30198 }
30199 removeMasques();
30200}
30201moteurPhaser.clearCards = function ()
30202{ 
30203 for (var i in phaserCards) {
30204 phaserCards[i].destroy();
30205 }
30206 phaserCards = [];
30207 
30208 playSoundEffect('Casino Cards.mp3',true);
30209}
30210
30211
30212var lastUserEmpty = true;
30213
30214//var medaillesTypes = [ "Duplicate","Premium4","Premium5","Assiduite","Missions","Politesse","Banchat","Abandon"];
30215var phaserMedailles = [];
30216
30217function clearJoueurMedailles(num) {
30218 //console.log('clearJoueurMedailles',phaserMedailles);
30219 if (phaserMedailles[num]) {
30220 for (var f in phaserMedailles[num]) {
30221 if (phaserMedailles[num][f]) phaserMedailles[num][f].destroy();
30222 }
30223 }
30224 phaserMedailles[num] = new Array();
30225}
30226
30227var cpgp = 0;//(1,'IA 2','/images/IAs/IA-6.jpg','',1,'0','0','-1');
30228moteurPhaser.setUtilisateur = function (num,pseudo, avatar,score,connected,messagesJoueurs,grade,idJoueur)
30229{ 
30230 $(equipiers_avatars[num]).data("idUtilisateur",parseInt(idJoueur,10));
30231 if (avatar!='' && avatar!=null)
30232 {
30233 equipiers_pseudos[num].setText(pseudo);// = [];
30234 dynamicLoadImageTo( equipiers_avatars[num], avatar );
30235 
30236 } else if (true) {
30237 var existing = equipiers_avatars[num];
30238 var firstWidth = existing.width;
30239 var firstHeight = existing.height;
30240 if (pseudo=='Vide' || pseudo=='Libre') {
30241 existing.loadTexture('Avat_Nobody');
30242 } else {
30243 existing.loadTexture('Avat_Unknown'); 
30244 }
30245 existing.width = firstWidth;
30246 existing.height = firstHeight;
30247 
30248 }
30249 var signalFFT = false;
30250 if ( $(equipiers_avatars[num]).data("pseudo") != pseudo)
30251 {
30252 clearJoueurMedailles(num) ;
30253 if (grade!='0') {
30254
30255  var medaillesPos = [[50,121],[50,78],[50,38]];
30256 // $('#divJoueur'+num+' .gradesJ').html('');
30257 if (idJoueur>0) {
30258 var tabMed = grade.split('-');
30259 for (var o=0;o<tabMed.length;o++) {
30260 if (tabMed[o]=='FFT')
30261 signalFFT = true;
30262 else if (o<3) {
30263 var img = dynamicLoadImage( medaillesPos[o][0], medaillesPos[o][1], '/workers/medailleMin.php?type='+tabMed[o]+'&resizeToHeight=44&idJoueur='+idJoueur+'&v='+Math.random(), null, null,groupEq[num]);
30264 phaserMedailles[num].push(img);
30265 }
30266 }
30267 } else {
30268 if (idJoueur<0 && /^IA(?:\s|$)/.test(pseudo)) {
30269  if (!phaserMedalsDisabled) {
30270  var img = dynamicLoadImage( medaillesPos[0][0], medaillesPos[0][1], '/workers/medailleMin.php?type=IA&resizeToHeight=44&idJoueur=0'+'&v='+Math.random(), null, null,groupEq[num]);
30271  phaserMedailles[num].push(img);
30272  }
30273 }
30274 else {
30275  var img = dynamicLoadImage( medaillesPos[0][0], medaillesPos[0][1], '/workers/medailleMin.php?type=Wait&resizeToHeight=44&idJoueur=0'+'&v='+Math.random(), null, null,groupEq[num]);
30276  phaserMedailles[num].push(img);
30277 }
30278 
30279 }
30280 }
30281 }
30282 console.log('testFFT '+pseudo);
30283 if (signalFFT) {
30284 console.log('signalFFT '+pseudo);
30285 var imageFFT = gamePhaser.add.image(224, 18 ); 
30286 imageFFT.anchor.setTo(0.5,0.5); 
30287 groupEq[num].add(imageFFT);
30288 imageFFT.loadTexture('FFT');
30289 phaserMedailles[num].push(imageFFT);
30290 
30291 }
30292 $(equipiers_avatars[num]).data("pseudo",pseudo);
30293 $(equipiers_avatars[num]).data("imgSrc",avatar);
30294 $(equipiers_avatars[num]).data("signalFFT",signalFFT);
30295 $(equipiers_avatars[num]).data("idPos",num);
30296 
30297    
30298       
30299 if (connected || pseudo=='Vide' || pseudo=='Libre') {
30300 equipiers_leds[num].loadTexture('LedVert');
30301 }
30302 else {
30303 equipiers_leds[num].loadTexture('LedRouge');
30304 }     
30305 
30306 var d = new Date();
30307
30308 if (pseudo=="Vide" )
30309 {
30310
30311 if (d.getTime()>dateDebutPartie+30*1000)
30312 {
30313  if ( equipiers_pseudos[num].text != 'Ajouter une IA') {
30314  equipiers_pseudos[num].setText('Ajouter une IA');
30315  }
30316 }
30317 else
30318 {
30319 if ( equipiers_pseudos[num].text != pseudo) {
30320  equipiers_pseudos[num].setText(pseudo);
30321 }
30322 }
30323 }
30324 else
30325 { 
30326 equipiers_pseudos[num].setText(pseudo);
30327 }
30328 
30329 return; 
30330} 
30331
30332
30333
30334
30335moteurPhaser.masquerProfilUtilisateur = function (idUtilisateur)
30336{
30337 var avatarMasque = '/avatars/Blacklist.png';
30338 idUtilisateur = parseInt(idUtilisateur,10);
30339 for (var i=0;i<equipiers_avatars.length;i++) {
30340 if (parseInt($(equipiers_avatars[i]).data('idUtilisateur'),10)==idUtilisateur) {
30341 dynamicLoadImageTo(equipiers_avatars[i],avatarMasque);
30342 $(equipiers_avatars[i]).data('imgSrc',avatarMasque);
30343 }
30344 }
30345}
30346
30347moteurPhaser.cartePreselect = function (obj,name) {
30348
30349 notifyUserActivity();
30350 if (advanceCardPlayDisable) return;
30351 if (obj.isPreSelected) {
30352 obj.isPreSelected = false;
30353 rpcNoQueue('prochaineCarte=');
30354 selMoteur.clearMasques();
30355 nextDelayIsNull = 0;
30356 } else {
30357 if (shalAskForConfirmCardPlay || (name=='le petit' && shalAskForconfirmationPetit) ) {
30358 confirme('Etes-vous sûr de vouloir presélectionner '+name+' ?',function () {
30359 rpcNoQueue('prochaineCarte='+getCardName(obj));
30360 obj.isPreSelected = true;
30361 selMoteur.clearMasques();
30362  carteSelectionnee(obj.id); 
30363  nextDelayIsNull = 1;
30364 });
30365 } else {
30366 rpcNoQueue('prochaineCarte='+getCardName(obj));
30367 selMoteur.clearMasques();
30368 carteSelectionnee(obj.id); 
30369 obj.isPreSelected = true;
30370 nextDelayIsNull = 1;
30371 }
30372 }
30373 return; 
30374}   
30375
30376moteurPhaser.cartePoigneeSelectInit = function (cardName) {  
30377 var cnt = selMoteur.getCards();
30378 for (key in cnt) {
30379 if (cnt[key] && cnt[key].id!=null && cnt[key].id==cardName )
30380 {
30381  cartePoigneeSelect(cnt[key]);
30382  return;
30383 }
30384 }
30385
30386}
30387
30388function cartePosX (num,nodelta) {
30389 var sizeCard = getPlateauCardSize();
30390 var oneWidth = groupEq[num].width;
30391
30392 var delta0 = oneWidth/2-sizeCard.w/2;
30393 var delta100 = (getWorldW()/2-groupEq[num].goX)/3+(curRndRotC*95423*num)%20-10;
30394 var delta = delta0*techniqueLevelAnim/100+delta100*(100-techniqueLevelAnim)/100;
30395
30396 var result = groupEq[num].goX+oneWidth/2-sizeCard.w/2;
30397 if (!nodelta) result += delta;
30398 if (result<0) result = 0;
30399 return result;
30400 
30401}
30402function cartePosY (num,nodelta) {
30403 var sizeCard = getPlateauCardSize();
30404 var oneWidth = groupEq[num].height;
30405 
30406 var delta0 = 0;
30407 var delta100 = ( (getWorldH()-mainNbLignesPhaser*geHorizSpacingCards()-50)/2-groupEq[num].goY)/2+(curRndRotC*95423*num)%20-10;
30408 
30409 var delta = delta0*techniqueLevelAnim/100+delta100*(100-techniqueLevelAnim)/100;
30410 var result = groupEq[num].goY+oneWidth/2-sizeCard.h/2;
30411 if (!nodelta) result += delta;
30412 if (result<0) result = 0;
30413 return result;
30414 
30415}
30416var curRndRotC = 1;
30417function carteRot (num) {
30418 
30419 var delta0 = 0;
30420 var delta100 = (curRndRotC*95423*num)%20-10;
30421 var delta = delta0*techniqueLevelAnim/100+delta100*(100-techniqueLevelAnim)/100;
30422 
30423 return delta;
30424 
30425}
30426function getCardPlayerTopPhaser() {
30427 return groupEq[0].goY+5;
30428}
30429function reposPlayedCards() {
30430 var ccW = getPlateauCardSize();
30431 for (var f in cartesSurLeTapis) {
30432 var tw = gamePhaser.add.tween(cartesSurLeTapis[f]);
30433 tw.to({ x:cartePosX(f),y:cartePosY(f),angle:carteRot (f),width:ccW.w,height:ccW.h }, 500, Phaser.Easing.Linear.None , true, 0);
30434 }
30435 return;
30436}
30437 
30438var cartesSurLeTapis = new Array();
30439
30440function removeMasques() {
30441 for (var r in phaserCardsMasques) {
30442 phaserCardsMasques[r].destroy();
30443 }
30444}
30445var playCardStarted = false;
30446moteurPhaser.playOppCard = function (name,opp)
30447{
30448 playCardStarted = true;
30449 
30450 var topO = getCardPlayerTopPhaser();
30451 var ccW = getPlateauCardSize();
30452 
30453 // c'est une carte a moi qui est jouee
30454 if (opp==whoamiNum )
30455 {
30456 removeMasques();
30457
30458 var myPlayedCard;
30459 for (var oo in phaserCards) {
30460  if (phaserCards[oo].alt == name) {
30461  myPlayedCard = phaserCards[oo];
30462  phaserCards.splice(oo,1);
30463  }
30464 }
30465 //llog('playoneof min',phaserCards.length);
30466 if (!myPlayedCard) {
30467  llog('not found');
30468  return;
30469 }
30470 
30471 groupDesCartes.bringToTop(myPlayedCard);
30472 
30473 myPlayedCard.id = 'newOne'+whoamiNum;
30474 myPlayedCard.cardObj.myAction=null;
30475
30476 globTweenTimer.onComplete.removeAll();
30477 phaserTweenProcessing = true;
30478 
30479 var tw = gamePhaser.add.tween(myPlayedCard);
30480 tw.to({ y:myPlayedCard.y-40 }, 350, Phaser.Easing.Cubic.Out , true, 0);
30481
30482 var tw2 = gamePhaser.add.tween(myPlayedCard);
30483 tw2.to({ x:cartePosX (opp),y:cartePosY (opp),angle:carteRot (opp),width:ccW.w,height:ccW.h }, 1000, Phaser.Easing.Cubic.Out);
30484 tw.chain(tw2);
30485
30486 //$(myPlayedCard).data('pos',opp);
30487
30488 tw2.onComplete.add(function () {phaserTweenProcessing = false;reorganiseCartes (); }, this);
30489 //reorganiseCartes ();
30490 cartesSurLeTapis[whoamiNum] = myPlayedCard;
30491 
30492 lastMO = null;
30493 playSoundEffect('CardPlaced.mp3',true);
30494 return;
30495 }
30496 if (opp==null) 
30497 {
30498 opp=lastOpp;
30499 lastOpp++;
30500 if (lastOpp>3) lastOpp=0;
30501 }
30502 if (cartesSurLeTapis[opp] && cartesSurLeTapis[opp].alt == name) return;
30503 
30504
30505 var sizeCard = ccW;
30506 var groupPlayedCard = gamePhaser.add.group();
30507 groupPlayedCard.alt = name;
30508
30509 var spriteOmbre = gamePhaser.add.sprite(-4, 0 , 'CarteOmbre');
30510 var tmpphcard = gamePhaser.add.image(0, 0 , name.split('.gif').join('.png') );//
30511 var scaleCard = sizeCard.w/tmpphcard.width*0.9;
30512 tmpphcard.scale.setTo(scaleCard);
30513 
30514 groupPlayedCard.add(spriteOmbre);
30515 groupPlayedCard.add(tmpphcard);
30516 groupPlayedCard.cardObj = tmpphcard;
30517
30518 groupPlayedCard.x = groupEq[opp].x+groupEq[opp].width/2-tmpphcard.width/2;//cartePosX(opp);
30519 groupPlayedCard.y = groupEq[opp].y+groupEq[opp].height/2-tmpphcard.height/2;//cartePosY(opp);
30520 //groupPlayedCard.angle = carteRot(opp);
30521 //groupPlayedCard.alpha = 0.8;
30522 spriteOmbre.width = tmpphcard.width;
30523 spriteOmbre.height = tmpphcard.height;
30524 
30525 groupDesCartes.add(groupPlayedCard);
30526 //phaserCards.push(tmpphcard);
30527 cartesSurLeTapis[opp] = groupPlayedCard; 
30528 
30529 reorganiseCartes ();
30530
30531 if (Math.random()<0.5)
30532 playSoundEffect('cards_02.mp3',true);
30533 else
30534 playSoundEffect('cards_01.mp3',true);
30535 
30536 return;
30537        
30538}
30539
30540
30541var cartesRamasseesPhaser;
30542
30543
30544moteurPhaser.ramassePoignee = function (joueur)
30545{
30546 //lesCartesVontEtresRamassees = true;
30547
30548 phaserTweenProcessing = true;
30549 for (var m=0;m<6;m++)
30550 {
30551 if (cartesSurLeTapis[m]) {
30552 if (cartesSurLeTapis[m].alt.split('6_Excuse').length<2) {
30553
30554  var tw = gamePhaser.add.tween(cartesSurLeTapis[m]);
30555  tw.to({ x:cartePosX(joueur,true),y:cartePosY(joueur,true),angle:carteRot(joueur) }, 700, Phaser.Easing.Cubic.Out, true, 0);
30556  if (m==joueur) {
30557
30558  groupDesCartes.bringToTop(cartesSurLeTapis[m]);
30559  //gamePhaser.world.bringToTop(cartesSurLeTapis[m]);
30560  }
30561 }
30562 cartesSurLeTapis[m].id = 'ramasse'+m ;
30563 }
30564 }
30565 cartesRamasseesPhaser = cartesSurLeTapis;
30566 cartesSurLeTapis = new Array();
30567 playSoundEffect('card move sound.mp3',true);
30568 setTimeout(function () { finRamasseCartesPhh(joueur);curRndRotC++; },700);
30569}
30570
30571
30572function finRamasseCartesPhh (joueur)
30573{
30574 for (var m in cartesRamasseesPhaser)
30575 {
30576 if (cartesRamasseesPhaser[m]) {
30577 var manuObj;
30578 if (cartesRamasseesPhaser[m].cardObj)
30579 manuObj = cartesRamasseesPhaser[m].cardObj;
30580 else
30581 manuObj = cartesRamasseesPhaser[m];
30582 
30583 var oldWidth = manuObj.width,oldH=manuObj.height;
30584 manuObj.loadTexture('Verso');
30585 var ccW = getPlateauCardSize();
30586 manuObj.width = oldWidth;
30587 manuObj.height = oldH;
30588 //manuObj.scale.setTo(oldWidth/manuObj.width/2);
30589 }
30590 } 
30591 setTimeout(function () { finRamasseCartes2(joueur); } , 600); 
30592}
30593/*
30594 var ccW = getPlateauCardSize();
30595 for (var f in cartesSurLeTapis) {
30596 var tw = gamePhaser.add.tween(cartesSurLeTapis[f]);
30597 tw.to({ x:cartePosX(f),y:cartePosY(f),angle:carteRot (f),width:ccW.w,height:ccW.h }, 500, Phaser.Easing.Linear.None , true, 0);
30598 }
30599 return;*/
30600var cptLeveesCartes = 0;
30601function finRamasseCartes2 (joueur)
30602{
30603 for (var m=0;m<6;m++)
30604 { 
30605 if (cartesRamasseesPhaser[m])
30606 cartesRamasseesPhaser[m].destroy();
30607 } 
30608 cartesRamasseesPhaser = []; 
30609 phaserTweenProcessing = false;
30610 if (phaserTweenNeedsRefresh) {phaserTweenNeedsRefresh = false;reorganiseCartes ('chained');}    
30611 
30612} 
30613moteurPhaser.setRoleJoueurClass = function (num,className) {
30614
30615 if (className=='') className='roleAnnonce';
30616 if (className=='rolePasse') className='roleDefaite';
30617 if (className=='rolePreneur') className='rolePreneurPrise';
30618
30619 
30620 if ( (!couleurAppeleePhaser || couleurAppeleePhaser.appelCouleurI!=num) ) {
30621
30622 equipiers_botTxt[num].x = 26;
30623 equipiers_maskrond[num].visible = false; 
30624 }
30625 else {
30626
30627 equipiers_botTxt[num].x = 56;
30628 equipiers_maskrond[num].visible = true;
30629 
30630 }
30631
30632 //llog('set role joueur texture'+className);
30633 equipiers_cadres[num].loadTexture(className);
30634
30635 return;
30636
30637
30638}
30639
30640
30641moteurPhaser.setPrise = function (num,txt) 
30642{
30643 if (txt=='Passe')
30644 selMoteur.setRoleJoueurClass(num,'rolePasse');
30645 else if (txt!='')
30646 selMoteur.setRoleJoueurClass(num,'rolePreneur');//+txt.split(' ').join('')
30647 else
30648 selMoteur.setRoleJoueurClass(num,'roleAnnonce');
30649
30650 equipiers_botTxt[num].text = txt.toUpperCase();
30651 
30652 //resizeChat();
30653}
30654
30655moteurPhaser.setPriseTxt = function (num,txt) 
30656{
30657 equipiers_botTxt[num].text = txt.toUpperCase();
30658 
30659 //resizeChat();
30660}
30661moteurPhaser.setPreneur = function (num,annonce,chelem)
30662{
30663
30664 for ( var i=0;i<6;i++)
30665 {
30666
30667 if (equipiers_botTxt[i]) {
30668
30669 if (num==-1)
30670 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
30671 else if (i==num) {
30672 selMoteur.setRoleJoueurClass(i,'rolePreneur'+tabAnnonces[annonce].split(' ').join(''));
30673 } else
30674 selMoteur.setRoleJoueurClass(i,'roleAnnonce');
30675 
30676 if (i==num)
30677 {
30678 if (chelem) {
30679 equipiers_botTxt[i].text = (tabAnnoncesCrt[annonce]+' + chelem').toUpperCase(); 
30680 } else     
30681  equipiers_botTxt[i].text = tabAnnonces[annonce].toUpperCase(); 
30682 }
30683 else
30684 {
30685 equipiers_botTxt[i].text = '';
30686 }
30687 }
30688 }
30689}
30690
30691moteurPhaser.clearPrise = function (i)
30692{
30693 equipiers_botTxt[i].text = '';
30694}
30695
30696moteurPhaser.setDonneurPos = function (num) {
30697
30698 for (var k=0;k<5;k++) {
30699 if (equipiers_pseudos[k])
30700 equipiers_pseudos[k].donneurIcon.visible = false;
30701 }
30702 if (num>=0 && equipiers_pseudos[num])
30703 equipiers_pseudos[num].donneurIcon.visible = true;
30704
30705 replaceTourDeJeu();
30706 return;
30707}
30708moteurPhaser.setScore = function (num,score)
30709{
30710 if (score!='') {
30711
30712 equipiers_scoresImg[num].visible = true;
30713 equipiers_scoresTxt[num].visible = true;
30714 
30715 equipiers_scoresTxt[num].text = score.split('<b>').join('').split('</b>').join('');
30716 } else {
30717
30718 equipiers_scoresImg[num].visible = false;
30719 equipiers_scoresTxt[num].visible = false;
30720 }
30721}
30722
30723
30724var numActions = 0;
30725var phaserActionBtns = [];
30726
30727moteurPhaser.clearActions = function (noscroll)
30728{
30729 for (var i in phaserActionBtns) {
30730 phaserActionBtns[i].destroy();
30731 }
30732 phaserActionBtns = [];
30733 if (numActions!=0) {
30734 //selMoteur.hideInfoJeu();
30735 if (!noscroll) $("html, body").stop().animate({ scrollTop: 0 }, 700);
30736 }
30737 if (noscroll==2) {
30738 $("html, body").stop().animate({
30739 scrollTop: $(document).height()
30740 }, 700);
30741 }
30742 numActions = 0; 
30743 reorganiseCartes ('fromZomm');
30744}
30745function getActionListHeight (list,x,width,y)
30746{
30747 if (getWorldW()<700 || getWorldH()<600 ) {
30748 for (var i in list) {
30749 list[i].scale.setTo(2/3);
30750 }
30751 } else {
30752
30753 for (var i in list) {
30754 if (techniqueLevelAnim)
30755 list[i].scale.setTo(1);
30756 else
30757 list[i].scale.setTo(2/3);
30758 }
30759 }
30760 var ttalW = 0;
30761 var result = 1;
30762 var renderedActions = [];
30763 var remainingActions = [];
30764 for (var i in list) {
30765 if (ttalW+list[i].width+4>width && renderedActions.length>0) {
30766 result++;
30767 ttalW = list[i].width+4;
30768 renderedActions = [];
30769 //remainingActions.push(list[i]);
30770 } else {
30771 ttalW += list[i].width+4;
30772 //renderedActions.push(list[i]);
30773 }
30774 }
30775 var result = result*(list[0].height+4);
30776 if (messagePlateau) {
30777 result += getMessageTexteHeight(result)+4;
30778 }
30779 return result;
30780}
30781function replaceActionList (list,x,width,y)
30782{
30783 //var decalTexte = 0;
30784 /*if (messagePlateau) {
30785 decalTexte += 110+4;
30786 }*/
30787 var nbLignes = 1;
30788 if (getWorldW()<500 || getWorldH()<500 ) {
30789 for (var i in list) {
30790 list[i].scale.setTo(1/2);
30791 }
30792 } else if (getWorldW()<700 || getWorldH()<600 ) {
30793 for (var i in list) {
30794 list[i].scale.setTo(2/3);
30795 }
30796 } else {
30797
30798 for (var i in list) {
30799 if (techniqueLevelAnim)
30800 list[i].scale.setTo(1);
30801 else
30802 list[i].scale.setTo(2/3);
30803 }
30804 }
30805 var ttalW = 0;
30806 var lineWidth = 0;
30807 var renderedActions = [];
30808 var remainingActions = [];
30809 for (var i in list) {
30810 if (ttalW+list[i].width+4>width && renderedActions.length>0) {
30811 remainingActions.push(list[i]);
30812 ttalW = width;
30813 } else {
30814 ttalW += list[i].width+4;
30815 lineWidth += list[i].width+4;
30816 renderedActions.push(list[i]);
30817 }
30818 }
30819 if (renderedActions.length==0) return 0;
30820 //llog('replace actions',ttalW);
30821 var posx = x-width/2+(width-lineWidth)/2;
30822 for (var i in renderedActions) {
30823 /*renderedActions[i].x=Math.round(posx);
30824 renderedActions[i].y=Math.round(y);*/
30825 
30826 var tw = gamePhaser.add.tween(renderedActions[i]);
30827 tw.to({ x:Math.round(posx)+4,y:Math.round(y)+4,alpha:1 }, phaserTweenDuration, phaserTweenType, true, 0);
30828 
30829 posx+=renderedActions[i].width+4;
30830 }
30831 if (remainingActions.length>0)
30832 nbLignes += replaceActionList (remainingActions,x,width,y+renderedActions[0].height+4);
30833 return nbLignes;
30834}
30835
30836var phaserActionsHeight = 0;
30837function replaceActions (x,width,y,yanchor)
30838{
30839 if (width<280) width=280;
30840 if (getWorldH()<400 ) width=Math.min(getWorldW()-20,600);
30841
30842
30843 var nbLignes;
30844 if (phaserChatElts && techniqueLevelAnim==100 && getWorldW()>=600) {
30845 nbLignes = replaceActionList (phaserActionBtns,getWorldW()/2+3-(getWorldW()/2-20-3)/2,getWorldW()/2-20-3,0);
30846 } else {
30847 nbLignes = replaceActionList (phaserActionBtns,0,width,0);
30848 
30849 }
30850 
30851 
30852 var messageHH = 0;
30853
30854 var scotchH = scotch.height/2;
30855
30856 var hhactions = 0;
30857 
30858 if (messagePlateau) {
30859 var tw2 = gamePhaser.add.tween(messagePlateau.textPlateau);
30860 tw2.to({ fontSize:getPlateauTxtSize(),alpha:1 }, phaserTweenDuration, phaserTweenType, true, 0);
30861 
30862 messagePlateau.textPlateau.setTextBounds(0, 0,width-8 , 100);
30863 messagePlateau.textPlateau.style.wordWrapWidth = width-6;
30864 messagePlateau.textPlateau.setText(messagePlateau.textPlateau.text);
30865 }
30866 
30867 if (phaserActionBtns.length>0) {
30868 phaserActionsHeight = nbLignes*(phaserActionBtns[0].height+4);
30869 if (!messagePlateau) {
30870 phaserActionsHeight += 35;
30871 }
30872 hhactions += phaserActionsHeight;
30873
30874 }
30875 if ( techniqueLevelAnim<50) {
30876 if (messagePlateau) {
30877 messageHH = getMessageTexteHeight(hhactions);
30878 }
30879 if (phaserActionBtns.length>0) {
30880 var tw = gamePhaser.add.tween(groupDesActionsBountons);
30881 tw.to({ y:messageHH }, phaserTweenDuration, phaserTweenType, true, 0);
30882 }
30883 if (messagePlateau) {
30884 hhactions += messageHH+4+scotchH;
30885 }
30886
30887 var opacity = (hhactions==0)?0:1;
30888 
30889 var tw = gamePhaser.add.tween(fondActions);
30890 tw.to({ x:x+2,y:y-hhactions*yanchor,width:width+4,height:hhactions+30,alpha:opacity }, phaserTweenDuration, phaserTweenType, true, 0);
30891 
30892 if (messagePlateau) {
30893 var tw = gamePhaser.add.tween(messagePlateau.fondPlateau);
30894 tw.to({ alpha:0 }, phaserTweenDuration, phaserTweenType, true, 0);
30895 }
30896 var opacityScotch = opacity;
30897 if (getWorldW()<600 || getWorldH()<500)
30898 opacityScotch = 0;
30899 
30900 var tw = gamePhaser.add.tween(scotch);
30901 tw.to({ x:x,y:y-hhactions*yanchor,alpha:opacityScotch }, phaserTweenDuration, phaserTweenType, true, 0);
30902 
30903 if (getWorldW()<800)
30904 scotch.scale.setTo(0.7);
30905 else
30906 scotch.scale.setTo(1);
30907 var tw = gamePhaser.add.tween(groupDesActions);
30908 tw.to({ x:getWorldW()/2,y:getLevelAnimValue(scotchH,0)+y-hhactions*yanchor }, phaserTweenDuration, phaserTweenType, true, 0);
30909 }
30910 else {
30911 if (messagePlateau) {
30912 messageHH = 150;
30913 if ( messageHH>messagePlateau.textPlateau.height)
30914 messageHH = messagePlateau.textPlateau.height;
30915 tweenFond(messagePlateau.fondPlateau,messagePlateau.groupFond,0,0,width,messageHH,0.8,6,function (r) {messagePlateau.fondPlateau = r; });
30916 }
30917 hhactions += messageHH;
30918
30919 if (phaserActionBtns.length>0) {
30920 var tw = gamePhaser.add.tween(groupDesActionsBountons);
30921 tw.to({ y:messageHH }, phaserTweenDuration, phaserTweenType, true, 0);
30922 }
30923 
30924 var tw = gamePhaser.add.tween(scotch);
30925 tw.to({ alpha:0 }, phaserTweenDuration, phaserTweenType, true, 0);
30926 
30927 var tw = gamePhaser.add.tween(fondActions);
30928 tw.to({ alpha:0 }, phaserTweenDuration, phaserTweenType, true, 0);
30929 
30930
30931 var tw = gamePhaser.add.tween(groupDesActions);
30932 tw.to({ x:Math.round(getWorldW()/2),y:Math.round(y) }, phaserTweenDuration, phaserTweenType, true, 0);
30933 }
30934
30935 //llog('height mask ppal text messageHH',messageHH);
30936 if (messagePlateau) {
30937 if (messagePlateau.scroller ) {
30938 messagePlateau.scroller.maskGraphics.clear();
30939 messagePlateau.scroller.maskGraphics.beginFill(0xffffff);
30940 messagePlateau.scroller.maskGraphics.drawRect(0,0,width ,messageHH);//
30941 messagePlateau.scroller.maskGraphics.y = getLevelAnimValue(scotchH,0)+y-hhactions*yanchor;//getWorldW();
30942 messagePlateau.scroller.maskGraphics.x = getWorldW()/2-width/2;
30943 messagePlateau.scroller._h = messageHH;
30944 }
30945 }
30946 return {actions:phaserActionsHeight,total:hhactions,message:messageHH};
30947
30948}
30949var TOACTIONS;
30950moteurPhaser.addAction = function (name,action,myclass,noscroll)
30951{
30952
30953 if (selMoteur.actionExists (name))
30954 return;
30955
30956 numActions++;
30957
30958 //llog('addAction',name);
30959 var actionBtn = createButton (0,40,htmlToPhaserText(name).toUpperCase(),function () {
30960 if (tempDisableJoueurBtn) return;
30961 tempDisableJoueurBtn = 1; 
30962 setTimeout(function () {tempDisableJoueurBtn=0;},700);
30963 eval(action);
30964 }, myclass);//"btn-warning");
30965 actionBtn.myName = name;
30966 actionBtn.x = -actionBtn.width/2;
30967 if (messagePlateau) {
30968 actionBtn.y = messagePlateau.textPlateau.height;
30969 }
30970 actionBtn.alpha = 0;
30971 phaserActionBtns.push(actionBtn);
30972 groupDesActionsBountons.add(actionBtn);
30973 
30974 clearTimeout(TOACTIONS);
30975 TOACTIONS = setTimeout(function () {
30976 reorganiseCartes ();
30977 /*if (!noscroll)
30978 $("html, body").stop().animate({ scrollTop:document.body.scrollHeight }, 1000);*/
30979 },20);
30980
30981}
30982
30983moteurPhaser.actionExists = function (name)
30984{
30985 for (var i in phaserActionBtns) {
30986 if (name==phaserActionBtns[i].myName) {
30987 return true;
30988 }
30989 }
30990 return false;
30991}
30992moteurPhaser.removeAction = function (name)
30993{
30994 for (var i in phaserActionBtns) {
30995 if (name==phaserActionBtns[i].myName) {
30996 phaserActionBtns[i].destroy();
30997 phaserActionBtns.splice(i,1);
30998 //delete phaserActionBtns[i];
30999 }
31000 }
31001 reorganiseCartes ('fromZomm');
31002
31003 return;
31004}
31005function replaceTourDeJeu() {
31006 for (var i in groupEq) {
31007 if (equipiers_pseudos[i].donneurIcon.visible) {
31008 groupEq[i].tourDeJeuE.x = 238;
31009 groupEq[i].tourDeJeuE.y = 75;
31010 
31011 } else {
31012 groupEq[i].tourDeJeuE.x = 238;
31013 groupEq[i].tourDeJeuE.y = 120;
31014 }
31015 }
31016}
31017var lastTurnSel = null; 
31018var phaserMyTurn = false;
31019moteurPhaser.setTurn = function (num)
31020{
31021 if (whoamiNum==num)
31022 phaserMyTurn = true;
31023 else
31024 phaserMyTurn = false;
31025 if (!phaserSelecteurTour) return;
31026 if (etapeCourante =="Terminee")
31027 {
31028 selMoteur.clearTurn();           
31029 }
31030 else
31031 {
31032 // if ( $$('selecteurTour')!=null) $$('selecteurTour').style.visibility='visible';
31033 for (var i in groupEq) {
31034 if (i==num) {
31035  groupEq[i].tourDeJeuE.visible = true;
31036 
31037 } else {
31038  groupEq[i].tourDeJeuE.visible = false;
31039 
31040 }
31041 }
31042 phaserSelecteurTour.visible = true;
31043 
31044 //var oneWidth = $('#divJoueur0').width();
31045 //var newPos = $('#divJoueur'+num).offset().left+oneWidth/2-$('#selecteurTour').width()/2;
31046 
31047 var tw = gamePhaser.add.tween(phaserSelecteurTour);
31048 tw.to({ x:groupEq[num].goX+groupEq[num].width/2,y:groupEq[num].goY+20+10 }, 500, Phaser.Easing.Cubic.Out, true, 0);
31049 
31050 //$('#selecteurTour').stop().animate( { left: newPos,top:$('#webBody').css('margin-top') }, 700 );
31051 
31052 // var newFx = new Fx.Tween('selecteurTour', { property: 'left' }).start(parseInt($$('selecteurTour').style.left), newPos );
31053 lastTurnSel = num;
31054 }
31055 replaceTourDeJeu();
31056} 
31057moteurPhaser.clearTurn = function () 
31058{
31059 phaserSelecteurTour.visible = false;
31060 for (var i in groupEq) {
31061 groupEq[i].tourDeJeuE.visible = false;
31062 }
31063 //if ( $$('selecteurTour')!=null) $$('selecteurTour').style.visibility='hidden';
31064} 
31065
31066
31067moteurPhaser.hideInfoJeu = function ()
31068{
31069 if (phaserShownCardsPli) {
31070 /*
31071 phaserShownCardsPli.groupDessusFondCartesAffichess.mask = mask;
31072 phaserShownCardsPli.maskContent = mask;*/
31073 groupCartesAffichess.remove(phaserShownCardsPli.maskContent);
31074 
31075 phaserShownCardsPli.groupDessusFondCartesAffichess.mask = null;
31076 
31077 phaserShownCardsPli.groupFondCartesAffichess.destroy();
31078 if (phaserShownCardsPli.maskContent)
31079 phaserShownCardsPli.maskContent.destroy();
31080 phaserShownCardsPli.phaserTxt.destroy();
31081 phaserShownCardsPli.phaserTxt2.destroy();
31082 phaserShownCardsPli.phaserFond.destroy();
31083 for (var i in phaserShownCardsPli.cardsList) {
31084 phaserShownCardsPli.cardsList[i].destroy();
31085 }
31086 phaserShownCardsPli = null;
31087 }
31088 return;
31089} 
31090
31091var lastIntitule = '';
31092var TOaffCART;
31093
31094var phaserShownCardsPli;
31095var phaserShownCardsInfo;
31096
31097moteurPhaser.afficheCartes = function (cartes,intitule)
31098{ 
31099 if (lastIntitule==intitule && intitule.indexOf('taient dans le chien') === -1) return;
31100 lastIntitule = intitule;
31101 
31102 playCardStarted = true;
31103 selMoteur.hideInfoJeu();
31104 var wwi = Math.min(800,getWorldW()*80/100);
31105
31106 groupCartesAffichess.x = getWorldW()/2;
31107 groupCartesAffichess.y = getWorldH()+100;
31108 
31109 var groupFondCartesAffichess = gamePhaser.add.group();
31110 groupCartesAffichess.add(groupFondCartesAffichess);
31111 
31112 var groupDessusFondCartesAffichess = gamePhaser.add.group();
31113 groupCartesAffichess.add(groupDessusFondCartesAffichess);
31114 
31115 var fondPlateau = gamePhaser.add.sprite(0,0 , 'ToproleNobody'); 
31116 fondPlateau.anchor.setTo(0.5,0);
31117 groupFondCartesAffichess.add(fondPlateau);
31118 if (techniqueLevelAnim<100)
31119 fondPlateau.alpha = 0;
31120 
31121 var textPlateau = gamePhaser.add.text(0,0, intitule, { fontSize: '24px', fill: '#222',font: fontNamePhaser });//, wordWrap: true, wordWrapWidth: wwi
31122 textPlateau.anchor.setTo(0.5,0);
31123 //textPlateau.mask = mask;
31124 textPlateau.alpha = 0;
31125 groupDessusFondCartesAffichess.add(textPlateau);
31126
31127
31128 var textPlateau2 = gamePhaser.add.text(0,0, intitule, { fontSize: '24px', fill: '#fff',font: fontNamePhaser });//, wordWrap: true, wordWrapWidth: wwi
31129 textPlateau2.anchor.setTo(0.5,0);
31130 //textPlateau.mask = mask;
31131 textPlateau2.alpha = 0;
31132 groupDessusFondCartesAffichess.add(textPlateau2);
31133
31134
31135 phaserShownCardsPli = {};
31136 phaserShownCardsPli.cardsList = [];
31137 phaserShownCardsPli.intitule = intitule;
31138 phaserShownCardsPli.phaserTxt = textPlateau;
31139 phaserShownCardsPli.phaserTxt2 = textPlateau2;
31140 phaserShownCardsPli.phaserFond = fondPlateau;
31141 //phaserShownCardsPli.maskContent = mask;
31142 phaserShownCardsPli.groupFondCartesAffichess = groupFondCartesAffichess;
31143 phaserShownCardsPli.groupDessusFondCartesAffichess = groupDessusFondCartesAffichess;
31144
31145 var cartesChien = jQuery.parseJSON(cartes); 
31146 for (i=0;i<cartesChien.length;i++)
31147 {
31148 var groupC = gamePhaser.add.group();
31149
31150 groupC.y = 40;
31151
31152 var spriteOmbre = gamePhaser.add.sprite(-4, -2 , 'CarteOmbre');
31153 spriteOmbre.scale.setTo(getCarteAffW()/spriteOmbre.width);
31154 groupC.add(spriteOmbre);
31155 
31156 var tmpphcard = gamePhaser.add.image(0 ,0 , cartesChien[i].split('.gif').join('.png') );//
31157 tmpphcard.scale.setTo(getCarteAffW()/tmpphcard.width);
31158 groupC.add(tmpphcard);
31159 
31160 phaserShownCardsPli.cardsList.push(groupC);
31161 groupDessusFondCartesAffichess.add(groupC);
31162 /*if (fondPlateau.height<textPlateau.height+tmpphcard.height) {
31163 fondPlateau.height = textPlateau.height+tmpphcard.height;
31164 }*/
31165 }
31166 
31167 selMoteur.clearActions(); 
31168 reorganiseCartes ('fromZomm');
31169 
31170 return; 
31171
31172} 
31173
31174
31175var messagePlateau = null;
31176
31177moteurPhaser.clearMessagePlateauJeu = function ()
31178{
31179 if (!messagePlateau) return;
31180 clearTimeout(mpcancellable);
31181 if (messagePlateau.scroller) {
31182 messagePlateau.scroller.stop();
31183 messagePlateau.scroller.destroy();
31184 messagePlateau.scroller.maskGraphics.destroy();
31185 }
31186 messagePlateau.textPlateau.destroy();
31187 messagePlateau.fondPlateau.destroy();
31188 messagePlateau = null;
31189}
31190moteurPhaser.introAction = function ()
31191{
31192 if (techniqueLevelAnim<100)
31193 selMoteur.addAction('OK','hideMessageIntro();','btn-success');
31194}
31195var mpcancellable;
31196moteurPhaser.showMessagePlateauJeu = function (txt,conserverCartes)
31197{
31198 var txtValue = htmlToPhaserText(txt);
31199 if (messagePlateau && txtValue=='') {
31200 moteurPhaser.clearMessagePlateauJeu();
31201 return;
31202 }
31203 if (conserverCartes!==true) {
31204 selMoteur.clearCards ();
31205 }
31206 if (messagePlateau) {
31207
31208 if (txtValue==messagePlateau.textPlateau.text)
31209 return;
31210 //llog('existing',messagePlateau);
31211 messagePlateau.textPlateau.setText(txtValue);
31212 messagePlateau.textPlateau.alpha = 0;
31213 reorganiseCartes ();
31214 return;
31215 }
31216 //llog('******** showMessagePlateauJeu');
31217 var wwi = Math.min(800,getWorldW()*50/100);
31218
31219
31220 var groupFond = gamePhaser.add.group();
31221 groupDesActions.add(groupFond);
31222 
31223 var fondPlateau = gamePhaser.add.graphics(getWorldW()/2,0);
31224 fondPlateau.beginFill(0xffffff);
31225 fondPlateau.drawRoundedRect(getWorldW()/2, getWorldH()/2, 100, 50,0);
31226 fondPlateau.anchor.setTo(0.5,0); 
31227 fondPlateau.alpha = 0;
31228 groupFond.add(fondPlateau);
31229
31230 
31231 var textPlateau = gamePhaser.add.text(0, 0, txtValue, { fontSize: getPlateauTxtSize()+'px', fill: '#333',font: fontNamePhaser, wordWrap: true, wordWrapWidth: wwi });
31232 textPlateau.anchor.setTo(0.5,0);
31233 textPlateau.align = 'center';
31234 textPlateau.alpha = 0;
31235 textPlateau.setTextBounds(0, 0,wwi , 300);
31236 groupDesActions.add(textPlateau);
31237
31238 messagePlateau = {
31239 textPlateau:textPlateau,
31240 fondPlateau:fondPlateau,
31241 groupFond:groupFond
31242 }
31243
31244 mpcancellable = setTimeout(function () {
31245 //llog('create scrollable',wwi, getMessageTexteHeight(phaserActionsHeight));
31246 var scroller = gamePhaser.add.existing(new ScrollableArea(0, 0, wwi, getMessageTexteHeight(phaserActionsHeight),{horizontalScroll :false } ));
31247 groupDesActions.add(scroller);
31248 scroller.addChild(textPlateau);
31249 for (var i in phaserActionBtns) {
31250 phaserActionBtns[i].y += getMessageTexteHeight(phaserActionsHeight)+4;
31251 }
31252 messagePlateau.scroller = scroller;
31253 scroller.start();
31254 reorganiseCartes ();
31255 },200);
31256
31257 reorganiseCartes ();
31258 return;
31259 
31260 
31261}
31262
31263
31264
31265
31266var delTOTO = 0;
31267var syncTimeDelay = 0;
31268var syncTimeTS = 0;
31269var syncTimeTotal = 0;
31270var syncTimeInterval = 0;
31271
31272function updatePhaserTimer() {
31273 if (!phaserTimerObject || !phaserTimerObject.phaserMaskTimer || syncTimeTS<=0) return;
31274
31275 var remainingTime = syncTimeDelay-(Date.now()-syncTimeTS)/1000;
31276 var percent = syncTimeTotal>0 ? remainingTime*100/syncTimeTotal : 0;
31277 percent = Math.max(0,Math.min(100,percent));
31278
31279 phaserTimerObject.phaserMaskTimer.x = percent/100*phaserTimerObject.phasertimerVide.width;
31280 phaserTimerObject.phaserMaskTimer2.x = percent/100*phaserTimerObject.phasertimerVide2.width;
31281}
31282
31283moteurPhaser.timeThatRemains = function (delay,totalTime,ignoreTurn)
31284{
31285 if (!phaserTimerObject.phasergroupTimer) return;
31286 //log('il reste '+delay+' secondes');
31287 if (delay==-1 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
31288 { 
31289 syncTimeDelay = 0;
31290 syncTimeTS = 0;
31291 syncTimeTotal = 0;
31292 clearInterval(syncTimeInterval);
31293
31294 phaserTimerObject.phasergroupTimer.visible = false;
31295
31296 }
31297 else
31298 { 
31299 var oldDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
31300 //llog('oldDelay',oldDelay);
31301 //llog('err',oldDelay-delay);
31302 syncTimeDelay = delay;
31303 syncTimeTS = (new Date().getTime());
31304 syncTimeTotal = totalTime;
31305 clearInterval(syncTimeInterval);
31306 syncTimeInterval = setInterval(function () { intervalTimeRemainingPhaser(ignoreTurn); },100);
31307 
31308 var newWidth = 0;
31309 if ( delay>2) newWidth = 10+delay*3;
31310
31311 phaserTimerObject.phasergroupTimer.visible = true;
31312
31313 updatePhaserTimer();
31314 }
31315}
31316var canPlayAlertSound = 0;
31317
31318function intervalTimeRemainingPhaser(ignoreTurn) {
31319 var newDelay = syncTimeDelay-((new Date().getTime()) - syncTimeTS)/1000;
31320 if (newDelay<0 || (lastTurnSel!=whoamiNum && !ignoreTurn) )// 
31321 { 
31322 syncTimeDelay = 0;
31323 syncTimeTS = 0;
31324 syncTimeTotal = 0;
31325 clearInterval(syncTimeInterval);
31326
31327 phaserTimerObject.phasergroupTimer.visible = false;
31328 return;
31329 }
31330 if (newDelay<3 && canPlayAlertSound==0) {
31331 if (gameSoundsEnabled) playSoundEffect ('Heartbeat3.mp3',true,0.9);
31332 else playSound ('Button.mp3?v=2');//playSound ('Bip.mp3');
31333 canPlayAlertSound = 1;
31334 } else if (newDelay>5 && canPlayAlertSound==1 ) {
31335 canPlayAlertSound = 0;
31336 }
31337}
31338
31339
31340function fitCollectionEmoticonPhaser(sprite,baseX) {
31341 if (!sprite || !sprite.width || !sprite.height) return;
31342 var ratio = Math.min(150/sprite.width,150/sprite.height);
31343 sprite.width = Math.max(1,Math.round(sprite.width*ratio));
31344 sprite.height = Math.max(1,Math.round(sprite.height*ratio));
31345 sprite.x = baseX+(150-sprite.width)/2;
31346}
31347
31348function prepareSelectedCollectionEmoticonsPhaser() {
31349 if (typeof gamePhaser==='undefined' || !gamePhaser || !gamePhaser.cache) return;
31350 var loader = null;
31351 for (var i=0;i<myCollectionEmots.length;i++) {
31352 var definition = collectionEmoticonsCatalogue[myCollectionEmots[i]];
31353 if (!definition || gamePhaser.cache.checkImageKey(definition.key)) continue;
31354 if (!loader) loader = new Phaser.Loader(gamePhaser);
31355 loader.image(definition.key,definition.image);
31356 }
31357 if (loader) loader.start();
31358}
31359
31360function createCollectionEmoticonPhaser(groupChat,x,y,definition) {
31361 if (gamePhaser.cache.checkImageKey(definition.key)) {
31362 var cachedSprite = groupChat.create(x,y,definition.key);
31363 fitCollectionEmoticonPhaser(cachedSprite,x);
31364 return cachedSprite;
31365 }
31366
31367 var sprite = groupChat.create(x,y,'Emoticon0');
31368 sprite.alpha = 0;
31369 sprite.width = 150;
31370 sprite.height = 150;
31371 var loader = new Phaser.Loader(gamePhaser);
31372 loader.image(definition.key,definition.image);
31373 loader.onFileComplete.addOnce(function (progress,cacheKey,success,totalLoaded,totalFiles) {
31374 if (!success || !sprite || !sprite.exists) return;
31375 sprite.loadTexture(cacheKey);
31376 sprite.alpha = 1;
31377 fitCollectionEmoticonPhaser(sprite,x);
31378 });
31379 loader.start();
31380 return sprite;
31381}
31382
31383var chatElts = [];
31384moteurPhaser.showMessageJoueur = function (numChat,texte) {
31385 if (window.disableEmoticons) return;
31386 var rand = Math.random();
31387 if (texte=="J'applaudis !") playSoundEffect ('Clap_Hands'+Math.floor(rand*5)+'.mp3',true,0.9);
31388 else if (texte=="C'est long...") playSoundEffect ('Yawn'+(2+Math.floor(rand*2))+'.mp3',true,0.9);
31389 else if (texte=="Je vous embrasse !") playSoundEffect ('Kiss '+Math.ceil(rand*3)+'.mp3',true,0.9);
31390 else if (texte=="Je pleure !") playSoundEffect ('Cry_1Cut.mp3',true,0.9);
31391 
31392
31393 var groupChat = gamePhaser.add.group();
31394 var groupOmbre = gamePhaser.add.group();
31395 groupChat.add(groupOmbre);
31396 var groupChatFather = gamePhaser.add.group();
31397 groupChatFather.add(groupChat);
31398 
31399 var chatTopH = 12;
31400 var distOmbrex = 6;
31401 var distOmbrey = 4;
31402 var ombreOpacity = 0.5;
31403
31404 var OMBREchatTop = groupOmbre.create(distOmbrex, distOmbrey , 'ChatTop3');
31404OMBREchatTop.alpha = ombreOpacity;
31405 var OMBREchatBot2 = groupOmbre.create(distOmbrex, 60+distOmbrey , 'ChatTop3');OMBREchatBot2.alpha = ombreOpacity;
31406 OMBREchatBot2.scale.setTo(1,-1);
31407 var OMBREchatTop2 = groupOmbre.create(distOmbrex, chatTopH+distOmbrey , 'ChatBot3');OMBREchatTop2.alpha = ombreOpacity;
31408 OMBREchatTop2.scale.setTo(1,-1);
31409 var OMBREchatMid = groupOmbre.create(distOmbrex, chatTopH+distOmbrey , 'ChatMid3');OMBREchatMid.alpha = ombreOpacity;
31410 var OMBREchatBot = groupOmbre.create(distOmbrex, distOmbrey , 'ChatBot3');OMBREchatBot.alpha = ombreOpacity;
31411 
31412 
31413 var chatTop = groupChat.create(0, 0 , 'ChatTop');
31414 var chatBot2 = groupChat.create(0, 60 , 'ChatTop');
31415 chatBot2.scale.setTo(1,-1);
31416 var chatTop2 = groupChat.create(0, chatTopH , 'ChatBot');
31417 chatTop2.scale.setTo(1,-1);
31418 var chatMid = groupChat.create(0, chatTopH , 'ChatMid');
31419 var chatBot = groupChat.create(0, 0 , 'ChatBot');
31420 
31421 
31422 var style = { font: fontNamePhaser, fontSize: '28px',fill: 'black', align: 'left', wordWrap: true, wordWrapWidth: 365 };
31423 var textBubble;
31424 var gameEmoticon = resolveGameEmoticon(texte);
31425 if (gameEmoticon) {
31426 OMBREchatMid.destroy();
31427 chatMid.destroy();
31428 OMBREchatTop.destroy();
31429 OMBREchatTop2.destroy();
31430 chatTop.destroy();
31431 chatTop2.destroy();
31432
31433 OMBREchatBot.destroy();
31434 OMBREchatBot2.destroy();
31435 chatBot.destroy();
31436 chatBot2.destroy();
31437 
31438 //if (window.disableEmoticons) return;
31439 var emoticonX = 24/4+OMBREchatBot.width/4-150/2;
31440 if (gameEmoticon.type==='collection')
31441 textBubble = createCollectionEmoticonPhaser(groupChat,emoticonX,chatTopH,gameEmoticon);
31442 else
31443 textBubble = groupChat.create(emoticonX,chatTopH,gameEmoticon.key);
31444 
31445 groupChat.x += 105;
31446 //textBubble.scale.setTo(1);
31447 }
31448 else
31449 textBubble = gamePhaser.add.text(24/2, chatTopH, texte , style,groupChat);
31450
31451 var bubMask = gamePhaser.add.graphics(24/2,chatTopH);
31452 groupChat.add(bubMask);
31453 
31454 bubMask.beginFill(0xffffff);
31455 bubMask.drawRect(0, 0, 365-12,textBubble.height);
31456 bubMask.anchor.setTo(0.2,0.2);
31457 textBubble.mask = bubMask;
31458 
31459
31460
31461 var hChat = textBubble.height;
31462 chatMid.height = hChat;
31463 chatBot.y = Math.floor(hChat+chatTopH);
31464 chatBot2.y = Math.floor(hChat+chatTopH+chatTopH);
31465 
31466 OMBREchatMid.height = hChat;
31467 OMBREchatBot.y = Math.floor(hChat+chatTopH+distOmbrey);
31468 OMBREchatBot2.y = Math.floor(hChat+chatTopH+chatTopH+distOmbrey);
31469 
31470 var scaleCh = 2/3;
31471 if (getWorldW()<800 || getWorldH()<600)
31472 scaleCh = 0.5;
31473 var hauteurCibleChat = gameEmoticon?150:100;
31474 scaleCh = hauteurCibleChat/groupChatFather.height*scaleCh;
31475 groupChatFather.scale.setTo( scaleCh );
31476 
31477 groupChatFather.x = Math.floor(Math.max(0,Math.round(groupEq[numChat].x+groupEq[numChat].width/2-(365+24*2)/2*scaleCh) ));
31478 if (groupChatFather.x>getWorldW()-(365+24*2)/2*scaleCh )
31479 groupChatFather.x=Math.floor(getWorldW()-(365+24*2)/2*scaleCh );
31480 chatElts.push(groupChatFather);
31481 if (groupEq[numChat].y>getWorldH()/2.1){
31482 groupChatFather.y = Math.floor(groupEq[numChat].y-5);//-groupEq[numChat].height-15;
31483 chatTop2.alpha = 0;
31484 gamePhaser.add.tween(chatBot2).to( { alpha: 1 }, 1000, "Quart.easeOut", true, 0);
31485 gamePhaser.add.tween(chatBot).to( { alpha: 0 }, 1000, "Quart.easeOut", true, 0);
31486 OMBREchatTop2.alpha = 0;
31487 gamePhaser.add.tween(OMBREchatBot2).to( { alpha: ombreOpacity }, 1000, "Quart.easeOut", true, 0);
31488 gamePhaser.add.tween(OMBREchatBot).to( { alpha: 0 }, 1000, "Quart.easeOut", true, 0);
31489 }
31490 else {
31491 groupChatFather.y = Math.floor(groupEq[numChat].y+groupEq[numChat].height+5);
31492 chatBot.alpha = 0;
31493 gamePhaser.add.tween(chatTop2).to( { alpha: 0 }, 1000, "Quart.easeOut", true, 0);
31494 gamePhaser.add.tween(chatTop).to( { alpha: 1 }, 1000, "Quart.easeOut", true, 0);
31495 OMBREchatBot.alpha = 0;
31496 gamePhaser.add.tween(OMBREchatTop2).to( { alpha: 0 }, 1000, "Quart.easeOut", true, 0);
31497 gamePhaser.add.tween(OMBREchatTop).to( { alpha: ombreOpacity }, 1000, "Quart.easeOut", true, 0);
31498 }
31499 
31500 
31501 var tw = gamePhaser.add.tween(groupChat);
31502 if (groupEq[numChat].y>getWorldH()/2.1)
31503 tw.to({ y:-50 }, 2000, Phaser.Easing.Cubic.Out, true, 0);
31504 else
31505 tw.to({ y:50 }, 2000, Phaser.Easing.Cubic.Out, true, 0);
31506
31507 var twbOmbre = gamePhaser.add.tween(groupOmbre).to( { alpha: 0 }, 300, "Quart.easeOut");
31508 tw.chain(twbOmbre);
31509 var twb = gamePhaser.add.tween(groupChat).to( { alpha: 0 }, 1000, "Quart.easeOut");
31510 twbOmbre.chain(twb);
31511
31512 playSoundEffect ('Female Voice - Psst '+Math.ceil(Math.random()*2)+'.mp3',true,0.5);
31513 
31514 twb.onComplete.add(function () {
31515 //llog('recreate fond rounded');
31516 groupChat.destroy();
31517 groupChatFather.destroy();
31518 chatTop.destroy();
31519 chatBot2.destroy();
31520 chatTop2.destroy();
31521 chatMid.destroy();
31522 chatBot.destroy();
31523 }, this);
31524 
31525}
31526
31527
31528
31529
31530
31531
31532function resizeChat() {
31533 return;
31534}
31535var isPhaserFondChatShown = false;
31536function showChatPhaserD () {
31537 if (isPhaserFondChatShown) return;
31538 isPhaserFondChatShown = true;
31539 phaserDecalChat = 0;
31540 reorganiseCartes();
31541}
31542moteurPhaser.hideChat = function () {
31543 if (!isPhaserFondChatShown) return;
31544 phaserDecalChat = 0;
31545 isPhaserFondChatShown = false;
31546 reorganiseCartes();
31547}
31548
31549moteurPhaser.hideCoulApp = function () {
31550 if (couleurAppeleePhaser) {
31551 equipiers_maskrond[couleurAppeleePhaser.appelCouleurI].visible = false; 
31552 couleurAppeleePhaser.couleurObj.destroy();
31553 couleurAppeleePhaser.appelObj.destroy();
31554 couleurAppeleePhaser = false;
31555 }
31556}
31557function showCRA() {
31558}
31559var couleurAppeleePhaser = false;
31560
31561moteurPhaser.showCoulApp = function (i,coulNum,txtTete) {
31562
31563 selMoteur.hideCoulApp();
31564 couleurAppeleePhaser = {};
31565 
31566 equipiers_maskrond[i].visible = true; 
31567
31568 couleurAppeleePhaser.couleurObj = groupEq[i].create(10+20, 180+11 , 'Couleur'+coulNum );
31569 couleurAppeleePhaser.couleurObj.scale.setTo(20/couleurAppeleePhaser.couleurObj.height);
31570 couleurAppeleePhaser.appelObj = groupEq[i].create(0, 180+11 , 'Appel'+txtTete );
31571 couleurAppeleePhaser.appelObj.scale.setTo(couleurAppeleePhaser.couleurObj.height/couleurAppeleePhaser.appelObj.height);
31572 couleurAppeleePhaser.appelObj.x = 20+10-couleurAppeleePhaser.appelObj.width;
31573 couleurAppeleePhaser.appelCouleurI = i;
31574 couleurAppeleePhaser.appelCouleurNum = coulNum;
31575 couleurAppeleePhaser.appelCouleurTxtTete = txtTete;
31576 
31577 //$('.appelRoi').html('');
31578 //$('#divJoueur'+i+' .appelRoi').html('<img src="/images/Couleurs/'+txtTete+'.png?v=3" class="coulPren iconeStatut"><img src="/images/Couleurs/'+coulNum+'.png" class="coulPren iconeStatut">');
31579 //showCRA();
31580 reorganiseCartes();
31581}
31582
31583
31584moteurPhaser.clearMasques = function () {
31585 var cnt = selMoteur.getCards();
31586 for (key in cnt) {
31587 if (cnt[key] && cnt[key].id!=null )
31588 {
31589 if (cnt[key].myMask)
31590 cnt[key].myMask.destroy();
31591 }
31592 }
31593}
31594
31595moteurPhaser.clearMasque = function (id) {
31596 var cnt = selMoteur.getCards();
31597 for (key in cnt) {
31598 if (cnt[key] && cnt[key].id!=null && cnt[key].id==id )
31599 {
31600 if (cnt[key].myMask)
31601 cnt[key].myMask.destroy();
31602 }
31603 }
31604}
31605var phaserCardsMasques = [];
31606moteurPhaser.addMasque = function (id,masque) {
31607 var cnt = selMoteur.getCards();
31608 selMoteur.clearMasque(id);
31609 for (key in cnt) {
31610 if (cnt[key] && cnt[key].id!=null && cnt[key].id==id )
31611 {
31612 var msk = gamePhaser.add.image(0,0, masque);
31613 cnt[key].add(msk);
31614 //llog('msk',getPlayedCardSize().w,msk.width);
31615 msk.scale.setTo(cnt[key].cardObj.width/msk.width);
31616 cnt[key].myMask = msk;
31617 phaserCardsMasques.push(msk);
31618 //cartePoigneeSelect(cnt[key]);
31619 return;
31620 }
31621 }
31622}
31623
31624
31625
31626moteurPhaser.setGameMainMsg = function (txt) {
31627 phaserMessagePpal.setText(htmlToPhaserText(txt).toUpperCase() );// = [];
31628 //alert(phaserMessagePpal.width);
31629 phaserMessagePpalChevronLeft.x = -phaserMessagePpal.width/2-phaserMessagePpalChevronLeft.width-4;
31630 phaserMessagePpalChevronRight.x = phaserMessagePpal.width/2+4;//+phaserMessagePpalChevronRight.width+2;
31631 reorganiseCartes();
31632}
31633
31634
31635function phaserAnimateToWidth (card,destW,ccW,opt,endf,subtotalLeft) {
31636 var newW = destW-ccW;
31637 var idDest = id.split('.').join('\\.');
31638 var margL = newW/2;
31639 var margR = newW/2;
31640 if (opt=='First') margL = -5;
31641 if (opt=='Last') margR = -5;
31642
31643 var tw = gamePhaser.add.tween(phaserCards[key]);
31644 tw.to({ x:posx }, phaserTweenDuration, phaserTweenType, true, 0);
31645
31646}
31647
31648/*! jQuery UI - v1.11.4 - 2018-11-17
31649* http://jqueryui.com
31650* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, resizable.js, button.js, dialog.js
31651* Copyright jQuery Foundation and other contributors; Licensed MIT */
31652
31653(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(e,s){var n,o,a,r=e.nodeName.toLowerCase();return"area"===r?(n=e.parentNode,o=n.name,e.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']")[0],!!a&&i(a)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!e.disabled:"a"===r?e.href||s:s)&&i(e)}function i(e){return t.expr.filters.visible(e)&&!t(e).parents().addBack().filter(function(){return"hidden"===t.css(this,"visibility")}).length}t.ui=t.ui||{},t.extend(t.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),t.fn.extend({scrollParent:function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id
vendor: 9,142 bytes, line 31653
31653)&&t(this).removeAttr("id")})}}),t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])},focusable:function(i){return e(i,!isNaN(t.attr(i,"tabindex")))},tabbable:function(i){var s=t.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&e(i,!n)}}),t("<a>").outerWidth(1).jquery||t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(t.fn.removeData=function(e){return function(i){return arguments.length?e.call(this,t.camelCase(i)):e.call(this)}}(t.fn.removeData)),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),t.fn.extend({focus:function(e){return function(i,s){return"number"==typeof i?this.each(function(){var e=this;setTimeout(function(){t(e).focus(),s&&s.call(e)},i)}):e.apply(this,arguments)}}(t.fn.focus),disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(e){if(void 0!==e)return this.css("zIndex",e);if(this.length)for(var i,s,n=t(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}};var s=0,n=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r,l={},h=e.split(".")[0];return e=e.split(".")[1],n=h+"-"+e,s||(s=i,i=t.Widget),t.expr[":"][n.toLowerCase()]=function(e){return!!t.data(e,n)},t[h]=t[h]||{},o=t[h][e],a=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new a(t,e)},t.extend(a,o,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),r=new i,r.options=t.widget.extend({},r.options),t.each(s,function(e,s){return t.isFunction(s)?(l[e]=function(){var t=function(){return i.prototype[e].apply(this,arguments)},n=function(t){return i.prototype[e].apply(this,t)};return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(l[e]=s,void 0)}),a.prototype=t.widget.extend(r,{widgetEventPrefix:o?r.widgetEventPrefix||e:e},l,{constructor:a,namespace:h,widgetName:e,widgetFullName:n}),o?(t.each(o._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,a,i._proto)}),delete o._childConstructors):i._childConstructors.push(a),t.widget.bridge(e,a),a},t.widget.extend=function(e){for(var i,s,o=n.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])s=o[a][i],o[a].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=n.call(arguments,1),l=this;return a?this.each(function(){var i,n=t.data(this,s);return"instance"===o?(l=n,!1):n?t.isFunction(n[o])&&"_"!==o.charAt(0)?(i=n[o].apply(n,r),i!==n&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,s);e?(e.option(o||{}),e._init&&e._init()):t.data(this,s,new i(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!e),e&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.delegate(c,h,r):i.bind(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(i).undelegate(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget;var o=!1;t(document).mouseup(function(){o=!1}
vendor: 11,919 bytes, line 31653
31653),t.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!o){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),o=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),o=!1,!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function e(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var n,o,a=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=t.extend({},n);var p,g,m,_,v,b,y=t(n.of),w=t.position.getWithinInfo(n.within),k=t.position.getScrollInfo(w),x=(n.collision||"flip").split(" "),C={};return b=s(y),y[0].preventDefault&&(n.at="left top"),g=b.width,m=b.height,_=b.offset,v=t.extend({},_),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=h.test(i[0])?i.concat(["center"]):c.test(i[0])?["center"].concat(i):["center","center"]),i[0]=h.test(i[0])?i[0]:"center",i[1]=c.test(i[1])?i[1]:"center",t=u.exec(i[0]),e=u.exec(i[1]),C[this]=[t?t[0]:0,e?e[0]:0],n[this]=[d.exec(i[0])[0],d.exec(i[1])[0]]}),1===x.length&&(x[1]=x[0]),"right"===n.at[0]?v.left+=g:"center"===n.at[0]&&(v.left+=g/2),"bottom"===n.at[1]?v.top+=m:"center"===n.at[1]&&(v.top+=m/2),p=e(C.at,g,m),v.left+=p[0],v.top+=p[1],this.each(function(){var s,h,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=u+f+i(this,"marginRight")+k.width,T=d+b+i(this,"marginBottom")+k.height,I=t.extend({},v),M=e(C.my,c.outerWidth(),c.outerHeight());"right"===n.my[0]?I.left-=u:"center"===n.my[0]&&(I.left-=u/2),"bottom"===n.my[1]?I.top-=d:"center"===n.my[1]&&(I.top-=d/2),I.left+=M[0],I.top+=M[1],o||(I.left=l(I.left),I.top=l(I.top)),s={marginLeft:f,marginTop:b},t.each(["left","top"],function(e,i){t.ui.position[x[e]]&&t.ui.position[x[e]][i](I,{targetWidth:g,targetHeight:m,elemWidth:u,elemHeight:d,collisionPosition:s,collisionWidth:D,collisionHeight:T,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:w,elem:c})}),n.using&&(h=function(t){var e=_.left-I.left,i=e+g-u,s=_.top-I.top,o=s+m-d,l={target:{element:y,left:_.left,top:_.top,width:g,height:m},element:{element:c,left:I.left,top:I.top,width:u,height:d},horizontal:0>i?"left":e>0?"right":"center",vertical:0>o?"top":s>0?"bottom":"middle"};u>g&&g>r(e+i)&&(l.horizontal="center"),d>m&&m>r(s+o)&&(l.vertical="middle"),l.important=a(r(e),r(i))>a(r(s),r(o))?"horizontal":"vertical",n.using.call(this,t,l)}),c.offset(t.extend(I,{using:h}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-o-n;e.collisionWidth>o?l>0&&0>=h?(i=t.left+l+e.collisionWidth-o-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+o-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-o-n;e.collisionHeight>o?l>0&&0>=h?(i=t.top+l+e.collisionHeight-o-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+o-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-a-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-a-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,r=document.getElementsByTagName("body")[0],l=document.createElement("div");e=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(l),i=r||document.documentElement,i.insertBefore(e,i.firstChild),l.style.cssText="position: absolute; left: 10.7432222px;",n=t(l).offset().left,o=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()}(),t.ui.position,t.widget("ui.draggable",t.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this._blurActiveElement(e),this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=this.document[0];if(this.handleElement.is(e.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&t(i.activeElement).blur()}catch(s){}},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._normalizeRightBottom(),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left
vendor: 12,396 bytes, lines 31653-31654
31653:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.focus(),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(l=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(h=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n
31654})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t
vendor: 39,832 bytes, lines 31654-31655
31654(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,l,h,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.resizable",t.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseInt(t,10)||0},_isNumber:function(t){return!isNaN(parseInt(t,10))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i,s,n,o,a=this,r=this.options;if(this.element.addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),e=this.handles.split(","),this.handles={},i=0;e.length>i;i++)s=t.trim(e[i]),o="ui-resizable-"+s,n=t("<div class='ui-resizable-handle "+o+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),t(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(t(this).removeClass("ui-resizable-autohide"),a._handles.show())}).mouseleave(function(){r.disabled||a.resizing||(t(this).addClass("ui-resizable-autohide"),a._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),a.addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,l=this._change[o];return this._updatePrevProperties(),l?(i=l.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,l,h=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null,l=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null,h.animate||this.element.css(t.extend(a,{top:l,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!h.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,h=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&c&&(t.top=l-e.minHeight),n&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseInt(s[e],10)||0,i[e]+=parseInt(n[e],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,l={width:i.size.width-r,height:i.size.height-a},h=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,c=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&h?{top:c,left:h}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,l=t(this).resizable("instance"),h=l.options,c=l.element,u=h.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(l.containerElement=t(d),/document/.test(u)||u===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=l._num(e.css("padding"+s))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=l.containerOffset,n=l.containerSize.height,o=l.containerSize.width,a=l._hasScroll(d,"left")?d.scrollWidth:o,r=l._hasScroll(d)?d.scrollHeight:n,l.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,l=a.containerOffset,h=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=l),h.left<(a._helper?l.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-l.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?l.left:0),h.top<(a._helper?l.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-l.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?l.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-l.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-l.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),l=a.outerWidth()-e.sizeDiff.width,h=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseInt(e.width(),10),height:parseInt(e.height(),10),left:parseInt(e.css("left"),10),top:parseInt(e.css("top"),10)})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.options,s=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,l="number"==typeof s.grid?[s.grid,s.grid]:s.grid,h=l[0]||1,c=l[1]||1,u=Math.round((n.width-o.width)/h)*h,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=l,_&&(p+=h),v&&(f+=c),g&&(p-=h),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-h)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-h>0?(i.size.width=p,i.position.left=a.left-u):(p=h-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable;var a,r="ui-button ui-widget ui-state-default ui-corner-all",l="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",h=function(){var e=t(this);setTimeout(function(){e.find(":ui-button").button("refresh")},1)},c=function(e){var i=e.name,s=e.form,n=t([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?t(s).find("[name='"+i+"'][type=radio]"):t("[name='"+i+"'][type=radio]",e.ownerDocument).filter(function(){return!this.form})),n};t.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,h),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var e=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(r).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===a&&t(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||t(this).removeClass(n)}).bind("click"+this.eventNamespace,function(t){i.disabled&&(t.preventDefault(),t.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){e.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;t(this).addClass("ui-state-active"),e.buttonElement.attr("aria-pressed","true");var s=e.element[0];c(s).not(s).map(function(){return t(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(t(this).addClass("ui-state-active"),a=this,e.document.one("mouseup",function(){a=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(t(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(e){return i.disabled?!1:((e.keyCode===t.ui.keyCode.SPACE||e.keyCode===t.ui.keyCode.ENTER)&&t(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){t(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===t.ui.keyCode.SPACE&&t(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var t,e,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(t=this.element.parents().last(),e="label[for='"+this.element.attr("id")+"']",this.buttonElement=t.find(e),this.buttonElement.length||(t=t.length?t.siblings():this.element.siblings(),this.buttonElement=t.filter(e),this.buttonElement.length||(this.buttonElement=t.find(e))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(r+" ui-state-active "+l).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(t,e){return this._super(t,e),"disabled"===t?(this.widget().toggleClass("ui-state-disabled",!!e),this.element.prop("disabled",!!e),e&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var e=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");e!==this.options.disabled&&this._setOption("disabled",e),"radio"===this.type?c(this.element[0]).each(function(){t(this).is(":checked")?t(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):t(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var e=this.buttonElement.removeClass(l),i=t("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(e.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,o=[];s.primary||s.secondary?(this.options.text&&o.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&e.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&e.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(o.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||e.attr("title",t.trim(i)))):o.push("ui-button-text-only"),e.addClass(o.join(" "))}}),t.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(t,e){"disabled"===t&&this.buttons.button("option",t,e),this._super(t,e)},refresh:function(){var e="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(e?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(e?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),t.ui.button,t.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()
31655},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",e)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&t(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",e)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).focus()},_keepFocus:function(e){function i(){var e=this.document[0].activeElement,i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.focus()}),e.preventDefault()):(this._delay(function(){s.focus()}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(e),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title||t.html("&#160;"),t.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(e.element[0],arguments)},o={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,t("<button></button>",s).button(o).appendTo(e.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){t(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},t(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){t(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),l=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(l>=0?"+":"")+l,of:i.window},t(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(t,e){var i,s,n=this.uiDialog;"dialogClass"===t&&n.removeClass(this.options.dialogClass).addClass(e),"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:""+e}),"draggable"===t&&(i=n.is(":data(ui-draggable)"),i&&!e&&n.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&(s=n.is(":data(ui-resizable)"),s&&!e&&n.resizable("destroy"),s&&"string"==typeof e&&n.resizable("option","handles",e),s||e===!1||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):this.document.unbind("focus
31655in").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}})});
31656/*!
31657 * Bootstrap v3.3.4 (http://getbootstrap.com)
31658 * Copyright 2011-2015 Twitter, Inc.
31659 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
31660 */
31661if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("key
31661down.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);
31661var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".
31661navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("key
31661down.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=
vendor: 9,685 bytes, lines 31661-31662
31661parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
31662var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;
31662e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
31663/* One player card; the strip and header panel remember their own open state. */
31664(function () {
31665 'use strict';
31666 var scheduled = false;
31667 var observedGeometry = '';
31668 function syncCompactSpace(space) {
31669 var button = space.querySelector('.homePlayerExpandButton');
31670 if (!button) return;
31671 var compact = window.matchMedia('(max-width: 991px)').matches;
31672 var headerPanel = space.classList.contains('is-header-panel');
31673 var expanded = compact ? space.classList.contains('is-expanded') :
31674  (!headerPanel || space.classList.contains('is-header-expanded'));
31675 button.hidden = headerPanel && !space.querySelector('.homePlayerProgress .homePlayerSection');
31676 button.setAttribute('aria-controls', headerPanel ? 'homePlayerProgress' : 'homePlayerDetails');
31677 var label = expanded ? 'R\u00e9duire l\'espace joueur' : 'Agrandir l\'espace joueur';
31678 button.setAttribute('aria-expanded', expanded ? 'true' : 'false');
31679 button.setAttribute('aria-label', label);
31680 button.setAttribute('title', label);
31681 // Measure the actual balance widths, including unusually large amounts.
31682 space.classList.toggle('has-quick-balances', compact && !expanded);
31683 if (compact && !expanded) {
31684  var name = space.querySelector('#homePlayerName');
31685  var header = space.querySelector('.homePlayerCardHeader');
31686  var nameText = name.querySelector('a') || name;
31687  var nameWidth = Math.min(160, Math.max(96, nameText.scrollWidth));
31688  if (name.clientWidth < nameWidth || header.scrollWidth > header.clientWidth) {
31689  space.classList.remove('has-quick-balances');
31690  }
31691 }
31692 }
31693 function layoutPlayerSpace() {
31694 scheduled = false;
31695 var space = document.getElementById('playerSpace');
31696 var main = document.querySelector('.contMain');
31697 if (!space || !main) return;
31698 var brand = space.parentNode;
31699 brand.classList.toggle('has-header-ad', !!brand.querySelector('#topAds'));
31700 var edge = Math.ceil(main.getBoundingClientRect().right);
31701 var viewport = document.documentElement.clientWidth;
31702 var canDock = viewport - edge >= 364 && !space.querySelector('.homePlayerCard--guest');
31703 space.style.setProperty('--player-space-left', (edge + 24) + 'px');
31704 // Measure the complete card before deciding whether it fits in the rail.
31705 space.classList.remove('is-header-panel');
31706 space.classList.toggle('is-docked', !!canDock);
31707 if (canDock && space.getBoundingClientRect().height > window.innerHeight - 48) {
31708  space.classList.remove('is-docked');
31709 }
31710 var docked = space.classList.contains('is-docked');
31711 brand.classList.toggle('has-docked-player', docked);
31712 space.classList.toggle('is-header-panel', viewport >= 992 && !docked &&
31713  brand.classList.contains('has-header-ad') && !!space.querySelector('.homePlayerCard--member'));
31714 syncCompactSpace(space);
31715 }
31716 function scheduleLayout() {
31717 if (scheduled) return;
31718 scheduled = true;
31719 (window.requestAnimationFrame || function (fn) { return window.setTimeout(fn, 16); })(layoutPlayerSpace);
31720 }
31721 window.layoutPlayerSpace = scheduleLayout;
31722 window.openPlayerSpaceInfo = function (link, event) {
31723 if (event && (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || event.button > 0)) return true;
31724 if (typeof window.seeUtilisateur !== 'function') return true;
31725 window.seeUtilisateur(link.getAttribute('data-player-pseudo'), 'part=infosJoueur');
31726 return false;
31727 };
31728 function init() {
31729 var space = document.getElementById('playerSpace');
31730 var main = document.querySelector('.contMain');
31731 if (!space || !main) return;
31732 scheduleLayout();
31733 space.addEventListener('click', function (event) {
31734  var button = space.querySelector('.homePlayerExpandButton');
31735  if (!button || !button.contains(event.target)) return;
31736  space.classList.toggle(space.classList.contains('is-header-panel') ? 'is-header-expanded' : 'is-expanded');
31737  layoutPlayerSpace();
31738 });
31739 space.addEventListener('keydown', function (event) {
31740  if (event.key !== 'Escape' || !space.classList.contains('is-header-panel') ||
31741  !space.classList.contains('is-header-expanded')) return;
31742  space.classList.remove('is-header-expanded');
31743  layoutPlayerSpace();
31744  space.querySelector('.homePlayerExpandButton').focus();
31745  event.preventDefault();
31746 });
31747 window.addEventListener('resize', scheduleLayout);
31748 window.addEventListener('load', scheduleLayout);
31749 space.addEventListener('load', scheduleLayout, true);
31750 if (window.MutationObserver) {
31751  new MutationObserver(scheduleLayout).observe(space, { childList: true, subtree: true, characterData: true });
31752 }
31753 if (window.ResizeObserver) {
31754  new ResizeObserver(function () {
31755  var rect = main.getBoundingClientRect();
31756  var geometry = rect.width + '|' + rect.right + '|' + document.documentElement.clientWidth;
31757  if (geometry !== observedGeometry) { observedGeometry = geometry; scheduleLayout(); }
31758  }).observe(main);
31759 }
31760 if (document.fonts && document.fonts.ready) document.fonts.ready.then(scheduleLayout);
31761 }
31762 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
31763 else init();
31764})();
31765
31766
31767if (window.impJSloaded) {window.impJSloaded();}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.