$.fn.extend({ reset: function() {
    return this.each(function() {
        $(this).is('form') && this.reset();
    })
} });

(function($) {
    $.fn.validationEngineLanguage = function() {};
    $.validationEngineLanguage = {
        newLang: function() {
            $.validationEngineLanguage.allRules = {
                    "required":{
                        "regex":"none",
                        "alertText":"* Это обязательное поле",
                        "alertTextCheckboxMultiple":"* Пожалуйста, выберите вариант",
                        "alertTextCheckboxe":"* Здесь обязательная галочка"},
                    "length":{
                        "regex":"none",
                        "alertText":"*Между ",
                        "alertText2":" и ",
                        "alertText3": " символов допустимы"},
                    "maxCheckbox":{
                        "regex":"none",
                        "alertText":"* Превышено допустимое количество выбранных вариантов"},
                    "minCheckbox":{
                        "regex":"none",
                        "alertText":"* Выберите несколько (",
                        "alertText2":") вариантов"},    
                    "confirm":{
                        "regex":"none",
                        "alertText":"* Проверьте правильность заполнения"},     
                    "telephone":{
                        "regex":"/^[\\d\\+\\-() ]+$/",
                        "alertText":"* Неправильный телефонный номер"},
                    "email":{
                        "regex":"/^(([A-Za-z0-9]+\\-+)|([A-Za-z0-9]+\\.+)|([A-Za-z0-9]+\\++))*[A-Za-z0-9]+@[a-zA-Z0-9\\-]{1,255}(\\.[a-zA-Z0-9\\-]{1,255})*\\.[a-zA-Z]{2,6}$/",
                        "alertText":"* Некорректный адрес электронной почты"},  
                    "date":{
                         "regex":"/^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}$/",
                         "alertText":"* Неправильная дата. Формат должен быть YYYY-MM-DD"},
                    "onlyNumber":{
                        "regex":"/^[0-9 \.]+$/",
                        "alertText":"* Это числовое поле"},
                    "noSpecialCaracters":{
                        "regex":"/^[0-9a-zA-Z]+$/",
                        "alertText":"* Спец-символы в этом поле недопустимы"},  
                    "ajaxUser":{
                        "file":"validateUser.php",
                        "extraData":"name=eric",
                        "alertTextOk":"* Доступно", 
                        "alertTextLoad":"* Подождите",
                        "alertText":"* Занято"},    
                    "ajaxName":{
                        "file":"validateUser.php",
                        "alertText":"* Занято",
                        "alertTextOk":"* Доступно", 
                        "alertTextLoad":"* Подождите"},     
                    "onlyLetter":{
                        "regex":"/^[a-zA-Zа-яА-Я \\']+$/",
                        "alertText":"* Допустимы только буквы"},
                    "validate2fields":{
                        "nname":"validate2fields",
                        "alertText":"* У вас должны быть имя и фамилия"},
                    "cvr1": {
                        "regex": "/^([\\d\\+\\-() ]+)?$/",
                        "alertText": "* телефон. например, +7(495)123-45-67"},
                    "cvr2": {
                        "regex": "/^([\\d\\+\\-() ]+)?$/",
                        "alertText": "* факс. например, +7(495)123-45-67"},
                    "cvr3": {
                        "regex": "/^(\\d{3,10})?$/",
                        "alertText": "* icq. например, 123456789"},
                    "cvr4": {
                        "regex": "/^([a-zA-Z]{1}[\\w\\.\\,\\-\\_]{5,31})?$/",
                        "alertText": "* введите ваш Skype-аккаунт"},
                    "cvr5": {
                        "regex": "/^((([A-Za-z0-9]+\\-+)|([A-Za-z0-9]+\\.+)|([A-Za-z0-9]+\\++))*[A-Za-z0-9]+@[a-zA-Z0-9\\-]{1,255}(\\.[a-zA-Z0-9\\-]{1,255})*\\.[a-zA-Z]{2,6})?$/",
                        "alertText": "* введите корректный email (Электронная почта)"},
                    "cvr6": {
                        "regex": "/^([a-zA-Z0-9\\-]{1,255}(\\.[a-zA-Z0-9\\-]{1,255})*\\.[a-zA-Z]{2,6}([\\/|\\?]*[а-яА-Я\\w\\#\\!\\:\\.\\?\\+\\=\\&\\%\\@\\!\\-\\/\\;]+)?)?$/",
                        "alertText": "* например, site.ru"}
                    }
        }
    }
})(jQuery);

/*
 * Inline Form Validation Engine 1.6.4, jQuery plugin
 * 
 * Copyright(c) 2009, Cedric Dugas
 * http://www.position-relative.net
 *  
 * Form validation engine allowing custom regex rules to be added.
 * Thanks to Francois Duquette and Teddy Limousin 
 * and everyone helping me find bugs on the forum
 * Licenced under the MIT Licence
 */
 
