(function($) {	
	$.fn.saveFormDetails = function(params) {
		var defaults = {'controls': ':text, :radio, :checkbox, select, textarea', 'cookieName': $(this).attr('name'), 'expires': null};
		var options =  $.extend(defaults, params);

		this.each(function (){			
			var form = $(this);
			
			var paramList = ''; 
			var amp = '';
			
			form.find(options.controls).each(function () {
				var param;
				var inputTest = $(this);
				
				 if ($(this).is(':checkbox')) {

					var notCheckedFlag = $(this).attr('checked') ? "" : "n:";					
					param =  $(this).attr('name') + '=' +  notCheckedFlag + $(this).attr('value');
				}
				/* what about multiselect? */					
				else if ($(this).is(':text, textarea, :select-one')) { 
					param = $(this).attr('name') + '=' +  $(this).attr('value');
				} 
	
				//only save checked radio buttons! - not tested
				else if ($(this).is('input:radio:checked')) {
					//alert('hello radio');
					param = $(this).attr('name') + '=checked';
				}				
				else if ($(this).is('input:hidden')) {
				   param = $(this).attr('name') + '=' +  $(this).attr('value');
				}
				else {
					alert("missing case on save cookies");
				}
				paramList = paramList + amp + param;
				amp = '&';
			});				

			$jq.cookie(options.cookieName, paramList, {path: '/', expires: options.expires});
		});

		return this;
	}

	// LOAD FORM FIELD SELECTIONS FROM SAVED COOKIES
	//function loadSelections(frm) {
	$.fn.loadFormDetails =  function(params) {

		this.each(function () {
		
			var defaults = {'cookieName': $(this).attr('name')};
			var options =  $.extend(defaults, params);			
		
			var fieldParameters;
			var fieldValue;
			var form = $(this);
			
			//remove all the hidden provider inputs - these are generated later
			var providerInputs = form.find('[name=provider]');
			providerInputs.each(function(){		
				 $(this).remove()		
			});
			
			// Retrieve form elements from cookie and split into array.
			fieldParameters = $.getCookieParameters({'cookieName' : options.cookieName });
	
			var n = fieldParameters.length;
			for (i = 0; i < n; i++) {

				fieldName = fieldParameters[i].name
				fieldValue = fieldParameters[i].value
				
				
				// Unchecked check boxes have the parameter n: prepended to their value.
				// It's hacky - we should probably use JSON to serialize our cookies instead.
				// if a value starts with n: then we want to uncheck this param/ not pass any param to iptis
				if (fieldValue.search(/n:/) == 0){
					isNegative = true;
					fieldValue = fieldValue.substr(2); //remove the n: flag
				}
				else {
					isNegative = false;
				}
				
				var input = form.find('[name='+fieldName+']')				
				if (input.length == 0) {
					/* HACK for passing provider - convert from ProviderMetroLink, ProviderGoWest, etc to Provider */
					if (fieldName.search("provider") == 0){
						fieldName = "provider";
					};
					
					if (!isNegative){
						if (fieldValue.length > 0) {
							//Add a hidden field to the DOM of this form
							form.append('<input type="hidden" name="' + fieldName + '" value="' + fieldValue + '" />');
						}
					}		
				}
				else {	
					//restore the properties of any fields that we have data for and exist in the form
					input.each(function () {
						if($(this).is(':checkbox')){
							if (!isNegative){
								$(this).attr('checked', 'checked');
							}
							else {
								$(this).attr('checked', '');
							}
						}
						else if ($(this).is(':radio')){
							//check only the radio with the matching value - not tested
							if($(this).attr('value') == fieldValue){
								$(this).attr('checked', 'checked');
							}
						}
						else {
							if (!isNegative){
								$(this).attr('value', fieldValue);
							} else {
								$(this).attr('value', "");
							}
						}
					});
				};

			};
		});
		return this;
	}
	
	$.fn.getCookiePreferencesSummary = function (params){
		var defaults = {'cookieName': 'mySavedPreferences'};
		var options =  $.extend(defaults, params);
					
		var cookieParameters = $jq.getCookieParameters({'cookieName' : options.cookieName});
				
		var viewPreference = jQuery.grep(cookieParameters, function(n, i){
	      return (n.name == 'viewPreference');
	    });

		var notSelected = /n:.*/ 
		var travelMatch = /vehicle.*/
		var providerMatch = /provider.*/ 
		
		var allTravel = jQuery.grep(cookieParameters, function(n, i){
	     	return (n.name.search(travelMatch) == 0 );
	    });
	    
		var selectedTravel = jQuery.grep(allTravel, function(n, i){
	     	return (n.value.search(notSelected) == -1  );
	    });			    
	   
	    var notSelectedTravel = jQuery.grep(allTravel, function(n, i){
	     	return (n.value.search(notSelected) == 0 );
	    });
	    
		var allProvider = jQuery.grep(cookieParameters, function(n, i){
	     	return (n.name.search(providerMatch) == 0 );
	    });	
		
		var selectedProvider = jQuery.grep(allProvider, function(n, i){
	     	return (n.value.search(notSelected) == -1  );
	    });			    
	   
	    var notSelectedProvider = jQuery.grep(allProvider, function(n, i){
	     	return (n.value.search(notSelected) == 0 );
	    });
		
		var providerStr = $.generateOption(selectedProvider,notSelectedProvider)
		var travelStr = $.generateOption(selectedTravel,notSelectedTravel)
		var viewStr = $.generateViewOption(viewPreference); 
		
		//return "<h4>Travel</h4>" + viewStr + "<h4>Mode</h4>" + travelStr +"<h4>Operator</h4>" + providerStr;
		return "<h4>Mode</h4>" + travelStr +"<h4>Operator</h4>" + providerStr;		
	}
	
	
	$.generateOption = function (selectedItems, notSelectedItems){
		var str = "";
		if ((notSelectedItems.length == 0) || (selectedItems.length == 0)){
			str = "<ul class=\"selected\"><li><span class=\"preference\">All</span></li></ul>";
		}
		else if (notSelectedItems.length > selectedItems.length){
			str = "<ul class=\"selected\">";
			for (i = 0; i < selectedItems.length; i++){
				str = str + "<li><span class=\"preference\">" + selectedItems[i].value + "</span></li>";
			}
			str = str + "</ul>";
		} else {					
			str = str + "<ul class=\"notSelected\">";
			for (i = 0; i < notSelectedItems.length; i++){
				providerName = notSelectedItems[i].value.substr(2); //remove the n: flag
				str = str + "<li><span class=\"preference\">" + providerName + "</span></li>";
			}
			str = str + "</ul>";			
		}
		return str;
	}
	
	$.generateViewOption = function (viewPreference){
		var str = "<ul class=\"selected\"><li><span class=\"preference\">Most Convenient</span></li></ul>"; // default
		if (viewPreference.length > 0 ){
			if (viewPreference[0].value == "C"){
				//do nothing - same as default
			}	
			else if (viewPreference[0].value == "Q"){
				str = "<ul class=\"selected\"><li><span class=\"preference\">Quickest</span></li></ul>";
			}
			else if (viewPreference[0].value == "F"){
				str =  "<ul class=\"selected\"><li><span class=\"preference\">Cheapest</span></li></ul>";
			}
			else {
				//do nothing
			}
		}
		return str;
	}

	// COOKIE FUNCTIONS
	$.getCookieParameters = function(params) {
		var defaults = {'cookieName': 'mySavedPreferences'};
		var options =  $.extend(defaults, params);	
		
		// Retrieve form elements from cookie and split into array.
		var fieldParameterString = $.cookie(options.cookieName);
		var parameters
		if (fieldParameterString){
			fieldParameters  = fieldParameterString.split("&");
		}
		else {
			fieldParameters = "";
		}

		var n = fieldParameters.length;
		var parameters = new Array()
		for (i = 0; i < n; i++){ 
			var nameAndParam = fieldParameters[i];
			var eqIndex = nameAndParam.indexOf("=", 0);
			var fieldName = decodeURIComponent(nameAndParam.substring(0, eqIndex));
			var fieldValue = decodeURIComponent(nameAndParam.substring(eqIndex+1));
			parameters[i] = {'name' : fieldName, 'value' : fieldValue};
		}		
		
		return parameters;
	}
})(jQuery);
