// SaySelect Environment Constants
SS_ENV = new Object();
SS_ENV.IE_Version = new Number(((window.navigator.appVersion.split('; '))[1].split(' '))[1]);
SS_ENV.CR = new Object();
SS_ENV.CR.ReverseBackground = '#225588';
SS_ENV.CR.ReverseText = '#FFFFFF';//¹Ù²Ù¾îÁÖ¾î¾ß ÇÏ´Â°÷
SS_ENV.CR.Border = '#808080';
SS_ENV.CR.BorderActive = '#225588';
SS_ENV.ImgPrefix = './img';
SS_ENV.DefaultHeight = 20; 
SS_ENV.ButtonWidth = 13;
SS_ENV.OptionsDivStyle = ''
  + ' display:none;'
  + ' z-index:10;'
  + ' position:relative;'
  + ' border:1 solid '+ SS_ENV.CR.Border+';'
  + ' background-color:#FFFFFF;'//¹Ù²Ù¾îÁÖ¾î¾ß ÇÏ´Â°÷
  + ' scrollbar-face-color:#D4D0C8;'
  + ' scrollbar-shadow-color:#FFFFFF;'//¹Ù²Ù¾îÁÖ¾î¾ß ÇÏ´Â°÷
  + ' scrollbar-highlight-color:#F6F5F4;'
  + ' scrollbar-3dlight-color:#FFFFFF'//¹Ù²Ù¾îÁÖ¾î¾ß ÇÏ´Â°÷
  + ' scrollbar-darkshadow-color:#86837E;'
  + ' scrollbar-track-color:#F6F5F4;'
  + ' scrollbar-arrow-color:#86837E;';
SS_ENV.OptionNobrStyle = ''
  + ' font-size:9pt;'
  + ' font-family:±¼¸²;';
// SaySelect Variables
SS_VAR = new Object();
SS_VAR.DivDummy = document.createElement("DIV");
SS_VAR.SelectList = new Array();
SS_VAR.bEventAttached = false;

