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

JsEvalNode = require("./js-eval-node"),
Variable = require("./variable");

var Quoted = function (str, content, escaped, index, currentFileInfo) {

this.escaped = (escaped == null) ? true : escaped;
this.value = content || '';
this.quote = str.charAt(0);
this.index = index;
this.currentFileInfo = currentFileInfo;

}; Quoted.prototype = new JsEvalNode(); Quoted.prototype.type = “Quoted”; Quoted.prototype.genCSS = function (context, output) {

if (!this.escaped) {
    output.add(this.quote, this.currentFileInfo, this.index);
}
output.add(this.value);
if (!this.escaped) {
    output.add(this.quote);
}

}; Quoted.prototype.containsVariables = function() {

return this.value.match(/(`([^`]+)`)|@\{([\w-]+)\}/);

}; Quoted.prototype.eval = function (context) {

var that = this, value = this.value;
var javascriptReplacement = function (_, exp) {
    return String(that.evaluateJavaScript(exp, context));
};
var interpolationReplacement = function (_, name) {
    var v = new Variable('@' + name, that.index, that.currentFileInfo).eval(context, true);
    return (v instanceof Quoted) ? v.value : v.toCSS();
};
function iterativeReplace(value, regexp, replacementFnc) {
    var evaluatedValue = value;
    do {
        value = evaluatedValue;
        evaluatedValue = value.replace(regexp, replacementFnc);
    } while (value !== evaluatedValue);
    return evaluatedValue;
}
value = iterativeReplace(value, /`([^`]+)`/g, javascriptReplacement);
value = iterativeReplace(value, /@\{([\w-]+)\}/g, interpolationReplacement);
return new Quoted(this.quote + value + this.quote, value, this.escaped, this.index, this.currentFileInfo);

}; Quoted.prototype.compare = function (other) {

// when comparing quoted strings allow the quote to differ
if (other.type === "Quoted" && !this.escaped && !other.escaped) {
    return Node.numericCompare(this.value, other.value);
} else {
    return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined;
}

}; module.exports = Quoted;