<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Metrics &amp; Methods</title>
	
	<link>http://metricsandmethods.com</link>
	<description>Trials and Tribulations in the Wild World of Web Analytics</description>
	<lastBuildDate>Fri, 09 Nov 2012 22:52:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/metricsandmethods" /><feedburner:info uri="metricsandmethods" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>A Case for Video Tracking</title>
		<link>http://feedproxy.google.com/~r/metricsandmethods/~3/_XtEru571IU/a-case-for-video-tracking</link>
		<comments>http://metricsandmethods.com/a-case-for-video-tracking#comments</comments>
		<pubDate>Fri, 09 Nov 2012 22:41:45 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[SiteCatalyst]]></category>

		<guid isPermaLink="false">http://metricsandmethods.com/?p=256</guid>
		<description><![CDATA[I&#8217;ve implemented Omniture video tracking across numerous sites, utilizing multiple player JavaScript APIs. To make this a bit easier, I typically use a switch statement similar to the following. videoTracking.trackEvent = function (action, data) { l = data.videoLength; n = data.videoName; p = data.playerName; t = data.videoTime; switch (action) { case 'open' s.Media.open(n, l, p); s.Media.play(n, t); [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve implemented Omniture video tracking across numerous sites, utilizing multiple player JavaScript APIs. To make this a bit easier, I typically use a switch statement similar to the following.</p>
<pre class="brush: js; ruler: true; wrap-lines: false">

videoTracking.trackEvent = function (action, data) {

	l = data.videoLength;
	n = data.videoName;
	p = data.playerName;
	t = data.videoTime;
	
	switch (action) {
		case 'open'
			s.Media.open(n, l, p);
			s.Media.play(n, t);
			break;
		case 'play':
			s.Media.play(n, t);
			break;
		case 'stop':
			s.Media.stop(n, t);
			break;
		case 'complete':
			s.Media.stop(n, t);
			s.Media.close(n);
			break;
	}
	
};
</pre>
<p>You will need to get well acquainted with the player API, particularly with the event listeners and the data object passed by said listeners. With so many variations between these APIs, the data.variables should only be considered an examples.</p>
<img src="http://feeds.feedburner.com/~r/metricsandmethods/~4/_XtEru571IU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://metricsandmethods.com/a-case-for-video-tracking/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://metricsandmethods.com/a-case-for-video-tracking</feedburner:origLink></item>
		<item>
		<title>How I Learned to Stop Worrying and Love the Tag Managers</title>
		<link>http://feedproxy.google.com/~r/metricsandmethods/~3/JZtvO7XvHOI/how-i-learned-to-stop-worrying-and-love-the-tag-managers</link>
		<comments>http://metricsandmethods.com/how-i-learned-to-stop-worrying-and-love-the-tag-managers#comments</comments>
		<pubDate>Fri, 02 Nov 2012 03:07:26 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Implementation]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tag Managers]]></category>

		<guid isPermaLink="false">http://metricsandmethods.com/?p=227</guid>
		<description><![CDATA[The Five Stages of Tag Management Most enterprise developers go through five stages when they find out marketing plans to start using a tag manager. Denial (Usually manifesting as maniacal laughter) Anger (Listen for shouting about site stability) Bargaining (Promises to be more responsive to marketing requests) Depression (Weeping about the site&#8217;s pending doom) Acceptance (As in, [...]]]></description>
			<content:encoded><![CDATA[<h1>The Five Stages of Tag Management</h1>
<p>Most enterprise developers go through five stages when they find out marketing plans to start using a tag manager.</p>
<ul>
<li><strong>Denial</strong> (Usually manifesting as maniacal laughter)</li>
<li><strong>Anger</strong> (Listen for shouting about site stability)</li>
<li><strong>Bargaining</strong> (Promises to be more responsive to marketing requests)</li>
<li><strong>Depression </strong>(Weeping about the site&#8217;s pending doom)</li>
<li><strong>Acceptance </strong>(As in, I accept I&#8217;ll have to blame any and all site issues on the tag manager)</li>
</ul>
<h1>Preparing for the Onslaught</h1>
<p>While development objections may come across as typical stonewalling, they are not without legitimate reason. Luckily, many of these objections are quite predictable. As such, there are simple steps we can take to prepare for them.</p>
<h3>Make Them an Offer They Cannot Refuse</h3>
<p>First and foremost, frame the tag manager as making life easier on the developers. The syntax for the varying analytics tools is nothing short of horrible. Consider the example below, where a simple purchase is tracked in Omniture &amp; Double Click.</p>
<pre class="brush: js; ruler: true; first-line: 1; wrap-lines: false">s.products=";xyz1234;2;20;event1=5.00|event2=10;eVar1=nextdayair|eVar2=expedite,;abc3412;1;100;event1=10;eVar1=ground";

https://gan.doubleclick.net/gan_conversion?advid=K123456&#038;event_type=transaction&#038;oid=7890&#038;amt=145.00&#038;fxsrc=USD&#038;prdsku=xyz1234%5Eabc3412&#038;prdqn=2%5E1&#038;prdpr=20.00%5E100.00&#038;clickid=11234312324234523</pre>
<p>Rather than have the developers struggle with this syntax, they set a human readable JavaScript object similar to the following.</p>
<pre class="brush: js; ruler: true; first-line: 1; wrap-lines: false">var trackData = {
    "products" : {
        "product1" : {
            "sku" : "xyz1234",
            "units" : 2,
            "price" : 20.00,
            "shippingCost" : 5.00,
            "shippingMethod" : "nextdayair",
            "orderOption" : "expedite",
            "orderOptionPrice" : 10.00
        },
        "product2" : {
            "sku" : "abc3412",
            "units" : 1,
            "price" : 100.00,
            "shippingCost" : 10.00,
            "shippingMethod" : "ground"
        }
    }
};</pre>
<p>After the developers deploy this relatively simple object, our subject matter expert (discussed later) uses the tag manager to handle the syntax issues.</p>
<h3>Performance Anxiety</h3>
<p>The most common objection is impact of the tag manager on the site. Tag Managers are almost exclusively third part developed and hosted, not allowing developers any visibility. In this case, there are two recommendations.</p>
<ul>
<li>Do you homework, ensure your tag manager relies on more than one cloud provider. You don&#8217;t want to be left explaining why the site broke when Amazon S3 goes down. A 99.9% monthly uptime guarantee still equates to 43 minutes of downtime a month.</li>
<li>Find a developer you can trust and include them in the selection process. There is a developer mentality that spots things the typical human does not. (Also, it never hurts to build some bridges for the post-selection battle.)</li>
</ul>
<h3>Avec Le Grand Pouvoir Vient Le Grand Devoir</h3>
<p>Marketers need to realize, tag managers do not replace the development process. Rather, tag managers move a portion of the development process into marketing. Despite the promotional fluff proclaimed by their sales staff, tag managers still require technical expertise.</p>
<p>Development concepts such as governance, testing and release plans must be enforced.  Decisions must be made on who will provide your technical expertise. This is the subject matter expert, well versed in analytics tools and client side scripting (e.g., JavaScript, jQuery, HTML, CSS).</p>
<p>Developers appreciate good planning, and having these items addressed before moving forward with a tag manager can go a long way.</p>
<h3>Anything You Can Do I Can Do Better</h3>
<p>Many developers cannot stand the concept of buying a tool when one can be built. There are many sides to the build versus buy argument. Ultimately, it comes down to what happens after the tool is built.</p>
<p>The internal developers move on to the next project, while the tag manager provider has dedicated staff addressing issues and making improvements. The supposed cost savings are brushed aside by economies of scale. Unless your company plans on going into the tag management business, can you expect support whenever it is needed?</p>
<h1>Tag Managers are the New Black</h1>
<p>While they are new and exciting, it is appropriate to carefully plan the purchase and implementation of a tag manager. Rushing headlong into a tool which can potentially break your site will not win you any development allies.</p>
<p>Remember the three P&#8217;s.</p>
<ul>
<li>Partner &#8211; Get developer buy-in early.</li>
<li>Prepare &#8211; Do your homework, investigate past the tag manager interface.</li>
<li>Plan &#8211; Who will do the work? What is the release schedule? What kind of testing will take place?</li>
</ul>
<p>Proceed carefully, but deliberately, and you may gain a much needed partner in your development friends.</p>
<img src="http://feeds.feedburner.com/~r/metricsandmethods/~4/JZtvO7XvHOI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://metricsandmethods.com/how-i-learned-to-stop-worrying-and-love-the-tag-managers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://metricsandmethods.com/how-i-learned-to-stop-worrying-and-love-the-tag-managers</feedburner:origLink></item>
		<item>
		<title>Omniture SiteCatalyst Reporting API &amp; Visual Studio .NET</title>
		<link>http://feedproxy.google.com/~r/metricsandmethods/~3/829jXIENQK4/omniture-api-visual-studio-example</link>
		<comments>http://metricsandmethods.com/omniture-api-visual-studio-example#comments</comments>
		<pubDate>Tue, 14 Jun 2011 06:07:55 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Omniture API]]></category>
		<category><![CDATA[SiteCatalyst]]></category>

		<guid isPermaLink="false">http://metricsandmethods.com/?p=164</guid>
		<description><![CDATA[You are in a helicopter. The application below takes my eighteen hours (approximately) of Microsoft C# experience and builds upon Sean Gubler&#8217;s work posted on the Omniture Developer Connection Blog. In lieu of optimal code, I have gone for a verbose example that tries to show the what, why and how. If you: Follow Sean&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<h2>You are in a helicopter.</h2>
<p>The application below takes my eighteen hours (approximately) of Microsoft C# experience and builds upon Sean Gubler&#8217;s work posted on the <a href="https://developer.omniture.com/en_US/blog/getting-started-with-the-omniture-apis-using-visual-studio-2010-wcf"  rel="nofollow" target="_blank">Omniture Developer Connection Blog</a>. In lieu of optimal code, I have gone for a verbose example that tries to show the what, why and how.</p>
<p><strong>If you:</strong></p>
<ul>
<li>Follow Sean&#8217;s instructions</li>
<li>Replace his code example for mine</li>
<p><strong>You should have a fully functional application which, for your top 5 site sections, displays:</strong></p>
<li>Page Views</li>
<li>Visits</li>
<li>Visitors</li>
</ul>
<p>This application was built as a proof of concept, before attempting a <a href="http://en.wikipedia.org/wiki/SQL_Server_Integration_Services" rel="nofollow" target="_blank">SSIS Package</a> which places site section traffic in a SQL Server Database. A few minor changes are required to the code below, but it works quite well as a <a href="http://msdn.microsoft.com/en-us/library/ms137640.aspx" rel="nofollow" target="_blank">Script Component</a>.</p>
<p>The DLLs Sean provides are compiled using .net 4, which does not play nice when building a SSIS Package using <a href="http://msdn.microsoft.com/en-us/library/ms173767(v=SQL.105).aspx" rel="nofollow" target="_blank"> SQL Server 2008 R2 Business Intelligence Development Studio </a>. To overcome this issue, I compiled the DLLs using .net 3.5 and have yet to experience any problems. If you go this route, you may hit a few snags with the DLLs being unsigned or not registered. If you do, drop me a comment and I will relay how I addressed.</p>
<h2>Finally, onto the application.</h2>
<pre class="brush: csharp; ruler: true; first-line: 2; wrap-lines: false">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using Microsoft.ServiceModel.Samples.CustomToken;
using Adobe.OmnitureAPI;

namespace ConsoleAPIExample {
    class Program {
        static void Main(string[] args) {

            //API Parameters
            string strAPIUsername = "[API Username]";
            string strAPIKey = "[API Key]";
            string strAPIUrl = "https://api.omniture.com/admin/1.2/";

            //Report Parameters
            string strDateFrom = "[Date From]";
            string strDateTo = "[Date To]";
            string strRSID = "[RSID]";
            string strMetricId1 = "pageViews";
            string strMetricId2 = "visits";
            string strMetricId3 = "visitorsMonthly";
            string strElementId = "siteSection";
            int intResultsToGet = 5; //kept this at 5 just for debugging purposes
            
            //Output Messages
            string strRequestOut = "";
            string strResponseOut = "";
            string strResultsOut = "";
            string strErrorMsg = "";
            int tokenCount;

            //Used to check status of report
            int intCheckReadyCounter = 0;
            bool blnReportDone = false;

            OmnitureWebServicePortTypeClient client = 
            OmnitureWebServicePortTypeClient.getClient(strAPIUsername, strAPIKey, strAPIUrl);

            //Contains information for creating a report
            reportDescription scReport = new reportDescription();

            //Requesting three metrics and each reportDefinitionMetric identifies one metric
            reportDefinitionMetric scMetric1 = new reportDefinitionMetric();
            reportDefinitionMetric scMetric2 = new reportDefinitionMetric();
            reportDefinitionMetric scMetric3 = new reportDefinitionMetric();

            //A list of reportDefinitionMetrics
            reportDefinitionMetric[] scMetricList = new reportDefinitionMetric[3] {
                scMetric1, scMetric2, scMetric3
            };

            //Using two parameters of one element
            reportDefinitionElement scElement1 = new reportDefinitionElement();
            

            //An array of reportDefinitionElements
            reportDefinitionElement[] scElementList = new reportDefinitionElement[1] {
                scElement1
            };

            //Variables to hold responses for requests
            reportQueueResponse scResponse = new reportQueueResponse(); //response to initial report request
            report_status scReportStatus = new report_status(); //response to status checks
            reportResponse scReportResponse = new reportResponse(); //actual report results

            //Setting the report metrics
            scMetric1.id = strMetricId1;
            scMetric2.id = strMetricId2;
            scMetric3.id = strMetricId3;

            //Setting the parameters of the report element
            scElement1.id = strElementId;
            scElement1.top = intResultsToGet;

            //Setting report description
            scReport.reportSuiteID = strRSID;
            scReport.dateFrom = strDateFrom;
            scReport.dateTo = strDateTo;
            scReport.metrics = scMetricList;
            scReport.elements = scElementList;

            strRequestOut = "Requesting traffic to the top " + intResultsToGet + " ";
            strRequestOut = strRequestOut + "site sections for " + scReport.dateFrom + " ";
            strRequestOut = strRequestOut + "to " + scReport.dateTo + "\r\n\r\n\r\n";
            Console.Write(strRequestOut);

            //Queuing the report via the API
            scResponse = client.ReportQueueRanked(scReport);

            strResponseOut = "Report Request ID: " + scResponse.reportID.ToString() + "\r\n";
            strResponseOut = strResponseOut + "Report Request Status: " + scResponse.status.ToString() + "\r\n";
            strResponseOut = strResponseOut + "Report Request Status Msg: " + scResponse.statusMsg.ToString() + "\r\n\r\n";
            strResponseOut = strResponseOut + "Checking Every 10 Seconds for Report" + "\r\n\r\n\r\n";
            Console.Write(strResponseOut);

            //Timed delay used when checking report status
            while (intCheckReadyCounter &lt; 6 &amp;&amp; !blnReportDone) {
                System.Threading.Thread.Sleep(10000);

                //Checking report status via API
                scReportStatus = client.ReportGetStatus(scResponse.reportID);
                switch (scReportStatus.status.ToString()) {
                case "done":
                    blnReportDone = true;
                    break;
                case "ready":
                    intCheckReadyCounter++;
                    break;
                case "failed":
                default:
                    //Created string in this manner for readibility
                    strErrorMsg = "error returning results--";
                    strErrorMsg = strErrorMsg + "--rprtID--" + scResponse.reportID.ToString();
                    strErrorMsg = strErrorMsg + "--rqst status--" + scResponse.status.ToString();
                    strErrorMsg = strErrorMsg + "--status msg--" + scResponse.statusMsg.ToString();
                    strErrorMsg = strErrorMsg + "--rpt status--" + scReportStatus.status.ToString();
                    strErrorMsg = strErrorMsg + "--err code--" + scReportStatus.error_code.ToString();
                    strErrorMsg = strErrorMsg + "--err msg--" + scReportStatus.error_msg.ToString();
                    throw new InvalidOperationException(strErrorMsg);
                }

            }

            Console.Write("Fetching Results" + "\r\n\r\n\r\n");

            //Fetching the results via the API
            scReportResponse = client.ReportGetReport(scResponse.reportID);

            Console.Write("Section" + "  |  " + "PageViews" + "  |  " + "Visits" + "  |  " + "Visitors" + "\r\n");

            //Output results
            for (int i = 0; i &lt; intResultsToGet; i++) {
                strResultsOut = scReportResponse.report.data[i].name.ToString() + "  |  ";
                strResultsOut = strResultsOut + scReportResponse.report.data[i].counts[0].ToString() + "  |  ";
                strResultsOut = strResultsOut + scReportResponse.report.data[i].counts[1].ToString() + "  |  ";
                strResultsOut = strResultsOut + scReportResponse.report.data[i].counts[2].ToString() + "\r\n";
                Console.Write(strResultsOut);
                strResultsOut = "";
            }

            //Thrown in to watch token usage
            tokenCount = client.CompanyGetTokenCount();

            Console.WriteLine("\r\n\r\n" + "Tokens remaining for the Month:  " + tokenCount + "\r\n\r\n");
            Console.Write("Please Close Window");

            //Pauses the App
            Console.ReadLine();
        }

    }
}</pre>
<img src="http://feeds.feedburner.com/~r/metricsandmethods/~4/829jXIENQK4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://metricsandmethods.com/omniture-api-visual-studio-example/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://metricsandmethods.com/omniture-api-visual-studio-example</feedburner:origLink></item>
		<item>
		<title>A Buffer for Custom Link Tracking</title>
		<link>http://feedproxy.google.com/~r/metricsandmethods/~3/wxdxtj1FOrU/waiting-is-the-hardest-part</link>
		<comments>http://metricsandmethods.com/waiting-is-the-hardest-part#comments</comments>
		<pubDate>Tue, 13 Apr 2010 20:57:57 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Implementation]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[SiteCatalyst]]></category>

		<guid isPermaLink="false">http://metricsandmethods.com/?p=40</guid>
		<description><![CDATA[Waiting for Godot Once upon a time, I faced a situation where a web application relied upon custom link tracking heavily. Unfortunately, the application could send tracking values before the s_code loaded. While I doubt this occurs too often, I think there is value in this example. Such as the future posts I have planned [...]]]></description>
			<content:encoded><![CDATA[<h2>Waiting for Godot</h2>
<p>Once upon a time, I faced a situation where a web application relied upon custom link tracking heavily. Unfortunately, the application could send tracking values before the s_code loaded.</p>
<p>While I doubt this occurs too often, I think there is value in this example.  Such as the future posts I have planned which use this example as a component. Finally, if the code looks a bit odd, its a modified version of the <a onclick=" _gaq.push(['_trackEvent','earlybuffer', 'module_pattern', 'post'])" href="http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth" target="_blank">JavaScript Module Pattern</a>.</p>
<h2>Implementation, Live Example, Example Code:</h2>
<p>Utilizing the tracking buffer is fairly simple, the earlyTracking function can stand alone. However, for an implementation without modifying the earlyTracking function, three things are required.</p>
<ul>
<li>objTrackingVariables and trackData are required</li>
<li>Custom link tracking to be buffered must use trackData()</li>
<li>sendTracking() within trackData() must be configured to send data to Omniture</li>
</ul>
<p><a onclick=" _gaq.push(['_trackEvent','earlybuffer', 'view_example', 'post'])" href="http://metricsandmethods.com/buffertest.html" target="_blank">Try the Example</a> or <a onclick=" _gaq.push(['_trackEvent','earlybuffer', 'view_code', 'post'])" href="http://metricsandmethods.com/?page_id=39" target="_blank">See the Code from the Example</a></p>
<h2>Breaking Down the Code:</h2>
<h5>First, an object to put everything in and keep things clean.</h5>
<pre class="brush: js; wrap-lines: true">var customTrack = {};</pre>
<h5>Next an object to keep variables we want to persist. Some parts are for future posts.</h5>
<pre class="brush: js; ruler: true; first-line: 2; wrap-lines: false">customTrack.objTrackingVariables = {
    strInteractTrackVars: 'props, eVars, events',
    blnBufferOn: false,
    blnLoadFail: false,
    arrTrackingArray: []
};</pre>
<h5>Expanding this part in future posts.</h5>
<pre class="brush: js; ruler: true; first-line: 8; wrap-lines: false">customTrack.trackData = (function () {

    //Expanding on this part later

    function sendTracking(strTrackType, strTrackValue){

    //tracking is prepared then sent here

    }

    return function (strTrackType, strTrackValue) {
        if ('undefined' !== typeof(s) &amp;&amp; !customTrack.objTrackingVariables.blnBufferOn) {
            sendTracking(String(strTrackType), String(strTrackValue));
        } else if (!customTrack.objTrackingVariables.blnLoadFail) {
            customTrack.earlyTracking(String(strTrackType), String(strTrackValue));
        }
    };
}());</pre>
<h5>The fun for this post starts here.</h5>
<pre class="brush: js; ruler: true; first-line: 26; wrap-lines: false">customTrack.earlyTracking = (function () {</pre>
<h5>Creating a object to hold values we want to persist, and only accessible inside the earlyTracking function.</h5>
<pre class="brush: js; ruler: true; first-line: 27; wrap-lines: true">    var objEarlyBuffer = {
        blnDataStored: false,
        blnIntervalOn: false,
        intIntervalCounter: 0,
        arrEarlyArray: [],
        intervalCheckS: null
    };</pre>
<h5>This function sends the tracking values we have stored in the &#8216;buffer&#8217; array.</h5>
<pre class="brush: js; ruler: true; first-line: 34; wrap-lines: false">    function sendEarlyTracking() {
        var intEarlyBufferCounter = -1;
        var arrTrackLink = [];
        while (++intEarlyBufferCounter &lt; objEarlyBuffer.arrEarlyArray.length) {
            arrTrackLink = String(objEarlyBuffer.arrEarlyArray[intEarlyBufferCounter]).split("|");
            customTrack.TrackData(String(arrTrackLink[0]), String(arrTrackLink[1]));
        }
        objEarlyBuffer.blnDataStored = false;
        objEarlyBuffer.arrEarlyArray = [];
        objEarlyBuffer.blnIntervalOn = false;
        if ('undefind' !== typeof(customTrack.objTrackingVariables.blnBufferOn)) {
            customTrack.objTrackingVariables.blnBufferOn = false;
        }
        clearInterval(objEarlyBuffer.intervalCheckS);
    }</pre>
<h5>After the 100ms interval is created (next function), this function checks if &#8216;s&#8217; is defined and clears the interval after two minutes if &#8216;s&#8217; is not seen.</h5>
<pre class="brush: js; ruler: true; first-line: 49; wrap-lines: false">    function sReady() {
        objEarlyBuffer.intIntervalCounter++;
        if (objEarlyBuffer.blnIntervalOn &amp;&amp; objEarlyBuffer.intIntervalCounter &gt; 1200) {
            clearInterval(objEarlyBuffer.intervalCheckS);
            objEarlyBuffer.blnIntervalOn = false;
            customTrack.objOmniVars.blnBufferOn = false;
            customTrack.objOmniVars.blnLoadFail = true;
        }

        if (objEarlyBuffer.blnIntervalOn &amp;&amp; 'undefined' !== typeof(s)) {
            clearInterval(objEarlyBuffer.intervalCheckS);
            objEarlyBuffer.blnIntervalOn = false;
            if ('undefind' !== typeof(customTrack.objTrackingVariables.blnBufferOn)) {
                customTrack.objTrackingVariables.blnBufferOn = false;
            }
            sendEarlyTracking();
        } else {
            return false;
        }
    }</pre>
<h5>Below is the functionality for the &#8216;public&#8217; method.</h5>
<pre class="brush: js; ruler: true; first-line: 69; wrap-lines: false">    function bufferEarlyTracking(strTmpTrackString) {
        if (!objEarlyBuffer.blnIntervalOn) {
            if ('undefind' !== typeof(customTrack.objTrackingVariables.blnBufferOn)) {
                customTrack.objTrackingVariables.blnBufferOn = false;
            }
            objEarlyBuffer.blnIntervalOn = true;
            objEarlyBuffer.intervalCheckS = setInterval(sReady, 100);
        }
        objEarlyBuffer.blnDataStored = true;
        objEarlyBuffer.arrEarlyArray.push(strTmpTrackString);
        if ('undefined' !== typeof(s) &amp;&amp; objEarlyBuffer.arrEarlyArray.length &gt; 0 &amp;&amp; !objEarlyBuffer.blnIntervalOn) {
            sendEarlyTracking();
        }
    }</pre>
<h5>Wrapping things up.</h5>
<pre class="brush: js; ruler: true; first-line: 83; wrap-lines: false">    return function (strTrackType, strTrackValue) {
        bufferEarlyTracking(String(strTrackType) + "|" + String(strTrackValue));
    };
}());</pre>
<h3>More to Come. Comments Encourage.</h3>
<img src="http://feeds.feedburner.com/~r/metricsandmethods/~4/wxdxtj1FOrU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://metricsandmethods.com/waiting-is-the-hardest-part/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://metricsandmethods.com/waiting-is-the-hardest-part</feedburner:origLink></item>
		<item>
		<title>Foxy Debugging (Updated)</title>
		<link>http://feedproxy.google.com/~r/metricsandmethods/~3/81NjtMzHwI4/foxy-debugging</link>
		<comments>http://metricsandmethods.com/foxy-debugging#comments</comments>
		<pubDate>Thu, 08 Apr 2010 02:03:40 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Recommended Blogs]]></category>
		<category><![CDATA[SiteCatalyst]]></category>

		<guid isPermaLink="false">http://metricsandmethods.com/?p=14</guid>
		<description><![CDATA[Fiddler and Charles are the usual suspects when people suggest tools for debugging analytics implementations. While these are excellent tools, secure pages and single monitor setups can make them a bit of a hassle. For the Discerning Web Analyst For quick single window debugging, I highly recommend the Firefox add-on HttpFox. HttpFox offers drop-dead simple traffic filtering, a great query sting breakout tab, [...]]]></description>
			<content:encoded><![CDATA[<p>Fiddler and Charles are the usual suspects when people suggest tools for debugging analytics implementations.</p>
<p>While these are excellent tools, secure pages and single monitor setups can make them a bit of a hassle.</p>
<h2>For the Discerning Web Analyst</h2>
<p>For quick single window debugging, I highly recommend the Firefox add-on <a href="https://addons.mozilla.org/en-US/firefox/addon/6647" target="_blank">HttpFox</a>.</p>
<p>HttpFox offers drop-dead simple traffic filtering, a great query sting breakout tab, along with all the other basics expected in an http monitoring tool.</p>
<p>Checking the RSID for SiteCatalyst users is the only real complaint I can foresee.</p>
<p>Given how quick and easy HttpFox is to use, I cannot recommend this tool enough.</p>
<p><strong>Update: <span style="font-weight: normal;">A good post on this topic over at <a href="http://emptymind.org/validating-page-tags-with-httpfox/" target="_blank">emptymind.org</a></span></strong></p>
<img src="http://feeds.feedburner.com/~r/metricsandmethods/~4/81NjtMzHwI4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://metricsandmethods.com/foxy-debugging/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://metricsandmethods.com/foxy-debugging</feedburner:origLink></item>
	</channel>
</rss>
