
//

flg_ButtonEnabled = 0x00;       // кнокпа разрешена (default)
flg_ButtonDisabled = 0x01;      // кнопка запрещена
flg_CaptionDisabled = 0x00;     // запретить показ названия кнопки
flg_CaptionEnabled = 0x02;      // разрешить показ названия кнопки
flg_CaptionRight = 0x00;        // выводить название кнопки справа от картинки (default)
flg_CaptionBottom = 0x04;       // выводить название кнопки под картинкой
flg_ButtonPressed = 0x08;       // кнопка нажата
flg_ButtonInvisible = 0x10;     // кнопка нажата

s_unsel = " unselectable=on ";
//
// Перечень функций:
//   insertButton(s_name,s_img,s_caption,s_title,s_cmd,w_attrs,w_order,w_width)
//   insertSelect(s_name,s_caption,s_font,s_title,s_cmd,w_attrs,w_width,w_order)
//   insertOption(s_owner_name,s_caption,s_font,s_value)
//   insertSpliter(w_order) 
//   findElement(s_name)
//   getButtonId(s_name)
//   changeButtonStatus(s_name,b_status) 
//   setPressedAttribute(s_name,b_pressed)
//   getButtonAttribute(s_name,s_attr_name)
//   setButtonAttribute(s_name,s_attr_name,s_value)
//   buttonBgColor(s_name,s_color) 
//   modifySelectText(s_name,s_text,s_font)
//   init(b_sort_flag)
//   hide()
//   show(b_sort_flag)
//   inserData(arr_panel_data)

