(function($) {
	$.fpRequest = function(target, targetAction, serverAction, dataToPost, callback, disableButton) {

		var $disableButton = null;
		if(disableButton)
		{
			if(typeof(disableButton) == 'string')
			{
				$disableButton = $("#" + disableButton);
			}
			else if(typeof(disableButton) == 'object')
			{
				$disableButton = $(disableButton);
			}
		}
		
		if($disableButton != null)
		{
			if(isJElementDisabled($disableButton)) return;
			
			disableJElement($disableButton);	
		}
		
		var postData = '';
		if(typeof(dataToPost) == 'string')
		{
			if(dataToPost != '') dataToPost += "&"
			postData = dataToPost + "target=" + encodeURIComponent(target) + "&targetAction=" + encodeURIComponent(targetAction) + "&jquery=true"; 
		}
		else if(typeof(dataToPost) == 'object') 
		{
			if(typeof(dataToPost.elements) == 'undefined') //object
			{
				dataToPost.target = target;
				dataToPost.targetAction = targetAction;
				dataToPost.jquery = true;
				postData = dataToPost;
			}	
			else //form
			{
				$d = $(dataToPost);
				postData = $d.serialize();
				if(postData != '') postData += "&"
				postData += "target=" + encodeURIComponent(target) + "&targetAction=" + encodeURIComponent(targetAction) + "&jquery=true"; 
			}
		}
		
    	$.ajax({
    		cache: false,
    		data: postData,
    		dataType: "json",
    		error: function (XMLHttpRequest, textStatus, errorThrown) 
    				{
    					alert("Oops! Unable to contact Family Pursuit servers.  Please try again.");
    					debug("Error - textStatus:" + (textStatus ? textStatus : "") + " errorThrown:" + (errorThrown ? errorThrown.toString() : ""));
    					if($disableButton != null)
						{
							enableJElement($disableButton);	
						}
					},
    		success: function (data, textStatus) 
					{
						
					    if(data.data.debug) debug("[DEBUG]" + data.data.debug);
						if(!data.data.target) debug("DEVELOPMENT WARNING: AJAX target not specified");
						
						if(data.data.targetAction == "popup") {
							var title = data.data.title ? data.data.title : "";
							$("body").append("<div id='" + data.data.target + "' title='"+title+"'></div>");
			    			$popup = $("#" + data.data.target);
			    			
			    			$popup.append(data.data.html);
			    			
			    			
					     	$popup.dialog({
								bgiframe: true,
								autoOpen: false,
								modal: true,
								width: data.data.width ? data.data.width : "auto",
								height: data.data.height ? data.data.height : "auto",
								minWidth: data.data.minWidth ? data.data.minWidth : 300,
								minHeight: data.data.minHeight ? data.data.minHeight : 200,
								close: function() {
									$(this).dialog('destroy');
									$(this).remove();
								}
							});

			    			$popup.dialog('open');
							
							// This fixes a bug in jquery on msie with title bars
							// note: the fix should come in jqueryui v1.8
							if($.browser.msie && !data.data.width) 
							{
								$popup.dialog('option', 'width', $popup.parent().width());
							}
			    			
						} else if(data.data.targetAction == "display") {
							$("#" + data.data.target).html(data.data.html);
							$("#" + data.data.target).show();
						} else if(data.data.targetAction == 'hide') {
							$("#" + data.data.target).dialog('close');
						} else if(data.data.targetAction == 'close') {
							$("#" + data.data.target).dialog('destroy');
							$("#" + data.data.target).remove();
						} else if(data.data.targetAction == 'none') {
							// do nothing
						} else {
							debug("Unknown targetAction: [" + data.data.targetAction + "] HTML Dump: [" + data.data.html + "]");
							alert("Oops! An error occured.  Please try again.");
						}
			
						installScriptJQuery(extractScriptJQuery(data.data.html));
			
						if(data.data.javascript) {
			//				alert(data.data.javascript);
							eval(data.data.javascript);
						}
			
						if(callback)
						{
							callback(data.data.dataObject);
						}
    					if($disableButton != null)
						{
							enableJElement($disableButton);	
						}
					},
			timeout: 90000,					
			type: "POST",
			url: serverAction + ".json"
    	});
	};
	
	function debug($msg) {
		if (window.console && window.console.log) {
			window.console.log($msg);
		}
  	};
  	
  	function disableJElement(jelement)
  	{
  		jelement.attr("disabled", "true");
  		jelement.css('cursor', 'wait');
  	}
  	
  	function enableJElement(jelement)
  	{
  		jelement.removeAttr("disabled");
  		jelement.css('cursor', ''); 
  	}
  	
  	function isJElementDisabled(jelement)
  	{
  		return jelement.attr("disabled") == "true";
  	}
  	
  	function installScriptJQuery(script)
	{
	    if (!script)
	        return;
	    if (window.execScript)
	        window.execScript( script );
	    else
	        window.setTimeout( script, 0 );
	};
	
	function extractScriptJQuery(script) {
		var matchScript = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'im');
		return (script.match(matchScript) || ['', ''])[1];
	};
  	
  	
  	
  	$.fn.fpClose = function() {
  		return this.each(function(){
  			$this = $(this);
    		$this.dialog('destroy');
			$this.remove();
  		});
	};

	$.fpClose = function(closeTarget){
		$("#" + closeTarget).fpClose();
	};
	
	$.fpCloseIfNotChanged = function(form, closeTarget){
		if(!hasFormChangedJQuery(form)) {
			$("#" + closeTarget).fpClose();
		} else {
			x = confirm("Changes detected.  Click OK to discard changes.");
			if(x) $("#" + closeTarget).fpClose();
		}		
	};
	
	$.fpRequestIfChanged = function(target, targetAction, serverAction, form, closeTarget){
		if(hasFormChangedJQuery(form)) {
			$.fpRequest(target,targetAction,serverAction,form);
		} else {
			if(closeTarget) {
				$.fpClose(closeTarget);
			}	
		}		
	};	
	
	function hasFormChangedJQuery(form) {

		for(var i=0;i<form.elements.length;i++){
			try {
				elm = form.elements[i];
				origFieldName = elm.name;
				if(origFieldName.substring(0,5) == "orig_"){
					nm = origFieldName.substring(5, origFieldName.length);
					field = form.elements[nm];
					switch(field.type.split('-')[0]){
						case "select":
							// multi-select not yet implemented
							if(elm.value == "") {
								if(field.selectedIndex != 0) return true;
							} else {
								if(field.options[field.selectedIndex].value != elm.value) return true;
							}
							
							break;
						
						case "radio":
							// not implemented yet
							break;
						
						case "checkbox":
	//							alert(field.name + " [" + field.checked + "]; " + elm.name + " [" + elm.checked + "]");
	//							alert(field.name + " [" + field.value + "]; " + elm.name + " [" + elm.value + "]");
							if(field.checked)
							{
								if(elm.value == "false") return true;
							}
							else
							{
								if(elm.value == "true") return true;
							}
							break;
						
						default:
							if(field.value != elm.value) {
	//								alert(field.name + " [" + field.value + "][" + elm.value + "]");
								return true;
							}
							break;
					}
				}
			}catch(e){}
		}
		return false;
	};
	
		
})(jQuery);


