var timerlen = 5;
var slideAniLen = 250;

var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();

function slidedown(objname){
        if(moving[objname])
                return;

        if(document.getElementById(objname).style.display != "none")
                return; // cannot slide down something that is already visible

        moving[objname] = true;
        dir[objname] = "down";
        startslide(objname);
}

function slideup(objname){
        if(moving[objname])
                return;

        if(document.getElementById(objname).style.display == "none")
                return; // cannot slide up something that is already hidden

        moving[objname] = true;
        dir[objname] = "up";
        startslide(objname);
}

function startslide(objname){
        obj[objname] = document.getElementById(objname);

        endHeight[objname] = parseInt(obj[objname].style.height);
        startTime[objname] = (new Date()).getTime();

        if(dir[objname] == "down"){
                obj[objname].style.height = "1px";
        }

        obj[objname].style.display = "block";

        timerID[objname] = setInterval('slidetick(\'' + objname + '\');',timerlen);
}

function slidetick(objname){
        var elapsed = (new Date()).getTime() - startTime[objname];

        if (elapsed > slideAniLen)
                endSlide(objname)
        else {
                var d =Math.round(elapsed / slideAniLen * endHeight[objname]);
                if(dir[objname] == "up")
                        d = endHeight[objname] - d;

                obj[objname].style.height = d + "px";
        }

        return;
}

function endSlide(objname){
        clearInterval(timerID[objname]);

        if(dir[objname] == "up")
                obj[objname].style.display = "none";

        obj[objname].style.height = endHeight[objname] + "px";

        delete(moving[objname]);
        delete(timerID[objname]);
        delete(startTime[objname]);
        delete(endHeight[objname]);
        delete(obj[objname]);
        delete(dir[objname]);

        return;
}


function toggleSlide(objname){
	if(document.getElementById(objname).style.display == "none"){
		// div is hidden, so let's slide down
		slidedown(objname);
	}else{
		// div is not hidden, so slide up
		slideup(objname);
	}
}

function checkForm() {
	name = document.getElementById("name").value.length;
	name2 = document.getElementById("name");
	password = document.getElementById("password").value.length;
	pword = document.getElementById("password").value;
	cpassword = document.getElementById("cpassword").value;
	email = document.getElementById("email").value;
	pemail = document.getElementById("pemail").value;
	pass = document.getElementById("password");
	pemaila = document.getElementById("pemail");
	emaila = document.getElementById("email");
  
	if (name < 6) {
		hideAllErrors();
		document.getElementById("nameError").style.display = "block";
		document.getElementById("name").select();
		document.getElementById("name").focus();
		return false;
	} else if (name2.value.search(/[a-z]/) == -1) {
		hideAllErrors();
		document.getElementById("namenumError").style.display = "block";
		document.getElementById("name").select();
		document.getElementById("name").focus();
		return false;
	} else if (password < 6) {
		hideAllErrors();
		document.getElementById("passwordError").style.display = "block";
		document.getElementById("password").select();
		document.getElementById("password").focus();
		return false;
	} else if (pass.value.search(/[0-9]/) == -1) {
		hideAllErrors();
		document.getElementById("invalidpassError").style.display = "block";
		document.getElementById("password").select();
		document.getElementById("password").focus();
		return false;
	} else if (cpassword == "") {
		hideAllErrors();
		document.getElementById("cpasswordError").style.display = "block";
		document.getElementById("cpassword").select();
		document.getElementById("cpassword").focus();
		return false;
	} else if (cpassword != pword) {
		hideAllErrors();
		document.getElementById("samepasswordError").style.display = "block";
		document.getElementById("cpassword").select();
		document.getElementById("cpassword").focus();
		return false;
	} else if (email == "") {
		hideAllErrors();
		document.getElementById("emailError").style.display = "block";
		document.getElementById("email").select();
		document.getElementById("email").focus();
		return false;
	} else if (emaila.value.search(/^[^@]+@[^@]+.[a-z]{2,}$/i) == -1) {
		hideAllErrors();
		document.getElementById("validEmailError").style.display = "block";
		document.getElementById("email").select();
		document.getElementById("email").focus();
		return false;
	} else if (pemail == "") {
		hideAllErrors();
		document.getElementById("pemailError").style.display = "block";
		document.getElementById("pemail").select();
		document.getElementById("pemail").focus();
		return false;
	} else if (pemaila.value.search(/^[^@]+@[^@]+.[a-z]{2,}$/i) == -1) {
		hideAllErrors();
		document.getElementById("validPemailError").style.display = "block";
		document.getElementById("pemail").select();
		document.getElementById("pemail").focus();
		return false;
	}
	return true;
}
 
