(function($) {
$.fn.tariffLookup = function(options) {
return new $.tariffLookup(options);
};
$.tariffLookup = function (options) {
var settings = $.extend({}, options);
var base = this;
var apiBase = "https://www.ucas.com/";
base.init = function () {
// Overrides the default autocomplete filter function to search only from the beginning of the string
// $.ui.autocomplete.filter = function (array, term) {
// parsedTerm = term.replace("-", " ");
// var matcher = new RegExp($.ui.autocomplete.escapeRegex(parsedTerm), "i");
// return $.grep(array, function (value) {
// return matcher.test(value.label || value.value || value);
// });
// };
// Overrides the default autocomplete filter function to search only from the beginning of the string
// + Max Fixes
$.ui.autocomplete.filter = function (array, term) {
parsedTerm = term.replace("-", " ");
// No autocomplete on single character searches
if (parsedTerm.length < 2) {
return;
}
var namedQualificationsLower = ["a level", "as", "as (double award)", "a level double award", "t level", "scottish higher"];
var namedQualificationIndexes = [];
var currentReturnArrayIndex = 0;
// Search term regex
var matcher = new RegExp($.ui.autocomplete.escapeRegex(parsedTerm), "i");
// Match search term to course results
var returnArray = $.grep(array, function (value, index) {
var match = matcher.test(value.label);
if (!match) {
return false
}
// Note return array index of any named qualifications detected
if (namedQualificationsLower.includes(value.label.toLowerCase())) {
namedQualificationIndexes.push(currentReturnArrayIndex);
}
currentReturnArrayIndex += 1;
return match;
});
// Moved named qualifications to top of results
if (namedQualificationIndexes.length !== 0) {
for (let i = 0; i < namedQualificationIndexes.length; i++) {
let index = namedQualificationIndexes[i];
let element = returnArray[index];
returnArray.splice(index, 1);
returnArray.unshift(element);
}
}
return returnArray.slice(0, 10);
};
$("#resetButton").click(function (e) {
e.preventDefault();
base.reset();
});
$("#addQualification").click(function (e) {
e.preventDefault();
base.addQualification();
});
$("#calculate-results").click(function (e) {
e.preventDefault();
base.updateTotal();
});
$("#qualificationContainer").on("click", ".remove-results", function (e) {
e.preventDefault();
base.removeResult(e.target);
});
$("#add-grade").change(function () {
$("#addQualificationPoints").text($("#add-grade").val());
});
$("#qualificationContainer").on("change", ".add-grade", function () {
var parent = $(this).closest(".qualCounter");
var points = $(this).val();
$(".points-box strong", parent).text(points);
});
$("#qualificationSearchBox").autocomplete({
source: base.filterSearchResults($("#qualificationSearchBox").val()),
select: function (event, ui) {
event.preventDefault();
$(this).val(ui.item.label);
$("#qualificationSearchBoxValue").val(ui.item.value);
$("#add-grade").text("");
$("#add-grade").removeAttr("disabled");
$("#add-grade").append($("").attr("Select"));
var grades = base.getGrades(ui.item.value);
base.populateGradesDropdown(grades, "#add-grade");
},
focus: function (event, ui) {
event.preventDefault();
$(this).val(ui.item.label);
$("#qualificationSearchBoxValue").val(ui.item.value);
$("#add-grade").text("");
$("#add-grade").removeAttr("disabled");
$("#add-grade").append($("").attr("Select"));
var grades = base.getGrades(ui.item.value);
base.populateGradesDropdown(grades, "#add-grade");
},
minLength: 1
}).autocomplete( "instance" )._renderItem = function( ul, item ) {
return $( "
" )
.append( "" + item.label + "" )
.appendTo( ul );
};
};
// Despite the name, this doesnt actually filter any search results, it just populates the initial results array
// base.filterSearchResults = function (searchTerm) {
// //searchTerm = searchTerm.replace("-", " ");
// var qualificationData = base.getQualificationData();
// var filteredArr = [];
// $.each(qualificationData, function (value, label) {
// if (label.toLowerCase().indexOf(searchTerm) >= 0) {
// filteredArr.push({
// label: $("").html(label).text(),
// value: value
// });
// }
// });
// return filteredArr;
// }
// ...re-written to remove pointless comparrisons
base.filterSearchResults = function (searchTerm) {
var qualificationData = base.getQualificationData();
var filteredArr = [];
$.each(qualificationData, function (value, label) {
filteredArr.push({
label: $("").html(label).text(),
value: value
});
});
return filteredArr;
}
base.addQualification = function () {
var qualificationName = $("#qualificationSearchBox").val();
var qualificationGrade = $("#add-grade").val();
var add = false;
if (qualificationName === "" || qualificationGrade == 0) {
alert("Please provide a qualification and grade");
}
else {
var qualificationId = $("#qualificationSearchBoxValue").val();
var qualificationSubject = $("#add-subject").val();
var qualificationPoints = $("#addQualificationPoints").text();
$("#qualificationSearchBox").val("");
$("#add-subject").val("");
$("#add-grade").html("")
$("#add-grade").attr("disabled", "disabled");
$("#add-grade").append($("").attr("value", 0).text("Select"));
$("#addQualificationPoints").html('0');
add = true;
}
if (add) {
var qualificationRowCounter = $('.qualCounter').length + 1;
if(qualificationRowCounter == 1) {
$("#yourQualifications").show();
}
var rowMarkup = "
" +
"
Qualification " + qualificationRowCounter + "
" +
"
" + qualificationName + "
" +
"
" +
"
" +
"
Subject (Optional)
" +
" " +
"
" +
"
" +
"
Grade
" +
"
" +
" " +
"
" +
"
" +
"
" +
"
Points
" +
"
" +
" " + qualificationPoints + "" +
"
" +
"
" +
"
" +
" " +
"
" +
"
" +
"
";
$("#qualificationContainer").append(rowMarkup);
var grades = base.getGrades(qualificationId);
base.populateGradesDropdown(grades, "#addGrade_" + qualificationRowCounter);
$("#addGrade_" + qualificationRowCounter).val(qualificationGrade);
}
};
base.getGrades = function (code) {
var url = apiBase + "api/tariff/v1/view/" + code;
$.ajax({
url: url,
type: 'GET',
cache: true,
dataType: 'json',
async: false,
success: function (json) {
result = json;
}
});
return result;
};
base.getQualificationData = function () {
$.ajax({
url: apiBase + "api/tariff/v1/list",
type: 'GET',
cache: true,
dataType: 'json',
async: false,
success: function (json) {
result = json;
}
});
return result;
};
base.populateGradesDropdown = function (grades, gradeDropdownId) {
var addGradeDropdown = $(gradeDropdownId);
addGradeDropdown.append($("").attr("value", 0).text("Select"));
$.each(grades, function (value, key) {
addGradeDropdown.append($("").attr("value", key).text(value));
});
};
base.addGrade = function (grade, points) {
results.css('display', 'table');
var row = $('