﻿DOCUMENT_ROOT = 'https://'+ document.domain + '/';

//объявление объектов, которые будут использоваться на протяжении всего сайта
adr_block    = new AddressDivStep();
err_checking = new Checking();
waiting      = new DivWaiting();
objToStr     = new objectToString();

function objectToString(){
    this.toSource = function(obj, indentValue){
        var hexDigits = "0123456789ABCDEF";
        
        var indent;
        if (indentValue == null){
            indentValue = "";
            indent = ""; // or " "
        } else {
            indent = "\n";
        }
        
        return "(" + GetObject(obj, indent).replace(/,$/, "") + ")";
        
        function ToHex(d){
            return hexDigits[d >> 8] + hexDigits[d & 0x0F];
        }
        
        function Escape(string){
            return string.replace(/[\x00-\x1F'\\]/g,
                function (x){
                    if (x == "'" || x == "\\") return "\\" + x;
                    return "\\x" + ToHex(String.charCodeAt(x, 0));
                })
        }
        
        function GetObject(obj, indent){
            if (typeof obj == 'string'){
               return "'" + Escape(obj) + "',";
            }
            
            if (obj instanceof Array){
                result = indent + "[";
                for (var i = 0; i < obj.length; i++){
                    result += indent + indentValue +
                    GetObject(obj[i], indent + indentValue);
                }
                
                result += indent + "],";
                return result;
            }
            
            var result = "";
            
            if (typeof obj == 'object'){
                result += indent + "{";
                for (var property in obj){
                    result += indent + indentValue + "'" +
                    Escape(property) + "' : " +
                    GetObject(obj[property], indent + indentValue);
                }
                
                result += indent + "},";
           } else {
               result += obj + ",";
           }
           
          return result.replace(/,(\n?\s*)([\]}])/g, "$1$2");
        }
    }
}

// =====================================================================================
// \/  функция jsCodeHtmlChars(htmlText) аналог htmlspecialchars
// =====================================================================================

function jsCodeHtmlChars(r){
    
    string_par = r;
    
    function jsStringReplace(text,searchString, replaceString){
        lengthSearchString  = searchString.length;
        lengthReplaceString = replaceString.length;
        rezultText          = text;
        start_poz           = 0;   //начальная позиция с которой начинаем поиск заданной подстроки
        
        while ((poz = rezultText.indexOf(searchString,start_poz))!= -1) {
            firstPart        = rezultText.substring(0, poz);
            lengthRezultText = rezultText.length;
            endPart          = rezultText.substring(poz + lengthSearchString, lengthRezultText);
            rezultText       = firstPart + replaceString+endPart;
            start_poz        = poz + lengthReplaceString;
        }
        
        return (rezultText);
    }
    this.parceString = function(par){
        current_value = par ? par : string_par;
        
        if (current_value){
            current_value = jsStringReplace(current_value,"&","&amp;");
            current_value = jsStringReplace(current_value,"<","&lt;");
            current_value = jsStringReplace(current_value,">","&gt;");
            current_value = jsStringReplace(current_value,"'","';");
            current_value = jsStringReplace(current_value,'"',"&quot;");
            return (current_value);
        } else {
            return 'error';
        }
    }
    
    //используется отдельно, для файлов-классов
    this.divText = function(text, searchString, num){
        str                 = String(num);
        lengthSearchString  = searchString.length;
        lengthReplaceString = str.length;
        rezultText          = text;
        start_poz           = 0;
        
        while ((poz = rezultText.indexOf(searchString,start_poz))!= -1) {
            firstPart        = rezultText.substring(0, poz);
            lengthRezultText = rezultText.length;
            endPart          = rezultText.substring(poz + lengthSearchString, lengthRezultText);
            rezultText       = firstPart + str + endPart;
            start_poz        = poz + lengthReplaceString;
        }
        
        return (rezultText);
    }
}
// =====================================================================================
// /\  функция jsCodeHtmlChars(htmlText) аналог htmlspecialchars
// =====================================================================================

// =====================================================================================
// \/  класс для затемнения экрана и вывода всплывающих окон
//     класс DivWaiting создает полосу загрузки во время вынужденного ожидания
// =====================================================================================

