function init(){
    
    
   

    /****** валидация ************************************************/      
    jQuery.fn.VType = function() {
        var emailAccount = /^(\w+)([\-+.][\w]+)*$/;
        var emailDomain = /^(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/;
        var email = /^(\w+)([-_\-+.][\w\_]+)*\@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/;
        var fio = /^[а-я]{1,}$/i;
        var phone = /^[1-9][0-9]{9}$/i;
        var empty = /^.+/i;
        var num = /^[0-9]{1,2}$/i;
        var year = /^[0-9]{4}$/i;
        var zip = /^[0-9]{6}$/i;
        var index=/^[1-9][0-9]*/;
        var passsms=/^[0-9]{6}$/;
        var password=/^.{6,20}$/;
        var code=/^[0-9a-z]{10}$/i;
        var ballgift=/^[1-9][0-9]?$/i;
        var inn = /^[0-9]{12}$/i;

        return {
            'ballgift':function(v){
                var result = ballgift.test(v)
                return {
                    result:result,
                    text:result ? '' : ''
                } ;
            },
            'code' : function(v){
                var result = code.test(v);
                return {
                    result:result,
                    text:result ? '' : ''
                } ;
            },
            'kaptcha' : function(v){
                var result=!(v.length<5);
                return {
                    result:result,
                    text:result ? '' : 'Поле должно содержать не менее 5 символов'
                } ;
            },
            'passsms' : function(v){
                var result= passsms.test(v);
                return {
                    result:result,
                    text:result ? '' : ''
                } ;
            },
            'emailAccount' : function(v){
                var result=emailAccount.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
            },
            'emailDomain' : function(v){
                var result=emailDomain.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле не соответствует формату: domain.ru'
                };
            },
            'fio' : function(v){
                var result= fio.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
            },
            'year' : function(v){
                return year.test(v);
            },
            'phone': function(v){
                var result= phone.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
            },

            'phonemask': function(v){
                v = v.replace(/\s/gi, "");
                var result= phone.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
            },

            'num': function(v){
                var result=num.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
                
            },
            'req': function(v) {
                var result=v.length>0;
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
                
            },
            'zip': function(v) {
                var result= zip.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
                
            },
            'empty': function(v){
                var result= empty.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле не заполнено'
                } ;
            },
            'index':function(v){
                var result=index.test(v)
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно'
                } ;
            },
            'password':function(v){
                var result=password.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле должно содержать от 6 до 20 символов'
                } ;
                
            },
            'inn':function(v){
                var result=inn.test(v);
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно.'
                } ;

            },
            'email':function(v){
                var result=email.test(v)
                return {
                    result:result,
                    text:result ? '' : 'Поле заполнено некорректно.'
                } ;


            },
            'date':function(v){
                var result= isDate(v);
                return {
                    result:result,
                    text:result ? '' : 'Укажите дату в формате dd/mm/yyyy'
                } ;

            },
            'confirm':function(v){
                var result = v>0;
                return {
                    result:result,
                    text:result ? '' : 'Подтвердите согласие'
                } ;
                
            }
        }
    }

    jQuery.fn.validate=function() {
        var obj=$(this);
        var  vTypes=obj.attr('vtype').split(/,/);
        $.each(vTypes, function(i,v){
            var o=obj.VType()[v](obj.val());
            if(o){
                if(o.result){
                    obj.removeClass('error');
                    obj.parent().parent().removeClass('error').children('.message.error').html(o.text);
                }else{
                    obj.addClass('error');
                    obj.parent().parent().addClass('error').children('.message.error').html(o.text);
                    return false;
                }
            }
        });
    }
    
    /* Общие Настройки маскированного ввода */
    $.mask.rules = $.extend($.mask.rules,{
        '#':/[a-zA-Z0-9\-\_\.]/,
        '$':/[А-Яа-яa-zA-Z0-9\-\_\.\s]/
    });
    $('.form .input-field input').val('');
    $('.form .input-field textarea').val('');
    
    $('.form .input-field input:text').setMask({
        autoTab: false
    });
    $(".form .input-field input[name='e-name']").setMask({
        mask:'#',
        'type':'repeat',
        maxLength:20,
        fixedChars : null
    })
    $(".form .input-field input[name='e-domain']").setMask({
        mask:'#',
        'type':'repeat',
        maxLength:20,
        fixedChars : null
    })
    $(".form .input-field input[name='phone']").setMask({
        mask:'9999999999',
        maxLength:10,
        autoTab: false
    })

    /**********************************************************/    
    /* обработка нажатия клавиши @ для перехода на следующее поле */    
    $(".form .input-field input[name='e-name']").keypress(function(e){
        if(e.which==64){
            $(this).moveNext();
            return false;
        }
    });
    /**********************************************************/
    $('.input-field input.validate').blur(function(){
        $(this).validate();
    });

    $('.input-field textarea.validate').blur(function(){
        $(this).validate();
    });
    
    $('.button').hover(function(){
        $(this).addClass('hover');
    }, function(){
        $(this).removeClass('hover');
        $(this).removeClass('click');
    });
    $('.button').mouseup(function(){
        $(this).removeClass('click');
    });

    $('.button').mousedown(function(){
        $(this).addClass('click');
    });
    $('.button button').focus(function(){
        $(this).parent().parent().addClass('focus');
    });
    $('.button button').blur(function(){
        $(this).parent().parent().removeClass('focus');
    });
    
    
    $.fn.modalShow = function(obj){
        mask();
        $(this).css({
            'top': 50 /*$(window).height()/2+$(window).scrollTop()-$(this).height()/2*/,
            'left': $(window).width()/2-$(this).width()/2,
            'z-index':10001
        }).show();
         $(this).find('.button.disabled').removeClass('disabled');
        $(this).find('input').val('');
        $(this).find('button').removeAttr('disabled');
        $(this).find('input:visible').removeAttr('disabled');
        $(this).find('input:visible:first').focus();
        $(this).find('.form.dialog .answer').text('');
        $(this).find('.input-field .error').text('');
        if(obj){
            if(obj.onShow)
            obj.onShow();
        }
        return $(this);
    }
    
    $.fn.modalHide = function(){
        unmask();
        return $(this).removeAttr('z-index').hide();
    }
    
   
    $('.window.shadow').each(function(){
        $(this).parent('.form').boxShadow('8px 8px #FFFFFF');
    })
       
   
       
       


}