function ControlPanel()
  {
    // параметры
    this.o_owner = document.body;
    this.path;                                 // default путь
    this.css_path          = "css/";           // путь к CSS-файлу панели
    this.imgs_path         = "icons/";         // пукть к иконкам
    this.special_imgs_path = "imgs/";          // путь к служебным иконка
    this.css_file          = "panel.css";      // CSS-файл панели
    this.panel_class       = "panel";          // класс для панели
    this.item_class        = "buttons";        // класс для кнопок панели
    this.item_over_class   = "buttons_over";   // класс для наезда мышом на кнопку
    this.item_press_class  = "button_pressed"; // класс для нажатой кнопки            

    this.width;
    this.disabled_opacity  = 40;   // прозрачность запрещенных кнопок
    this.btn_width         = 25;   // ширина кнопки
    this.btn_height        = 24;   // высота кнопки
    this.btn_hspace        = 0;


    // служебные переменные
    this.panel_width 	= 0;
    this.initialized 	= 0;
    this.sorted 	= 0;
    this.buttons_cnt 	= 0;
    this.spliters_cnt 	= 0;
    this.display_type	= "inline";

    this.o_panel = document.createElement("SPAN");
    this.o_panel.unselectable = "on";
    this.o_panel.className = this.panel_class;
    this.items = new Array();

    // Функция correct_paths - корректирует пути к служебным данным
    this.correct_paths = function ()
      {
        if (typeof(this.path)!="undefined" && this.path!="")
          {
            this.css_path = this.path + this.css_path;
            this.imgs_path = this.path + this.imgs_path;
            this.special_imgs_path = this.path + this.special_imgs_path;
          }
        this.path = "";
      };
    // Функция insertButton - добавляет кнопку в тулбар
    // параметры:
    //  s_name          имя кнопки
    //  s_img           картинка
    //  s_caption       название
    //  s_title         всплывающая подсказка
    //  s_cmd           команда на onClick (javascript)
    //  w_attrs         слово атрибутов (комбинация констант кнопок)
    //  w_order         порядковый номер кнопки в тулбаре (не обязтальный параметр)
    //  w_width         ширина кнопки (не обязтальный параметр)
    this.insertButton = function(s_name,s_img,s_caption,s_title,s_cmd,w_attrs,w_order,w_width)
      {
        this.correct_paths();
        var new_item = new Object();
        new_item["id"] = "";
        new_item["name"] = s_name;
        new_item["img"] = this.imgs_path+s_img;
        new_item["caption"] = s_caption;
        new_item["title"] = s_title;
        new_item["cmd"] = s_cmd;
        new_item["attrs"] = w_attrs;
        new_item["width"] = w_width!=undefined?w_width:this.btn_width;
        new_item["hspace"] = this.btn_hspace;
        new_item["type"] = "button";
        if ((w_order==undefined)||(w_order==null))
          w_order = this.items.length;
//        this.items[w_order] = new_item;

        this.items = (new Array).concat(this.items.slice(0,w_order),new_item,this.items.slice(w_order));

        this.panel_width += new_item["width"];
        this.buttons_cnt++;
      };
    // Функция insertSelect - добавляет SELECT в тулбар
    // параметры:
    //  s_name          имя SELECTа
    //  s_caption       начальный текст SELECTа
    //  s_font          шрифт начального текста
    //  s_title         всплывающая подсказка
    //  s_cmd           команда на onChange ( Пример - javascript:alert('%res%') ). 
    //                  где %res% - значение выбраного OPTIONa
    //                  PS: вызов функций должен осуществляться так: parent.function_name(arg);
    //  w_attrs         слово атрибутов (комбинация констант кнопок)
    //  w_width         ширина кнопки
    //  w_order         порядковый номер кнопки в тулбаре (не обязтальный параметр)
    this.insertSelect = function(s_name,s_caption,s_font,s_title,s_cmd,w_attrs,w_width,w_order)
      {
        var new_item = new Object;
        new_item["id"] = "";
        new_item["name"] = s_name;
        new_item["caption"] = s_caption;
        new_item["font"] = s_font;
        new_item["title"] = s_title;
        new_item["cmd"] = s_cmd;
        new_item["attrs"] = w_attrs;
        new_item["width"] = w_width;
        new_item["items"] = new Array;
        new_item["type"] = "select";
        if (w_order==undefined)
          w_order = this.items.length;
//        this.items[w_order] = new_item;
        this.items = (new Array).concat(this.items.slice(0,w_order),new_item,this.items.slice(w_order));
        this.panel_width += new_item["width"];
      };
    // Функция insertOption - добавляет OPTIONы к созданым SELECTам
    // параметры:
    //  s_owner_name    имя SELECTа-владельца
    //  s_caption       текст OPTIONа
    //  s_font          шрифт текста
    //  s_value         значение OPTIONа
    this.insertOption = function(s_owner_name,s_caption,s_font,s_value)
      {
        var n = this.findElement(s_owner_name);
        if ((n==null)||(this.items[n]["type"]!="select")) return;
        var new_option = new Object;
        new_option["caption"] = s_caption;
        new_option["font"] = s_font;
        new_option["value"] = s_value;
        this.items[n]["items"][this.items[n]["items"].length] = new_option;
      };
    // Функция insertSpliter - добавляет разделить в тулбар
    // параметры:
    //   w_order - порядковый номер кнопки в тулбаре (не обязатальный параметр)
    this.insertSpliter = function(w_order) 
      {
        this.correct_paths();
        var new_item = new Object();
        new_item["type"] = "spliter";
        new_item["img"] = this.special_imgs_path+"spliter.gif";
        if (w_order==undefined)
          w_order = this.items.length;
//        this.items[w_order] = new_item;
        this.items = (new Array).concat(this.items.slice(0,w_order),new_item,this.items.slice(w_order));
        this.panel_width += 4;
        this.spliters_cnt++;
      };
    // Функция findElement - выполняет поиск элемента по имени
    // возвращает номер найденного элемента или null
    // параметры:
    //   s_name имя элемента
    this.findElement = function(s_name)
      {
        var n = null;
        for (var i in this.items)
          if (this.items[i]["name"]==s_name)
            {
              n = i;
              break;
            }
        return n;
      };
    // Функция getButtonId - возвращает Id кнопки 
    // параметры:
    //   s_name имя элемента
    this.getButtonId = function(s_name)
      {
        var n = this.findElement(s_name);
        return this.items[n]["id"];
      };
    // Функция changeButtonStatus - изменяет статус кнопки (запрещена/разрешена)
    // параметры:
    //   s_name 	имя кнопки
    //   b_status	состояние (0 - запрещена, 1 - разрешена)
    this.changeButtonStatus = function(s_name,b_status) 
      {
        var n = this.findElement(s_name);
        var o_btn;
        if ((n==null)||((o_btn = document.getElementById(this.items[n]["id"]))==null)) return;
        if (b_status)
          {
            var opacity = this.disabled_opacity;
            o_btn.onclick = null;
            o_btn.onmouseout = null;
            o_btn.onmouseover = null;
          }
        else
          {
            var opacity = 100;
            var normal_class = (this.items[n]["attrs"] & flg_ButtonPressed)>0?this.item_press_class:this.item_class;
            o_btn.className = normal_class;
            eval("o_btn.onclick = function() {"+this.items[n]["id"]+".className='"+this.item_press_class+"';"+this.items[n]["cmd"]+";}");
            eval("o_btn.onmouseover = function() {"+this.items[n]["id"]+".className='"+this.item_over_class+"';}");
            eval("o_btn.onmouseout = function() {"+this.items[n]["id"]+".className='"+normal_class+"';}");
          }
        o_btn.style.filter = "alpha(opacity="+opacity+")";
      };
    // Функция setPressedAttribute - изменяет состояние кнопки (нажата/отжата)
    //    s_name        имя кнопки
    //    b_pressed	значение атрибута (0,1)
    this.setPressedAttribute = function (s_name,b_pressed)
      {
        var n = this.findElement(s_name);
        if ((n==null)||(o_btn = document.getElementById(this.items[n]["id"]))==null) return;
        this.items[n]["attrs"] = b_pressed?this.items[n]["attrs"]|flg_ButtonPressed:this.items[n]["attrs"]&(~flg_ButtonPressed);
        var normal_class = (this.items[n]["attrs"] & flg_ButtonPressed)>0?this.item_press_class:this.item_class;
        o_btn.className = normal_class;
        eval("o_btn.onmouseout = function() {"+this.items[n]["id"]+".className='"+normal_class+"';}");
      };
    // Функция getButtonAttribute - получает атрибуты элементов тулбара
    //  параметры:
    //    s_name        имя кнопки
    //    s_attr_name   имя атрибута (см. функцию insertSelect)
    this.getButtonAttribute = function(s_name,s_attr_name)
      {
        var n = this.findElement(s_name);
        if ((n==null)||(typeof(this.items[n][s_attr_name])=="undefined")) return;
        return this.items[n][s_attr_name];
      }
    // Функция setButtonAttribute - изменяет атрибуты элементов тулбара
    //  параметры:
    //    s_name        имя кнопки
    //    s_attr_name   имя атрибута (см. функцию insertSelect)
    //    s_value       значение атрибута
    this.setButtonAttribute = function(s_name,s_attr_name,s_value)
      {
        var n = this.findElement(s_name);
        if ((n==null)||(o_btn = document.getElementById(this.items[n]["id"]))==null) return;
        this.items[n][s_attr_name] = s_value;
        var normal_class = (this.items[n]["attrs"] & flg_ButtonPressed)>0?this.item_press_class:this.item_class;
        o_btn.className = normal_class;
        eval("o_btn.onmouseout = function() {"+this.items[n]["id"]+".className='"+normal_class+"';}");
        if (s_attr_name=="cmd")
          eval("o_btn.onclick = function() {"+o_btn.uniqueID+".className='"+this.item_press_class+"';"+this.items[n]["cmd"]+";}");
      };
    //  Функция buttonBgColor - меняет индикатор цвета у кнопок цвет шрифта\фона
    //  если s_color не задан - возвращает текущий установленный цвет
    //  параметры:
    //    s_name        имя кнопки
    //    s_color       цвет фона картинки кнопки
    this.buttonBgColor = function(s_name,s_color) 
      {
        var n = this.findElement(s_name);
        var o_btn;
        if ((n==null)||(o_btn = document.getElementById(this.items[n]["id"]))==null) return;
        if (s_color==undefined)
          return o_btn.childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0].style.backgroundColor;
        else
          o_btn.childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0].style.backgroundColor = s_color;
      };
    // Функция modifySelectText - изменяет текст указанного SELECTa
    //  параметры:
    //    s_name        имя кнопки
    //    s_text	новый текст
    //	  s_font	шрифт текста
    this.modifySelectText = function(s_name,s_text,s_font)
      {
        var n = this.findElement(s_name);
        if ((n==null)||(o_btn = document.getElementById(this.items[n]["id"]))==null) return;
        var item = document.getElementById(o_btn.uniqueID).childNodes[0].childNodes[0].childNodes[0].childNodes[0];
        item.innerHTML = s_text;
        if (s_font!=undefined)
          item.style.fontFamily = s_font;
      };
    // Функция init - выводит тулбар на страницу
    // параметры:
    //   b_sort_flag - признак сортировки элементов тулбара (0 или 1)
    this.init = function(b_sort_flag)
      {
        document.createStyleSheet(this.css_path+this.css_file); 
        this.correct_paths();
        if (this.initialized==0)
          {
            this.initialized++;
            this.o_owner.appendChild(this.o_panel);
          }
        var o_panel = this;
        while (this.o_panel.children(0)!=null)  
          this.o_panel.removeChild(this.o_panel.children(0));
        if (b_sort_flag && this.sorted==0)
          {
            this.items.sort();
            this.sorted++;
          }
        for (var i in this.items)
          if (this.items[i]["type"]=="spliter")
            {
              var o_spliter = document.createElement("SPAN");
              o_spliter.className = "spliter";
              o_spliter.innerHTML = "<IMG src="+this.items[i]["img"]+" align=bottom hspace=1 width=4 height="+(this.btn_height-6)+">";
              this.o_panel.appendChild(o_spliter);
            }
          else
            {
              var o_btn = document.createElement("SPAN");
              o_btn.unselectable = "on";
              o_btn.style.width = this.items[i]["width"];
              o_btn.style.height = this.btn_height-1;
              o_btn.title = this.items[i]["title"];
              this.items[i]["id"] = o_btn.uniqueID;
              var normal_class = (this.items[i]["attrs"] & flg_ButtonPressed)>0?this.item_press_class:this.item_class;
              o_btn.className = normal_class;
              if ((this.items[i]["attrs"] & flg_ButtonDisabled)>0)
                o_btn.style.filter = "alpha(opacity="+this.disabled_opacity+")";
              else
                {
                  eval("o_btn.onmouseover = function() {"+o_btn.uniqueID+".className='"+this.item_over_class+"';}");
                  eval("o_btn.onmouseout = function() {"+o_btn.uniqueID+".className='"+normal_class+"';}");
                }
              switch (this.items[i]["type"]) {
                case "button":
                  if ((this.items[i]["attrs"] & flg_ButtonDisabled)==0)
                    eval("o_btn.onclick = function() {"+o_btn.uniqueID+".className='"+this.item_press_class+"';"+this.items[i]["cmd"]+";}");
                  var HTML = "<TABLE cellspacing=0 cellpadding=0"+s_unsel+
                    "height="+(this.btn_height-4)+" width="+(this.btn_width-3)+">"+
                    "<TR"+s_unsel+"><TD align=center"+s_unsel+" nowrap>"+
                    "<IMG"+s_unsel+"src='"+this.items[i]["img"]+"' hspace="+this.items[i]["hspace"];
                  if ((this.items[i]["attrs"] & flg_CaptionEnabled)>0)
                    {
                      if ((this.items[i]["attrs"] & flg_CaptionBottom)>0)
                        HTML += " vspace=2><BR";
                      HTML += ">"+this.items[i]["caption"];
                    }
                  HTML += "</TD></TABLE>";
                  break;
                case "select":
                  o_popup = window.createPopup();
                  o_popup.document.createStyleSheet(this.css_path+this.css_file);
                  var HTML = "<DIV class=popup"+s_unsel+">";
                  for (var j in this.items[i]["items"])
                    {
                      var cmd = this.items[i]["cmd"].replace(/'/g,"\\'");
                      cmd = cmd.replace("%res%",this.items[i]["items"][j]["value"]);
                      HTML += "<DIV"+s_unsel;
                      if (this.items[i]["items"][j]["font"]!="")
                        HTML += "style=\"font-family:"+this.items[i]["items"][j]["font"]+"\" ";
                      HTML += "onMouseOver=\"this.style.backgroundColor=\\'#000080\\';this.style.color=\\'white\\';\" "+
                        "onMouseOut=\"this.style.backgroundColor=\\'\\';this.style.color=\\'\\';\" "+
                        "onClick=\"obj=parent."+o_btn.uniqueID+".childNodes[0].childNodes[0].childNodes[0].childNodes[0];"+
                        "obj.style.fontFamily=this.style.fontFamily;obj.innerText=this.innerText;parent.o_popup.hide();"+
                        cmd+"\">";
                      HTML += this.items[i]["items"][j]["caption"]+"</DIV>";
                    }
                  HTML += "</DIV>";
                  var handle = "o_popup.document.body.innerHTML='"+HTML+"';o_popup.show(1,"+(this.btn_height-1)+","+this.items[i]["width"]+",135,"+o_btn.uniqueID+");";
                  eval("o_btn.onclick = function(){"+handle+"}");

                  HTML = "<TABLE cellspacing=0 cellpadding=0 height=100%"+s_unsel+"><TR"+s_unsel+">";
                  HTML += "<TD"+s_unsel+"class=select_txt style='width:"+(this.items[i]["width"]-13)+";font-family:"+this.items[i]["font"]+";'>"+this.items[i]["caption"]+"</TD>";
                  HTML += "<TD"+s_unsel+"class=select_arr><IMG"+s_unsel+"src='"+this.special_imgs_path+"arrow.gif'></TD>";
                  HTML += "</TR></TABLE>";
                  o_btn.style.height = this.btn_height-1;
                  break;
              }
              o_btn.innerHTML = HTML;
              this.o_panel.appendChild(o_btn);
            }
        this.o_panel.style.width = this.width==undefined?this.panel_width+4+this.spliters_cnt*2:this.width;
        this.o_panel.style.display = this.display_type;
      };
    // Функция hide - прячет панель
    this.hide = function () 
      {
        this.o_panel.style.display = "none";
      };
    // Функция show - отображает панель
    // параметры:
    //   b_sort_flag - признак сортировки элементов тулбара (0 или 1)
    this.show = function (b_sort_flag) 
      {
        if (this.initialized==0)
          this.init(b_sort_flag);
        this.o_panel.style.display = this.display_type;
      };
    // Функция inserData - позволяет выбирать данные для генерации тулбара из массива
    // параметры:
    //   arr_panel_data - массив данных формата
    //     var panel_data = [
    //       [(тип элемента),далее по формату функции вставляемого элемента],
    //       [], - сплитер
    //     ];
    //   тип элемента: button, select, option
    // PS: для элемента button параметр s_caption пропускается 
    this.inserData = function (arr_panel_data)
      {
        this.correct_paths();
        for (var i in arr_panel_data)
          {
            var str = "";
            if (arr_panel_data[i].length)
              {
                for (var j=1;j<arr_panel_data[i].length;j++)
                  {
                    str += (typeof(arr_panel_data[i][j])=="string"?'"'+arr_panel_data[i][j]+'"':arr_panel_data[i][j])+',';
                    if (j==2 && (arr_panel_data[i][0]=="button")) str += '"",';
                  }
                str = str.substr(0,str.length-1);
                switch (arr_panel_data[i][0]) {
                  case "button":
                    eval("this.insertButton("+str+");");
                    break;
                  case "select":
                    eval("this.insertSelect("+str+");");
                    break;
                  case "option":
                    eval("this.insertOption("+str+");");
                    break;
                }
              }
            else
              {this.insertSpliter();}
          }
      };
    // Функция setVisibilityAttr - позволяет включать\выключать кнопки панели
    // параметры:
    //   name	имя кнопки панели
    //   state	состояние (0-не видима или 1-видима)
    this.setVisibilityAttr = function(s_name,b_state)
      {
        var n = this.findElement(s_name);
        if ((n==null)||(o_btn = document.getElementById(this.items[n]["id"]))==null) return;
        var obj = document.getElementById(this.items[n]["id"]);
        if (b_state)
          {
            if (obj.style.display=="none")
              this.o_panel.style.width = (this.o_panel.style.width).replace("px","")/1 + this.items[n]["width"];
            obj.style.display = "";
            this.items[n]["attrs"] |= flg_ButtonInvisible;
          }
        else
          {
            if (obj.style.display=="")
              this.o_panel.style.width = (this.o_panel.style.width).replace("px","")/1 - this.items[n]["width"];
            obj.style.display = "none";
            this.items[n]["attrs"] = this.items[n]["attrs"]&(~flg_ButtonPressed);
          }
      }
  }