function DivWaiting(){
    this.prefix = 'wait';
    function tb_detectMacXFF_() {
        var userAgent = navigator.userAgent.toLowerCase();
        if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) {
            return true;
        }
    }
    
    function tb_remove_(prefix) {
        $("#TB_imageOff_" + prefix).unbind("click");
        $("#TB_closeWindowButton_" + prefix).unbind("click");
        
        $("#TB_window_" + prefix).fadeOut("fast",function(){$('#TB_window_' + prefix + ',#TB_overlay_' + prefix + ',#TB_HideSelect_' +  prefix).trigger("unload").unbind().remove();});
        $("#TB_load_" + prefix).remove();
        if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
            $("body","html").css({height: "auto", width: "auto"});
            $("html").css("overflow","");
        }
        document.onkeydown = "";
        document.onkeyup = "";
        return false;
    }

    this.startWait = function(append_second_layer){
        if (append_second_layer){
            $(append_second_layer).appendTo('#TB_window_bottom');
        }
        
        if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
            
            $("body","html").css({height: "100%", width: "100%"});
            $("html").css("overflow","hidden");
            
            if (document.getElementById("TB_HideSelect_" + this.prefix) === null) {//iframe to hide select elements in ie6
                $("body").append("<iframe id='TB_HideSelect_" + this.prefix + "'></iframe><div id='TB_overlay_" + this.prefix + "'></div><div id='TB_window_" + this.prefix + "'></div>");
                //$("#TB_overlay").click(tb_remove);
            }
        }else{//all others
            if(document.getElementById("TB_overlay") === null){
                $("body").append("<div id='TB_overlay_" + this.prefix + "'></div><div id='TB_window_" + this.prefix + "'></div>");
                //$("#TB_overlay").click(tb_remove);
            }
        }
        
        if(tb_detectMacXFF_()){
            $("#TB_overlay_" + this.prefix).addClass("TB_overlayMacFFBGHack_" + this.prefix);//use png overlay so hide flash
        }else{
            $("#TB_overlay_" + this.prefix).addClass("TB_overlayBG_" + this.prefix);//use background and opacity
        }
        
        imgLoad = new Image();// preload image
        imgLoad.src = "../../img/loadingAnimation.gif";
        
        $("body").append('<div id="TB_load_' + this.prefix + '"><img src="' + imgLoad.src + '" /></div>');//add loader to the page
        $('#TB_load_' + this.prefix).show();//show loader
        
        document.onkeyup = function(e){ 	
            if (e == null) { // ie
                keycode = event.keyCode;
            } else { // mozilla
                keycode = e.which;
            }
            if(keycode == 27){ // close
                tb_remove();
            }	
        }
    }
    
    this.stopWait = function(append_second_layer){
        if (append_second_layer){
            $(append_second_layer).remove().appendTo('TB_window_bottom');
        }
        $("#TB_load_" + this.prefix).remove();
        tb_remove_(this.prefix);
    }
}
// =====================================================================================
// /\  класс для затемнения экрана и вывода всплывающих окон
// =====================================================================================       


// =====================================================================================
// \/  класс для создания списка адресов
// =====================================================================================       

