text: var DAYS = [
      ["Monday", "MON"],
      ["Tuesday", "TUE"],
      ["Wednesday", "WED"],
      ["Thursday", "THU"],
      ["Friday", "FRI"],
      ["Saturday", "SAT"],
      ["Sunday", "SUN"]
    ]
  
  var DAYS_MAP = {
          'mon': 'parking.Day("MON")',
          'tue': 'parking.Day("TUE")',
          'wed': 'parking.Day("WED")',
          'thu': 'parking.Day("THU")',
          'fri': 'parking.Day("FRI")',
          'sat': 'parking.Day("SAT")',
          'sun': 'parking.Day("SUN")',
          'tod': 'parking.today()'
      };
  
  
  Blockly.Blocks['datetime_day'] = {
    /**
     * Block for datetime day.
     * @this Blockly.Block
     */
    init: function() {
      this.jsonInit({
        "message0": "%1",
        "args0": [
          {
            "type": "field_dropdown",
            "name": "DAY",
            "options": [["Today", "TODAY"]].concat(DAYS)
          }
        ],
        "output": "DatetimeDay",
        "colour": DATA_HUE,
        "tooltip": "Returns a day of the week",
        "helpUrl": ""
      });
    }
  };
  Blockly.Python['datetime_day'] = function(block) {
      Blockly.Python.definitions_['import_parking'] = 'import parking';
      var operator = DAYS_MAP[block.getFieldValue('DAY').slice(0, 3).toLowerCase()];
      return [operator, Blockly.Python.ORDER_ATOMIC];
  };
  
  var HOURS = [["1", "1"], ["2", "2"], ["3", "3"],
               ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"],
               ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"],
               ["12", "12"]];
  var MINUTES = [["00", "00"], ["30", "30"]];
  var MERIDIANS = [["am", "AM"], ["pm", "PM"]];
  
  Blockly.Blocks['datetime_time'] = {
    /**
     * Block for datetime day.
     * @this Blockly.Block
     */
      init: function() {
          this.setColour(DATA_HUE);
          var dropdown = new Blockly.FieldDropdown([["Now", "NOW"]].concat(HOURS), function(opt) {
              var isNow = (opt == 'NOW');
              this.sourceBlock_.updateShape_(isNow);
          });
          this.appendDummyInput()
              .appendField(dropdown, 'HOUR');
          this.setInputsInline(true);
          this.setOutput(true, 'DatetimeTime');
          this.setTooltip("Returns a time of day");
      },
      mutationToDom: function() {
          var container = document.createElement('mutation');
          var isNow = (this.getFieldValue('HOUR').toUpperCase() == 'NOW');
          container.setAttribute('isnow', isNow);
          return container;
      },
      domToMutation: function(xmlElement) {
          var isNow = (xmlElement.getAttribute('isnow') == 'true');
          this.updateShape_(isNow);
      },
      updateShape_: function(isNow) {
          // Add or remove a Value Input.
          var inputExists = this.getInput('EXTENDED');
          if (!isNow) {
              if (!inputExists) {
                  var minuteMenu = new Blockly.FieldDropdown(MINUTES);
                  var meridianMenu = new Blockly.FieldDropdown(MERIDIANS);
                  this.appendDummyInput('EXTENDED')
                      .appendField(':')
                      .appendField(minuteMenu, 'MINUTE')
                      .appendField(meridianMenu, 'MERIDIAN');
              }
          } else if (inputExists) {
              this.removeInput('EXTENDED');
          }
      }
  };
  
  var HOURS_MAP = {
      '1': 'parking.one()',
      '2': 'parking.two()',
      '3': 'parking.three()',
      '4': 'parking.four()',
      '5': 'parking.five()',
      '6': 'parking.six()',
      '7': 'parking.seven()',
      '8': 'parking.eight()',
      '9': 'parking.nine()',
      '10': 'parking.ten()',
      '11': 'parking.eleven()',
      '12': 'parking.twelve()',
      'NOW': 'parking.now()'
  };
  var MINUTES_MAP = {
      '00': 'parking.exactly()',
      '30': 'parking.half()'
  }
  var MERIDIANS_MAP = {
      'AM': 'parking.am()',
      'PM': 'parking.pm()'
  }
  
  Blockly.Python['datetime_time'] = function(block) {
      Blockly.Python.definitions_['import_parking'] = 'import parking';
      var hour = block.getFieldValue('HOUR');
      var code;
      if (hour == "NOW") {
          code = "parking.now()";
      } else {
          var minute = parseInt(block.getFieldValue('MINUTE'));
          var meridian = Blockly.Python.quote_(block.getFieldValue('MERIDIAN'));
          code = 'parking.Time('+hour+','+minute+','+meridian+')';
      }
      return [code, Blockly.Python.ORDER_ATOMIC];
  };
  
  var convertDate = function(date) {
      date = date.slice(0, 3).toLowerCase();
      switch (date) {
          case "mon": return "Monday";
          case "tue": return "Tuesday";
          case "wed": return "Wednesday";
          case "thu": return "Thursday";
          case "fri": return "Friday";
          case "sat": return "Saturday";
          case "sun": return "Sunday";
          default: return date;
      }
  }
  var convertMinute = function(minute) {
      if (minute < 10) {
          return "0"+minute;
      } else {
          return ""+minute;
      }
  }
  
  PythonToBlocks.KNOWN_MODULES['parking'] = {
      "today": ["datetime_day", ["DAY", "TODAY"]],
      "day_compare": ["datetime_check_day", "OP", 
                              {"type": "variable", "mode": "value", "name": "LEFT"}, 
                              {"type": "mapper", "name": "VALUE", "method": convertDate}],
      "Day": ["datetime_day", {"type": "mapper", "name": "DAY", "method": convertDate}],
      "now": ["datetime_time", ["HOUR", "NOW"]],
      "Time": ["datetime_time", {"type": "integer", "name": "HOUR", "add_mutation": {"name": "@isnow", "value": "false"}}, 
                               {"type": "integer_mapper", "name": "MINUTE", "method": convertMinute}, 
                               "MERIDIAN"],
      "time_compare": ["datetime_check_time", "OP",
                              {"type": "variable", "mode": "value", "name": "LEFT"}, 
                              {"type": "integer", "name": "HOURS"},
                              {"type": "integer_mapper", "name": "MINUTES", "method": convertMinute},
                              "MERIDIANS"]
  };
  
  var equalityOperators = [
      ["==", "IS"],
      ["<", "BEFORE"],
      [">", "AFTER"],
      ["<=", "BEFORE_EQUAL"],
      ["=>", "AFTER_EQUAL"],
      ["!=", "IS_NOT"]
  ];
  var equalityOperatorsConversions = {
      "IS": "parking.equal",
      "BEFORE": "parking.before",
      "AFTER": "parking.after",
      "BEFORE_EQUAL": "parking.before_equal",
      "AFTER_EQUAL": "parking.after_equal",
      "IS_NOT": "parking.not_equal",
  }
  // FINISH _time and _day
  // Add in numbers and days to KNOWN_MODULES
  
  Blockly.Blocks['datetime_check_day'] = {
    /**
     * Block for testing if something contains something.
     * @this Blockly.Block
     */
    init: function() {
      this.setColour(Blockly.Blocks.logic.HUE);
      this.setOutput(true, 'Boolean');
      this.appendValueInput('LEFT')
          .setCheck('DatetimeDay')
          .appendField(new Blockly.FieldDropdown(DAYS), 'VALUE')
          .appendField(new Blockly.FieldDropdown(equalityOperators), 'OP');
      
      this.setInputsInline(false);
    }
  };
  
  Blockly.Python['datetime_check_day'] = function(block) {
      Blockly.Python.definitions_['import_parking'] = 'import parking';
      var value = Blockly.Python.quote_(block.getFieldValue('VALUE'));
      var operator = Blockly.Python.quote_(block.getFieldValue('OP'));
      var left = Blockly.Python.valueToCode(block, 'LEFT', Blockly.Python.ORDER_ATOMIC) || "___";
      var code = "parking.day_compare(" + operator + ", " + left + ', ' + value + ")";
      return [code, Blockly.Python.ORDER_ATOMIC];
  };
  
  
  Blockly.Blocks['datetime_check_time'] = {
    /**
     * Block for testing if something contains something.
     * @this Blockly.Block
     */
    init: function() {
      this.setColour(Blockly.Blocks.logic.HUE);
      this.setOutput(true, 'Boolean');
      this.appendValueInput('LEFT')
          .setCheck('DatetimeTime')
          .appendField(new Blockly.FieldDropdown(HOURS), 'HOURS')
          .appendField(':')
          .appendField(new Blockly.FieldDropdown(MINUTES), 'MINUTES')
          .appendField(new Blockly.FieldDropdown(MERIDIANS), 'MERIDIANS')
          .appendField(new Blockly.FieldDropdown(equalityOperators), 'OP');
      //this.setInputsInline(true);
    }
  };
  
  Blockly.Python['datetime_check_time'] = function(block) {
      Blockly.Python.definitions_['import_parking'] = 'import parking';
      var hour = parseInt(block.getFieldValue('HOURS'));
      var minute = parseInt(block.getFieldValue('MINUTES'));
      var meridian = Blockly.Python.quote_(block.getFieldValue('MERIDIANS'));
      var operator = Blockly.Python.quote_(block.getFieldValue('OP'));
      var left = Blockly.Python.valueToCode(block, 'LEFT', Blockly.Python.ORDER_ATOMIC)
      var code = "parking.time_compare(" + operator+", "+left + ',' + hour + ',' + minute + ',' +meridian + ")";
      return [code, Blockly.Python.ORDER_ATOMIC];
  };