function Templater(subDir){
    this.templates = new Array();
    this.fields = new Array();
    if (!subDir) {
        this.subDir = '';
    }
    else {
        this.subDir = subDir;
    }

    this.getRemoteTemplates = function(templateArray){
        this.getRemoteTemplate(templateArray, true);
    }
    
    // multiple requires MooTools
    this.getRemoteTemplate = function(templateName, multiple){
        // if we already have loaded the template just return;
        if (multiple){
            var names = templateName;
            templateName = JSON.encode(templateName);
        }
        else {

            if (this.templates[templateName]) return false;
        }
        
        var url = "/getTemplate.php?templateName=" + templateName + '&sd=' + this.subDir + '&m=' + (multiple ? 1 : 0);

        // not moo
        if (window.getHTTPRequest){
            var req = getHTTPRequest();

            req.open("GET", url, false);
            req.send(null);
	
            if (req.status == 200){
                this.templates[templateName] = req.responseText;
            }
        }
        else {
            var self = this;
            var req = new Request({'url': url,
                                   'async': false,
                                   'method': 'get',
                                   'onComplete': function(text){
                        if (multiple){
                            var tpls = text.split('-----separator-----');
                            names.each(function(templateName, index){
                                    self.templates[templateName] = tpls[index];
                                });
                        }
                        else {
                            self.templates[templateName] = text;
                        }
                            

                    }.bindWithEvent(this)
                });
            req.send();
        }

    }

    /**
     *
     **/

    this.clear = function(){
        this.fields = new Array();
    }

    /**
     *
     **/
    this.clearOne = function(fieldName){
        if (this.fields[fieldName]){
            delete this.fields[fieldName];
        }
    }

    /**
     *
     **/
    this.assign = function(fields){
        for(var fieldName in fields){
            this.fields[fieldName] = fields[fieldName];
        }
    }

    /**
     *
     * use fetch to retrieve a raw template
     **/
    this.fetch = function(templateName){
        var template = this.templates[templateName];
        if (!template){
            alert("Couldn't find template: " + templateName);
            return;
        }
        return template;
    }

    /**
     *
     **/
    this.parse = function(assignToName, templateName, append){
        var template = this.fetch(templateName);

        var regEx;
        for(var fieldName in this.fields){
            value = this.fields[fieldName];
            regEx = new RegExp('{' + fieldName + '}', 'g');
            template = template.replace(regEx, value );
        } 
        if (append
            && this.fields[assignToName]){
            this.fields[assignToName] += template;
        }
        else {
            this.fields[assignToName] = template;
        }
    }

    /**
     * use get to retrieve parsed or assigned values
     **/
    this.get = function(fieldName){
        return this.fields[fieldName];
    }
}
