// fetch and display section dimensions
function refreshSectionDimensions(id, options) {
  var options = (options == null) ? new Object() : options;
  
  // Parent div of the section
  var section = $('#section_' + id);
  
  // fields to serialise depend on whether we are calculating columns or not
  // When not a new record there won't be a radio button so check for hidden field
  var use_columns_field = $('input[id$=use_columns_true]', section);
  var use_columns;
  
  if (use_columns_field.length == 0) 
  {
    use_columns_field = $('input[name$=\[use_columns\]]', section);
    use_columns = use_columns_field.val() == '1';
  }
  else
  {
    use_columns = use_columns_field[0].checked;
  }

  // change the refresh button image to a spinning loader
  if (options.event != 'onNudge')
    $('#calculated_dimensions_' + id + ' .actions .refresh').css('backgroundImage','url(/images/loader.gif)');


  var value_fields = "page_width page_height use_columns safety_margin_h safety_margin_v pages inside_edge outside_edge top_edge bottom_edge type_width type_height dps_type_width";
  value_fields += use_columns ? " columns column_nudges gutter_h publication_type" : " bleed_h bleed_v bleed_width bleed_height";
  value_fields = value_fields.split(' ');
  
  var params = 'id=' + id + '&html=' + options.html;
  for (var i=0; i < value_fields.length; i++) {
    var field_name = value_fields[i];
    var field_element = $('input[name$=\[' + field_name + '\]]', section);
    var field_value = field_element.val();
    
    // clear nudge values if we aren't doing a nudge
    if (use_columns && field_name == 'column_nudges' && options.event == 'onChange') {
      field_element.val('');
      field_value = '';
    };
    
    // if we found more than 1 element we may be dealing with radio buttons
    if (field_element.length > 1) {
      field_element.each(function() {
        if (this.checked) {
          field_value = this.value;
        };
      });
    };

    params += '&' + field_name + '=' + field_value;
  };

  // And let's throw the measurement_units along for the ride
  if ($('select#[name$=\[measurement_unit\]]').length > 0) {
    measurement_unit = $('select#[name$=\[measurement_unit\]] option:selected').text();
  } else {
    measurement_unit = $('#[name$=\[measurement_unit\]]')[0].value;
  };
  params += "&measurement_unit=" + measurement_unit;
  
  // And let's throw the toggles along
  params += "&toggle_section_bleed=" + $('input[name$="toggle_section_bleed"]:checked').val();
  params += "&toggle_section_type=" + $('input[name$="toggle_section_type"]:checked').val();  
  
  params += "&display_edit_columns=" + canEditColumnsManually();  
  var callback = (options.callback == null) ? refreshSectionDimensionsCallback : options.callback;
  $.getJSON('/sections/calculate_dimensions?' + params, null, callback);
}

function canEditColumnsManually() {
  var edit_columns_checkbox = $("#section_edit_columns_manually:checkbox");
  
  if (edit_columns_checkbox.length > 0) {
    return edit_columns_checkbox.is(":checked");
  } else {
    return $("#section_edit_columns_manually").val();
  };
}

// callback: section dimensions update
function refreshSectionDimensionsCallback(data, textStatus) {
  var dimensions = '#calculated_dimensions_' + data.id;
  var i;
  
  if (data.use_columns) {
    // insert column width controls
    $('#section_columns_' + data.id).html(data.html);
    // update live column width data on sidebar
    updateColumnLiveDimensions(data.id, data.cumulative_widths, data.measurement_label);
  }
  else 
  {
    var outputs = ['page','bleed','safety_margin', 'type'];
    for (i=0; i < outputs.length; i++) {
      var param = outputs[i];
      $('p.' + param + ' .width .value', dimensions).html(data[param + '_width']);
      $('p.' + param + ' .height .value', dimensions).html(data[param + '_height']);
    };


    var extra_field_values = ['bleed_h', 'bleed_v', 'outside_edge', 'inside_edge', 'top_edge', 'bottom_edge', 'bleed_width', 'bleed_height', 'type_width', 'type_height', 'dps_type_width'];
    for (i=0; i < extra_field_values.length; i++) {
      set_field_value_from_data(extra_field_values[i], data)
    }
  }
  $('.actions .refresh', dimensions).css('backgroundImage','');
}

function set_field_value_from_data(field_value, data) {
  if (on_new_publication_page()) {
    $('#section_' + data.id + ' #publication_section_attributes__' + field_value).val(data[field_value]);
  } else {
    $('#section_' + field_value).val(data[field_value]);
  };
}

