<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Web Analytics Land &#187; enhancements</title>
	<atom:link href="http://webanalyticsland.com/sitecatalyst-implementation/tag/enhancements/feed/" rel="self" type="application/rss+xml" />
	<link>http://webanalyticsland.com</link>
	<description>Omniture SiteCatalyst Implementation Optimization.</description>
	<lastBuildDate>Thu, 19 Aug 2010 15:01:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Don&#8217;t Forget Your SiteCatalyst Utility Functions!</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalyst-utility-functions/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalyst-utility-functions/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 15:56:48 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sitecatalyst]]></category>
		<category><![CDATA[s_code.js]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=314</guid>
		<description><![CDATA[Have you ever tried to use a new plug-in and found it did not work? You were probably missing a utility function. Utility functions are designed to work with SiteCatalyst plug-ins. There are 6 utility functions that are commonly used. They are apl, p_c, p_gh, split, replace, and join. These functions do things like join [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever tried to use a new plug-in and found it did not work? You were probably missing a utility function. Utility functions are designed to work with SiteCatalyst plug-ins. There are 6 utility functions that are commonly used. They are <strong>apl</strong>, <strong>p_c</strong>, <strong>p_gh</strong>, <strong>split</strong>, <strong>replace</strong>, and <strong>join</strong>.</p>
<p>These functions do things like join elements of an array into a string delimiter by a string, replaces characters in a string, splits a string on a specific character, append a value to any delimited lists, and more. THese utility functions are referenced by several standard plug-ins.</p>
<p>Here&#8217;s how I do it. I take all these utility functions and wrap them all up in one neat package, and include this as one of my standard plug-ins to add when creating a s_code file. This way not thing is missed, nothing is forgotten and all of my plug-ins will work no problem.</p>
<p>Here&#8217;s what it looks like:</p>
<pre class="brush: jscript">
/*
 * Utility Functions: apl, p_c, p_gh, split, replace, join
 */
s.apl=new Function(&quot;L&quot;,&quot;v&quot;,&quot;d&quot;,&quot;u&quot;,&quot;&quot;
+&quot;var s=this,m=0;if(!L)L=&#039;&#039;;if(u){var i,n,a=s.split(L,d);for(i=0;i&lt;a.&quot;
+&quot;length;i++){n=a[i];m=m||(u==1?(n==v):(n.toLowerCase()==v.toLowerCas&quot;
+&quot;e()));}}if(!m)L=L?L+d+v:v;return L&quot;);
s.p_c=new Function(&quot;v&quot;,&quot;c&quot;,&quot;&quot;
+&quot;var x=v.indexOf(&#039;=&#039;);return c.toLowerCase()==v.substring(0,x&lt;0?v.le&quot;
+&quot;ngth:x).toLowerCase()?v:0&quot;);
s.p_gh=new Function(&quot;&quot;
+&quot;var s=this;if(!s.eo&amp;&amp;!s.lnk)return &#039;&#039;;var o=s.eo?s.eo:s.lnk,y=s.ot(&quot;
+&quot;o),n=s.oid(o),x=o.s_oidt;if(s.eo&amp;&amp;o==s.eo){while(o&amp;&amp;!n&amp;&amp;y!=&#039;BODY&#039;){&quot;
+&quot;o=o.parentElement?o.parentElement:o.parentNode;if(!o)return &#039;&#039;;y=s.&quot;
+&quot;ot(o);n=s.oid(o);x=o.s_oidt}}return o.href?o.href:&#039;&#039;;&quot;);
s.split=new Function(&quot;l&quot;,&quot;d&quot;,&quot;&quot;
+&quot;var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i&gt;-1?i:l.length;a[x&quot;
+&quot;++]=l.substring(0,i);l=l.substring(i+d.length);}return a&quot;);
s.repl=new Function(&quot;x&quot;,&quot;o&quot;,&quot;n&quot;,&quot;&quot;
+&quot;var i=x.indexOf(o),l=n.length;while(x&amp;&amp;i&gt;=0){x=x.substring(0,i)+n+x.&quot;
+&quot;substring(i+o.length);i=x.indexOf(o,i+l)}return x&quot;);
s.join = new Function(&quot;v&quot;,&quot;p&quot;,&quot;&quot;
+&quot;var s = this;var f,b,d,w;if(p){f=p.front?p.front:&#039;&#039;;b=p.back?p.back&quot;
+&quot;:&#039;&#039;;d=p.delim?p.delim:&#039;&#039;;w=p.wrap?p.wrap:&#039;&#039;;}var str=&#039;&#039;;for(var x=0&quot;
+&quot;;x&lt;v.length;x++){if(typeof(v[x])==&#039;object&#039; )str+=s.join( v[x],p);el&quot;
+&quot;se str+=w+v[x]+w;if(x&lt;v.length-1)str+=d;}return f+str+b;&quot;);
</pre>
<p>I just make sure that is block is included in every s_code file. Then I am assured that every plug-in I use can find the correct utility function it needs to work properly.</p>
<p>Enjoy!</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=314&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalyst-utility-functions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Optimize the Time Parting Plugin to get More Detail and Use Less Variables</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/time-parting-granularity-using-saint/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/time-parting-granularity-using-saint/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 21:12:32 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[day parting]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[omniture]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[time parting]]></category>
		<category><![CDATA[tracking]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=269</guid>
		<description><![CDATA[The Time Parting Plug-in is one of the more popular SiteCatalyst plug-ins available. A standard implementation of the Time Parting plug-in will consume 3 variables. One for Time of Day, one for the Day of Week, and one for Weekday/Weekend. How can we improve this to get more information, and more importantly use less variables? [...]]]></description>
			<content:encoded><![CDATA[<p>The Time Parting Plug-in is one of the more popular SiteCatalyst plug-ins available. A standard implementation of the <a href="http://webanalyticsland.com/sitecatalyst-implementation/dayparting-plugin-in-sitecatalyst/">Time Parting plug-in</a> will consume 3 variables. One for <strong>Time of Day</strong>, one for the <strong>Day of Week</strong>, and one for <strong>Weekday/Weekend</strong>. How can we improve this to get more information, and more importantly use less variables? Here is how I have been doing it.</p>
<p>I use a combination of stacking the variables and SAINT uploads. For those of you who are not familiar with SAINT, Omniture describes it as, <em>&#8220;&#8230;an acronym for SiteCatalyst Attribute Importing and Naming Tool. This tool enables you to download the classifications template, apply attributes to it, and then upload the data, thereby enhancing your SiteCatalyst reports with the new attributes.&#8221;</em> This will allow us to upload a lot of detail about any variable you record.</p>
<p>Here&#8217;s how I&#8217;m doing it on this site. First I am using the 2.0 version of the plug-in and not the 1.4 version that I describe in a <a href="http://webanalyticsland.com/sitecatalyst-implementation/dayparting-plugin-in-sitecatalyst/">previous post</a>. The 2.0 version includes support for Daylight Savings time and globalizes the year. You can find the 2.0 version from the SiteCatalyst Knowledge Base. If you prefer to use the 1.4 version, you can find it on this site.</p>
<pre class="brush: jscript">
/* Set Time Parting Variables */
s_hour=s.getTimeParting(&#039;h&#039;,&#039;-5&#039;);
s_day=s.getTimeParting(&#039;d&#039;,&#039;-5&#039;);
s_timepart=s_day+&quot;|&quot;+s_hour;
s.prop16=s_timepart.toLowerCase();
if (s.visEvent) s.eVar16=s.prop16;
</pre>
<p>Ok, let me explain whats going on here. As I said before the Time Parting plug-in captures 3 variables. If you notice in my code I am only using two of them. I don&#8217;t need to capture Weekday/Weekend anymore. I will take care of that later. The other two, I capture in two blank variables I created, s_day and s_hour. Next I combine the two of them in a single variable I call s_timepart, separated by a pipe. Then to ensure everything is consistent I copy the variable in all lower case to the prop that I am going to use. This next part is a little different. In the eVar I only want capture this value once per visit. Typically a simple getValOnce will be enough to get it done. Well then what happens when the visit extends from one time part into another? In that situation the Time Parting value will be different and therefore getValOnce will capture this as a new value since it has changed. I don&#8217;t want that to happen, I only want it once per visit. So this is when I tie in using the <a href="http://webanalyticsland.com/plugins/Get_Visit_Start_Plugin.pdf">get Visit Start</a> plug-in. This guarantees I will only capture the value only one time per visit.</p>
<p>This will return a report that looks like this:<br />
<img src="http://webanalyticsland.com/images/time-parting.jpg" alt="Time Parting Report in SiteCatalyst" /></p>
<p>We now have a total of 672 possible options in this report. The next thing we want to do is to classify these using SAINT. I set up 5 different categories to use. Weekday/Weekend (this is why we don&#8217;t need to capture it in the code, Day of Week, Hour of Day, Hour Part and AM/PM.<br />
<img src="http://webanalyticsland.com/images/saint-setup.png" alt="SAINT Setup" /></p>
<p>I then created the template to use that contains all of these values.<br />
<img src="http://webanalyticsland.com/images/time-parting-saint-template.png" alt="SAINT Template" /><br />
<a href="http://webanalyticsland.com/dayparting-saint.txt">You can download a copy of the template that I use here.</a><br />
Upload the template and that&#8217;s all there is to it. Do you have more conversions in the bottom of the hour or the top of the hour? How about morning vs afternoon? Which whole hour is the most profitable? Now you have an easy way to break down your time parting with finer granularity, at the sime time saving your self a couple of variables.</p>
<p>Enjoy! </p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=269&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/time-parting-granularity-using-saint/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Track Your Visitors Copied Text With SiteCatalyst Plug-in</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/track-copied-text-plugin/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/track-copied-text-plugin/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 11:00:56 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[omniture]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[s_code.js]]></category>
		<category><![CDATA[visitors]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=295</guid>
		<description><![CDATA[To me Web Analytics is the science of analyzing visitor behavior in order to improve the Web Site for the purpose of increasing conversion. Anytime I can use web analytics to help the visitor find what they are looking for, I feel I&#8217;m doing my job. But lets say your visitors are finding what they [...]]]></description>
			<content:encoded><![CDATA[<p>To me Web Analytics is the science of analyzing visitor behavior in order to improve the Web Site for the purpose of increasing conversion. Anytime I can use web analytics to help the visitor find what they are looking for, I feel I&#8217;m doing my job. But lets say your visitors are finding what they are looking for, but it is just not as easy as it could be? How would I know?</p>
<p>One thing I have been playing with is to monitor what content my visitors are selecting and copying from the site. If I see a lot of visitors copying my email address, maybe I should make the contact form a little easier to be found. If I see a lot of copying of some sample code, maybe I should make it easier to download it, or include a pdf copy. But how do I find out how to capture what my visitors copy? Here you go. </p>
<p>This is all done by adding a plug-in and a bit of code to the s_code file. This code looks for any time some text is copied and sets it in a prop and fires an event. This will work if the visitor highlights text and goes the right click/copy route, or by hitting Control/Command + C. You will need either 1 eVar and 1 event, or a 1 prop to use. If you want to go the eVar and event route, take this code and place it some where BEFORE the <strong>function s_doPlugins(s)</strong> call: </p>
<pre class="brush: jscript">
var eventAttached=false;
if(!eventAttached){eventAttached = true;
function trackCopy(){
var overrides = {&#039;events&#039;:&#039;event8&#039;,&#039;eVar18&#039;:getCopiedText()};
	s.templtv=s.linkTrackVars;
	s.templte=s.linkTrackEvents;
   	s.linkTrackVars=&#039;eVar18,events&#039;;
	s.linkTrackEvents=s.events=&#039;event8&#039;;
	s.tl(true, &#039;o&#039;, &#039;Text Copied&#039;, overrides);
	if(s.templtv) s.linkTrackVars=s.templtv;
	if(s.templte) s.linkTrackEvents=s.templte;
}
</pre>
<p>Insert the eVar and event you are going to use where you see them in the code. If you decide to just use a single prop instead, then use this bit of code, again before the <strong>function s_doPlugins(s)</strong> call: </p>
<pre class="brush: jscript">
var eventAttached=false;
if(!eventAttached){eventAttached = true;
function trackCopy(){
var overrides = {&#039;prop49&#039;:getCopiedText()};
	s.templtv=s.linkTrackVars;
   	s.linkTrackVars=&#039;prop49&#039;;
	s.tl(true, &#039;o&#039;, &#039;Text Copied&#039;, overrides);
	if(s.templtv) s.linkTrackVars=s.templtv;
}
</pre>
<p>Insert the prop you want to use where you see it set. Next take this code and put it in the plug-in&#8217;s section of the s_code file:</p>
<pre class="brush: jscript">
function getCopiedText() {
if (document.selection){return document.selection.createRange().text;}
else if (window.getSelection){return window.getSelection();}return &#039;&#039;;}
if(document.body &amp;&amp; document.body.attachEvent){
document.body.attachEvent(&quot;oncopy&quot;, trackCopy);}
else if (document.body &amp;&amp; document.body.addEventListener){
document.body.addEventListener(&#039;copy&#039;,trackCopy, false);}}
</pre>
<p>What are we going to end up with? You will get a report that looks like this:<br />
<img src="http://webanalyticsland.com/images/copied-text.png" alt="Copied Text Report" /></p>
<p>It&#8217;s pretty interesting to see what your visitors are choosing to copy. Now do I expect to find huge some game changing incite that will lead me to make a change to the Web Site that will increase my conversion rate 100% with this report? Probably not. Do I expect to find one more place that allows me to make another 1% improvement? I sure do. Remember, all those 1% improvements add up. <img src='http://webanalyticsland.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Big thanks to <strong>kgs/ksmith</strong> in the Omniture Developer Connection for the original idea to do this.</p>
<p>Enjoy!</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=295&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/track-copied-text-plugin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Enhance Your SiteCatalyst S_Code Using Server-Side Scripting</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/enhance-your-sitecatalyst-s_code-using-server-side-scripting/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/enhance-your-sitecatalyst-s_code-using-server-side-scripting/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 03:13:23 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[s_code.js]]></category>
		<category><![CDATA[tracking]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=273</guid>
		<description><![CDATA[I receive a lot of questions from people working on their own SiteCatalyst implementations and I&#8217;m always happy to help. One that I got recently is &#8220;why is your s_code file a php file&#8221;? I figured there were not too many people out there doing it like this or even know about this, so I [...]]]></description>
			<content:encoded><![CDATA[<p>I receive a lot of questions from people working on their own SiteCatalyst implementations and I&#8217;m always happy to help. One that I got recently is &#8220;why is your s_code file a php file&#8221;? I figured there were not too many people out there doing it like this or even know about this, so I thought I would help out those that were interested in what the advantages of using server side code to enhance your data collection.</p>
<p>The reason I use a php file to house all of my s_code script is simple. I want to be able to do what is not easily done with using standard JavaScript. Here are a couple of examples.</p>
<p>First things first. How do I get a php file to act like JavaScript? It&#8217;s actually pretty easy. First thing you do is in the top of your file add this small bit of code:</p>
<pre class="brush: php">
&lt;?php header(&#039;Content-type: application/javascript&#039;); ?&gt;
</pre>
<p>The purpose of this line is just to say &#8216;hey, unless instructed otherwise, treat everything you are going to see here as JavaScript. Next change your file extension from .js to .php. That&#8217;s all you need to do to start adding in some php scripting into your file.</p>
<p>Here are some things I am using it for. I like capturing the IP address of my visitors. I like to track this because I have had problems with spammers, scraper bots and general bad visitors in the past, and I just like keeping my eye on things. Here is the code to capture IP address.</p>
<pre class="brush: php">
s.eVar17=&quot;&lt;?php echo $_SERVER[&#039;REMOTE_ADDR&#039;]?&gt;&quot;;
</pre>
<p>I also have this matched with the <a href="http://webanalyticsland.com/plugins/Get_Val_Once_Plugin.pdf">get Val Once</a> plug-in. </p>
<p>Another thing I like to capture is User Agent. How many people come to my site from a specific build of IE6? Is Googlebot executing my JavaScript when crawling my site? Here is how I capture User Agent.</p>
<pre class="brush: php">
s.eVar23=&quot;&lt;?php echo $_SERVER[&#039;HTTP_USER_AGENT&#039;]?&gt;&quot;;
</pre>
<p>Again I match this up with the get Val Once plug-in.</p>
<p>Another thing I like to do is use php to populate the configuration variables of the Time Parting plug-in. The latest version of the plug-in, 2.0, uses specific daylight savings time variables (the 2.0 version is available from the Omniture Help section. The version I host here on the site is the older 1.4 version). The 3 variables that need to be configured for the plug-in are Daylight Savings Time start day for the current year, Daylight Savings Time end day for the current year, and the Current Year. Now all of these can be hard coded, but I&#8217;d rather do a little bit of one time coding and never have to worry about it again. Here is how I set those variables using php.</p>
<pre class="brush: php">
s.dstStart=&quot;&lt;?php echo date(&#039;m/d/Y&#039;, strtotime(&quot;Second Sunday March 0&quot;));?&gt;&quot;;
s.dstEnd=&quot;&lt;?php echo date(&#039;m/d/Y&#039;, strtotime(&quot;First Sunday November 0&quot;));?&gt;&quot;;
s.currentYear=&quot;&lt;?php echo date(&#039;Y&#039;);?&gt;&quot;;
</pre>
<p>All of these take advantage of the date() functionality of php. Combine that with a little bit of extra code, and with the fact that I know that daylight savings time always begins the second Sunday of March and ends on the first Sunday of November, I never need to touch those variables again.</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=273&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/enhance-your-sitecatalyst-s_code-using-server-side-scripting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Increase SiteCatalyst Clickmap Functionality with Dynamic Object IDs Plug-in</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/increase-sitecatalyst-clickmap-functionality-with-dynamic-object-ids-plug-in/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/increase-sitecatalyst-clickmap-functionality-with-dynamic-object-ids-plug-in/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 17:58:16 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[coorelation]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[omniture]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sitecatalyst]]></category>
		<category><![CDATA[subrelation]]></category>
		<category><![CDATA[URL length]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=254</guid>
		<description><![CDATA[ClickMap. Pretty useful tool. It gives you a neat overlay that shows you what links are clicked on a page and the associated traffic. I wonder how we can make it better? Knock knock. Oh who is that at the door? Why its the Dynamic Object IDs Plugin. Please step right in. The Dynamic Object [...]]]></description>
			<content:encoded><![CDATA[<p>ClickMap. Pretty useful tool. It gives you a neat overlay that shows you what links are clicked on a page and the associated traffic. I wonder how we can make it better? Knock knock. Oh who is that at the door? Why its the Dynamic Object IDs Plugin. Please step right in.</p>
<p>The Dynamic Object IDs Plug-in dynamically adds an object ID to the click thru URL. You can see it using the debugger. It is designed to improve the function of the Clickmap. </p>
<p>Let&#8217;s take a look at an example. From the home page of this site, there are 3 links that take you to the Contact page. I click the last one on the page, then open the debugger on the page I land on. Here you can see that the click thru URL has been appended with the number of the order that it happened to appear in on the page. So now when I have multiple links on a single page each one is easily spotted in the debugger, even though they all have the same anchor text and click thru URL.<br />
<img src="http://webanalyticsland.com/images/debugshot.jpg" alt="Dynamic Object ID Plug-in" /></p>
<p>Now what do we get? If you look at the clickmap report, <strong>Site Content>Links>ClickMap</strong>, you will now see a number attached to each URL.<br />
<img src="http://webanalyticsland.com/images/clickmap-report.jpg" alt="Clickmap Report" /><br />
Now you know exactly which link was clicked.</p>
<p>Here is how I have it implemented on this site. Before the <strong>function s_doPlugins(s)</strong>  I include the code:</p>
<pre class="brush: jscript">
/* DynamicObjectIDs config */
function s_getObjectID(o) {
	var ID=o.href;
	return ID;
}
s.getObjectID=s_getObjectID
</pre>
<p>Then within the s_doPlugins(s) function, I include:</p>
<pre class="brush: jscript">
/* To setup Dynamic Object IDs */
s.setupDynamicObjectIDs();
</pre>
<p>And finally in the <strong>Plug-ins section</strong> I have the plug-in code itself.</p>
<pre class="brush: jscript">
/*
 * DynamicObjectIDs
 */
s.setupDynamicObjectIDs=new Function(&quot;&quot;
+&quot;var s=this;if(!s.doi){s.doi=1;if(s.apv&gt;3&amp;&amp;(!s.isie||!s.ismac||s.apv&quot;
+&quot;&gt;=5)){if(s.wd.attachEvent)s.wd.attachEvent(&#039;onload&#039;,s.setOIDs);else&quot;
+&quot; if(s.wd.addEventListener)s.wd.addEventListener(&#039;load&#039;,s.setOIDs,fa&quot;
+&quot;lse);else{s.doiol=s.wd.onload;s.wd.onload=s.setOIDs}}s.wd.s_semapho&quot;
+&quot;re=1}&quot;);
s.setOIDs=new Function(&quot;e&quot;,&quot;&quot;
+&quot;var s=s_c_il[&quot;+s._in+&quot;],b=s.eh(s.wd,&#039;onload&#039;),o=&#039;onclick&#039;,x,l,u,c,i&quot;
+&quot;,a=new Array;if(s.doiol){if(b)s[b]=s.wd[b];s.doiol(e)}if(s.d.links)&quot;
+&quot;{for(i=0;i&lt;s.d.links.length;i++){l=s.d.links[i];c=l[o]?&#039;&#039;+l[o]:&#039;&#039;;b&quot;
+&quot;=s.eh(l,o);z=l[b]?&#039;&#039;+l[b]:&#039;&#039;;u=s.getObjectID(l);if(u&amp;&amp;c.indexOf(&#039;s_&quot;
+&quot;objectID&#039;)&lt;0&amp;&amp;z.indexOf(&#039;s_objectID&#039;)&lt;0){u=s.repl(u,&#039;\&quot;&#039;,&#039;&#039;);u=s.re&quot;
+&quot;pl(u,&#039;\\n&#039;,&#039;&#039;).substring(0,97);l.s_oc=l[o];a[u]=a[u]?a[u]+1:1;x=&#039;&#039;;&quot;
+&quot;if(c.indexOf(&#039;.t(&#039;)&gt;=0||c.indexOf(&#039;.tl(&#039;)&gt;=0||c.indexOf(&#039;s_gs(&#039;)&gt;=0&quot;
+&quot;)x=&#039;var x=\&quot;.tl(\&quot;;&#039;;x+=&#039;s_objectID=\&quot;&#039;+u+&#039;_&#039;+a[u]+&#039;\&quot;;return this.&quot;
+&quot;s_oc?this.s_oc(e):true&#039;;if(s.isns&amp;&amp;s.apv&gt;=5)l.setAttribute(o,x);l[o&quot;
+&quot;]=new Function(&#039;e&#039;,x)}}}s.wd.s_semaphore=0;return true&quot;);
</pre>
<p>To see this code in the s_code file running this site, you can check it out <a href="http://webanalyticsland.com/super-code.php" target="_new" >here</a>.</p>
<p>Ok great. Now what else can we do with this plug-in? Lets say I want to track how many contact form submissions I received from clicking the third Contact link that appears on the Home Page? Well I could add a custom onclick function. I could add a tracking code on the end of the click thru URL. But how can I use this new plug-in to track this? </p>
<p>Recently there was a post on the Omniture blog about <a href="http://blogs.omniture.com/2009/11/24/trimming-the-fat-with-dynamic-variables/" target="_new" >using Dynamic Variables</a>. Using these variables we can now grab the  value of <strong>oid</strong>, which is the click thru URL with the new object id added to it, and you can get the <strong>pid</strong> which is the page the click happened on. I have it set up on this site:</p>
<pre class="brush: jscript">
s.prop20=s.eVar20=&quot;D=oid&quot;;
s.prop22=s.eVar22=&quot;D=pid&quot;;
</pre>
<p>Now with a simple subrelation I can get what link was clicked on what page and what events occurred, all without adding any additional code to the page. </p>
<p>Enjoy!</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=254&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/increase-sitecatalyst-clickmap-functionality-with-dynamic-object-ids-plug-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Add Page Views And Visits To All SiteCatalyst eVars</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/how-to-add-page-views-and-visits-to-all-sitecatalyst-evars/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/how-to-add-page-views-and-visits-to-all-sitecatalyst-evars/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 19:39:14 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[omniture]]></category>
		<category><![CDATA[page views]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sitecatalyst]]></category>
		<category><![CDATA[s_code.js]]></category>
		<category><![CDATA[tracking]]></category>
		<category><![CDATA[visits]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=218</guid>
		<description><![CDATA[Here is a simple way to add Page Views and Visits to all of your eVar reports (see the update below). While Client Care has the ability to turn on a few things, flip some switches here and there to add visits to some reports, I like having full control over it as much as [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a simple way to add Page Views and <strike>Visits</strike> to all of your eVar reports <strong>(see the update below)</strong>. While Client Care has the ability to turn on a few things, flip some switches here and there to add visits to some reports, I like having full control over it as much as possible myself (and I&#8217;m not really in the mood to wait on hold to get it done). To make this happen we are going to have to use 2 events and a pair of plug-ins. Hopefully you should have a couple of events available to use, and you can find the plug-in code on the <a href="http://webanalyticsland.com/sitecatalyst-plugins/">SiteCatalyst Plugins</a> page. Here&#8217;s how to do it. </p>
<p>First lets get Page Views. To do this we are going to use the <a href="http://webanalyticsland.com/plugins/Append_to_List_Plugin.pdf">Append List plug-in</a>. The Append List (or apl) plug-in utility provides a simple mechanism to append a value to any delimited lists, with the option of a case sensitive or case-insensitive check to insure the value doesn&#8217;t already exist in the list. The apl plug-in is referenced by several standard plug-ins but can be used directly in a variety of situations. This is an Omniture supported plug-in and you can find more information about it by accessing the Knowledge Base.</p>
<pre class="brush: jscript">
s.apl(L,v,d,u)
</pre>
<p>L = source list, empty list is accepted<br />
v = value to append<br />
d = list delimiter<br />
u (optional, defaults to 0) Unique value check. 0=no unique check, value is always appended. 1=case insensitive check, append only if value isn&#8217;t in list. 2=case sensitive check, append only if value isn&#8217;t in list.</p>
<p>What we are going to do is in the s_code.js file, set up this plug-in to fire off an event on every single page view of the site, exactly mimicking the standard Page View metric.</p>
<pre class="brush: jscript">
/* Set Page View Event */
s.events=s.apl(s.events,&#039;event1&#039;,&#039;,&#039;,1);
</pre>
<p>Here is the plug-in code:</p>
<pre class="brush: jscript">
/*
* Plugin Utility: apl v1.1
*/
s.apl=new Function(&quot;L&quot;,&quot;v&quot;,&quot;d&quot;,&quot;u&quot;,&quot;&quot;
+&quot;var s=this,m=0;if(!L)L=&#039;&#039;;if(u){var i,n,a=s.split(L,d);for(i=0;i&lt;a.&quot;
+&quot;length;i++){n=a[i];m=m||(u==1?(n==v):(n.toLowerCase()==v.toLowerCas&quot;
+&quot;e()));}}if(!m)L=L?L+d+v:v;return L&quot;);
</pre>
<p><strong><font color="red">UPDATE: In my eagerness to share this with everyone I skipped the testing process I usually do. Upon testing I realized I a critical, basic error in my logic. By doing it this way, you are setting an event prior to any of the eVars, so they would not be associated with each other, and there for show up as &#8220;None&#8221; in your report. It is such a simple oversight that I am actually embarrassed that I missed. So now I throw it out to you, the Omniture community, how do you guys think we should try to figure this one out? Or is it even possible to do? Let me know what you think!</font></strong></p>
<p><strong><font color="red">Just to be super clear, this will work if you want to add visits to some of your Traffic Sources reports. For example if you want visits from the original referring domains, this will work perfectly for that.</font></strong></p>
<p>Now lets get Visits. I thought a lot about how to get this. One method you could use would be do the exact same thing we did to get the Page Views event. Set it up on a different event, then call up Omniture Client Care to have them set that event to only record once per visit. Again I wanted to try to avoid using Client Care. I also did not want to go that route since I want this to mimic the Visits metric as close as possible, so I want it to be cookie based. Here I decided to use the Get Visit Start plug-in.</p>
<p>What the <a href="http://webanalyticsland.com/plugins/Get_Visit_Start_Plugin.pdf">Get Visit Start plug-in</a> was designed to do is to determine first page of a visit. It returns 1 on the first plug-in call of the visit, otherwise returns nothing. It uses a 30 minute cookie if possible, otherwise reverts to a session cookie. Always returns nothing if 30 minute or session cookie can&#8217;t be set, so it functions very much like the standard Visit&#8217;s metric. What I have done is set the plug-in up to populate a variable, then use basic JavaScript to determine if there is a value to the variable that was just set, and if so fire off the Append List plug-in. The theory behind this is the Get Visit Start plug-in will only return a value one time per visit, on the first page view, and at that one and only time fire off a single event. </p>
<pre class="brush: jscript">
s.getVisitStart(c)
</pre>
<p>c=cookie name for tracking (&#8220;s_visit&#8221; is standard)</p>
<p>Here is how I have it set up. I made up a variable s.visEvent to hold the value of the Get Visit Start Plugin, then fire off event6 if it has a value.</p>
<pre class="brush: jscript">
/* Set Visit Event */
s.visEvent=s.getVisitStart(&quot;s_visit&quot;);
if (s.visEvent) s.events=s.apl(s.events,&#039;event6&#039;,&#039;,&#039;,1);
</pre>
<p>Here is the plug-in code:</p>
<pre class="brush: jscript">
/*
 * Get Visit Start
 */
s.getVisitStart=new Function(&quot;c&quot;,&quot;&quot;
+&quot;var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(s.c_r(c&quot;
+&quot;)){v=0}if(!s.c_w(c,1,t)){s.c_w(c,1,0)}if(!s.c_r(c)){v=0}return v;&quot;);
</pre>
<p>Pretty simple. Typically I would have just used the Get Val Once plug-in when I want to get a value of a variable only once per visit, but it didn&#8217;t want to work well with the s.events variable.</p>
<p>Enjoy!</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=218&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/how-to-add-page-views-and-visits-to-all-sitecatalyst-evars/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SiteCatalyst&#8217;s New Marketing Channel Manager &#8211; First Look</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalysts-new-marketing-channel-manager-first-look/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalysts-new-marketing-channel-manager-first-look/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 02:07:14 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[marketing channel]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sitecatalyst]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=190</guid>
		<description><![CDATA[As many of you may have noticed, there is a new menu available in the SiteCatalyst Admin Console. It was released with the 9/16 maintenance release. It is currently in a closed beta and should go live before the next maintenance release. Have not seen it yet? Well if you have admin access here is [...]]]></description>
			<content:encoded><![CDATA[<p>As many of you may have noticed, there is a new menu available in the SiteCatalyst Admin Console. It was released with the 9/16 maintenance release. It is currently in a closed beta and should go live before the next maintenance release. Have not seen it yet? Well if you have admin access here is what to do. In the Admin Console select Report Suites. In the Report Suite Manager, select any one of your sites and then mouse-over the Edit Settings link. Now you should see something similar to this:<br />
<img src="http://webanalyticsland.com/images/marketingchannel.png" alt="SiteCatalyst Marketing Channels" /><br />
Here we see a new menu item called Marketing Channels with 5 more menus beyond that, Marketing Channel Manager, Marketing Channel Rules, Marketing Channel Costs, Marketing Channel Classifications, and Visitor Engagement Expiration. </p>
<p>OK so what is it? Well no one at Omniture will say yet, but by the look of the menus it appears to be some form of the <a href="http://blogs.omniture.com/2009/06/09/unified-sources-the-db-vista-solution-that-makes-other-vista-solutions-cower-in-fear/">Unified Sources Vista Rule</a> and the Channel Manager plug-in. Lets hope it is. That is an extremely popular and powerful Vista rule (and expensive), and the plug-in is <em>extremely</em> heavy in weight, and is challenging to maintain. So if this is that added functionality then prepared to get a lot of great value from this new addition.</p>
<p><strong>UPDATE: From what I hear this is supposed to go into public beta in November 2009, and be released Q2 2010. Anyone attending the Omniture Summit in early 2010 will probably hear much more about it then.</strong></p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=190&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/sitecatalysts-new-marketing-channel-manager-first-look/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>4 Things I Would Change About Omniture&#8217;s Data Warehouse</title>
		<link>http://webanalyticsland.com/sitecatalyst-implementation/4-things-i-would-change-about-omnitures-data-warehouse/</link>
		<comments>http://webanalyticsland.com/sitecatalyst-implementation/4-things-i-would-change-about-omnitures-data-warehouse/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 06:06:36 +0000</pubDate>
		<dc:creator>VaBeachKevin</dc:creator>
				<category><![CDATA[SiteCatalyst Implementation]]></category>
		<category><![CDATA[data warehouse]]></category>
		<category><![CDATA[enhancements]]></category>
		<category><![CDATA[omniture]]></category>
		<category><![CDATA[reports]]></category>
		<category><![CDATA[sitecatalyst]]></category>

		<guid isPermaLink="false">http://webanalyticsland.com/?p=173</guid>
		<description><![CDATA[Omniture&#8217;s SiteCatalyst can give you a tremendous amount of data. You can slice and dice tons of different metrics and the drop of a hat. Lets say one day the CMO comes to you and asks for one of those left-field ad-hoc reports you randomly get, something like &#8220;how much revenue was generated on August [...]]]></description>
			<content:encoded><![CDATA[<p>Omniture&#8217;s SiteCatalyst can give you a tremendous amount of data. You can slice and dice tons of different metrics and the drop of a hat. Lets say one day the CMO comes to you and asks for one of those left-field ad-hoc reports you randomly get, something like &#8220;<em>how much revenue was generated on August 3rd between 1 AM and 4 AM by first time visitors who came to the site from our latest campaign on Bing, visited pages A, B, and C, using a Safari browser&#8230;.</em>&#8221; and on and on. You will soon find as you get requests for reports that are so far out there, that you need to visit one of Omniture&#8217;s most powerful tools, the Data Warehouse. Here are a couple of changes I wish Omniture would make to give us a better Data Warehouse user experience.</p>
<p><strong>Errors</strong><br />
I request a ton of reports. I&#8217;ve been requesting them for some time now, so I am pretty in tune with how long they will take to come back to me. So I request my report, and wait the amount of time I feel it should take, check my inbox and nada. Hmmmmm. Lets log into the Data Warehouse request manager and take a look at what&#8217;s going on.<br />
<img src="http://webanalyticsland.com/images/dw1.png" alt="" /><br />
Houston we have a problem. Looks like there was en error with the report. Wouldn&#8217;t it have been nice to get an email sent to me letting me know there was an error? I had to log into the tool and find out myself that there was a problem. Well now that I&#8217;m here, lets click on the report name and see if we can find out a little more info on what went wrong.<br />
<img src="http://webanalyticsland.com/images/dw2.png" alt="" /><br />
Ok from here we can see that the report was &#8220;Not Delivered&#8221;. I figured that much out when it didn&#8217;t show up. Maybe clicking on that link will tell why it was not delivered.<br />
<img src="http://webanalyticsland.com/images/dw3.png" alt="" /><br />
Well that&#8217;s just not very helpful at all. Did I enter some incorrect FTP information? Was there no information to return? Did someone trip over the cord and unplug the server? We will never know. </p>
<p>So now what? I obviously wanted that report, so I am forced to go and request it again. If I didn&#8217;t want it, I wouldn&#8217;t have requested it in the first place. How about being a little proactive and automatically re-requesting the report for me? A simple email stating that there was an error but my report is being processed again would have save me a bunch of time. Or even if it said that there was an error because of mistakes I made in the request would have been extremely helpful.</p>
<p><strong>Priority</strong><br />
There are a handful of reports that I have scheduled that have top priority. I need to make sure these reports are ran before anything else that is scheduled at the same time. For this, I turn to the priority settings.<br />
<img src="http://webanalyticsland.com/images/dw4.png" alt="" /><br />
Seems pretty simple, just click the arrows and my report moves up or down. The problem lies in where you have 60+ scheduled reports and moving one to the top of the list now turns into an hour of clicking arrows. How can this be improved? If this was a little more like the system used on Netflix, it would have been handled in a few seconds.<br />
<img src="http://webanalyticsland.com/images/dw6.png" alt="" /><br />
Another gripe I have with the priority arrows is that anyone can go in there and fiddle with them. After spending an hour moving my mission critical reports to the top of the list, any other person with access can go in there and just push my reports back to the bottom of the list. The priority arrows should be an admin feature only.</p>
<p><strong>Scheduling</strong><br />
There are times when I have a lot of reports that I need all at one time. I just scheduled 24 reports last week that come daily all at the same time. I usually try to space out the reports as much as possible when I can, but the smallest granularity that is offered to me is just hourly.<br />
<img src="http://webanalyticsland.com/images/dw5.png" alt="" /><br />
If I could schedule reports on a quarter hour, or even half hour granularity, it may ease a little bit of the load on the Data Warehouse servers and I may get my reports delivered a little quicker.</p>
<p><strong>Metric Additions</strong><br />
As business requirements change, so do the metrics delivered in reports. I have some complex reports scheduled and it would be great if i could open up the report and add a metric instead of canceling the report and starting from scratch.<br />
<img src="http://webanalyticsland.com/images/dw7.png" alt="" /><br />
If someone comes along and asks if we can add 2 more events to this report, I should be able to just click some kind of &#8220;edit metrics&#8221; button, add in what I need and be all set. Too bad it isn&#8217;t that easy.</p>
<p>The Data Warehouse is a very powerful tool that does work extremely well. Most casual users may never even notice these items, but as you get more advanced in using the tool, as your business requirements change over time, you too may feel the need for these enhancements.</p>
<img src="http://webanalyticsland.com/?ak_action=api_record_view&id=173&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://webanalyticsland.com/sitecatalyst-implementation/4-things-i-would-change-about-omnitures-data-warehouse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
