// Base 64

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}


function decode64(input) {
	alert("start");
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);


	alert("end");
   return output;
}

//---------------------------------------------------------
// YkeJsoap : JavaScript WebService Bridge



function YkeJsoap(wsdl, method, params, callback, debugEvent, bridgeurl)
{
	if(bridgeurl == null)
	{
		bridgeurl = JSWSB_URL;
	}

	var proxy = null ;
	var uploadSize = null;
	var downloadSize = null;
	var gzipCompression = false;
	var uncompressedResponseSize = null;
	var startDT = null;
	var endDT = null;
	
	this.Resp = _resp;
	function _resp(e)
	{
	
		
		
		var headers = e.getAllResponseHeaders();
		var headersLines = headers.split('\n');
		for(var hi=0; hi<headersLines.length; hi++)
		{
			if (headersLines[hi].toLowerCase().indexOf('content-length:') > -1)
			{
				downloadSize = (headersLines[hi].substring(16)*1);
			}
			if (headersLines[hi].toLowerCase().indexOf('content-encoding') > -1)
			{
				gzipCompression = true;
			}
		}
		
		
		if(downloadSize == null) downloadSize = e.responseText.length;
		uncompressedResponseSize = e.responseText.length;

	
		if(debugEvent != null) debugEvent(e.responseText);
		
		var success = false;
		var exception = null;
		var retobj = null;
			
		try{
			var oJson = e.responseText; // decode64(e.responseText);
			
			retobj = eval('(' + oJson + ')');
			
			success = true;
		}
		catch(ex)
		{
			success = false;
			exception = ex + "\r\n\r\nWebService Bridge Return :\r\n"  + e.responseText;
		}
		
		endDT = new Date();
		
		var msDuration = endDT.getTime() - startDT.getTime();
		
		var info = {uploadSize: uploadSize, downloadSize:downloadSize, durationMs: msDuration, gzipCompression: gzipCompression, uncompressedResponseSize:uncompressedResponseSize};
		
		callback(retobj, success, exception, info);
	}

	this.go = _go;
	function _go()
	{

		
		var pars = "wsdl=" + wsdl;
		pars += "&method=" + method;
		
		
		if(params != null)
		{
			
			var jsonArgs = params.toJSONString();	
			pars += "&params=" + encode64(jsonArgs);
		}
		
		uploadSize = pars.length;
		startDT = new Date();
		
	
		proxy = new Ajax.Request(
			bridgeurl, 
			{
				method: 'post', 
				parameters: pars, 
				onComplete: this.Resp
			});

			
	}
}
//---------------------------------------------------------