function SS_cancelEvent (event)
{
  event.cancelBubble = true;
  event.returnValue = false;
}
function SS_isThisEventToBeCanceled (event)
{
  if ('object' == typeof(event)) {
    switch (event.type) {
      case 'mousedown':
      case 'mouseup':
        if (!(event.button & 1))
          return true;
        break;
      case 'mouseout':
        if (SS_ENV.IE_Version >= 5.5)
          return true;
        break;
    }
  }
  return false;
}
function SS_create (srcHTML, ListMax)
{
  // property
  this.ssID = SS_VAR.SelectList.length;
  this.select = SS_createElement(srcHTML);
  this.selectedIndex = this.select.selectedIndex;
  this.options = this.select.options;
  this.width = parseInt(this.select.style.width);
  this.height = (this.select.style.height) ? parseInt(this.select.style.height) : SS_ENV.DefaultHeight;
  this.bListDown = (ListMax && '-'==ListMax.toString().substr(0, 1)) ? false : true;
  this.ListMax = (!isNaN(parseInt(ListMax))) ? Math.abs(ListMax) : this.options.length;

  this.Table;
  this.TitleTable;
  this.OptionsDiv;
  this.OptionsTable;
  this.bFocused = false;
  this.bExpanded = false;
  this.bReverse = false;

  // private method
  this.toggleTitle = SS_toggleTitle;
  this.syncSelectedIndex = SS_syncSelectedIndex;
  this.toggleOptions = SS_toggleOptions;
  this.turnOnOption = SS_turnOnOption;
  this.turnOffOption = SS_turnOffOption;
  this.handleMousewheel = SS_handleMousewheel;
  this.handleOverTitle = SS_handleOverTitle;
  this.handleOutTitle = SS_handleOutTitle;
  this.handleOverOption = SS_handleOverOption;
  this.createTable = SS_createTable;
  this.createOptionTr = SS_createOptionTr;
  this.adjustOptionsDiv = SS_adjustOptionsDiv;
  this.syncOptions = SS_syncOptions;
  this.pressOption = SS_pressOption;
  this.moveOption = SS_moveOption;
  this.releaseOption = SS_releaseOption;
  this.pressTitle = SS_pressTitle;
  this.releaseTitle = SS_releaseTitle;

  // public method
  this.display = SS_display;
  this.insertOption = SS_insertOption;
  this.deleteOption = SS_deleteOption;
  this.changeOption = SS_changeOption;

  // initiate
  this.createTable();
  this.select.setAttribute('SS', this);
  this.select.onpropertychange = SS_handlePropertychange;
}
function SS_display ()
{
  document.write("<div id=SS_TempDiv></div>\n");
  document.all.SS_TempDiv.insertAdjacentElement('afterBegin', this.Table);
  document.all.SS_TempDiv.removeNode();
}
function SS_write (srcHTML, ListMax)
{
  var oSS = new SS_create(srcHTML, ListMax);
  oSS.display();
  return oSS;
}
function SS_createElement (html)
{
  SS_VAR.DivDummy.insertAdjacentHTML('afterBegin', html);
  var oEl = SS_VAR.DivDummy.children(0);
  while (SS_VAR.DivDummy.children.length > 0) {
    SS_VAR.DivDummy.removeChild(SS_VAR.DivDummy.children(0));
  }
  return oEl;
}
function SS_blurExcept (except)
{
  SS_cancelEvent(window.event);

  except = ('number'==typeof(except)) ? except : -1;

  var bHasToDetachEvent = true;
  for (var i=0; i < SS_VAR.SelectList.length; i++) {
    if (-1==except && SS_VAR.SelectList[i].bFocused && SS_VAR.SelectList[i].bExpanded) {
      SS_VAR.SelectList[i].toggleOptions(false, true);
      SS_VAR.SelectList[i].toggleTitle(true);
      bHasToDetachEvent = false;
    }
    else if (i!=except) {
      if (SS_VAR.SelectList[i].bExpanded)
        SS_VAR.SelectList[i].toggleOptions(false, true);
      if (SS_VAR.SelectList[i].bReverse)
        SS_VAR.SelectList[i].toggleTitle(false);
      SS_VAR.SelectList[i].bFocused = false;
    }
  }

  if (SS_VAR.bEventAttached && bHasToDetachEvent) {
    document.detachEvent('onmousedown', SS_blurExcept);
    document.detachEvent('ondblclick', SS_blurExcept);
    SS_VAR.bEventAttached = false;
  }
}
function SS_syncSelectedIndex ()
{
  this.selectedIndex = this.select.selectedIndex;

  if (this.TitleTable.cells(0).childNodes(0).innerText != this.options[this.selectedIndex].innerText) {
    this.TitleTable.cells(0).childNodes(0).innerText = this.options[this.selectedIndex].innerText;
  }
  if (this.bExpanded) {
    this.toggleOptions(false);
  }
}
function SS_toggleTitle (bReverse)
{
  this.bReverse = ('undefined'!=typeof(bReverse)) ? bReverse: (!this.bReverse);
  this.TitleTable.cells(0).style.backgroundColor = this.bReverse ? SS_ENV.CR.ReverseBackground : '';
  this.TitleTable.cells(0).style.color = this.bReverse ? SS_ENV.CR.ReverseText : '';
}
function SS_toggleOptions (bExpanded, bStrict)
{
  if (!bStrict && !this.bFocused) {
    SS_blurExcept(this.ssID);
  }
  this.bExpanded = ('undefined'!=typeof(bExpanded)) ? bExpanded: (!this.bExpanded);
  if (this.bExpanded) {
    this.OptionsDiv.style.display = 'block';
    if (!bStrict) {
      this.toggleTitle(false);
      this.handleOverOption(this.selectedIndex);
    }
    this.handleOutTitle();
  }
  else {
    this.OptionsDiv.style.display = 'none';
    this.bOptionOnAction = false;
    if (!bStrict) {
      this.toggleTitle(true);
    }
  }
  if (!bStrict) {
    this.bFocused = true;

    if (!SS_VAR.bEventAttached) {
      document.attachEvent('onmousedown', SS_blurExcept);
      document.attachEvent('ondblclick', SS_blurExcept);
      SS_VAR.bEventAttached = true;
    }
  }
}
function SS_handlePropertychange ()
{
  if ('propertychange'==window.event.type && 'selectedIndex'==window.event.propertyName) {
    var oSS = window.event.srcElement.SS;
    oSS.syncSelectedIndex();

    if (null != oSS.select.onchange)
      oSS.select.onchange();
  }
}
function SS_handleMousewheel (event)
{
  var idx = this.selectedIndex;
  if ('mousewheel'==event.type && this.bFocused && this.bReverse) {
    for (var i=0; i < event.wheelDelta; i += 120)
      idx--;
    for (var i=0; i > event.wheelDelta; i -= 120)
      idx++;
  }
  idx = Math.max(idx, 0);
  idx = Math.min(idx, this.options.length - 1);
  this.select.selectedIndex = idx;
}
function SS_handleOverTitle ()
{
  if (this.bExpanded)
    return;

  this.TitleTable.style.borderColor = SS_ENV.CR.BorderActive;
  this.TitleTable.cells(1).style.display = 'none';
  this.TitleTable.cells(2).style.display = 'block';
}
function SS_handleOutTitle ()
{
  this.TitleTable.style.borderColor = SS_ENV.CR.Border;
  this.TitleTable.cells(2).style.display = 'none';
  this.TitleTable.cells(1).style.display = 'block';
}
function SS_handleOverOption (idx)
{
  for (var i=0; i < this.options.length; i++) {
    if (i==idx)
      this.turnOnOption(i);
    else
      this.turnOffOption(i);
  }
}
function SS_turnOnOption (idx)
{
  this.OptionsTable.cells(idx).style.color = SS_ENV.CR.ReverseText;
  this.OptionsTable.cells(idx).style.backgroundColor = SS_ENV.CR.ReverseBackground;
}
function SS_turnOffOption (idx)
{
  this.OptionsTable.cells(idx).style.color = '';
  this.OptionsTable.cells(idx).style.backgroundColor = '';
}
function SS_adjustOptionsDiv ()
{
  //this.OptionsDiv.style.width = this.width;
  this.OptionsDiv.style.height = Math.min(this.options.length, this.ListMax) * (this.height-4) + 2;
  this.OptionsDiv.style.overflowY = (this.options.length > this.ListMax) ? 'scroll' : '';
  if (!this.bListDown) {
    this.OptionsDiv.style.top = -this.height - (this.height+parseInt(this.OptionsDiv.style.height));
  }
  else {
    this.OptionsDiv.style.top = -this.height;
  }
}
function SS_syncOptions ()
{
  for (var i=0; i < this.options.length; i++) {
    this.OptionsTable.cells(i).setAttribute('index', i);
    if (this.OptionsTable.cells(i).childNodes(0).innerText != this.options[i].innerText)
      this.OptionsTable.cells(i).childNodes(0).innerText = this.options[i].innerText;
  }
}
function SS_pressTitle (event)
{
  SS_cancelEvent(event);

  if (this.bTitleOnAction) return;

  this.bTitleOnAction = true;
  this.toggleOptions();
}
function SS_releaseTitle (event)
{
  SS_cancelEvent(event);

  if (SS_isThisEventToBeCanceled(event)) return;
  if (!this.bTitleOnAction) return;

  this.bTitleOnAction = false;
}
function SS_pressOption (event)
{
  SS_cancelEvent(event);

  if (this.bOptionOnAction) return;

  this.bOptionOnAction = true;
  this.Xdif = event.clientX - event.offsetX;
}
function SS_moveOption (event)
{
  SS_cancelEvent(event);

  var X = event.clientX - this.Xdif;
  if (this.bOptionOnAction && !(X >= 0 && X <= this.OptionsTable.offsetWidth)) return;

  this.handleOverOption(Math.floor(event.offsetY / (this.height-4)));
}
function SS_releaseOption (event)
{
  SS_cancelEvent(event);

  if (SS_isThisEventToBeCanceled(event)) return;
  if (!this.bOptionOnAction) return;

  this.bOptionOnAction = false;
  var X = event.clientX - this.Xdif;
  if (X >= 0 && X <= this.OptionsTable.offsetWidth) {
    this.toggleOptions(false);
    this.select.selectedIndex = Math.floor(event.offsetY / (this.height-4));
  }
}
function SS_createOptionTr (idx)
{
  idx = ('undefined'!=typeof(idx)) ? idx : this.options.length - 1;
  var OptionTr = this.OptionsTable.insertRow(-1);
  var OptionTd = document.createElement("<td height="+(this.height-4)+"></td>");
  OptionTd.appendChild(document.createElement("<nobr style='"+SS_ENV.OptionNobrStyle+"'></nobr>"));
  OptionTr.appendChild(OptionTd);
}
function SS_createTable ()
{
  this.OptionsDiv = SS_createElement(""
    + "<div style='"+SS_ENV.OptionsDivStyle+"'"
    + "  onmousedown='SS_cancelEvent(window.event)'"
    + ">"
    + "  <table border=0 cellpadding=0 cellspacing=0 width=100% style='table-layout:fixed'>"
    + "  </table>"
    + "</div>"
  );
  this.OptionsTable = this.OptionsDiv.childNodes(0);
  for (var i=0; i < this.options.length; i++) {
    this.createOptionTr(i);
  }
  this.syncOptions();
  this.adjustOptionsDiv();
  var OptionsWrapper = document.createElement(""
    + "<img src='"+SS_ENV.ImgPrefix+"/img_blank.gif'"
    + "  style='position:absolute; top:0; left:0; width:100%; height:"+(this.options.length * (this.height-4))+";'"
    + "  onmousedown='SS_VAR.SelectList["+this.ssID+"].pressOption(window.event)'"
    + "  onmousemove='SS_VAR.SelectList["+this.ssID+"].moveOption(window.event)'"
    + "  onmouseup='SS_VAR.SelectList["+this.ssID+"].releaseOption(window.event)'"
    + "  onmouseout='SS_VAR.SelectList["+this.ssID+"].releaseOption(window.event)'"
    + "  ondragstart='SS_cancelEvent(window.event)'"
    + ">"
  );
  this.OptionsDiv.appendChild(OptionsWrapper);

  this.TitleTable = SS_createElement(""
    + "<table border=0 cellpadding=0 cellspacing=1"
    + "  height="+this.height
    + "  bgcolor=#FFFFFF"//¹Ù²Ù¾îÁÖ¾î¾ß ÇÏ´Â°÷
    + "  style='table-layout:fixed; border:1 solid "+SS_ENV.CR.Border+";'"
    + ">"
    + "<tr>"
    + "  <td class=select><nobr style='text-oveflow:hidden;"+SS_ENV.OptionNobrStyle+"'></nobr></td>"
    + "  <td width="+SS_ENV.ButtonWidth+" align=center style='word-wrap:normal' class=select></td>"
    + "  <td style='display:none' width="+SS_ENV.ButtonWidth+" align=center style='word-wrap:normal' class=select></td>"
    + "  <td style='display:none' class=select></td>"
    + "</tr>"
    + "</table>"
  );
  this.TitleTable.cells(0).childNodes(0).innerText = this.options[this.selectedIndex].innerText;
  this.TitleTable.cells(1).innerHTML = "<img src='"+SS_ENV.ImgPrefix+"/btn_down.gif' border=0 align=absmiddle>";
  this.TitleTable.cells(2).innerHTML = "<img src='"+SS_ENV.ImgPrefix+"/btn_down_s.gif' border=0 align=absmiddle>";
  this.TitleTable.cells(3).appendChild(this.select);
  var TitleWrapper = document.createElement(""
    + "<img src='"+SS_ENV.ImgPrefix+"/img_blank.gif' "
    + "  style='position:relative; top:-"+this.height+"; left:0; z-index:2; width:100%; height:"+this.height+";'"
    + "  onmouseover='SS_VAR.SelectList["+this.ssID+"].handleOverTitle()'"
    + "  onmouseout='SS_VAR.SelectList["+this.ssID+"].handleOutTitle(); SS_VAR.SelectList["+this.ssID+"].releaseTitle(window.event);'"
    + "  onmousedown='SS_VAR.SelectList["+this.ssID+"].pressTitle(window.event)'"
    + "  ondblclick='SS_VAR.SelectList["+this.ssID+"].pressTitle(window.event); SS_VAR.SelectList["+this.ssID+"].releaseTitle(window.event);'"
    + "  onmouseup='SS_VAR.SelectList["+this.ssID+"].releaseTitle(window.event)'"
    + "  onmousewheel='SS_VAR.SelectList["+this.ssID+"].handleMousewheel(window.event)'"
    + "  ondragstart='SS_cancelEvent(window.event)'"
    + ">"
  );

  this.Table = SS_createElement(""
    + "<table border=0 cellpadding=0 cellspacing=0 style='table-layout:fixed; cursor:default'>"
    + "<tr height="+this.height+">"
    + "  <td></td>"
    + "</tr>"
    + "</table>"
  );
  if (!isNaN(this.width)) {
    this.Table.style.width = this.width;
  }
  this.Table.cells(0).appendChild(this.TitleTable);
  this.Table.cells(0).appendChild(TitleWrapper);
  this.Table.cells(0).appendChild(this.OptionsDiv);

  SS_VAR.SelectList[this.ssID] = this;

  return this;
}
function SS_insertOption (value, innerText, idx)
{
  var NewOption = document.createElement("OPTION");
  this.options.add(NewOption, idx);
  NewOption.innerText = innerText;
  NewOption.value = value;

  this.createOptionTr(idx);
  this.syncOptions();
  this.adjustOptionsDiv();
  this.syncSelectedIndex();
}
function SS_deleteOption (idx)
{
  this.options.remove(idx);
  this.OptionsTable.deleteRow(idx);
  this.syncOptions();
  this.adjustOptionsDiv();
  this.syncSelectedIndex();
}
function SS_changeOption (idx, value, innerText)
{
  this.options[idx].value = value;
  this.options[idx].innerText = innerText;
  this.syncOptions();
  this.syncSelectedIndex();
}

