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

Color = require("./color"),
Dimension = require("./dimension");

var Operation = function (op, operands, isSpaced) {

this.op = op.trim();
this.operands = operands;
this.isSpaced = isSpaced;

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

this.operands = visitor.visit(this.operands);

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

var a = this.operands[0].eval(context),
    b = this.operands[1].eval(context);

if (context.isMathOn()) {
    if (a instanceof Dimension && b instanceof Color) {
        a = a.toColor();
    }
    if (b instanceof Dimension && a instanceof Color) {
        b = b.toColor();
    }
    if (!a.operate) {
        throw { type: "Operation",
                message: "Operation on an invalid type" };
    }

    return a.operate(context, this.op, b);
} else {
    return new Operation(this.op, [a, b], this.isSpaced);
}

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

this.operands[0].genCSS(context, output);
if (this.isSpaced) {
    output.add(" ");
}
output.add(this.op);
if (this.isSpaced) {
    output.add(" ");
}
this.operands[1].genCSS(context, output);

};

module.exports = Operation;