function getPixelsFromTop(obj){
	objFromTop = obj.offsetTop;
	while(obj.offsetParent!=null) {
		objParent = obj.offsetParent;
		objFromTop += objParent.offsetTop;
		obj = objParent;
	}
	return objFromTop;
}

function getTDHeight(top,bottom){
	contentTopDiv = top;
	contentBotDiv = bottom;
	contentTop = getPixelsFromTop(contentTopDiv);
	contentBottom = getPixelsFromTop(contentBotDiv);
	contentHeight = contentBottom - contentTop;
	
	return contentHeight;
}



function createRequestObject_admin(){
	var ro;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer"){
		ro = new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		ro = new XMLHttpRequest();
	}
	return ro;
}

function runAjaxJS(source){
	var last_match="";
	while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
		var s = source.indexOf("<script");
		var s_e = source.indexOf(">", s);
		var e = source.indexOf("</script", s);
		var e_e = source.indexOf(">", e);
		
		// Add to scripts array
		last_match=source.substring(s_e+1, e);
		// Strip from source
		source = source.substring(0, s) + source.substring(e_e+1);
	}

	if(last_match!=""){
		//eval(last_match);
		/*var script = document.createElement('script');
		var text = document.createTextNode(last_match);
		script.type = 'text/javascript';
		script.appendChild(text);
		document.getElementsByTagName("head")[0].appendChild(script);*/

		var getheadTag = document.getElementsByTagName('head')[0];
		setjs = document.createElement('script'); 
		setjs.setAttribute('type', 'text/javascript');
		getheadTag.appendChild(setjs); 
		setjs.text = last_match;
	}

}



function runAjaxJSAll(source){
	var last_match="";
	while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
		var s = source.indexOf("<script");
		var s_e = source.indexOf(">", s);
		var e = source.indexOf("</script", s);
		var e_e = source.indexOf(">", e);
		
		// Add to scripts array
		last_match=source.substring(s_e+1, e);
		// Strip from source
		source = source.substring(0, s) + source.substring(e_e+1);

		if(last_match!=""){
			//eval(last_match);
			/*var script = document.createElement('script');
			var text = document.createTextNode(last_match);
			script.type = 'text/javascript';
			script.appendChild(text);
			document.getElementsByTagName("head")[0].appendChild(script);*/

			var getheadTag = document.getElementsByTagName('head')[0];
			setjs = document.createElement('script'); 
			setjs.setAttribute('type', 'text/javascript');
			getheadTag.appendChild(setjs); 
			setjs.text = last_match;
		}

	}



}

function MyCreateRequestObject() {
			var ro;
			var browser = navigator.appName;
			if(browser == "Microsoft Internet Explorer"){
				ro = new ActiveXObject("Microsoft.XMLHTTP");
			}else{
				ro = new XMLHttpRequest();
			}
			return ro;
		}

		
function removeAllDDOptions(selectbox)
{
	var i;
	for(i=selectbox.options.length-1;i>0;i--)
	//for (var i=0; i < pop_id.length;i++)
	{
		selectbox.remove(i);
	}
	selectbox.options.length=0;
}	


