var Fse; if (!Fse) Fse = {};

if( !Fse.Ajax ) Fse.Ajax = {};

// requies SpryData.js and SpryUtil.js
Fse.Ajax.sendForm = function ( oForm, oOpts ) {
    
    var oRequest = {};
    
    if( ! oOpts ) {
        oOpts = {};        
    }
    
    if( ! oOpts.headers ) {
        oOpts.headers = {};
    }
    oOpts.headers.fseAjax = "true";

	if (!oForm)
		return oRequest;

	if ( typeof oForm == 'string' )
		oForm = $(oForm) || document.forms[oForm];

	var oFrmOpts = {};
	oFrmOpts.method = oForm.method;
	oFrmOpts.url = oForm.action || document.location.href;
	oFrmOpts.enctype = oForm.enctype;

	Spry.Utils.setOptions(oFrmOpts, oOpts);

	var submitData = Spry.Utils.extractParamsFromForm(oForm, oFrmOpts.elements);
	if (oFrmOpts.additionalData)
		submitData += "&" + oFrmOpts.additionalData;

	if (oFrmOpts.enctype.toLowerCase() != 'multipart/form-data')
	{
		// Ajax submission of a form doesn't work for multipart/form-data!
		oFrmOpts.method = (oFrmOpts.method.toLowerCase() == "post") ? 'POST' : 'GET';
		if (oFrmOpts.method == "GET")
		{
			// Data will be submitted in the url.
			if (oFrmOpts.url.indexOf('?') == -1)
				oFrmOpts.url += '?';
			else
				oFrmOpts.url += '&';
			oFrmOpts.url += submitData;
		}
		else
		{
			// Send Content-Type header.
			if (!oFrmOpts.headers) oFrmOpts.headers = {};
			if (!oFrmOpts.headers['Content-Type'] || oFrmOpts.headers['Content-Type'].indexOf("application/x-www-form-urlencoded") ==-1 )
				oFrmOpts.headers['Content-Type'] = 'application/x-www-form-urlencoded';

			// Set the postData
			oFrmOpts.postData = submitData;
		}

        // false to make a synchronous call, null no callback
        var oSpryRequest = Spry.Utils.loadURL(oFrmOpts.method, oFrmOpts.url, false, null, oFrmOpts);
        if( oSpryRequest ) {
            oRequest = oSpryRequest.xhRequest;
        }
	}

	// Native submission when 'multipart/form-data' is used.
	return oRequest;
};

Fse.Ajax.get = function( sHref ) {
    top.location.replace( sHref );
    /*
    alert( "Getting " + sHref );
    // false to make a synchronous call, null no callback
    var oFrmOpts = {};
    oFrmOpts.method="GET";
    oFrmOpts.url = sHref;
    var oSpryRequest = Spry.Utils.loadURL(oFrmOpts.method, oFrmOpts.url, false, null, oFrmOpts);
    if( oSpryRequest ) {
        document.documentElement.innerHTML = oSpryRequest.xhRequest.responseText;
    }*/
};


Fse.Ajax.getURL = function( sURL, fnCallback, oOptions ) {
   var oSpryOptions = {};
   oSpryOptions.headers = {};
   oSpryOptions.headers.fseAjax = "true";
   if( oOptions ) {
       for( var sProperty in oOptions ) {
            oSpryOptions.headers[sProperty] = oOptions[sProperty];           
       }       
   }
   Spry.Utils.loadURL( "GET", sURL, true, fnCallback, oSpryOptions );    
};

Fse.Ajax.buildQueryString = function( sBaseQueryString, sTunnelQueryString, sTunnelParameter ) {
	return sBaseQueryString + "&" + sTunnelParameter + "=" + Fse.Ajax.Base64.encode( sTunnelQueryString );
};

Fse.Ajax.updateContent = function( sURL, sContentSocketId, oOptions, fnPostLoad ) {
    var fnCallback = function( oRequest ) {
        Spry.Utils.setInnerHTML( sContentSocketId, oRequest.xhRequest.responseText );
        if( fnPostLoad ) {
        	fnPostLoad( document.getElementById( sContentSocketId ));
        }
    };
    Fse.Ajax.getURL( sURL, fnCallback, oOptions );
};

Fse.Ajax.Base64 = {};

Fse.Ajax.Base64._keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

Fse.Ajax.Base64.encode = function( input ) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Fse.Ajax.Base64._utf8_encode(input);

        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 = output +
            Fse.Ajax.Base64._keyStr.charAt(enc1) + Fse.Ajax.Base64._keyStr.charAt(enc2) +
            Fse.Ajax.Base64._keyStr.charAt(enc3) + Fse.Ajax.Base64._keyStr.charAt(enc4);

        }

        return output;
    };
    
Fse.Ajax.Base64.decode = function ( input ) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = Fse.Ajax.Base64._keyStr.indexOf(input.charAt(i++));
            enc2 = Fse.Ajax.Base64._keyStr.indexOf(input.charAt(i++));
            enc3 = Fse.Ajax.Base64._keyStr.indexOf(input.charAt(i++));
            enc4 = Fse.Ajax.Base64._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);
            }

        }

        output = Fse.Ajax.Base64._utf8_decode(output);

        return output;

    };

Fse.Ajax.Base64._utf8_encode = function( string ) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };
    
Fse.Ajax.Base64._utf8_decode = function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    };
	
	

	

    