(function($) {
    
    $.fn.validationEngine = function(settings) {
        
    if($.validationEngineLanguage){             // IS THERE A LANGUAGE LOCALISATION ?
        allRules = $.validationEngineLanguage.allRules;
    }else{
        $.validationEngine.debug("Validation engine rules are not loaded check your external file");
    }
    settings = jQuery.extend({
        allrules:allRules,
        validationEventTriggers:"focusout",                 
        inlineValidation: true, 
        returnIsValid:false,
        liveEvent:true,
        unbindEngine:true,
        ajaxSubmit: false,
        scroll:true,
        promptPosition: "topRight", // OPENNING BOX POSITION, IMPLEMENTED: topLeft, topRight, bottomLeft, centerRight, bottomRight
        success : false,
        beforeSuccess :  function() {},
        failure : function() {}
    }, settings);   
    $.validationEngine.settings = settings;
    $.validationEngine.ajaxValidArray = new Array();    // ARRAY FOR AJAX: VALIDATION MEMORY 
    
    if(settings.inlineValidation == true){      // Validating Inline ?
        if(!settings.returnIsValid){                    // NEEDED FOR THE SETTING returnIsValid
            allowReturnIsvalid = false;
            if(settings.liveEvent){                     // LIVE event, vast performance improvement over BIND
                $(this).find("[class*=validate][type!=checkbox]").live(settings.validationEventTriggers, function(caller){ _inlinEvent(this);})
                $(this).find("[class*=validate][type=checkbox]").live("click", function(caller){ _inlinEvent(this); })
            }else{
                $(this).find("[class*=validate]").not("[type=checkbox]").bind(settings.validationEventTriggers, function(caller){ _inlinEvent(this); })
                $(this).find("[class*=validate][type=checkbox]").bind("click", function(caller){ _inlinEvent(this); })
            }
            firstvalid = false;
        }
            function _inlinEvent(caller){
                $.validationEngine.settings = settings;
                if($.validationEngine.intercept == false || !$.validationEngine.intercept){     // STOP INLINE VALIDATION THIS TIME ONLY
                    $.validationEngine.onSubmitValid=false;
                    $.validationEngine.loadValidation(caller); 
                }else{
                    $.validationEngine.intercept = false;
                }
            }
    }
    if (settings.returnIsValid){        // Do validation and return true or false, it bypass everything;
        if ($.validationEngine.submitValidation(this,settings)){
            return false;
        }else{
            return true;
        }
    }
    $(this).bind("submit", function(caller){   // ON FORM SUBMIT, CONTROL AJAX FUNCTION IF SPECIFIED ON DOCUMENT READY
        $.validationEngine.onSubmitValid = true;
        $.validationEngine.settings = settings;
        if($.validationEngine.submitValidation(this,settings) == false){
            if($.validationEngine.submitForm(this,settings) == true) {return false;}
        }else{
            settings.failure && settings.failure(); 
            return false;
        }       
    })
    $(".formError").live("click",function(){     // REMOVE BOX ON CLICK
        $(this).fadeOut(150,function(){
            $(this).remove();
        }) 
    })
};  
$.validationEngine = {
    defaultSetting : function(caller) {     // NOT GENERALLY USED, NEEDED FOR THE API, DO NOT TOUCH
        if($.validationEngineLanguage){             
            allRules = $.validationEngineLanguage.allRules;
        }else{
            $.validationEngine.debug("Validation engine rules are not loaded check your external file");
        }   
        settings = {
            allrules:allRules,
            validationEventTriggers:"blur",                 
            inlineValidation: true, 
            returnIsValid:false,
            scroll:true,
            unbindEngine:true,
            ajaxSubmit: false,
            promptPosition: "topRight", // OPENNING BOX POSITION, IMPLEMENTED: topLeft, topRight, bottomLeft, centerRight, bottomRight
            success : false,
            failure : function() {}
        }   
        $.validationEngine.settings = settings;
    },
    loadValidation : function(caller) {     // GET VALIDATIONS TO BE EXECUTED
        if(!$.validationEngine.settings){
            $.validationEngine.defaultSetting()
        }
        rulesParsing = $(caller).attr('class');
        rulesRegExp = /\[(.*)\]/;
        getRules = rulesRegExp.exec(rulesParsing);
        str = getRules[1];
        pattern = /\[|,|\]/;
        result= str.split(pattern); 
        var validateCalll = $.validationEngine.validateCall(caller,result)
        return validateCalll;
    },
    validateCall : function(caller,rules) { // EXECUTE VALIDATION REQUIRED BY THE USER FOR THIS FIELD
        var promptText =""  
        
        if(!$(caller).attr("id")) { $.validationEngine.debug("This field have no ID attribut( name & class displayed): "+$(caller).attr("name")+" "+$(caller).attr("class")) }

        caller = caller;
        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 "exemptString": 
                 _exemptString(caller,rules,i);
            break;
            case "ajax": 
                if(!$.validationEngine.onSubmitValid){
                    _ajax(caller,rules,i);  
                };
            break;
            case "length": 
                 _length(caller,rules,i);
            break;
            case "maxCheckbox": 
                _maxCheckbox(caller,rules,i);
                groupname = $(caller).attr("name");
                caller = $("input[name='"+groupname+"']");
            break;
            case "minCheckbox": 
                _minCheckbox(caller,rules,i);
                groupname = $(caller).attr("name");
                caller = $("input[name='"+groupname+"']");
            break;
            case "confirm": 
                 _confirm(caller,rules,i);
            break;
            case "funcCall": 
                _funcCall(caller,rules,i);
            break;
            default :;
            };
        };
        radioHack();
        if ($.validationEngine.isError == true){
            linkTofield = $.validationEngine.linkTofield(caller);
            
            ($("div."+linkTofield).size() ==0) ? $.validationEngine.buildPrompt(caller,promptText,"error")  : $.validationEngine.updatePromptText(caller,promptText);
        }else{ $.validationEngine.closePrompt(caller);}         
        /* UNFORTUNATE RADIO AND CHECKBOX GROUP HACKS */
        /* As my validation is looping input with id's we need a hack for my validation to understand to group these inputs */
        function radioHack(){
          if($("input[name='"+callerName+"']").size()> 1 && (callerType == "radio" || callerType == "checkbox")) {        // Hack for radio/checkbox group button, the validation go the first radio/checkbox of the group
              caller = $("input[name='"+callerName+"'][type!=hidden]:first");     
              $.validationEngine.showTriangle = false;
          }      
        }
        /* VALIDATION FUNCTIONS */
        function _required(caller,rules){   // VALIDATE BLANK FIELD
            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") { // added by paul@kinetek.net for select boxes, Thank you      
                if(!$(caller).val()) {
                    $.validationEngine.isError = true;
                    promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
                }
            }
            if (callerType == "select-multiple") { // added by paul@kinetek.net for select boxes, Thank you 
                if(!$(caller).find("option:selected").val()) {
                    $.validationEngine.isError = true;
                    promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
                }
            }
        }
        function _customRegex(caller,rules,position){        // VALIDATE REGEX RULES
            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 _exemptString(caller,rules,position){       // VALIDATE REGEX RULES
            customString = rules[position+1];
            if(customString == $(caller).attr('value')){
                $.validationEngine.isError = true;
                promptText += $.validationEngine.settings.allrules['required'].alertText+"<br />";
            }
        }
        
        function _funcCall(caller,rules,position){          // VALIDATE CUSTOM FUNCTIONS OUTSIDE OF THE ENGINE SCOPE
            customRule = rules[position+1];
            funce = $.validationEngine.settings.allrules[customRule].nname;
            
            var fn = window[funce];
            if (typeof(fn) === 'function'){
                var fn_result = fn();
                $.validationEngine.isError = fn_result;
                promptText += $.validationEngine.settings.allrules[customRule].alertText+"<br />";
            }
        }
        function _ajax(caller,rules,position){               // VALIDATE AJAX RULES
            
            customAjaxRule = rules[position+1];
            postfile = $.validationEngine.settings.allrules[customAjaxRule].file;
            fieldValue = $(caller).val();
            ajaxCaller = caller;
            fieldId = $(caller).attr("id");
            ajaxValidate = true;
            ajaxisError = $.validationEngine.isError;
            
            if(!$.validationEngine.settings.allrules[customAjaxRule].extraData){
                extraData = $.validationEngine.settings.allrules[customAjaxRule].extraData;
            }else{
                extraData = "";
            }
            /* AJAX VALIDATION HAS ITS OWN UPDATE AND BUILD UNLIKE OTHER RULES */   
            if(!ajaxisError){
                $.ajax({
                    type: "POST",
                    url: postfile,
                    async: true,
                    data: "validateValue="+fieldValue+"&validateId="+fieldId+"&validateError="+customAjaxRule+extraData,
                    beforeSend: function(){     // BUILD A LOADING PROMPT IF LOAD TEXT EXIST                    
                        if($.validationEngine.settings.allrules[customAjaxRule].alertTextLoad){
                        
                            if(!$("div."+fieldId+"formError")[0]){                              
                                return $.validationEngine.buildPrompt(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
                            }else{
                                $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
                            }
                        }
                    },
                    error: function(data,transport){ $.validationEngine.debug("error in the ajax: "+data.status+" "+transport) },
                    success: function(data){                    // GET SUCCESS DATA RETURN JSON
                        data = eval( "("+data+")");             // GET JSON DATA FROM PHP AND PARSE IT
                        ajaxisError = data.jsonValidateReturn[2];
                        customAjaxRule = data.jsonValidateReturn[1];
                        ajaxCaller = $("#"+data.jsonValidateReturn[0])[0];
                        fieldId = ajaxCaller;
                        ajaxErrorLength = $.validationEngine.ajaxValidArray.length;
                        existInarray = false;
                        
                         if(ajaxisError == "false"){            // DATA FALSE UPDATE PROMPT WITH ERROR;
                            
                            _checkInArray(false)                // Check if ajax validation alreay used on this field
                            
                            if(!existInarray){                  // Add ajax error to stop submit                
                                $.validationEngine.ajaxValidArray[ajaxErrorLength] =  new Array(2);
                                $.validationEngine.ajaxValidArray[ajaxErrorLength][0] = fieldId;
                                $.validationEngine.ajaxValidArray[ajaxErrorLength][1] = false;
                                existInarray = false;
                            }
                
                            $.validationEngine.ajaxValid = false;
                            promptText += $.validationEngine.settings.allrules[customAjaxRule].alertText+"<br />";
                            $.validationEngine.updatePromptText(ajaxCaller,promptText,"",true);             
                         }else{  
                            _checkInArray(true);
                            $.validationEngine.ajaxValid = true;            
                            if(!customAjaxRule) {$.validationEngine.debug("wrong ajax response, are you on a server or in xampp? if not delete de ajax[ajaxUser] validating rule from your form ")}        
                            if($.validationEngine.settings.allrules[customAjaxRule].alertTextOk){   // NO OK TEXT MEAN CLOSE PROMPT             
                                                $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextOk,"pass",true);
                            }else{
                                ajaxValidate = false;           
                                $.validationEngine.closePrompt(ajaxCaller);
                            }       
                         }
                        function  _checkInArray(validate){
                            for(x=0;x<ajaxErrorLength;x++){
                                if($.validationEngine.ajaxValidArray[x][0] == fieldId){
                                    $.validationEngine.ajaxValidArray[x][1] = validate;
                                    existInarray = true;
                                
                                }
                            }
                        }
                    }               
                });
            }
        }
        function _confirm(caller,rules,position){        // VALIDATE FIELD MATCH
            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){          // VALIDATE LENGTH
        
            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 _maxCheckbox(caller,rules,position){     // VALIDATE CHECKBOX NUMBER
        
            nbCheck = eval(rules[position+1]);
            groupname = $(caller).attr("name");
            groupSize = $("input[name='"+groupname+"']:checked").size();
            if(groupSize > nbCheck){    
                $.validationEngine.showTriangle = false;
                $.validationEngine.isError = true;
                promptText += $.validationEngine.settings.allrules["maxCheckbox"].alertText+"<br />";
            }
        }
        function _minCheckbox(caller,rules,position){     // VALIDATE CHECKBOX NUMBER
        
            nbCheck = eval(rules[position+1]);
            groupname = $(caller).attr("name");
            groupSize = $("input[name='"+groupname+"']:checked").size();
            if(groupSize < nbCheck){    
            
                $.validationEngine.isError = true;
                $.validationEngine.showTriangle = false;
                promptText += $.validationEngine.settings.allrules["minCheckbox"].alertText+" "+nbCheck+" "+$.validationEngine.settings.allrules["minCheckbox"].alertText2+"<br />";
            }
        }
        return($.validationEngine.isError) ? $.validationEngine.isError : false;
    },
    submitForm : function(caller){
        if($.validationEngine.settings.ajaxSubmit){     
            if($.validationEngine.settings.ajaxSubmitExtraData){
                extraData = $.validationEngine.settings.ajaxSubmitExtraData;
            }else{
                extraData = "";
            }
            $.ajax({
                type: "POST",
                url: $.validationEngine.settings.ajaxSubmitFile,
                async: true,
                data: $(caller).serialize()+"&"+extraData,
                error: function(data,transport){ $.validationEngine.debug("error in the ajax: "+data.status+" "+transport) },
                success: function(data){
                    if(data == "true"){         // EVERYTING IS FINE, SHOW SUCCESS MESSAGE
                        $(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){   // AJAX SUCCESS, STOP THE LOCATION UPDATE
                                $.validationEngine.settings.success && $.validationEngine.settings.success(); 
                                return false;
                            }
                        })
                    }else{                      // HOUSTON WE GOT A PROBLEM (SOMETING IS NOT VALIDATING)
                        data = eval( "("+data+")"); 
                        if(!data.jsonValidateReturn){
                             $.validationEngine.debug("you are not going into the success fonction and jsonValidateReturn return nothing");
                        }
                        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;
        }
        // LOOK FOR BEFORE SUCCESS METHOD       
            if(!$.validationEngine.settings.beforeSuccess()){
                if ($.validationEngine.settings.success){   // AJAX SUCCESS, STOP THE LOCATION UPDATE
                    if($.validationEngine.settings.unbindEngine){ $(caller).unbind("submit") }
                    $.validationEngine.settings.success && $.validationEngine.settings.success(); 
                    return true;
                }
            }else{
                return true;
            } 
        return false;
    },
    buildPrompt : function(caller,promptText,type,ajaxed) {         // ERROR PROMPT CREATION AND DISPLAY WHEN AN ERROR OCCUR
        if(!$.validationEngine.settings){
            $.validationEngine.defaultSetting()
        }
        deleteItself = "." + $(caller).attr("id") + "formError"
    
        if($(deleteItself)[0]){
            $(deleteItself).stop();
            $(deleteItself).remove();
        }
        var divFormError = document.createElement('div');
        var formErrorContent = document.createElement('div');
        linkTofield = $.validationEngine.linkTofield(caller)
        $(divFormError).addClass("formError")
        
        if(type == "pass"){ $(divFormError).addClass("greenPopup") }
        if(type == "load"){ $(divFormError).addClass("blackPopup") }
        if(ajaxed){ $(divFormError).addClass("ajaxed") }
        
        $(divFormError).addClass(linkTofield);
        $(formErrorContent).addClass("formErrorContent");
        
        $("body").append(divFormError);
        $(divFormError).append(formErrorContent);
            
        if($.validationEngine.showTriangle != false){       // NO TRIANGLE ON MAX CHECKBOX AND RADIO
            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)
    
        callerTopPosition = $(caller).offset().top;
        callerleftPosition = $(caller).offset().left;
        callerWidth =  $(caller).width();
        inputHeight = $(divFormError).height();
    
        /* POSITIONNING */
        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;
        }
        $(divFormError).css({
            top:callerTopPosition,
            left:callerleftPosition,
            opacity:0
        })
        return $(divFormError).animate({"opacity":0.87},function(){return true;});  
    },
    updatePromptText : function(caller,promptText,type,ajaxed) {    // UPDATE TEXT ERROR IF AN ERROR IS ALREADY DISPLAYED
        
        linkTofield = $.validationEngine.linkTofield(caller);
        var updateThisPrompt =  "."+linkTofield;
        
        if(type == "pass") { $(updateThisPrompt).addClass("greenPopup") }else{ $(updateThisPrompt).removeClass("greenPopup")};
        if(type == "load") { $(updateThisPrompt).addClass("blackPopup") }else{ $(updateThisPrompt).removeClass("blackPopup")};
        if(ajaxed) { $(updateThisPrompt).addClass("ajaxed") }else{ $(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;
        }
        $(updateThisPrompt).animate({ top:callerTopPosition });
    },
    linkTofield : function(caller){
        linkTofield = $(caller).attr("id") + "formError";
        linkTofield = linkTofield.replace(/\[/g,""); 
        linkTofield = linkTofield.replace(/\]/g,"");
        return linkTofield;
    },
    closePrompt : function(caller,outside) {                        // CLOSE PROMPT WHEN ERROR CORRECTED
        if(!$.validationEngine.settings){
            $.validationEngine.defaultSetting()
        }
        if(outside){
            $(caller).fadeTo("fast",0,function(){
                $(caller).remove();
            });
            return false;
        }
        if(typeof(ajaxValidate)=='undefined'){ajaxValidate = false}
        if(!ajaxValidate){
            linkTofield = $.validationEngine.linkTofield(caller);
            closingPrompt = "."+linkTofield;
            $(closingPrompt).fadeTo("fast",0,function(){
                $(closingPrompt).remove();
            });
        }
    },
    debug : function(error) {
        if(!$("#debugMode")[0]){
            $("body").append("<div id='debugMode'><div class='debugError'><strong>This is a debug mode, you got a problem with your form, it will try to help you, refresh when you think you nailed down the problem</strong></div></div>");
        }
        $(".debugError").append("<div class='debugerror'>"+error+"</div>");
    },          
    submitValidation : function(caller) {                   // FORM SUBMIT VALIDATION LOOPING INLINE VALIDATION
        var stopForm = false;
        $.validationEngine.ajaxValid = true;
        $(caller).find(".formError").remove();
        var toValidateSize = $(caller).find("[class*=validate]").size();
        
        $(caller).find("[class*=validate]").each(function(){
            linkTofield = $.validationEngine.linkTofield(this);
            
            if(!$("."+linkTofield).hasClass("ajaxed")){ // DO NOT UPDATE ALREADY AJAXED FIELDS (only happen if no normal errors, don't worry)
                var validationPass = $.validationEngine.loadValidation(this);
                return(validationPass) ? stopForm = true : "";                  
            };
        });
        ajaxErrorLength = $.validationEngine.ajaxValidArray.length;     // LOOK IF SOME AJAX IS NOT VALIDATE
        for(x=0;x<ajaxErrorLength;x++){
            if($.validationEngine.ajaxValidArray[x][1] == false){
                $.validationEngine.ajaxValid = false;
            }
        }
        if(stopForm || !$.validationEngine.ajaxValid){      // GET IF THERE IS AN ERROR OR NOT FROM THIS VALIDATION FUNCTIONS
            if($.validationEngine.settings.scroll){
                destination = $(".formError:not('.greenPopup'):first").offset().top;
                $(".formError:not('.greenPopup')").each(function(){
                    testDestination = $(this).offset().top;
                    if(destination>testDestination){
                        destination = $(this).offset().top;
                    }
                })
                $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination}, 1100);
            }
            return true;
        }else{
            return false;
        }
    }
}
})(jQuery);

