﻿//validation module
/// <reference path="jquery.js" />

//var airports = ['Adler/Sochi (AER)','Aldan (ADH)','Anadyr (DYR)','Anapa (AAQ)','Arkhangelsk (ARH)','Astrakhan (ASF)','Barnaul (BAX)','Blagoveschensk (BQS)','Bratsk (BTK)','Chelyabinsk (CEK)','Irkutsk (IKT)','Izhevsk (IJK)','Kaliningrad (KGD)','Kazan (KZN)','Kemerovo (KEJ)','Khabarovsk (KHV)','Krasnodar (KRR)','Krasnojarsk (KJA)','Magadan (GDX)','Moscow (VKO)','Moscow Bykovo (BKA)','Moscow Domodemovo (DME)','Moscow Sheremetyevo (SVO)','Murmansk (MMK)','Nizhnevartovsk (NJC)','Nizhniy Novgorod (GOJ)','Novosibirsk (OVB)','Perm (PEE)','PetropavlovskKamchatsky (PKC)','Petrozavodsk (PES)','Rostov (ROV)','Samara (KUF)','St. Petersburg (LED)','Surgut (SGC)','Tyumen (TJM)','UlanUde (UUD)','Ulyanovsk (ULY)','Vladivostok (VVO)','Volgograd (VOG)','Yakutsk (YKS)','Yekaterinburg (SVX)'];

