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'));
            }
        });
    }

}