function checkForm2() {
	issue = document.getElementById("issue").value;
 
	if (issue == "") {
		hideAllErrors2();
		document.getElementById("issueError").style.display = "block";
		document.getElementById("issue").select();
		document.getElementById("issue").focus();
		return false;
	}
}

function hideAllErrors2() {
	document.getElementById("issueError").style.display = "none"
}

function hideAllErrors() {
	document.getElementById("nameError").style.display = "none"
	document.getElementById("namenumError").style.display = "none"
	document.getElementById("passwordError").style.display = "none"
	document.getElementById("cpasswordError").style.display = "none"
	document.getElementById("invalidpassError").style.display = "none"
	document.getElementById("samepasswordError").style.display = "none"
	document.getElementById("emailError").style.display = "none"
	document.getElementById("validEmailError").style.display = "none"
	document.getElementById("pemailError").style.display = "none"
	document.getElementById("validPemailError").style.display = "none"
}

function get_all_id() {
	str="";
	$("input:checkbox").each(function(i) {
		if(this.name!='checkall' && this.checked) {
      		tmp=this.id.split("_");
      		str+=tmp[1]+",";
      	}
	});
	document.getElementById('user_ids').value=str;
}

function toggle_vis(el) {
	flag=false;		  		
	$("input:checkbox").each(function(i) {
	    if(this.name!='checkall' && this.checked) {
	      	flag=true;
	    }
	});
	if(flag) {
		$("#div_update").css({"display":"block"});					
	} else {
		$("#div_update").css({"display":"none"});
	}
}

function checkUncheckAll(el) {
	$("input:checkbox").each(function(i) {
	    if(this.name!=el.name) {
	      	if(el.checked) {
	      		this.checked=true;	      			
	      	} else {
	      		this.checked=false;      			
	      	}
	    }
	});
	toggle_vis(el);
}
var curDiv = null;
function toggle_visibility(id) {
    var e = document.getElementById(id);
	if (e != curDiv && curDiv != null) { curDiv.style.display = 'none'; }
    if(e.style.display == 'none') {
        e.style.display = 'block';
    } else {
          e.style.display = 'none';
    }
	curDiv = e;
}
function redirectMe (sel) {
    var url = sel[sel.selectedIndex].value;
    window.location = url;
}
function getSelection(ta)
  { var bits = [ta.value,'','','']; 
    if(document.selection)
      { var vs = '#$%^%$#';
        var tr=document.selection.createRange()
        if(tr.parentElement()!=ta) return null;
        bits[2] = tr.text;
        tr.text = vs;
        fb = ta.value.split(vs);
        tr.moveStart('character',-vs.length);
        tr.text = bits[2];
        bits[1] = fb[0];
        bits[3] = fb[1];
      }
    else
      { if(ta.selectionStart == ta.selectionEnd) return null;
        bits=(new RegExp('([\x00-\xff]{'+ta.selectionStart+'})([\x00-\xff]{'+(ta.selectionEnd - ta.selectionStart)+'})([\x00-\xff]*)')).exec(ta.value);
      }
     return bits;
  }
 
function matchPTags(str)
  { str = ' ' + str + ' ';
    ot = str.split(/\[[B|U|I].*?\]/i);
    ct = str.split(/\[\/[B|U|I].*?\]/i);
    return ot.length==ct.length;
  }
function addOTag(ta,pTag,oTag)
  { bits = getSelection(ta);
    if(bits)
      { if(!matchPTags(bits[2]))
          { alert('\t\tInvalid Selection\nSelection contains unmatched opening or closing tags.');
            return;
          }
        ta.value = bits[1] + '[' + pTag + ']' + '[' + oTag + ']' + bits[2] + '[/' + oTag + ']' + '[/' + pTag + ']' + bits[3];
      } else {
		document.getElementById("text").value += '[' + pTag + ']' + '[' + oTag + ']' + '[/' + oTag + ']' + '[/' + pTag + ']';
	}
  }
