﻿var xHLConst = {
    FIELD_VALIDATION_ERROR_CLASS: 'error',
    MODEL_ELEMENT_ID: '__model',
    HIDDEN_FIELDSET_ID: '__hiddenFieldSet',
    ACTIVE_FIELD_ELEMENT_ID: '__activeFieldName',
    NONE_ACTIVE_FIELD_ELEMENT_ID: '__noneActiveFieldName',
    NAV_BACK: '__navBack',
    THIS_VIEW_FIELD_ID: '__thisView',
    NEXT_VIEW_FIELD_ID: '__nextView',
    PREV_VIEW_FIELD_ID: '__prevView'
}

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun)
  {
    var len = this.length;
    if (typeof fun != 'function')
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

$(document).ready(function(){
	friPageFunctions.init();	
})

var friPageFunctions = {
 	init : function(){
 	    $('#ClientHasJavaScript').val('True');
    }
}

var friUtility = {
    tryParseInt: function(str, defaultValue) {
        var retValue = defaultValue;
        if (str != null) {
            if (!isNaN(str)) {
                var result = parseInt(str);
                if (!isNaN(result)) { retValue = result };
            }
        }
        return retValue;
    },

    getAgeInYears: function(year, month, day) {
        var now = new Date();
        var age = now.getFullYear() - year;
        var thisYearsBirthday = new Date(year + age, month - 1, day);

        if (now < thisYearsBirthday) age--;

        return age;
    },

    isValidDate: function(year, month, day) {
        try {
            var testDate = new Date(year, month - 1, day);
            if (testDate.getFullYear() != year
                || testDate.getMonth() != month - 1
                || testDate.getDate() != day
                ) {
                return false;
            }
            return true;
        }
        catch (err) {
            return false;
        }
    },

    getExpectedTescoDigits: function(TescoClubCardNumber) {

        var EighteenDigitPrefixes = ['634004', '634000', '634006', '6340024', '6340023'];
        var SixteenDigitPrefixes = ['634001', '430567', '401343', '401344', '402939', '465590', '518645', '518652', '520641', '552188', '6340049', '6340009'];

        for (var i = 0; i < EighteenDigitPrefixes.length; i++) {
            if (TescoClubCardNumber.indexOf(EighteenDigitPrefixes[i]) == 0) {
                return 18;
            }
        };

        for (var i = 0; i < SixteenDigitPrefixes.length; i++) {
            if (TescoClubCardNumber.indexOf(SixteenDigitPrefixes[i]) == 0) {
                return 16;
            }
        };

        return 0;
    },

    tescoClubCardCheckDigit: function(TescoClubCardNumber) {
        var checkPosition = 0;
        var checkSum = 0;
        var weightedDigit;
        var clubCardDigit;

        for (var i = 0; i < TescoClubCardNumber.length - 1; i++) {
            clubCardDigit = parseInt(TescoClubCardNumber[i]);
            weightedDigit = (((++checkPosition) % 2) + 1) * clubCardDigit;
            checkSum += weightedDigit % 10 + Math.floor(weightedDigit / 10);
        }

        var checkDigit = (10 - checkSum % 10) % 10;
        if (checkDigit == TescoClubCardNumber.charAt(TescoClubCardNumber.length - 1)) {
            return true;
        }
        return false;
    },

    padTescoClubCardNumber: function(TescoClubCardNumber) {
        if (TescoClubCardNumber.length == 16) {
            return '00' + TescoClubCardNumber;
        }
        return TescoClubCardNumber;
    },

    isPasswordStrong: function(password) {
        return password.length >= 6 && password.match(/\d+/);
    },

    validateTelephone: function(telephoneNumber) {
        if (telephoneNumber.length == 0) {
            return true;
        }
        return telephoneNumber.match(/^0[0-9 ]{9,}$/);
    },

    validateFriPostcode: function(value, element, params) {
        return validatePostcode(value);
    },

    validatePostcode: function(postcode) {
        var alpha1 = "[abcdefghijklmnoprstuwyz]";
        var alpha2 = "[abcdefghklmnopqrstuvwxy]";
        var alpha3 = "[abcdefghjkstuw]";
        var alpha4 = "[abehmnprvwxy]";
        var alpha5 = "[abdefghjlnpqrstuwxyz]";

        var Expressions = new Array();

        Expressions[0] = "^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
        Expressions[1] = "^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
        Expressions[2] = "^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
        Expressions[3] = "^(GIR)(\\s*)(0AA)$";
        Expressions[4] = "^(bfpo)(\\s*)([0-9]{1,4})$";
        Expressions[5] = "^(bfpo)(\\s*)(c\\/o\\s*[0-9]{1,3})$";

        for (var i = 0; i < Expressions.length; i++) {

            var rexp = new RegExp(Expressions[i], "gim");
            var match = rexp.exec(postcode);

            if (match != null) {
                return true
            }

        }
        return false
    },

    isHiddenField: function(el) {
        return $(el).closest('#__hiddenFieldSet').length > 0;
    },

    validateRegex: function(stringToValidate, regexString) {
        var rexp = new RegExp(regexString, 'gim');
        var match = rexp.exec(stringToValidate);
        if (match != null) {
            return true
        }
    },

    validateGuiText: function(stringToValidate) {
        if (stringToValidate.match(/^[\w\s!%^&*()_\-+={}[\];:¬`@#~\]*^[0\s]*$/i)) {
            return true;
        }
        else {
            return false;
        }
    }
}

Function.prototype.memoize = function() {

    var pad  = {};
    var self = this;
    var obj  = arguments.length > 0 ? arguments[i] : null;

    var memoizedFn = function() {

        var args = [];
        for (var i = 0; i < arguments.length; i++) {
            args[i] = arguments[i];
        }

        if (!(args in pad)) {
            pad[args] = self.apply(obj, arguments);
        }

        return pad[args];
    }

    memoizedFn.unmemoize = function() {
        return self;
    }

    return memoizedFn;
}

Function.prototype.unmemoize = function() {
    alert("Attempt to unmemoize an unmemoized function.");
    return null;
}

function memo(f) {  
  return function () {  
      var args = Array.prototype.slice.call(arguments);  
      f.memo = f.memo || {};  
      return (args in f.memo)? f.memo[args] :  
                     f.memo[args] = f.apply(this, args);  
  };  
}

function GetFormattedPostcode(postcode)
{
    var firstPart = "";
    var secondPart = "";
    return GetPostcodeParts(postcode, firstPart, secondPart);
}

function GetPostcodeParts(postcode, firstPart, secondPart)
{
    var postcodePartsRegEx = "^([a-zA-Z]{1,2}\\d[\\da-zA-Z]?) *(\\d[a-zA-Z]{2})$";
    var rexp = new RegExp(postcodePartsRegEx, "gim");
    var match = rexp.exec(postcode);
    if (match!=null)
    {
        if (match.length == 3)
        {
            firstPart = match[1];
            secondPart = match[2];
            return firstPart + " " + secondPart;
        }
        else
        {
            throw new Exception(postcode + " is not a real postcode, it produced '" + match.Groups.Count + "' matches");
        }
    }
    else
    {
        throw new Exception(postcode + " is not a real postcode, the Regex match was not a success");
    }
    return firstPart + " " + secondPart;
}

function ValidatePostcode(postcode)
{
//  debugger;
  var alpha1 = "[abcdefghijklmnoprstuwyz]";
  var alpha2 = "[abcdefghklmnopqrstuvwxy]";
  var alpha3 = "[abcdefghjkstuw]";
  var alpha4 = "[abehmnprvwxy]";
  var alpha5 = "[abdefghjlnpqrstuwxyz]";
  
  var Expressions=new Array();
  
  Expressions[0] = "^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
  Expressions[1] = "^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
  Expressions[2] = "^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$";
  Expressions[3] = "^(GIR)(\\s*)(0AA)$";
  Expressions[4] = "^(bfpo)(\\s*)([0-9]{1,4})$";
  Expressions[5] = "^(bfpo)(\\s*)(c\\/o\\s*[0-9]{1,3})$";
            
  for (var i=0;i<Expressions.length; i++) {
  
    var rexp = new RegExp(Expressions[i], "gim");
    var match = rexp.exec(postcode);
    
    if (match!=null)
    {
      return true
    }

 }
 return false
}  