function HTMLTemplate() {
	var _this     = this;
	var _elements = new Object();
//	var _rows     = new Object();
//	var _values   = new Object();

	_this._AddElement = function( name, elem ) {
			if( _elements[name] ) {
				_elements[name].push( tmpl );
			} else {
				_elements[name] = new Array( tmpl );
			}
		};

//	_this.ReplaceRow = function( name, data ) {
//			if( _elements[name] ) {
//				_elements[name].Replace( data );
//			}
//		};

	_this.Replace = function( name, data ) {
			var elem;
			if( _elements[name] ) {
				for( elem in _elements[name] ) {
					_elements[name][elem].Replace( data );
				}
			}
		};


	var spans = document.getElementsByTagName("SPAN");
	var i;
	for( i=0; i<spans.length; i++ ) {
		var type = spans[i].getAttribute("name");

		switch( type ) {
			case 'tmpl_row' :
				var tmpl = new HTMLTemplateRow(spans[i]);
				break;

			case 'tmpl_value' :
				var tmpl = new HTMLTemplateValue(spans[i]);
				break;

			case 'tmpl_mask' :
				var tmpl = new HTMLTemplateMask(spans[i]);
				break;

			case 'tmpl_conditional' :
				var tmpl = new HTMLTemplateConditional(spans[i]);
				break;

			default:
				continue;
		}
		var name = tmpl.name();
		_this._AddElement( name, tmpl );
	}
}

function HTMLTemplateRow( row ) {
	var _this  = this;
	var _row   = row;
	var _keys  = new Object();
	var _name  = _row.getAttribute("id");
	var _inner = _row.innerHTML;
	var _re    = new RegExp();

	// METHODS

	_this.Replace = function( data ) {
			var i;
			var key;
			var value;

			if( data == null ) {
				_row.innerHTML = '';
			} else {
				var str = '';
				for( i=0; i<data.length; i++ ) {
					var rowStr = new String( _inner );
					for( key in _keys ) {
						_re.compile( "--" + key + "--", "g" );
						value = data[i][key];
						if( value ) {
							rowStr = rowStr.replace( _re, value );
						} else {
							rowStr = rowStr.replace( _re, '' );
						}
					}
					str += rowStr;
				}

				_row.innerHTML = str;
			}
		};

	_this.name = function() { return _name; };

	// CONSTRUCTOR

	var i;
	var startIndex;
	var endIndex;
	var keyList;
	var key;

	_re.compile( "--[A-Z_]+--", "g" );
	keyList = _inner.match( _re );

	// Got to approach this as array only (IE chokes on for(in))
	for( i=0; i<keyList.length; i++ ) {
		key = new String(keyList[i])
		var cleanKey = key.match( /--(.+)--/ );
		_keys[cleanKey[1]] = 1;
	}
	//var str = 'KEYS:'; for( key in _keys ) { str += key + ":"; } alert( str );
}

function HTMLTemplateValue( value ) {
	var _this  = this;
	var _value = value;
	var _name  = _value.getAttribute("id");

	// METHODS

	_this.Replace = function( value ) {
			_value.innerHTML = value;
		};

	_this.name = function() { return _name; }
}

function HTMLTemplateMask( elem ) {
	var _this  = this;
	var _elem  = elem;
	//var _keys  = new Object();
	var _name  = _elem.getAttribute("id");
	var _re    = new RegExp();

	// METHODS

	_this.Replace = function( data ) {
			var i;
			var key;
			var value;
			//var _inner = _elem.innerHTML;

			if( data == null ) {
				_elem.innerHTML = '';
			} else {
				var str = new String( _elem.innerHTML );

				for( key in data ) {
					_re.compile( "--" + key + "--", "g" );
					value = data[key];
					if( value ) {
						str = str.replace( _re, value );
					} else {
						str = str.replace( _re, '' );
					}
				}

				_elem.innerHTML = str;
			}
		};

	_this.name = function() { return _name; };

	// CONSTRUCTOR

	//var i;
	//var startIndex;
	//var endIndex;
	//var keyList;
	//var key;

	//_re.compile( "--[A-Z_]+--", "g" );
	//keyList = _inner.match( _re );

	// Got to approach this as array only (IE chokes on for(in))
	//for( i=0; i<keyList.length; i++ ) {
	//	key = new String(keyList[i])
	//	var cleanKey = key.match( /--(.+)--/ );
	//	_keys[cleanKey[1]] = 1;
	//}
	//var str = 'KEYS:'; for( key in _keys ) { str += key + ":"; } alert( str );
}

function HTMLTemplateConditional( elem ) {
	var _this  = this;
	var _elem  = elem;
	var _name  = _elem.getAttribute("id");
	var _inner = _elem.innerHTML;
	var _re    = new RegExp();

	// METHODS

	_this.Replace = function( data ) {
			var i;
			var key;
			var value;

			if( !data ) {
				_elem.innerHTML = '';
			} else {
				//_elem.innerHTML = new String( _inner );
			}
		};

	_this.name = function() { return _name; };
}