var badObjects = ["select", "object", "embed"];
function showBadObjects(){
    var els;
    var tags = badObjects;
    for (var i = 0; i < tags.length; i++) {
        els = document.getElementsByTagName(tags[i]);
        for (var j = 0; j < els.length; j++) {
            $(els[j]).css({
                visibility: "visible"
            });
        }
    }
}
function hideBadObjects(){
    var tags = badObjects;
    for (var i = 0; i < tags.length; i++) {
        $(tags[i]).css({
            visibility: "hidden"
        });
    }
}

function getPageScroll(){
    var x, y;
    if (self.pageYOffset) {
        x = self.pageXOffset;
        y = self.pageYOffset;
    }
    else 
        if (document.documentElement && document.documentElement.scrollTop) {
            x = document.documentElement.scrollLeft;
            y = document.documentElement.scrollTop;
        }
        else 
            if (document.body) {
                x = document.body.scrollLeft;
                y = document.body.scrollTop;
            }
    return {
        x: x,
        y: y
    };
}
function getPageSize(){
    var windowX, windowY;
    if (self.innerHeight) {
        windowX = self.innerWidth;
        windowY = self.innerHeight;
    }
    else 
        if (document.documentElement && document.documentElement.clientHeight) {
            windowX = document.documentElement.clientWidth;
            windowY = document.documentElement.clientHeight;
        }
        else 
            if (document.body) {
                windowX = document.body.clientWidth;
                windowY = document.body.clientHeight;
            }
    return {
        winWidth: windowX,
        winHeight: windowY
    };
}
function docWH(){
    var b = document.body, e = document.documentElement, w = 0, h = 0;
    if (e) {
        w = Math.max(w, e.scrollWidth, e.offsetWidth);
        h = Math.max(h, e.scrollHeight, e.offsetHeight);
    }
    if (b) {
        w = Math.max(w, b.scrollWidth, b.offsetWidth);
        h = Math.max(h, b.scrollHeight, b.offsetHeight);
        if (window.innerWidth) {
            w = Math.max(w, window.innerWidth);
            h = Math.max(h, window.innerHeight);
        }
    }
    return [w, h];
}

