MediaWiki:Gadget-GoogleTrans.js

// From Wikipedia:User:Endo999/GoogleTrans.js // does google toolbar like translation of words and selected text // works on ie and firefox, epiphany, safari, chrome, and opera but still has bugs on // Konqueror (in fact the code is disabled on Konqueror) // selected text translation (up to 500 characters) only on IE, Firefox, and Epiphany, and chrome // this has only been tested on the monobook skin // default from and to language // the languages must be the same as in google.language.Languages array. // these are normally the international defaults but note: // portuguese: pt-PT // traditional chinese: zh-TW // simplified chinese: zh-CN // // must be set in this routine for dictionarylookup.js /* var SCLanguageDefaultTo = 'ru'; var SCLanguageDefaultFrom='en'; var SCLanguageDefaultTo = 'fr'; var SCLanguageDefaultFrom='en'; if(typeof wgUserLanguage != "undefined" &&  typeof wgContentLanguage!= "undefined") {  if(wgUserLanguage != wgContentLanguage) SCLanguageDefaultTo = wgUserLanguage; } var SCShiftKeyNeeded = true; // need to set document.domain here, each language should set this field here document.domain = "en.wikifur.com" // default literals for system // must be set in this routine for dictionarylookup.js // the gadget manager can change these to the language he wishes var SCstrLanguage = "Language"; var SCstrSource = "Source"; var SCstrGoogle = "Google"; var SCstrCloseWindow = "Close window"; var SCstrSelectLanguage = "Select language (to)"; var SCstrWikipedialanguage = "WikiFur language"; var SCstrDictionary = "Dictionary"; var SCstrWikipedia = "WikiFur"; var SCstrPopupHelp = "GoogleTrans help?"; var SCstrTurnOffPopups = "Turn GoogleTrans off?"; var SCstrTurnOnPopups = "Turn GoogleTrans on?"; var SCstrGoogleTrans ="GoogleTrans"; var SCstrOff = " (off)"; var SCstrOn = " (on)"; var SCstrChangeOptions = "Change options for GoogleTrans"; var SCstrTranslatePage = "Google: translate page?"; var SCstrHelpUrl = "http://en.wikipedia.org/w/index.php?title=User:Endo999/dictionarylookuphelp.html&ctype=text/html"; var SCstrSingleWord = "Translation of single words"; var SCstrSelectedText = "Translation of selected text (> 500 characters)"; var SCstrKonqueror = "This feature is not supported on Konqueror"; var SCstrTextTooLarge = "Text element too large to parse!"; var SCstrGuessLanguage = "Any language"; var SCstrShiftKeyNeeded = "Shift key down to bring up Popup? Turn Option "; var SCbNoShiftKeyBrowser = false; var SCPopupBackgroundColor = "beige"; // you can set the popup background color here appendCSS( '.SCuserData { behavior:url(#default#userdata);} ' + '#SCitem div small, #SCitem small,#SCitem div div small,#SCitem div div div small {font-size:65%;color:black}' + '#SCitem div a:hover, #SCitem a:hover, #SCitem div div a:hover {text-decoration:underline;}' + '.SCPopup {background-color:' + SCPopupBackgroundColor +';border: 1px solid blue;position:absolute;font-size:14pt;z-index:9999;' +'overflow:visible;line-height:normal;padding:.5em;display:block;}' + '.SCxWindow {font-size:70%;color:black;' + 'position:absolute;right:.5em;}'+ '.SCyWindow{font-size:50%;color:black;position:absolute;right:.5em;'+ 'bottom:.5em}' + '.SCxTranslation {font-size:70%;color:black;' + 'position:absolute;left:.5em;top;.5em;}' + '.SCxText {color:black;}'+ '.SCPopupIE {position:absolute;background-color: ' + SCPopupBackgroundColor + ';border: 1px solid blue;font-size:14pt;z-index:9999; ' + 'overflow:visible;display:block;line-height:normal;padding:.5em;width:auto;}' + '.SChidestuff {display:none;}' ); function SCGoogleLanguageLoaded { SCMakeGoogleLanguages; } function SCloadGoogleLanguage {  google.load("language", "1", {"callback" : SCGoogleLanguageLoaded}); } // this api key is not strictly necessary, but Google maintains they will email // you if, for some reason, they withdraw the Google translation services // the gadget manager is welcome to log onto code.google.com and get his own // api key.  var SCGoogleAPIKey = "ABQIAAAAIL6lIdsFmMh3QB6iZZYqHBT5zsu4IrEqi6aTPGb6EkJ6C2zK0BQyWgLmv16JfxNy3RYUKg7GyR6XAg"; importScriptURI("http://www.google.com/jsapi?callback=SCloadGoogleLanguage&key=" + SCGoogleAPIKey); $(document).ready( function { var span1 = document.createElement('DIV'); span1.setAttribute('id','SCitem'); var thebody = document.getElementsByTagName('BODY'); thebody[0].appendChild(span1); var span2 = document.createElement('SPAN'); span2.setAttribute('id','SCPersistElement'); span2.setAttribute('class','SCuserData'); thebody[0].appendChild(span2); } ); var SCnewoptions; function SCMakeGoogleLanguages { var l; var lcode; var newoptions = ""; var bLangNotSupported = true; var b2digitsLangNotSupported = true; var language2digits = ""; for (l in google.language.Languages) {  lcode = google.language.Languages[l];   if(google.language.isTranslatable(lcode))   {     if(!l.match(/UNKNOWN/i))       newoptions +=    '' + (l.substring(0,1).toUpperCase + l.substring(1).toLowerCase) + ' '+"\n";   if(lcode.toUpperCase == SCLanguageDefaultTo.toUpperCase)      bLangNotSupported = false;   var twodigitlang = "";   if(lcode.match(/^(..)/))      twodigitlang = RegExp.$1;   if(twodigitlang.length == 2 && SCLanguageDefaultTo.match("^" + twodigitlang,"i"))   {      b2digitsLangNotSupported = false;      language2digits = lcode;   }   } } SCnewoptions = newoptions;  if(bLangNotSupported) {   var olddefaultlang = SCLanguageDefaultTo; var bSameAsContent = false; if(typeof wgContentLanguage && wgContentLanguage == language2digits) bSameAsContent = true; if(!b2digitsLangNotSupported && !bSameAsContent) {     SCLanguageDefaultTo = language2digits; }  else SCLanguageDefaultTo = 'fr'; if(olddefaultlang == SCtranslateTo) SCtranslateTo = SCLanguageDefaultTo; } } // contents of dictionarylookup1.js follow // this javascript isolates the text word under the //cursor when it rests on a word for 1.5 seconds // works in Firefox 1,2.0,3 and IE 6.0,7,8, chrome // works in Windows Safari, and Opera // does not work in Konqueror(that I know of, code is disabled for Konqueror) // with the Google language javascript api this does dictionary lookup // in several languages. // the word isolated is translated // and the translation is placed back in the new window // on IE, Firefox, chrome, and Epiphany a cursor place over // selected text (up to 500 characters) will use // that text // author: endo999 // author: Paul Cheffers // email: paul@securecottage.com // 2008 // // this webpage is placed in the public domain by the author // the default languages(the from language is redundant as Google guesses // the language) but SCLanguageDefaultTo is important is you are porting // to another Wikipedia Language // set this in main gadget file // restrictive environments don't like wikipedia.org to set cookies with //document.domain = "wikifur.com" var SCSourcestrlength = SCstrSource.length + SCstrGoogle + 2; var SCMinLength = 22; var SCgooglereference1 = //' ' + ''+ SCstrSource +': ' + SCstrGoogle + ' '; var SCgooglereference2 = 'X'; var SClanguageprompt1 = ''; var SClanguageprompt2 = ' '; var SClabel=""; var SCtext=""; var SCtranslate="FrenchToEnglish"; var SCtranslateFrom = SCLanguageDefaultFrom; var SCtranslateTo = SCLanguageDefaultTo; var SCTooManyTextElements=450; var SCdonthide = false; // for change of language var SCwindows = 0; // number of yellow windows var SCMaxwindows = 1; // max number of yellow windows var SCscreenWidth = 0, SCscreenHeight = 0; var SCwrheight=250, SCwrwidth=300; var SCscrOfX = 0, SCscrOfY = 0; var SCWikihtml="", SCDicthtml=""; var SCbInsertSpan=false; var SCalttranslate=""; var SCWikipedialanguage="en.wikifur.com"; var SCshowwrad = false; var SCbIsIE = false; var SCbIsIE8 = false; var SCbIsKonqueror = false; var SCbIsOpera = false; var SCbIsMozilla = false; var SCdebug = false; var SCclientX=0; var SCclientY=0; var SCposx = 0; // position of cursor var SCposy = 0; var SCPosYAdjust = 42; // if over link with title drop popup window a little var SCpposx = -1; // previous position of cursor var SCpposy = -1; var SCsrcElement=null; var SCbIsKonquerorEvent=false; var SCbMouseClicked=false; var SChInterval = null; //var SCMaxWordLength = 50; var SCselectedText = ""; var SCrangeCurx = 0; var SCrangeCury = 0; var SCrangeCurx1 = 0; var SCrangeCury1 = 0; var SCselectionarray = new Array; var SCselectionstart = new Array; var SCselectionend = new Array; var SCselectionarrayposition = new Array; var SCselection = new Array; var SCMaxWordLength=495; var SCIeRange; var SCSelectionType; var SCbIsWordInSelection=false; var SCGoogleTrans=true; var SCbIsChrome=false; var SCShiftKey=false; if(SCPersistantLoad("GoogleTrans") == "1") SCGoogleTrans = true; else SCGoogleTrans = false; if(navigator.appVersion.match(/MSIE/i)) { SCbIsIE = true; if(navigator.userAgent.indexOf('MSIE 8') != -1) SCbIsIE8 = true; } var SCbIsSafari = false; var SCbIsPre4Safari = false; if(navigator.appVersion.match(/Safari/i)) { SCbIsSafari = true; if(navigator.userAgent.indexOf('Version/3.')!= -1 ||  navigator.userAgent.indexOf('Version/2.')!= -1  ) {    SCbIsPre4Safari = true; SCbNoShiftKeyBrowser = true; } } if(navigator.userAgent.indexOf('Epiphany/1.')!= -1 ||  navigator.userAgent.indexOf('Firefox/1.') != -1  ) SCbNoShiftKeyBrowser = true; if(navigator.appVersion.match(/Chrome/i)) { SCbIsSafari = false; SCbIsChrome = true; } if(navigator.appVersion.match(/Konqueror/i)) { SCbIsKonqueror = true; } if(navigator.appName.match(/Opera/i)) { SCbIsOpera = true; } if(navigator.appName.match(/Netscape/i)) { SCbIsMozilla = true; } var SCnn=(document.layers)?true:false; var SCie=(document.all)?true:false; function SCkeyUp(e) { var evt=(e)?e:(window.event)?window.event:null; if(evt) { // var key=(evt.charCode)?evt.charCode: ((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0)); } if(!evt) return; try { if (evt.shiftKey==1) SCShiftKey = true; else SCShiftKey = false; } catch(e) { SCShiftKey = false; SCShiftKeyNeeded = false; } } function SCkeyDown(e) { var evt=(e)?e:(window.event)?window.event:null; var key=0; if(evt) { // var key=(evt.charCode)?evt.charCode: ((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0)); } if(!evt) return; try { if (evt.shiftKey==1) SCShiftKey = true; else SCShiftKey = false; } catch(e) { SCShiftKey = false; SCShiftKeyNeeded = false; } if(key == 27 && SCdebug == false) // escape key { // SCdebug = true; // SCdeleteEvents; } else if(key == 27 && SCdebug == true) { // SCdebug = false; // SCcreateEvents; } } function SCdeleteEvents { document.onkeydown=null; document.onmousedown = null; document.body.onmousemove = null; document.body.onmouseout = null; } function SCeventhook(hook,func) { if(document.addEventListener) document.addEventListener(hook, func, false); else document.attachEvent("on" + hook, func); } function SCcreateEvents { SCeventhook("keyup",SCkeyUp); SCeventhook("keydown",SCkeyDown); SCeventhook("mousedown",SCcaptureMousedown); SCeventhook("mousemove",SCcaptureMousemove); SCeventhook("mouseout",SCcaptureMouseout); } var shiftkeyneeded = SCPersistantLoad('shiftkeyneeded'); if(shiftkeyneeded == "0") SCShiftKeyNeeded = false; else SCShiftKeyNeeded = true; if(SCbNoShiftKeyBrowser) SCShiftKeyNeeded = false; var SCpersistlangFrom = SCPersistantLoad('languageFrom'); if(SCpersistlangFrom != "") SCtranslateFrom = SCpersistlangFrom; var SCpersistlangTo = SCPersistantLoad('languageTo'); if(SCpersistlangTo != "") SCtranslateTo = SCpersistlangTo; var SCwikilang = SCPersistantLoad('Wikipedialanguage'); if(SCwikilang != "") SCWikipedialanguage = SCwikilang; else SCPersistantSave('Wikipedialanguage',SCWikipedialanguage); SCsetInterval; function SCsetInterval { if(SChInterval) clearInterval(SChInterval); SChInterval = null; if(SCShiftKeyNeeded) SChInterval = setInterval("SCinterval",250); else SChInterval = setInterval("SCinterval",1000); } var SCbIsOutsideClientArea = false; function SCcaptureMouseout(evt) {   SCbIsOutsideClientArea = true; SCbMouseClicked = false; } var SClastposx=0; var SClastposy=0; var SCbInSCInterval = false; function SCinterval { if(SCbIsKonqueror) return; // current dont work on Konqueror try { if(SCbInSCInterval) return; SCbInSCInterval = true; if(SCbIsMozilla) {  if(SCsrcElement &&       SCsrcElement.toString.match(/HTMLHtmlElement/i)) SCbIsOutsideClientArea = true; } if(SCbIsKonqueror||SCbIsOpera) {  if(SCsrcElement &&       SCsrcElement.toString.match(/HTMLBodyElement/i)) SCbIsOutsideClientArea = true; else SCbIsOutsideClientArea = false; } else if(SCbIsIE) {   SCgetScrollXY; SCScreenSize; if(SCposx > SCscreenWidth+SCscrOfX-4 ||      SCposy > SCscreenHeight+SCscrOfY-4) SCbIsOutsideClientArea = true; } var mes = document.getElementById("SCmessage"); if(mes && SCsrcElement) mes.innerHTML = bIsOutsideClientArea + ":" + SCbMouseClicked + ":" + SCposx+","+SCposy+"::"+SCsrcElement.toString; var posx = SCpposx - SCposx; if(posx < 0) posx = - posx; var posy = SCpposy - SCposy; if(posy < 0) posy = - posy; if(!SCbMouseClicked && posx < 4 &&  posy < 4  && (SCcurrentLink == "" || SCcurrentLink == null ||!document.getElementById(SCcurrentLink))) {   if(SCsrcElement &&       !(SClastposx == SCposx && SClastposy == SCposy)       && !SCbIsOutsideClientArea      ) {    SCFindElementUnderMouseOver(SCsrcElement); if(!SCShiftKeyNeeded) {      SClastposx = SCposx; SClastposy = SCposy; }   } } else if((SCcurrentLink != "" && SCcurrentLink != null && document.getElementById(SCcurrentLink))      &&       (posx > 4 || posy > 4)      && !SCbIsOutsideClientArea       ) SChidespan(SCcurrentLink); if(!SCdonthide && !SCbMouseClicked) {   SCpposx = SCposx; SCpposy = SCposy; } SCbInSCInterval = false; } catch(e) {SCbInSCInterval = false; } } function SCcaptureMousemove(evt) {  SCbIsOutsideClientArea = false; SCFindPositionOfMouseClick(evt); var posx = SCposx - SCpposx; var posy = SCposy - SCpposy; if(posx < 0) posx = - posx; if(posy < 0) posy = - posy; if(!(posx < 4 && posy < 4)) SCbMouseClicked = false; } // capture right mouse click function SCcaptureMousedown(evt) { var mouseClick; if(evt) mouseClick = evt.which; else mouseClick = window.event.button; if(/*mouseClick == 1 &&*/ SCbIsOutsideClientArea==false) { SCbMouseClicked = true; } } //http://www.quirksmode.org/js/events_properties.html function SCFindPositionOfMouseClick(e) { SCposx = 0; SCposy = 0; if (!e) var e = window.event; if (e.pageX || e.pageY) { SCposx = e.pageX; SCposy = e.pageY; }	else if (e.clientX || e.clientY) 	{ if(1==1) {               SCclientX=e.clientX; SCclientY=e.clientY; SCposx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; SCposy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; }             else {               SCposx = window.event.x+document.body.scrollLeft; SCposy = window.event.y+document.body.scrollTop; }     	}	// SCposx and SCposy contain the mouse position relative to the document if (e.target) {        SCsrcElement = e.target; }	else if (e.srcElement) {        SCsrcElement = e.srcElement; } } // find the element under the mouse click // see http://www.quirksmode.org/js/events_properties.html function SCFindElementUnderMouseOver(targ) { if(!targ) return; if(!SCGoogleTrans) return; if(SCShiftKeyNeeded && SCShiftKey == false) return; if(SCwindows >= SCMaxwindows) return; if (targ.nodeType == 3) // defeat Safari bug {		targ = targ.parentNode; }       if(targ.nodeName == "TEXTAREA" ||           targ.nodeName == "INPUT") return; // if input area just return // only scan through text elements var SelectionNode=null; var SelectionOffset=null; var SelectionAnchorNode = null; var SelectionAnchorOffset=null; if(SCbIsIE8 && targ.childNodes.length > SCTooManyTextElements*2) {           return; }        var children = targ.childNodes; var ntextchildren = 0; if(SCbIsIE && children.length > SCTooManyTextElements*2) return; for(i=0;i SCTooManyTextElements) {                   window.status = SCstrTextTooLarge; return; }        }         // if there are too many text elements to parse just return if(ntextchildren > SCTooManyTextElements) {            window.status = SCstrTextTooLarge; return; }        if(!(SCbIsIE||SCbIsOpera||SCbIsPre4Safari) && window.getSelection) {	 var userSelection = window.getSelection; SCselectedText = userSelection.toString; SelectionNode = userSelection.focusNode; SelectionOffset = userSelection.focusOffset; SelectionAnchorNode = userSelection.anchorNode; SelectionAnchorOffset = userSelection.anchorOffset; for(i=0;i<children.length;i++) {          /*           if(userSelection.containsNode(children[i],false)) SCselection[i] = true; else */          if(userSelection.containsNode(children[i],true)) {             SCselectionarray[i] = new Array; SCselectionstart[i] = -1; SCselectionend[i] = -1; SCAreWordsInSelection(userSelection,SCselectionarray[i],             children[i],i) SCselection[i] = false; }          else {             SCselectionarray[i] = new Array; SCselection[i] = false; SCselectionstart[i] = -1; SCselectionend[i] = -1; }        }         }         else if(SCbIsIE) {           SCIeRange = document.selection.createRange; SCIeRange1 = SCIeRange.duplicate; SCSelectionType = document.selection.type; }        /*         var userSelection=""; if(!SCbIsIE && window.getSelection) {	  userSelection = window.getSelection; }        */         for(i=0;i<children.length;i++) {            if(children.item(i).nodeType == 3) {                var bBreak = false; if(SCfindwordin(targ,children.item(i),i)==true) bBreak = true; if(bBreak) break; }        }           if(SelectionNode && window.getSelection && window.getSelection.toString!="") {             try { var userSelection = window.getSelection; if(userSelection) {               userSelection.collapse(SelectionAnchorNode,SelectionAnchorOffset); userSelection.extend(SelectionNode,SelectionOffset); }             } catch(e) { } }        //  else if(SCbIsIE) //    SCIeRange1.select; } // parent is tag, child must be text node // 1) separate child text element into //   a) SCleft span of all words left of current //   b) SCcurrent: span of current word //    c) SCright: span of all words right of current word // 2) do binarylookup-like search of SCcurrent //   span to see if it is over the cursor position // function SCfindwordin(parent,child,childindex) {         var debug = SCdebug;         SCbIsWordInSelection = false;         var words = child.nodeValue.split(/[\s\r\n]+/);         var delimiter = " ";         var firstcharacter = "";         var lastcharacter = "";         // put a limit on the size of the text element: 4000 words         if(words.length > 4000)         {             window.status = SCstrTextTooLarge;             return false;         }  // if a selection text item then we dont have to do   // the search, we can proceed from here  // if Wikipedia then dont do  // only check here if IE  if(typeof SCtranslateFrom != "undefined" && SCtranslateFrom != "Wikipedia") { if(SCbIsIE)  {     SCselectedText = SCNotTooBigAndInSelection(parent,child,words);         if(SCselectedText != "")     {       SCbIsWordInSelection = true;       SCSetInLink(SCselectedText,parent,child,mid,delimiter,words,false);       return true;     }  }  }         if(child.nodeValue.substring(0,1).match(/[\s\r\n]/))            firstcharacter = delimiter;         if(child.nodeValue.match(/[\s\r\n]$/))            lastcharacter = delimiter;         // if language is Chinese, split every letter         // not on whitespace, as above         if(typeof SCtranslateFrom != "undefined" && ((SCtranslateFrom.match("zh","i") || SCtranslateFrom == "ja")||              (SCtranslateFrom == "Wikipedia" && (SCalttranslateFrom.match("zh","i")               || SCalttranslateFrom == "ja"                ))) )       {            var tempnodeValue = child.nodeValue;            tempnodeValue.replace(/[\s\r\n]+/," ");            words = tempnodeValue.split("");         //   words = child.nodeValue.split("");            delimiter = "";        }         // no sense in searching         if(words.length <= 0)            return false;         var html1="",html2="",currentword="";         var i,j;         var high = words.length;         var mid = Math.floor(high/2);         var low = 0;         var oldmid = -1;         var iRepetition = 0;         while(1)         {            if(oldmid == mid)               break; // have failed, don't repeat            if(++iRepetition > 20)               break; // no element is that large            if(typeof words[mid] == "undefined")               break; // have failed, don't repeat            html1 = firstcharacter; // usually nil            // create SCleft text string /*           for(j=0;j 0) {              html1 += words.slice(0,mid).join(delimiter); html1 += delimiter; }           // create SCright text string /*           html2 = ""; for(j=mid+1;j<words.length;j++) {              html2 += words[j] + ((j!=words.length-1)?                 delimiter:""); }           */            if(mid+1 < words.length) {             html2 = words.slice(mid+1,words.length).join(delimiter); if(html2 != "") html2 += lastcharacter; }           // SCcurrent text string currentword = words[mid]; if(html2 != "") currentword += delimiter; if(html2 == "" && lastcharacter != "") currentword += lastcharacter; // sometimes words[mid] is nil // if the case just back up one and continue if(currentword == delimiter) // ie, space after period {              if(debug)    alert("resetting currentword"); if(mid<high) {                mid++; if(oldmid == mid) oldmid-=2; }              else break; continue; }           var left = document.createElement('SPAN'); left.setAttribute("id","SCleft"); var right = document.createElement('SPAN'); right.setAttribute("id","SCright"); var current = document.createElement('SPAN'); current.setAttribute("id","SCcurrent"); var str1 = document.createTextNode(html1); var str2 = document.createTextNode(html2); var str3 = document.createTextNode(currentword); left.appendChild(str1); right.appendChild(str2); current.appendChild(str3); // replace child text region with // left,current, and right span elements // TO GET CURSOR POSITIONING parent.replaceChild(right,child); parent.insertBefore(current,right); parent.insertBefore(left,current); var SCcurrent = document.getElementById("SCcurrent"); var SCleft = document.getElementById("SCleft"); var SCright = document.getElementById("SCright"); if(debug) {     // debugging code SCcurrent.style.backgroundColor = "yellow"; SCleft.style.backgroundColor="red"; SCright.style.backgroundColor="orange"; }           var Curx = SCfindPosX(SCcurrent); var Cury = SCfindPosY(SCcurrent); var Curx1 = Curx + SCcurrent.offsetWidth; var Cury1 = Cury + SCcurrent.offsetHeight; var Leftx = SCfindPosX(SCleft); var Lefty = SCfindPosY(SCleft); var Leftx1 = Leftx + SCleft.offsetWidth; var Lefty1 = Lefty + SCleft.offsetHeight; var Rightx = SCfindPosX(SCright); var Righty = SCfindPosY(SCright); var Rightx1 = Rightx + SCright.offsetWidth; var Righty1 = Righty + SCright.offsetHeight; // special processing for IE           var bInsertForIE = false; var bUpForIE = false; var bDownForIE = false; var bBreakForIE = false; if(SCbIsIE) {              var sElem = ""; sElem = SCcurrent.componentFromPoint(                      SCclientX,SCclientY); if(sElem == "") {                bInsertForIE = true; }              else {                var sElem1 = ""; var sElem2 = ""; sElem1 = SCleft.componentFromPoint(                      SCclientX,SCclientY); sElem2 = SCright.componentFromPoint(                      SCclientX,SCclientY); if(sElem1 == "outside" &&                   sElem2 == "outside") bBreakForIE=true; if(sElem1 == "") bUpForIE = true; if(sElem2 == "") bDownForIE = true; }           }  if(debug) { alert(Curx+","+Curx1+":"+Cury+","+Cury1+"::"+SCposx+","+SCposy +      ":::" + high+","+mid+","+low); alert(Lefty+","+Lefty1+":"+Righty+","+Righty1+"::"+SCposx+","+SCposy +     ":::" + high+","+mid+","+low); }           var currentHeight = SCcurrent.offsetHeight; var currentWidth = SCcurrent.offsetWidth; parent.removeChild(right); parent.removeChild(current); parent.replaceChild(child,left); // parent.replaceChild(child,span1); // if cursor below whole element then fail if(1==0 && SCposy > Righty1 && Righty < Righty1 &&              Lefty1 != Righty1              ) {              if(debug)alert("left break"); break; }   //  if cursor before whole element then fail if(1==0 &&SCposy < Lefty && Lefty < Lefty1) {             if(debug)alert("right break"); break; }           if(bBreakForIE) break; oldmid = mid; var SCbCursorOverSelection=false; if(!SCbIsIE&&!SCbIsOpera&&!SCbIsPre4Safari) {              if(SCselection[childindex] == true) {                SCbCursorOverSelection=true; }              else if(SCselectionarray[childindex].length>=mid &&                  SCselectionarray[childindex][mid] == true) {                SCbCursorOverSelection=true; }           }            if((SCposx >= Curx && SCposx <= Curx1 && SCposy >= Cury && SCposy <= Cury1) ||                bInsertForIE) {              var linkText = words[mid]; if(!SCbIsIE && SCbCursorOverSelection && SCtranslateFrom != "Wikipedia") {                  linkText = SCselectedText; SCbIsWordInSelection = true; }              SCSetInLink(linkText,parent,child,mid,delimiter,words,true); return true; }           if(bUpForIE) {              high = mid; mid = Math.floor((low + high)/2); }           else if(bDownForIE) {              low = mid; mid = Math.floor((low + high)/2); }           else if(Cury > SCposy) // go up in element {              high = mid; mid = Math.floor((low + high)/2); }           else if(Cury1 < SCposy) // go down in element {              low = mid; mid = Math.floor((low + high)/2); }           else if(SCposx < Curx) // go up in element {              high = mid; mid = Math.floor((low + high)/2); }           else if(SCposx > Curx1)  // go down in element {              low = mid; mid = Math.floor((low + high)/2); }        }     return false; } var SCindex = 0; // for ids of translation windows // put the translation window near the cursor point var SCcurrentLink = ""; var SClinkword = ""; function SCSetInLink(word,parent,child,wordindex,delimiter,words,bIsSearchDone) { if(SCwindows >= SCMaxwindows) return; SCwindows++; var linkname = "SC" + (++SCindex); SCcurrentLink = linkname; // take out punctuation if single word if(word.split(/\s/).length==1) word = word.replace(/[.;:?!,]/g,""); SClinkword = word; if(word.length > SCMaxWordLength) {   word = word.substring(0,SCMaxWordLength); word += "..."; } if((SCtranslateFrom == "ja" || SCtranslateFrom.match("zh","i")) &&    !SCbIsWordInSelection    ) //  && SCtranslateTo != "en")  {//ch|ja to non en language       // translate to next punctuation mark	var i;	var wordlist="";        var beginindex = (wordindex > 0)?wordindex-1:0;        var endindex = words.length-1;	for(i=beginindex;i<=endindex;i++)	{		if(words[i].match(/\s/))		  break;		wordlist += words[i];	}	word = wordlist;   }  var str1 = document.createTextNode(word);  var a1 = document.createElement("DIV");  a1.setAttribute("id",linkname);   if(!SCbIsIE)  	a1.setAttribute("class","SCPopup");  else a1.className = "SCPopupIE";  if(!SCbIsIE)   {    a1.setAttribute("onMousedown",'SChidespan("' + linkname + '")');  }  a1.setAttribute("onMouseover","SCdonthide=true;");  a1.setAttribute("onMouseout","SCdonthide=false;");  SCbInsertSpan = false;  if(SCtranslateFrom != "Wikipedia")  {     a1.appendChild(str1);     SCWikihtml = SCWikipediaLink(wordindex,delimiter,words).innerHTML;     SCDicthtml = ""; } else { a1.appendChild(SCWikipediaLink(wordindex,delimiter,words)); SCWikihtml=""; SCDicthtml=word; if(!SCbIsIE) {           a1.setAttribute("onMousedown",""); a1.firstChild.setAttribute("onMousedown",""); } }  var thebody = document.getElementsByTagName("BODY"); // var html = document.getElementsByTagName("HTML"); var item = document.getElementById("SCitem"); if(item) item.appendChild(a1); if(SCtranslateFrom == "Wikipedia") {      SCsetLanguageDefault("wikipedialanguageoptions",                       "Wikipedialanguage") } // cursorposition is absolute, positioning of   // webpage elements may upset translation window // positioning, so append this window to body. // position window SCPositionPopup(linkname,true); if(SCtranslateFrom != "Wikipedia") {   var theword = word; if((SCtranslateFrom.match("zh","i") || SCtranslateFrom == "ja")     && !SCbIsWordInSelection      ) {     var currword = word; var beginindex = (wordindex > 0)?wordindex-1:0; var endindex = (wordindex < words.length-1)? wordindex+1:wordindex; var numwords = endindex - beginindex; if(numwords == 2) theword += " " + words[beginindex]+currword +" "+currword + words[endindex]; else if(numwords == 1 && beginindex == wordindex) theword += " " + currword + words[endindex]; else if(numwords == 1 && endindex == wordindex) theword += " " + words[beginindex] + currword; beginindex = wordindex; // we use cedit and edict for english stuff if(SCtranslateTo == "en"&&1==0) {	endindex = (wordindex+10 < words.length)? wordindex+10:words.length-1; var i;	var wordlist=""; for(i=beginindex;i<=endindex;i++) {		if(words[i].match(/[\r\n\s]/)) break; wordlist += words[i]; }	if(i-beginindex > 2) theword += " " + wordlist; }     else {//ch|ja to non en language // translate to next punctuation mark var i;	var wordlist=""; endindex = words.length-1; for(i=beginindex;i<=endindex;i++) {		if(words[i].match(/\s/)) break; words[i] = words[i].replace(/\'/g,"\u0026#39;"); words[i] = words[i].replace(/\"/g,"\u0026quot;");		wordlist += words[i];	}		theword = wordlist;     }    }    SCasyncGet(linkname, theword);  } } // is the current element in a link and does this link have a title? function SCIsSrcElementInALink {   if(!SCsrcElement)      return false;   if(SCsrcElement.nodeName.match(/^a$/i)      && ((SCsrcElement.getAttribute("title") != null &&          SCsrcElement.getAttribute("title") != "")          ||          typeof popupVersion != "undefined")         )      return true;   var Elem = SCsrcElement;   while(Elem.parentNode)   {      if(Elem.nodeName.match(/^a$/i)      && ((Elem.getAttribute("title") != null &&          Elem.getAttribute("title") != "")          ||          typeof popupVersion != "undefined")         )      return true;      Elem = Elem.parentNode;   }   return false; } function SCPositionPopup(linkname,bAdjust) {  var a2 = document.getElementById(linkname); var thebody = document.getElementsByTagName("BODY"); var posyadjust = 0; var posxadjust = 0; var bAdjustPosition = SCIsSrcElementInALink; if(bAdjustPosition && typeof popupVersion != "undefined" && bAdjust) posyadjust = -SCPosYAdjust; else if(bAdjustPosition) posyadjust = SCPosYAdjust; if(a2 && a2.style) {   if(SCbIsIE) {     // for ie      // body overflow needs to be set // a2.style.position = "absolute"; a2.style.left = SCposx; a2.style.top = SCposy + posyadjust; a2.onMouseover=new Function("SCdonthide=true;"); a2.onMouseout=new Function("SCdonthide=false;"); // if in ie the initial span goes over the right // side of screen var doclength = SCfinddoclength(a2); var a2overflow = (SCposx+a2.scrollWidth+1) - doclength; if(a2overflow > 0) {	 var newposx =  SCposx - a2overflow; //	 a2.style.position="absolute"; a2.style.left = newposx; a2.style.top=SCposy + posyadjust; }   }    else {       // a2 element returns 0 for following function var doclength = SCfinddoclength(thebody[0]); var a2overflow = (SCposx+a2.scrollWidth+1) - doclength; if(a2overflow > 0) {	 var newposx =  SCposx - a2overflow; //	 a2.style.position="absolute"; a2.style.left = newposx + "px"; a2.style.top=(SCposy + posyadjust) + "px"; //   	}      else {         a2.style.left = (SCposx) + "px"; a2.style.top = (SCposy + posyadjust) + "px"; }   } //    a2.style.display="block"; } } // after translation window has been left clicked // remove it function SChidespan(id) { if(SCdonthide) return; // so change of language can be done try { SCwindows--; if(SCwindows < 0) SCwindows = 0; var ob = document.getElementById(id); //alert(ob.innerHTML) if(SCbIsOpera && !ob) alert("ob not found"); if(SCbIsOpera && 1==0) {    ob = document.getElementById("SCitem"); // delete all children while(ob.childNodes.length>0) {	ob.removeChild(ob.childNodes[0]); } }  else {   var styl = ob.style; styl.display = "none"; if(ob && ob.parentNode) ob.parentNode.removeChild(ob); else if(SCbIsOpera) alert("maybe no parentnode"); } }  catch(err) {   if(SCbIsOpera) alert("unable to hide " + id); } // clear the html SCWikihtml = ""; SCDicthtml = ""; } function SCfinddoclength(obj) {       var ScrollBarOffset = 0; if(SCbIsIE) {           ScrollBarOffset = 20; }	if(SCbIsOpera) return window.innerWidth; else return document.body.clientWidth-ScrollBarOffset; // minus the scroll bar if IE	if (obj.offsetParent) {		while (obj.offsetParent) {			obj = obj.offsetParent; }	}       return obj.offsetWidth; } // code from http://www.quirksmode.org/js/findpos.html function SCfindPosX(obj) {	var curleft = 0; if(!obj) return 0; if (obj.offsetParent) {		while (obj.offsetParent) {			curleft += obj.offsetLeft obj = obj.offsetParent; }	}	else if (obj.x) { curleft += obj.x; } return curleft; } // code from http://www.quirksmode.org/js/findpos.html function SCfindPosY(obj) {	var curtop = 0; if(!obj) return 0; if (obj.offsetParent) {		while (obj.offsetParent) {			curtop += obj.offsetTop obj = obj.offsetParent; }	}	else if (obj.y)       { curtop += obj.y;       } return curtop; } // place meaning within translation window function SCInsertTranslation(translatedword) {	// var translatedword = SCrequest.responseText; var translation = translatedword.split("|"); // translation[0] id of window // translation[1] word // translation[2] translated word var meaning = translation[2]; if(meaning == '\n') meaning = "NOT FOUND!!"; meaning = meaning.replace(/\\u0026#39;/gi,"'"); meaning = meaning.replace(/\\u0026quot;/gi,'"');         if(SCtranslateFrom == "Wikipedia" && !SCbInsertSpan)          {            SCDicthtml = meaning;            return;          }          SCbInsertSpan = true;          // SCbInsertSpan = false;          var ob = document.getElementById(translation[0]);	  if(ob)	  {		try{                     var span1 = document.createElement("SPAN");                     var newid = "x" + translation[0];                     span1.setAttribute("id",newid);                     span1.innerHTML =                              meaning;		     if(SCbIsIE)                     {                         var newfunction = new Function("SCdonthide=false;");                         span1.onmouseout = newfunction;                          var newfunction1 = new Function("SCdonthide=true;");                         span1.onmouseover = newfunction1;                      } ob.replaceChild(span1,ob.firstChild); var span2 = document.getElementById(newid); var bIsInLink = SCIsSrcElementInALink; var pixelstring = "px"; if(SCbIsIE) pixelstring = ""; // the following code handles the IE                     // case where the yellow window goes // to the right of the body if(!SCbIsSafari) {                    var doclength = SCfinddoclength(span2.parentNode); var span2overflow = (SCposx+span2.scrollWidth+1) - doclength; if(span2overflow > 0) {                      var newposx =  SCposx - span2overflow; span2.parentNode.style.position="absolute"; span2.parentNode.style.left = newposx; span2.parentNode.style.top=SCposy; if(bIsInLink && typeof popupVersion == "undefined") span2.parentNode.style.top = (SCposy + SCPosYAdjust) + pixelstring; }                   }                    if(bIsInLink && typeof popupVersion != "undefined") {                      span2.parentNode.style.top = (SCposy - span2.parentNode.offsetHeight) + pixelstring; }		  }		catch(err) {		 alert("unable to set innerHTML"); }	}       //else alert("no id:" + translatedword); } // issue Google Ajax request function SCasyncGet(id,word) {  var languagepath = "en|fr"; // consult SCtranslate for language translation if(typeof SCtranslateFrom != "undefined"     && typeof SCtranslateTo != "undefined"     ) {      languagepath = SCtranslateFrom + "|" + SCtranslateTo; }  var persistantlanguagepathFrom = SCPersistantLoad('languageFrom'); var persistantlanguagepathTo = SCPersistantLoad('languageTo'); if(persistantlanguagepathFrom != "" &&     persistantlanguagepathTo != "") languagepath = persistantlanguagepathFrom + "|" + persistantlanguagepathTo; if(languagepath=="Wikipedia") languagepath = "en|fr"; //  if(languagepath == "Wikipedia") //  { //   } //   else {    // google limits to 500 characters of translation if(word.length > SCMaxWordLength) word = word.substring(0,SCMaxWordLength); var bIsSelectedText = "NO"; if(SCbIsWordInSelection) bIsSelectedText = "YES"; SCgoogleLookup(word,id); } } function SCreplaceHtml(obj,newhtml) { while(obj.childNodes.length>0) {  obj.removeChild(obj.childNodes[0]); } var newspan = document.createElement("SPAN"); newspan.innerHTML = newhtml obj.appendChild(newspan); } function SClanguageChange(obj,id) { var langoptions = obj.options[ obj.selectedIndex ].value; if(id.match(/From/)) {  SCtranslateFrom = langoptions; SCPersistantSave('languageFrom',SCtranslateFrom); } else if(id.match(/To/)) {  SCtranslateTo = langoptions; SCPersistantSave('languageTo',SCtranslateTo); } // SCtranslate = langoptions; //SCdonthide = false; //SChidespan(SCcurrentLink); } function SCwikipedialanguageChange(obj) { var langoptions = obj.options[ obj.selectedIndex ].value; SCWikipedialanguage = langoptions; SCPersistantSave('Wikipedialanguage',SCWikipedialanguage); var objWiki = document.getElementById(SCcurrentLink); if(!objWiki) {  alert("objWiki failed: " + SCcurrentLink); } var arrLinks = objWiki.getElementsByTagName("A"); var i; for(i=0;i0) {  anchor1.removeChild(anchor1.childNodes[0]); } // replace text in anchor in tab anchor1.appendChild(text1); SChidespan(SCcurrentLink); } function SCSaveShiftKeyNeeded {  if(SCbNoShiftKeyBrowser) {    SCShiftKeyNeeded = false; return; }  SCsetInterval; SCPersistantSave("shiftkeyneeded",SCShiftKeyNeeded?"1":"0"); } var SCnewhtml = ""; function SCmakevisiblelanguagechange { var obj = document.getElementById(SCcurrentLink); if(!obj) { alert("unable to get object: SCmakevisiblelanguagechange " + SCcurrentLink); return; } SCdonthide = true; var persistantlanguageFrom = SCPersistantLoad('languageFrom'); if(persistantlanguageFrom == "") persistantlanguageFrom = SCLanguageDefaultFrom; var persistantlanguageTo = SCPersistantLoad('languageTo'); if(persistantlanguageTo == "") persistantlanguageTo = SCLanguageDefaultTo; var newhtml = 'X' + ' ' + ((SCGoogleTrans)?SCstrTurnOffPopups: SCstrTurnOnPopups) + '' + ' ' + SCstrPopupHelp+'</a>'+ ' ' + SCstrShiftKeyNeeded + ((SCShiftKeyNeeded)?SCstrOff:SCstrOn) + '</a> ' + ' ' + ' ' + SCstrSelectLanguage + ' ' + '<SELECT name="languageoptionsFrom" id="languageoptionsFrom"' + 'onchange="SClanguageChange(this,\'languageFrom\')"' + ' onMouseover="javascript:SCdonthide=true;" class="SChidestuff">' + //' onMouseout="javascript:SCdonthide=false;">' + SCnewoptions + ' ' + '<SELECT name="languageoptionsTo" id="languageoptionsTo"' + 'onchange="SClanguageChange(this,\'languageTo\')">' + ' onMouseover="javascript:SCdonthide=true;">' + //' onMouseout="javascript:SCdonthide=false;">' + SCnewoptions + ' ' + SCstrSingleWord + SCstrOn + ' ' + SCstrSelectedText + ((SCbIsIE || (SCbIsMozilla&&!(SCbIsOpera||SCbIsKonqueror||SCbIsPre4Safari )))?SCstrOn:SCstrOff) + ((SCbIsKonqueror)?SCstrKonqueror + ' ' : '') + ' ' var newspan = document.createElement("DIV"); newspan.setAttribute("onMouseover","javascript:SCdonthide=true;"); if(SCbIsIE) {    newspan.onmouseover = new Function("SCdonthide=true;"); } newspan.innerHTML = newhtml; var i; while(obj.childNodes.length>0) {  obj.removeChild(obj.childNodes[0]); } // obj.replaceChild(newspan,obj.firstChild); obj.appendChild(newspan); if(SCbIsSafari) obj.setAttribute("onMousedown",""); // obj.innerHTML = newhtml; SCsetLanguageDefault("languageoptionsFrom","languageFrom"); SCsetLanguageDefault("languageoptionsTo","languageTo"); } function SCsetLanguageDefault(id,key) { var i;  var obj = document.getElementById(id); if(!obj) return; var defaultlanguage = SCPersistantLoad(key); if(defaultlanguage == "") { //    if(typeof SCtranslate == "undefined") {       if(key.match(/From/)) defaultlanguage = SCLanguageDefaultFrom; else if(key.match(/To/)) defaultlanguage = SCLanguageDefaultTo; } //    else defaultlanguage = SCtranslate; } if(!obj || (obj && !obj.options)) {    alert("setLanguageDefault: bad object passed!" +      id + ":" +      key); } for(i=0;i<obj.options.length;i++) {    obj.options[i].selected = false; if(obj.options[i].value.match(defaultlanguage,"i")) {       obj.options[i].selected = true; } }  if(SCbIsSafari) {    obj.setAttribute("style","text-decoration:underline"); } } function SCPersistantSave(key,value) { /*  if(SCbIsIE) SCUserDataSave(key,value); else if(typeof globalStorage != "undefined") SCGlobalStorageSave(key,value); else */ SCsetcookieVal(key,value); } function SCPersistantLoad(key) {  /*   if(SCbIsIE) return SCUserDataLoad(key); else if(typeof globalStorage != "undefined") return SCGlobalStorageLoad(key); else */ return SCgetcookieVal(key); } function SCUserDataSave(key,value) { SCPersistElement.setAttribute(key,value); SCPersistElement.save("oXMLStore"); } function SCUserDataLoad(key) { SCPersistElement.load("oXMLStore"); var retc = SCPersistElement.getAttribute(key); if(retc == null) retc = ""; return retc; } function SCGlobalStorageSave(key,value) { if(globalStorage) {   eval ("globalStorage['www.securecottage.com']." +          key + "='" + value + "'"); } } function SCGlobalStorageLoad(key) { var retc = ""; if(globalStorage) {    retc =     eval ("globalStorage['wikifur.com']." +          key ); if (retc == null) return ""; return retc.value; } return ""; } function SCsetcookieVal(cookieKey,cookieValue) {  var ExpireDate = new Date; ExpireDate.setYear(ExpireDate.getYear + 1910); document.cookie = cookieKey + '=' + cookieValue + "; path=/; " // + "domain=" + document.domain + "; " + "expires=" + ExpireDate.toGMTString; } function SCgetcookieVal(cookieName) { var aCookie = ""; var thisCookie; aCookie = document.cookie; thisCookie = aCookie.split("; "); var i; var retCookie = ""; for(i=0;i<thisCookie.length;i++) {    if(cookieName == thisCookie[i].split("=")[0].substring(0,cookieName.length)) {          retCookie = thisCookie[i].split("=")[1]; break; } }  return retCookie; } function SCwikichange(obj) { var parobj = document.getElementById(SCcurrentLink); if(parobj && SCWikihtml != "") {    SCalttranslateFrom = SCtranslateFrom; SCalttranslateTo = SCtranslateTo; SCtranslateFrom = "Wikipedia"; SCDicthtml = parobj.innerHTML; if(SCbIsIE||SCbIsSafari) SCreplaceHtml(parobj,SCWikihtml); else parobj.innerHTML = SCWikihtml; SCsetLanguageDefault("wikipedialanguageoptions",                      "Wikipedialanguage") if(SCbIsSafari) parobj.setAttribute("onMousedown",""); // SChidewradd; } } function SCdictionarychange(obj) { var parobj = document.getElementById(SCcurrentLink); if(parobj && SCDicthtml != "") {    SCtranslateFrom = SCalttranslateFrom; SCtranslateTo = SCalttranslateTo; SCtranslateFrom = SCPersistantLoad('languageFrom'); SCtranslateTo = SCPersistantLoad('languageTo'); if(SCtranslateFrom == "") SCtranslateFrom = SCLanguageDefaultFrom; if(SCtranslateTo == "") SCtranslateTo = SCLanguageDefaultTo; SCWikihtml = parobj.innerHTML; if(SCbIsIE||SCbIsSafari) SCreplaceHtml(parobj,SCDicthtml); else parobj.innerHTML = SCDicthtml; if(parobj && !SCbIsIE) {       parobj.setAttribute("onMousedown",'SChidespan("' + SCcurrentLink + '")'); }    if(!SCbInsertSpan) {      SCasyncGet(SCcurrentLink,SCDicthtml); SCbInsertSpan=true; } } } function SCWikipediaLink(wordindex,delimiter,words) { var i,j; var newhtml = '<span ' + ' onMouseover="javascript:SCdonthide=true;"' + ' onMouseout="javascript:SCdonthide=false;">' + '' + 'WikiFur</a>'; newhtml += ' ' + 'Dictionary?</a>'; newhtml += ' WikiFur language ' + '<SELECT name="Wikipedialanguageoptions" id="wikipedialanguageoptions"' + 'onchange="SCwikipedialanguageChange(this)">' + ' onMouseover="javascript:SCdonthide=true;"' + '>' + SCnewoptions + ' '; var numwords=4; if((SCtranslateFrom.match("zh","i") || SCtranslateFrom == "ja" )      ||     (SCtranslateFrom == "Wikipedia" && (SCalttranslateFrom.match("zh","i") ||      SCalttranslateFrom == "ja"        ))     ) numwords = 10; var wordindexend = wordindex + numwords; if(wordindexend > words.length-1) wordindexend = words.length-1; for(i=wordindex;i<=wordindexend;i++) {    var linktext = ""; for(j=wordindex;j<=i;j++) {       var theword=""; if(words[j].match(/^(.*)\'s$/)) theword = RegExp.$1; else theword = words[j]; theword = theword.replace(/\'/g,"\u0026#39;"); theword = theword.replace(/\"/g,"\u0026quot;");       linktext += theword;        if(j<i)          linktext += delimiter;     }     newhtml += ' ' + linktext + '</a>';  }  newhtml +='  Close Window </a> ';  var newspan = document.createElement("SPAN");  newspan.innerHTML = newhtml;  return newspan; } //http://www.howtocreate.co.uk/tutorials/javascript/browserwindow function SCScreenSize {  if( typeof( window.innerWidth ) == 'number' ) {    //Non-IE    SCscreenWidth = window.innerWidth;    SCscreenHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' SCscreenWidth = document.documentElement.clientWidth; SCscreenHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible SCscreenWidth = document.body.clientWidth; SCscreenHeight = document.body.clientHeight; } } //http://www.howtocreate.co.uk/tutorials/javascript/browserwindow function SCgetScrollXY { if( typeof( window.pageYOffset ) == 'number' ) { //Netscape compliant SCscrOfY = window.pageYOffset; SCscrOfX = window.pageXOffset; } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) { //DOM compliant SCscrOfY = document.body.scrollTop; SCscrOfX = document.body.scrollLeft; } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) { //IE6 standards compliant mode SCscrOfY = document.documentElement.scrollTop; SCscrOfX = document.documentElement.scrollLeft; } } // is the current cursor position inside // a selected area. The selected area must be // within one node and be on the same line // only works for IE function SCNotTooBigAndInSelection(theparent,thechild) { if(!SCbIsIE) return ""; var retWordList = SCIsInSelection(theparent,thechild); if(retWordList == "" || retWordList == null) return ""; var retWordArray = retWordList.split(/[\r\n\s]+/); return retWordList; } // only works for IE function SCIsInSelection(theparent,thechild) { var returnSelectedText=""; var debug = false; var userSelection; if(SCbIsIE) // IE { var debug=false; if(SCSelectionType.match(/none/i)||SCSelectionType == ""||SCSelectionType == null) return ""; if(SCSelectionType.match(/text/i)) {   var range = SCIeRange; var s = range.text; var collection = range.getClientRects; var i;   for(i=0;i<collection.length;i++) {      var leftt = collection[i].left + document.body.scrollLeft+ document.documentElement.scrollLeft; var rightt = collection[i].right + document.body.scrollLeft+ document.documentElement.scrollLeft; var topp = collection[i].top + document.body.scrollTop+ document.documentElement.scrollTop; var bottomm = collection[i].bottom + document.body.scrollTop+ document.documentElement.scrollTop; if(SCposx >= leftt   && SCposx <= rightt    && SCposy >= topp    && SCposy <= bottomm    ) return s; if(debug) alert(collection[i].left+"-"+collection[i].right+"_"+            collection[i].top +"_"+collection[i].bottom+"__"+        leftt+":"       + ":" + rightt + ":" +       ":"+document.body.scrollLeft +":"+           document.documentElement.scrollLeft +       ":"+topp+":"        +bottomm+":"+":"         +document.body.scrollTop+":" +        document.documentElement.scrollTop +":"       +SCposx+":"+SCposy); }   return ""; } } } function SCgetRangeObject(selectionObject) {	 // Safari! var range = document.createRange; range.setStart(selectionObject.anchorNode,selectionObject.anchorOffset); range.setEnd(selectionObject.focusNode,selectionObject.focusOffset); return range; } function SCAreWordsInSelection(userSelection,SCselectionarray,child,childindex) { var range = SCgetRangeObject(userSelection); var str = child.nodeValue; if(str == "" || str == null) return; var delimiter = /^[\r\n ]+/ var delimiter1 = /^\S+/; var bNoSpace = false; if(SCtranslateFrom.match("zh","i") ||    SCtranslateFrom == "ja") {   bNoSpace = true; } SCselectionstart[childindex] = -1; SCselectionend[childindex] = -1; var range1 = document.createRange; var i,j,k; for(i=0,j=0;i<str.length;i++) {   if(SCisPointInRange(range,range1,child,i)) {      if(SCselectionstart[childindex] == -1) SCselectionstart[childindex] = i;      SCselectionend[childindex] = i;    } if(str.substring(i).match(delimiter)) continue; else {      if(SCisPointInRange(range,range1,child,i)) {       SCselectionarray[j] = true; }     else SCselectionarray[j] = false; j++; }   k=i; for(k=i;!bNoSpace && k<str.length;k++) {     if(SCisPointInRange(range,range1,child,k)) SCselectionend[childindex] = k;     if(!str.substring(k).match(delimiter1)) break; }   i=k; } } function SCOldAreWordsInSelection(userSelection,SCselectionarray,child,childindex) { var range = SCgetRangeObject(userSelection); var str = child.nodeValue; if(str == "" || str == null) return; var delimiter = /^[\r\n ]+/ var delimiter1 = /^\S+/; var bNoSpace = false; if(SCtranslateFrom.match("zh","i") ||    SCtranslateFrom == "ja") {   bNoSpace = true; } SCselectionstart[childindex] = -1; SCselectionend[childindex] = -1; var range1 = document.createRange; var i,j,k; for(i=0,j=0;i<str.length;i++) {   if(range.isPointInRange(child,i)) {      if(SCselectionstart[childindex] == -1) SCselectionstart[childindex] = i;      SCselectionend[childindex] = i;    } if(str.substring(i).match(delimiter)) continue; else {      if(range.isPointInRange(child,i)) {       SCselectionarray[j] = true; }     else SCselectionarray[j] = false; j++; }   k=i; for(k=i;!bNoSpace && k<str.length-1;k++) {     if(!str.substring(k+1).match(delimiter1)) break; }   i=k; if(range.isPointInRange(child,i)) SCselectionend[childindex] = i; } } function SCisPointInRange(range,range1,child,i) {   if(SCbIsMozilla) return range.isPointInRange(child,i); range1.setStart(child,i); range1.setEnd(child,i); if(range.compareBoundaryPoints(Range.START_TO_START,range1) <= 0 &&      range.compareBoundaryPoints(Range.END_TO_END,range1) >= 0) return true; else return false; } function SCgoogleLookup(text,label) {     SClabel = label; SCtext = text; SCgoogletranslate = "http://translate.google.com/translate?hl=en" + "&tl=" + SCtranslateTo +"&u=" + encodeURIComponent(document.location.href); google.language.translate(text, "", SCtranslateTo,            function(result) {              if (result.translation||result.error)        {        var nbspstr = "";       var i;       var SClanguagestrlength = SCGetGoogleLanguage(SCtranslateTo).length + 10;       if(SClanguagestrlength < SCSourcestrlength)          SClanguagestrlength = SCSourcestrlength+10;       if(result.translation)       {       for(i=result.translation.length;i<SClanguagestrlength;i++)       {              nbspstr+=" ";       }       }       var pretranslatedword = "";       if(SClinkword.split(/\s/).length == 1)           pretranslatedword = SClinkword + ": ";       var insertstring = SClabel + '|' + SCtext + '|' +      SClanguageprompt1 +  '→ ' +   SCGetGoogleLanguage(SCtranslateTo) + 	    SClanguageprompt2 +   SCgooglereference2 +      SClabel + SCgooglereference3 +       ' ' +      ((result.translation)? (pretranslatedword + result.translation) :result.error.message) + nbspstr +' ' +     '  ' +      SCgooglereference1 +       SCgoogletranslate +      SCgooglereference1a      + ' '      ;             SCInsertTranslation(insertstring);        }          }); } SCScreenSize; function SCGetGoogleLanguage(lcode) { var l;  for (l in google.language.Languages) {    if(lcode == google.language.Languages[l]) return (l.substring(0,1).toUpperCase + l.substring(1).toLowerCase); } return "undefined"; } SCScreenSize; $(document).ready(   function  {        SCcreateEvents;    } ); $(document).ready(   function  {        var bPops = SCPersistantLoad('GoogleTrans');        var title = SCstrGoogleTrans;        if(bPops == "1" || bPops == "")        {           SCGoogleTrans = true;           title += SCstrOn;           if(bPops == "")              SCPersistantSave('GoogleTrans','1');        }        else        {           SCGoogleTrans = false;           title += SCstrOff;        }    //    SCMakeGoogleLanguages;        addPortletLink('p-cactions',"javascript:SCSettings", title, "ca-TransPopsId", SCstrChangeOptions, "");    } );