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 sWaitMessage = oForm.getAttribute( "fse:waitmessage" );
        if( ! sWaitMessage ) {
        	if( oFrmOpts.method == "GET" ) {
	        	sWaitMessage = "Loading, please wait...";
        	} else {
        		sWaitMessage = "Saving, please wait...";
        	}
        }
        
        Fse.Ajax.showWait( 0, sWaitMessage );
        var oSpryRequest = Spry.Utils.loadURL(oFrmOpts.method, oFrmOpts.url, false, Fse.Ajax.hideWait, 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, bSynchronous ) {
   var oSpryOptions = {};
   oSpryOptions.headers = {};
   oSpryOptions.headers.fseAjax = "true";
   if( oOptions ) {
       for( var sProperty in oOptions ) {
            oSpryOptions.headers[sProperty] = oOptions[sProperty];           
       }       
   }
   var _async = true;
   if( bSynchronous ) {
   	_async = false;
   }
   Spry.Utils.loadURL( "GET", sURL, _async, fnCallback, oSpryOptions );    
};

Fse.Ajax.getURL_Yahoo = 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 );    
   */
   
   var fnCallbackWrapper = function( o ) {
   		var oSpryResponse = {};
   		oSpryResponse.xhRequest = o;
   		if( fnCallback ) {
   			fnCallback( oSpryResponse );
   			alert( "Done" );
   		}
   };
   
   var oCallback = {};
   oCallback.success = fnCallbackWrapper;
   oCallback.failure = fnCallbackWrapper;
   oCallback.argument = oOptions;
   
   YAHOO.util.Connect.asyncRequest( "GET", sURL, oCallback );
   
};

Fse.Ajax.buildQueryString = function( sBaseQueryString, sTunnelQueryString, sTunnelParameter ) {
	return sBaseQueryString + "&" + sTunnelParameter + "=" + Fse.Ajax.Base64.encode( sTunnelQueryString );
};

// Initialize the temporary Panel to display while waiting for external content to load

var _fseWaitPanel = null;
var _fseWaitTimeout = 0;

Fse.Ajax.showWait = function( nDelayMs, sTitle ) {
	
	if( ! sTitle ) {
		sTitle = "Loading, please wait...";
	}
	
	if( !_fseWaitPanel && YAHOO && YAHOO.widget ) {
		_fseWaitPanel =	new YAHOO.widget.Panel( "fseWait",  
			{ width:"240px", 
			  fixedcenter:true, 
			  close:false, 
			  draggable:false, 
			  zindex:4,
			  modal:false,
			  underlay:"shadow",
			  visible:false
			} 
		);
		_fseWaitPanel.setHeader( sTitle );
		// _fseWaitPanel.setBody('<img src="http://l.yimg.com/a/i/us/per/gr/gp/rel_interstitial_loading.gif" />');
		_fseWaitPanel.setBody('<img src="http://scripts.salesteamportal.com/_js/lib/graphics/loading.gif" />');
		_fseWaitPanel.render(document.body);
		
	}
	
	if( _fseWaitPanel && ! _fseWaitTimeout ) {
		
		
		if( nDelayMs ) {
			
			_fseWaitTimeout = setTimeout(
			
				function() {
					clearTimeout( _fseWaitTimeout );
					_fseWaitPanel.setHeader( sTitle );
					_fseWaitPanel.show();
				},			
			
				nDelayMs
			);
			
		} else {
			_fseWaitTimeout = 0;
			_fseWaitPanel.setHeader( sTitle );
			_fseWaitPanel.show();
		}
	}
	
};

Fse.Ajax.hideWait = function() {
	if( _fseWaitTimeout ) {
		clearTimeout( _fseWaitTimeout );
		_fseWaitTimeout = 0;
	}
	if( _fseWaitPanel ) {
		_fseWaitPanel.hide();
	}
};

Fse.Ajax.reload= function( nTimeoutMs, sMessage ) {
	
	if( nTimeoutMs == null ) {
		nTimeoutMs = 50;
	}
	
	Fse.Ajax.showWait( nTimeoutMs, "Refreshing, Please wait..." );
	var sCurrentHref = window.location.href;
	// window.location.href = sCurrentHref;
	top.location.replace( sCurrentHref );
	// window.location.reload();
	
};

Fse.Ajax.updateContent = function( sURL, sContentSocketId, oOptions, fnPostLoad ) {
	
    var fnCallback = function( oRequest ) {
    	Fse.Ajax.hideWait();
    	if( oRequest.xhRequest.status == 200 ) {
    		Spry.Utils.setInnerHTML( sContentSocketId, oRequest.xhRequest.responseText );
    		if( fnPostLoad ) {
    			fnPostLoad( document.getElementById( sContentSocketId ));
    		}
    	} else {
    		alert( "An unexpected condition was encountered, please try again later.\r\n\r\nCODE: " + oRequest.xhRequest.status + ": " + oRequest.xhRequest.statusText );
    	}
    };
    Fse.Ajax.showWait( 750 );
    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;
    };
	
	

	

    

