<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dtvmedia="http://participatoryculture.org/RSSModules/dtv/1.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Insights Four51 » Advanced Technology</title>
	
	<link>http://www.insightsfour51.com</link>
	<description>Insights Four51 features blog posts and podcasts from Four51. Four51 provides online procurement technology for indirect goods.</description>
	<pubDate>Fri, 10 Oct 2008 14:39:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
		<!-- podcast_generator="podPress/7.5" -->
		<copyright>©Four51 </copyright>
		<managingEditor>mstoltz@four51.com (Four51)</managingEditor>
		<webMaster>mstoltz@four51.com</webMaster>
		<category />
		<ttl>1440</ttl>
		<itunes:keywords>Four51, e-commerce, marketing, B2B e-commerce, online catalogs</itunes:keywords>
		<itunes:subtitle>Insights Four51 features blog posts and podcasts from Four51. Four51 (www.four51.com) is automating the B2B e-catalog market using an open e-commerce platform that connects buyers, distributors and suppliers of indirect goods such as printed materials,...</itunes:subtitle>
		<itunes:summary>Insights Four51 features blog posts and podcasts from Four51. Four51 (www.four51.com) is automating the B2B e-catalog market using an open e-commerce platform that connects buyers, distributors and suppliers of indirect goods such as printed materials, promotional products and office supplies. </itunes:summary>
		<itunes:author>Four51</itunes:author>
		<itunes:category text="Business">
  <itunes:category text="Management &amp; Marketing" />
</itunes:category>
<itunes:category text="Business" />
<itunes:category text="Technology" />
		<itunes:owner>
			<itunes:name>Four51</itunes:name>
			<itunes:email>mstoltz@four51.com</itunes:email>
		</itunes:owner>
		<itunes:block>No</itunes:block>
		<itunes:explicit>no</itunes:explicit>
		<itunes:image href="http://demo.four51.com/Images/Product/3a5ed13244a64342a1253223e4d9f30e.jpg" />
		<image>
			<url>http://demo.four51.com/Images/ProductThumbnail/b0dd5e03e3c34acfb339fe216b194ffa.jpg</url>
			<title>Insights Four51</title>
			<link>http://www.insightsfour51.com</link>
			<width>144</width>
			<height>144</height>
		</image>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/four51_advanced_tech" type="application/rss+xml" /><feedburner:emailServiceId>2117700</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item>
		<title>Selling to Uncle Sam: Federal Information Processing Standard</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/412849753/</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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/412849753" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=441</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D441</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=441</feedburner:origLink></item>
		<item>
		<title>Pageflex Upgrade Supplement</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/402848159/</link>
		<comments>http://www.insightsfour51.com/?p=437#comments</comments>
		<pubDate>Thu, 25 Sep 2008 14:00:42 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/402848159" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=437</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D437</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=437</feedburner:origLink></item>
		<item>
		<title>What happens when a Network becomes a Not-Work?</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/382013679/</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[Four51-Centric]]></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, [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/382013679" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=419</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D419</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=419</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Approval Rules (part one)</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/366310599/</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/366310599" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=402</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D402</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=402</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Defined Drop Downs</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/352843833/</link>
		<comments>http://www.insightsfour51.com/?p=401#comments</comments>
		<pubDate>Fri, 01 Aug 2008 15:32:35 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;span class=&quot;States&quot;&gt;&lt;span class=&quot;Country&quot;&gt;</div></div>  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 />
<div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['States'].statedropdown({displayType: &quot;abbr&quot;});<br />
spec['States'].statedropdown.onChange = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; alert('You chose: ' + this.selectedText() + ' and the value is: ' + this.selectedValue());<br />
}</div></div>  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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/352843833" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=401</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D401</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=401</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: What’s so Funny?</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/349211458/</link>
		<comments>http://www.insightsfour51.com/?p=386#comments</comments>
		<pubDate>Mon, 28 Jul 2008 15:33:13 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/349211458" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=386</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D386</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=386</feedburner:origLink></item>
		<item>
		<title>Four51 Application: Pageflex 6x</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/346390616/</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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/346390616" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=384</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D384</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=384</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Variant Identifiers</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/339671774/</link>
		<comments>http://www.insightsfour51.com/?p=379#comments</comments>
		<pubDate>Fri, 18 Jul 2008 17:26:32 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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><div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">spec['Comma'].hide()</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/339671774" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=379</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D379</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=379</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Masked Input</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/333332169/</link>
		<comments>http://www.insightsfour51.com/?p=373#comments</comments>
		<pubDate>Fri, 11 Jul 2008 14:28:39 +0000</pubDate>
		<dc:creator>Tech Guru</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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">spec['Phone'].mask('999.999.9999');</div></div><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 />
