/************ Navigation and layout *******************/
function babFlashHide() {
 for (var i=0; i<document.getElementsByTagName("embed").length; i++) {
  document.getElementsByTagName("embed")[i].style.visibility="hidden";
 }
 for (var i=0; i<document.getElementsByTagName("object").length; i++) {
  document.getElementsByTagName("object")[i].style.visibility="hidden";
 }
 for (var i=0; i<document.getElementsByTagName("iframe").length; i++) {
  document.getElementsByTagName("iframe")[i].style.visibility="hidden";
 }
}

function babFlashShow(id) {
 for (var i=0; i<document.getElementsByTagName("embed").length; i++) {
  document.getElementsByTagName("embed")[i].style.visibility="visible";
 }
 for (var i=0; i<document.getElementsByTagName("object").length; i++) {
  document.getElementsByTagName("object")[i].style.visibility="visible";
 }
 for (var i=0; i<document.getElementsByTagName("iframe").length; i++) {
  document.getElementsByTagName("iframe")[i].style.visibility="visible";
 }
}

function babPrepModal (id) {
 if ($(id)!=null) $(id).remove();
 $('babBody').insert({bottom:"<div id='"+id+"' style='position:absolute;z-index:1000;top:0px;left:0px;'></div>"});
}

function babDDLangShow() {
 babPrepModal('placeModal');
 var url = "/tools/getDDLang.php";
 new Ajax.Updater( 'placeModal', url, {
  evalScripts: true,
  onSuccess: function(transport) { babFlashHide(); },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}
function babDDLangHide() {
 babFlashShow();
 $('placeModal').innerHTML='';
 $('babBody').stopObserving('click');
}
function babNavMoreShow() {
 babFlashHide();
 $('babDDNavMore').setStyle({ left: ($("babNavMore").viewportOffset().left-7)+"px" });
 $('babDDNavMore').removeClassName("babDDNavMore");
 $('babBody').observe('click', babNavMoreHide);
 //babDDNavMoreHide();
}
function babNavMoreHide() {
 babFlashShow();
 $('babDDNavMore').addClassName("babDDNavMore");
 $('babBody').stopObserving('click');
}

function babSelSearch(selSearch) {
 var url="/tools/chgDD.php";
 new Ajax.Updater('placeModal', url, {
  method:'post',
  parameters:{s:selSearch,d:babDictShort},
  evalScripts:true,
  onFailure:function(transport) { alert(emLostConnection);}
 });
}

/************ Modal dialogs *******************/
function getRegister() { babGetRegister() }
function babGetRegister() {
 if ($('babPM')==null) {
  // insert div placeModal into body
 }
 var url = "/tools/getRegister.php";
 new Ajax.Updater( 'babPM', url, {
  method: 'post',
  parameters: { },
  evalScripts: true,
  onFailure: function(transport) {
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
}
function showRegister() {
 babHideSelects();
 window.scrollTo(0,0);
 updateCaptcha('imgRegCaptcha');
 $('babMBgd').show();
 $('modalRegister').show();
}
function doRegister() {
 var url = '/tools/register.php';
 var regType=0,regTypeId=0;
 try {
  regType=gRegType;
 } catch(e) {
  regType=0;
 }
 try {
  regTypeId=gRegTypeId;
 } catch(e) {
  regTypeId=0;
 }
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   nickname: $('regNickname').value,
   email: $('regEmail').value,
   email2: $('regEmail2').value,
   passLength: $('regPassword').value.length,
   password: hex_sha1($('regPassword').value),
   password2: hex_sha1($('regPassword2').value),
   agbcheck: ($('regTosCheck').checked ? "1" : "0"),
   newsletter: ($('regNewsletter').checked ? "1" : "0"),
   captcha: $('regCaptcha').value,
   regType: regType,
   regTypeId: regTypeId
  },
  onSuccess: function(transport) {
  },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}
function closeRegister() {
 babShowSelects();
 if ($('modalRegister')!=null) $('modalRegister').hide();
 if ($('babMBgd')!=null) $('babMBgd').hide()
}
function testNickname() {
 url = "/tools/testNickname.php";
 new Ajax.Request( url, {
  method: 'post',
  parameters: { nickname: $('regNickname').value },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}

function getLogin() { babGetLogin() }
function babGetLogin() {
 if ($('placeModal')==null) {
 // insert div placeModal into body
 }
 var url = "/tools/getLogin.php";
 new Ajax.Updater( 'placeModal', url, {
  method: 'post',
  evalScripts: true,
  onFailure: function(transport) {
   alert(emLostConnection);
  }
 });
}
function showLogin() {
 babHideSelects();
 window.scrollTo(0,0);
 $('babMBgd').show();
 $('modalLogin').show();
 $('mLoginNickname').focus();
}
function doLogin() {
 if ($('mLoginNickname').value=="") alert(emNickname);
 else if ($('mLoginPass').value=="") alert(emPassword);
 else {
  $('mLoginPassHash').value=hex_sha1(hex_sha1($('mLoginPass').value + hashHelp));
  $('mLoginPassHash').value=hex_sha1($('mLoginPass').value);
  $('mLoginPass').value="";
  var url = '/tools/setlogin.php';
  new Ajax.Request(url, {
   method: 'post',
   parameters: {
    nickname: $('mLoginNickname').value,
    passhash: $('mLoginPassHash').value
   },
   onSuccess: function(transport) {},
   onFailure: function(transport) {
    alert(emLostConnection);
   }
  });
 }
}
function closeLogin() {
 babShowSelects();
 if ($('modalLogin')!=null) $('modalLogin').hide();
 if ($('babMBgd')!=null) $('babMBgd').hide();
}
function babDoLogout() {
 var url = '/tools/setlogout.php';
 new Ajax.Request(url, {
  method: 'post',
  onSuccess: function(transport) {},
  onFailure: function(transport) {
   alert(emLostConnection);
  }
 });
}

function getSuggestion() {
 var url = "/tools/getSuggestion.php";
 new Ajax.Updater( 'placeModal', url, {
  method: 'post',
  parameters: {language: babDictShort},
  evalScripts: true,
  onFailure: function(transport) { alert(emLostConnection); }
 });
}



/************ Suggestion drop down ********************/
babAddEvent(window, "load", babInitSuggest);
function babSuggest(input) {
 var self = this;
 var req = null;
 var tableElement = null;
 var all = new Array();
 var selectedSuggestion = -1;
 var requestedSuggestion = false;
 var lastRequest = new Date();
 var maxCount = 10;

// listener functions
 var eventHandler = function(event) { window.suggest.handle(event); }
 var hideSuggestions = function(event) { window.suggest.hide(); }
 var suppressReturn = function(event) { var realEvent=(window.event)?window.event:event;if (realEvent.keyCode==13) return false; }
// initialize the suggestion layer
 init();

 function init() { initializeListeners(); }

 function initializeListeners() {
  input.setAttribute("autocomplete", "off", 0);
  babAddEvent(input, "keyup", eventHandler);
  babAddEvent(input, "keypress", suppressReturn);
  babAddEvent(document.getElementsByTagName("body")[0], "click", hideSuggestions);
 }
 function removeListeners() {
  input.removeAttribute("autocomplete");
  babRemoveEvent(input, "keyup", eventHandler);
  babRemoveEvent(input, "keypress", suppressReturn);
  babRemoveEvent(document.getElementsByTagName("body")[0], "click", hideSuggestions);
 }

 function getSuggestions(word) {
  var dateHelper=new Date();
  if (word.length<4) {
   if ($('babDDBox')) $('babDDBox').style.visibility="hidden";
   return;
  }
  if (!requestedSuggestion && (dateHelper-lastRequest>100)) {
   requestedSuggestion=true;
   lastRequest=new Date();
   new Ajax.Updater('babDDBox', '/tools/wordresults.php', {
	method: 'post',
	parameters: { q: $('babQ').value, dict: babDictShort },
	onSuccess: function(transport) {
	 var pos = $('babQ').viewportOffset();
	 $('babDDBox').style.top = pos.top+$('babQ').offsetHeight;
	 $('babDDBox').style.left = pos.left;
	 $('babDDBox').style.visibility="visible";
	 requestedSuggestion=false;
	},
	onFailure: function(transport) {
	 $('babDDBox').style.visibility="hidden";
	 requestedSuggestion=false;
	},
	onCompletion: function(transport) {
	 requestedSuggestion=false;
	}
   });
  }
 }

 function getEvent(event) { return (window.event) ? window.event : event; } // used
 function getEventTarget(event) { var realEvent=getEvent(event); return (realEvent.target) ? realEvent.target : realEvent.srcElement; }

 function handleEvent(event) {
  var realEvent = getEvent(event);
  if (realEvent.keyCode) {
   if (realEvent.keyCode == 38 || realEvent.keyCode == 40 || realEvent.keyCode == 13) {
    switch (realEvent.keyCode) {
     case 38: // UP
      if (selectedSuggestion>0) {
       $('babSuggestion').firstChild.childNodes[selectedSuggestion].style.backgroundColor='#fff';
       selectedSuggestion--;
       $('babSuggestion').firstChild.childNodes[selectedSuggestion].style.backgroundColor='#ebf4fc';
       babDictQ.value=$('babSuggestion').firstChild.childNodes[selectedSuggestion].firstChild.firstChild.innerHTML;
      }
      return;
     case 40: // DOWN
      if ($('babSuggestion') && selectedSuggestion<$('babSuggestion').firstChild.childNodes.length-1) {
       if (selectedSuggestion>=0)  $('babSuggestion').firstChild.childNodes[selectedSuggestion].style.backgroundColor='#fff';
       selectedSuggestion++;
       $('babSuggestion').firstChild.childNodes[selectedSuggestion].style.backgroundColor='#ebf4fc';
       babDictQ=$('babSuggestion').firstChild.childNodes[selectedSuggestion].firstChild.firstChild.innerHTML;
      }
      return;
     case 13: // ENTER
      if (selectedSuggestion>=0) babSearch(babDictQ);
      else babSearch($('babQ').value);
      return;
    }
   }
  }
  getSuggestions(getEventTarget(realEvent).value);
 }

 function hideLayer() { if ($('babDDBox'))$('babDDBox').innerHTML=""; }

 self.handle = handleEvent;
 self.hide = hideLayer;
}

var suggestIsInitialized = false;

// Init
function babInitSuggest() { // used
 if (!suggestIsInitialized) {
  var inputBox = document.getElementsByName("babQ")[0];
  if ((inputBox)) window.suggest = new babSuggest(inputBox);
  suggestIsInitialized = true;
 }
}
// Tools
function babAddEvent(elm, evType, fn, useCapture) { // used
 if (elm.addEventListener){
  elm.addEventListener(evType, fn, useCapture);
  return true;
 } else if (elm.attachEvent){
  var r = elm.attachEvent("on"+evType, fn);
  return r;
 }
}
function babRemoveEvent(elm, evType, fn, useCapture) { // used
 if (elm.removeEventListener) {
  elm.removeEventListener(evType, fn, useCapture);
  return true;
 } else if (elm.detachEvent){
  var r = elm.detachEvent("on"+evType, fn);
  return r;
 }
}



/************ Dropdown shows ********************/

function babDDChange(s) {
 var url="/tools/chgDD.php";
 new Ajax.Updater('placeModal', url, {
  method:'post',
  parameters:{s:s},
  evalScripts:true,
  onFailure:function(transport) { alert(emLostConnection);}
 });
}

/************ Dictionary functions ********************/
function babSearch(term) {
 try { if (babSearchType=='d') ; } catch (e) {babSearchType='d';}
 switch (babSearchType) {
  case 'd':babDictSearch(term);break;
  case 'g':case 'i': case 'w':window.open(babSearchBaseUrl+encodeURI(term), "_blank");break;
 }
}

function babDictSearch(term) {
 if (term.length>0) {
  var url = babDictUrl+babDictName+encodeURI(term)+".html";
  location.href=url;
 }
}

function babDDDictShow() {
 var url="";
 try { if (babSearchType=='d') ; } catch (e) {babSearchType='d';}
 switch (babSearchType) {
  case 'g':case 'i': case 'w': url="/tools/getDDOtherSearches.php";break;
  case 'd':default: url="/tools/getDDDict.php";break;
 }
 new Ajax.Updater('placeModal', url, {
  evalScripts: true,
  parameters:{s:babSearchType},
  onSuccess:function(transport) { babFlashHide(); },
  onFailure:function(transport) { alert(emLostConnection);}
 });
}
function babDDDictMore(shortLang) {
 if (babDictMoreLast.length>0) $("babMDDDict"+babDictMoreLast).removeClassName("babBgb4cde1");
 babDictMoreLast = shortLang;
 $("babMDDDict"+shortLang).addClassName("babBgb4cde1");
 moreHTML = "";
 for (var lang in babADicts[shortLang]) {
  moreHTML += "<div onclick='babDDDictSlct(\"" +shortLang+ "\",\"" +lang+ "\");' onmouseover='babChgText(this,\"o_u\")' onmouseout='babChgText(this,\"b_nu\")'>" +babALang[shortLang]+"&lt;&gt;"+babALang[lang]+ "</div>";
 }
 $("babMDDDictMore").update(moreHTML);
 $("babMDDDictMore").setStyle({top:$("babMDDDict" +shortLang).viewportOffset().top-0+"px",left:$("babMDDDict" +shortLang).viewportOffset().left+$("babMDDDict" +shortLang).getWidth()+1+"px"});
 $("babMDDDictMore").show();
}
function babDDOSMore(shortLang) {
 if (babDictMoreLast.length>0) $("babMDDDict"+babDictMoreLast).removeClassName("babBgb4cde1");
 babDictMoreLast = shortLang;
 $("babMDDDict"+shortLang).addClassName("babBgb4cde1");
}
function babDDDictSlct(l1, l2) {
 babDictName=babADir[l1]+"-"+babADir[l2]+"/";
 babDictShort=l1+l2;
 $("babDDictL").innerHTML=babALang[l1]+"&lt;&gt;"+babALang[l2];
 babDDDictHide();
}
function babDDOSSlct(l) {
 switch (babSearchType) {
  case 'g':
   $("babDDictL").innerHTML=babAOS[l]+babAOSAdd;
   babSearchBaseUrl="http://www."+babAOS[l]+"/cse?cx=partner-pub-6559961775616345:fdd8bzkbt38&ie=UTF-8&sa=Search&q=";
   break;
  case 'i':
   $("babDDictL").innerHTML=babAOS[l]+babAOSAdd;
   babSearchBaseUrl="http://images."+babAOS[l]+"/images?q=";
   break;
  case 'w':
   $("babDDictL").innerHTML=babAON[l];
   babSearchBaseUrl="http://"+babAOS[l]+"/wiki/";
   break;
 }
}
function babDDDictHide() {
 babFlashShow();
 $('placeModal').innerHTML='';
 $('babBody').stopObserving('click');
}

function babSpeak(id, lang)
// load swf-player
{
url="/sounds/speak.php?id=" +id+ "%26lang=" +lang;
speak_html="<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' width='10' height='10'><param name='movie' value='" +url+ "'><param name='quality' value='high'><param name='loop' value='false'><param name='bgcolor' value='#000000'><param name='menu' value='false'><embed src='" +url+ "' loop='false' width='1' height='1' quality='high' bgcolor='#00000f' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' menu='false'></embed></object>";
speak_html="<object type='application/x-shockwave-flash' data='/emff.swf' width='1' height='1'><param name='bgcolor' value='#ffffff'><param name='movie' value='/emff.swf'><param name='FlashVars' value='src=" +url+ "&amp;autoload=yes&amp;autostart=yes'></object>";
$('placeModal').show();
$('placeModal').innerHTML = speak_html;
pageTracker._trackPageview("/" +gSiteLang+url);
//speakTracker._trackEvent(lang, id);
}

function babChgAd(aId) {
var OA_zones = {'babAdTop':10,'babAdSky':11};
//document.write(unescape("%3Cscript% type='text/javascript' src='http://berlin.bab.la/www/delivery/spcjs.php?id=2'></script>
//babAdPlacing("<?= $key ?>");
//babAdPlacing("<?= $key ?>");
}

function babVT(voteValue, searchTerm, voteTransId, dictLang, siteLang) {
 if ((voteValue==1)||(voteValue==-1)) {
  var urlVote = '/tools/rankVote.php';
  var URL = '/actions/' +siteLang+ '/' +dictLang+ '/rankvote/' + voteTransId;
  new Ajax.Request(urlVote, {
   method: 'post',
   //pass search term, transid, vote, inlang
   parameters: {
    language: dictLang,
    term: searchTerm,
    voteTransId: voteTransId,
    vote: voteValue
   },
   onSuccess: function(transport) {
   },
   onFailure: function(transport) {alert(emLostConnection);}
  });
  pageTracker._trackPageview(URL);
 }
}

function babChPic2(elem, pic) {
 var srcVotedYes = "/img/voted-yes.png";
 var srcVotedNo = "/img/voted-no.png";
 var srcVoteYes = "/img/vote-yes.gif";
 var srcVoteNo = "/img/vote-no.gif";
 if (pic == 'VotedYes')
  return elem.src = srcVotedYes;
 else if (pic == 'VotedNo')
  return elem.src = srcVotedNo;
 else if (pic == 'VoteYes')
  return elem.src = srcVoteYes;
 else if (pic == 'VoteNo')
  return elem.src = srcVoteNo;
}

function babChPic(elemId, pic) {
 var srcGreen = "/img/arrowGreen.png";
 var srcRed = "/img/arrowRed.png";
 var srcUp = "/img/arrowUp.gif";
 var srcDown = "/img/arrowDown.gif";
 if (pic == 'Up')
 return document.getElementById(elemId).src = srcUp;
 else if (pic == 'Down')
  return document.getElementById(elemId).src = srcDown;
 else if (pic == 'Green')
  return document.getElementById(elemId).src = srcGreen;
 else if (pic == 'Red')
  return document.getElementById(elemId).src = srcRed;
}

function babReportShow(id) {
$('rpSent_'+id).show();
}
function babReportHide(id){
$('rpSent_'+id).hide();
}
function babReportSent(sentRpId, sentRpLang, siteLang, dictLang ) {
 var urlTrack = '/actions/' +siteLang+ '/' +dictLang+ '/reportsent/' +sentRpLang+ '/' +sentRpId;
 var url = '/tools/reportSentence.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   sentId: $('sentId_'+sentRpId).value,
   sentLang: $('sentLang_'+sentRpId).value,
   rpReason: $('reason_'+sentRpId).value,
   rpMessage: $('message_'+sentRpId).value,
   rpName: $('name_'+sentRpId).value,
   rpEmail: $('email_'+sentRpId).value
  },
  onSuccess: function(transport) {
  },
  onFailure: function(transport) {alert(emLostConnection);}
 });
 pageTracker._trackPageview(urlTrack);
}
function babVS(voteValue, sentVoteId, sentVotelang, siteLang, dictLang) {
 if (voteValue== 1) {
  var urlTrack = '/actions/' +siteLang+ '/' +dictLang+ '/sentvote/' +sentVotelang+ '/' +sentVoteId;
  var url = '/tools/voteSentence.php';
  new Ajax.Request(url, {
   method: 'post',
   parameters: {
    sentLang: sentVotelang,
    sentId: sentVoteId,
    sentVote: voteValue
   },
   onSuccess: function(transport) {
   },
   onFailure: function(transport) {alert(emLostConnection);}
  });
  pageTracker._trackPageview(urlTrack);
 }
}

function babFilterAdd(id) {
 url=location.href;
 if (url.indexOf("?")>0) url+="&filter[]="+id;
 else url="?filter[]="+id;
 babET(2);
 location.href=url;
}
function babFilterRemove(id) {
 u=location.href.toString();
 reg=eval('/filter\\[\\]\=' +id+ '\&\*/');
 u=u.replace(reg, "");
 lc=u.charAt(u.length-1);
 if ("?"==lc || "&"==lc) u=u.substr(0,u.length-1);
 babET(2);
 location.href=u.replace(reg, "");
}
function toggleFilterView(filterId) {
 filterId=filterId.substr(0,1).toUpperCase()+filterId.substr(1);
 if ($("babFilter"+filterId).style.display=="none") {
  $("babFilter"+filterId).show();
  $("babFilterArrow"+filterId).removeClassName("arrowRight");
  $("babFilterArrow"+filterId).addClassName("arrow");
  $("babFilterArrow"+filterId).removeClassName("babArrowRight");
  $("babFilterArrow"+filterId).addClassName("babArrowDown");
 } else {
  $("babFilter"+filterId).hide();
  $("babFilterArrow"+filterId).removeClassName("babArrowDown");
  $("babFilterArrow"+filterId).addClassName("babArrowRight");
 }
 babET(2);
}
function babFilterShowMore(filterId) {
 filterId=filterId.substr(0,1).toUpperCase()+filterId.substr(1);
 if ($("babFilterMore"+filterId)!=null) $("babFilterMore"+filterId).show();
 if ($("babFilterML"+filterId)!=null) $("babFilterML"+filterId).hide();
 babET(2);
}

function babLastSearches(act) {
 u=location.href.toString();
 u=u.replace(/last=activate&*/, "");
 u=u.replace(/last=deactivate&*/, "");
 lc=u.charAt(u.length-1);
 if ("?"==lc || "&"==lc) u=u.substr(0,u.length-1);
 
 if (u.indexOf("?")>0) u+="&";
 else u+="?";
 switch (act) {
  case 'start':u+="last=activate";location.href=u;
   break;
  case 'stop':u+="last=deactivate";location.href=u;
   break;
 }
}

/************ Searches ************/
function babWebSearch(q, d, td) {
 if ($(td)!=null) {
  var u="/tools/getWeb.php";
  new Ajax.Updater(td, u, {
   method:'post',
   evalScripts: true,
   parameters: {q:q,d:d},
   onSuccess: function(transport) {},
   onFailure: function(transport) {alert(emLostConnection);}
  });
 }
}

/************ Tools ********************/
function updateCaptcha(nameCaptcha) {
 var time=new Date();
 $(nameCaptcha).src="/img/captcha/captcha.php?time="+time.getTime();
}

function ol(inText) {
 return overlib("&nbsp;" +inText, MOUSEOFF, WIDTH, 150, FGCOLOR, "#FFFF90", BGCOLOR, "#EBEBA9", TEXTSIZE, 2, DELAY, 250);
}
function babOl(inText) {
 return overlib("&nbsp;" +inText, MOUSEOFF, WIDTH, 150, FGCOLOR, "#FFFF90", BGCOLOR, "#EBEBA9", TEXTSIZE, 2, DELAY, 250);
}

function lengthValidation(elem, max) { babLenVal(elem, max); }
function babLenVal(elem, max) {
 if(elem.value.length > max)
  elem.value = elem.value.substring(0, max);
}

function changeBgColor(elem, value) {
 if(value==0) elem.style.backgroundColor = '#FFFFFF';
 else elem.style.backgroundColor = '#CCCCCC';
}

function doDelete() {
 var url = '/tools/setDelete.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {},
  onSuccess: function(transport) {},
  onFailure: function(transport) { alert(emLostConnection); }
 });
}

function instructions(address) {
 window.open(address, "babla_instructions", "width=400, height=400, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, toolbar=no");
}

function highlightText(bodyText, searchTerm, highlightStartTag, highlightEndTag) {
// the highlightStartTag and highlightEndTag parameters are optional
 if ((!highlightStartTag) || (!highlightEndTag)) {
  highlightStartTag = "<span style='color:blue; background-color:yellow;'>";
  highlightEndTag = "</span>";
 }
 // find all occurences of the search term in the given text,
 // and add some "highlight" tags to them (we're not using a
 // regular expression search, because we want to filter out
 // matches that occur within HTML tags and script blocks, so
 // we have to do a little extra validation)
 var newText = "";
 var i = -1;
 var lcSearchTerm = searchTerm.toLowerCase();
 var lcBodyText = bodyText.toLowerCase();
 while (bodyText.length > 0) {
  i = lcBodyText.indexOf(lcSearchTerm, i+1);
  if (i < 0) {
   newText += bodyText;
   bodyText = "";
  } else {
  // skip anything inside an HTML tag
   if (bodyText.lastIndexOf(">", i) >= bodyText.lastIndexOf("<", i)) {
   // skip anything inside a <script> block
    if (lcBodyText.lastIndexOf("/script>", i) >= lcBodyText.lastIndexOf("<script", i)) {
     newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag;
     bodyText = bodyText.substr(i + searchTerm.length);
     lcBodyText = bodyText.toLowerCase();
     i = -1;
    }
   }
  }
 }
 return newText;
}

function doSubscribe(nick,id) {
 var url = '/tools/subscribeTest.php?nickname=' + nick;
 if (typeof(id)!='undefined') {
  url += "&testId=" + id;
 }
 new Ajax.Updater('placeModal',url, {
  method: 'get',
  evalScripts: true,
  onSuccess: function(transport) {},
  onFailure: function(transport) {alert(emLostConnection);}
 });
}

function showModal(modal) {
 if (UserAgent.MSIE) {
  var selects=document.getElementsByTagName('select');
  for (i=0; i<selects.length; i++) {
   selects[i].style.visibility='hidden';
  }
 }
 window.scrollTo(0,0);
 $('modalBkgd').show();
 $('modal'+ modal).show();
}

function closeModal(modal) {
 if (UserAgent.MSIE) {
  var selects=document.getElementsByTagName('select');
  for (i=0; i<selects.length; i++) {
   selects[i].style.visibility        = '';
  }
 }
 if ($('modal' +modal)!=null) $('modal' + modal).hide();
 if ($('modalBkgd')!=null) $('modalBkgd').hide();
}

function awo(a) {var myw=window.open(a, "p", "");myw.focus();}


function hideSelects(selects) {babHideSelects(selects);}
function babHideSelects(selects) {
 babFlashHide();
 if (UserAgent.MSIE) {
  if (selects==null) selects=document.getElementsByTagName('select');
  var selects=document.getElementsByTagName('select');
  for (i=0;i<selects.length;i++) selects[i].style.visibility='hidden';
 }
}
function showSelects(selects) {babShowSelects(selects);}
function babShowSelects(selectNode) {
 babFlashShow();
 if (UserAgent.MSIE) {
  if (selectNode==null) selects=document.getElementsByTagName('select');
  else selects=selectNode.getElementsByTagName('select');
  for (i=0;i<selects.length;i++) selects[i].style.visibility='';
 }
}

function openWindow(uri, windowname, windowoptions) {
        window.open(uri, windowname, windowoptions);
}

var UserAgent={};
if (navigator.userAgent.indexOf('AppleWebKit') > -1) UserAgent.WEBKIT=true;
else if (navigator.userAgent.indexOf('Opera') > -1) {
 UserAgent.OPERA=true;
 UserAgent.VERSION=navigator.userAgent.match(/Opera.(\d)/)[1];
}
else if (navigator.userAgent.indexOf('KHTML') > -1) UserAgent.KHTML = true;
else if (navigator.userAgent.indexOf("Gecko") > -1) UserAgent.GECKO = true;
else if (navigator.userAgent.indexOf("MSIE") > -1) UserAgent.MSIE = true;

function babChgText(elem,col) {
 switch (col) {
  case "o_u":elem.style.color="#f39300";elem.style.textDecoration="underline";break;
  case "b_nu":elem.style.color="#333333",elem.style.textDecoration="none";break;
 }
}


/**** OLD STUFF - TO BE MOVED ***/

function showVerify(inTransId, inDictLang) {
 hideSelects();
 var url = "/tools/verifyWord.php";
 new Ajax.Updater( 'placeModal', url, {
  method: 'post',
  parameters: { language: inDictLang, transId: inTransId },
  evalScripts: true
 });
 window.scrollTo(0,0);
}
function stopVerify() {
 showSelects();
 $('modalBkgd').hide();
 $('modalVerify').hide();
}
function doVerify(inTransId, inDictLang){
 var url = "/tools/verifyVote.php";
 new Ajax.Request( url, {
  method: 'post',
  parameters: { language: inDictLang,
   transId: inTransId,
   vote: $('vote').value
  },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}
function doVerifyInline(inTransId, inDictLang) {
 var url = "/tools/verifyVoteInline.php";
 new Ajax.Request( url, {
  method: 'post',
  parameters: {
   language: inDictLang,
   transId: inTransId,
   vote: $('vote').value,
   comment: $('comment' +$('vote').value).value
  },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}

function showMail(inType, inId, inWidget) {
 var url = "/tools/tellAFriend.php";
 if (inWidget==1) var widget = 'true';
 else var widget = 'false';
 new Ajax.Updater( 'placeModal', url, {
  method: 'post',
  parameters: { type: inType, id: inId, step: 0, widget: widget },
  evalScripts: true,
  onFailure: function(transport) {alert(emLostConnection);}
 });
 window.scrollTo(0,0);
 if ($('yourscore')!=null) $('yourscore').hide();
 if ($('avgscore')!=null) $('avgscore').hide();
}
function doMail(){
 var url = "/tools/tellAFriend.php";
 new Ajax.Updater( 'modalMailUpdate', url, {
  method: 'post',
  parameters: { type: $('mailType').value,
   id: $('typeId').value,
   step: 1,
   fromEmail: $('fromEmail').value,
//   fromName: $('fromName').value,
   toEmail: $('toEmail').value,
//   toName: $('toName').value,
   textEmail: $('emailText').value
  },
  evalScripts: true,
  onFailure: function(transport) {alert(emLostConnection);}
  });
}
function closeMail() {
 showSelects();
 $('modalBkgd').hide();
 $('modalTellAFriend').hide();
 if ($('yourscore')!=null) $('yourscore').show();
 if ($('avgscore')!=null) $('avgscore').show();
}

function help() {
 window.open("/help.php", "babla_help", "width=400, height=400, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, toolbar=no");
}

function init_addsearch() {
 var methode=0;
 if (window.external) { // Firefox 2 oder Internet Explorer kennen dieses Objekt
  if (typeof document.body.style.maxHeight != "undefined") { // ansonsten könnte es auch ein IE < 7 sein
   methode=1;
  }
 } else {
  ua=navigator.userAgent.toLowerCase();
   if (ua.indexOf('firefox/1.') != -1) { // hier haben wir einen Firefox älterer Bauart
   methode=2;
  }
 }
 var el=document.getElementById('searchadd');
 if ((el != null) && methode != 0) {
  el.innerHTML='<a href="javascript:addsearch('+methode+')">Klicken Sie hier, um bab.la zu ihren Suchmaschinen im Browser hinzuzufügen</a>';
 }
}
function addsearch(methode) {
 if (methode==1) {
  window.external.AddSearchProvider('http://bab.la/toolbars/ie7ff2.xml');
 }
 if (methode==2) {
  if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function")) {
   window.sidebar.addSearchEngine(
    "http://bab.la/toolbars/ff1.src",  /* engine URL */
    "http://bab.la/toolbars/babla.gif",  /* icon URL */
    "bab.la de-en",                                         /* engine name */
    "Web" );                                               /* category name */
  }
 }
}
function addsearchprovider(lang, dict) {
 var methode=0;
 if (window.external) { // Firefox 2 oder Internet Explorer kennen dieses Objekt
  if (typeof document.body.style.maxHeight != "undefined") { // ansonsten könnte es auch ein IE < 7 sein
   methode=1;
  }
 } else {
  ua=navigator.userAgent.toLowerCase();
  if (ua.indexOf('firefox/1.') != -1) { // hier haben wir einen Firefox älterer Bauart
   methode=2;
  }
 }
 if (methode==1) {
  window.external.AddSearchProvider('http://' +lang+ '.bab.la/toolbars/os2.php?dict=' +dict);
 }
 if (methode==2) {
  if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function"))
  {
   window.sidebar.addSearchEngine(
     "http://bab.la/toolbars/ff1.src",  /* engine URL */
     "http://bab.la/toolbars/babla.gif",  /* icon URL */
     "bab.la de-en",                                         /* engine name */
     "Web" );                                               /* category name */
  }
 }
}

function requestWorldLangMap() {
 var url = '/tools/requestWorldMap.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   mapFirstName: $('wdMapFirstName').value,
   mapLastName: $('wdMapLastName').value,
   mapEmail: $('wdMapEmail').value,
   mapOrg: $('wdMapOrg').value,
   mapStreet: $('wdMapStreet').value,
   mapCity: $('wdMapCity').value,
   mapCountry: $('wdMapCountry').value,
   mapMessage: $('wdMapMessage').value
  },
  onSuccess: function(transport) {},
  onFailure: function(transport) {
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
}

function reportContent(type, id1, id2, infoText) {
 var url = '/tools/reportContent.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   type: type,
   id1: id1,
   id2: id2,
   infoText: infoText
  },
  onSuccess: function(transport) {},
  onFailure: function(transport) {}
 });
}

function babEdTInfoShow(wordpos, transid, dict, word) {
 babPrepModal('placeModal');
 var url = "/tools/getEdTransInfo.php";
 new Ajax.Updater( 'placeModal', url, {
  evalScripts: true,
  parameters: {
   wordPos: wordpos,
   transId: transid,
   term: word,
   dict: dict
  },
  onSuccess: function(transport) { babFlashHide();},
  onFailure: function(transport) {alert(emLostConnection);}
 });
 pageTracker._trackEvent("dictionary i-symbol", "click i-symbol", "click i-symbol");
}

function babEdTInfoHide() {
 babFlashShow();
 $('placeModal').innerHTML='';
 $('babBody').stopObserving('click');
}

function babEdTransShow(id, dict) {
 if (typeof(babEdit)!="undefined") {
	msgid=8;
	var url = '/tools/getBabErrorMsg.php';
  new Ajax.Request(url, {
   method: 'post',
   parameters: {
    msgId: msgid
   },
   onSuccess: function(transport) {},
   onFailure: function(transport) {}
  });
 }
 else {
 	babEdit=id;
 	var url = "/tools/editTranslation.php";
 	new Ajax.Updater('babPM', url, {
 		method: 'post',
 		parameters: {
 			transId: id,
 			dict: dict
 		},
 		evalScripts: true,
 		onSuccess: function(transport){
 			$('babPM').hide();
 		},
 		onFailure: function(transport){
 			alert(emLostConnection);
 		}
 	});
	pageTracker._trackPageview("/" +gSiteLang+ "/actions/dict/editword");
	pageTracker._trackEvent("dictionary i-symbol", "i-symbol menu", "edit this entry");
 }
}

function babVerifyEdTrans(inInputId, inDictLang) {
 var url = "/tools/verifyVoteEdTrans.php";
 new Ajax.Request( url, {
  method: 'post',
  parameters: {
   language: inDictLang, //this have to be the real inlang
   inputId: inInputId,
   vote: $('vote').value,
   comment: $('comment' +$('vote').value).value
  },
  onFailure: function(transport) {alert(emLostConnection);}
 });
}

function babAdjustHights(contsize) {
 $('babContL'+contsize).style.height="auto";
 $('babContC'+contsize).style.height="auto";
 $('babContR').style.height="auto";
 hl=$('babContLS').offsetHeight;
 hm=$('babContCS').offsetHeight;
 hr=$('babContR').offsetHeight;
 hmax=Math.max(Math.max(hl,hm),hr)+100;
 $('babContL'+contsize).style.height=hmax;
 $('babContC'+contsize).style.height=hmax;
 $('babContR').style.height=hmax;
}

/* EDIT FKT */
function babReloadNewWordCaptcha() {
 var time=new Date();
 $("newWordCaptchaImg").src="/img/captcha/captcha.php?time=" + time.getTime();
}
function babShowEdTransExp(isModal) {
 if (isModal == 1) {
  $('editExp').show();
 } else {
  $('babEdTExp').show();
 }
}
function babCancelEdTrans() {
 var url = '/tools/cancelEditTrans.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   transId: $('babTransId').value,
   language: $('babTransDic').value
  },
  onSuccess: function(transport){
  },
  onFailure: function(transport){
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
 pageTracker._trackEvent("dictionary i-symbol", "edit funciton", "click cancel");
}
function babSaveEdTrans(){
 var url = '/tools/saveEditTrans.php';
 var passHash = hex_sha1($('newWordPass').value);
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   transId: $('babTransId').value,
   language: $('babTransDic').value,
   newWord1: $('newWord1').value,
   newWord2: $('newWord2').value,
   context1: $('context1').value,
   context2: $('context2').value,
   categoryWord1: $('categoryWord1').value,
   regionWord1: $('regionWord1').value,
   regionWord2: $('regionWord2').value,
   grammarWord1: $('grammarWord1').value,
   grammarWord2: $('grammarWord2').value,
   grammar1Word1: $('grammar1Word1').value,
   grammar1Word2: $('grammar1Word2').value,
   styleWord1: $('styleWord1').value,
   styleWord2: $('styleWord2').value,
   wfmWord1: $('wfmWord1').value,
   wfmWord2: $('wfmWord2').value,
   comment: $('comment').value,
   captcha: $('newWordCaptcha').value,
   nickname: $('newWordNickname').value,
   passHash: passHash
  },
  onSuccess: function(transport){
  },
  onFailure: function(transport){
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
 pageTracker._trackEvent("dictionary i-symbol", "edit funciton", "click save");
}
function babEdTSuggStep1() {
// check input fields
 var top=0;
 if ( ($("newWord1").value.length>0) && ($("newWord2").value.length>0) ) {
 // Check for step 1 (ajax)
  $("editWord1").value = ($("newWord1").value);
  $("editWord2").value = ($("newWord2").value);
  $("showWord1").update($("newWord1").value);
  $("showWord2").update($("newWord2").value);
  $("categoryWord1").value=0;
  $("regionWord1").value=0;
  $("regionWord2").value=0;
  $("grammarWord1").value=0;
  $("grammarWord2").value=0;
  $("grammar1Word1").value=0;
  $("grammar1Word2").value=0;
  $("styleWord1").value=0;
  $("styleWord2").value=0;
  $("wfmWord1").value=0;
  $("wfmWord2").value=0;
 // get similar words
  new Ajax.Updater('similarWords', langDir+ 'tools/similarWords.php', {
   method: 'get',
   parameters: { l1: $("newWord1").value, l2: $("newWord2").value, language: babDictShort }
  } );
  // show step 1
  $('categoryWord2').style.visibility  = 'hidden';
  $("suggStep1").show();
  $("suggStep2").hide();
  $("suggStep3").hide();
 } else {
  alert(addNewWord);
 }
}
function babEdTSuggStep2() {
 babReloadNewWordCaptcha();
 $('newWordCaptcha').value="";
 var url = '/tools/saveEditTransAlt.php';
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   language: babDictShort,
   inputId: $('inputId').value,
   newWord1: $('newWord1').value,
   newWord2: $('newWord2').value,
   contextWord1: $('contextWord1').value,
   contextWord2: $('contextWord2').value,
   categoryWord1: $('categoryWord1').value,
   regionWord1: $('regionWord1').value,
   regionWord2: $('regionWord2').value,
   grammarWord1: $('grammarWord1').value,
   grammarWord2: $('grammarWord2').value,
   grammar1Word1: $('grammar1Word1').value,
   grammar1Word2: $('grammar1Word2').value,
   styleWord1: $('styleWord1').value,
   styleWord2: $('styleWord2').value,
   wfmWord1: $('wfmWord1').value,
   wfmWord2: $('wfmWord2').value,
   comment: $('comment').value
  },
  onSuccess: function(transport) {
  },
  onFailure: function(transport) {
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
}
function babEdTSuggStep3() {
 var url = '/tools/saveEditTransAlt.php';
 var passHash = hex_sha1($('newWordPass').value);
 new Ajax.Request(url, {
  method: 'post',
  parameters: {
   language: babDictShort,
   inputId: $('inputId').value,
   newWord1: $('newWord1').value,
   newWord2: $('newWord2').value,
   contextWord1: $('contextWord1').value,
   contextWord2: $('contextWord2').value,
   categoryWord1: $('categoryWord1').value,
   regionWord1: $('regionWord1').value,
   regionWord2: $('regionWord2').value,
   grammarWord1: $('grammarWord1').value,
   grammarWord2: $('grammarWord2').value,
   grammar1Word1: $('grammar1Word1').value,
   grammar1Word2: $('grammar1Word2').value,
   styleWord1: $('styleWord1').value,
   styleWord2: $('styleWord2').value,
   wfmWord1: $('wfmWord1').value,
   wfmWord2: $('wfmWord2').value,
   comment: $('comment').value,
   nickname: $('newWordNickname').value,
   passHash: passHash,
   captcha: $('newWordCaptcha').value
  },
  onSuccess: function(transport) {
  },
  onFailure: function(transport) {
   alert('Die Verbindung zum Server wurde unterbrochen. Bitte versuche es später nochmal.');
  }
 });
}
function babEdTSuggStop() {
 showSelects();
 if ($('modalBkgd')!=null) $('modalBkgd').hide();
 if ($('suggStep1')!=null) $('suggStep1').hide();
 if ($('suggStep2')!=null) $('suggStep2').hide();
 if ($('suggStep3')!=null) $('suggStep3').hide();
}
function babChangeDropDown(id, obj, sel) {
 if (obj != null) {
  $(id).options.length = 1;
  for (i = 1; i < obj.length; i++) {
   if (sel == obj[i]['value'])
    $(id).options[i] = new Option(obj[i]['name'], obj[i]['value'], true);
   else
    $(id).options[i] = new Option(obj[i]['name'], obj[i]['value']);
  }
 } else {
  $(id).options.length = 1;
 }
}

/*
 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
 * in FIPS PUB 180-1
 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for details.
 */
/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
/*
 * Perform a simple self-test to see if the VM is working
 */
function sha1_vm_test()
{
 return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
 * Calculate the SHA-1 of an array of big-endian words, and a bit length
 */
function core_sha1(x, len)
{
 /* append padding */
 x[len >> 5] |= 0x80 << (24 - len % 32);
 x[((len + 64 >> 9) << 4) + 15] = len;
 var w = Array(80);
 var a =  1732584193;
 var b = -271733879;
 var c = -1732584194;
 var d =  271733878;
 var e = -1009589776;
 for(var i = 0; i < x.length; i += 16) {
  var olda = a;
  var oldb = b;
  var oldc = c;
  var oldd = d;
  var olde = e;
  for(var j = 0; j < 80; j++) {
   if(j < 16) w[j] = x[i + j];
   else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
   var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
    safe_add(safe_add(e, w[j]), sha1_kt(j)));
   e = d;
   d = c;
   c = rol(b, 30);
   b = a;
   a = t;
  }
  a = safe_add(a, olda);
  b = safe_add(b, oldb);
  c = safe_add(c, oldc);
  d = safe_add(d, oldd);
  e = safe_add(e, olde);
 }
 return Array(a, b, c, d, e);
}
/*
 * Perform the appropriate triplet combination function for the current
 * iteration
 */
function sha1_ft(t, b, c, d)
{
 if(t < 20) return (b & c) | ((~b) & d);
 if(t < 40) return b ^ c ^ d;
 if(t < 60) return (b & c) | (b & d) | (c & d);
 return b ^ c ^ d;
}
/*
 * Determine the appropriate additive constant for the current iteration
 */
function sha1_kt(t)
{
 return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 : (t < 60) ? -1894007588 : -899497514;
}
/*
 * Calculate the HMAC-SHA1 of a key and some data
 */
function core_hmac_sha1(key, data)
{
 var bkey = str2binb(key);
 if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
 var ipad = Array(16), opad = Array(16);
 for(var i = 0; i < 16; i++) {
  ipad[i] = bkey[i] ^ 0x36363636;
  opad[i] = bkey[i] ^ 0x5C5C5C5C;
 }
 var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
 return core_sha1(opad.concat(hash), 512 + 160);
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
 return (msw << 16) | (lsw & 0xFFFF);
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */
function rol(num, cnt)
{
 return (num << cnt) | (num >>> (32 - cnt));
}
/*
 * Convert an 8-bit or 16-bit string to an array of big-endian words
 * In 8-bit function, characters >255 have their hi-byte silently ignored.
 */
function str2binb(str)
{
 var bin = Array();
 var mask = (1 << chrsz) - 1;
 for(var i = 0; i < str.length * chrsz; i += chrsz)
  bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
 return bin;
}
/*
 * Convert an array of big-endian words to a string
 */
function binb2str(bin)
{
 var str = "";
 var mask = (1 << chrsz) - 1;
 for(var i = 0; i < bin.length * 32; i += chrsz)
  str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
 return str;
}
/*
 * Convert an array of big-endian words to a hex string.
 */
function binb2hex(binarray)
{
 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
 var str = "";
 for(var i = 0; i < binarray.length * 4; i++)
 {
  str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
   hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
 }
 return str;
}
/*
 * Convert an array of big-endian words to a base-64 string
 */
function binb2b64(binarray)
{
 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 var str = "";
 for(var i = 0; i < binarray.length * 4; i += 3)
 {
  var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
              | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
              |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
  for(var j = 0; j < 4; j++)
  {
   if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
   else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
  }
 }
 return str;
}

