/*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global app, bm_eventDispatcher, bm_projectManager, bm_shapeHelper, bm_renderManager, ParagraphJustification, bm_generalUtils*/
var bm_textShapeHelper = (function () {
    'use strict';
    var ob = {}, chars = [], comp, fontComp, dupl, boxText, layers = [], currentFont, compsAddedFlag = false;
    
    function reset() {
        chars.length = 0;
        layers.length = 0;
        currentFont = '';
        compsAddedFlag = false;
    }
    
    function addComps() {
        if (compsAddedFlag) {
            return;
        }
        compsAddedFlag = true;
        comp = app.project.items.addComp('bm_charHelper', 1000, 1000, 1, 1, 1);
        fontComp = app.project.items.addComp('bm_fontHelper', 1000, 1000, 1, 1, 1);
        boxText = fontComp.layers.addBoxText([500, 500], 'm');
        dupl = comp.layers.addText();
        var textProp = dupl.property("Source Text");
        var textDocument = textProp.value;
        textDocument.fontSize = 100;
        textDocument.justification = ParagraphJustification.LEFT_JUSTIFY;

        textProp.setValue(textDocument);
        var fontProp = dupl.property("Source Text");
        var fontDocument = fontProp.value;
        fontDocument.fontSize = 100;
        fontDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
        fontProp.setValue(fontDocument);
    }
    
    function addTextLayer(layer) {
        layers.push(layer);
    }
    
    function addChar(ch, size, font, style) {
        var i = 0, charData, len = chars.length;
        while (i < len) {
            if (chars[i].ch === ch && chars[i].font === font && chars[i].style === style) {
                return false;
            }
            i += 1;
        }
        charData = {
            ch: ch,
            size: size,
            font: font,
            style: style
        };
        chars.push(charData);
        return charData;
    }
    
    function resetProp(p, def) {
        if (!p) {
            return;
        }
        if (p.isModified) {
            if (p.expression !== "") {
                p.expression = "";
            }
            while (p.numKeys > 0) {
                p.removeKey(1);
            }
            p.setValue(def);
        }
        return;
    }
    
    function removeLayerAnimators(textLayer) {
        var layerInfo = textLayer.property("Text");
        var i, len = layerInfo.numProperties;
        for (i = 0; i < len; i += 1) {
            if (layerInfo.property(i + 1).matchName === "ADBE Text Animators") {
                var animatorInfo = layerInfo.property(i + 1);
                var j, jLen = animatorInfo.numProperties;
                for (j = 0; j < jLen; j += 1) {
                    if (animatorInfo.property(j + 1).matchName === "ADBE Text Animator") {
                        animatorInfo.property(j + 1).remove();
                        j -= 1;
                        jLen -= 1;
                    }
                }
            }
        }
        if ((textLayer.mask && textLayer.mask.numProperties > 0)) {
            textLayer.mask(1).remove();
        }
        resetProp(textLayer.transform.position, [0, 0, 0]);
        resetProp(textLayer.transform.rotation, 0);
    }
    
    function createNewChar(layerInfo, ch, charData) {
            //"allCaps","applyFill","applyStroke","baselineLocs","baselineShift","boxText","boxTextPos","boxTextSize","fauxBold","fauxItalic","fillColor","font","fontFamily","fontLocation","fontSize","fontStyle","horizontalScale","justification","pointText","resetCharStyle","resetParagraphStyle","smallCaps","strokeColor","strokeOverFill","strokeWidth","subscript","superscript","text","tracking","tsume","verticalScale"
        if (ch.charCodeAt(0) === 13) {
            return;
        }
        var shapeLayer;
        var l, lLen;
        var cmdID = bm_projectManager.getCommandID('shapesFromText');
        layerInfo.copyToComp(comp);
        var originalTextDocument = layerInfo.property('Source Text').value;
        //var dupl = comp.layers[1];
        //var dupl = comp.layers.addText();
        //removeLayerAnimators(dupl);
        var textProp = dupl.property("Source Text");
        var textDocument = textProp.value;
        if (ch !== ' ') {
            textDocument.text = ch + ch;
        } else {
            textDocument.text = 'i i';
        }
        textDocument.font = originalTextDocument.font;
        textDocument.fontSize = 100;
        textDocument.justification = ParagraphJustification.LEFT_JUSTIFY;
        textProp.setValue(textDocument);
        dupl.enabled = true;
        dupl.selected = true;
        if (ch !== ' ') {
            app.executeCommand(cmdID);
        }
        dupl.selected = false;
        var doubleSize, singleSize;
        doubleSize = dupl.sourceRectAtTime(0, false).width;
        if (ch !== ' ') {
            textDocument.text = ch;
        } else {
            textDocument.text = 'ii';
        }
        textProp.setValue(textDocument);
        singleSize = dupl.sourceRectAtTime(0, false).width;
        charData.w = bm_generalUtils.roundNumber(doubleSize - singleSize, 2);
        shapeLayer = comp.layers[1];
        charData.data = {};
        if (ch !== ' ') {
            bm_shapeHelper.exportShape(shapeLayer, charData.data, 1, true);
            lLen = charData.data.shapes[0].it.length;
            for (l = 0; l < lLen; l += 1) {
                var ks = charData.data.shapes[0].it[l].ks;
                if (ks) {
                    var k, kLen = ks.k.i.length;
                    for (k = 0; k < kLen; k += 1) {
                        ks.k.i[k][0] += ks.k.v[k][0];
                        ks.k.i[k][1] += ks.k.v[k][1];
                        ks.k.o[k][0] += ks.k.v[k][0];
                        ks.k.o[k][1] += ks.k.v[k][1];
                    }
                } else {
                    charData.data.shapes[0].it.splice(l, 1);
                    l -= 1;
                    lLen -= 1;
                }
            }
        }
        shapeLayer.selected = false;
    }
    
    function exportChars(fonts) {
        
        comp.openInViewer();
        var layerCollection = comp.layers;
        var i, len = layers.length, layerInfo;
        for (i = 0; i < len; i += 1) {
            layerInfo = layers[i];
            var textProp = layerInfo.property("Source Text");
            var textDocument = textProp.value;
            var font = textDocument.font;
            var fontFamily = textDocument.fontFamily;
            var fontStyle = textDocument.fontStyle;
            var fontSize = textDocument.fontSize;
            var text = textDocument.allCaps ? textDocument.text.toUpperCase() : textDocument.text;
            var j, jLen = text.length;
            
            if (currentFont !== font) {
                currentFont = font;
                createNewChar(layerInfo, '[]', {});
            }
            var l, lLen;
            for (j = 0; j < jLen; j += 1) {
                var ch = text.substr(j, 1);
                var charData = addChar(ch, fontSize, font, fontStyle);
                if (charData !== false) {
                    createNewChar(layerInfo, ch, charData);
                    l = 0;
                    lLen = fonts.list.length;
                    while (l < lLen) {
                        if (fonts.list[l].fName === charData.font) {
                            charData.fFamily = fonts.list[l].fFamily;
                            break;
                        }
                        l += 1;
                    }
                }
            }
        }
        
        bm_renderManager.setChars(chars);
    }
    
    function exportFonts(fonts) {
        fontComp.openInViewer();
        var i, len = fonts.list.length, rect;
        var fontProp = boxText.property("Source Text");
        var fontDocument = fontProp.value;
        fontDocument.text = 'm';
        for (i = 0; i < len; i += 1) {
            fontDocument.font = fonts.list[i].fName;
            fontDocument.fontSize = 100;
            fontProp.setValue(fontDocument);
            rect = boxText.sourceRectAtTime(0, false);
            fonts.list[i].ascent = 250 + rect.top + rect.height;
        }
    }
    
    function removeComps() {
        if (compsAddedFlag) {
            comp.remove();
            fontComp.remove();
            compsAddedFlag = false;
        }
    }
    
    ob.reset = reset;
    ob.addChar = addChar;
    ob.addTextLayer = addTextLayer;
    ob.exportChars = exportChars;
    ob.exportFonts = exportFonts;
    ob.addComps = addComps;
    ob.removeComps = removeComps;
    
    return ob;
}());