(function($){
    $.fn.visualTopLayerGallery = function(options){
        var activeImage = null, groupName = null, imageArray = [], slideShowTimer = null, startImage = null, descriptionHeight = 50, imgPreloader = {}, showTimer;
        if (!document.getElementsByTagName) {
            return;
        }
        options = $.extend({
            animate: true,
            autoPlay: true,
            borderSize: 39,
            containerID: document,
            enableSlideshow: true,
            googleAnalytics: false,
            imageDataLocation: "south",
            closeLocation: "",
            initImage: "",
            loop: true,
            overlayDuration: 0.2,
            overlayOpacity: 0.7,
            prefix: "",
            classNames: "vgallery",
            resizeSpeed: 7,
            showGroupName: false,
            slideTime: 4,
            strings: {
                closeLink: "",
                loadingMsg: "loading",
                nextLink: "",
                prevLink: "",
                startSlideshow: "",
                stopSlideshow: "",
                numDisplayPrefix: "",
                numDisplaySeparator: "/"
            },
            featBrowser: true,
            breathingSize: 20,
            startZoom: false,
            floating: true
        }, options);
        if (options.animate) {
            var overlayDuration = Math.max(options.overlayDuration, 0);
            options.resizeSpeed = Math.max(Math.min(options.resizeSpeed, 10), 1);
            var resizeDuration = (11 - options.resizeSpeed) * 0.15;
        }
        else {
            var overlayDuration = 0;
            var resizeDuration = 0;
        }
        var enableSlideshow = options.enableSlideshow;
        options.overlayOpacity = Math.max(Math.min(options.overlayOpacity, 1), 0);
        var playSlides = options.autoPlay;
        var container = $(options.containerID);
        var classNames = options.classNames;
        updateImageList();
        var objBody = container.length && container.get(0) != document ? container.get(0) : document.getElementsByTagName("body").item(0);
        if (objBody.childNodes.length) {
            $(objBody.childNodes[0]).before($("<div></div>"));
            objBody = objBody.childNodes[0];
        }
        var objOverlay = document.createElement("div");
        objOverlay.setAttribute("id", getID("overlay"));
        objOverlay.style.display = "none";
        objBody.appendChild(objOverlay);
        $(objOverlay).click(end);
        var objGallery = document.createElement("div");
        objGallery.setAttribute("id", getID("gallery"));
        objGallery.style.display = "none";
        objBody.appendChild(objGallery);
        $(objGallery).click(end);
        var objImageDataContainer = document.createElement("div");
        objImageDataContainer.setAttribute("id", getID("imageDataContainer"));
        objImageDataContainer.className = getID("clearfix");
        var objImageData = document.createElement("div");
        objImageData.setAttribute("id", getID("imageData"));
        objImageDataContainer.appendChild(objImageData);
        var objImageDetails = document.createElement("div");
        objImageDetails.setAttribute("id", getID("imageDetails"));
        objImageData.appendChild(objImageDetails);
        var objCaption = document.createElement("div");
        objCaption.setAttribute("id", getID("caption"));
        objImageDetails.appendChild(objCaption);
        var objNumberDisplay = document.createElement("span");
        objNumberDisplay.setAttribute("id", getID("numberDisplay"));
        objImageDetails.appendChild(objNumberDisplay);
        var objDetailsNav = document.createElement("span");
        objDetailsNav.setAttribute("id", getID("detailsNav"));
        objImageDetails.appendChild(objDetailsNav);
        var objPrevLink = document.createElement("a");
        objPrevLink.setAttribute("id", getID("prevLinkDetails"));
        objPrevLink.setAttribute("href", "javascript:void(0);");
        objPrevLink.innerHTML = options.strings.prevLink;
        objDetailsNav.appendChild(objPrevLink);
        $(objPrevLink).click(showPrev);
        var objSlideShowControl = document.createElement("a");
        objSlideShowControl.setAttribute("id", getID("slideShowControl"));
        objSlideShowControl.setAttribute("href", "javascript:void(0);");
        objDetailsNav.appendChild(objSlideShowControl);
        $(objSlideShowControl).click(toggleSlideShow);
        var objNextLink = document.createElement("a");
        objNextLink.setAttribute("id", getID("nextLinkDetails"));
        objNextLink.setAttribute("href", "javascript:void(0);");
        objNextLink.innerHTML = options.strings.nextLink;
        objDetailsNav.appendChild(objNextLink);
        $(objNextLink).click(showNext);
        var objOuterImageContainer = document.createElement("table");
        objOuterImageContainer.setAttribute("id", getID("outerImageContainer"));
        objOuterImageContainer.cellSpacing = 0;
        objGallery.appendChild(objOuterImageContainer);
        var objOICTop = objOuterImageContainer.insertRow(-1);
        var objOICTL = objOICTop.insertCell(-1);
        objOICTL.className = "tl";
        var objOICTC = objOICTop.insertCell(-1);
        objOICTC.className = "tc";
        var objOICTR = objOICTop.insertCell(-1);
        objOICTR.className = "tr";
        var objOICMiddle = objOuterImageContainer.insertRow(-1);
        var objOICML = objOICMiddle.insertCell(-1);
        objOICML.className = "ml";
        var objGalleryFrameBody = objOICMiddle.insertCell(-1);
        objGalleryFrameBody.setAttribute("id", getID("galleryFrameBody"));
        objGalleryFrameBody.innerHTML = "&nbsp;";
        var objOICMR = objOICMiddle.insertCell(-1);
        objOICMR.className = "mr";
        var objOICBottom = objOuterImageContainer.insertRow(-1);
        var objOICBL = objOICBottom.insertCell(-1);
        objOICBL.className = "bl";
        var objOICBC = objOICBottom.insertCell(-1);
        objOICBC.className = "bc";
        var objOICBR = objOICBottom.insertCell(-1);
        objOICBR.className = "br";
        if (options.imageDataLocation == "north") {
            objGalleryFrameBody.appendChild(objImageDataContainer);
        }
        var objImageContainer = document.createElement("div");
        objImageContainer.setAttribute("id", getID("imageContainer"));
        objGalleryFrameBody.appendChild(objImageContainer);
        var objGalleryImage = document.createElement("img");
        objGalleryImage.setAttribute("id", getID("galleryImage"));
        objImageContainer.appendChild(objGalleryImage);
        var objHoverNav = document.createElement("div");
        objHoverNav.setAttribute("id", getID("hoverNav"));
        objImageContainer.appendChild(objHoverNav);
        var objPrevLinkImg = document.createElement("a");
        objPrevLinkImg.setAttribute("id", getID("prevLinkImg"));
        objPrevLinkImg.setAttribute("href", "javascript:void(0);");
        objHoverNav.appendChild(objPrevLinkImg);
        $(objPrevLinkImg).click(showPrev);
        var objNextLinkImg = document.createElement("a");
        objNextLinkImg.setAttribute("id", getID("nextLinkImg"));
        objNextLinkImg.setAttribute("href", "javascript:void(0);");
        objHoverNav.appendChild(objNextLinkImg);
        $(objNextLinkImg).click(showNext);
        var objLoading = document.createElement("div");
        objLoading.setAttribute("id", getID("loading"));
        objImageContainer.appendChild(objLoading);
        var objLoadingLink = document.createElement("a");
        objLoadingLink.setAttribute("id", getID("loadingLink"));
        objLoadingLink.setAttribute("href", "javascript:void(0);");
        objLoadingLink.innerHTML = options.strings.loadingMsg;
        objLoading.appendChild(objLoadingLink);
        $(objLoadingLink).click(end);
        if (options.imageDataLocation != "north") {
            objGalleryFrameBody.appendChild(objImageDataContainer);
        }
        var objClose = document.createElement("div");
        objClose.setAttribute("id", getID("close"));
        if (options.closeLocation == "top") {
            objOICTR.appendChild(objClose);
        }
        else {
            objImageData.appendChild(objClose);
        }
        var objCloseLink = document.createElement("a");
        objCloseLink.setAttribute("id", getID("closeLink"));
        objCloseLink.setAttribute("href", "javascript:void(0);");
        objCloseLink.innerHTML = options.strings.closeLink;
        objClose.appendChild(objCloseLink);
        $(objCloseLink).click(end);
        if (options.initImage != "") {
            start("#" + options.initImage);
        }
        function getHref(Node){
            Node = $(Node);
            if (Node.attr("tagName") != "A") {
                Node = $("A:first", Node);
            }
            return $(Node).attr("href");
        }
        function getTitle(Node){
            Node = $(Node);
            if (Node.attr("tagName") == "A") {
                return Node.attr("title");
            }
            return $(">*:last", Node).html();
        }
        function updateImageList(){
            $("." + classNames.replace(/^\,/, ".$&"), container).each(function(){
                if (getHref(this)) {
                    this.onclick = function(){
                        start(this);
                        return false;
                    };
                }
            });
        }
        var start = this.start = function(imageLink){
            hideBadObjects();
            imageLink = $(imageLink);
            $$("overlay").css({
                height: docWH()[1] + "px"
            });
            $$("imageDataContainer").hide();
            $$("galleryImage").hide().attr({
                src: ""
            });
            if (options.startZoom) {
                $$("imageContainer").css({
                    width: imageLink.width() + "px",
                    height: imageLink.height() + "px"
                });
                if (!document.all) {
                    $$("outerImageContainer").css({
                        opacity: 0.1
                    });
                }
                $$("gallery").css({
                    left: imageLink.offset().left - options.borderSize + "px",
                    top: imageLink.offset().top - options.borderSize + "px",
                    width: imageLink.width() + options.borderSize * 2 + "px",
                    height: "auto"
                });
            }
            else {
                $$("overlay").css({
                    opacity: 0
                }).show().fadeTo(overlayDuration * 1000, options.overlayOpacity);
                $$("gallery").css({
                    left: 0,
                    width: "100%"
                });
            }
            $$("gallery").show();
            imageArray = [];
            groupName = null;
            startImage = 0;
            $("." + imageLink.attr("className"), container).each(function(){
                if (getHref(this)) {
                    imageArray.push({
                        link: getHref(this),
                        title: getTitle(this)
                    });
                    if (this == imageLink.get(0)) {
                        startImage = imageArray.length - 1;
                    }
                }
            });
            if (imageArray.length > 1) {
                groupName = imageLink.attr("className");
            }
            if (options.featBrowser) {
                $(window).resize(adjustImageSizeNoEffect);
            }
            if (options.floating) {
                $(window).scroll(adjustImageSizeNoEffect);
            }
            $(window).resize(adjustOverlay);
            $(window).scroll(adjustOverlay);
            changeImage(startImage);
        };
        function changeImage(imageNum){
            activeImage = imageNum;
            disableKeyboardNav();
            pauseSlideShow();
            showLoading();
            if (!options.startZoom) {
                $$("galleryImage").hide();
            }
            $$("hoverNav").hide();
            $$("imageDataContainer").hide();
            $$("numberDisplay").hide();
            $$("detailsNav").hide();
            imgPreloader = new Image;
            imgPreloader.onload = function(){
                imageArray[activeImage].link = imgPreloader.src;
                imageArray[activeImage].width = imgPreloader.width;
                imageArray[activeImage].height = imgPreloader.height;
                adjustImageSize(false);
            };
            if (options.startZoom && !$$("galleryImage").attr("src")) {
                imageArray[activeImage].width = 320;
                imageArray[activeImage].height = 240;
                adjustImageSize(false, true);
            }
            imgPreloader.src = imageArray[activeImage].link;
            if (options.googleAnalytics) {
                urchinTracker(imageArray[activeImage].link);
            }
        }
        function adjustImageSize(recall, noImage){
            var imgWidth = imageArray[activeImage].width;
            var imgHeight = imageArray[activeImage].height;
            var arrayPageSize = getPageSize();
            var imageProportion = imgWidth / imgHeight;
            if (options.featBrowser) {
                var winProportion = arrayPageSize.winWidth / arrayPageSize.winHeight;
                if (imageProportion > winProportion) {
                    var maxWidth = arrayPageSize.winWidth - options.borderSize * 2 - options.breathingSize * 2;
                    var maxHeight = Math.round(maxWidth / imageProportion);
                }
                else {
                    var maxHeight = arrayPageSize.winHeight - options.borderSize * 2 - options.breathingSize * 2 - descriptionHeight;
                    var maxWidth = Math.round(maxHeight * imageProportion);
                }
                if (imgWidth > maxWidth || imgHeight > maxHeight) {
                    imgWidth = maxWidth;
                    imgHeight = maxHeight;
                }
            }
            var imgTop = getPageScroll().y + (getPageSize().winHeight - (imgHeight + descriptionHeight + options.borderSize * 2)) / 2;
            var imageContainer = $$("imageContainer");
            if (recall == true) {
                imageContainer.css({
                    height: imgHeight + "px",
                    width: imgWidth + "px"
                });
                if (options.floating) {
                    moveEffect($$("gallery"), imgTop);
                }
                else {
                    $$("gallery").css({
                        top: imgTop + "px"
                    });
                }
            }
            else {
                var galleryImage = $$("galleryImage");
                imageContainer.stop(true, false);
                galleryImage.stop(true, false);
                var galleryImage2;
                if (options.startZoom && galleryImage.attr("src")) {
                    galleryImage2 = galleryImage;
                    galleryImage2.attr({
                        id: getID("galleryImage2")
                    });
                }
                else {
                    galleryImage.remove();
                }
                if (!noImage) {
                    galleryImage = $(imgPreloader);
                    galleryImage.hide();
                    galleryImage.attr({
                        id: getID("galleryImage")
                    });
                    imageContainer.append(galleryImage);
                }
                with (imageContainer) {
                    var resizeFactor = imageProportion / (width() / height());
                }
                if (!noImage) {
                    if (options.startZoom) {
                        if (galleryImage2) {
                            $$("galleryImage2").stop(true, true);
                        }
                        var zoomF = galleryImage2 ? 120 : 100;
                        if (galleryImage2) {
                            with (galleryImage2) {
                                css({
                                    width: 1 > resizeFactor ? "auto" : width() / parent().width() * 100 + "%",
                                    height: 1 > resizeFactor ? height() / parent().height() * 100 + "%" : "auto",
                                    left: 0,
                                    top: 0
                                });
                            }
                        }
                        galleryImage.css({
                            opacity: 0,
                            display: "block",
                            position: "absolute",
                            width: 1 > resizeFactor ? zoomF + "%" : "auto",
                            height: 1 > resizeFactor ? "auto" : zoomF + "%",
                            left: (100 - zoomF * (1 > resizeFactor ? 1 : resizeFactor)) / 2 + "%",
                            top: (100 - zoomF * (1 > resizeFactor ? 1 / resizeFactor : 1)) / 2 + "%"
                        });
                    }
                    if (options.startZoom) {
                        hideLoading();
                    }
                }
                resizeImageContainer(imgTop, imgWidth, imgHeight, resizeFactor, noImage);
            }
            $$("imageDataContainer").css({
                width: imgWidth + "px"
            });
        }
        function resizeImageContainer(imgTop, imgWidth, imgHeight, resizeFactor, noImage){
            var imageContainer = $$("imageContainer");
            var galleryImage = $$("galleryImage");
            var gallery = $$("gallery");
            if (!noImage) {
                var galleryImage2 = $$("galleryImage2");
            }
            if (options.startZoom) {
                galleryImage.fadeTo(resizeDuration * 1000, 1);
                if (!document.all) {
                    $$("outerImageContainer").fadeTo(resizeDuration * 1000, 1);
                }
            }
            moveEffect(gallery, imgTop);
            if (options.startZoom && !noImage) {
                galleryImage2.animate($.extend({
                    opacity: 0
                }, resizeFactor < 1 ? {
                    height: "120%",
                    top: "-10%",
                    left: (100 - 120 / resizeFactor) / 2 + "%"
                } : {
                    width: "120%",
                    left: "-10%",
                    top: (100 - resizeFactor * 120) / 2 + "%"
                }), {
                    queue: false,
                    duration: resizeDuration * 1000,
                    complete: function(){
                        $(this).remove();
                    }
                });
                galleryImage.animate($.extend({
                    left: 0,
                    top: 0
                }, resizeFactor < 1 ? {
                    width: "100%"
                } : {
                    height: "100%"
                }), {
                    queue: false,
                    duration: resizeDuration * 1000
                });
            }
            imageContainer.animate({
                width: imgWidth + "px",
                height: imgHeight + "px"
            }, {
                queue: false,
                duration: resizeDuration * 1000,
                complete: !noImage ? function(){
                    showImage();
                }
 : null
            });
        }
        function moveEffect(gallery, imgTop){
            gallery.stop(true, false);
            gallery.animate({
                width: "100%",
                left: 0,
                top: imgTop
            }, {
                queue: false,
                duration: resizeDuration * 1000
            });
        }
        function showLoading(){
            clearTimeout(showTimer);
            var loading = $$("loading");
            loading.show();
            loading.css({
                visibility: "hidden"
            });
            showTimer = setTimeout(function(){
                $$("loading").css({
                    visibility: "visible"
                });
            }, 300);
        }
        function hideLoading(){
            clearTimeout(showTimer);
            $$("loading").hide();
        }
        function showImage(){
            hideLoading();
            if (options.startZoom) {
                $$("overlay:hidden").css({
                    opacity: 0
                }).show().fadeTo(overlayDuration * 1000, options.overlayOpacity);
                updateDetails();
            }
            else {
                $$("galleryImage").css({
                    opacity: 0
                }).show().fadeTo(500, 1, function(){
                    updateDetails();
                });
            }
            preloadNeighborImages();
        }
        function updateDetails(){
            $$("caption").show();
            $$("caption").html(imageArray[activeImage].title || "");
            if (imageArray.length > 1) {
                var num_display = options.strings.numDisplayPrefix + " " + eval(activeImage + 1) + " " + options.strings.numDisplaySeparator + " " + imageArray.length;
                if (options.showGroupName && groupName) {
                    num_display += " " + options.strings.numDisplaySeparator + " " + groupName;
                }
                $$("numberDisplay").text(num_display).show();
                if (!enableSlideshow) {
                    $$("slideShowControl").hide();
                }
                $$("detailsNav").show();
            }
            $$("imageDataContainer").animate({
                height: "show",
                opacity: "show"
            }, 650, null, function(){
                updateNav();
            });
        }
        function updateNav(){
            var d = 1 / imageArray.length;
            descriptionHeight = descriptionHeight * (1 - d) + $$("imageDataContainer").height() * d;
            if (imageArray.length > 1) {
                $$("hoverNav").show();
                if (enableSlideshow) {
                    if (playSlides) {
                        startSlideShow();
                    }
                    else {
                        stopSlideShow();
                    }
                }
            }
            enableKeyboardNav();
        }
        function startSlideShow(){
            if ($$("gallery:hidden").length) {
                return;
            }
            pauseSlideShow();
            playSlides = true;
            slideShowTimer = setTimeout(function(){
                showNext();
            }, options.slideTime * 1000);
            $$("slideShowControl").text(options.strings.stopSlideshow);
            $$("slideShowControl").addClass("started");
        }
        function stopSlideShow(){
            playSlides = false;
            pauseSlideShow();
            $$("slideShowControl").text(options.strings.startSlideshow);
            $$("slideShowControl").removeClass("started");
        }
        function toggleSlideShow(){
            if (playSlides) {
                stopSlideShow();
            }
            else {
                startSlideShow();
            }
        }
        function pauseSlideShow(){
            if (slideShowTimer) {
                slideShowTimer = clearTimeout(slideShowTimer);
            }
        }
        function showNext(){
            if (imageArray.length > 1) {
                pauseSlideShow();
                if (!options.loop && (activeImage == imageArray.length - 1 && startImage == 0 || activeImage + 1 == startImage)) {
                    end();
                    return;
                }
                if (activeImage == imageArray.length - 1) {
                    changeImageWithData(0);
                }
                else {
                    changeImageWithData(activeImage + 1);
                }
            }
        }
        function changeImageWithData(imageNum){
            $$("imageDataContainer").animate({
                height: "hide",
                opacity: "hide"
            }, 650, null, function(){
                changeImage(imageNum);
            });
        }
        function showPrev(){
            if (imageArray.length > 1) {
                if (activeImage == 0) {
                    changeImageWithData(imageArray.length - 1);
                }
                else {
                    changeImageWithData(activeImage - 1);
                }
            }
        }
        function showFirst(){
            if (imageArray.length > 1) {
                changeImageWithData(0);
            }
        }
        function showLast(){
            if (imageArray.length > 1) {
                changeImageWithData(imageArray.length - 1);
            }
        }
        function enableKeyboardNav(){
            document.onkeydown = keyboardAction;
        }
        function disableKeyboardNav(){
            document.onkeydown = "";
        }
        function keyboardAction(e){
            if (e == null) {
                keycode = event.keyCode;
            }
            else {
                keycode = e.which;
            }
            key = String.fromCharCode(keycode).toLowerCase();
            if (key == "x" || key == "o" || key == "c") {
                end();
            }
            else 
                if (key == "p" || key == "%") {
                    showPrev();
                }
                else 
                    if (key == "n" || key == "'") {
                        showNext();
                    }
                    else 
                        if (key == "f") {
                            showFirst();
                        }
                        else 
                            if (key == "l") {
                                showLast();
                            }
                            else 
                                if (key == "s") {
                                    if (imageArray.length > 0 && options.enableSlideshow) {
                                        toggleSlideShow();
                                    }
                                }
        }
        function preloadNeighborImages(){
            var nextImageID = imageArray.length - 1 == activeImage ? 0 : activeImage + 1;
            (new Image).src = imageArray[nextImageID].link;
            var prevImageID = activeImage == 0 ? imageArray.length - 1 : activeImage - 1;
            (new Image).src = imageArray[prevImageID].link;
        }
        function end(Event){
            if (Event) {
                var id = $(Event.target).attr("id");
                if (getID("closeLink") != id && getID("gallery") != id && getID("overlay") != id) {
                    return;
                }
            }
            $$("imageContainer").stop(true, false);
            $$("galleryImage").stop(true, false);
            imgPreloader.onload = null;
            disableKeyboardNav();
            pauseSlideShow();
            $$("gallery").hide();
            if (options.overlayOpacity) {
                $$("overlay").fadeOut(overlayDuration * 1000);
            }
            else {
                $$("overlay").hide();
            }
            $(window).unbind("resize", adjustImageSizeNoEffect);
            $(window).unbind("scroll", adjustImageSizeNoEffect);
            $(window).unbind("resize", adjustOverlay);
            $(window).unbind("scroll", adjustOverlay);
            showBadObjects();
        }
        function adjustImageSizeNoEffect(){
            adjustImageSize(true);
        }
        function adjustOverlay(){
            $$("overlay").css({
                left: getPageScroll().x + "px",
                top: 0,
                width: "100%",
                height: docWH()[1] + "px"
            });
        }
        function getID(id){
            return options.prefix + id;
        }
        function $$(name){
            return $("#" + getID(name));
        }
        return this;
    };
})(jQuery);