<div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['Date'].mask('99/99/9999');<br />
spec['Cost'].mask('$99.99');<br />
spec['Phone'].mask('999.999.9999 x9999', &quot;*&quot;);<br />
spec['SSN'].mask('999-999-9999', '#');</div></div><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> - represents an alpha character (A-Z, a-z)</li>
<li><strong>9</strong> - represents a numeric character (0-9)</li>
<li><strong>*</strong> - 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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/333332169" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=373</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D373</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=373</feedburner:origLink></item>
		<item>
		<title>Four51 Application: Expanded OCI Integration</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/325571475/</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[Four51-Centric]]></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&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>Included in Four51&#8217;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&#8217;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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/325571475" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=351</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D351</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=351</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Turbo-Charged SELECT Lists</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/316724669/</link>
		<comments>http://www.insightsfour51.com/?p=356#comments</comments>
		<pubDate>Fri, 20 Jun 2008 20:17:33 +0000</pubDate>
		<dc:creator>Tech Guru</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><div class="codecolorer-container text" style="height:360px;"><div class="codecolorer" style="font-family: monospace;">// assign specs to variables to make them easier to reference later in the script<br />
var makeList = spec['make'];<br />
var modelList = spec['model'];<br />
<br />
// define a function to show/hide model options based on selected make<br />
function refreshModels() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; modelList.hideAllOptions();<br />
&nbsp; &nbsp; &nbsp; &nbsp; modelList.showOptionAt(0); // always show the blank option<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; var make = makeList.selectedText();<br />
&nbsp; &nbsp; &nbsp; &nbsp; switch (make) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'Ford':<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modelList.showOptionRange('Focus', 'Mustang');<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'Honda':<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modelList.showOptionRange('Civic', 'Pilot');<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 'BMW':<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modelList.showOptionRange('3-series');<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}<br />
<br />
// add the function as a handler of the make list's onchange event<br />
makeList.onchange = refreshModels;<br />
<br />
// also call the function immediately to initialize the form<br />
refreshModels();</div></div></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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;option value=&quot;W0oVX14-pAVwbhqhvu7ev0sQjqs9ZF5DVBjpq3tJLddbmpaDP7tIFqw-e-e&quot;&gt;Ford&lt;/option&gt;</div></div><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><div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">modelList.selectedIndex // native API doesn't know about &quot;hidden&quot; options, so this returns 1.<br />
modelList.getSelectedOptionIndex()&nbsp; // Spec Form API knows about &quot;hidden&quot; options, so this returns 4.</div></div><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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/316724669" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=356</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D356</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=356</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Project Image Resources Discussion</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092396/</link>
		<comments>http://www.insightsfour51.com/?p=338#comments</comments>
		<pubDate>Fri, 13 Jun 2008 14:59:46 +0000</pubDate>
		<dc:creator>Tech Guru</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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092396" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=338</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D338</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=338</feedburner:origLink></item>
		<item>
		<title>New Features of Release 8: Variable Spec Form</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092397/</link>
		<comments>http://www.insightsfour51.com/?p=328#comments</comments>
		<pubDate>Fri, 06 Jun 2008 14:44:29 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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><div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;table&gt;&lt;tr&gt;&lt;td&gt;Name:&lt;/td&gt;&lt;td&gt;&lt;input type=&quot;text&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092397" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=328</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D328</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=328</feedburner:origLink></item>
		<item>
		<title>Adv. Tech: Spec Form Validation (Custom Regular Expressions)</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092398/</link>
		<comments>http://www.insightsfour51.com/?p=308#comments</comments>
		<pubDate>Fri, 02 May 2008 14:31:07 +0000</pubDate>
		<dc:creator>Tech Guru</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><div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['Department'].regex({ <br />
&nbsp; &nbsp; &nbsp; &nbsp; action: &quot;onBlur&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; message: &quot;Minimum of 6 characters required&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }, &quot;(?=^.{6,100}$).*$&quot;);</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092398" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=308</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D308</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=308</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: More Spec Form Validation</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092399/</link>
		<comments>http://www.insightsfour51.com/?p=304#comments</comments>
		<pubDate>Fri, 25 Apr 2008 14:00:56 +0000</pubDate>
		<dc:creator>Tech Guru</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><div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['CustomFunction'].custom( <br />
&nbsp; &nbsp; &nbsp; &nbsp; function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var result = spec['CustomFunction'].value == 'The Suns';<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return result;<br />
&nbsp; &nbsp; &nbsp; &nbsp; },<br />
&nbsp; &nbsp; &nbsp; &nbsp; {action: 'onBlur', message: 'You must type (The Suns) because they are the best team in the NBA'}<br />
);</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092399" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=304</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D304</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=304</feedburner:origLink></item>
		<item>
		<title>Adv. Technology: Spec Form Validation Event Overrides</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092400/</link>
		<comments>http://www.insightsfour51.com/?p=297#comments</comments>
		<pubDate>Fri, 11 Apr 2008 15:12:35 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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><div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['Range'].range({<br />
&nbsp; &nbsp; &nbsp; &nbsp; action: 'onBlur', <br />
&nbsp; &nbsp; &nbsp; &nbsp; min: 5, <br />
&nbsp; &nbsp; &nbsp; &nbsp; max: 50,<br />
&nbsp; &nbsp; &nbsp; &nbsp; onSuccess: function() { alert('Your entry is accurate'); },<br />
&nbsp; &nbsp; &nbsp; &nbsp; onError: function() { alert('Your entry is not right, must be between 5 and 50'); }<br />
});</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092400" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=297</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D297</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=297</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: More Spec Form Validation</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092401/</link>
		<comments>http://www.insightsfour51.com/?p=293#comments</comments>
		<pubDate>Fri, 04 Apr 2008 14:09:50 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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 />