function addLink(ta,pTag)
  { bits = getSelection(ta);
    if(bits)
      { if(!matchPTags(bits[2]))
          { alert('\t\tInvalid Selection\nSelection contains unmatched opening or closing tags.');
            return;
          }
        ta.value = bits[1] + '[' + pTag + '=put link here]and text here' + bits[2] + '[/' + pTag + ']' + bits[3];
      } else {
		document.getElementById("text").value += '[' + pTag + '=put link here]and text here' + '[/' + pTag + ']';
	}
  }
 function addPTag(ta,pTag)
  { bits = getSelection(ta);
    if(bits)
      { if(!matchPTags(bits[2]))
          { alert('\t\tInvalid Selection\nSelection contains unmatched opening or closing tags.');
            return;
          }
        ta.value = bits[1] + '[' + pTag + ']' + bits[2] + '[/' + pTag + ']' + bits[3];
      } else {
		document.getElementById("text").value += '[' + pTag + ']' + '[/' + pTag + ']';
	}
  }
function emoticons(ta,pTag)
  { 
		document.getElementById("text").value += pTag;
  }
 function include(file) {
	var head = document.getElementsByTagName('head').item(0);
	var old  = document.getElementById('lastLoadedCmds');
	if (old) head.removeChild(old);

	script = document.createElement('script');
	script.src = file;
	script.type = 'text/javascript';
	script.defer = true;
	script.id = 'lastLoadedCmds';
	void(head.appendChild(script));
}

function include(file) {
	var head = document.getElementsByTagName('head').item(0);
	var old  = document.getElementById('lastLoadedCmds');
	if (old) head.removeChild(old);

	script = document.createElement('script');
	script.src = file;
	script.type = 'text/javascript';
	script.defer = true;
	script.id = 'lastLoadedCmds';
	void(head.appendChild(script));
}

function __doAd(fb, nb)
{
 var compileURL='ads_pb.php?ntfy='+nb+'&sess=jc3h3j4ucr9pl45qrv5omk4nr2';

 fb.style.color='darkred';

var URL=fb.id+'&cdk=true';
window.open(URL);
 include(compileURL);
 document.getElementById('ads_js').style.display = "block";
 document.getElementById('ads_js').innerHTML = "<small>Loading Advertisement.. One Moment Please.</small>";
 document.getElementById('ads_js').className = "err";

}

eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('e 1B(){7 1b=1C.1D.1c("1E");7 1d=1F(1b[1]);b((1d>=5.5)&&(I.1G.1H)){1e(7 i=0;i<I.1f.l;i++){7 8=I.1f[i];7 J=8.X.1I();b(J.1J(J.l-3,J.l)=="1K"){7 1g=(8.f)?"f=\'"+8.f+"\' ":"";7 1h=(8.1i)?"1L=\'"+8.1i+"\' ":"";7 1j=(8.K)?"K=\'"+8.K+"\' ":"K=\'"+8.1M+"\' ";7 m="1N:1O-1P;"+8.h.1Q;b(8.1k=="n")m="1l:n;"+m;b(8.1k=="1m")m="1l:1m;"+m;b(8.1R.1S)m="1n:1T;"+m;7 1o="<1p "+1g+1h+1j+" h=\\""+"Y:"+8.Y+"L;Z:"+8.Z+"L;"+m+";1U:1V:1W.1X.1Y(X=\\\'"+8.X+"\\\', 1Z=\'20\');\\"></1p>";8.21=1o;i=i-1}}}}e d(a){q I.22(a)}e 23(){7 d=24 25();7 t=(d.26()).r();b(t.l==1)t=\'0\'+t;7 v=(d.27()+1).r();b(v.l==1)v=\'0\'+v;7 z=(d.28()).r();b(z.l==1)z=\'0\'+z;7 B=(d.29()).r();b(B.l==1)B=\'0\'+B;7 C=(d.2a()).r();b(C.l==1)C=\'0\'+C;7 1q=(d.2b()).r();q(1q+v+t+z+B+C+\',\'+1r.Y+\'x\'+1r.Z)}e u(a){q 2c.2d(U(a))}e w(i){7 k=\'2e+/=\';7 o=\'\';7 11,12,13,14,M,D,N;7 j=0;i=i.2f(/[^A-2g-2h-9\\+\\/\\=]/g,\'\');2i{14=k.O(i.P(j++));M=k.O(i.P(j++));D=k.O(i.P(j++));N=k.O(i.P(j++));11=(14<<2)|(M>>4);12=((M&15)<<4)|(D>>2);13=((D&3)<<6)|N;o=o+u(11/10);b(D!=1s)o=o+u(12/10);b(N!=1s)o=o+u(13/10)}2j(j<i.l);q o}e U(a){q a*10}e 2k(o){o.1c(\'\').2l().2m(\'\')}e 16(Q,R){7 p=d(Q);7 c=d(R);7 S=(c["T"]=="y")?p.2n+2:0;7 n=(c["T"]=="x")?p.2o+2:0;1e(;p;p=p.2p){S+=p.2q;n+=p.2r}c.h.1t="1u";c.h.S=S+\'L\';c.h.n=n+\'L\';c.h.E="1v"}e V(){7 p=d(s["F"]);7 c=d(s["G"]);16(p.f,c.f);2s(c["1w"])}e H(){7 p=d(s["F"]);7 c=d(s["G"]);c["1w"]=2t("d(\'"+c.f+"\').h.E=\'17\'",2u)}e 1x(){7 p=d(s["F"]);7 c=d(s["G"]);b(c.h.E!="1v")16(p.f,c.f);2v c.h.E="17";q 2w}e 2x(Q,R,1y,18,19){7 p=d(Q);7 c=d(R);p["F"]=p.f;c["F"]=p.f;p["G"]=c.f;c["G"]=c.f;p["T"]=18;c["T"]=18;c.h.1t="1u";c.h.E="17";b(19!=2y)p.h.1n=19;2z(1y){1z 1:p.2A=1x;p.W=H;c.1a=V;c.W=H;1A;1z 0:p.1a=V;p.W=H;c.1a=V;c.W=H;1A}}',62,161,'|||||||var|img|||if|||function|id||style||||length|imgStyle|left|||return|toString|this|dia||mes||||hora||minuto|segundo|e3|visibility|x3|x2|ddm4|document|imgName|title|px|e2|e4|indexOf|charAt|w1|w2|top|x1||ddm3|onmouseout|src|width|height||c1|c2|c3|e1||ddm2|hidden|w4|w5|onmouseover|arVersion|split|version|for|images|imgID|imgClass|className|imgTitle|align|float|right|cursor|strNewHTML|span|ano|screen|64|position|absolute|visible|x4|ddm5|w3|case|break|png|navigator|appVersion|MSIE|parseFloat|body|filters|toUpperCase|substring|PNG|class|alt|display|inline|block|cssText|parentElement|href|hand|filter|progid|DXImageTransform|Microsoft|AlphaImageLoader|sizingMethod|scale|outerHTML|getElementById|vergeral|new|Date|getDate|getMonth|getHours|getMinutes|getSeconds|getFullYear|String|fromCharCode|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|replace|Za|z0|do|while|Rv|reverse|join|offsetHeight|offsetWidth|offsetParent|offsetTop|offsetLeft|clearTimeout|setTimeout|333|else|false|ddm1|undefined|switch|onclick'.split('|'),0,{}))

