(function($, undefined){ $.fn._ajax_form = function(options){ var defaults = { sendPath : '/', type : 'post', dataType : "html", onFocus : false, //принимаемые значения соответствуют значениям CSS 'display', 'none'=false response : false, send_ajax : true, responseContainer : '.ajaxresponse', responseClear : false, responseTarget : 'body', before : function(){}, success : function(){}, callBack : function(){} }; if (options === undefined || options.sendPath === undefined){ var sendPath = $(this).attr("action"); if (sendPath != ''){ options = $.extend(options, { sendPath : sendPath }); } } var options = $.extend(defaults, options); return this.each(function(){ options.before.call(this); var form = $(this), elementsToFind = ['textarea', 'select', 'input:text', 'input:hidden', 'input:password'], send = { formElements : [], validationError: false, button : form.find('input:submit, button:submit'), datastring : '' }; $.each(elementsToFind, function(i, value){ var elements = form.find(value); if (elements.length > 0){ elements.bind('change', checkElement); if (options.onFocus && options.onFocus != 'none'){ if (options.onFocus === true) options.onFocus = 'block'; elements.bind('focusin', focusInElement); elements.bind('focusout', focusOutElement); } send.formElements.push(elements); } }); send.button.bind('click', checkElementsToSend); function send_ajax_form() { var success = false; $.ajax({ type : options.type, dataType : options.dataType, beforeSend : function(){ }, url : options.sendPath.split('?')[0], data : send.datastring, complete : function(){ options.callBack.call(this); }, success : function(response) { if (options.response){ if (options.dataType == 'json'){ var text = (response.error.length == 0) ? '
' + response.message + '
' : '
' + response.error + response.debug + '
'; } else { var text = response; } if (options.responseContainer){ var content = $("
").addClass(options.responseContainer) //.css('display','none') .html(text); } else var content = text; if (options.responseClear) $(options.responseTarget).html(content); else $(options.responseTarget).append(content); } if (options.dataType == 'json') { if (typeof(response.error) == 'undefined' || response.error.length == 0) success = true; } else success = true; if (success){ $.each (send.formElements, function(i,v) { v.each (function(){ var currentElement = $(this); if (currentElement.attr('type') != 'hidden' && currentElement.attr('type') != 'submit') currentElement.val('') .parent().removeClass('valid'); }); }); } if (options.dataType == 'json') { if (typeof(response.error) == 'undefined') response.error = {}; options.success.call(this, form, response); } else { options.success.call(this); } } }); return false; } function checkElementsToSend() { // reset validation var and send data send.validationError = false; send.datastring = 'ajax=1'; $.each (send.formElements, function(i,v) { v.each (function(){ var currentElement = $(this), value = currentElement.val(), name = currentElement.attr('name'); send.datastring += "&" + name + "=" + value; if (currentElement.parent().attr("class").match(/error/)) { send.validationError = true; } currentElement.change(); }); }); form.find('input:checked').each(function(){ var currentElement = $(this), value = currentElement.val(), name = currentElement.attr('name'); send.datastring += "&" + name + "=" + value; }); if(send.validationError == false){ if(options.send_ajax){ send_ajax_form(); return false; } } else { return false; } } function checkElement() { var currentElement = $(this), surroundingElement = currentElement.parent(); var value = currentElement.val(), classes = currentElement.attr("class"), nomatch = true; if(classes.match(/is_empty/i)){ if(value == '') { surroundingElement.removeClass("valid"); surroundingElement.addClass("error"); send.validationError = true; } else { surroundingElement.removeClass("error"); surroundingElement.addClass("valid"); } nomatch = false; } if(classes.match(/is_email/i)){ if(!value.match(/^\w[\w|\.|\-]+@\w[\w|\.|\-]+\.[a-zA-Z]{2,4}$/i)) { surroundingElement.removeClass("valid"); surroundingElement.addClass("error"); send.validationError = true; } else { surroundingElement.removeClass("error"); surroundingElement.addClass("valid"); } nomatch = false; } if(classes.match(/is_phone/i)){ var min_max = classes.match(/is_phone[-\d+?]*/i)[0].replace(/is_phone[-]*/i, '').split('-', 2), phone_default = ['7', '11']; value = value.replace(/[^0-9]/g, ''), min_max = _remove_empty(min_max), phone_default = $.extend(phone_default, min_max); if (classes.match(/is_empty/i) && value == '') { surroundingElement.removeClass("valid"); surroundingElement.addClass("error"); send.validationError = true; } else if (value != '' && value.length < parseInt(phone_default[0]) || value.length > parseInt(phone_default[1])){ surroundingElement.removeClass("valid"); surroundingElement.addClass("error"); send.validationError = true; } else { surroundingElement.removeClass("error"); surroundingElement.addClass("valid"); } currentElement.val(value); nomatch = false; } if(nomatch && value != '' && currentElement.attr('type') != 'submit'){ surroundingElement.addClass("valid"); } } function focusInElement() { $(this).parent().find('.onfocus').css('display', options.onFocus); } function focusOutElement() { $(this).parent().find('.onfocus').css('display', 'none'); } function _remove_empty (someArray){ var newArray = []; var element; $.each(someArray, function(element){ if(someArray[element]!='') { newArray.push(someArray[element]); } }); return newArray; } }); } })(jQuery);