diff --git a/src/assets/netteForms.js b/src/assets/netteForms.js index 5cdf3ec23..4cb7bc284 100644 --- a/src/assets/netteForms.js +++ b/src/assets/netteForms.js @@ -281,30 +281,37 @@ /** - * Display error messages. + * CSS class. */ - Nette.showFormErrors = function(form, errors) { - var messages = [], - focusElem; - - for (var i = 0; i < errors.length; i++) { - var elem = errors[i].element, - message = errors[i].message; + Nette.formErrorClass = 'nette-form-error'; - if (!Nette.inArray(messages, message)) { - messages.push(message); - if (!focusElem && elem.focus) { - focusElem = elem; - } + /** + * Display error messages. + */ + Nette.showFormErrors = function(form, errors) { + var boxes = form.getElementsByTagName('span'); + for (var i = boxes.length - 1; i >= 0; i--) { + if (boxes[i].getAttribute('class') === Nette.formErrorClass) { + boxes[i].parentNode.removeChild(boxes[i]); } } - if (messages.length) { - alert(messages.join('\n')); - - if (focusElem) { - focusElem.focus(); + for (var i = 0; i < errors.length; i++) { + if (i === 0 && errors[i].element.focus) { + errors[i].element.focus(); + } + + if (errors[i].message) { + var box = document.createElement('span'); + box.setAttribute('class', Nette.formErrorClass); + box.textContent = errors[i].message; + errors[i].element.parentNode.insertBefore(box, errors[i].element.nextSibling); + Nette.addEvent(errors[i].element, 'keypress', function() { + if (this.nextSibling && this.nextSibling.getAttribute('class') === Nette.formErrorClass) { + this.parentNode.removeChild(this.nextSibling); + } + }); } } }; @@ -668,6 +675,15 @@ } } }); + + Nette.addEvent(form, 'blur', function() { + e = e || event; + var target = e.target || e.srcElement; + alert(target); + if ((target.nodeName.toLowerCase() in {input: 1, select: 1, textarea: 1}) && !target.disabled && !target.readonly) { + Nette.validateControl(target); + } + }); };