<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Frontended.com</title>
	<atom:link href="http://frontended.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://frontended.com</link>
	<description></description>
	<lastBuildDate>Tue, 01 Jun 2010 23:27:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.5.3" -->
	<copyright>2006-2007 </copyright>
	<managingEditor>bernie@frontended.com (Frontended.com)</managingEditor>
	<webMaster>bernie@frontended.com (Frontended.com)</webMaster>
	<category>posts</category>
	<ttl>30000</ttl>
	<image>
		<url>http://frontended.com/images/frontended.jpg</url>
		<title>Frontended.com</title>
		<link></link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary></itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>Frontended.com</itunes:author>
	<itunes:owner>
		<itunes:name>Frontended.com</itunes:name>
		<itunes:email>bernie@frontended.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://frontended.com/images/frontended.jpg" />
		<item>
		<title>Legacy Migrations made easy&#8230;</title>
		<link>http://frontended.com/?p=89</link>
		<comments>http://frontended.com/?p=89#comments</comments>
		<pubDate>Mon, 31 May 2010 03:01:18 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frontended.com/?p=89</guid>
		<description><![CDATA[Legacy Migrations is a little gem that helps you migrate data from an old database structure to a new db and db structure. It keeps a status report for failed validations, and also lets you update data if all you need is a nightly data update. Here&#8217;s a quick sample that transfers data from the [...]]]></description>
			<content:encoded><![CDATA[<p>Legacy Migrations is a little gem that helps you migrate data from an old database structure to a new db and db structure. It keeps a status report for failed validations, and also lets you update data if all you need is a nightly data update. Here&#8217;s a quick sample that transfers data from the model Person to the model Animal (assuming the models are subclasses of either ActiveRecord::Base or CSV::Table):</p>
<pre class="brush:ruby">require 'legacy_migrations'

#Assuming you've already created classes for source and destination tables
transfer_from Person, :to =&gt; Animal do
  match_same_name_attributes :only =&gt; [:sex, :age]
  from :name, :to =&gt; :pet_name
  from :from_record, :to =&gt; :species do |from_record|
    "Homo Sapien"
  end
end</pre>
<p>Here&#8217;s the full list of options you can pass to &#8216;transfer_from&#8217; (at the time of writing, of course):</p>
<ul>
<li>:limit &#8211; Set a limit to the number of rows to transfer. This is useful when you’re trying to find faulty data in the source table, and don’t want to run the entire dataset.</li>
<li>:validate &#8211; Default = true. Use ActiveRecord validations when saving destination data. Reports errors in the StatusReport (a singleton object)</li>
<li>:source_type &#8211; Default = :active_record. Sets the source destination type. Options: :active_record: Assumes the From option is a class that inherits from ActiveRecord::Base, then iterates through each record of From table by using From.all.each… :other: Assumes the From option is an iterable ‘collection’ whose elements/items can respond to all columns speficied in the given block.</li>
<li>:store_as &#8211; Store the resulting generated record to be used in a future transfer_from or update_from operation. You can access this object like so:
<pre class="brush:ruby">transfer_from Person, :to =&gt; Species, :store_as =&gt; 'new_species' do
  from :name, :to =&gt; :species_name
    "Homo Sapien"
  end
end

transfer_from Person, :to =&gt; Animal do
  from :pet_name, :to =&gt; &gt; :name
  stored :new_species, :to =&gt; :species  # Uses the species that we
                                        # created in the previous
                                        #  transfer_from
end
</pre>
</li>
</ul>
<p>Aside from those helpers, you also get the &#8216;match_same_name_attributes&#8217; helper that&#8230;wait for it&#8230;matches same-name columns between the source and destination tables. Here&#8217;s a quicky:
</p>
<pre class="brush:ruby">transfer_from Person, :to =&gt; Species, :store_as =&gt; 'new_species' do
  match_same_name_attributes :only => [:name, :age, :date_of_birth]
  # There's also an 'except' option, and if
  # you don't use either, then the script
  # just transfers all same-name columns.
end
</pre>
<p>You can also use the gem to update data periodically using the &#8216;update_from&#8217; operation. The<br />
 update_from operation uses the well-known squirrel plugin syntax to match records from the source database, to records in the destination database. If the source record doesn&#8217;t exist in the destination, then it gets automatically created. Think of this as &#8216;find_or_create_by&#8217; on steroids. For example, let&#8217;s say you want to update first names in the Animal model, from the latest data in the People model, and the identifying and matching features between the source and destination tables are the date_of_birth and last_name columns:</p>
<pre class="brush:ruby">
update_from Person, :to =&gt; Animal do
  based_on do |from_record|
    date_of_birth == from_record.dob
    last_name ==  from_record.last_name
  end

  from :first_name, :to => :first_name
end
</pre>
<p>Here&#8217;s the git repo:</p>
<p><a href="http://github.com/btelles/legacy_migrations">http://github.com/btelles/legacy_migrations</a></p>
<p>To install it just use:</p>
<pre class="brush:bash">
gem install legacy_migrations
</pre>
<p>If you have any suggestions, please let me know!</p>
<p><strong>Update:</strong></p>
<p>By the way, this gem is considered beta software and to get a better idea for how to use it, you may want to look at the rspec files. They&#8217;re the most comprehensive documentation.</p>
<p>Here are the <a href="http://docs.google.com/present/edit?id=0ATWmKYpWlAeUZGRtNDN3OTNfMTFnZ3EzbjdkZA&#038;hl=en">slides to a quick presentation </a>I gave at our local Ruby Brigade, in case anyone&#8217;s interested.</p>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=89</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quince Interaction Design Patterns</title>
		<link>http://frontended.com/?p=50</link>
		<comments>http://frontended.com/?p=50#comments</comments>
		<pubDate>Tue, 21 Apr 2009 01:18:18 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Interaction Design]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">/?p=50</guid>
		<description><![CDATA[Quince is an interesting library of Interaction Design patterns that helps developers lookup, learn and effectively create more user-friendly user experiences. The main draw is that each design pattern is accompanied by a list of references to books or articles that mention the pattern. The down side is that the references seem to be popular [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Quince UI library" href="http://quince.infragistics.com/">Quince </a>is an interesting library of Interaction Design patterns that helps developers lookup, learn and effectively create more user-friendly user experiences. The main draw is that each design pattern is accompanied by a list of references to books or articles that mention the pattern. The down side is that the references seem to be popular books written by famous usability experts who don&#8217;t site specific studies or experiments supporting their findings. Of course, those experts are famous for a reason, so we wouldn&#8217;t want to completely disregard the references. Nonetheless listing a peer-reviewed study or two wouldn&#8217;t hurt Quince&#8217;s cause. Oh, and it&#8217;s written in a really flashy Silverlight user interface (pun intended).</p>
<p>Talking about references, I found Quince on <a href="http://ajaxian.com/archives/quince">Ajaxian.com</a>, an excellent resource for web development goodies.</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=c05554cc-216c-8d9b-b276-4b2af6137338" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=50</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reality-Based Interaction Framework.</title>
		<link>http://frontended.com/?p=18</link>
		<comments>http://frontended.com/?p=18#comments</comments>
		<pubDate>Sat, 06 Dec 2008 23:18:48 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frontended.com/articles/?p=18</guid>
		<description><![CDATA[In the 2009 Confeference for Human Computer Interaction (CHI) a group of researchers from Tufts University presented a new framework for classifying reality-based interactions&#8211;aptly named &#8220;Reality-Based Interaction Framework.&#8221; The basic idea is that you can classify almost all types of interactions that users can experience that are not WIMP (window, icon, mouse)-based with this framework, [...]]]></description>
			<content:encoded><![CDATA[<p>In the 2009 Confeference for Human Computer Interaction (CHI) a group of researchers from Tufts University presented a new framework for classifying reality-based interactions&#8211;aptly named &#8220;Reality-Based Interaction Framework.&#8221;</p>
<p>The basic idea is that you can classify almost all types of interactions that users can experience that are not WIMP (window, icon, mouse)-based with this framework, and by doing so, you&#8217;ll have an easier time conducting studies. It&#8217;s an interesting idea, but will it hold up to scrutiny?</p>
<p>Like any well-meaning scientist&#8217;s blog, the next few posts will try to challenge this framework not because I think it is not useful, or because I have an  itch for knocking down big ideas, but because this is how science works. We challenge each other&#8217;s ideas in a spirit of arriving at a more accurate or helpful presentation of the world we live in. In the mean time, you may want to take a look at their article from the proceedings (you&#8217;ll need to contact them to get a copy if you don&#8217;t have access to the ACM Digital Library):</p>
<table border="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td class="medium-text" colspan="3" width="50%"><strong>Reality-based interaction</strong><strong>: a framework for post-WIMP interfaces</strong></td>
</tr>
<tr valign="middle"></tr>
<tr valign="top">
<td class="small-text"><strong>Full text</strong></td>
<td class="smaller-text" colspan="2"><a title="Pdf" name="FullText" href="http://portal.acm.org/ft_gateway.cfm?id=1357089&amp;type=pdf&amp;coll=Portal&amp;dl=GUIDE&amp;CFID=13625258&amp;CFTOKEN=58212147" target="_blank"><br />
<img style="margin-right: 2px;" src="http://portal.acm.org/imagetypes%5Cpdf_logo.gif" border="0" alt="Pdf" align="middle" />Pdf</a><br />
(528 KB)</td>
</tr>
<tr valign="top">
<td class="small-text"><strong>Source</strong></p>
<p><img src="http://portalparts.acm.org/1360000/1357054/thumb/cover_thumb.jpg" border="1" alt="" vspace="5" width="79" height="105" align="left" /></td>
<td class="small-text" colspan="2"><span class="mediumb-text">Conference on Human Factors in Computing Systems</span><br />
<a class="small-link-text" href="http://portal.acm.org/toc.cfm?id=SERIES260&amp;type=series&amp;coll=Portal&amp;dl=GUIDE&amp;CFID=13625258&amp;CFTOKEN=58212147" target="_self">archive</a></p>
<p><span class="mediumb-text">Proceeding of the twenty-sixth annual SIGCHI conference on Human factors in computing systems </span><br />
<a class="small-link-text" href="http://portal.acm.org/toc.cfm?id=1357054&amp;type=proceeding&amp;coll=Portal&amp;dl=GUIDE&amp;CFID=13625258&amp;CFTOKEN=58212147" target="_self">table of contents</a></p>
<div class="small-text">Florence, Italy</div>
<div class="medium-text">
<p>SESSION: Post-WIMP</p>
<p><a class="small-text" href="http://portal.acm.org/toc.cfm?id=1357054&amp;type=proceeding&amp;coll=Portal&amp;dl=GUIDE&amp;CFID=13625258&amp;CFTOKEN=58212147#1357088" target="_self">table of contents</a></div>
<div class="small-text">Pages 201-210</div>
<div class="small-text">Year of Publication: 2008</div>
<div class="small-text">
<p>ISBN:978-1-60558-011-1</p></div>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HeyCosmo&#8230;THEY push the buttons.</title>
		<link>http://frontended.com/?p=11</link>
		<comments>http://frontended.com/?p=11#comments</comments>
		<pubDate>Fri, 12 Sep 2008 02:57:05 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Products]]></category>

		<guid isPermaLink="false">http://frontended.com/articles/?p=11</guid>
		<description><![CDATA[Tired of pushing 2 for tech support or 3 to speak with a representative? HeyCosmo solves that by making the people who answer your calls push the buttons, not you. It works like this. You log on to Facebook or HeyCosmo.com, select or create a question that you want to investigate (questions range from finding [...]]]></description>
			<content:encoded><![CDATA[<p>Tired of pushing 2 for tech support or 3 to speak with a representative? HeyCosmo solves that by making the people who answer your calls push the buttons, not you.</p>
<p>It works like this. You log on to Facebook or <a href="http://www.heycosmo.com/">HeyCosmo.com</a>, select <em>or create </em>a question that you want to investigate (questions range from finding reservations for a <em>type </em>of restaurant to asking a bunch of friends which movie they want to watch). Then HeyCosmo calls all the relevant parties (your friends, the restaurant to reserve seats, etc.), makes them push 1 for The Hulk or 2 for Spiderman then sends you the response. WELL done guys!</p>
<p>One thing that the Facebook version lacks is the ability to pick up your friends&#8217; phone numbers automatically. But I think that&#8217;s a Facebook API problem, not a HeyCosmo problem. Of course, if there were an application that merged contact phone numbers from another service (e.g. Yahoo, GMail or Outlook) and made it available to the Facebook HeyCosmo application, then that&#8217;s technically your information, thus giving HeyCosmo the right to use it.</p>
<p>Good job gentlemen! Keep up the awesome work!</p>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=11</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accordia: Visualize Contact Relationships</title>
		<link>http://frontended.com/?p=9</link>
		<comments>http://frontended.com/?p=9#comments</comments>
		<pubDate>Fri, 12 Sep 2008 01:09:26 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Relationship_Management]]></category>

		<guid isPermaLink="false">http://frontended.com/articles/?p=9</guid>
		<description><![CDATA[Accordia is a search and visualization engine designed to help users find relationships between their clients more quickly. If you look at the online demo you can see that the architects came up with some very interesting ways of displaying relationships. It looks similar to Digg&#8217;s Swarm, but instead of displaying votes, it displays relationships [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.accordiatech.com/index.html">Accordia </a>is a search and visualization engine designed to help users find relationships between their clients more quickly.</p>
<p>If you look at the online demo you can see that the architects came up with some very interesting ways of displaying relationships. It looks similar to <a href="http://labs.digg.com/swarm/">Digg&#8217;s Swarm</a>, but instead of displaying votes, it displays relationships between people. So if two of your clients happen to work at the same company, a line is drawn between their two nodes on a chart area. If two clients are family members, then a very strong line is displayed between them.</p>
<p>Since the product <em>just</em> launched in September 9, though, there&#8217;s not a lot to find out from the website. For example, the site says that &#8220;Accordia can connect to most CRM systems&#8221; but it doesn&#8217;t mention exactly which ones. Nonetheless it&#8217;s an interesting way to look at relationships between people. If you&#8217;re a sales person who thrives on making those faint connections between your clients to get the extra credibility, Accordia&#8217;s for you.</p>
<p><script id="hyperTooltip"><!--
// ==UserScript==
// @name        MultiPopup Main Functions File
// @namespace   http://www.hesido.com
// @version     2.09
// @date        2005-08-18
// @author      Emrah BASKAYA &lt;emrahbaskaya at hesido dot com&gt;
// @description Tooltip Replacement: Replaces Browser Default Tooltips with CSS stylable ones and allows you to customize the information displayed in it and the delay for tooltips.
// @include     *
// ==/UserScript==
// Licence Information:
/*
MultiPopup V2.09 Main Functions File
Tooltip Replacement Script
Emrah BASKAYA  (hesido - www.hesido.com)
Detailed info can be found at:</p>
<p>http://www.hesido.com</p>
<p>You cannot use this code for commercial purposes without
permission of the author. You are not allowed to earn money
from this script or any work that is derived from this script.</p>
<p>Free to use for non-commercial purposes. A link to www.hesido.com
is most welcome, in a page on your site, if you are using it for your
website.</p>
<p>For other usage options, please contact the author.</p>
<p>Uses some DOM fallback methods as seen on www.quirksmode.org
Code for embedding CSS by D.I.Z.
*/</p>
<p>if (window.addEventListener) window.addEventListener('load', multipopupMain, false);
else if (window.attachEvent) window.attachEvent('onload', multipopupMain);</p>
<p>function multipopupMain(){
	if (!document.createElement || !document.getElementsByTagName || !document.getElementById || document.getElementsByTagName("head").length == 0) return;</p>
<p>	var allowRemotePrefs = true; //Needs to be true to be able to run modules, external preferences and skin
	//making this false will almost make Multipopup impenetratable.</p>
<p>//	Total Suppression
	if (allowRemotePrefs &amp;&amp; typeof(mpUSRJS) != "undefined" &amp;&amp; mpUSRJS.doNotRun) return;
//	Self Supression
	if (window.MPwinTriggersActive) return;
//	Prerunmodules execution
	if (allowRemotePrefs &amp;&amp; typeof(mpUSRJS) != "undefined" &amp;&amp; typeof(mpUSRJS.preRunModules) != "undefined") for (var i=0; i&lt;mpUSRJS.preRunModules.length; i++) mpUSRJS.preRunModules[i]();</p>
<p>//	pcR-&gt;array related to tooltip
//	gVr-&gt;array that holds generic info
//	aOb-&gt;array that holds animation info.
	var pcR = new Array(), gVr = new Array(), aOb = new Array(), mPu = new Array();</p>
<p>	setMPPreferences();</p>
<p>	mPu.divIds = ['mpopupc','mpoptop','mpopfill1','mpopbod','mpopfill2','mpopfill3','mpopfill4','mpopbot','mpopfill5','mpopdbl','mpopdblprnt','bmtest'];
	mPu.styleObId = "mpopupstyleobjectid"
	mPu.revEvals = new Array(null,'"rect("+(clipYTarget-aOb.clipY)+"px, "+(clipXTarget+aOb.clipX)+"px, "+(clipYTarget+aOb.clipY)+"px, "+(clipYTarget-aOb.clipY)+"px)"','"rect(0px, "+(aOb.clipX*2)+"px, "+(clipYTarget*2)+"px, 0px)"','"rect(0px, "+(aOb.clipX*2)+"px, "+(aOb.clipY*2)+"px, 0px)"');
	mPu.defDesc = "",pcR.hvrdObj = null,aOb.objMovd = null,aOb.clipStep = 0,aOb.warpStep = 0;
	aOb.popActv = false,aOb.objMovd = false,gVr.activeDelay = mPu.popupDelay;
	pcR.actOffsetX = mPu.xOfst, pcR.actOffsetY = mPu.yOfst;
	aOb.revInt = new Array(),aOb.prevs = new Array();</p>
<p>//	Auto Primary Suppress
	gVr.suppress = (typeof(mpUSRJS) != "undefined" &amp;&amp; mpUSRJS.suppress &amp;&amp; mPu.allowSuppress) ? true : false;</p>
<p>//	deb = document.getElementById('debug');
//	debb = 0;</p>
<p>	mPu.setPopups = function() {
		if (mPu.revStyle == 0 || mPu.clipSteps == 0) {gVr.desInstRev = true; mPu.clipSteps = 0}
		else {gVr.desInstRev = false;}</p>
<p>		gVr.instRev = gVr.desInstRev;</p>
<p>		var attList = new Array(), attid = new Array(), patternFound;
		if (mPu.useFirefoxForceWrap) eval('var forcewrapreg = /([^\\s\\&amp;\\/\\-]{'+mPu.forceBreakAt+'})/g');
		else  eval('var forcewrapreg = /([^\\s\\/\\-]{'+mPu.forceBreakAt+'})/g');
//		eval('var forcewrapreg = /([^\\s\\&amp;\\/-]{'+mPu.forceBreakAt+'})/g'); //Opera
		var forcewrapreplace = '$1'+mPu.brokenSign;
		var zerowidthspacereg = /([\&amp;\/-])/g
		var zerowidthreplacer = '&amp;#8203;$1'
		for (var i=0; i&lt;mPu.attDesc.length;i++){
		if (mPu.attDUse[i]==true) {attList[attList.length]=mPu.attDesc[i]; attid[attid.length] = i}
		}</p>
<p>		for (var st=0;st&lt;mPu.tTags.length;st++) {
			var targetNodes = document.getElementsByTagName(mPu.tTags[st]);
			for (var i=0;i&lt;targetNodes.length;i++) {
				var toinsert ='', toaltinsrt = '', loi, inserter = new Array(), instId = new Array(), iclass = new Array(); altinsertr = new Array(), ainsId = new Array(), iaclass = new Array();
				for (var mt=0; mt&lt;attList.length;mt++){
					loi = targetNodes[i].getAttribute(attList[mt]);
					if ((loi == '' || loi == null) &amp;&amp; mPu.attDInhrt[attid[mt]] &amp;&amp; targetNodes[i].parentNode &amp;&amp; targetNodes[i].parentNode.getAttribute) loi = targetNodes[i].parentNode.getAttribute(attList[mt]);
					if (loi == null) loi = '';
					if (loi != '') {
						patternFound = mPu.alertPattern[attid[mt]]!='' &amp;&amp; loi.match(mPu.alertPattern[attid[mt]]) != null;
						if (mPu.forceWordWrap[attid[mt]]) loi = loi.replace(zerowidthspacereg,zerowidthreplacer).replace(forcewrapreg,forcewrapreplace);
//						if (mPu.forceWordWrap[attid[mt]]) loi = loi.replace(forcewrapreg,forcewrapreplace); //Opera
						if (mPu.attDPri[attid[mt]] || (patternFound &amp;&amp; mPu.alertToPri)) {	inserter[inserter.length] = loi; instId[instId.length] = attid[mt]; iclass[iclass.length] = (patternFound) ? mPu.alrtClass : mPu.stnClass;}
						if (mPu.attDSec[attid[mt]]) {altinsertr[altinsertr.length] = loi; ainsId[ainsId.length] = attid[mt]; iaclass[iaclass.length] = (patternFound) ? mPu.alrtClass : mPu.stnClass;}
						if (mPu.setAttNull[attid[mt]]) targetNodes[i].removeAttribute(attList[mt]);
						if (patternFound &amp;&amp; mPu.alertToPri &amp;&amp; mPu.alertInstant) targetNodes[i].instAlert = true;
					}
				}
				if (inserter.length == 1 &amp;&amp; mPu.attDNAWA[instId[0]]) toinsert = '&lt;div class="'+iclass[0]+' '+mPu.spcClass[instId[0]]+'"&gt;'+inserter[0]+'&lt;/div&gt;';
				else for (var kt=0; kt&lt;inserter.length; kt++)
				{toinsert += '&lt;div class="'+iclass[kt]+' '+mPu.spcClass[instId[kt]]+'"&gt;&lt;span class="'+iclass[kt]+' '+mPu.spcClass[instId[kt]]+'"&gt;'+mPu.attDTitle[instId[kt]]+'&lt;/span&gt;'+inserter[kt]+'&lt;/div&gt;';}
				if (altinsertr.length == 1 &amp;&amp; mPu.attDNAWA[ainsId[0]]) toaltinsrt = '&lt;div class="'+ iaclass[0]+' '+mPu.spcClass[ainsId[0]]+'"&gt;'+altinsertr[0]+'&lt;/div&gt;';
				else for (var kt=0; kt&lt;altinsertr.length; kt++)
					{toaltinsrt += '&lt;div class="'+iaclass[kt]+' '+mPu.spcClass[ainsId[kt]]+'"&gt;&lt;span class="'+iaclass[kt]+' '+mPu.spcClass[ainsId[kt]]+'"&gt;'+mPu.attDTitle[ainsId[kt]]+'&lt;/span&gt;'+altinsertr[kt]+'&lt;/div&gt;';}
				if (toinsert !="" || toaltinsrt !="") {
					if (toinsert !="") {targetNodes[i].primaryView = toinsert; targetNodes[i].primDpresent = true;}
					if (toaltinsrt !="") {targetNodes[i].secondaryView = toaltinsrt; targetNodes[i].altDpresent = true;}
					if (!targetNodes[i].triggersActive) {
						if (!addCheckTrigger(targetNodes[i],'mouseover',writeDescription)) targetNodes[i].onmouseover = writeDescription;
						if (!addCheckTrigger(targetNodes[i],'mouseout',clearDescription)) targetNodes[i].onmouseout = clearDescription;
						targetNodes[i].triggersActive = true;
						}
					}
				}
			}
		}</p>
<p>// Embed Internal Style
	if (mPu.useDefStyle) {
		if (document.getElementById(mPu.styleObId) != null) document.getElementById(mPu.styleObId).parentNode.removeChild(document.getElementById(mPu.styleObId));
		var head = document.getElementsByTagName("head")[0];
		var CSSstyleObj = document.createElement("style");
		CSSstyleObj.setAttribute("type", 'text/css');
		CSSstyleObj.id = mPu.styleObId;
		CSSstyleObj.innerHTML = mPu.defCSS;
		head.appendChild(CSSstyleObj);
	}</p>
<p>	addTrigger(window,'resize', sizeUpdate);
	addTrigger(window,'keydown', mpopupKeyReceive);
	addTrigger(window,'keyup', mpopupKeyUpreceive);</p>
<p>	window.MPwinTriggersActive = true;</p>
<p>	mPu.addPopupDiv = addPopupDiv;
	addPopupDiv();
	sizeUpdate();
	mPu.setPopups();</p>
<p>//	Postrun modules execution
	if (typeof(mPu.postRunModules) != "undefined") for (var i=0; i&lt;mPu.postRunModules.length; i++) mPu.postRunModules[i]();</p>
<p>	function fixPopupPos() {
		pcR.scrolledX = (window.pageXOffset) ? window.pageXOffset : (document.documentElement &amp;&amp; document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : 0;
		pcR.scrolledY = (window.pageYOffset) ? window.pageYOffset : (document.documentElement &amp;&amp; document.documentElement.scrollTop) ? document.documentElement.scrollTop : 0;
		if (!doFixPopupPos()) doFixPopupPos();
		}</p>
<p>	function doFixPopupPos() {
		var yiPos = pcR.ygPos + pcR.actOffsetY; var xiPos = pcR.xgPos + pcR.actOffsetX;
		pcR.divHeight = aOb.dHght + pcR.TDdifX; pcR.divWidth = aOb.dWdth + pcR.TDdifX;
		var sxEdge = (pcR.actOffsetX&gt;0) ? pcR.width - mPu.edgeBufferZone : xiPos;
		var syEdge = (pcR.actOffsetY&gt;0) ? pcR.height - mPu.edgeBufferZone : yiPos;
		yiPos = Math.max(Math.min(yiPos, syEdge - pcR.divHeight),0);
		xiPos = Math.max(Math.min(xiPos, sxEdge - pcR.divWidth),0);
		aOb.yPos = yiPos; aOb.xPos = xiPos;
		if (pointColDetect(pcR.xgPos,pcR.ygPos,yiPos,xiPos+pcR.divWidth,yiPos+pcR.divHeight,xiPos,3)) {
			pcR.actOffsetX = -pcR.actOffsetX; pcR.actOffsetY = -pcR.actOffsetY;
			return false;
		} else {
		pcR.tDiv.style.top = (aOb.yPos + pcR.scrolledY - gVr.bRCompY) + "px";
		pcR.tDiv.style.left = (aOb.xPos + pcR.scrolledX - gVr.bRCompX) + "px";
		} return true; //Modify Ian
	}</p>
<p>	function pointColDetect(x,y,top,right,bottom,left,boundary) {
		top -= boundary; bottom += boundary; left -= boundary; right += boundary;
		if ((x&gt;left&amp;&amp;x&lt;right)&amp;&amp;(y&gt;top&amp;&amp;y&lt;bottom)) return true;
		return false;
	}</p>
<p>	function clrIntrvls() {
		for (i=0;i&lt;aOb.revInt.length;i++){window.clearInterval(aOb.revInt[i]);}
		aOb.revInt = new Array();
	}</p>
<p>	function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) {
		var delta = maxValue - minValue;
		var stepp = minValue+(Math.pow(((1 / totalSteps)*actualStep),powr)*delta);
		return Math.ceil(stepp)
		}</p>
<p>	function mpopupKeyReceive(e) {
	if (!e) e = window.event; //Modify Ian
	if (pcR.hvrdObj != null &amp;&amp; e.ctrlKey &amp;&amp; pcR.hvrdObj.altDpresent) {
		var hovered = pcR.hvrdObj;	doClearDescription(); doWriteDescription(hovered,e.ctrlKey,e.altKey);
		}
	if (pcR.hvrdObj != null &amp;&amp; e.shiftKey) doClearDescription();
	}</p>
<p>	function mpopupKeyUpreceive(e) {
	if (!e) e = window.event; //Modify Ian
	if (pcR.hvrdObj != null) {
		var hovered = pcR.hvrdObj; doClearDescription(); doWriteDescription(hovered,e.ctrlKey,e.altKey,true);
		}
	}</p>
<p>	function doWriteDescription(elem,ctrlK,altK,nosuppress) {
		var tagDescriptPri = '', tagDescriptAlt = ''</p>
<p>		if (elem.primDpresent) tagDescriptPri = elem.primaryView;
		if (elem.altDpresent) tagDescriptAlt = elem.secondaryView;</p>
<p>		if (altK || elem.instAlert) {gVr.activeDelay = 0;gVr.activeRevStyle = 'mPu.instRev()';gVr.instRev = true;}
		if (ctrlK) {var tagDescription = tagDescriptAlt; gVr.activeDelay = 0;}
		else {var tagDescription = tagDescriptPri;}
		if (!gVr.moveTrigger) {addTrigger(document,'mousemove', movePopup); gVr.moveTrigger = true;}</p>
<p>		pcR.hvrdObj = elem;
		pcR.reqDesc = (tagDescription != "" &amp;&amp; tagDescription != null);</p>
<p>		var wpt = mPu.warpSteps &gt; 0;
		pcR.bDiv.style.display = 'none'; pcR.bDiv.style.display = 'block';
		pcR.hvrdCh = true; pcR.hvrdFirst = true;</p>
<p>		if (pcR.reqDesc) {
			pcR.cDiv.innerHTML = tagDescription;
			pcR.mDiv.innerHTML = tagDescription;
		}</p>
<p>		aOb.tWidth = pcR.mDiv.offsetWidth;
		aOb.tHeight = pcR.mDiv.offsetHeight;</p>
<p>		if (!wpt &amp;&amp; pcR.reqDesc) {
			mPu.setDdivTargetSize(); fixPopupPos();
		}</p>
<p>		if (aOb.popActv != true) {
			if (wpt) pcR.cDiv.style.left = pcR.padComp+'px';
			aOb.revealTimer = window.setTimeout(
				function() {
					if (pcR.hvrdObj != null) {
						if (pcR.hvrdFirst == true &amp;&amp; mPu.warpSteps &gt; 0) {
							aOb.tPrevHeight = aOb.tHeight; aOb.tPrevWidth = aOb.tWidth;
							mPu.setDdivTargetSize(); fixPopupPos();
							}
						aOb.revealTimer = 0;
						if (gVr.suppress &amp;&amp; !ctrlK &amp;&amp; !altK &amp;&amp; !nosuppress) return;
						if (gVr.instRev) aOb.revInt[aOb.revInt.length] = window.setInterval(
							function() {	//Instant Reveal Function
							if (aOb.objMovd == true) {
								pcR.cDiv.style.width = aOb.tWidth + 'px';
								pcR.cDiv.style.height = aOb.tHeight + 'px';
								fixPopupPos();
								if (pcR.reqDesc) pcR.tDiv.style.visibility = 'visible';
								aOb.popActv = true; aOb.clipAnimDone = true; clrIntrvls();
								}
							},mPu.revInt);
						else  aOb.revInt[aOb.revInt.length] = window.setInterval(
							function() {	//Clip Reveal Function
							if (aOb.objMovd == true &amp;&amp; aOb.clipStep&lt;mPu.clipSteps) {
								pcR.divHeight = pcR.tDiv.offsetHeight; pcR.divWidth = pcR.tDiv.offsetWidth;
								aOb.clipStep++;
								if (aOb.clipStep&lt;mPu.clipSteps) {
									var clipYTarget = Math.ceil(pcR.divHeight / 2); var clipXTarget = Math.ceil(pcR.divWidth / 2);
									aOb.clipX = easeInOut(0,clipXTarget,mPu.clipSteps,aOb.clipStep,0.333);
									aOb.clipY = easeInOut(0,clipYTarget,mPu.clipSteps,aOb.clipStep,0.333);
									pcR.tDiv.style.clip = eval(mPu.revEvals[mPu.revStyle]);
									}
								else pcR.tDiv.style.clip = "rect(auto auto auto auto)";
								if (pcR.reqDesc)	pcR.tDiv.style.visibility = 'visible';
								aOb.popActv = true;
								if (pcR.hvrdCh) {
									mPu.setDdivTargetSize(); fixPopupPos();
									pcR.hvrdCh = false;
									}
								} else if (aOb.objMovd == true) {aOb.clipAnimDone = true; gVr.instRev = true; clrIntrvls();}
							},mPu.revInt)
						}
					},gVr.activeDelay);
				} else if (aOb.clipAnimDone) {
					pcR.tDiv.style.clip = "rect(auto auto auto auto)";
					if (pcR.reqDesc) pcR.tDiv.style.visibility = 'visible';
					else {pcR.tDiv.style.visibility = 'hidden'; aOb.popActv = false;}
					pcR.hvrdFirst = false;
					clrIntrvls();</p>
<p>					if (wpt) aOb.revInt[aOb.revInt.length] = window.setInterval(
						function() {	//Warp Animation Function
						if (pcR.hvrdCh) {
							pcR.cDiv.style.width = aOb.tWidth + 'px';
							pcR.cDiv.style.height = aOb.tHeight + 'px';
							pcR.hvrdCh = false;
							}
						if (aOb.warpStep &lt; mPu.warpSteps) {
							aOb.warpStep++;
							aOb.heightSet = easeInOut(aOb.tPrevHeight,aOb.tHeight,mPu.warpSteps,aOb.warpStep,0.333)
							aOb.widthSet = easeInOut(aOb.tPrevWidth,aOb.tWidth,mPu.warpSteps,aOb.warpStep,0.333)</p>
<p>							mPu.setDdivWarpSize();</p>
<p>							pcR.cDiv.style.left = aOb.widthSet-aOb.tWidth+pcR.padComp+"px";
							fixPopupPos();
							} else clrIntrvls();
						},mPu.revInt);
					}</p>
<p>			window.clearTimeout(aOb.resetDelayTimer); window.clearTimeout(aOb.hidePopupTimer);</p>
<p>		}</p>
<p>	function doClearDescription() {
		window.clearTimeout(aOb.revealTimer);
		aOb.hidePopupTimer = window.setTimeout(
			function() {	//Hide Popup Function
			clrIntrvls();
			aOb.warpStep = 0;
			pcR.tDiv.style.visibility = 'hidden';
			aOb.objMovd = false; aOb.popActv = false;aOb.clipStep = 0;
			removeTrigger(document,'mousemove', movePopup);
			pcR.tDiv.style.top = "0px";
			pcR.tDiv.style.left = "0px";
			pcR.tDiv.style.clip = "rect(auto auto auto auto)";
			aOb.clipAnimDone = false;
			gVr.moveTrigger = false;
			pcR.actOffsetX = mPu.xOfst, pcR.actOffsetY = mPu.yOfst;
			},mPu.hideDelay);
		if (aOb.revealTimer == 0) gVr.activeDelay = 0;
		pcR.hvrdObj = null;
		aOb.resetDelayTimer = window.setTimeout(
			function (){	//Reset Delay To Original Values
			gVr.activeDelay = mPu.popupDelay;
			gVr.instRev = gVr.desInstRev;
			},mPu.instPopDur);
		aOb.tPrevHeight = aOb.tHeight;
		aOb.tPrevWidth = aOb.tWidth;
		aOb.prevs[aOb.prevs.length] = aOb.tHeight
		if (aOb.warpStep != mPu.warpSteps &amp;&amp; aOb.warpStep &gt; 0) {
			aOb.tPrevHeight = aOb.heightSet; aOb.tPrevWidth = aOb.widthSet;
		}
		aOb.warpStep = 0;
	}</p>
<p>	function movePopup(e) {
	if (pcR.hvrdObj != null || aOb.popActv == true) {
		if (!e) {e = window.event;} //Modify Ian
		pcR.ygPos = e.clientY; pcR.xgPos = e.clientX;
		fixPopupPos();
		aOb.objMovd = true;
		}
	}</p>
<p>	function sizeUpdate() {
		if (self.innerWidth) {
		pcR.width = self.innerWidth; pcR.height = self.innerHeight;}
		else if (document.documentElement &amp;&amp; document.documentElement.clientWidth) {
		pcR.width = document.documentElement.clientWidth; pcR.height = document.documentElement.clientHeight;}
		else if (document.body) {
		pcR.width = document.body.clientWidth; pcR.height = document.body.clientHeight;}
		gVr.bRCompX = 0; gVr.bRCompY = 0;
		if (document.body.activeStyle('position','position') == 'relative') {gVr.bRCompX = document.body.offsetLeft; gVr.bRCompY = document.body.offsetTop}
	}</p>
<p>	function getElementsByClass(targetTag,tagClass) {
		var elementList = document.getElementsByTagName(targetTag); var classTag = new Array();
		for (var i=0;i&lt;elementList.length;i++) {
			if (elementList[i].className == tagClass) classTag[classTag.length] = elementList[i];
		}
		return classTag;
	}</p>
<p>	function addPopupDiv() {
		tDv = new Array()
		var prefix = "";
		var divlen = mPu.divIds.length;
		document.body.activeStyle = getActiveStyle;
		if (mPu.useDefStyle==true) prefix = "";
		for (var i=0;i&lt;mPu.divIds.length;i++) {
			if (document.getElementById(mPu.divIds[i]) != null) document.getElementById(mPu.divIds[i]).parentNode.removeChild(document.getElementById(mPu.divIds[i]));
			tDv[i]=document.createElement('div');
			if (mPu.divIds[i] != '') tDv[i].id = prefix + mPu.divIds[i];
			tDv[i].activeStyle = getActiveStyle;
		}</p>
<p>		tDv[0].style.position = 'absolute'; tDv[10].style.position = 'absolute';
		tDv[9].style.position = 'relative'; tDv[0].style.visibility = 'hidden';
		tDv[10].style.visibility = 'hidden'; tDv[5].style.overflow = "hidden";
		tDv[6].style.overflow = "hidden"; tDv[10].style.overflow = "hidden";
		tDv[5].style.position = 'relative';	tDv[6].style.position = 'absolute';
		tDv[0].style.zIndex = mPu.ttipZIndex;
		tDv[1].appendChild(tDv[2]); tDv[3].appendChild(tDv[4]); tDv[4].appendChild(tDv[5]);
		tDv[5].appendChild(tDv[6]); tDv[7].appendChild(tDv[8]); tDv[0].appendChild(tDv[1]);
		tDv[0].appendChild(tDv[3]); tDv[0].appendChild(tDv[7]); tDv[10].appendChild(tDv[9]);
		/* test the box model for compliance */
		pcR.bxMcompX = 0; pcR.bxMcompY = 0;
		document.body.appendChild(tDv[divlen-1])
		tDv[divlen-1].style.padding = "2px"; tDv[divlen-1].style.height = "50px";
		if (tDv[divlen-1].offsetHeight == 50) {
		//	mPu.warpSteps = 0;
			pcR.bxMcompX = parseInt(tDv[5].activeStyle('padding-right','paddingRight'))+parseInt(tDv[5].activeStyle('padding-left','paddingLeft'));
			pcR.bxMcompY = parseInt(tDv[5].activeStyle('padding-top','paddingTop'))+parseInt(tDv[5].activeStyle('padding-bottom','paddingBottom'));
		}</p>
<p>		document.body.removeChild(tDv[divlen-1]);
		document.body.appendChild(tDv[10])
		document.body.appendChild(tDv[0]);</p>
<p>		for (var i=0;i&lt;divlen-1;i++) {
			var bgIm = tDv[i].activeStyle("background-image","backgroundImage");
			if (bgIm.indexOf("url") &gt; -1 &amp;&amp; mPu.preload == true) preLoadImage(stripURL(bgIm))
		}
		pcR.cDiv = tDv[6]; pcR.tDiv = tDv[0]; pcR.dDiv = tDv[5];
		pcR.mDiv = tDv[9]; pcR.bDiv = tDv[10];</p>
<p>		pcR.padComp = parseInt(tDv[5].activeStyle('padding-left','paddingLeft'));
		tDv[6].style.left = pcR.padComp + 'px';</p>
<p>	// detect firefox bug and set functions accordingly
		tDv[5].style.width = "50px";
		tDv[5].style.height = "50px";
		mPu.setDdivWarpSize = (tDv[5].offsetWidth &gt; tDv[1].offsetWidth &amp;&amp; tDv[1].activeStyle('display','display') != 'none' &amp;&amp; tDv[7].activeStyle('display','display') != 'none') ?
			function() {
				aOb.dHght = aOb.heightSet + pcR.bxMcompY;
				aOb.dWdth = aOb.widthSet + pcR.bxMcompX;
				pcR.dDiv.style.height = aOb.dHght + "px";
				pcR.dDiv.style.width = aOb.dWdth + "px";
				tDv[1].style.display = 'none';tDv[1].style.display = 'block';
				tDv[7].style.display = 'none';tDv[7].style.display = 'block';
			} :
			function() {
				aOb.dHght = aOb.heightSet + pcR.bxMcompY;
				aOb.dWdth = aOb.widthSet + pcR.bxMcompX;
				pcR.dDiv.style.height = aOb.dHght + "px";
				pcR.dDiv.style.width = aOb.dWdth + "px";
			}</p>
<p>		mPu.setDdivTargetSize = (tDv[5].offsetWidth &gt; tDv[1].offsetWidth) ?
			function() {
				pcR.cDiv.style.height = aOb.tHeight + 'px';
				pcR.cDiv.style.width = aOb.tWidth + 'px';
				aOb.dHght = aOb.tHeight + pcR.bxMcompY;
				aOb.dWdth = aOb.tWidth + pcR.bxMcompX;
				pcR.dDiv.style.height = aOb.dHght + "px";
				pcR.dDiv.style.width = aOb.dWdth + "px";
				tDv[1].style.display = 'none';tDv[1].style.display = 'block';
				tDv[7].style.display = 'none';tDv[7].style.display = 'block';
			} :
			function() {
				pcR.cDiv.style.height = aOb.tHeight + 'px';
				pcR.cDiv.style.width = aOb.tWidth + 'px';
				aOb.dHght = aOb.tHeight + pcR.bxMcompY;
				aOb.dWdth = aOb.tWidth + pcR.bxMcompX;
				pcR.dDiv.style.height = aOb.dHght + "px";
				pcR.dDiv.style.width = aOb.dWdth + "px";
			}</p>
<p>		pcR.TDdifX = tDv[0].offsetWidth - tDv[5].offsetWidth;
		pcR.TDdifY = tDv[0].offsetHeight - tDv[5].offsetHeight;</p>
<p>	}</p>
<p>	function getActiveStyle(style,stylecc) {
		if (window.getComputedStyle) return window.getComputedStyle(this,null).getPropertyValue(style)
		if (this.currentStyle) return eval("this.currentStyle."+stylecc)
	}</p>
<p>	function preLoadImage(imageurl) {var img = new Image();img.src = imageurl;return img;}</p>
<p>	function stripURL(s) {
		// I'll later replace this with proper regex.
		s = s.substring(s.indexOf("url(")+4,s.lastIndexOf(")"));if (s.indexOf('"')&gt;-1) s = s.substring(s.indexOf('"')+1,s.lastIndexOf('"'));return s;
	}</p>
<p>	function writeDescription(e) {
		if (!e) {e = window.event;} //Modify Ian
		if (this != e.target) return;
		if (!e.shiftKey) doWriteDescription(this,e.ctrlKey,e.altKey,false)
	}</p>
<p>	function clearDescription(e) {
		if (!e) {e = window.event;} //Modify Ian
		if (this != e.target) return;
		doClearDescription();
	}</p>
<p>	function addTrigger(elm,eventname,func) {
		if (!addCheckTrigger(elm,eventname,func) &amp;&amp; elm.attachEvent) elm.attachEvent('on'+eventname, func);
		}
	function addCheckTrigger(elm,eventname,func) {
		if (elm.addEventListener) {elm.addEventListener(eventname, func, false); return true;} else return false;
		}
	function removeTrigger(elm,eventname,func) {
		if (!removeCheckTrigger(elm,eventname,func) &amp;&amp; elm.detachEvent) elm.detachEvent('on'+eventname, func);
		}
	function removeCheckTrigger(elm,eventname,func) {
		if (elm.removeEventListener) {elm.removeEventListener(eventname, func, false); return true;} else return false;
		}</p>
<p>	//Embedded preferences
	function setMPPreferences() {
	if (typeof(mpUSRJS) != "undefined" &amp;&amp; allowRemotePrefs) mPu = mpUSRJS;
	if (typeof(mPu.prefsVersion) == "undefined") {mPu.noExtPrefs=true;}
	mPu.useDefStyle = true;
	mPu.popupDelay = 650;
	mPu.hideDelay = 85;
	mPu.instPopDur = 370;
	mPu.attDesc = ['htitle','alt','href','src'];
	mPu.attDUse = [true,true,true,true];
	mPu.attDPri = [true,false,false,false];
	mPu.attDSec = [false,true,true,true];
	mPu.setAttNull = [false,false,false,false];
	mPu.attDInhrt = [true,false,true,false];
	mPu.forceWordWrap = [false, false, true, true];
	mPu.stnClass = 'mpop_cl';
	mPu.alrtClass = 'mpop_al';
	mPu.spcClass = ['mpop_title','mpop_alt','mpop_href','mpop_src'];
	mPu.attDTitle = ['Title:','Alt:','Address:','Source:']
	mPu.alertPattern = ['','',/^(\s*javascript\:)/i,'']
	mPu.alertToPri = false;
	mPu.alertInstant = false;
	mPu.attDNAWA = [true,true,false,false];
	mPu.xOfst = 15;
	mPu.yOfst = 15;
	mPu.clipSteps = 3;
	mPu.revStyle = 0;
	mPu.revInt = 10;
	mPu.warpSteps = 10;
	mPu.preload = true;
	mPu.edgeBufferZone = 32;
	mPu.tTags = ["*"];
	mPu.ttipZIndex = "9999";
	mPu.autoSelfFocus = true;
	mPu.forceBreakAt = 29; //minimum number of chars needed to force a break, is applied to attributes with 'forcewordwrap' on.
	mPu.brokenSign = '&lt;span class="mpopbrspan"&gt;&amp;raquo;&lt;/span&gt;&lt;br /&gt;'
	//new with 2001
	mPu.allowSuppress = true;
	//version
	mPu.embeddedPrefsVersion = 2004;</p>
<p>	mPu.defCSS = '/* embedded css version 2.02 Skin Name: Minimal Transparent */'
	+'#mpopupc, #mpopdblprnt, #mpopupdbl {'
	+'	color: black !important;	width: auto !important;	height: auto !important;'
	+'	padding: 0 !important;	margin: 0 !important;	position: absolute;	top: 0; left: 0;'
	+'	background: #EEE none !important; text-align: left !important}'
	+'#mpopdblprnt {padding:1px !important; max-width:80% !important;}'
	+'#mpopdbl {position: relative;}'
	+'#mpopupc, #mpopdbl, #mpopdbl div, #mpopupc div, #mpopbod div, #mpopbod&gt;div&gt;div&gt;div {'
	+'	font: 12px "Trebuchet MS", Trebuchet, Verdana, Sans-Serif !important;'
	+'	border-width: 0 !important;	margin: 0; padding: 0;	}'
	+'#mpopupc {'
	+'background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABCCAYAAADjVADoAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABuSURBVHja7NAxDQAwCAAwwL%2FGedhPAj5IK6E5%2FV8QpUCECBEiRIgQIUKECBEiRIgQIUKECBEiRIgQIUKECBEiRIgQIUKECBEiECFChAgRIkSIECFChAgRIkSIECFChAgRIkSIECFChIgLVgABBgDHFAROmd3kzgAAAABJRU5ErkJggg%3D%3D) !important;'
	+'border: 2px solid #222 !important; opacity: 0.9; padding: 0.2em 0.3em !important;}'
	+'#mpoptop {display:none}'
	+'#mpopbot {display:none}'
	+'#mpopbod {'
	+'	padding:0 !important;	margin: 0 !important; border-width: 0 !important;}'
	+'#mpopbod&gt;div {'
	+'	padding:0 !important; margin: 0 !important; border-width: 0 !important;}'
	+'#mpopbod&gt;div&gt;div {'
	+'	position:relative;'
	+'	padding:1px !important; margin: 0 !important; border-width: 0 !important;}'
	+'#mpopbod&gt;div&gt;div&gt;div {	margin:0 !important; word-wrap: break-word;}'
	+'#mpopdbl {	max-width: 320px !important;	margin: 0 !important; padding: 0 1px !important;	word-wrap: break-word;}'
	+'#bmtest {	top: 0; left: 0;	position: absolute;	border-width: 0 !important;	margin: 0 !important;	}'
	+'span.mpop_cl, span.mpop_al {'
	+'	font-weight: bold;	background-color: #1F2C2F;	color: #EAE9DA;	font-style: italic;'
	+'	font-variant: small-caps;	font-size: 90%;	padding: 0 0.6em 0 0.3em;	margin-right: 0.3em;}'
	+'span.mpop_al {background-color: red}'
	+'span.mpopbrspan {color: red;}'</p>
<p>	;</p>
<p>	//not for modification.
	mPu.minimumReqPrefsV = 2002;</p>
<p>	if (allowRemotePrefs &amp;&amp; mPu.setMPPrefsExternal &amp;&amp; mPu.minimumReqPrefsV &lt;= mPu.prefsVersion) mPu.setMPPrefsExternal();
	else if (!mPu.noExtPrefs) {
		if (window.opera&amp;&amp;opera.postError) opera.postError ("Multipopup Error:\nMinimum required prefs version is:"+mPu.minimumReqPrefsV+"\nExternal prefs version installed:"+mPu.prefsVersion+'\n Using internal preferences instead.\nIf you delete the external prefs or update it to the latest, this warning will not be displayed.');
	}</p>
<p>	if (allowRemotePrefs &amp;&amp; mPu.setRemotePrefs) mPu.setRemotePrefs();</p>
<p>	if (typeof(mPu.appendToExistingCSS) != 'undefined') {
		if (mPu.appendToExistingCSS) mPu.defCSS += mPu.setMPSkinExternal();
		else mPu.defCSS = mPu.setMPSkinExternal();
	}</p>
<p>	}</p>
<p>}</p>
<p>// --></script></p>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=9</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile Information Needs and Design</title>
		<link>http://frontended.com/?p=6</link>
		<comments>http://frontended.com/?p=6#comments</comments>
		<pubDate>Tue, 26 Aug 2008 02:21:10 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Research]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[observational]]></category>
		<category><![CDATA[user-centered design]]></category>

		<guid isPermaLink="false">http://frontended.com/articles/?p=6</guid>
		<description><![CDATA[Researchers at UC San Diego conducted a diary study of 20 people's mobile information needs over the course of two weeks (Sohn, Li et al 2008). At the end of the day their analysis shows us what users really need when their mobile and helps us design more effective mobile site profiles.]]></description>
			<content:encoded><![CDATA[<p>Researchers at UC San Diego conducted a diary study of 20 people’s mobile information needs over the course of two weeks (Sohn, Li et al 2008). At the end of the day their analysis shows us what users really need when their mobile and helps us design more effective mobile site profiles.</p>
<p>In their analysis, Sohn et al dissected 421 information needs and analyzed the heck out of them. But the most interesting findings are probably just the information needs themselves. They placed each need into one of 16 categories. The following categories occurred most frequently:</p>
<ol>
<li>Trivia (e.g. How did Bob Marley die?) : 18.5%</li>
<li>Directions to a known destination: 13.3%</li>
<li>Directions to a Point of Interest (destination unknown): 12.4%</li>
<li>Friend information: 7.6%</li>
<li>Shopping: 7.1%</li>
</ol>
<p>Of course, you can make the common academic comment that people would make about these types of studies, which is:</p>
<blockquote><p>“But people only think of these information needs because it’s the type of information that’s actually available on the web…if their minds were open to reporting <em>any</em> information need, we’d probably see a lot more variation or a lot more needs over a period of two weeks from 20 people.”</p></blockquote>
<p>After reading the article, though, I can tell you that these researchers did a lot to try and <em>not</em> bias the results. I’ll let you read about their methods in the article though (linked below).</p>
<p>At any rate, the raw categorical data <em>does </em>shed some light on how you can design a site’s mobile profile to better address mobile users. For example, if you’re designing a site for a floral shop, you may want to make directions and pricing information more prominent in the mobile profile than in the large screen profile. The directions section would ideally ask someone to type in their “from” address, and submit the form to take them to a mapping service with directions to your store. The pricing section might have three elements:</p>
<ul>
<li>a search box at the top for quick flower or arrangement lookups,</li>
<li>a list of 3 to 5 of the most popular flower arrangements or flowers,</li>
<li>and perhaps a one-click reservation button that allows users to reserve a flower by entering their name and date. (I can think of several friends whose anniversaries would be saved by such a feature)</li>
</ul>
<p>Their study goes into a lot more detail about the reasons people do or don’t address their information needs while mobile, but I found those conclusions didn’t help as much as understanding the type of information users need in the first place. If you want to read more about the study, you can download it at <a href="http://www.cs.ucsd.edu/%7Etsohn/">Tim Sohn’s page </a>at the University of California, San Diego.</p>
<p>P.S. I orginally posted this article at <a href="http://www.refreshtallahassee.org/2008/08/mobile-information-needs-and-design/">RefreshTallahassee.org</a>, but figured I&#8217;d add it to my own blog since, well, right now it&#8217;s not much of a blog.</p>
<p><strong>References</strong></p>
<p><a href="http://www.cs.ucsd.edu/%7Etsohn/pdf/tsohn-mobileneeds-chi08.pdf">Sohn, T. et al  (2008).A diary study of mobile information needs. Conference on Human Factors in Computing Systems, 433-442.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=6</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Welcome</title>
		<link>http://frontended.com/?p=5</link>
		<comments>http://frontended.com/?p=5#comments</comments>
		<pubDate>Tue, 03 Jun 2008 16:36:38 +0000</pubDate>
		<dc:creator>bernie</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frontended.com/articles/?p=5</guid>
		<description><![CDATA[Hi Everyone, This blog is geared at the design of software interfaces. Hopefully over the coming months you&#8217;ll see analyzes of various peer-reviewed and sometimes even non-peer-reviewed journal articles that address frontend design. Some common terms that you might think of when you think of frontend design include interaction design, usability, user experience and information [...]]]></description>
			<content:encoded><![CDATA[<p>Hi Everyone,</p>
<p>This blog is geared at the design of software interfaces. Hopefully over the coming months you&#8217;ll see analyzes of various peer-reviewed and sometimes even non-peer-reviewed journal articles that address frontend design. Some common terms that you might think of when you think of frontend design include interaction design, usability, user experience and information architecture. If you&#8217;re into that kind of stuff, you and I will get along just fine.</p>
<p>For those of you not terribly familiar with these terms, just send me an email and I&#8217;ll be glad to help you get a feel for the field. I&#8217;ve only been working in it for about 3 years, but have absolutely fallen in love with the field and its potential to improve the quality of life of end users all over the globe.<br />
Until later!<br />
Hope you enjoy this!<br />
Bernie</p>
]]></content:encoded>
			<wfw:commentRss>http://frontended.com/?feed=rss2&amp;p=5</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