function AddressDivStep(prm){
    parameters = prm ? prm : new Array();
    
    window.list_address = new Array();
    
    this.val_line1       = '';
    this.val_line2       = '';
    this.postcode        = '';
    this.session         = '';
    this.wait_obj        = '';
    this.separator       = '';
    this.current         = '';
    this.blocked_screen  = '';
        
    this.initialization = function(prm){
        // parameters = {object:'', div_edit: obj, select_from_list: '', func_not_in_list: '', edit_block:'', list_block:'', apend_to:'', separator:'',
        //               old_postcode:'old_postcode', postcode:'ll_postcode'};
        // div_address - добавляется в процессе работы.
        
        parameters = prm;
        
        this.val_line1       = '';
        this.val_line2       = '';
        this.postcode        = '';
        this.session         = '';
        this.wait_obj        = '';
        this.separator       = '';
        this.current         = '';
        this.blocked_screen  = '';
    }
    
    function clearDivAddrres(cDA){
        //$('#' + parameters['edit_block'] + (cDA ? '_' + cDA : '')).remove().appendTo(parameters['apend_to'] + (cDA ? '_' + cDA : ''));
        //$('#' + parameters['list_block'] + (cDA ? '_' + cDA : '')).remove().appendTo(parameters['apend_to'] + (cDA ? '_' + cDA : ''));
        $('#address_edit_block' + (cDA ? '_' + cDA : '')).remove().appendTo(parameters['apend_to'] + (cDA ? '_' + cDA : ''));
        $('#address_list_block' + (cDA ? '_' + cDA : '')).remove().appendTo(parameters['apend_to'] + (cDA ? '_' + cDA : ''));
        //alert('#address_edit_block' + (cDA ? '_' + cDA : '') + ' | ' + parameters['apend_to'] + (cDA ? '_' + cDA : ''));
        //$('#' + parameters['apend_to'] + (cDA ? '_' + cDA : '')).html("");
    }
    
    this.checkPostCode = function(cPC, cur_element){
        if (!cur_element && $('#' + parameters['old_postcode'] + (cPC ? '_' + cPC : '')).val() != $('#' + parameters['postcode'] + (cPC ? '_' + cPC : '')).val()) clearDivAddrres(cPC);
        
        if (!document.getElementById("lst_line1" + (cPC ? '_' + cPC : ''))){
            if (cur_element && $('#old_' + cur_element).val() != $('#' + cur_element).val()) clearDivAddrres(cPC);
        } else {
           $('#showListAddress' + (cPC ? '_' + cPC : '')).hide();
        }
    }
    
    this.onClickAddresLink = function(status, onCAL_num){
        clearDivAddrres(onCAL_num);
		if (status == 1) {		
			if (onCAL_num) {
				$('#v3_pc_lookup_block_' + onCAL_num).hide();
			} else {
				$('#v3_pc_lookup_block').hide();	
			}
			if (get_obj("pr_postcode")) document.getElementById("pr_postcode").name = "";
			if (get_obj("ll_postcode")) document.getElementById("ll_postcode").name = "";
			if (onCAL_num && get_obj("out_tn_postcode_" + onCAL_num)) document.getElementById("out_tn_postcode_" + onCAL_num).name = "";
			if (onCAL_num && get_obj("out_tn_postcode_" + onCAL_num)) document.getElementById("out_tn_postcode_" + onCAL_num).name = "";
			if (get_obj("postcode")) document.getElementById("postcode").name = "";
		} else {
			if (onCAL_num) {
				$('#v3_pc_lookup_block_' + onCAL_num).show();
			} else {
				$('#v3_pc_lookup_block').show();	
			}
			if (get_obj("pr_postcode")) document.getElementById("pr_postcode").name = "form[address][postcode]";
			if (get_obj("ll_postcode")) document.getElementById("ll_postcode").name = "form[address][postcode]";
			if (onCAL_num && get_obj("ll_postcode_" + onCAL_num)) document.getElementById("ll_postcode_" + onCAL_num).name = "form[" + onCAL_num + "][address][ll_postcode]";
			if (get_obj("postcode")) document.getElementById("postcode").name = "form[address][postcode]";
		}

        parce = new jsCodeHtmlChars();
        
        ladr = list_address[(onCAL_num ? onCAL_num : 0)] ? list_address[(onCAL_num ? onCAL_num : 0)] : '';
        
        if (onCAL_num){
			if (!parameters['div_edit']) {
				adr_block.initialization({object:           'adr_block',
										  div_edit:         DivAddressFields,
										  select_from_list: 'select_from_list',
										  apend_to:         'address_edit',
										  separator:        '###',
										  post_postfix:      'out',
										  old_postcode:     'old_postcode',
										  postcode:         'out_tn_postcode'});
				adr_block.val_line1 = $('#out_tn_flat_' + onCAL_num).val();
				adr_block.val_line2 = $('#out_tn_property_name_' + onCAL_num).val();
				adr_block.postcode  = "";
				adr_block.session   = '';
				adr_block.wait_obj  = waiting;
				adr_block.current   = onCAL_num;
				adr_block.setAddressList();
			}
            text_div = parce.divText(parameters['div_edit'], parameters['separator'], onCAL_num);
            
            if (status==1) $(text_div).appendTo('#' + parameters['apend_to'] + '_' + onCAL_num);
            else $(parce.divText(ladr, parameters['separator'], onCAL_num)).appendTo('#' + parameters['apend_to'] + '_' + onCAL_num);
            
        } else { 
            if (status==1) $(parameters['div_edit']).appendTo('#' + parameters['apend_to']);
            else $(ladr).appendTo('#' + parameters['apend_to']);
        
        }

		if (status == 1) {
			if (get_obj("lst_postcode") && get_obj("pr_postcode")) document.getElementById("lst_postcode").value = document.getElementById("pr_postcode").value;
			if (get_obj("lst_postcode") && get_obj("ll_postcode")) document.getElementById("lst_postcode").value = document.getElementById("ll_postcode").value;
			if (onCAL_num && get_obj("lst_postcode") && get_obj("out_tn_postcode_" + onCAL_num)) document.getElementById("lst_postcode").value = document.getElementById("out_tn_postcode_" + onCAL_num).value;
			if (get_obj("lst_postcode") && get_obj("postcode")) document.getElementById("lst_postcode").value = document.getElementById("postcode").value;
			if (onCAL_num && get_obj("lst_postcode") && get_obj("ll_postcode_" + onCAL_num)) document.getElementById("lst_postcode").value = document.getElementById("ll_postcode_" + onCAL_num).value;
		}
    }
    
    this.onClickSubmitAddress = function(current_form, current_num){
        r_box = document.getElementsByName('form' + current_form + '[address_value]');
        
        if (r_box){
            
            some_selected = false;
            
            for(i=0;i<r_box.length;i++) { 
                if (r_box[i].checked) {
                    postfix = (current_num ? '_' + current_num : '');
                    
					// !Use this address - commented
					text_div = '';
                    //text_div  += '<div id="address_edit_block' + postfix + '">';
                    text_div += '<input type="hidden" id="rt_address' + postfix + '" name="form' + current_form + '[address_list]" value="' + r_box[i].value + '" />';
                    //text_div += '<span>' + r_box[i].value + '</span>';
                    //text_div += '<div class="textcenter" id="select_from_list' + postfix + '"><a id="showListAddress' + postfix + '" href="javascript:adr_block.onClickAddresLink(0' + (current_num ? ',' + current_num : '') + ');">Select another address from the list</a></div>';
                    //text_div += '</div>';
                    //clearDivAddrres(current_num); 
                    $(text_div).appendTo('#' + parameters['apend_to'] + postfix);

                    some_selected = true;
                }
            }
            
            //if (!some_selected) $('#error_msg').html("Please, select address from the list.");
        } 
    }
    
    this.setAddressList = function(){
        len_array     = 0;

        current_object = this;
        
        start_block_screen = this.blocked_screen == true ? '<div id="div_for_waiting"><div class="TB_overlayBG" id="TB_overlay"></div></div>' : '';
        stop_block_screen  = this.blocked_screen == true ? '#div_for_waiting' : '';
        
        obj_wait = this.wait_obj;
        obj_wait.startWait(start_block_screen);
        
        postcode  = this.postcode;
        separator = parameters['separator'];
        session   = this.session;
        
        clearDivAddrres(this.current);
        
        $.post(DOCUMENT_ROOT + "ajax_class/ajax_address.php", { postcode: postcode, line1: this.val_line1, line2: this.val_line2, num: this.current, parameters: objToStr.toSource(parameters)}, function(data){
            //обрабатываем поиск адресов по данному посткоду

            data    = eval(data);
            post_prefix = cur_cls = get_parameters = '';

            post_len = 0;
            for (var j in data) {
                if (j == 'num') cur_cls = data[j];
                else if (j=='parameters') get_parameters = data[j];
                else post_len++;
            }
					
            get_parameters = get_parameters ? eval(get_parameters) : '';
            
            if (typeof(get_parameters)=='object' && get_parameters['post_postfix']) post_prefix = get_parameters['post_postfix']; 
            
            current_cls  = cur_cls ? '_' + cur_cls       : '';
            current_form = cur_cls ? (post_prefix ? '[' + post_prefix + ']' : '') + '[' + cur_cls + ']' : '';
                    
            if (data[0]=='error'){
                len_array    = 0;
            } else {
                len_array    = post_len;
            }
            //вывод результатов
            
            if (len_array>0 && postcode){
                
                DivAddressList  = '<div id = "address_list_block' + current_cls + '"><div id="addr_list">';
                
                for(i = 0; i < len_array; i++){
                    parce = new jsCodeHtmlChars(get_str_address2(data[i]));
                    DivAddressList += '<div>';
                    DivAddressList += '    <div class="f-addresslist-radio">';
//                    DivAddressList += '         <input type="radio" id="rt_address_value' + current_cls + '" name="form' + current_form + '[address_value]" value="' + parce.parceString() + '" />';
                    DivAddressList += '         <input type="radio" id="rt_address_value' + current_cls + '" name="form' + current_form + '[address_value]" value="' + parce.parceString() + '" onclick="' + parameters['object'] + '.onClickSubmitAddress(\'' + current_form + '\'' + (cur_cls ? ', ' + cur_cls : '') + ');" />';
                    DivAddressList += '    </div>';
                    DivAddressList += '    <div class="prp-address">' + parce.parceString() + '</div>';
                    DivAddressList += '    <div class="space-height-5 clear"></div>';
                    DivAddressList += '</div>';
                }
                DivAddressList += '</div>';
                DivAddressList += '<div class="f-addresslist">';
                DivAddressList += '   <div class="space-height-5 clear"></div>';
                DivAddressList += '   <div class="textcenter">';
//                DivAddressList += '       <a id="use_current_address" style="color: #f00;" href="javascript:' + parameters['object'] + '.onClickSubmitAddress(\'' + current_form + '\'' + (cur_cls ? ', ' + cur_cls : '') + ');"><strong>Use this address</strong></a> | ';
                DivAddressList += '       <a id="showInputAddress" style="color: #f00;" href="javascript:' + parameters['object'] + '.onClickAddresLink(1' + (cur_cls ? ', ' + cur_cls : '') + ');"><strong>Enter manually</strong></a>';
                DivAddressList += '   </div>';
                DivAddressList += '</div>';
                DivAddressList += '</div>'
                
                $(DivAddressList).appendTo('#address_edit' + current_cls);
                
                list_address[(cur_cls ? cur_cls : 0)] = DivAddressList;
                
            } else if (postcode){
                if (current_cls.length>0){
                    parce = new jsCodeHtmlChars();
                    text_DivAddressFields = parce.divText(parameters['div_edit'], separator, cur_cls);
                    $(text_DivAddressFields).appendTo('#address_edit_' + cur_cls);
                    //$('#' + parameters['select_from_list'] + current_cls).hide();
                } else {
                    $(parameters['div_edit']).appendTo('#address_edit');
					if (cur_cls) $(parameters['div_edit']).appendTo('#address_edit_' + cur_cls);
                    //$('#' + parameters['select_from_list']).hide();
                }
				$('#v3_pc_lookup_block').hide();
				if (cur_cls) $('#v3_pc_lookup_block_' + cur_cls).hide();
				if (get_obj("lst_postcode") && get_obj("pr_postcode")) document.getElementById("lst_postcode").value = document.getElementById("pr_postcode").value;
				if (get_obj("lst_postcode") && get_obj("ll_postcode")) document.getElementById("lst_postcode").value = document.getElementById("ll_postcode").value;
				if (cur_cls && get_obj("lst_postcode") && get_obj("out_tn_postcode_" + cur_cls)) document.getElementById("lst_postcode").value = document.getElementById("out_tn_postcode_" + cur_cls).value;
				if (get_obj("lst_postcode") && get_obj("postcode")) document.getElementById("lst_postcode").value = document.getElementById("postcode").value;
				if (cur_cls && get_obj("lst_postcode") && get_obj("ll_postcode_" + cur_cls)) document.getElementById("lst_postcode").value = document.getElementById("ll_postcode_" + cur_cls).value;
				if (get_obj("pr_postcode")) document.getElementById("pr_postcode").name = "";
				if (get_obj("ll_postcode")) document.getElementById("ll_postcode").name = "";
				if (cur_cls && get_obj("out_tn_postcode_" + cur_cls)) document.getElementById("out_tn_postcode_" + cur_cls).name = "";
				if (cur_cls && get_obj("have_not_postcode_" + cur_cls)) document.getElementById("have_not_postcode_" + cur_cls).click();
				if (get_obj("postcode")) document.getElementById("postcode").name = "";
				if (cur_cls && get_obj("ll_postcode_" + cur_cls)) document.getElementById("ll_postcode_" + cur_cls).name = "";
            }            
            sess = '';
            
            if (cur_cls){
                for (var j in session){
                    if (j==(cur_cls-1)){
                       sess = session[j];
                    }
                }
            } else if (session) {
                sess = session;
            }
            
            if (sess){
                show_edit_address = false;
                if (sess['address_list']){
                    r_box = document.getElementsByName('form' + current_form + '[address_value]');
                    lp = true;
                    if (r_box){ 
                        for(i=0;i<r_box.length;i++) { 
                            //alert(r_box[i].value.toLowerCase() + ' | ' + sess['address_list'].toLowerCase());
                            if (r_box[i].value.toLowerCase()==sess['address_list'].toLowerCase()) {
                                r_box[i].checked = true; lp = false;
                                current_object.onClickSubmitAddress(current_form, cur_cls);
                            }
                        }
                    }
                    if (lp) show_edit_address = true;
                } else if (sess['address'] && sess['address']['lst_line1']){
                    show_edit_address = true;
                }
                
                if (show_edit_address && sess['address']){
                    adr = sess['address'];
                    
                    current_object.onClickAddresLink(1, cur_cls);
                    
                    $('#lst_line1' + current_cls).val(adr['lst_line1']     ? adr['lst_line1']   : '');
                    $('#lst_line2' + current_cls).val(adr['lst_line2']     ? adr['lst_line2']   : '');
                    $('#lst_line3' + current_cls).val(adr['lst_line3']     ? adr['lst_line3']   : '');
                    $('#lst_line4' + current_cls).val(adr['lst_line4']     ? adr['lst_line4']   : '');
                    $('#lst_city' + current_cls).val(adr['lst_city']       ? adr['lst_city']    : '');
                    $('#lst_country' + current_cls).val(adr['lst_country'] ? adr['lst_country'] : '');
                }
            }
            
            obj_wait.stopWait(stop_block_screen);
        }, "json");
    }
}

