var Screen = {

  notify: 0,

  notifyCount: 5,

  templates: {},

  initTemplate: function() {
    Screen.templates["Position"] = new LTemplate($("Position").value);
    Screen.templates["String"] = new LTemplate($("String").value);
    Screen.templates["Neck"] = new LTemplate($("Neck").value);
    Screen.templates["Pearl"] = new LTemplate($("Pearl").value);
  },

  load: function() {
    setTimeout(Screen.loadTemplate , 0);
    Player.isModified = true;
  },

  loadTemplate: function() {
    for (var i in Screen.templates) {
      $(i.toLowerCase() + "_area").innerHTML = Screen.templates[i].applyTemplate(Scale);
    }
    Screen.createNowScaleArea();
    Screen.waitEnd();
  },

  createNowScaleArea: function() {
    $("nowscale_area").innerHTML = [
      "<span>",
      Scale.rootNote,
      "&nbsp;",
      Scale.selectedName,
      "</span>&nbsp;(<span>",
      Scale.selectedScale.join("</span>-<span>"),
      "</span>)"
    ].join("");
  },

  initLoad: function(mode, stringCount, stringRoot, scaleName, codeName, rootNote, defaultTuning, tone) {
    this.waitStart();
    Screen.initTemplate();
    Scale.createRelativiteNotes();
    mode = Validate.validateMode(mode);
    stringCount = Validate.validateStringCount(stringCount);
    stringRoot = Validate.validateStringRoot(stringRoot);
    scaleName = Validate.validateScaleName(scaleName);
    codeName = Validate.validateCodeName(codeName);
    rootNote = Validate.validateRootNote(rootNote);
    tone = Validate.validateTone(tone);
    defaultTuning = Validate.validateDefaultTuning(defaultTuning);
    this.createCombo($("key_form"), Scale.notes, "key", null, rootNote, true);
    this.createCombo($("strings_form"), Scale.strings, "strings", "strings_combo", stringCount, true);
    this.createCombo($("scale_form"), Scale.scales, "scale", "scale_combo", scaleName, (mode == "scale"));
    this.createCombo($("code_form"), Scale.codes, "code", "code_combo", codeName, (mode == "code"));
    this.createCombo($("tone_form"), MMLMaker.tones, "tone", "tone_combo", tone, true);
    this.createCombo($("macro_area_tone_form"), MMLMaker.tones, "macro_tone", "macro_tone_combo", tone, true);
    this.createCombo($("macro_area_tempo_form"), MMLMaker.tempos, "macro_tempo", "macro_tempo_combo", "120", true);
    this.createCombo($("macro_area_repeat_form"), MMLMaker.repeats, "macro_repeat", "macro_repeat_combo", "1", true)
    this.createTuningForm(defaultTuning);
    Scale.setting(mode, stringCount, stringRoot, scaleName, codeName, rootNote);
    if (mode == "scale") {
      $("scale_radio").checked = true;
    } else if (mode == "code") {
      $("code_radio").checked = true;
    }
    Screen.load();
  },

  reload: function() {
    this.waitStart();
    var key = null;
    var scale = null;
    var code = null;
    var mode = null;
    var stringCount = null;
    var stringRoot = [];
    var formdata = Form.getElements("controller_form");
    for (var i = 0, n = formdata.length; i < n; i++) {
      var name = formdata[i].name;
      if (name == "key") {
        key = formdata[i].value;
      } else if (name == "scale") {
        scale = formdata[i].value;
      } else if (name == "code") {
        code = formdata[i].value;
      } else if (name == "mode" && formdata[i].checked) {
        mode = formdata[i].value;
      } else if (name == "strings") {
        stringCount = formdata[i].value;
      } else if (name.indexOf("tuning_") != -1) {
        var sNum = name.replace("tuning_", "");
        stringRoot[stringRoot.length] = formdata[i].value;
      }
    }
    Scale.setting(mode, stringCount, stringRoot, scale, code, key);
    Screen.load();
  },

  createTuningForm: function(tunings) {
    for (var i = 0; i < 7; i++) {
      this.createOneTuningForm("tuning_" + (i + 1), tunings[i]);
    }
  },

  createOneTuningForm: function(name, selected) {
    this.createCombo($(name), Scale.notes, name, null, selected, true);
  },

  createRegularTuningForm: function() {
    this.createTuningForm(["E","B","G","D","A","E","B"]);
  },

  createDropDTuningForm: function() {
    this.createTuningForm(["E","B","G","D","A","D","B"]);
  },

  createDownTuningForm: function() {
    var formdata = Form.getElements("controller_form");
    for (var i = 0, n = formdata.length; i < n; i++) {
      var name = formdata[i].name;
      if (name.indexOf("tuning_") != -1) {
        this.createOneTuningForm(name, Scale.downNote(formdata[i].value));
      }
    }
  },

  createUpTuningForm: function() {
    var formdata = Form.getElements("controller_form");
    for (var i = 0, n = formdata.length; i < n; i++) {
      var name = formdata[i].name;
      if (name.indexOf("tuning_") != -1) {
        this.createOneTuningForm(name, Scale.upNote(formdata[i].value));
      }
    }
  },

  onChangeMode: function() {
    if ($("scale_radio").checked) {
      $("scale_combo").disabled = false;
      $("code_combo").disabled = true;
    } else if ($("code_radio").checked) {
      $("scale_combo").disabled = true;
      $("code_combo").disabled = false;
    }
  },

  waitStart: function() {
    $("go").disabled = true;
    $("play_button").innerHTML = '<img src="/img/playdis.gif" onclick="" width="28" height="20">';
    $("nowloading").style.display = "";
    $("neck_area").style.display = "none";
    $("string_area").style.display = "none";
    $("position_area").style.display = "none";
    $("pearl_area").style.display = "none";
  },

  waitEnd: function() {
    $("neck_area").style.display = "";
    $("string_area").style.display = "";
    $("position_area").style.display = "";
    $("pearl_area").style.display = "";
    $("nowloading").style.display = "none";
    $("play_button").innerHTML = '<img src="/img/play.gif" onclick="Screen.startMIDI()" width="28" height="20">';
    $("go").disabled = false;
  },

  createCombo: function(elem, obj, name, id, selected, enabled) {
    name = (name != null) ? ' name="' + name + '" ' : "";
    id = (id != null) ? ' id="' + id + '" ' : "";
    var disabled = (enabled) ? "" : " disabled ";
    var src = "<select " + name + id + disabled + ">";
    for (var k in obj) {
      src += '<option value="' + k + '" ' + ((k == selected) ? "selected" : "") + '>' + k + '</option>';
    }
    elem.innerHTML = src + "</select>";
  },

  openParamLink: function() {
    var mode = Scale.mode;
    var stringCount = Scale.stringCount;
    var scaleName = Scale.scaleName;
    var codeName = Scale.codeName;
    var stringRoot = this.createParamNotes(Scale.stringRoot);
    var rootNote = Scale.rootNote;
    var defaultTuning = this.createParamNotes(Scale.stringRoot);
    var tone = this.getSelectedTone();
    window.location = "/"
      + "?md=" + encodeURIComponent(mode)
      + "&sc=" + encodeURIComponent(stringCount)
      + "&sn=" + encodeURIComponent(scaleName)
      + "&cd=" + encodeURIComponent(codeName)
      + "&sr=" + encodeURIComponent(stringRoot)
      + "&rn=" + encodeURIComponent(rootNote)
      + "&dt=" + encodeURIComponent(defaultTuning)
      + "&tn=" + encodeURIComponent(tone);
  },

  createParamNotes: function(noteArray) {
    return noteArray.join("_");
  },

  getSelectedTone: function() {
    return this.getComboValue("controller_form", "tone");
  },

  getComboValue: function(formId, name) {
    var formdata = Form.getElements(formId);
    for (var i = 0, n = formdata.length; i < n; i++) {
      if (formdata[i].name == name) return formdata[i].value;
    }
  },

  startMIDI: function() {
    var tone = MMLMaker.tones[this.getSelectedTone()];
    MMLMaker.scaleInfo["tone"] = tone;
    MMLMaker.codeInfo["tone"] = tone;
    var mml;
    if (Scale.mode == "scale") {
      mml = MMLMaker.makeScale(Scale.selectedScale_r);
    } else if (Scale.mode == "code") {
      mml = MMLMaker.makeCode(Scale.selectedScale_r);
    }
    Api.access("MIDI", {"mml":mml}, this.playMIDI);
  },

  playMIDI: function(res) {
    var response = eval(res.responseText);
    var status = response["status"];
    var result = response["result"];
    if (status == "success") {
      var dir = result["dir"];
      var name = result["name"];
      Player.set(dir, name);
    } else if (status == "fail") {
      Console.print(result["error"]);
    }
    Player.isModified = false;
  },

  startMacro: function() {
    Macro.start();
  },

  playMacro: function() {
    Macro.play();
  },

  clearMacro: function() {
    Macro.clear();
  },

  closeMacro: function() {
    Macro.close();
  }

}