/** EL.js : A 'simple' expression language for Javascript. */
//
var elPattern = new RegExp("\\$\\{([^\\{]*?)\\}", 'mg');
var elWords = new RegExp('[\\w|\\.]*','g');

function Template(text) {
    this.text = text;
    //this.parseTemplate(text);
}
Template.prototype.render = function (model) {
    //alert('model.title = ' + model.title);
    this.context = new Object();
    if (!xw_isEmpty(model)) {
        for (prop in model) {
            this.context[prop] = model[prop];
        }
    }
    //var val = eval('this.context.title');
    //alert(val);
    // This will contain the result of evaluating the text.
    var evaledText = '';
    
    // This is the RegExp exec result; [0] holds the entire string, [1] holds just the expression.
    var evaled = null;
    var result = null;
    var lastPosition = 0;
    while ((result = elPattern.exec(this.text)) != null) {
        //alert('Found match: ' + result[0] + ' ( value = ' + result[1] + ' ) at position: ' + result.index);
        evaledText += this.text.substring(lastPosition, result.index);
        evaled = eval( el_getExpression(result[1]) );
        if (!xw_isEmpty(evaled)) {
            evaledText += evaled;
        }
        lastPosition = result.index + result[0].length;
    }
    if (lastPosition < this.text.length) {
        evaledText += this.text.substring(lastPosition,this.text.length);
    }
    //alert(evaledText);
    return evaledText;
};

function el_getExpression(str) {
    // for now this is a very simple utility function, 
    // if this expands it can be the entry into a EL tokenizer:
    /*
    var results = elWords.exec(str);
    if (null != results) {
        alert('results 2 = ' + results[0]);
        results = 'this.context.' + results[0];
    } */
    var results = 'this.context.' + str;
    return results;
}
