Awesomeness Calc
by longmatthewh
HTML
<form id="awesome-form">
<label for="first-name">First Name:</label>
<input name="firstName" id="first-name" />
<fieldset>
<legend>Are you a developer?</legend>
<input name="developer" id="developer-yes" type="radio" value="true" />
<label for="developer-yes">Yes</label>
<input name="developer" id="developer-no" type="radio" value="false" />
<label for="developer-no">No</label>
</fieldset>
<fieldset>
<legend>Do you own a guitar?</legend>
<input name="guitar" id="guitar-yes" type="radio" value="true" />
<label for="guitar-yes">Yes</label>
<input name="guitar" id="guitar-no" type="radio" value="false" />
<label for="guitar-no">No</label>
</fieldset>
<fieldset>
<legend>What's your favorite browser?</legend>
<input name="browser" id="browser-ie" type="radio" value="ie" />
<label for="browser-ie">Internet Explorer</label>
<br>
<input name="browser" id="browser-chrome" type="radio" value="chrome" />
<label for="browser-chrome">Chrome</label>
<br>
<input name="browser" id="browser-firefox" type="radio" value="firefox" />
<label for="browser-firefox">Firefox</label>
</fieldset>
<input type="submit" value="How awesome am I?">
</form>
<div id="score" aria-live="polite"></div>
JavaScript
$('#awesome-form').submit(function (e) {
e.preventDefault();
var awesomeData = {
firstName: $('#first-name').val(),
favoriteBrowser: $('[name="browser"]:checked').val(),
ownsGuitar: $('[name="guitar"]:checked').val(),
isDeveloper: $('[name="developer"]:checked').val()
};
var awesomenessCalc = new AwesomenessCalc(awesomeData);
$('#score').html('Your awesomeness score is ' + awesomenessCalc.getScore() + '!');
});
function AwesomenessCalc(data) {
this.firstName = data.firstName;
this.ownsGuitar = data.ownsGuitar;
this.isDeveloper = data.isDeveloper;
this.favoriteBrowser = data.favoriteBrowser;
this.getScore = function () {
var score = 0;
score += calcItemScore(this.firstName, ['matt'], 50);
score += calcItemScore(this.favoriteBrowser, ['ie', 'internet explorer'], -60);
score += calcItemScore(this.favoriteBrowser, ['firefox', 'chrome'], 30);
score += (this.isDeveloper) ? 10 : 0;
score += (this.ownsGuitar) ? 10 : 0;
return score;
};
function calcItemScore(dataItem, matches, score) {
if (dataItem && isMatch(dataItem, matches)) {
return score;
}
return 0;
}
function isMatch(dataItem, matches) {
var isMatch = false;
var lowerCaseDataItem = dataItem.toLowerCase();
$.each(matches, function (index, value) {
if (lowerCaseDataItem.indexOf(value) > -1) {
isMatch = true;
}
});
return isMatch;
}
}