function Controller(ch, vl, hl, tb, nb, nb2, ts)
{
this.NewsMarkers1 = null;
this.NewsMarkers2 = null;
this.NewsMarkers3 = null;
this.ChartAreas = null;
this.ChartRect = null;
this.ColorsTable = null;
this.TickersTable = null;


this.CHART = ch;
this.VLINE = vl;
this.HLINE = hl;
this.TRADES_BOARD = tb;
this.NEWS_BOARD = nb;
this.NEWS_BOARD2 = nb2;
this.TIME_SLICE = ts;

this.StartDragX;
this.StartDate;
this.Hmargin = 5;
this.LittleOffset = navigator.appName.search(/explorer/i)!=-1?2:0;
this.SliceBorderOffset = navigator.appName.search(/explorer/i)!=-1?1:-1;
this.OnZoomHandler = "";

/*<%-- Определение координаты указателя на странице --%>*/
this.GetY = function  (ev)
{
  return ev.clientY+document.body.scrollTop-this.LittleOffset;
}

/*<%-- Определение координаты указателя на странице --%>*/
this.GetX = function (ev)
{
  return ev.clientX+document.body.scrollLeft-this.LittleOffset;
}

/*<%-- Определение координаты указателя на диаграмме --%>*/
this.GetChartPoint = function (ev)
{
  var pt = new Object();
  pt.x = this.GetX(ev)-(parseInt(this.HLINE.style.left, 10)-this.ChartRect.left+this.Hmargin);
  pt.y = this.GetY(ev)-(parseInt(this.VLINE.style.top, 10)-this.ChartRect.top); 
  return pt;
}

/*<%-- Определение условий выхода за границы --%>*/
this.MouseRunOut = function (ev)
{
  var point = this.GetChartPoint(ev);
  var rv = point.x<this.ChartRect.left-this.Hmargin  ||
         point.x>this.ChartRect.right+this.Hmargin ||
         point.y<this.ChartRect.top   ||
         point.y>this.ChartRect.bottom ; 
  return rv;
}

/*<%-- Обработчик события выхода из объекта --%>*/
this.OnMouseOut = function (ev)
{
  var toElement = null;
  if (window.event==null)
    toElement = ev.relatedTarget;
  else
    toElement = window.event.toElement;
 
  if (toElement!=null && 
      toElement.id != this.VLINE.id &&
      toElement.id != this.HLINE.id && 
      toElement.id != this.CHART.id &&
      toElement.id != this.TIME_SLICE.id)
    this.HideLines();
}

/*<%-- Очистка диаграммы --%>*/
this.HideLines = function ()
{
    this.VLINE.style.visibility        = "hidden";
    this.HLINE.style.visibility        = "hidden";
    this.TRADES_BOARD.style.visibility = "hidden";
    this.NEWS_BOARD.style.visibility   = "hidden"; 
    this.TIME_SLICE.style.visibility   = "hidden";     
}
  
/*<%-- Поиск записей для отображения в подсказке --%>*/  
this.FindBoardContent = function (a, x)
{ 
  var res_array = new Array();
  
  if(a.length==0 || x < a[0].left || x > a[a.length-1].right)
    return res_array;

  var lb = 0, ub = a.length-1;
  while(lb<ub-1)
  {
    var node=(lb+ub)>>1;
    if(x>=a[node].left)
      lb = node;
    else
      ub = node;
  }
  //alert(lb+" "+a[lb].left+"<="+x)  
  for (var start = lb; start>=0 && a[start].left<=x && x<a[start].right; --start)
  {
    res_array.push(a[start])
  } 
  res_array = res_array.reverse();
  

  for (start = lb+1; start<a.length && a[start].left<=x && x<a[start].right; ++start)
  {
    res_array.push(a[start])
  }  
  
  return res_array; 
} 
 
/*<%-- Вывести подсказку --%>*/
/*<%-- boardon  - показать панель --%>*/
/*<%-- boardoff - скрыть панель   --%>*/
this.DisplayBoard = function (boardon, boardoff, ev)
{
   var axisoffset = 10;
   boardoff.style.visibility = "hidden";  
   boardon.style.left = (this.GetX(ev)+axisoffset+this.Hmargin)+"px";//(GetX(ev)+axisoffset+Hmargin)+"px";    
   boardon.style.top  = (this.GetY(ev)+axisoffset)+"px";//(GetY(ev)+axisoffset)+"px";   
   if (this.GetChartPoint(ev).x+parseInt(boardon.style.width,  10)+axisoffset>this.ChartRect.right) 
     boardon.style.left = (this.GetX(ev)-(parseInt(boardon.style.width,  10)+axisoffset+1))+"px"; 
   boardon.style.visibility   = "visible"; 
}

/*<%-- Просмотр наборов записей для маркеров --%>*/
/*<%-- а - набор записей --%>*/
this.FetchMarkers = function (a, ev)
{
  if (a.length>0 && a[0].top<this.GetChartPoint(ev).y && this.GetChartPoint(ev).y<a[0].bottom+2)
  {
    var content = this.FindBoardContent(a, this.GetChartPoint(ev).x); 
    var lastdate = "";
    var out = "";
    if (content.length>0)
    {
      out = "<TABLE border='0' cellpadding='2' class='tbl_newsboard'>";
      for (var i in content)
      {
        if (lastdate!=content[i].date)
        {
          lastdate = content[i].date;
          out = out+"<TR><TD><B>"+content[i].caption+" "+lastdate+"</B></TD></TR>";
        }
        out = out+"<TR><TD>"+content[i].time+" <A target=\"_blank\" href=\""+content[i].url+"\">"+content[i].title+"</A></TD></TR>";
      }
      out = out+"</TABLE>";
      this.NEWS_BOARD.innerHTML = out
    }         
  }  
}

/*<%-- Создание содержания подсказки для маркеров --%>*/
this.SetNewsBoardValues = function (ev)
{
  var board = this.NEWS_BOARD
  board.innerHTML = ""; 
            
  if (this.TIME_SLICE.style.visibility!="visible")
  { 
    this.FetchMarkers(this.NewsMarkers3, ev); 
    this.FetchMarkers(this.NewsMarkers2, ev); 
    this.FetchMarkers(this.NewsMarkers1, ev);     
  }
  if (window.event==null && board.innerHTML!="") 
  {
    board.style.width  = board.firstChild.offsetWidth+"px";
    board.style.height = board.firstChild.offsetHeight+"px"; 
  }    
  return board.innerHTML!="";
}

/*<%-- Создание содержания подсказки для графика --%>*/
this.SetTradesBoardValues = function (ev)
{
  var tbl = window.event==null?this.TRADES_BOARD.childNodes[1]:this.TRADES_BOARD.children[0]; 
  for (var i=tbl.tBodies[0].rows.length-1; i>=0; --i)
    tbl.tBodies[0].deleteRow(i);
   
  tbl.tHead.rows[0].cells[0].innerHTML = " "; 
  var prev = 0;

  for (var j=0; j<this.ChartAreas.length; ++j)
  {    
    var content = this.FindBoardContent(this.ChartAreas[j], this.GetChartPoint(ev).x); 
    if (content.length!=0)
    {    
      var tr = document.createElement("TR");//.insertRow();
      /*         
      var c1 = tr.insertCell();
      var c2 = tr.insertCell();
      var c3 = tr.insertCell();
      var c4 = tr.insertCell();
      */
      var c1 = document.createElement("TD");
      var c2 = document.createElement("TD");
      var c3 = document.createElement("TD");
      var c4 = document.createElement("TD"); 

      if (parseInt(content[0].left, 10)>=prev)
      {     
        tbl.tHead.rows[0].cells[0].innerHTML = content[0].Date.replace(/\s*00:00:00\s*/g, " ");        
        prev = parseInt(content[0].left, 10);
      }        

      //c2.width = "99%";
      c2.noWrap = c3.noWrap = c4.noWrap = true;
      var div = document.createElement("DIV");
      div.style.width = div.style.height = "10px";      
      div.style.backgroundColor = this.ColorsTable[j];
      c1.appendChild(div);
      c2.innerHTML = content[0].Close;
      c3.innerHTML = content[0].VDay;  
      c4.innerHTML = this.TickersTable[j];     
      //c3.innerHTML = tbl.getBoundingClientRect().right-tbl.getBoundingClientRect().left; /**/  
       
      tr.appendChild(c1); 
      tr.appendChild(c2);
      tr.appendChild(c3); 
      tr.appendChild(c4);   
      tbl.tBodies[0].appendChild(tr);                
    } 
  }  
 
  //this.TRADES_BOARD.style.width = (tbl.getBoundingClientRect().right-tbl.getBoundingClientRect().left)+"px"; 
  this.TRADES_BOARD.style.width = (tbl.offsetWidth)+"px";
  this.TRADES_BOARD.style.height = (tbl.offsetHeight)+"px";     
    
}
 
/*<%-- Позиционирование подсказки --%>*/  
this.MoveBoard = function (ev)
{ 
  if (this.SetNewsBoardValues(ev))
  {
    this.DisplayBoard(this.NEWS_BOARD, this.TRADES_BOARD, ev);  
    this.CHART.style.cursor = "pointer"
    this.VLINE.style.cursor = "pointer"
    this.HLINE.style.cursor = "pointer"        
  }
  else
  {
    this.SetTradesBoardValues(ev);          
    this.CHART.style.cursor = "auto"
    this.VLINE.style.cursor = "auto"
    this.HLINE.style.cursor = "auto"       
    this.DisplayBoard(this.TRADES_BOARD, this.NEWS_BOARD, ev);
  }
  
  this.NEWS_BOARD2.style.visibility = "hidden";
 
}

/*<%-- Растяжение области выделения --%>*/
this.ExpandTimeSlice = function (posX)
{
    if (this.TIME_SLICE.style.visibility=="visible")
    {
      if (posX>this.StartDragX)
      {
        this.TIME_SLICE.style.left = this.StartDragX+"px";
        this.TIME_SLICE.style.width = (posX-this.StartDragX+this.SliceBorderOffset)+"px"; 
      } 
      else
      {
        this.TIME_SLICE.style.left = posX+"px";
        this.TIME_SLICE.style.width = (this.StartDragX-posX+this.SliceBorderOffset)+"px"; 
      }
    } 
}



/*<%-- Обработчик перемещения мыши по диаграмме --%>*/
this.OnMousemoveCHART = function (ev)
{ 
  if (window.event!=null)
    ev = window.event;
    
  var offsetX = ev.clientX;
  var offsetY = ev.clientY; 
  if (window.event==null)
  {
    offsetX -= ev.target.x+(ev.clientX-ev.pageX);
    offsetY -= ev.target.y+(ev.clientY-ev.pageY);     
  }
  else
  {
    offsetX = window.event.offsetX;
    offsetY = window.event.offsetY;  
  }

   
  if (!this.MouseRunOut(ev))
  { 
    this.HLINE.style.left = (this.GetX(ev)-offsetX+this.ChartRect.left-this.Hmargin)+"px";
    this.HLINE.style.top  = this.GetY(ev)+"px";
    
    this.VLINE.style.left =  this.GetX(ev)+"px";  
    this.VLINE.style.top  = (this.GetY(ev)-offsetY+this.ChartRect.top)+"px";  
    this.MoveBoard(ev);    
    this.HLINE.style.width  = (this.ChartRect.right-this.ChartRect.left+this.Hmargin*2)+"px"//this.CHART.width;
    this.VLINE.style.height = (this.ChartRect.bottom-this.ChartRect.top)+"px"//this.CHART.height; 
    this.VLINE.style.visibility  = "visible"; 
    this.HLINE.style.visibility  = "visible";
    this.ExpandTimeSlice(this.GetX(ev));
  }
  else
  {
    this.HideLines();
  } 
}

/*<%-- Обработчик перемещения мыши по линиям указателя --%>*/
this.OnMousemoveLINES = function (ev)
{ 
    if (window.event!=null)
      ev = window.event;
    
    this.VLINE.style.left = this.GetX(ev)+"px";
    this.HLINE.style.top  = this.GetY(ev)+"px";
    this.MoveBoard(ev);
    this.ExpandTimeSlice(this.GetX(ev));
} 

/*<%-- Обработик события нажатия мыши на горизонтальной линии указателя --%>*/
this.OnMousedownHLINE = function (ev)
{
  if (window.event!=null)
    ev = window.event;

  this.StartDragX = parseInt(this.VLINE.style.left)-1//GetX(ev);
  if (this.NEWS_BOARD.style.visibility!="visible")
  {
    this.StartDate  = this.GetChartPoint(ev).x//this.TRADES_BOARD.children[0].rows[0].cells[0].innerText;
    this.TIME_SLICE.style.left   = this.StartDragX+"px";
    this.TIME_SLICE.style.top    = this.VLINE.style.top;  
    this.TIME_SLICE.style.width  = "0px"  
    this.TIME_SLICE.style.height = this.ChartRect.bottom-this.ChartRect.top+"px";
    this.TIME_SLICE.style.visibility = "visible"; 
  }
  else
  {
    if (this.NEWS_BOARD.getElementsByTagName("A").length>1)
    {
      this.NEWS_BOARD2.style.left   = this.GetX(ev)-20;
      this.NEWS_BOARD2.style.top    = this.GetY(ev)-20;
      this.NEWS_BOARD2.style.width  = this.NEWS_BOARD.style.width; 
      this.NEWS_BOARD2.style.height  = this.NEWS_BOARD.style.height;           
      this.NEWS_BOARD2.innerHTML = this.NEWS_BOARD.innerHTML          
      this.NEWS_BOARD2.style.visibility = "visible";      
      this.NEWS_BOARD.style.visibility = "hidden";      
    }
    else
    {
      if (this.NEWS_BOARD.getElementsByTagName("A").length==1)
        window.open(this.NEWS_BOARD.getElementsByTagName("A")[0].href, "_blank")
        //document.location.href = this.NEWS_BOARD.getElementsByTagName("A")[0].href;
    }
  }
}

/*<%-- Обработик события отпускания кнопки мыши --%>*/
/*<%-- Увеличение изображение выбранного фрагмента --%>*/
this.OnMouseUp = function (ev)
{
  if (window.event!=null)
    ev = window.event;

  if (this.TIME_SLICE.style.visibility!="hidden")
  {        
    this.TIME_SLICE.style.visibility = "hidden";
    if (this.StartDate!=this.GetChartPoint(ev).x)
    {
      /*<%-- Подготовка параметров для запроса --%>*/
      var st = this.GetChartPoint(ev).x, en;
      if (this.StartDate<st)
      { 
        en = st
        st = en-parseInt(this.TIME_SLICE.style.width, 10); 
      }   
      else
        en = st+parseInt(this.TIME_SLICE.style.width, 10);

      var stresult = this.FindBoardContent(this.ChartAreas[0], st);
      var enresult = this.FindBoardContent(this.ChartAreas[0], en); 
      

       
      var starg = stresult[0].Date.replace(/\s*-.*/, "")
      var enarg = enresult[0].Date.replace(/[^-]*-\s*/, "")      
      eval(this.OnZoomHandler.replace(/arguments/, starg+"|"+enarg+"|"+stresult[0].Index+"|"+enresult[0].Index));
    }
  }
}


}// Controller

