var SVGDocument = null; var SVGRoot = null; var SVGViewBox = null; var svgns = 'www.w3.org/2000/svg'; var xlinkns = 'www.w3.org/1999/xlink'; var toolTip = null; var TrueCoords = null; var tipBox = null; var tipText = null; var tipTitle = null; var tipDesc = null; var ajaxPE = null; var lastElement = null; var titleText = ''; var titleDesc = '';
function OpacityDown(mouseover_evt) {
var obj=mouseover_evt.target; obj.style.setProperty("opacity","0.5","");
}
function OpacityUp(mouseout_evt) {
var obj=mouseout_evt.target; obj.style.setProperty("opacity","1.0","");
}
function GerbilNavigate() {
window.top.location='/dashboard/show';
}
function parseXMLFromString(text) {
if (typeof DOMParser != "undefined") { // Mozilla, Firefox, and related browsers return (new DOMParser()).parseFromString(text, "application/xml"); } else if (typeof ActiveXObject != "undefined") { // Internet Explorer. var xmlDOM = new ActiveXObject("Microsoft.XMLDOM"); var doc = xmlDOM.newDocument(); doc.loadXML(text); return doc.documentElement; } return null;
}
function TestUpdates1(evt) {
var tnode=SVGDocument.getElementById("graphtitle"); tnode.firstChild.nodeValue="Changed by Ajax2";
}
// Switch between detailed and mini legend panels function showMiniLegend() {
var l_hide = SVGDocument.getElementById("legendpanel_detail"); if (l_hide) { l_hide.setAttributeNS(null, 'visibility', 'hidden'); } var l_show = SVGDocument.getElementById("legendpanel_mini"); if (l_show) { l_show.setAttributeNS(null, 'visibility', 'visible'); }
}
// Switch between detailed and mini legend panels function showDetailedLegend() {
var l_hide = SVGDocument.getElementById("legendpanel_mini"); if (l_hide) { l_hide.setAttributeNS(null, 'visibility', 'hidden'); } var l_show = SVGDocument.getElementById("legendpanel_detail"); if (l_show) { l_show.setAttributeNS(null, 'visibility', 'visible'); }
}
// The chart needs to fill in the following options // axurl , response will either do noop/full/delta replacement function SvgAjaxUpdate() {
var gerbilAjaxBlock=SVGDocument.getElementById("GerbilAjaxBlock"); var gerbilAjaxOptions=SVGDocument.getElementById("GerbilAjaxOptions"); var gerbilAjaxContext=SVGDocument.getElementById("GerbilAjaxContext"); // extract the URL & other ajax options from the Gerbil Ajax Block var url = gerbilAjaxOptions.attributes.getNamedItem('axurl').nodeValue; var freq = gerbilAjaxOptions.attributes.getNamedItem('axfrequency').nodeValue; var decay = gerbilAjaxOptions.attributes.getNamedItem('axdecay').nodeValue; // return the entire ajax context in request var aa = $A(gerbilAjaxContext.attributes); var hContext = $H(); aa.each(function (at){ hContext[at.localName]=at.nodeValue; }); hContext.unset('_object'); // console.log ("URL = "+ url ); new Ajax.Request(url, { method: 'post', parameters: { 'resource': hContext['resource'] }, onSuccess: function(transport) { updateSVG(transport.responseXML) } });
} // For WebTrisul 1.0, we don't yet support delta replace, // full replace seems to be fast enough (caching on server side) function updateSVG(node) {
var cmd = ''; cmd = node.documentElement.getAttribute("command") if (cmd == "noop") { // do nothing (we got a noop ajax response) } else if (cmd=="full_replace") { // replace the old node with the new one var newnode = node.documentElement.childNodes[1]; var currnode = SVGDocument.getElementById('GerbilSVGGraph'); var par = currnode.parentNode; var newLayer = SVGDocument.importNode(newnode,true); par.appendChild(newLayer); par.removeChild(currnode); // move tooltip to top of rendering stack par.removeChild(toolTip); par.appendChild(toolTip); } else if (cmd=="delta_replace") { // delta svg replace not yet supported }
}
// releases any server side ajax resources held by this document function Uninit(evt) {
var gerbilAjaxContext=SVGDocument.getElementById("GerbilAjaxContext"); if (gerbilAjaxContext!=null) { var aa = $A(gerbilAjaxContext.attributes); var hContext = $H(); aa.each(function (at){ hContext[at.localName]=at.nodeValue; }); // console.log ("URL = "+ url ); new Ajax.Request("/axupdate/gerbilUnload", { method: 'post', parameters: { 'resource': hContext['resource'] }, }); }
}
function Init(evt) {
SVGDocument = evt.target.ownerDocument; SVGRoot = SVGDocument.documentElement; TrueCoords = SVGRoot.createSVGPoint(); toolTip = SVGDocument.getElementById('ToolTip'); tipBox = SVGDocument.getElementById('tipbox'); tipText = SVGDocument.getElementById('tipText'); tipTitle = SVGDocument.getElementById('tipTitle'); tipDesc = SVGDocument.getElementById('tipDesc'); //window.status = (TrueCoords); //create event for object SVGRoot.addEventListener('mousemove', ShowTooltip, false); SVGRoot.addEventListener('mouseout', HideTooltip, false); // periodical executor var gerbilAjaxOptions=SVGDocument.getElementById("GerbilAjaxOptions"); if (gerbilAjaxOptions!=null) { var ajaxInterval = gerbilAjaxOptions.getAttribute('axfrequency'); ajaxPE = new PeriodicalExecuter(SvgAjaxUpdate,parseInt(ajaxInterval)); // for Adobe SVG later // setTimeout("SvgAjaxUpdate()",parseInt(ajaxInterval)); }
};
function GetTrueCoords(evt) {
// zoom / pan adjustment var newScale = SVGRoot.currentScale; var translation = SVGRoot.currentTranslate; TrueCoords.x = (evt.clientX - translation.x)/newScale; TrueCoords.y = (evt.clientY - translation.y)/newScale;
};
function HideTooltip( evt ) {
toolTip.setAttributeNS(null, 'visibility', 'hidden');
};
function ShowTooltip( evt ) {
// bail out early, if same target var targetElement = evt.target; if ( lastElement == targetElement ) { return } // bail out early, if no 'gerbiltooltipX' tags // tooltip1 is the heading (appears in bold face) // tooltip2 is the tip text var tooltip1 = ''; var tooltip2 = ''; tooltip1 = targetElement.getAttributeNS(null, 'gerbiltooltip1'); tooltip2 = targetElement.getAttributeNS(null, 'gerbiltooltip2'); if (tooltip1=='' && tooltip2 == '') { return; } // Positon the tooltip box relative to the mouse pos GetTrueCoords( evt ); var tipScale = 1/SVGRoot.currentScale; var textWidth = 0; var tspanWidth = 0; var boxHeight = 20; tipBox.setAttributeNS(null, 'transform', 'scale(' + tipScale + ',' + tipScale + ')' ); tipText.setAttributeNS(null, 'transform', 'scale(' + tipScale + ',' + tipScale + ')' ); // Values for tooltip text tipTitle.firstChild.nodeValue = tooltip1; tipTitle.setAttributeNS(null, 'display', 'inline' ); tipDesc.firstChild.nodeValue = tooltip2; tipDesc.setAttributeNS(null, 'display', 'inline' ); // Box size var outline = tipText.getBBox(); tipBox.setAttributeNS(null, 'width', Number(outline.width) + 10); tipBox.setAttributeNS(null, 'height', Number(outline.height)); // Update position (keep tooltip inside client area ! ) var yPos = TrueCoords.y + (10 * tipScale); if (yPos+Number(outline.height)>SVGRoot.height.baseVal.value) { yPos = SVGRoot.height.baseVal.value - Number(outline.height) } var xPos = TrueCoords.x + (10 * tipScale); if (xPos+Number(outline.width)>SVGRoot.width.baseVal.value) { xPos = SVGRoot.width.baseVal.value - Number(outline.width) } toolTip.setAttributeNS(null, 'transform', 'translate(' + xPos + ',' + yPos + ')'); toolTip.setAttributeNS(null, 'visibility', 'visible');
}
////////////////////////////////////// // Tracker - for SVG var fTracking=0; var nTrackBegin=0; var nTrackEnd=0; var nTrackCurrent=0; var pGTrackingRect=null;
var pTrackingRect=null; var pTrackFromTS=null; var nTrackScale=0; var pTrackTextFromTS=null; var pTrackTextInterval=null; var pTrackerData=null;
function TrackerMouseDown( evt ) {
fTracking=1; nTrackBegin=evt.clientX; nTrackCurrent=evt.clientX; SVGDocument = evt.target.ownerDocument; pGTrackingRect= SVGDocument.getElementById('gtrackerrect'); pTrackingRect= SVGDocument.getElementById('trackerrect'); pTrackingRect.setAttributeNS(null,"x",nTrackCurrent); pTrackingRect.setAttributeNS(null,"width",1); pTrackingText= SVGDocument.getElementById('gtrackertext'); pTrackingText.setAttributeNS(null,"transform","translate(" + nTrackBegin + ',' + 150 + ')'); // compute begin state pTrackerData = SVGDocument.getElementById('gtrackerdata'); nTrackScale = parseInt(pTrackerData.getAttributeNS(null,"gerb_scale")); var from_secs = parseInt(pTrackerData.getAttributeNS(null,"gerb_fromts")); // clicked to time delta var xbegin = parseInt(SVGDocument.getElementById('trackerpanel').getAttributeNS(null,"x")); pTrackFromTS = new Date(); pTrackFromTS.setTime(1000* (from_secs + (nTrackBegin-xbegin)*nTrackScale)); // text svg elements pTrackTextFromTS=SVGDocument.getElementById('trackertextfromts'); pTrackTextInterval=SVGDocument.getElementById('trackertextinterval'); // visibility off (move 5-10 pixels to turn it on) pGTrackingRect.setAttributeNS(null,"visibility","hidden"); pTrackingText.setAttributeNS(null,"visibility","hidden");
}
function TrackerMouseMove(evt) {
if (fTracking==2 && evt.clientX > nTrackBegin) { var delta = nTrackCurrent-nTrackBegin; var mid = nTrackBegin+(delta)/2; nTrackCurrent=evt.clientX; pTrackingRect.setAttributeNS(null,"width",delta); pTrackingText.setAttributeNS(null,"transform","translate(" + mid + ')'); // text box var szwin = FormatSecs(delta*nTrackScale) var szbegin = "Starting : " + pTrackFromTS.toLocaleString(); pTrackTextInterval.firstChild.nodeValue = szwin; pTrackTextFromTS.firstChild.nodeValue = szbegin; } else if (fTracking==1 && (evt.clientX-nTrackBegin) > 5 ) { // we need to move atleast 5 pixels to turn on tracking fTracking=2; // visibility on pGTrackingRect.setAttributeNS(null,"visibility","visible"); pTrackingText.setAttributeNS(null,"visibility","visible"); }
} function TrackerMouseUp(evt) {
if (fTracking==2) { pTrackingRect=null; nTrackEnd=evt.clientX; pTrackerData.setAttributeNS(null,"gerb_selsecs",(nTrackEnd-nTrackBegin)*nTrackScale); pTrackerData.setAttributeNS(null,"gerb_selts", pTrackFromTS.getTime()/1000); } fTracking=0;
}
function FormatSecs(secs) {
if (secs>86400) { return "" + Math.floor(secs/86400) + " Days" + Math.floor((secs%86400)/3600) + " Hrs" + Math.round((secs%3600)/60) + " Mins"; } else if (secs>3600) { return "" + Math.floor(secs/3600) + " Hrs " + Math.round((secs%3600)/60) + " Mins"; } else if (secs>60) { return "" + Math.floor(secs/60) + " Mins " + secs%60 + " Secs"; } return "" + secs + " Secs";
}