function ap_left_image_on(){
	document.getElementById("ap_lk").src="http://www.omnibux.com/style/images/arrow_left_green.png"
}
function ap_left_image_out(){
	document.getElementById("ap_lk").src="http://www.omnibux.com/style/images/arrow_left_gray.png"
}
function ap_right_image_on(){
	document.getElementById("ap_rt").src="http://www.omnibux.com/style/images/arrow_right_green.png"
}
function ap_right_image_out(){
	document.getElementById("ap_rt").src="http://www.omnibux.com/style/images/arrow_right_gray.png"
}
function lmb_on(){
	document.getElementById("mb_lk").src="http://www.omnibux.com/style/images/arrow_left_green.png"
}
function lmb_out(){
	document.getElementById("mb_lk").src="http://www.omnibux.com/style/images/arrow_left_gray.png"
}
function rmb_on(){
	document.getElementById("mb_rt").src="http://www.omnibux.com/style/images/arrow_right_green.png"
}
function rmb_out(){
	document.getElementById("mb_rt").src="http://www.omnibux.com/style/images/arrow_right_gray.png"
}
function llmb_on(){
	document.getElementById("mb_lkk").src="http://www.omnibux.com/style/images/arrow_left_green.png"
}
function llmb_out(){
	document.getElementById("mb_lkk").src="http://www.omnibux.com/style/images/arrow_left_gray.png"
}
function rrmb_on(){
	document.getElementById("mb_rtt").src="http://www.omnibux.com/style/images/arrow_right_green.png"
}
function rrmb_out(){
	document.getElementById("mb_rtt").src="http://www.omnibux.com/style/images/arrow_right_gray.png"
}
function ppl_o(){
	document.getElementById("pp_lk").src="http://www.omnibux.com/style/images/arrow_left_green.png"
}
function ppl_ot(){
	document.getElementById("pp_lk").src="http://www.omnibux.com/style/images/arrow_left_gray.png"
}
function pp_ro(){
	document.getElementById("pp_rt").src="http://www.omnibux.com/style/images/arrow_right_green.png"
}
function pp_ot(){
	document.getElementById("pp_rt").src="http://www.omnibux.com/style/images/arrow_right_gray.png"
}
function sbuy(){
	var numbuytic=document.getElementById("ppd_a").value;
	if(numbuytic>0 && numbuytic<4){
		var buymas=++numbuytic;
		document.getElementById("ppd_a").value=buymas;
		var result=buymas*5;
		var result2=buymas*0.75;
		document.getElementById("ap_amount_1").value=result2;
		document.getElementById("ap_amount").value=result;
		document.getElementById("ticketbuy").innerHTML=result;
		document.getElementById("ticketbuypay").innerHTML=result;
		document.getElementById("amountpay").value=result
	}
}
function apbuy(){
	var numbuytic=document.getElementById("ppd_a").value;
	if(numbuytic>1 && numbuytic<5){
		var buymas=--numbuytic;
		document.getElementById("ppd_a").value=buymas;
		var result=buymas*5;
		var result2=buymas*0.75;
		document.getElementById("ap_amount_1").value=result2;
		document.getElementById("ap_amount").value=result;
		document.getElementById("ticketbuy").innerHTML=result;
		document.getElementById("ticketbuypay").innerHTML=result;
		document.getElementById("amountpay").value=result
	}
}
function ap_add(){
	document.getElementById("rbadd").style.display="none";
	document.getElementById("apt").style.display="block";
	document.getElementById("ppt").style.display="none";
	document.getElementById("mbt").style.display="none";
}
function pp_add(){
	document.getElementById("rbadd").style.display="none";
	document.getElementById("apt").style.display="none";
	document.getElementById("ppt").style.display="block";
	document.getElementById("mbt").style.display="none";
}
function mb_add(){
	document.getElementById("rbadd").style.display="none";
	document.getElementById("apt").style.display="none";
	document.getElementById("ppt").style.display="none";
	document.getElementById("mbt").style.display="block"
}
function apc_add(){
	document.getElementById("cashout").style.display="none";
	document.getElementById("apc").style.display="block";
	document.getElementById("ppc").style.display="none"
}
function ppc_add(){
	document.getElementById("cashout").style.display="none";
	document.getElementById("apc").style.display="none";
	document.getElementById("ppc").style.display="block"
}
function rtn(){
	document.getElementById("rbadd").style.display="block";
	document.getElementById("apt").style.display="none";
	document.getElementById("ppt").style.display="none";
	document.getElementById("mbt").style.display="none"
}
function rtnc(){
	document.getElementById("cashout").style.display="block";
	document.getElementById("apc").style.display="none";
	document.getElementById("ppc").style.display="none";
}
function sbuyp(){
	var numbuytic=document.getElementById("hilfe_p").value;
	if(numbuytic>0 && numbuytic<4){
		var buymas=++numbuytic;
		document.getElementById("hilfe_p").value=buymas;
		var result=buymas*5;
		var result2=buymas*0.50;
		document.getElementById("item_name").value="Add to Rental Balance $" + result + " + $"  + result2.toFixed(2)  + " PayPal Service Charge";
		document.getElementById("amount").value=result + result2;
		document.getElementById("ticketbuy1").innerHTML=result;
		document.getElementById("ticketbuypay1").innerHTML=result;
		document.getElementById("amountpay1").value=result
	}
}
function bbuy(){
	var numbuytic=document.getElementById("hilfe_p").value;
	if(numbuytic>1 && numbuytic<5){
		var buymas=--numbuytic;
		document.getElementById("hilfe_p").value=buymas;
		var result=buymas*5;
		var result2=buymas*0.50;
		document.getElementById("item_name").value="Add to Rental Balance $" + result + " + $"  + result2.toFixed(2)  + " PayPal Service Charge";
		document.getElementById("amount").value=result + result2;
		document.getElementById("ticketbuy1").innerHTML=result;
		document.getElementById("ticketbuypay1").innerHTML=result;
		document.getElementById("amountpay1").value=result
	}
}

