Adobe Analytics Plug-in – getTimeParting

800px-hoarding_living_room

Kdo někdy migroval ze s_code.js na AppMeasurement.js (to byla spíš řečnická otázka, v ČR to budou max tak dva, tři lidi), tak jistě přišel na to, že největší peklo jsou staré pluginy. A zpětná kompatibilita, aby byla zachována kontinuita dat, je pro klienta důležitá. Nové pluginy buď nejsou, nebo nejsou kompatibilní, nebo přestaly fungovat. Takže co?

Napíšem si je samy. Nebo? Přepíšem ty staré!

getTimeParting SiteCatalyst Plug-in.

http://webanalyticsland.com/sitecatalyst-plugins/gettimeparting

Býval to pěkný plugin, ze kterého lezly agregované informace o tom, ve které hodiny člověk na web chodí, v jaké dny a zda dny jsou pracovní, či nepracovní. Plugin v roce 2009 napsali klucí z WebAnalyticsLand, mnoho lidí jej začalo používat a pak se na něj vyprdli. Plugin přestal fungovat k roku 2014. Škoda, že s_code.js v legacy verzi běží podporovaný dodnes a nemálo webů jej stále používá.

Originál

s.prop1=s.getTimeParting('h','+1');
s.prop2=s.getTimeParting('d','+1');
s.prop3=s.getTimeParting('w','+1');

/*
 * Plugin: getTimeParting 3.0 - Set timeparting values based on time zone - valid through 2014 
 */
s.getTimeParting=new Function("t","z",""
+"var s=this,d,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;d=new Date();A"
+"=d.getFullYear();if(A=='2009'){B='08';C='01'}if(A=='2010'){B='14';C"
+"='07'}if(A=='2011'){B='13';C='06'}if(A=='2012'){B='11';C='04'}if(A="
+"='2013'){B='10';C='03'}if(A=='2014'){B='09';C='02'}if(!B||!C){B='08"
+"';C='01'}B='03/'+B+'/'+A;C='11/'+C+'/'+A;D=new Date('1/1/2000');if("
+"D.getDay()!=6||D.getMonth()!=0){return'Data Not Available'}else{z=p"
+"arseFloat(z);E=new Date(B);F=new Date(C);G=F;H=new Date();if(H>E&&H"
+"<G){z=z+1}else{z=z};I=H.getTime()+(H.getTimezoneOffset()*60000);J=n"
+"ew Date(I+(3600000*z));K=['Sunday','Monday','Tuesday','Wednesday','"
+"Thursday','Friday','Saturday'];L=J.getHours();M=J.getMinutes();N=J."
+"getDay();O=K[N];P='AM';Q='Weekday';R='00';if(M>30){R='30'}if(L>=12)"
+"{P='PM';L=L-12};if(L==0){L=12};if(N==6||N==0){Q='Weekend'}T=L+':'+R"
+"+P;if(t=='h'){return T}if(t=='d'){return O}if(t=='w'){return Q}}");

Moderní verze 3.4

https://marketing.adobe.com/resources/help/en_US/sc/implement/getTimeParting.html

Pak přišlo Adobe s úplně novým trackerem jménem AppMeasurement a pochlapili se a tento plugin vzali i mezi podporované pluginy. Navíc jej oficiálně povýšili na verzi 3.4. Pech je v tom, že s původní verzí není ani prd kompatibilní. Asi jako když do disketové mechaniky strkáte CD.

Má to pěkné JavaScriptové objekty, které nastavují začátek a konec letního času. Ve verzi 3.0 jsou indexy číslovány od 0, ve verzi 3.4 od 1, aby v tom byl pořádek.

//Europe
s._tpDST = {
2012:'3/25,10/28',
2013:'3/31,10/27',
2014:'3/30,10/26',
2015:'3/29,10/25',
2016:'3/27,10/30',
2017:'3/26,10/29',
2018:'3/25,10/28',
2019:'3/31,10/27'}

Plugin má naštěstí úplně jiný formát výstupu a počítá se s tím, že si vše poladíte backendovými pravidly, takže na zpětnou kompatibilitu klidně zapomeňtě. 8:31 AM|Monday vs 8:30 ; Monday ; Weekday

    /*
     * Plugin: getTimeParting 3.4
     */
    s.getTimeParting=new Function("h","z",""
    +"var s=this,od;od=new Date('1/1/2000');if(od.getDay()!=6||od.getMont"
    +"h()!=0){return'Data Not Available';}else{var H,M,D,U,ds,de,tm,da=['"
    +"Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturda"
    +"y'],d=new Date();z=z?z:0;z=parseFloat(z);if(s._tpDST){var dso=s._tp"
    +"DST[d.getFullYear()].split(/,/);ds=new Date(dso[0]+'/'+d.getFullYea"
    +"r());de=new Date(dso[1]+'/'+d.getFullYear());if(h=='n'&&d>ds&&d<de)"
    +"{z=z+1;}else if(h=='s'&&(d>de||d<ds)){z=z+1;}}d=d.getTime()+(d.getT"
    +"imezoneOffset()*60000);d=new Date(d+(3600000*z));H=d.getHours();M=d"
    +".getMinutes();M=(M<10)?'0'+M:M;D=d.getDay();U=' AM';if(H>=12){U=' P"
    +"M';H=H-12;}if(H==0){H=12;}D=da[D];tm=H+':'+M+U;return(tm+'|'+D);}");

Pro nové implementace super, pro staré trága.

