var loadImage = '
';
var charsetGlobal = '';
function returnIps(args)
{
var url = '';
url = 'http://crs.mashangding.cn:7100/ibe/pay4ips/return_url.jsp?';
url = url + args;
//alert(url);
$("#show").html(loadImage);
$.getScript(url, function() {
$("#show").html(data);
});
}
function returnUpop(args)
{
var url = '';
url = 'http://crs.mashangding.cn:7100/ibe/pay4upop/return_url.jsp?';
url = url + args;
//alert(url);
$("#show").html(loadImage);
$.getScript(url, function() {
$("#show").html(data);
});
}
function returnPay(args)
{
var url = '';
url = 'http://crs.mashangding.cn:7100/ibe/payment/return_url.jsp?';
url = url + args;
//alert(url);
$("#show").html(loadImage);
$.getScript(url, function() {
$("#show").html(data);
});
}
function frontSearch(args)
{
document.booking.arrivalDate.value = getArgs(args, 'arrivalDate');
document.booking.outDate.value = getArgs(args, 'outDate');
document.booking.roomNum.value = getArgs(args, 'roomNum');
document.booking.adults.value = getArgs(args, 'adults');
var url = '';
url = 'http://crs.mashangding.cn:7100/ibe/FrontCommandServlet?command=FrontReservationServlet&operator=search&hotelId='+document.booking.hotelId.value + '&charset=""' + '&language=lang_cn' + '&';
url = url + args;
$("#show").html(loadImage);
$.getScript(url, function() {
$("#show").html(data);
});
}
function search() // Step 1
{
if(checkSearch())
{
var url = '';
url = 'http://crs.mashangding.cn:7100/ibe/FrontCommandServlet?command=FrontReservationServlet&operator=search&b=' + document.booking.button2.value;;
url = url + '&arrivalDate=' + document.booking.arrivalDate.value + '&outDate=' + document.booking.outDate.value;
url = url + '&adults=' + document.booking.adults.value + '&children=' + document.booking.children.value;
url = url + '&roomNum='+document.booking.roomNum.value+'&hotelId='+document.booking.hotelId.value + '&language=lang_cn';
var charset = '';
if(charset == null || charset.trim() == ''){
charset = $("#charset").val();
}
charsetGlobal = charset;
url = url + '&charset='+charset;
//alert(url);
$("#show").html(loadImage);
document.booking.url.value = url;
$.getScript(url, function() {
$("#show").html(data);
});
}
}
function doBooking(a,b,c,d,e,f,g,h,i,j) //Step 2
{
var urlBooking = '';
urlBooking = 'http://crs.mashangding.cn:7100/ibe/FrontPageServlet?page=7029&PID=001006&menuID=001006004';
urlBooking = urlBooking + '&arrivalDate='+d+'&outDate='+e+'&children=0&roomNum='+f+'&hotelId=' + a;
urlBooking = urlBooking + '&rateCode='+b+'&rmType='+c+'&arrDate='+d+'&depDate='+e+'&rmQty='+f+'&nights=' + g;
urlBooking = urlBooking + '&adults='+h+'&rmRate='+i+'&fullRate=' + j + '&charset=""';
//alert(urlBooking);
$("#show").html(loadImage);
document.booking.url.value = urlBooking;
$.getScript(urlBooking, function() {
$("#show").html(data);
});
}
function addOrder() {
if(checkAddFrom())
{
var addOrder = '';
addOrder = 'http://crs.mashangding.cn:7100/ibe/FrontCommandServlet?command=FrontReservationServlet&operator=add&advancePayment='+$('#advancePayment').val();
addOrder = addOrder + '&arrivalDate='+$('#arrivalDate').val()+'&outDate='+$('#outDate').val();
addOrder = addOrder + '&adults='+$('#adults').val()+'&children='+$('#children').val();
addOrder = addOrder + '&roomNum='+$('#roomNum').val()+'&hotelId='+$('#hotelId').val();
addOrder = addOrder + '&rmType='+$('#rmType').val()+'&rateCode='+$('#rateCode').val();
addOrder = addOrder + '&rmRate='+$('#rmRate').val()+ '&nights='+$('#nights').val();
addOrder = addOrder + '&gstName='+(encodeURI(encodeURI($('#gstName').val())))+ '&rmQty='+$('#rmQty').val();
addOrder = addOrder + '&booktel='+$('#booktel').val()+ '&email='+$('#email').val();
addOrder = addOrder + '&payCenter='+$('#payCenter').val() + '&userIP=';
addOrder = addOrder + '&webHost='+window.location.host+ '&sms='+$('#sms').attr('checked');
addOrder = addOrder + '&arrivalTime='+$('#arrivalTime').val()+ '&specials='+encodeURI(encodeURI($('#specials').val())) + '&charset='+charsetGlobal;
if($('#mail').attr('checked')) addOrder = addOrder + '&mail='+$('#mail').val();
//alert(addOrder);
//document.write(addOrder);
$("#show").html(loadImage);
document.booking.url.value = addOrder;
$.getScript(addOrder, function() {
//alert(data);
$("#show").html(data + '');
});
}
}
function initModifyOrder()
{
var initModifyOrder = 'http://crs.mashangding.cn:7100/ibe/FrontPageServlet?page=7028&PID=001007&menuID=001007002';
//alert(initModifyOrder);
$("#show").html(loadImage);
document.booking.url.value = initModifyOrder;
$.getScript(initModifyOrder, function() {
$("#show").html(data);
});
}
function guestLogin() {
// ?????ì?é
if (document.frmMain.accId.value == "") {
alert("请输入 确认号码:");
document.frmMain.accId.focus();
return false;
}
if (document.frmMain.emailOrTel.value == "") {
alert("请输入 邮箱或电话:");
document.frmMain.emailOrTel.focus();
return false;
}
modifyOrder = 'http://crs.mashangding.cn:7100/ibe/FrontPageServlet?page=7026&PID=001006&menuID=001006004';
modifyOrder = modifyOrder + '&accId=' + document.frmMain.accId.value + '&emailOrTel=' + document.frmMain.emailOrTel.value;
//alert(modifyOrder);
$("#show").html(loadImage);
$.getScript(modifyOrder, function() {
$("#show").html(data);
});
}
function editbutton_onclick()
{
editOrder = 'http://crs.mashangding.cn:7100/ibe/FrontPageServlet?page=7027&PID=001006&menuID=001006004&resid=' + document.frmMain.resId.value;
$("#show").html(loadImage);
$.getScript(editOrder, function() {
$("#show").html(data);
});
}
function cancelbutton_onclick()
{
if (confirm("您真的要取消该预订单吗?"))
{
cancelOrder='http://crs.mashangding.cn:7100/ibe/FrontCommandServlet?command=FrontReservationServlet&operator=cancel&PID=001006&menuID=001006004&resId=' + document.frmMain.resId.value;
//alert(cancelOrder);
$("#show").html(loadImage);
$.getScript(cancelOrder, function() {
$("#show").html(data);
});
}
return false;
}
function okbutton_onclick()
{
updateOrder='http://crs.mashangding.cn:7100/ibe/FrontCommandServlet?command=FrontReservationServlet&PID=001006&menuID=001006004';
updateOrder = updateOrder + '&resId=' + document.frmMain.resId.value+ '&booktel=' + document.frmMain.booktel.value+ '&booker=' + document.frmMain.booker.value;
updateOrder = updateOrder + '&operator=modify&email=' + document.frmMain.email.value + '&specials=' + document.frmMain.specials.value;
//alert(updateOrder);
$("#show").html(loadImage);
$.getScript(updateOrder, function() {
$("#show").html(data);
});
}
function IsEmpty(s) { // ?ì??×?·?????·?????
var theInput=s
var theLength=theInput.length
if (theInput=="") return true
for (var i=0; i iInputMaxLength) {
alert(disName + '输入过长!最大长度限定为 :' + iInputMaxLength + '当前长度为 : ' + iInputValueLength);
inputs[i].focus();
return (false);
}
}
//?ì?é°ü?¨????×?·?????×????¤????·?????
var iInputMinLength = inputs[i].getAttribute("minlength");
var iInputValueMinLength = checkUnicodeStrLength(inputs[i].value);
if (iInputMinLength != null && iInputValueMinLength < iInputMinLength) {
alert(disName + '输入字符过短!最低长度限定为 :' + iInputMinLength + '当前长度为 : ' + iInputValueMinLength);
inputs[i].focus();
return (false);
}
var iInputSameValueName=inputs[i].getAttribute("samevalue");
if (iInputSameValueName!=null) {
//var sameValue=document.getElementById(iInputSameValueName).value+"";
//var sameName=document.getElementById(iInputSameValueName).getAttribute("DISNAME");
var sameValue=inputs[i].value+"";
var sameName=inputs[i].getAttribute("DISNAME");
if(sameName == null){
sameName = iInputSameValueName;
}
if (inputs[i].value!=sameValue.trim()) {
alert(disName+' , '+sameName+'两者的值必须相等!');
inputs[i].focus();
return false;
}
}
dataType = inputs[i].getAttribute("DATATYPE"); //?????????à??
require = inputs[i].getAttribute("REQUIRE"); //????????·???±???????
if(dataType!=null){
if(dataType == 'number'){
if(isInteger(inputs[i].value) == false || inputs[i].value.trim() ==''){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//??????·???·?????
if(eval(inputs[i].value) < 0){
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'numberspecial'){
if(inputs[i].value == "*****"){
return true;
}
if(inputs[i].value == "#####"){
return true;
}
if(isInteger(inputs[i].value) == false || inputs[i].value.trim()==''){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//??????·???·?????
if(eval(inputs[i].value) < 0){
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
return(false);
}
} else if(dataType == 'numberspecial1'){
if(inputs[i].value == "*****"){
return true;
}
if(isInteger(inputs[i].value) == false||inputs[i].value.trim()==''){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//??????·???·?????
if(eval(inputs[i].value) < 0){
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
return(false);
}
} else if(dataType == 'num' && inputs[i].value!=''){
if(isInteger(inputs[i].value) == false){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//??????·???·?????
if(eval(inputs[i].value) < 0){
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
return(false);
}
}else if(dataType == 'number_null' && inputs[i].value!=''){
if(isInteger(inputs[i].value) == false){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//??????·???·?????
if(eval(inputs[i].value) < 0){
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
return(false);
}
}else if(dataType == 'deganumber'){
if(isInteger(inputs[i].value) == false||inputs[i].value.trim()==''){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'float' || dataType == 'degafloat' || dataType == 'float_null'){
var inputValue = inputs[i].value.trim();
// ???í???????????????????ù×????????? DATACANNULL = "yes"
// added by dgs in 2005-02-25
if (dataType == 'float_null' && inputValue == "") {
continue;
}
if(isNaN(inputValue)|| inputValue == ''){
alert(disName + ' 必须为数字 - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
if (dataType == 'degafloat' && parseFloat(inputValue) < 0) {
alert(disName + '必须为非负-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
// ?ì?é????????
var prec = inputs[i].getAttribute("PRECISE");
if (prec != null) { // ??±????ì??????
var nDotPos = inputValue.indexOf('.'); // ????????????
if (nDotPos != -1) {
if (inputValue.length - nDotPos - 1 > prec) { // ???????????à
alert(disName + "小数位数过多! 只能" + prec + "位.");
inputs[i].focus();
return false;
}
}
}
//???????í??×??ó????×?????
var minValue = inputs[i].getAttribute("MINVALUE");
var maxValue = inputs[i].getAttribute("MAXVALUE");
var t_value = parseFloat(inputValue);
//?ì?é×?????
if(minValue != null){
if(t_value < eval(minValue)){
alert(disName + '必须大于等于' + minValue + '-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}
if(maxValue != null){
if(t_value > eval(maxValue)){
alert(disName + ' 必须小于等于 ' + maxValue + '- 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}
}else if(dataType == 'not null'){
if(inputs[i].value.trim() == ''){
alert(disName + ' 不能为空值');
inputs[i].focus();
return(false);
}
}else if(dataType == 'indentifier'){
if(inputs[i].value.trim() == ''){
alert(disName + ' 不能为空值');
inputs[i].focus();
return(false);
}
if(isLetter(inputs[i].value) == false){
alert(disName + ' 只能包括字母,数字,下划线.');
inputs[i].focus();
return(false);
}
}else if(dataType == 'indentifierNull'){
if(isLetter(inputs[i].value) == false){
alert(disName + ' 只能包括字母,数字,下划线.');
inputs[i].focus();
return(false);
}
}else if(dataType == 'datetype'){
if(isDate(inputs[i].value) == false){
alert(disName + ' 必须为日期类型(yyyy-mm-dd) - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'timetype'){
if(isTime(inputs[i].value) == false){
alert(disName + ' 必须为时间类型(hh:mm,hh:mm:ss) - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'iptype'){
if(ipCheck(inputs[i].value) == false){
alert(disName + ' 必须为IP类型(0.0.0.0, 255.255.255.255) - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'emailtype'){ //added by ????ì? 2005-3-1
if( (inputs[i].value.trim() == '') || checkEmail(inputs[i].value) == false ){
alert(disName + ' 必须为电子邮件格式 - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'telephonetype'){ //added by ????ì? 2005-2-29, modify by AJ.Lau
if( (inputs[i].value.trim() == '') || (telCheck(inputs[i].value) == false)){
if(require == 'false')
{
return(true);
}
alert(disName + ' 必须为电话号码 - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
else
{
var testReg = false;
var telValue = inputs[i].value.trim();
var reg = /^(([0-9]{3,4})|[0-9]{3,4}-)?[0-9]{7,8}$/;
if(reg.test(telValue))
{
testReg = true;
return true;
}
alert(disName + ' 必须为带区号的电话号码,例如:13688888888; - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}else if(dataType == 'MINMAXNUMBER'){ //?è????×??ó×???????????
if(isInteger(inputs[i].value) == false){
alert(disName + '必须为整数-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
//???????í??×??ó????×?????
var minValue = inputs[i].getAttribute("MINVALUE");
var maxValue = inputs[i].getAttribute("MAXVALUE");
var t_value = eval(inputs[i].value);
//?ì?é×?????
if(minValue != null){
if(t_value < eval(minValue)){
alert(disName + '必须大于等于' + minValue + '-现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}
if(maxValue != null){
if(t_value > eval(maxValue)){
alert(disName + ' 必须小于等于' + maxValue + ' - 现在的值为:' + inputs[i].value);
inputs[i].focus();
return(false);
}
}
}
} // end if
} // end for
//var textareas = document.all.tags('textarea');
var textareas = document.getElementsByTagName("textarea");
// ±é?ú?ù????textarea
for (var i = 0; i < textareas.length; i ++) {
//????×???±???????????×??ì?é
if(textareas[i].style.visibility == "hidden") continue;
//???§×????????ì?é
if(textareas[i].disabled) continue;
disName = textareas[i].getAttribute("DISNAME");
if(disName == null){ disName = textareas[i].name; }
var dtype = textareas[i].getAttribute("datatype");
if(dtype!=null){
if(dtype == 'not null'){
if(textareas[i].value.trim() == ''){
alert(disName + ' 不能为空值');
textareas[i].focus();
return(false);
}
}
}
//?ì?é°ü?¨????×?·?????×??ó?¤????·?????
var iInputMaxLength = textareas[i].getAttribute("maxlength");
var iInputValueLength = checkUnicodeStrLength(textareas[i].value);
if (iInputMaxLength != null && iInputValueLength > iInputMaxLength) {
alert(disName + '输入过长!最大长度限定为 : ' + iInputMaxLength + ' 当前长度为 : ' + iInputValueLength);
textareas[i].focus();
return (false);
}
}
//var selects = document.all.tags('select');
var selects = document.getElementsByTagName("select");
//±é?ú?ù????select
for(var i=0;i 0 && strNum.length > len) { // ?¤?????¤
if (bShowMsg) { alert(strName + "数字长度超出限定位数!"); }
return false;
}
if (prec == -1) { return true; }
var nDotPos = strNum.indexOf('.'); // ????????????
if (nDotPos == -1) { return true; }
if (strNum.length - nDotPos - 1 > prec) { // ???????????à
if (bShowMsg) { alert(strName + "小数位数过多! 只能 " + prec + " 位. "); }
return false;
}
return true;
}
// ?ì?é?à??????????????????????????·???????????????,·???????????????·???null
function checkDeleteByMul(checkboxName)
{
var nSum = getNumOfSelectedCheckbox(checkboxName);
if (nSum == 0) {
alert("还没选择要删除的记录!");
return null;
}
if (confirm("确定要删除 " + nSum + " 条记录吗?") == false) {
return null;
}
return getSelectedCheckboxValueList(checkboxName);
}
// ????°??ú?????°????·?·¨
// ?????????????à???·??
function popupHelpByFile(filename)
{
var features = "left=500,top=50,width=500,height=600,"
+ "directories=no,toolbar=no,status=no,menubar=no,location=no,scrollbars=auto,resizable=no";
if (true) {
filename = "nohelp.htm";
}
var path = "/ibe/help/lang_cn/";
top.open(path + filename, "help_window", features);
}
function IsInteger(s) { // ?ì????·?????·¨??????
var theInput=s
var theLength=theInput.length
if (theLength==0) return false
for (var i=0; i"9") return false
}
return true
}
var ccErrorNo = 0;
var ccErrors = new Array ()
ccErrors [0] = "未识别的信用卡种类";
ccErrors [1] = "没有输入信用卡号";
ccErrors [2] = "信用卡号格式不正确";
ccErrors [3] = "不是有效的信用卡号";
ccErrors [4] = "信用卡号长度不正确";
// ???÷?·?¨°???
function checkAddFrom()
{
document.all("btnOK").disabled=true;
// ?ì?é??·?????
if (PublicCheck() == false) {
document.all("btnOK").disabled=false;
return false;
}
if (!checkEmail($('#email').val())) {
alert("邮箱格式不正确");
document.all("btnOK").disabled=false;
return false;
}
//if(document.frmMain.ageree.checked!=true) {
//if($('#ageree').attr('checked')!=true) {
if(document.getElementById('ageree').checked!=true) {
alert("您必须同意预订条款与条件并确认您已超过 18 周岁,然后才能确定此预订。");
document.all("btnOK").disabled=false;
return false;
}
return true;
}
function checkDayNum() {
if (!IsInteger(document.frmMain.nights.value)) {
alert("住店天数必须为大于零的整数!");
document.frmMain.nights.focus();
document.frmMain.nights.select();
return false;
}
if (parseInt(document.frmMain.nights.value)<=0) {
alert("住店天数必须为大于零的整数!");
document.frmMain.nights.value="";
document.frmMain.nights.focus();
return false;
}
document.frmMain.outDate.value=addDate('4',document.frmMain.nights.value,document.frmMain.arrivalDate.value);
return true;
}
function addDate(type,NumDay,dtDate){
dtDate=dtDate+" 12:00:00.0";
dtDate=dtDate.substring(0,dtDate.lastIndexOf(".")).replace(/-/g,"/");
var date = new Date(dtDate);
type = parseInt(type); //?à??
lIntval = parseInt(NumDay); //????
switch(type){
case 6 ://?ê
date.setYear(date.getYear() + lIntval)
break;
case 7 ://????
date.setMonth(date.getMonth() + (lIntval * 3) )
break;
case 5 ://??
date.setMonth(date.getMonth() + lIntval)
break;
case 4 ://?ì
date.setDate(date.getDate() + lIntval)
break
case 3 ://?±
date.setHours(date.getHours() + lIntval)
break
case 2 ://·?
date.setMinutes(date.getMinutes() + lIntval)
break
case 1 ://??
date.setSeconds(date.getSeconds() + lIntval)
break;
default:
}
return date.getYear() + "-" + ((date.getMonth()+1).toString().length==2 ? date.getMonth()+1 : "0"+(date.getMonth()+1)) + "-" +(date.getDate().toString().length==2 ? date.getDate() : "0"+(date.getDate()));
// return date.getYear() + - + (date.getMonth()+1) + - +date.getDate()+ + date.getHours()+ : +date.getMinutes()+ : +date.getSeconds()
}
function setCheckInDate(d) {
document.getElementById("arrivalDate").value=d;
if(document.getElementById("outDate").value.length==0) {
showCalendar('dImg1',false,'outDate','arrivalDate','setDayNum');
} else {
datediff('1',d);
}
}
function setDayNum(d) {
document.getElementById("outDate").value=d;
datediff('2',d)
}
function datediff(str,dtDate) {
if (str=="1") {
document.frmMain.outDate.value=addDate('4',document.frmMain.nights.value,dtDate);
} else {
if (stringToDate(document.frmMain.outDate.value,true)<=stringToDate(document.frmMain.arrivalDate.value,true)) {
alert("离店时间不能早于或等于抵店时间!");
document.frmMain.outDate.focus();
document.frmMain.outDate.value="";
showCalendar('dImg2',false,'outDate','arrivalDate','setDayNum');
return false;
}
}
var strDate1 = document.frmMain.arrivalDate.value+" 12:00:00.0";
var strDate2 = document.frmMain.outDate.value+" 12:00:00.0";
strDate1=strDate1.substring(0,strDate1.lastIndexOf(".")).replace(/-/g,"/");
strDate2=strDate2.substring(0,strDate2.lastIndexOf(".")).replace(/-/g,"/");
var date1 = Date.parse(strDate1);
var date2 = Date.parse(strDate2);
document.frmMain.nights.value=Math.ceil((date2-date1)/(24*60*60*1000));
}
function printPreview()
{
var newWin;
newWin=window.open("about:blank", "newWin", "width=800,height=600,top=0, left=0, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, status=no");
var printOut;
printOut="";
printOut=printOut + "";
printOut=printOut + data;
printOut=printOut + "
";
newWin.document.write(printOut);
newWin.document.location.reload();
}
function getArgs(sHref, sArgName)
{
args = sHref.split("&");
for(var i = 0; i < args.length; i ++)
{
str = args[i];
var arg = str.split("=");
if(arg.length <= 1) continue;
if(arg[0] == sArgName) retval = arg[1];
}
return retval;
}
function base64encode(str){
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while (i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if (i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if (i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
}