<div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['Quantity'].number({<br />
&nbsp; action: &quot;onBlur&quot;,<br />
&nbsp; message: &quot;Please enter a quantity before continuing…&quot;});</div></div><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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092401" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=293</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D293</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=293</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Spec Form Validation</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092402/</link>
		<comments>http://www.insightsfour51.com/?p=290#comments</comments>
		<pubDate>Fri, 28 Mar 2008 14:50:02 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092402" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=290</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D290</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=290</feedburner:origLink></item>
		<item>
		<title>Advanced Tech: Spec Form API Widget: Checkboxes</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092403/</link>
		<comments>http://www.insightsfour51.com/?p=285#comments</comments>
		<pubDate>Fri, 14 Mar 2008 14:25:55 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">[[CheckBox]]</div></div><br />
Advanced Script:<br />
<div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['CheckBox'].checkbox({<br />
&nbsp; &nbsp; &nbsp; &nbsp; checkedValue: 'I am checked',<br />
&nbsp; &nbsp; &nbsp; &nbsp; uncheckedValue: 'I am not checked',<br />
&nbsp; &nbsp; &nbsp; &nbsp; displayText: 'Check me to see my value'<br />
});<br />
<br />
spec['CheckBox'].checkbox.onClick = function() {<br />
alert(this.value());<br />
};</div></div><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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;span class=&quot;CheckBox&quot;&gt;[[CheckBoxClass]]&lt;/span&gt;</div></div></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: <div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">spec['CheckBox'].checkbox();</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092403" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=285</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D285</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=285</feedburner:origLink></item>
		<item>
		<title>Advanced Tech: Spec Form API Widget: Image Selector</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092418/</link>
		<comments>http://www.insightsfour51.com/?p=282#comments</comments>
		<pubDate>Fri, 07 Mar 2008 16:42:52 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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><div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">[[Image]]</div></div></p>
