if(typeof(Tutoria) == "undefined")
  Tutoria = {};

Tutoria.SubjectSelect = function() {
  var selects = {};
  var layers = {};
  var selectIds = {};
  var facultiesSubjectsMap = {};
  var subjectsTopicsMap;
  var onChangeCallback;

  var studiesMultiSelectSetup = false;

  var classSchoolTypesIds = [0, 1, 2, 3, 4, 6, 7];
  var schoolIdOnClassRangeMap = { 0: [1, 5], 1: [5, 9], 2: [5, 10], 3: [5, 13], 4: [5, 13],  6: [10, 13], 7: [5, 9], 11: [] };

  function selectedSchoolType() {
    return selects.schoolType.options[selects.schoolType.selectedIndex].value;
  };

  function saveSelectsNames() {
    for(name in layers) {
      $(layers[name]).select('select').each(function(select) {
        select.oldName = select.name;
      });
    }
  };

  function loadSelects(oSelectIds) {
    selectIds = oSelectIds;
    for(key in selectIds) {
      var id = selectIds[key];
      selects[key] = document.getElementById(id);

      var layer = document.getElementById(id + "-layer");
      if(layer) layers[key] = layer;
    }
  };

  function turnOff(layer) {
    layer.style.display = 'none';
    layer.select('select').each(turnOffSelect);
  }

  function turnOn(layer) {
    layer.style.display = 'block';
    layer.select('select').each(turnOnSelect);
  }

  function turnOffSelect(select) {
    select.name = '';
  }

  function turnOnSelect(select) {
    select.name = select.oldName;
  }

  function resetSelects() {
    turnOff(layers.schoolClass);
    turnOff(layers.schoolSubject);
    turnOff(layers.studyFaculty);
    turnOff(layers.studySubject);
    turnOff(layers.studyTopic);
  };

  function clearSelect(select) {
    while(select.options.length > 0)
      select.options[0] = null;
  };

  function activateClassesSelect() {
    var classesRange = schoolIdOnClassRangeMap[selectedSchoolType()];
    clearSelect(selects.schoolClass);

    for(var i = classesRange[0]; i <= classesRange[1]; i++)
      selects.schoolClass.options[i - classesRange[0]] = new Option(i, i);

    turnOn(layers.schoolClass);
  };

  function activateSubjectsSelect() {
    turnOn(layers.schoolSubject);
    selects.schoolSubject.onchange = function(ev) { if(ev != null || window.event != null) eval(onChangeCallback); };
  };

  function activateStudiesMultiSelect() {
    turnOn(layers.studyFaculty);
    turnOn(layers.studySubject);
    turnOn(layers.studyTopic);

    if(!studiesMultiSelectSetup) {
      Tutoria.multiSelect(selectIds['studyFaculty'], selectIds['studySubject'], facultiesSubjectsMap, onChangeCallback);

      var onChange = selects['studyFaculty'].onchange;
      selects.studyFaculty.onchange = function(ev) {
        onChange();
        if(selects.studySubject.onchange)
          selects.studySubject.onchange();
	if(ev != null || window.event != null) eval(onChangeCallback);
      };

      Tutoria.multiSelect(selectIds['studySubject'], selectIds['studyTopic'], subjectsTopicsMap, onChangeCallback);

      selects.studyFaculty.onchange();
    }
  };

  function dispatchSchoolType(school_type) {
    if(classSchoolTypesIds.include(school_type)) {
      activateClassesSelect();
      activateSubjectsSelect();
      return;
    }

    if(school_type == 9) {
      activateStudiesMultiSelect();
      return;
    }

    if(school_type == 10) {
      activateSubjectsSelect();
    }
  };

  function attachEvents() {
    selects.schoolType.onchange = function(event) {
      resetSelects();
      dispatchSchoolType(selectedSchoolType());
      if(event != null || window.event != null) eval(onChangeCallback);
    };

    selects.schoolType.onchange();

    selects.schoolClass.onchange = function(event) {
      if(event != null || window.event != null) eval(onChangeCallback);
    };
  };

  function switchSelect(select, value) {
    if(!value) return;

    for(var i = 0; i < select.options.length; i++) {
      if(select.options[i].value == value) {
        select.selectedIndex = i;
        if(select.onchange)
          select.onchange(null);
      }
    }
  };

  return {
    init: function(selectIds, facultiesSubjects, subjectsTopics,
                   activeSchoolTypeId, activeSchoolClassId, activeFacultyId, activeSubjectId, activeTopicId,
		   onChange) {
      facultiesSubjectsMap = facultiesSubjects;
      subjectsTopicsMap    = subjectsTopics;
      onChangeCallback     = onChange;

      loadSelects(selectIds);
      saveSelectsNames();
      attachEvents();

      if(activeSchoolTypeId != undefined) {
        resetSelects();
        dispatchSchoolType(activeSchoolTypeId);

        if(classSchoolTypesIds.include(activeSchoolTypeId)) {
          switchSelect(selects.schoolType, activeSchoolTypeId);
          switchSelect(selects.schoolSubject, activeSubjectId);
          switchSelect(selects.schoolClass, activeSchoolClassId);
          return;
        }

        if(activeSchoolTypeId == 9) {
          switchSelect(selects.schoolType, activeSchoolTypeId);
          switchSelect(selects.studyFaculty, activeFacultyId);
          switchSelect(selects.studySubject, activeSubjectId);
          switchSelect(selects.studyTopic, activeTopicId);
          return;
        }

        if(activeSchoolTypeId == 10) {
          switchSelect(selects.schoolType, activeSchoolTypeId);
          switchSelect(selects.schoolSubject, activeSubjectId);
          return;
        }
      }
    },
    selectAddedTo: function(layerName) {
      $(layerName).select('select').each(function(select) { select.oldName = select.name; });
    }
  };
}();

