/*jslint browser: true, devel: true, laxbreak: true */
/**
 * @this jQuery
 * @return {Object}
 */
jQuery.fn.slideDownFadeIn = function(speed, easing, callback) {
    return this.slideDown(speed, easing).fadeTo(speed, 1, easing, callback);
};
/**
 * @this jQuery
 * @return {Object}
 */
jQuery.fn.fadeOutSlideUp = function(speed, easing, callback) {
    return this.fadeTo(speed, 0, easing).slideUp(speed, easing, callback);
};

/**
 * @param {!function(*)} $ jQuery object
 * @param {null=} undefined undefined 
 */
(function( $, undefined ) {
	
	/**
	 * @param {string} cookie_name 	The name of the cookie
	 * @param {?Object}	fields	hash of wicket-ids to markup ids for remembering 
	 * 							multiple fields in one cookie. (Optional)
	 * @param {Object} strings  hash of strings to use for prompting user, null if cookie should always be saved. 
	 */
	$.fn.cookiepref = function(cookie_name, fields, strings) {

//		if (fields === null){
//			//ERROR
//		}
		
		var $remember = null;
		var $remembered = null;
		if (strings !== null){
			$remember = $("<div class='cookiepref'><a>"+ strings.remember +"</a></div>");
			$remembered = $("<div class='cookiepref'>"+ strings.remembered +" <a>"+ strings.cancel +"</a></div>");
			
			if (this.next().is('img')) {
				$remember.insertAfter(this.next());
			} else {
				$remember.insertAfter(this);
			}
			$remembered.insertAfter($remember);
		}

		var cookie_vals;

		function addField(cookieId, selector, noPopulation){
			var $field = $(selector);
			
			if (!noPopulation && cookie_vals != null && cookie_vals[cookieId] != undefined && $field.val() == ""){
				
				var cookie_val = cookie_vals[cookieId]
				if ($field.is('select')){
					
					/**
					 * Look for (SoMeText123) 
					 */
					var SELECT_REGEX = /\(([A-Za-z0-9]+)\)/;
					
					if (cookie_val.length == 3) {
						$field.val(cookie_val);
					} else {
						var index_values = cookie_val.match(SELECT_REGEX);
					
						if (index_values != null && index_values[1] != null) {
							// gives [full match, bracket, VALUE, close bracket]  
							$field.val(index_values[1]);
						} 
					}
					
					$field.change();
				} else {
					$field.val(cookie_val);
				}
			}

			$field.bind({
				//Prompt for changes as the user edits the form
				keyup: function(e) {
					$field.change();
				},
				change: function(e) {
					remember();
					if ((cookie_vals === null && $(this).val() !== "") 
					||  (cookie_vals !== null && $(this).val() !== cookie_vals[cookieId])){
						if (null !== $remember){
							$remember.slideDownFadeIn();
						}
					} else {
						if (null !== $remember && $remember.is(':visible')){
							//hide the prompt if fields same as cookie values
							if (cookie_vals !== null){
								for (var f in fields){
									if (cookie_vals[f] !== $(fields[f]).val()){
										return;
									}
								}
							}
							$remember.fadeOutSlideUp();
						}
					}
				}
			});
		}
		
		this.bind('addField', function(e, cookieId, selector){
			addField(cookieId, selector, true);
		});

		//create cookie_vals so addField can access them. 
		cookie_vals = JSON.parse($.cookie(cookie_name));
		for (var cookieId in fields){
			addField(cookieId, fields[cookieId]);
		}


		//Update when clicking on the submit button so that 
		//it picks up fields updated from browser autocomplete drop downs.
		$("input[type=submit], button, input[type=button]").click(function(e) {
			remember();
		});

		if ($remember !== null){
			$remember.click(function(){
				$remember.fadeOutSlideUp();
				$remembered.slideDownFadeIn();
				remember();
			});
			$remembered.find('a').click(function(){
				$remembered.fadeOutSlideUp();
				$remember.slideDownFadeIn();
				$.cookie(cookie_name, null, { path: '/'});
			});
		}

		function remember(){
			if ($remembered !== null && $remembered.is(':visible')){
				var cookie_val;
				cookie_vals = {};
				for (var cookieId in fields){
					var field = $(fields[cookieId]) 
					if (field[0]) {
						cookie_vals[cookieId] = field.val();
					}
				}
				cookie_val = JSON.stringify(cookie_vals);
				$.cookie(cookie_name, cookie_val, { expires: 365, path: '/', version: 1});
			}
		};
	};

})(jQuery);
