//
//                Copyright (c) 2004 Smartlink Corp.
//                       All rights reserved.
//

function DicDialog () {
   this.form       = document.forms ["form"];
   this.langsCtrl  = new LangsCtrl  (this.form ["langs"], this);
   this.dicBarCtrl = new DicBarCtrl (document.getElementById ("dicBarCtrl"), this);
   this.dicCtrl    = new DicCtrl    (document.getElementById ("dicCtrl"), this);
   this.textCtrl   = new TextCtrl   (document.getElementById ("textCtrl"), this);
   this.tabCtrl    = new TabCtrl    (document.getElementById ("tabCtrl"), this);
   this.content    = null;
   
   document.body.ondragenter = function () { setDropEffect ('copy') };
   document.body.ondragover  = function () { setDropEffect ('copy') };
   document.body.ondrop      = dlgOnDrop;
   
   this.load       = dlgLoad;
   this.reload     = dlgReload;
   this.selectDic  = dlgSelectDic;
   this.showData   = dlgShowData;
   
   this.engine = new DicEngine ();
   this.engine.listener = this;
   this.onReady       = dlgOnReady;
   this.onDicsReady   = dlgOnDicsReady;
   this.onDataReady   = dlgOnDataReady;
   this.onLookup      = dlgOnLookup;
   this.onTextChanged = dlgOnTextChanged;
   this.onLangChanged = dlgOnLangChanged;
   this.onTabSelected = dlgOnTabSelected;
   this.onError       = dlgOnError;
   this.onLoadContent = dlgOnLoadContent;
   
   if (browser.opera && browser.operaVer < 7.5) {
      this.form.onsubmit = null;
      this.form ["cmdLookup"].onclick = "dicDialog.onLookup()";
   }

   this.onLoadContent ();
}

function dlgLoad () {
   var text = this.form ["text"].value;
   if (text) {
      this.textCtrl.setText (text);
      this.textToLookup = text; // lookup after onReady

   }

   this.engine.load (this.langsCtrl.getValue ());
}

function dlgReload (lang) {
   this.engine.load (lang);
}

function dlgOnLoadContent () {
   var frame = frames ["content"];
   if (!frame)
      frame = window;
   if (frame.isReady)
      this.content = frame.newContentCtrl (this);
}

function dlgShowData (tab, data) {
   this.tabCtrl.select (tab);
      
   if (!data) {
      var lang = this.langsCtrl.getValue ();
      if (lang == "*")
         lang = this.dicCtrl.getLang ();
      var query = (tab == "translation" ? "DEFAULT" : tab.toUpperCase ());
      data = this.engine.getData (query, this.textCtrl.getText (),
                                  lang, this.dicCtrl.getDicID ());
      if (!data)
         data = new Object ();
   }

   switch (tab) {
      case "translation":
      case "phrases":
         this.content.setContent (data);
         break;
      case "surround":
         this.content.setItems ("", data.surround, data.selected);
         break;
      case "suggestions":
         this.content.setItems ("link", data.suggestions);
         break;
   }

}

function dlgSelectDic (dicID, lang) {

   this.langsCtrl.setValue (lang);
   this.dicCtrl.setDic (dicID, lang);
   this.dicBarCtrl.selectDic (dicID);
}

function dlgOnReady () {
   this.dicBarCtrl.setDics (this.engine.dics);
   this.dicCtrl.setDics (this.engine.dics, this.langsCtrl.getValue ());
   this.content && this.content.clearContent ();
   this.textCtrl.focus ();
   this.isReady = true;

   if (this.textToLookup && this.textToLookup == this.textCtrl.getText ())
      this.onLookup ();
}

function dlgOnDicsReady (dicRefs) {
   this.dicBarCtrl.markDics (dicRefs);
}