// =====================================================================================
// /\  класс для создания списка адресов
// =====================================================================================       

// =====================================================================================
// \/  класс-валидатор
// =====================================================================================
  
function Checking(prm){
    
    error = ''; // нет ошибок
    
    param = prm ? prm : new Array();
    
    this._count        = '';
    this._action       = '';
    this.current_check = '';
    
    this.initialization = function(prm){
        param = prm;
        error = '';
        
        this._count        = '';
        this._action       = '';
        this.current_check = '';
    }
    
    this.GetError = function(){ return error; }
    
    this.checkFields = function(){
        error += checkStandartFields(this.current_check);
    }
    
    this.checkAddress = function(){
        cA = this.current_check ? '_' + this.current_check : '';
        
        if (param['postcode'] && ($("#" + param['postcode'] + cA).val().length<3 || !string_is_postcode($("#" + param['postcode'] + cA).val()))){
            error += 'Your postcode is invalid or empty.<br/>';
        } else {
            arr = checkingAddress(cA);
            error += arr['error'];
        }
    }
    
    // -------------------------------------
    
    function checkingAddress(cAL){
        err = '';
        
        //cAL = cAL ? '_' + cAL : '';
        
        var line1    = document.getElementById("lst_line1" + cAL);
        var radio    = document.getElementById("rt_address_value" + cAL);
        var selected = document.getElementById("rt_address" + cAL);

        record = '';
        
        if (line1){ // if enter manually
            record = 'manually';
            if ($("#lst_line1" + cAL).val().length<1){
                err += 'Enter the address.<br/>';
            }
            
            if ($("#lst_city" + cAL).val().length<2){
                err += 'Enter the city.<br/>';
            }
        } else if (selected){
            
        } else if (radio){ // if select address from the list
            record = 'radio';
            radio_val = $("input[@id=rt_address_value" + cAL + "]:checked").val();
            if (!radio_val || !selected){
                err += 'Select address from the list.<br/>';
            }   
        } else {
            err += 'Please, submit postcode and select the address.<br/>';
        }
        
        $result = new Array();
        $result['record'] = record;
        $result['error'] = err;
        
        return $result;
    }
    
    // -------------------------------------
    
    function checkStandartFields(cSF){
        err = '';
        
        cSF = cSF ? '_' + cSF : '';
        //param = {title: 'll_title', firstname: 'll_firstname',  lastname: 'll_secondname', phone: ''ll_phone, email: 'll_email', : '', : '',};
        if (document.getElementById(param['title'] + cSF) && param['title'] && $("#" + param['title'] + cSF).val()==0){
            err += 'Select title<br/>';
        }
        
        if (document.getElementById(param['firstname'] + cSF) && param['firstname'] && $("#" + param['firstname'] + cSF).val().length<1){
            err += 'Enter first name<br/>';
        }
        
        if (document.getElementById(param['firstnameLL'] + cSF) && param['firstnameLL'] && $("#" + param['firstnameLL'] + cSF).val().length<1){
            if (document.getElementById(param['lastnameLL'] + cSF) && param['lastnameLL'] && $("#" + param['lastnameLL'] + cSF).val().length<1){
                err += 'Enter first name<br/>';
            }
        }
        
        if (document.getElementById(param['lastnameLL'] + cSF) && param['lastnameLL'] && $("#" + param['lastnameLL'] + cSF).val().length<1){
            if (document.getElementById(param['firstnameLL'] + cSF) && param['firstnameLL'] && $("#" + param['firstnameLL'] + cSF).val().length<1){
                err += 'Enter last name<br/>';
            }
        }
        
        if (document.getElementById(param['lastname'] + cSF) && param['lastname'] && $("#" + param['lastname'] + cSF).val().length<1){
            err += 'Enter last name<br/>';
        }
        
        if (document.getElementById(param['phone_city'] + cSF) && param['phone_city'] && !string_is_phone_city($("#" + param['phone_city'] + cSF).val())){// && $("#" + param['phone_city'] + cSF).val().length==0  
            err += 'Your mobile number is invalid - it must start 0 and be 11 digits long.<br/>';
        }
        
        if (document.getElementById(param['phone'] + cSF) && param['phone'] && !string_is_mobile($("#" + param['phone'] + cSF).val())){//&& $("#" + param['phone'] + cSF).val().length==0
            err += 'Your mobile number is invalid - it must start 07 and be 11 digits long.<br/>';
        }
        
        if (document.getElementById(param['phone_city_short_in'] + cSF) && param['phone_city_short_in'] && !string_is_phone_mixed($("#" + param['phone_city_short_in'] + cSF).val())){
            err += 'Mobile Number is invalid - this number needs to a mobile number and be 11 digits long<br/>';
        }
        
        if (document.getElementById(param['phone_city_short_out'] + cSF) && param['phone_city_short_out'] && !string_is_phone_mixed($("#" + param['phone_city_short_out'] + cSF).val())){
            err += 'Mobile Number is invalid - this number needs to a mobile number and be 11 digits long<br/>';
        }
        
        if (document.getElementById(param['phone_city_short'] + cSF) && param['phone_city_short'] && !string_is_phone_mixed($("#" + param['phone_city_short'] + cSF).val())){
            err += 'Your number is invalid - this number needs to a mobile number and be 11 digits long<br/>';
        }
        
        if (document.getElementById(param['not_mandatory_phone'] + cSF) && param['not_mandatory_phone'] && $("#" + param['not_mandatory_phone'] + cSF).val().length>0 && !string_is_mobile($("#" + param['not_mandatory_phone'] + cSF).val())){
            err += 'Your mobile number is invalid - it must start 07 and be 11 digits long.<br/>';
        }
        
        if (document.getElementById(param['email'] + cSF) && param['email'] && $("#" + param['email'] + cSF).val().length>0 && !string_is_email($("#" + param['email'] + cSF).val())){
            err += 'Your Email is invalid.<br/>';
        }
        
        if (document.getElementById(param['date_in'] + cSF) && param['date_in'] && !string_is_date($("#" + param['date_in'] + cSF).val())){//$("#tn_date_in_" + this._current).val().length>0 &&
            err += 'Tenancy start date is invalid.<br/>';
        }
        
        if (document.getElementById(param['date_out'] + cSF) && param['date_out'] && !string_is_date($("#" + param['date_out'] + cSF).val())){// && $("#" + param['date_out'] + cSF).val().length>0
            err += 'Tenancy end date is invalid.<br/>';                             
        }
        
        return err;
    }
}
// =====================================================================================
// /\  класс-валидатор
// =====================================================================================

// =====================================================================================
// \/  проверка ввода лендлорда
// =====================================================================================
function checkLandlordCompany(num){
    num = num ? num : '';
    space = num ? '_' : '';
    if (document.getElementById('ll_title' + space + num).value==0){
        $('#ll_title' + space + num).val('105');
    }
    
    if (document.getElementById('ll_firstname' + space + num).value=='' && document.getElementById('ll_secondname' + space + num).value==''){
        $('#ll_firstname' + space + num).val(document.getElementById('ll_company' + space + num).value);
    }
}
// =====================================================================================
// /\  проверка ввода лендлорда
// =====================================================================================
