var gCondFields = {
  Media: ['CallNumber', 'LoanPeriodMedia', 'MediaType', 'DateReserved1', 'DateReserved2', 'DateReserved3', 'Copies'],
  ECR_Chapter: ['DateNeededBy', 'CallNumber', 'ArticleTitle', 'Author', 'LinkTitle', 'ArticleAuthor', 'VolumeEdition', 'Year', 'Pages'],
  ECR_Article: ['DateNeededBy', 'LinkTitle', 'ArticleTitle', 'ArticleAuthor', 'VolumeEdition', 'Year', 'Pages'],
  Paper: ['DateNeededBy', 'CallNumber', 'LoanPeriod', 'Author', 'VolumeEdition', 'Year', 'Copies']
};

var gAllItemLabels = ['DateReserved1Label', 'DateNeededByLabel', 'ArticleTitleLabel',
		      'AuthorLabel', 'MediaTypeLabel', 'PagesLabel', 'ArticleAuthorLabel',
		      'VolumeEditionLabel', 'YearLabel'];

var gRequiredItemLabels = {
  Media: ['DateReserved1Label', 'MediaTypeLabel'],
  ECR_Chapter: ['DateNeededByLabel', 'CallNumberLabel', 'AuthorLabel', 'ArticleTitleLabel',
		'PagesLabel', 'YearLabel'], 
  ECR_Article: ['DateNeededByLabel', 'ArticleTitleLabel', 'PagesLabel', 'ArticleTitleLabel',
		'ArticleAuthorLabel', 'PagesLabel', 'VolumeEditionLabel', 'YearLabel'],
  Paper: ['DateNeededByLabel',  'AuthorLabel', 'YearLabel']
};

var gCondLabels = {
  ECR_Chapter: {ArticleAuthorLabel: 'Chapter author',
		TitleLabel: 'Book title',
	        VolumeEditionLabel: 'Volume/edition',
		ArticleTitleLabel: 'Chapter title'},

  ECR_Article: {ArticleAuthorLabel: 'Article author',
		TitleLabel: 'Journal title',
		ArticleTitleLabel: 'Article title',
	        VolumeEditionLabel: 'Volume/issue'},
  Paper:       {TitleLabel: 'Book title',
	        VolumeEditionLabel: 'Volume/edition'},
  Media:       {TitleLabel: 'Title',
		DateReserved1Label: 'Viewing date',
		DateReserved2Label: 'Additional viewing date',
		DateReserved3Label: 'Additional viewing date'}
};

var gAllCondFields = ['CallNumber', 'LoanPeriod', 'LoanPeriodMedia', 'Author', 'LinkTitle', 'ArticleAuthor',
		      'MediaType', 'DateNeededBy', 'DateReserved1', 'DateReserved2', 'DateReserved3',
		      'VolumeEdition', 'Year', 'Pages', 'Copies', 'ArticleTitle'];

var gAllMandFields = ['Title', 'SpecialInfo', 'Owner'];

var gAllFields = gAllCondFields.concat(gAllMandFields);

function createTypeChangeHook(i) {
  return function(e) {
    onTypeChange(i);
  }
}

function onLoad() {
  Event.observe($('Location'), 'change', onLocationChangeEvent);

  for (i = 1; i <= gMaxItems; i++) {
    Event.observe($('form').elements["item[" + i + "][Type]"], 'change', createTypeChangeHook(i));
    onTypeChange(i);
  }
}

function onLocationChangeEvent(e) {
  var location = $F(Event.element(e));

  onLocationChange(location);
}

function adjustLoanPeriodVisibilityForLocation(i, location) {
  // danger will robinson

  if (location == 'Storrs') {
    showMediaLoanPeriod = true;
  } else {
    showMediaLoanPeriod = false;
  }

  var fe = $('form').elements;
  var t = $F(fe["item[" + i + "][Type]"])
  if (t == 'Media') {
    e = $('LoanPeriodMedia_' + i);
    if (showMediaLoanPeriod) {
      e.show();
    } else {
      e.hide();
    }
  }
}

function onLocationChange(location) {
  var periods = gLoanPeriodsByLocation[location];
  var fe = $('form').elements;

  if (! periods) {
    alert("Please choose a reserve location.");
    for (i = 1; i <= gMaxItems; i++) {
      var select = fe["item[" + i + "][LoanPeriod]"];
      select.options.length = 0;
      select.options[0] = new Option("-- Select a reserve location above --", "", true, false);
    }
    return;
  }

  for (i = 1; i <= gMaxItems; i++) {
    adjustLoanPeriodVisibilityForLocation(i, location);

    var select = fe["item[" + i + "][LoanPeriod]"];

    select.options.length = 0;
    if (periods) {
      if (periods.length == 1) {
	select.options[0] = new Option(periods[0][0], periods[0][1], true, true);
      } else {
	select.options[0] = new Option("-- Choose --", "", true, false);
	for (j = 0; j < periods.length; j++) {
	  select.options[j + 1] = new Option(periods[j][0], periods[j][1], false, false);
	}
      }
    }
  }
}

function onTypeChange(i) {
  var fe = $('form').elements;
  var t = $F(fe["item[" + i + "][Type]"]);

  if (t == '') {
    gAllFields.each(function(e) { Element.hide($(e + "_" + i)); });
  } else {
    gAllMandFields.each(function(e) { Element.show($(e + "_" + i)); });
    gAllCondFields.each(function(e) {
			  if (gCondFields[t].include(e)) {
			    Element.show($(e + "_" + i));
			  } else {
			    Element.hide($(e + "_" + i));
			  }
			});
    for (field in gCondLabels[t]) {
      Element.update($(field + "_" + i), gCondLabels[t][field]);
    }

    gAllItemLabels.each(function(e) {
			  if (gRequiredItemLabels[t].include(e)) {
			    $(e + "_" + i).addClassName("required");
			  } else {
			    $(e + "_" + i).removeClassName("required");
			  }
			});

    
    adjustLoanPeriodVisibilityForLocation(i, $F('Location'));
  }

  var ecrCount = 0;

  for (j = 1; j <= gMaxItems; j++) {
    type = $F(fe["item[" + j + "][Type]"]);
    if (type == 'ECR_Chapter' || type == 'ECR_Article') {
      ecrCount++;
    }
  }

  if (ecrCount > 0) {
    $('PeopleSoftLabel').addClassName("required");
  } else {
    $('PeopleSoftLabel').removeClassName("required");
  }
}

Event.observe(window, 'load', onLoad);
