<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>CalendarScripts Blog</title>
	
	<link>http://blog.calendarscripts.info</link>
	<description>Updates, Software Reviews, Tips, Small Business Ideas and More</description>
	<lastBuildDate>Fri, 25 May 2012 17:54:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CalendarScripts" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="calendarscripts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>MicroCal Back To Life</title>
		<link>http://blog.calendarscripts.info/microcal-back-to-life/</link>
		<comments>http://blog.calendarscripts.info/microcal-back-to-life/#comments</comments>
		<pubDate>Fri, 25 May 2012 17:54:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=280</guid>
		<description><![CDATA[Microcal was one of the very first scripts I ever shared with the public. It was even commercial back in 2004 (I don&#8217;t remember the price but I think it was $5). I doubt I have sold more than 3-4 of it before I decided to give it out for free. Now, nearly 8 years [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://calendarscripts.info/product-1.html" target="_blank">Microcal</a> was one of the very first scripts I ever shared with the public. It was even commercial back in 2004 (I don&#8217;t remember the price but I think it was $5). I doubt I have sold more than 3-4 of it before I decided to give it out for free. Now, nearly 8 years later it still has several hundred downloads every month.</p>
<p>Just today I managed to check it and figured out how outdated the code was and how many PHP notices it produced. So here we are, fixed some bugs, improved the code a little bit and MicroCal is again usable in version 1.2 &#8211; also available as <a href="http://code.google.com/p/microcal/" target="_blank">Google Code repository</a>.</p>
<p>My plan is to revive it a little bit in the next versions, add some better options for including in forms, make it call-able through ajax and will see what else. Unlike the popular calendar plugins for jQuery it doesn&#8217;t add much Javascript overload so it has some potential. Let me know if you have any feature requests about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/microcal-back-to-life/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eventy 1.8, Eventy Plus 1.2</title>
		<link>http://blog.calendarscripts.info/eventy-1-8-eventy-plus-1-2/</link>
		<comments>http://blog.calendarscripts.info/eventy-1-8-eventy-plus-1-2/#comments</comments>
		<pubDate>Thu, 24 May 2012 16:41:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CalendarScripts]]></category>

		<guid isPermaLink="false">http://blog.calendarscripts.info/?p=277</guid>
		<description><![CDATA[The latest update to Eventy &#38; Eventy Plus: Improved design of the event pop-up (using lightbox_me) A link to share any event Additional feature in Eventy Plus: Event categories. You can now categorize the events for your own use and optionally display this information to the visitors. Again optionally you can let them filter events by [...]]]></description>
			<content:encoded><![CDATA[<p>The latest update to <a href="http://calendarscripts.info/event-calendar-software.html" target="_blank">Eventy &amp; Eventy Plus</a>:</p>
<ul>
<li>Improved design of the event pop-up (using <a href="http://buckwilson.me/lightboxme/" target="_blank">lightbox_me</a>)</li>
<li>A link to share any event</li>
</ul>
<p>Additional feature in Eventy Plus:</p>
<ul>
<li>Event categories. You can now categorize the events for your own use and optionally display this information to the visitors. Again optionally you can let them filter events by category.</li>
</ul>
<p>Upgrade terms are as usual &#8211; free if you bought less than 1 year ago, and 50% discount if your purchase is older. Upgrading starts another 1 year cycle of free upgrades and free support.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.calendarscripts.info/eventy-1-8-eventy-plus-1-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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. Multiple answers question. Here we will give five answers. In multiple answer questions the taker can select many possible answers.</p>
<p>It's a good idea to assign negative points for wrong answers on such questions. Otherwise a clever student could just select all answers and collect the full number of points.</p>
<p>Obviously I'm disclosing all of this because this is online demo of WatuPRO. You would perhaps prefer to just stick to the questions when you use the plugin.</p>
</div><br /><input type='hidden' name='question_id[]' id='qID_1' value='2' /><input type='checkbox' name='answer-2[]' id='answer-id-5' class='answer answer-  answerof-2' value='5' />&nbsp;<label for='answer-id-5' id='answer-label-5' class=' answer label-'><span>Very important answer. Will assign 2 points.</span></label><br /><input type='checkbox' name='answer-2[]' id='answer-id-4' class='answer answer-  answerof-2' value='4' />&nbsp;<label for='answer-id-4' id='answer-label-4' class=' answer label-'><span>Neutral answer. Zero points.</span></label><br /><input type='checkbox' name='answer-2[]' id='answer-id-6' class='answer answer-  answerof-2' value='6' />&nbsp;<label for='answer-id-6' id='answer-label-6' class=' answer label-'><span>Wrong answer. Punishes the student with -1 points</span></label><br /><input type='checkbox' name='answer-2[]' id='answer-id-3' class='answer answer-  answerof-2' value='3' />&nbsp;<label for='answer-id-3' id='answer-label-3' class=' answer label-'><span>First good answer. This gives a point.</span></label><br /><input type='checkbox' name='answer-2[]' id='answer-id-7' class='answer answer-  answerof-2' value='7' />&nbsp;<label for='answer-id-7' id='answer-label-7' class=' answer label-'><span>And this is really stupid answer. If you check it, you lose 2 points.</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. "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_2' value='3' /><p><textarea name='answer-3[]' id='textarea_q_3' rows='3' cols='40'></textarea></p><p><i>(Question 2 of 3)</i></p></div><div class='watu-question' id='question-3'><div class='question-content'><p>3. 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_3' value='4' /><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 /><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-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 /><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="2,3,4">
    </form>
    </div>
    <script type="text/javascript">
    var question_ids = "2,3,4";
    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/wp-admin/admin-ajax.php";    </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>
	</channel>
</rss>

