Raw File
Util.js
define( "ScreenShotPlugin/Util", [
    'dojo/_base/declare',
    'dojo/_base/array',
    'dojo/json'
    ],
function (
    declare,
    array,
    json
) {
var Util;
Util = {
    encode: function(inputs){
    // returns string with encode options for screenshot
        var gInputs = inputs.general;
        var tInputs = inputs.tracks;
        //console.log(tInputs);
        return this._encodeGeneralSettings(gInputs) + this._endcodeTrackSettings(tInputs);
    },

    encodePhantomJSSettings: function(params){
        // params include url, format, height, width, zoom
        // ?request={url:"http://www.highcharts.com/demo/pie-donut",renderType:"jpg",renderSettings:{zoomFactor:2,viewport:{width:100,height:500}}}
        var outDict = {url: params.url, renderType: params.format.value, renderSettings: {
            zoomFactor: params.zoom.value, viewport: {width:params.width.value, height: params.height.value}}};
        var outString = json.stringify(outDict);
        outString = outString.replace(/\"([^(\")"]+)\":/g,"$1:");
        return '?request='+outString;
    },

    decode: function(inStr, tracks){
    // returns javascript object to be applied
        // split inStr
        var opts = inStr.split('~');
        var trackList = tracks.split(',')
        var gSettings = this._decodeGeneralSettings(opts[0])
        var tSettings = this._decodeTrackSettings(opts.slice(1), trackList);
        //console.log(tSettings);
        return {general:gSettings, tracks:tSettings};
    },

    _encodeGeneralSettings: function(params){
        // locOver, menu, methylation, nav, trackList, trackSpacing, labels, zoom
        var output = '';
        var eLabels = { zoom:'z', trackSpacing:'p', locOver: 'o', trackList:'r', nav:'n', menu:'u', labels:'b', methylation:'m'};
        var param;
        for(param in params){
            var data = params[param];
            if(param==='methylation')
                output += eLabels[param] + this._encodeBoolean(data.CG) + this._encodeBoolean(data.CHG) + this._encodeBoolean(data.CHH);
            else if((param==='zoom')||(param==='trackSpacing'))
                output += eLabels[param] + data.value;
            else
                output += eLabels[param] + this._encodeBoolean(data.value);
        }
        return output;
    },

    _endcodeTrackSettings: function(tracks){
        var output = '';
        // go through object
        var t, params;
        for(t in tracks){
            params = tracks[t];
            // if we need to encode params
            if (params.hasOwnProperty('opts') === false){
                output += this._encodeTrack(params);
            }
        }
        return(output);
    },

    _encodeTrack: function(params){
        // q[0|1] quantitative, y[0|1|2|3] yscale none, center, left, right
        // h# track height, i# min, x# max
        // d[0|1|2] display mode normal, compact, collapse
        // f[0|1|2] display style default, features, histograms
        var eLabels = {height: 'h', min: 'i', max: 'x', quant: 'q', ypos: 'y', mode: 'd', style: 'f'};
        var optsDict = {ypos:{'none': 0, 'center': 1, 'left': 2, 'right':3 },
                        mode: {'normal':0,'compact':1,'collapsed':2},
                        style: {'default':0,'features':1,'histograms':2}};
        var param, data;

        var output = '~' + params.trackNum;
        // loop through parameters
        for(param in params){
            data = params[param];
            if(param==='quant')
                output += eLabels[param] + this._encodeBoolean(data);
            else if(!(data === undefined || data.value === undefined || eLabels.hasOwnProperty(param)===false )){
                output += eLabels[param]
                // ypos, mode, style
                if (param in {ypos:1, mode:1, style:1})
                    output +=  optsDict[param][data.value];
                else
                    output += data.value;
            }
        } // end param
        return(output)
    },

    _encodeBoolean: function(input){
        return (input ? '1' : '0');
    },

    _decodeBoolen: function(input){
        return(input==='1' ? true : false)
    },

    _decodeGeneralSettings: function (input){
        var outProp = {basic:{}, view:{},methylation:{}};
        // zoom
        var resultZ = /z([0-9]+)/gi.exec(input);
        if (resultZ != null)
            outProp.basic['highResolutionMode'] = parseInt(resultZ[1]);
        // overview
        var resultO = /o([0-1])/gi.exec(input);
        if (resultO != null)
            outProp.basic['show_overview'] = this._decodeBoolen(resultO[1]);
        // tracklist
        var resultR = /r([0-1])/gi.exec(input);
        if (resultR != null)
            outProp.basic['show_tracklist'] = this._decodeBoolen(resultR[1]);
        // navigation
        var resultN = /n([0-1])/gi.exec(input);
        if (resultN != null)
            outProp.basic['show_nav'] = this._decodeBoolen(resultN[1]);
        // menu
        var resultU = /u([0-1])/gi.exec(input);
        if (resultU != null)
            outProp.basic['show_menu'] = this._decodeBoolen(resultU[1]);
        // labels
        var resultB = /b([0-1])/gi.exec(input);
        if (resultB != null)
            outProp.basic['show_tracklabels'] = this._decodeBoolen(resultB[1]);

        // track padding
        var resultP = /p([0-9]+)/gi.exec(input);
        if (resultP != null)
            outProp.view['trackPadding'] = parseInt(resultP[1]);
        // methylation
        var resultM = /m([0-9]+)/gi.exec(input);
        if (resultM != null){
            outProp.methylation['CG'] = this._decodeBoolen(resultM[1].substring(0,1));
            outProp.methylation['CHG'] = this._decodeBoolen(resultM[1].substring(1,2));
            outProp.methylation['CHH'] = this._decodeBoolen(resultM[1].substring(2,3));
        }
        return outProp;
    },

    _decodeTrackSettings: function(input, trackLabels){
        var thisB = this;
        // input and trackLabels are both arrays -- iterate through input
        var out = {};
        array.forEach(input, function(parmStr){
            var resultT = /^[0-9]+/.exec(parmStr);
            if( resultT === null)
                return;
            var tInt = parseInt(resultT[0]);
            var tLabel = trackLabels[tInt];
            parmStr = parmStr.slice(1);
            out[tLabel] = {};
            var isQuant = null;
            // get quant
            var resultQ = /q([0-1])/gi.exec(parmStr);
            if (resultQ != null){
                isQuant = thisB._decodeBoolen(resultQ[1]);
                if(isQuant)
                    out[tLabel]['style'] = {};
                else
                    out[tLabel]['histograms'] = {}

            }
            // get min
            var resultI = /i(-?[0-9]+(\.[0-9])?)/gi.exec(parmStr);
            //console.log(resultI);
            if (resultI != null){
            var min = parseFloat(resultI[1]);
                if(isQuant)
                    out[tLabel]['min_score'] = min;
                else
                    out[tLabel]['histograms']['min'] = min;
            }
            // get max
            var resultX = /x(-?[0-9]+(\.[0-9])?)/gi.exec(parmStr);
            //console.log(resultX);
            if (resultX != null){
            var max = parseFloat(resultX[1]);
                if(isQuant)
                    out[tLabel]['max_score'] = max;
                else
                    out[tLabel]['histograms']['max'] = max;
            }
            // get height
            var resultH = /h([0-9]+)/gi.exec(parmStr);
            //console.log(resultH);
            if (resultH != null){
                var height = parseInt(resultH[1]);
                if(isQuant)
                    out[tLabel]['style']['height'] = height;
                else if(isQuant === false){
                    out[tLabel]['maxHeight'] = height;
                    out[tLabel]['histograms']['height'] = height;
                } else {
                    out[tLabel]['maxHeight'] = height;
                }
            }
            // get ypos
            var resultY = /y([0-3])/gi.exec(parmStr);
            //console.log(resultY);
            if (resultY != null){
                var locList = ['none','center','left','right'];
                var yposI = parseInt(resultY[1]);
                out[tLabel]['yScalePosition'] = locList[yposI];
            }
            // get mode
            var resultD = /d([0-2])/gi.exec(parmStr);
            //console.log(resultY);
            if (resultD != null){
                var modeList = ['normal','compact','collapsed'];
                var modeI = parseInt(resultD[1]);
                out[tLabel]['displayMode'] = modeList[modeI];
            }
            // get style
            var resultF = /f([0-2])/gi.exec(parmStr);
            //console.log(resultY);
            if (resultF != null){
                var styleList = ['default','features','histograms'];
                var styleI = parseInt(resultF[1]);
                out[tLabel]['displayStyle'] = styleList[styleI];
            }
        });
        return out;
    }

}
    return Util
});
back to top