Best JavaScript code snippet using playwright-internal
graph.js
Source:graph.js  
1if (!window.Graph)2(function(window) {3var DRAG_CURSOR = 'pointer',4  DRAG2_CURSOR = 'pointer';5var document = window.document;6// Date utils7var MINUTE = 60, HOUR = 60 * MINUTE, DAY = 24 * HOUR, MONTH = 28 * DAY, YEAR = 365 * DAY, MAXSCALE = 2 * DAY + HOUR;8var xscales = [9  {base: HOUR, format: ['hour'], sub: -1},10  {base: 2 * HOUR, format: ['hour'], sub: HOUR},11  {base: 3 * HOUR, format: ['hour'], sub: HOUR},12  {base: 6 * HOUR, format: ['dayHour'], sub: HOUR},13  {base: 8 * HOUR, format: ['dayHour'], sub: HOUR},14  {base: 12 * HOUR, format: ['dayHour'], sub: HOUR},15  {base: DAY, format: ['dayFull', 'day'], sub: -1},16  {base: 2 * DAY, format: ['dayFull', 'day'], sub: DAY},17  {base: 3 * DAY, format: ['dayFull', 'day'], sub: DAY},18  {base: 4 * DAY, format: ['dayFull', 'day'], sub: DAY},19  {base: MONTH, format: ['monthFull', 'month'], sub: -1},20  {base: 2 * MONTH, format: ['monthFull', 'month'], sub: MONTH},21  {base: 3 * MONTH, format: ['monthFull', 'month'], sub: MONTH},22  {base: 4 * MONTH, format: ['monthFull', 'month'], sub: MONTH},23  {base: 6 * MONTH, format: ['monthFull', 'month'], sub: MONTH},24  {base: YEAR, format: ['yearFull'], sub: -1}]; // using 'year' ('00, '01, '02...) seems a bad idea25var DEF_TIME = Math.round((new Date()).getTime() / 1000);26var dateFormats = {27  hour: "{hour}:00",28  day: getLang('stats_day_mon').split("{month}").join("{dayMonth}"),29  dayFull: getLang('stats_day_mon').split("{month}").join("{dayMonth}"),30  dayFullYear: getLang('stats_day_month_year').split("{month}").join("{dayMonth}"),31  dayHour: getLang('graph_day_fullmon_year_hour'),32  dayHourMin: getLang('graph_day_fullmon_year_hour_min'),33  month: "{shortMonth}'{shortYear}",34  monthFull: "{month}'{shortYear}",35  year: "'{shortYear}",36  yearFull: "{year}"37};38var colors = [0x597da3, 0xb05c91, 0x4d9fab, 0x569567, 0xac4c4c, 0xc9c255, 0xcd9f4d, 0x876db3,39              0x6f9fc4, 0xc77bb1, 0x70c5c8, 0x80bb88, 0xce5e5e, 0xe8e282, 0xedb24a, 0xae97d3,40              0x6391bc, 0xc77bb1, 0x62b1bc, 0x80bb88, 0xb75454, 0xc9c255, 0xdca94f, 0x997fc4,41              0x85afd0, 0xc77bb1, 0x8ecfce, 0x80bb88, 0xe47070, 0xc9c255, 0xf7be5a, 0xbeaadf];42var globalTouchCount = 0;43function fullDate(time, params) {44  var fmt = (params && params.show_time) ? ((params.show_minutes) ? 'dayHourMin' : 'dayHour') : 'dayFullYear';45  return formatDate(time, fmt);46}47function formatDate(time, format) {48  if (time == -1) {49    var h = (format == 'dayHour' ? '0' : '88'), m = '88', d = '88',50      mmmm = 'Mmmmmmmm', mmmm2 = 'Mmmmmmmm', mmm = 'mmm', mmm2 = 'mmm', yyyy = '88888', yy = '.88';51  } else {52    var date = new Date(time * 1000);53    var h = date.getHours(), m = date.getMinutes().toString();54    var h12 = h % 12;55    if (h12 == 0) h12 = 12;56    var am_pm = h < 12 ? 'AM':'PM';57    h = h.toString();58    if (m.length == 1) m = '0' + m;59    var d = date.getDate().toString(),60    mmmm = getLang('Month' + (date.getMonth() + 1) + '_of'), mmmm2 = getLang('Month' + (date.getMonth() + 1)),61    mmm = mmmm.substr(0, 3).toLowerCase(), mmm2 = mmmm2.substr(0, 3).toLowerCase(),62    yyyy = date.getFullYear().toString(), yy = yyyy.substr(2);63  }64  var fmt = dateFormats[format];65  return fmt.split('{month}').join(mmmm2).66    split('{shortMonth}').join(mmm2).67    split('{shortYear}').join(yy).68    split('{year}').join(yyyy).69    split('{day}').join(d).70    split('{dayMonth}').join(mmmm).71    split('{shortDayMonth}').join(mmm).72    split('{hour}').join(h).73    split('{hour12}').join(h12).74    split('{min}').join(m).75    split('{am/pm}').join(am_pm);76}77function incDate(time, step, inc) {78  var date = new Date(time * 1000);79  if (step >= YEAR) {80    var count = step / YEAR;81    date = new Date((Math.floor(date.getFullYear() / count) + inc) * count, 0, 1, 0, 0);82    return Math.floor(date.getTime() / 1000);83  } else84  if (step < YEAR && step >= MONTH) {85    var count = step / MONTH;86    date = new Date(date.getFullYear(), (Math.floor(date.getMonth() / count) + inc) * count, 1, 0, 0);87    return Math.floor(date.getTime() / 1000);88  } else89  if (step < MONTH) {90    var tz = date.getTimezoneOffset() * 60;91    return Math.floor((time - tz) / step + inc) * step + tz;92  }93}94// Other utils95function addEventEx(graph, element, event, listener) {96  element.graph = graph;97  addEvent(element, event, listener);98}99function removeEventEx(element, event, listener) {100  removeData(element, "graph");101  removeEvent(element, event, listener);102}103function prepareEvent(event, pass) {104  if (event.touches) {105    if (event.touches.length > 1 || globalTouchCount > 1) {106      event.currentTarget.graph.endDrag();107      return false;108    } else {109      if (!pass) cancelEvent(event);110      return event.touches[0];111    }112  }113  cancelEvent(event);114  return event;115}116function getContext(e) {117  var ctx = e.getContext("2d");118  if (!ctx) return ctx;119  if (!ctx.measureText || !ctx.measureText(getLang('Month1')))120    return null;121  return ctx;122}123function getFirstControlPoints(rhs) {124  var n = rhs.length, x = [], tmp = [], b = 2.0;125  x[0] = rhs[0] / b;126  for (var i = 1; i < n; i++) {127    tmp[i] = 1 / b;128    b = (i < n - 1 ? 4.0 : 3.5) - tmp[i];129    x[i] = (rhs[i] - x[i - 1]) / b;130  }131  for (var i = 1; i < n; i++)132    x[n - i - 1] -= tmp[n - i] * x[n - i];133  return x;134}135function getYStep(maxValue, intScale) {136  var step = Math.pow(10, Math.floor(Math.LOG10E * Math.log(maxValue)));137  if (maxValue / step <= 2)138    step /= 4.0; else139  if (maxValue / step <= 4)140    step /= 2.0;141  if (intScale) {142    step = Math.max(step, 1);143    if (step == 2.5) {144      step = 2;145    }146  }147  return step;148}149function formatValue(value) { // something like -10 000 000.000001150  var sgn = (value < 0) ? '-' : '';151  value = Math.abs(value);152  var intv = Math.floor(value), fltv = value - intv;153  fltv = Math.round(fltv * 100000.0) / 100000.0;154  var res = '';155  while (intv > 0) {156    var q = (intv % 1000).toString();157    res = (intv > 999 ? '000'.substr(0, 3 - q.length) : '') + q + (res == '' ? '' : ' ') + res;158    intv = Math.floor(intv / 1000);159  }160  if (res == '') res = '0';161  if (fltv > 0) res += fltv.toString().substr(1);162  return sgn + res;163}164function drawCheck(e, color, color2, checked, over) {165  var ctx = getContext(e);166  ctx.clearRect(0, 0, 20, 20);167  if (checked) { // shadow168    ctx.lineWidth = 2;169    ctx.strokeStyle = color2;170    ctx.beginPath();171    ctx.moveTo(6.5, 11);172    ctx.lineTo(9.5, 14);173    ctx.lineTo(17.5, 6);174    ctx.stroke();175  }176  if (over) {177    ctx.fillStyle = color2;178    ctx.fillRect(3, 3, 14, 14);179  }180  ctx.lineWidth = 1;181  ctx.strokeStyle = color;182  ctx.strokeRect(3.5, 3.5, 13, 13);183  if (checked) {184    ctx.lineWidth = 2;185    ctx.beginPath();186    ctx.moveTo(6.5, 10);187    ctx.lineTo(9.5, 13);188    ctx.lineTo(17.5, 5);189    ctx.stroke();190  }191}192function drawLines(ctx, x, y, w, h, lines, stTime, enTime, xfactor, yfactor, yDelta, zoomedOut, active, smooth) {193  smooth = (!zoomedOut) && smooth;194  var stIdxs = [], enIdxs = [], _lines = [];195  for (var l = 0; l < lines.length + (active ? 1 : 0); l++) {196    var line = (l < lines.length) ? (active != lines[l] ? lines[l] : null) : active;197    if (line && line.shown) {198      var stIdx = 0, enIdx = line.d.length - 1;199      while ((stIdx < line.d.length - 2) && (line.d[stIdx + 2].x < stTime)) stIdx++;200      while ((enIdx > 2) && (line.d[enIdx - 2].x > enTime)) enIdx--;201      if (enIdx - stIdx > w / 5) // dots overload202        smooth = false;203      if (enIdx >= stIdx && (line.d[enIdx].x >= stTime) && (line.d[stIdx].x <= enTime)) {204        _lines.push(line);205	      stIdxs.push(stIdx);206        enIdxs.push(enIdx);207	    }208    }209  }210  lines = _lines;211  for (var l = 0; l < lines.length; l++) {212    var stIdx = stIdxs[l], enIdx = enIdxs[l], ps = lines[l].d;213    if (smooth && (enIdx - stIdx + 1 > 2)) {214    var knots = [], n = 0;215    for (var i = stIdx; i <= enIdx; i++) {216      knots[n] = {X: x + (ps[i].x - stTime) * xfactor, Y: y + h - (ps[i].y + yDelta) * yfactor};217      n++;218    }219    n--;220    var rhs = [];221    for (var i = 1; i < n - 1; ++i)222      rhs[i] = 4 * knots[i].X + 2 * knots[i + 1].X;223    rhs[0] = knots[0].X + 2 * knots[1].X;224    rhs[n - 1] = (8 * knots[n - 1].X + knots[n].X) / 2.0;225    var xs1 = getFirstControlPoints(rhs);226    for (var i = 1; i < n - 1; ++i)227      rhs[i] = 4 * knots[i].Y + 2 * knots[i + 1].Y;228    rhs[0] = knots[0].Y + 2 * knots[1].Y;229    rhs[n - 1] = (8 * knots[n - 1].Y + knots[n].Y) / 2.0;230    var ys1 = getFirstControlPoints(rhs), xs2 = [], ys2 = [];231    for (var i = 0; i < n; ++i) {232      if (i < n - 1) {233      xs2[i] = 2 * knots[i + 1].X - xs1[i + 1];234      ys2[i] = 2 * knots[i + 1].Y - ys1[i + 1];235      } else {236      xs2[i] = (knots[n].X + xs1[n - 1]) / 2;237      ys2[i] = (knots[n].Y + ys1[n - 1]) / 2;238      }239    }240    }241    // fill242    if (lines[l].f && stIdx < enIdx) {243      ctx.globalAlpha = (active == null || active != lines[l]) ? 0.2 : 0.4;244      ctx.fillStyle = lines[l].hexColor;245      ctx.strokeStyle = lines[l].hexColor;246      ctx.lineWidth = (zoomedOut ? 1 : 2);247      if (lines[l].b) {248        for (var i = stIdx; i <= enIdx; i++) {249          var cx1 = Math.floor(x + ((i > stIdx ? (ps[i - 1].x + ps[i].x) / 2 : ps[i].x) - stTime) * xfactor);250          var cx2 = Math.floor(x + ((i < enIdx ? (ps[i].x + ps[i + 1].x) / 2 : ps[i].x) - stTime) * xfactor);251          var cy = (ps[i].y + yDelta) * yfactor;252          ctx.fillRect(cx1, y + h - cy, cx2 - cx1, ps[i].y * yfactor);253        }254      } else {255        ctx.beginPath();256        var px = x + (ps[stIdx].x - stTime) * xfactor;257        ctx.moveTo(px, y + h - yDelta * yfactor);258        for (var i = stIdx; i <= enIdx; i++) {259        var cx = x + (ps[i].x - stTime) * xfactor;260        if (smooth && (i > stIdx) && (enIdx - stIdx + 1 > 2))261          ctx.bezierCurveTo(Math.min(Math.max(px, xs1[i - stIdx - 1]), cx), Math.min(y + h, Math.max(ys1[i - stIdx - 1], 0)), Math.min(Math.max(px, xs2[i - stIdx - 1]), cx), Math.min(y + h, Math.max(ys2[i - stIdx - 1], 0)), cx, y + h - (ps[i].y + yDelta) * yfactor);262        else263          ctx.lineTo(cx, y + h - (ps[i].y + yDelta) * yfactor);264        px = cx;265        }266        ctx.lineTo(px, y + h - yDelta * yfactor);267        ctx.fill();268      }269      ctx.globalAlpha = 1;270    }271    // stroke272    ctx.strokeStyle = lines[l].hexColor;273    ctx.lineWidth = (zoomedOut ? 1 : 2);274    ctx.beginPath();275    var px = x + (ps[stIdx].x - stTime) * xfactor, py = y + h - (ps[stIdx].y + yDelta) * yfactor;276    ctx.moveTo(px, py);277    if (lines[l].b) {278      for (var i = stIdx; i <= enIdx; i++) {279        var cx = Math.floor(x + ((i < enIdx ? (ps[i].x + ps[i + 1].x) / 2 : ps[i].x) - stTime) * xfactor);280        var cy = y + h - (ps[i].y + yDelta) * yfactor;281        ctx.lineTo(cx, cy);282        if (i < enIdx)283        if (zoomedOut)284          ctx.lineTo(cx, y + h - (ps[i + 1].y + yDelta) * yfactor);285        else {286          ctx.stroke();287          ctx.beginPath();288          ctx.moveTo(cx, y + h - (ps[i + 1].y + yDelta) * yfactor);289        }290      }291    } else {292      for (var i = stIdx + 1; i <= enIdx; i++) {293        var cx = x + (ps[i].x - stTime) * xfactor, cy = y + h - (ps[i].y + yDelta)* yfactor;294        if (ps[i].s == 'x') {295          ctx.stroke();296          ctx.beginPath();297          ctx.moveTo(cx, cy);298        } else {299          if (ps[i].s == '-' || ps[i].s == '--' || ps[i].s == '.') {300            ctx.stroke();301            ctx.globalAlpha = 0.3;302            ctx.beginPath();303            ctx.moveTo(px, py);304          }305          if (smooth && (i > stIdx) && (enIdx - stIdx + 1 > 2))306            ctx.bezierCurveTo(Math.min(Math.max(px, xs1[i - stIdx - 1]), cx), Math.min(y + h, Math.max(ys1[i - stIdx - 1], 0)), Math.min(Math.max(px, xs2[i - stIdx - 1]), cx), Math.min(y + h, Math.max(ys2[i - stIdx - 1], 0)), cx, y + h - (ps[i].y + yDelta) * yfactor);307          else308            ctx.lineTo(cx, y + h - (ps[i].y + yDelta) * yfactor);309          if (ctx.globalAlpha != 1) {310            ctx.stroke();311            ctx.beginPath();312            ctx.moveTo(cx, cy);313          }314        }315        ctx.globalAlpha = 1;316        px = cx;317        py = cy;318      }319    }320    ctx.stroke();321    // dots322    if (smooth || (enIdx - stIdx < 2 && !zoomedOut)) {323      ctx.strokeStyle = lines[l].hexColor;324      ctx.fillStyle = '#ffffff';325      ctx.lineWidth = 2;326      for (var i = stIdx; i <= enIdx; i++) {327        ctx.beginPath();328        ctx.arc(x + (ps[i].x - stTime) * xfactor, y + h - (ps[i].y + yDelta) * yfactor, 3.5, 0, Math.PI*2, true);329        ctx.fill();330        ctx.stroke();331      }332    }333  }334}335function drawBars(ctx, x, y, w, h, lines, labels, barW, xfactor, yfactor, yDelta) {336  for (var l = 0; l < lines.length; l++) {337    var ps = lines[l].d;338    for (i = 0; i < ps.length; i++) {339      if (!labels[ps[i].x]) {340        continue;341      }342      var cx = Math.floor(getBarXValue(x, xfactor, barW, l, ps[i].x));343      var psy = Math.max(ps[i].y, 2 / yfactor);344      var cy = (psy + yDelta) * yfactor;345      ctx.fillStyle = lines[l].hexColor;346      ctx.fillRect(cx, Math.floor(y + h - cy), barW, Math.ceil(psy * yfactor));347    }348  }349}350function getBarXValue(xOffset, xStep, barsWidth, lineIndex, barIndex) {351  return xOffset + barsWidth / 2 + lineIndex * barsWidth + barIndex * xStep;352}353function clearSelection() {354  if(document.selection && document.selection.empty) {355    document.selection.empty();356  } else if(window.getSelection) {357    var sel = window.getSelection();358    sel.removeAllRanges();359  }360}361function dataObjectToArray(data_object) {362  var data_array = [];363  for (var name in data_object) {364    data_array.push(data_object[name]);365  }366  return data_array;367}368// Graph constructor369function Graph(id, data, params, width, height) {370  var graph = this;371  params = extend({}, params);372  width = width ? width : 585;373  height = height ? height : 385;374  extend(this, {params: params, width: width, height: height, viewWidth: width, viewHeight: height - 80});375  this.params.yunits = this.params.yunits || '';376  // create basic DOM tree377  this.graphDiv = ge(id);378  setStyle(this.graphDiv, {fontFamily: 'tahoma, arial, verdana, sans-serif, Lucida Sans', fontSize: '11px', color: '#36638e', width: this.viewWidth + 'px', clear: 'both', lineHeight: '130%', textAlign: 'left'});379  this.graphDiv.innerHTML = '<div style="float: left"><canvas style="padding-top: 20px"></canvas></div>\380    <div style="float: left">\381      <div style="height: 20px; float: right;"></div>\382      <div style="height: 20px; padding-left: 10px;"></div>\383      <div style="position: relative; height: ' + this.viewHeight + 'px;">\384        <canvas height="' + this.viewHeight + '"></canvas>\385        <canvas height="' + (this.viewHeight - 17) + '" style="position: absolute; top: 0; left: 0;"></canvas>\386        <div style="position: absolute; border: 1px solid #5f7d9d; color: #5f7d9d;\387            background-color: #eeeeee; padding: 2px 3px 2px 4px; white-space: nowrap; display: none;">' + cur.graphVars['lang.data_empty'] + '</div>\388      </div>\389      <div style="position: relative; height: 40px;">\390        <canvas height="40"></canvas>\391        <div style="position: absolute; top: 0; height: 38px; border: 1px solid #b8c5d4; border-width: 1px 0px 1px 1px; border-top-color: #d3dee8;"><div style="background: white; opacity: 0.5; filter: alpha(Opacity=50); width: 100%; height: 100%;"></div></div>\392        <div style="position: absolute; top: 0; height: 38px; border: 1px solid #b8c5d4; cursor: ' + DRAG_CURSOR + ';"></div>\393        <div style="position: absolute; top: 0; height: 38px; border: 1px solid #b8c5d4; border-width: 1px 1px 1px 0px; border-top-color: #d3dee8;"><div style="background: white; opacity: 0.5; filter: alpha(Opacity=50); width: 100%; height: 100%;"></div></div>\394        <div style="position: absolute; top: 0; height: 38px; border: 1px solid #b8c5d4; background: #ced9de; opacity: 0.5; filter: alpha(Opacity=50); display: none;"></div>\395          <div style="position: absolute; top: 0; width: 8px; height: 40px; cursor: w-resize;"></div>\396          <div style="position: absolute; top: 0; width: 8px; height: 40px; cursor: e-resize;"></div>\397      </div>\398      <div style="float: left; width: 270px; padding-top: 8px; -moz-user-select: none; -khtml-user-select: none;"></div><div style="float: left; width: 270px; padding-top: 8px; -moz-user-select: none; -khtml-user-select: none;"></div>\399    </div><div style="clear: left;"></div>';400  this.vScale = this.graphDiv.children[0];401  this.vScaleView = this.vScale.children[0];402  this.mainLayout = this.graphDiv.children[1];403  this.menu = this.mainLayout.children[0];404  this.title = this.mainLayout.children[1];405  this.zinLayout = this.mainLayout.children[2];406  this.zinView = this.zinLayout.children[0];407  this.dotsLayer = this.zinLayout.children[1];408  this.message = this.zinLayout.children[2];409  this.zoutLayout = this.mainLayout.children[3];410  this.zoutView = this.zoutLayout.children[0];411  this.lMask = this.zoutLayout.children[1];412  this.zoutWindow = this.zoutLayout.children[2];413  this.rMask = this.zoutLayout.children[3];414  this.select = this.zoutLayout.children[4];415  this.lHandle = this.zoutLayout.children[5];416  this.rHandle = this.zoutLayout.children[6];417  this.column = [this.mainLayout.children[4], this.mainLayout.children[5]];418  var defaultGraph = 0;419  if (typeof params.multiple == 'object' && params.multiple.items) {420    if (!params.multiple.def) params.multiple.def = 0;421    for (i in params.multiple.items) {422      var item = se('<a class="graph_menu_item' + (i == params.multiple.def ? ' graph_menu_item_sel' : '') + '">' + params.multiple.items[i] + '</a>');423      var clickContext = {clickNode: i, graph: this};424      addEvent(item, 'click', this.onClickMenu, null, clickContext);425      cur.destroy.push(function() {426        removeEvent(item, 'click', this.onClickMenu, null, clickContext);427      });428      this.menu.appendChild(item);429    }430    if (params.multiple.graph_item) {431      var item = se('<a class="graph_menu_item">' + params.multiple.graph_item + '</a>');432      var clickContext = {clickNode: params.multiple.items.length, graph: this, alt_graph: true};433      addEvent(item, 'click', this.onClickMenu, null, clickContext);434      cur.destroy.push(function() {435        removeEvent(item, 'click', this.onClickMenu, null, clickContext);436      });437      this.menu.appendChild(item);438    }439    for (i in params.multiple.altitems) {440      var item = se('<a class="graph_menu_item' + (i + params.multiple.altitems.length == params.multiple.def ? ' graph_menu_item_sel' : '') + '">' + params.multiple.altitems[i][0] + '</a>');441      var clickContext = {clickNode: i, graph: this, force_func: params.multiple.altitems[i][1] };442      addEvent(item, 'click', this.onClickMenu, null, clickContext);443      cur.destroy.push(function() {444        removeEvent(item, 'click', this.onClickMenu, null, clickContext);445      });446      this.menu.appendChild(item);447    }448    defaultGraph = params.multiple.def;449    params.multiple = 1;450  }451  extend(this, {452    colMax: [0, 0], lines: [],453    leftTime: -1, rightTime: -1,454    ymarks: [],455    ystep: 0,456    minValue: 100, maxValue: 0, minTime: 2147483647, maxTime: 0,457    dragTime: [],458    startDrag: -1, startDrag2: -1, startValue: -1, startValue2: -1, endValue: -1,459    dragElement: null, maskDragging: false, viewClick: false, smoothLines: false,460    scaleWidth: 0, activeLine: null, isNegative: false});461  try {462    var tctx = getContext(this.zinView);463    if (!tctx) throw 'Error';464  } catch (e) {465    this.zoutLayout.style.display = 'none';466    this.vScale.style.display = 'none';467    this.title.style.display = 'none';468    this.message = (this.message == null) ? this.zinLayout.children[0] : this.message;469    this.message.innerHTML = (cur.graphVars['lang.bad_browser'] || 'Äëÿ îòîáðàæåíèÿ ãðàôèêà ñòàòèñòèêè Âàì íåîáõîäèìî {link}îáíîâèòü áðàóçåð{/link}.').replace('{link}', '<a onclick="Graph.prototype.showBadBrowserBox();">').replace('{/link}', '</a>');470    setStyle(this.graphDiv, {backgroundColor: '#F7F7F7', width: '480px', margin: '0 auto'});471    setStyle(this.message, {472      left: Math.round((getSize(this.zinLayout)[0] - getSize(this.message)[0]) / 2) + 'px',473      top: Math.round((getSize(this.zinLayout)[1] - getSize(this.message)[1]) / 2) + 'px',474      display: 'block',475      color: '#707070',476      border: 'none',477      backgroundColor: 'transparent'478    });479    if (!cur.badBrowserBox) {480      this.showBadBrowserBox();481    }482    return null;483  }484  if (vk.al) {485    stManager.add(['tooltips.js', 'tooltips.css'], function() {486      tooltips.create(graph.mainLayout, {text: '...', black: 1, forcetoup: 1, nohide: 1});487    });488  } else {489    tooltips = false;490  }491  if (!params.bar_chart) {492    addEventEx(this, this.lHandle, 'mousedown touchstart', this.takeHandle);      // resize window493    addEventEx(this, this.rHandle, 'mousedown touchstart', this.takeHandle);494    addEventEx(this, this.zoutWindow, 'mousedown touchstart', this.takeWindow);      // drag window495    addEventEx(this, this.lMask, 'mousedown touchstart', this.takeMask);        // select new window496    addEventEx(this, this.rMask, 'mousedown touchstart', this.takeMask);497    addEventEx(this, this.zinLayout, 'mousedown touchstart', this.takeView);      // drag view498    addEventEx(this, this.zinLayout, 'mousewheel DOMMouseScroll', this.wheelView);    // zoom with mousewheel499    addEventEx(this, this.zoutLayout, 'mousewheel DOMMouseScroll', this.wheelView);500  }501  addEventEx(this, this.dotsLayer, 'mousemove', this.showDots);              // show hints502  addEventEx(this, this.zinLayout, 'mouseout', this.hideDots);            // hide hints503  addEvent(this.column[0], 'selectionstart', cancelEvent);504  addEvent(this.column[1], 'selectionstart', cancelEvent);505  if (typeof(data) != 'string') {506    graph.loadGraph = function(index) {507      graph.setData(params.multiple ? (data[index] || []) : data, isArray(params.adjust) ? params.adjust[index] : params.adjust);508    }509  }510  if (params.multiple) {511    for (var i = 0; i < data.length; i++) {512      data[i] = dataObjectToArray(data[i]);513    }514    graph.setData((typeof(data) == 'string') ? data : (data[defaultGraph] || []), isArray(params.adjust) ? params.adjust[0] : params.adjust);515  } else {516    graph.setData((typeof(data) == 'string') ? data : dataObjectToArray(data), params.adjust);517  }518  return graph;519}520// Prototype methods521Graph.prototype = {522  getXValue: function(pageX, view) {523    return (view ?524      ((pageX - getXY(this.zinView)[0]) / this.xfactorIn + this.leftTime) :525      ((pageX - getXY(this.zoutView)[0]) / this.xfactorOut + this.minTime));526  },527  allowZoom: function(zoom_allowed) {528    this.zoutLayout.style.display = zoom_allowed ? 'block' : 'none';529    this.viewHeight = this.height - (zoom_allowed ? 80 : 40);530    this.zinLayout.style.height = this.viewHeight + "px";531    this.zinView.height = this.viewHeight;532    this.dotsLayer.height = this.viewHeight - 17;533    this.disable_zoom = !zoom_allowed;534  },535  showEmpty: function(no_data) {536    if (no_data) this.allowZoom(false);537    setStyle(this.message, {538      display: no_data ? 'block' : 'none',539      left: Math.round((this.viewWidth - getSize(this.message)[0]) / 2) + 'px',540      top: Math.round((this.viewHeight - getSize(this.message)[1]) / 2) + 'px'});541  },542  overrideCursor: function(cursor) {543    document.body.style.cursor = cursor ? cursor : 'default';544    //document.body.style.cursor = cursor ? cursor : 'auto'; // Opera don't understand 'auto'545    this.lHandle.style.cursor = cursor ? cursor : 'w-resize';546    this.rHandle.style.cursor = cursor ? cursor : 'e-resize';547    this.zoutWindow.style.cursor = cursor ? cursor : DRAG_CURSOR;548  },549  takeHandle: function(ev) {550    var g = ev.currentTarget.graph;551    if (g.disable_zoom) return;552    if (!(ev = prepareEvent(ev))) return;553    addEventEx(g, document, 'mousemove drag touchmove', g.dragHandle);554    addEventEx(g, document, 'mouseup touchend', g.endDrag);555    g.startDrag = ev.pageX;556    g.startValue = (ev.currentTarget == g.lHandle) ? g.leftTime : g.rightTime;557    g.dragElement = ev.currentTarget;558    g.hideDots(ev);559    g.overrideCursor(g.dragElement.style.cursor);560    return false;561  },562  takeWindow: function(ev) {563    var g = ev.currentTarget.graph;564    if (g.disable_zoom) return;565    if (!(ev = prepareEvent(ev, true))) return;566    addEventEx(g, document, 'mousemove drag touchmove', g.dragWindow);567    addEventEx(g, document, 'mouseup touchend', g.endDrag);568    g.startDrag = ev.pageX;569    g.startValue = g.leftTime;570    g.hideDots(ev);571    g.overrideCursor(DRAG2_CURSOR);572    return false;573  },574  takeMask: function(ev) {575    cancelEvent(ev);576    var g = ev.currentTarget.graph;577    if (g.disable_zoom) return;578    g.dragElement = ev.currentTarget;579    if (!(ev = prepareEvent(ev))) return;580    addEventEx(g, document, 'mousemove drag touchmove', g.dragMask);581    addEventEx(g, document, 'mouseup touchend', g.endDrag);582    g.startValue = (ev.pageX - getXY(g.dragElement.parentNode)[0]) / g.xfactorOut + g.minTime;583    g.endValue = g.startValue;584    g.hideDots(ev);585    return false;586  },587  takeView: function(ev) {588    var g = ev.currentTarget.graph;589    if (g.disable_zoom) {590      g.deselectLine(ev);591      return;592    }593    if (!(ev = prepareEvent(ev, true))) return;594    g.dragTime[0] = g.getXValue(ev.pageX, true);595    addEventEx(g, document, 'mousemove drag touchmove', g.dragView);596    addEventEx(g, document, 'mouseup touchend', g.endDrag);597    g.overrideCursor(DRAG2_CURSOR);598    g.viewClick = true;599    g.startDrag = ev.pageX;600    g.showDots(ev);601    //return false;602  },603  dragHandle: function(ev) {604    var g = ev.currentTarget.graph;605    if (!(ev = prepareEvent(ev))) return;606    var xfactorOut = g.viewWidth / (g.maxTime - g.minTime);607    if (g.dragElement == g.lHandle) {608      g.leftTime = Math.max(g.minTime, Math.min(g.rightTime - g.MAXSCALE, g.startValue - (g.startDrag - ev.pageX) / xfactorOut));609    } else {610      g.rightTime = Math.min(g.maxTime, Math.max(g.leftTime + g.MAXSCALE, g.startValue - (g.startDrag - ev.pageX) / xfactorOut));611    }612    g.redrawWindow();613    return false;614  },615  dragWindow: function(ev) {616    var g = ev.currentTarget.graph;617    if (!(ev = prepareEvent(ev))) return;618    var xfactorOut = g.viewWidth / (g.maxTime - g.minTime),619    diff = g.leftTime - (g.startValue - (g.startDrag - ev.pageX) / xfactorOut);620    diff = Math.max(diff, g.rightTime - g.maxTime);621    diff = Math.min(diff, g.leftTime - g.minTime);622    g.leftTime -= diff;623    g.rightTime -= diff;624    g.redrawWindow();625    return false;626  },627  dragMask: function(ev) {628    var g = ev.currentTarget.graph;629    if (!(ev = prepareEvent(ev))) return;630    var xfactorOut = g.viewWidth / (g.maxTime - g.minTime);631    g.endValue = (ev.pageX - getXY(g.dragElement.parentNode)[0]) / xfactorOut + g.minTime;632    var lpos = (Math.max(g.minTime, Math.min(g.startValue, g.endValue)) - g.minTime) * xfactorOut,633      rpos = (Math.min(g.maxTime, Math.max(g.startValue, g.endValue)) - g.minTime) * xfactorOut;634    if (!g.maskDragging && (rpos - lpos > 4)) {635      g.select.style.display = 'block';636      g.maskDragging = true;637    }638    g.select.style.left = lpos + "px";639    g.select.style.width = (rpos - lpos - 2) + "px";640    return false;641  },642  dragView: function(ev) {643    var g = ev.currentTarget.graph;644    if (!(ev = prepareEvent(ev, g.viewClick))) return;645    var diff = (ev.pageX - getXY(g.zoutView)[0]) / g.xfactorIn + g.leftTime - g.dragTime[0];646    diff = Math.max(diff, g.rightTime - g.maxTime);647    diff = Math.min(diff, g.leftTime - g.minTime);648    g.leftTime -= diff;649    g.rightTime -= diff;650    if (Math.abs(ev.pageX - g.startDrag) > 4)651      g.viewClick = false;652    g.redrawWindow();653    g.showDots(ev);654    return g.viewClick;655  },656  endDrag: function(ev) {657    var g = this;658    if (ev) {659      cancelEvent(ev);660      g = ev.currentTarget.graph;661    }662    removeEventEx(document, 'mousemove drag touchmove', g.dragHandle);663    removeEventEx(document, 'mousemove drag touchmove', g.dragWindow);664    removeEventEx(document, 'mousemove drag touchmove', g.dragMask);665    removeEventEx(document, 'mousemove drag touchmove', g.dragView);666    removeEventEx(document, 'mouseup touchend', g.endDrag);667    g.select.style.display = 'none';668    g.overrideCursor();669    if (g.endValue != -1) {670      if (g.maskDragging) {671        g.leftTime = Math.min(g.startValue, g.endValue);672		g.rightTime = Math.min(g.maxTime, Math.max(Math.max(g.startValue, g.endValue), g.leftTime + g.MAXSCALE));673		g.leftTime = Math.max(g.minTime, Math.min(g.leftTime, g.rightTime - g.MAXSCALE));674      } else {675        var diff = (g.rightTime - g.leftTime) / 2.0;676        g.leftTime = (g.endValue - diff);677        g.rightTime = (g.endValue + diff);678        if (g.leftTime < g.minTime) {679          diff = g.minTime - g.leftTime;680          g.leftTime += diff;681          g.rightTime += diff;682        } else683        if (g.rightTime > g.maxTime) {684          diff = g.rightTime - g.maxTime;685          g.leftTime -= diff;686          g.rightTime -= diff;687        }688      }689    }690    if (g.viewClick)691      g.deselectLine(ev);692    else693      g.redrawWindow();694    g.endValue = -1;695    g.maskDragging = false;696    g.viewClick = false;697    g.dragTime = [];698    return false;699  },700  wheelView: function(ev) {701    var g = ev.currentTarget.graph,702      delta = (ev.detail ? -ev.detail * 50 : ev.wheelDelta),703      dist = g.rightTime - g.leftTime, diffL = (delta * dist) / 3500, diffR;704    if (g.disable_zoom) return;705	  if (g.lines.length == 0) return;706    diffL = Math.min(diffL, (dist - g.MAXSCALE) / 2);707    diffR = Math.max(g.minTime - g.leftTime - diffL, 0);708    g.leftTime = Math.max(g.minTime, g.leftTime + diffL);709    g.rightTime = Math.min(g.maxTime, g.rightTime + diffR);710    g.redrawWindow();711    g.showDots(ev);712    return cancelEvent(ev);713  },714  overLegend: function(ev) {715    var line = ev.currentTarget.line;716    drawCheck(line.legendCheck, line.hexColor, line.hexColor2, line.shown, true);717  },718  outLegend: function(ev) {719    var line = ev.currentTarget.line;720    drawCheck(line.legendCheck, line.hexColor, line.hexColor2, line.shown, false);721  },722  toggleLegend: function(ev) {723    var g = ev.currentTarget.graph, line = ev.currentTarget.line, noneShown = true;724    for (var l = 0; l < g.lines.length; l++)725      if (g.lines[l] != line && g.lines[l].shown)726        noneShown = false;727    line.shown = noneShown || !line.shown;728    drawCheck(line.legendCheck, line.hexColor, line.hexColor2, line.shown, true);729    g.updateLines();730    clearSelection();731    return cancelEvent(ev);732  },733  chooseLegend: function(ev) {734    var g = ev.currentTarget.graph, line = ev.currentTarget.line, onlyThis = line.shown;735    if (onlyThis)736      for (var l = 0; l < g.lines.length; l++)737        if (g.lines[l] != line && g.lines[l].shown) {738          onlyThis = false;739          break;740        }741    for (var l = 0; l < g.lines.length; l++) {742      g.lines[l].shown = onlyThis || (g.lines[l] == line);743      drawCheck(g.lines[l].legendCheck, g.lines[l].hexColor, g.lines[l].hexColor2, g.lines[l].shown, g.lines[l] == line);744    }745    g.updateLines();746    clearSelection();747    return cancelEvent(ev);748  },749  showDots: function(ev) {750    var g = ((ev && ev.currentTarget) ? ev.currentTarget.graph : this);751    if (g.params.bar_chart) {752      g.highlightBar(ev);753      return;754    }755    var nearTime = -1, nnd = 0, cx = g.getXValue(ev.pageX, true);756    var ccx = ev.pageX - getXY(g.zinView)[0], ccy = ev.pageY - getXY(g.zinView)[1];757    var max_coltext = [0, 0];758    var activeLine = -1;759    var ctx = getContext(g.dotsLayer);760    ctx.clearRect(0, 0, g.viewWidth, g.viewHeight);761    for (var l = 0; l < g.lines.length; l++) {762      var ni = -1, nd = 0;763      if (g.lines[l].shown) {764        for (var i = g.lines[l].stIdx; i <= g.lines[l].enIdx; i++)765          if (g.lines[l].d[i].x >= g.leftTime && g.lines[l].d[i].x <= g.rightTime && (ni == -1 || nd > Math.abs(g.lines[l].d[i].x - cx))) {766            ni = i;767            nd = Math.abs(g.lines[l].d[i].x - cx);768          }769      }770      if (ni > -1) {771        var dot = g.lines[l].d[ni],772            dotX = (dot.x - g.leftTime) * g.xfactorIn,773            dotY = g.viewHeight - (g.isNegative ? (34 + (dot.y - g.localBottom) * g.yfactorIn) : (25 + (dot.y - (g.adjust ? g.localBottom : 0)) * g.yfactorIn));774        g.lines[l].dot.posX = dotX;775        g.lines[l].dot.posY = dotY;776        if (ccx >= dotX - 7 && ccx <= dotX + 9 &&777            ccy >= dotY - 7 && ccy <= dotY + 9) {778          activeLine = l;779        }780        if (nearTime == -1 || nd < nnd) {781          nnd = nd;782          nearTime = g.lines[l].d[ni].x;783        }784        ctx.fillStyle = g.lines[l].hexColor;785        ctx.beginPath();786        ctx.arc(dotX, dotY, 3, 0, Math.PI*2, true);787        ctx.fill();788        if (!isVisible(g.lines[l].dotLabel) || !g.lines[l].dotLabel.dot || g.lines[l].dotLabel.dot.x != dot.x || parseInt(g.lines[l].dot.style.left) != Math.floor(dotX)) {789          g.lines[l].dotLabel.innerHTML = dot.l ? dot.l : formatValue(dot.y) + g.params.yunits;790          var labelW = getSize(g.lines[l].dotLabel)[0];791          var pos = Math.max(Math.min(-labelW / 2.0, -labelW + g.viewWidth - dotX - 2), 2 - dotX);792          g.lines[l].dotLabel.dot = dot;793          g.lines[l].dotLabel.pos = Math.floor(pos);794          g.lines[l].dotLabel.w = labelW;795          setStyle(g.lines[l].dot, {796            left: Math.floor(dotX) + "px",797            top: Math.floor(dotY) + "px"});798          setStyle(g.lines[l].dotLabel, {799            top: ((g.lines[l].dot.posY > 26) ? -26 : 6) + "px",800            left: g.lines[l].dotLabel.pos + "px"});801        }802        g.lines[l].legendBox.innerHTML = formatValue(dot.y) + g.params.yunits;803        g.lines[l].legendBox.style.display = 'block';804      } else {805        g.lines[l].legendBox.style.display = 'none';806      }807      if (g.lines[l].legendBox.style.left == '40px') { // label position fix in legend808        var col = l < g.lines.length / 2 ? 0 : 1;809        max_coltext[col] = Math.max(max_coltext[col], getSize(g.lines[l].legend.children[1])[0]);810      }811    }812    if (!g.smoothLines || !tooltips) {813      activeLine = -1;814    }815    for (var l = 0; l < g.lines.length; l++) {816      if (!g.lines[l].shown) {817        hide(g.lines[l].dot);818        continue;819      }820      if (activeLine == l) {821        g.showDotTT(l);822      } else if (activeLine == -1) {823        if (g.activeLine == null || g.activeLine == g.lines[l]) {824          show(g.lines[l].dot);825        } else {826          hide(g.lines[l].dot);827        }828      } else {829        hide(g.lines[l].dot);830      }831    }832    if (max_coltext[0] || max_coltext[1]) {833      for (var l = 0; l < g.lines.length; l++) {834        var col = l < g.lines.length / 2 ? 0 : 1;835        if (max_coltext[col]) {836          g.lines[l].legendBox.style.left = (max_coltext[col] + 40) + 'px';837        }838      }839    }840    if (activeLine == -1 && tooltips) {841      tooltips.hide(g.mainLayout, {fasthide: 1});842    }843    if (nearTime > -1 && isVisible(g.title))844      g.title.innerHTML = fullDate(nearTime, g.params);845  },846  hideDots: function(ev) {847    var g = (ev.currentTarget ? ev.currentTarget.graph : this), vwPos = getXY(g.zinView);848    if (ev.pageX >= vwPos[0] && ev.pageX < vwPos[0] + g.viewWidth && ev.pageY >= vwPos[1] && ev.pageY < vwPos[1] + g.viewHeight) return;849    for (var l = 0; l < g.lines.length; l++) {850      hide(g.lines[l].dot);851      if(g.lines[l].sum) {852        g.lines[l].legendBox.innerHTML = formatValue(g.lines[l].sum) + g.params.yunits;853      } else {854        hide(g.lines[l].legendBox);855      }856    }857    var ctx = getContext(g.dotsLayer);858    ctx.clearRect(0, 0, g.viewWidth, g.viewHeight);859    g.title.innerHTML = fullDate(g.localLeft) + (g.localRight > g.localLeft ? ' – ' + fullDate(g.localRight) : '');860    if (tooltips) {861      tooltips.hide(g.mainLayout, {fasthide: 1});862    }863  },864  highlightBar: function(ev) {865    var g = ((ev && ev.currentTarget) ? ev.currentTarget.graph : this);866    var cx = (ev.pageX - getXY(g.zinView)[0]);867    var cy = (ev.pageY - getXY(g.zinView)[1]);868    var ctx = getContext(g.dotsLayer);869    ctx.clearRect(0, 0, g.viewWidth, g.viewHeight);870    var activeLine = activeBar = -1;871    for (var l = 0; l < g.lines.length; l++) {872      for (var i = 0; i < g.lines[l].d.length; i++) {873        var nx = getBarXValue(0, g.xstep, g.barsWidth, l, g.lines[l].d[i].x);874        var ny = g.viewHeight - (g.isNegative ? (34 + (g.lines[l].d[i].y - g.localBottom) * g.yfactorIn) : (25 + (g.lines[l].d[i].y - (g.adjust ? g.localBottom : 0)) * g.yfactorIn));875        if (cx > nx && cx <= nx + g.barsWidth && cy >= ny) {876          activeLine = l;877          activeBar = i;878          break;879        }880      }881    }882    for (var l = 0; l < g.lines.length; l++) {883      if (activeBar > -1) {884        var dot = g.lines[l].d[activeBar],885            dotX = getBarXValue(0, g.xstep, g.barsWidth, l, dot.x),886            dotY = g.viewHeight - (g.isNegative ? (34 + (dot.y - g.localBottom) * g.yfactorIn) : (25 + (dot.y - (g.adjust ? g.localBottom : 0)) * g.yfactorIn)),887            val = formatValue(dot.y) + g.params.yunits;888        if (activeLine == l) {889          ctx.fillStyle = g.lines[l].hexColor3;890          ctx.fillRect(dotX, dotY, g.barsWidth, g.viewHeight);891          g.showTT(dotX, dotY, dot.l ? dot.l : val + '<br>' + g.lines[l].name + ', ' + this.params.bar_chart[activeBar]);892          g.lines[l].legendBox.style.display = 'block';893          g.lines[l].legendBox.innerHTML = val;894        } else {895          g.lines[l].legendBox.style.display = 'block';896          g.lines[l].legendBox.innerHTML = val;897        }898      } else if(g.lines[l].sum) {899        g.lines[l].legendBox.innerHTML = formatValue(g.lines[l].sum) + g.params.yunits;900      } else {901        g.lines[l].legendBox.style.display = 'none';902      }903    }904    if (activeBar == -1 && tooltips) {905      tooltips.hide(g.mainLayout, {fasthide: 1});906    }907  },908  expandLabel: function(ev) {909    var g = ev.currentTarget.graph, line = ev.currentTarget.line, dot = line.dotLabel.dot, pos = line.dotLabel.pos;910    if (!g.smoothLines) {911      var text = '';912      if (line.l) {913        text += langNumeric(dot.y, line.l, true);914      } else {915        text += (dot.l ? dot.l : formatValue(dot.y)) + ' ' + line.name;916      }917      line.dotLabel.innerHTML = text;918      var sz = getSize(line.dotLabel)[0];919      if (pos + sz + line.dot.posX > g.viewWidth) {920        line.dotLabel.innerHTML = line.name + ' ' + (dot.l ? dot.l : formatValue(dot.y));921        line.dotLabel.style.left = pos - (sz - line.dotLabel.w) + "px";922      } else923        line.dotLabel.style.left = pos + "px";924      for (var l = 0; l < g.lines.length; l++)925        g.lines[l].dotLabel.style.zIndex = (g.lines[l] == line) ? 1000 : 200;926    }927    return cancelEvent(ev);928  },929  chideLabel: function(ev) {930    var g = ev.currentTarget.graph, line = ev.currentTarget.line,931      locX = ev.pageX - (getXY(line.dot)[0] + line.dotLabel.pos);932    if (locX < 0 || locX > line.dotLabel.w)933      g.hideLabel(ev);934  },935  hideLabel: function(ev) {936    var g = ev.currentTarget.graph, line = ev.currentTarget.line, dot = line.dotLabel.dot, pos = line.dotLabel.pos;937    line.dotLabel.innerHTML = dot.l ? dot.l : formatValue(dot.y);938    line.dotLabel.style.left = pos + "px";939  },940  selectLine: function(ev) {941    var g = ev.currentTarget.graph, line = ev.currentTarget.line;942    g.activeLine = line;943    g.redrawWindow();944    g.showDots(ev);945    return cancelEvent(ev);946  },947  deselectLine: function(ev) {948    this.activeLine = null;949    this.redrawWindow();950    this.showDots(ev);951    return cancelEvent(ev);952  },953  showDotTT: function(lineIndex) {954    if (!this.smoothLines) {955      return;956    }957    if (this.ttLine != lineIndex) {958      tooltips.hide(this.mainLayout, {fasthide: 1});959    }960    var line = this.lines[lineIndex], dot = line.dotLabel.dot;961    var text = '';962    if (line.l) {963      text += langNumeric(dot.y, line.l, true);964    } else {965      text += (dot.l ? dot.l : formatValue(dot.y)) + ' – ' + line.name;966    }967    text += '<br/><span style="font-weight: normal; font-size: 0.9em;">' + fullDate(dot.x, this.params) + '</span>';968    for (var l = 0; l < this.lines.length; l++) {969      hide(this.lines[l].dot);970    }971    this.showTT(line.dot.posX + 1, line.dot.posY - 5, text);972    this.ttLine = lineIndex;973    var ctx = getContext(this.dotsLayer);974    ctx.strokeStyle = line.hexColor;975    ctx.globalAlpha = 0.3;976    ctx.lineWidth = 4;977    ctx.beginPath();978    ctx.arc(line.dot.posX, line.dot.posY, 6.5, 0, Math.PI*2, true);979    ctx.stroke();980    ctx.globalAlpha = 1;981  },982  showTT: function(dotX, dotY, text) {983    var xy = getXY(this.zinLayout);984    xy[0] += dotX - 9 + (this.params.bar_chart ? this.barsWidth / 2 : 0);985    xy[1] += dotY;986    xy[0] = Math.floor(xy[0]); xy[1] = Math.floor(xy[1]);987    if (this.mainLayout.tt && this.mainLayout.tt.container && (!isVisible(this.mainLayout.tt.container) || !this.dotLabelXY || this.dotLabelXY[0] != xy[0])) {988      geByClass1('tt_text', this.mainLayout.tt.container).innerHTML = text;989      tooltips.hide(this.mainLayout, {fasthide: 1});990      tooltips.show(this.mainLayout, {forcexy: xy});991      this.dotLabelXY = xy;992    }993  },994  onClickMenu: function(ev) {995    var g = ev.data.graph;996    for (var i in g.menu.children) {997      if (g.menu.children[i].nodeType != 1) continue;998      if (i == ev.data.clickNode) {999        addClass(g.menu.children[i], 'graph_menu_item_sel');1000        if (!ev.data.alt_graph) {1001          g.loadGraph(i);1002          if (isVisible(g.graphDiv.id.replace(/_graph$/, '') + '_alt_graph')) {1003            hide(g.graphDiv.id.replace(/_graph$/, '') + '_alt_graph');1004            for (i in g.mainLayout.children) {1005              if (g.mainLayout.children[i].nodeType == 1 && g.mainLayout.children[i].mh) {1006                show(g.mainLayout.children[i]);1007              }1008            }1009            g.mainLayout.style.width = g.viewWidth + "px";1010            show(g.vScale);1011          }1012        } else {1013          hide(g.vScale);1014          for (i in g.mainLayout.children) {1015            if (g.mainLayout.children[i].nodeType != 1 || g.mainLayout.children[i] == g.menu || !isVisible(g.mainLayout.children[i])) continue;1016            g.mainLayout.children[i].mh = 1;1017            hide(g.mainLayout.children[i]);1018          }1019          g.mainLayout.style.width = g.viewWidth + g.scaleWidth + "px";1020          show(g.graphDiv.id.replace(/_graph$/, '') + '_alt_graph');1021        }1022      } else {1023        removeClass(g.menu.children[i], 'graph_menu_item_sel');1024      }1025    }1026    cancelEvent(ev);1027  },1028  // some lines were shown or hidden1029  updateLines: function() {1030    this.redrawWindow();1031    // redraw zoutView1032    var ctx = getContext(this.zoutView);1033    ctx.clearRect(0, 0, this.viewWidth, 40);1034    if (this.isNegative)1035      drawLines(ctx, 0, 4, this.viewWidth, 32, this.lines, this.minTime, this.maxTime, this.xfactorOut, this.yfactorOut, -this.localBottom, true, null, false);1036    else1037      drawLines(ctx, 0, 4, this.viewWidth, 36, this.lines, this.minTime, this.maxTime, this.xfactorOut, this.yfactorOut, 0, true, null, false);1038  },1039  // window borders were moved1040  redrawWindow: function() {1041    // move window1042    this.xfactorOut = this.viewWidth / (this.maxTime - this.minTime);1043    this.xfactorIn = this.viewWidth / (this.rightTime - this.leftTime);1044    var leftOut = Math.round((this.leftTime - this.minTime) * this.xfactorOut),1045      rightOut = Math.round((this.rightTime - this.minTime) * this.xfactorOut) - 1;1046    leftOut = Math.min(leftOut, this.viewWidth - 4);1047    rightOut = Math.max(leftOut + 1, rightOut);1048    setStyle(this.lMask, {1049      width: leftOut + "px",1050      display: (leftOut > 0 ? "block" : "none")});1051    setStyle(this.zoutWindow, {1052      left: leftOut + "px",1053      width: (rightOut - leftOut - 1) + "px"});1054    setStyle(this.rMask, {1055      left: (rightOut + 1) + "px",1056      width: (this.viewWidth - rightOut - 2) + "px",1057      display: (this.viewWidth - rightOut - 2 > 0 ? "block" : "none")});1058    this.lHandle.style.left = Math.max(0, leftOut - 4) + "px";1059    this.rHandle.style.left = Math.min(this.viewWidth - 8, rightOut - 4) + "px";1060    // get visible data1061    var localMax = (this.adjust ? -1e9 : 0), localMin = (this.adjust ? 1e9 : 0), outMax = 0, outMin = 0, dotsVisible = 0;1062    this.localLeft = this.rightTime;1063    this.localRight = this.leftTime;1064    for (var l = 0; l < this.lines.length; l++) {1065      var line = this.lines[l];1066      if (line.shown) {1067        var stIdx = 0, enIdx = line.d.length - 1, ps = line.d;1068        while ((stIdx < ps.length - 1) && (ps[stIdx + 1].x < this.leftTime)) stIdx++;1069        while ((enIdx > 1) && (ps[enIdx - 1].x > this.rightTime)) enIdx--;1070        line.stIdx = stIdx;1071        line.enIdx = enIdx;1072        if (enIdx >= stIdx && (ps[enIdx].x >= this.leftTime) && (ps[stIdx].x <= this.rightTime)) {1073          for (var i = stIdx; i <= enIdx; i++) {1074            localMax = Math.max(localMax, ps[i].y);1075            localMin = Math.min(localMin, ps[i].y);1076            this.localLeft = Math.min(this.localLeft, ps[i].x);1077            this.localRight = Math.max(this.localRight, ps[i].x);1078          }1079          dotsVisible = Math.max(dotsVisible, enIdx - stIdx);1080        }1081        outMax = Math.max(outMax, line.maxValue);1082        outMin = Math.min(outMax, line.minValue);1083      }1084    }1085    if (this.lines.length == 0 || (localMax - localMin < 1e-6)) {1086      this.isNegative = false;1087      this.ystep = 1;1088      this.localTop = 5;1089      this.localBottom = 0;1090    } else {1091      this.isNegative = (localMin < -1e-6);1092      this.ystep = Math.max(getYStep(localMax - (this.adjust ? localMin : 0), this.params.int_scale), this.isNegative ? getYStep(-localMin, this.params.int_scale) : 1e-6);1093      this.localTop = (Math.ceil(localMax / this.ystep)) * this.ystep;1094      this.localBottom = -(Math.ceil(- localMin / this.ystep)) * this.ystep;1095    }1096    this.yfactorIn = (this.viewHeight - (this.isNegative ? 43 : 34)) / (this.localTop - this.localBottom);1097    this.yfactorOut = this.minValue < -1e-6 ? (32 / (outMax - outMin)): (36 / outMax);1098    this.smoothLines = dotsVisible < 30 ? true : false;1099    // update title1100    this.title.innerHTML = fullDate(this.localLeft) + (this.localRight > this.localLeft ? ' – ' + fullDate(this.localRight) : '');1101    // redraw zinView1102    var ctx = getContext(this.zinView);1103    var ctxS = getContext(this.vScaleView);1104    ctx.clearRect(0, 0, this.viewWidth, this.viewHeight);1105    ctx.fillStyle = '#fafafa';1106    ctx.fillRect(0, 9, this.viewWidth, this.viewHeight - 9);1107    ctxS.clearRect(0, 0, this.scaleWidth, this.viewHeight);1108    // y scale1109    ctx.lineWidth = 1;1110    ctx.strokeStyle = '#e6eaf0';1111    ctxS.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1112    ctxS.fillStyle = '#36638e';1113    ctxS.textAlign = 'right';1114    ctxS.textBaseline = 'middle';1115    for (var gridY = this.localBottom; gridY < this.localTop + this.ystep; gridY += this.ystep) {1116      var cy = this.viewHeight - 24.5 - Math.round((gridY - this.localBottom) * this.yfactorIn) - (this.isNegative ? 9 : 0);1117      if (gridY < this.localTop) {1118        ctx.strokeStyle = (this.isNegative && Math.abs(gridY) < 1e-8) ? '#9fb1c4' : '#e6eaf0';1119        ctx.beginPath();1120        ctx.moveTo(0, cy);1121        ctx.lineTo(this.viewWidth, cy);1122        ctx.stroke();1123      }1124      ctxS.fillText(formatValue(gridY), this.scaleWidth - 6, cy);1125    }1126    // x scale1127    ctx.fillStyle = '#ffffff';1128    ctx.fillRect(0, this.viewHeight - 25, this.viewWidth, 25);1129    ctx.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1130    ctx.fillStyle = '#36638e';1131    ctx.textAlign = 'center';1132    ctx.textBaseline = 'top';1133    var fin = false;1134    var i_start = this.params.show_time || this.params.show_minutes ? 0 : 6;1135    for (var i = i_start; (i < 100) && !fin; i++) {1136      if (i < xscales.length) {1137        var sc = xscales[i];1138      } else {1139        var yearCnt = [2, 5, 10][(i - xscales.length + 1) % 3] * Math.pow(10, Math.floor((i - xscales.length + 1) / 3));1140        var sc = {base: yearCnt * YEAR, format: ['yearFull'], sub: Math.max(1, yearCnt / 10) * YEAR};1141      }1142      var baseWidth = sc.base * this.xfactorIn;1143      for (var j = 0; j < sc.format.length; j++) {1144        var formatWidth = ctx.measureText(formatDate(-1, sc.format[j])).width;1145        if (formatWidth < baseWidth) {1146          var sTm = incDate(this.leftTime, sc.base, -2);1147          var eTm = incDate(this.rightTime, sc.base, 2);1148          ctx.strokeStyle = '#e6eaf0';1149          if (sc.sub != -1)1150            for (var tm = sTm; tm <= eTm; tm = incDate(tm, sc.sub, 1)) {1151              var ax = Math.floor((tm - this.leftTime) * this.xfactorIn) + 0.5;1152              ctx.beginPath();1153              ctx.moveTo(ax, this.viewHeight - 24);1154              ctx.lineTo(ax, this.viewHeight - 22);1155              ctx.stroke();1156            }1157          for (var tm = sTm; tm <= eTm; tm = incDate(tm, sc.base, 1)) {1158            if (incDate(tm, sc.base, 1) < tm + HOUR)1159              throw "Erroneous date increase";1160            var ax = Math.floor((tm - this.leftTime) * this.xfactorIn) + 0.5;1161            //ctx.strokeStyle = '#e6eaf0';1162            ctx.beginPath();1163            ctx.moveTo(ax, 9);1164            ctx.lineTo(ax, this.viewHeight - 24);1165            ctx.stroke();1166            //ctx.strokeStyle = '#9fb1c4';1167            ctx.beginPath();1168            ctx.moveTo(ax, this.viewHeight - 24);1169            if (sc.sub == -1)1170              ctx.lineTo(ax, this.viewHeight);1171            else1172              ctx.lineTo(ax, this.viewHeight - 20);1173            ctx.stroke();1174            var textpos = ax;1175            if (sc.sub == -1)1176              textpos += (baseWidth / 2.0);1177            if (textpos - formatWidth / 2.0 > 0 && textpos + formatWidth / 2.0 < this.viewWidth)1178              ctx.fillText(replaceEntities(formatDate(tm, sc.format[j])), textpos, this.viewHeight - 19);1179          }1180          fin = true;1181          break;1182        }1183      }1184      if (fin) break;1185    }1186    ctx.strokeStyle = '#e6eaf0';1187    ctx.lineWidth = 1;1188    ctx.strokeRect(0, this.viewHeight - 24.5, this.viewWidth - 1, 26);1189    ctx.strokeStyle = '#f0f2f5';1190    ctx.globalAlpha = 0.5;1191    ctx.beginPath();1192    ctx.moveTo(1, this.viewHeight - 25.5);1193    ctx.lineTo(this.viewWidth, this.viewHeight - 25.5);1194    ctx.stroke();1195    ctx.globalAlpha = 1;1196    // graph1197    if (this.isNegative)1198      drawLines(ctx, 0, 9, this.viewWidth, this.viewHeight - 43, this.lines, this.leftTime, this.rightTime, this.xfactorIn, this.yfactorIn, -this.localBottom, false, this.activeLine, this.smoothLines);1199    else1200      drawLines(ctx, 0, 9, this.viewWidth, this.viewHeight - 34, this.lines, this.leftTime, this.rightTime, this.xfactorIn, this.yfactorIn, this.adjust ? -this.localBottom : 0, false, this.activeLine, this.smoothLines);1201    ctx.strokeStyle = '#b8c5d4';1202    ctx.beginPath();1203    ctx.moveTo(0, 9);1204    ctx.lineTo(0, this.viewHeight + 0.5);1205    if (!isVisible(this.zoutLayout)) {1206      ctx.lineTo(this.viewWidth, this.viewHeight + 0.5);1207    }1208    ctx.stroke();1209  },1210  destroyDots: function(data) {1211    for (var l = 0; l < this.lines.length; l++) {1212      var line = this.lines[l];1213      removeEventEx(line.dotLabel, 'mouseover', this.expandLabel);1214      removeEventEx(line.dotLabel, 'mousemove', this.chideLabel);1215      removeEventEx(line.dotLabel, 'mouseout', this.hideLabel);1216      removeEventEx(line.dot, 'click', this.selectLine);1217      removeEventEx(line.legend, 'mouseover', this.overLegend);1218      removeEventEx(line.legend, 'mouseout', this.outLegend);1219      removeEventEx(line.legend, 'click', this.toggleLegend);1220      removeEventEx(line.legend, 'dblclick', this.chooseLegend);1221      if (line.dot) {1222        this.zinLayout.removeChild(line.dot);1223      }1224      if (line.legend.parentNode) {1225        line.legend.parentNode.removeChild(line.legend);1226      }1227      removeData(line.dotLabel);1228      removeData(line.dot);1229      removeData(line.legend);1230    }1231  },1232  initLoadedData: function(text) {1233    var _t = this;1234    this.message.innerHTML = cur.graphVars['lang.data_empty'];1235    setStyle(this.message, {1236        display: 'none',1237        backgroundColor: '#eeeeee',1238        border: '1px solid #5f7d9d'});1239    try {1240      var d = eval(text);1241      _t.loadGraph = function(index) {1242        _t.setData(d[index] || [], isArray(_t.params.adjust) ? _t.params.adjust[index] : _t.params.adjust);1243      }1244      _t.noData = (d.length == 0 || (d.length == 1 && d[0].length == 0));1245      _t.setData(_t.params.multiple ? d[0] : d, isArray(_t.params.adjust) ? _t.params.adjust[0] : _t.params.adjust);1246    } catch(e){1247      _t.setData([], false);1248    }1249  },1250  setData: function(data, adjust) {1251    var _t = this;1252    if (typeof(data) == 'string') {1253      this.zoutLayout.style.display = 'none';1254      this.vScale.style.display = 'none';1255      this.title.style.display = 'none';1256      //this.message.innerHTML = cur.graphVars['lang.loading'];1257      this.message.innerHTML = '<img src="/images/progress7.gif" />';1258      setStyle(this.message, {1259        display: 'block',1260        backgroundColor: 'transparent',1261        border: 'none',1262        left: Math.round((this.viewWidth - 149) / 2) + 'px',1263        top: Math.round((this.viewHeight - 8) / 2) + 'px'});1264      if (window.ajax) {1265        ajax.post(data, {html5: 1}, {onDone: function(text) {1266          _t.initLoadedData(text);1267        }});1268      } else {1269        Ajax.Post({url:data.split('%26').join('&'), query: {html5: 1}, onDone: function(res, text) {1270          _t.initLoadedData(text);1271        }});1272      }1273      return;1274    }1275    if (this.params.bar_chart) {1276      this.setBarChartData(data, adjust);1277      return;1278    }1279    if (this.lines.length == data.length) {1280      var showOverride = [];1281      for (var l = 0; l < this.lines.length; l++)1282        if (this.lines[l].name.toLowerCase() != data[l].name.toLowerCase()) {1283          showOverride = null;1284          break;1285        } else1286          showOverride[l] = this.lines[l].shown;1287    }1288    // remove old lines1289    this.destroyDots();1290    this.adjust = adjust;1291    this.minValue = 100;1292    this.maxValue = 1;1293    this.minAbsValue = 1.0;1294    this.minTime = 2147483647;1295    this.maxTime = 0;1296    // prepare lines1297    this.lines = [];1298    var maxDotsCount = 0;1299    var max_coltext = [0, 0];1300    var dotsVisible = 0;1301    this.MAXSCALE = 2 * DAY + HOUR;1302    this.XSTEP = DAY;1303    for (var l = 0; l < data.length; l++) {1304      var line = extend({a: true}, data[l]);1305      if (!line.d || !line.d.length) {1306        continue;1307      }1308      if (!line.c || 1) {1309        line.c = colors[l % colors.length];1310      }1311      var r = (line.c & 0xFF0000) >> 16;1312      var g = (line.c & 0x00FF00) >> 8;1313      var b = (line.c & 0x0000FF);1314      r = Math.min(255, (r >> 2) + 192);1315      g = Math.min(255, (g >> 2) + 192);1316      b = Math.min(255, (b >> 2) + 192);1317      line.c2 = (r << 16) | (g << 8) | (b);1318      line.hexColor = line.c.toString(16);1319      line.hexColor = '#' + '000000'.substr(0, 6 - line.hexColor.length) + line.hexColor;1320      line.hexColor2 = line.c2.toString(16);1321      line.hexColor2 = '#' + '000000'.substr(0, 6 - line.hexColor.length) + line.hexColor2;1322      line.minValue = 100;1323      line.maxValue = 1;1324      // make dot1325      line.dot = ce('div', {1326        innerHTML: '<div style="color: white;\1327            -webkit-border-radius: 2px; -khtml-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;\1328            background-color: ' + line.hexColor + '; position: absolute; padding: 2px 3px 3px 3px; white-space: nowrap; cursor: default;"></div>'1329      }, {1330        position: 'absolute',1331        display: 'none'1332      });1333      line.dotLabel = line.dot.children[0];1334      this.zinLayout.appendChild(line.dot);1335      addEventEx(this, line.dotLabel, 'mouseover', this.expandLabel);1336      addEventEx(this, line.dotLabel, 'mousemove', this.chideLabel);1337      addEventEx(this, line.dotLabel, 'mouseout', this.hideLabel);1338      addEventEx(this, line.dotLabel, 'mousedown', cancelEvent);1339      //addEventEx(this, line.dotLabel, 'click', this.selectLine);1340      //addEventEx(this, line.dot, 'click', this.selectLine);1341      line.dotLabel.line = line;1342      line.dot.line = line;1343      // make legend1344      var col_width = Math.floor(this.viewWidth / 2);1345      line.legend = ce('div', {1346        innerHTML: '<canvas width="20" height="20" style="vertical-align: middle; padding-right: 2px;"></canvas>' +1347          '<span title="' + clean(line.name) + '">' + ((line.name.length >= 30) ? line.name.substr(0, 27) + '...' : line.name)  + '</span>' +1348          '<div style="position: absolute; top: 0px; left: 0px; padding: 2px 3px; white-space: nowrap; display: none; background: ' + line.hexColor + '; color: white; -webkit-border-radius: 2px; -khtml-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;"></div>'1349      }, {1350        color: line.hexColor,1351        position: 'relative',1352        cursor: 'pointer'1353      });1354      line.shown = showOverride ? showOverride[l] : line.a;1355      line.legendCheck = line.legend.children[0];1356      drawCheck(line.legendCheck, line.hexColor, line.hexColor2, line.shown, false);1357      line.legendBox = line.legend.children[2];1358      addEventEx(this, line.legend, 'mouseover', this.overLegend);1359      addEventEx(this, line.legend, 'mouseout', this.outLegend);1360      addEventEx(this, line.legend, 'click', this.toggleLegend);1361      addEventEx(this, line.legend, 'dblclick', this.chooseLegend);1362      line.legend.line = line;1363      for (var i = 0; i < line.d.length; i++) {1364        line.d[i].x = parseInt(line.d[i].x || line.d[i]["0"] || DEF_TIME);1365        line.d[i].y = parseFloat(line.d[i].y || line.d[i]["1"] || 0);1366        line.d[i].s = line.d[i].s || line.d[i]["2"] || null;1367        line.d[i].l = line.d[i].l || line.d[i]["3"] || null;1368        line.maxValue = Math.max(line.maxValue, line.d[i].y);1369        line.minValue = Math.min(line.minValue, line.d[i].y);1370        this.maxValue = Math.max(this.maxValue, line.d[i].y);1371        this.minValue = Math.min(this.minValue, line.d[i].y);1372        this.minAbsValue = Math.min(this.minAbsValue, Math.abs(line.d[i].y));1373        this.maxTime = Math.max(this.maxTime, line.d[i].x);1374        this.minTime = Math.min(this.minTime, line.d[i].x);1375        if (i > 0 && i < 10 && Math.abs(line.d[i].x - line.d[i - 1].x) > 1) {1376          this.MAXSCALE = Math.min(this.MAXSCALE, 2.5 * Math.abs(line.d[i].x - line.d[i - 1].x));1377          this.XSTEP = (this.XSTEP + Math.abs(line.d[i].x - line.d[i - 1].x)) / 2;1378        }1379        if (this.leftTime != -1 && line.d[i].x >= this.leftTime && line.d[i].x <= this.rightTime) {1380          dotsVisible++;1381        }1382      }1383      maxDotsCount = Math.max(maxDotsCount, line.d.length);1384      // probably not needed1385      line.d.sort(function(l1, l2) {1386        return (l1.x - l2.x);1387      });1388      this.lines.push(line);1389    }1390    for (var i = 0; i < this.lines.length; i++) {1391      var line = this.lines[i];1392      if (i < this.lines.length / 2) {1393        this.column[0].appendChild(line.legend);1394        max_coltext[0] = Math.max(max_coltext[0], getSize(line.legend.children[1])[0]);1395      } else {1396        this.column[1].appendChild(line.legend);1397        max_coltext[1] = Math.max(max_coltext[1], getSize(line.legend.children[1])[0]);1398      }1399    }1400    for (var i = 0; i < this.lines.length; i++) {1401      if (i < this.lines.length / 2) {1402        this.lines[i].legendBox.style.left = (max_coltext[0] + 40) + 'px';1403      } else {1404        this.lines[i].legendBox.style.left = (max_coltext[1] + 40) + 'px';1405      }1406    }1407    var noData = this.noData || (this.lines.length == 0 && !this.params.multiple);1408    this.zoutLayout.style.display = noData ? 'none' : 'block';1409    this.vScale.style.display = noData ? 'none' : 'block';;1410    this.title.style.display = noData ? 'none' : 'block';1411    if (this.lines.length == 0) {1412      this.maxTime = incDate(DEF_TIME, DAY, 0);1413      this.minTime = this.maxTime - 7 * DAY;1414    } else {1415      this.maxTime += this.XSTEP / 5;1416    }1417    if (this.params.no_zoom) {1418      this.leftTime = this.minTime;1419      this.rightTime = this.maxTime;1420      this.allowZoom(false);1421    } else {1422      if (this.maxTime - this.minTime < 4 * DAY && maxDotsCount < 10) {1423        this.minTime -= 2 * DAY;1424        this.maxTime += 2 * DAY;1425        this.allowZoom(false);1426      } else {1427        this.allowZoom(true);1428      }1429      this.showEmpty(noData);1430      if (this.leftTime == -1 || dotsVisible < 10) {1431        var st = 10 * DAY;1432        if (this.XSTEP > 3 * MONTH) {1433          st = 2 * YEAR;1434        } else if (this.XSTEP > 10 * DAY) {1435          st = 3 * MONTH;1436        }1437        this.leftTime = (this.params.show_all || maxDotsCount < 10) ? this.minTime : Math.max(this.minTime, this.maxTime - st);1438        this.rightTime = this.maxTime;1439      } else {1440        this.leftTime = Math.max(this.minTime, Math.min(this.maxTime, this.leftTime));1441        this.rightTime = Math.max(this.minTime, Math.min(this.maxTime, this.rightTime));1442      }1443    }1444    var ctx = getContext(this.vScaleView);1445    ctx.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1446    var maxWidth = Math.max(1447      ctx.measureText(formatValue(this.maxValue + getYStep(this.maxValue, this.params.int_scale))).width,1448      Math.max(  ctx.measureText(formatValue(getYStep(this.minAbsValue, this.params.int_scale))).width,1449            ctx.measureText(formatValue(this.minValue)).width));1450    this.scaleWidth = (this.lines.length == 0) ? 0 : (maxWidth + 25);1451    this.scaleWidth = Math.floor(this.scaleWidth);1452    this.vScale.style.width = this.scaleWidth + "px";1453    this.vScale.style.height = this.height + "px";1454    this.vScaleView.width = this.scaleWidth;1455    this.vScaleView.height = this.height;1456    this.viewWidth = (this.width - this.scaleWidth);1457    this.mainLayout.style.width = this.viewWidth + "px";1458    this.zinView.width = this.viewWidth;1459    this.dotsLayer.width = this.viewWidth;1460    this.zoutView.width = this.viewWidth;1461    this.column[0].style.width = Math.floor(this.viewWidth / 2) + "px";1462    this.column[1].style.width = Math.floor(this.viewWidth / 2) + "px";1463    this.activeLine = null;1464    this.updateLines();1465  },1466  setBarChartData: function(data, adjust) {1467    // remove old lines1468    this.destroyDots();1469    this.adjust = adjust;1470    this.minValue = 100;1471    this.maxValue = 1;1472    this.minAbsValue = 1.0;1473    // prepare lines1474    this.lines = [];1475    var max_coltext = [0, 0];1476    for (var l = 0; l < data.length; l++) {1477      var line = extend({a: true}, data[l]);1478      if (!line.d || !line.d.length) {1479        continue;1480      }1481      if (!line.c) {1482        var colors_row = l % 4;1483        colors_row = colors_row == 1 ? 3 : colors_row;1484        line.c = colors[(colors_row * 8 + Math.floor(l / 4)) % colors.length];1485      }1486      var r = (line.c & 0xFF0000) >> 16;1487      var g = (line.c & 0x00FF00) >> 8;1488      var b = (line.c & 0x0000FF);1489      r2 = Math.min(255, (r >> 2) + 192);1490      g2 = Math.min(255, (g >> 2) + 192);1491      b2 = Math.min(255, (b >> 2) + 192);1492      line.c2 = (r2 << 16) | (g2 << 8) | (b2);1493      r3 = Math.min(255, r - 16);1494      g3 = Math.min(255, g - 16);1495      b3 = Math.min(255, b - 16);1496      line.c3 = (r3 << 16) | (g3 << 8) | (b3);1497      line.hexColor = line.c.toString(16);1498      line.hexColor = '#' + '000000'.substr(0, 6 - line.hexColor.length) + line.hexColor;1499      line.hexColor2 = line.c2.toString(16);1500      line.hexColor2 = '#' + '000000'.substr(0, 6 - line.hexColor2.length) + line.hexColor2;1501      line.hexColor3 = line.c3.toString(16);1502      line.hexColor3 = '#' + '000000'.substr(0, 6 - line.hexColor3.length) + line.hexColor3;1503      line.minValue = 100;1504      line.maxValue = 1;1505      // make legend1506      line.legend = ce('div', {1507        innerHTML: '<canvas width="20" height="20" style="vertical-align: middle; padding-right: 2px;"></canvas>' +1508          '<span style="font-weight: bold;">' + ((line.name.length >= 30) ? line.name.substr(0, 27) + '...' : line.name)  + '</span>' +1509          '<div style="position: absolute; top: 0px; left: 0px; padding: 2px 3px; white-space: nowrap; display: none; background: ' + line.hexColor2 + '; -webkit-border-radius: 2px; -khtml-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;"></div>'1510      }, {1511        color: line.hexColor,1512        position: 'relative',1513        cursor: 'default',1514        paddingLeft: '10px'1515      });1516      line.shown = true;1517      line.legendCheck = line.legend.children[0];1518      line.legendBox = line.legend.children[2];1519      var ctx = getContext(line.legendCheck);1520      ctx.fillStyle = ctx.strokeStyle = line.hexColor;1521      ctx.lineWidth = 4;1522      ctx.lineJoin = 'round';1523      ctx.strokeRect(4, 5, 9, 9);1524      ctx.fillRect(4, 5, 9, 9);1525      if (line.sum) {1526        line.legendBox.innerHTML = formatValue(line.sum) + this.params.yunits;1527        show(line.legendBox);1528      }1529      for (var i = 0; i < line.d.length; i++) {1530        line.d[i].x = line.d[i].x || line.d[i]["0"] || i;1531        line.d[i].y = parseFloat(line.d[i].y || line.d[i]["1"] || 0);1532        line.d[i].s = line.d[i].s || line.d[i]["2"] || null;1533        line.d[i].l = line.d[i].l || line.d[i]["3"] || null;1534        line.maxValue = Math.max(line.maxValue, line.d[i].y);1535        line.minValue = Math.min(line.minValue, line.d[i].y);1536        this.maxValue = Math.max(this.maxValue, line.d[i].y);1537        this.minValue = Math.min(this.minValue, line.d[i].y);1538        this.minAbsValue = Math.min(this.minAbsValue, Math.abs(line.d[i].y));1539      }1540      line.stInd = 0;1541      line.enIdx = line.d.length;1542      this.lines.push(line);1543    }1544    for (var i = 0; i < this.lines.length; i++) {1545      var line = this.lines[i];1546      if (i < this.lines.length / 2) {1547        this.column[0].appendChild(line.legend);1548        max_coltext[0] = Math.max(max_coltext[0], getSize(line.legend.children[1])[0]);1549      } else {1550        this.column[1].appendChild(line.legend);1551        max_coltext[1] = Math.max(max_coltext[1], getSize(line.legend.children[1])[0]);1552      }1553    }1554    for (var i = 0; i < this.lines.length; i++) {1555      var line = this.lines[i];1556      if (i < this.lines.length / 2) {1557        line.legendBox.style.left = (max_coltext[0] + 40) + 'px';1558      } else {1559        line.legendBox.style.left = (max_coltext[1] + 40) + 'px';1560      }1561    }1562    var noData = this.noData || (this.lines.length == 0 && !this.params.multiple);1563    this.zoutLayout.style.display = noData ? 'none' : 'block';1564    this.vScale.style.display = noData ? 'none' : 'block';;1565    this.showEmpty(noData);1566    this.zoutLayout.style.display = 'none';1567    this.title.style.display = 'none';1568    this.vScaleView.style.paddingTop = 0;1569    this.viewHeight = this.height - 24;1570    this.zinLayout.style.height = this.viewHeight + "px";1571    this.zinView.height = this.viewHeight;1572    this.dotsLayer.height = this.viewHeight - 25;1573    this.disable_zoom = true;1574    if (this.params.multiple && this.menu.parentNode == this.mainLayout) {1575      var menu = re(this.menu);1576      setStyle(menu, {position: 'absolute', right: '10px', top: '20px', zIndex: 1000});1577      this.zinLayout.insertBefore(menu, this.zinView);1578    }1579    var ctx = getContext(this.vScaleView);1580    ctx.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1581    var yUnits = this.params.yunits ? this.params.yunits : '';1582    var maxWidth = Math.max(1583      ctx.measureText(formatValue(this.maxValue + getYStep(this.maxValue, this.params.int_scale) + yUnits)).width, ctx.measureText(formatValue(getYStep(this.minAbsValue, this.params.int_scale) + yUnits)).width);1584    this.scaleWidth = (this.lines.length == 0) ? 0 : (maxWidth + 30);1585    this.scaleWidth = Math.floor(this.scaleWidth);1586    this.vScale.style.width = this.scaleWidth + "px";1587    this.vScale.style.height = this.height + "px";1588    this.vScaleView.width = this.scaleWidth;1589    this.vScaleView.height = this.height;1590    this.viewWidth = (this.width - this.scaleWidth);1591    this.mainLayout.style.width = this.viewWidth + "px";1592    this.zinView.width = this.viewWidth;1593    this.dotsLayer.width = this.viewWidth;1594    this.column[0].style.width = Math.floor(this.viewWidth / 2) + "px";1595    this.column[1].style.width = Math.floor(this.viewWidth / 2) + "px";1596    this.xstep = Math.floor(this.viewWidth / this.params.bar_chart.length);1597    this.barsWidth = Math.floor(this.xstep / (this.lines.length + 1));1598    this.barsWidth = Math.min(this.barsWidth, 25);1599    // draw window1600    if (this.lines.length == 0 || (this.maxValue - this.minValue < 1e-6)) {1601      this.isNegative = false;1602      this.ystep = 1;1603      this.localTop = 5;1604      this.localBottom = 0;1605    } else {1606      this.isNegative = (this.minValue < -1e-6);1607      this.ystep = Math.max(getYStep(this.maxValue - (adjust ? this.minValue : 0), this.params.int_scale), this.isNegative ? getYStep(-this.minValue, this.params.int_scale) : 1e-6);1608      this.localTop = (Math.ceil(this.maxValue / this.ystep)) * this.ystep;1609      this.localBottom = 0;1610    }1611    this.yfactorIn = (this.viewHeight - (this.isNegative ? 43 : 34)) / (this.localTop - this.localBottom);1612    this.xfactorIn = 1;1613    // redraw zinView1614    var ctx = getContext(this.zinView);1615    var ctxS = getContext(this.vScaleView);1616    ctx.clearRect(0, 0, this.viewWidth, this.viewHeight);1617    ctx.fillStyle = '#fafafa';1618    ctx.fillRect(0, 9, this.viewWidth, this.viewHeight - 9);1619    ctxS.clearRect(0, 0, this.scaleWidth, this.viewHeight);1620    // y scale1621    ctx.lineWidth = 1;1622    ctx.strokeStyle = '#e6eaf0';1623    ctxS.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1624    ctxS.fillStyle = '#36638e';1625    ctxS.textAlign = 'right';1626    ctxS.textBaseline = 'middle';1627    for (var gridY = this.localBottom; gridY < this.localTop + this.ystep; gridY += this.ystep) {1628      var cy = this.viewHeight - 24.5 - Math.round((gridY - this.localBottom) * this.yfactorIn) - (this.isNegative ? 9 : 0);1629      if (gridY < this.localTop) {1630        ctx.strokeStyle = (this.isNegative && Math.abs(gridY) < 1e-8) ? '#9fb1c4' : '#e6eaf0';1631        ctx.beginPath();1632        ctx.moveTo(0, cy);1633        ctx.lineTo(this.viewWidth, cy);1634        ctx.stroke();1635      }1636      ctxS.fillText(formatValue(gridY) + yUnits, this.scaleWidth - 6, cy);1637    }1638    // x scale1639    ctx.fillStyle = '#e9ecf0';1640    ctx.fillRect(0, this.viewHeight - 25, this.viewWidth, 25);1641    ctx.font = '11px tahoma, arial, verdana, sans-serif, Lucida Sans';1642    ctx.fillStyle = '#36638e';1643    ctx.textAlign = 'center';1644    ctx.textBaseline = 'top';1645    var fontSize = 11;1646    for (var i = 0; i < this.params.bar_chart.length; i++) {1647      while (ctx.measureText(this.params.bar_chart[i]).width > this.xstep && fontSize >= 8) {1648        fontSize--;1649        ctx.font = fontSize + 'px tahoma, arial, verdana, sans-serif, Lucida Sans';1650      }1651    }1652    for (var i = 0; i < this.params.bar_chart.length; i++) {1653      var text = this.params.bar_chart[i];1654      var textpos = this.xstep * (i + 0.5);1655      ctx.fillText(replaceEntities(text), textpos, this.viewHeight - 19);1656    }1657    // graph1658    if (this.isNegative)1659      drawBars(ctx, 0, 9, this.viewWidth, this.viewHeight - 43, this.lines, this.params.bar_chart, this.barsWidth, this.xstep, this.yfactorIn, -this.localBottom);1660    else1661      drawBars(ctx, 0, 9, this.viewWidth, this.viewHeight - 34, this.lines, this.params.bar_chart, this.barsWidth, this.xstep, this.yfactorIn, this.adjust ? -this.localBottom : 0);1662    ctx.strokeStyle = '#b8c5d4';1663    ctx.lineWidth = 1;1664    ctx.beginPath();1665    ctx.moveTo(0.5, 9);1666    ctx.lineTo(0.5, this.viewHeight);1667    ctx.lineTo(this.viewWidth, this.viewHeight);1668    ctx.stroke();1669    ctx.strokeStyle = '#6b93b5';1670    ctx.lineWidth = 2;1671    ctx.globalAlpha = 0.25;1672    ctx.beginPath();1673    ctx.moveTo(1, this.viewHeight - 26);1674    ctx.lineTo(this.viewWidth, this.viewHeight - 26);1675    ctx.stroke();1676  },1677  destroy: function() {1678    this.destroyDots();1679    this.endDrag();1680    removeEventEx(this.lHandle, 'mousedown touchstart', this.takeHandle);1681    removeEventEx(this.rHandle, 'mousedown touchstart', this.takeHandle);1682    removeEventEx(this.zoutWindow, 'mousedown touchstart', this.takeWindow);1683    removeEventEx(this.lMask, 'mousedown touchstart', this.takeMask);1684    removeEventEx(this.rMask, 'mousedown touchstart', this.takeMask);1685    removeEventEx(this.zinLayout, 'mousedown touchstart', this.takeView);1686    removeEventEx(this.dotsLayer, 'mousemove', this.showDots);1687    removeEventEx(this.zinLayout, 'mouseout', this.hideDots);1688    removeEventEx(this.zinLayout, 'mousewheel DOMMouseScroll', this.wheelView);1689    removeEventEx(this.zoutLayout, 'mousewheel DOMMouseScroll', this.wheelView);1690    removeEvent(this.column[0], 'selectionstart', cancelEvent);1691    removeEvent(this.column[1], 'selectionstart', cancelEvent);1692    this.graphDiv.innerHTML = '';1693  },1694  showBadBrowserBox: function() {1695    var s = (window.devicePixelRatio >= 2 ? '_2x' : '');1696    var content = getLang('stats_good_browser_box_msg') + '\1697    <div id="stats_good_browsers" class="clear_fix">\1698      <a href="http://www.mozilla-europe.org/" target="_blank" style="background: url(/images/firefox'+s+'.png) no-repeat 50% 17px;">Mozilla Firefox</a>\1699      <a href="http://www.google.com/chrome/" target="_blank" style="background: url(/images/chrome'+s+'.png) no-repeat 50% 17px;">Google Chrome</a>\1700      <a href="http://www.opera.com/" target="_blank" style="background: url(/images/opera'+s+'.png) no-repeat 50% 15px;">Opera</a>\1701      <a href="http://www.apple.com/safari/" target="_blank" style="background: url(/images/safari'+s+'.png) no-repeat 50% 12px;">Safari</a>\1702    </div>\1703    <style>\1704      #stats_good_browsers {\1705        height: 136px;\1706        margin: 10px auto 0 auto;\1707        width: 480px;\1708      }\1709      #stats_good_browsers a {\1710        float: left;\1711        height: 20px;\1712        padding: 106px 0 10px 0;\1713        width: 120px;\1714        text-align: center;\1715        -webkit-border-radius: 4px;\1716        -khtml-border-radius: 4px;\1717        -moz-border-radius: 4px;\1718        border-radius: 4px;\1719      }\1720      #stats_good_browsers a:hover {\1721        text-decoration: none;\1722        background-color: #edf1f5!important;\1723      }\1724    </style>';1725    cur.badBrowserBox = MessageBox({width: 540, hideButtons: true, bodyStyle: 'padding: 25px; text-align: center;', hideOnBGClick: true}).content(content).show();1726    if (!window.ajax) {1727      var b = cur.badBrowserBox.body();1728      hide(geByClass1('box_title_wrap', b.parentNode));1729      hide(geByClass1('box_controls_wrap', b.parentNode));1730    }1731  }1732}1733window.Graph = Graph;1734addEvent(document, 'touchstart touchmove touchend', function(ev) {1735  globalTouchCount = ev.touches.length;1736});1737})(window);...page.js
Source:page.js  
...619            error620          })621          .catch((e) => _debugLogger.debugLogger.log('error', e))622    }623    function takeHandle(arg) {624      const handle = globalThis[arg.name]['handles'].get(arg.seq)625      globalThis[arg.name]['handles'].delete(arg.seq)626      return handle627    }628    function deliverResult(arg) {629      globalThis[arg.name]['callbacks'].get(arg.seq).resolve(arg.result)630      globalThis[arg.name]['callbacks'].delete(arg.seq)631    }632    function deliverError(arg) {633      const error = new Error(arg.message)634      error.stack = arg.stack635      globalThis[arg.name]['callbacks'].get(arg.seq).reject(error)636      globalThis[arg.name]['callbacks'].delete(arg.seq)637    }...index.js
Source:index.js  
...737            require('./scoreTree').scoreHandle(op, bodyObject);738          }739          // OP OWNERSHIP CHANGE740          else if (doOp === 'take') {741            require('./takeTree').takeHandle(op, bodyObject);742          }743          // OP PROJECT CHANGE744          else if (doOp === 'project') {745            require('./projectTree').projectHandle(op, bodyObject);746          }747          // OP SCHEDULING748          else if (doOp === 'schedule') {749            require('./scheduleTree').scheduleHandle(op, bodyObject);750          }751          // OP TASK CREATION752          else if (doOp === 'task') {753            require('./taskTree').taskHandle(op, bodyObject);754          }755          // OP TEST-CASE CREATION...takeTree.js
Source:takeTree.js  
1// Serves the change-owner report page.2const serveTakeReport = (op, name) => {3  const {4    err,5    fs,6    globals,7    reportPrep,8    reportScriptPrep,9    servePage10  } = op;11  fs.readFile('takeReport.html', 'utf8')12  .then(13    htmlContent => {14      fs.readFile('report.js', 'utf8')15      .then(16        jsContent => {17          const newJSContent = reportScriptPrep(jsContent, '/taketally', [18            'total',19            'storyTotal',20            'taskTotal',21            'caseTotal',22            'changes',23            'storyChanges',24            'taskChanges',25            'caseChanges',26            'error'27          ]);28          const newContent = reportPrep(htmlContent, newJSContent)29          .replace('__takeWhoName__', name)30          .replace('__takeWhoRef__', globals.takeWhoRef);31          servePage(newContent, true);32        },33        error => err(error, 'reading report script')34      );35    },36    error => err(error, 'reading takeReport page')37  );38};39// Handles ownership change requests.40const takeHandle = (op, bodyObject) => {41  const {42    err,43    getGlobalNameRef,44    globals45  } = op;46  const {takeWho} = bodyObject;47  // If an owner other than the user was specified:48  if (takeWho) {49    // Serve a report identifying the new owner.50    getGlobalNameRef(takeWho, 'user', 'UserName')51    .then(52      ref => {53        if (! globals.isError) {54          globals.takeWhoRef = ref;55          serveTakeReport(op, takeWho);56        }57      },58      error => err(error, 'getting reference to new owner')59    );60  }61  // Otherwise, the new owner will be the user, so:62  else {63    globals.takeWhoRef = globals.userRef;64    // Serve a report identifying the user as new owner.65    serveTakeReport(op, globals.userName);66  }67};68// Sequentially ensures the ownership of an array of work items (tasks or test cases).69const takeItems = (op, longItemType, shortItemType, items) => {70  const {globals, err, shorten, report} = op;71  // If there are any items:72  if (items.length) {73    const firstItem = items[0];74    const firstRef = shorten(longItemType, longItemType, firstItem.ref);75    if (! globals.isError) {76      const owner = firstItem.owner;77      const ownerRef = shorten('user', 'user', owner);78      if (! globals.isError) {79        // If the ownership of the item needs to be changed:80        if (ownerRef !== globals.takeWhoRef) {81          // Change it.82          return globals.restAPI.update({83            ref: firstRef,84            data: {Owner: globals.takeWhoRef}85          })86          .then(87            // When it has been changed:88            () => {89              report(90                [['total'], ['changes'], [`${shortItemType}Total`], [`${shortItemType}Changes`]]91              );92              // Process the remaining items.93              return takeItems(op, longItemType, shortItemType, items.slice(1));94            },95            error => err(error, `changing ${longItemType} ownership`)96          );97        }98        // Otherwise, i.e. if the ownership of the item does not need to be changed:99        else {100          report([['total'], [`${shortItemType}Total`]]);101          // Process the remaining items.102          return takeItems(op, longItemType, shortItemType, items.slice(1));103        }104      }105      else {106        return Promise.resolve('');107      }108    }109    else {110      return Promise.resolve('');111    }112  }113  else {114    return Promise.resolve('');115  }116};117// Recursively changes ownerships in a tree or subtree of user stories.118const takeTree = (op, storyRefs) => {119  const {globals, err, shorten, report, getItemData, getCollectionData} = op;120  if (storyRefs.length && ! globals.isError) {121    const firstRef = shorten('userstory', 'hierarchicalrequirement', storyRefs[0]);122    if (! globals.isError) {123      // Get data on the first user story.124      return getItemData(firstRef, ['FormattedID', 'Owner'], ['Children', 'Tasks', 'TestCases'])125      .then(126        // When the data arrive:127        data => {128          report([['total'], ['storyTotal']]);129          const ownerRef = shorten('user', 'user', data.owner);130          if (! globals.isError) {131            // Report progress in the console if requested.132            if (globals.debug) {133              console.log(`Processing ${data.formattedID}`);134            }135            // Change the owner of the user story if necessary.136            const ownerWrong = ownerRef && ownerRef !== globals.takeWhoRef || ! ownerRef;137            if (ownerWrong) {138              report([['changes'], ['storyChanges']]);139            }140            return (ownerWrong ? globals.restAPI.update({141              ref: firstRef,142              data: {143                Owner: globals.takeWhoRef144              }145            }) : Promise.resolve(''))146            .then(147              // When the change, if any, has been made:148              () => {149                // Get data on the test cases, if any, of the user story.150                return getCollectionData(151                  data.testCases.count ? data.testCases.ref : '', ['Owner'], []152                )153                .then(154                  // When the data, if any, arrive:155                  cases => {156                    // Change the owner of any of them if necessary.157                    return takeItems(op, 'testcase', 'case', cases)158                    .then(159                      // When the changes, if any, have been made:160                      () => {161                        // Get data on the tasks of the user story.162                        return getCollectionData(163                          data.tasks.count ? data.tasks.ref : '', ['Owner'], []164                        )165                        .then(166                          // When the data, if any, arrive:167                          tasks => {168                            // Change the owner of any of them if necessary.169                            return takeItems(op, 'task', 'task', tasks)170                            .then(171                              // When the changes, if any, have been made:172                              () => {173                                // Get references to the child user stories of the user story.174                                return getCollectionData(175                                  data.children.count ? data.children.ref : '', [], []176                                )177                                .then(178                                  // When the references, if any, arrive:179                                  children => {180                                    // Process the child user stories, if any.181                                    return takeTree(op, children.map(child => child.ref))182                                    .then(183                                      /*184                                        When any have been processed, process the remaining user185                                        stories.186                                      */187                                      () => takeTree(op, storyRefs.slice(1)),188                                      error => err(error, 'changing owner of child user stories')189                                    );190                                  },191                                  error => err(error, 'getting references to child user stories')192                                );193                              },194                              error => err(error, 'changing owner of tasks')195                            );196                          },197                          error => err(error, 'getting data on tasks')198                        );199                      },200                      error => err(error, 'changing owner of test cases')201                    );202                  },203                  error => err(error, 'getting data on test cases')204                );205              },206              error => err(error, 'changing owner of user story')207            );208          }209          else {210            return '';211          }212        },213        error => err(error, 'getting data on user story')214      );215    }216    else {217      return Promise.resolve('');218    }219  }220  else {221    return Promise.resolve('');222  }223};224exports.takeHandle = takeHandle;...[id].js
Source:[id].js  
1import React, { useState, useEffect } from 'react';2import Layout from '../../components/Layout';3import Head from 'next/head';4import LeadDetails from '../../components/pocket-listing/LeadDetails';5import Contact from '../../components/pocket-listing/Contact';6import OtherLeads from '../../components/pocket-listing/OtherLeads';7import { Container, Row, Col } from 'react-bootstrap';8import { parseCookies } from 'nookies';9import { getUserInfoSSR } from '../../actions/auth';10import axios from 'axios';11import { API } from '../../config';12import useSWR from 'swr';13/* const preFetchOtherLeads = async id => {14	return await axios.get(`${API}/pockets/other/${id}`).then(res => {15		if (res.data && res.data.success) {16			return res.data.leads;17		} else {18			return null;19		}20	});21}; */22const preFetchLead = async id => {23	return await axios.get(`${API}/pockets/${id}`).then(res => {24		if (res.data && res.data.success) {25			return res.data.pocket;26		} else {27			return null;28		}29	});30};31const fetchLead = async (...args) => {32	return await axios.get(...args).then(res => {33		console.log(res);34		if (res.data && res.data.success) {35			return res.data.pocket;36		} else {37			return null;38		}39	});40};41const Lead = ({ userInfo, id, /* preFetchedOtherLeads,  */preFetchedLead }) => {42	const { data: lead } = useSWR(`${API}/pockets/${id}`, fetchLead, { initialData: preFetchedLead });43	/* const { data: leads } = useSWR(`${API}/pockets/other/${id}`, fetchLead, { initialData: preFetchedOtherLeads }); */44	const [modalShow, setModalShow] = useState(false);45	46    const [ContactInfo, setContactInfo] = useState({47		uid: userInfo?._id ? userInfo._id : null,48        firstName: userInfo && userInfo.firstName ? userInfo.firstName : '',49        lastName: userInfo && userInfo.lastName ? userInfo.lastName : '',50        email: userInfo && userInfo.email ? userInfo.email : '',51        phoneNumber: '',52        message: '',53		NDA: false54    });55	56    const [alert, setAlert] = useState({57        status: '',58        message: '',59    });60	const [submitProcess, setSubmitProcess] = useState(false);61	/* const [main, setMain] = useState(lead.images[0] ? lead.images[0] : '/property/image-from-rawpixel-id-558306-jpeg.jpg'); */62	useEffect(() => {63		/* setMain(lead && lead.images !== undefined ? lead.images[0] : '/property/image-from-rawpixel-id-558306-jpeg.jpg'); */64	}, [lead]);65	66	const onContactHandler = e => {67        const { name, value } = e.target;68        setContactInfo({ ...ContactInfo, [name]: value });69    };70	71    const phoneNumberHandler = e => {72        setContactInfo({ ...ContactInfo, phoneNumber: e });73    };74	const takeHandle = async e => {75		e.preventDefault();76		setSubmitProcess(true);77		setAlert({ status: 'secondary', message: 'Sending a message...' });78		let body = Object.assign({}, {79			authorId: lead.author,80			claimers: {81				...ContactInfo,82				uid: userInfo?._id ? userInfo._id : null83			},84			pocketId: lead._id,85			leadType: 'pocket-listing'86		});87		return await axios({88			method: 'PUT',89			url: `${API}/claims/update`,90			headers: {91				Accept: 'application/json',92				'Content-Type': 'application/json',93			},94			data: JSON.stringify(body),95			withCredentials: true,96		})97			.then(response => {98				if (response.data.success) {99					setAlert({ status: 'success', message: 'We will be contacting you shortly!' });100					setSubmitProcess('success');101				}102				return response;103			})104			.catch(err => {105				console.log(err);106				setAlert({ status: 'warning', message: 'Failed to send message!' });107				setSubmitProcess(false);108			});109	};110	/* const mainHandler = e => {111		setMain(e.target.src);112	}; */113	return (114		<Layout userInfo={userInfo} style={'black'}>115			<Head>116				<meta charSet="utf-8" />117				<meta name="viewport" content="initial-scale=1.0, width=device-width" />118				<title>Pocket Listings - Cozmo Realty</title>119				<meta name="description" content="" />120				<link rel="canonical" href="https://cozmorealty.com/pocket-listings" />121				<meta property="og:locale" content="en_US" />122				<meta property="og:type" content="website" />123				<meta property="og:title" content="Pocket Listings - Cozmo Realty" />124				<meta property="og:description" content="" />125				<meta property="og:url" content="https://cozmorealty.com/pocket-listings" />126				<meta property="og:site_name" content="Cozmo Realty" />127				<meta property="og:image" content="" />128			</Head>129			<main className="mt-99px">130				<section id="singleLead">131					<Container fluid className="">132						<Row className="h-100 justify-content-sm-center">133							<Col sm={12} md={8}>134								<LeadDetails userInfo={userInfo} lead={lead} /*  main={main} setMain={setMain} mainHandler={mainHandler}*/ />135							</Col>136							<Col sm={12} md={4}>137								<Contact 138									lead={lead} 139									takeHandle={takeHandle} 140									modalShow={modalShow} 141									setModalShow={setModalShow} 142									ContactInfo={ContactInfo}143									setContactInfo={setContactInfo}144									onContactHandler={onContactHandler}145									phoneNumberHandler={phoneNumberHandler}146									alert={alert} 147									setAlert={setAlert}148									submitProcess={submitProcess}149								/>150								{/* <OtherLeads leads={leads} /> */}151							</Col>152						</Row>153					</Container>154				</section>155			</main>156		</Layout>157	);158};159// getstaticprops160export const getServerSideProps = async ctx => {161	const id = ctx.params.id;162	const cookie = parseCookies(ctx);163	const cookieHeader = `express:sess=${cookie['express:sess']}; express:sess.sig=${cookie['express:sess.sig']}`;164	const userInfo = await getUserInfoSSR(cookieHeader);165	/* const preFetchedOtherLeads = await preFetchOtherLeads(id); */166	const preFetchedLead = await preFetchLead(id);167	return { props: { userInfo, id, /* preFetchedOtherLeads,  */preFetchedLead } };168};...Contact.js
Source:Contact.js  
1import React, { useState } from 'react';2import { Container, Row, Col, Button, Modal, Form, Alert, Spinner } from 'react-bootstrap';3import { API } from '../../config';4import axios from 'axios';5import PhoneInput from 'react-phone-input-2';6const Contact = ({ lead, takeHandle, modalShow, setModalShow, ContactInfo, setContactInfo, onContactHandler, phoneNumberHandler, alert, submitProcess }) => {7	return (8		<section id="lead-contact" className="roboto">9			<Container className="border p-4">10				<Row>11					<Col>12						<h2 className="mb-0">{lead.firstName + ' ' + lead.lastName}</h2> 13						<p>Agent</p>14					</Col>15				</Row>16				<Row>17					<Col sm={12} md={3}>18						<strong>19							<p className="dark mb-0">Email:</p>20						</strong>21					</Col>22					<Col sm={12} md={9}>23						<p className="text-right mb-0">24							<a href={`mailto:${lead.email}`}>{lead.email}</a>25						</p>26					</Col>27				</Row>28				<Row>29					<Col sm={12} md={3}>30						<strong>31							<p className="dark mb-2">Phone:</p>32						</strong>33					</Col>34					<Col sm={12} md={9}>35						<p className="text-right mb-2">36							<a href={`tel:${lead.phoneNumber}`}>{lead.phoneNumber}</a>37						</p>38					</Col>39				</Row>40				<Row>41					<Col>42						<Button className="primary-button" onClick={() => setModalShow(true)}>43							Submit Proposal44						</Button>45						<span className='d-block mt-4'>Want to talk with our agent? <br />We will reach out within 24 business hours to assist you.</span>46						<Modal show={modalShow} onHide={() => setModalShow(false)} centered id="borrower-contact-form">47							<Modal.Header closeButton>48								<Modal.Title>Want more details about property?</Modal.Title>49							</Modal.Header>50							<Modal.Body>51								<Container className="bg-white px-0">52									<form onSubmit={takeHandle}>53										<Row>54											<Col xs={12} className="mb-3">{alert.message ? <Alert variant={alert.status}>{alert.message}</Alert> : <></>}</Col>55											<Col xs={12} sm={6} className="pr-sm-2 pl-sm-3 px-3 mb-3">56												<Form.Control57													required58													type="text"59													name="firstName"60													value={ContactInfo.firstName}61													onChange={onContactHandler}62													placeholder="First Name"63												/>64											</Col>65											<Col xs={12} sm={6} className="pl-sm-2 pr-sm-3 px-3 mb-3">66												<Form.Control 67													required 68													type="text" 69													name="lastName" 70													value={ContactInfo.lastName} 71													onChange={onContactHandler} 72													placeholder="Last Name" 73												/>74											</Col>75											<Col xs={12} className="px-3 mb-3">76												<Form.Control77													required78													type="email"79													name="email"80													autoComplete="email"81													value={ContactInfo.email}82													onChange={onContactHandler}83													placeholder="Email Address"84												/>85											</Col>86											<Col xs={12} className="px-3 mb-3">87												<PhoneInput88													specialLabel={false}89													country="us"90													onlyCountries={['us']}91													disableDropdown92													disableCountryCode93													value={ContactInfo?.phoneNumber ? ContactInfo.phoneNumber.toString() : ''}94													placeholder={'Phone Number'}95													name="phoneNumber"96													onChange={phoneNumberHandler}97												/>98											</Col>99											<Col xs={12} className="px-3 mb-3">100												<Form.Control101													required102													name="message"103													value={ContactInfo.message}104													onChange={onContactHandler}105													as="textarea"106													rows="5"107													style={{ resize: 'none' }}108													placeholder="Your Message"109												/>110											</Col>111											<Col xs={12} className="px-3 mb-3">112												<Form.Check 113													type={'checkbox'}114													id={`NDA-checkbox`}115													label={`By marking this Checkbox, I agree to not to disclose any of infromation given by this agent to the others nor to the public. I agree to sign on this NDA provided by Cozmo Realty.`}116													style={{ fontSize: '0.8em', color: '#303030' }}117													onClick={e => setContactInfo({ ...ContactInfo, NDA: !ContactInfo.NDA })}118													disabled={submitProcess}119												/>120											</Col>121										</Row>122										<div className="button-wrapper mt-2">123											<Button type="submit" className="primary-button  mr-3" disabled={submitProcess || !ContactInfo.NDA}>124												{submitProcess && submitProcess !== 'success' ? <span className="button-inner-text"><Spinner animation="border" /></span> : submitProcess === 'success' ? <span className="button-inner-text">Message Sent!</span> : <span className="button-inner-text">Send Message</span> }125												126											</Button>127										</div>128									</form>129								</Container>130							</Modal.Body>131						</Modal>132					</Col>133				</Row>134			</Container>135		</section>136	);137};...test_type.gs
Source:test_type.gs  
1//go_import:github.com/gen0cide/gscript/tools/linker_test/typelib as typelib2function Deploy() {3  val = 123454  console.log(typelib.TakePointer(val))5  console.log(typelib.TakeHandle(val))6  var naming = G.rand.GetAlphaString(4)7  console.log(naming)8  DebugConsole()...Using AI Code Generation
1const { takeHandle } = require('playwright');2const { firefox } = require('playwright');3(async () => {4  const browser = await firefox.launch();5  const page = await browser.newPage();6  const pageHandle = await takeHandle(page);7  const childProcess = require('child_process');8  childProcess.fork('./childProcess.js', [pageHandle]);9})();10const { adoptHandle } = require('playwright');11const { firefox } = require('playwright');12(async () => {13  const pageHandle = process.argv[2];14  const page = await adoptHandle(pageHandle);15  console.log(await page.title());16  await page.close();17})();18#### browser.newContext([options])Using AI Code Generation
1const { takeHandle } = require('playwright/lib/client/helper');2const { chromium } = require('playwright');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  const element = await page.$('input[name="q"]');8  console.log(await takeHandle(element));9  await browser.close();10})();11const { takeHandle } = require('playwright/lib/client/helper');12const { chromium } = require('playwright');13(async () => {14  const browser = await chromium.launch();15  const context = await browser.newContext();16  const page = await context.newPage();17  const element = await page.$('input[name="q"]');18  console.log(await takeHandle(element));19  await browser.close();20})();Using AI Code Generation
1const { takeHandle } = require('playwright/lib/server/chromium/crBrowser');2const { chromium } = require('playwright');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  const element = await page.$('text=Get started');8  const handle = await takeHandle(element);9  console.log(handle._guid);10  await browser.close();11})();12const { takeHandle } = require('playwright/lib/server/chromium/crBrowser');13const { chromium } = require('playwright');14(async () => {15  const browser = await chromium.launch();16  const context = await browser.newContext();17  const page = await context.newPage();18  const element = await page.$('text=Get started');19  const handle = await takeHandle(element);20  console.log(handle._guid);21  await browser.close();22})();23const { takeHandle } = require('playwright/lib/server/chromium/crBrowser');24const { chromium } = require('playwright');25(async () => {26  const browser = await chromium.launch();27  const context = await browser.newContext();28  const page = await context.newPage();29  const element = await page.$('text=Get started');30  const handle = await takeHandle(element);31  console.log(handle._guid);32  await browser.close();33})();34const { takeHandle } = require('playwright/lib/server/chromium/crBrowser');35const { chromium } = require('playwright');36(async () => {37  const browser = await chromium.launch();38  const context = await browser.newContext();39  const page = await context.newPage();40  const element = await page.$('text=Get started');41  const handle = await takeHandle(element);42  console.log(handle._guid);Using AI Code Generation
1const { takeHandle } = require('playwright/lib/server/chromium/crPage');2const { Page } = require('playwright/lib/server/page');3const { Frame } = require('playwright/lib/server/frame');4const { ElementHandle } = require('playwright/lib/server/dom');5const { JSHandle } = require('playwright/lib/server/jsHandle');6Page.prototype.takeHandle = async function(selector) {7  const handle = await takeHandle(this, selector);8  return handle;9};10Frame.prototype.takeHandle = async function(selector) {11  const handle = await takeHandle(this, selector);12  return handle;13};14ElementHandle.prototype.takeHandle = async function(selector) {15  const handle = await takeHandle(this, selector);16  return handle;17};18JSHandle.prototype.takeHandle = async function(selector) {19  const handle = await takeHandle(this, selector);20  return handle;21};22(async () => {23  const browser = await chromium.launch({ headless: false });24  const context = await browser.newContext();25  const page = await context.newPage();26  const searchHandle = await page.takeHandle('input[name="q"]');27  await searchHandle.type('Playwright');28  await searchHandle.press('Enter');29  await page.screenshot({ path: 'example.png' });30  await browser.close();31})();Using AI Code Generation
1const { takeHandle } = require('@playwright/test/lib/server/frames');2const { Page } = require('@playwright/test/lib/server/page');3const { Frame } = require('@playwright/test/lib/server/frame');4const handle = await takeHandle(page.mainFrame(), (frame) => {5  return frame.evaluateHandle(() => {6    return document.querySelector('div');7  });8});9const frame = await Frame.from(handle);10const page = await Page.from(handle);11const elementHandle = await frame.evaluateHandle((handle) => handle, handle);Using AI Code Generation
1const { takeHandle } = require('playwright/lib/server/chromium/crBrowser');2const browser = await chromium.launch();3const page = await browser.newPage();4await takeHandle(page).then((handle) => {5  console.log(handle);6});7await browser.close();8const { takeElementHandle } = require('playwright/lib/server/chromium/crBrowser');9const browser = await chromium.launch();10const page = await browser.newPage();11await takeElementHandle(page).then((handle) => {12  console.log(handle);13});14await browser.close();15const { takeExecutionContext } = require('playwright/lib/server/chromium/crBrowser');16const browser = await chromium.launch();17const page = await browser.newPage();18await takeExecutionContext(page).then((handle) => {19  console.log(handle);20});21await browser.close();22const { takeFileChooser } = require('playwright/lib/server/chromium/crBrowser');23const browser = await chromium.launch();24const page = await browser.newPage();25await takeFileChooser(page).then((handle) => {26  console.log(handle);27});28await browser.close();29const { takeFrame } = require('playwright/lib/server/chromium/crBrowser');30const browser = await chromium.launch();31const page = await browser.newPage();Using AI Code Generation
1const { Page } = require('playwright');2Page.prototype.takeHandle = async function() {3  return await this._page._delegate._takeHandle();4};5const { Page } = require('playwright');6Page.prototype.releaseHandle = async function(handle) {7  return await this._page._delegate._releaseHandle(handle);8};9const { Page } = require('playwright');10Page.prototype.takeElementHandle = async function(handle) {11  return await this._page._delegate._takeElementHandle(handle);12};13const { Page } = require('playwright');14Page.prototype.releaseElementHandle = async function(handle) {15  return await this._page._delegate._releaseElementHandle(handle);16};17const { Page } = require('playwright');18Page.prototype.takeJSHandle = async function(handle) {19  return await this._page._delegate._takeJSHandle(handle);20};21const { Page } = require('playwright');22Page.prototype.releaseJSHandle = async function(handle) {23  return await this._page._delegate._releaseJSHandle(handle);24};25const { Page } = require('playwright');26Page.prototype.takeFrame = async function(handle) {27  return await this._page._delegate._takeFrame(handle);28};29const { Page } = require('playwright');30Page.prototype.releaseFrame = async function(handle) {31  return await this._page._delegate._releaseFrame(handle);32};33const { Page } = require('playwright');34Page.prototype.takeExecutionContext = async function(handle) {35  return await this._page._delegate._takeExecutionContext(handle);36};37const { Page } = require('playwright');38Page.prototype.releaseExecutionContext = async function(handle) {39  return await this._page._delegate._releaseExecutionContext(handle);40};41const { Page } = requireLambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
