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;
}

function checkSpell( sid ) {
   var text;

   if ( sid ) {
      spellObj = document.getElementById(sid);
   }

   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.toLowerCase());
         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:
         if ( d ) {
            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);
            if (divSpell) {
               divSpell.parentNode.removeChild(divSpell);
               divSpell = null;
            }

            divSpell = document.createElement('DIV');
            divSpell.className = 'spell_box';

            if ( spellObj.style.width ) {
               divSpell.style.width = spellObj.style.width;
            } else {
               divSpell.style.width = "555px";
            }

            if ( spellObj.style.height ) {
               divSpell.style.height = spellObj.style.height;
            } else {
               if ( spellObj.type.toLowerCase() == "textarea" ) {
                  divSpell.style.height = "162px";
               } else if ( spellObj.type.toLowerCase() == "text" ) {
                  divSpell.style.height = "28px";
               }
            }

            //divSpell.style.direction = spellObj.style.direction;
            divSpell.style.direction = 'rtl'; 
            divSpell.style.textAlign = 'right';
            divSpell.innerHTML = html; 

            if ( isIE ) {
               divSpell.attachEvent ( 'ondblclick', toEdit ) ;
               divSpell.attachEvent ( 'onkeypress', toEdit ) ;
               //divSpell.attachEvent ( 'oncontextmenu', toEdit ) ;
            } else if ( isGecko ) {
               divSpell.addEventListener ( 'dblclick', toEdit, false ) ;
               //divSpell.addEventListener ( 'contextmenu', toEdit, false ) ;
            }

            spellObj.style.display = "none";
            spellObj.parentNode.insertBefore(divSpell, spellObj);

            if ( d ) {
               d.style.color = 'Green' ;
               if ( res.toLowerCase() == "s" ) { // success, no misspelling found
                  stext = "خاتالىق تېپىلمىدى."; 
               } else { // some misspellings found
                  stext = ""; 
               }
               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" );

   if ( d ) {
      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();

   if ( a ) {
      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 (!isIE) {
      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.toLowerCase());
         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;

            if ( divSuggest ) {
               divSuggest.innerHTML = html; 
               divSuggest.style.display = 'block';
            }

            if ( d ) {
               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 (isIE){
      value = window.event.srcElement;
   }
   else{
      value = e.target;
   }
   return value;
}

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;
}