<p><strong>Advanced Script: </strong><br />
<div class="codecolorer-container text" style="height:360px;"><div class="codecolorer" style="font-family: monospace;">var path = &quot;/Themes/Custom/de891832-01b5-4c5d-84da-b4f85e394864/Demo/Jerseys/&quot;;<br />
spec['Image'].imageSelector({<br />
&nbsp; &nbsp; &nbsp; &nbsp; effect: 'fadeIn',<br />
&nbsp; &nbsp; &nbsp; &nbsp; bordercolor: &quot;red&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; width: 460, <br />
&nbsp; &nbsp; &nbsp; &nbsp; height: 200,<br />
&nbsp; &nbsp; &nbsp; &nbsp; thumbnailsize: 40, <br />
&nbsp; &nbsp; &nbsp; &nbsp; bgcolor: &quot;#fff&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; bordercolor: &quot;#000&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; highlightcolor: &quot;#ff0&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; rollovertext: &quot;Click this to choose jersey&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; images: [path + 'dalhome.jpg', <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'dalroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'dalthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'gbhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'gbroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'gbthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'indyhome.gif',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'indyroad.gif',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'indythrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'jaxhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'jaxroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'jaxthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'nehome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'neroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'nethrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'nyhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'nyroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'nythrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'pithome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'pitroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'pitthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'sdhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'sdroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'sdthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'seahome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'searoad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'seathrow.gif',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tbhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tbroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tbthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tenhome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tenroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'tenthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'washome.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'wasroad.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; path + 'wasthrow.jpg',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]});<br />
<br />
spec['Image'].imageSelector.onChange = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; alert('Thank you for choosing me!&nbsp; ' + this.image());<br />
&nbsp; &nbsp; &nbsp; &nbsp; return true;<br />
}</div></div></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:  <div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">{ effect: 'fadeIn', width: 460 }</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092418" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=282</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D282</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=282</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Spec Form API Update</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092419/</link>
		<comments>http://www.insightsfour51.com/?p=279#comments</comments>
		<pubDate>Fri, 29 Feb 2008 15:51:28 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092419" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=279</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D279</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=279</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Spending Account Solution</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092420/</link>
		<comments>http://www.insightsfour51.com/?p=274#comments</comments>
		<pubDate>Fri, 15 Feb 2008 19:30:45 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092420" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=274</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D274</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=274</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Variant Identifiers</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092434/</link>
		<comments>http://www.insightsfour51.com/?p=271#comments</comments>
		<pubDate>Fri, 08 Feb 2008 22:33:32 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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><div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">[[Code]] &lt;strong&gt;&lt;br /&gt;<br />
Team: &lt;/strong&gt;&lt;select id=&quot;teamlist&quot;&gt;<br />
&lt;option selected=&quot;&quot;&gt;&lt;/option&gt;<br />
&lt;/select&gt;[[Team]]&lt;br /&gt;<br />
&lt;strong&gt;&lt;br /&gt;<br />
Type: &lt;/strong&gt;&lt;select id=&quot;typelist&quot;&gt;<br />
&lt;option selected=&quot;&quot;&gt;&lt;/option&gt;<br />
&lt;/select&gt;[[Type]]</div></div></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><div class="codecolorer-container text" style="height:360px;"><div class="codecolorer" style="font-family: monospace;">spec['Code'].hide();<br />
spec['Team'].hide();<br />
spec['Type'].hide();<br />
<br />
var jerseys = <br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Dallas&quot;: 'dal',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Green Bay&quot;: 'gb',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Pittsburgh&quot;: 'pit'<br />
}<br />
<br />
var types = <br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Home&quot;: 'home',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Road&quot;: 'road',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;Special&quot;: 'throw'<br />
}<br />
<br />
var codes = <br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;: '',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;dalhome&quot;: 'DALHM-789',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;dalroad&quot;: 'DALRD-989',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;dalthrow&quot;: 'DALSP-189',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;gbhome&quot;: 'GBYHM-846',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;gbroad&quot;: 'GBYRD-946',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;gbthrow&quot;: 'GBYSP-146',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;pithome&quot;: 'PITHM-825',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;pitroad&quot;: 'PITRD-925',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;pitthrow&quot;: 'PITSP-125'<br />
}<br />
<br />
get('teamlist').addOptions(jerseys);<br />
get('typelist').addOptions(types);<br />
<br />
get('teamlist').onchange = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; spec['Code'].setText(setValue());<br />
&nbsp; &nbsp; &nbsp; &nbsp; spec['Team'].setText(this.value);<br />
}<br />
get('typelist').onchange = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; spec['Code'].setText(setValue());<br />
&nbsp; &nbsp; &nbsp; &nbsp; spec['Type'].setText(this.value);<br />
}<br />
<br />
function setValue() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; return codes[get('teamlist').value + get('typelist').value];<br />
}<br />
<br />
get('teamlist').selectOption(0);<br />
get('typelist').selectOption(0);</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092434" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=271</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D271</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=271</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Info on Advanced Scripting</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092435/</link>
		<comments>http://www.insightsfour51.com/?p=264#comments</comments>
		<pubDate>Fri, 25 Jan 2008 19:46:38 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092435" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=264</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D264</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=264</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: Pageflex Language Support Explained</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092436/</link>
		<comments>http://www.insightsfour51.com/?p=260#comments</comments>
		<pubDate>Wed, 16 Jan 2008 15:01:00 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092436" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=260</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D260</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=260</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: The Time Selection Control</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092437/</link>
		<comments>http://www.insightsfour51.com/?p=258#comments</comments>
		<pubDate>Fri, 11 Jan 2008 16:19:35 +0000</pubDate>
		<dc:creator>Tech Guru</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><div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;span class=&quot;Time&quot;&gt;[[Time]]&lt;/span&gt;</div></div></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: <div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">[[Time]]</div></div></p>