(function($){
    $.fn.visualTopLayerSelector = function(options){
        if (!document.getElementsByTagName) {
            return;
        };
        options = $.extend({
            animate: true,
            containerID: document,
            overlayDuration: 0.2,
            overlayOpacity: 0.7,
            prefix: ""
        }, options);
        if (options.animate) {
            var overlayDuration = Math.max(options.overlayDuration, 0);
        } else {
            var overlayDuration = 0;
        }
        options.overlayOpacity = Math.max(Math.min(options.overlayOpacity, 1), 0);
        var container = $(options.containerID);
        var classNames = options.classNames;
        var objBody = container.length && container.get(0) != document ? container.get(0) : document.getElementsByTagName("body").item(0);
        if (objBody.childNodes.length) {
            $(objBody.childNodes[0]).before($("<div></div>"));
            objBody = objBody.childNodes[0];
        }
        var objOverlay = document.createElement("div");
        objOverlay.setAttribute("id", getID("overlay"));
        objOverlay.style.display = "none";
        objBody.appendChild(objOverlay);
        $(objOverlay).click(function(){
			$(".search-form select[name=subregion] option:first").attr("selected", "selected");
			end();
		});
        $('<div class="selector-for-search-form"><div id="id_subregion-selector" class="selector subregion loading"><div><button class="close">Отменить</button><button class="select">Выбрать</button></div></div></div>').appendTo(objBody);
        var start = this.start = function(){
            hideBadObjects();
            $$("overlay").css({
                height: docWH()[1] + "px"
            });
            $$("overlay").css({
                opacity: 0
            }).show().fadeTo(overlayDuration * 1000, options.overlayOpacity);
            $('.selector-for-search-form').show();
            $(window).resize(adjustOverlay);
            $(window).scroll(adjustOverlay);
            $(".selector-for-search-form .close").click(function(){
                $(".search-form select[name=subregion] option:first").attr("selected", "selected");
                end();
            });
            $(".selector-for-search-form .select").click(function(){
                var add = $(".selector-for-search-form input:checked").size() ? $(".selector-for-search-form input:checked").val() : 0;
                if ( add ) {
                    var currentRegions = [];
                    $(".search-form select[name=subregion] option").each(function(){
                        if (this.value) {
                            currentRegions.push(this.value);
                        };
                    });
                    if (jQuery.inArray(add, currentRegions) + 1) {
                        $(".search-form select[name=subregion] option[value="+ add +"]").attr("selected", "selected");
                    } else {
                        $('<option value="' + add + '">' + $(".selector-for-search-form input:checked").parent("label").text() + '</option>').insertBefore("select[name=subregion] option[value=add-subregion]").attr("selected", "selected");
                    };
                } else {
                    $(".search-form select[name=subregion] option:first").attr("selected", "selected");
                };
                end();
            });
        };
        $(".search-form select[name=subregion]").unbind();
        $(".search-form select[name=subregion]").change(function() {
            if (this.value == "add-subregion") {
                start();
            };
        }).change();
        function end(){
            $(".selector-for-search-form").hide();
            if (options.overlayOpacity) {
                $$("overlay").fadeOut(overlayDuration * 1000);
            }
            else {
                $$("overlay").hide();
            }
            $(window).unbind("resize", adjustOverlay);
            $(window).unbind("scroll", adjustOverlay);
            showBadObjects();
        }
        function adjustOverlay(){
            $$("overlay").css({
                left: getPageScroll().x + "px",
                top: 0,
                width: "100%",
                height: docWH()[1] + "px"
            });
        }

        function getID(id){
            return options.prefix + id;
        }
        function $$(name){
            return $("#" + getID(name));
        }
        return this;
    };
})(jQuery);

jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') {
        options = options || {};
        if (value === null) {
            value = '';
            options = $.extend({}, options);
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString();
        }
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};


(function($) {

    $.fn.lazyload = function(options) {
        var settings = {
            threshold    : 0,
            failurelimit : 0,
            event        : "scroll",
            effect       : "show",
            container    : window
        };
                
        if(options) {
            $.extend(settings, options);
        }

        /* Fire one scroll event per scroll. Not one scroll event per image. */
        var elements = this;
        if ("scroll" == settings.event) {
            $(settings.container).bind("scroll", function(event) {
                
                var counter = 0;
                elements.each(function() {
                    if ($.abovethetop(this, settings) ||
                        $.leftofbegin(this, settings)) {
                            /* Nothing. */
                    } else if (!$.belowthefold(this, settings) &&
                        !$.rightoffold(this, settings)) {
                            $(this).trigger("appear");
                    } else {
                        if (counter++ > settings.failurelimit) {
                            return false;
                        }
                    }
                });
                /* Remove image from array so it is not looped next time. */
                var temp = $.grep(elements, function(element) {
                    return !element.loaded;
                });
                elements = $(temp);
            });
        }
        
        this.each(function() {
            var self = this;
            
            /* Save original only if it is not defined in HTML. */
            if (undefined == $(self).attr("original")) {
                $(self).attr("original", $(self).attr("src"));     
            }

            if ("scroll" != settings.event || 
                    undefined == $(self).attr("src") || 
                    settings.placeholder == $(self).attr("src") || 
                    ($.abovethetop(self, settings) ||
                     $.leftofbegin(self, settings) || 
                     $.belowthefold(self, settings) || 
                     $.rightoffold(self, settings) )) {
                        
                if (settings.placeholder) {
                    $(self).attr("src", settings.placeholder);      
                } else {
                    $(self).removeAttr("src");
                }
                self.loaded = false;
            } else {
                self.loaded = true;
            }
            
            /* When appear is triggered load original image. */
            $(self).one("appear", function() {
                if (!this.loaded) {
                    $("<img />")
                        .bind("load", function() {
                            $(self)
                                .hide()
                                .attr("src", $(self).attr("original"))
                                [settings.effect](settings.effectspeed);
                            self.loaded = true;
                        })
                        .attr("src", $(self).attr("original"));
                };
            });

            /* When wanted event is triggered load original image */
            /* by triggering appear.                              */
            if ("scroll" != settings.event) {
                $(self).bind(settings.event, function(event) {
                    if (!self.loaded) {
                        $(self).trigger("appear");
                    }
                });
            }
        });
        
        /* Force initial check if images should appear. */
        $(settings.container).trigger(settings.event);
        
        return this;

    };

    /* Convenience methods in jQuery namespace.           */
    /* Use as  $.belowthefold(element, {threshold : 100, container : window}) */

    $.belowthefold = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).height() + $(window).scrollTop();
        } else {
            var fold = $(settings.container).offset().top + $(settings.container).height();
        }
        return fold <= $(element).offset().top - settings.threshold;
    };
    
    $.rightoffold = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).width() + $(window).scrollLeft();
        } else {
            var fold = $(settings.container).offset().left + $(settings.container).width();
        }
        return fold <= $(element).offset().left - settings.threshold;
    };
        
    $.abovethetop = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).scrollTop();
        } else {
            var fold = $(settings.container).offset().top;
        }
        return fold >= $(element).offset().top + settings.threshold  + $(element).height();
    };
    
    $.leftofbegin = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).scrollLeft();
        } else {
            var fold = $(settings.container).offset().left;
        }
        return fold >= $(element).offset().left + settings.threshold + $(element).width();
    };
    /* Custom selectors for your convenience.   */
    /* Use as $("img:below-the-fold").something() */

    $.extend($.expr[':'], {
        "below-the-fold" : "$.belowthefold(a, {threshold : 0, container: window})",
        "above-the-fold" : "!$.belowthefold(a, {threshold : 0, container: window})",
        "right-of-fold"  : "$.rightoffold(a, {threshold : 0, container: window})",
        "left-of-fold"   : "!$.rightoffold(a, {threshold : 0, container: window})"
    });
    
})(jQuery);

/* Universal function for clone forms created for using with django-formsets.
Formset must be wrap in container with class named context-name of form, i.e. "image-form" */
cloneForm = function(form) {
  $("." + form + ":last").clone(true).insertAfter("." + form + ":last");
  var lastformnumber = $("#id_" + form + "-TOTAL_FORMS").val($("[class^=" + form + "]").length).val() - 1;
  $.each($("." + form + ":last").find("*"), function(){
    $.each(this.attributes, function(){
      this.value = this.value.replace( form + "-" + (lastformnumber-1),  form + "-" + lastformnumber )
    });
    if (this.tagName == "INPUT" || this.tagName == "TEXTAREA") {$(this).val('')}
  });
};

hasChildren = function(data, id) {
    var result = false;
    $.each(data, function() {
        if (this.parent == id) {
            result = true;
            return false;
        }
    });
    return result;
};

getChildren = function(data, id) {
    var result = {};
    $.each(data, function(){
        if (this.parent == id) {
            result[this.id] = this;
        }
    });
    return result;
};

getParents = function(data, id) {
    var result = [id];
    if (id) {$.merge(result, getParents(data, data[id]["parent"]))}
    return result;
};

/* get list of fields for selected in selector section by mapper */
getFieldsList = function(sections, mapper, id) {
    var map = {}, fields = [];
    $.each(getParents(sections, id).reverse(), function(i, fields){
        if (mapper[fields]){
            $.extend(true, map, mapper[fields]);
        };
    });
    $.each(map, function(field, params){
        if (params["visible"]) {
            fields.push(field);
        };
    });
    return fields;
};

/* show fields of extraforms for selected section */
showFields = function(d){
    $(".extraform p [class^=validate]").each(function(){
        $(this).data("class", $(this).attr("class")).removeAttr("class");
    });
    $(".extraform p").hide();
    $.each(getFieldsList(d.data, d.mapper, d.id), function(){
        $("#id_" + this).parent().show();
        $("#id_" + this).attr("class", $("#id_" + this).data("class"));
    });
};

/* draw path in selector and write names of selected cases in "show-<name>-selector" if it possible */ 
writeSelected = function (name, data) {
    var selected = [];
    $("#id_" + name + "-selector li").removeClass("checked");
    //$("#id_" + name + "-selector input:checked").parents("li").addClass("checked");
    if ($("#id_" + name + "-selector input:checked").size()) {
        $.each(getParents(data, $("#id_" + name + "-selector input:checked").val()), function(i, val){
            if (val){
                $("#id_" + name + "-selector #" + name + val ).parents("li").addClass("checked");
                selected.push(data[val]["name"]);
            };
        }); 
    };
    if (selected.length) {
        $("#show-"+ name + "-selector").html(function() {return selected.reverse().join(", ") + " <span>(изменить)</span>"});
        $("#remove-" + name).show();
    } else {
        $("#show-"+ name + "-selector").html(function() {return "<span>(выбрать)</span>";});
        $("#remove-" + name).hide();
    };
};

/* events handler */
eventHandler = function(){
    this.liclick = function(event) {
        var d = event.data;
        $(this).parent("ul").nextAll("ul").remove();
        writeSelected(d.name, d.data);
        if (d.name == "sections") {
            showFields(d);
        };
        if (d.name == "subregions") {
            $("#id_address").change();
            $(".manage [name=subregion]").val(d.id);
        };
        if (hasChildren(d.data, d.id)) {
            selector(d.name, d.data, d.id, d.selected, d.cssClass, d.mapper);
        } else if (d.name == "section") {
            $(this).parents(".selector").prev().val(d.id);
        };
    };
};

/* generate selector for specified parent */
selector = function(name, data, root, selected, cssClass, mapper) {
    var container = "#id_" + name + "-selector", checked = 0, htmlClass = ' class="' + cssClass + '"';
	$(container).removeClass("loading");
    $('<ul>').insertBefore(container + " div");
    $.each(getChildren (data, root), function(id, node) {
        id = parseInt(id);
        var event = new eventHandler;
        if (name.indexOf("subregion") + 1) {
            selected_for_click = [];
        } else {
            selected_for_click = selected;
        }
        $('<li title="' + node.name + '">').appendTo(container + " ul:last").bind("click", { name: name, data: data, id: id, selected: selected_for_click, mapper: mapper, cssClass: cssClass}, event["liclick"]);
        if ($.inArray(id, selected) + 1) {
            showFields({name: name, data: data, mapper: mapper, id: id});
            checked = node.checked = id;
        } else {
            node.checked = 0;
        }
        $(container + " ul:last li:last").html(function(){
            var str = '';
            if ((name.indexOf("subregion") + 1) || (name.indexOf("section") + 1 && !hasChildren(data, id))) {
                str = '<label for="' + name + id + '"><input id="' + name + id + '" value="' + id + '" type="radio" name="' + name + '"'+ htmlClass +'/>' + node.name + '</label>';
            } else {
                str = '<span id="' + name + id + '">' + node.name + '</span>';
            }
            return str;
        });
        $(container + " ul:last li:last input").parents("li").bind("dblclick", function(){
            $(container + " button.select").click();
        });
        if (node.checked) {
            $(container + " ul:last li:last input").attr("checked", "checked");
        }
    });
    if (checked && hasChildren(data, checked)) {
        selector (name, data, checked, selected, cssClass, mapper)
    }
    writeSelected(name, data);
};

