function SendFormAjax(form, args){
    args = args || {};
    var defargs = {
        url: location.protocol+'//'+location.host,
        validate: true,
        errorHandler: defErrorHandler,
        onComplete: null,
        disable:'',
        clear:false,
        dontpost: false
    };
    $.extend(defargs, args);
    var errors = false;
    var i;
    var post = {};
    var disabled = [];
    if (disable != '') {
        var disable = defargs.disable.split(',');
        for (i = 0; i < disable.length; i++) {
            var e = document.getElementById(disable[i]);
            if (e) {
                e.setAttribute('disabled','disabled');
                disabled.push(e);
            }
        }
    }
    for (i = 0; i < form.elements.length; i++){
        var el = form.elements[i];
        if (!el.name || el.type == 'submit' || el.type == 'reset' || el.type == 'button') continue;
        if (defargs.validate) {
            var rule = el.getAttribute('rule');
            if (rule) {
                if (el.type == 'checkbox' || el.type == 'radio') val = el.checked?el.value:'';
                else val = el.value;
                var err = testRules(eval('('+rule+')'), val, 'and');
                if (err != '') {
                    defargs.errorHandler(err, el);
                    errors = true;
                }
            }
        }
        if (el.type == 'checkbox' || el.type == 'radio') {
            if (el.checked) post[el.name] = el.value;
        } else {
            post[el.name] = el.value;
        }
    }
    if (errors) {
        for (i = 0; i < disabled.length; i++) e.removeAttribute('disabled');
        return false;
    }
    if (defargs.dontpost) {
        for (i = 0; i < disabled.length; i++) e.removeAttribute('disabled');
        if (defargs.onComplete) defargs.onComplete();
        return true;
    }
    $.post(defargs.url, post, function(res){
        if (defargs.clear) form.reset();
        for (i = 0; i < disabled.length; i++) e.removeAttribute('disabled');
        if (defargs.onComplete) {
            defargs.onComplete(res);
        }
    });
    return true;
}

function defErrorHandler(err,el){
    el.className = 'has_error';
    var mes = el.getAttribute('messages');
    var errmes = '';
    if (mes) {
        mes = eval('('+mes+')');
        mes = mes[err] || mes['defmessage'] || '';
    }
    var tip = $(el).attr('tip');
    if (mes != ''){
        if (tip) {
            $("#" + tip).html(mes).show();
        } else {
            alert(mes);
        }
    }
    el.onfocus = hideErrorOnFocus;
}

function hideErrorOnFocus(e) {
    this.onfocus = null;
    this.className = '';
    var tip = this.getAttribute('tip');
    if (tip) {
        document.getElementById(tip).style.display = 'none';
    }
}

function testRules(ru,val,op){
    var last = '';
    for (k in ru){
        var res = '';
        switch (k){
            case 'noempty': if (val=='') res = k; break;
            case 'minlen':  if (val.length < ru[k]) res = k; break;
            case 'maxlen':  if (val.length > ru[k]) res = k; break;
            case 'numeric': if (!val.match(/^[0-9]+$/)) res = k; break;
            case 'email':   if (!val.match(/^[\w\.-]+\@[\w\.-]+\.\w+$/)) res = k; break;
            case 'ereg':    if (!val.match(new RegExp(ru[k]))) res = k; break;
            case 'or':      res = testRules(ru[k], val, 'or'); break;
            case 'and':     res = testRules(ru[k], val, 'and'); break;
            case 'confirm': if (val != document.getElementById(ru[k]).value) res = k; break;
            case 'depend':  res = testRules(ru[k].rule, document.getElementById(ru[k].of).value, 'and'); break;
            case 'not':     if (testRules(ru[k],val,'and') == '') res = 'not'; break;}
        if (op == 'or' && res == '') return '';
        if (op == 'and' && res != '') return res;
        last = res;
    }
    return last;
}

function ScrollToElement(theElement){
    var selectedPosX = 0;
    var selectedPosY = 0;
    while(theElement != null){
        selectedPosX += theElement.offsetLeft;
        selectedPosY += theElement.offsetTop;
        theElement = theElement.offsetParent;
    }
    window.scrollTo(selectedPosX,selectedPosY);
}

function outSendResult(e){
    $('.err_mes').html('');
    var report = $(e).find('report').text();
    var messblock = document.getElementById('message');
    if (report == 'ok'){
        messblock.innerHTML = 'Ваше письмо отправлено';
        messblock.className = 'normal';
        document.getElementById('testdriveform').reset();
    } else {
        messblock.innerHTML = 'При отправке письма возникли ошибки, проверьте пожалуйста введенные данные';
        messblock.className = 'failed';
        var err = $(e).find('required').children();
        $(err).each(function(e){
            if(this.nodeName == 'cbcaptcha'){
                $("#captchaQusetion").html($(this).attr('msg'));
                defErrorHandler('badcaptcha', document.getElementById('cbcaptcha'));
                $("#message_captcha").show();
            } else {
                $('#'+this.nodeName).html($(this).attr('msg'));
            }
        });
    }

}