<p>Advanced Script: <div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">spec['Time'].time({increment: 15});</div></div></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>
<img src="http://feeds.feedburner.com/~r/four51_advanced_tech/~4/314092437" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.insightsfour51.com/?feed=rss2&amp;p=258</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=four51_advanced_tech&amp;itemurl=http%3A%2F%2Fwww.insightsfour51.com%2F%3Fp%3D258</feedburner:awareness><feedburner:origLink>http://www.insightsfour51.com/?p=258</feedburner:origLink></item>
		<item>
		<title>Advanced Technology: The Calendar Control</title>
		<link>http://feeds.feedburner.com/~r/four51_advanced_tech/~3/314092438/</link>
		<comments>http://www.insightsfour51.com/?p=249#comments</comments>
		<pubDate>Fri, 14 Dec 2007 16:35:43 +0000</pubDate>
		<dc:creator>Tech Guru</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 [...]]]></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 />
<div class="codecolorer-container text" style="height:45px;"><div class="codecolorer" style="font-family: monospace;">&lt;strong&gt;Date:&lt;/strong&gt;&amp;nbsp; [[Calendar]][[HiddenDate]]&lt;br /&gt;</div></div></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 />
<div class="codecolorer-container text"><div class="codecolorer" style="font-family: monospace;">spec['Calendar'].calendar();<br />
<br />
specForm.calendar.onChange = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; var now = new Date();<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (specForm.calendar.FullDate() &lt; now) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alert('You must select a date in the future.');<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spec['HiddenDate'].setText('');<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; else {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spec['HiddenDate'].setText(specForm.calendar.DayOfWeek());<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}</div></div></p>
<p>This example is doing two things.  First, we want to be sure