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

Paren = require("./paren"),
Combinator = require("./combinator");

var Element = function (combinator, value, index, currentFileInfo, info) {

this.combinator = combinator instanceof Combinator ?
                  combinator : new Combinator(combinator);

if (typeof value === 'string') {
    this.value = value.trim();
} else if (value) {
    this.value = value;
} else {
    this.value = "";
}
this.index = index;
this.currentFileInfo = currentFileInfo;
this.copyVisibilityInfo(info);

}; Element.prototype = new Node(); Element.prototype.type = “Element”; Element.prototype.accept = function (visitor) {

var value = this.value;
this.combinator = visitor.visit(this.combinator);
if (typeof value === "object") {
    this.value = visitor.visit(value);
}

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

return new Element(this.combinator,
                         this.value.eval ? this.value.eval(context) : this.value,
                         this.index,
                         this.currentFileInfo, this.visibilityInfo());

}; Element.prototype.clone = function () {

return new Element(this.combinator,
    this.value,
    this.index,
    this.currentFileInfo, this.visibilityInfo());

}; Element.prototype.genCSS = function (context, output) {

output.add(this.toCSS(context), this.currentFileInfo, this.index);

}; Element.prototype.toCSS = function (context) {

context = context || {};
var value = this.value, firstSelector = context.firstSelector;
if (value instanceof Paren) {
    // selector in parens should not be affected by outer selector
    // flags (breaks only interpolated selectors - see #1973)
    context.firstSelector = true;
}
value = value.toCSS ? value.toCSS(context) : value;
context.firstSelector = firstSelector;
if (value === '' && this.combinator.value.charAt(0) === '&') {
    return '';
} else {
    return this.combinator.toCSS(context) + value;
}

}; module.exports = Element;