DiaColloDB-WWW

 view release on metacpan or  search on metacpan

share/htdocs/diacollo.js  view on Meta::CPAN

				     "title":"DDC KWIC search for row pairs"
				    });
	    }
	    $(tr).append('<td class="links">'+linkhtml+'</td>');
	});
    }

    //-- setup score colors
    if (true) {
	//-- get min, max score values
	var max;
	$("#profileDataHtml tr:not(:first-child)").find(":nth-child("+(iscore+1)+")").each(function(i,td) {
	    var val = Number($(td).text());
	    if (max==null || Math.abs(val) > max) {
		max = Math.abs(val);
	    }
	});

	//-- insert header
	$("#profileDataHtml tr:first-child").append("<th/>");

	//-- map to colors
	var min = (isAbsDiff || user_query.score == "mi" ? -max : 0);
	var ctitle = (isAbsDiff
		      ? "Color-coded association preference (red:a .. blue:b)"
		      : "Color-coded association preference (red:attract..blue:repel)");
	$("#profileDataHtml tr:not(:first-child)").each(function(i,tr) {
	    $(tr).append('<td title="'+ctitle+'" class="diffColor"><span>&#xa0;</span></td>');
	    var val = Number($(tr).find("td:nth-child("+(iscore+1)+")").text());
	    var  st = $(tr).find(".diffColor span");
	    var  sz = st.height()+"px";
	    st.css({"background-color":heatcolorv(val, min, max), width:sz, height:sz});
	});
    }

    //-- jump to fragment if specified
    var fragment = locFragment(window.location);
    if (fragment != "") {
	window.location.hash = '';
	window.location.hash = '#'+fragment;
    }
}

//----------------------------------------------------------------------
function dcpFormatGMotion(data, jqXHR) {
    //-- parse data
    data  = $.parseJSON(data);
    qinfo = data.qinfo;
    setupDebugTable(qinfo);
    if (data.profiles.length == 0) {
	dcpErrorMsg("Error: no data to display!");
	return;
    }

    //-- setup plot area
    $(".rawURL").hide();
    $("#profileDataChart").addClass("gmChart").fadeIn();

    //-- setup chart data
    var cstate = '{}'; //-- chart state
    var cdata  = new google.visualization.DataTable();
    cdata.addColumn('string', data.titles.join('/')); //-- 1st column must be item type
    cdata.addColumn('number', 'year');                //-- 2nd column must be date ('number' => year)

    if (isDiff) {
	//-- motion chart: diff
	cdata.addColumn('number', 'ascore');
	cdata.addColumn('number', 'bscore');
	cdata.addColumn('number', 'diff');
	data.profiles.forEach(function(p) {
	    var year   = Number(String(p.label).replace(/^0-/,'').replace(/-.*$/,''));
	    var scoref = p.score;
	    for (var key in p[scoref]) {
		var item = key.replace(/\t/g,'/');
		cdata.addRow([item, year, p.prf1[scoref][key], p.prf2[scoref][key], p[scoref][key]]);
	    }
	});
	cstate = '{"showTrails":false}';
    }
    else {
	//-- motion chart: profile
	cdata.addColumn('number', 'f2');
	cdata.addColumn('number', 'f12');
	cdata.addColumn('number', 'score');
	data.profiles.forEach(function(p) {
	    var year   = Number(p.label);
	    var scoref = p.score;
	    for (var key in p[scoref]) {
		var item = key.replace(/\t/g,'/');
		cdata.addRow([item, year, p.f2[key], p.f12[key], p[scoref][key]]);
	    }
	});
	cstate = '{"showTrails":false,"xLambda":0,"yLambda":0}';
    }
    //-- plot the chart
    var chart = new google.visualization.MotionChart(document.getElementById('profileDataChart'));
    chart.draw(cdata, {width:600, height:480, state:cstate});
}