// nudge column widths
function adjustColumnWidthDown (columnNumber, id) {
  // amount = Number($('#section_nudge_value')[0].value);
  amount = current_nudge_value;
  adjustColumnWidth(columnNumber, -amount, id);
}

function adjustColumnWidthUp (columnNumber, id) {
  // amount = Number($('#section_nudge_value')[0].value);
  amount = current_nudge_value;
  adjustColumnWidth(columnNumber, amount, id);
}

function adjustColumnWidth(columnNumber, amount, id) {
  var section = $('#section_' + id);
  var columnNudgesField = $('input[name$=\[column_nudges\]]', section);
  
  // split values into an array, increment the value and reassign to field
  var columnNudgeValues = columnNudgesField.val().split(',');
  columnNudgeValues[columnNumber - 1] = (Number(columnNudgeValues[columnNumber - 1]) || 0) + amount;
  columnNudgesField.val(columnNudgeValues);
  
  refreshSectionDimensions(id, {'callback':adjustColumnWidthCallback, 'event':'onNudge'});
}

// callback for after a column width is adjusted
function adjustColumnWidthCallback(data, textStatus) {
  var section = $('#section_' + data.id);
  var measurement_label = measurement_label = data["measurement_label"];
  
  // store the recalculated nudge values
  $('input[name$=\[column_nudges\]]', section).val(data.column_nudges);
  
  // update column width values in display
  $('.column_width', section).each(function(i, element) {
    $("#section_specifications_attributes_" + i + "_calculated_width").val(data.column_widths[i]);
    $(element).text(data.column_widths[i] + measurement_label);
  });
  
  // update live dimension display
  updateColumnLiveDimensions(data.id, data.cumulative_widths, data.measurement_label);
}
// update columnar section live dimensions
function updateColumnLiveDimensions(sectionId, widths, measurement_label) {
  var column_dimensions = $('#calculated_dimensions_' + sectionId + ' .column_sizing_element');
  
  // clear existing values
  column_dimensions.text('');
  
  // Display cumulative widths of column specifications
  for (i=0; i < widths.length; i++) {
    column_dimensions.append("<p>Column " + (i+1) + ": " + widths[i] + " " + measurement_label + "</p>");
  };
}

// Toggle section sizing - fixed or columns
function toggleSectionSizing(type, section_id) {
  var section = $('#section_' + section_id);
  var fixed_fields = $('.fixed_sizing_element', section);
  var column_fields = $('.column_sizing_element', section);
  var dimensions = $('#calculated_dimensions_' + section_id);
  switch(type)
  {
    case "fixed":
      fixed_fields.show();
      column_fields.hide();
      break;
    case "columns":
      fixed_fields.hide();
      column_fields.show();
      break;
  }
}

// Initialise the event listener for changes in section field values
function initSectionOnChangeEventListener() {
    $(".toggle_editable_radio").click(function(event) {
      swapEditableAndReadonlyFields(event);
    });
    $('div.section_dimensions').each(function(i) {
      var id = this.id.match(/.*_([x]?\d+)$/)[1];
      $('.watch', this).change(function() {
        refreshSectionDimensions(id, {'html':true, 'event':'onChange'});
      });    
    });
    var unit_selector = $('select#[name$=\[measurement_unit\]]');
    if (unit_selector.length > 0) {
      unit_selector.change(function (evt) {
          selected_option = $("option:selected",unit_selector).text();
          setMeasurementUnitValues(this, selected_option);
       });  
      
      selected_option = $("option:selected",unit_selector).text();
      setMeasurementUnitValues(unit_selector, selected_option);
    } else {
      hidden_element = $('input#[name$=\[measurement_unit\]]')[0];
      setMeasurementUnitValues(hidden_element, hidden_element.value);
    };
}

function setMeasurementUnitValues(element, value) {
  this_parent = $(element).parents(".section_dimensions");
	if (value == inch_value) {
		$('.measurement_unit_label', this_parent).html(inch_symbol);
		current_nudge_value = inch_nudge;
		setFractionalFieldsToInches(this_parent);
	} else {
		$('.measurement_unit_label', this_parent).html(metric_symbol);
    current_nudge_value = metric_nudge;
    setFractionalFieldsToMetric(this_parent);
	};
}

