A quick questionnaire for someone unsure if they're able to vote.
Data from ProCon.org and driven by the following spreadsheet.
A quick questionnaire for someone unsure if they're able to vote.
Data from ProCon.org and driven by the following spreadsheet.
| // Generates the JSON from http://felonvoting.procon.org/view.resource.php?resourceID=000286 | |
| var states = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DC', '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', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY'] | |
| var data = {} | |
| $('tr') | |
| .filter(function() { | |
| return (($(this).find('td:first').text()[0] || '').match(/\d/) | |
| && $(this).find('td:eq(1)').text().length > 0) }) | |
| .slice(51, 102) | |
| .map( function() { | |
| var inmates_vote = $(this).find('td:eq(11) img').length > 0, | |
| parolees_vote = $(this).find('td:eq(7) img').length > 0 || inmates_vote, | |
| probationaries_vote = $(this).find('td:eq(9) img').length > 0 || parolees_vote, | |
| felons_vote = $(this).find('td:eq(3) img').length < 1 || probationaries_vote | |
| return { | |
| state: $(this).find('td:eq(1)').text(), | |
| inmates_vote: inmates_vote, | |
| parolees_vote: parolees_vote, | |
| probationaries_vote: probationaries_vote, | |
| felons_vote: felons_vote }}) | |
| .each( function(i, el) { data[ states[i] ] = el }) | |
| console.log( JSON.stringify(data) ) // JSON Format | |
| flat = [["State Abreviation", | |
| "State Name", | |
| "Inmates Vote?", | |
| "Parolees Vote?", | |
| "Probationaries Vote?", | |
| "Felons Vote?"].join("\t")] | |
| for(var abv in data) { | |
| var state = states[abv].state | |
| flat.push([abv, | |
| state.state, | |
| states.inmates_vote ? 'Yes' : 'No', | |
| states.parolees_vote ? 'Yes' : 'No', | |
| states.probationaries_vote ? 'Yes' : 'No', | |
| states.felons_vote ? 'Yes' : 'No'].join("\t")) | |
| } | |
| console.log( flat.join("\n") ) // Spreadsheet Format |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <style> | |
| body { | |
| font-family: sans-serif; | |
| text-align: center; | |
| padding: 50px 0; | |
| } | |
| h1 { | |
| margin: 0 auto; | |
| width: 80%; | |
| } | |
| select { | |
| font-size: 24px; | |
| } | |
| button { | |
| font-size: 18px; | |
| padding: 8px 14px; | |
| background: white; | |
| margin: 0 10px; | |
| } | |
| </style> | |
| <script src="questionnaire.js"></script> | |
| <script> | |
| function handleGoogle(result) { | |
| window.rights_by_state = {} | |
| for(var i = 0; i < result.feed.entry.length; i ++) { | |
| var raw_state = result.feed.entry[i], | |
| content = raw_state.content['$t'].split(', '), | |
| state = { } | |
| for( var j = 0; j < content.length; j++ ) { | |
| var entry = content[j].split(': '), | |
| key = entry[0], | |
| value = entry = entry[1] | |
| if( key === 'state' ) state.state = value | |
| else state[key+'_vote'] = value === 'Yes' | |
| } | |
| var option = document.createElement('option') | |
| option.value = raw_state.title['$t'] | |
| option.innerText = state.state | |
| states.appendChild(option) | |
| rights_by_state[raw_state.title['$t']] = state | |
| } | |
| states.onchange = function() { | |
| if( this.value ) { | |
| this.parentElement.style.display = 'none' | |
| questionnaire.style.display = 'block' | |
| new Questionnaire(questionnaire , rights_by_state[this.value]) | |
| } | |
| } | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <div> | |
| <h1>Curious if you can Vote?</h1> | |
| <br /> | |
| <p>Check whether you're eligibile by using this simple form. Data from <a href="http://felonvoting.procon.org/view.resource.php?resourceID=000286">ProCon.org</a></p> | |
| <select id="states"><option>Select your State</option></select> | |
| </div> | |
| <form id="questionnaire" style="display:none"> | |
| <h1 id="question">Have you ever been convicted of a felony?</h1> | |
| <br /> | |
| <button class="yes">Yes</button> | |
| <button class="no">No</button> | |
| </form> | |
| <script src="https://spreadsheets.google.com/feeds/list/1L4AnQNuFQBf1WI5BAd4cuqOrD0M8-dCuaA4syutLDR0/od6/public/basic?alt=json-in-script&callback=handleGoogle"></script> | |
| </body> | |
| </html> |
| function Questionnaire(form, state) { | |
| this.state = state | |
| this.step = 0 | |
| this.clicked = null | |
| this.flow = { | |
| false: true, | |
| true: { | |
| true: 'probationaries_voteinmates_vote', | |
| false: { | |
| true: 'inmates_vote', | |
| false: { | |
| true: 'parolees_vote', | |
| false: 'felons_vote' | |
| } | |
| } | |
| } | |
| } | |
| this.steps = [{ | |
| step: "felons", | |
| question: "Have you ever been convicted of a felony?", | |
| }, { | |
| step: "probationaries", | |
| question: "Are you currently on probation?" | |
| }, { | |
| step: "inmates", | |
| question: "Are you currently incarcerated?", | |
| }, { | |
| step: "parolees", | |
| question: "Are you currently on parole?" | |
| }] | |
| this.stateConditions = function() { | |
| var conditions = this.state_steps.filter(function(el) { return state[el] }).length | |
| return this.state.state + [null, | |
| ' after completing your sentence including prison, parole, and probation.', | |
| ' after completing your sentence including prison and parole. If you are on probation you can vote.', | |
| ' after completing your sentence including prison. If you are on parole or probation you can vote.', | |
| '. If you are in prison, on parole, or on probation you can vote.'][conditions] | |
| } | |
| this.state_steps = ['probationaries_vote', 'inmates_vote', 'parolees_vote', 'felons_vote'] | |
| this.can_vote = ["Based on your response, you sound eligible", | |
| "to vote in", | |
| this.stateConditions(), | |
| "You can use the following voter", | |
| "registration tool to get registered" | |
| ].join(' ') | |
| this.cannot_vote = ["Based on your response, we believe that", | |
| this.state.state, | |
| "does not allow you to vote. Please sign", | |
| "this petition encouraging the state to take", | |
| "action to allow all citizens to participate" | |
| ].join(' ') | |
| this.endStep = function(verdict, form) { | |
| var verdict = verdict ? "can_vote" : "cannot_vote" | |
| form.innerHTML = "<h1>" + this[verdict] + "</h1>" | |
| } | |
| this.wall = function(step) { | |
| var state = this.state | |
| return this.state_steps.slice(step, 4).filter(function(el) { | |
| return state[el] | |
| }).length < 1 | |
| } | |
| this.window = function(step) { | |
| var state = this.state | |
| return this.state_steps.slice(step, 4).filter(function(el) { | |
| return !state[el] | |
| }).length < 1 | |
| } | |
| this.nextStep = function(form) { | |
| var state = this.flow[this.clicked] | |
| if(typeof state === 'object') { | |
| this.step += 1 | |
| if( this.wall(this.step) ) { | |
| this.endStep(false, form) | |
| } else if ( this.window(this.step) ) { | |
| this.endStep(true, form) | |
| } else { | |
| this.flow = state | |
| form.querySelector('h1').innerText = this.steps[this.step].question | |
| } | |
| } else { | |
| if( typeof state === 'boolean' ) this.endStep(state, form) | |
| else this.endStep(this.state[state], form) | |
| } | |
| return false | |
| } | |
| var that = this | |
| form.querySelector('.yes').onclick = function() { | |
| that.clicked = true | |
| } | |
| form.querySelector('.no').onclick = function() { | |
| that.clicked = false | |
| } | |
| form.onsubmit = function() { | |
| return that.nextStep(this) | |
| } | |
| return this | |
| } |
| // Example of data after it's transformed from a request to google spreadsheets. | |
| // Data stored in https://docs.google.com/spreadsheets/d/1L4AnQNuFQBf1WI5BAd4cuqOrD0M8-dCuaA4syutLDR0/pubhtml | |
| // and transformed into the following format | |
| { | |
| "AL": { | |
| "state": "Alabama", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "AK": { | |
| "state": "Alaska", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "AZ": { | |
| "state": "Arizona", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "AR": { | |
| "state": "Arkansas", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "CA": { | |
| "state": "California", | |
| "inmates_vote": false, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "CO": { | |
| "state": "Colorado", | |
| "inmates_vote": false, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "CT": { | |
| "state": "Connecticut", | |
| "inmates_vote": false, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "DC": { | |
| "state": "District of Columbia", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "DE": { | |
| "state": "Delaware", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "FL": { | |
| "state": "Florida", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "GA": { | |
| "state": "Georgia", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "HI": { | |
| "state": "Hawaii", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "ID": { | |
| "state": "Idaho", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "IL": { | |
| "state": "Illinois", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "IN": { | |
| "state": "Indiana", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "IA": { | |
| "state": "Iowa", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "KS": { | |
| "state": "Kansas", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "KY": { | |
| "state": "Kentucky", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "LA": { | |
| "state": "Louisiana", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "ME": { | |
| "state": "Maine", | |
| "inmates_vote": true, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "MD": { | |
| "state": "Maryland", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "MA": { | |
| "state": "Massachusetts", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "MI": { | |
| "state": "Michigan", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "MN": { | |
| "state": "Minnesota", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "MS": { | |
| "state": "Mississippi", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "MO": { | |
| "state": "Missouri", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "MT": { | |
| "state": "Montana", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "NE": { | |
| "state": "Nebraska", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "NV": { | |
| "state": "Nevada", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "NH": { | |
| "state": "New Hampshire", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "NJ": { | |
| "state": "New Jersey", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "NM": { | |
| "state": "New Mexico", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "NY": { | |
| "state": "New York", | |
| "inmates_vote": false, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "NC": { | |
| "state": "North Carolina", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "ND": { | |
| "state": "North Dakota", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "OH": { | |
| "state": "Ohio", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "OK": { | |
| "state": "Oklahoma", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "OR": { | |
| "state": "Oregon", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "PA": { | |
| "state": "Pennsylvania", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "RI": { | |
| "state": "Rhode Island", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "SC": { | |
| "state": "South Carolina", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "SD": { | |
| "state": "South Dakota", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "TN": { | |
| "state": "Tennessee", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| }, | |
| "TX": { | |
| "state": "Texas", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "UT": { | |
| "state": "Utah", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "VT": { | |
| "state": "Vermont", | |
| "inmates_vote": true, | |
| "parolees_vote": true, | |
| "probationaries_vote": true, | |
| "felons_vote": true | |
| }, | |
| "VA": { | |
| "state": "Virginia", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "WA": { | |
| "state": "Washington", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "WV": { | |
| "state": "West Virginia", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "WI": { | |
| "state": "Wisconsin", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": true | |
| }, | |
| "WY": { | |
| "state": "Wyoming", | |
| "inmates_vote": false, | |
| "parolees_vote": false, | |
| "probationaries_vote": false, | |
| "felons_vote": false | |
| } | |
| } |