//
//                Copyright (c) 2003 Smartlink Corp.
//                       All rights reserved.
//

var m_mainWnd    = window.top; 
var m_form = null;
var m_srcCtrl    = null;
var m_data       = new Array ();
   
function init () {
   if (isDialog () && window.parent == window)
      document.body.style.padding = "10px";
   sizeWindowToContent ();
      
   m_form = document.forms ["form"];
   m_form.encodings.focus ();
      
   if (!isCrossDomain ()) {
      var opener = getOpener ();
      if (opener && m_form.ctrl.value) {
         m_srcCtrl = findCtrlEx (m_form.ctrl.value, opener);
         if (!m_srcCtrl) {
            alert (TEXT_MSG_CONTROL + " '" + m_form.ctrl.value + "'"); //Cannot find control
            closeDecoder ();
            return;
         }
         m_form.text.value = m_srcCtrl.value;
         if (m_srcCtrl.name == "#range" && !m_srcCtrl.value)
            m_srcCtrl = null;
      }
      if (!m_srcCtrl) {
         m_form.cmdOk.value = "Close";
         hideControl (m_form.cmdCancel);
      }
   }

   window.setInterval ("updateUI ()", 200);
   decode ();
}

function onLoadData () {
   if (browser.ie && browser.ieVer <= 5.0)
      setTimeout ("loadData ()", 200);
   else
      loadData ();
}
   
function loadData () {
   if (!m_form)
      return;
   clearEncodings ();
   var data = getResultForm ().data.value;
   if (!data) // there are no variants for given text
      data = "0;" + m_form.text.value;

   // get encodings
   data = data.split ("\x1A");
   for (var i = 0; i < data.length; i++) {
      var sep  = data [i].indexOf (";");
      var id   = data [i].substr (0, sep);
      var text = data [i].substr (sep + 1);
      var encodingInfo = { id: id, text: text, name: getEncodingName (id) };
      m_data [i] = encodingInfo;
   }
      
   // get encoding titles
   var maxTitleLen = 0;
   for (var i = 0; i < m_data.length; i++) {
      if (!m_data [i].title) {
         var name = m_data [i].name, index = 0;
         for (var j = i + 1; j < m_data.length; j++) {
            if (m_data [j].name == name) {
               if (index == 0)
                  index = 1;
               index++;
               m_data [j].title = name + " [" + index + "]";
            }
         }
         m_data [i].title = name + (index ? " [1]" : "");
      }
      maxTitleLen = Math.max (maxTitleLen, m_data [i].title.length);
   }

   var MAX_ENCODING_LEN = 65;
   var encodings = m_form.encodings;
   var maxQuoteLen = (encodings.clientWidth ? 100 : MAX_ENCODING_LEN - maxTitleLen);
   for (var i = 0; i < m_data.length; i++) {
      var encodingInfo = m_data [i];
      var quote = getTextQuote (encodingInfo.text, maxQuoteLen);
      insertListItem (encodings, i,
                      encodingInfo.title + "   \x2d\x2d   " + quote,
                      encodingInfo.id);
   }
         
   encodings.selectedIndex = 0;
   onChangeEncoding ();
   enableControl (m_form.cmdDecode);
}
   
function getTextQuote (text, len) {
   return text.replace (/\s+/g, " ").substr (0, len);
}
   
var encodingNames = [
   "windows-1251",   0,  TEXT_WIN_1251, //"Cyrillic (WIN)",
   "windows-1252",   0,  TEXT_WIN_1252, //"Western (WIN)",
   "koi8",           0,  TEXT_KOI8,     //"Cyrillic (KOI8)",
   "koi8-r",         0,  TEXT_KOI8_R,   //"Cyrillic (KOI8)",
   "koi8-u",         0,  TEXT_KOI8_U,   //"Cyrillic (KOI8-U)",
   "cp866",          0,  TEXT_CP866,	//"Cyrillic (DOS)",
   "iso-8859-5",     0,  TEXT_ISO,		//"Cyrillic (ISO)",
   "x-mac-cyrillic", 0,  TEXT_MAC,		//"Cyrillic (MAC)",
   "utf-8",          0,  TEXT_UTF_8,	//"Unicode (UTF-8)",
   "html",           1,  TEXT_HTML,		//"HTML",
   "translit",       1,  TEXT_TRANSLIT,	//"Translit",
   "0",              1,  TEXT_ORIGINAL,	//"Original text"
];

function getEncodingName (name) {
   var names = name.split ("/");
   var encoding = "";
   for (var index = 0; index < names.length; index++) {
      var name = names [index], isEncoding = 0;
      for (var i = 0; i < encodingNames.length; i += 3) {
         if (encodingNames [i] == names [index]) {
            name = encodingNames [i + 2];
            isEncoding = encodingNames [i + 1];
            break;
         }
      }
      if (isEncoding || index == names.length - 1)
         encoding = name + (encoding ? " / " : "") + encoding;
   }
   return encoding;
}
   
