<?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>Insights Four51 &#187; Advanced Technology</title>
	<atom:link href="http://www.insightsfour51.com/?feed=rss2&#038;cat=3" rel="self" type="application/rss+xml" />
	<link>http://www.insightsfour51.com</link>
	<description>Insights Four51 features blog posts and podcasts from Four51. Four51 develops On-Demand Smart Catalog Technology that helps complex, distributed corporations streamline the requisition-to-reconciliation process for indirect goods.</description>
	<lastBuildDate>Mon, 16 Aug 2010 17:38:19 +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>Internet Explorer 8 &amp; Developer Tools</title>
		<link>http://www.insightsfour51.com/?p=976</link>
		<comments>http://www.insightsfour51.com/?p=976#comments</comments>
		<pubDate>Thu, 25 Jun 2009 15:47:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=976</guid>
		<description><![CDATA[For a long time I&#8217;ve touted the beauty of Firefox&#8217;s Firebug plug in. It was revolutionary for JavaScript developers. If you weren&#8217;t using it, you weren&#8217;t doing it right. After the last release it was time to upgrade IE to version 8, and one of the biggest things I wanted to check out were the [...]]]></description>
			<content:encoded><![CDATA[<p>For a long time I&#8217;ve touted the beauty of Firefox&#8217;s Firebug plug in.  It was revolutionary for JavaScript developers.  If you weren&#8217;t using it, you weren&#8217;t doing it right.  After the last release it was time to upgrade IE to version 8, and one of the biggest things I wanted to check out were the new developer tools.  I&#8217;ve spent some time using them this morning and my first impression is pure elation.</p>
<p>Anyone that has written JavaScript knows how difficult it can be making that code work in every browser.  Debugging your code in those browsers was painful without tools like Firebug.  Still, all too often you&#8217;d get everything working really well only to find that IE wasn&#8217;t happy with your work.  I&#8217;d say this has caused me to go bald, but that happened way too long ago.</p>
<p>The new <a href="http://msdn.microsoft.com/en-us/library/dd565622(VS.85).aspx">IE Developer Tools</a> are simply amazing.  They&#8217;ve incorporated nearly everything that Firebug offered (it is missing hover over variables) and I think they&#8217;ve improved on the user interface.  Plus, Firebug development has slacked in keeping up with Firefox upgrades and still has some very annoying bugs.  I am contemplating switching over to IE8 for my primary JavaScript development environment and I honestly am surprised I&#8217;m writing that.  </p>
<p>I urge each of you that follow this section of the blog to try out the new tools for yourself.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=976&title=Internet+Explorer+8+&#038;+Developer+Tools&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=976&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=976</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Custom User Fields</title>
		<link>http://www.insightsfour51.com/?p=970</link>
		<comments>http://www.insightsfour51.com/?p=970#comments</comments>
		<pubDate>Fri, 19 Jun 2009 19:54:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=970</guid>
		<description><![CDATA[Our latest release included a feature that many customer have asked for, custom user fields. This feature allows you to create new fields and assign them to your buyer companies, groups and users. If you allow your user&#8217;s to edit the fields they will be displayed in their self admin profile. These field values are [...]]]></description>
			<content:encoded><![CDATA[<p>Our latest release included a feature that many customer have asked for, custom user fields.  This feature allows you to create new fields and assign them to your buyer companies, groups and users.  If you allow your user&#8217;s to edit the fields they will be displayed in their self admin profile.  These field values are available to you as tokens throughout the site.  <em>You can reference them in themes, site customization, spec forms and even auto emails</em>.  With the explanation of the feature the question then becomes, &#8220;What do I do with them?&#8221;  I want to cover a few ways that they can be used to your benefit.</p>
<p>I want to go beyond the simple &#8220;You can use it as a default value&#8221; in a spec form. I think that&#8217;s understood because you&#8217;ve always been able to use those default value tokens before.  I&#8217;d like to take a different path.  I will diagram how you can use custom user fields and tokens to display contact information for their assigned customer service representative on your Home Page.</p>
<p>I&#8217;ll first create a new user field named &#8220;Rep&#8221; and make it a selection type.  I&#8217;ll set it to display to the user and add some choices for the dropdown and save.  Then I&#8217;ll assign it to the entire company.</p>
<p>Now, I&#8217;ll put the contact information on the home page through the Buyer Site Customization Home Page template.  The home page customization looks like this:</p>
<p><code>[[CustomMessage]]<br />
<span id="CustRep" style="display: none;">[[Rep]]</span></p>
<div id="ContactInfo" style="font-size: 12pt; font-weight: bold; color: maroon;"></div>
<p><script type="text/javascript">
var info = {
	"Joe Mauer": "612-123-4567",
	"Justin Morneau": "612-987-6547",
	"Francisco Liriano": "952-321-9877",
	"Joe Nathan": "952-987-3214"
}</p>
<p>var rep = document.getElementById("CustRep").innerHTML;
var display = document.getElementById("ContactInfo");</p>
<p>display.innerHTML = "Please contact " + rep + " at " + info[rep] + " with any questions";</p>
<p></script><br />
[[Catalog]]<br />
[[Messages]]<br />
[[Orders]]</code></p>
<p>What I&#8217;ve done first is create a span element that will hold the <strong>Rep</strong> token value.  Giving the span an ID property allows me to reference it in a script easily.  I then added a div element to hold the result of the script.  It will be what is displayed on the page.  Then I add the script.  I created a <a href="http://json.org/">JSON</a> object that holds a key value pair that matches the Customer Service reps in the custom user field with phone numbers.  Just a simple example.  At this point I declare a variable, &#8220;rep&#8221;.  That variable value points to the span element I created to hold the token. Referencing the innerHTML property returns the value the token renders on the page.  Finally, I take the token value, look up the pair in the JSON data object, and write it out to the &#8220;ContactInfo&#8221; div element so it will display on the Home page. </p>
<p>This example doesn&#8217;t hold any real world value.  I just want to demonstrate to you how, with some imagination, you can do so many things with the information available to you in the new Custom User Fields. As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site play with the example I documented today. </p>
<p>If you have any questions about this blog post, please join us on the <a href="http://forum.four51.com">forum</a>.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=970&title=Using+Custom+User+Fields&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=970&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=970</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Document Actions Series: ResizePage</title>
		<link>http://www.insightsfour51.com/?p=715</link>
		<comments>http://www.insightsfour51.com/?p=715#comments</comments>
		<pubDate>Fri, 13 Feb 2009 16:26:08 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=715</guid>
		<description><![CDATA[Resizing a page is a capability that so many project builders have requested. Generally, there is a better alternative, but if you feel this is the only solution we&#8217;ve built a powerful set of document actions that will handle page resizing for you. I&#8217;ve created a demo project that allows for width and height inputs. [...]]]></description>
			<content:encoded><![CDATA[<p>Resizing a page is a capability that so many project builders have requested.  Generally, there is a better alternative, but if you feel this is the only solution we&#8217;ve built a powerful set of document actions that will handle page resizing for you.</p>
<p>I&#8217;ve created a demo project that allows for width and height inputs.  This is just one example of the 4 types of document actions.</p>
<p>There are 4 different page resize document actions: <em>ResizePage, ResizeWidth, ResizeHeight, ResizePageByPercentage</em>.  The demo focuses on the ResizePage action, but the principles are the same. </p>
<p>The first thing to consider is that these actions require proper measurement values.  For example, you can define a page size with the following values: Width <strong>= 5in, Height = 3in</strong>.  If the input is not in the proper measurement format an error will be thrown.  That&#8217;s why the demo uses a dropdown selection.  That makes enforcement of those measurement formats easy.</p>
<p>Another major factor to consider is that these actions ONLY resize the page.  Not the objects on the page.  If that&#8217;s an issue you will have to ensure you&#8217;ve set all your project elements to flex appropriately.  In the demo each element has many flex and copy fit rules applied.  It will render correctly with any dimensions that are chosen. </p>
<p>I&#8217;ll repeat that these actions are most likely never the best solution for your products.  They have a great probability of formatting your output incorrectly and without warning.  The more content on a document the more likely it is there will be problems.  I almost always recommend using multiple projects and or variable documents.</p>
<p>I have set up a <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> product named &#8220;Documents Actions ResizePage&#8221;. Go to the site to see it in action, and also download the project files I created.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=715&title=Document+Actions+Series:+ResizePage&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=715&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=715</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Document Actions Series: ScaleImageToFill</title>
		<link>http://www.insightsfour51.com/?p=672</link>
		<comments>http://www.insightsfour51.com/?p=672#comments</comments>
		<pubDate>Fri, 16 Jan 2009 20:42:44 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=672</guid>
		<description><![CDATA[Image scaling, in your Pageflex projects, has steadily improved over time. After beginning with just &#8220;Fit Width&#8221; and &#8220;Fit Height&#8221;, we now have options such as &#8220;Scale to Fit&#8221;. Usually, these options are enough to guarantee your printed product output renders well. However, there are complications that arise when the user is allowed to upload [...]]]></description>
			<content:encoded><![CDATA[<p>Image scaling, in your Pageflex projects, has steadily improved over time.  After beginning with just &#8220;Fit Width&#8221; and &#8220;Fit Height&#8221;, we now have options such as &#8220;Scale to Fit&#8221;.  Usually, these options are enough to guarantee your printed product output renders well.  However, there are complications that arise when the user is allowed to upload their own photo.  Ensuring ratios are met and applied with the built in image scaling options can frequently be troublesome.  Knowing these complications, Pageflex built and released a new document action that will solve many of these problems.</p>
<p>Using the published document action from Pageflex, I changed some of the functionality and imported it into the Four51 Document Actions library. The goal was to make it more flexible and targeted, as well as work more similarly to the existing actions in the library.  Due to the unique nature of this document action I thought a blog post was in order.  Of course, you should use the <a href="http://www.insightsfour51.com/wiki/index.php?title=ScaleImageToFill">wiki</a> as a reference guide.</p>
<p>What does this document action actually do?  It&#8217;s actually pretty simple.  First it gathers the size (width and height) of the image and it&#8217;s parent (area template).  It then compares those sizes to determine the greater difference between the two ratios.  If the height ratio is larger then the image will be scaled to the height of the area template, and vice versa for when the width is greater.  This scaling will obviously leave the image larger than the area template in which it&#8217;s contained, but this is desired.  The area template will crop the excess image area, leaving the entire area template filled with the area the image fits.</p>
<p>The anchor point property of the image controls how the image will be cropped.  If the anchor point is set to Center/Middle it will be cropped evenly on all sides.  If the anchor point is set to Left/Top the image will be cropped on the right and bottom.</p>
<p>Special recognition for this solution goes to Pageflex.  It was their idea and source code that forms the basis for this offering.</p>
<p>This document action example can be viewed and downloaded at the demo <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">site</a>.  The product is named &#8220;Documents Actions Scale Image To Fill&#8221;.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=672&title=Document+Actions+Series:+ScaleImageToFill&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=672&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=672</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Document Actions Series: Text Manipulation</title>
		<link>http://www.insightsfour51.com/?p=516</link>
		<comments>http://www.insightsfour51.com/?p=516#comments</comments>
		<pubDate>Fri, 07 Nov 2008 17:08:49 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Document Actions]]></category>
		<category><![CDATA[Pageflex]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=516</guid>
		<description><![CDATA[As I sit here watching out my windows and seeing snow fall, in early November, I can&#8217;t but think of the &#8220;The Ice Bowl&#8221;. This obviously lead me to think the NFL&#8217;s trademark rights and how that might need to be controlled in their marketing and branding world. I&#8217;ll use that as an example today. [...]]]></description>
			<content:encoded><![CDATA[<p>As I sit here watching out my windows and seeing snow fall, in early November, I can&#8217;t but think of the &#8220;The Ice Bowl&#8221;.  This obviously lead me to think the NFL&#8217;s trademark rights and how that might need to be controlled in their marketing and branding world.  I&#8217;ll use that as an example today.  The basic premise is that the ™ symbol should be inserted after the letters &#8220;NFL&#8221; are printed on the page.</p>
<p>I&#8217;ll use a combination of 2 different document actions (<strong><a href="http://www.insightsfour51.com/wiki/index.php?title=ReplaceText">ReplaceText</a></strong>, <strong><a href="http://www.insightsfour51.com/wiki/index.php?title=Superscript">Superscript</a></strong>).  The project requires only one variable: <em>Text</em>.  Text must be set as Formatted Text kind.</p>
<p>First, I&#8217;ll create the <strong>ReplaceText</strong> action.  This action does precisely what the name suggests.  It takes a character set to find, and when found replaces that text with another set of characters.  In this case I&#8217;m looking for &#8220;NFL&#8221; so that I can replace it with NFL™.  Here is the document action definition:</p>
<blockquote><p>Method: ReplaceText<br />
Arguments:<br />
SpecName (contstant) = Text<br />
OldCharacter (Constant) = NFL<br />
NewCharacters (constant) = NFL™</p></blockquote>
<p>Secondly, I&#8217;ll demonstrate the use of the <strong>Superscript</strong> action.  While it&#8217;s not necessary in this example I wanted to show how it can be used, even in conjunction with another document action.  Here is the document action definition:</p>
<blockquote><p>Method: Superscript<br />
Arguments:<br />
SpecName (constant) = Text<br />
Character (constant) = ™</p></blockquote>
<p>Pretty simple example, but one that I think translates into real world project needs.  I suggest you follow this up by reading on the <strong><a href="http://www.insightsfour51.com/wiki/index.php?title=GetPositionIndex">GetPositionIndex</a></strong> action as well as <strong><a href="http://www.insightsfour51.com/wiki/index.php?title=Suffix">Suffix</a></strong> and <strong><a href="http://www.insightsfour51.com/wiki/index.php?title=Prefix">Prefix</a></strong>.  They are closely related to the actions discussed in this post.</p>
<p>This document action chaining example can be views and downloaded at the <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site.  The product is named &#8220;Documents Actions Calculations&#8221;.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=516&title=Document+Actions+Series:+Text+Manipulation&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=516&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=516</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Document Actions Series: Calculations</title>
		<link>http://www.insightsfour51.com/?p=470</link>
		<comments>http://www.insightsfour51.com/?p=470#comments</comments>
		<pubDate>Fri, 31 Oct 2008 12:00:07 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Documents Actions Calculations]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=470</guid>
		<description><![CDATA[When discussing the Four51 Action library I strive to create relevant examples that match real world scenarios you may encounter in your own departments. In this calculation example I first thought I&#8217;d do a mortgage calculator. Then I realized that it would be extremely difficult to convey in a blog post and who&#8217;s getting mortgage [...]]]></description>
			<content:encoded><![CDATA[<p>When discussing the Four51 Action library I strive to create relevant examples that match real world scenarios you may encounter in your own departments.  In this calculation example I first thought I&#8217;d do a mortgage calculator. Then I realized that it would be extremely difficult to convey in a blog post and who&#8217;s getting mortgage loans in this credit crisis anyway.  So, instead I&#8217;ll keep the calculation simple while still demonstrating the concept of chaining.</p>
<p>The formula is quite simple: <strong> (x * y) / z = Sum</strong>.  So we have three numerators and two calculations to perform to reach our sum.  This requires we use 2 document actions: Multiply and Divide.  The key to accuracy is the order in which we list our document actions.</p>
<p>First, we&#8217;ll create the <strong>Multiply </strong>action.  Take note that the SpecName argument is a constant type.  We are assigning a value to a variable, so we must type the name of that variable as the argument value.</p>
<blockquote><p><strong>Method: Mutipl</strong>y<br />
Arguments:<br />
NumberA (variable) =<br />
NumberB (variable) =<br />
SpecName (constant) = _x_y</p></blockquote>
<p>Lastly, we&#8217;ll take the sum of the multiple operation and <strong>Divide </strong>it by the <em>z</em> value.  Notice in this action we are using the value assigned to the <em>_x_y</em> variable by referring to the variable.</p>
<blockquote><p><strong>Method: Divide</strong><br />
Arguments:<br />
NumberA (variable) = &lt;_x_y&gt;<br />
NumberB (variable) =<br />
SpecName (constant) = Sum</p></blockquote>
<p>And we&#8217;re done.  You can put the Sum variable anywhere in your template file and the calculated value will print.  I didn&#8217;t demonstrate the formatting capabilities, but you should play with them.  They are quite powerful.</p>
<p>This document action chaining example can be viewed and downloaded at the <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site.  The product is named &#8220;<strong>Documents Actions Calculations</strong>&#8220;.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=470&title=Document+Actions+Series:+Calculations&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=470&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=470</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Green Means Secure</title>
		<link>http://www.insightsfour51.com/?p=461</link>
		<comments>http://www.insightsfour51.com/?p=461#comments</comments>
		<pubDate>Thu, 30 Oct 2008 12:00:06 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[App Security]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[verisign]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=461</guid>
		<description><![CDATA[Web site visitors are learning to look for the green address bar in their Web browsers while shopping online. You can also find it in online personal financial management tools like mint.com. Four51 has enabled Extended Validation SSL Certificates to trigger high security browsers such as Internet Explorer 7.0 to prominently display the trusted green address [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="0in 0in 0pt 15pt;"><span><span style="'Arial','sans-serif';">Web site visitors are learning to look for the green address bar in their Web browsers while shopping online. </span>You can also find it in online personal financial management tools like mint.com. Four51 has enabled Extended Validation SSL Certificates to trigger high security browsers such as Internet Explorer 7.0 to prominently display the trusted green address and security bars. </span><span id="more-461"></span></p>
<p class="MsoNormal" style="0in 0in 0pt 15pt;"><img src="https://system.netsuite.com/core/media/media.nl?id=40894&amp;c=515488&amp;h=2b0880ed2068fd0b3928" alt="" width="389" height="274" /></p>
<p class="MsoNormal" style="0in 0in 0pt 15pt;"><span>The security bar also displays Four51 and the trusted VeriSign brand, which help assure your customers they are on the intended Web site and that their transactions are secure. </span></p>
<p class="MsoNormal" style="0in 0in 0pt 15pt;"><span>Additional information on SSL and Extended Validation can be found from Verisign at <a href="http://www.verisign.com/ssl/ssl-information-center/ie7-ssl-security/">http://www.verisign.com/ssl/ssl-information-center/ie7-ssl-security/</a></span></p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=461&title=Green+Means+Secure&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=461&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=461</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>To upgrade or not to upgrade: Pageflex 6</title>
		<link>http://www.insightsfour51.com/?p=455</link>
		<comments>http://www.insightsfour51.com/?p=455#comments</comments>
		<pubDate>Wed, 29 Oct 2008 12:00:40 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Branded Products Distribution]]></category>
		<category><![CDATA[Pageflex]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=455</guid>
		<description><![CDATA[Neither Lynn Anderson nor I ever promised you a rose garden. What does that have to do with anything, you might ask. It reminds me of debates about technology upgrades. When encouraged to upgrade to the latest version of something, we (me included) are at times tempted to push back and say: I don&#8217;t want [...]]]></description>
			<content:encoded><![CDATA[<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]></p>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<p><![endif]--></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Neither Lynn Anderson nor I ever promised you a rose garden. What does that have to do with anything, you might ask. It reminds me of debates about technology upgrades. When encouraged to upgrade to the latest version of something, we (me included) are at times tempted to push back and say: <em>I don&#8217;t want to upgrade. What I have works fine. The new version will undoubtedly have stability issues. And all my employees are trained on the current version, and now you&#8217;re setting us back.</em> And so on. Ad nauseum.</span></p>
<p class="MsoNormal"><span id="more-455"></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Well, no one ever promised that your interface would remain the same forever. DOS gave way to Windows. Progress isn&#8217;t without setbacks, but if you choose technology partners wisely, real progress over time is what you&#8217;ll get. That&#8217;s what you were promised. Protecting your business data, not the interface. Taking advantage of new features means new learning. </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">So, here is something to keep in mind when debating about upgrading to Pageflex 6. The Four51 application support team has upgraded to Pageflex 6 on all our machines. This means that if you require us to open a product we will not be able to upload any changes that we make to it unless you are also using Pageflex 6. Once a project has been saved in Pageflex 6 you will not be able to open it again in an older version.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Help support help you by upgrading. Plus Pageflex 6 has a lot of cool new features!  Check out a recording of the demo I gave on September 25th on the knowledgebase to learn more about it.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Who is your friend? &#8220;Add&#8221; is your friend!</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;">Thank you.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: Arial;"> </span></p>
<p><span style="font-size: 10pt; font-family: Arial;">-Mike &amp; Jim, with all due respect to Lynn </span></p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=455&title=To+upgrade+or+not+to+upgrade:+Pageflex+6&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=455&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=455</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Document Actions Series: SelectImage</title>
		<link>http://www.insightsfour51.com/?p=460</link>
		<comments>http://www.insightsfour51.com/?p=460#comments</comments>
		<pubDate>Fri, 17 Oct 2008 12:32:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Document Actions]]></category>
		<category><![CDATA[SelectImage]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=460</guid>
		<description><![CDATA[Well, document actions have been live for over a week now. Have you examined the new capabilities? The benefits are worth the learning curve. You&#8217;ll find yourself so much more productive, creative, and responsive to your customers. I&#8217;m starting this series on document actions to help with the learning curve and hopefully open the creative [...]]]></description>
			<content:encoded><![CDATA[<p>Well, <strong>document actions</strong> have been live for over a week now.  Have you examined the new capabilities?  <span style="text-decoration: underline;">The benefits are worth the learning curve</span>.  You&#8217;ll find yourself so much more productive, creative, and responsive to your customers.  I&#8217;m starting this series on document actions to help with the learning curve and hopefully open the creative process in your own world.</p>
<p>Today&#8217;s demo of  <a href="http://www.insightsfour51.com/wiki/index.php?title=SelectImage">SelectImage</a> will combine capabilities of some spec form scripting along with the document action.  I&#8217;m trying to cover a scenario I think is widely used throughout Four51.</p>
<p>The idea is to present a dropdown of choices to the user.  Once a choice is made an in-form preview of the image will be displayed.  Once the user saves the variant the <strong>SelectImage </strong>document action will retrieve the correct image for rendering.  Utilizing the document action eliminates the need to create a cumbersome rule, and I&#8217;ll show you how to set the project up in a way that allows you to quickly add new options without having to edit your project and template files.</p>
<p>Let&#8217;s start with the template file.  I&#8217;m going to keep the demo simple by only placing a new image element in the center of the template.  Then, using the element properties I&#8217;m going to give it a name: Jersey.  <strong>The name property is available in the &#8220;Info&#8221; tab of the properties window</strong>.</p>
<p>Next, I want to create two variables in the project file: I<em>mageChoice, Images</em>.  Both variables are constant plain text types.</p>
<p>The last task within the project files is to create the jobs and define the document action.  I&#8217;ll only cover the arguments because you should be familiar with adding a document action by now.  The SelectImage action has 4 arguments: ImageElement, Case, SourceArray, ErrorMessage.</p>
<ul>
<li>The <strong>ImageElement</strong> is looking for the name of the element that will get the image assignment.  Remember above that we named the element &#8220;Jersey&#8221;, so we&#8217;ll just keep the value type Constant and type &#8220;Jersey&#8221; into the vaue field.</li>
<li>The<strong> Case</strong> argument is the value indicator.  Meaning that the selection value should be applied to this argument.  In our demo that value is the ImageChoice variable, so I set the Value Type to Variable and then select the variable from the list.</li>
<li>The <strong>SourceArray</strong> is the array of image choices.  They are essentially key value pairs.  There is a key (dropdown text) and a value (image) in each pair.  The keys should exist in our dropdown options and the values should match images in the project image folder.  I&#8217;m going to choose Variable Value Type and select the Images variable from the list as the argument value.  This is what will allow you to add new options without needing to edit your project files.</li>
<p>Now that our project is complete and we&#8217;ve created the product on Four51, let&#8217;s set up the spec form and script.</p>
<p>First, the variable import for <strong>ImageChoice</strong> will be defaulted as text, but we want to make it a selection and add our choices: <em>Green Bay, Indianapolis, Tennessee</em>.  For ease of reading I&#8217;m setting the Image variable to have 10 lines and 5000 characters.  I&#8217;m also setting the default to the <strong>SourceArray</strong> value.  This is the key to the update without touching the project file.<br />
<code>{Green Bay=gbhome.jpg}<br />
{Indianapolis=indyhome.jpg}<br />
{Tennessee=tenhome.jpg}</code></p>
<p>The spec form has little change to the default. I&#8217;m basically adding an image html element (id = preview) for the in-form preview:</p>
<p><code></p>
<table class="SpecForm" border="0">
<tbody>
<tr class="SpecEvenRow">
<td class="SpecLabel">ImageChoice</td>
<td class="SpecPrefix"></td>
<td class="SpecControl">[[ImageChoice]]</td>
</tr>
<tr>
<td></td>
<td></td>
<td valign="top"><img id="preview" alt="" /></td>
</tr>
<tr class="SpecOddRow">
<td class="SpecLabel">Images</td>
<td class="SpecPrefix"></td>
<td class="SpecControl">[[Images]]</td>
</tr>
</tbody>
</table>
<p></code><br />
Lastly, we&#8217;ll write our script for previewing the image.  You&#8217;ve seen this before so I won&#8217;t go into great detail:</p>
<p><code><br />
var preview = get('preview');<br />
var image_choice = spec['ImageChoice'];<br />
var path = "http://www.four51.com/Themes/Custom/de891832-01b5-4c5d-84da-b4f85e394864/demo/jerseys/";</p>
<p>var images = {<br />
"Green Bay": "gbhome.jpg",<br />
"Indianapolis": "indyhome.gif",<br />
"Tennessee": "tenhome.jpg"<br />
}</p>
<p>function Display() {<br />
preview.imgSrc(path + images[image_choice.selectedText()]);<br />
}</p>
<p>image_choice.onchange = Display;<br />
image_choice.removeOption(0);<br />
// Normally I'd hide this variable, but I'm leaving it visible for the demo.<br />
//spec['Images'].hide();<br />
Display();<br />
</code></p>
<p>You can see the comment regarding leaving the Images variable visible.  I wouldn’t want a customer to see this obviously, but I&#8217;m leaving it for the demo.</p>
<p>Now that we&#8217;re done setting up the product you can continually add new image options by simply updating the options in the two variable.  Your project is equipped to handle that without intervention.</p>
<p>I have set up a <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> product named &#8220;<strong>Documents Actions Select Image</strong>&#8220;. Go to the site to see it in action, and also download the project files I created.</ul>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=460&title=Document+Actions+Series:+SelectImage&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=460&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=460</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Selling to Uncle Sam: Federal Information Processing Standard</title>
		<link>http://www.insightsfour51.com/?p=441</link>
		<comments>http://www.insightsfour51.com/?p=441#comments</comments>
		<pubDate>Mon, 06 Oct 2008 14:00:26 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Sales and Marketing]]></category>
		<category><![CDATA[App Security]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=441</guid>
		<description><![CDATA[Most of the Four51 product development requests are customer driven, focused on operating better or selling more. I was asked recently if it was possible to use the application for purchasing by US government employees. I replied with a definitive “I don’t know.” After understanding the specifics of the question, the answer is “Yes,” and [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="0in 0in 10pt;"><span style="Calibri;">Most of the Four51 product development requests are customer driven, focused on operating better or selling more.<span style="yes;"> </span>I was asked recently if it was possible to use the application for purchasing by US government employees.<span style="yes;"> </span>I replied with a definitive “I don’t know.”<span style="yes;"> </span>After understanding the specifics of the question, the answer is “Yes,” and this is why:</span><span id="more-441"></span></p>
<p class="MsoNormal" style="0in 0in 10pt;"><span style="Calibri;">For government employees to use online purchasing applications like Four51, they are required to be compliant with something called FIPS, which stands for the </span><a href="http://en.wikipedia.org/wiki/Federal_Information_Processing_Standard"><strong><span style="none;"><span style="Calibri;">Federal Information Processing Standard</span></span></strong></a><span style="Calibri;">.<span style="yes;"> </span>This standard requires a government employee’s browser to be configured to have non-FIPS-compliant cipher suites disabled.<span style="yes;"> </span>This means that those sites that are non FIPS compliant would not operate in the user’s browser.<span style="yes;"> </span>Because Four51 uses a FIPS compliant cipher suite called DES-CBC3-SHA, the user’s browser will work with the Four51 application.</span></p>
<p class="MsoNormal" style="0in 0in 10pt;"><span style="Calibri;">There is a good article by Roger Grimes of Infoworld that you may want to read if you are interested in <span style="yes;"> </span>more information on the Federal Information Processing Standard.<span style="yes;"> The article can be found at </span><a href="http://weblog.infoworld.com/securityadviser/archives/2008/02/is_your_web_sit.html">http://weblog.infoworld.com/securityadviser/archives/2008/02/is_your_web_sit.html</a></span></p>
<p class="MsoNormal" style="0in 0in 10pt;">In the meantime, you can sleep easy, knowing that Four51 has it all taken care of.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=441&title=Selling+to+Uncle+Sam:+Federal+Information+Processing+Standard&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=441&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=441</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pageflex Upgrade Supplement</title>
		<link>http://www.insightsfour51.com/?p=437</link>
		<comments>http://www.insightsfour51.com/?p=437#comments</comments>
		<pubDate>Thu, 25 Sep 2008 14:00:42 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Four51 Tools]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=437</guid>
		<description><![CDATA[Hopefully you&#8217;ve received an invite to our Pageflex upgrade webinar. If not, the information to attend is here. If you create or manage variable products on Four51, you do not want to miss this demo. There are some amazing new features you will want to take advantage of in your products. I&#8217;m going to supplement [...]]]></description>
			<content:encoded><![CDATA[<p>Hopefully you&#8217;ve received an invite to our Pageflex upgrade webinar.  If not, the information to attend is <a href="https://four51.webex.com/four51/j.php?ED=99672037&amp;RG=1&amp;UID=0">here</a>.  If you create or manage variable products on Four51, you do not want to miss this demo.  There are some amazing new features you will want to take advantage of in your products.</p>
<p>I&#8217;m going to supplement that demo with a few additional pieces of information.  We&#8217;ve created a Four51 App Exchange wiki. I want to answer some expected questions regarding the Four51 Toolbar, and I&#8217;ll demonstrate a document action that I believe will be very popular.<span id="more-437"></span></p>
<p>First, the wiki.  Hopefully you&#8217;re aware of <a href="http://en.wikipedia.org/wiki/Wiki">wiki&#8217;s</a>.  <a href="http://www.wikipedia.org">Wikipedia</a> is the headliner.  I don&#8217;t think I know any person that hasn&#8217;t at least visited that site.  I feel that Pageflex&#8217;s Document Actions feature open limitless possibilities for your products.  I attempted to identify the most obvious uses and created the Four51 Actions library.  That library makes it possible for you to take advantage of this powerful feature without having to write your own code.  However, it does not expose all the capabilities of Document Actions.  I want to encourage you to examine them.  The API reference is installed with your upgraded version of Pageflex Persona. I understand the learning curve involved, so I felt that allowing you to see how we&#8217;ve created the <a href="http://www.insightsfour51.com/wiki/index.php?title=Four51_Document_Actions">Four51 Actions</a> library would be the most helpful jump start in this process.  The library is <a href="http://www.insightsfour51.com/wiki/index.php?title=Source">open source</a> and each action is defined in the wiki.  Please come <a href="http://www.insightsfour51.com/wiki/index.php?title=Special:UserLogin&amp;returnto=Four51_Application_Exchange">join </a>the community.  Post comments in the <a href="http://www.insightsfour51.com/wiki/index.php?title=Talk:Four51_Application_Exchange">discussion pages</a>, or even contribute new document actions to be included in the official library.</p>
<p>Nothing has been more requested for projects than the ability to <strong>customize text</strong> in the spec form.  Pageflex&#8217;s .EDIT feature (I believe they refer to this as Free Edit now) is an impressive and robust offering. However, it is generally not suited to the products you offer to your customers.  The need to basically design a layout is far above and beyond most customers needs.  I decided to focus on the most requested capability, the text styling needs.  The Four51 Document Actions Toolbar allows for bolding, italicizing, underlining, and a few other capabilities within the spec form.  I predict two questions to be asked immediately:  <strong>What about setting the font type, and color? </strong>There are limitations with HTML that prevent those features from being applied.  The toolbar&#8217;s editing feature allows the text to be displayed in the spec form just as it would appear in the rendered template.  Because HTML does not allow for more than 7 defined fonts on one page there is no way to produce the &#8220;<strong>what you see is what you get</strong>&#8221; aspect.  Additionally, for a website to display text in a particular font every individual visiting that page must have the same font installed locally.  Based on the 8,000 installed fonts for the rendering servers, not many people would have the fonts installed on their computers.  Allowing for color choice is also prevented by a particular limitation of technology.  HTML requires RGB color definitions.  If you needed the print production output to be CMYK there is no formula for converting RGB to CMYK.  The &#8220;what you see is what you get&#8221; aspect is again broken.  Fret not.  There are document actions that allow you to customize text properties with all of these options, but they will not work within the &#8220;what you see is what you get&#8221; functionality of the toolbar.</p>
<p>Along the lines of text styling I have set up a <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> product named &#8220;Documents Actions Paragraph Styling&#8221; that shows the capabilities of the <strong>DefineParagraphStyle </strong>Four51 Document Action.  The open textbox has 4 properties that are definable.  Go to the site to see it in action, and also download the project files I created.</p>
<p>I hope you all are as excited about the possibilities these new service offerings bring you.  When asked if something can be done now my answer is always &#8220;You can do anything with Document Actions&#8221;.  Let&#8217;s all push the limits and see what wonders we can create.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=437&title=Pageflex+Upgrade+Supplement&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=437&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=437</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What happens when a Network becomes a Not-Work?</title>
		<link>http://www.insightsfour51.com/?p=419</link>
		<comments>http://www.insightsfour51.com/?p=419#comments</comments>
		<pubDate>Fri, 05 Sep 2008 16:11:46 +0000</pubDate>
		<dc:creator>Ross</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Branded Products Distribution]]></category>
		<category><![CDATA[Networks]]></category>
		<category><![CDATA[PCI]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=419</guid>
		<description><![CDATA[Many of you may have read about the computer failure at the Federal Aviation Administration and the subsequent delays it caused for hundreds of flights throughout the US. There was never a safety issue, but the glitch raises important questions about the resiliency and reliability of any modern computer network. As it turns out, the [...]]]></description>
			<content:encoded><![CDATA[<p>Many of you may have read about the <a href="http://www.washingtonpost.com/wp-dyn/content/article/2008/08/26/AR2008082602203.html">computer failure at the Federal Aviation Administration</a> and the subsequent delays it caused for hundreds of flights throughout the US.  There was never a safety issue, but the glitch raises important questions about the resiliency and reliability of any modern computer network. As it turns out, the FAA <em>did </em>have a backup system available, but that system quickly became overwhelmed and it wasn’t until later in the day that the system was able to manage flights properly. <strong>All of this begs the question “What is the point of having a backup system if it is unable to step in and save the day when called upon?”</strong></p>
<p><span id="more-419"></span></p>
<p>The systems management team at Four51 asks itself that very question, and many others, as we design and maintain the hardware backbone of the Four51 network. Four51 maintains a fully-redundant, state-of-the-art network that has stood up to the scrutiny not only of our IT industry peers, but to a <a href="https://www.pcisecuritystandards.org/">Payment Card Industry </a>(PCI) audit (arguably one of the most rigorous IT audits in the industry). As an example, the database environment, where all of your information is stored, has twice the amount of hardware required to run the Four51 network dedicated to it at all times. If something happens and one of the database servers decides to call in sick, one of the other servers automatically and immediately picks up the slack with no data loss or downtime. It’s the IT equivalent of having two brand new cars in your garage, but one of them is a spare in case one needs to see the mechanic.</p>
<p>Our dedication to providing a fast, reliable network doesn’t stop at simply having extra hardware on hand. We have an entire team that constantly monitors the network for performance problems or potential bottlenecks. We have an intelligent monitoring system in place to determine when the application may be performing poorly before it impacts you, and most of the time performance problems are corrected before they are even noticed. Combine this with an off-site backup and recovery plan, and short of a hurricane coming up the Mississippi and wiping out Minneapolis there really isn’t  much that can take the network down.</p>
<p>Sure, cell phones still go off at 3AM waking Jeff and I up to tell us that one of the servers might be a little cranky. Sometimes, regardless of how much you plan things out, things just happen. However, I feel a great deal of pride when I read an article like the one mentioned above and I can say to myself “<em>that </em>wouldn’t happen at Four51.” We’re proud of our infrastructure and our network&#8230;.and as our valued clients, you should be too.</p>
<p>Cheers.</p>
<p>Ross</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=419&title=What+happens+when+a+Network+becomes+a+Not-Work?&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=419&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=419</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Approval Rules (part one)</title>
		<link>http://www.insightsfour51.com/?p=402</link>
		<comments>http://www.insightsfour51.com/?p=402#comments</comments>
		<pubDate>Fri, 15 Aug 2008 13:00:40 +0000</pubDate>
		<dc:creator>Chris G</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Approval Rules]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=402</guid>
		<description><![CDATA[When we added approval rules to Four51, the goal was to create a system flexible enough to support complicated business processes, while keeping simple processes simple. I think we did a pretty good job of it, but our documentation mostly covers the advanced side of the system, and can be a little overwhelming if you’re [...]]]></description>
			<content:encoded><![CDATA[<p>When we added approval rules to Four51, the goal was to create a system flexible enough to support complicated business processes, while keeping simple processes simple.  I think we did a pretty good job of it, but our documentation mostly covers the advanced side of the system, and can be a little overwhelming if you’re just starting and only care about the basics. So I’ve put together a brief run-through of how approval rules work and some samples. Today, I’ll go over the basics of how it all works. I’ll follow up soon with some samples and a round-up of tips, tricks and common gotchas.</p>
<p><strong>The two sentence summary:</strong>  At submission time, a standard buyer order can have one or more required approvals attached to it. Until all attached approvals are approved, the order can’t proceed.  </p>
<p>That sounds obvious, but how do orders get approvals attached?</p>
<p>At its core the system is pretty simple&#8211;Four51 grabs the list of approval rules for the buyer company and looks at each rule on the list. If a rule applies to the submitting user, the order meets all the requirements specified in the rule and the submitting user isn’t one of the approvers, an approval is attached to the order. After the rules are processed, approving parties are notified and pending approvals appear on the order view page. When an order is approved, the process is repeated, with the list checked using the approving user instead of the original submitting user.  </p>
<p>Eventually, the order clears the list check with no pending approvals and goes through to the seller.  Alternately, the approval is declined and the seller will never see it.</p>
<p>In reality, it’s a little more complicated than that.  </p>
<p>Each buyer company actually has two lists of rules, configured under Buyers->Approval Rules. There’s a parallel list and a sequential list. When an order is submitted, every rule on the parallel list is checked. The sequential list, however, is checked only until the first match is found. Because rules following a match will not be evaluated, rule order matters for the sequential list. You only need to care about which list you use if you have a workflow that requires multiple approvers or chains of approval, and I’ll get into why you may need both in a later post. If in doubt, just use the parallel list.</p>
<p>The biggest task in configuring approval rules is figuring out how to break your workflow down into a set of rules. I’ll walk you through this in my next post.</p>
<p>Chris G</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=402&title=Advanced+Technology:+Approval+Rules+(part+one)&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=402&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=402</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Defined Drop Downs</title>
		<link>http://www.insightsfour51.com/?p=401</link>
		<comments>http://www.insightsfour51.com/?p=401#comments</comments>
		<pubDate>Fri, 01 Aug 2008 15:32:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=401</guid>
		<description><![CDATA[A recent forum post alerted me to the fact that I had not covered defined drop downs in the blog. I don&#8217;t know how I let that slip by. I created them to alleviate some very annoying situations that probably occur too many times to count. Basically, defined drop downs automatically populate the list with [...]]]></description>
			<content:encoded><![CDATA[<p>A recent <a href="http://public.four51.com/forum/topic.asp?TOPIC_ID=78">forum</a> post alerted me to the fact that I had not covered defined drop downs in the blog.  I don&#8217;t know how I let that slip by.  I created them to alleviate some very annoying situations that probably occur too many times to count.  Basically, defined drop downs automatically populate the list with a list of companies or states so you don&#8217;t have to do it yourself.</p>
<p>As I said above, there are two definitions available: Countries, States.  Only those two now because I reference the list we already use in the site, and I couldn&#8217;t think of any other consistent lists that are used frequently.</p>
<p>The defined drop downs widget is another of the type that allows you to define it in your HTML instead of scripting.  It&#8217;s extremely simple to use:<br />
<code><span class="States"><span class="Country"></code>  Just create a <em>span</em> element and assign a class name corresponding to the list you want.  The default usage displays the full name of the item, but records the abbreviation as the value.  For example, Minnesota = MN.</p>
<p>Now, you know it doesn&#8217;t end there.  We had to add some fanciness and flexibility.  You have to use scripting to take advantage of those capabilities.<br />
<code>spec['States'].statedropdown({displayType: "abbr"});<br />
spec['States'].statedropdown.onChange = function() {<br />
	alert('You chose: ' + this.selectedText() + ' and the value is: ' + this.selectedValue());<br />
}</code>  This code example defines the drop down as a list of states, but the display is the abbreviation rather than the full name.  Additionally, whenever an item in chosen in the drop down, the browser will pop up an alert showing what was chosen.</p>
<p>There are additional properties and events available that you can read about in the Spec Form API documentation.  You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a>  site to find the “Spec Form API Playground.” I’ve added an example of both types of DefinedDropDowns.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=401&title=Advanced+Technology:+Defined+Drop+Downs&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=401&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=401</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: What&#8217;s so Funny?</title>
		<link>http://www.insightsfour51.com/?p=386</link>
		<comments>http://www.insightsfour51.com/?p=386#comments</comments>
		<pubDate>Mon, 28 Jul 2008 15:33:13 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=386</guid>
		<description><![CDATA[As many of you know, we are going through some font procedure changes. Our rendering servers reached the 8,000 installed font range. I would never have guessed there were that many fonts in the world. We&#8217;ve been working very diligently to get this under control and it&#8217;s required a tremendous amount of research and evaluation. [...]]]></description>
			<content:encoded><![CDATA[<p>As many of you know, we are going through some font procedure changes.  Our rendering servers reached the 8,000 installed font range.  I would never have guessed there were that many fonts in the world.  We&#8217;ve been working very diligently to get this under control and it&#8217;s required a tremendous amount of research and evaluation.  Plus, we&#8217;ve asked a lot from our customers   At times it becomes a little overwhelming.  That&#8217;s why, after having this video sent to me from <a href="http://www.drewsmarketingminute.com/2008/07/whats-so-funny.html">Drew&#8217;s Marketing Minute blog</a>, I thought I&#8217;d share with you all for a good laugh.</p>
<p><object type="application/x-shockwave-flash" data="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1823766&#038;fullscreen=1" width="320" height="180" ><param name="allowfullscreen" value="true" /><param name="AllowScriptAccess" value="true" /><param name="movie" quality="best" value="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1823766&#038;fullscreen=1" /></object></p>
<p>Happy Monday.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=386&title=Advanced+Technology:+What&#8217;s+so+Funny?&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=386&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=386</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Four51 Application: Pageflex 6x</title>
		<link>http://www.insightsfour51.com/?p=384</link>
		<comments>http://www.insightsfour51.com/?p=384#comments</comments>
		<pubDate>Fri, 25 Jul 2008 17:35:00 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Pageflex]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=384</guid>
		<description><![CDATA[Pageflex version 6 is coming to Four51! In fact, it is partially here already.  The previous versions of Pageflex have allowed us to submit over 5.5 million jobs. Yesterday, we began running preview jobs against the new Pageflex 6.1 server in our production environment and discovered the new architecture rendered the 10,000 some jobs that were [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bitstream.com/publishing/products/pageflex/index.html" target="_blank">Pageflex</a> version 6 is coming to Four51! In fact, it is partially here already.  </p>
<p>The previous versions of Pageflex have allowed us to submit over <strong>5.5 million jobs</strong>. Yesterday, we began running preview jobs against the new Pageflex 6.1 server in our production environment and discovered the new architecture rendered the 10,000 some jobs that were submitted quicker than the version it is replacing.</p>
<p>However, as with any new release of software, this hasn&#8217;t been without issues. The new Pageflex architecture required Four51 (and you) to make several changes to the nearly 90,000 variable data project files we host. Some of these changes were scripted, and others we have asked and are asking you to perform.</p>
<p>Luckily, there is light at the end of the tunnel.  In the next few weeks we will continue to work with you to ensure your existing products work with preview, proof and production jobs. When we are confident that the transition has been made for existing products, the plan is to support project files created in the newest version of Pageflex. Among other features, these newer projects will support text on a path, document actions and simple impositions. Though transition is sometimes painful, we do like what we see at the other end of the tunnel!</p>
<p>John</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=384&title=Four51+Application:+Pageflex+6x&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=384&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=384</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Variant Identifiers</title>
		<link>http://www.insightsfour51.com/?p=379</link>
		<comments>http://www.insightsfour51.com/?p=379#comments</comments>
		<pubDate>Fri, 18 Jul 2008 17:26:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=379</guid>
		<description><![CDATA[A request for information came to me recently regarding variant identifiers. This person wanted to have two variables make up the identifier: Name and City. Easy enough, but the catch is that they wanted those two values separated by a comma. This is also quite easy, but the solution doesn&#8217;t jump right out at most [...]]]></description>
			<content:encoded><![CDATA[<p>A request for information came to me recently regarding variant identifiers.  This person wanted to have two variables make up the identifier: Name and City.  Easy enough, but the catch is that they wanted those two values separated by a comma.  This is also quite easy, but the solution doesn&#8217;t jump right out at most so I thought I&#8217;d discuss it today.</p>
<p>First, obviously, you need two specs for the Name and City.  Then create another text spec named Comma.  Set the default value to: &#8220;, &#8220;.  Note that I put a space after the comma.</p>
<p>Secondly, add the new Comma spec to your form.  You can place it anywhere because we&#8217;re going to hide it from the user.  Once in the form, go to your Advanced Scripting tab and hide the spec:</p>
<p><code>spec['Comma'].hide()</code></p>
<p>Finally, go to the Variant Identifier page and add the spec in the order you want to display them in the name.  </p>
<p>All of your variants will be saved like so: Joe Nathan, Minneapolis.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=379&title=Advanced+Technology:+Variant+Identifiers&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=379&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=379</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Masked Input</title>
		<link>http://www.insightsfour51.com/?p=373</link>
		<comments>http://www.insightsfour51.com/?p=373#comments</comments>
		<pubDate>Fri, 11 Jul 2008 14:28:39 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=373</guid>
		<description><![CDATA[Many of you have already received communication regarding our pending upgrade to MPower 6. We are very close to finalizing the upgrade, and once completed I&#8217;ll begin a long series of posts regarding Document Actions. The posts will revolve around the usage of the library we have built (37 different actions) for your pleasure. As [...]]]></description>
			<content:encoded><![CDATA[<p>Many of you have already received communication regarding our pending upgrade to MPower 6. We are very close to finalizing the upgrade, and once completed I&#8217;ll begin a long series of posts regarding Document Actions. The posts will revolve around the usage of the library we have built (37 different actions) for your pleasure. As we look forward to those exciting developments, let&#8217;s cover one more Spec Form API method named <strong>Masked Input</strong>. </p>
<p>Control over user input is such an important facet of most variable products, especially products revolving around Corporate Identity. How many times have you had to create 3 or 4 variables for a simple phone number just so you can control the delimiting character? Not to mention date input. It&#8217;s a hassle and simply creates additional development time. The solution to these issues is masked input.  Let&#8217;s review what it is and how it works in spec forms.</p>
<p>First, masked input is nothing more than a convention that forces users to enter information in a specific pattern. You define a pattern, the pattern is presented to the user for input and then their input is controlled by that pattern. Let&#8217;s take a look at an Advanced Script example for controlling a phone number.<br />
<code>spec['Phone'].mask('999.999.9999');</code><br />
That&#8217;s all there is to it.  That pattern forces a user to enter only numbers, and when they reach a delimiter the &#8220;.&#8221; will already be there and will not be editable.  The cursor will skip over the &#8220;.&#8221; so the user can simply continue typing. When the phone variable (textbox) has focus &#8220;___.___.____&#8221; will be displayed.</p>
<p>Here is a snippet of all the examples on the demo product.<br />
<code>spec['Date'].mask('99/99/9999');<br />
spec['Cost'].mask('$99.99');<br />
spec['Phone'].mask('999.999.9999 x9999', "*");<br />
spec['SSN'].mask('999-999-9999', '#');</code><br />
The syntax for the Spec Form API follows this convention: spec[<em>variable</em>].mask(<em>pattern, placeholder</em>). The placeholder is the character that displays in the space designated for input. In the phone example, I specify an &#8220;*&#8221; as the placeholder. The user is then presented with &#8220;***.***.**** x****&#8221; for input. The default placeholder is the underscore &#8220;_&#8221;, and this parameter is optional.</p>
<p>As for the patterns themselves, there are predefined placeholders.  </p>
<ul>
<li><strong>a</strong> &#8211; represents an alpha character (A-Z, a-z)</li>
<li><strong>9</strong> &#8211; represents a numeric character (0-9)</li>
<li><strong>*</strong> &#8211; represents an alphanumeric character (A-Z,a-z,0-9)</li>
</ul>
<p> Any other character is treated as a static character in the pattern.  The phone example shows an extension aspect.  The &#8220;x&#8221; in the pattern is static and therefore not editable.</p>
<p>Lastly, all input including the placeholder characters are submitted for rendering  So the &#8220;$&#8221; in the Cost mask is part of the saved variable; no need to specify a prefix or hard code the character in your template file. Nice and tidy submission.</p>
<p>As always, you can go to my <a href=" http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and find the &#8220;Masking Input Demo&#8221; product to see this example in action. </p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=373&title=Advanced+Technology:+Masked+Input&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=373&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=373</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Four51 Application: Expanded OCI Integration</title>
		<link>http://www.insightsfour51.com/?p=351</link>
		<comments>http://www.insightsfour51.com/?p=351#comments</comments>
		<pubDate>Wed, 02 Jul 2008 13:00:10 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Branded Products Distribution]]></category>
		<category><![CDATA[OCI Integration]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=351</guid>
		<description><![CDATA[Included in Four51&#8242;s Release 8 is functionality to support OCI integration with SAP Buyer Professional. Release 8 was implemented a couple of weeks ago and since then we have received four requests for OCI integration. This is exciting to me, as it shows there is some decent demand among SAP print buyers for integration with [...]]]></description>
			<content:encoded><![CDATA[<p>Included in Four51&#8242;s Release 8 is functionality to support OCI integration with SAP Buyer Professional.  Release 8 was implemented a couple of weeks ago and since then we have received <strong>four </strong>requests for OCI integration. This is exciting to me, as it shows there is some decent demand among SAP print buyers for integration with print sellers.</p>
<p>In this post, I&#8217;ll try to cover what OCI integration is, and what it provides both print buyers and print sellers.</p>
<p>OCI stands for <strong>O</strong>pen <strong>C</strong>atalog <strong>I</strong>nterface. It enables SAP users to integrate purchase order processing with a web-based supplier catalog (Four51). From a user&#8217;s perspective, the workflow looks like the following:</p>
<p>1. Users log onto their SAP system and open a new purchase order.</p>
<p>2. Users click a link to shop in a Four51 website which opens a web browser and logs them into your Four51 website automatically.</p>
<p>3. Users shop on Four51 and place items into their shopping cart.</p>
<p>4. When ready, they click &#8220;Submit&#8221; in the Four51 shopping cart check-out.</p>
<p>5. Four51 sends the order back to the SAP system in an electronic transimission. The user is simultaneously redirected back to their SAP system.</p>
<p>6. The order is routed through the SAP system’s established requisition and<br />
approval process.</p>
<p>7. The SAP System confirms the order with Four51 via a electronic purchase order. The order then appears in a Four51 Administrative interface.</p>
<p><em>The benefits of OCI to an <strong>SAP print buyer </strong>are significant:  </em></p>
<p>1) They can offload the management of product skus to the print seller rather than maintaining them in their SAP database. </p>
<p>2) OCI provides an enhanced, seamless user experience by tying SAP and Four51 together into one workflow. </p>
<p>3) OCI Integration reduces purchasing costs. </p>
<p>4) OCI prevents renegade spending, since purchase orders flow through the buyer&#8217;s established financial control and approval processes inside SAP.</p>
<p><em>The benefits of OCI to a <strong>print seller </strong>are also tremendous: </em></p>
<p>1) There aren&#8217;t many sellers that can support OCI, so being able to offer it to your buyers via Four51 is very unique. </p>
<p>2) OCI improves data sharing with your customer. </p>
<p>3) Variable documents aren&#8217;t a native capability of SAP, so you&#8217;re offering something they can only get through you. </p>
<p>4) Your cost to process purchase orders is also reduced.</p>
<p>All-in-all, OCI projects are fairly straightforward and easy to implement. Four51&#8242;s new OCI platform is very flexible and works easily with SAP. If you have a customer that uses SAP and you would like more information, contact your Four51 representative.</p>
<p>-Owen</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=351&title=Four51+Application:+Expanded+OCI+Integration&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=351&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=351</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Turbo-Charged SELECT Lists</title>
		<link>http://www.insightsfour51.com/?p=356</link>
		<comments>http://www.insightsfour51.com/?p=356#comments</comments>
		<pubDate>Fri, 20 Jun 2008 20:17:33 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=356</guid>
		<description><![CDATA[JavaScript (or more accurately, the DOM) provides some basic methods and properties to access and manipulate drop-down (SELECT) lists on the fly. For example, the SELECT object exposes a selectedIndex property, which can be read or changed and a collection of OPTION objects, which themselves can be added, removed and manipulated. This built-in API is [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript (or more accurately, the <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a>) provides some basic methods and properties to access and manipulate drop-down (SELECT) lists on the fly. For example, the SELECT object exposes a selectedIndex property, which can be read or changed and a collection of OPTION objects, which themselves can be added, removed and manipulated. This built-in API is a bit like a Ford Escort&#8211;it&#8217;ll get you where you want to go most of the time, but not very fast and not with much style. Some problems that Web developers often encounter are that some common tasks are tedious and time-consuming and different browsers and versions don&#8217;t always behave the same.</p>
<p>Enter the Spec Form API. Reference a selection spec (or any SELECT list on your spec form using the &#8220;get&#8221; function) from the Advanced Scripting tab and that Ford Escort of an API is magically transformed into a turbo-charged BMW. Your drop-down list object is &#8220;decorated&#8221; with a wealth of new methods for adding, removing, hiding and showing options, as well as shortcuts for retrieving information. Here are the SELECT list-specific methods of the API in a nutshell:</p>
<p><strong>Methods that return a value:</strong><br />
getOptionIndex, getSelectedOptionIndex, selectedValue, selectedText</p>
<p><strong>Method for selecting an option:</strong><br />
selectOption</p>
<p><strong>Methods for adding options:</strong><br />
addOption, insertOption, addOptions</p>
<p><strong>Methods for hiding/showing/removing options:</strong><br />
hideOption, hideOptionAt, hideOptions, hideOpionRange, hideOpionRangeAt, hideAllOpions, showOption, showOptionAt, showOptions, showOpionRange, showOpionRangeAt, showAllOpions, removeOption, removeOptionAt, removeOptions, removeOpionRange, removeOpionRangeAt, removeAllOpions</p>
<p>The purpose of this article is not to document each method (see the <a href="http://www.four51.com/Themes/Custom/de891832-01b5-4c5d-84da-b4f85e394864/examples/Spec Form API Guide.doc"><strong>Spec Form API</strong> docs</a> for that), but rather to give you a feel for what you can do with them by walking through an example. A common scenario is where you have two drop-down lists and the option selected in the first list drives (pun completely intended) the options available in the second list. In this example, we want the user to select a make and model of an automobile.</p>
<p>To begin, we&#8217;ll define two selection specs for our product: &#8220;make&#8221; and &#8220;model&#8221;. The &#8220;make&#8221; spec has these options:</p>
<ul>
<li>Ford</li>
<li>Honda</li>
<li>BMW</li>
</ul>
<p>The &#8220;model&#8221; spec has these options:</p>
<ul>
<li>Focus</li>
<li>Taurus</li>
<li>Mustang</li>
<li>Civic</li>
<li>Accord</li>
<li>Pilot</li>
<li>3-series</li>
<li>7-series</li>
</ul>
<p>We now go to the Edit HTML tab of the spec form and type the following:</p>
<p>make:<br />
[[make]]</p>
<p>model:<br />
[[model]]</p>
<p>The first 3 options in the model list are Ford vehicles, the next 3 are Hondas, and the last 2 are BMWs. We want the options available in this list to change on the fly based on the make selected in the first list. To set up this behavior, we go the Advanced Scripting tab and enter the following JavaScript code:</p>
<p><code>// assign specs to variables to make them easier to reference later in the script<br />
var makeList = spec['make'];<br />
var modelList = spec['model'];</p>
<p>// define a function to show/hide model options based on selected make<br />
function refreshModels() {<br />
	modelList.hideAllOptions();<br />
	modelList.showOptionAt(0); // always show the blank option</p>
<p>	var make = makeList.selectedText();<br />
	switch (make) {<br />
		case 'Ford':<br />
			modelList.showOptionRange('Focus', 'Mustang');<br />
			break;<br />
		case 'Honda':<br />
			modelList.showOptionRange('Civic', 'Pilot');<br />
			break;<br />
		case 'BMW':<br />
			modelList.showOptionRange('3-series');<br />
			break;<br />
	}<br />
}</p>
<p>// add the function as a handler of the make list's onchange event<br />
makeList.onchange = refreshModels;</p>
<p>// also call the function immediately to initialize the form<br />
refreshModels();</code></p>
<p>Now go back to the Preview tab, and you&#8217;ll see that the behavior of the two lists is exactly as we desired.</p>
<p>A few observations about the script:<br />
- The Spec Form API methods are attached to the makeList and modelList objects automatically.<br />
- showOptionAt takes a zero-based index. Therefore, <strong>showOptionAt</strong>(0) shows the first option, <strong>showOptionAt</strong>(1) shows the second, and so on.<br />
- The last call to <strong>showOptionRange </strong>(corresponding to BMW) only passes one parameter (3-series). When a second parameter is omitted from this method, all options from the specified option to the end of the list are shown.</p>
<p>Now for a couple words of caution. For those of you familiar with HTML, you may be wondering if the various methods that refer to options by text string (as opposed to a numeric index) look up the option by value or by text. The answer is both, with priority given to value. <strong>When using these methods with specs, you&#8217;ll always want to refer to them by their text.</strong> To see why, do a View Source in your browser from the Preview tab. Scroll down until you find the SELECT elements associated with the specs. The option tags will look something like this:<br />
<code><br />
<option value="W0oVX14-pAVwbhqhvu7ev0sQjqs9ZF5DVBjpq3tJLddbmpaDP7tIFqw-e-e">Ford</option>
<p></code><br />
The values associated with options are encrypted identifiers generated by the Four51 application. Referring to spec options by value not only makes your script difficult to read, but is pretty much guaranteed to break the script entirely because these encrypted values change with each user session.</p>
<p>As another word of caution, SELECT lists do not natively support the concept of &#8220;hiding&#8221; options, only removing them. The Spec Form API needs to do a little hocus-pocus to make the various show/hide methods work. As a result, methods of the Spec Form API take &#8220;hidden&#8221; options into account when referring to options by index. Here&#8217;s an example where the native selectedIndex property returns a different result than the <strong>getSelectedOptionIndex</strong>() Spec Form API method. Let&#8217;s say that Honda is the selected make and Civic is the selected model. This will cause the first 3 models (all Fords) to be hidden. Recall that the list always includes a visible blank option at the top (index 0).</p>
<p><code>modelList.selectedIndex // native API doesn't know about "hidden" options, so this returns 1.<br />
modelList.getSelectedOptionIndex()  // Spec Form API knows about "hidden" options, so this returns 4.<br />
</code><br />
I hope this article gives you a good starting point to begin turbo-charging your own drop-down lists. As always, your questions and feedback are welcomed and appreciated.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=356&title=Advanced+Technology:+Turbo-Charged+SELECT+Lists&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=356&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=356</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Project Image Resources Discussion</title>
		<link>http://www.insightsfour51.com/?p=338</link>
		<comments>http://www.insightsfour51.com/?p=338#comments</comments>
		<pubDate>Fri, 13 Jun 2008 14:59:46 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=338</guid>
		<description><![CDATA[Here at Four51, we recently had a discussion about best practices for Pageflex projects. The conversation revolved around the utilization of images, for print, in projects; how to maximize efficiency for screen display and web presentation while not compromising print quality. During this discussion, we realized that there are a number of misconceptions regarding this [...]]]></description>
			<content:encoded><![CDATA[<p>Here at Four51, we recently had a discussion about best practices for Pageflex projects. The conversation revolved around the utilization of images, for print, in projects; how to maximize efficiency for screen display and web presentation while not compromising print quality. During this discussion, we realized that there are a number of misconceptions regarding this topic. After we were finished, I felt it would be a good topic for a blog post.</p>
<p>A question posed was the viability of <strong>TIF images vs. other formats</strong>.  TIFs are considerably larger than any of their counterparts because they are not lossy. JPEG images, however, <em>are </em>lossy, so why would I tell you to use a JPEG over a TIF? Primarily because you should edit and work from a TIF, but for inclusion into your Pageflex project, you should save your TIF as JPEG. Do not destroy your working copy of the TIF image because you should go back to that for edits to the image. <em>Repeatedly editing a JPEG will surely lead to image degradation</em>, so work in the non-lossy format, but always save down to JPEG for project inclusion.  </p>
<p>I want to add that I&#8217;m not telling you JPEG images are the best print option. Obviously, if you are designing the project in Adobe tools, you should stick with the formats best suited for those tools, like PDF. If you are working from a PSD embedded in your InDesign layout, work with PDFs.</p>
<p>I demonstrated the difference in file sizes by taking a 70MB TIF image and saving to <strong>JPEG with 233dpi</strong> and high quality output option and removed the embedded RGB color profile. The file dropped from 70MB to 230KB in size. The print quality remained unnoticeably affected.</p>
<p>I found the best and most concise definition of these two formats at <a href="http://en.wikipedia.org/wiki/Graphics_file_format#Raster_formats"><strong>Wikipedia</strong></a>.  I think these definitions support my argument above.</p>
<p>A little food for thought: When you purchase a stock photo library for your print jobs, what format are the images you receive?</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=338&title=Advanced+Technology:+Project+Image+Resources+Discussion&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=338&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=338</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New Features of Release 8: Variable Spec Form</title>
		<link>http://www.insightsfour51.com/?p=328</link>
		<comments>http://www.insightsfour51.com/?p=328#comments</comments>
		<pubDate>Fri, 06 Jun 2008 14:44:29 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Release 8]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=328</guid>
		<description><![CDATA[Hopefully you all know that Release 8 is just around the corner, and you have logged into the beta site to see the new features highlighted in the demo. Once again there are a ton of new features, many of which that will affect you immediately. Today I&#8217;m going to discuss some new enhancements to [...]]]></description>
			<content:encoded><![CDATA[<p>Hopefully you all know that <a href="http://www.insightsfour51.com/?p=322">Release 8</a>  is just around the corner, and you have logged into the beta site to see the new features highlighted in the demo.  Once again there are a ton of new features, many of which that will affect you immediately.  Today I&#8217;m going to discuss some new enhancements to the Variable Product Spec Form.  Our primary goal in these changes was to increase design time by creating a form as close to production-ready as possible.  The fewer edits needed, the faster to production you can be with your products.</p>
<p>First, we tackled the task of redesigning the default form.  The previous form was very vertical.  Each spec was listed individually down the page with the label directly above the control.  Any product with more than 5 specs causes the page to scroll, and most user input forms have labels on the left of the control.  After Release 8, the default form will be more horizontal.  Here is an example:</p>
<p><code></p>
<table>
<tr>
<td>Name:</td>
<td>
<input type="text" /></td>
</tr>
</table>
<p></code></p>
<p>Much of the padding and spacing was reduced to shrink the space used on the screen.  Prefix, Suffix and required marker are also taken into consideration so the controls align neatly.</p>
<p>Secondly, we added default css definitions: SpecForm, SpecLabel, SpecControl, SpecSuffix, SpecPrefix, SpecOddRow, SpecEvenRow.  These definitions exist as defaults in the global.css file, but you can override them in your theme projects.  Choosing to include these styles in your theme allows you to maintain a consistent look to your spec forms that will persist to ALL of your products.  </p>
<p>With these two changes, we hope that you are able to minimize the effort in a new product rollout.  I cannot demonstrate this functionality through the usual methods until the release is completed.  Rest assured, I will have a quality demo available at that time.</p>
<p>Next week I&#8217;ll discuss the new Product Detail Spec Form and list some new innovations that are now possible.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=328&title=New+Features+of+Release+8:+Variable+Spec+Form&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=328&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=328</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adv. Tech: Spec Form Validation (Custom Regular Expressions)</title>
		<link>http://www.insightsfour51.com/?p=308</link>
		<comments>http://www.insightsfour51.com/?p=308#comments</comments>
		<pubDate>Fri, 02 May 2008 14:31:07 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=308</guid>
		<description><![CDATA[Today will be the culmination of the spec control validation series of posts. I&#8217;ve covered the plethora of built-in validators, the custom validation functions and the various event overrides. The last topic, as promised, will be the custom regular expression validator. You may not realize it, but most of the built-in validators actually use regular [...]]]></description>
			<content:encoded><![CDATA[<p>Today will be the culmination of the spec control validation series of posts. I&#8217;ve covered the plethora of built-in validators, the custom validation functions and the various event overrides. The last topic, as promised, will be the <strong>custom regular expression validator</strong>. You may not realize it, but most of the built-in validators actually use regular expressions.  </p>
<p>Regular expressions are not for the faint of heart, but what can they not do? They are the utility baseball player of software development. At the end of the post I&#8217;ll provide you with links to some resources I use as references.  </p>
<p>For now, let&#8217;s get into the example discussion. Here is the function signature: <strong>regex([options], regular expression)</strong>.</p>
<p><code>spec['Department'].regex({<br />
	action: "onBlur",<br />
	message: "Minimum of 6 characters required"<br />
	}, "(?=^.{6,100}$).*$");</code></p>
<p>The concept is really not much different from the regular built in validators. First, I should point out that the custom regular expression validator function name is <em>regex</em>. You can see, as I&#8217;ve shown before, the first parameter is the optional settings. I&#8217;m defining the action and message properties in the example.  <strong>The additional parameter is the regular expression string</strong>. I&#8217;ve gone with a simple example that enforces a minimum of 6 characters.  </p>
<p>Here are some resources I use when working with regular expressions:</p>
<p><a href="http://regexlib.com/">RegExLib.com</a> is a decently organized community participation site for canned expressions.<br />
<a href=" http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:RegExp">Mozilla Developer Center</a> explains the concept very nicely.<br />
<a href="http://www.ultrapico.com/Expresso.htm">Expresso</a> is a great tool for building and testing regular expressions.</p>
<p>You can read all about every validator in our API documentation which is available at <a href="http://myaccess.four51.com">http://myaccess.four51.com</a>. As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground” to see most of the validators in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=308&title=Adv.+Tech:+Spec+Form+Validation+(Custom+Regular+Expressions)&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=308&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=308</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: More Spec Form Validation</title>
		<link>http://www.insightsfour51.com/?p=304</link>
		<comments>http://www.insightsfour51.com/?p=304#comments</comments>
		<pubDate>Fri, 25 Apr 2008 14:00:56 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=304</guid>
		<description><![CDATA[In my last post I promised to cover custom validation techniques using regular expressions and functions and that&#8217;s exactly what I&#8217;ll do today and next week. For today&#8217;s post, I&#8217;ll cover the custom function capability. I&#8217;ve mentioned several times in the last few posts that we are providing numerous built-in validators. They are the routines [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post I promised to cover custom validation techniques using regular expressions and functions and that&#8217;s exactly what I&#8217;ll do today and next week. For today&#8217;s post, I&#8217;ll cover the<strong> custom function</strong> capability. I&#8217;ve mentioned several times in the last few posts that we are providing numerous built-in validators. They are the routines we believe are most commonly needed. That being said, we know there are so many other needs and we cannot compensate for them all. <em>The solution to that problem is to provide a mechanism for plugging your own validators into the validation framework</em>. It is much easier to do than you&#8217;d think.</p>
<p>Let&#8217;s start, as I often like to do, with a full sample of code for the custom function:</p>
<p><code>spec['CustomFunction'].custom(<br />
	function() {<br />
		var result = spec['CustomFunction'].value == 'The Suns';<br />
		return result;<br />
	},<br />
	{action: 'onBlur', message: 'You must type (The Suns) because they are the best team in the NBA'}<br />
);</code></p>
<p>First, note that we have one variable spec named &#8220;<em>CustomFunction</em>&#8220;.  It is the variable that will be provided for user input and therefore have the validation applied.  </p>
<p>We instantiate the validator with the &#8220;custom&#8221; function. The parameters of this method differ from the other validators. <strong>The first parameter is the actual function that will fire for validation</strong>. This function must return a boolean (true/false). In the example, I&#8217;m simply checking that the value equals &#8220;The Suns&#8221; (<em>because they will beat the Spurs!!</em>) and returning that result. The result, true or false, triggers the correct onSuccess or onError methods, which you learned in my last post, is also overridable.  </p>
<p>The second parameter is the familiar JSON object of optional property definitions.  You can see that I&#8217;ve chosen to fire the validation onBlur and display a custom message.</p>
<p>Pretty straightforward, yet powerful validation tool. With this capability you can validate any scenario in your spec forms.</p>
<p>Next week I&#8217;ll take you through the custom regular expression capability.  <strong>If you have an idea of a validator you&#8217;d like to see covered, mention it in the comments section.</strong></p>
<p>In the meantime, you can read all about every validator in our API documentation which is available at <a href="http://myaccess.four51.com">http://myaccess.four51.com</a>.  As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground” to see most of the validators in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=304&title=Advanced+Technology:+More+Spec+Form+Validation&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=304&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=304</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adv. Technology: Spec Form Validation Event Overrides</title>
		<link>http://www.insightsfour51.com/?p=297</link>
		<comments>http://www.insightsfour51.com/?p=297#comments</comments>
		<pubDate>Fri, 11 Apr 2008 15:12:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=297</guid>
		<description><![CDATA[Last week I examined Spec Form API Validator optional parameters and properties. I provided an example of defining the action and message properties that allow you to define how your validator acts in your own spec form. I also promised that this week I&#8217;d touch on overriding the onSuccess and onError functions. These functions are [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I examined Spec Form API Validator optional parameters and properties.  I provided an example of defining the <em>action </em>and <em>message </em>properties that allow you to define how your validator acts in your own spec form. I also promised that this week I&#8217;d touch on overriding the <strong>onSuccess </strong>and <strong>onError </strong>functions.  These functions are called <u>after</u> validation occurs. Obviously, only one of them is fired and that choice is determined by the success or failure of the validation routine.  We&#8217;ve built default functionality into these functions, but you may find need to change that behavior and today I&#8217;ll demonstrate how you can do that.</p>
<p>The methods <em>onSuccess </em>and <em>onError</em> are actually optional parameters much like <em>action </em>and <em>message</em>. You will define them in the same JSON object, but their values will be new functions rather than strings or integers. As you should already know, in JavaScript, functions are objects too. Let&#8217;s examine an example of overriding these functions.</p>
<p><code><br />
spec['Range'].range({<br />
	action: 'onBlur',<br />
	min: 5,<br />
	max: 50,<br />
	onSuccess: function() { alert('Your entry is accurate'); },<br />
	onError: function() { alert('Your entry is not right, must be between 5 and 50'); }<br />
});<br />
</code></p>
<p>In the Spec Form Playground product on the demo site I have a spec named &#8220;Range&#8221;.  It is the one I&#8217;ve chosen to validate a number range and also override the methods in discussion. You can see that in the JSON parameter I&#8217;ve listed <em>onSuccess </em>and <em>onError </em>right along with the <em>action</em>, <em>min </em>and <em>max </em>properties. For simplicity&#8217;s sake I chose to do a simple alert, but you could write a much more extensive function to suit your needs.</p>
<p>The default <em>onError </em>function is quite extensive. We&#8217;re placing exclamation point images next to the controls, changing the background color of the control plus showing error messages in mouse hovers. We tried to provide a great solution for you without your own intervention.</p>
<p>Next week I&#8217;ll take you through creating your own custom validations using both regular expressions and functions. </p>
<p>In the meantime, you can read all about every validator in our API documentation which is available at <a href="http://myaccess.four51.com">http://myaccess.four51.com</a>.  As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground” to see most of the validators in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=297&title=Adv.+Technology:+Spec+Form+Validation+Event+Overrides&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=297&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=297</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: More Spec Form Validation</title>
		<link>http://www.insightsfour51.com/?p=293</link>
		<comments>http://www.insightsfour51.com/?p=293#comments</comments>
		<pubDate>Fri, 04 Apr 2008 14:09:50 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=293</guid>
		<description><![CDATA[As promised, I&#8217;ll be delving into the Spec Form validators in detail today. Recapping the first post in this series, I wrote about the list of built-in validators and the default actions and properties. I want to dig deeper into the action and message properties and provide an example using one of the built-in validators. [...]]]></description>
			<content:encoded><![CDATA[<p>As promised, I&#8217;ll be delving into the Spec Form validators in detail today.  Recapping the first post in this series, I wrote about the list of built-in validators and the default actions and properties.  I want to dig deeper into the <strong>action</strong> and <strong>message</strong> properties and provide an example using one of the built-in validators.</p>
<p>The action property is a simple string value.  You have two options to choose from: <strong>onBlur</strong> or <strong>onSubmit</strong>.  The primary purpose of these two options is to inform the validators when to fire its validation event.  </p>
<ul>
<li>onBlur will cause the validation to occur immediately after the user moves the cursor out of the control. The term most commonly used is &#8220;loses focus.&#8221;  This validation action provides instant feedback to the user.  However, it will not keep the form from submitting.  You should primarily use this as instant feedback and for suggestions on correcting. </li>
<li>onSubmit will cause the validation to occur when the user clicks &#8220;Save&#8221; or causes the form to submit.  This validation action lists all the errors at the top of the page. The user is then required to find the control and make the proper changes.  It is most accurate in guaranteeing good information is submitted for rendering. </li>
</ul>
<p>The message property is also a simply string value.  By default, every built-in validator has a designated error message.  However, it is very generic and probably does not suit your individual needs.  This property allows you to customize that message per validators.  For instance, if you have multiple phone validators, you can assign an unique error message to each one.  </p>
<p>Let&#8217;s see an example of a <strong>number validator</strong> that is customizing these two properties:<br />
<code>spec['Quantity'].number({<br />
  action: "onBlur",<br />
  message: "Please enter a quantity before continuing…"});</code><br />
You can see that these properties are like most of all other properties we&#8217;ve seen before.  It&#8217;s a basic JSON object.  Simply wrap the key value pares between curly braces {} and delimit with a comma.  Remember that there are default values.  If you choose not to include these properties your validators will still work.  They are optional properties.</p>
<p>Next week  I&#8217;ll discuss overriding the onSuccess and onError functions, and we&#8217;ll use a different validators in our example.</p>
<p>In the meantime, you can read all about every validator in our API documentation which is available at <a href="http://myaccess.four51.com">http://myaccess.four51.com</a>.  As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground.” to see most of the validators in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=293&title=Advanced+Technology:+More+Spec+Form+Validation&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=293&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=293</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Spec Form Validation</title>
		<link>http://www.insightsfour51.com/?p=290</link>
		<comments>http://www.insightsfour51.com/?p=290#comments</comments>
		<pubDate>Fri, 28 Mar 2008 14:50:02 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=290</guid>
		<description><![CDATA[I&#8217;m starting a new series of posts revolving around spec form validation. The latest feature inclusion in the Spec Form API has many layers of functionality. It will take several posts to cover all the possibilities. Today I want to give an overview of just what client side validation is and how it works within [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m starting a new series of posts revolving around spec form validation.  The latest feature inclusion in the Spec Form API has many layers of functionality.  It will take several posts to cover all the possibilities.  Today I want to give an overview of just what client side validation is and how it works within our spec forms, plus give a brief introduction to some of the built-in validators.</p>
<p>Client side validation. What does that mean?  Simply put, it is the effort to validate input within the web form, rather than after the form has been posted back to the server.  The Spec Form API identifies the specs that have been assigned validation and fires the validation event appropriately.  Subsequently it handles the validation success or failure.  If there is a failure, there are default actions that occur in the page, and when the action is assigned to the form submit the submission is canceled until all errors are cleared.  Basically, if you assign validation to a spec control, the default functionality will alert the user to the error and prevent the form from being submitted.  </p>
<p>The current default action is for an exclamation point image to load with the error appearing in a mouseover pop-up.</p>
<p>There is a long list of built in validators such as: phone, url, date, number.  Each validators has a specific rule set.  These rules are strictly set and cannot be modified.  However, if you require more specific validation rules, you can write custom validators.  The custom validators can take a regular expression or an actual JavaScript function.</p>
<p>All validators also have a wide array of optional properties, from simply changing the default error message to completely rewriting the OnError events.  </p>
<p>In the coming weeks I&#8217;ll demonstrate how to apply particular validators and also how to override some of their default functionality.</p>
<p>In the meantime, you can read all about every validator in our API documentation which is available at <a href="http://myaccess.four51.com">http://myaccess.four51.com</a>.  As always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground.” to see most of the validators in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=290&title=Advanced+Technology:+Spec+Form+Validation&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=290&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=290</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Tech: Spec Form API Widget: Checkboxes</title>
		<link>http://www.insightsfour51.com/?p=285</link>
		<comments>http://www.insightsfour51.com/?p=285#comments</comments>
		<pubDate>Fri, 14 Mar 2008 14:25:55 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=285</guid>
		<description><![CDATA[I would imagine that you have come across, in creation of variable products, situations where a simple question must be posed to your customer user. Normally, this situation calls for a simple checkbox input element. What if you want to use that checkbox value in your Pageflex project? Four51 doesn&#8217;t have a checkbox spec type. [...]]]></description>
			<content:encoded><![CDATA[<p>I would imagine that you have come across, in creation of variable products, situations where a simple question must be posed to your customer user. Normally, this situation calls for a simple checkbox input element.  What if you want to use that checkbox value in your Pageflex project?  Four51 doesn&#8217;t have a checkbox spec type.  Previously you would have to write a fairly large amount of JavaScript code, but now you have the <strong>Checkbox</strong> widget.  Let&#8217;s go through an example.</p>
<p>HTML:<br />
<code> [[CheckBox]]</code><br />
Advanced Script:<br />
<code>spec['CheckBox'].checkbox({<br />
	checkedValue: 'I am checked',<br />
	uncheckedValue: 'I am not checked',<br />
	displayText: 'Check me to see my value'<br />
});</p>
<p>spec['CheckBox'].checkbox.onClick = function() {<br />
alert(this.value());<br />
};</code><br />
First, you see that we just include the Spec token in the HTML.  If you chose, you could also wrap the token in a span tag with a class value of &#8220;CheckBox&#8221;.<br />
<code><br />
<span class="CheckBox">[[CheckBoxClass]]</span></code></p>
<p>This method will produce a checkbox control without any properties set.  The values will be <em>true</em> and <em>false</em>.  In the advanced script declaration, some optional properties are available for customization: <em>checkedValue, uncheckedValue, displayText</em>.  I think they are named very descriptively so I won&#8217;t delve into the minutiae, but just realize that they are optional.  You could certainly just declare it like so: <code>spec['CheckBox'].checkbox();</code></p>
<p>As with all other widgets, you have full event exposure.  In the script example above, I override the <strong>onClick</strong> event and throw an alert displaying the checkbox <strong>value</strong>.  Ths is a simple example, but I can imagine this coming in handy when you want the checkbox to drive visibility of other input controls.  For example, the checkbox asks &#8220;Do you wish to include a mailing list?&#8221;.  When clicked, a File Spec is displayed for the user to upload a mailing list.</p>
<p>You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground.”  I&#8217;ve added an example of both type of <strong>Checkbox</strong> declarations to the first panel.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=285&title=Advanced+Tech:+Spec+Form+API+Widget:+Checkboxes&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=285&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=285</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Tech: Spec Form API Widget: Image Selector</title>
		<link>http://www.insightsfour51.com/?p=282</link>
		<comments>http://www.insightsfour51.com/?p=282#comments</comments>
		<pubDate>Fri, 07 Mar 2008 16:42:52 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=282</guid>
		<description><![CDATA[I&#8217;m finally going to discuss the image selector widget today. It&#8217;s about time, right? Well, I must admit that the delay has purely been based around the sheer size of the documentation for this control. I could go on and on in this post and still not cover it all, so I&#8217;m going to urge [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m finally going to discuss the image selector widget today.  It&#8217;s about time, right?  Well,  I must admit that the delay has purely been based around the sheer size of the documentation for this control.  I could go on and on in this post and still not cover it all, so I&#8217;m going to urge you to read the help documentation as well.</p>
<p>This widget was developed because we want our users to have a <u>clearer decision to make regarding the selection of images</u> in spec forms.  It only makes sense that as the user is asked to choose an image they actually get to see a preview.  That is easier said than done.  Having blogged on this topic before, and having implemented a few of my own image preview implementations, I knew that this widget was absolutely necessary and would be very popular if done right.  So, without further ado, let&#8217;s dig in.</p>
<p><strong>HTML: </strong><code>[[Image]]</code></p>
<p><strong>Advanced Script: </strong><br />
<code><br />
var path = "/Themes/Custom/de891832-01b5-4c5d-84da-b4f85e394864/Demo/Jerseys/";<br />
spec['Image'].imageSelector({<br />
	effect: 'fadeIn',<br />
	bordercolor: "red",<br />
	width: 460,<br />
	height: 200,<br />
	thumbnailsize: 40,<br />
	bgcolor: "#fff",<br />
	bordercolor: "#000",<br />
	highlightcolor: "#ff0",<br />
	rollovertext: "Click this to choose jersey",<br />
	images: [path + 'dalhome.jpg',<br />
			 path + 'dalroad.jpg',<br />
			 path + 'dalthrow.jpg',<br />
			 path + 'gbhome.jpg',<br />
			 path + 'gbroad.jpg',<br />
			 path + 'gbthrow.jpg',<br />
			 path + 'indyhome.gif',<br />
			 path + 'indyroad.gif',<br />
			 path + 'indythrow.jpg',<br />
			 path + 'jaxhome.jpg',<br />
			 path + 'jaxroad.jpg',<br />
			 path + 'jaxthrow.jpg',<br />
			 path + 'nehome.jpg',<br />
			 path + 'neroad.jpg',<br />
			 path + 'nethrow.jpg',<br />
			 path + 'nyhome.jpg',<br />
			 path + 'nyroad.jpg',<br />
			 path + 'nythrow.jpg',<br />
			 path + 'pithome.jpg',<br />
			 path + 'pitroad.jpg',<br />
			 path + 'pitthrow.jpg',<br />
			 path + 'sdhome.jpg',<br />
			 path + 'sdroad.jpg',<br />
			 path + 'sdthrow.jpg',<br />
			 path + 'seahome.jpg',<br />
			 path + 'searoad.jpg',<br />
			 path + 'seathrow.gif',<br />
			 path + 'tbhome.jpg',<br />
			 path + 'tbroad.jpg',<br />
			 path + 'tbthrow.jpg',<br />
			 path + 'tenhome.jpg',<br />
			 path + 'tenroad.jpg',<br />
			 path + 'tenthrow.jpg',<br />
			 path + 'washome.jpg',<br />
			 path + 'wasroad.jpg',<br />
			 path + 'wasthrow.jpg',<br />
		]});</p>
<p>spec['Image'].imageSelector.onChange = function() {<br />
	alert('Thank you for choosing me!  ' + this.image());<br />
	return true;<br />
}<br />
</code></p>
<p>At first glance that looks like a lot of code and work.  Trust me, it&#8217;s not really that much.  In my example I&#8217;m showing you all of the available options for customizing the image selector.  Plus, I put quite a few images in there so you will see the scrolling effect in the example.  Let&#8217;s break the example down.</p>
<p>I first created a string variable named <em>path</em>.  That&#8217;s just the path to the folder where I put all the images.  I didn&#8217;t want to repeat that down the road.  </p>
<p>The next item is the image selector instantiation.  It works no differently than any other widget we provide.  It simply has much more available properties.  These properties are encased in {} because it is actually a <strong>JSON</strong> object.  Each individual property is then listed and it&#8217;s value delimited by a colon.  Every property is then delimited by a comma.  Ex:  <code>{ effect: 'fadeIn', width: 460 }</code></p>
<p>Regarding the individual properties, they are not necessary to define.  Each has a default value, so if you don&#8217;t define one, the control will still work fine.  The &#8220;effect&#8221; property has a few different choices.  This controls an animation effect for the large preview image display.  The dimension properties [<em>width, height, thumbnailsize</em>] control overall size of the widget.  There are calculations made that scale all aspects of the widget to accommodate these properties.  The style properties are descriptive enough to understand what they are controlling.  <em>highlightcolor</em> in particular controls the border color around a thumbnail when the mouse is hovering.  The <em>rollovertext</em> property controls the tooltip text that will pop up when the mouse hovers a thumbnail.</p>
<p>The <em>images</em> property is where you will load all the images you want available as choices.  The values must be the path where the images are stored.  In my example all of my images are stored in a theme folder.  You can always get the url path by going to theme management in your admin interface.  The property value is an array, so you&#8217;ll need to wrap all the image names in square brackets [].</p>
<p>Finally, we have some events that you can override as needed.  All of them are listed in the help documentation.  In my example I show you how to override the <strong>onChange</strong> event.  This is fired after a user clicks on a thumbnail and the new value is set.  These events can be handy if you need to do some validation or perform some other actions when particular images are selected.</p>
<p>A couple words of caution.  <strong>Do not use high resolution images</strong>.  The images displayed in the form are not the images that will render to your variable product.  I recommend using the &#8220;Save for the Web&#8221; option in Photoshop.  It&#8217;s also best to create your images with relatively similar sizes.  For example, don&#8217;t have one image set at 100px x 300px, and another 500px x 100px.  There is no way to determine sizing issues on the fly, so the control expects certain ratios. </p>
<p>You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo </a>site to find the “Spec Form API Playground.”</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=282&title=Advanced+Tech:+Spec+Form+API+Widget:+Image+Selector&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=282&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=282</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Spec Form API Update</title>
		<link>http://www.insightsfour51.com/?p=279</link>
		<comments>http://www.insightsfour51.com/?p=279#comments</comments>
		<pubDate>Fri, 29 Feb 2008 15:51:28 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=279</guid>
		<description><![CDATA[This week we released a new update to the Spec Form API. Based on some data mining and case load in our support system, it appears that a number of people have started utilizing this feature set. That&#8217;s great news. We plan on continuing our development the API and hope that all of you find [...]]]></description>
			<content:encoded><![CDATA[<p>This week we released a new update to the <strong>Spec Form API</strong>.  Based on some data mining and case load in our support system, it appears that a number of people have started utilizing this feature set.  That&#8217;s great news.  We plan on continuing our development the API and hope that all of you find value with it.</p>
<p>Today I thought I cover some of the new features available, some of the changes made, as well as explain the new &#8220;Spec Form API Playground&#8221; product in the demo site.  I&#8217;d also like to note that the new help documentation is being updated as you read this, so it will be available through <a href="http://myaccess.four51.com/s.nl/ctype.KB/it.I/id.55503/KB.259/.f?category=9">MyAccess</a> soon.</p>
<p>The primary new functionality in the Spec Form API is the addition of <strong>Validators</strong>.  Often, as you are creating your variable products, you need better control of the input from your customers.  The Validators attempt to provide that functionality.  There are numerous, built-in Validators such as: required, number, email, phone, and date.  Plus many more.  It also provides the capability of writing your own custom Validators through a function or regular expression.  If you have suggestions for additional built-in Validators, feel free to ask.  The Validators also have a built in error display mechanism.  When validation fails, an exclamation point image is displayed with a helpful pop-up message and the control is turned &#8220;red&#8221;. </p>
<p>Not previously mentioned, but previously available, is the <strong>Image Selector</strong> widget  This widget is designed to present a group of thumbnails for your user to select for use in your project.  There are some fancy animations attached to this and tons of hooks into the functionality.  </p>
<p>The changes are few.  In an effort to better isolate the API&#8217;s functions and attach the events to controls, we&#8217;ve refactored some things.  Primarily, everything is no longer attached to the specForm variable.  For instance, before you would reference a calendar widget like so:  specForm.calendar.value.  <u>Now you&#8217;ll reference it straight from the spec control</u>: spec['Calendar'].calendar.value.  The only remnant is the Wizard widget.  Because it is created outside the scope of a spec control it will still be accessible through the specForm variable:  specForm.wizard.moveTo(2).</p>
<p>The API is becoming more and more robust.  The examples are numerous and capabilities within widgets continue to increase.  Because of this, we realized the need for a thorough testing environment so updates are ensured not to break existing work saved to your products.  So we built a product that utilized every single aspect of the Spec Form API.  Any changes that break existing functionality will be caught by this project and allow us to make appropriate changes before the API update is released.  After the creation of this project, I realized that it would be a perfect basis for examples to discuss here in the blog.  So I copied it out to the <strong>Spec Form API Playground</strong> product I&#8217;ve referenced many times before.  </p>
<p>The gist of the product is that a wizard widget isolates different aspects while also testing the wizard&#8217;s functionality.  I&#8217;ve made the source code and spec form available for download as well.  It&#8217;s a good reference for those &#8220;how do I do this again?&#8221; type of questions.  </p>
<p>In the coming weeks I&#8217;ll have thorough examples of the Image Selector and Validators.  </p>
<p>You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to find the “Spec Form API Playground.”</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=279&title=Advanced+Technology:+Spec+Form+API+Update&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=279&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=279</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Spending Account Solution</title>
		<link>http://www.insightsfour51.com/?p=274</link>
		<comments>http://www.insightsfour51.com/?p=274#comments</comments>
		<pubDate>Fri, 15 Feb 2008 19:30:45 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=274</guid>
		<description><![CDATA[Recently a question was posed on the new Forum regarding using Spending Accounts in a particular situation. The question was very thorough so I was able to craft a response in great detail. While typing my response I realized this might be an opportunity to expand the explanation in a blog post. The poster&#8217;s issue [...]]]></description>
			<content:encoded><![CDATA[<p>Recently a <a href="http://public.four51.com/forum/topic.asp?whichpage=1&#038;TOPIC_ID=36&#42">question</a> was posed on the new <a href="http://public.four51.com/forum/default.asp">Forum</a> regarding using Spending Accounts in a particular situation.  The question was very thorough so I was able to craft a response in great detail.  While typing my response I realized this might be an opportunity to expand the explanation in a blog post.</p>
<p>The poster&#8217;s issue really revolves around the need for a highly specialized work flow.  Specifically, they want Spending Accounts to associate with products rather than Users or Groups.  While I can understand the need, the idea that a Spending Account only associates to a Product just isn&#8217;t particularly logical.  Products don&#8217;t spend money, people do.  Upon fully understanding this person&#8217;s need I see that they really are asking that customers use a spending account only for particular goods.  It&#8217;s still a Spending Account associates to a buyer solution, but they want to restrict the good available for purchase with the Spending Account. I think we can develop a solution for this customer now that the need is fully understood.</p>
<p>First and foremost well defined roles must be created in the Administration interface.  The products must be assigned to categories and users to groups in a logical manner.  Because of the unique circumstances you can&#8217;t afford to mismatched these associations.  For instance, you can&#8217;t have a box of pens product in a category for marketing collateral when it should only belong to office supplies.  Same applies for user accounts.  You need to be able to configure the buyer absolutely.  You should be able to say &#8220;User A can use Spending Account A to purchase Product A in Category A because he belongs to Group A.&#8221;  That represents a well defined and logical role.</p>
<p>We still have one major issue to solve: The customer should only be able to purchase certain products using the Spending Account.  How is this configured in Four51?  The simple answer is that it can&#8217;t be configured.  We have to create this logic outside the application through the use of Web Services.</p>
<p>I&#8217;ve covered the topic on previous blog posts so I won&#8217;t go into the technical implementation.  I will simply discuss the solution they can provide in this circumstance.</p>
<p>The most useful web service for this scenario is the <strong>ValidateAddToOrder</strong>.  We must ensure that the shopping cart does not contain a mixture of products by payment method.  For instance, a box of pens cannot be purchased by spending account so we cannot allow them to be added to the cart if business cards have already been added.  The business cards are eligible for Spending Account payment, the box of pens are not.  Utilizing this web service we can examine the current shopping cart contents [Line Items] to determine the validity of the request to add the product to the order.  I would return a message to the user that their action is not allowed, but they can create an additional shopping cart to purchase this product. </p>
<p>I&#8217;d also utilize the <strong>ValidateOrder </strong>and <strong>ValidateBilling </strong>web services to ensure the proper products are purchased with the proper methods.  There is no mechanism that will eliminate the Spending Account payment method based on the products in the cart.  So if the customer attempts to purchase that box of pens with their spending account these web services can catch that and deny the action.</p>
<p>I hope I&#8217;ve demonstrated the process of thinking through a Four51 solution and utilizing all the available resources at my disposal.  </p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=274&title=Advanced+Technology:+Spending+Account+Solution&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=274&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=274</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Variant Identifiers</title>
		<link>http://www.insightsfour51.com/?p=271</link>
		<comments>http://www.insightsfour51.com/?p=271#comments</comments>
		<pubDate>Fri, 08 Feb 2008 22:33:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=271</guid>
		<description><![CDATA[A question came to me recently concerning identifying particular information selected in a variable product. Particularly, how to put the value of a selection in the variant name. I&#8217;m going to run through an example implementation in today&#8217;s post. This particular product is a jersey selection product. We&#8217;ll present the user with two options: Team, [...]]]></description>
			<content:encoded><![CDATA[<p>A question came to me recently concerning identifying particular information selected in a variable product.  Particularly, how to put the value of a selection in the variant name.  I&#8217;m going to run through an example implementation in today&#8217;s post.</p>
<p>This particular product is a jersey selection product.  We&#8217;ll present the user with two options:  <em><strong>Team, Type</strong></em>.  Team is comprised of several different football teams in the NFL.  The Type will be a choice of jersey style.  For example, Jacksonville Jaguars Road Jersey.  We need to present a preview of this choice in our variable document, and we also need to save the variant with a code that informs us what jersey was selected.</p>
<p>I&#8217;ll begin by creating a Pageflex project with three variable:<strong> Image (image script), Team (plain text), Type (plain text)</strong>.  I&#8217;ll be storing images of each jersey combination in the images folder.  The script that determines the image selection is not the focus of this demonstration so I won&#8217;t display that, but you can download the project files if you are interested.</p>
<p>The project has been uploaded to our product, and the variable have been imported.  Next, I&#8217;ll create a new variable named Code.  It will be a Text type and no other properties are important.  Now I&#8217;ll add the <strong>Code</strong> variable as the Variant Identifier.  Finally, we&#8217;ll move into the spec form and make all this work together.</p>
<p>We&#8217;re working off a basic table of information that maps teams and types to codes.  </p>
<ul>
<li>Dallas Cowboys Road = DALRD-989</li>
<li>Dallas Cowboys Home = DALHM-789</li>
<li>Dallas Cowboys Special = DALSP-189</li>
<li>Green Bay Packers Road = GBYRD-946</li>
<li>Green Bay Packers Home = GBYHM-846</li>
<li>Green Bay Packers Special = GBYSP-146</li>
<li>Pittsburgh Steelers Road = PITRD-925</li>
<li>Pittsburgh Steelers Home = PITHM-825</li>
<li>Pittsburgh Steelers Special = PITSP-125</li>
</ul>
<p>The HTML will be comprised of two dropdowns for the teams and the type.  Hidden on the form will be the actual variables that we need to make the project work, as well as the Code variable for the Variant Identifier.</p>
<p><code>[[Code]] <strong><br />
Team: </strong><br />
<select id="teamlist">
<option selected=""></option>
</select>
<p>[[Team]]<br />
<strong><br />
Type: </strong><br />
<select id="typelist">
<option selected=""></option>
</select>
<p>[[Type]]<br />
</code></p>
<p>Notice the two select elements are not variable specs.  They do not need to be and in order to work with display text and values we have to use the base html elements.</p>
<p>Lastly, our Advanced Script will perform all the work under the hood.</p>
<p><code>spec['Code'].hide();<br />
spec['Team'].hide();<br />
spec['Type'].hide();</p>
<p>var jerseys =<br />
{<br />
	"Dallas": 'dal',<br />
	"Green Bay": 'gb',<br />
	"Pittsburgh": 'pit'<br />
}</p>
<p>var types =<br />
{<br />
	"Home": 'home',<br />
	"Road": 'road',<br />
	"Special": 'throw'<br />
}</p>
<p>var codes =<br />
{<br />
	"": '',<br />
	"dalhome": 'DALHM-789',<br />
	"dalroad": 'DALRD-989',<br />
	"dalthrow": 'DALSP-189',<br />
	"gbhome": 'GBYHM-846',<br />
	"gbroad": 'GBYRD-946',<br />
	"gbthrow": 'GBYSP-146',<br />
	"pithome": 'PITHM-825',<br />
	"pitroad": 'PITRD-925',<br />
	"pitthrow": 'PITSP-125'<br />
}</p>
<p>get('teamlist').addOptions(jerseys);<br />
get('typelist').addOptions(types);</p>
<p>get('teamlist').onchange = function() {<br />
	spec['Code'].setText(setValue());<br />
	spec['Team'].setText(this.value);<br />
}<br />
get('typelist').onchange = function() {<br />
	spec['Code'].setText(setValue());<br />
	spec['Type'].setText(this.value);<br />
}</p>
<p>function setValue() {<br />
	return codes[get('teamlist').value + get('typelist').value];<br />
}</p>
<p>get('teamlist').selectOption(0);<br />
get('typelist').selectOption(0);<br />
</code></p>
<p>First, I use the<strong> hide()</strong> method to hide all the controls that are working under the hood.  Then I&#8217;ll define three JSON objects that store the values we want to display to the user:<em> jerseys, types, codes</em>.  I&#8217;ll then <strong>get()</strong> the two select elements and use the <strong>addOptions()</strong> function to populate them with the JSON values (note:  the addOptions() takes a JSON object as a parameter.  It will serialize the values and insert them into the element for you).  At this stage I have everything ready for customer input. </p>
<p>Now I&#8217;ll handle the user selections.  Again, I get() the select elements and then bind a function to their &#8220;<strong>onchange</strong>&#8221; event.  The function simply concatenates the values selected to create one value that matches a value in the codes JSON object.  It is returned and <strong>setText()</strong> places the code in the Code variable.  </p>
<p>This is just one example of how to accomplish this need.  There are a number of different ways to go about solving this requirement.  Hopefully in this demonstration you will understand some concepts that will help you develop your own solutions.</p>
<p>As always you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site to see this solution in action, as well as download the project files.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=271&title=Advanced+Technology:+Variant+Identifiers&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=271&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=271</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Info on Advanced Scripting</title>
		<link>http://www.insightsfour51.com/?p=264</link>
		<comments>http://www.insightsfour51.com/?p=264#comments</comments>
		<pubDate>Fri, 25 Jan 2008 19:46:38 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=264</guid>
		<description><![CDATA[Up until this week, I had not given a lot of thought to the idea of wanting to understand how to get started learning how to use our Advanced Scripting feature. When discussing the concept originally, we targeted it at two groups of people: skilled JavaScript programmers, and people who have never been exposed to [...]]]></description>
			<content:encoded><![CDATA[<p>Up until this week, I had not given a lot of thought to the idea of wanting to understand how to get started learning how to use our Advanced Scripting feature.  When discussing the concept originally, we targeted it at two groups of people:  skilled JavaScript programmers, and people who have never been exposed to any level of programming.  So this week when asked, &#8220;How do I get started learning Advanced Scripting?&#8221; I realized the answer isn&#8217;t so simple.</p>
<p>For the skilled JavaScript developer, the help file should be more than enough to get started.  The API functions are called using the same syntax as any JavaScript method.  Our goal in supplying users with this skill set revolves around exposing a cleaner environment for development as well as supplying some handy shortcut functions that are consistent headaches.  For example, any script written in the Advanced Scripting tab is automatically fired at the appropriate sequence in the page creation and loading.  I won&#8217;t delve into all the available options, but this particular type of person will see the many benefits of the Spec Form API.</p>
<p>The newly initiated have the option of using the help file examples and working within a narrow scope of the API framework.  We&#8217;ve attempted to design each feature to be used with minimal work.  In fact, most are capable of working simply by defining a class name.</p>
<p>If you are inclined to dig into learning JavaScript, I can list you a few resources that would be very beneficial:</p>
<ul>
<li>Mozilla&#8217;s <a href="http://developer.mozilla.org/en/docs/A_re-introduction_to_JavaScript">Reintroduction to JavaScript</a> is outstanding
<li>You will want to get  <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a> to help in debugging</li>
<li>Douglas Crockford, Yahoo&#8217;s JavaScript Evangelist, has a great series of <a href="http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.1710507">videos</a></li>
<li>The best <a href="http://www.oreilly.com/catalog/jscript3/">book</a> on JavaScript comes from O&#8217;Reilly</li>
</ul>
<p>Learning JavaScript takes time and patience, but the journey is a lot of fun.  Once you have a decent grasp you can also utilize JavaScript within your Pageflex projects.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=264&title=Advanced+Technology:+Info+on+Advanced+Scripting&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=264&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=264</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Pageflex Language Support Explained</title>
		<link>http://www.insightsfour51.com/?p=260</link>
		<comments>http://www.insightsfour51.com/?p=260#comments</comments>
		<pubDate>Wed, 16 Jan 2008 15:01:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=260</guid>
		<description><![CDATA[Often our support team is questioned regarding the languages supported by Pageflex Studio and the Four51 application. This concept can be confusing and incomplete, so today I will attempt to bring some clarity. First, let&#8217;s define the idea of Localization. Localization is the process of adapting a software program or website to the language and [...]]]></description>
			<content:encoded><![CDATA[<p>Often our support team is questioned regarding the languages supported by <strong>Pageflex Studio</strong> and the <strong>Four51</strong> application.  This concept can be confusing and incomplete, so today I will attempt to bring some clarity.</p>
<p>First, let&#8217;s define the idea of <strong>Localization</strong>.  Localization is the process of adapting a software program or website to the language and culture of a particular region.  The ability for an application to support multiple languages is actually a daunting task.  For instance, the Four51 application currently supports four languages: </p>
<p>1.	English-US<br />
2.	English-UK<br />
3.	Dutch<br />
4.	Portuguese</p>
<p>This is accomplished by storing every single instance of text on the site in a resource file.  These resource files are submitted to a company called <strong>Translations.com</strong> that specializes in translations.  They meticulously translate every single word in those resource files and keep track of changes from one application release to the next.  The end result is seamless localization by simply &#8220;flipping a switch,&#8221; allowing users of those languages to read and checkout of the application in their local date formats and currencies.  </p>
<p>The concept of localization, or language support, in Pageflex Studio is actually quite different.  Studio is a document creation application, meaning that the content is created by the user.  Under this concept, the document creator is responsible for the translation.  The responsibility of language support falls under the purview of the user.  So, what does the language support actually do?  Two things: <strong>uses a language library to determine hyphenation rules, and the language&#8217;s character set to calculate dimensions for features like wrapping and copy fitting</strong>.  Essentially, as long as the font chosen supports the full character set of almost any language, the Studio application will render the text precisely<sup>2</sup>.</p>
<p>Secondly, let&#8217;s discuss how a PC handles localization.  This is an important aspect of localization because a user must interact with Four51 within the rules set forth in their specific locale.  The important group set contains rules for keyboard layouts and fonts.  A Portuguese speaking person uses a set of characters that may not exist as simple keys on an English speaking person&#8217;s keyboard.  So, your operating system must conform to the supported language and respond to the differences.  Your browser operates under these same rules, therefore when a Portuguese speaking person is asked to input text into a field it is actually their operating system&#8217;s localization rules that are governing the input,  not the Four51 or Pageflex application.  At no time is any attempt to translate the input performed by the Four51 or Pageflex application.  The applications ingest the input and render it to the printable document using the rules you define in the template. </p>
<p>To help visualize the localization ability of Four51 and Pageflex, I&#8217;ve set up a project on the demo site that works with both Dutch and Portuguese.  I chose to demonstrate the support for both languages in one project so that you can see the independent nature of the language from the applications.  The example company&#8217;s locale is US-English, one template file is Portuguese, and the other is Dutch.  All three languages are working within the same context.</p>
<p>I also created default values for each language.  In English the value reads, &#8220;Displayed as a label on the Billing stage of the check out process when Purchase Orders are allowed.&#8221;   This is an actual value in our current resource files.  I chose this sentence because the hyphenation rules are enforced for each language.  When rendering the example you will see hyphens in the appropriate places.  Actually, I just hope they are in the appropriate places because I don&#8217;t speak these languages, much less understand proper hyphen placement.  I&#8217;ll trust that Pageflex has provided an accurate library for these languages.  </p>
<p>The specifics for the project setup are actually quite simple.  I used the font MetaBold-Roman for both languages. MetaBold-Roman is already installed on the Four51 servers.  This is an important note because the key to supporting character sets in other languages depends on the font.  The font you choose for your template must contain these characters or they will not render to the printable document. In each template file I set the Default Langauge to the specific language.  This is all it took to create the template files. </p>
<p>Pageflex Studio fully supports all the languages in the Paragraph Properties&#8217; language drop-down list.  With two exceptions, &#8220;full support&#8221; refers to composition, hyphenation, and spell-checking. This applies to:</p>
<p>•	Danish<br />
•	English-US, UK<br />
•	French<br />
•	German<br />
•	Italian<br />
•	Norwegian<br />
•	Portuguese<br />
•	Spanish<br />
•	Swedish</p>
<p>The two exceptions are Japanese and Chinese, which, though also fully composed, require no hyphenation or spell-checking.  In addition, Pageflex can compose over 60 other languages, and as a general rule, these are languages that are read left to right and top to bottom.</p>
<p>To see the different languages, I set up the proof and production outputs to use different template files.  Proof renders the Dutch example, while Production renders the Portuguese example.  I encourage you to create a project utilizing other languages, such as Russian, to perform your own language support tests.</p>
<p>You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and find the “Localization” product to see this example in action and download the project files.</p>
<p><sup><strong>1.</strong>  There are some instances which Pageflex does not support hyphenation or ligatures.  Generally these are limited to languages that do not have hyphenation (Japanese, etc..), or more generally languages that are read right-to-left (Arabic, Greek, Hebrew, etc..).</sup></p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=260&title=Advanced+Technology:+Pageflex+Language+Support+Explained&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=260&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: The Time Selection Control</title>
		<link>http://www.insightsfour51.com/?p=258</link>
		<comments>http://www.insightsfour51.com/?p=258#comments</comments>
		<pubDate>Fri, 11 Jan 2008 16:19:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=258</guid>
		<description><![CDATA[Well, the holidays are finished and it&#8217;s time to get back to our weekly technology tip. My last post revolved around our calendar widget in the Advanced Scripting feature. Today, I&#8217;ll discuss what I consider to be a supplement to the calendar, the time selection control. The time selection control is designed to help you [...]]]></description>
			<content:encoded><![CDATA[<p>Well, the holidays are finished and it&#8217;s time to get back to our weekly technology tip.  My last post revolved around our <strong>calendar widget</strong> in the Advanced Scripting feature. Today, I&#8217;ll discuss what I consider to be a supplement to the calendar, the <strong>time selection control</strong>.</p>
<p>The time selection control is designed to help you enforce standard formatting for time input in your projects.  It&#8217;s often a struggle ensuring your customers adhere to a defined format, so we&#8217;ll eliminate that concern by controlling their action.  </p>
<p>We have two ways to declare this control. Let&#8217;s look at the simplified example:</p>
<p><strong>HTML Example</strong> (<em>need one TextSpec Control</em>):</p>
<p><code><span class="Time">[[Time]]</span></code></p>
<p>Very simple and straightforward.  The key is to wrap your TextSpec in a span element. The class designation tells the Spec Form API to create and attach the elements that comprise the time control.</p>
<p>Now, the <strong>Advanced Scripting</strong> implementation (<em>need one TextSpec Control</em>):</p>
<p>HTML: <code>[[Time]]</code></p>
<p>Advanced Script: <code>spec['Time'].time({increment: 15});</code></p>
<p>As you can see, this implementation isn&#8217;t much more complicated.  The focus is on the optional parameter: increment.  That property is exposed to allow you to customize the minute list.  For example, the increment of 15 would have 00, 15, 30, 45 as choices in the drop down. </p>
<p>Under the hood, the TextSpec control will receive the selected values formatted with the following mask: HH:MM am.  Additionally, the stored value will persist.  When the spec form will render valid time will select the appropriate values for the time control.</p>
<p>You can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and find the “Spec Form API Playground” product to see this example in action.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=258&title=Advanced+Technology:+The+Time+Selection+Control&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=258&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=258</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: The Calendar Control</title>
		<link>http://www.insightsfour51.com/?p=249</link>
		<comments>http://www.insightsfour51.com/?p=249#comments</comments>
		<pubDate>Fri, 14 Dec 2007 16:35:43 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=249</guid>
		<description><![CDATA[Today, I&#8217;m going to give a demonstration of how to let your customer choose a date from a calendar rather than simply typing it into a field. It is often a struggle to ensure your customer has entered in a valid date when they are simply typing in a text box. Plus, there are times [...]]]></description>
			<content:encoded><![CDATA[<p>Today, I&#8217;m going to give a demonstration of how to let your customer choose a date from a <strong>calendar </strong>rather than simply typing it into a field.  It is often a struggle to ensure your customer has entered in a valid date when they are simply typing in a text box.  Plus, there are times when you want the date formatted a certain way, and a Pageflex project script isn&#8217;t the answer.  I&#8217;ll demonstrate how to expose a calendar and also how to use events in the calendar to get the date information you truly want on the variable print product.</p>
<p><strong>HTML example</strong><br />
<code><strong>Date:</strong>&nbsp; [[Calendar]][[HiddenDate]]<br /></code></p>
<p>Simply two Spec Controls of text type named <strong>Calendar </strong>and <strong>HiddenDate</strong>.  In a production environment I&#8217;d hide the HiddenDate control from the user, but for this demonstration purpose we&#8217;ll keep it visible.</p>
<p><strong>Advanced Script example:</strong><br />
<code>spec['Calendar'].calendar();</p>
<p>specForm.calendar.onChange = function() {<br />
	var now = new Date();<br />
	if (specForm.calendar.FullDate() < now) {<br />
		alert('You must select a date in the future.');<br />
		spec['HiddenDate'].setText('');<br />
		return false;<br />
	}<br />
	else {<br />
		spec['HiddenDate'].setText(specForm.calendar.DayOfWeek());<br />
		return true;<br />
	}<br />
}</code></p>
<p>This example is doing two things.  First, we want to be sure the user is selecting a date in the future. Secondly, we really want to print the day of the week on the print document so we'll set an additional spec to that value.  Let's breakdown how we are doing this.</p>
<p>We will perform our tasks once data has been selected from the calendar pop up, so we need to attach a new function when a date is selected <code> specForm.calendar.onChange = function() { }</code>.  The first thing we need to do in this function is create a <strong>Date </strong>object so we have current date and time for comparison. <code> var now = new Date();</code> Now we'll check that it's a future date by comparing our new Date object to the <em>FullDate()</em> property of the the calendar. <code> if (specForm.calendar.FullDate() < now)</code>  If it's in the past we'll inform the user of her mistake and reset our hidden spec control to an empty string.<br />
<code><br />
alert('You must select a date in the future.');<br />
spec['HiddenDate'].setText('');</code></p>
<p>If the date selected is valid we'll store the <em>DayOfWeek() </em>property in the hidden spec control <code> spec['HiddenDate'].setText(specForm.calendar.DayOfWeek());</code></p>
<p>Now we have the day of the week available to print on our variable document.  </p>
<p>I've demonstrated how to create a calendar control on your spec form, and a few properties available to work with (<em>DayOfWeek, FullDate</em>). There are more that I didn't cover, but you should know about.  Simply get the <a href="http://myaccess.four51.com/site/Four51%20Spec%20Form%20API.pdf">Spec Form API documentation</a> and check them out.  And as always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and find the "Spec Form API Playground" product to see this example in action. </p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=249&title=Advanced+Technology:+The+Calendar+Control&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=249&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=249</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Working with Selection Spec Options</title>
		<link>http://www.insightsfour51.com/?p=246</link>
		<comments>http://www.insightsfour51.com/?p=246#comments</comments>
		<pubDate>Fri, 07 Dec 2007 15:57:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=246</guid>
		<description><![CDATA[I want to cover another aspect of the Spec Form API that we haven&#8217;t touched on yet: adding and removing options in Selection Spec Controls. I think this is one that many people have wanted to do, but the complexity was too burdensome. I&#8217;ll demonstrate how to leverage the Spec Form API to make this [...]]]></description>
			<content:encoded><![CDATA[<p>I want to cover another aspect of the <strong>Spec Form API</strong> that we haven&#8217;t touched on yet: <u>adding and removing options in Selection Spec Controls</u>.  I think this is one that many people have wanted to do, but the complexity was too burdensome.  I&#8217;ll demonstrate how to leverage the Spec Form API to make this task very simple.</p>
<p><strong>Example HTML: </strong><br />
<code><strong>Meal:&nbsp;</strong> [[Meals]] and <strong>Menu:</strong> [[Menu]]<br /></code><br />
There are two selection specs: Meals and Menu.  I added the options: &#8220;Breakfast&#8221;, &#8220;Lunch&#8221;, and &#8220;Dinner&#8221; in the spec properties.  They will always be our choices.  For now the Menu spec does not have options.</p>
<p><strong>Example Advanced Script:</strong><br />
<code>spec['Menu'].hide();</p>
<p>spec['Meals'].onchange = function() {<br />
	var choices = {"Breakfast": ["Pancakes", "Waffles", "Omelet"], "Lunch": ["Turkey Sandwich", "Hotdog &#038; Chips", "Hamburger &#038; Fries"], "Dinner": ["Salmon", "Chicken Breast", "Lasagna"]};<br />
	spec['Menu'].removeAllOptions();</p>
<p>	if (this.selectedText() == "Breakfast")<br />
		spec['Menu'].addOptions(choices.Breakfast);<br />
	else if (this.selectedText() == "Lunch")<br />
		spec['Menu'].addOptions(choices.Lunch);<br />
	else if (this.selectedText() == "Dinner")<br />
		spec['Menu'].addOptions(choices.Dinner);</p>
<p>	if (this.selectedText() != "")<br />
		spec['Menu'].show();<br />
	else<br />
		spec['Menu'].hide();<br />
}<br />
</code><br />
Let&#8217;s breakdown the advanced script:</p>
<p>First you see that we will simply hide the Menu spec.  Every time the page loads it will be hidden by default.  We don&#8217;t want to show it until a Meal has been selected because we want to give them particular options based on that choice.</p>
<p>The meat and potatoes of this example begins with the assignment of a function to the <em>onchange</em> event of the Meals spec.  Like I said, we want to give the user particular options based on their Meal choice.  We define those options in the <strong>JSON object</strong> <em>choices</em>.  <a href="http://www.json.org/js.html">To read more on JSON check out this introduction</a>.  In the <em>choices</em> object I am defining the three meal objects and assigning an array of values as the menu choices.  For example, one object in the choices JSON object is defined as such:  <code>"Breakfast": [""Pancakes", "Waffles", "Omelet"]<br />
</code><br />
This just gives us an object to work with.  We must figure out which of the items to use and we will base that on the Meal selection.  First, we will remove all of the items from the Menu spec by calling &#8220;<em>removeAllOptions()</em>&#8221; which is a method in the Spec Form API. Then we will check on the selection by getting the &#8220;<em>selectedText()</em>&#8221; of the Menu spec.  Based on the value of the <em>selectedText()</em> we will use the choices JSON object to add the options by calling the &#8220;<em>addOptions()</em>&#8221; function in the Spec Form API. Notice that we can reference the Menu choices with simple dot notation.  This is the awesome aspect of JSON. </p>
<p>Lastly, we show or hide the Menu spec based on whether or not a Meal has been chosen.</p>
<p>In this demonstration I introduced you to several new functions of the Spec Form API: <em>removeAllOptions()</em>, <em>selectedText()</em> and <em>addOptions()</em>.  Very powerful, but easy to use methods for any Selection Spec Control.  There are more that I didn&#8217;t cover, but you should understand.  Simply get the <a href="http://myaccess.four51.com/site/Four51%20Spec%20Form%20API.pdf">Spec Form API documentation</a> and check them out.  And as always, you can go to my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and find the &#8220;Spec Form API Playground&#8221; product to see this example in action. </p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=246&title=Advanced+Technology:+Working+with+Selection+Spec+Options&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=246&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=246</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Auto Tabbing</title>
		<link>http://www.insightsfour51.com/?p=243</link>
		<comments>http://www.insightsfour51.com/?p=243#comments</comments>
		<pubDate>Fri, 30 Nov 2007 16:27:36 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=243</guid>
		<description><![CDATA[Let&#8217;s say you were entering your phone number in an online form and once you typed in the area code your cursor automatically jumped to the prefix input option. That is called auto tabbing. Putting aside all the arguments for and against its usability effectiveness, I&#8217;ll demonstrate how we&#8217;ve made that easy to implement in [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you were entering your phone number in an online form and once you typed in the area code your cursor automatically jumped to the prefix input option.  That is called auto tabbing.  Putting aside all the arguments for and against its usability effectiveness, I&#8217;ll demonstrate how we&#8217;ve made that easy to implement in your variable product spec forms.</p>
<p>First the HTML (3 variable specs created named: AreaCode, Prefix, Number):<br />
<code><strong>Phone Number: </strong>[[AreaCode]].[[Prefix]].[[Number]]</code></p>
<p>Very simple and straight forward.  One important note:  <u>You must set the max length property of each variable spec</u> to the number of characters you want the user to enter before moving to the next field.</p>
<p>Now for the Advanced Script:</p>
<p><code>spec['AreaCode'].autoTab("Prefix");<br />
spec['Prefix'].autoTab("Number");</code></p>
<p>So, how does it work?  Very simply, when you call the <strong>autoTab </strong>function the Spec Form API attaches a function that first compares the number of characters in the field to the max length property of that field.  If they are equal, it then sets cursor focus on the field you name in the function argument.</p>
<p>A lot of people like this usability feature but don&#8217;t know how to implement it for their spec forms.  Hopefully this example makes it simpler.  As usual you can go to my <a href="http://www.four51.com/UI/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo</a> site and see this in action in the &#8220;Spec Form API Playground&#8221; product.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=243&title=Advanced+Technology:+Auto+Tabbing&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=243&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=243</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: More Show and Hide</title>
		<link>http://www.insightsfour51.com/?p=238</link>
		<comments>http://www.insightsfour51.com/?p=238#comments</comments>
		<pubDate>Fri, 16 Nov 2007 16:03:19 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=238</guid>
		<description><![CDATA[Last week I demonstrated how the API functions Show() and Hide() work, and I promised you a demonstration on how it could also work with Selection Spec Controls. I&#8217;ll demonstrate that today, while paying homage to the classic Seinfeld television show. The scenario I&#8217;m covering is simple: When the user makes a selection from the [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I demonstrated how the API functions <strong>Show()</strong> and<strong> Hide()</strong> work, and I promised you a demonstration on how it could also work with Selection Spec Controls.  I&#8217;ll demonstrate that today, while paying homage to the classic Seinfeld television show.</p>
<p>The scenario I&#8217;m covering is simple: When the user makes a selection from the drop down show a particular item in the form.</p>
<p>Here is the HTML markup:<br />
<code>
<div>[[Selection]]</div>
<div id="thisChoice">You've chosen THIS!</div>
<div id="thatChoice">You've chosen THAT!</div>
<div id="otherChoice">You've not chosen this or that, so it must be the OTHER THING!</div>
<p></code></p>
<p>The [[RadioList]] is a selection spec control that contains these options: This, That, The Other Thing.  Based on the user selection we will display one of the three &#8220;div&#8221; elements in the HTML.</p>
<p>Now let&#8217;s examine the advanced script:<br />
<code><br />
function HideAll() {<br />
	get("thisChoice").hide();<br />
	get("thatChoice").hide();<br />
	get("otherChoice").hide();<br />
}</p>
<p>spec['Selection'].onchange = function() {<br />
	HideAll();<br />
	switch (this.selectedIndex) {<br />
		case 1:<br />
			get("thisChoice").show();<br />
			break;<br />
		case 2:<br />
			get("thatChoice").show();<br />
			break;<br />
		case 3:<br />
			get("otherChoice").show();<br />
			break;<br />
		default:<br />
			break;<br />
	}<br />
}</p>
<p>HideAll();<br />
</code></p>
<p>Three different things are happening here.  First, I created a function named <strong>HideAll()</strong> that simply gets each of the div elements and calls the <strong>Hide()</strong> API function.  This ensures we are hiding all of them when the page initially loads.  Jumping to the end of the script you&#8217;ll see that I call the <strong>HideAll()</strong> function.  I&#8217;m doing that last to emphasize that the function must be created before you can call it. The real action occurs in the spec['Selection'] <em>onchange </em>event.  </p>
<p>We want to declare a function to fire on that event and the syntax to do this is: <code>spec['Selection'].onchange = function() { }</code>  Whenever the drop down is clicked the <em>onchange </em>event is fired, and that&#8217;s when we want to decide which information to display to them.</p>
<p>Within this function we first want to call the <strong>HideAll()</strong> function to reset the display of all the elements.  Without this we would end up having more than on option displayed at a time.  Then we evaluate the <em>selectedIndex </em>of the drop down list in a switch statement.  The <em>selectedIndex </em>property contains the numbered item in the list currently selected.  We check for that property in each <em>case </em>and perform the appropriate action.  For example, if &#8220;This&#8221; is chosen in the drop down we want to show the div element with the id &#8220;thisChoice&#8221;.  We do that with the <strong>get()</strong> API function which I covered in a previous post.  Of course the &#8220;break;&#8221; signals the code to exit the switch statement.  </p>
<p>I think this demonstration covers a widely desired functional aspect of Spec Forms on the Four51 application.  <u>Utilizing the Spec Form API makes this process very easy to accommodate.</u></p>
<p>As previously mentioned I&#8217;m demonstrating the <strong>Spec Form API</strong> examples in the &#8220;Spec Form API Playground&#8221; product on my <a href="http://www.four51.com/UI/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo site</a>.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=238&title=Advanced+Technology:+More+Show+and+Hide&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=238&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=238</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Advanced Scripting&#8211;Showing and Hiding Controls</title>
		<link>http://www.insightsfour51.com/?p=235</link>
		<comments>http://www.insightsfour51.com/?p=235#comments</comments>
		<pubDate>Fri, 09 Nov 2007 16:20:13 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=235</guid>
		<description><![CDATA[Without a doubt, the most common request for Spec Form functionality is showing and hiding controls. This task was never very difficult before, but the combination of spec controls and regular html controls can lead to confusion. Because of this, we decided to expose easier to use functionality through the Spec Form API. I&#8217;ll run [...]]]></description>
			<content:encoded><![CDATA[<p>Without a doubt, the most common request for Spec Form functionality is <strong>showing and hiding controls</strong>.  This task was never very difficult before, but the combination of spec controls and regular html controls can lead to confusion.  Because of this, we decided to expose easier to use functionality through the <strong>Spec Form API</strong>.  I&#8217;ll run through some examples in today&#8217;s post.</p>
<p>The first example will be a simple checkbox click displays a textbox.  Here&#8217;s the HTML:<br />
<code></p>
<input type="checkbox" id="check" text="Yes" />Do you want to include your <em>Title</em><br />
[[ToggleTest]]<br />
</code></p>
<p>You can see that I hard-coded an HTML checkbox element and included a spec control named <em>&#8220;ToggleTest&#8221;</em>.  I did not set the &#8220;checked&#8221; property to &#8220;checked&#8221; because I want the user to click the box to expose the <em>&#8220;ToggleTest&#8221;</em> control.  We are controlling when it&#8217;s visible through the advanced script:</p>
<p><code><br />
spec['ToggleTest'].hide();</p>
<p>get('check').onclick = function() {<br />
  spec['ToggleTest'].toggle();<br />
}<br />
</code></p>
<p>The first line simply tells the <em>ToggleTest</em> control to become hidden.<br />
<blockquote>In the past you&#8217;ll remember that I documented the &#8220;<strong>InitializeSpecForm</strong>&#8221; function and told you to put any code you wanted to run on page load there.  With the Advanced Scripting tab we automatically handle that for you know.  You simply need to put the code in the tab and it will run on page load.  This is an important note because the order of the page load is complicated and if not followed properly will simply result in JavaScript errors.</p></blockquote>
<p>  Next, I use the <strong>&#8220;get&#8221;</strong> function to find the HTML checkbox with the id: &#8220;check&#8221;.  I want to toggle the visibility of the <em>&#8220;ToggleTest&#8221; </em>when the user clicks the checkbox so I bind the Spec Form API function <strong>&#8220;toggle()&#8221;</strong> to the onclick event.  That section of code basically says &#8220;When the &#8220;check&#8221; checkbox is clicked peform this function: <code>spec['ToggleTest].toggle();</code>The toggle() function checks the current state of the referenced element and simply changes it to the other state.  An easy analogy is a light switch.</p>
<p>I&#8217;ve put a new product on the <a href="http://www.four51.com/UI/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo site</a> named &#8220;Spec Form API Playground.&#8221;  I have this example there, and in the future I&#8217;ll continue to expand on that product with further examples.  Next week I&#8217;ll show you howto use a radiobutton list to show or hide a choice between several different elements based on the selection of the user.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=235&title=Advanced+Technology:+Advanced+Scripting&#8211;Showing+and+Hiding+Controls&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=235&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=235</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology:  Advanced Scripting with the Wizard widget</title>
		<link>http://www.insightsfour51.com/?p=232</link>
		<comments>http://www.insightsfour51.com/?p=232#comments</comments>
		<pubDate>Fri, 02 Nov 2007 20:05:51 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=232</guid>
		<description><![CDATA[As promised, I will demonstrate the Wizard widget available through the previously discussed Spec Form API. Some of you may remember the blog post originally demonstrating how to do a wizard through traditional javascript in a spec form. That example was chock full of complicated code that most people were probably intimidated by and therefore [...]]]></description>
			<content:encoded><![CDATA[<p>As promised, I will demonstrate the Wizard widget available through the previously discussed<strong> Spec Form API</strong>.  Some of you may remember the <a href="http://www.insightsfour51.com/?p=133 ">blog post</a> originally demonstrating how to do a wizard through traditional javascript in a spec form.  That example was chock full of complicated code that most people were probably intimidated by and therefore didn&#8217;t attempt to utilize in their own spec forms.  However, the concept is a great usability tool and I knew that it would be one of the first things to put in the API.  </p>
<p>One of the great aspects of this widget is that you <em><u>do not have to type a single character of code</u></em>.  Not only no actual coding, but the HTML markup is even WAY simpler.  Let&#8217;s demonstrate.</p>
<p>I created 3 text spec controls named: Input1, Input2 and Input3.  Then in the HTML markup I put the following:<br />
<code></p>
<div class="Wizard">
<div>Input First:&nbsp;&nbsp;[[Input1]]</div>
<div>Input Second:&nbsp;&nbsp;[[Input2]]</div>
<div>Input Third:&nbsp;&nbsp;[[Input3]]</div>
</div>
<p></code></p>
<p>If you compare this HTML markup to the previous blog demonstration you&#8217;ll see a remarkable difference. <em>This is literally all you have to do</em>.  Of course you will usually want to put more information in the individual panels/div elements.  </p>
<p>The wizard basically takes the first <em>&#8220;div&#8221;</em> element with a class name of <strong>&#8220;Wizard&#8221;</strong>, then looks within that element for all other <em>&#8220;div&#8221;</em> elements.  Each of the found elements becomes a <strong>&#8220;panel&#8221;</strong> in the wizard.  The widget automatically injects a border around the wizard as well as the navigation buttons for stepping through the panels.  </p>
<p>Now, we didn’t stop there.  We thought some of you savvy users might want to actually interact with the wizard programmatically and didn&#8217;t want to leave you out.  We built in several <strong>events </strong>that you can override and write specific code against.  Each of these events is documented in the help file, but I&#8217;ll give you an example of one usage.</p>
<p>Say you want to put special emphasis on moving from panel to panel by prompting the user to acknowledge they are ready to move on.  You can simply override the Wizard&#8217;s <strong>onBeforeMoveForward </strong>event like so:</p>
<p><code>specForm.wizard.onBeforeMoveForward = function() {<br />
	return confirm('Are you sure you want to move on?');<br />
}</code></p>
<p>This will prompt the user with a confirmation popup window asking them if they are sure they want to continue.  Because <u>the event must return true or false</u> the result of the user interaction will determine whether or not the wizard advances to the next panel.</p>
<p>If any of that confused you, don&#8217;t let it discourage your use of the Wizard.  The <strong>events are supplemental to the actual Wizard</strong>, and if completely ignored will have no bearing on its functionality.</p>
<p>As always, I have a demo of this solution on my <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">demo site</a>.  I simply reworked the existing Wizard Spec Form example product.  <strong><em><u>Feel free to ask questions in the comments below</u></em></strong>.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=232&title=Advanced+Technology:++Advanced+Scripting+with+the+Wizard+widget&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=232&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=232</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Introduction of Advanced Scripting</title>
		<link>http://www.insightsfour51.com/?p=228</link>
		<comments>http://www.insightsfour51.com/?p=228#comments</comments>
		<pubDate>Fri, 26 Oct 2007 15:45:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=228</guid>
		<description><![CDATA[The latest Four51 release contained a little discussed feature called &#8220;Advanced Scripting&#8220;. This feature is a permission enabled by our Customer Support staff upon request. Once enabled you will have a new tab in the Spec Form property page for variable products called &#8220;Advanced Scripting&#8221;. Within this tab is real-time JavaScript code syntax highlighting with [...]]]></description>
			<content:encoded><![CDATA[<p>The latest Four51 release contained a little discussed feature called &#8220;<strong>Advanced Scripting</strong>&#8220;.   This feature is a permission enabled by our Customer Support staff upon request.  Once enabled you will have a new tab in the Spec Form property page for variable products called &#8220;Advanced Scripting&#8221;.  Within this tab is real-time JavaScript code syntax highlighting with auto completion.  Additionally, we have created a <strong>Spec Form Application Programming Interface (API)</strong> that you can leverage to easily create dynamic spec forms.  Starting today I&#8217;ll be starting a series on how to take advantage of this powerful new tool.</p>
<p>API is best defined as: </p>
<blockquote><p>The set of procedure calls that communicates with a linkable procedure library.  An interface to software libraries. An API can consist of classes, function calls, subroutine calls, descriptive tags, etc. </p></blockquote>
<p>In our approach to development of this feature, our goal was to simplify the ability to leverage traditional JavaScript capabilities in the spec form.  One of the most sought after services requested of us is to create more functional spec forms.  Many of my previous posts revolved around spec form usability, and most of those solutions were accomplished through JavaScript coding.  We realize that this is a skill set that many of our customers do not possess, so we went about attempting to reduce the need to understand programming while still leveraging the power of JavaScript.</p>
<p>Today I&#8217;ll give an example that will hopefully demonstrate how we&#8217;ve simplified some aspects.</p>
<p>In many examples from this blog you were introduced to accessing spec controls with the following syntax:  <strong>spec['SpecName']</strong>.  This is actually an array named &#8220;spec&#8221; of all the spec controls on the page, and we&#8217;ve been accessing individual controls by referring to the array index by name (['SpecName']).  This was a shortcut provided to make it simpler to program against those controls.  However, if you had placed controls not included as a spec control, such as a checkbox, you were not able to use the array to access it.  You were required to use the <strong>document.getElementById()</strong> function in JavaScript.  I imagine this was confusing to someone trying to learn JavaScript.</p>
<p>In our Spec Form API we have a simple method named &#8220;<strong>get()</strong>&#8220;.  You can use this method to retrieve any control in the spec form by name.  For example, let&#8217;s say you have spec form with a spec control you&#8217;ve named &#8220;InputName&#8221; and a regular HTML checkbox control with the ID &#8220;IncludeTitle&#8221;  With the &#8220;<strong>get()</strong>&#8221; method you can access both using the following: <code>get("InputName")</code><code>get("IncludeTitle")</code></p>
<p>This is just the beginning of our discussion on the Spec Form API.  The &#8220;get()&#8221; method is a fundamental aspect you will utilize in almost all of your advanced scripts.  There are many more.  Included in the API are feature sets called &#8220;plug-ins&#8221;.  Next week I&#8217;ll discuss the Wizard plug-in.</p>
<p>For further understanding of this feature, visit Access Four51 and download the <a href="http://myaccess.four51.com/site/Four51 Spec Form API.pdf">help file</a>.  This file documents all of the current methods and plug-ins.  It includes examples of each and signature definitions.  </p>
<p>We are taking the approach that this is will be a continual work in progress.  Post comments here if you have ideas for new plug-ins or methods that will help us continue to improve the new, powerful feature.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=228&title=Advanced+Technology:+Introduction+of+Advanced+Scripting&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=228&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=228</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: More Product List Customization</title>
		<link>http://www.insightsfour51.com/?p=213</link>
		<comments>http://www.insightsfour51.com/?p=213#comments</comments>
		<pubDate>Fri, 28 Sep 2007 16:15:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=213</guid>
		<description><![CDATA[Today I thought I&#8217;d demonstrate more product list customization techniques. I decided to task myself with ensuring a product gets a little more attention from the user when they are browsing a catalog. Specifically, I chose to use mouseovers to apply and remove an opaque background. When the user runs his/her mouse over the product [...]]]></description>
			<content:encoded><![CDATA[<p>Today I thought I&#8217;d demonstrate more product list customization techniques.  I decided to task myself with ensuring a product gets a little more attention from the user when they are browsing a catalog.  Specifically, I chose to use mouseovers to apply and remove an opaque background.  When the user runs his/her mouse over the product the opaque background is removed and creates a highlighting effect.  I think it creates a nice tunnel or focus effect.  This technique requires very little javascript, but it will demonstrate setting a property we have not discussed in the blog before:</p>
<p>Here&#8217;s the markup:</p>
<p><code></p>
<style>
.black_overlay {
    background-color: lightgray;
	border: 4px solid #999999;
    z-index:98;
    -moz-opacity: 0.7;
    opacity:.70;
    filter: alpha(opacity=70);
	padding: 8px;
}</p>
<p>.white_content{
    border: 4px dotted #999999;
    background-color: white;
    z-index:99;
	padding: 8px;
}</p>
<p>.thumbnail {
        position: relative;
        float: left;
        text-align: center;
        width: 200px;
        padding: 3px;
}
.product {
        float: left;
        width: 600px;
        margin-left: 10px;
        padding: 3px;
}
.name {
        font-size: 16px;
        font-weight: bold;
}
</style>
<td class="black_overlay" id="td[[ProductID]]" onmouseover="document.getElementById('td[[ProductID]]').className = 'white_content';" onmouseout="document.getElementById('td[[ProductID]]').className = 'black_overlay';">
<div class="thumbnail">
		<a class="ProductImage" href="[[DetailsURL]]">[[Thumbnail]]</a>
	</div>
<div class="product">
<p class="details" style="margin-left: 10px;">
			<a href="[[DetailsURL]]"><span class="name">[[ProductName]]</span></a></p>
<p>			<b>[[ProductID]]</b></p>
<p>			[[Description]]</p>
<p>			[[AddToOrder]]
		</p>
</p></div>
</td>
<p></code></p>
<p>Pay special attention to the style classes named: black_overlay and white_content.  These two styles become the mouseover toggle and produce the opacity effects in the product area.  Notice in particular the z-index property.  This property guarantees that the opaque effect will overlay the contents.</p>
<p>The effect is toggled in the table cell&#8217;s onmouseover and onmouseout events:  <code>
<td class="black_overlay" id="td[[ProductID]]" onmouseover="document.getElementById('td[[ProductID]]').className = 'white_content';" onmouseout="document.getElementById('td[[ProductID]]').className = 'black_overlay';"></code>  I chose to set the ID property with the [[ProductID]] token and precede this with &#8220;td&#8221;.  This ensures uniqueness.  The new property we have not discussed previously is &#8220;className&#8221;.  Very simply, it sets the class on the element referenced.  Much easier and more concise than trying to set each individual property we want to alter.  </p>
<p>Remember that I recommend you put any styles in your custom theme.  If you copy and paste this example into your Product List Customization, the data will be repeated for every product and the page size will increase exponentially.  Hopefully these examples spur some ideas of your own.</p>
<p>I&#8217;ve left this example applied on my demo site.  You can always go <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">here</a> to see all the examples from the blog.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=213&title=Advanced+Technology:+More+Product+List+Customization&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=213&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=213</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Secure Login Through SSL</title>
		<link>http://www.insightsfour51.com/?p=208</link>
		<comments>http://www.insightsfour51.com/?p=208#comments</comments>
		<pubDate>Fri, 21 Sep 2007 15:23:11 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=208</guid>
		<description><![CDATA[I thought I&#8217;d touch on an aspect of the upcoming release in today&#8217;s post. We will be requiring all login transactions to be conducted through Secure Sockets Layer (SSL). I like the definition from About.com: SSL stands for secure sockets layer. It is a security protocol to enable Web sites to pass sensitive information securely [...]]]></description>
			<content:encoded><![CDATA[<p>I thought I&#8217;d touch on an aspect of the upcoming release in today&#8217;s post.  We will be requiring all login transactions to be conducted through Secure Sockets Layer (SSL).  </p>
<p>I like the definition from <a href=" http://webdesign.about.com/od/ssl/g/bldefssl.htm" target="_new">About.com</a>:<br />
<blockquote>SSL stands for secure sockets layer. It is a security protocol to enable Web sites to pass sensitive information securely in an encrypted format. It is based on the RSA Data Security&#8217;s public-key cryptography.</p></blockquote>
<p>So, what does this mean for you and your users?  Not much will change really.  For the most part, this process will take place without either of you noticing.  However, if you have created your own login form, then will be repercussions you should be prepared for on release day.</p>
<p>In your login page you must define the form&#8217;s Action property.  This is the URL where the form will post the login information: https://www.four51.com/ui/logon.aspx.  Most likely you currently do not have https as the protocol in the URL.  This is what has changed.  Once the release is completed your form will fail if you are still using http://.  </p>
<p>What actually happens?  It&#8217;s very simple actually.  Using SSL means that all the information sent to the server will be encrypted.  The encryption is handled by your browser and our servers can decrypt that information so it can be read.  After the login is complete you&#8217;ll notice that the URL no longer contains the https.  That is because the information presented does not need encryption.  Once your user navigates through the billing process the security will once again be invoked.</p>
<p>You do not need to set up SSL on the server that hosts your custom logon page, if different from Four51.  The encryption takes place in the transfer of the data to the server.</p>
<p>This feature is part of our ongoing effort to provide the most secure environment for your purchasing customers.  Other features such as Password security strength requirements, password reset for lost password rather than providing the password, and account lockout due to login failure are successors to this feature.  Look for more in the near future.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=208&title=Advanced+Technology:+Secure+Login+Through+SSL&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=208&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=208</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Spec Control Labeling Alternative</title>
		<link>http://www.insightsfour51.com/?p=204</link>
		<comments>http://www.insightsfour51.com/?p=204#comments</comments>
		<pubDate>Fri, 14 Sep 2007 17:35:43 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=204</guid>
		<description><![CDATA[Have you ever had a spec form that just needed more streamlined spacing? One way I’ve accomplished this in the past is to eliminate the labels next to or above forms and replace them with inline labels. This technique is becoming more popular in many applications and websites, so I thought I demonstrate how to [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever had a spec form that just needed more streamlined spacing?  One way I’ve accomplished this in the past is to eliminate the labels next to or above forms and replace them with inline labels.  This technique is becoming more popular in many applications and websites, so I thought I demonstrate how to do this in your spec form.</p>
<p>Example code:<br />
<code><br />
<script>
  var count = 0;
  function InitializeSpecForm() {
    spec['InputValue'].style.color = 'gray';
    spec['DisplayValue'].style.color = 'gray';
    spec['InputValue'].value = 'Name';
    spec['DisplayValue'].value = 'Title';</p>
<p>    spec['InputValue'].onfocus = function() {
      if (count > 1) {
        this.value = '';
        this.style.color = 'black';
      }
      else
        spec['InputValue'].blur();
      count++;
    }</p>
<p>    spec['InputValue'].onblur = function() {
      if (this.value == '') {
        this.value = 'Name';
        this.style.color = 'gray';
      }
    }</p>
<p>    spec['DisplayValue'].onfocus = function() {
      this.value = '';
      this.style.color = 'black';
    }</p>
<p>    spec['DisplayValue'].onblur = function() {
      if (this.value == '') {
        this.value = 'Title';
        this.style.color = 'gray';
      } 
    }
  }
</script><br />
[[InputValue]]<br />
[[DisplayValue]]<br />
</code></p>
<p>I begin with two variables, named InputValue and DisplayValue.  I’m using two because we need to do a little something different with the first spec in the form.  For this example I’m taking the approach of controlling style aspects through javascript functions.  This can easily be done with CSS.</p>
<p>Now let’s look at the JavaScript.  You’ll see that we are using InitializeSpecForm() again for the first time in a while.  The first four lines of this method are setting default style properties and the text we want to use as a label.  From here I want to skip down to examine the following: <code>    spec['DisplayValue'].onfocus = function() {<br />
      this.value = '';<br />
      this.style.color = 'black';<br />
    }</p>
<p>    spec['DisplayValue'].onblur = function() {<br />
      if (this.value == '') {<br />
        this.value = 'Title';<br />
        this.style.color = 'gray';<br />
      }<br />
    }</code></p>
<p>I’m assigning a function to two events of the spec control: onfocus and onblur.  The event, onfocus, is fired when the cursor is set in the textbox (from tabbing or clicking into it).  The onblur event is the opposite.  Once the cursor leaves the textbox it will be fired.  In the onfocus event we want to remove the label and set the text color to black.  Once the user leaves the textbox we now want to check if a change was made to the default text, and if not set the text back to the label value.  </p>
<p>There is a difference with the InputValue spec because it received focus initially on page load.  This will fire the onfocus event and remove the label, which will leave the user wondering what they are suppose to enter in that field.  So, we compensate for this by keeping a count of how many times the InputValue has received focus.  If the count is greater than 1 then we want to hide the text and set it to black.</p>
<p>As always you can go to my demo site to see this example in action by clicking <a href="http://www.four51.com/UI/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">here</a>.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=204&title=Advanced+Technology:+Spec+Control+Labeling+Alternative&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=204&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=204</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Product List Customization</title>
		<link>http://www.insightsfour51.com/?p=201</link>
		<comments>http://www.insightsfour51.com/?p=201#comments</comments>
		<pubDate>Fri, 07 Sep 2007 19:54:41 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=201</guid>
		<description><![CDATA[In continuing with the examination of new features soon to be released, I’ll be discussing a current feature: Product List Customization. As you should already know, the ability to customize the HTML layout of the product list page is a setting for each buyer company. In the customization section, you have a list of available [...]]]></description>
			<content:encoded><![CDATA[<p>In continuing with the examination of new features soon to be released, I’ll be discussing a current feature:  <strong>Product List Customization</strong>.  As you should already know, the ability to customize the HTML layout of the product list page is a setting for each buyer company.  In the customization section, you have a list of available <em>tokens</em> that you can place in any imaginable layout you wish.  In our upcoming release you’ll have another new one, the Price Schedule table.</p>
<p>The price schedule table already exists in the Product Detail customization feature.  When rendered it is a basic HTML table that displays all the price breaks for the current product.  Because so many basic products are orderable from the product list page, we decided to include the ability to display this table here as well.  <u>Take note that the price schedule will only display for products that can be ordered from the product list page, and a price schedule must exist for that product</u>.</p>
<p>In the example, I want to show you two things.  First, how to edit the customization using table less layout.  Secondly, how to put the new price schedule token in a <strong>mouseover</strong>.  Take the example with a grain of salt as I have absolutely no design skills whatsoever.  I’m merely attempting to demonstrate some techniques you may find useful.</p>
<p>Example code:<code><br />
<style>
.thumbnail {
	position: relative;
	float: left;
	text-align: center;
	width: 200px;
	padding: 3px;
}
.product {
	float: left;
	width: 600px;
	margin-left: 10px;
	padding: 3px;
}
.name {
	font-size: 16px;
	font-weight: bold;
}
.details {
	margin-left: 10px;
}
.popup {
	display: none;
	z-index: 999;
	position: absolute;
	left: 170px;
	top: 20px;
	background-color: beige;
}
.line {
	border-top: 1px dotted #cc9;
}
</style>
<td>
<hr noshade="noshade" size="1" class="line">
<div onmouseout="document.getElementById('[[ProductID]]').style.display = 'none';" onmouseover="document.getElementById('[[ProductID]]').style.display = 'inline';" class="thumbnail">
		<a class="ProductImage" href="[[DetailsURL]]">[[Thumbnail]]</a></p>
<p>[[AddToOrder]]</p>
<div class="popup" id="[[ProductID]]" id="price">[[PriceSchedule]]</div>
</p></div>
<div class="product">
<p class="details">
			<a href="[[DetailsURL]]"><span class="name">[[ProductName]]</span></a></p>
<p>			<b>[[ProductID]]</b></p>
<p>			[[Description]]
		</p>
</p></div>
</td>
<p></code></p>
<p>A couple prefacing notes:  it’s probably best to put your css definitions in your theme’s stylesheet(s).  In this example it will be repeated for each product in the list making the page slower to load.  I’m not suggesting this is a quality layout.  I wouldn’t copy and paste this example into your site customization.</p>
<p>So, let’s examine a few details in the example.  You can see that I’ve elected not to use a traditional table layout.  I’ve divided the content into sections by placing it in <em>div </em> tags.  Without style applied <em>div </em>tags assume 100% width.  Consecutive <em>div </em>tags will flow-like paragraph breaks.  Creating a horizontal layout is accomplished through the css styles in the example.  For instance,<strong> position: relative</strong>, implies the content will anchor in the items parent (the final parent will be the document itself). So all coordinate settings will refer to the parent’s top left most location as 0,0.  This concept is certainly familiar to designers.  Once I determined layout coordinates that would not cause overlaying of items, I moved on to the actual price schedule <em>popup</em>.</p>
<p>A couple important notes about the price schedule content.  I applied the class <em>popup</em> to the <em>div </em>container tag, and I’m using the <strong>[[ProductID]]</strong> token as the <em>id</em> of the div container.  This ensures that the ID is unique to the page.  The two key components of the <em>.popup css</em> definition is the <strong>display </strong>and <strong>z-index</strong> properties. I simply want to ensure that the price schedule is the topmost item on the page so I safely assume that 999 for the z-index will be adequate.  I also need to make sure the price schedule begins hidden, and this is accomplished with the <em>none</em> value set to the display property.  Now let’s move on to the actual <strong>mouseover </strong>effect.</p>
<p>I’ve chosen the area that holds the thumbnail as the item which will trigger the effects.  Within the div container tag I’ve placed two event definitions: <strong>onmouseout </strong>and <strong>onmouseover</strong>.  I think their purpose is obvious from their names.  I’m actually placing the javascript within these event declarations.  <code> document.getElementById('[[ProductID]]').style.display</code> You now should see why the <strong>ProductID </strong>token as the ID was important before.  We are referencing the price schedule to display by that unique id.  The <em>style.display</em> properties I’m using for show and hide are: none and inline.</p>
<p>The price schedule token is new and has not been release yet.  In order to see this example in action, you’ll need to use your <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">regular login to my demo site in the beta environment</a>.  Then look for the<strong> Basic Product</strong> in the list.  For an additional example of a new feature, look at the sort options now available.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=201&title=Advanced+Technology:+Product+List+Customization&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=201&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=201</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Theme Management</title>
		<link>http://www.insightsfour51.com/?p=197</link>
		<comments>http://www.insightsfour51.com/?p=197#comments</comments>
		<pubDate>Fri, 31 Aug 2007 16:07:47 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=197</guid>
		<description><![CDATA[Four51’s latest release beta was announced and demonstrated this week. This release will be jam-packed full of new features! Over the next couple weeks I’ll be discussing some of the finer points of the new features. I’ll begin with theme management. I’m the first to point out that the default look and feel of the [...]]]></description>
			<content:encoded><![CDATA[<p>Four51’s latest release beta was announced and demonstrated this week.  This release will be jam-packed full of new features!  Over the next couple weeks I’ll be discussing some of the finer points of the new features.  I’ll begin with theme management.</p>
<p>I’m the first to point out that the default look and feel of the Four51 site is rather dated.  I personally would not want to roll out a buyer site with that theme applied, but I also do not have a creative bone in my body.  I cannot design a web page to save my life.  Sure, I can handle the technical aspects of writing the HTML markup but you would never want me creatively designing anything.  To make matters worse, I’m also color blind.  Thankfully, we’ve contracted some skilled designers to create a number of stock themes for you to apply to your site. </p>
<p>Previously, you had to contact customer support to have a theme applied;  not any more! The new theme management feature allows you to assign themes to individual buyers. You can apply them and log in as a user to check out the different styles.  For those that have visited my examples site, you’ve seen one of them already.</p>
<p>Additionally, you are also able to create and manage your own custom themes.  If you haven’t examined how to create your own them yet, we have training available (check out the <a href="http://myaccess.four51.com/s.nl/sc.16/category.201/.f">training section </a>of Access Four51 for more info).  Our implementation of this feature offers you an unprecedented level of freedom in designing your buyer site.  Currently there are over 600 custom themes on the Four51 application.</p>
<p>Next week I’ll be touching on customizing the Product List page and focusing on using the new Price Schedule token.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=197&title=Advanced+Technology:+Theme+Management&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=197&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=197</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Auto-Hide With Copy Fit Rules</title>
		<link>http://www.insightsfour51.com/?p=192</link>
		<comments>http://www.insightsfour51.com/?p=192#comments</comments>
		<pubDate>Wed, 22 Aug 2007 12:28:20 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=192</guid>
		<description><![CDATA[Copy fit rules are extremely powerful because they allow you to fit long strings of text inside a text container when the text is too long for the container or a paragraph line in the container. However, since copy fit rules can only be applied to a text container, a unique challenge exists when you [...]]]></description>
			<content:encoded><![CDATA[<p>Copy fit rules are extremely powerful because they allow you to fit long strings of text inside a text container when the text is too long for the container or a paragraph line in the container.  However, since copy fit rules can only be applied to a text container, a unique challenge exists when you need to copy fit only one paragraph within a text block.  For example, you may have the following text block:</p>
<p>Name<br />
Address Line One<br />
Address Line Two<br />
City, State Zip Code</p>
<p>If a user enters text that is too long for &#8220;Address Line One&#8221;, but does not enter text that is too long for the other variables, you likely don&#8217;t want to copy fit the other lines.  Using Pageflex&#8217;s grouping, copy fit, and auto-hide features, you can allow for this very easily.  In the following example, we discuss how to configure this for a block of text with four lines of text: Name, Address Line One, Address Line Two, City/State/Zip Code.</p>
<p><strong>Here are the general steps we used to create the example:</strong><br />
———————————————————————————————————<br />
<strong>1.</strong> Draw four separate text boxes, one for each line of text: Name, Address Line One, Address Line Two, City/State/Zip Code.</p>
<p><strong>2.</strong> Set the Flex Width property for each text box to &#8220;Minimize&#8221;.</p>
<p><strong>3.</strong> Create a vertical group including all four text boxes, and set the group&#8217;s Vertical Alignment and Horizontal Alignment properties appropriately.  This step is necessary to ensure desired collapsing.</p>
<p><strong>4.</strong> Optionally, set the Bumper properties of each text box to accomodate for desired leading between text boxes.</p>
<p><strong>5.</strong> Create an &#8220;Advanced&#8221; copy fit rule. You may create the rule to copy fit any of the following attributes: Font Size, Leading, Horizontal Scale, Space Before, Space After, Tracking.  Be sure to check the option for &#8220;Fit paragraphs on single lines&#8221;.  This will ensure that text does not wrap.</p>
<p><strong>6.</strong> Apply your copy fit rule to all four text boxes.</p>
<p><strong>7.</strong> Create four Plain Text/Constant variables named the following: Name, AddressLineOne, AddressLineTwo, CityStateZip.  Apply these to the corresponding text on your template.</p>
<p><strong>8.</strong> With your pointer tool, select the text box containing the Name variable.  Go to the Flex tab of the Properties dialog box and look for &#8220;Auto-Hide Condition&#8221;.  In the &#8220;For Element&#8221; box, enter &#8220;Name&#8221; (without quotes).</p>
<p><strong>9.</strong> Repeat step #8 for AddressLineOne, AddressLineTwo and CityStateZip.<br />
———————————————————————————————————————</p>
<p>To see a working example of this project and to download the project files, click <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb">here</a>.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=192&title=Advanced+Technology:+Auto-Hide+With+Copy+Fit+Rules&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=192&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=192</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: File Print Web Service</title>
		<link>http://www.insightsfour51.com/?p=191</link>
		<comments>http://www.insightsfour51.com/?p=191#comments</comments>
		<pubDate>Fri, 17 Aug 2007 14:53:28 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=191</guid>
		<description><![CDATA[Today I’ll cover the File Print Web Service. This is a relatively new web service, and is quite similar to the Project Update Web Service. It provides an automated way to upload and attach a file to a product. Creating a product with a variable spec that will accept the uploaded file is simple. Just [...]]]></description>
			<content:encoded><![CDATA[<p>Today I’ll cover the <strong>File Print Web Service</strong>.  This is a relatively new web service, and is quite similar to the Project Update Web Service.  It provides an automated way to upload and attach a file to a product.  Creating a product with a variable spec that will accept the uploaded file is simple.  Just enable the <em>“Allow Remote” </em>option and choose a template user.  The template user acts as the base profile for user’s that may need to create an account to finalize the order.  In this post I will demonstrate how to utilize this service through a .Net application using C#.  However, you are not restricted to this framework.  </p>
<p>To upload a file, we will be making an HTTP POST with the file in the Body of the message.   The server will accept the POST and return a response indicating success or failure.  The server receives the request, parses the querystring value and, if valid, reads the body (uploaded file) into a buffer and saves it to the variable spec.  The logic is very simple, which is good because there are very few things that could potentially go wrong and therefore make it easier to debug.</p>
<p>After creating a variable spec (file type) and enabling remote upload the application will display the URL you need to use for posting.  The GUID in the querystring contains all the information the application needs to identify what to do with the file.</p>
<p>Sample URL: <em>http://www.four51.com/UI/FilePrint.hcf?id=a93bb1be-20cd-4f58-b402-a381a551e0c1</em></p>
<p>Now let’s walk through creating a very simple C# project that will perform a file upload.  </p>
<p>This is where the two services are quite similar.  The code to open a local file and upload it is identical.  We’ll only need to change the HTTP POST url.</p>
<p><code><br />
string Four51URL = String.Format("http://www.four51.com/UI/FilePrint.hcf?id=a93bb1be-20cd-4f58-b402-a381a551e0c1");</p>
<p>HttpWebRequest webRequest = HttpWebRequest)HttpWebRequest.Create(Four51URL);<br />
FileStream fileStream = File.OpenRead("C:\filetoupload.txt");<br />
webRequest.ContentLength = fileStream.Length;<br />
webRequest.Method = "POST";<br />
Stream requestStream = webRequest.GetRequestStream();<br />
byte[] buffer = new byte[32768];<br />
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);</p>
<p>while (bytesRead > 0)<br />
{<br />
	requestStream.Write(buffer, 0, bytesRead);<br />
	bytesRead = fileStream.Read(buffer, 0, buffer.Length);<br />
}<br />
requestStream.Flush();<br />
requestStream.Close();<br />
fileStream.Close();</p>
<p>try<br />
{<br />
	WebResponse webResponse = webRequest.GetResponse();<br />
	MessageBox.Show("File uploaded successfully!");</p>
<p>}<br />
catch (WebException webError)<br />
{<br />
	string message = "File upload failed:\r\n" + webError.Message + "response: \r\n\r\n";</p>
<p>	try<br />
	{<br />
		TextReader responseReader = new StreamReader(webError.Response.GetResponseStream());<br />
		message += responseReader.ReadToEnd();<br />
		responseReader.Close();<br />
	}<br />
	catch<br />
	{<br />
		message += "Failure: Can't read response.";<br />
	}<br />
	MessageBox.Show(message);<br />
}<br />
</code></p>
<p>Without attempting to detail all of the aspects of this code, you can read about it in detail <a href=”http://msdn2.microsoft.com/en-us/library/debx8sh9.aspx“>here</a>.  In summary the code is opening a web request, a local file to insert into the body of the POST and processing the POST.  </p>
<p>The receiving web service ingests the body of the POST and uses the querystring parameter to locate the product and attach the file to the proper file spec.</p>
<p>Overall, this is a very simple web service to implement.  Of course, this example is probably not adequate for your production environment.  It is a good starting point that you can extend for more functionality.  Additionally, Four51 has created component services that allow you to distribute print drivers to your customers that use this service.  They then have the ability to click “Print” from any application and print the file directly to the Four51 application.  </p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=191&title=Advanced+Technology:+File+Print+Web+Service&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=191&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=191</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Technology: Layering Pageflex Variables</title>
		<link>http://www.insightsfour51.com/?p=190</link>
		<comments>http://www.insightsfour51.com/?p=190#comments</comments>
		<pubDate>Thu, 16 Aug 2007 13:33:24 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Advanced Technology]]></category>
		<category><![CDATA[Pageflex]]></category>
		<category><![CDATA[The App]]></category>

		<guid isPermaLink="false">http://www.insightsfour51.com/?p=190</guid>
		<description><![CDATA[Template designers are often asked to build a single template to accomodate many different versions of a product. For example, a single customer&#8217;s business card may have many different versions, each version having a different layout and graphics. The rules that drive the versions may depend on anything from a person&#8217;s corporate division to the [...]]]></description>
			<content:encoded><![CDATA[<p>Template designers are often asked to build a single template to accomodate many different versions of a product.  For example, a single customer&#8217;s business card may have many different versions, each version having a different layout and graphics.  The rules that drive the versions may depend on anything from a person&#8217;s corporate division to the number of variable fields used.  In all cases, the design of the product changes based on many different dynamic factors.</p>
<p>One strategy that helps when implementing these challenging projects is to use layers of variability.  Layered variability means embedding variable content inside of variable content.  For example, you can embed variable area templates inside variable area templates.  You can embed variable text inside of variable text.  You can even mix embedded variable content as long as you stay within the boundaries of Pageflex&#8217;s content rules.  For example, inside a variable area template, you can embed variable text or a variable image.</p>
<p>Layering variables basically means creating a bunch of rules (or scripts) that control content on several different levels.  According to Pageflex, there is no limit to the number of layers you can implement, giving you endless options for how to configure your projects.  In the following example, we discuss how to implement a template where a user can choose from a logo selection or enter their own tagline text, but not both.  Either the logo appears or the tagline appears.  There are two layers of variability to this project:</p>
<p><strong>Layer One:</strong> Controls whether the logo OR the tagline appears.<br />
<strong>Layer Two:</strong> Controls the specific logo OR tagline text to appear.</p>
<p><strong>Here are the general steps we used to create the example:</strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<strong>1.</strong> Draw an Area Template container on your pasteboard.</p>
<p><strong>2.</strong> Place an Image container inside the Area Template.</p>
<p><strong>3.</strong> Create a source variable for the logo selection:<br />
Variable Name: LogoSelection<br />
Kind: Plain Text<br />
Source: Constant</p>
<p><strong>4.</strong> Create an image rule for the logo:<br />
Variable Name: LogoRule<br />
Kind: Image<br />
Source: Rule<br />
Rule Definition:<br />
If &#8220;LogoSelection&#8221; Is &#8220;Logo A&#8221; Result Is &#8220;LogoA.jpeg&#8221;<br />
Else If &#8220;LogoSelection&#8221; Is &#8220;Logo B&#8221; Result Is &#8220;LogoB.jpeg&#8221;<br />
Else If &#8220;LogoSelection&#8221; Is &#8220;Logo C&#8221; Result Is &#8220;LogoC.jpeg&#8221;</p>
<p><strong>5.</strong> Apply &#8220;LogoRule&#8221; to the Image container inside the Area Template.</p>
<p><strong>6.</strong> Select the Area Template container with your pointer tool, and then export it as a file into your Area Templates folder.  Name the file &#8220;LogoVersion.xat&#8221;.</p>
<p><strong>7.</strong> Delete the Image container inside the Area Template, and then draw a text container inside the Area Template container.</p>
<p><strong>8.</strong> Put some default text into the Text container, and then apply a source variable.  Use the following variable definition:<br />
Variable Name: CustomerText<br />
Kind: Plain Text<br />
Source: Constant</p>
<p><strong>9.</strong> Select the Area Template container with your pointer tool, and then export it as a file into your Area Templates folder.  Name the file &#8220;TextVersion.xat&#8221;.</p>
<p><strong>10.</strong> Create a rule for the Area Template container:<br />
Variable Name: VersionRule<br />
Kind: Area Template<br />
Source: Rule<br />
Rule Definition:<br />
If &#8220;LogoSelection&#8221; Is Not  Result Is &#8220;LogoVersion.xat&#8221;<br />
Otherwise Result Is &#8220;TextVersion.xat&#8221;</p>
<p><strong>11.</strong> Apply &#8220;VersionRule&#8221; to the Area Template container.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>To see a working example of this project and to download the project files, click <a href="http://www.four51.com/ui/AutoLogon.hcf?id=9db37e24-44f9-4c31-bda6-74cc8bd2bbeb"><strong>here</strong></a>.</p>
<p><strong>There are several benefits to layering variables in your Pageflex projects:</strong></p>
<p>1. Layered variable content make multi-version projects possible, which otherwise would require several different projects.</p>
<p>2. Layering variables reduces the total number of elements in a project.  A common mistake amongst template designers is to create a separate static area template for each version.  You can reduce the number of content files by embedding variables within your content files.</p>
<p>3. Using layered variable content makes modifications quicker.  If you need to make a change that affects an underlying element, you only need to make the change once.</p>
<p><strong>There are also drawbacks to using layering:</strong></p>
<p>1. Initial setup can be complicated and difficult to grasp.  Creating templates with several layers of variability requires planning.  Your first few templates will take longer to setup, but after several projects, you&#8217;ll find that you save a great deal of time.</p>
<p>2. Troubleshooting issues can be difficult. Sifting through lots of different rules and content files to find the specific cause of an error takes some work.  Projects often appear to be a tangled mess of nonsense, especially if you did not build the template.</p>
<a class="google_buzz"  
href="http://www.google.com/reader/link?url=http://www.insightsfour51.com/?p=190&title=Advanced+Technology:+Layering+Pageflex+Variables&srcURL=http://www.insightsfour51.com" target="_blank" rel="nofollow"><img
src="http://www.insightsfour51.com/wp-content/plugins/google-buzz-button-for-wordpress/images/google-buzz.png" alt="Google Buzz" /></a><img src="http://www.insightsfour51.com/?ak_action=api_record_view&id=190&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=190</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
