﻿/*
	Author: Mason Houtz <mason@nerdinacan.com>
	Date: 12/10/2004

	Yet, another templating plugin. This one has the advantage of making use of on-page DOM
	constructed template fragments, and allows for the direct association of a data array via
	the .data() method at each node.

	Dependencies:
		type.of

	Sample Template Markup:

		<div class="templates hidden">
		 
			<!-- this is yer template -->
			<div class="someContainer">
			  <div region="title">Default Title</div>
			  <div region="children" template=".templates .childTemplate"></div>
			</div>

			<!-- this is the child template -->
			<div class=".childTemplate">
				<h1 region="name">Default Child Name</h1>
				<p>My shoe size is: <span region="shoesize"></span></p>
			</div>

		</div>

	Sample Usage:
	
		var stuff = {title: 'foobar', children: [ {name: 'child1', shoesize: 4}, {name:'child2', shoesize:6}]};
		var newStuff = $('.templates .someContainer').stamp(stuff);
		$('#someContainer').append(newStuff);
	
*/

jQuery.fn.stamp = function(oData) {

   var duplicate = this.clone();
   duplicate.data('o', oData);

   $(duplicate).find('[region]').each(function() {

      var el = $(this);
      var region = el.attr('region');
      var fieldValue = oData[region];
      var fieldType = type.of(fieldValue);
      var subTemplate = el.attr('template');

      switch (fieldType) {

         case 'undefined':
         case 'null':
            return;
            break;

         case 'array':
            var childArray = fieldValue;
            el.empty();
            $.each(fieldValue, function() {
               var child = $(subTemplate).stamp(this);
               el.append(child);
            });
            break;

         case 'object':
            el.empty();
            el.append($(subTemplate).stamp(fieldValue));
            break;

         case 'string':
            el.html(fieldValue);
            break;

         case 'number':
            el.html(fieldValue.toString());
            break;

         case 'date':
            var formatString = el.attr('format');
            formatString = formatString || "m/dd/yy";
            el.html(fieldValue.format(formatString));
            break;

         default:
            // console.log('unhandled node type', fieldType);
            break;
      }

   });

   return duplicate;

};
