var VALID_STATES = "AL,AZ,AR,CA,CO,CT,DE,FL,GA,HI,ID,IL,IN,IA,KS,KY,LA,ME,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,OH,OK,RI,SC,SD,TN,TX,UT,VA,VT,WV,WI,WY";

var VALID_STATE_NAMES = new Array(
    "Alabama",
    "Arizona",
    "Arkansas",
    "California",
    "Colorado",
    "Connecticut",
    "Delaware",
    "Florida",
    "Georgia",
    "Hawaii",
    "Idaho",
    "Illinois",
    "Indiana",
    "Iowa",
    "Kansas",
    "Kentucky",
    "Louisiana",
    "Maine",
    "Maryland",
    "Massachusetts",
    "Michigan",
    "Minnesota",
    "Mississippi",
    "Missouri",
    "Montana",
    "Nebraska",
    "Nevada",
    "New Hampshire",
    "New Jersey",
    "New Mexico",
    "New York",
    "North Carolina",
    "North Dakota",
    "Ohio",
    "Oklahoma",
    "Rhode Island",
    "South Carolina",
    "South Dakota",
    "Tennessee",
    "Texas",
    "Utah",
    "Virginia",
    "Vermont",
    "West Virginia",
    "Wisconsin",
    "Wyoming");
var LICENSE_FORMAT = new Array(
    "^(\\d{7})|([a-zA-Z]{1}\\d{6})$",
    "^(\\d{9})|([a-zA-Z]{1}\\d{8})$",
    "^([0]{1}\\d{7})|(\\d{9})$",
    "^[a-zA-Z]{1}\\d{7}$",
    "^(\\d{9})|([a-zA-Z]{1}\\d{0,6})$",
    "^\\d{9}$",
    "^\\d{1,7}$",
    "^[a-zA-Z]{1}\\d{12}$",
    "^\\d{7,9}$",
    "^(\\d{9})|([hH]{1}\\d{8})",
    "^([a-zA-Z]{2}\\d{6}[a-zA-Z]{1})|(\\d{9})$",
    "^[a-zA-Z]{1}\\d{11}$",
    "^(\\d{10})|([a-zA-Z]{1}\\d{9})$",
    "^([a-zA-Z]|\\d){9}$",
    "^(\\d{9})|([kK]{1}\\d{8})$",
    "^[a-zA-Z]{1}\\d{8}$",
    "^[0]{2}\\d{7}$",
    "^\\d{7}$",
    "^[a-zA-Z]{1}\\d{12}$",
    "^(\\d{9})|([sS]\\d{8})$",
    "^[a-zA-Z]{1}\\d{12}$",
    "^[a-zA-Z]{1}\\d{12}$",
    "^\\d{9}$",
    "^(\\d{9})|([a-zA-Z]{1}\\d{5,9})$",
    "^(\\d{13})|(([a-zA-Z]|\\d){9})$",
    "^[a-zA-Z]{1}\\d{3,8}$",
    "^(\\d{10})|(\\d{12})|([xX]\\d{8})$",
    "^\\d{2}[a-zA-Z]{3}\\d{5}",
    "^[a-zA-Z]{1}\\d{14}$",
    "^\\d{9}$",
    "^(\\d{9})|([a-zA-Z]{1}\\d{18})$",
    "^\\d{1,12}$",
    "^(\\d{9})|([a-zA-Z]{3}\\d{6})$",
    "^[a-zA-Z]{2}\\d{6}$",
    "^\\d{9}$",
    "^(\\d{7})|([vV]{1}\\d{6})$",
    "^\\d{7,9}$",
    "^(\\d{6})|(\\d{8,9})$",
    "^\\d{7,9}$",
    "^\\d{8}$",
    "^\\d{4,10}$",
    "^(\\d{9})|([a-zA-Z]{1}\\d{8})$",
    "^([a-zA-Z]|\\d){8}$",
    "^([a-zA-Z]|\\d){7}$",
    "^[a-zA-Z]{1}\\d{13}$",
    "^\\d{9}$");

var FORMAT_EXPLANATION = new Array(
    "7 digits, or 1 letter and 6 digits",
    "9 digits, or 1 letter and 8 digits",
    "a 0 and 7 digits, or 9 digits",
    "1 letter and 7 digits",
    "9 digits, or 1 letter and up to 6 digits",
    "9 digits",
    "between 1 and 7 digits",
    "1 letter and 12 digits",
    "between 7 and 9 digits",
    "9 digits, or the letter H and 8 digits",
    "2 letters, 6 digits and a 1 letter, or 9 digits",
    "1 letter and 11 digits",
    "10 digits, or 1 letter and 9 digits",
    "9 alpha-numerics",
    "9 digits, or the letter K and 8 digits",
    "1 letter and 8 digits",
    "two zeroes and 7 digits",
    "7 digits",
    "1 letter and 12 digits",
    "9 digits, or the letter S and 8 digits",
    "1 letter and 12 digits",
    "1 letter and 12 digits",
    "9 digits",
    "9 digits, or 1 letter and between 5 and 9 digits",
    "13 digits, or 9 alpha-numerics",
    "1 letter and between 3 and 8 digits",
    "10 digits, 12 digits or the letter X and 8 digits",
    "2 digits, 3 letters and 5 digits",
    "1 letter and 14 digits",
    "9 digits",
    "9 digits, or 1 letter and 18 digits",
    "between 1 and 12 digits",
    "9 digits, or 3 letters and 6 digits",
    "2 letters and 6 digits",
    "9 digits",
    "7 digits, or the letter V and 6 digits",
    "between 7 and 9 digits",
    "6, 8 or 9 digits",
    "between 7 and 9 digits",
    "8 digits",
    "between 4 and 10 digits",
    "9 digits, or 1 letter and 8 digits",
    "8 alpha-numerics",
    "7 alpha-numerics",
    "1 letter and 13 digits",
    "9 digits");

function validateDl(state, dlNo) {
    if (!state.match("^[a-zA-Z][a-zA-Z]$")) {
        return "Invalid state";
    }
    else {
        var stateNo = VALID_STATES.indexOf(state.toUpperCase());
        if (stateNo == -1) {
            return "Unknown state";
        }
        else {
            if (dlNo == null) {
                return "License number is required";
            }
            else {
                stateNo = stateNo/3;
                if (!dlNo.match(LICENSE_FORMAT[stateNo])) {
                    return "For the state of " + VALID_STATE_NAMES[stateNo] + ", license number must be " + FORMAT_EXPLANATION[stateNo];
                }
            }
        }
    }
    return null;}
