/***
 * ajax_graph.js  (require prototype.js)
 *
 *      IRI Ubiteq, Co. 2007.04.20
 ***/

var dragFlag = false;
var mx = 0;
var offsetX = 0;
var offsetBarX = 0;
var maxChartX = 400 - 800;
var scaleHash = $H({daily:"d", weekly:"w", monthly:"m"});
var n = 0;
var targetImage = 'ajax_graph_create.rbx';
var targetInfo = 'ajax_graph_info.rbx';
var ajaxSend = false;

function init() {
  Event.observe($('chart-sheet'), "mousemove", moveChart, true);
  Event.observe($('yellow'), "mousemove", moveChart, true);
  Event.observe($('chart-sheet'), "mouseup", upChart, true);
  Event.observe($('yellow'), "mouseup", upChart, true);
  Event.observe($('chart-sheet'), "mousewheel", wheelChart, true);
  Event.observe($('yellow'), "mousewheel", wheelChart, true);
  Event.observe($('chart-sheet'), "DOMMouseScroll", wheelChart, true);
  Event.observe($('yellow'), "DOMMouseScroll", wheelChart, true);
}

function clickChart() {
  dragFlag = true;
  offsetX = mx - parseInt($('chart-sheet').style.left);
  offsetBarX = mx - parseInt($('yellow').style.left);
}

function upChart(event) {
  dragFlag = false;
}

function moveChart(event) {
  mx = Event.pointerX(event);
  pos = parseInt($('chart-sheet').style.left);
  divx = parseInt($('chart').offsetLeft);
  diff = pos + 800 + divx - mx;
  n = Math.floor(diff / 7) + 1;
  $('yellow').style.left = pos + 800 - (7 * n);
  displayBarInfo();
//  $('debug').innerHTML = n;

  if (!dragFlag) return;
  if (mx - offsetX > 0) mx = offsetX;
  if (mx - offsetX < maxChartX) mx = offsetX + maxChartX;
  $('chart-sheet').style.left = mx - offsetX;
  $('yellow').style.left = mx - offsetBarX;
  return false;
}

function overChart(event) {
  $('yellow').style.visibility = "visible";
}

function outChart(event) {
  $('yellow').style.visibility = "hidden";
}

function wheelChart(event) {
  var delta = 0;
  if (event.wheelDelta) {
    delta = event.wheelDelta/120;
    if (window.opera) {
      delta = -delta;
    }
  } else if (event.detail) {
    delta = -event.detail/3;
  }

  if (delta < 0) {
    /** down **/
    wheelDownChart();
  } else {
    /** up **/
    wheelUpChart();
  }
}

function wheelDownChart() {
  var scaleSize = parseInt($('scale-label').value);
  if (scaleSize != 3) {
    if (scaleSize == 1) {
      $('scale-label').value = "2";
    } else if (scaleSize == 2) {
      $('scale-label').value = "3";
    }
    requestImage();
  }
}

function wheelUpChart() {
  var scaleSize = parseInt($('scale-label').value);
  if (scaleSize != 1) {
    if (scaleSize == 3) {
      $('scale-label').value = "2";
    } else if (scaleSize == 2) {
      $('scale-label').value = "1";
    }
    requestImage();
  }
}

function displayChart(date) {
  var scaleSize = parseInt($('scale-label').value);
  var company = $F('company');
  var pre = "img/";
  if (scaleSize == 3) {
    company = company + scaleHash.monthly + date + ".png";
  } else if (scaleSize == 2) {
    company = company + scaleHash.weekly + date + ".png";
  } else if (scaleSize == 1) {
    company = company + scaleHash.daily + date + ".png";
  }
//alert(company);
  var sname = pre + "scale" + company;
  var cname = pre + company;
  $('scale-sheet').src = sname;
  $('chart-sheet').src = cname;
}

function displayBarInfo() {
  var i = n - 1;
  if ((i >= 1) && (i <= 113)) {
    var str = 'bar-'+i;
    var line = $(str).value;
    var col = line.split(',');
    $('info-date').innerHTML = col[0];
    if (col.length > 1) {
      $('info-start').innerHTML = col[1];
      $('info-max').innerHTML = col[2];
      $('info-min').innerHTML = col[3];
      $('info-end').innerHTML = col[4];
      $('info-volume').innerHTML = col[5];
    } else {
      $('info-date').innerHTML = "";
      $('info-start').innerHTML = "";
      $('info-max').innerHTML = "";
      $('info-min').innerHTML = "";
      $('info-end').innerHTML = "";
      $('info-volume').innerHTML = "";
    }
  } else {
    $('info-date').innerHTML = "";
    $('info-start').innerHTML = "";
    $('info-max').innerHTML = "";
    $('info-min').innerHTML = "";
    $('info-end').innerHTML = "";
    $('info-volume').innerHTML = "";
  }
}

function requestImage() {
  $('chart-error').style.visibility = "hidden";

  var sca = $('scale-label').value;
  var dat = $('info-date').innerHTML;
  var com = $F('company');
  if (!com) return;
  if (dat.match(/^[0-9][0-9][0-9][0-9]\/[0-9]?[0-9]\/$/)) {
    dat = dat.concat("1");
  }
  var param = 'company=' + com + '&date=' + dat + '&scale=' + sca;
//alert(param);
  $('chart-load').style.visibility = "visible";
  var ajaxConnect = new Ajax.Request( targetImage,
                               { method: 'get',
                                 parameters: param,
                                 onSuccess: successImage,
                                 onFailure: failureImage,
                                 onComplete: completeImage });
}

function loadingImage(response) {
  if (!ajaxSend) return;
  $('info-status').style.visibility = "visible";
  $('chart-load').style.visibility = "visible";
}

function completeImage(response) {
  $('chart-load').style.visibility = "hidden";
}

function successImage(response) {
  var res = response.responseText
  if (res.match(/^[0-9][0-9][0-9][0-9]\//)) {
    var dates = res.split(':');
    for (i = 1; i < 114; i++) {
      var id = 'bar-' + i;
      if (dates[i - 1]) {
        $(id).value = dates[i - 1];
      } else {
        $(id).value = "";
      }
    }
    var d = dates[0].split(',');
    var dat = d[0].replace(/\//g, '-');
    displayChart(dat);
  } else {
    failureImage(response);
  }
}

function failureImage(response) {
  $('chart-error').style.visibility = "visible";
}