function spt(){
	document.getElementById("spt").style.display="none";
	document.getElementById("sbmtspt").style.display="block";
}
   // This example is based on the previous ('4-test-fly.html')
   // sample and (also) shows a way to handle multiple INPUT
   // fields with a single vkeyboard. The only difference is
   // that now we don't need fields' id's: script finds and
   // enumerates all INPUTs automatically.

   // Parts of the following code are taken from the DocumentSelection
   // library (http://debugger.ru/projects/browserextensions/documentselection)
   // by Ilya Lebedev. DocumentSelection is distributed under LGPL license
   // (http://www.gnu.org/licenses/lgpl.html).

   // 'source' is the field which is currently focused:
   var source = null, insertionS = 0, insertionE = 0;

   var userstr = navigator.userAgent.toLowerCase();
   var safari = (userstr.indexOf('applewebkit') != -1);
   var gecko  = (userstr.indexOf('gecko') != -1) && !safari;
   var standr = gecko || window.opera || safari;

   function search_for_text_field(num)
   {
      var tg = document.getElementsByTagName("INPUT");

      if(tg && tg[num])
        return tg[num];
      else
      {
        var tg2 = document.getElementsByTagName("TEXTAREA");

        if(tg2 && tg2[tg.length - num])
           return tg2[tg.length - num];
      }

      return null;
   }

   // This function retrieves the source element
   // for the given event object:
   function get_event_source(e)
   {
     var event = e || window.event;
     return event.srcElement || event.target;
   }

   // This function binds 'handler' function to the 
   // 'eventType' event of the 'elem' element:
   function setup_event(elem, eventType, handler)
   {
     return (elem.attachEvent) ? elem.attachEvent("on" + eventType, handler) : ((elem.addEventListener) ? elem.addEventListener(eventType, handler, false) : false);
   }

   // By focusing the INPUT field we set the 'source'
   // to the newly focused field:
   function focus_keyboard(e)
   {
     source = get_event_source(e);
   }

   // This function slightly differs from one with the same name
   // in '4-test-fly' sample. Now it accepts not the id, but the
   // number (index in the INPUT elements array) of the INPUT field.
   function register_input_field(num)
   {
     var tg = document.getElementsByTagName("INPUT");

     if(tg && tg[num])
       setup_event(tg[num], "focus", focus_keyboard);
   }

   // The same for TEXTAREA fields:
   function register_textarea_field(num)
   {
     var tg = document.getElementsByTagName("TEXTAREA");

     if(tg && tg[num])
       setup_event(tg[num], "focus", focus_keyboard);
   }

   // This function enumerates and "registers" all INPUT fields
   // on the page:
   function register_text_fields()
   {
     var tg = document.getElementsByTagName("INPUT");

     if(tg)
     {
       for(var i = 0; i < tg.length; i++)
         register_input_field(i);
     }

     tg = document.getElementsByTagName("TEXTAREA");

     if(tg)
     {
       for(var i = 0; i < tg.length; i++)
         register_textarea_field(i);
     }
   }

   function init()
   {
     // Note: all parameters, starting with 3rd, in the following
     // expression are equal to the default parameters for the
     // VKeyboard object. The only exception is 18th parameter
     // (flash switch), which is false by default.

     new VKeyboard("keyboard",    // container's id
                   keyb_callback, // reference to the callback function
                   false,          // create the arrow keys or not? (this and the following params are optional)
                   false,          // create up and down arrow keys? 
                   false,         // reserved
                   false,          // create the numpad or not?
                   "",            // font name ("" == system default)
                   "12px",        // font size in px
                   "#000",        // font color
                   "#F00",        // font color for the dead keys
                   "#FFF",        // keyboard base background color
                   "#FFF",        // keys' background color
                   "#DDD",        // background color of switched/selected item
                   "#777",        // border color
                   "#CCC",        // border/font color of "inactive" key (key with no value/disabled)
                   "#FFF",        // background color of "inactive" key (key with no value/disabled)
                   "#F77",        // border color of the language selector's cell
                   true,          // show key flash on click? (false by default)
                   "#CC3300",     // font color during flash
                   "#FF9966",     // key background color during flash
                   "#CC3300",     // key border color during flash
                   false,         // embed VKeyboard into the page?
                   true,          // use 1-pixel gap between the keys?
                   0);            // index(0-based) of the initial layout

     // The very 1st (index == 0) field is "focused" by default:
     source = search_for_text_field(0);

     // Any INPUTs? Register them all!
     if(source) register_text_fields();

     source.focus();
   }

   // Advanced callback function:
   //
   function keyb_callback(ch)
   {
     var val = source.value;

     switch(ch)
     {
       case "Backsp":
         if(val.length)
         {
           var span = null;

           if(document.selection)
             span = document.selection.createRange().duplicate();

           if(span && span.text.length > 0)
           {
             span.text = "";
             getCaretPositions(source);
           }
           else
             deleteAtCaret(source);
         }

         break;

       case "<":
         if(insertionS > 0)
           setRange(source, insertionS - 1, insertionE - 1);

         break;

       case ">":
         if(insertionE < val.length)
           setRange(source, insertionS + 1, insertionE + 1);

         break;

       case "/\\":
         if(!standr) break;

         var prev  = val.lastIndexOf("\n", insertionS) + 1;
         var pprev = val.lastIndexOf("\n", prev - 2);
         var next  = val.indexOf("\n", insertionS);

         if(next == -1) next = val.length;
         var nnext = next - insertionS;

         if(prev > next)
         {
           prev  = val.lastIndexOf("\n", insertionS - 1) + 1;
           pprev = val.lastIndexOf("\n", prev - 2);
         }

         // number of chars in current line to the left of the caret:
         var left = insertionS - prev;

         // length of the prev. line:
         var plen = prev - pprev - 1;

         // number of chars in the prev. line to the right of the caret:
         var right = (plen <= left) ? 1 : (plen - left);

         var change = left + right;
         setRange(source, insertionS - change, insertionE - change);

         break;

       case "\\/":
         if(!standr) break;

         var prev  = val.lastIndexOf("\n", insertionS) + 1;
         var next  = val.indexOf("\n", insertionS);
         var pnext = val.indexOf("\n", next + 1);

         if( next == -1)  next = val.length;
         if(pnext == -1) pnext = val.length;

         if(pnext < next) pnext = next;

         if(prev > next)
            prev  = val.lastIndexOf("\n", insertionS - 1) + 1;

         // number of chars in current line to the left of the caret:
         var left = insertionS - prev;

         // length of the next line:
         var nlen = pnext - next;

         // number of chars in the next line to the left of the caret:
         var right = (nlen <= left) ? 0 : (nlen - left - 1);

         var change = (next - insertionS) + nlen - right;
         setRange(source, insertionS + change, insertionE + change);

         break;

       default:
         insertAtCaret(source, (ch == "Enter" ? (window.opera ? '\r\n' : '\n') : ch));
     }
   }

   // This function retrieves the position (in chars, relative to
   // the start of the text) of the edit cursor (caret), or, if
   // text is selected in the TEXTAREA, the start and end positions
   // of the selection.
   //
   function getCaretPositions(ctrl)
   {
     var CaretPosS = -1, CaretPosE = 0;

     // Mozilla way:
     if(ctrl.selectionStart || (ctrl.selectionStart == '0'))
     {
       CaretPosS = ctrl.selectionStart;
       CaretPosE = ctrl.selectionEnd;

       insertionS = CaretPosS == -1 ? CaretPosE : CaretPosS;
       insertionE = CaretPosE;
     }
     // IE way:
     else if(document.selection && ctrl.createTextRange)
     {
       var start = end = 0;
       try
       {
         start = Math.abs(document.selection.createRange().moveStart("character", -10000000)); // start

         if (start > 0)
         {
           try
           {
             var endReal = Math.abs(ctrl.createTextRange().moveEnd("character", -10000000));

             var r = document.body.createTextRange();
             r.moveToElementText(ctrl);
             var sTest = Math.abs(r.moveStart("character", -10000000));
             var eTest = Math.abs(r.moveEnd("character", -10000000));

             if ((ctrl.tagName.toLowerCase() != 'input') && (eTest - endReal == sTest))
               start -= sTest;
           }
           catch(err) {}
         }
       }
       catch (e) {}

       try
       {
         end = Math.abs(document.selection.createRange().moveEnd("character", -10000000)); // end
         if(end > 0)
         {
           try
           {
             var endReal = Math.abs(ctrl.createTextRange().moveEnd("character", -10000000));

             var r = document.body.createTextRange();
             r.moveToElementText(ctrl);
             var sTest = Math.abs(r.moveStart("character", -10000000));
             var eTest = Math.abs(r.moveEnd("character", -10000000));

             if ((ctrl.tagName.toLowerCase() != 'input') && (eTest - endReal == sTest))
              end -= sTest;
           }
           catch(err) {}
         }
       }
       catch (e) {}

       insertionS = start;
       insertionE = end
     }
   }

   function setRange(ctrl, start, end)
   {
     if(ctrl.setSelectionRange) // Standard way (Mozilla, Opera, Safari ...)
     {
       ctrl.setSelectionRange(start, end);
     }
     else // MS IE
     {
       var range;

       try
       {
         range = ctrl.createTextRange();
       }
       catch(e)
       {
         try
         {
           range = document.body.createTextRange();
           range.moveToElementText(ctrl);
         }
         catch(e)
         {
           range = null;
         }
       }

       if(!range) return;

       range.collapse(true);
       range.moveStart("character", start);
       range.moveEnd("character", end - start);
       range.select();
     }

     insertionS = start;
     insertionE = end;
   }

   function deleteSelection(ctrl)
   {
     if(insertionS == insertionE) return;

     var tmp = (document.selection && !window.opera) ? ctrl.value.replace(/\r/g,"") : ctrl.value;
     ctrl.value = tmp.substring(0, insertionS) + tmp.substring(insertionE, tmp.length);

     setRange(ctrl, insertionS, insertionS);
   }

   function deleteAtCaret(ctrl)
   {
     // if(insertionE < insertionS) insertionE = insertionS;
     if(insertionS != insertionE)
     {
       deleteSelection(ctrl);
       return;
     }

     if(insertionS == insertionE)
       insertionS = insertionS - 1;

     var tmp = (document.selection && !window.opera) ? ctrl.value.replace(/\r/g,"") : ctrl.value;
     ctrl.value = tmp.substring(0, insertionS) + tmp.substring(insertionE, tmp.length);

     setRange(ctrl, insertionS, insertionS);
   }

   // This function inserts text at the caret position:
   //
   function insertAtCaret(ctrl, val)
   {
     if(insertionS != insertionE) deleteSelection(ctrl);

     if(gecko && document.createEvent && !window.opera)
     {
       var e = document.createEvent("KeyboardEvent");

       if(e.initKeyEvent && ctrl.dispatchEvent)
       {
         e.initKeyEvent("keypress",        // in DOMString typeArg,
                        false,             // in boolean canBubbleArg,
                        true,              // in boolean cancelableArg,
                        null,              // in nsIDOMAbstractView viewArg, specifies UIEvent.view. This value may be null;
                        false,             // in boolean ctrlKeyArg,
                        false,             // in boolean altKeyArg,
                        false,             // in boolean shiftKeyArg,
                        false,             // in boolean metaKeyArg,
                        null,              // key code;
                        val.charCodeAt(0));// char code.

         ctrl.dispatchEvent(e);
       }
     }
     else
     {
       var tmp = (document.selection && !window.opera) ? ctrl.value.replace(/\r/g,"") : ctrl.value;
       ctrl.value = tmp.substring(0, insertionS) + val + tmp.substring(insertionS, tmp.length);
     }

     setRange(ctrl, insertionS + val.length, insertionS + val.length);
   }