function BaseElement(){
};
BaseElement.prototype.checkMasks = function(){
    if(!this.data.hasMask){
        return false;
    }
    var i = 0, len = this.data.masksProperties.length;
    while(i<len) {
        if((this.data.masksProperties[i].mode !== 'n' && this.data.masksProperties[i].cl !== false)) {
            return true;
        }
        i += 1;
    }
    return false;
}

BaseElement.prototype.initExpressions = function(){
    this.layerInterface = LayerExpressionInterface(this);
    if(this.data.hasMask){
        this.layerInterface.registerMaskInterface(this.maskManager);
    }
    var effectsInterface = EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);
    this.layerInterface.registerEffectsInterface(effectsInterface);

    if(this.data.ty === 0 || this.data.xt){
        this.compInterface = CompExpressionInterface(this);
    } else if(this.data.ty === 4){
        this.layerInterface.shapeInterface = ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface);
        this.layerInterface.content = this.layerInterface.shapeInterface;
    } else if(this.data.ty === 5){
        this.layerInterface.textInterface = TextExpressionInterface(this);
        this.layerInterface.text = this.layerInterface.textInterface;
    }
}

BaseElement.prototype.blendModeEnums = {
    1:'multiply',
    2:'screen',
    3:'overlay',
    4:'darken',
    5:'lighten',
    6:'color-dodge',
    7:'color-burn',
    8:'hard-light',
    9:'soft-light',
    10:'difference',
    11:'exclusion',
    12:'hue',
    13:'saturation',
    14:'color',
    15:'luminosity'
}

BaseElement.prototype.getBlendMode = function(){
    return this.blendModeEnums[this.data.bm] || '';
}

BaseElement.prototype.setBlendMode = function(){
    var blendModeValue = this.getBlendMode();
    var elem = this.baseElement || this.layerElement;

    elem.style['mix-blend-mode'] = blendModeValue;
}

BaseElement.prototype.initBaseData = function(data, globalData, comp){
    this.globalData = globalData;
    this.comp = comp;
    this.data = data;
    this.layerId = 'ly_'+randomString(10);
    
    //Stretch factor for old animations missing this property.
    if(!this.data.sr){
        this.data.sr = 1;
    }
    // effects manager
    this.effects = new EffectsManager(this.data,this,this.dynamicProperties);
    
};

BaseElement.prototype.getType = function(){
    return this.type;
};