function dlgOnDataReady (result) {
   var activeDicID = this.dicCtrl.getDicID ();
   if (activeDicID && activeDicID != result.dicID) // don't change active dic
      return;
      
   this.selectDic (result.dicID, result.lang);
   
   var tab = null;
   if (result.translation)
      tab = "translation";
   else if (result.phrases)
      tab = "phrases";
   else if (result.suggestions && result.suggestions.length)
      tab = "suggestions";
   else if (result.surround && result.surround.length)
      tab = "surround";
   else if (typeof (result.phrases) == "string")
      tab = "phrases";
   this.showData (tab, result);
}

function dlgOnTextChanged () {
   this.dicBarCtrl.markDics (null);
   this.showData ("surround", null);
}

function dlgOnLangChanged (lang) {
   this.reload (lang);
}

function dlgOnTabSelected (tab) {
   this.showData (tab, null);
}

function dlgOnLookup (text, lang, dicID) {
   if (!this.isReady)
      return;
   if (typeof (text) == "string")
      this.textCtrl.setText (text);
   if (!lang) { // search for current lang
      lang = this.langsCtrl.getValue ();
      if (lang == "*")
         lang = this.dicCtrl.getLang ();
   }
   if (dicID == "") // search in current dic
      dicID = this.dicCtrl.getDicID ();


//VK
   if(document.getElementById('enrudics').style.visibility == 'visible')   dicID = document.form.mydicID.value;
//alert(dicID);   
   this.selectDic (dicID, lang);
   var data = this.engine.lookup (this.textCtrl.getText (), lang, dicID);
   if (data) {
      if (data.translation || data.phrases || data.surround)
         this.onDataReady (data);
      else
         this.engine.getData ("SURROUND", this.textCtrl.getText (), lang, dicID);
   }
   else {
      this.content.setContent (null); // show "Loading... Please wait."
   }
    
}

function dlgOnError (text) {
   this.content.setError (text);
}

function dlgOnDrop () {
   event.returnValue = false;
   var text = event.dataTransfer.getData ("text");
   if (text)
      dicDialog.onLookup (text);
}

function setDropEffect (effect) {
   event.returnValue = false;
   event.dataTransfer.dropEffect = effect;
}

//////////////////////////////////////////////////////////////////////////////
//
// LangsCtrl
//

function LangsCtrl (ctrl, listener) {
   this.listener = listener;
   this.ctrl = ctrl;
   this.ctrl.ref = this;
   this.ctrl.onchange = langsOnChange;
   this.getValue = langsGetValue;
   this.setValue = langsSetValue;
}

function langsGetValue () {
   return getListValue (this.ctrl);
}

function langsSetValue (value) {
   for (var i = 0; i < this.ctrl.length; ++i) {
      if (value == this.ctrl.options [i].value) {
         this.ctrl.selectedIndex = i;
         return true;
      }
   }
}

function langsOnChange () {
   this.ref.listener.onLangChanged (getListValue (this));
   ChangeMenu();
}

//////////////////////////////////////////////////////////////////////////////
//
// TabCtrl
//

function TabCtrl (elem, listener) {
   this.listener = listener;
   this.elem = elem;
   this.elem.ref = this;
   this.elem.onclick = tabOnClick;
   this.select = tabSelect;

   this.tabs = new Array ();
   var nodes = elem.getElementsByTagName ("SPAN");
   for (var i = 0; i < nodes.length; ++i) {
      var node = nodes [i];
      if (node.name)
         this.tabs [this.tabs.length] = node;
   }
}

function tabSelect (tabName) {
   if (tabName == "phrases")
      tabName = "translation";
   for (var i = 0; i < this.tabs.length; ++i) {
      var tab = this.tabs [i];
      if (tab.name == tabName)
         tab.className = "tabOn";
      else
         tab.className = "tabOff";
   }
}

function tabOnClick (e) {
   if (!e)
      e = window.event;

   var tabCtrl = this.ref;      
   var tab = (e.srcElement ? e.srcElement : e.target);
   if (tab.name && tab.className != "tab_on") {
      tabCtrl.select (tab.name);
      tabCtrl.listener.onTabSelected (tab.name);
   }
}

//////////////////////////////////////////////////////////////////////////////
//
// DicBarCtrl
//

