/*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global layerElement, bm_generalUtils, bm_eventDispatcher, bm_renderManager, bm_compsManager, File, app, ParagraphJustification, bm_textAnimatorHelper, bm_keyframeHelper, bm_sourceHelper, bm_textShapeHelper*/
var bm_textHelper = (function () {
    'use strict';
    var ob = {};
    
    function getJustification(value) {
        switch (value) {
        case ParagraphJustification.LEFT_JUSTIFY:
            return 0;
        case ParagraphJustification.RIGHT_JUSTIFY:
            return 1;
        case ParagraphJustification.CENTER_JUSTIFY:
            return 2;
        case ParagraphJustification.FULL_JUSTIFY_LASTLINE_LEFT:
            return 3;
        case ParagraphJustification.FULL_JUSTIFY_LASTLINE_RIGHT:
            return 4;
        case ParagraphJustification.FULL_JUSTIFY_LASTLINE_CENTER:
            return 5;
        case ParagraphJustification.FULL_JUSTIFY_LASTLINE_FULL:
            return 6;
        }
    }
    
    function exportTextDocumentData(layerInfo, ob) {
        
        var textDocument = layerInfo.property("Source Text").value;
        if (textDocument.boxText) {
            ob.sz = textDocument.boxTextSize;
            ob.ps = textDocument.boxTextPos;
            ob.mf = 20;
        }
        var i, len;
        ob.s = textDocument.fontSize;
        ob.f = textDocument.font;
        bm_sourceHelper.addFont(textDocument.font, textDocument.fontFamily, textDocument.fontStyle);
        if(textDocument.allCaps){
            ob.t = textDocument.text.toUpperCase();
        } else {
            ob.t = textDocument.text;
        }
        len = ob.t.length;
        bm_textShapeHelper.addTextLayer(layerInfo);
        ob.j = getJustification(textDocument.justification);
        ob.tr = textDocument.tracking;
        if(textDocument.baselineLocs && textDocument.baselineLocs.length > 5){
            ob.lh = textDocument.baselineLocs[5] - textDocument.baselineLocs[1];
        } else {
            ob.lh = ob.s*1.2;
        }
        if (textDocument.applyFill) {
            len = textDocument.fillColor.length;
            ob.fc = [];
            for (i = 0; i < len; i += 1) {
                ob.fc[i] = Math.round(100*textDocument.fillColor[i])/100;
            }
        }
        if (textDocument.applyStroke) {
            len = textDocument.strokeColor.length;
            ob.sc = [];
            for (i = 0; i < len; i += 1) {
                ob.sc[i] = Math.round(100*textDocument.strokeColor[i])/100;
            }
            ob.sw = textDocument.strokeWidth;
            if (textDocument.applyFill) {
                ob.of = textDocument.strokeOverFill;
            }
        }
    }
    
    function exportTextPathData(pathOptions, ob, masksProperties, frameRate) {
        if (pathOptions.property("Path").value !== 0) {
            masksProperties[pathOptions.property("Path").value - 1].mode = 'n';
            ob.m = pathOptions.property("Path").value - 1;
            ob.f = bm_keyframeHelper.exportKeyframes(pathOptions.property("First Margin"), frameRate);
            ob.l = bm_keyframeHelper.exportKeyframes(pathOptions.property("Last Margin"), frameRate);
            ob.a = pathOptions.property("Force Alignment").value;
            ob.p = pathOptions.property("Perpendicular To Path").value;
            ob.r = pathOptions.property("Reverse Path").value;
        }
    }
    
    function exportMoreOptionsData(pathOptions, ob, frameRate) {
        ob.g = pathOptions.property("Anchor Point Grouping").value;
        ob.a = bm_keyframeHelper.exportKeyframes(pathOptions.property("Grouping Alignment"), frameRate);
        
    }
    
    function exportAnimators(layerInfo, animatorArr, frameRate) {
        var i, len = layerInfo.numProperties;
        for (i = 0; i < len; i += 1) {
            if (layerInfo.property(i + 1).matchName === "ADBE Text Animator") {
                var animatorOb = {};
                bm_textAnimatorHelper.exportAnimator(layerInfo.property(i + 1), animatorOb, frameRate);
                animatorArr.push(animatorOb);
            }
        }
    }
    
    function exportText(layerInfo, layerOb, frameRate) {
        layerOb.t = {
            d: {},
            p: {},
            m: {}
        };
        exportTextDocumentData(layerInfo, layerOb.t.d);
        var textProperty = layerInfo.property("Text");
        
        var i, len = textProperty.numProperties;
        for (i = 0; i < len; i += 1) {
            switch (textProperty(i + 1).name) {
            case "Path Options":
                exportTextPathData(textProperty(i + 1), layerOb.t.p, layerOb.masksProperties, frameRate);
                break;
            case "More Options":
                exportMoreOptionsData(textProperty(i + 1), layerOb.t.m, frameRate);
                break;
            case "Animators":
                if (!layerOb.t.a) {
                    layerOb.t.a = [];
                }
                exportAnimators(textProperty(i + 1), layerOb.t.a, frameRate);
                break;
            }
        }
        //exportMoreOptionsData(layerInfo, layerOb.t.m, frameRate);
    }
    
    ob.exportText = exportText;
    
    return ob;
    
}());