var validate = 
{  
    
    //date parameters
    dtCh : ".", //delimeter
    minYear : 1900,
    maxYear : 2100,
    
    all : function (_form_id)
    {
        return (this.airports(_form_id) && this.passengers(_form_id) && this.dates(_form_id));
    },
    
    //run this to perform dates validation in _control parent
    dates : function (_formId)
    {
        //error messages
        var errorInvalidDate = "Entered date is not valid";
        var errorPastDate = "Please enter the date starting from today";
        var errorDepartureReturn = "Return date must be after departure";
        var errorNoDatesSelected = "Please select date(s)";
        
        var departureControl = $("#"+_formId+" input[@name='departure']");
        var returnControl = $("#"+_formId+" input[@name='return']");
        
        var departureValue = departureControl.attr("value");
        var returnValue = returnControl.attr("value");
        
        var departureValue = (departureValue==null) ? "" : departureValue;
        var returnValue = (returnValue==null) ? "" : returnValue;
        
   
        //ckecking if any dates selected
  	if ( !returnControl.attr("disabled") && departureValue=="" )
        {
                       
            alert(errorNoDatesSelected);            
            departureControl.focus();
            departureControl.select();
            return false;
            
        }

	if ( !returnControl.attr("disabled") && returnValue=="" ) 
        {
                       
            alert(errorNoDatesSelected);            
            returnControl.focus();
            returnControl.select();
            return false;
            
        }

        if ( returnControl.attr("disabled") && departureValue=="" ) 
        {
                       
            alert(errorNoDatesSelected);            
            departureControl.focus();
            departureControl.select();
            return false;
            
        }
        
        //validating date format
        if (departureValue!="")
        {
            if (!this.isDate(departureValue))
            {
                departureControl.focus();
                departureControl.select();
                return false; 
            }
        }
        if (returnValue!="")
        {
            if (!this.isDate(returnValue))
            {
                returnControl.focus();
                returnControl.select();
                return false;
            }
        } 
        
        //checking dates to be after today
        var today=new Date((new Date()).getFullYear(), (new Date()).getMonth(),(new Date()).getDate());
      
        if (departureValue!="")
        {            
            var dateParams=departureValue.split(this.dtCh);
            var yr = parseInt(dateParams[2]);         
            var mt = parseInt(dateParams[1],10) - 1;
            var dy = parseInt(dateParams[0],10);
            var dapartureDate=new Date(yr, mt, dy);
            if (dapartureDate<today)
            {
                alert(errorPastDate);
                departureControl.focus();
                departureControl.select();
                return false; 
            }
        }
        
        if (returnValue!="")
        {     
            var dateParams=returnValue.split(this.dtCh);  
            var yr = parseInt(dateParams[2]);         
            var mt = parseInt(dateParams[1],10) - 1;
            var dy = parseInt(dateParams[0],10);
            var returnDate=new Date(yr, mt, dy);
            if (returnDate<today)
            {                   
                alert(errorPastDate);
                returnControl.focus();
                returnControl.select();
                return false;             
            }
        }
        
        //checking dates to be departure before return
        if (departureValue!="" && returnValue!="")
        {
            var dateParams=departureValue.split(this.dtCh);
            var yr = parseInt(dateParams[2]);         
            var mt = parseInt(dateParams[1],10) - 1;
            var dy = parseInt(dateParams[0],10);
            var dapartureDate=new Date(yr, mt, dy);
            
            dateParams=returnValue.split(this.dtCh);  
            yr = parseInt(dateParams[2]);         
            mt = parseInt(dateParams[1],10) - 1;
            dy = parseInt(dateParams[0],10);
            var returnDate=new Date(yr, mt, dy);            
            
            if (dapartureDate > returnDate)
            {
                alert(errorDepartureReturn);
                returnControl.focus();
                returnControl.select();
                return false; 
            }
        }
        
        return true;
        
    }, 
    
    passengers : function (_formId)
    {
        var adults = $("#"+_formId+" select[@name='adults']")[0];
        var children = $("#"+_formId+" select[@name='children']")[0];
        var infants = $("#"+_formId+" select[@name='infants']")[0];
        
        var errorSumExceeds = "Total number of passengers must not exceed 9";
        var errorLess = "Please specify number of passengers";
        var errorInfants = "Number of infants must be less than number of adults"
        
        //validating sum to be less than 10 and more than 1 
        var total=parseInt($(adults).val()) + parseInt($(children).val()) + parseInt($(infants).val());
        if (total>9)
        {
            
            alert(errorSumExceeds);
            adults.focus();
            return false;
        }
        if (total<1)
        {
           alert(errorLess);
           adults.focus();
           return false;
        }
        
        //validating infants be not more than adults
        var isInfantlOk = (parseInt($(adults).val())>=parseInt($(infants).val()));
        if (!isInfantlOk)
        {
            alert(errorInfants);
            infants.focus();
            return false;
        }       
        
        return true;
    },
    
	airports : function(_formId)
	{
		var airportFrom = null;
		var airportTo = null;
		$(airports).each (
			function() {
				if ($('#from_select')[0].value == this) {
					airportFrom = $('#from_select')[0].value;
					$(airports).each (
						function() {
							if ($('#to_select')[0].value == this) {
								airportTo = $('#to_select')[0].value;
							}
						}
					)
				}
			}
		);
		if (airportFrom != null && airportFrom == airportTo) { alert('Please select different airports'); return false; }
		if (!airportFrom) { alert('Please select departure airport'); return false; }
		if (!airportTo) { alert('Please select return airport'); return false; }
		if (airportFrom && airportTo) return true;
	},
    
    isInteger : function(s)
    {
	    var i;
        for (i = 0; i < s.length; i++)
        {   
            // Check that current character is number.
            var c = s.charAt(i);
            if (((c < "0") || (c > "9"))) return false;
        }
        // All characters are numbers.
        return true;
    },

    stripCharsInBag : function (s, bag)
    {
    	var i;
        var returnString = "";
        // Search through string's characters one by one.
        // If character is not in bag, append to returnString.
        for (i = 0; i < s.length; i++){   
            var c = s.charAt(i);
            if (bag.indexOf(c) == -1) returnString += c;
        }
        return returnString;
    },

    daysInFebruary : function (year)
    {
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
        return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
    },
    
    DaysArray : function (n) 
    {
    	for (var i = 1; i <= n; i++) 
    	{
		    this[i] = 31
		    if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		    if (i==2) {this[i] = 29}
        } 
        return this    
    },
    
    isDate : function (dtStr)
    {
	    var daysInMonth = this.DaysArray(12);
	    
	    var pos1=dtStr.indexOf(this.dtCh);
	    var pos2=dtStr.indexOf(this.dtCh,pos1+1);
	    var strMonth=dtStr.substring(pos1+1,pos2);
	    var strDay=dtStr.substring(0,pos1);
	    var strYear=dtStr.substring(pos2+1);
	    
	    strYr=strYear;
	    
	    if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	    if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
        
        for (var i = 1; i <= 3; i++) 
        {
            if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
        }
        
        month=parseInt(strMonth);
        day=parseInt(strDay);
        year=parseInt(strYr);
        
        if (pos1==-1 || pos2==-1)
        {
            alert("The date format should be : " + Date.format)
            return false
        }
        
        if (strMonth.length<1 || month<1 || month>12)
        {
            alert("Please enter a valid month")
            return false
        }
        
        if (strDay.length<1 || day<1 || day>31 || (month==2 && day>this.daysInFebruary(year)) || day > daysInMonth[month]){
            alert("Please enter a valid day")
            return false
        }
	    
	    if (strYear.length != 4 || year==0 || year<this.minYear || year>this.maxYear)
	    {
		    alert("Please enter a valid 4 digit year between "+this.minYear+" and "+this.maxYear)
		    return false
	    }
        
        if (dtStr.indexOf(this.dtCh,pos2+1)!=-1 || this.isInteger(this.stripCharsInBag(dtStr, this.dtCh))==false)
        {
	        alert("Please enter a valid date")
	        return false
        }
        return true
    }   
}