function DicBarCtrl (elem, listener) {
   this.listener = listener;
   this.elem = elem;
   this.elem.ref = this;
   this.elem.onclick = dicBarOnClick;
   this.elem.onmouseover = imgBttnOnMouseOver;
   this.elem.onmouseout = imgBttnOnMouseOut;
   this.elem.ondragenter = function () { setDropEffect ('copy') };
   this.elem.ondragover = function () { setDropEffect ('copy') };
   this.elem.ondrop = dicBarOnDrop;
   this.elem.onmove = dicBarOnMove; // IE only
   this.imgNode = elem.getElementsByTagName ("IMG") [0];
   this.imgMark = elem.getElementsByTagName ("IMG") [1];
   this.setDics = dicBarSetDics;
   this.selectDic = dicBarSelectDic;
   this.markDics = dicBarMarkDics;
}

function dicBarSetDics (dics) {
   this.elem.innerHTML = "";
   for (var i = 0; i < dics.length; ++i) {
      var dic = dics [i];
      var img = this.imgNode.cloneNode (false);
      img.src   = (dic.img ? dic.img : this.imgNode.src);
      img.alt   = dic.name;
      img.dicID = dic.id;
      this.elem.appendChild (img);
      this.elem.appendChild (document.createElement ("WBR"));
   }
}

function dicBarSelectDic (dicID) {
   var dics = this.elem.getElementsByTagName ("IMG");
   for (var i = 0; i < dics.length; ++i)
      dics [i].className = (dics [i].dicID == dicID ? "imgBttnOn" : "imgBttn");
}

function dicBarMarkDics (dicRefs) {
   this.dicRefs = dicRefs; // save dicRefs (used in onMove handler)
   var images = this.elem.getElementsByTagName ("IMG");
   for (var i = images.length - 1; i >= 0; --i) {
      if (!images [i].dicID)
         this.elem.removeChild (images [i]);
   }
   
   if (!dicRefs)
      return;
   
   images = this.elem.getElementsByTagName ("IMG");
   for (var r = 0; r < dicRefs.length; ++r) {
      var bkColor = null;
      switch (dicRefs [r].rank) {
         case "COLLOCATION": bkColor = "yellow"; break;
         case "WORD":        bkColor = "red";    break;
         case "PHRASE":      bkColor = "blue";   break;
      }
      if (!bkColor)
         continue;

      var absPos = getElementAbsPos (this.elem);
      for (var i = 0; i < images.length; ++i) {
         var img = images [i];
         if (img.dicID == dicRefs [r].dicID) {
            var imgMark = this.imgMark.cloneNode (false);
            imgMark.style.backgroundColor = bkColor;
            imgMark.style.top = absPos.x + img.offsetTop + 1;
            imgMark.style.left = absPos.y + img.offsetLeft + img.width - imgMark.width - 2;
            imgMark.style.display = "block";
            this.elem.appendChild (imgMark);
         }
      }
   }
}

function dicBarOnMove (e) {
   if (!e)
      e = window.event;
   var elem = (e.srcElement ? e.srcElement : e.target);
   if (elem && elem.ref)
      elem.ref.markDics (elem.ref.dicRefs);
}

function dicBarOnClick (e) {
   if (!e)
      e = window.event;
   var elem = (e.srcElement ? e.srcElement : e.target);
   if (elem.dicID)
      elem.parentNode.ref.listener.onLookup (null, null, elem.dicID);
}

function dicBarOnDrop () {
   event.returnValue = false;
   var elem = event.srcElement;
   var text = event.dataTransfer.getData ("text");
   if (elem.dicID && text)
      elem.parentNode.ref.listener.onLookup (text, null, elem.dicID);
}

//////////////////////////////////////////////////////////////////////////////
//
// DicCtrl
//

