
var ext_template = Class.create({
	initialize: function( file_content, unknowns ) {
		this.unknowns = unknowns;
		this.debug = true;
		this.varkeys = new Hash();
		this.varvals = new Hash();
		this.debug_list = new Array();
		this.set_var( 'main', file_content.gsub( "\n|\r|\t", "" ) );
	}, 
	varname: function ( varname ) {
		return '#\{' + varname + '\}';
	},
	set_var: function ( varname ) {
		var value = ( arguments.length > 1 ) ? arguments[1] : '';
		if ( varname instanceof Object ) {
			var keys = Object.keys( varname );
			for ( var i = 0; i < keys.length; i ++ ) {
				var name = keys[i];
				var value = varname[ keys[i] ];
				this.varkeys.set( name, this.varname ( name ) );
				this.varvals.set( name, value );
				this.add_debug ( "scalar: set *" + name + "* to *" + value +"*" );
			}
		} else {
			name = new String( varname );
			if ( varname.length > 0 ) {
				this.add_debug ( "scalar: set *" + name + "* to *" + value +"*" );
				this.varkeys.set( name, this.varname ( name ) );
				this.varvals.set( name, value );
			}
		}
	}, 
	get_var: function( varname ) {
		var name = new String( varname );
		return this.varvals.get( name );
	}, 
	subst: function( varname ) {
		var name = new String( varname );
		var str = this.get_var( name );
		var keys = this.varkeys.keys();
		for ( var i = 0; i < keys.length; i ++ ) {
			var reg = new RegExp( this.varkeys.get( keys[i] ), 'g' );
			var subst = this.get_var( keys[i] );
			str = str.replace( reg, subst );
		}
		return str;
	}, 
	parse: function( target, handle ) {
		var append = ( arguments.length > 2 ) ? arguments[2] : false;
		var str = this.subst( handle );
		this.add_debug ( "subst: *" + handle + "* to *" + str +"*" );
		if ( append == true ) {
			var c = this.get_var( target );
			this.add_debug ( "append: *" + target + "* to *" + c +"*" );
			var str2 = c + str;
			this.set_var( target, str2 );
		} else {
			this.set_var( target, str );
		}
	}, 
	set_block: function( target, handle ) {
		var name = ( arguments.length > 2 ) ? arguments[2] : handle;
		var str = this.get_var( target );
		var reg = new RegExp( ".*--- BEGIN " + handle + " ---(.*)--- END " + handle + " ---.*", "gi" );
		var matches = str.match( reg );
		if ( matches == null ) {
			this.add_debug ( "set_block: *" + handle + "* not found in *" + target +"*" );
			return false;
		}
		this.set_var( handle, str.replace( reg, "$1" ) );
		var reg2 = new RegExp( "--- BEGIN " + handle + " ---(.*)--- END " + handle + " ---", "gi" );
		
		this.set_var( target, str.replace( reg2, '#{' + name + '}') );
		this.set_var( name, '' );
			
		return true;
	}, 
	finish: function() {
		this.parse( 'I', 'main' );
		switch ( this.unknowns ) {
			case 'keep':
				str = this.get_var( 'I');
			break;
			
			case 'remove':
			default:
				var str = this.get_var( 'I');
				var reg = new RegExp('#\{[a-zA-Z0-9_]*\}', 'gi');
				str = str.replace( reg, '' );
			break;
		}
		return str;
	}, 
	toString: function() {
		return this.finish();
	}, 
	add_debug: function ( s ) {
		if (this.debug == true ) {
			this.debug_list [ this.debug_list.length ] = s;
		}
	}, 
	show_debug: function() {
		var s = '';
		for ( var i = 0; i < this.debug_list.length; i ++) {
			s += this.debug_list[i] + "\n";
		}
		var keys = this.varkeys.keys();
		s += "----------------------------------------------\n"
		for ( var i = 0; i < keys.length; i ++ ) {
			s += keys[i] + ' : ' + this.varvals.get( keys[i] )  + "\n";
		}
		return "<pre>" + s + "</pre>";
	}
});