function setTravellers() {
	var travellers = [$('#numAdults')[0], $('#numChildren')[0], $('#numInfants')[0]];
	var lgth = 9 - travellers[1].selectedIndex;
	if (lgth < travellers[0].length) for (var i=travellers[0].length; i>=lgth; i--) {travellers[0].options[i] = null}
	if (lgth > travellers[0].length) for (var i=travellers[0].length; i<lgth; i++) {travellers[0].options[i] = new Option(i+1, i+1)}
	
	lgth = 9 - travellers[0].selectedIndex;
	if (lgth < travellers[1].length) for (var i=travellers[1].length; i>=lgth; i--) {travellers[1].options[i] = null}
	if (lgth > travellers[1].length) for (var i=travellers[1].length; i<lgth; i++) {travellers[1].options[i] = new Option(i, i)}
	
	if (travellers[2].length <= travellers[0].selectedIndex + 1)
		for (var i=travellers[2].length; i<travellers[0].selectedIndex + 2; i++)
			travellers[2].options[i] = new Option (i, i);
	if (travellers[2].length > travellers[0].selectedIndex)
		for (var i=travellers[2].length; i>travellers[0].selectedIndex + 1; i--)
			travellers[2].options[i] = null;
}

function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

function checkRequiredString(value, errMessage) {
    return value != null && trim(value) != '';
}

function checkRequired(value, errMessage) {
//    return value != null && value != '';
	return checkRequiredString(value, errMessage);
}
   
function checkMaxLength(value, maxLength, errMessage) {
    return value.length <= maxLength;
}
   
function checkIsNumber(value, errMessage) {
    return !isNaN(value);
}
   
function checkRange(value, min, max, errMessage) {
    return value >= min && value <= max;
}

function checkPassword(newPassword, repeatPassword, errMessage) {
    return newPassword==eval('$("'+repeatPassword+'")')[0].value;
}
  
var cyrillicRegexp = /^[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\-]+$/;
   
function checkPattern(value, pattern, errMessage) {
    return pattern.test(value);
}
   
function checkEquals(value1, value2, errMessage) {
    return value1 == eval(value2);
}

// This validation places all errors in a single block.
function validateForm(validationRules, button_status, errorBlock) { 
    var result = true;
    var message = '';
    
    if (!button_status) return false;
    
    for(var i = 0 ; i < validationRules.length ; i++) {
        if(!validationRules[i][0]($(validationRules[i][1])[0].value, validationRules[i][2], validationRules[i][3], validationRules[i][4]))
        {
            result = false;
            message += validationRules[i][validationRules[i].length-1] + "<br/>";
            $(validationRules[i][1]).addClass('errorField').bind('focus', function() {
                $(this).removeClass('errorField');
            })
        }
    }
    if (errorBlock == null) {
        errorBlock = '#error';
    }
    if(!result) {
           $(errorBlock).html(message).show();
       } else {
           $(errorBlock).hide();
       }
       return result;
}

    var status_save = false;
    function onChangeForm() {
        $('#saveButton').removeClass('unable');
        $('#saveButton').addClass('green');
        status_save = true;
    }
    
    var status_change = false;    
    function onChangePassword() {
        $('#changePassword').removeClass('unable');
        $('#changePassword').addClass('green');
        status_change = true;
    }


 // This validation places error messages in it's own blocks.
 // Error block id = elementId + "_error" 
 function validateFormNew(validationRules, button_status) {
	 
     var result = true;
     
     if (!button_status) return false;
     
     for(var i = 0 ; i < validationRules.length ; i++) {
    	 var errorBlock = validationRules[i][1] + '_error';

    	 if(!validationRules[i][0]($(validationRules[i][1])[0].value, validationRules[i][2], validationRules[i][3], validationRules[i][4])) {
        	 
             result = false;
             var message = validationRules[i][validationRules[i].length-1] + "<br/>";
             $(validationRules[i][1]).addClass('fieldHighlight').bind('focus', function() {
                 $(this).removeClass('fieldHighlight');
             })
                 
             $(errorBlock).html(message).show();
         } else {
        	 $(errorBlock).hide();
         }
     }
     return result;
 }
 