function DicCtrl (elem, listener) {
   this.listener  = listener;
   this.elem      = elem;
   this.elem.onmouseover = imgBttnOnMouseOver;
   this.elem.onmouseout  = imgBttnOnMouseOut;
   this.elem.onclick     = dicOnClick;
   this.dics      = null;
   this.dicID     = null;
   this.imgNode   = elem.getElementsByTagName ("IMG") [0];
//   this.nameNode  = document.getElementById ("dicName");
   this.langsNode = document.getElementById ("dicLangs");
   if (this.langsNode)
      this.langsNode.ref = this;
   
   this.defaultImg  = this.imgNode.src;
//   this.defaultName = this.nameNode.innerHTML;
   
   this.setDics  = dicSetDics; 
   this.setDic   = dicSetDic;
   this.getDicID = function () { return this.dicID }
   this.getLang  = function () { return this.langID }
}

function dicSetDics (dics, langIDs) {
   this.dics = dics;
   this.langIDs = langIDs;
   this.setDic (null, null);
}

function dicSetDic (dicID, langID) {
   if (!langID)
      langID = "";
   langID = langID.split ("/") [0];
   if (dicID == this.dicID && langID == this.langID)
      return;
   this.dicID  = dicID;
   this.langID = langID;
   
   var dic = null;
   var dics = this.dics;
   for (var i = 0; i < dics.length; ++i) {
      if (dics [i].id == dicID) {
         dic = dics [i];
         break;
      }
   }

   this.imgNode.src = (dic && dic.img ? dic.img : this.defaultImg);
   //this.nameNode.innerHTML = (dic ? dic.name : this.defaultName);
   if (this.langsNode)
      this.langsNode.innerHTML = "";
   if (!dicID)
      return;
   
   if (this.langsNode && dic && this.langIDs == "*") {
      var langs = dic.lang.split ("/");
      for (var i = 0; i < langs.length; ++i) {
         var langNode = document.createElement ("SPAN");
         langNode.innerHTML = langs [i].toUpperCase ();
         langNode.className = (langs [i] == langID ? "langOn" : "langOff");
         langNode.langID    = langs [i];
         this.langsNode.appendChild (langNode);
      }
   }
}

function dicOnClick (e) {
   if (!e)
      e = window.event;
   var elem = (e.srcElement ? e.srcElement : e.target);
   if (elem.langID) {
      var dicCtrl = elem.parentNode.ref;
      dicCtrl.listener.onLookup (null, elem.langID, dicCtrl.dicID);
   }
}

//////////////////////////////////////////////////////////////////////////////
//
// TextCtrl
//

function TextCtrl (ctrl, listener) {
   this.listener = listener;
   this.lastText = ""; // last text in textCtrl
   this.ctrl = ctrl;
   this.ctrl.ref = this;
   this.setText = textSetText;
   this.getText = textGetText;
   this.focus = function () { try{ this.ctrl.focus ()}catch(err){} }
   if (!browser.opera || browser.operaVer >= 7.5)
      window.setInterval ("textOnChanged ('" + ctrl.id + "')", 100);
}

function textSetText (text) {
   this.lastText = this.ctrl.value = text;
}

function textGetText () {
   return this.ctrl.value;
}

function textOnChanged (id) {
   var ctrl = document.getElementById (id);
   if (!ctrl || !ctrl.ref.listener.isReady)
      return;
   if (ctrl.value != ctrl.ref.lastText) {
      ctrl.ref.lastText = ctrl.value;
      ctrl.ref.listener.onTextChanged ();
   }
}

//////////////////////////////////////////////////////////////////////////////
//
// ImgBttn
//

function imgBttnOnMouseOver (e) {
   if (!e)
      e = window.event;
   var elem = (e.srcElement ? e.srcElement : e.target);
   if (elem.className.indexOf ("imgBttn") == 0 && elem.className.indexOf ("Over") < 0)
      elem.className += " imgBttnOver";
}

function imgBttnOnMouseOut (e) {
   if (!e)
      e = window.event;
   var elem = (e.srcElement ? e.srcElement : e.target);
   if (elem.className.indexOf (" imgBttnOver") > 0)
      elem.className = elem.className.substr (0, elem.className.indexOf (" "));
}