function setFractionalFieldsToInches(this_parent) {
  $('.fractional', this_parent).addClass('is_fraction');
  $('.fractional', this_parent).attr('maxLength','15')
}

function setFractionalFieldsToMetric(this_parent) {
  $('.fractional', this_parent).removeClass('is_fraction');
  $('.fractional', this_parent).attr('maxLength','6')
}

function removePublicationLanguage(lang_id) {
  var languages = $('div#publication_languages .language_select');
  var select = $('select#publication_language_' + lang_id);
  select.val('');
  // TODO remove the select field unless only 1 remains
  if (languages.length > 1) {
    $(select).parent().remove();
    // If the last element was removed we need to make the 'add language'
    // button visible again.
    if ($(languages[languages.length - 1]).width() == 0) {
      $('a.add', languages[languages.length - 2]).show();
    };
  };
}

function addPublicationLanguage(lang_id) {
  $('#add_language_' + lang_id).hide();
  $.getScript('/publications/insert_language_select?id=' + lang_id);
}

function addPublicationContact() {
  last_contact_fields = $('.contact_select');
  last_contact_field = last_contact_fields[last_contact_fields.length - 1];
  
  new_contact_field = $(last_contact_field).clone(true).insertAfter(last_contact_field);
  $(new_contact_field).find('select').val("");

  $(last_contact_field).find("a.add").hide();
}

function removePublicationContact(remove_link) {
  var contacts = $('div#publication_contacts .contact_select');
  var contact = $(remove_link).closest("div.contact_select");
  var select = $(contact).find('select');
  if (contacts.length > 1) {  
    select.parent("div.contact_select").remove();
    // If the last element was removed we need to make the 'add language'
    // button visible again.
    if ($(contacts[contacts.length - 1]).width() == 0) {
      $('a.add', contacts[contacts.length - 2]).show();
    };
  } else {
    select.val('');
  };
}

function removeNotePageContact(remove_link) {
  var contacts = $('div#note_page_contacts .contact_select');
  var contact = $(remove_link).closest("div.contact_select");
  var select = $(contact).find('select');
  if (contacts.length > 1) {  
    select.parent("div.contact_select").remove();
    // If the last element was removed we need to make the 'add language'
    // button visible again.
    if ($(contacts[contacts.length - 1]).width() == 0) {
      $('a.add', contacts[contacts.length - 2]).show();
    };
  } else {
    select.val('');
  };
}


// insert a new section
function addPublicationSection(publication_id) {
  var sectionsAlreadyAdded = $('#publication_sections .section').length;
  var path = '/publications/' + publication_id + '/sections/new?existing=' + sectionsAlreadyAdded;
  path += "&publication_type=" + $('#publication_publication_type option:selected').text();
  $.getScript(path);
}
// remove an added section
function removePublicationSection(section_id) {
  $('#section_' + section_id).remove();
}

function initSetSectionFieldsForMagazine() {
 $(".type_area").removeClass("fixed_sizing_element");
 $(".safety_margin").addClass("fixed_sizing_element"); 
}

function swapEditableAndReadonlyFields(event) {
  var section_field = event.target.name.match(/toggle_section_(.*)$/)[1];

  if (section_field == 'bleed') {
    if (event.target.id == 'toggle_section_bleed_width_and_height') {
      disable_fields(".section_values_bleed input.watch");
      enable_fields(".section_values_bleed_width_and_height input.watch");
    } else {
      enable_fields(".section_values_bleed input.watch");
      disable_fields(".section_values_bleed_width_and_height input.watch");
    };
  };

  if (section_field == 'type') {
    if (event.target.id == 'toggle_section_type_width_and_height') {
      disable_fields(".section_values_type input.watch");
      enable_fields(".section_values_type_width_and_height input.watch");
    } else {      
      enable_fields(".section_values_type input.watch");
      disable_fields(".section_values_type_width_and_height input.watch");
    };
  };
  
}

function disable_fields(selector) {
  $(selector).addClass('disabled');
  $(selector).attr("disabled", "disabled");
}

function enable_fields(selector) {
  $(selector).removeClass('disabled');      
  $(selector).removeAttr('disabled');
}

function on_new_publication_page() {
  return ($("body#publications_new").length > 0);
}

function toggle_edit_columns_manually(element) {
  var is_checked = $(element).is(":checked");
  $("#editable_column_widths").toggle(is_checked);
  $("#automatic_column_widths").toggle(!is_checked);
}

