From 5799e5ccce80d909722e2da5ec8aa15877b9c3c0 Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Thu, 15 Dec 2016 14:21:45 +0000 Subject: [PATCH 1/5] refs #11023 better piwik.js json compatibility --- js/piwik.js | 34 ++++++++++++++++-------------- js/piwik.min.js | 56 ++++++++++++++++++++++++------------------------- piwik.js | 56 ++++++++++++++++++++++++------------------------- 3 files changed, 74 insertions(+), 72 deletions(-) diff --git a/js/piwik.js b/js/piwik.js index c0883c82ab7..15daccfe4d2 100644 --- a/js/piwik.js +++ b/js/piwik.js @@ -26,10 +26,10 @@ * - Opera 7 */ -/*global JSON2:true */ +/*global JSON_PIWIK:true */ -if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON.stringify && window.JSON.parse) { - JSON2 = window.JSON; +if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window.JSON.stringify && window.JSON.parse) { + JSON_PIWIK = window.JSON; } else { (function () { // we make sure to not break any site that uses JSON3 as well as we do not know if they run it in conflict mode @@ -945,14 +945,14 @@ if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON. * end JSON ************************************************************/ - JSON2 = exports; + JSON_PIWIK = exports; })(); } /* startjslint */ /*jslint browser:true, plusplus:true, vars:true, nomen:true, evil:true, regexp: false, bitwise: true, white: true */ -/*global JSON2 */ +/*global JSON_PIWIK */ /*global window */ /*global unescape */ /*global ActiveXObject */ @@ -3613,7 +3613,7 @@ if (typeof window.Piwik !== 'object') { cookie = getCookie(cookieName); if (cookie.length) { - cookie = JSON2.parse(cookie); + cookie = JSON_PIWIK.parse(cookie); if (isObject(cookie)) { return cookie; @@ -3641,7 +3641,7 @@ if (typeof window.Piwik !== 'object') { return hash( (navigatorAlias.userAgent || '') + (navigatorAlias.platform || '') + - JSON2.stringify(browserFeatures) + + JSON_PIWIK.stringify(browserFeatures) + (new Date()).getTime() + Math.random() ).slice(0, 16); @@ -3792,7 +3792,7 @@ if (typeof window.Piwik !== 'object') { if (cookie.length) { try { - cookie = JSON2.parse(cookie); + cookie = JSON_PIWIK.parse(cookie); if (isObject(cookie)) { return cookie; } @@ -4014,7 +4014,7 @@ if (typeof window.Piwik !== 'object') { purify(referralUrl.slice(0, referralUrlMaxLength)) ]; - setCookie(cookieReferrerName, JSON2.stringify(attributionCookie), configReferralCookieTimeout, configCookiePath, configCookieDomain); + setCookie(cookieReferrerName, JSON_PIWIK.stringify(attributionCookie), configReferralCookieTimeout, configCookiePath, configCookieDomain); } } @@ -4074,14 +4074,14 @@ if (typeof window.Piwik !== 'object') { // custom data if (customData) { - request += '&data=' + encodeWrapper(JSON2.stringify(customData)); + request += '&data=' + encodeWrapper(JSON_PIWIK.stringify(customData)); } else if (configCustomData) { - request += '&data=' + encodeWrapper(JSON2.stringify(configCustomData)); + request += '&data=' + encodeWrapper(JSON_PIWIK.stringify(configCustomData)); } // Custom Variables, scope "page" function appendCustomVariablesToRequest(customVariables, parameterName) { - var customVariablesStringified = JSON2.stringify(customVariables); + var customVariablesStringified = JSON_PIWIK.stringify(customVariables); if (customVariablesStringified.length > 2) { return '&' + parameterName + '=' + encodeWrapper(customVariablesStringified); } @@ -4108,7 +4108,7 @@ if (typeof window.Piwik !== 'object') { } if (configStoreCustomVariablesInCookie) { - setCookie(cookieCustomVariablesName, JSON2.stringify(customVariables), configSessionCookieTimeout, configCookiePath, configCookieDomain); + setCookie(cookieCustomVariablesName, JSON_PIWIK.stringify(customVariables), configSessionCookieTimeout, configCookiePath, configCookieDomain); } } @@ -4221,7 +4221,7 @@ if (typeof window.Piwik !== 'object') { items.push(ecommerceItems[sku]); } } - request += '&ec_items=' + encodeWrapper(JSON2.stringify(items)); + request += '&ec_items=' + encodeWrapper(JSON_PIWIK.stringify(items)); } request = getRequest(request, configCustomData, 'ecommerce', lastEcommerceOrderTs); sendRequest(request, configTrackerPause); @@ -5301,7 +5301,7 @@ if (typeof window.Piwik !== 'object') { * To access specific data point, you should use the other functions getAttributionReferrer* and getAttributionCampaign* * * @return array Attribution array, Example use: - * 1) Call JSON2.stringify(piwikTracker.getAttributionInfo()) + * 1) Call JSON_PIWIK.stringify(piwikTracker.getAttributionInfo()) * 2) Pass this json encoded string to the Tracking API (php or java client): setAttributionInfo() */ this.getAttributionInfo = function () { @@ -6455,7 +6455,7 @@ if (typeof window.Piwik !== 'object') { if (!isDefined(category) || !category.length) { category = ""; } else if (category instanceof Array) { - category = JSON2.stringify(category); + category = JSON_PIWIK.stringify(category); } customVariablesPage[5] = ['_pkc', category]; @@ -6638,6 +6638,8 @@ if (typeof window.Piwik !== 'object') { Piwik = { initialized: false, + JSON: JSON_PIWIK, + /** * DOM Document related methods */ diff --git a/js/piwik.min.js b/js/piwik.min.js index e7568f50ecb..71115678704 100644 --- a/js/piwik.min.js +++ b/js/piwik.min.js @@ -8,7 +8,7 @@ * @license http://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt) * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause */ -if(typeof JSON2!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON2=window.JSON}else{(function(){var a={}; +if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={}; /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON; if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"' @@ -18,7 +18,7 @@ var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00" }else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah0){for(ad="",af>10&&(af=10); ad.length=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++; return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y(); -if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON2=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var n,a={},t={},A=document,f=navigator,R=screen,N=window,g=N.performance||N.mozPerformance||N.msPerformance||N.webkitPerformance,p=N.encodeURIComponent,M=N.decodeURIComponent,i=unescape,C=[],z,d,Y=[]; +if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON_PIWIK=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var n,a={},t={},A=document,f=navigator,R=screen,N=window,g=N.performance||N.mozPerformance||N.msPerformance||N.webkitPerformance,p=N.encodeURIComponent,M=N.decodeURIComponent,i=unescape,C=[],z,d,Y=[]; function l(af){try{return M(af)}catch(ag){return unescape(af)}}function D(ag){var af=typeof ag;return af!=="undefined"}function v(af){return typeof af==="function"}function Q(af){return typeof af==="object"}function s(af){return typeof af==="string"||af instanceof String}function w(ag){if(!ag){return true}var af;var ah=true;for(af in ag){if(Object.prototype.hasOwnProperty.call(ag,af)){ah=false}}return ah}function ab(af){if(console!==undefined&&console&&console.error){console.error(af)}}function X(){var ak,aj,am,ag,af;for(ak=0;ak0;if(ai){al=am.split("::");ah=al[0];am=al[1];if("object"===typeof d[ah]&&"function"===typeof d[ah][am]){d[ah][am].apply(d[ah],ag)}else{if(af){Y.push(af)}}}else{for(aj=0;aj0;if(an){al=am.split(".");if(ah&&"object"===typeof ah[al[0]]){ah=ah[al[0]]; am=al[1]}else{if(af){Y.push(af);break}}}if(ah[am]){ah[am].apply(ah,ag)}else{var ao="The method '"+am+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: http://developer.piwik.org/api-reference/tracking-javascript';ab(ao);if(!an){throw new TypeError(ao)}}if(am==="addTracker"){break}if(am==="setTrackerUrl"||am==="setSiteId"){break}}else{am.apply(C[aj],ag)}}}}}function ae(ai,ah,ag,af){if(ai.addEventListener){ai.addEventListener(ah,ag,af);return true}if(ai.attachEvent){return ai.attachEvent("on"+ah,ag)}ai["on"+ah]=ag}function j(af){if(A.readyState==="complete"){af()}else{if(N.addEventListener){N.addEventListener("load",af)}else{if(N.attachEvent){N.attachEvent("onload",af)}}}}function m(ai){var af=false;if(A.attachEvent){af=A.readyState==="complete"}else{af=A.readyState!=="loading"}if(af){ai();return}var ah;if(A.addEventListener){ae(A,"DOMContentLoaded",function ag(){A.removeEventListener("DOMContentLoaded",ag,false);if(!af){af=true;ai()}})}else{if(A.attachEvent){A.attachEvent("onreadystatechange",function ag(){if(A.readyState==="complete"){A.detachEvent("onreadystatechange",ag); if(!af){af=true;ai()}}});if(A.documentElement.doScroll&&N===N.top){(function ag(){if(!af){try{A.documentElement.doScroll("left")}catch(aj){setTimeout(ag,0);return}af=true;ai()}}())}}}ae(N,"load",function(){if(!af){af=true;ai()}},false)}function U(ag,ak){var af="",ai,ah,aj;for(ai in a){if(Object.prototype.hasOwnProperty.call(a,ai)){ah=a[ai][ag];if(v(ah)){aj=ah(ak);if(aj){af+=aj}}}}return af}function Z(){var af;U("unload");if(n){do{af=new Date()}while(af.getTimeAlias()=0){cH=cH.slice(0,cG)}cG=cH.lastIndexOf("/");if(cG!==cH.length-1){cH=cH.slice(0,cG+1)}return cH+cF}function cb(cH,cF){var cG;cH=String(cH).toLowerCase();cF=String(cF).toLowerCase();if(cH===cF){return true}if(cF.slice(0,1)==="."){if(cH===cF.slice(1)){return true}cG=cH.length-cF.length;if((cG>0)&&(cH.slice(cG)===cF)){return true}}return false}function bT(cF){var cG=document.createElement("a");if(cF.indexOf("//")!==0&&cF.indexOf("http")!==0){if(cF.indexOf("*")===0){cF=cF.substr(1) }if(cF.indexOf(".")===0){cF=cF.substr(1)}cF="http://"+cF}cG.href=r.toAbsoluteUrl(cF);if(cG.pathname){return cG.pathname}return""}function aM(cG,cF){if(!aa(cF,"/")){cF="/"+cF}if(!aa(cG,"/")){cG="/"+cG}var cH=(cF==="/"||cF==="/*");if(cH){return true}if(cG===cF){return true}cF=String(cF).toLowerCase();cG=String(cG).toLowerCase();if(L(cF,"*")){cF=cF.slice(0,-1);cH=(!cF||cF==="/");if(cH){return true}if(cG===cF){return true}return cG.indexOf(cF)===0}if(!L(cG,"/")){cG+="/"}if(!L(cF,"/")){cF+="/"}return cG.indexOf(cF)===0}function ai(cJ,cL){var cG,cF,cH,cI,cK;for(cG=0;cG0)&&(cI.slice(cH)===cF)){return true}}}return false}function bY(cF,cH){var cG=new Image(1,1);cG.onload=function(){z=0;if(typeof cH==="function"){cH() }};cF=cF.replace("send_image=0","send_image=1");cG.src=ap+(ap.indexOf("?")<0?"?":"&")+cF}function ct(cG,cJ,cF){if(!D(cF)||null===cF){cF=true}try{var cI=N.XMLHttpRequest?new N.XMLHttpRequest():N.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;cI.open("POST",ap,true);cI.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)&&cF){bY(cG,cJ)}else{if(this.readyState===4&&(typeof cJ==="function")){cJ()}}};cI.setRequestHeader("Content-Type",b3);cI.send(cG)}catch(cH){if(cF){bY(cG,cJ)}}}function bP(cG){var cF=new Date();var cH=cF.getTime()+cG;if(!n||cH>n){n=cH}}function bW(cF){if(bL||!aO){return}bL=setTimeout(function cG(){bL=null;if(!aU){aU=(!A.hasFocus||A.hasFocus())}if(!aU){bW(aO);return}if(br()){return}var cH=new Date(),cI=aO-(cH.getTime()-cp);cI=Math.min(aO,cI);bW(cI)},cF||aO)}function bk(){if(!bL){return}clearTimeout(bL);bL=null}function aS(){aU=true;if(br()){return}bW()}function am(){bk()}function cD(){if(ay||!aO){return}ay=true;ae(N,"focus",aS); -ae(N,"blur",am);bW()}function b8(cJ){var cG=new Date();var cF=cG.getTime();cp=cF;if(b7&&cFc4){cV.visitCount++;cV.lastVisitTs=cV.currentVisitTs}if(!a8||!cN.length){for(c1 in bZ){if(Object.prototype.hasOwnProperty.call(bZ,c1)){cN=P(c5,bZ[c1]);if(cN.length){break}}}for(c1 in bh){if(Object.prototype.hasOwnProperty.call(bh,c1)){cF=P(c5,bh[c1]);if(cF.length){break}}}}c8=c(a2);cQ=c0.length?c(c0):"";if(c8.length&&!aF(c8)&&(!a8||!cQ.length||aF(cQ))){c0=a2}if(c0.length||cN.length){cM=cP;cZ=[cN,cF,cM,bB(c0.slice(0,cJ))];cB(cW,JSON2.stringify(cZ),cu,a4,co)}}cH+="&idsite="+bF+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cG.getHours()+"&m="+cG.getMinutes()+"&s="+cG.getSeconds()+"&url="+p(bB(c5))+(a2.length?"&urlref="+p(bB(a2)):"")+((bb&&bb.length)?"&uid="+p(bb):"")+"&_id="+cV.uuid+"&_idts="+cV.createTs+"&_idvc="+cV.visitCount+"&_idn="+cV.newVisitor+(cN.length?"&_rcn="+p(cN):"")+(cF.length?"&_rck="+p(cF):"")+"&_refts="+cM+"&_viewts="+cV.lastVisitTs+(String(cV.lastEcommerceOrderTs).length?"&_ects="+cV.lastEcommerceOrderTs:"")+(String(c0).length?"&_ref="+p(bB(c0.slice(0,cJ))):"")+(cS?"&cs="+p(cS):"")+"&send_image=0"; -for(c1 in cw){if(Object.prototype.hasOwnProperty.call(cw,c1)){cH+="&"+c1+"="+cw[c1]}}var c7=[];if(c2){for(c1 in c2){if(Object.prototype.hasOwnProperty.call(c2,c1)&&/^dimension\d+$/.test(c1)){var cL=c1.replace("dimension","");c7.push(parseInt(cL,10));c7.push(String(cL));cH+="&"+c1+"="+c2[c1];delete c2[c1]}}}if(c2&&w(c2)){c2=null}for(c1 in a1){if(Object.prototype.hasOwnProperty.call(a1,c1)){var cR=(-1===G(c7,c1));if(cR){cH+="&dimension"+c1+"="+a1[c1]}}}if(c2){cH+="&data="+p(JSON2.stringify(c2))}else{if(af){cH+="&data="+p(JSON2.stringify(af))}}function cO(c9,da){var db=JSON2.stringify(c9);if(db.length>2){return"&"+da+"="+p(db)}return""}var c6=cE(bv);var cX=cE(bU);cH+=cO(c6,"cvar");cH+=cO(cX,"e_cvar");if(aA){cH+=cO(aA,"_cvar");for(c1 in cY){if(Object.prototype.hasOwnProperty.call(cY,c1)){if(aA[c1][0]===""||aA[c1][1]===""){delete aA[c1]}}}if(bq){cB(cT,JSON2.stringify(aA),bX,a4,co)}}if(aL){if(bV){cH+=">_ms="+bV}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cH+=">_ms="+(g.timing.responseEnd-g.timing.requestStart) -}}}if(av){cH+="&pv_id="+av}cV.lastEcommerceOrderTs=D(cI)&&String(cI).length?cI:cV.lastEcommerceOrderTs;aw(cV);bM();cH+=U(c3);if(cq.length){cH+="&"+cq}if(v(bK)){cH=bK(cH)}return cH}br=function aP(){var cF=new Date();if(cp+aO<=cF.getTime()){var cG=b0("ping=1",null,"ping");bg(cG,bj);return true}return false};function a5(cI,cH,cN,cJ,cF,cQ){var cL="idgoal=0",cM,cG=new Date(),cO=[],cP,cK=String(cI).length;if(cK){cL+="&ec_id="+p(cI);cM=Math.round(cG.getTime()/1000)}cL+="&revenue="+cH;if(String(cN).length){cL+="&ec_st="+cN}if(String(cJ).length){cL+="&ec_tx="+cJ}if(String(cF).length){cL+="&ec_sh="+cF}if(String(cQ).length){cL+="&ec_dt="+cQ}if(cr){for(cP in cr){if(Object.prototype.hasOwnProperty.call(cr,cP)){if(!D(cr[cP][1])){cr[cP][1]=""}if(!D(cr[cP][2])){cr[cP][2]=""}if(!D(cr[cP][3])||String(cr[cP][3]).length===0){cr[cP][3]=0}if(!D(cr[cP][4])||String(cr[cP][4]).length===0){cr[cP][4]=1}cO.push(cr[cP])}}cL+="&ec_items="+p(JSON2.stringify(cO))}cL=b0(cL,af,"ecommerce",cM);bg(cL,bj);if(cK){cr={}}}function by(cF,cJ,cI,cH,cG,cK){if(String(cF).length&&D(cJ)){a5(cF,cJ,cI,cH,cG,cK) -}}function a6(cF){if(D(cF)){a5("",cF,"","","","")}}function bz(cG,cI,cH){av=aW();var cF=b0("action_name="+p(ac(cG||aY)),cI,"log");bg(cF,bj,cH)}function aJ(cH,cG){var cI,cF="(^| )(piwik[_-]"+cG;if(cH){for(cI=0;cI0){cJ=parseInt(cJ,10);cM(cJ)}})}function ca(){var cG,cI,cJ={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cG in cJ){if(Object.prototype.hasOwnProperty.call(cJ,cG)){cI=f.mimeTypes[cJ[cG]];cw[cG]=(cI&&cI.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&D(f.javaEnabled)&&f.javaEnabled()){cw.java="1" -}if(v(N.GearsFactory)){cw.gears="1"}cw.cookie=bE()}var cH=parseInt(R.width,10);var cF=parseInt(R.height,10);cw.res=parseInt(cH,10)+"x"+parseInt(cF,10)}ca();aX();aw();this.getVisitorId=function(){return aH().uuid};this.getVisitorInfo=function(){return cg()};this.getAttributionInfo=function(){return bm()};this.getAttributionCampaignName=function(){return bm()[0]};this.getAttributionCampaignKeyword=function(){return bm()[1]};this.getAttributionReferrerTimestamp=function(){return bm()[2]};this.getAttributionReferrerUrl=function(){return bm()[3]};this.setTrackerUrl=function(cF){ap=cF};this.getTrackerUrl=function(){return ap};this.addTracker=function(cF,cH){if(!cH){throw new Error("A siteId must be given to add a new tracker")}if(!D(cF)||null===cF){cF=this.getTrackerUrl()}var cG=new K(cF,cH);C.push(cG);return cG};this.getSiteId=function(){return bF};this.setSiteId=function(cF){bC(cF)};this.setUserId=function(cF){if(!D(cF)||!cF.length){return}bb=cF;bo=bG(bb).substr(0,16)};this.getUserId=function(){return bb -};this.setCustomData=function(cF,cG){if(Q(cF)){af=cF}else{if(!af){af={}}af[cF]=cG}};this.getCustomData=function(){return af};this.setCustomRequestProcessing=function(cF){bK=cF};this.appendToTrackingUrl=function(cF){cq=cF};this.getRequest=function(cF){return b0(cF)};this.addPlugin=function(cF,cG){a[cF]=cG};this.setCustomDimension=function(cF,cG){cF=parseInt(cF,10);if(cF>0){if(!D(cG)){cG=""}if(!s(cG)){cG=String(cG)}a1[cF]=cG}};this.getCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0&&Object.prototype.hasOwnProperty.call(a1,cF)){return a1[cF]}};this.deleteCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0){delete a1[cF]}};this.setCustomVariable=function(cG,cF,cJ,cH){var cI;if(!D(cH)){cH="visit"}if(!D(cF)){return}if(!D(cJ)){cJ=""}if(cG>0){cF=!s(cF)?String(cF):cF;cJ=!s(cJ)?String(cJ):cJ;cI=[cF.slice(0,a7),cJ.slice(0,a7)];if(cH==="visit"||cH===2){b9();aA[cG]=cI}else{if(cH==="page"||cH===3){bv[cG]=cI}else{if(cH==="event"){bU[cG]=cI}}}}};this.getCustomVariable=function(cG,cH){var cF; -if(!D(cH)){cH="visit"}if(cH==="page"||cH===3){cF=bv[cG]}else{if(cH==="event"){cF=bU[cG]}else{if(cH==="visit"||cH===2){b9();cF=aA[cG]}}}if(!D(cF)||(cF&&cF[0]==="")){return false}return cF};this.deleteCustomVariable=function(cF,cG){if(this.getCustomVariable(cF,cG)){this.setCustomVariable(cF,"","",cG)}};this.storeCustomVariablesInCookie=function(){bq=true};this.setLinkTrackingTimer=function(cF){bj=cF};this.setDownloadExtensions=function(cF){if(s(cF)){cF=cF.split("|")}cv=cF};this.addDownloadExtensions=function(cG){var cF;if(s(cG)){cG=cG.split("|")}for(cF=0;cF1){ab("The method "+ag+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}al[ag]++}}}}return ak}var x=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"]; -function V(af,ah){var ag=new K(af,ah);C.push(ag);_paq=b(_paq,x);for(z=0;z<_paq.length;z++){if(_paq[z]){X(_paq[z])}}_paq=new B();return ag}ae(N,"beforeunload",Z,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,DOM:{addEventListener:function(ai,ah,ag,af){var aj=typeof af;if(aj==="undefined"){af=false}ae(ai,ah,ag,af)},onLoad:j,onReady:m},on:function(ag,af){if(!t[ag]){t[ag]=[]}t[ag].push(af)},off:function(ah,ag){if(!t[ah]){return}var af=0;for(af;afc4){cV.visitCount++;cV.lastVisitTs=cV.currentVisitTs}if(!a8||!cN.length){for(c1 in bZ){if(Object.prototype.hasOwnProperty.call(bZ,c1)){cN=P(c5,bZ[c1]);if(cN.length){break}}}for(c1 in bh){if(Object.prototype.hasOwnProperty.call(bh,c1)){cF=P(c5,bh[c1]);if(cF.length){break}}}}c8=c(a2);cQ=c0.length?c(c0):"";if(c8.length&&!aF(c8)&&(!a8||!cQ.length||aF(cQ))){c0=a2}if(c0.length||cN.length){cM=cP;cZ=[cN,cF,cM,bB(c0.slice(0,cJ))];cB(cW,JSON_PIWIK.stringify(cZ),cu,a4,co)}}cH+="&idsite="+bF+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cG.getHours()+"&m="+cG.getMinutes()+"&s="+cG.getSeconds()+"&url="+p(bB(c5))+(a2.length?"&urlref="+p(bB(a2)):"")+((bb&&bb.length)?"&uid="+p(bb):"")+"&_id="+cV.uuid+"&_idts="+cV.createTs+"&_idvc="+cV.visitCount+"&_idn="+cV.newVisitor+(cN.length?"&_rcn="+p(cN):"")+(cF.length?"&_rck="+p(cF):"")+"&_refts="+cM+"&_viewts="+cV.lastVisitTs+(String(cV.lastEcommerceOrderTs).length?"&_ects="+cV.lastEcommerceOrderTs:"")+(String(c0).length?"&_ref="+p(bB(c0.slice(0,cJ))):"")+(cS?"&cs="+p(cS):"")+"&send_image=0"; +for(c1 in cw){if(Object.prototype.hasOwnProperty.call(cw,c1)){cH+="&"+c1+"="+cw[c1]}}var c7=[];if(c2){for(c1 in c2){if(Object.prototype.hasOwnProperty.call(c2,c1)&&/^dimension\d+$/.test(c1)){var cL=c1.replace("dimension","");c7.push(parseInt(cL,10));c7.push(String(cL));cH+="&"+c1+"="+c2[c1];delete c2[c1]}}}if(c2&&w(c2)){c2=null}for(c1 in a1){if(Object.prototype.hasOwnProperty.call(a1,c1)){var cR=(-1===G(c7,c1));if(cR){cH+="&dimension"+c1+"="+a1[c1]}}}if(c2){cH+="&data="+p(JSON_PIWIK.stringify(c2))}else{if(af){cH+="&data="+p(JSON_PIWIK.stringify(af))}}function cO(c9,da){var db=JSON_PIWIK.stringify(c9);if(db.length>2){return"&"+da+"="+p(db)}return""}var c6=cE(bv);var cX=cE(bU);cH+=cO(c6,"cvar");cH+=cO(cX,"e_cvar");if(aA){cH+=cO(aA,"_cvar");for(c1 in cY){if(Object.prototype.hasOwnProperty.call(cY,c1)){if(aA[c1][0]===""||aA[c1][1]===""){delete aA[c1]}}}if(bq){cB(cT,JSON_PIWIK.stringify(aA),bX,a4,co)}}if(aL){if(bV){cH+=">_ms="+bV}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cH+=">_ms="+(g.timing.responseEnd-g.timing.requestStart) +}}}if(av){cH+="&pv_id="+av}cV.lastEcommerceOrderTs=D(cI)&&String(cI).length?cI:cV.lastEcommerceOrderTs;aw(cV);bM();cH+=U(c3);if(cq.length){cH+="&"+cq}if(v(bK)){cH=bK(cH)}return cH}br=function aP(){var cF=new Date();if(cp+aO<=cF.getTime()){var cG=b0("ping=1",null,"ping");bg(cG,bj);return true}return false};function a5(cI,cH,cN,cJ,cF,cQ){var cL="idgoal=0",cM,cG=new Date(),cO=[],cP,cK=String(cI).length;if(cK){cL+="&ec_id="+p(cI);cM=Math.round(cG.getTime()/1000)}cL+="&revenue="+cH;if(String(cN).length){cL+="&ec_st="+cN}if(String(cJ).length){cL+="&ec_tx="+cJ}if(String(cF).length){cL+="&ec_sh="+cF}if(String(cQ).length){cL+="&ec_dt="+cQ}if(cr){for(cP in cr){if(Object.prototype.hasOwnProperty.call(cr,cP)){if(!D(cr[cP][1])){cr[cP][1]=""}if(!D(cr[cP][2])){cr[cP][2]=""}if(!D(cr[cP][3])||String(cr[cP][3]).length===0){cr[cP][3]=0}if(!D(cr[cP][4])||String(cr[cP][4]).length===0){cr[cP][4]=1}cO.push(cr[cP])}}cL+="&ec_items="+p(JSON_PIWIK.stringify(cO))}cL=b0(cL,af,"ecommerce",cM);bg(cL,bj);if(cK){cr={} +}}function by(cF,cJ,cI,cH,cG,cK){if(String(cF).length&&D(cJ)){a5(cF,cJ,cI,cH,cG,cK)}}function a6(cF){if(D(cF)){a5("",cF,"","","","")}}function bz(cG,cI,cH){av=aW();var cF=b0("action_name="+p(ac(cG||aY)),cI,"log");bg(cF,bj,cH)}function aJ(cH,cG){var cI,cF="(^| )(piwik[_-]"+cG;if(cH){for(cI=0;cI0){cJ=parseInt(cJ,10);cM(cJ)}})}function ca(){var cG,cI,cJ={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cG in cJ){if(Object.prototype.hasOwnProperty.call(cJ,cG)){cI=f.mimeTypes[cJ[cG]]; +cw[cG]=(cI&&cI.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&D(f.javaEnabled)&&f.javaEnabled()){cw.java="1"}if(v(N.GearsFactory)){cw.gears="1"}cw.cookie=bE()}var cH=parseInt(R.width,10);var cF=parseInt(R.height,10);cw.res=parseInt(cH,10)+"x"+parseInt(cF,10)}ca();aX();aw();this.getVisitorId=function(){return aH().uuid};this.getVisitorInfo=function(){return cg()};this.getAttributionInfo=function(){return bm()};this.getAttributionCampaignName=function(){return bm()[0]};this.getAttributionCampaignKeyword=function(){return bm()[1]};this.getAttributionReferrerTimestamp=function(){return bm()[2]};this.getAttributionReferrerUrl=function(){return bm()[3]};this.setTrackerUrl=function(cF){ap=cF};this.getTrackerUrl=function(){return ap};this.addTracker=function(cF,cH){if(!cH){throw new Error("A siteId must be given to add a new tracker")}if(!D(cF)||null===cF){cF=this.getTrackerUrl()}var cG=new K(cF,cH);C.push(cG);return cG};this.getSiteId=function(){return bF};this.setSiteId=function(cF){bC(cF) +};this.setUserId=function(cF){if(!D(cF)||!cF.length){return}bb=cF;bo=bG(bb).substr(0,16)};this.getUserId=function(){return bb};this.setCustomData=function(cF,cG){if(Q(cF)){af=cF}else{if(!af){af={}}af[cF]=cG}};this.getCustomData=function(){return af};this.setCustomRequestProcessing=function(cF){bK=cF};this.appendToTrackingUrl=function(cF){cq=cF};this.getRequest=function(cF){return b0(cF)};this.addPlugin=function(cF,cG){a[cF]=cG};this.setCustomDimension=function(cF,cG){cF=parseInt(cF,10);if(cF>0){if(!D(cG)){cG=""}if(!s(cG)){cG=String(cG)}a1[cF]=cG}};this.getCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0&&Object.prototype.hasOwnProperty.call(a1,cF)){return a1[cF]}};this.deleteCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0){delete a1[cF]}};this.setCustomVariable=function(cG,cF,cJ,cH){var cI;if(!D(cH)){cH="visit"}if(!D(cF)){return}if(!D(cJ)){cJ=""}if(cG>0){cF=!s(cF)?String(cF):cF;cJ=!s(cJ)?String(cJ):cJ;cI=[cF.slice(0,a7),cJ.slice(0,a7)];if(cH==="visit"||cH===2){b9();aA[cG]=cI +}else{if(cH==="page"||cH===3){bv[cG]=cI}else{if(cH==="event"){bU[cG]=cI}}}}};this.getCustomVariable=function(cG,cH){var cF;if(!D(cH)){cH="visit"}if(cH==="page"||cH===3){cF=bv[cG]}else{if(cH==="event"){cF=bU[cG]}else{if(cH==="visit"||cH===2){b9();cF=aA[cG]}}}if(!D(cF)||(cF&&cF[0]==="")){return false}return cF};this.deleteCustomVariable=function(cF,cG){if(this.getCustomVariable(cF,cG)){this.setCustomVariable(cF,"","",cG)}};this.storeCustomVariablesInCookie=function(){bq=true};this.setLinkTrackingTimer=function(cF){bj=cF};this.setDownloadExtensions=function(cF){if(s(cF)){cF=cF.split("|")}cv=cF};this.addDownloadExtensions=function(cG){var cF;if(s(cG)){cG=cG.split("|")}for(cF=0;cF1){ab("The method "+ag+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers') +}al[ag]++}}}}return ak}var x=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];function V(af,ah){var ag=new K(af,ah);C.push(ag);_paq=b(_paq,x);for(z=0;z<_paq.length;z++){if(_paq[z]){X(_paq[z])}}_paq=new B();return ag}ae(N,"beforeunload",Z,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ai,ah,ag,af){var aj=typeof af;if(aj==="undefined"){af=false}ae(ai,ah,ag,af)},onLoad:j,onReady:m},on:function(ag,af){if(!t[ag]){t[ag]=[]}t[ag].push(af)},off:function(ah,ag){if(!t[ah]){return}var af=0;for(af;af-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah0){for(ad="",af>10&&(af=10); ad.length=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++; return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y(); -if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON2=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var n,a={},t={},A=document,f=navigator,R=screen,N=window,g=N.performance||N.mozPerformance||N.msPerformance||N.webkitPerformance,p=N.encodeURIComponent,M=N.decodeURIComponent,i=unescape,C=[],z,d,Y=[]; +if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON_PIWIK=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var n,a={},t={},A=document,f=navigator,R=screen,N=window,g=N.performance||N.mozPerformance||N.msPerformance||N.webkitPerformance,p=N.encodeURIComponent,M=N.decodeURIComponent,i=unescape,C=[],z,d,Y=[]; function l(af){try{return M(af)}catch(ag){return unescape(af)}}function D(ag){var af=typeof ag;return af!=="undefined"}function v(af){return typeof af==="function"}function Q(af){return typeof af==="object"}function s(af){return typeof af==="string"||af instanceof String}function w(ag){if(!ag){return true}var af;var ah=true;for(af in ag){if(Object.prototype.hasOwnProperty.call(ag,af)){ah=false}}return ah}function ab(af){if(console!==undefined&&console&&console.error){console.error(af)}}function X(){var ak,aj,am,ag,af;for(ak=0;ak0;if(ai){al=am.split("::");ah=al[0];am=al[1];if("object"===typeof d[ah]&&"function"===typeof d[ah][am]){d[ah][am].apply(d[ah],ag)}else{if(af){Y.push(af)}}}else{for(aj=0;aj0;if(an){al=am.split(".");if(ah&&"object"===typeof ah[al[0]]){ah=ah[al[0]]; am=al[1]}else{if(af){Y.push(af);break}}}if(ah[am]){ah[am].apply(ah,ag)}else{var ao="The method '"+am+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: http://developer.piwik.org/api-reference/tracking-javascript';ab(ao);if(!an){throw new TypeError(ao)}}if(am==="addTracker"){break}if(am==="setTrackerUrl"||am==="setSiteId"){break}}else{am.apply(C[aj],ag)}}}}}function ae(ai,ah,ag,af){if(ai.addEventListener){ai.addEventListener(ah,ag,af);return true}if(ai.attachEvent){return ai.attachEvent("on"+ah,ag)}ai["on"+ah]=ag}function j(af){if(A.readyState==="complete"){af()}else{if(N.addEventListener){N.addEventListener("load",af)}else{if(N.attachEvent){N.attachEvent("onload",af)}}}}function m(ai){var af=false;if(A.attachEvent){af=A.readyState==="complete"}else{af=A.readyState!=="loading"}if(af){ai();return}var ah;if(A.addEventListener){ae(A,"DOMContentLoaded",function ag(){A.removeEventListener("DOMContentLoaded",ag,false);if(!af){af=true;ai()}})}else{if(A.attachEvent){A.attachEvent("onreadystatechange",function ag(){if(A.readyState==="complete"){A.detachEvent("onreadystatechange",ag); if(!af){af=true;ai()}}});if(A.documentElement.doScroll&&N===N.top){(function ag(){if(!af){try{A.documentElement.doScroll("left")}catch(aj){setTimeout(ag,0);return}af=true;ai()}}())}}}ae(N,"load",function(){if(!af){af=true;ai()}},false)}function U(ag,ak){var af="",ai,ah,aj;for(ai in a){if(Object.prototype.hasOwnProperty.call(a,ai)){ah=a[ai][ag];if(v(ah)){aj=ah(ak);if(aj){af+=aj}}}}return af}function Z(){var af;U("unload");if(n){do{af=new Date()}while(af.getTimeAlias()=0){cH=cH.slice(0,cG)}cG=cH.lastIndexOf("/");if(cG!==cH.length-1){cH=cH.slice(0,cG+1)}return cH+cF}function cb(cH,cF){var cG;cH=String(cH).toLowerCase();cF=String(cF).toLowerCase();if(cH===cF){return true}if(cF.slice(0,1)==="."){if(cH===cF.slice(1)){return true}cG=cH.length-cF.length;if((cG>0)&&(cH.slice(cG)===cF)){return true}}return false}function bT(cF){var cG=document.createElement("a");if(cF.indexOf("//")!==0&&cF.indexOf("http")!==0){if(cF.indexOf("*")===0){cF=cF.substr(1) }if(cF.indexOf(".")===0){cF=cF.substr(1)}cF="http://"+cF}cG.href=r.toAbsoluteUrl(cF);if(cG.pathname){return cG.pathname}return""}function aM(cG,cF){if(!aa(cF,"/")){cF="/"+cF}if(!aa(cG,"/")){cG="/"+cG}var cH=(cF==="/"||cF==="/*");if(cH){return true}if(cG===cF){return true}cF=String(cF).toLowerCase();cG=String(cG).toLowerCase();if(L(cF,"*")){cF=cF.slice(0,-1);cH=(!cF||cF==="/");if(cH){return true}if(cG===cF){return true}return cG.indexOf(cF)===0}if(!L(cG,"/")){cG+="/"}if(!L(cF,"/")){cF+="/"}return cG.indexOf(cF)===0}function ai(cJ,cL){var cG,cF,cH,cI,cK;for(cG=0;cG0)&&(cI.slice(cH)===cF)){return true}}}return false}function bY(cF,cH){var cG=new Image(1,1);cG.onload=function(){z=0;if(typeof cH==="function"){cH() }};cF=cF.replace("send_image=0","send_image=1");cG.src=ap+(ap.indexOf("?")<0?"?":"&")+cF}function ct(cG,cJ,cF){if(!D(cF)||null===cF){cF=true}try{var cI=N.XMLHttpRequest?new N.XMLHttpRequest():N.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;cI.open("POST",ap,true);cI.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)&&cF){bY(cG,cJ)}else{if(this.readyState===4&&(typeof cJ==="function")){cJ()}}};cI.setRequestHeader("Content-Type",b3);cI.send(cG)}catch(cH){if(cF){bY(cG,cJ)}}}function bP(cG){var cF=new Date();var cH=cF.getTime()+cG;if(!n||cH>n){n=cH}}function bW(cF){if(bL||!aO){return}bL=setTimeout(function cG(){bL=null;if(!aU){aU=(!A.hasFocus||A.hasFocus())}if(!aU){bW(aO);return}if(br()){return}var cH=new Date(),cI=aO-(cH.getTime()-cp);cI=Math.min(aO,cI);bW(cI)},cF||aO)}function bk(){if(!bL){return}clearTimeout(bL);bL=null}function aS(){aU=true;if(br()){return}bW()}function am(){bk()}function cD(){if(ay||!aO){return}ay=true;ae(N,"focus",aS); -ae(N,"blur",am);bW()}function b8(cJ){var cG=new Date();var cF=cG.getTime();cp=cF;if(b7&&cFc4){cV.visitCount++;cV.lastVisitTs=cV.currentVisitTs}if(!a8||!cN.length){for(c1 in bZ){if(Object.prototype.hasOwnProperty.call(bZ,c1)){cN=P(c5,bZ[c1]);if(cN.length){break}}}for(c1 in bh){if(Object.prototype.hasOwnProperty.call(bh,c1)){cF=P(c5,bh[c1]);if(cF.length){break}}}}c8=c(a2);cQ=c0.length?c(c0):"";if(c8.length&&!aF(c8)&&(!a8||!cQ.length||aF(cQ))){c0=a2}if(c0.length||cN.length){cM=cP;cZ=[cN,cF,cM,bB(c0.slice(0,cJ))];cB(cW,JSON2.stringify(cZ),cu,a4,co)}}cH+="&idsite="+bF+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cG.getHours()+"&m="+cG.getMinutes()+"&s="+cG.getSeconds()+"&url="+p(bB(c5))+(a2.length?"&urlref="+p(bB(a2)):"")+((bb&&bb.length)?"&uid="+p(bb):"")+"&_id="+cV.uuid+"&_idts="+cV.createTs+"&_idvc="+cV.visitCount+"&_idn="+cV.newVisitor+(cN.length?"&_rcn="+p(cN):"")+(cF.length?"&_rck="+p(cF):"")+"&_refts="+cM+"&_viewts="+cV.lastVisitTs+(String(cV.lastEcommerceOrderTs).length?"&_ects="+cV.lastEcommerceOrderTs:"")+(String(c0).length?"&_ref="+p(bB(c0.slice(0,cJ))):"")+(cS?"&cs="+p(cS):"")+"&send_image=0"; -for(c1 in cw){if(Object.prototype.hasOwnProperty.call(cw,c1)){cH+="&"+c1+"="+cw[c1]}}var c7=[];if(c2){for(c1 in c2){if(Object.prototype.hasOwnProperty.call(c2,c1)&&/^dimension\d+$/.test(c1)){var cL=c1.replace("dimension","");c7.push(parseInt(cL,10));c7.push(String(cL));cH+="&"+c1+"="+c2[c1];delete c2[c1]}}}if(c2&&w(c2)){c2=null}for(c1 in a1){if(Object.prototype.hasOwnProperty.call(a1,c1)){var cR=(-1===G(c7,c1));if(cR){cH+="&dimension"+c1+"="+a1[c1]}}}if(c2){cH+="&data="+p(JSON2.stringify(c2))}else{if(af){cH+="&data="+p(JSON2.stringify(af))}}function cO(c9,da){var db=JSON2.stringify(c9);if(db.length>2){return"&"+da+"="+p(db)}return""}var c6=cE(bv);var cX=cE(bU);cH+=cO(c6,"cvar");cH+=cO(cX,"e_cvar");if(aA){cH+=cO(aA,"_cvar");for(c1 in cY){if(Object.prototype.hasOwnProperty.call(cY,c1)){if(aA[c1][0]===""||aA[c1][1]===""){delete aA[c1]}}}if(bq){cB(cT,JSON2.stringify(aA),bX,a4,co)}}if(aL){if(bV){cH+=">_ms="+bV}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cH+=">_ms="+(g.timing.responseEnd-g.timing.requestStart) -}}}if(av){cH+="&pv_id="+av}cV.lastEcommerceOrderTs=D(cI)&&String(cI).length?cI:cV.lastEcommerceOrderTs;aw(cV);bM();cH+=U(c3);if(cq.length){cH+="&"+cq}if(v(bK)){cH=bK(cH)}return cH}br=function aP(){var cF=new Date();if(cp+aO<=cF.getTime()){var cG=b0("ping=1",null,"ping");bg(cG,bj);return true}return false};function a5(cI,cH,cN,cJ,cF,cQ){var cL="idgoal=0",cM,cG=new Date(),cO=[],cP,cK=String(cI).length;if(cK){cL+="&ec_id="+p(cI);cM=Math.round(cG.getTime()/1000)}cL+="&revenue="+cH;if(String(cN).length){cL+="&ec_st="+cN}if(String(cJ).length){cL+="&ec_tx="+cJ}if(String(cF).length){cL+="&ec_sh="+cF}if(String(cQ).length){cL+="&ec_dt="+cQ}if(cr){for(cP in cr){if(Object.prototype.hasOwnProperty.call(cr,cP)){if(!D(cr[cP][1])){cr[cP][1]=""}if(!D(cr[cP][2])){cr[cP][2]=""}if(!D(cr[cP][3])||String(cr[cP][3]).length===0){cr[cP][3]=0}if(!D(cr[cP][4])||String(cr[cP][4]).length===0){cr[cP][4]=1}cO.push(cr[cP])}}cL+="&ec_items="+p(JSON2.stringify(cO))}cL=b0(cL,af,"ecommerce",cM);bg(cL,bj);if(cK){cr={}}}function by(cF,cJ,cI,cH,cG,cK){if(String(cF).length&&D(cJ)){a5(cF,cJ,cI,cH,cG,cK) -}}function a6(cF){if(D(cF)){a5("",cF,"","","","")}}function bz(cG,cI,cH){av=aW();var cF=b0("action_name="+p(ac(cG||aY)),cI,"log");bg(cF,bj,cH)}function aJ(cH,cG){var cI,cF="(^| )(piwik[_-]"+cG;if(cH){for(cI=0;cI0){cJ=parseInt(cJ,10);cM(cJ)}})}function ca(){var cG,cI,cJ={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cG in cJ){if(Object.prototype.hasOwnProperty.call(cJ,cG)){cI=f.mimeTypes[cJ[cG]];cw[cG]=(cI&&cI.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&D(f.javaEnabled)&&f.javaEnabled()){cw.java="1" -}if(v(N.GearsFactory)){cw.gears="1"}cw.cookie=bE()}var cH=parseInt(R.width,10);var cF=parseInt(R.height,10);cw.res=parseInt(cH,10)+"x"+parseInt(cF,10)}ca();aX();aw();this.getVisitorId=function(){return aH().uuid};this.getVisitorInfo=function(){return cg()};this.getAttributionInfo=function(){return bm()};this.getAttributionCampaignName=function(){return bm()[0]};this.getAttributionCampaignKeyword=function(){return bm()[1]};this.getAttributionReferrerTimestamp=function(){return bm()[2]};this.getAttributionReferrerUrl=function(){return bm()[3]};this.setTrackerUrl=function(cF){ap=cF};this.getTrackerUrl=function(){return ap};this.addTracker=function(cF,cH){if(!cH){throw new Error("A siteId must be given to add a new tracker")}if(!D(cF)||null===cF){cF=this.getTrackerUrl()}var cG=new K(cF,cH);C.push(cG);return cG};this.getSiteId=function(){return bF};this.setSiteId=function(cF){bC(cF)};this.setUserId=function(cF){if(!D(cF)||!cF.length){return}bb=cF;bo=bG(bb).substr(0,16)};this.getUserId=function(){return bb -};this.setCustomData=function(cF,cG){if(Q(cF)){af=cF}else{if(!af){af={}}af[cF]=cG}};this.getCustomData=function(){return af};this.setCustomRequestProcessing=function(cF){bK=cF};this.appendToTrackingUrl=function(cF){cq=cF};this.getRequest=function(cF){return b0(cF)};this.addPlugin=function(cF,cG){a[cF]=cG};this.setCustomDimension=function(cF,cG){cF=parseInt(cF,10);if(cF>0){if(!D(cG)){cG=""}if(!s(cG)){cG=String(cG)}a1[cF]=cG}};this.getCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0&&Object.prototype.hasOwnProperty.call(a1,cF)){return a1[cF]}};this.deleteCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0){delete a1[cF]}};this.setCustomVariable=function(cG,cF,cJ,cH){var cI;if(!D(cH)){cH="visit"}if(!D(cF)){return}if(!D(cJ)){cJ=""}if(cG>0){cF=!s(cF)?String(cF):cF;cJ=!s(cJ)?String(cJ):cJ;cI=[cF.slice(0,a7),cJ.slice(0,a7)];if(cH==="visit"||cH===2){b9();aA[cG]=cI}else{if(cH==="page"||cH===3){bv[cG]=cI}else{if(cH==="event"){bU[cG]=cI}}}}};this.getCustomVariable=function(cG,cH){var cF; -if(!D(cH)){cH="visit"}if(cH==="page"||cH===3){cF=bv[cG]}else{if(cH==="event"){cF=bU[cG]}else{if(cH==="visit"||cH===2){b9();cF=aA[cG]}}}if(!D(cF)||(cF&&cF[0]==="")){return false}return cF};this.deleteCustomVariable=function(cF,cG){if(this.getCustomVariable(cF,cG)){this.setCustomVariable(cF,"","",cG)}};this.storeCustomVariablesInCookie=function(){bq=true};this.setLinkTrackingTimer=function(cF){bj=cF};this.setDownloadExtensions=function(cF){if(s(cF)){cF=cF.split("|")}cv=cF};this.addDownloadExtensions=function(cG){var cF;if(s(cG)){cG=cG.split("|")}for(cF=0;cF1){ab("The method "+ag+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}al[ag]++}}}}return ak}var x=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"]; -function V(af,ah){var ag=new K(af,ah);C.push(ag);_paq=b(_paq,x);for(z=0;z<_paq.length;z++){if(_paq[z]){X(_paq[z])}}_paq=new B();return ag}ae(N,"beforeunload",Z,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,DOM:{addEventListener:function(ai,ah,ag,af){var aj=typeof af;if(aj==="undefined"){af=false}ae(ai,ah,ag,af)},onLoad:j,onReady:m},on:function(ag,af){if(!t[ag]){t[ag]=[]}t[ag].push(af)},off:function(ah,ag){if(!t[ah]){return}var af=0;for(af;afc4){cV.visitCount++;cV.lastVisitTs=cV.currentVisitTs}if(!a8||!cN.length){for(c1 in bZ){if(Object.prototype.hasOwnProperty.call(bZ,c1)){cN=P(c5,bZ[c1]);if(cN.length){break}}}for(c1 in bh){if(Object.prototype.hasOwnProperty.call(bh,c1)){cF=P(c5,bh[c1]);if(cF.length){break}}}}c8=c(a2);cQ=c0.length?c(c0):"";if(c8.length&&!aF(c8)&&(!a8||!cQ.length||aF(cQ))){c0=a2}if(c0.length||cN.length){cM=cP;cZ=[cN,cF,cM,bB(c0.slice(0,cJ))];cB(cW,JSON_PIWIK.stringify(cZ),cu,a4,co)}}cH+="&idsite="+bF+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cG.getHours()+"&m="+cG.getMinutes()+"&s="+cG.getSeconds()+"&url="+p(bB(c5))+(a2.length?"&urlref="+p(bB(a2)):"")+((bb&&bb.length)?"&uid="+p(bb):"")+"&_id="+cV.uuid+"&_idts="+cV.createTs+"&_idvc="+cV.visitCount+"&_idn="+cV.newVisitor+(cN.length?"&_rcn="+p(cN):"")+(cF.length?"&_rck="+p(cF):"")+"&_refts="+cM+"&_viewts="+cV.lastVisitTs+(String(cV.lastEcommerceOrderTs).length?"&_ects="+cV.lastEcommerceOrderTs:"")+(String(c0).length?"&_ref="+p(bB(c0.slice(0,cJ))):"")+(cS?"&cs="+p(cS):"")+"&send_image=0"; +for(c1 in cw){if(Object.prototype.hasOwnProperty.call(cw,c1)){cH+="&"+c1+"="+cw[c1]}}var c7=[];if(c2){for(c1 in c2){if(Object.prototype.hasOwnProperty.call(c2,c1)&&/^dimension\d+$/.test(c1)){var cL=c1.replace("dimension","");c7.push(parseInt(cL,10));c7.push(String(cL));cH+="&"+c1+"="+c2[c1];delete c2[c1]}}}if(c2&&w(c2)){c2=null}for(c1 in a1){if(Object.prototype.hasOwnProperty.call(a1,c1)){var cR=(-1===G(c7,c1));if(cR){cH+="&dimension"+c1+"="+a1[c1]}}}if(c2){cH+="&data="+p(JSON_PIWIK.stringify(c2))}else{if(af){cH+="&data="+p(JSON_PIWIK.stringify(af))}}function cO(c9,da){var db=JSON_PIWIK.stringify(c9);if(db.length>2){return"&"+da+"="+p(db)}return""}var c6=cE(bv);var cX=cE(bU);cH+=cO(c6,"cvar");cH+=cO(cX,"e_cvar");if(aA){cH+=cO(aA,"_cvar");for(c1 in cY){if(Object.prototype.hasOwnProperty.call(cY,c1)){if(aA[c1][0]===""||aA[c1][1]===""){delete aA[c1]}}}if(bq){cB(cT,JSON_PIWIK.stringify(aA),bX,a4,co)}}if(aL){if(bV){cH+=">_ms="+bV}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cH+=">_ms="+(g.timing.responseEnd-g.timing.requestStart) +}}}if(av){cH+="&pv_id="+av}cV.lastEcommerceOrderTs=D(cI)&&String(cI).length?cI:cV.lastEcommerceOrderTs;aw(cV);bM();cH+=U(c3);if(cq.length){cH+="&"+cq}if(v(bK)){cH=bK(cH)}return cH}br=function aP(){var cF=new Date();if(cp+aO<=cF.getTime()){var cG=b0("ping=1",null,"ping");bg(cG,bj);return true}return false};function a5(cI,cH,cN,cJ,cF,cQ){var cL="idgoal=0",cM,cG=new Date(),cO=[],cP,cK=String(cI).length;if(cK){cL+="&ec_id="+p(cI);cM=Math.round(cG.getTime()/1000)}cL+="&revenue="+cH;if(String(cN).length){cL+="&ec_st="+cN}if(String(cJ).length){cL+="&ec_tx="+cJ}if(String(cF).length){cL+="&ec_sh="+cF}if(String(cQ).length){cL+="&ec_dt="+cQ}if(cr){for(cP in cr){if(Object.prototype.hasOwnProperty.call(cr,cP)){if(!D(cr[cP][1])){cr[cP][1]=""}if(!D(cr[cP][2])){cr[cP][2]=""}if(!D(cr[cP][3])||String(cr[cP][3]).length===0){cr[cP][3]=0}if(!D(cr[cP][4])||String(cr[cP][4]).length===0){cr[cP][4]=1}cO.push(cr[cP])}}cL+="&ec_items="+p(JSON_PIWIK.stringify(cO))}cL=b0(cL,af,"ecommerce",cM);bg(cL,bj);if(cK){cr={} +}}function by(cF,cJ,cI,cH,cG,cK){if(String(cF).length&&D(cJ)){a5(cF,cJ,cI,cH,cG,cK)}}function a6(cF){if(D(cF)){a5("",cF,"","","","")}}function bz(cG,cI,cH){av=aW();var cF=b0("action_name="+p(ac(cG||aY)),cI,"log");bg(cF,bj,cH)}function aJ(cH,cG){var cI,cF="(^| )(piwik[_-]"+cG;if(cH){for(cI=0;cI0){cJ=parseInt(cJ,10);cM(cJ)}})}function ca(){var cG,cI,cJ={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cG in cJ){if(Object.prototype.hasOwnProperty.call(cJ,cG)){cI=f.mimeTypes[cJ[cG]]; +cw[cG]=(cI&&cI.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&D(f.javaEnabled)&&f.javaEnabled()){cw.java="1"}if(v(N.GearsFactory)){cw.gears="1"}cw.cookie=bE()}var cH=parseInt(R.width,10);var cF=parseInt(R.height,10);cw.res=parseInt(cH,10)+"x"+parseInt(cF,10)}ca();aX();aw();this.getVisitorId=function(){return aH().uuid};this.getVisitorInfo=function(){return cg()};this.getAttributionInfo=function(){return bm()};this.getAttributionCampaignName=function(){return bm()[0]};this.getAttributionCampaignKeyword=function(){return bm()[1]};this.getAttributionReferrerTimestamp=function(){return bm()[2]};this.getAttributionReferrerUrl=function(){return bm()[3]};this.setTrackerUrl=function(cF){ap=cF};this.getTrackerUrl=function(){return ap};this.addTracker=function(cF,cH){if(!cH){throw new Error("A siteId must be given to add a new tracker")}if(!D(cF)||null===cF){cF=this.getTrackerUrl()}var cG=new K(cF,cH);C.push(cG);return cG};this.getSiteId=function(){return bF};this.setSiteId=function(cF){bC(cF) +};this.setUserId=function(cF){if(!D(cF)||!cF.length){return}bb=cF;bo=bG(bb).substr(0,16)};this.getUserId=function(){return bb};this.setCustomData=function(cF,cG){if(Q(cF)){af=cF}else{if(!af){af={}}af[cF]=cG}};this.getCustomData=function(){return af};this.setCustomRequestProcessing=function(cF){bK=cF};this.appendToTrackingUrl=function(cF){cq=cF};this.getRequest=function(cF){return b0(cF)};this.addPlugin=function(cF,cG){a[cF]=cG};this.setCustomDimension=function(cF,cG){cF=parseInt(cF,10);if(cF>0){if(!D(cG)){cG=""}if(!s(cG)){cG=String(cG)}a1[cF]=cG}};this.getCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0&&Object.prototype.hasOwnProperty.call(a1,cF)){return a1[cF]}};this.deleteCustomDimension=function(cF){cF=parseInt(cF,10);if(cF>0){delete a1[cF]}};this.setCustomVariable=function(cG,cF,cJ,cH){var cI;if(!D(cH)){cH="visit"}if(!D(cF)){return}if(!D(cJ)){cJ=""}if(cG>0){cF=!s(cF)?String(cF):cF;cJ=!s(cJ)?String(cJ):cJ;cI=[cF.slice(0,a7),cJ.slice(0,a7)];if(cH==="visit"||cH===2){b9();aA[cG]=cI +}else{if(cH==="page"||cH===3){bv[cG]=cI}else{if(cH==="event"){bU[cG]=cI}}}}};this.getCustomVariable=function(cG,cH){var cF;if(!D(cH)){cH="visit"}if(cH==="page"||cH===3){cF=bv[cG]}else{if(cH==="event"){cF=bU[cG]}else{if(cH==="visit"||cH===2){b9();cF=aA[cG]}}}if(!D(cF)||(cF&&cF[0]==="")){return false}return cF};this.deleteCustomVariable=function(cF,cG){if(this.getCustomVariable(cF,cG)){this.setCustomVariable(cF,"","",cG)}};this.storeCustomVariablesInCookie=function(){bq=true};this.setLinkTrackingTimer=function(cF){bj=cF};this.setDownloadExtensions=function(cF){if(s(cF)){cF=cF.split("|")}cv=cF};this.addDownloadExtensions=function(cG){var cF;if(s(cG)){cG=cG.split("|")}for(cF=0;cF1){ab("The method "+ag+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers') +}al[ag]++}}}}return ak}var x=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];function V(af,ah){var ag=new K(af,ah);C.push(ag);_paq=b(_paq,x);for(z=0;z<_paq.length;z++){if(_paq[z]){X(_paq[z])}}_paq=new B();return ag}ae(N,"beforeunload",Z,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ai,ah,ag,af){var aj=typeof af;if(aj==="undefined"){af=false}ae(ai,ah,ag,af)},onLoad:j,onReady:m},on:function(ag,af){if(!t[ag]){t[ag]=[]}t[ag].push(af)},off:function(ah,ag){if(!t[ah]){return}var af=0;for(af;af Date: Thu, 15 Dec 2016 14:53:40 +0000 Subject: [PATCH 2/5] fix some tests --- tests/javascript/index.php | 118 ++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/tests/javascript/index.php b/tests/javascript/index.php index 3cc05b286ed..bf8ad3e2c26 100644 --- a/tests/javascript/index.php +++ b/tests/javascript/index.php @@ -508,95 +508,95 @@ function getLineCountJsLintStarted($src,$contentRemovedFromPos) { var tracker = Piwik.getTracker(), dummy; - equal( typeof JSON2.stringify, 'function', 'JSON.stringify function' ); - equal( typeof JSON2.stringify(dummy), 'undefined', 'undefined' ); + equal( typeof JSON_PIWIK.stringify, 'function', 'JSON.stringify function' ); + equal( typeof JSON_PIWIK.stringify(dummy), 'undefined', 'undefined' ); - equal( JSON2.stringify(null), 'null', 'null' ); - equal( JSON2.stringify(true), 'true', 'true' ); - equal( JSON2.stringify(false), 'false', 'false' ); - ok( JSON2.stringify(0) === '0', 'Number 0' ); - ok( JSON2.stringify(1) === '1', 'Number 1' ); - ok( JSON2.stringify(-1) === '-1', 'Number -1' ); - ok( JSON2.stringify(42) === '42', 'Number 42' ); + equal( JSON_PIWIK.stringify(null), 'null', 'null' ); + equal( JSON_PIWIK.stringify(true), 'true', 'true' ); + equal( JSON_PIWIK.stringify(false), 'false', 'false' ); + ok( JSON_PIWIK.stringify(0) === '0', 'Number 0' ); + ok( JSON_PIWIK.stringify(1) === '1', 'Number 1' ); + ok( JSON_PIWIK.stringify(-1) === '-1', 'Number -1' ); + ok( JSON_PIWIK.stringify(42) === '42', 'Number 42' ); - ok( JSON2.stringify(1.0) === '1.0' - || JSON2.stringify(1.0) === '1', 'float 1.0' ); + ok( JSON_PIWIK.stringify(1.0) === '1.0' + || JSON_PIWIK.stringify(1.0) === '1', 'float 1.0' ); - equal( JSON2.stringify(1.1), '1.1', 'float 1.1' ); - equal( JSON2.stringify(""), '""', 'empty string' ); - equal( JSON2.stringify('"'), '"' + '\\' + '"' + '"', 'string "' ); - equal( JSON2.stringify('\\'), '"' + '\\\\' + '"', 'string \\' ); + equal( JSON_PIWIK.stringify(1.1), '1.1', 'float 1.1' ); + equal( JSON_PIWIK.stringify(""), '""', 'empty string' ); + equal( JSON_PIWIK.stringify('"'), '"' + '\\' + '"' + '"', 'string "' ); + equal( JSON_PIWIK.stringify('\\'), '"' + '\\\\' + '"', 'string \\' ); - equal( JSON2.stringify("1"), '"1"', 'string "1"' ); - equal( JSON2.stringify("ABC"), '"ABC"', 'string ABC' ); - equal( JSON2.stringify("\x40\x41\x42\x43"), '"@ABC"', '\\x hex string @ABC' ); + equal( JSON_PIWIK.stringify("1"), '"1"', 'string "1"' ); + equal( JSON_PIWIK.stringify("ABC"), '"ABC"', 'string ABC' ); + equal( JSON_PIWIK.stringify("\x40\x41\x42\x43"), '"@ABC"', '\\x hex string @ABC' ); - ok( JSON2.stringify("\u60a8\u597d") == '"您好"' - || JSON2.stringify("\u60a8\u597d") == '"\\u60a8\\u597d"', '\\u Unicode string 您好' ); + ok( JSON_PIWIK.stringify("\u60a8\u597d") == '"您好"' + || JSON_PIWIK.stringify("\u60a8\u597d") == '"\\u60a8\\u597d"', '\\u Unicode string 您好' ); - ok( JSON2.stringify("ßéàêö您好") == '"ßéàêö您好"' - || JSON2.stringify("ßéàêö您好") == '"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"', 'string non-ASCII text' ); + ok( JSON_PIWIK.stringify("ßéàêö您好") == '"ßéàêö您好"' + || JSON_PIWIK.stringify("ßéàêö您好") == '"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"', 'string non-ASCII text' ); - equal( JSON2.stringify("20060228T08:00:00"), '"20060228T08:00:00"', 'string "20060228T08:00:00"' ); + equal( JSON_PIWIK.stringify("20060228T08:00:00"), '"20060228T08:00:00"', 'string "20060228T08:00:00"' ); var d = new Date(); d.setTime(1240013340000); - ok( JSON2.stringify(d) === '"2009-04-18T00:09:00Z"' - || JSON2.stringify(d) === '"2009-04-18T00:09:00.000Z"', 'Date'); + ok( JSON_PIWIK.stringify(d) === '"2009-04-18T00:09:00Z"' + || JSON_PIWIK.stringify(d) === '"2009-04-18T00:09:00.000Z"', 'Date'); - equal( JSON2.stringify([1, 2, 3]), '[1,2,3]', 'Array of numbers' ); - equal( JSON2.stringify({'key' : 'value'}), '{"key":"value"}', 'Object (members)' ); - equal( JSON2.stringify( + equal( JSON_PIWIK.stringify([1, 2, 3]), '[1,2,3]', 'Array of numbers' ); + equal( JSON_PIWIK.stringify({'key' : 'value'}), '{"key":"value"}', 'Object (members)' ); + equal( JSON_PIWIK.stringify( [ {'domains' : ['example.com', 'example.ca']}, {'names' : ['Sean', 'Cathy'] } ] ), '[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]', 'Nested members' ); equal( typeof eval('('+dummy+')'), 'undefined', 'eval undefined' ); - equal( typeof JSON2.parse, 'function', 'JSON.parse function' ); + equal( typeof JSON_PIWIK.parse, 'function', 'JSON.parse function' ); // these throw a SyntaxError -// equal( typeof JSON2.parse('undefined'), 'undefined', 'undefined' ); -// equal( typeof JSON2.parse(dummy), 'undefined', 'undefined' ); -// equal( JSON2.parse('undefined'), dummy, 'undefined' ); -// equal( JSON2.parse('undefined'), undefined, 'undefined' ); +// equal( typeof JSON_PIWIK.parse('undefined'), 'undefined', 'undefined' ); +// equal( typeof JSON_PIWIK.parse(dummy), 'undefined', 'undefined' ); +// equal( JSON_PIWIK.parse('undefined'), dummy, 'undefined' ); +// equal( JSON_PIWIK.parse('undefined'), undefined, 'undefined' ); - strictEqual( JSON2.parse('null'), null, 'null' ); - strictEqual( JSON2.parse('true'), true, 'true' ); - strictEqual( JSON2.parse('false'), false, 'false' ); + strictEqual( JSON_PIWIK.parse('null'), null, 'null' ); + strictEqual( JSON_PIWIK.parse('true'), true, 'true' ); + strictEqual( JSON_PIWIK.parse('false'), false, 'false' ); - equal( JSON2.parse('0'), 0, 'Number 0' ); - equal( JSON2.parse('1'), 1, 'Number 1' ); - equal( JSON2.parse('-1'), -1, 'Number -1' ); - equal( JSON2.parse('42'), 42, 'Number 42' ); + equal( JSON_PIWIK.parse('0'), 0, 'Number 0' ); + equal( JSON_PIWIK.parse('1'), 1, 'Number 1' ); + equal( JSON_PIWIK.parse('-1'), -1, 'Number -1' ); + equal( JSON_PIWIK.parse('42'), 42, 'Number 42' ); - ok( JSON2.parse('1.0') === 1.0 - || JSON2.parse('1.0') === 1, 'float 1.0' ); + ok( JSON_PIWIK.parse('1.0') === 1.0 + || JSON_PIWIK.parse('1.0') === 1, 'float 1.0' ); - equal( JSON2.parse('1.1'), 1.1, 'float 1.1' ); - equal( JSON2.parse('""'), "", 'empty string' ); - equal( JSON2.parse('"' + '\\' + '"' + '"'), '"', 'string "' ); - equal( JSON2.parse('"\\\\"'), '\\', 'string \\' ); + equal( JSON_PIWIK.parse('1.1'), 1.1, 'float 1.1' ); + equal( JSON_PIWIK.parse('""'), "", 'empty string' ); + equal( JSON_PIWIK.parse('"' + '\\' + '"' + '"'), '"', 'string "' ); + equal( JSON_PIWIK.parse('"\\\\"'), '\\', 'string \\' ); - equal( JSON2.parse('"1"'), "1", 'string "1"' ); - equal( JSON2.parse('"ABC"'), "ABC", 'string ABC' ); - equal( JSON2.parse('"@ABC"'), "\x40\x41\x42\x43", 'Hex string @ABC' ); + equal( JSON_PIWIK.parse('"1"'), "1", 'string "1"' ); + equal( JSON_PIWIK.parse('"ABC"'), "ABC", 'string ABC' ); + equal( JSON_PIWIK.parse('"@ABC"'), "\x40\x41\x42\x43", 'Hex string @ABC' ); - ok( JSON2.parse('"您好"') == "\u60a8\u597d" - && JSON2.parse('"\\u60a8\\u597d"') == "您好", 'Unicode string 您好' ); + ok( JSON_PIWIK.parse('"您好"') == "\u60a8\u597d" + && JSON_PIWIK.parse('"\\u60a8\\u597d"') == "您好", 'Unicode string 您好' ); - ok( JSON2.parse('"ßéàêö您好"') == "ßéàêö您好" - && JSON2.parse('"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"') == "ßéàêö您好", 'string non-ASCII text' ); + ok( JSON_PIWIK.parse('"ßéàêö您好"') == "ßéàêö您好" + && JSON_PIWIK.parse('"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"') == "ßéàêö您好", 'string non-ASCII text' ); - equal( JSON2.parse('"20060228T08:00:00"'), "20060228T08:00:00", 'string "20060228T08:00:00"' ); + equal( JSON_PIWIK.parse('"20060228T08:00:00"'), "20060228T08:00:00", 'string "20060228T08:00:00"' ); // these aren't converted back to Date objects - equal( JSON2.parse('"2009-04-18T00:09:00Z"'), "2009-04-18T00:09:00Z", 'string "2009-04-18T00:09:00Z"' ); - equal( JSON2.parse('"2009-04-18T00:09:00.000Z"'), "2009-04-18T00:09:00.000Z", 'string "2009-04-18T00:09:00.000Z"' ); + equal( JSON_PIWIK.parse('"2009-04-18T00:09:00Z"'), "2009-04-18T00:09:00Z", 'string "2009-04-18T00:09:00Z"' ); + equal( JSON_PIWIK.parse('"2009-04-18T00:09:00.000Z"'), "2009-04-18T00:09:00.000Z", 'string "2009-04-18T00:09:00.000Z"' ); - deepEqual( JSON2.parse('[1,2,3]'), [1, 2, 3], 'Array of numbers' ); - deepEqual( JSON2.parse('{"key":"value"}'), {'key' : 'value'}, 'Object (members)' ); - deepEqual( JSON2.parse('[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]'), + deepEqual( JSON_PIWIK.parse('[1,2,3]'), [1, 2, 3], 'Array of numbers' ); + deepEqual( JSON_PIWIK.parse('{"key":"value"}'), {'key' : 'value'}, 'Object (members)' ); + deepEqual( JSON_PIWIK.parse('[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]'), [ {'domains' : ['example.com', 'example.ca']}, {'names' : ['Sean', 'Cathy'] } ], 'Nested members' ); }); From a45c9bba1d099a503211a33396e8949d2dbda1e2 Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Thu, 15 Dec 2016 14:55:41 +0000 Subject: [PATCH 3/5] fix json lint tests --- js/piwik.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/piwik.js b/js/piwik.js index 15daccfe4d2..56dfa28f6ec 100644 --- a/js/piwik.js +++ b/js/piwik.js @@ -1031,7 +1031,7 @@ if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window. /*members push */ /*global Piwik:true */ /*members addPlugin, getTracker, getAsyncTracker, getAsyncTrackers, addTracker, trigger, on, off, retryMissedPluginCalls, - DOM, onLoad, onReady*/ + DOM, onLoad, onReady, JSON */ /*global Piwik_Overlay_Client */ /*global AnalyticsTracker:true */ /*members initialize */ From ad4f73fdfa7d3622c60fe100954c943b8dd507dd Mon Sep 17 00:00:00 2001 From: mattab Date: Sun, 18 Dec 2016 23:30:48 +1300 Subject: [PATCH 4/5] Display titles correctly in API reference doc --- core/API/DocumentationGenerator.php | 28 ++++++++++++++++++++++------ plugins/API/Controller.php | 2 +- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/API/DocumentationGenerator.php b/core/API/DocumentationGenerator.php index e738c6c4c86..7c33f2ddb28 100644 --- a/core/API/DocumentationGenerator.php +++ b/core/API/DocumentationGenerator.php @@ -48,9 +48,10 @@ public function __construct() * * @param bool $outputExampleUrls * @param string $prefixUrls + * @param bool $displayTitlesAsAngularDirective Set to false for the API ref doc at http://developer.piwik.org/api-reference/reporting-api where we need to display titles without using AngularJS * @return string */ - public function getAllInterfaceString($outputExampleUrls = true, $prefixUrls = '') + public function getAllInterfaceString($outputExampleUrls = true, $prefixUrls = '', $displayTitlesAsAngularDirective = true) { if (!empty($prefixUrls)) { $prefixUrls = 'http://demo.piwik.org/'; @@ -86,13 +87,19 @@ public function getAllInterfaceString($outputExampleUrls = true, $prefixUrls = ' foreach ($toDisplay as $moduleName => $methods) { $toc .= $this->prepareModuleToDisplay($moduleName); - $str .= $this->prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls); + $str .= $this->prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective); } } - $str = "
+ if($displayTitlesAsAngularDirective) { + $str = "
$toc
$str"; + } else { + $str = "

Quick access to APIs

+ $toc + $str"; + } return $str; } @@ -102,10 +109,15 @@ public function prepareModuleToDisplay($moduleName) return "$moduleName
"; } - public function prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls) + public function prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective) { $str = ''; - $str .= "\n
"; + $str .= "\n"; + if($displayTitlesAsAngularDirective) { + $str .= "
"; + } else { + $str .= "

Module " . $moduleName . "

"; + } $info['__documentation'] = $this->checkDocumentation($info['__documentation']); $str .= "
" . $info['__documentation'] . "
"; foreach ($methods as $methodName) { @@ -124,7 +136,11 @@ public function prepareMethodToDisplay($moduleName, $info, $methods, $class, $ou $str .= "
\n"; } - return $str . "
"; + if($displayTitlesAsAngularDirective) { + $str .= "
"; + } + + return $str; } public function prepareModulesAndMethods($info, $moduleName) diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php index e7ef5efd365..606abe3f4aa 100644 --- a/plugins/API/Controller.php +++ b/plugins/API/Controller.php @@ -49,7 +49,7 @@ function index() public function listAllMethods() { $ApiDocumentation = new DocumentationGenerator(); - return $ApiDocumentation->getAllInterfaceString($outputExampleUrls = true, $prefixUrls = Common::getRequestVar('prefixUrl', '')); + return $ApiDocumentation->getAllInterfaceString($outputExampleUrls = true, $prefixUrls = Common::getRequestVar('prefixUrl', ''), $displayTitlesAsAngularDirective = false); } public function listAllAPI() From dae9b48cbbdf97044b8af8df555ef1f067657d7b Mon Sep 17 00:00:00 2001 From: mattab Date: Mon, 19 Dec 2016 09:51:37 +1300 Subject: [PATCH 5/5] Slightly better code --- core/API/DocumentationGenerator.php | 195 ++++++++++------------------ plugins/API/Controller.php | 5 +- 2 files changed, 71 insertions(+), 129 deletions(-) diff --git a/core/API/DocumentationGenerator.php b/core/API/DocumentationGenerator.php index 7c33f2ddb28..990d2321632 100644 --- a/core/API/DocumentationGenerator.php +++ b/core/API/DocumentationGenerator.php @@ -43,73 +43,41 @@ public function __construct() /** * Returns a HTML page containing help for all the successfully loaded APIs. - * For each module it will return a mini help with the method names, parameters to give, - * links to get the result in Xml/Csv/etc * * @param bool $outputExampleUrls - * @param string $prefixUrls - * @param bool $displayTitlesAsAngularDirective Set to false for the API ref doc at http://developer.piwik.org/api-reference/reporting-api where we need to display titles without using AngularJS * @return string */ - public function getAllInterfaceString($outputExampleUrls = true, $prefixUrls = '', $displayTitlesAsAngularDirective = true) + public function getApiDocumentationAsString($outputExampleUrls = true) { - if (!empty($prefixUrls)) { - $prefixUrls = 'http://demo.piwik.org/'; - } - - $str = $toc = ''; - - foreach (Proxy::getInstance()->getMetadata() as $class => $info) { - $moduleName = Proxy::getInstance()->getModuleNameFromClassName($class); - $rClass = new ReflectionClass($class); + list($toc, $str) = $this->generateDocumentation($outputExampleUrls, $prefixUrls = '', $displayTitlesAsAngularDirective = true); - if (!Piwik::hasUserSuperUserAccess() && $this->checkIfClassCommentContainsHideAnnotation($rClass)) { - continue; - } - - if ($this->checkIfCommentContainsInternalAnnotation($rClass)) { - continue; - } - - $toDisplay = $this->prepareModulesAndMethods($info, $moduleName); - - foreach ($toDisplay as $moduleName => $methods) { - foreach ($methods as $index => $method) { - $reflectionMethod = new \ReflectionMethod($class, $method); - if ($this->checkIfCommentContainsInternalAnnotation($reflectionMethod)) { - unset($toDisplay[$moduleName][$index]); - } - } - if (empty($toDisplay[$moduleName])) { - unset($toDisplay[$moduleName]); - } - } - - foreach ($toDisplay as $moduleName => $methods) { - $toc .= $this->prepareModuleToDisplay($moduleName); - $str .= $this->prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective); - } - } - - if($displayTitlesAsAngularDirective) { - $str = "
+ return "
$toc
$str"; - } else { - $str = "

Quick access to APIs

+ } + + /** + * Used on developer.piwik.org + * + * @param bool|true $outputExampleUrls + * @param string $prefixUrls + * @return string + */ + public function getApiDocumentationAsStringForDeveloperReference($outputExampleUrls = true, $prefixUrls = '') + { + list($toc, $str) = $this->generateDocumentation($outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective = false); + + return "

Quick access to APIs

$toc $str"; - } - - return $str; } - public function prepareModuleToDisplay($moduleName) + protected function prepareModuleToDisplay($moduleName) { return "$moduleName
"; } - public function prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective) + protected function prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective) { $str = ''; $str .= "\n"; @@ -143,7 +111,7 @@ public function prepareMethodToDisplay($moduleName, $info, $methods, $class, $ou return $str; } - public function prepareModulesAndMethods($info, $moduleName) + protected function prepareModulesAndMethods($info, $moduleName) { $toDisplay = array(); @@ -157,7 +125,7 @@ public function prepareModulesAndMethods($info, $moduleName) return $toDisplay; } - public function addExamples($class, $methodName, $prefixUrls) + protected function addExamples($class, $methodName, $prefixUrls) { $token_auth = "&token_auth=" . Piwik::getCurrentUserTokenAuth(); $parametersToSet = array( @@ -166,7 +134,6 @@ public function addExamples($class, $methodName, $prefixUrls) 'date' => Common::getRequestVar('date', 'today', 'string') ); $str = ''; -// used when we include this output in the Piwik official documentation for example $str .= ""; $exampleUrl = $this->getExampleUrl($class, $methodName, $parametersToSet); if ($exampleUrl !== false) { @@ -225,29 +192,6 @@ public function checkDocumentation($moduleToCheck) return $moduleToCheck; } - private function getInterfaceString($moduleName, $class, $info, $parametersToSet, $outputExampleUrls, $prefixUrls) - { - $str = ''; - - $str .= "\n

Module " . $moduleName . "

"; - $str .= "
" . $info['__documentation'] . "
"; - foreach ($info as $methodName => $infoMethod) { - if ($methodName == '__documentation') { - continue; - } - - if (Proxy::getInstance()->isDeprecatedMethod($class, $methodName)) { - continue; - } - - $str .= $this->getMethodString($moduleName, $class, $parametersToSet, $outputExampleUrls, $prefixUrls, $methodName, $str); - } - - $str .= ''; - - return $str; - } - /** * Returns a string containing links to examples on how to call a given method on a given API * It will export links to XML, CSV, HTML, JSON, PHP, etc. @@ -311,14 +255,6 @@ public function getExampleUrl($class, $methodName, $parametersToSet = array()) // we try to give an URL example to call the API $aParameters = Proxy::getInstance()->getParametersList($class, $methodName); - // Kindly force some known generic parameters to appear in the final list - // the parameter 'format' can be set to all API methods (used in tests) - // the parameter 'hideIdSubDatable' is used for system tests only - // the parameter 'serialize' sets php outputs human readable, used in system tests and debug - // the parameter 'language' sets the language for the response (eg. country names) - // the parameter 'flat' reduces a hierarchical table to a single level by concatenating labels - // the parameter 'include_aggregate_rows' can be set to include inner nodes in flat reports - // the parameter 'translateColumnNames' can be set to translate metric names in csv/tsv exports $aParameters['format'] = false; $aParameters['hideIdSubDatable'] = false; $aParameters['serialize'] = false; @@ -327,15 +263,15 @@ public function getExampleUrl($class, $methodName, $parametersToSet = array()) $aParameters['label'] = false; $aParameters['flat'] = false; $aParameters['include_aggregate_rows'] = false; - $aParameters['filter_offset'] = false; //@review without adding this, I can not set filter_offset in $otherRequestParameters system tests - $aParameters['filter_limit'] = false; //@review without adding this, I can not set filter_limit in $otherRequestParameters system tests - $aParameters['filter_sort_column'] = false; //@review without adding this, I can not set filter_sort_column in $otherRequestParameters system tests - $aParameters['filter_sort_order'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests - $aParameters['filter_excludelowpop'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests - $aParameters['filter_excludelowpop_value'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests - $aParameters['filter_column_recursive'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests - $aParameters['filter_pattern'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests - $aParameters['filter_pattern_recursive'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests + $aParameters['filter_offset'] = false; + $aParameters['filter_limit'] = false; + $aParameters['filter_sort_column'] = false; + $aParameters['filter_sort_order'] = false; + $aParameters['filter_excludelowpop'] = false; + $aParameters['filter_excludelowpop_value'] = false; + $aParameters['filter_column_recursive'] = false; + $aParameters['filter_pattern'] = false; + $aParameters['filter_pattern_recursive'] = false; $aParameters['filter_truncate'] = false; $aParameters['hideColumns'] = false; $aParameters['showColumns'] = false; @@ -370,7 +306,7 @@ public function getExampleUrl($class, $methodName, $parametersToSet = array()) * @param string $name The method name * @return string For example "(idSite, period, date = 'today')" */ - public function getParametersString($class, $name) + protected function getParametersString($class, $name) { $aParameters = Proxy::getInstance()->getParametersList($class, $name); $asParameters = array(); @@ -394,42 +330,47 @@ public function getParametersString($class, $name) return "($sParameters)"; } - private function getMethodString($moduleName, $class, $parametersToSet, $outputExampleUrls, $prefixUrls, $methodName) + /** + * @param $outputExampleUrls + * @param $prefixUrls + * @param $displayTitlesAsAngularDirective + * @return array + */ + protected function generateDocumentation($outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective) { - $str = ''; - $token_auth = "&token_auth=" . Piwik::getCurrentUserTokenAuth(); + $str = $toc = ''; - $params = $this->getParametersString($class, $methodName); - $str .= "\n
- $moduleName.$methodName " . $params . ""; - $str .= ''; - - if ($outputExampleUrls) { - // we prefix all URLs with $prefixUrls - // used when we include this output in the Piwik official documentation for example - $str .= ""; - $exampleUrl = $this->getExampleUrl($class, $methodName, $parametersToSet); - if ($exampleUrl !== false) { - $lastNUrls = ''; - if (preg_match('/(&period)|(&date)/', $exampleUrl)) { - $exampleUrlRss = $prefixUrls . $this->getExampleUrl($class, $methodName, array('date' => 'last10', 'period' => 'day') + $parametersToSet); - $lastNUrls = ", RSS of the last 10 days"; - } - $exampleUrl = $prefixUrls . $exampleUrl; - $str .= " [ Example in - XML, - Json, - Tsv (Excel) - $lastNUrls - ]"; - } else { - $str .= " [ No example available ]"; + foreach (Proxy::getInstance()->getMetadata() as $class => $info) { + $moduleName = Proxy::getInstance()->getModuleNameFromClassName($class); + $rClass = new ReflectionClass($class); + + if (!Piwik::hasUserSuperUserAccess() && $this->checkIfClassCommentContainsHideAnnotation($rClass)) { + continue; } - $str .= ""; - } - $str .= ''; - $str .= "
\n"; + if ($this->checkIfCommentContainsInternalAnnotation($rClass)) { + continue; + } - return $str; + $toDisplay = $this->prepareModulesAndMethods($info, $moduleName); + + foreach ($toDisplay as $moduleName => $methods) { + foreach ($methods as $index => $method) { + $reflectionMethod = new \ReflectionMethod($class, $method); + if ($this->checkIfCommentContainsInternalAnnotation($reflectionMethod)) { + unset($toDisplay[$moduleName][$index]); + } + } + if (empty($toDisplay[$moduleName])) { + unset($toDisplay[$moduleName]); + } + } + + foreach ($toDisplay as $moduleName => $methods) { + $toc .= $this->prepareModuleToDisplay($moduleName); + $str .= $this->prepareMethodToDisplay($moduleName, $info, $methods, $class, $outputExampleUrls, $prefixUrls, $displayTitlesAsAngularDirective); + } + } + return array($toc, $str); } } diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php index 606abe3f4aa..2d107182cb5 100644 --- a/plugins/API/Controller.php +++ b/plugins/API/Controller.php @@ -49,7 +49,8 @@ function index() public function listAllMethods() { $ApiDocumentation = new DocumentationGenerator(); - return $ApiDocumentation->getAllInterfaceString($outputExampleUrls = true, $prefixUrls = Common::getRequestVar('prefixUrl', ''), $displayTitlesAsAngularDirective = false); + $prefixUrls = Common::getRequestVar('prefixUrl', 'http://demo.piwik.org/', 'string'); + return $ApiDocumentation->getApiDocumentationAsStringForDeveloperReference($outputExampleUrls = true, $prefixUrls); } public function listAllAPI() @@ -59,7 +60,7 @@ public function listAllAPI() $ApiDocumentation = new DocumentationGenerator(); $view->countLoadedAPI = Proxy::getInstance()->getCountRegisteredClasses(); - $view->list_api_methods_with_links = $ApiDocumentation->getAllInterfaceString(); + $view->list_api_methods_with_links = $ApiDocumentation->getApiDocumentationAsString(); return $view->render(); }