var spellOjb;
var divSpell = null; // div element for spell checking result in HTML
var divSuggest = null; // div element suggestions 
var url = '/cgi/spellcheck'; 

var screq ; // HTTPXML object for spell checking requests 
var ssreq ; // HTTPXML object for spelling suggestion requests 

// keep the original onClick event 
if (document.onclick) {
   var onclick_old = document.onclick;
   document.onclick = function(e) { watchClick(e); onclick_old(e); }
} else {
   document.onclick = watchClick;
}

// will be called by bedit.js 
function proc_kd_ctrl_g(source, ev)
{
  if ( source ) {
    checkSpell(source);
  }

  return true;
}

function checkSpell(sid) {
   var text;

   if ( typeof sid == 'string' ) { // id is passed
      spellObj = document.getElementById(sid);
   } else if ( sid && sid.name ) { // object itself
      spellObj = sid; 
   } else if ( ! spellObj ) {
      return false;
   }

   text = spellObj.value;

   screq = new_req() ;

   // general form of POST data: req.send('var1=data1&var2=data2');
   data = "method=sc" + "&text=" + encodeURIComponent(text) ;

   // Execute the request
   try {
      if (screq) {
         screq.onreadystatechange = showSpell;

         // GET method will be cached, not desirable authentication, so using POST
         screq.open( 'POST', url, true );
         screq.setRequestHeader('REFERER', location.href);
         screq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
         screq.send( data );
      }
   } catch (e) {
      // do nothing
   }

   return false ;
}

function rip ( text )
{
   t = text.replace ( /\r?\n/g, " " );
   t = t.replace ( /<br>/gi, "\n" );
   t = t.replace ( /<[^>]*>/g, "" );
   t = t.replace ( /&lt;/g, "<" );
   t = t.replace ( /&gt;/g, ">" );
   t = t.replace ( /&nbsp;/g, " " );
   t = t.replace ( /&amp;/g, "&" );
   return t;
}

function showSpell() {
   var d = document.getElementById("status" );
   var a = document.getElementById("action" );

   switch (screq.readyState) {
      case 1:
         d.style.color = 'Red' ;
         stext = "ئىملا تەكشۈرۈلىۋاتىدۇ ..."; 
         d.innerHTML = stext ;
         break ;
      case 2:
         break;
      case 3:
         break;
      case 4:
         if (screq.status == 200) {
            var len = screq.responseText.length;
            // last char specifies spelling result
            var res = screq.responseText.substr(len-1,1);  
            var html = screq.responseText.substring(0, len-1);
            var str = "";
            var timestr = "";

            // extract the information sent from the server on how much it took to get the suggestions
            // format is (at the end): <!-- dd.ddms -->x, where x is the status, which has been extracted.

            var idx = html.lastIndexOf("<!--");
            if ( idx > 0 ) {
               str = html.substr(idx+4);
               idx = str.indexOf("-->");
               if ( idx > 0 ) {
                  str = str.substr(0,idx);
                  if ( str.indexOf("ms") > 0 ) {
                     timestr = str;
                  }
               }
            }

            if (divSpell) {
               divSpell.parentNode.removeChild(divSpell);
               divSpell = null;
            }

            divSpell = document.createElement('DIV');
            divSpell.className = 'spell_box';
            divSpell.style.width = spellObj.style.width;
            divSpell.style.height = spellObj.style.height;
            divSpell.style.direction = spellObj.style.direction;
            divSpell.innerHTML = html; 

            if (divSpell.addEventListener) {
              divSpell.addEventListener('dblclick', toEdit, false ) ;
            } else if (divSpell.attachEvent) {
              divSpell.attachEvent ( 'ondblclick', toEdit ) ;
              divSpell.attachEvent ( 'onkeypress', toEdit ) ; 
            }

            spellObj.style.display = "none";
            spellObj.parentNode.insertBefore(divSpell, spellObj);

            if ( d ) {
               if ( res.toLowerCase() == "s" ) { // success, no misspelling found
                  d.style.color = 'Green' ;
                  stext = "خاتالىق تېپىلمىدى."; 
               } else { // some misspellings found
                  d.style.color = 'Red' ;
                  stext = "";
               }
               stext = stext + " كەتكەن ۋاقىت: " + timestr + "(مىللى سىكونت)"; 
               d.innerHTML = stext ;
            }
            if ( a ) {
               a.innerHTML = "<a class=\"action\" onClick=\"toEdit()\">" + "تەھرىرلەشكە قايتىش" + "</a>";
            }
         } else {
            // don't scare the user for not being able to validate at this time
            // alert ( screq.responseText );
         }
         break;
   }
}

function toEdit()
{
   var a = document.getElementById("action" );
   var d = document.getElementById("status" );

   d.innerHTML = "";

   var text = divSpell.innerHTML;
   text = rip(text);

   if (divSuggest) {
      divSuggest.parentNode.removeChild(divSuggest);
      divSuggest = null; 
   }

   spellObj.style.display = "none";
   spellObj.disabled = false;
   spellObj.value = text;

   if (divSpell) {
      divSpell.parentNode.removeChild(divSpell);
      divSpell = null;
   }

   spellObj.style.display = "block";
   spellObj.focus();

   a.innerHTML = "<a class=\"action\" onClick=\"checkSpell()\">" + "ئىملا تەكشۈرۈش" + "</a>";
}