isValidEmailAddress = function(emailAddress) {
    var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
    /*^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$*/
    return pattern.test(emailAddress);
};

classIdentForm = function(id) {
    this.status = "";
    this.id = id;
    this.check = function(status) {
        if (status != this.status) {
            this.status = status;
            if (status == "login") {
                $(".add form #id_submit").attr("disabled", "disabled");
            } else {
                $(".add form #id_submit").removeAttr("disabled");
            };
            if (status == "default") {
                $("#" + id + " #id_type").change(function(){
                    $("#" + id + " #id_value").attr("class", "validate[required,custom[cvr" + $("#" + id + " #id_type").val() + "]]");
                }).change();
            };
            if (this.status == "remove") {
                $("#" + id).slideUp("slow").remove;
            } else {
                $("#" + id).children(":not(." + this.status + ")").slideUp().find("input,select").each(function(){
                    $(this).data("class", $(this).attr("class")).removeAttr("class");
                });
                $("#" + id + " ." + this.status).slideDown().find("input,select").each(function() {
                    $(this).attr("class", $(this).data("class"));
                });
            };
        };
    };
};
        
messageAfter = function(el, message) {
    $(el + " + i").remove();
    if (message) {
        $("<i>" + message + "</i>").insertAfter(el);
    };
};

loadchoices = function(options) {
    var settings = {
        selector        : "",
        data            : {},
        defaultChoices  : {}
    };
    var selected;
    $.extend(settings, options);
    var selector = settings.selector;
    var sel = $(selector).val();
    $(selector).children().remove();
    $.each(settings.defaultChoices, function(i, val){
        $('<option value="' + i + '">' + val.name + '</option>').appendTo(selector);
    });
    $.each(settings.data, function(i, val){
        if (i == sel) {
            selected = ' selected="selected"';
        } else {
            selected = '';
        }
        $('<option value="' + i + '"' + selected + '>' + val.name + '</option>').appendTo(selector);
    });
    $(selector).data("json", settings.data).change();
};

/* generate advert title for cars */
setCarAdvertTitle = function(){
    var brand = $("#id_car_brand :selected").text();
    var serie = $("#id_car_serie :selected").text();
    //var model = $("#id_car_model :selected").text();
    var modification = $("#id_car_modification :selected").text();
    var engine_volume = ($("#id_engine_volume").val() / 1000).toFixed(1);
    var car_gearbox;
    if ($("#id_car_gearbox").val() == '') {
        car_gearbox = '';
    } else if ($("#id_car_gearbox").val() == 'm') {
        car_gearbox = 'MT';
    } else {
        car_gearbox = 'AT';
    }
    if (modification) {
        $("#id_title").val(modification);
    } else {
        $("#id_title").val(brand + ' ' + serie + ' ' + engine_volume + car_gearbox);
    }


};

