var $j = jQuery.noConflict();

var dyv_locations = ['header'];
var dyv_logging_enabled = true;

  jQuery.fn.log = function (msg, trace) {
	  if (dyv_logging_enabled && typeof console === "object" && typeof console.log === "function") {
	    console.log(msg);
	  }
	  
	  if (trace) {
	    console.log(jQuery.fn.log.caller);
	  }
	  
	  return this;
	};

	function disableOptionField(field) {
    ths = $j(field);
    if ($j.browser.msie && $j.browser.version <= 7 && ths.attr('tagName').toLowerCase() == 'option') {
      $j.fn.log("disabling IE field " + ths.attr("innerHTML"));
      ths.before($j('<optgroup>&nbsp;</optgroup>').css({
        color: '#ccc',
        height: ths.height(),
        fontStyle: 'normal'
      }).attr({
        id: ths.attr('value'),
        label: ths.text()
      })).remove();
    }
    else if (!ths.attr("disabled")) {
      $j.fn.log("disabling field " + ths.attr("innerHTML"));
      ths.attr('disabled', 'true');
    }
	};

	// Explore Search Function Definition
	$j.ExploreSearch = {
	  initialize: function(){
	  	$j('form#explore_header').attr('action', App.r2.base_url() + '/vacations');
	    $j(this).log("Initializing Explore Search");

	    $j.ExploreSearch.element().focus(function(){
	      this.select();
	    });

	    $j.ExploreSearch.element().click(function(){
	      if (!$j.ExploreSearch.has_data($j(this))) {
	        this.value = "";
	        this.select();
	      }
	    });

	    $j.ExploreSearch.element().blur(function(){
	      if (!$j.ExploreSearch.has_data($j(this))) {
	        this.value = "I want to...";
	      }
	    });

	    $j('.exploreForm form :submit, .exploreForm_header form :submit').click(function() {
	      $j.cookies.del('search_refinement_state');
	    });

	  },

	  element: function () {
	   return $j("#explore_wantto_header");
	  },

	  has_data: function(obj) {
      return ((0 != obj.val().length) && !(/^I want to[\.]{3}/i).test(obj.val()));
	  }

	}

	$j(document).ready(function() {
	  $j.ExploreSearch.initialize();

	  $j('#explore_header a.basic').click(function (e) {
	    e.preventDefault();

	    img = $j('#explore_header_toggle_image');
	    path = "/nclweb/images/framework/";
	    if (img.attr("src").match("expand")) {
	      img.attr("src", path + 'collapse_icon.gif');
	    } else {
	      img.attr("src", path + 'expand_icon.gif');
	    };

	    $j('#bestdeal_header').toggle();
	  });

	  var call_json = false;

	  $j.each(dyv_locations, function() {
	    var placement = this;
	    $j('#q' + field_suffix[placement]).attr('value', existing_base_query[placement]);
	    $j('#reset_find' + field_suffix[placement]).click(function () {
	      $j('#result_number' + field_suffix[placement]).html(base_dataset.MetaInfo.TotalNumberofMatchingAggregateRecords);
	      for (var field in field_map[placement]) {
	        // if changing original filter, reset all fields that weren't used
	        id = field_map[placement][field];
	        //$j('#' + field).removeAttr('disabled');
	        rebuildDefaultFields(id, field, base_dataset.Refinements);
	      }
	      reset_used_filters(placement);
	      $j('#q' + field_suffix[placement]).attr('value', existing_base_query[placement]);
	      return false;
	    });
	    if ($j('#reset_find_header').length > 0)
	      call_json = true;
	  });

	  // prevent unneccessary loading in modal windows
	  if(call_json) {
		  var http_endpoint = document.location.protocol + "//" + document.location.host + "/nclweb/common/query_all.json";
	    $j.fn.log("Using endeca file url path ->"+http_endpoint);
	    $j.getJSON(http_endpoint,
	      function(data){
	        base_dataset = data;
	        initialJSONLoad(data);
	      });
    };
	});

	function initialJSONLoad(d){
	  search_result = d.Refinements;

	  $j.each(dyv_locations, function() {
	    $j('#result_number' + field_suffix[this]).html(d.MetaInfo.TotalNumberofMatchingAggregateRecords);

	    var placement = this;
	    for (var field in field_map[placement]) {
	      id = field_map[placement][field];
	      rebuildDefaultFields(id, field, search_result);

	      $j('#' + field).change(function(){
	        current = this;
	        $j.fn.log("!! changing field: " + current.id);
	        // custom request params for date range
	        query_str = '';
	        if (field_map[placement][this.id] == 'SailDate') {
	          // copy existing N= param
	        	query_str = existing_base_query[placement] + "&Nf=";
	            date_query = [];
	            new_date_query_str = '';
	            loc = $j.inArray(this.id, used_filters[placement]);
	            switch (this.id) {
	              // find_date_from
	              case endeca_map[placement]['SailDate'][0]:
	                if (loc < 0 || $j.inArray(endeca_map[placement]['SailDate'][1], used_filters[placement]) < loc) {
	                  date_query = $j.grep(existing_date_query[placement], function(n, i){
	                    return n.match("LTEQ");
	                  });
	                }
	                new_date_query_str = "p_Sail_Date_Epoch|GTEQ+";
	                date_query.push(new_date_query_str + convertMonthYearToFormat(this.options[this.selectedIndex].value, true, 'Epoch'));
		            break;
	              // find_date_to
	              case endeca_map[placement]['SailDate'][1]:
	                if (loc < 0 || $j.inArray(endeca_map[placement]['SailDate'][0], used_filters[placement]) < loc) {
	                  date_query = $j.grep(existing_date_query[placement], function(n, i){
	                    return n.match("GTEQ");
	                  });
	                }
	                new_date_query_str = "p_Sail_Date_Epoch|LTEQ+";
	                date_query.push(new_date_query_str + convertMonthYearToFormat(this.options[this.selectedIndex].value, false, 'Epoch'));
		            break;
	            }
	            query_str += date_query.join('|');
	            existing_date_query[placement] = date_query;
	        } else {
	          query_str = this.options[this.selectedIndex].value;
	          existing_base_query[placement] = (query_str.indexOf('&Nf') > 0 ? query_str.substring(0, query_str.indexOf('&Nf')) : query_str);
	        }

	        disableOptionField($j(this).children()[0]);
	        // Strip out q=query that Drupal automatically appends to parameters
	        query_str = query_str.replace("&q=query","");

	        $j('#q' + field_suffix[placement]).attr('value', query_str);

      var http_endpoint = App.r2.base_url();
        $j.fn.log("Using endpoint for R2->"+http_endpoint);
          $j.getJSON(http_endpoint + '/query?' + query_str + "&M=expand_all_dims:1|erecs_per_aggr:1|recs_per_page:1&jsoncallback=?", function(d){
	            fieldChangeParse(d, current, placement);
	          });

	      });
	    }
	  });
	}

	function rebuildDefaultFields(id, field, search_result) {
	  // build out options
	  $j('#' + field).children().each(function(){
	    this.parentNode.removeChild(this);
	  });

	  // add exception for date dropdowns
	  for (var i = 0; i < search_result.length; i++) {
	    refinement = search_result[i].Dimensions[0];

	    if (id == refinement.DimensionName) {
	      // matched field with the select we need to rebuild
	      if (id == "SailDate") {
	        body = '<option value="">' + field_defaults[field] + '</option>';
	        tmp = calculateMaxMinDate(refinement);
	        var max_date = switchMonthYear(tmp[1]);
	        var temp_date = switchMonthYear(tmp[0]);
	        while (temp_date <= max_date) {
	          body += '<option value="' + switchMonthYear(temp_date) + '">' +
	          convertMonthYearToFormat(temp_date, true, "MMMM, yyyy") +  // don't care about day of month here
	          '</option>';
	          // advance by one month, accounting for end of year
	          temp_date = '' + (temp_date * 1 + (temp_date.substr(2, 2) * 1 < 12 ? 1 : 89));
	        }
	        $j('#' + field).append(body);
	      } else {
	        body = '<option value="">' + field_defaults[field] + '</option>';
	        for (var j = 0; j < refinement.DimensionValues.length; j++) {
	          record = refinement.DimensionValues[j]
	          body += '<option value="' + record.SelectionLink + '">' + record.DimValueName + '</option>';
	        }
	        $j('#' + field).append(body);
	      }
	    }
	  }
	}

	function fieldChangeParse(d, current, placement) {
	  search_result = d.Refinements;
	  $j('#result_number' + field_suffix[placement]).html(d.MetaInfo.TotalNumberofMatchingAggregateRecords);

	  // check if current.id was already used and what position in array
	  position = $j.inArray(current.id, used_filters[placement]);
	  if (position >= 0) {
	    // delete everything in array after position
	    while (position < used_filters[placement].length - 1)
	      used_filters[placement].pop();
	    // iterate through used_filters and reset those fields
	    for (var field in field_map[placement]) {
	      // if changing original filter, reset all fields that weren't used
	      id = field_map[placement][field];
	      if ($j.inArray(field, used_filters[placement]) == -1) {
	        jQuery.fn.log("rebuilding fields for " + field);
	        rebuildDefaultFields(id, field, base_dataset.Refinements);
	      }
	    }
	  } else {
	    // add current.id to used filter list
	    used_filters[placement].push(current.id);
	  }

	  jQuery.fn.log("used_filters is: " + used_filters[placement]);
	  var available_refinements = [current.id];

	  for (var i = 0; i < search_result.length; i++) {
	    // Run through available Refinements
	    if (search_result[i].Dimensions == undefined) {
	      continue;
	    }
	    dimension = search_result[i].Dimensions[0];

	    mapped_field = endeca_map[placement][dimension.DimensionName];
	    if (mapped_field != undefined && mapped_field != current.id && $j.inArray(mapped_field, used_filters[placement]) < 0) {
	      // collect Refined Value Names to compare to those in dropdowns
	      var refined_values = [];
	      var refined_queries = [];
	      for (var j = 0; j < dimension.DimensionValues.length; j++) {
	        obj = dimension.DimensionValues[j]
	        refined_values[j] = obj.DimValueName;
	        refined_queries[j] = obj.SelectionLink;
	      }

	      // do refinement, unless its find_search_from, find_search_end
	      if ($j.isArray(mapped_field)) {
          $j(mapped_field).each(function(i) {
            if ($j.inArray(mapped_field[i], used_filters[placement]) < 0) {
              available_refinements.push(mapped_field[i]);
              // delete those before and after
              $j('#' + mapped_field[i]).children().each(function(){
                // if value not in returned refinements, disable it
                if ($j.inArray(this.value, refined_values) < 0 && this.index > 0) {
                  disableOptionField(this); //this.parentNode.removeChild(this);
                }
              })
            }
          })
	      } else {
	        available_refinements.push(mapped_field);
	        implicit = (refined_values.length == 1);
	        $j('#' + mapped_field).children().each(function(){
	          refined_index = $j.inArray(this.text, refined_values);
	          if (refined_index == -1 && this.index > 0) {
	            disableOptionField(this);
	            //this.parentNode.removeChild(this);
	          } else {
	            // rebuild query in the value attribute
	            this.value = refined_queries[refined_index];
	            if (implicit) {
	              this.selected = "true";
	              disableOptionField($j(this.parentNode).children()[0]);
	            }
	          }
	        });
	      }
	    }
	  }

	  // not available as a Refinement, meaning that's the only selection, so disable that filter box if also not used filter
	  for(var field in field_map[placement]) {
	    if($j.inArray(field, available_refinements) < 0 && $j.inArray(field, used_filters[placement]) < 0) {
	      $j('#' + field).children().each(function(i) {
	        if (i == 0)
	          $j(this).attr("innerHTML", "No further refinements");
	        disableOptionField(this);
	      });

	      //$j('#' + field).attr("disabled", 'disabled');
	      jQuery.fn.log("disabled " + field);
	    //} else {
	    //  $j('#' + field).removeAttr("disabled");
	    }
	  }
	}

	var endeca_map = {
	  'header' : {
	    "Destinations"     : "find_loc_header",
	    "Ships"            : "find_ship_header",
	    "SailDate"         : ["find_date_from_header","find_date_end_header"],
	    "Duration"       : "find_dur_header",
	    "EmbarkationPort"  : "find_from_header"
	  },
	  'default' : {
	    "Destinations"     : "find_loc",
	    "Ships"            : "find_ship",
	    "SailDate"         : ["find_date_from","find_date_end"],
	    "Duration"       : "find_dur",
	    "EmbarkationPort"  : "find_from"
	  }
	};

	var field_map = {
	  'header': {
	    "find_loc_header": "Destinations",
	    "find_ship_header": "Ships",
	    "find_date_from_header": "SailDate",
	    "find_date_end_header": "SailDate",
	    "find_dur_header"       : "Duration",
	    "find_from_header": "EmbarkationPort"
	  },
	  'default': {
	    "find_loc": "Destinations",
	    "find_ship": "Ships",
	    "find_date_from": "SailDate",
	    "find_date_end": "SailDate",
	    "find_dur"       : "Duration",
	    "find_from": "EmbarkationPort"
	  }
	};

	var used_filters = {
	  'header': [],
	  'default': []
	};
	var base_dataset = '';
	var existing_base_query = {
	  'header': 'N=0&Nu=p_Key&Nr=AND(p_Record_Type:I)',
	  'default': 'N=0&Nu=p_Key&Nr=AND(p_Record_Type:I)'
	};
	var existing_date_query = {
	  'header': [],
	  'default': []
	};
	var field_suffix = {
	  'header' : '_header',
	  'default' : ''
	}

	var field_defaults = {
	  "find_loc"        : "Where would you like to go?",
	  "find_date_from"  : "Search From",
	  "find_date_end"   : "Search To",
	  "find_dur"     : "How long do you want to be gone?",
	  "find_ship"       : "Is there a ship that you would prefer?",
	  "find_from"       : "Where would you like to leave from?",
	  "find_loc_header"        : "Where would you like to go?",
	  "find_date_from_header"  : "Search From",
	  "find_date_end_header"   : "Search To",
	  "find_dur_header"     : "How long do you want to be gone?",
	  "find_ship_header"       : "Is there a ship that you would prefer?",
	  "find_from_header"       : "Where would you like to leave from?"
	}

	function reset_used_filters(placement) {
	  used_filters[placement] = [];
	  existing_base_query[placement] = 'N=0&Nu=p_Key&Nr=AND(p_Record_Type:I)';
	  existing_date_query[placement] = [];
	}

	var monthNames = ["January","February","March","April","May","June","July","August","September","October","November","December"];

	// 'date' format is MM/YY, transform into integer sortable value, ie. YYMM
	function switchMonthYear(date) {
	  divider = date.indexOf('/'); // can i always assume it's 2?
	  if (divider >= 0) {
	    year = date.substr(divider + 1, 2);
	    month = date.substr(0, 2);
	    return year + month;
	  } else {
	    month = date.substr(2,2);
	    year = date.substr(0,2);
	    return month + '/' + year;
	  }
	}

	// takes DimensionValues list as 'refinement'
	function calculateMaxMinDate(refinement) {
	  var sail_dates = []; // do i care about all the dates or just the max and min?
	  max_date = '00/00';
	  min_date = '99/99';
	  $j(refinement.DimensionValues).each(function() {
	    value = this.DimValueName;
	    sail_dates.push(value);
	    min_date = switchMonthYear(value) < switchMonthYear(min_date) ? value : min_date;
	    max_date = switchMonthYear(value) > switchMonthYear(max_date) ? value : max_date;
	  });
	  return [min_date,max_date];
	}

	// takes MM/YY as date, true/false for first/last day of month as first_or_last, standard date/time format string as format
	function convertMonthYearToFormat(date, first_or_last, format) {
	  if(date.indexOf('/') >= 0) {
	    date = switchMonthYear(date);
	  }
	  str = Date.today().set({
	    month: date.substr(2, 2) * 1 - 1,
	    year: ('20' + date.substr(0, 2)) * 1
	  });
	  str = first_or_last ? str.moveToFirstDayOfMonth() : str.moveToLastDayOfMonth().add({days: 1, seconds: -1});
	  if (format == 'Epoch') {
	    return str.setTimezone('GMT').getTime()/1000;
	  } else {
	    return str.toString(format);
	  }
	}
// ----------------------------------------------------------------------------------

function ShowPopup(hoveritem)
{
    var dd = $j("#designyourvacation_menu");
    if (dd)
      dd.show();
}

function HidePopup(hoveritem)
{
    var dd = $j("#designyourvacation_menu");
    if(dd && !dd.hasClass("active"))
      dd.hide();
}

$j(document).ready(function() {

	$j("#designyourvacation_menu select").focus(function() {
	    $j("#designyourvacation_menu").addClass("active");
	    $j.fn.log("focus");
	  }).blur(function() {
	    $j("#designyourvacation_menu").removeClass("active");
	    $j.fn.log("blur");
	  });
});

function showHide(IMG)
{
	sh = document.getElementById("bestdeal_header");
	if (document.getElementById(IMG).src.indexOf('expand') != -1) {
		document.getElementById(IMG).src='/nclweb/images/framework/collapse_icon.gif';
		sh.style.visibility = "visible";
		sh.style.display = "block";
	} else {
		document.getElementById(IMG).src='/nclweb/images/framework/expand_icon.gif';
		sh.style.display = "none";
	}
}