function getSuggestions(sid, word) {
   ssreq = new_req() ;

   // general form of POST data: req.send('var1=data1&var2=data2');
   data = "method=ss" + "&id=" + sid + "&word=" + word ;

   // create suggestion div and position it accordingly
   var x = findPosX(sid);
   var y = findPosY(sid);

   var scrollPos = 0;
   if (checkBrowser() != "ie") {
      scrollPos = divSpell.scrollTop;
   }

   if (divSuggest) {
      divSuggest.parentNode.removeChild(divSuggest);
   }

   divSuggest = document.createElement('DIV');
   divSuggest.style.display = "none";
   divSuggest.className = 'suggestion_box';
   divSuggest.style.position = 'absolute';
   divSuggest.style.left = x - 15 + 'px';
   divSuggest.style.top = (y+16-scrollPos) + 'px';
   divSuggest.starting = true;
   document.body.appendChild(divSuggest);

   // Execute the request
   try {
      if (ssreq) {

         ssreq.onreadystatechange = showSuggestions;
         // GET method will be cached, not desirable authentication, so using POST
         ssreq.open( 'POST', url, true );
         ssreq.setRequestHeader('REFERER', location.href);
         ssreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
         ssreq.send( data );
      }
   } catch (e) {
      // do nothing
   }

   return false ;
}

function showSuggestions () {
   var d = document.getElementById ( "status" ) ;

   switch (ssreq.readyState) {
      case 1:
         if ( d ) {
            d.style.color = 'Red' ;
            stext = "سۆز ئاختۇرۇلىۋاتىدۇ ..."; 
            d.innerHTML = stext ;
         }
         break ;
      case 2:
         break;
      case 3:
         break;
      case 4:
         if (ssreq.status == 200) {
            var html = ssreq.responseText;

            // extract the information sent from the server on how much it took to get the suggestions
            // format is: <!-- dd.ddms -->\n
            var idx = html.indexOf("\n");
            var str = "";
            var timestr = "";

            if ( idx > 0 ) {
               str = html.substr(0, idx);
               idx = str.indexOf("<!--"); // find the ending sign
               if ( idx != -1 ) {
                  str = str.substr(4); // skip the starting comment
                  idx = str.indexOf("-->"); // find the ending sign
                  if ( idx > 0 ) {
                     str = str.substr(0, idx); 

                     if ( str.length > 2 && str.indexOf("ms") > 0 ) {
                        timestr = str;
                     }
                  } 
               }
            }

            divSuggest.innerHTML = html; 
            divSuggest.style.display = 'block';

            if ( d ) {
               if ( timestr.length > 1 ) {
                  d.style.color = 'Blue';
                  stext = "ئىزدەشكە كەتكەن ۋاقىت: " + str + "(مىللى سىكونت)";
                  d.innerHTML = stext ;
               } else {
                  d.innerHTML = "" ;
               }
            }
         } else {
            // don't scare the user for not being able to validate at this time
            // alert ( ssreq.responseText );
         }
         break;
   }
}

function replace ( id, suggestion )
{
   document.getElementById(id).innerHTML = suggestion;
   if (divSuggest) {
      divSuggest.parentNode.removeChild(divSuggest);
      divSuggest = null; 
   }
   document.getElementById(id).style.color = "#005500";
}

/*********** compatibility and utility functions below *********/

function new_req ( )
{
   var newreq ;

   try {
      if (window.XMLHttpRequest) {
         newreq = new XMLHttpRequest();
      // branch for IE/Windows ActiveX version
      } else if (window.ActiveXObject) {
         newreq = new ActiveXObject("Microsoft.XMLHTTP");
      }
   } catch (e) {
      // do nothing here
   }

   return newreq ;
}

function watchClick(e){
   if (divSuggest) {
      if (divSuggest.starting) {
         divSuggest.starting = false;
      } else {
         var t = getTarget(e);
         
         if (t != divSuggest){
            divSuggest.parentNode.removeChild(divSuggest);
            divSuggest = null;
         }
      }
   }
   
   return true;
}

function getTarget(e){
   var value;
   if (checkBrowser() == "ie"){
      value = window.event.srcElement;
   }
   else{
      value = e.target;
   }
   return value;
}

function checkBrowser(){
   var theAgent = navigator.userAgent.toLowerCase();
   if(theAgent.indexOf("msie") != -1){
      if(theAgent.indexOf("opera") != -1){
         return "opera";
      } else{
         return "ie";
      }
   } else if(theAgent.indexOf("netscape") != -1){
      return "netscape";
   } else if(theAgent.indexOf("firefox") != -1){
      return "firefox";
   } else if(theAgent.indexOf("mozilla/5.0") != -1){
      return "mozilla";
   } else if(theAgent.indexOf("\/") != -1){
      if (theAgent.substr(0,theAgent.indexOf('\/')) != 'mozilla'){
         return navigator.userAgent.substr(0,theAgent.indexOf('\/'));
      }
      else{
         return "netscape";
      } 
   } else if(theAgent.indexOf(' ') != -1){
      return navigator.userAgent.substr(0,theAgent.indexOf(' '));
   } else{ 
      return navigator.userAgent;
   }
}

function findPosX(oid){
   var curleft = 0;
   var obj = document.getElementById(oid);
   if (obj.offsetParent){
      while (obj.offsetParent){
         curleft += obj.offsetLeft - obj.scrollLeft;
         obj = obj.offsetParent;
      }
   }
   else if (obj.x){
      curleft += obj.x;
   }
   return curleft;
}


function findPosY(oid){
   var curtop = 0;var curtop = 0;
   var obj = document.getElementById(oid);
   if (obj.offsetParent){
      while (obj.offsetParent){
         curtop += obj.offsetTop - obj.scrollTop;
         obj = obj.offsetParent;
      }
   }
   else if (obj.y){
      curtop += obj.y;
   }
   return curtop;
}