//This validation places error messages in it's own blocks.
 // Error block id = elementId + "_error" 
function validateFormRow(validationRules, button_status) {
     
     var result = true;
     
     if (!button_status) return false;
     
     for(var i = 0 ; i < validationRules.length ; i++) {
         var errorBlock = validationRules[i][1] + '_error';

         if(!validationRules[i][0]($(validationRules[i][1])[0].value, validationRules[i][2], validationRules[i][3], validationRules[i][4])) {
             
             result = false;
             var message = validationRules[i][validationRules[i].length-1];
             $(validationRules[i][1]).addClass('fieldHighlight').bind('focus', function() {
                 $(this).removeClass('fieldHighlight');
             })
                 
             $(errorBlock).html(message);
             $(errorBlock).show();
         } else {
             $(errorBlock).hide();
         }
     }
     return result;
 }

// DZ 
// function to clear all previous error notifications
function clearMessages(){
	$('#main .formError').hide();
	$('#main .fieldError').hide();
	$('#main .actionError').hide();
	$('#main .actionMessage').hide();                           
	$('#main .fieldHighlight').removeClass('fieldHighlight');
}
 
// This validation places error messages in it's own blocks.
// Error block id = elementId + "_error"
// Author: Yury Molchan 
function formValidator(rules, isValidate) {
     var result = true;
     for (var i = 0 ; i < rules.length ; i++) {
		var rule = rules[i];
     	var attrib = rule[1];
        var errorBlock = "#" + attrib + "_error";
        var errorId = attrib + "_" + rule[0].name + "_error";
        $(errorBlock + " > #" + errorId + " + br").remove();
       	$(errorBlock + " > #" + errorId).remove();
        if (isValidate && !_validate(rule)) {
            result = false;
             //AH if($(errorBlock).is(":empty")) {
	            $("input[id=" + attrib + "]").addClass('fieldHighlight').bind('focus', function() {
	                $(this).removeClass('fieldHighlight');
	            });
	            $(errorBlock).show();
             //AH } else {
             //AH   $(errorBlock).append("<br/>");
             //AH };
            var message = rule[rule.length-1];
            $(errorBlock).append("<span id='" + errorId + "'>" + message + "</span>");
        } else if($(errorBlock).is(":empty")) {
	            $("input[id=" + attrib + "]").removeClass('fieldHighlight');
	            $(errorBlock).hide();
        };
    }
    return result;
}

// Author: Yury Molchan 
function _validate(rule) {
	switch (rule.length-2) {
		case 1:
			return rule[0](rule[1]);
		case 2:
			return rule[0](rule[1], rule[2]);
		case 3:
			return rule[0](rule[1], rule[2], rule[3]);
  		default:
  			alert("Validator Error");
  			break;
	}
}

// Author: Yury Molchan 
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);
}

// Author: Yury Molchan 
function _checkRequired(id) {
	var pattern = /\S+/i; 
    return pattern.test($('#'+id)[0].value);
}

//Author: Yury Molchan 
function _checkPattern(id, pattern) {
    return pattern.test($('#'+id)[0].value);
}

// Author: Yury Molchan 
function _checkMinLength(id, min) {
    return $('#'+id)[0].value.length >= min;
}

// Author: Yury Molchan 
function _checkMaxLength(id, max) {
    return $('#'+id)[0].value.length <= max;
}

// Author: Yury Molchan 
function _checkEquals(id, value) {
    return $('#'+id)[0].value == eval(value);
}


function _checkNotEquals(id, value) {
    return $('#'+id)[0].value != value;
}

