
function r( t, u, v  ) {
 return String.fromCharCode( ( ( t - u + v ) % ( v * 2 ) ) + u );
}

function rr( s ) {
 var b = [], c, i = s.length,
  a = 'a'.charCodeAt(), z = a + 26,
  A = 'A'.charCodeAt(), Z = A + 26;
 while(i--) {
  c = s.charCodeAt( i );
  if( c>=a && c<z ) { b[i] = r( c, a, 13 ); }
  else if( c>=A && c<Z ) { b[i] = r( c, A, 13 ); }
  else { b[i] = s.charAt( i ); }
 }
 return b.join( '' );
}

var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf(" chrome/") >= 0 || ua.indexOf(" firefox/") >= 0 || ua.indexOf(' gecko/') >= 0) {
	var StringMaker = function () {
		this.str = "";
		this.length = 0;
		this.append = function (s) {
			this.str += s;
			this.length += s.length;
		}
		this.prepend = function (s) {
			this.str = s + this.str;
			this.length += s.length;
		}
		this.toString = function () {
			return this.str;
		}
	}
} else {
	var StringMaker = function () {
		this.parts = [];
		this.length = 0;
		this.append = function (s) {
			this.parts.push(s);
			this.length += s.length;
		}
		this.prepend = function (s) {
			this.parts.unshift(s);
			this.length += s.length;
		}
		this.toString = function () {
			return this.parts.join('');
		}
	}
}

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function e(input) {
	var output = new StringMaker();
	var chr1, chr2, chr3;
	var enc1, enc2, enc3, enc4;
	var i = 0;

	while (i < input.length) {
		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.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4));
   }
   
   return output.toString();
}

function d(input) {
	var output = new StringMaker();
	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, "");

	while (i < input.length) {
		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.append(String.fromCharCode(chr1));

		if (enc3 != 64) {
			output.append(String.fromCharCode(chr2));
		}
		if (enc4 != 64) {
			output.append(String.fromCharCode(chr3));
		}
	}

	return output.toString();
}

function s(mode, url, args, async, callback_success, callback_failed, cArgs, respType, timeout)
{
    // create object
    var httpRequest = false;
    if ( window.XMLHttpRequest ) { // mozilla, safari, opera, chrome, ie7
        httpRequest = new XMLHttpRequest();
    } else if ( window.ActiveXObject ) { // ie, avant, aol explorer
        try { httpRequest = new ActiveXObject("Msxml2.XMLHTTP") } // ie6
        catch (e) {
            try { httpRequest = new ActiveXObject("Microsoft.XMLHTTP") } // ie5
            catch(e) {
                httpRequest = false;
            }
        }
    }
    // object creation fail?
    if ( ! httpRequest ) {
        if(callback_failed != null)
        {
        	  response = "Remote request failed: status code -2";
            cArgs != null ?  callback_failed(response, cArgs) :  callback_failed(response);
        }
        return false;
    }

    // if GET with arguments append query string to url
    if ( mode == 'GET' && args.length ) url += '?' + args;

    // establish connection
    httpRequest.open(mode, url, async);

    // boolean timedOut; start out true
    // the response handler sets to false on success
    var timedOut = true;

    // create a timer to check the value of timedOut in (timeout) seconds;
    // if timedOut is true, abort the request and clean up
    setTimeout( function() {
        // timedOut true?
        if (timedOut) {
            httpRequest.abort(); // abort request
            //response = "Error: ajax request timed out";
        	//cArgs != null ?  callback_failed(response, cArgs) :  callback_failed(response);
        }
        // nullify httpRequest
        httpRequest = null;
    }, timeout * 1000 );
 

    // if POST, set necessary request headers
    if ( mode == 'POST' ) {
        httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        httpRequest.setRequestHeader('Content-Length', args.length);
    }

    // assign callback method via anonymous function
    httpRequest.onreadystatechange = function() {
        try {
            // response ready?
            if ( httpRequest.readyState == 4 ) {
                // request successful?
                if ( httpRequest.status == 200 ) {
                    // set timedOut to false
                    timedOut = false;
                    // set response
                    var response = respType == 'text' ?  httpRequest.responseText :  httpRequest.responseXML;

                    // pass to callback method
						        if(callback_success != null)
						        {
                    	cArgs != null ?  callback_success(response, cArgs) :  callback_success(response);
                    }
                }
                else{
                	if(!bSubmited) { 
							        if(callback_failed != null)
							        {
		                    response = "Remote request failed: status code " + httpRequest.status;
		                   	cArgs != null ?  callback_failed(response, cArgs) :  callback_failed(response);
		                  }
                   	}
                }
            }
        } catch(e) {
	        if(callback_failed != null)
	        {
	        	response = "Remote request failed: status code -1";
	        	cArgs != null ?  callback_failed(response, cArgs) :  callback_failed(response);
	        }
        }
    };

    // send request
    httpRequest.send(args);
}