function isDate(txtDate) {
    var objDate,  // date object initialized from the txtDate string
    mSeconds, // txtDate in milliseconds
    day,      // day
    month,    // month
    year;     // year
    // date length should be 10 characters (no more no less)
    if (txtDate.length !== 10) {
        return false;
    }
    // third and sixth character should be '/'
    if (txtDate.substring(2, 3) !== '/' || txtDate.substring(5, 6) !== '/') {
        return false;
    }
    // extract month, day and year from the txtDate (expected format is mm/dd/yyyy)
    // subtraction will cast variables to integer implicitly (needed
    // for !== comparing)
    day = txtDate.substring(0, 2) - 0; // because months in JS start from 0
    month = txtDate.substring(3, 5) - 1;
    year = txtDate.substring(6, 10) - 0;
    // test year range
    if (year < 1000 || year > 3000) {
        return false;
    }
    // convert txtDate to milliseconds
    mSeconds = (new Date(year, month, day)).getTime();
    // initialize Date() object from calculated milliseconds
    objDate = new Date();
    objDate.setTime(mSeconds);
    // compare input date and parts from Date() object
    // if difference exists then date isn't valid
    if (objDate.getFullYear() !== year ||
        objDate.getMonth() !== month ||
        objDate.getDate() !== day) {
        return false;
    }
    // otherwise return true
    return true;
}
function mask(){
    $('<button/>',{
        id:'mask'
    }).css({
        "width":"100%",
        "height":"100%",
        "display":'block'
    }).bind('focus',function(){
        var o = $('.window:visible:last input:visible:first');
        if(!o.length){
            o=$('.window:visible:last button:visible:first')
        }else if(!o.length){
            o=$('.window:visible:last a:visible:first')
        }
        o.focus();
    }).appendTo('body').fadeTo(0,0.1);

}

function unmask(){
    $('#mask').remove();
}