function _checkBirthDate(id, yearId, monthId, dayId, minAge, maxAge) {
    var day = parseInt($('#'+dayId).val(), 10);
    var month = parseInt($('#'+monthId).val(), 10) + 1;
    var year = parseInt($('#'+yearId).val(), 10);
    
    if (day > 31) { return false; }
    if (month > 12) { return false; }
    if ((month == 2) && (day > 29)) { return false; }

    if ( ((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day > 30)) { return false; }
    
    if ((year%4 != 0) && (month == 2) && (day > 28)) { return false; } 
    
    var birthDate = new Date(year, month-1, day);
    var now = new Date();
    
    if(minAge != null){
        var minAgeDate = new Date(now.getUTCFullYear()-minAge, now.getUTCMonth(), now.getUTCDate());
        if(birthDate.getTime() > minAgeDate.getTime()) { return false; }
    }
    if(maxAge != null){
        var maxAgeDate = new Date(now.getUTCFullYear()-maxAge, now.getUTCMonth(), now.getUTCDate());
        if(birthDate.getTime() < maxAgeDate.getTime()) { return false; }
    }
    
    return birthDate.getTime() < now.getTime();
}

function _checkDatesOrder(id, first, second) {
    var expDate = parseDate($('#'+second).val());
    var regDate = parseDate($('#'+first).val());

    // parsing validity is checked by another validator
    if(expDate == null || regDate == null) return true; 
    
    return regDate.getTime() < expDate.getTime();
}

function isOneSymbolUsed(pass){
    var ch = pass.charAt(0);
    for(i = 1; i < pass.length; i++)
        if(ch != pass.charAt(i)) return false;
    return true;
}

function _checkPasswordComplexity(id){
    var pass = $('#'+id)[0].value;
    return pass != null 
            && pass.length >= 6 
            && !isOneSymbolUsed(pass);
}

function _checkChecked(id){
    return $('#'+id)[0].checked;
}


//Author: Anastasia Dzeeva
// min and max dates if not needed should be null
function _checkDate(value, min, max) {
	var pattern = /^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$/;
	if (!pattern.test($('#'+value)[0].value)) {
		return false;
	}
	var day = parseInt(($('#'+value)[0].value).substring(0, 2), 10);
	var month = parseInt(($('#'+value)[0].value).substring(3, 5), 10);
	var year = parseInt(($('#'+value)[0].value).substring(6), 10);
	var dateValue = new Date(year, month-1, day);
	
	if (day > 31) { return false; }
	if (month > 12) { return false; }
	if ((month == 2) && (day > 29)) { return false; }

	if ( ((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day > 30)) { return false; }
	
	if ((year%4 != 0) && (month == 2) && (day > 28)) { return false; } 
	
	if (min != null) {
		if (min > dateValue) { return false; }
	}
	if (max != null) {
		if (max < dateValue) { return false; }
	}
	
	return true;
}

// Author: Yury Molchan 
function showFormError(message) {
    $('.actionMessage').hide();
    $('.actionError').hide();
    $('.formError').html(message);
    $('.formError').show();
}

// Author: Dzmitry Zaitsau
// 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  
function fieldValidatorEx(rules){
    var result = true;
    for (var i = 0 ; i < rules.length ; i++) {
       var ruleSection = rules[i];
       var inputId = ruleSection[0];
       var checks = ruleSection[1];
       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(inputId != null){
                   $("#"+inputId).addClass('fieldHighlight').bind('focus', function() {
                       $(this).removeClass('fieldHighlight');
                   });
               }
               if(errorBlock != null){
                   $("#"+errorBlock).show();
               }
               break;
           }
           
       }
   }
   return result;
}

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;
    }
}


/*
	Nataliya_Niakhai
	function for login form validation
*/
var isSubmitted = false;
var loginToHandler;

function showLoginError () {
	if ($("#loginError:visible").length==0) { 
		
		$("#loginError").show(300).bgiframe(); 
		loginToHandler = setTimeout(function(){$("#loginError").hide(300);},3000);	

	} else {		 
		return; 
	}
	
}

function loginSubmitForm(formName) {
	var form = document.forms[formName];

	if (!isSubmitted) {   
		isSubmitted = true;

		var userValue = trim(form.elements['user'].value);
		var passValue = trim(form.elements['pass'].value);

		if (userValue == '') {
			isSubmitted = false;
			$("#fake-login").hide();
			$("#real-login").show().addClass("fieldHighlight").get(0).focus();

			showLoginError();
		} else {
			form.elements['user'].style.background = "#fff";
		}

		if (passValue == '') {
			isSubmitted = false;
			$("#fake-pw").hide();
			$("#real-pw").show().addClass("fieldHighlight").get(0).focus();

			showLoginError();
		} else {

			form.elements['pass'].style.background = "#fff";
		}
	}

	if (isSubmitted) {
		document.forms[formName].submit();
	}
}