//----------------------------------------------------------------------
var hitem2key = {};
function dcpFormatHiChart(data, jqXHR) {
    //-- parse data
    //data  = $.parseJSON(data);
    //qinfo = data.qinfo;

    if ( !(data = dcpParseFlat(data,{mode:"bubble"})) ) { return; }
    if (data.profiles.length == 0) {
	dcpErrorMsg("Error: no data to display!");
	return;
    }
    dcpStatusMsg("loading","Rendering...");

    //-- hichart: enable "download" icon
    $("#d3icons > a").hide();
    $("#profileDataD3, #d3icons, #exportBtn").fadeIn();

    //-- setup plot data
    var cdata = { //-- chart data
	chart: {
            type: (user_query.debug ? 'line' : 'spline'),
	    zoomType: 'x'
        },
	credits: {
	    enabled: false
	},
	title: {
	    text:"DiaCollo Profile"+(isDiff ? " Diff" : "")
	    
	},
	subtitle: {
            text: (isDiff ? (chartTitleString('',1)+' - '+chartTitleString('b',1)) : chartTitleString())
        },
	xAxis: {
	    title: { text: 'Date (slice)' },
	},
	yAxis: {
            title: { text: 'Score'+(isDiff ? (' Diff ('+user_query.diff+')') : '')+' ('+scoreNames[user_query.score]+')' }
        },
	legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle',
            borderWidth: 0,
	    padding: 5
	    //,itemStyle: { "color": "#333333", "cursor": "pointer", "fontSize": "12px", "fontWeight": "normal" }
        },
	plotOptions: {
	    series: {
                cursor: 'pointer',
                point: {
                    events: {
			click: function (e) {
			    dcur  = dlabels.indexOf(String(this.label).replace(/\./g,"-"));
			    var idata = items[ itemid[this.series.name.replace(/\//g,"\t")] ];
			    var dopts = {};
			    if (!$("#profileDataPopup").is(":visible")) {
				dopts.position = {at:"center", of:e}
			    }
			    d3InfoPopup(idata, dopts);
			}
                    }
                },
                marker: {
                    lineWidth: 1
                }
            }
        },
	series: []
    };

    //-- create hicharts series
    var item, di, score;
    items.forEach(function(item) {
	item.hiseries = { name:item.label, data:[] };
	for (var di in dlabels) {
	    score = item.score[di];
	    item.hiseries.data.push({x:Number(String(dlabels[di]).replace(/-/g,".")), y:(score==null ? null : score), label:dlabels[di]});
	}
	cdata.series.push(item.hiseries);
    });

    //-- setup plot area 
    $(".rawURL").hide();
    $("#profileDataChart").addClass("hcParent").show();

    //-- plot the chart
    $("#profileDataChart").addClass("hcChart").highcharts(cdata).show();
    dcpClearMsg();
}

//----------------------------------------------------------------------
// str = chartTitleString(prefix,parens)
function chartTitleString(prefix,parens) {
    if (prefix==null) { prefix = ''; }
    var q = user_query[prefix+'query'];

    var title = q;
    /*
    var d = user_query[prefix+'date'];
    if (d != null && d != '') {
	title += ' ['+d.replace(/:/,'-')+']';
    }
    var s = user_query[prefix+'slice'];
    if (s != null && s != '') {
	title += ' /'+s;
    }
    */
    return Boolean(parens) ? ('('+title+')') : title;
}


//----------------------------------------------------------------------
// d3: common variables & utilities

var dforce, dcloud, dcur, dsnapto, dkeys, dlabels, itemid, items;
var dcpScoreRange; //-- [minScore,maxScore]
var dcpValueNull;  //-- null value
var dcpSizeRange;  //-- [minSize,maxSize]
var dcpItemSize;   //-- interpolating accessor for item size (cloud:font-size, bubble:radius)
var d3InfoCur;     //-- currently selected info-popup data

var brushInterp;  //-- function variable for brush interpolation
var brushSnap;    //-- function variable for brush snap

// data = dcpParseFlat(dataStr,opts)
//  + parses profile data into flat d3-friendly format
//  + returns true on success; sets $("#status .msg").text() and returns false on error
//  + sets globals:
//     qinfo   = data.qinfo
//     dkeys   = [$date0,...]  (slice key-strings, raw,     e.g. "1900-1900" or "0-1750")
//     dlabels = [$date0,...]  (slice key-strings, trimmed, e.g. "1900"      or   "1750")
//     items   = [$itemData0,...]
//     itemid  = {$itemKey0:$itemId0, ...}
//     dcur    = $currentSliceIndex  //-- may be fractional if inbetween slices
//     dcpScoreRange = [min,max]
//     dcpSizeRange  = [min,max]
//     dcpItemSize = function(d,dcur) { ... }
//     dcpDateInterp = function(dcur) { ... }
//  + where items[itemId] =
//     item    = {id:$itemId, item:$itemKey, label:$itemLabel, score:[...], value:[...], avalue:[...], sizes:[...], opacity:[...], maxSize:maxSize?}
//  + array-valued item data keys are indexed by dlabels[] index
//  + calls setupDebugTable() after parsing qinfo()
//  + options:
//     mode: MODE,   //-- parse mode (known values: "bubble", "cloud")
var d3data = null;
function dcpParseFlat(data,opts) {
    //-- status message



( run in 0.892 second using v1.01-cache-2.11-cpan-ceb78f64989 )