﻿/*** File System ***/
var fSystem={
  activeFile:-1,  // Current file's position in the stack
  
  // Find which radio button is checked
  getCheckedValue:function(rName) {
    var temp=document.getElementsByName(rName);
    for (var p=0; p<temp.length; p++) {
      if (temp[p].checked) {return p;}
    }
    return -1;  // No radio button is checked
  },
  
  // Disable/enable buttons in the load/management menu
  toggleButtonState:function(parentID, state) {
    var disableButtons = g(parentID).getElementsByTagName('div');
    disableButtons = disableButtons[disableButtons.length-1].getElementsByTagName('input');
    for (var i=0; i<disableButtons.length; i++) {
      disableButtons[i].disabled = state;
    }
  },
  
  // New File
  createNewFile:function() {
    // Reset fields
    fSystem.activeFile = -1;
    cFile.k = 1;
    cFile.courseName = [lang[langObj.currentLanguage][10][0]];
    cFile.instructor = [""];
    cFile.roomNumber = [""];
    cFile.startTime = ["00:00"];
    cFile.endTime = ["00:00"];
    cFile.credits = [1];
    cFile.days = [[false, false, false, false, false, false, false]];
    
    // Reset sorter
    pView.showFields = [true, false, true, true, false, false];
    var t = g('showFieldsFieldset').getElementsByTagName('input');
    for (var i=0; i<t.length; i++) {
      g('sortSelect').getElementsByTagName('optgroup')[0].getElementsByTagName('option')[i].text = g('showFieldsFieldset').getElementsByTagName('label')[i].textContent;
      pView.pOrder[i] = pView.pNames[i]+"";
      t[i].checked = pView.showFields[i];
      t[i].value = i;
    }
    
    sorter.dAcr = [].concat(fSystem.dateObj.weekAcr);
    
    t = g('dAcrContainer').getElementsByTagName('input');
    for (var j=0; j<t.length; j++) {
      t[j].value = sorter.dAcr[j];
    }
    
    // Reset save menu
    g('courseNamesOpt').innerHTML = g('classSelect').getElementsByTagName('optgroup')[0].innerHTML = "<option>"+lang[langObj.currentLanguage][10][0]+"</option>";
    g('courseNames').selectedIndex = 1;
    g('fName').value = g('fPassword').value = '';
    g('fPassword').disabled = true;
    g('fPasswordProtect').checked = false;
    
    cFile.changeCourse();  // Get rid of all traces of old file
    tControl.changeTab(0);  // Go to Edit Fields
  },
  
  exportFile:function(expType) {
    var s = "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>";
    s += fSystem.activeFile>=0 ? data.get().split("\u001C")[fSystem.activeFile].split("\u001D")[0] : lang[langObj.currentLanguage][10][1];
    s += "<\/title>\n";
    s += "  <link type=\"image/gif\" rel=\"icon\" href=\"data:image/gif;base64,R0lGODlhEAAQALMKAAAAAAD/AIQAhISEAISEhMbGxt7eAP8A////AP///wAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAKACwAAAAAEAAQAAAESVDJSaU4omoFxs2b1BneEXKDoXrhaCAD0KZvPKuwvLk5BfxAnM1XKBZGsWMFUEgQgABCQkl0ShPYqW7CzHq1S6PYuBVBz+XTJAIAOw==\">\n";
    s += "  <link type=\"application/x-opera-widgets\" rel=\"alternate\" href=\"http://widgets.opera.com/widget/11582/\" title=\"ClasScheduler\">\n";
    s += "  <style>\n";
    
    s += "  @page {\n    size:landscape;\n  }\n";
    s += "  title, head {\n    display:block;\n    margin:.5em auto;\n    text-align:center;\n    font:20pt Georgia;\n  }\n";
    s += "  table{\n    border-collapse:collapse;\n    border:1px solid #000;\n    margin:auto;\n  }\n";
    s += "  tr > * {\n    border:1px solid #000;\n    background:#fff;\n    padding:.2em .5em;\n  }\n";
    s += "  tr:nth-child(even) > td {\n    background:#ddd;\n  }\n";
    s += "  tr > th {\n    border-bottom:3px solid #000;\n  }\n";
    
    s += "  <\/style>\n<\/head>\n<body>\n";
    s += (expType ? pView.buildPreview() : pView.buildWeekly());
    s += "\n<\/body>\n<\/html>";
    
    if (window.widget != null) {
      widget.openURL("data:text/html,"+encodeURIComponent(s));
    }
    else {
      window.open("data:text/html,"+encodeURIComponent(s));
    }
  },
  
  // Save Methods
  saveObj:{
    // Assemble a new file
    getFileData:function(fName, fPass) {
      var s = [fName, fPass, fSystem.dateObj.getDate(), cFile.courseName.join("\u001E"), cFile.instructor.join("\u001E"), cFile.roomNumber.join("\u001E"), cFile.startTime.join("\u001E"), cFile.endTime.join("\u001E"), cFile.credits.join("\u001E"), [[]], [], [], []];

      // Copy days over
      for (var i=0; i<cFile.days.length; i++) {
        s[9][i] = cFile.days[i].slice(0);
      }
      
      // Convert days to integers
      for (var j=0; j<s[9].length; j++) {
        for (var k=0; k<s[9][j].length; k++) {
          s[9][j][k] = (s[9][j][k] ? "1" : "0");
        }
        s[9][j] = s[9][j].join("\u001F");
      }
      s[9] = s[9].join("\u001E");
      
      // Field order/visibility
      var t = g('showFieldsFieldset').getElementsByTagName('input');
      for (var l=0; l<t.length; l++) {
        s[10].push(t[l].value);
        s[11].push(t[l].checked ? 1 : 0);
      }
      s[10] = s[10].join("\u001F");
      s[11] = s[11].join("\u001F");
      
      // Day acronyms
      for (var m=0; m<sorter.dAcr.length; m++) {
        s[12].push(sorter.dAcr[m]);
      }
      s[12] = s[12].join("\u001F");
      
      return s;
    },
    
    saveFile:function(fName, fPass) {
      var s = this.getFileData(fName, fPass);
      
      // Add current file to stack
      var temp = data.get().split("\u001C");
      if (fSystem.activeFile<0) {
        if (temp.length==1 && temp[0]=='') {
          temp[0] = s.join("\u001D");
          fSystem.activeFile = 0;
        }
        else {
          temp.push(s.join("\u001D"));
          fSystem.activeFile = temp.length-1;
        }
      }
      // Replace existing file
      else {
        temp.splice(fSystem.activeFile, 1);
        temp.push(s.join("\u001D"));
      }
      
      data.set(temp.join("\u001C"));
      tControl.changeTab(2);
    },
    
    saveAs:function() {
      fSystem.activeFile = -1;
      var pass = (g('fPasswordProtect').checked && g('fPassword').value!='') ? g('fPassword').value : "\u001F";
      this.saveFile(g('fName').value, pass);
    }
  },
  
  // Load Methods
  loadObj:{
    
    // Create a file list for the load menu
    createLoadList:function() {
      this._LOAD_hideDialogs();
      var temp = data.get().split("\u001C");
      
      if (temp[0] != '') {
        var s=[];
        for (var i=0; i<temp.length; i++) {
          s.push("<label><input type='radio' name='loadList'>"+temp[i].split("\u001D")[0]+"<\/label>");
        }
        // Go from newest to oldest
        s.reverse();
        s = s.join('');
        g("_LOAD_fileContainer").style.display = "block";
        g("_LOAD_emptyStack").style.display = "none";
        g("_LOAD_fileContainer").innerHTML = s;
      }
      else {
        g("_LOAD_emptyStack").style.display = "block";
        g("_LOAD_fileContainer").style.display = "none";
      }
      
      fSystem.toggleButtonState('loadMenu', false);  // Make sure all buttons are clickable
    },
    
    // Loads the file at specified index
    loadFile:function(isLoading) {
      if (fSystem.getCheckedValue("loadList") < 0) {return;} // Prevent invalid files from loading
      
      var temp = data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D");
      if (temp[1]!="\u001F" && !isLoading) {
        this._LOAD_enterPasswordToContinue();
        g("_LOAD_okPassCheck").onclick = function() {
          // Password is valid
          if (data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D")[1] == g("loadPasswordCheck").value) {
            fSystem.loadObj.loadFile(true);
          }
          // Wrong password
          else {
            fSystem.loadObj._LOAD_wrongPassword();
          }
        };
        return;
      }
      fSystem.activeFile = (data.get().split("\u001C").length-1) - fSystem.getCheckedValue("loadList");
      var cond = temp[3]!=''||temp[4]!=''||temp[5]!=''||temp[6]!=''||temp[7]!=''||tmep[8]!='';
      
      cFile.courseName = cond ? temp[3].split("\u001E") : [];
      cFile.instructor = cond ? temp[4].split("\u001E") : [];
      cFile.roomNumber = cond ? temp[5].split("\u001E") : [];
      cFile.startTime = cond ? temp[6].split("\u001E") : [];
      cFile.endTime = cond ? temp[7].split("\u001E") : [];
      cFile.credits = cond ? temp[8].split("\u001E") : [];
      cFile.days = cond ? temp[9].split("\u001E") : [[]];
      
      cFile.k = cFile.courseName.length;  // Sets the number of courses in this file
      
      // Converts days from string to boolean
      if (cond) {
        for (var i=0; i<cFile.days.length; i++) {
          cFile.days[i] = cFile.days[i].split("\u001F");
          for (var k=0; k<cFile.days[i].length; k++) {
            cFile.days[i][k] = cFile.days[i][k] == "1";
          }
        }
      }
      
      // Resets sorter
      var t = g('showFieldsFieldset').getElementsByTagName('input');
      var a = temp[10].split("\u001F"), b = temp[11].split("\u001F"), c = temp[12].split("\u001F");

      for (var j=0; j<t.length; j++) {
        t[j].value = a[j];
        t[j].checked = pView.showFields[a[j]] = (b[j] == "1");
        g('sortSelect').getElementsByTagName('optgroup')[0].getElementsByTagName('option')[a[j]].text = pView.pOrder[a[j]] = pView.pNames[j]+"";
      }
      
      t = g('dAcrContainer').getElementsByTagName('input');
      for (var l=0; l<t.length; l++) {
        t[l].value = c[l];
      }
      
      // Blanks out existing course lists
      g('courseNamesOpt').innerHTML = g('classSelect').getElementsByTagName('optgroup')[0].innerHTML = '';
      for (var m=0; m<cFile.courseName.length; m++) {
        g('courseNamesOpt').innerHTML = g('classSelect').getElementsByTagName('optgroup')[0].innerHTML += "<option>"+cFile.courseName[m]+"<\/option>";
      }
      
      g('courseNames').selectedIndex = g('courseNames').options.length>1 ? 1 : 0;
      g('classSelect').selectedIndex = g('classSelect').options.length>0 ? 0 : -1;
      g('fName').value = temp[0];
      g('fPasswordProtect').checked = isLoading;
      g('fPassword').value = '';
      g('fPassword').disabled = !isLoading;
      g('cCred').value = cFile.credits[0];
      
      cFile.changeCourse();  // Get rid of all traces of old file
      tControl.changeTab(0);  // Go to Edit Fields
    },
    
    // Hides all in-load dialogs
    _LOAD_hideDialogs:function() {
      g('_LOAD_fileContainer').style.display = "none";
      g('_LOAD_emptyStack').style.display = "none";
      g('_LOAD_infoBox').style.display = "none";
      g('_LOAD_enterPassword').style.display = "none";
      g('_LOAD_passwordFail').style.display = "none";
      g('_LOAD_newFileName').style.display = "none";
      g('_LOAD_newPassword').style.display = "none";
    },
    
    // User clicks file info button
    _LOAD_fileInfo:function(index) {
      if (index<0) {return;} // Ignore invalid files
      
      g("_LOAD_fileContainer").style.display = "none";
      g("_LOAD_infoBox").style.display = "block";
      g("_LOAD_okFileInfo").onclick = function() {
        g("_LOAD_infoBox").style.display = "none";
        g("_LOAD_fileContainer").style.display = "block";
        fSystem.toggleButtonState("loadMenu", false);
      };
      
      var temp = data.get().split("\u001C");
      index = (temp.length-1)-index;
      temp = temp[index].split("\u001D");
      
      if (temp[1]!="\u001F") {
        g("passReq").style.display = "block";
        g("noPassReq").style.display = "none";
        g("passReq").getElementsByTagName("q")[0].innerHTML = temp[0];
      }
      else {
        g("passReq").style.display = "none";
        g("noPassReq").style.display = "block";
        g("noPassReq").getElementsByTagName("q")[0].innerHTML = temp[0];
        g("lastSaveDate").textContent = fSystem.dateObj.readDate(temp[2]);
        g("fileCourseLength").textContent = temp[3].split("\u001E").length;
      }
      
      fSystem.toggleButtonState('loadMenu', true);
    },
    
    // User enters current password
    _LOAD_enterPasswordToContinue:function() {
      fSystem.toggleButtonState('loadMenu', true);
      g("loadPasswordCheck").value = "";
      g("_LOAD_fileContainer").style.display = "none";
      g("_LOAD_enterPassword").style.display = "block";
      g("_LOAD_enterPassword").getElementsByTagName("q")[0].innerHTML = data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D")[0];
    },
    
    // Password is wrong
    _LOAD_wrongPassword:function() {
      g("_LOAD_enterPassword").style.display = "none";
      g("_LOAD_passwordFail").style.display = "block";
      g("_LOAD_okPassFail").onclick = function() {
        g("_LOAD_passwordFail").style.display = "none";
        g("_LOAD_fileContainer").style.display = "block";
        fSystem.toggleButtonState("loadMenu", false);
      };
    },
    
    // Rename file
    _LOAD_newName:function() {
      fSystem.toggleButtonState('loadMenu', true);
      g("_LOAD_newFileNameInput").value = data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D")[0];
      
      g("_LOAD_fileContainer").style.display = "none";
      g("_LOAD_newFileName").style.display = "block";
      g("_LOAD_okNewName").onclick = function() {
        fSystem.loadObj._LOAD_setNewName();
      };
    },
    
    // New password
    _LOAD_newPass:function() {
      fSystem.toggleButtonState('loadMenu', true);
      g("_LOAD_newPasswordInput").value = "";
      
      g("_LOAD_fileContainer").style.display = "none";
      g("_LOAD_newPassword").style.display = "block";
      g("_LOAD_okNewPass").onclick = function() {
        fSystem.loadObj._LOAD_setNewPassword();
      };
    },
    
    // Does the file about to be renamed have a password?
    _LOAD_checkNewNameForPassword:function() {
      var t = fSystem.getCheckedValue("loadList");
      if (t<0) {return;}
    
      // File has password
      if (data.get().split("\u001C").reverse()[t].split("\u001D")[1] != "\u001F") {
        fSystem.loadObj._LOAD_enterPasswordToContinue();
        g("_LOAD_okPassCheck").onclick = function() {
          // Password is valid
          if (data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D")[1] == g("loadPasswordCheck").value) {
            g("_LOAD_enterPassword").style.display = "none";
            fSystem.loadObj._LOAD_newName();
          }
          // Wrong password
          else {
            fSystem.loadObj._LOAD_wrongPassword();
          }
        };
      }
      else {
        fSystem.loadObj._LOAD_newName();
      }
    },
    
    // Does the file being given a new password already have one?
    _LOAD_checkNewPasswordForPassword:function() {
      var t = fSystem.getCheckedValue("loadList");
      if (t<0) {return;}
    
      // File has password
      if (data.get().split("\u001C").reverse()[t].split("\u001D")[1] != "\u001F") {
        fSystem.loadObj._LOAD_enterPasswordToContinue();
        g("_LOAD_okPassCheck").onclick = function() {
          // Password is valid
          if (data.get().split("\u001C").reverse()[fSystem.getCheckedValue("loadList")].split("\u001D")[1] == g("loadPasswordCheck").value) {
            g("_LOAD_enterPassword").style.display = "none";
            fSystem.loadObj._LOAD_newPass();
          }
          // Wrong password
          else {
            fSystem.loadObj._LOAD_wrongPassword();
          }
        };
      }
      else {
        fSystem.loadObj._LOAD_newPass();
      }
    },
    
    // Save the file stack with changed name
    _LOAD_setNewName:function() {
      var tFile = data.get().split("\u001C").reverse();
      var pFile = tFile[fSystem.getCheckedValue("loadList")].split("\u001D");
      
      pFile[0] = g("_LOAD_newFileNameInput").value;
      pFile = pFile.join("\u001D");
      tFile[fSystem.getCheckedValue("loadList")] = pFile;
      tFile = tFile.reverse();
      data.set(tFile.join("\u001C"));
      
      fSystem.loadObj.createLoadList();
    },
    
    // Save the file stack with new password
    _LOAD_setNewPassword:function() {
      var tFile = data.get().split("\u001C").reverse();
      var pFile = tFile[fSystem.getCheckedValue("loadList")].split("\u001D");
      
      pFile[1] = g("_LOAD_newPasswordInput").value;
      if (pFile[1]=='') {pFile[1]="\u001F";}  // Remove password when blank
      pFile = pFile.join("\u001D");
      tFile[fSystem.getCheckedValue("loadList")] = pFile;
      tFile = tFile.reverse();
      data.set(tFile.join("\u001C"));
      
      g("_LOAD_newPassword").style.display = "none";
      g("_LOAD_fileContainer").style.display = "block";
      fSystem.toggleButtonState('loadMenu', false);
    }

  },
  
  manageObj:{
    // Create a file list for the manage menu
    createManageList:function() {
      var temp = data.get().split("\u001C");
      g("_MANAGE_dialogContainer").style.display = "none";
      
      if (temp[0] != '') {
        s=[];
        for (var i=0; i<temp.length; i++) {
          s.push("<label><input type='checkbox' name='manageList'>"+temp[i].split("\u001D")[0]+"<\/label>");
        }
        // Go from newest to oldest
        s.reverse();
        s = s.join('');
        
        g("_MANAGE_fileContainer").style.display = "block";
        g("_MANAGE_emptyStack").style.display = "none";
        g("_MANAGE_fileContainer").innerHTML = s;
      }
      else {
        g("_MANAGE_fileContainer").style.display = "none";
        g("_MANAGE_emptyStack").style.display = "block";
      }

      fSystem.toggleButtonState("manageMenu", false);  // Make sure all buttons are clickable
    },
    
    // Hide all Manage dialogs
    _MANAGE_hideDialogs:function() {
      var t = [g("_MANAGE_deletePrompt"), g("_MANAGE_copyPrompt"), g("_MANAGE_mergePrompt"), g("_MANAGE_noMergePrompt"), g("_MANAGE_dialogControls")];
      for (var i=0; i<t.length; i++) {
        t[i].style.display = "none";
      }
      
      g("_MANAGE_fileContainer").style.display = "none";
      g("_MANAGE_dialogContainer").style.display = "block";
      
      g("_MANAGE_noPrompt").onclick = function() {
        g("_MANAGE_dialogContainer").style.display = "none";
        g("_MANAGE_fileContainer").style.display = "block";
        fSystem.toggleButtonState("manageMenu", false);
      };
      
      fSystem.toggleButtonState("manageMenu", true);
    },
    
    // Create a dialog
    _MANAGE_deleteDialog:function() {
      if (fSystem.getCheckedValue("manageList")<0) {return;}  // No files selected
      
      this._MANAGE_hideDialogs();
      g("_MANAGE_deletePrompt").style.display = "block";
      g("_MANAGE_dialogControls").style.display = "block";
      g("_MANAGE_okPrompt").onclick = function() {
        fSystem.manageObj._MANAGE_delete();
      };
    },
    _MANAGE_copyDialog:function() {
      if (fSystem.getCheckedValue("manageList")<0) {return;}  // No files selected
      
      this._MANAGE_hideDialogs();
      g("_MANAGE_copyPrompt").style.display = "block";
      g("_MANAGE_dialogControls").style.display = "block";
      g("_MANAGE_okPrompt").onclick = function() {
        fSystem.manageObj._MANAGE_copy();
      };
    },
    _MANAGE_mergeDialog:function() {
      if (fSystem.getCheckedValue("manageList")<0) {return;}  // No files selected
      
      this._MANAGE_hideDialogs();
      g("_MANAGE_mergePrompt").style.display = "block";
      g("_MANAGE_dialogControls").style.display = "block";
      g("_MANAGE_okPrompt").onclick = function() {
        fSystem.manageObj._MANAGE_merge();
      };
    },
    
    // Delete selected files
    _MANAGE_delete:function() {
      var t = data.get().split("\u001C").reverse(), p=[];
      var list = document.getElementsByName("manageList");
      
      for (var i=0; i<list.length; i++) {
        // Splice out
        if (!list[i].checked) {
          p.push(t[i]);
        }
        else {
          if (fSystem.activeFile == (t.length-1)-i) {
            fSystem.activeFile = -1;
            g("fName").value = "";
          }
          else if (fSystem.activeFile > i) {
            fSystem.activeFile--;
          }
        }
      }
      
      p = p.reverse().join("\u001C");
      data.set(p);
      fSystem.manageObj.createManageList();
    },
    
    // Copy selected files
    _MANAGE_copy:function() {
      var t = data.get().split("\u001C").reverse(), p=[];
      var list = document.getElementsByName("manageList");
      
      for (var i=0; i<list.length; i++) {
        // Copy selected
        if (list[i].checked) {
          p.push(t[i]);
        }
      }

      for (var k=0; k<p.length; k++) {
        p[k] = p[k].split("\u001D");
        p[k][0] += "(2)";
        p[k] = p[k].join("\u001D");
      }

      data.set(t.reverse().concat(p).join("\u001C"));
      fSystem.manageObj.createManageList();
    },
    
    // Merge selected files
    _MANAGE_merge:function() {
      var list = document.getElementsByName("manageList");
      var t = data.get().split("\u001C").reverse(), p=[], q=[];
      
      for (var i=0; i<list.length; i++) {
        t[i] = t[i].split("\u001D");
        
        // Cannot merge files with passwords
        if (t[i][1]!="\u001F" && list[i].checked) {
          g("_MANAGE_mergePrompt").style.display = "none";
          g("_MANAGE_dialogControls").style.display = "none";
          g("_MANAGE_noMergePrompt").style.display = "block";
          g("_MANAGE_noMerge").onclick = function() {
            fSystem.manageObj.createManageList();
          };
          return;
        }
        // File should be merged, has no password
        else if (list[i].checked) {
          p.push([].concat(t[i]));
        }

        t[i] = t[i].join("\u001D");
      }
      
      // Combines file data
      for (var w=0; w<p.length; w++) {
        q.push([]);
        for (var x=3; x<10; x++) {
          q[w].push(p[w][x]); // Strips out old names, dates
        }
      }

      p = [];
      for (var y=0; y<q[0].length; y++) {
        p.push([]);
        for (var z=0; z<q.length; z++) {
          p[y].push(q[z][y]);
        }
        p[y] = p[y].join("\u001E");
      }
      
      // All-purpose file data
      p.push([0, 1, 2, 3, 4, 5].join("\u001F")); // Column order
      p.push([1, 0, 1, 1, 0, 0].join("\u001F")); // Column visiblity
      p.push([].concat(fSystem.dateObj.weekAcr).join("\u001F"));
      
      t = t.reverse();
      t.push(["New Merged File", "\u001F", fSystem.dateObj.getDate(), p.join("\u001D")].join("\u001D"));
      data.set(t.join("\u001C"));
      fSystem.manageObj.createManageList();
    }
  },
  
  dateObj:{
    weekdays:['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    weekAcr:['U', 'M', 'T', 'W', 'R', 'F', 'S'],
    is12Hour:false,
    
    getDate:function(){
      var t = new Date();
      return [t.getDay(), t.getFullYear(), t.getMonth()+1<10 ? "0"+(t.getMonth()+1) : t.getMonth()+1, t.getDate()<10 ? "0"+t.getDate() : t.getDate(), t.getHours()<10 ? "0"+t.getHours() : t.getHours(), t.getMinutes()<10 ? "0"+t.getMinutes() : t.getMinutes()].join("\u001F");
    },
    
    readDate:function(d) {
      var t = d.split("\u001F");
      if (this.is12Hour) {
        t[4] = parseInt(t[4], 10);
        t[5] += t[4]<12 ? " AM" : " PM";
        t[4] = t[4]%12;
        t[4] = t[4]==0 ? 12 : t[4];
      }
      return this.weekdays[t[0]]+", "+t[1]+"-"+t[2]+"-"+t[3]+" at "+t[4]+":"+t[5];
    }
  }
};