<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software and Small Business</title>
	<atom:link href="http://blog.calendarscripts.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.calendarscripts.info</link>
	<description>Software Reviews, Tips, And Info From CalendarScripts</description>
	<lastBuildDate>Wed, 09 May 2012 19:30:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Watu PRO Version 1.1</title>
		<link>http://blog.calendarscripts.info/watu-pro-version-1-1/</link>
		<comments>http://blog.calendarscripts.info/watu-pro-version-1-1/#comments</comments>
		<pubDate>Wed, 09 May 2012 19:30:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=273</guid>
		<description><![CDATA[Of course we listed to feedback and I hear you. So here&#8217;s the first upgrade to WatuPRO: 1. The questions are now numbered and you&#8217;ll see &#8220;Question 2 of 15&#8243; etc so you know better how much is left to take the exam. 2. You can configure what to display when every exam is taken [...]]]></description>
			<content:encoded><![CDATA[<p>Of course we listed to feedback and I hear you. So here&#8217;s the first upgrade to <a href="http://calendarscripts.info/watupro" target="_blank">WatuPRO</a>:</p>
<p>1. The questions are now numbered and you&#8217;ll see &#8220;Question 2 of 15&#8243; etc so you know better how much is left to take the exam.</p>
<p>2. You can configure what to display when every exam is taken &#8211; the result text only or to include the questions along with the answers and marks for correct/incorrect one.</p>
<p>3. Logged in users can continue taking the exam even if closing the browser, on another day, or even year. This feature is disabled for time-limited exams to avoid cheating.</p>
<p>Old customers bought WatuPRO this year are eligible for free upgrade. Please just mail me and let me know to send you the zip. Please <a href="http://calendarscripts.info/forum/discussion/32/how-to-upgrade-watu-pro">do read this</a> before upgrading.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/watu-pro-version-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 Smart PHP-Generated Drop Down Menus (Tutorial)</title>
		<link>http://blog.calendarscripts.info/3-smart-php-generated-drop-down-menus-tutorial/</link>
		<comments>http://blog.calendarscripts.info/3-smart-php-generated-drop-down-menus-tutorial/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 14:45:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=256</guid>
		<description><![CDATA[In our software we often use drop-down menus. To make things easier I have coded functions for the most commonly used ones &#8211; date drop down, drop down to list database entries, and drop down to be populated from simple non numerated PHP array. All these drop downs are for example used in our autoresponder [...]]]></description>
			<content:encoded><![CDATA[<p>In our software we often use drop-down menus. To make things easier I have coded functions for the most commonly used ones &#8211; date drop down, drop down to list database entries, and drop down to be populated from simple non numerated PHP array. All these drop downs are for example used in our <a href="http://calendarscripts.info/php-auto-responder.html" target="_blank">autoresponder software</a>. They just generate HTML code which is then output in your HTML forms.</p>
<p>Just recently I decided to encapsulate them in a class and share with the community. So if you are lazy to read, go right to the code at <a href="http://www.phpclasses.org/package/7445-PHP-Generate-form-select-inputs-from-dates-or-arrays.html" target="_blank">PHP Classes</a>. The class is called <strong>QuickDD</strong>.</p>
<p>For the more curious people who want to learn, here is this tutorial explaining the stuff.</p>
<h2>The Class</h2>
<p>Using class isn&#8217;t that important in our case because there is almost no shared data between the 3 drop down generating functions (except the errors array). But we&#8217;ll create a class so we can keep it encapsulated at least:<br />
<code>
<pre>class QuickDD
{
    // this variable will be filled with errors.
    // You can print it out with print_r so you can see errors
    public static $errors=array();

    // used by the date drop down. Feel free to change start/end year
    public static $start_year=1900;
    public static $end_year=2100;</pre>
</pre>
<p></code></p>
<p>You can very well just use three procedural functions. But from now on, let&#8217;s stick with the OO example.</p>
<h2>The Date Drop-Down</h2>
<p>This is the most complex one. I know there are many cool scripts like <a href="http://docs.jquery.com/Plugins/Calendar" target="_blank">jQuery calendar</a> but sometimes they are a bit painful to work with. Simple drop-down date selection is easy to understand, works in all browser, and takes no javascript to implement. So, let&#8217;s build one: </p>
<p><code>
<pre>
    // Outputs date drop down for selecting month, day, year
    // Arguments:
    // @param $name - string, the base name of the "select" form tag.
    // Quick DD will add suffix to each of the 3 tags:
    // "year" for year, "month" for month, and "day" for day
    // @param $date - string in MySQL format, optional pre-selected date
    // @param $format - string in the type YYYY-MM-DD showing how to output the
    // drop-downs. If $format has anything insane (like 5 Y or single-digit month)
    // we'll quietly switch to something sane instead of raising exception.
    // but we may log an error
    // @param $markup - if presented it should contain any markups that will be added
    // to each dropdown, in the same order that the parts are displayed.
</pre>
<p></code></p>
<p>And the function starts this way:<br />
<code>
<pre>static function date($name, $date=NULL, $format=NULL, $markup=NULL)
    {</pre>
<p></code></p>
<p>It&#8217;s static because we wan to call it anywhere without creating object. When you just want to encapsulate methods in a class for organization reasons, and there is no class instance data, it&#8217;s better to use static methods.</p>
<p>At the beginning of the function we want to make sure the params passed are so-so sane:</p>
<p><code>
<pre>
        // normalize params
        if(empty($date) or !preg_match("/\d\d\d\d\-\d\d-\d\d/",$date)) $date=date("Y-m-d");
        if(empty($format)) $format="YYYY-MM-DD";
        if(empty($markup)) $markup=array();
</pre>
<p></code></p>
<p>Now let&#8217;s explode the optionally passed pre-selected date, and start to buffer the output of the method:</p>
<p><code>
<pre>
$parts=explode("-",$date);
$html="";

// read the format
$format_parts=explode("-",$format);
</pre>
<p></code></p>
<p>And in $format_parts now we have the format as requested when calling the method. Now the most important part starts:</p>
<p><code>
<pre>
        // let's output
        foreach($format_parts as $cnt=>$f)
        {
            if(preg_match("/[^YMD]/",$f))
            {
                self::$errors[]="Unrecognized format part: '$f'. Skipped.";
                continue;
            }
</pre>
<p></code></p>
<p>As you see we go through each parts of the format string and check whether it contains anything else than the allowed symbols Y, M, and D. If yes, we add to errors array and skip that part. Errors array can be output with print_r when you use the method to see whether there are errors (this will become more clear in the usage example that will come after the code.</p>
<p>Now let&#8217;s add the year drop-down:<br />
<code>
<pre>
            // year
            if(strstr($f,"Y"))
            {
                $extra_html="";
                if(isset($markup[$cnt]) and !empty($markup[$cnt])) $extra_html=" ".$markup[$cnt];
                $html.=" &lt;select name=\"".$name."year\"".$extra_html."&gt;\n";

                for($i=self::$start_year;$i<=self::$end_year;$i++)
                {
                    $selected="";
                    if(!empty($parts[0]) and $parts[0]==$i) $selected=" selected";

                    $val=$i;
                    // in case only two digits are passed we have to strip $val for displaying
                    // it's either 4 or 2, everything else is ignored
                    if(strlen($f)<=2) $val=substr($val,2);        

                    $html.="&lt;option value='$i'".$selected."&gt;$val&lt;/option&gt;\n";
                }

                $html.="&lt;/select&gt;";
            }
</pre>
<p></code></p>
<p>Few things to note: $extra_html is populated by the element of the $markup argument which corresponds to the position of where YYYY (or YY) is in the format. So if you pass format like "DD-MM-YY" the third element of the array argument $markup will be used. If empty, nothing is used.</p>
<p>Then see how we prepend "year" to the $name argument to create the name of the drop-down. So each drop-down has its own name. For example if you call the method with $name equal to "date" your 3 drop downs will have names "dateyear", "datemonth", and "dateday" and can be accessed in $_POST or $_GET with these names.</p>
<p>Next we go through start and end year in a loop and output the option tags. In case $date argument is passed, the $parts value will contain year in $parts[0] (Because $date argument should always be passed in the MySQL YYYY-MM-DD format). So we check if such value is passed and when it matches $i we set the var $selected so the option tag can have selected attribute.</p>
<p>Finally see how we check if the format should be YYYY or YY and substring the output to meet that.</p>
<p>Then comes month drop down which is nearly the same:</p>
<p><code>
<pre>
            // month
            if(strstr($f,&quot;M&quot;))
            {
                $extra_html=&quot;&quot;;
                if(isset($markup[$cnt]) and !empty($markup[$cnt])) $extra_html=&quot; &quot;.$markup[$cnt];
                $html.=&quot; &lt;select name=\&quot;&quot;.$name.&quot;month\&quot;&quot;.$extra_html.&quot;&gt;\n&quot;;

                for($i=1;$i&lt;=12;$i++)
                {
                    $selected=&quot;&quot;;
                    if(!empty($parts[1]) and intval($parts[1])==$i) $selected=&quot; selected&quot;;

                    $val=sprintf(&quot;%02d&quot;,$i);

                    $html.=&quot;&lt;option value=&#39;$val&#39;&quot;.$selected.&quot;&gt;$val&lt;/option&gt;\n&quot;;
                }

                $html.=&quot;&lt;/select&gt;&quot;;
            }
</pre>
<p></code></p>
<p>The thing to notice here is the usage of sprintf which makes sure leading zero is always shown.</p>
<p>And now, day:</p>
<p><code>
<pre>
          // day - we simply display 1-31 here, no extra intelligence depending on month
            if(strstr($f,&quot;D&quot;))
            {
                $extra_html=&quot;&quot;;
                if(isset($markup[$cnt]) and !empty($markup[$cnt])) $extra_html=&quot; &quot;.$markup[$cnt];
                $html.=&quot; &lt;select name=\&quot;&quot;.$name.&quot;day\&quot;&quot;.$extra_html.&quot;&gt;\n&quot;;

                for($i=1;$i&lt;=31;$i++)
                {
                    $selected=&quot;&quot;;
                    if(!empty($parts[2]) and intval($parts[2])==$i) $selected=&quot; selected&quot;;

                    if(strlen($f)&gt;1) $val=sprintf(&quot;%02d&quot;,$i);
                    else $val=$i;

                    $html.=&quot;&lt;option value=&#39;$val&#39;&quot;.$selected.&quot;&gt;$val&lt;/option&gt;\n&quot;;
                }

                $html.=&quot;&lt;/select&gt;&quot;;
            }
</pre>
<p></code></p>
<p>Hopefully you noticed how looping through format parts first let's us position the dropdown in the same order as given in the $format parameter.</p>
<p>So essentially that's it, we can now output the $html:</p>
<p><code>
<pre>
       // that's it, return dropdowns:
        return $html;
    }
</pre>
<p></code></p>
<p>Again, the full source code is available at PHP Classes so you can see it there as a whole.</p>
<h2>Using the Date Drop Down:</h2>
<p>Here is how to call this now:</p>
<p><code>
<pre>
    QuickDD::$start_year=2009;
    QuickDD::$end_year=date("Y")+10;

    // see how we pass the base name for the dropdowns, values, and markup array which will
    // set DOM ID, CSS class, and Javascript callback to every drop-down.
    // Of course all this is optional
    echo QuickDD::date("final", "2012-12-21", "DD-MM-YYYY", array(" id='selectDay' class='some_class' onchange='doSomething(this.value);' "," id='selectMonth' class='some_class' onchange='doSomething(this.value);' ", " id='selectYear' class='some_class' onchange='doSomething(this.value);' "));    

    if(!empty(QuickDD::$errors)) print_r(QuickDD::$errors);
</pre>
<p></code></p>
<p>This way you can add all kind of javascript and CSS markup, pre-selected values etc. But of course it can be called also in much simpler way using the defaults:</p>
<p><code>
<pre>
QuickDD::date("date");
</pre>
<p></code></p>
<p>Really simple.</p>
<h2>Drop-down With Associative Arrays</h2>
<p>These are very often used in DB driven apps. In our example we'll have a simple DB table with students where each student has an ID, email, and name. And we want to display a drop down menu to display a student. Visually the student name will be shown, but the value attribute will show the student ID so we can process it further in the app.</p>
<p>Here's the beginning:</p>
<p><code>
<pre>
// Outputs drop-down populated from associative array (usually coming from database)
    // @param $rows - the associative array
    // @param $value_field - the name of the key from the array whose value will be placed into
    // the option tag "value" attribue
    // @param $display_field - the name of the array key that will be used for display text
    // @param $sel - optionally a pre-selected value (for example when editing DB record)
    public static function hash($rows, $value_field, $display_field, $sel=NULL)
    {
</pre>
<p></code></p>
<p>Now the main function code is just few lines:</p>
<p><code>
<pre>
$html=&quot;&quot;;
        foreach($rows as $cnt=&gt;$row)
        {
            if(is_array($sel))
            {
                // multiple-select drop-down
                if(@in_array($row[$value_field],$sel)) $selected=&#39; selected&#39;;
                else $selected=&#39;&#39;;
            }
            else
            {
                // single-select drop-down
                if($sel==$row[$value_field]) $selected=&#39; selected&#39;;
                else $selected=&#39;&#39;;
            }
            $html.=&quot;&lt;option value=\&quot;$row[$value_field]\&quot;&quot;.$selected.&quot;&gt;$row[$display_field]&lt;/option&gt;\n&quot;;
        }
        return $html;</pre>
<p></code></p>
<p>What we do here:<br />
1. We start with $html buffer<br />
2. Then loop through the DB records<br />
3. Check if pre-selected value is passed, whether it's array of values (useful in multiselect drop downs), and check if it matches the current row.<br />
4. Output the display field and value fields appropriately.</p>
<p>That's it. And here's how to use this method:</p>
<p><code>
<pre>
&lt;select name=&quot;student_id&quot;&gt;
    &lt;option value=&quot;&quot;&gt;- Please select -&lt;/option&gt;
    &lt;?php echo QuickDD::hash($students, &quot;id&quot;, &quot;name&quot;, 2);?&gt;
    &lt;/select&gt;
</pre>
<p></code></p>
<h2>Drop-down With Simple Arrays</h2>
<p>Simple arrays means ones that are not associative although you can use associative too. The function will not look for keys though, it will work only with values. So it's good for list of colors (like in this example), numbers, names, currencies etc. The function accepts one array for displays, and one for value attributes of option tags. But more often you'd probably call it with the same array in both places so what you see is what you get as option value. Here's the function, then the example will help you understand better:</p>
<p><code>
<pre>
 // outputs dropdowns using simple arrays for value attribute and for display
    // @param $values - the array of values that goes to &quot;value&quot; attribute
    // @param $displays - the array of texts that will be displayed in the options
    // @param $sel - pre-selected value
    public static function arrays($values, $displays, $sel=NULL)
    {
        $html=&quot;&quot;;
        foreach($values as $cnt=&gt;$value)
        {
            if(is_array($sel))
            {
                // for multiple-select drop-down
                if(in_array($value,$sel)) $selected=&#39; selected&#39;;
                else $selected=&#39;&#39;;
            }
            else
            {
                // single-select drop-down
                if($sel==$value) $selected=&#39; selected&#39;;
                else $selected=&#39;&#39;;
            }
            $html.=&quot;&lt;option value=\&quot;$value\&quot;&quot;.$selected.&quot;&gt;$displays[$cnt]&lt;/option&gt;\n&quot;;
        }

        return $html;
    }
</pre>
<p></code></p>
<p>It's very similar to the previous one. But instead of getting values by keys, we browse through each array.</p>
<p>Here's example usage with colors:</p>
<p><code>
<pre>
&lt;p&gt;Select color: &lt;?php
    // here&#39;s the color array
    $colors=array(&quot;black&quot;,&quot;white&quot;,&quot;blue&quot;,&quot;green&quot;,&quot;red&quot;,&quot;orange&quot;,&quot;yellow&quot;);
    ?&gt;
    &lt;select name=&quot;color&quot;&gt;
    &lt;option value=&quot;&quot;&gt;- Please select -&lt;/option&gt;
    &lt;?php echo QuickDD::arrays($colors, $colors);?&gt;
    &lt;/select&gt;&lt;/p&gt;
</pre>
<p></code></p>
<p>That's it. You can improve the class by adding more error checking and some friendlier way to display the errors (for example in HTML comments).</p>
<p>Do you have ideas for other often used drop-downs that can be added to the class?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/3-smart-php-generated-drop-down-menus-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autoresponder updates: Basic 2.9 and PRO 1.1</title>
		<link>http://blog.calendarscripts.info/autoresponder-updates-basic-2-9-and-pro-1-1/</link>
		<comments>http://blog.calendarscripts.info/autoresponder-updates-basic-2-9-and-pro-1-1/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 15:23:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=251</guid>
		<description><![CDATA[Here are the latest BroadFast Autoresponder updates: Basic Autoresponder, version 2.9: Improved &#8220;read&#8221; tracking. I added bgsound tag for better tracking of who read your emails (this works only when switched on by yourself). These stats can never be 100% reliable because some email services don&#8217;t show the tag, but now the correct percentage should [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the latest <a href="http://calendarscripts.info/php-auto-responder.html" target="_blank">BroadFast Autoresponder</a> updates:</p>
<p>Basic Autoresponder, version 2.9:</p>
<ul>
<li>Improved &#8220;read&#8221; tracking. I added bgsound tag for better tracking of who read your emails (this works only when switched on by yourself). These stats can never be 100% reliable because some email services don&#8217;t show the tag, but now the correct percentage should be higher.</li>
<li>External signup script that you can place anywhere and hide the registration. More info in <a href="http://calendarscripts.info/forum/discussion/30/using-the-external-signup-script#Item_1" target="_blank">this pictorial</a>.</li>
</ul>
<p>PRO Autoresponder, version 1.1:</p>
<p>In addition to the same new features as in Basic, we have added <strong>segmentation</strong>. It allows you to target segments of any of your mailing list, thus improve results and at the same time sending lower number of emails. <a href="http://calendarscripts.info/forum/discussion/31/sending-emails-to-a-segment-of-your-visitors#Item_1" target="_blank">This pictorial</a> will  explain  the filters and segmentation in greater details.</p>
<p>Upgrade terms for existing customers are as usual &#8211; free upgrades if you have bought less than 1 year ago, and 50% discount otherwise.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/autoresponder-updates-basic-2-9-and-pro-1-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Improved Grocery List on Pyrostia</title>
		<link>http://blog.calendarscripts.info/improved-grocery-list-on-pyrostia/</link>
		<comments>http://blog.calendarscripts.info/improved-grocery-list-on-pyrostia/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 17:27:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=248</guid>
		<description><![CDATA[Our free weekly menu planner now has improved automated grocery list. You can mark various items as bought and know what you really need to buy for the week. The source code will be released soon so you&#8217;ll be able to host Pyrostia on your site as well.]]></description>
			<content:encoded><![CDATA[<p>Our free <a href="http://calendarscripts.info/pyrostia/" target="_blank">weekly menu planner</a> now has improved automated grocery list. You can mark various items as bought and know what you really need to buy for the week.</p>
<p>The source code will be released soon so you&#8217;ll be able to host Pyrostia on your site as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/improved-grocery-list-on-pyrostia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WatuPRO WordPress Plugin To Create Exams</title>
		<link>http://blog.calendarscripts.info/watupro-wordpress-plugin-to-create-exams/</link>
		<comments>http://blog.calendarscripts.info/watupro-wordpress-plugin-to-create-exams/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 16:28:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=245</guid>
		<description><![CDATA[A lot of people expressed interest to have our web based exam software as a wordpress plugin. So, here we go, the premium WordPress plugin for creating and managing exams is online &#8211; WatuPRO WordPress Plugin. While the WordPress plugin is similar in functionality to the standalone PHP based Watu Exam/Watu Plus, it also have [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people expressed interest to have our <a href="http://calendarscripts.info/online-exam-software.html" target="_blank">web based exam software</a> as a wordpress plugin. So, here we go, the premium WordPress plugin for creating and managing exams is online &#8211; <a href="http://calendarscripts.info/watupro/" target="_blank">WatuPRO WordPress Plugin</a>.</p>
<p>While the WordPress plugin is similar in functionality to the standalone PHP based Watu Exam/Watu Plus, it also have some extra features and cleaner user interface. The best thing in it is that you can install it and manage it entirely from your WordPress admin panel.</p>
<p><a href="http://calendarscripts.info/watupro/" target="_blank">Have a look at WatuPRO</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/watupro-wordpress-plugin-to-create-exams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WatuPRO Demo Exam 2</title>
		<link>http://blog.calendarscripts.info/watupro-demo-exam-2/</link>
		<comments>http://blog.calendarscripts.info/watupro-demo-exam-2/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 16:23:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=239</guid>
		<description><![CDATA[This is a demo of WatuPRO. This exam reuqires registration to be completed. While the questions/answers are the same as in &#8220;Open exam&#8221;, they will be displayed all, each time, so the maximum point number is 15. On top of that you have only 3 minutes to complete it &#8211; it&#8217;s exam with a timer. [...]]]></description>
			<content:encoded><![CDATA[<p>This is a demo of <a href="http://calendarscripts.info/watupro/" target="_blank">WatuPRO</a>.</p>
<p>This exam reuqires registration to be completed. While the questions/answers are the same as in &#8220;Open exam&#8221;, they will be displayed all, each time, so the maximum point number is 15. On top of that you have only 3 minutes to complete it &#8211; it&#8217;s exam with a timer. Questions and answers are randomized each time. Once logged in, you can take the quiz many times. This is also configurable, as the admin may decide to disallow second taking of the same exam.</p>
<p>Upon completion and receiving &#8220;Passed&#8221; grade (if you receive at least 8 points), you will be able to print customized &#8220;certificate&#8221;. It&#8217;s a simple one here, but you can use as complex and rich HTML as you wish.</p>
<div style="border: 1pt solid black; padding: 5px; background: #EEE;"><p><b>You need to be registered and logged in to take this exam. 
        <a href='http://blog.calendarscripts.info/wp-login.php?redirect_to=http://blog.calendarscripts.info/watupro-demo-exam-2/'>Log in</a> or <a href='http://blog.calendarscripts.info/wp-login.php?watupro_register=1&action=register'>Register</a></b></p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/watupro-demo-exam-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WatuPRO Demo Exam</title>
		<link>http://blog.calendarscripts.info/watupro-demo-exam/</link>
		<comments>http://blog.calendarscripts.info/watupro-demo-exam/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 16:22:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=234</guid>
		<description><![CDATA[This is a demo of WatuPRO. This demo exam is open for everyone, no registration required. Three random questions are pulled each time, out of a pool of 5 questions.]]></description>
			<content:encoded><![CDATA[<p>This is a demo of <a href="http://calendarscripts.info/watupro/" target="_blank">WatuPRO</a>.</p>
<p>This demo exam is open for everyone, no registration required. Three random questions are pulled each time, out of a pool of 5 questions.</p>
		<link type="text/css" rel="stylesheet" href="http://blog.calendarscripts.info/wp-content/plugins/watupro/style.css" />
		<script type="text/javascript" src="http://blog.calendarscripts.info/wp-includes/js/jquery/jquery.js"></script>
		<script type="text/javascript" src="http://blog.calendarscripts.info/wp-content/plugins/watupro/script.js"></script>
		    
        
    <div  id="watupro_quiz" class="quiz-area ">
    <form action="" method="post" class="quiz-form" id="quiz-4">
    <div class='watu-question' id='question-1'><div class='question-content'><p>1. Select all that are correct:</p>
</div><br /><input type='hidden' name='question_id[]' id='qID_1' value='5' /><input type='checkbox' name='answer-5[]' id='answer-id-37' class='answer answer-  answerof-5' value='37' />&nbsp;<label for='answer-id-37' id='answer-label-37' class=' answer label-'><span>There is one year of free support and upgrades when buying WatuPRO</span></label><br /><input type='checkbox' name='answer-5[]' id='answer-id-35' class='answer answer-  answerof-5' value='35' />&nbsp;<label for='answer-id-35' id='answer-label-35' class=' answer label-'><span>Wordpress is used for blogging and more</span></label><br /><input type='checkbox' name='answer-5[]' id='answer-id-34' class='answer answer-  answerof-5' value='34' />&nbsp;<label for='answer-id-34' id='answer-label-34' class=' answer label-'><span>WatuPRO is a Wordpress plugin</span></label><br /><input type='checkbox' name='answer-5[]' id='answer-id-36' class='answer answer-  answerof-5' value='36' />&nbsp;<label for='answer-id-36' id='answer-label-36' class=' answer label-'><span>You need high-tech knowledge to install Wordpress and WatuPRO</span></label><br /><input type='checkbox' name='answer-5[]' id='answer-id-38' class='answer answer-  answerof-5' value='38' />&nbsp;<label for='answer-id-38' id='answer-label-38' class=' answer label-'><span>If you want to run exams and quizzes, you need to hire expensive programmer to code the tool for you</span></label><br /><p><i>(Question 1 of 3)</i></p></div><div class='watu-question' id='question-2'><div class='question-content'><p>2. A picture based question. Yes, you can upload pictures without any issues. What's this:</p>
<p><a title="Red-eyed Treefrog, Agalychnis callidryas by Bill Bouton, on Flickr" href="http://www.flickr.com/photos/billbouton/6852318065/"><img src="http://farm8.staticflickr.com/7032/6852318065_14f360dd27.jpg" alt="Red-eyed Treefrog, Agalychnis callidryas" width="500" height="375" /></a></p>
<p>&nbsp;</p>
<p>(I used Flickr embed code here but you can also upload local photos)</p>
</div><br /><input type='hidden' name='question_id[]' id='qID_2' value='4' /><input type='radio' name='answer-4[]' id='answer-id-39' class='answer answer-  answerof-4' value='39' />&nbsp;<label for='answer-id-39' id='answer-label-39' class=' answer label-'><span>A snake </span></label><br /><input type='radio' name='answer-4[]' id='answer-id-41' class='answer answer-  answerof-4' value='41' />&nbsp;<label for='answer-id-41' id='answer-label-41' class=' answer label-'><span>No idea!</span></label><br /><input type='radio' name='answer-4[]' id='answer-id-40' class='answer answer-  answerof-4' value='40' />&nbsp;<label for='answer-id-40' id='answer-label-40' class=' answer label-'><span>A frog </span></label><br /><p><i>(Question 2 of 3)</i></p></div><div class='watu-question' id='question-3'><div class='question-content'><p>3. "Essay" (open end) question: these questions let the user simply write the answer. You may use them for manual evaluation of their skills, or to obtain some feedback as survey. But, you can also assign correct/incorrect answer. WatuPRO will check for match (not case sensitive) and if the answer matches one of your answers, the corresponding points will be assigned.</p>
<p>For example, consider the following question:</p>
<p><strong>Which country in the world has highest population?</strong></p>
<p>(This is an open end question, but if you type "China" in this test exam you will receive 3 points. In other cases you will receive no points. But you can decide to assing negative number of points to some very wrong answers like "Luxemburg" for example).</p>
</div><br /><input type='hidden' name='question_id[]' id='qID_3' value='3' /><p><textarea name='answer-3[]' id='textarea_q_3' rows='3' cols='40'></textarea></p><p><i>(Question 3 of 3)</i></p></div><div style='display:none' id='question-4'><br /><div class='question-content'><img src="http://blog.calendarscripts.info/wp-content/plugins/watupro/loading.gif" width="16" height="16" alt="Loading ..." title="Loading ..." />&nbsp;Loading ...</div><br /></div><br />
        <input type="button" id="next-question" value="Next &gt;"  /><br />
        
    <input type="button" name="action" onclick="submitResult()" id="action-button" value="Show Results"  />
    <input type="hidden" name="quiz_id" value="4" />
    <input type="hidden" name="start_time" id="startTime" value="">
    <input type="hidden" name="question_ids" value="5,4,3">
    </form>
    </div>
    <script type="text/javascript">
    var question_ids = "5,4,3";
    var exam_id = 4;
    var qArr = question_ids.split(',');
    var url = "http://blog.calendarscripts.info/wp-content/plugins/watupro/show_exam.php";
    var siteURL="http://blog.calendarscripts.info";    </script>
    
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/watupro-demo-exam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Watu Plus 1.2</title>
		<link>http://blog.calendarscripts.info/watu-plus-1-2/</link>
		<comments>http://blog.calendarscripts.info/watu-plus-1-2/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 16:21:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=230</guid>
		<description><![CDATA[What&#8217;s new in Watu Plus 1.2: Select random questions from a pool. This feature allows you to create many questions in one exam and then have each student see only a small number of them, randomly selected and server. Makes the exam unique for every sitting. Import/Export students in user groups as CSV file. This [...]]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s new in <a href="http://calendarscripts.info/online-exam-software.html" target="_blank">Watu Plus 1.2</a>:</p>
<ul>
<li><strong>Select random questions from a pool. </strong>This feature allows you to create many questions in one exam and then have each student see only a small number of them, randomly selected and server. Makes the exam unique for every sitting.</li>
<li><strong>Import/Export students in user groups as CSV file. </strong>This will make your life easier if you want to mass edit student records in Excel or to import users from existing database.</li>
</ul>
<p>As usual old customers can purchase upgrade with 50% discount, and upgrades are free if you have purchased Watu Plus less than one year ago.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/watu-plus-1-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Period and Fertility Calendar</title>
		<link>http://blog.calendarscripts.info/period-and-fertility-calendar/</link>
		<comments>http://blog.calendarscripts.info/period-and-fertility-calendar/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 16:57:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=227</guid>
		<description><![CDATA[This is our latest free application for women &#8211; period and fertility calendar. Here is what it does: Figure out your most fertile dates Find out expected due date See the approximate date of your next period Store history of your periods so you never forget them and be prepared on time Some technical background [...]]]></description>
			<content:encoded><![CDATA[<p>This is our latest free application for women &#8211; <a href="http://calendarscripts.info/free/period-calendar/">period and fertility calendar</a>. Here is what it does:</p>
<ul>
<li>Figure out your most fertile dates</li>
<li>Find out expected due date</li>
<li>See the approximate date of your next period</li>
<li>Store history of your periods so you never forget them and be prepared on time</li>
</ul>
<p>Some technical background (because many developers read this blog):</p>
<p>It&#8217;s HTML 5 Ajax app with localStorage support. I&#8217;m not yet ready with the pluggable open source version, but you can see the front-end javacsript with View Source.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/period-and-fertility-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contact Us Pages That Work: How To Get The Most Of Yours</title>
		<link>http://blog.calendarscripts.info/contact-us-pages-that-work/</link>
		<comments>http://blog.calendarscripts.info/contact-us-pages-that-work/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 16:40:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=212</guid>
		<description><![CDATA[There are several elements that make contact pages work. Of course you&#8217;d rarely have all them combined into your contact page. Some contact pages contain only one of these elements while other implement more. See them and figure out which will work best for you. Contact Info + Address And Map These contact pages usually [...]]]></description>
			<content:encoded><![CDATA[<p>There are several elements that make contact pages work. Of course you&#8217;d rarely have all them combined into your contact page. Some contact pages contain only one of these elements while other implement more. See them and figure out which will work best for you.</p>
<h2>Contact Info + Address And Map</h2>
<p><img class="aligncenter size-full wp-image-217" title="phd-consulting" src="http://blog.calendarscripts.info/wp-content/uploads/2011/12/phd-consulting.jpg" alt="Screenshot of PHD Consulting" width="500" height="418" /></p>
<p>These contact pages usually contain your picture, a link to social profiles, street address and a map. It&#8217;s a good way to build a contact us page if you are willing to share your location. It shows you are a real person or company, and builds trust.</p>
<p><a href="http://www.phdconsulting.biz/contact.asp" target="_blank">Here is this example</a> with only the person&#8217;s picture missing.</p>
<h2>Impressive Design</h2>
<p>Design might not be the first you think about when building your contact form. Too bad! It&#8217;s one of the most important pages on your site. A &#8220;contact us&#8221; page that looks amazing does few amazing things:</p>
<ul>
<li>Keeps the visitor on the page. So they hopefully will really fill that great looking form rather than closing it!</li>
<li>Builds trust (again). If your contact form looks great perhaps you are offering great services or products too</li>
<li>Goes viral. There&#8217;s no need to give you  links to posts that link to amazing contact forms. In fact, this is a such post too. <a href="http://www.berttimmermans.com/contact/" target="_blank">Here is one amazing contact form</a>. And below is another:</li>
</ul>
<div><a href="http://www.indofolio.com/"><img class="aligncenter size-full wp-image-218" title="indofolio" src="http://blog.calendarscripts.info/wp-content/uploads/2011/12/indofolio.jpg" alt="Indofolio screenshot" width="500" height="376" /></a></div>
<p>&nbsp;</p>
<h2>Headset Hottie</h2>
<p align="center"><a title="EARTHQUAKE Office!!! by techfun, on Flickr" href="http://www.flickr.com/photos/techfun/2409600175/"><img src="http://farm3.staticflickr.com/2112/2409600175_12b03b4aaa.jpg" alt="EARTHQUAKE Office!!!" width="500" height="400" /></a></p>
<p>There is no joke. A &#8220;headset hottie&#8221; can draw some attention and give the feeling there will be someone to answer. People know they are fake but they still like them. There is even a whole site dedicated to <a href="http://www.headsethotties.com/" target="_blank">headset hotties</a>.</p>
<p>It&#8217;s better however if you put your own picture or a picture of your real staff (if you have any).</p>
<h2>More Than One Contact Method</h2>
<p>Please don&#8217;t leave us hanging on a contact form or email only. You must have at least one social network profile where I can reach you. Twitter, Skype, and/or phone number are also highly positive. The more options you give to connect, the more likely your visitors are to do it.</p>
<h2>Call To Action</h2>
<p>The reason you build a contact page is that <strong>you want people to contact you</strong>. You know how bigger are your chances to make business with someone who already contacted you than with a stranger.</p>
<p>So, make it clear where the contact form is (you do have a contact form, right?) and make that button big and appealing. Make people crave to click it so badly that they won&#8217;t get bored by the rest of the fields they have to fill.</p>
<h2>Contact Form Autoresponder</h2>
<p><a href="http://calendarscripts.info/php-auto-responder.html"><img class="aligncenter size-full wp-image-220" title="bftpro" src="http://blog.calendarscripts.info/wp-content/uploads/2011/12/bftpro.jpg" alt="BFT Pro Screenshot" width="500" height="380" /></a></p>
<p>I&#8217;m not talking about the &#8220;thanks for contacting us&#8221; auto-reply. Sometimes it&#8217;s useful to confirm that the message has been delivered and to keep your address in the prospect&#8217;s mailbox. Don&#8217;t rely too much on this  however as people barely check their read mail again. It&#8217;s a lot more important to reply to their inquiry.</p>
<p>But why not go further than this? You could also subscribe everyone who contacts you to a mailing list or autoresponder. Of course you&#8217;d better let them know in advance and request email confirmation before doing this. This can be implemented with the PRO version of <a href="http://calendarscripts.info/php-auto-responder.html" target="_blank">BroadFast Autoresponder</a> for example.</p>
<p>Because these people already made the effort to contact you they are likely to be interested in what you offer. So your autoresponder may work well on them. Just don&#8217;t look at hard selling &#8211; better include them in informative newsletters or autoresponders and build trust over time.</p>
<h2>List Your Other Websites</h2>
<p>If you have more than one site (and they are related to each other), your &#8220;contact us&#8221; page is a great place to share them. Here is why:</p>
<ul>
<li>Lets people check what else you do. Again this builds trust.</li>
<li>Helps you get some traffic on the other sites. And maybe a customer too?</li>
<li>If they didn&#8217;t find exactly what they were searching for maybe they&#8217;d find it on the other sites?</li>
</ul>
<p>List the other sites gently under the main contact info and make sure they open in new tab.</p>
<h2>Give Your Other Channels</h2>
<p>Having Flickr account, Youtube or Vmeo channel, shared Delicious list, or Behance profile? Your contact page is a good place to share them too.</p>
<h2>Keep The Contact Form Easy And Simple</h2>
<p>Don&#8217;t forget that people have to actually fill that form to get in touch with you. Although some will use the other contact options most will fill the form. So make it easy and simple:</p>
<ul>
<li>Keep fields to the minimum. Name, Email, Message and (maybe) subject/reason. (Don&#8217;t call it &#8220;department&#8221; please, I don&#8217;t give a dime about how you structure your company internally)</li>
<li>Make gentle validation. Something like jQuery validator will do the work. Or see a bunch of <a href="http://www.queness.com/post/10104/powerful-javascript-form-validation-plugins" target="_blank">other validation plugins</a>.</li>
<li>Avoid captchas if possible and use <a href="http://www.sitepoint.com/captcha-alternatives/">other ways to stop spam</a>.</li>
<li>Make tab order work correctly. Don&#8217;t make us click every field with the mouse.</li>
</ul>
<p>Follow these practices and let me know the outcome. If we can help you with autoresponder software or designing your contact page, contact me via <a href="http://calendarscripts.info/contact.html">my contact page</a>. I know it badly needs rework! (Goes in my to-do list)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/contact-us-pages-that-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

