var ajaxValidate=false;

﻿(function($){
    $.fn.validationEngine=function(settings){
        if($.validationEngineLanguage){
            allRules=$.validationEngineLanguage.allRules
        }else{
            allRules={
                "required":{
                    "regex":"none",
                    "alertText":"* Заполните поле",
                    "alertTextCheckboxMultiple":"* Please select an option",
                    "alertTextCheckboxe":"* This checkbox is required"
                },
                "region":{
                    "regex":/^.{1,100}$/,
                    "alertText":"* Заполните список"
                },
                "rubrics":{
                    "regex":/^.{1,100}$/,
                    "alertText":"* укажите хотя бы одну рубрику"
                },
                "postCode":{
                    "regex":/^[0-9]{6,6}$/,
                    "alertText":"* 6 цифр"
                },
                "opid":{
                    "regex":/^([1-9]$)|(^[1-9][0-9]{1,20})$/,
                    "alertText":"* введите корректный ID (целое число > 0)"
                },
                "vkid":{
                    "regex":/^id[0-9]{1,100}$/,
                    "alertText":"* введите ваш id ВКонтакте, вида id1234567890"
                },
                "length":{
                    "regex":"none",
                    "alertText":"*От ",
                    "alertText2":" до ",
                    "alertText3":" символов"
                },
                "minCheckbox":{
                    "regex":"none",
                    "alertText":"* Checks allowed Exceeded"
                },
                "sum":{
                    "regex":/^([3-9][0-9][0-9]$)|(^[0-9]{4,100})$/,
                    "alertText":"* мин. сумма: 300 руб."
                },
                "confirm":{
                    "regex":"none",
                    "alertText":"* Поля не совпадают"
                },
                "telephone":{
                    "regex":/^\+7[0-9\-\(\)\ ]+$/,
                    "alertText":"* Invalid phone number"
                },
                "phone":{
                    "regex":/^\+7\([0-9]{2,6}\)[0-9]{4,11}[а-яА-Я0-9\.]{0,9}$/i,
                    "alertText":"* укажите телефон в формате +7(123)1234567)"
                },
                "password":{
                    "regex":"/^.{6,12}$/i",
                    "alertText":"* от 6 до 12 символов"
                },
                "email":{
                    "regex":/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/,
                    "alertText":"* укажите email "
                },
                "email2":{
                    "regex":"/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,4}$/",
                    "alertText":"* укажите email "
                },
                "date":{
                    "regex":"/^[0-9]{4}\-\[0-9]{1,2}\-\[0-9]{1,2}$/",
                    "alertText":"* Invalid date, must be in YYYY-MM-DD format"
                },
                "onlyNumber":{
                    "regex":"/^[0-9\ ]+$/",
                    "alertText":"* Numbers only"
                },
                "noSpecialCaracters":{
                    "regex":"/^[0-9a-zA-Z]+$/",
                    "alertText":"* No special caracters allowed"
                },
                "ajaxUser":{
                    "file":"/m009/xml/checkLogin",
                    "params":"login",
                    "alertTextLoad":"* проверка login'a",
                    "alertText":"* такой login уже существует"
                },
                "ajaxName":{
                    "file":"validateUser.php",
                    "alertText":"* This name is already taken",
                    "alertTextOk":"* This name is available",
                    "alertTextLoad":"* Loading, please wait"
                },
                "ajaxEmail":{
                    "file":"/m009/xml/checkEmail",
                    "params":"email",
                    "alertText":"* такой email уже существует",
                    "alertTextLoad":"* проверка email'a"
                },
                "onlyLetter":{
                    "regex":"/^[a-zA-Z\ \']+$/",
                    "alertText":"* Letters only"
                }
            }
        }settings=jQuery.extend({
            allrules:allRules,
            inlineValidation:true,
            ajaxSubmit:false,
            promptPosition:"topRight",
            success:false,
            failure:function(){}
        },settings);
        $.validationEngine.ajaxValidArray=new Array();
        $(this).unbind('validate').bind("validate",function(caller){
            $.validationEngine.onSubmitValid=false;
            $(this).data('valid',false);
            if($.validationEngine.submitValidation(this,settings)==false){
                if($('.formError',this).not('.greenPopup').not('.blackPopup').size()==0)$(this).data('valid',true);
                if($.validationEngine.submitForm(this,settings)==true){
                    return false;
                }
            }else{
                settings.failure&&settings.failure();return false;
            }
        });
        $(this).find("[class^=validate]").bind("blur",function(caller){
            _inlinEvent(this)
        });
        function _inlinEvent(caller){
            $.validationEngine.onSubmitValid=false;
            $.validationEngine.loadValidation(caller,settings);
        };
        if(settings.inlineValidation==true){
            $(this).find("[class^=validate]").not("[type=checkbox]").bind("blur",function(caller){
                _inlinEvent(this)
            });$(this).find("[class^=validate][type=checkbox]").bind("click",function(caller){
                _inlinEvent(this)
            });function _inlinEvent(caller){
                if($.validationEngine.intercept==false|| !$.validationEngine.intercept){
                    $.validationEngine.onSubmitValid=false;$.validationEngine.loadValidation(caller,settings);
                }else{
                    $.validationEngine.intercept=false;
                }
            }
        }
    };
    $.validationEngine={
        submitForm:function(caller){
            if($.validationEngine.settings.ajaxSubmit){
                $.ajax({
                    type:"POST",
                    url:$.validationEngine.settings.ajaxSubmitFile,
                    async:true,
                    data:$(caller).serialize(),
                    success:function(data){
                        if(data=="true"){
                            //
                            if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8) {
                                $(caller).css("display","none");$(caller).before("<div class='ajaxSubmit'>"+$.validationEngine.settings.ajaxSubmitMessage+"</div>");$.validationEngine.closePrompt(".formError",true);$(".ajaxSubmit").show("slow");if($.validationEngine.settings.success){
                                    $.validationEngine.settings.success&&$.validationEngine.settings.success();return false;
                                }
                            }
                            else {
                                $(caller).css("opacity",1);$(caller).animate({
                                    opacity:0,
                                    height:0
                                },function(){
                                    $(caller).css("display","none");$(caller).before("<div class='ajaxSubmit'>"+$.validationEngine.settings.ajaxSubmitMessage+"</div>");$.validationEngine.closePrompt(".formError",true);$(".ajaxSubmit").show("slow");if($.validationEngine.settings.success){
                                        $.validationEngine.settings.success&&$.validationEngine.settings.success();return false;
                                    }
                                })
                            }
                        }
                        else{
                            data=eval("("+data+")");errorNumber=data.jsonValidateReturn.length;for(index=0;index<errorNumber;index++){
                                fieldId=data.jsonValidateReturn[index][0];promptError=data.jsonValidateReturn[index][1];type=data.jsonValidateReturn[index][2];$.validationEngine.buildPrompt(fieldId,promptError,type);
                            }
                        }
                    }
                });return true;
            }if($.validationEngine.settings.success){
                $.validationEngine.settings.success&&$.validationEngine.settings.success();return true;
            }return false;
        },
        buildPrompt:function(caller,promptText,type,ajaxed){
            var divFormError=document.createElement('div');var formErrorContent=document.createElement('div');$(divFormError).addClass("formError");if(type=="pass"){
                $(divFormError).addClass("greenPopup")
            }
            if(type=="load"){
                $(divFormError).addClass("blackPopup")
            }
            if(ajaxed){
                $(divFormError).addClass("ajaxed")
            }
            $(divFormError).addClass($(caller).attr("id"));$(formErrorContent).addClass("formErrorContent");
            if($('#form_container').size()!=0){
                $('#form_container').append(divFormError);
            }
            else{
                $("body").append(divFormError);
            }
            $(divFormError).append(formErrorContent);if($.validationEngine.showTriangle!=false){
                var arrow=document.createElement('div');$(arrow).addClass("formErrorArrow");$(divFormError).append(arrow);if($.validationEngine.settings.promptPosition=="bottomLeft"||$.validationEngine.settings.promptPosition=="bottomRight"){
                    $(arrow).addClass("formErrorArrowBottom");$(arrow).html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
                }if($.validationEngine.settings.promptPosition=="topLeft"||$.validationEngine.settings.promptPosition=="topRight"){
                    $(divFormError).append(arrow);$(arrow).html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
                }
            }
            $(formErrorContent).html(promptText);
            if($('#form_container').size()!=0){
                callerTopPosition=$(caller).position().top;callerleftPosition=$(caller).position().left;
            }
            else{
                callerTopPosition=$(caller).offset().top;callerleftPosition=$(caller).offset().left;
            }
            callerWidth=$(caller).width();
            inputHeight=$(divFormError).height();
            if($.validationEngine.settings.promptPosition=="topRight"){
                callerleftPosition+=callerWidth-30;
                callerTopPosition+= -inputHeight-10;
            }
            if($.validationEngine.settings.promptPosition=="topLeft"){
                callerTopPosition+= -inputHeight-10;
            }
            if($.validationEngine.settings.promptPosition=="centerRight"){
                callerleftPosition+=callerWidth+13;
            }
            if($.validationEngine.settings.promptPosition=="bottomLeft"){
                callerHeight=$(caller).height();
                callerleftPosition=callerleftPosition;
                callerTopPosition=callerTopPosition+callerHeight+15;
            }
            if($.validationEngine.settings.promptPosition=="bottomRight"){
                callerHeight=$(caller).height();
                callerleftPosition+=callerWidth-30;callerTopPosition+=callerHeight+15;
            }
            if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8) {
                $(divFormError).css({
                    top:callerTopPosition,
                    left:callerleftPosition,
                    opacity:0
                });
                return $(divFormError).css({'opacity':1})
            }
            else {
                $(divFormError).css({
                    top:callerTopPosition,
                    left:callerleftPosition,
                    opacity:0
                });
                return $(divFormError).animate({
                    "opacity":0.87
                },function(){
                    return true;
                });
            }
        },
        updatePromptText:function(caller,promptText,type,ajaxed){
            updateThisPrompt=$(caller).attr("id");
            updateThisPrompt="."+updateThisPrompt;
            (type=="pass")?$(updateThisPrompt).addClass("greenPopup"):$(updateThisPrompt).removeClass("greenPopup");
            (type=="load")?$(updateThisPrompt).addClass("blackPopup"):$(updateThisPrompt).removeClass("blackPopup");
            (ajaxed)?$(updateThisPrompt).addClass("ajaxed"):$(updateThisPrompt).removeClass("ajaxed");
            $(updateThisPrompt).find(".formErrorContent").html(promptText);
            callerTopPosition=$(caller).offset().top;inputHeight=$(updateThisPrompt).height();
            if($.validationEngine.settings.promptPosition=="bottomLeft"||$.validationEngine.settings.promptPosition=="bottomRight"){
                callerHeight=$(caller).height();
                callerTopPosition=callerTopPosition+callerHeight+15
            }if($.validationEngine.settings.promptPosition=="centerRight"){
                callerleftPosition+=callerWidth+13;
            }if($.validationEngine.settings.promptPosition=="topLeft"||$.validationEngine.settings.promptPosition=="topRight"){
                callerTopPosition=callerTopPosition-inputHeight-10
            }
        },
        loadValidation:function(caller,settings){
            $.validationEngine.settings=settings;
            rulesParsing=$(caller).attr('class');
            rulesRegExp=/\[(.*)\]/;
            getRules=rulesRegExp.exec(rulesParsing);
            str=getRules[1];pattern=/\W+/;
            result=str.split(pattern);
            var validateCalll=$.validationEngine.validateCall(caller,result);
            return validateCalll
        },
        validateCall:function(caller,rules){
            var promptText="";var prompt=$(caller).attr("id");ajaxValidate=false;var callerName=$(caller).attr("name");
            $.validationEngine.isError=false;
            $.validationEngine.showTriangle=true;
            callerType=$(caller).attr("type");
            for(i=0;i<rules.length;i++){
                switch(rules[i]){
                    case "optional":if(!$(caller).val()){
                        $.validationEngine.closePrompt(caller);
                        return $.validationEngine.isError
                    }break;case "required":_required(caller,rules);
                        break;
                    case "custom":_customRegex(caller,rules,i);
                        break;
                    case "ajax":_ajax(caller,rules,i);
                        break;
                    case "length":_length(caller,rules,i);break;case "minCheckbox":_minCheckbox(caller,rules,i);
                        break;case "confirm":_confirm(caller,rules,i);break;default:;
                }
            }
            if($.validationEngine.isError==true){
                radioHackOpen();if($.validationEngine.isError==true){
                    $.validationEngine.buildPrompt(caller,promptText,"error");
                }
            }
            else{
                radioHackClose();
                $.validationEngine.closePrompt(caller);
            }
            function radioHackOpen(){
                if($("input[name="+callerName+"]").size()>1&&callerType=="radio"){
                    caller=$("input[name="+callerName+"]:first");$.validationEngine.showTriangle=false;var callerId="."+$(caller).attr("id");if($(callerId).size()==0){
                        $.validationEngine.isError=true;
                    }else{
                        $.validationEngine.isError=false;
                    }
                }if($("input[name="+callerName+"]").size()>1&&callerType=="checkbox"){
                    caller=$("input[name="+callerName+"]:first");$.validationEngine.showTriangle=false;var callerId="div."+$(caller).attr("id");if($(callerId).size()==0){
                        $.validationEngine.isError=true;
                    }else{
                        $.validationEngine.isError=false;
                    }
                }
            };
            function radioHackClose(){
                if($("input[name="+callerName+"]").size()>1&&callerType=="radio"){
                    caller=$("input[name="+callerName+"]:first");
                }if($("input[name="+callerName+"]").size()>1&&callerType=="checkbox"){
                    caller=$("input[name="+callerName+"]:first");
                }
            };
            function _required(caller,rules){
                callerType=$(caller).attr("type");if(callerType=="text"||callerType=="password"||callerType=="textarea"){
                    if(!$(caller).val()){
                        $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
                    }
                }if(callerType=="radio"||callerType=="checkbox"){
                    callerName=$(caller).attr("name");if($("input[name="+callerName+"]:checked").size()==0){
                        $.validationEngine.isError=true;if($("input[name="+callerName+"]").size()==1){
                            promptText+=$.validationEngine.settings.allrules[rules[i]].alertTextCheckboxe+"<br />";
                        }else{
                            promptText+=$.validationEngine.settings.allrules[rules[i]].alertTextCheckboxMultiple+"<br />";
                        }
                    }
                }if(callerType=="select-one"){
                    callerName=$(caller).attr("id");if(!$("select[name="+callerName+"]").val()){
                        $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
                    }
                }if(callerType=="select-multiple"){
                    callerName=$(caller).attr("id");if(!$("#"+callerName).val()){
                        $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
                    }
                }
            };
            function _customRegex(caller,rules,position){
                customRule=rules[position+1];pattern=eval($.validationEngine.settings.allrules[customRule].regex);if(!pattern.test($(caller).attr('value'))){
                    $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules[customRule].alertText+"<br />";
                }
            };
            function _ajax(caller,rules,position){
                customAjaxRule=rules[position+1];postfile=$.validationEngine.settings.allrules[customAjaxRule].file;postparams=$.validationEngine.settings.allrules[customAjaxRule].params;fieldValue=$(caller).val();ajaxCaller=caller;fieldId=$(caller).attr("id");ajaxValidate=true;ajaxisError=$.validationEngine.isError;if(!ajaxisError){
                    $.ajax({
                        type:"POST",
                        url:postfile,
                        async:true,
                        data:"email="+fieldValue+"&login="+fieldValue,
                        beforeSend:function(){
                            if($.validationEngine.settings.allrules[customAjaxRule].alertTextLoad){
                                if(!$("div."+fieldId)[0]){
                                    return $.validationEngine.buildPrompt(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
                                }else{
                                    $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
                                }
                            }
                        },
                        success:function(xml){
                            code=$('code',xml).text();
                            fieldId=ajaxCaller;
                            ajaxErrorLength=$.validationEngine.ajaxValidArray.length;
                            existInarray=false;if(code!=1){
                                $.validationEngine.ajaxValid=false;
                                promptText+=$.validationEngine.settings.allrules[customAjaxRule].alertText+"<br />";$.validationEngine.updatePromptText(caller,promptText,"",true);
                            }else{
                                $.validationEngine.ajaxValid=true;
                                if($.validationEngine.settings.allrules[customAjaxRule].alertTextOk){
                                    $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextOk,"pass",true);
                                }else{
                                    ajaxValidate=false;$.validationEngine.closePrompt(ajaxCaller);
                                }
                            }
                        }
                    });
                }
            };
            function _confirm(caller,rules,position){
                confirmField=rules[position+1];if($(caller).attr('value')!=$("#"+confirmField).attr('value')){
                    $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules["confirm"].alertText+"<br />";
                }
            };
            function _length(caller,rules,position){
                startLength=eval(rules[position+1]);
                endLength=eval(rules[position+2]);
                feildLength=$(caller).attr('value').length;
                if(feildLength<startLength||feildLength>endLength){
                    $.validationEngine.isError=true;
                    promptText+=$.validationEngine.settings.allrules["length"].alertText+startLength+$.validationEngine.settings.allrules["length"].alertText2+endLength+$.validationEngine.settings.allrules["length"].alertText3+"<br />"
                }
            };
            function _minCheckbox(caller,rules,position){
                nbCheck=eval(rules[position+1]);
                groupname=$(caller).attr("name");
                groupSize=$("input[name="+groupname+"]:checked").size();
                if(groupSize>nbCheck){
                    $.validationEngine.isError=true;promptText+=$.validationEngine.settings.allrules["minCheckbox"].alertText+"<br />";
                }
            };
            return($.validationEngine.isError)?$.validationEngine.isError:false;
        },
        closePrompt:function(caller,outside){
            if(outside){
                if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8) {
                    $(caller).remove();
                }
                else {


                $(caller).fadeTo("fast",0,function(){
                    $(caller).remove();
                });return false;
                }
            }

            if(!ajaxValidate){
                var closingPrompt=$(caller).attr("id");
                if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8) {
                    $("."+closingPrompt).remove();
                }
                else {
                    $("."+closingPrompt).fadeTo("fast",0,function(){
                        $("."+closingPrompt).remove();
                    });
                }
            }
        },
        submitValidation:function(caller,settings){ 
            var stopForm=false;
            $.validationEngine.settings=settings;
            $.validationEngine.ajaxValid=true;
            $(caller).find(".formError").remove();
            var toValidateSize=$(caller).find("[class^=validate]").size();
            $(caller).find("[class^=validate]").not("[class*=ajax]").each(function(){
                callerId=$(this).attr("id");if(!$("."+callerId).hasClass("ajaxed")){
                    var validationPass=$.validationEngine.loadValidation(this,settings);return(validationPass)?stopForm=true:"";
                }
            });
            ajaxErrorLength=$.validationEngine.ajaxValidArray.length;for(x=0;x<ajaxErrorLength;x++){
                if($.validationEngine.ajaxValidArray[x][1]==false){
                    $.validationEngine.ajaxValid=false
                }
            }if(stopForm|| !$.validationEngine.ajaxValid){
                destination=$(".formError:not('.greenPopup'):first").offset().top;$("html:not(:animated),body:not(:animated)").animate({
                    scrollTop:destination
                },1100);return true;
            }else{
                return false
            }
        }
    }
})(jQuery);
function hide_validation(){
    $.validationEngine.closePrompt(".formError",true)
}