Staronová od tuňáka

Verze 3.0 (ta stará) s novými datovými rozsahy (až do roku 2025, pak už doufám nikdo nebude používat staré pluginy a jestli jo, tak čerť Tě vem).

s.getTimeParting= new Function("a","b","var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,x;return d=new Date,e=d.getFullYear()"+
",'2016'==e&&(f='27',g='30'),'2017'==e&&(f='26',g='29'),'2018'==e&&(f='25',g='28'),'2019'==e&&(f='31',g='27'),'2020'"+
"==e&&(f='29',g='25'),'2021'==e&&(f='28',g='31'),'2022'==e&&(f='27',g='30'),'2023'==e&&(f='26',g='29'),'2024'==e&&(f='3"+
"1',g='27'),f&&g||(f='30',g='26'),f='03/'+f+'/'+e,g='11/'+g+'/'+e,h=new Date('1/1/2000'),6!=h.getDay()||0!=h.getMonth()?'"+
"Data Not Available':(b=parseFloat(b),i=new Date(f),j=new Date(g),k=j,l=new Date,l>i&&l<k?b+=1:b=b,m=l.getTime()+6e4*l.getTimezoneOffset(),"+
"n=new Date(m+36e5*b),o=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],p=n.getHours(),q=n.getMinutes(),"+
"r=n.getDay(),s=o[r],t='AM',u='Weekday',v='00',q>30&&(v='30'),p>=12&&(t='PM',p-=12),0==p&&(p=12),6!=r&&0!=r||(u='Weekend'),x=p+':'+v+t,'h'==a?x:'d'==a?s:'w'==a?u:void 0)";

Ok, není tak krásně slisovaná, jako ta původní, ale je to tím, že jsem jí nejdříve deobfuscoval.

s.getTimeParting = function(t, z) {
    var s = this,
        d, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T;
    d = new Date();
    A = d.getFullYear();

    if (A == '2016') {
        B = '27';
        C = '30'
    }
    if (A == '2017') {
        B = '26';
        C = '29'
    }
    if (A == '2018') {
        B = '25';
        C = '28'
    }
    if (A == '2019') {
        B = '31';
        C = '27'
    }
    if (A == '2020') {
        B = '29';
        C = '25'
    }
    if (A == '2021') {
        B = '28';
        C = '31'
    }
    if (A == '2022') {
        B = '27';
        C = '30'
    }
    if (A == '2023') {
        B = '26';
        C = '29'
    }
    if (A == '2024') {
        B = '31';
        C = '27'
    }
    if (!B || !C) {
        B = '30';
        C = '26'
    }   

    B = '03/' + B + '/' + A;
    C = '11/' + C + '/' + A;

    D = new Date('1/1/2000');
    if (D.getDay() != 6 || D.getMonth() != 0) {
        return 'Data Not Available'
    } else {
        z = parseFloat(z);
        E = new Date(B);
        F = new Date(C);
        G = F;
        H = new Date();
        if (H > E && H < G) {
            z = z + 1
        } else {
            z = z
        };
        I = H.getTime() + (H.getTimezoneOffset() * 60000);
        J = new Date(I + (3600000 * z));
        K = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
        L = J.getHours();
        M = J.getMinutes();
        N = J.getDay();
        O = K[N];
        P = 'AM';
        Q = 'Weekday';
        R = '00';
        if (M > 30) {
            R = '30'
        }
        if (L >= 12) {
            P = 'PM';
            L = L - 12
        };
        if (L == 0) {
            L = 12
        };
        if (N == 6 || N == 0) {
            Q = 'Weekend'
        }
        T = L + ':' + R + P;
        if (t == 'h') {
            return T
        }
        if (t == 'd') {
            return O
        }
        if (t == 'w') {
            return Q
        }
    };
}

Přepsal a zase složil a to celkem ručně bez nějakých Über-sofistikovaných tools, jen s hrnkem kafe a se špejlema v oku.

Pro lenochy co nechtějí psát z konstruktoru self-instantiating function lze udělat toto:

s.GetTimeParting=function(a,b){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,x;return d=new Date,e=d.getFullYear(),'2016'==e&&(f='27',g='30'),'2017'==e&&(f='26',g='29'),'2018'==e&&(f='25',g='28'),'2019'==e&&(f='31',g='27'),'2020'==e&&(f='29',g='25'),'2021'==e&&(f='28',g='31'),'2022'==e&&(f='27',g='30'),'2023'==e&&(f='26',g='29'),'2024'==e&&(f='31',g='27'),f&&g||(f='30',g='26'),f='03/'+f+'/'+e,g='11/'+g+'/'+e,h=new Date('1/1/2000'),6!=h.getDay()||0!=h.getMonth()?'Data Not Available':(b=parseFloat(b),i=new Date(f),j=new Date(g),k=j,l=new Date,l>i&&l<k?b+=1:b=b,m=l.getTime()+6e4*l.getTimezoneOffset(),n=new Date(m+36e5*b),o=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],p=n.getHours(),q=n.getMinutes(),r=n.getDay(),s=o[r],t='AM',u='Weekday',v='00',q>30&&(v='30'),p>=12&&(t='PM',p-=12),0==p&&(p=12),6!=r&&0!=r||(u='Weekend'),x=p+':'+v+t,'h'==a?x:'d'==a?s:'w'==a?u:void 0)};
s.getTimeParting = new s.GetTimeParting();

Tradáá, a máme to. Vlk se nažral a koza zůstala celá.