$(document).ready(function() {

    var formLoginVisible = false;
    $("#show-form-login").add("#form-login button[type=reset]").click(function(){
        formLoginVisible = !formLoginVisible;
        $("#form-login-wrap").slideToggle("fast");
        $("#form-login #id_username").focus();
        if (formLoginVisible && $.browser.msie && $.browser.version.substr(0,1)<7) {
            hideBadObjects();
        } else if (!formLoginVisible && $.browser.msie && $.browser.version.substr(0,1)<7) {
            showBadObjects();
        };
        return false;
    });
    
    $("[class*=form-contacts] [id*=type]").change(function(){
		var required = ($(this).parents(".required").size()) ? "required," : "";
        $(this).siblings("[id*=value]").attr("class", "validate[" + required + "custom[cvr" + $(this).val() + "]]");
    }).change();

    $("#regform #id_email").bind("keyup change", function(){
        var email = $(this).val(), thisField = "#regform #id_email";
        if(email != 0) {
            if(isValidEmailAddress(email)) {
                $.ajax({
                    type: 'post',
                    dataType: 'json',
                    cache: false,
                    url: '/ajax/check_email/',
                    data: $(this).serialize(), /* send email string */
                    success: function(r) {
                        if (r == "ok") {
                            messageAfter(thisField, "пользователя с таким емайлом не зарегистрировано");
                        } else {
                            messageAfter(thisField, "пользователь с таким емайлом зарегистрирован");
                        }
                    }
                });
            } else {
                messageAfter(thisField, "введите правильный адрес своей электронной почты");
            }
        } else {
            messageAfter(thisField, "введите адрес своей электронной почты");
        }
    });
    if ($("#identForm").size()) {
        var identForm = new classIdentForm("identForm");
        identForm.check("default");
        messageAfter(".add #id_email", "введите адрес своей электронной почты");
        $(".add #id_email").bind("keyup change", function(){
            var email = $(this).val(), thisField = ".add #id_email";
            if(email != 0) {
                if(isValidEmailAddress(email)) {
                    $.ajax({
                        type: 'post',
                        dataType: 'json',
                        cache: false,
                        url: '/ajax/check_email/',
                        data: $(this).serialize(), /* send email string */
                        beforeSend: function(){
                            $("#id_submit").attr("disabled","disabled");
                        },
                        success: function(r) {
                            $("#id_submit").removeAttr("disabled");
                            if (r == "ok") {
                                messageAfter(thisField, "пользователя с таким емайлом не зарегистрировано");
                                identForm.check("registration");
                            } else {
                                messageAfter(thisField, "пользователь с таким емайлом зарегистрирован");
                                identForm.check("login");
                            }
                        }
                    });
                } else {
                    messageAfter(thisField, "введите правильный адрес своей электронной почты");
                    identForm.check("default");
                }
            } else {
                messageAfter(thisField, "введите адрес своей электронной почты");
                identForm.check("default");
            }
        });
        $(".add #id_fake").click(function(){
            if (this.checked) {
                identForm.check("fake");
                $(".add #id_value").add(".add #id_type").before("<em>*</em>");
            } else {
                identForm.check("nofake");
                $(".add #id_email").change();
                $(".add #id_type").add(".add #id_value").siblings("em").remove();
            }
        });
        
        $(".add #id_auth").click(function(){
            $.ajax({
                type: 'post',
                dataType: 'json',
                url: '/ajax/login/',
                data: $(".add #id_email").add(".add #id_password").serialize(),
                success: function(r){
                    if (r = "ok") {
                        identForm.check("remove");
                    } else {
                        alert("пароль не подходит!");
                    }
                }
            });
            return false;
        });
        
    };

    $("button[class^=add-form]").click(function(){
       cloneForm ($(this).attr("class").replace("add-", ""));
       return false;
    });
  
    $("#spir").attr("disabled", "disabled");
    $("button[id^=spi]").click(function(){
        var curr = $(this).attr("id").replace("spi", "pi");
        $("button[id^=spi]").removeAttr("disabled");
        $(this).attr("disabled", "disabled");
        $("span[class^=pi]").hide();
        $("." + curr ).fadeIn("slow");
    });
  
    $(".mark-link").click(function(){
        var sep = '_', bookmarks = new Array(), advertid = this.id.replace('mark-link', '');
        if ($.cookie("bookmarks")) {
            bookmarks = $.cookie("bookmarks").split(sep);
        };
        if ((this.className.indexOf("marked")) +1 ) {
            $.each(bookmarks, function(i, val) {
                if (val == advertid) {bookmarks.splice(i, 1)}
            });
        } else {
            bookmarks = bookmarks.concat([ advertid ]);
            bookmarks = jQuery.unique(bookmarks);
        };
        $.cookie("bookmarks", bookmarks.join(sep), { path: '/', expires: 10000 });
        $(this).toggleClass("marked");
        $(".mark-link").attr("title", "добавить в закладки");
        $(".marked").attr("title", "удалить из закладок");
        if($(this).parents("div.bookmarks").size()) {
            $(this).parents("li").toggleClass("removed");
            $(".marked").text("");
            $(".mark-link").filter(":not(.marked)").text("восстановить закладку");
        };
        $("#bookmarks-count").text(bookmarks.length);
        return false;
    });
    
    $(".message-form form").submit(function(){
        var form = this;
        $.ajax({
            url: form.action,
            type: 'post',
            data: $(form).serialize(),
            success: function(r) {
                if(r["status"] == "ok") {
                    alert("Ваше сообщение успешно отправлено!");
                    $(form).parents(".message-form").hide();
                    $(form).reset();
                    $("#id_captcha_0").val(r["new_hash"]);
                    $("img.captcha").attr("src", "/captcha/image/" + r["new_hash"] + "/");
                } else {
                    alert("форма заполнена неправильно");
                    $("#id_captcha_0").val(r["new_hash"]);
                    $("img.captcha").attr("src", "/captcha/image/" + r["new_hash"] + "/");
                }
            }
        });
        return false;
    });
    
    $("#user_contact_form").click(function(){
    	$(".message-form").slideDown("fast");
    	return false;
    });   
    
    $(".message-form .close").click(function(){
    	$(this).parents(".message-form").slideUp("fast");
    	return false;
    });

    $(".messages .remove").click(function(){
        var header = $(this).siblings("h3").get(0);
        if (confirm("Вы уверены, что хотите удалить это сообщение?")) {
            $.ajax({
                url: "/ajax/mail/delete/" + header.className + "/",
                type: 'get',
                success: function(r) {
                    if(r == "ok") {
                        $(header).parents("li").remove();
                    };
                }
            });
        };
    });

    $(".messages h3").click(function(){
        var header = this;
        $(header).parents("li").siblings(".open").each(function(){
            $(this).find("h3").attr("title", "Раскрыть сообщение");
            $(this).find(".msg").slideUp("fast");
            $(this).removeClass("open");
        });
        $(header).siblings(".msg").slideToggle("fast").parents("li").toggleClass("open");
        $(".messages li h3").attr("title", "Развернуть сообщение");
        $(".messages li.open h3").attr("title", "Свернуть сообщение");
        if ($(header).parents("li.unread").size()){
            $.ajax({
                url: "/ajax/mail/read/" + header.className + "/",
                type: 'get',
                success: function(r) {
                    if(r == "ok") {
                        var messagesCount = parseInt($("#messages-count").text()) - 1;
                        if (!messagesCount) {
                            $("#messages-count").parents("a").removeClass("attention");
                        };
                        $("#messages-count").text(messagesCount);
                        $(header).parents("li.unread").removeClass("unread");
                    };
                }
            });
        }
    });

    $(".messages .answer button").click(function(){
        var msg_id = $(this).parents(".msg").siblings("h3").attr("class");
        $(this).parents("p").after($("#message-form"));
        $("#message-form form").attr("action", "/ajax/mail/" + msg_id + "/");
        $("#message-form").show();
    });

     $("form [id$=address]").bind("change", function(){
        var address = "#" + $(this).attr("id");
        var formPrefix = "#" + $(this).attr("id").replace("address", "");
        var pointInputId = formPrefix + "point";
        var region = $(formPrefix.replace("id_", "show-") + "subregions-selector").clone();
        region.children("span").remove();
        var geocoder = new YMaps.Geocoder(region.text() + this.value);
        YMaps.Events.observe(geocoder, geocoder.Events.Load, function() {
            if (this.length()) {
                GeoLocation = this.get(0);
                GeoPoint = GeoLocation.getGeoPoint();
                $(pointInputId).val('POINT ('+GeoPoint.getLng()+' '+GeoPoint.getLat()+')');
                messageAfter(address);
            } else {
                $(pointInputId).val('');
                messageAfter(address, "не найдено!");
            };
        });
    });
        
    var timeoutBeforeGeoRequest = {};
    $("form [id$=address]").bind("keyup", function(){
        var address = this;
        addresschange = function(){
            $(address).change();
        };
        clearTimeout (timeoutBeforeGeoRequest);
        timeoutBeforeGeoRequest = setTimeout("addresschange()", 1000);
    });
        
    if ($("#show-sections-selector").size()) {
        $.ajax({
            url:"/json/sections+regions+mapper/",
            dataType: "json",
            success: function(r){
                selector("sections", r["sections"], null, selected_sections, "validate[required] radio", r["mapper"]);
                selector("subregions", r["regions"], null, selected_subregions, "validate[required] radio", {});
                $("input[name=sections]:checked").click();
            }
        });

        $("select").keyup(function(e){
            if ($.inArray(e.keyCode, [38, 40]) + 1) {
                $(this).change();
            }
        });
        $("#id_car_model").data("children", $("#id_car_model").html());
        $("#id_car_serie").data("children", $("#id_car_serie").html());
        $("#id_car_brand").change(function(){
            var brand_id = $(this).val();
            if (brand_id) {
                $.ajax({
                    url: "/ajax/ap/get_series/" + brand_id + "/",
                    dataType: "json",
                    success: function(r){
                        loadchoices({selector:"#id_car_serie", data: r, defaultChoices: {"": {name: "Выберите серию"}}});
                    }
                });
            } else {
                $("#id_car_serie").children().remove();
            };
        });
        $("#id_car_serie").change(function(){
            var serie_id = $(this).val();
            if (serie_id) {
                $.ajax({
                    url: "/ajax/ap/get_models/" + serie_id + "/",
                    dataType: "json",
                    success: function(r){
                        loadchoices({selector:"#id_car_model", data: r, defaultChoices: {"": {name: "Выберите модель"}}});
                    }
                });
            } else {
                $("#id_car_model").add("#id_car_modification").children().remove();
            };
        });
        $("#id_car_model").change(function(){
            var model_id = $(this).val();
            if (model_id) {
                $.ajax({
                    url: "/ajax/ap/get_modifs/" + model_id + "/",
                    dataType: "json",
                    success: function(r){
                        loadchoices({selector:"#id_car_modification", data: r, defaultChoices: {"": {name: "Выберите модификацию"}}});
                    }
                });
            } else {
                $("#id_car_modification").children().remove();
            };
        });

        $("#id_car_gearbox").add("#id_engine_volume").change(function(){setCarAdvertTitle()});
        $("#id_engine_volume").bind("keyup change", function(){setCarAdvertTitle()});

        $("#id_car_modification").change(function(){
            var json = $(this).data("json");
            var val = $(this).val();
            if (val) {
                $.each(json[val]["fields"], function(key, val){
                    $("#id_" + key).val(val);
                });
            };
            setCarAdvertTitle();
        });

    };
    if ($(".office-manage").size()) {
        $.ajax({
            url:"/json/regions/",
            cache: true,
            dataType: "json",
            success: function(response){
                var region = parseInt($("#id_subregion").val());
                if (!region) {region = 0};
                selector("subregion", response["regions"], null, getParents(response["regions"], region), "validate[required] radio", {});
                $("#id_subregion").remove();
            }
        });
    };

    if ($(".company-sections").size()) {
        $.ajax({
            url:"/json/sections/",
            cache: true,
            dataType: "json",
            success: function(r){
                selector("section", r["sections"], null, [], "", {});
                $(".company-sections .formset label button").click(function(){
                    if ($("#id_section-selector").data("activefor") == $(this).parent().attr("for")) {
                        $("#id_section-selector").hide();
                        $("#id_section-selector").data("activefor", false);
                        $(this).html("Выбрать");
                    } else {
                        $("#id_section-selector").show().insertBefore($(this).parent());
                        if ($("#id_section-selector").data("activefor")) $("[for=" + $("#id_section-selector").data("activefor") + "] button").html("Выбрать");
                        $("#id_section-selector").data("activefor", $(this).parent().attr("for"));
                        $(this).html("Закрыть");
                    };
                    return false;
                });

                $(".company-sections .formset input[type=text]").click(function(){
                    if ($("#id_section-selector").data("activefor") != $(this).attr("id")) {
                        $("#id_section-selector").show().insertAfter(this);
                        $("[for=" + $("#id_section-selector").data("activefor") + "] button").html("Выбрать");
                        $("#id_section-selector").data("activefor", $(this).attr("id"));
                        $(this).siblings("label").children("button").html("Закрыть")
                    }
                });

            }
        });
    };

    $("[id^=show-]").filter("[id$=-selector]").click(function(){
        $("#" + this.id.replace("show-", "id_")).slideToggle(200);
        return false;
    });
    $("[id$=-selector] div button.select").click(function(){
        $(this).parents("[id$=-selector]").slideToggle(200);
        return false;
    });
    
    $(".show-map").one("click", function() {
        var shower = this;
        var mapname = $(this).attr("class").replace("show-map ", "");
        this.point = [], zoomValue = 5;
        var geocoder = new YMaps.Geocoder($(this).text());
        YMaps.Events.observe(geocoder, geocoder.Events.Load, function() {
            if (this.length()) {
                GeoLocation = this.get(0);
                var point = GeoLocation.getGeoPoint();
                if ($(".show-map").children("span").text()) {
                    zoomValue = 16;
                } else {
                    zoomValue = 8;
                };
                var map = new YMaps.Map(document.getElementById(mapname));
                map.setCenter(point, zoomValue);
                var zoom = new YMaps.Zoom({
                    noTips: true
                });
                map.addControl (zoom);
                var MarkOptions = {};
                var mark = new YMaps.Placemark (point, MarkOptions);
                map.addOverlay(mark);
                $("#" + mapname).toggle();
                $(shower).click(function(){
                    $("#" + mapname).toggle();
                    map.redraw();
                    return false;
                });
            };
        });
        return false;
    });
    
    $(".search-form #id_query").focus();
    $(".search-form input[type=text]").bind("keydown", function(e){
        if (e.keyCode == '13') {$(this).parents("form").submit()};
    });

    $(".search-form #id_avtoportal_car_brand").change(function(){
        var brand_id = $(this).val();
        if (brand_id) {
            $.ajax({
                url: "/ajax/ap/get_series/" + brand_id + "/",
                dataType: "json",
                success: function(r){
                    loadchoices({selector:"#id_avtoportal_car_serie", data:r, defaultChoices: {"": {name:"Любая"}}});
                }
            });
        } else {
            $("#id_avtoportal_car_serie").children().remove();
        };
    }).change();

/* we don't use models in search. uncomment for using this
    $(".search-form #id_avtoportal_car_serie").change(function(){
        var serie_id = $(this).val();
        if (serie_id) {
            $.ajax({
                url: "/ajax/ap/get_models/" + serie_id + "/",
                dataType: "json",
                success: function(r){
                    loadchoices({selector:"#id_avtoportal_car_model", data:r, defaultChoices: {"": {name:"Любая"}}});
                }
            });
        } else {
            $("#id_avtoportal_car_model").children().remove();
        };
    }).change();
*/
    if ($(".detailed").size()) {
        var gallery = (new jQuery).visualTopLayerGallery({
            autoPlay: false,
            overlayOpacity: 0.5,
            resizeSpeed: 10,
            slideTime: 7,
            prefix: "",
            loadingMsg: "Загрузка",
            classNames: "imagelink"
        });
    };
    $(".search-form select[name=subregion]").change(function() {
        if (this.value == "add-subregion") {
            var selectorLayer = (new jQuery).visualTopLayerSelector();
            $.ajax({
                url:"/json/regions/",
                dataType: "json",
                success: function(r){
                    selector("subregion", r["regions"], null, [], "", {});
                }
            });
        };
    });
    
    $.validationEngineLanguage.newLang();
    $("form").validationEngine();
    
	$("a.ajax-action").click(function(){
		var self = this;
		if (confirm("вы уверены?")) {
			$.ajax({
				url: self.href,
                success: function(){
					var container = $(self).parents("li");
					var index = +$(container).find(".index-number").text();
					$(container).nextAll("li").each(function(){
						$(this).find(".index-number span").text(index);
						$(this).attr("class", function(){
							if (index % 2) {
								return "odd";
							} else {
								return "even";
							};
						});
					});
					$(container).remove();
				}
			});
		};
		return false;
	});
	$("div.login form [name=password]").keydown(function(e){
		if (e.keyCode == '13') {
			$(this).parents("form").submit();
		}
	});
    
	$("[name$=-DELETE]").change(function(){
		if (this.checked) {
			$("[name^=" + this.name.replace("-DELETE", "") + "]").each(function(i){
				if ($(this).attr("class")){
					$(this).data("class", this.className).removeAttr("class");
				};
			});
		} else {
			$("[name^=" + this.name.replace("-DELETE", "") + "]").each(function(i){
				if ($(this).data("class")) {
					$(this).attr("class", $(this).data("class"));
				};
			});
		};
	});
	$(".list img").lazyload({effect: "fadeIn"});

    /* for trigger change event on id_email element when browser autofill selected */
    $("#identForm").parents(".wrap").add("#regform").mouseenter(function(){
        if (!($("#id_fake").checked())) {
            $("#id_email").change();
        }
    });
    if ($("#identForm").size()) {
        $("#id_submit").attr("disabled","disabled");
    };
});