jQuery.fn.digitonly = function(options) {
    var opts = jQuery.extend({
        }, options);
    return this.each(function() {
        $(this).keypress(function(e){
            if( e.which!=8 && e.which!=0 && (e.which<48 || e.which>57)){
                return false;
            }

        });
    });
}

function myAlertMsg(id, msg, myFunc) { 
    id += '-' + $('div').length;    
    mask();
    $('<div/>',{
        'class':'myalert',
        'id':id
    }).append(
        $('<div/>',{
            'class':'window form dialog shadow'
        }).append(
            $('<div/>',{
                'class':'win-text',
                'html':msg
            })).append(
            $('<div/>',{
                'class':'button'
            }).hover(function(){
                $(this).addClass('hover');
            }, function(){
                $(this).removeClass('hover');
                $(this).removeClass('click');
            }).mouseup(function(){
                $(this).removeClass('click');
            }).mousedown(function(){
                $(this).addClass('click');
            }).append($('<div/>',{
                'class':'left'
            })).append($('<div/>',{
                'class':'center'
            }).append($('<button/>',{
                'text':'Ок'
            }).click(function(e){
                e.preventDefault();
                $('#'+id).remove();
                unmask();
                if(typeof myFunc != 'undefined') {
                    myFunc();
                }
                return null;
            }))).append($('<div/>',{
                'class':'right'
            }))).append($('<div/>',{
            'class':'close'
        }).append($('<a/>').click(function(e){
            e.preventDefault();
            $('#'+id).remove();
            unmask();
            if(typeof myFunc != 'undefined') {
                myFunc();
            }
            return null;
        })))).css({
        'z-index':'10001'
    }).appendTo('body');
    

    $('#'+id).css({
        'top':  $(window).height()/2+$(window).scrollTop()-$('#'+id).height()/2,
        'left': $(window).width()/2-$('#'+id).width()/2
    });
    $('#'+id+' button').keypress(function(e){
        if (e.keyCode == 13) {
            $('#'+id).remove();
            unmask();
            if(typeof myFunc != 'undefined') {
                myFunc();
            }
        }
    });
    $('#'+id+' button').focus();
   
}

function myAlertMsgRadioGame(id, msg, myFunc) { 
    id += '-' + $('div').length;    
    mask();
    $('<div/>',{
        'class':'myalert radgam',
        'id':id
    }).append(
        $('<div/>',{
            'class':'window form dialog shadow'
        }).append(
            $('<div/>',{
                'class':'win-text',
                'html':msg
            })).append(
            $('<div/>',{
                'class':'button'
            }).hover(function(){
                $(this).addClass('hover');
            }, function(){
                $(this).removeClass('hover');
                $(this).removeClass('click');
            }).mouseup(function(){
                $(this).removeClass('click');
            }).mousedown(function(){
                $(this).addClass('click');
            }).append($('<div/>',{
                'class':'left'
            })).append($('<div/>',{
                'class':'center'
            }).append($('<button/>',{
                'text':'Ок'
            }).click(function(e){
                e.preventDefault();
                $('#'+id).remove();
                unmask();
                if(typeof myFunc != 'undefined') {
                    myFunc();
                }
                return null;
            }))).append($('<div/>',{
                'class':'right'
            }))).append($('<div/>',{
            'class':'close'
        }).append($('<a/>').click(function(e){
            e.preventDefault();
            $('#'+id).remove();
            unmask();
            if(typeof myFunc != 'undefined') {
                myFunc();
            }
            return null;
        })))).css({
        'z-index':'10001'
    }).appendTo('body');
    

    $('.win-text a').unbind().bind('click', function(){
        $('#'+id).remove();
            unmask();
        $(this).blur();
        $('.auth.window').modalShow();
        return null;
    });

    $('#'+id).css({
        'top':  $(window).height()/2+$(window).scrollTop()-$('#'+id).height()/2,
        'left': $(window).width()/2-$('#'+id).width()/2
    });
    $('#'+id+' button').keypress(function(e){
        if (e.keyCode == 13) {
            $('#'+id).remove();
            unmask();
            if(typeof myFunc != 'undefined') {
                myFunc();
            }
        }
    });
    $('#'+id+' button').focus();
   
}
