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 "'+titreDoublon+'" ?',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 "'+titreCat+'" ?',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 "'+titreCat+'" ?',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 "'+titreCat+'" ?',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 "'+titreCat+'" ?',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é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é est indisponible.'); 4415 return false; 4416 } 4417 var dialogId = showBigDialog('Envoyer un message privé',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é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é</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é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és, partie concernée et raison de cette sanction"></textarea>'; 4498 resHTML += '<p class="moderationTransmitForm__aide" id="moderationTransmissionAide'+numero+'">Ces pré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 à 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é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 à appliquer</label>'; 4634 html += '<select class="form-control" id="moderationRapportAutreSanction'+numero+'">'+options+'</select><br>'; 4635 html += '<label for="moderationRapportAutreMotif'+numero+'">Motif de la dé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érateur</label>'; 4653 html += '<textarea class="form-control" rows="5" id="moderationRapportRefusMessage'+numero+'" placeholder="Expliquez pourquoi la recommandation est refusé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é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é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é 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('+');//.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> </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> </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> </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,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); 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éparées</span>'); 6074 if (motif.blocageChatObligatoire) 6075 resumeActifs.push('<span>Messages masqués</span>'); 6076 if (motif.masquageProfil) 6077 resumeActifs.push('<span>Profil masqué</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 également être sanctionnés et privés de toute fonctionnalité 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é.</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é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étail des effets du blocage">'; 6101 effets += '<div class="blocagePopup__effet"><span>Duré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 être placés ensemble':'Vous pourrez encore être placés ensemble')+'</strong></div>'; 6104 effets += '<div class="blocagePopup__effet"><span>Messages</span><strong>'+(motif.blocageChatObligatoire?'Masqués automatiquement':(motif.blocageChatFacultatif?'Masquage facultatif':'Non masqués'))+'</strong></div>'; 6105 effets += '<div class="blocagePopup__effet"><span>Profil</span><strong>'+(motif.masquageProfil?'Avatar et biographie masqué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>"'+listeNoireEchapperHTML(pseudo)+'"</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é envoyé') { 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é individuellement par une intelligence artificielle fournie par un prestataire externe. Si aucun comportement sanctionnable n'est détecté, il sera clos sans sanction. Dans le cas contraire, le serveur calculera la mesure prévue par le barème et un modé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 = '©ToMode=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 = '©ToMode=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)+'¬e='+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é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é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ème de connexion WebSocket</strong><br>La connexion au serveur de notifications n\'a pas pu être é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éfi du jour ?<br><small>Si vous annulez, la partie sera conservé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éfi Premium ?<br><small>Si vous confirmez, vous ne pourrez plus rejouer ce défi et un nouveau défi vous sera proposé.<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éfi Premium ?<br><small>Vous ne pourrez plus le rejouer et vous accéderez au récapitulatif, où la solution pourra être consulté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éfi classique ?<br><small>Cette participation comptera pour <b>0 % au classement</b> et vous ne pourrez plus rejouer ce défi.<br>Le défi coûte <b>1 crédit</b>, y compris en cas d’abandon. Si ce crédit a déjà été débité, il ne sera pas prélevé une seconde fois.<br>Annuler permet de continuer la partie. Fermer la fenêtre conserve le dé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ès à la boutique est réservé 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é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éfi comptera une tentative de pénalité. Trois changements au maximum sont autorisés avant de devoir jouer. Voulez-vous vraiment changer de dé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'émoticô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 émoticô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('+').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('+').join('%2B'), alertRes); 15191 return false; 15192} 15193function sendFormWork(formName) 15194{ 15195 ajax('/workers/forms/'+formName+'.php', getFormString($$(formName),true).split('+').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('+').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ûte 5 crédits compé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')+'®ister[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’âge pour accéder à la page Jouer.</p><p class="text-center"><button type="button" class="btn btn-success" onclick="startGame();">Préciser mon â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ôles pour chaque manche.' : 15930 'Les distributions et les rôles seront tirés alé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éfi contre l\'ordinateur à 3'; 16209 else if (modeJeu=='Entrainement5') nomJeu = 'Défi contre l\'ordinateur à 5'; 16210 else if (modeJeu=='Entrainement6') nomJeu = 'Défi contre l\'ordinateur à 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é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ération terminée.':'L\'opération a échoué.'),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é. Rechargez-la avant de ré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ège-toi :</strong> accepter cette demande permettra à cette personne de t'envoyer des messages privés.<br>Si tu ne connais pas cette personne ou si tu as le moindre doute, refuse la demande.<br>Tu peux désactiver toutes les demandes d'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é 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é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é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 ♥ 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 ♣ 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 ♦ 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 ♠ 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, '&') 17796 .replace(/"/g, '"') 17797 .replace(/</g, '<') 17798 .replace(/>/g, '>'); 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("http://js.nicedit.com/nicEditIcons-latest.gif"); 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("http://js.nicedit.com/nicEditIcons-latest.gif"); 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("http://js.nicedit.com/nicEditIcons-latest.gif"); 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("/images/Couleurs/Table.png"); 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("/images/Couleurs/HTML1.png"); 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("/images/Couleurs/HTML2.png"); 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("/images/Couleurs/HTML3.png"); 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("/images/Couleurs/HTML4.png"); 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®ion=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…</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">✦</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 être chargé. Vérifiez votre connexion ou reconnectez-vous.</p><button type="button" class="btn" data-adresse-retry>Ré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">♠</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">♠</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 {'&':'&','<':'<','>':'>','"':'"',"'":'''}[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">♠</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">♥</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?'✓':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">✦</span>'+present()+'<span class="cadeauxSpark cadeauxSparkTwo" aria-hidden="true">✦</span>':picture(g.instantane || {}))+'</div>'+ 19288 '<div class="cadeauxCardCopy"><span class="cadeauxBadge">'+(unopened?'✦ ':'')+'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">♥</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">✦</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">✦</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">♥</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">✉</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?'✓':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">✦</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">✦</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">✦</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 {'&':'&','<':'<','>':'>','"':'"',"'":'''}[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 || '')+'&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°'+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é</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é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é. Rechargez-la avant de ré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">✓</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é" title="Ouvrir le lien associé">
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">×</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">×</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">›</span>' + 21594 '</button>' + 21595 '<a class="siteNotificationGroup__open" href="' + this.escapeHtml(this.categoryUrl(categoryCode)) + '" aria-label="Ouvrir cette catégorie dans la page Notifications" title="Ouvrir cette caté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">×</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…'; 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">✓</span> Accepter'; 21651 if (typeof window.alerte==='function') window.alerte(response.message || 'Cette demande ne peut pas être accepté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éjà traitée':'Ami ajouté'; 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é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é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 être effectuée. Veuillez ré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 été supprimées. Vos favoris ont été conservés.' : 21882 'Toutes les notifications non favorites de la catégorie « ' + categoryLabel + ' » ont été supprimées. Vos favoris ont été conservés.'; 21883 } 21884 notificationFilter(category,activeFilter); 21885 },category); 21886 }; 21887 var message = category==='' ? 21888 'Effacer toutes vos notifications non favorites, toutes catégories confondues ? Les notifications favorites seront conservées et resteront supprimables manuellement. Cette action est irréversible.' : 21889 'Effacer toutes les notifications non favorites de la catégorie « ' + categoryLabel + ' » ? Les notifications favorites et les autres catégories seront conservées. Cette action est irré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…'; 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 être acceptée.'; 21914 return; 21915 } 21916 button.className += ' is-complete'; 21917 button.innerHTML = response.code==='deja_traitee'?'Déjà traitée':'Ami ajouté'; 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é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é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\'être publié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ête à être consultée.', 21952 category:'competitions', 21953 categoryLabel:'Compé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é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®ion=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+"®ister[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> </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ègles de ce mode de jeu" onclick="ouvrirReglesModeJeu(this.getAttribute("data-mode-jeu"));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute("data-mode-jeu"));" title="Rè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 = ' '; 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 + "% "); 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ètre arrêté"><div aria-hidden="true"> </div></div>'; 25721 equipeHTML += '<span id="tempsRestantTexte" class="sr-only" role="timer" aria-live="off" aria-hidden="true">Chronomètre arrêté</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 émoticônes" aria-controls="chtput" title="Émoticô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 à 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ègles de ce mode de jeu" onclick="ouvrirReglesModeJeu(this.getAttribute("data-mode-jeu"));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute("data-mode-jeu"));" title="Rè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é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 = ' '; 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 + "% "); 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("data-mode-jeu"));" onkeydown="return ouvrirReglesModeJeuClavier(event,this.getAttribute("data-mode-jeu"));" role="button" tabindex="0" id="IMGMJB" data-mode-jeu="'+modeJeu+'" aria-label="Afficher les règles de ce mode de jeu" title="Rè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('<').join('<').split('>').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('<').join('<').split('>').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('<').join('<').split('>').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(" "),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.