var bm_ProjectHelper = (function(){

    var fileString = '';

    var ob = {};
    ob.init = init;
    ob.getGradientData = getGradientData;
    ob.end = end;

    function init(){
        fileString = '';
    }

    function end(){
        fileString = '';
    }

    function getProjectData(){
        var proj = app.project;
        var ff = proj.file;
        var demoFile = new File(ff.absoluteURI);
        demoFile.open('r', 'TEXT', '????');
        fileString = demoFile.read(demoFile.length);
    }

    function getGradientData(shapeNavigation, numKeys){
        if(!fileString){
            getProjectData();
        }
        numKeys = numKeys ? numKeys : 1;
        var gradientIndex = 0, navigationIndex = 0;
        var i = 0, len = shapeNavigation.length;
        while(i<len){
            navigationIndex = fileString.indexOf(shapeNavigation[i],navigationIndex);
            i += 1;
        }
        gradientIndex = fileString.indexOf('ADBE Vector Grad Colors',navigationIndex);
        var gradFillIndex = fileString.indexOf('ADBE Vector Graphic - G-Fill',navigationIndex);
        var gradStrokeIndex = fileString.indexOf('ADBE Vector Graphic - G-Stroke',navigationIndex);
        var limitIndex;
        if(gradStrokeIndex !== -1 && gradFillIndex !== -1){
            limitIndex = Math.min(gradFillIndex,gradStrokeIndex);
        } else {
            limitIndex = Math.max(gradFillIndex,gradStrokeIndex);
        }
        if(limitIndex === -1){
            limitIndex = Number.MAX_VALUE;
        }
        //var regEx = /<prop.map>/g;
        var currentKey = 0, keyframes = [], hasOpacity = false, maxOpacities = 0, maxColors = 0;
        while(currentKey < numKeys){
            var gradientData = {};
            gradientIndex = fileString.indexOf('<prop.map',gradientIndex);
            if(gradientIndex > limitIndex || (gradientIndex == -1 && limitIndex == Number.MAX_VALUE)){
                gradientData.c = [[0,1,1,1],[1,0,0,0]];
                maxColors = Math.max(maxColors,2);
            } else {
                var endMatch = '</prop.map>';
                var lastIndex = fileString.indexOf(endMatch,gradientIndex);
                var xmlString = fileString.substr(gradientIndex,lastIndex+endMatch.length-gradientIndex);
                xmlString = xmlString.replace(/\n/g,'');
                var XML_Ob = new XML(xmlString);
                var stops = XML_Ob['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'];
                var colors = XML_Ob['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][1]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'];
                i = 0;
                len = stops.length();
                var opacitiesArr = [],op, floats, nextFloats, midPoint, midPosition;
                while(i<len){
                    floats = stops[i]['prop.list'][0]['prop.pair'][0]['array'][0].float;
                    op = [];
                    op.push(bm_generalUtils.roundNumber(Number(floats[0].toString()),3));
                    op.push(bm_generalUtils.roundNumber(Number(floats[2].toString()),3));
                    if(op[1] !== 1){
                        hasOpacity = true;
                    }
                    opacitiesArr.push(op);
                    midPosition = bm_generalUtils.roundNumber(Number(floats[1].toString()),3);
                    if(i<len-1 /*&& midPosition !== 0.5*/){
                        op = [];
                        nextFloats = stops[i+1]['prop.list'][0]['prop.pair'][0]['array'][0].float;
                        midPoint = Number(floats[0].toString()) + (Number(nextFloats[0].toString())-Number(floats[0].toString()))*midPosition;
                        var midPointValue = Number(floats[2].toString()) + (Number(nextFloats[2].toString())-Number(floats[2].toString()))*0.5;
                        op.push(bm_generalUtils.roundNumber(midPoint,3));
                        op.push(bm_generalUtils.roundNumber(midPointValue,3));
                        opacitiesArr.push(op);
                    }
                    i += 1;
                }
                i = 0;
                len = colors.length();
                var colorsArr = [];
                while(i<len){
                    floats = colors[i]['prop.list'][0]['prop.pair'][0]['array'][0].float;
                    op = [];
                    op.push(bm_generalUtils.roundNumber(Number(floats[0].toString()),3));
                    op.push(bm_generalUtils.roundNumber(Number(floats[2].toString()),3));
                    op.push(bm_generalUtils.roundNumber(Number(floats[3].toString()),3));
                    op.push(bm_generalUtils.roundNumber(Number(floats[4].toString()),3));
                    colorsArr.push(op);
                    midPosition = bm_generalUtils.roundNumber(Number(floats[1].toString()),3);
                    if(i<len-1 /*&& midPosition !== 0.5*/){
                        op = [];
                        nextFloats = colors[i+1]['prop.list'][0]['prop.pair'][0]['array'][0].float;
                        midPoint = Number(floats[0].toString()) + (Number(nextFloats[0].toString())-Number(floats[0].toString()))*midPosition;
                        var midPointValueR = Number(floats[2].toString()) + (Number(nextFloats[2].toString())-Number(floats[2].toString()))*0.5;
                        var midPointValueG = Number(floats[3].toString()) + (Number(nextFloats[3].toString())-Number(floats[3].toString()))*0.5;
                        var midPointValueB = Number(floats[4].toString()) + (Number(nextFloats[4].toString())-Number(floats[4].toString()))*0.5;
                        op.push(bm_generalUtils.roundNumber(midPoint,3));
                        op.push(bm_generalUtils.roundNumber(midPointValueR,3));
                        op.push(bm_generalUtils.roundNumber(midPointValueG,3));
                        op.push(bm_generalUtils.roundNumber(midPointValueB,3));
                        colorsArr.push(op);
                    }
                    i += 1;
                }
                gradientData.c = colorsArr;
                gradientData.o = opacitiesArr;
                maxOpacities = Math.max(maxOpacities,opacitiesArr.length);
                maxColors = Math.max(maxColors,colorsArr.length);
            }

            gradientIndex = lastIndex;

            keyframes.push(gradientData);
            currentKey += 1;
        }
        i = 0;
        var arr, arrayLength,count,lastValue,offsetValue, mergedKeys = [], mergedArr, j;
        while(i<numKeys){
            mergedArr = [];
            if(keyframes[i].c.length < maxColors){
                arr = keyframes[i].c;
                arrayLength = arr.length;
                lastValue = arr[arrayLength - 1];
                offsetValue = lastValue[0];
                count = 0;
                while(arrayLength + count<maxColors){
                    offsetValue -= 0.001;
                    arr.splice(arrayLength-1,0,[offsetValue,lastValue[1],lastValue[2],lastValue[3]]);
                    count += 1;
                }
            }
            for(j=0;j<maxColors;j+=1){
                for(var k = 0; k < 4; k += 1){
                    mergedArr.push(keyframes[i].c[j][k]);
                }
            }
            if(!hasOpacity){
                delete keyframes[i].o;
            } else {
                if(keyframes[i].o.length < maxOpacities){
                    arr = keyframes[i].o;
                    arrayLength = arr.length;
                    lastValue = arr[arrayLength - 1];
                    offsetValue = lastValue[0];
                    count = 0;
                    while(arrayLength + count<maxOpacities){
                        offsetValue -= 0.001;
                        arr.splice(arrayLength-1,0,[offsetValue,lastValue[1],lastValue[2],lastValue[3]]);
                        count += 1;
                    }
                }
                for(j=0;j<maxOpacities;j+=1){
                    for(var k = 0; k < 2; k += 1){
                        mergedArr.push(keyframes[i].o[j][k]);
                    }
                }
            }
            if(numKeys <= 1){
                mergedKeys = mergedArr;
            } else {
                mergedKeys.push(mergedArr);
            }
            i += 1;
        }

        return {
            m:mergedKeys,
            p: maxColors
        };

    }
    
    return ob;
}())