(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 = $('
    ').appendTo(results).addClass('result-row').addClass('result'); $('').appendTo(row).addClass('qualification').text(qualification); $('').appendTo(row).addClass('grades').text(grade); $('').appendTo(row).addClass('points').text(points); grades.empty(); $(select).val('_none'); base.updateTotal(points); }; base.updateTotal = function () { var totalPoints = 0; $("#qualificationContainer .add-grade").each(function (index) { totalPoints += parseInt($(this).val()); }); $(".total-points-box").text(totalPoints); }; base.removeResult = function (item) { var container = $(item).closest(".qualCounter"); container.remove(); var counter = 1; $("#qualificationContainer .qualCounter").each(function () { $(".position", this).text("Qualification " + counter++); }); if($('.qualCounter').length <= 0) { $("#yourQualifications").hide(); } }; base.reset = function () { $("#qualificationSearchBox").val(""); $("#add-subject").val(""); $("#add-grade").html("") $("#add-grade").attr("disabled", "disabled"); $("#add-grade").append($("").attr("value", 0).text("Select")); $("#addQualificationPoints").html('0'); $("#qualificationContainer").empty(); $(".total-points-box").text('0'); $("#yourQualifications").hide(); }; base.init(); }; })(jQuery);