function addDDOption(selectbox,text,value ) 
{ 
	var optn = document.createElement("OPTION"); 
	optn.text = text; 
	optn.value = value; 
	selectbox.options.add(optn); 
}
	
	
	function validateDate(item,time){
		try{
			if(current_year==1){

			}
		}catch(e){
			current_year=2008;
		}
		if(time==1){
				var date=item.value;
				var temp=date.split("/");
				if(temp.length==1){
					temp=date.split("-");
				}
				if(date==""){
					
				}else if(temp.length < 3){
					alert("Invalid Date. Please use format mm/dd/yyyy - hh:mm PM");
					item.value="";
				}else{
					temp2=temp[2].split(" - ");
					if(temp2.length!=2){
						validateDate(item);
						item.value=item.value + " - 07:00 PM";
					}else{
						temp3=temp2[1].split(":");
						if(temp3.length!=2){
							validateDate(item);
							item.value=item.value + " - 07:00 PM";
						}else{
							temp4=temp3[1].split(" ");
							if(temp3.length!=2){
								validateDate(item);
								item.value=item.value + " - 07:00 PM";
							}else{
								temp[0]=parseInt(temp[0],10);
								temp[1]=parseInt(temp[1],10);
								temp[2]=parseInt(temp2[0],10);
								temp[3]=parseInt(temp3[0],10);
								temp[4]=parseInt(temp4[0],10);
								temp[5]=temp4[1];


								if(temp[0] < 1){
									temp[0]=1;
								}else if(temp[0] > 12){
									temp[0]=12;
								}
								if(temp[2].toString().length==2){
									if(temp[2] > 40){
										temp[2]="19" + temp[2];
									}else{
										temp[2]="20" + temp[2];
									}
								}else if(temp[2].toString().length==1){
									temp[2]="200" + temp[2];
								}
								
								if(temp[2] < 1900){
									temp[2]=current_year;
								}else if(temp[2] > 2050){
									temp[2]=current_year;
								}

								if(temp[1] < 1){
									temp[1]=1;
								}else if(temp[1] > 31){
									temp[1]=31;
								}
								if(temp[1] > 28){
									switch(temp[0]){
										case 1:
										case 3:
										case 5:
										case 7:
										case 8:
										case 10:
										case 12:
											
										break;
										case 4:
										case 6:
										case 9:
										case 11:
											if(temp[1] > 30){
												temp[1]=30;
											}
										break;
										case 2:
											if(temp[2]%4==0){
												if(temp[1] > 29){
													temp[1]=29;
												}
											}else{
												if(temp[1] > 28){
													temp[1]=28;
												}
											}
										break;
									}
								}
								if(temp[0] < 10){
									temp[0]="0" + temp[0];
								}
								if(temp[1] < 10){
									temp[1]="0" + temp[1];
								}

								if(temp[3] < 1){
									temp[3]=1;
								}else if(temp[3] > 12){
									temp[3]=12;
								}

								if(temp[3] < 10){
									temp[3]="0" + temp[3];
								}

								if(temp[4] < 0){
									temp[4]=0;
								}else if(temp[4] > 59){
									temp[4]=59;
								}

								if(temp[4] < 10){
									temp[4]="0" + temp[4];
								}

								if(temp[5]=="AM" || temp[5]=="am" || temp[5]=="A" || temp[5]=="a" || temp[5]=="Am" || temp[5]=="aM"){
									temp[5]="AM";
								}else{
									temp[5]="PM";
								}
								

								item.value=temp[0] + "/" + temp[1] + "/" + temp[2] + " - " + temp[3] + ":" + temp[4] + " " + temp[5];
							}
						}
					}
				}
		}else{

				var date=item.value;
				var temp=date.split("/");
				if(temp.length==1){
					temp=date.split("-");
				}
				if(date==""){
					
				}else if(temp.length < 3){
					alert("Invalid Date. Please use format mm/dd/yyyy");
					item.value="";
				}else{
					temp[0]=parseInt(temp[0],10);
					temp[1]=parseInt(temp[1],10);
					temp[2]=parseInt(temp[2],10);


					if(temp[0] < 1){
						temp[0]=1;
					}else if(temp[0] > 12){
						temp[0]=12;
					}
					if(temp[2].toString().length==2){
						if(temp[2] > 40){
							temp[2]="19" + temp[2];
						}else{
							temp[2]="20" + temp[2];
						}
					}else if(temp[2].toString().length==1){
						temp[2]="200" + temp[2];
					}
					
					if(temp[2] < 1900){
						temp[2]=current_year;
					}else if(temp[2] > 2050){
						temp[2]=current_year;
					}

					if(temp[1] < 1){
						temp[1]=1;
					}else if(temp[1] > 31){
						temp[1]=31;
					}
					if(temp[1] > 28){
						switch(temp[0]){
							case 1:
							case 3:
							case 5:
							case 7:
							case 8:
							case 10:
							case 12:
								
							break;
							case 4:
							case 6:
							case 9:
							case 11:
								if(temp[1] > 30){
									temp[1]=30;
								}
							break;
							case 2:
								if(temp[2]%4==0){
									if(temp[1] > 29){
										temp[1]=29;
									}
								}else{
									if(temp[1] > 28){
										temp[1]=28;
									}
								}
							break;
						}
					}
					if(temp[0] < 10){
						temp[0]="0" + temp[0];
					}
					if(temp[1] < 10){
						temp[1]="0" + temp[1];
					}
					item.value=temp[0] + "/" + temp[1] + "/" + temp[2];
				}
			}
	}

	function isHex(which,form){
		var undef;
		if(form==undef){
			form="form1";
		}
		var f=document[form];

		var checkOK = "ABCDEFabcdef0123456789";
		var checkStr = f[which].value;
		var allValid = true;
		for (i = 0;  i < checkStr.length;  i++)
		{
			ch = checkStr.charAt(i);
			for (j = 0;  j < checkOK.length;  j++)
				if (ch == checkOK.charAt(j))
					break;
			if (j == checkOK.length)
			{
				allValid = false;
				break;
			}
		}
		if (!allValid)
		{
			alert("Hex codes may only contain numbers and the letters A through F." );
			f[which].value=document.form1[which + "_default"].value;
			document.getElementById(which + "Row").style.backgroundColor=document.form1[which + "_default"].value;
		}
		
		// require at least 5 characters in the password field
		if (checkStr.length != 6)
		{
			alert("Hex codes must be 6 characters in length." );
			f[which].value=document.form1[which + "_default"].value;
			document.getElementById(which + "Row").style.backgroundColor=f[which + "_default"].value;
		}

		document.getElementById(which + "Row").style.backgroundColor=checkStr;
		f[which + "_default"].value=checkStr;
	}
		
	function parseMe(something,parse,min,max, len){
		var temp;
		
		if(len == temp){
			len=2;
		}
		if(something.value==''){
			return;
		}

		if(parse=='int'){
			something.value=parseInt(something.value,10);
		}else if(parse=='float'){
			something.value=parseFloat(something.value);
			//alert(something.value);
			var big=Math.pow(10,len);
			var small=Math.pow(10,len - 1);
			something.value *= big;
			//alert(something.value);
			something.value=parseInt(something.value,small);
			//alert(something.value);
			something.value = something.value/big;
			//alert(something.value);
		}else{
			something.value=parseInt(something.value,10);
		}	
		if(something.value=="NaN" || something.value=="Na" || something.value=="N"){
			something.value=0;
		}
		if(min == temp){
			min=-99999999999;
		}
		if(max == temp){
			max=99999999999;
		}
		//alert(something.value + " " + min + " " + max);
		if(something.value < parseFloat(min)){
			//alert(something.value + " < " + min);
			something.value=min;
		}
		if(something.value > parseFloat(max)){
			//alert(something.value + " > " + max);
			something.value=max;
		}
		if(parse=='float'){
			something.value=decimal(something.value,len);
			//something.value=currency(something.value);
		}
	}

	function decimal(something2,len){
		
		newstring="";
		var flagDecimal=something2.length + 1;
		var something="" + something2;
		var ret1="";
		var ret2="";
		for(i=0;i<something.length;i++){
			if(something.charAt(i)=="."){
				flagDecimal=i;
				break;
			}
			ret1+=something.charAt(i);
		}
		var flag=0;
		for(i=something.length;i > flagDecimal - 1;i--){
			if(something.charAt(i)!="0" && something.charAt(i)!="."){
				flag=1;
			}
			if(flag==1){
				ret2=something.charAt(i) + ret2;
			}
			
		}
		
		
		return ret1 + ret2;
	}

	function getFormGroup(name) {
			return document.getElementsByName(name);
	}

	function getRadio(name) {
		elements = getFormGroup(name);
		if (elements)/* loop over all the radio buttons */
			for (i = 0; i < elements.length; i++)
				if (elements[i].checked)
					return elements[i];/* either no group by that name was foundor none were selected */
		return null;
	}

	function getRadioValue(name) {
		element = getRadio(name);
			if (element)
				return element.value;/* there must not have been a radio buttonselected */
		return null;
	}

	function clearRadio(name) {
		elements = getFormGroup(name);
		if (elements)
			for (i = 0; i < elements.length; i++)
				if (elements[i].checked)
					elements[i].checked=false;
	}
	function selectRadio(name,val){
		elements = getFormGroup(name);
		if (elements){
			for (i = 0; i < elements.length; i++){
				if (elements[i].value==val){
					elements[i].checked=true;
					break;
				}
			}
		}
	}

	function currency(something2,which){
		
		newstring="";
		flagStarted=0;
		flagDecimal=0;
		postDecimal=0;
		var something="" + something2;
		for(i=0;i<something.length;i++){
			if((flagStarted!=0 || something.charAt(i)!="0") && postDecimal < 2){
				if(flagDecimal==1){
					postDecimal++;
				}
				if(something.charAt(i)=="."){
					if(flagStarted==0){
						newstring += "0";
					}
					flagDecimal=1;
				}
				flagStarted=1;
				newstring += something.charAt(i);
			}
		}
		if(flagDecimal==0){
			newstring += ".00";
		}else{
			if(postDecimal==0){
				newstring += "00";
			}else if(postDecimal==1){
				newstring += "0";
			}
		}
		
		return newstring;
	}

	function isCreditCard(card) {
		len = card.length - 1;

		if ((len > 19) || (len < 0))
			return (false);

		weight = 2;
		card_sum = 0;

		for (i = len - 1;i >= 0 ;i = i - 1)
		{
			digit = card.substr(i,1) - 0;
			digit_sum = digit * weight;
			tens = Math.floor(digit_sum / 10);
			card_sum += tens + (digit_sum % 10);
			if(weight > 1) 
				weight = 1;
			else 
				weight = 2;		
		}
		result = (10 - card_sum % 10) % 10;

		if (result == card.substr(len,1))
			return true;
		else 
			return false;
	}

	//0 is numbers, 1 is letters, 2 is alpha numeric, 3 is alpha numeric with spaces
	function parseFix(something,type){

		curval=something.value;
		type=parseInt(type,10);
		if(type!=0 && type!=1 && type!=2 && type!=3){
			type=0;
		}		
		if(type==0){
			check="0123456789";
		}else if(type==1){
			check="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
		}else if(type==2){
			check="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
		}else if(type==3){
			check="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
		}else{
			check="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
		}

		newstring="";

		for(i=0;i<curval.length;i++){
			flag=0;
			for(j=0;j<check.length;j++){
				cur=curval.charAt(i);
				if(cur==check.substr(j,1)){
					flag=1;
				}
			}
			if(flag==1){
				newstring += "" + curval.charAt(i);
			}
		}

		something.value=newstring;
	}

	 var focused_fields=new Array();
	function clearFocused(which,type){
		for(x in focused_fields){
			if(x!=which){
				focused_fields[x]=0;
				document.getElementsByName(x).className=type;
			}
		}
	}
	 function forceFocused(which){
		var found=0;
		for(x in focused_fields){
			if(x==which){
				found=1;
			}
		}
		if(found==0){
			focused_fields[which]=0;
		}
	 }
	  function mouseOver2(field,type){
		  
	   field.className=type + '-hover';
	  
	 }
	 function mouseOut2(field,type){
	   field.className=type;
	 }
	 function mouseOver(field,type){
	   forceFocused(field.name);
	   if(focused_fields[field.name]!=1){
		field.className=type + '-hover';
	   }
	 }
	 function mouseOut(field,type){
	  forceFocused(field.name);
	   if(focused_fields[field.name]!=1){
		field.className=type;
	   } 
	 }
	 function mouseFocus(field,type){
	   forceFocused(field.name);
	   focused_fields[field.name]=1;
	   field.className=type + '-active';
	  // clearFocused(field.name,type);
	 }
	 function mouseBlur(field,type){
	   forceFocused(field.name);
	   focused_fields[field.name]=0;
	   field.className=type;
	 }

	var isNN = (navigator.appName.indexOf("Netscape")!=-1);
	var isIE = (navigator.appName.indexOf("Microsoft")!=-1);

	function autoTab(input,len, e) {
		if(isIE){
			len=len+1;
		}
		var keyCode = (isNN) ? e.which : e.keyCode; 
		var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];
		if(input.value.length >= len && !containsElement(filter,keyCode)) {
		input.value = input.value.slice(0, len);
		input.form[(getIndex(input)+1) % input.form.length].focus();
	}

	function containsElement(arr, ele) {
		var found = false, index = 0;
		while(!found && index < arr.length)
		if(arr[index] == ele)
		found = true;
		else
		index++;
		return found;
	}

	function getIndex(input) {
		var index = -1, i = 0, found = false;
		while (i < input.form.length && index == -1)
		if (input.form[i] == input)index = i;
		else i++;
		return index;
	}
	return true;
	}

	function check(e) {
		var key = window.event ? e.keyCode : e.which;
		var keychar = String.fromCharCode(key);
		
		if(key =="8" || key=="0"){ //allow delete key and arrows to pass through
		return true;
		}
		
		reg = /\d/;
		return reg.test(keychar);
	}

	function uberReplace(from,to,string){
		var strReplaceAll = string;
		var intIndexOfMatch = strReplaceAll.indexOf( from);
		while (intIndexOfMatch != -1){
			strReplaceAll = strReplaceAll.replace( from, to )
			intIndexOfMatch = strReplaceAll.indexOf( from );
		}
		return strReplaceAll;
	}

	function scrubFile(field){
		var temp=field.value;
		temp=uberReplace('"','',temp);
		temp=uberReplace('|','',temp);
		temp=uberReplace('?','',temp);
		temp=uberReplace('/','',temp);
		temp=uberReplace('\\','',temp);
		temp=uberReplace('*','',temp);
		temp=uberReplace(':','',temp);
		temp=uberReplace('<','',temp);
		temp=uberReplace('>','',temp);
		field.value=temp;
	}

	function moveStaff(which){
		var f=document.form1;
		var staff1=f["staff1[]"];
		var staff2=f["staff2[]"];

		var s1=new Array();
		var s2=new Array();
		if(which==1){
			for(x=0;x<staff1.options.length;x++){
				s1[staff1.options[x].value]=staff1.options[x].text;
			}
			for(x=0;x<staff2.options.length;x++){
				if(staff2.options[x].selected && staff2.options[x].value!=0){
					s1[staff2.options[x].value]=staff2.options[x].text;
				}else{
					s2[staff2.options[x].value]=staff2.options[x].text;
				}
			}
		}else{
			for(x=0;x<staff2.options.length;x++){
				s2[staff2.options[x].value]=staff2.options[x].text;
			}
			for(x=0;x<staff1.options.length;x++){
				if(staff1.options[x].selected && staff1.options[x].value!=0){
					s2[staff1.options[x].value]=staff1.options[x].text;
				}else{
					s1[staff1.options[x].value]=staff1.options[x].text;
				}
			}
		}
		s1=alphaMe(s1);
		s2=alphaMe(s2);
		
		fillSelect(staff1,s1);
		fillSelect(staff2,s2);
	}
	function fillSelect(select,values){
		select.options.length=0;
		i=0;
		for(x in values){
			select.options[i]=new Option(values[x],x);
			i++;
		}
	}
	function alphaMe(array){
		var r=new Array();
		var flag=0;
		for(x in array){
			flag=0;
			var temp=new Array();
			for(y in r){
				if(flag==0 && (array[x] < r[y] || x==0)){
					flag=1;
					temp[x]=array[x];
				}
				temp[y]=r[y];
			}
			if(flag==0){
				temp[x]=array[x];
			}
			r=new Array();
			r=temp;
		}
		return r;
	}

	function selectAll(which,how){
		for(x=0;x<which.options.length;x++){
			which.options[x].selected=how;
		}
	}

	function base64_encode( data ) {
		// http://kevin.vanzonneveld.net
		// +   original by: Tyler Akins (http://rumkin.com)
		// +   improved by: Bayron Guevara
		// +   improved by: Thunder.m
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
		// -    depends on: utf8_encode
		// *     example 1: base64_encode('Kevin van Zonneveld');
		// *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
	 
		// mozilla has this native
		// - but breaks in 2.0.0.12!
		//if (typeof window['atob'] == 'function') {
		//    return atob(data);
		//}
			
		var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
		var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, enc="", tmp_arr = [];
		data = utf8_encode(data);
		
		do { // pack three octets into four hexets
			o1 = data.charCodeAt(i++);
			o2 = data.charCodeAt(i++);
			o3 = data.charCodeAt(i++);
	 
			bits = o1<<16 | o2<<8 | o3;
	 
			h1 = bits>>18 & 0x3f;
			h2 = bits>>12 & 0x3f;
			h3 = bits>>6 & 0x3f;
			h4 = bits & 0x3f;
	 
			// use hexets to index into b64, and append result to encoded string
			tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
		} while (i < data.length);
		
		enc = tmp_arr.join('');
		
		switch( data.length % 3 ){
			case 1:
				enc = enc.slice(0, -2) + '==';
			break;
			case 2:
				enc = enc.slice(0, -1) + '=';
			break;
		}
	 
		return enc;
	}

	function utf8_encode ( string ) {
		// http://kevin.vanzonneveld.net
		// +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: sowberry
		// +    tweaked by: Jack
		// +   bugfixed by: Onno Marsman
		// +   improved by: Yves Sucaet
		// +   bugfixed by: Onno Marsman
		// *     example 1: utf8_encode('Kevin van Zonneveld');
		// *     returns 1: 'Kevin van Zonneveld'
	 
		string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
	 
		var utftext = "";
		var start, end;
		var stringl = 0;
	 
		start = end = 0;
		stringl = string.length;
		for (var n = 0; n < stringl; n++) {
			var c1 = string.charCodeAt(n);
			var enc = null;
	 
			if (c1 < 128) {
				end++;
			} else if((c1 > 127) && (c1 < 2048)) {
				enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
			} else {
				enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
			}
			if (enc != null) {
				if (end > start) {
					utftext += string.substring(start, end);
				}
				utftext += enc;
				start = end = n+1;
			}
		}
	 
		if (end > start) {
			utftext += string.substring(start, string.length);
		}
	 
		return utftext;
	}

	function base64_decode( data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Thunder.m
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // -    depends on: utf8_decode
    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
    // *     returns 1: 'Kevin van Zonneveld'
 
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['btoa'] == 'function') {
    //    return btoa(data);
    //}
 
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, dec = "", tmp_arr = [];
 
    data += '';
 
    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = utf8_decode(dec);
 
    return dec;
}

function utf8_decode ( str_data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    var tmp_arr = [], i = ac = c1 = c2 = c3 = 0;
 
    str_data += '';
 
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
}

	
