﻿var cyrillicRegexp = /(^([А-ЯЁа-яё-])+$)/;
var dateRegexp = /(^((0[1-9])|([12][\d])|(3[01]))\.((0[1-9])|(1[0-2]))\.([\d]{4})$)/;

function _checkEmail(id) {
  var pattern = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
  return pattern.test($('#'+id)[0].value);
}

function _checkRequired(id) {
  var pattern = /\S+/i;
  return pattern.test($('#'+id)[0].value);
}

function _checkRequired2(object) {
  var pattern = /\S+/i;
  return pattern.test(eval(object));
}

function _checkPattern(id, pattern) {
  return pattern.test($('#'+id)[0].value);
}

function _checkPhone(id) {
	return $('#'+id)[0].value.length == 10 &&  _checkPattern(id, /\d{10}/)
}

function _checkPattern2(object, pattern) {
  return pattern.test(eval(object));
}

function _checkMinLength(id, min) {
  return $('#'+id)[0].value.length >= min;
}

function _checkMaxLength(id, max) {
  return $('#'+id)[0].value.length <= max;
}

function _checkEquals(id, value) {
  return $('#'+id)[0].value == value;
}

function _checkNotEquals(id, value) {
  return $('#'+id)[0].value != value;
}

function _checkNotEquals2(object, value) {
  return eval(object) != value;
}

function _checkChecked(id){
    return $('#'+id)[0].checked;
}

function _checkDate(id, pattern) {
  if (_checkEquals(id, pattern)) {
    return true;
  }

  var date = $('#'+id)[0].value;
  if (dateRegexp.test(date)) {
    var tmp = date.split(".");
    var d = tmp[0];
    var m = tmp[1];
    var y = tmp[2];

    var isLeap = y % 4 ? false : true;

    if ((!isLeap && m == 2 && d > 28) || (isLeap && m == 2 && d > 29) || (d == 31 && (m == 4 || m == 6 || m == 9 || m == 11))) {
      return false;
    } else {
      return true;
    }
  } else {
    return false;
  }
}

function _checkDate2(object) {
  var tmp = eval(object).split(".");
  var d = tmp[0];
  var m = tmp[1];
  var y = tmp[2];

  var isLeap = y % 4 ? false : true;

  if ((!isLeap && m == 2 && d > 28) || (isLeap && m == 2 && d > 29) || (d == 31 && (m == 4 || m == 6 || m == 9 || m == 11))) {
    return false;
  } else {
    return true;
  }
}

function _checkPassportDate(object){
	var tmp = eval(object).split(".");
	var d = tmp[0];
	var m = tmp[1];
	var y = tmp[2];

	var passportDate = new Date(y,m-1,d);
	var currentDate = new Date();
	currentDate.setFullYear(currentDate.getFullYear()+10);
	if (passportDate > currentDate)
		return false;
	return true;
}

function _checkPassportDateMinExpire(object, flightInDate){
	var tmp = eval(object).split(".");
	var d = tmp[0];
	var m = tmp[1];
	var y = tmp[2];
	var passportDate = new Date(y,m-1,d);
	passportDate.setHours(23, 59, 59);//because flightInDate may be with setted hours...
	if (passportDate < flightInDate)
		return false;
	return true;
}


function _checkInRange(id, range) {
  var value = $('#'+id)[0].value;
  if (value == null || value.length == 0 || isNaN(parseInt(value)))
    return false;
  return (value >= range[0] && value <= range[1]);
}

function _checkInRange2(dummy, id, range) {
  return _checkInRange(id, range);
}

function _checkCardDateRequired(dummy, cardMonthId, cardYearId) {
  return _checkCardDatePattern(dummy, cardMonthId, /\S+/i, cardYearId, /\S+/i);
}

function _checkCardDatePattern(dummy, cardMonthId, pattern1, cardYearId, pattern2) {
  var cardMonth = $('#'+cardMonthId)[0].value;
  var cardYear = $('#'+cardYearId)[0].value;
  return pattern1.test(cardMonth) && pattern2.test(cardYear);
}

function _checkCardExpirationDate(date) {
    var expireDate = eval(date);
    if (expireDate == null) return false;

    var today = new Date();
    var add = today.getDate()>15?2:1;
    today = new Date(today.getFullYear(),today.getMonth(),1);

    if(today.getMonth()+add > 11) {
        today.setMonth(-1+add);
        today.setYear(today.getFullYear()+1); 
    } else {
        today.setMonth(today.getMonth()+add);
    }
    return expireDate >= today;
}