function isCrossDomain () {
   return m_form.ref.value != "";
}
   
function onChangeEncoding () {
   var form = getResultForm ();
   var index = m_form.encodings.selectedIndex;
   if (index < 0 || index >= m_data.length || !form)
      return;
   form.text.value = m_data [index].text;
}

function clearEncodings () {
   setListLength (m_form.encodings, 0);
   m_data = new Array ();
   var form = getResultForm ();
   if (form)
      form.text.value = "";
}

function decode () {
   decodeText (m_form.text.value);
}
   
function decodeText (text) {
   var form = getResultForm ();
   if (!form || !text)
      return;

   disableControl (m_form.cmdDecode);
   form.text.value = TEXT_MSG_WAIT; //"Decoding... Please wait.";
   form.srctext.value = text;
   form.data.value = "";
   form.submit ();
}
   
function getResultForm () {
   var frame = getFrame ("result");
   var form = (frame ? frame.document.forms ["form"] : null);
   return (form ? form : null);
}

function applyResult () {
   var form = getResultForm ();
   if (!form)
      return;
   var text = form.text.value;
   
   if (isCrossDomain ()) {
      var ref = m_form.ref.value;
      if (ref && ref.charAt (ref.length - 1) != "/")
         ref += "/";
//       var href = "decoder-result.htm";
       var href = "plresult_en.htm";
      var mime = m_form.mime.value;
      if ("base64" == mime)
         text = base64Encode (utf8Encode (text));
      href = ref + href + "?text=" + escape (text);
      if (mime)
         href += "&mime=" + mime + "&charset=utf-8";
      window.location.href = href;
      return;
   }
   else if (m_srcCtrl) {
      if (m_srcCtrl.name == "#range")
         m_srcCtrl.range.text = text;
      else
         m_srcCtrl.value = text;
   }
   window.parent.close ();
}
   
function closeDecoder () {
	if(isCrossDomain ())
    	window.close();
	else 
		window.parent.close ();
}

function setDropEffect (effect) {
   event.returnValue = false;
   event.dataTransfer.dropEffect = effect;
}

function handleDrop () {
   event.returnValue = false;
   var text = event.dataTransfer.getData ("text");
   event.srcElement.value = (text ? text : "");
   decode ();
}

function handlePaste () {
   setTimeout ("decode()", 100);
}

function getOpener () {
   if (m_mainWnd.external
       && m_mainWnd.external.menuArguments
       && m_mainWnd.external.menuArguments.parent)
      return m_mainWnd.external.menuArguments.parent;
   if (m_mainWnd.dialogArguments)
      return m_mainWnd.dialogArguments.opener;
   return m_mainWnd.opener;
}
   
// findCtrlEx:
//    Finds control "ctrlName" in given location.
// Parameters:
//    [in] ctrlName - name or id of control. Has format "[frame/]ctrl";
//    [in, optional] where - location where to search. It can be window,
//       frame, document or 'undefined'.
// Return value:
//    On success returns found control. On fail returns null.
function findCtrlEx (ctrlName, where) {
   var names = ctrlName.split ("/", 2);
   ctrlName  = names.length > 1 ? names [1] : names [0];
   var frame = names.length > 1 ? names [0] : "";
      
   if (!where)
      where = window;
         
   var wnd = (where.document ? where : null);
   var doc = (where.document ? where.document : where);
   if (frame) {
      if (wnd && wnd.frames [frame]) {
         wnd = wnd.frames [frame];
         doc = wnd.document;
      }
      else if (doc && doc.frames [frame]) {
         wnd = doc.frames [frame];
         doc = wnd.document;
      }
      else {
         wnd = null;
         doc = null;
      }
   }
      
   var ctrl = null;
   if (ctrlName == '?' || ctrlName == "#range") { // ie only
      if (doc && doc.selection) {
         var range = doc.selection.createRange ();
         ctrl = { name: "#range", value: range.text, range: range };
         if (ctrlName == "#range" || ctrl.value)
            return ctrl;
      }
      if (wnd && wnd.event && wnd.event.srcElement && wnd.event.srcElement.value)
         ctrl = wnd.event.srcElement;
      return ctrl;
   }
   
   if (doc && doc.getElementById)
      ctrl = doc.getElementById (ctrlName);
   if (!ctrl && doc && doc.forms) {
      for (var i = 0; i < doc.forms.length; i++) {
         var ctrl = doc.forms [i] [ctrlName];
         if (ctrl)
            break;
      }
   }
   
   return ctrl;
}

function updateUI () {
   var textOk = m_form.text.value != "";
   enableControl (m_form.cmdDecode, textOk);
   if (!textOk)
      clearEncodings ();
   if (m_form.cmdOk.value == "OK") {
      var form = getResultForm ();
      enableControl (m_form.cmdOk, form && form.text.value);
   }
}
