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.maskManager) {
        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.effectsManager = new EffectsManager(this.data,this,this.dynamicProperties);
    
};

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