function _checkCard(id, cardType2Eval) {
  var cardNumber = $('#'+id)[0].value;
  var cardType = eval(cardType2Eval);
  if (cardType == null || cardType.length <= 0 || cardNumber == null || cardNumber.length <= 0)
    return false;

  if (cardType == 'VISA' && cardNumber.charAt(0) != '4') {
    return false;
  } else if (cardType == 'MASTERCARD' && cardNumber.charAt(0) != '5') {
    return false;
  }

  if (cardNumber.length > 16)
    return false;

  return true;//remove this for production
  return _checkCardLuhnAlgorithm(cardNumber);
}

function _checkCardLuhnAlgorithm(cardNumber) {
  var sum = 0, mul = 1, l = cardNumber.length;
  for (i = 0; i < l; i++) {
      var digit = cardNumber.substring(l-i-1, l-i);
      var tproduct = parseInt(digit, 10) * mul;
      if (tproduct >= 10)
           sum += (tproduct % 10) + 1;
      else
           sum += tproduct;
      if (mul == 1)
           mul += 1;
      else
           mul -= 1;
  }
  return (sum % 10) == 0;
}

function _checkPriorityCard(id) {
  var cardNumber = $('#'+id).val().trim();
  if (cardNumber == '')
	return true;
  if (!_checkPattern(id, /(^([\d]{9})$)/))
  	return false;
  if (cardNumber.substr(0, 3) != '000' && !_checkCardLuhnAlgorithm(cardNumber))
    return false;

  return true;
}

function _checkCaptcha(id) {
  var number = $('#'+id).val().trim();
  var expected = $('#verify_'+id).val().trim();

  var userInput = hex_md5(number);
  if (userInput != expected) {
	$("#reload_"+id).click();
  	return false;
  }

  return true;
}

function _validateEx(inputId, rule) {
  switch (rule.length-2) {
    case 0:
      return rule[1](inputId);
    case 1:
      return rule[1](inputId, rule[2]);
    case 2:
      return rule[1](inputId, rule[2], rule[3]);
    case 3:
      return rule[1](inputId, rule[2], rule[3], rule[4]);
    case 4:
      return rule[1](inputId, rule[2], rule[3], rule[4], rule[5]);
    case 5:
      return rule[1](inputId, rule[2], rule[3], rule[4], rule[5], rule[6]);
    default:
      alert("Validator Error");
      break;
  }
}

/*
 * rules format: array of [ inputId (if null then nothing will be highlighted), [
 * fieldErrorId (if null then error message not shown), checkName, params... ], [
 * more checks ... ] ] the first check not passed breaks the execution of
 * remaining checks
 *
 * @errorsContainer copy all errors to this object
 */
function fieldValidatorEx(rules, errorsContainer){
  var result = true;
  var errorsList="";
  var $errorContainerElement = $("#"+errorsContainer);

  for (var i = 0 ; i < rules.length ; i++) {
    var ruleSection = rules[i];

    var inputId = ruleSection[0];
    var checks = ruleSection[1];

    // Hide all error blocks first
    for (var j = 0 ; j < checks.length ; j++) {
      var rule = checks[j];
      var errorBlock = rule[0];
      if (errorBlock != null)
        $("#"+errorBlock).hide();
    }

    // Run validation rules, show error block for the first
    // validation error
    for (var j = 0 ; j < checks.length ; j++) {
      var rule = checks[j];
      var errorBlock = rule[0];
      var checkName = rule[1];

      if (!_validateEx(inputId, rule)) {
        result = false;
        if (errorBlock != null)
          $("#"+errorBlock).show();
          var _html = $("#"+errorBlock).html();
          if($errorContainerElement){
            errorsList += "<span>"+_html+"</span><br/>";
          }
        break;
      }
    }
  }
  if (result) {
    $("#form_errors").hide();
  } else {
    $("#form_errors").show();
  }

  $errorContainerElement.html($errorContainerElement.html()+errorsList);

  return result;
}

/**
 * submit form by id
 */
function submitForm(formId){
  document.getElementById(formId).submit();
}

