var Node = require(“./node”),

Variable = require("./variable");

var JsEvalNode = function() { }; JsEvalNode.prototype = new Node();

JsEvalNode.prototype.evaluateJavaScript = function (expression, context) {

var result,
    that = this,
    evalContext = {};

if (context.javascriptEnabled !== undefined && !context.javascriptEnabled) {
    throw { message: "You are using JavaScript, which has been disabled.",
        filename: this.currentFileInfo.filename,
        index: this.index };
}

expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
    return that.jsify(new Variable('@' + name, that.index, that.currentFileInfo).eval(context));
});

try {
    expression = new Function('return (' + expression + ')');
} catch (e) {
    throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`" ,
        filename: this.currentFileInfo.filename,
        index: this.index };
}

var variables = context.frames[0].variables();
for (var k in variables) {
    if (variables.hasOwnProperty(k)) {
        /*jshint loopfunc:true */
        evalContext[k.slice(1)] = {
            value: variables[k].value,
            toJS: function () {
                return this.value.eval(context).toCSS();
            }
        };
    }
}

try {
    result = expression.call(evalContext);
} catch (e) {
    throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message.replace(/["]/g, "'") + "'" ,
        filename: this.currentFileInfo.filename,
        index: this.index };
}
return result;

}; JsEvalNode.prototype.jsify = function (obj) {

if (Array.isArray(obj.value) && (obj.value.length > 1)) {
    return '[' + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + ']';
} else {
    return obj.toCSS();
}

};

module.exports = JsEvalNode;