This commit is contained in:
Alan
2026-02-14 19:34:54 +03:00
commit 5c3329238b
867 changed files with 214778 additions and 0 deletions

63
js/baloon/css/baloon.css Normal file
View File

@@ -0,0 +1,63 @@
#baloon {
width: 187px;
top: 0px;
left: 0px;
padding: 0;
margin: 0;
display: none;
position: absolute;
z-index: 64999;
filter: Alpha(Opacity='75');
-moz-opacity: 0.75;
opacity: 0.8;
}
#baloonHeader {
width: 187px;
height: 19px;
padding: 0;
margin: 0;
font-size: 0;
line-height: 0;
background-repeat: no-repeat;
display: block;
}
.baloonHeaderDirect {
background-image: url(../i/baloon-header.gif);
}
.baloonHeaderFlip {
background-image: url(../i/baloon-header-flip.gif);
}
#baloonFooter {
width: 187px;
height: 3px;
padding: 0;
margin: 0;
font-size: 0;
line-height: 0;
background-image: url(../i/baloon-footer.gif);
background-repeat: no-repeat;
display: block;
}
#baloonBody {
padding: 10px;
color:#000;
background-color: #D0D0D0;
width: auto;
margin: 0;
font: normal normal 10px/14px Verdana, Arial, serif;
line-height: 140%;
background-image: url(../i/baloon-body.gif);
background-repeat: repeat-y;
display: block;
}

BIN
js/baloon/i/baloon-body.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

156
js/baloon/index.html Normal file
View File

@@ -0,0 +1,156 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Validate JS</TITLE>
<SCRIPT src="js/default.js" language="JavaScript" type="text/javascript"></SCRIPT>
<SCRIPT src="js/validate.js" language="JavaScript" type="text/javascript"></SCRIPT>
<SCRIPT src="js/baloon.js" language="JavaScript" type="text/javascript"></SCRIPT>
<LINK href="css/default.css" rel="stylesheet" type="text/css" />
<LINK href="css/baloon.css" rel="stylesheet" type="text/css" />
</HEAD>
<BODY>
<TABLE width="100%" border="0" cellpadding="10" cellspacing="0">
<FORM action="index.html" method="GET" enctype="multipart/form-data">
<TR valign="top">
<TD width="50%">
Текст сообщения об ошибке будет браться из атрибута <STRONG>notice</STRONG>, если тот есть. Если у формы есть атрибут <STRONG>onsubmit</STRONG>, то стандартный скрипт валидации подцепляться не будет.
Допустимые значения текстовых полей (<STRONG>text</STRONG>, <STRONG>password</STRONG> или <STRONG>textarea</STRONG>) определяются атрибутом <STRONG>pattern</STRONG>, значение которого в общем случае
представляет из себя регулярное выражение, соотвествующее корректному значению поля. Ограничители писать не надо.
Например значение этого поля должно начинаться с 'a', заканчиваться на 'c', и содержать внутри хотя бы один 'b' (<STRONG>^ab+c$</STRONG>).
<BR /><BR /> Кстати, в старых Opera&#146;ах (&lt; 7) регулярные выражения вроде бы отсутвуют как класс.
</TD>
<TD width="50%">
<INPUT type="text" name="count" pattern="^aq+c$" notice="skiri"/>
</TD>
</TR>
<TR valign="top">
<TD>
Если атрибут <STRONG>pattern</STRONG> равен number, то в поле ожидается неотрицательное целое число
</TD>
<TD>
<INPUT type="text" name="number" pattern="number" notice="В этом поле должно быть целое число"/>
</TD>
</TR>
<TR valign="top">
<TD>
Если атрибут <STRONG>pattern</STRONG> равен url, то в поле ожидается URL. К сожалению, в регулярных выражениях я не очень силен,
поэтому шаблон иногда сбоит. Так что перед использованием протестите
</TD>
<TD>
<INPUT type="text" name="url" pattern="url" notice="В этом поле должен быть URL"/>
</TD>
</TR>
<TR valign="top">
<TD>
Если атрибут <STRONG>pattern</STRONG> равен string, то поле просто не должно быть пустым
</TD>
<TD>
<INPUT type="text" name="string" pattern="string" notice="В этом поле хоть что-то надо вписать"/>
</TD>
</TR>
<TR valign="top">
<TD>
Если атрибут <STRONG>pattern</STRONG> равен email, то в поле ожидается email адрес
</TD>
<TD>
<INPUT type="text" name="email" pattern="email" notice="В этом поле должен быть email адрес"/>
</TD>
</TR>
<TR valign="top">
<TD>
Ошибка возникает при выборе OPTION&#146;а с атрибутом <STRONG>notselected</STRONG>.
Элемент с атрибутом <STRONG>select-multiple</STRONG> я еще не придумал как проверять (пока не было еще в этом нужды)
</TD>
<TD>
<SELECT name="choise" notice="Надо выбрать 1 элемент, причем не первый">
<OPTION value="1" notselected="notselected">Одын</OPTION>
<OPTION value="2">Две</OPTION>
<OPTION value="3">Три</OPTION>
<OPTION value="4">Четыре</OPTION>
</SELECT>
</TD>
</TR>
<TR valign="top">
<TD>
У любого из checkbox&#146;ов можно указать атрибуты <STRONG>min</STRONG>, <STRONG>max</STRONG> и
<STRONG>notice</STRONG>
</TD>
<TD>
<FIELDSET>
<LEGEND>Группа checkbox&#146;ов с одинаковым именем</LEGEND>
<INPUT class="radio" type="checkbox" name="rand" min="1" max="2" notice="Надо выбрать по краней мере 1 элемент, но не больше 2х"/>
<INPUT class="radio" type="checkbox" name="rand"/>
<INPUT class="radio" type="checkbox" name="rand"/>
<INPUT class="radio" type="checkbox" name="rand"/>
<INPUT class="radio" type="checkbox" name="rand"/>
</FIELDSET>
</TD>
</TR>
<TR valign="top">
<TD>
<STRONG>TEXTAREA</STRONG> проверяется так же, как и <STRONG>INPUT[@type = 'text']</STRONG>
</TD>
<TD>
<TEXTAREA name="text" pattern="string" notice="Сюда надо просто что то ввести"></TEXTAREA>
</TD>
</TR>
<TR valign="top">
<TD>
У любого из radiobutton&#146;ов можно указать атрибуты <STRONG>min</STRONG>, <STRONG>max</STRONG> и <STRONG>notice</STRONG>.
<BR>Причем, так как это radiobutton, а не checkbox, то <STRONG>min</STRONG> = <STRONG>max</STRONG> = 1
</TD>
<TD>
<FIELDSET>
<LEGEND>Группа radiobutton&#146;ов с одинаковым именем</LEGEND>
<INPUT class="radio" type="radio" name="mask"/>
<INPUT class="radio" type="radio" name="mask" min="1" max="1" notice="Надо выбрать какой то 1 элемент"/>
<INPUT class="radio" type="radio" name="mask"/>
<INPUT class="radio" type="radio" name="mask"/>
</FIELDSET>
</TD>
</TR>
<TR valign="top">
<TD>
Элемент типа <STRONG>file</STRONG> я не придумал как проверять. Да и проверять его редко когда надо, разве что при закачке картинок.
Но в их случае я пользуюсь превьюшками, а имя файла и расширение как правило интереса совсем не представляют
</TD>
<TD>
<INPUT type="file" name="photo"/>
</TD>
</TR>
<TR valign="top">
<TD>
Значения полей типа <STRONG>image</STRONG>, <STRONG>button</STRONG>, <STRONG>submit</STRONG>,
<STRONG>reset</STRONG> и <STRONG>hidden</STRONG> никак не проверяются
</TD>
<TD>
<INPUT type="submit" value="submit"/>
</TD>
</TR>
</FORM>
</TABLE>
</BODY>
</HTML>

228
js/baloon/js/baloon.js Normal file
View File

@@ -0,0 +1,228 @@
// (C) Netlogic, 2003
function CreateBaloon() {
baloon = document.createElement('DIV');
baloon.setAttribute('id', 'baloon');
baloonHeader = document.createElement('DIV');
baloonHeader.setAttribute('id', 'baloonHeader');
baloonHeader.setAttribute('class', 'direct');
baloonBody = document.createElement('DIV');
baloonBody.setAttribute('id', 'baloonBody');
baloonFooter = document.createElement('DIV');
baloonFooter.setAttribute('id', 'baloonFooter');
baloonBody.innerText = 'baloon';
baloon.appendChild(baloonHeader);
baloon.appendChild(baloonBody);
baloon.appendChild(baloonFooter);
baloon.onmouseover = function(e) { this.style.filter = "Alpha(Opacity='100')"; this.style.cursor = 'pointer'; this.style.MozOpacity = '1';}
baloon.onmouseout = function(e) { this.style.filter = "Alpha(Opacity='75')"; this.style.cursor = 'auto'; this.style.MozOpacity = '0.75'; }
baloon.onselectstart = function(e) { return false; }
baloon.onclick = function(e) { this.style.display = 'none'; }
document.body.appendChild(baloon);
window.onresize = function(e) { document.getElementById('baloon').style.display = 'none'; }
}
function ShowBaloon(i) {
baloon = document.getElementById('baloon');
document.getElementById('baloonBody').innerHTML = i.getAttribute('data-notice') && i.getAttribute('data-notice').length ? i.getAttribute('data-notice') : 'ERROR';
baloon.style.display = 'block';
var xleft=0;
var xtop=0;
o = i;
do {
xleft += o.offsetLeft;
xtop += o.offsetTop;
} while (o=o.offsetParent);
xwidth = i.offsetWidth ? i.offsetWidth : i.style.pixelWidth;
xheight = i.offsetHeight ? i.offsetHeight : i.style.pixelHeight;
bwidth = baloon.offsetWidth ? baloon.offsetWidth : baloon.style.pixelWidth;
w = window;
xbody = document.compatMode=='CSS1Compat' ? w.document.documentElement : w.document.body;
dwidth = xbody.clientWidth ? xbody.clientWidth : w.innerWidth;
bwidth = baloon.offsetWidth ? baloon.offsetWidth : baloon.style.pixelWidth;
flip = !(xwidth - 10 + xleft + bwidth < dwidth);
baloon.style.top = xheight - 10 + xtop + 'px';
baloon.style.left = (xleft + xwidth - (flip ? bwidth : 0) - 25) + 'px';
document.getElementById('baloonHeader').className = flip ? 'baloonHeaderFlip' : 'baloonHeaderDirect';
i.focus();
return false;
}
// (C) Netlogic, 2003
function ValidateForms() {
for (i = 0; i < document.forms.length; i++) {
if(document.forms[i].onsubmit) continue;
document.forms[i].onsubmit = function(e) {
var form = e ? e.target : window.event.srcElement;
for(var i=0; i<form.elements.length; i++) {
var value = form.elements[i].value;
switch(form.elements[i].type) {
case 'text':
case 'password':
case 'textarea':
pattern = form.elements[i].getAttribute('data-format');
if(pattern) {
switch(pattern) {
case 'string':
if(!value.length) {
return ValidateNotice(form.elements[i]);
}
break;
case 'number':
if(!isNumeric(value)) {
return ValidateNotice(form.elements[i]);
}
break;
case 'url':
if(!isUrl(value)) {
return ValidateNotice(form.elements[i]);
}
break;
case 'email':
if(!isEmail(value)) {
return ValidateNotice(form.elements[i]);
}
break;
default:
/*if(!isPattern(pattern, value)) {
return ValidateNotice(form.elements[i]);
}*/
break;
}
}
break;
case 'radio':
case 'checkbox':
min = form.elements[i].getAttribute('min') ? form.elements[i].getAttribute('min') : 0;
max = form.elements[i].getAttribute('max') ? form.elements[i].getAttribute('max') : document.getElementsByName(form.elements[i].getAttribute('name')).length;
if(min || max) {
var items = document.getElementsByName(form.elements[i].getAttribute('name'));
var count = 0;
for(var l=0; l<items.length; l++){
if(items[l].checked) {
count++;
}
}
if(count < min || count > max) {
return ValidateNotice(form.elements[i]);
}
}
break;
case 'select-one':
case 'select-multiple':
selected = form.elements[i].options[form.elements[i].selectedIndex];
if(selected && selected.getAttribute('notselected')) {
return ValidateNotice(form.elements[i]);
}
break;
break;
case 'file':
break;
case 'image':
case 'button':
case 'submit':
case 'reset':
break;
default:
break;
}
}
return (typeof eCommerceSubmit == 'function') ? eCommerceSubmit() : true;
return true;
}
}
}
function isUrl(str) {
return isPattern("^https?:\\/\\/(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?(?:(?:[a-z0-9-]{1,128}\\.)+(?:com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\\.){3}(?!0|255)[0-9]{1,3})(?:\\/[a-z0-9.,_@%&?+=\\~\\/-]*)?(?:#[^ '\"&<>]*)?$", str.toLowerCase());
}
function isNumeric(str) {
return isPattern("^[0-9]+$", str);
}
function isInteger(str) {
return isNumeric(str);
}
function isFloat(str) {
return isPattern("^[1-9]?[0-9]+(\\.[0-9]+)?$", str);
}
function isEmail(str) {
return isPattern("^([a-z0-9_-]+)(\\.[a-z0-9_-]+)*@((([a-z0-9-]+\\.)+(com|net|org|mil|edu|gov|arpa|info|biz|inc|name|[a-z]{2}))|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))$", str.toLowerCase());
}
function isPattern(pattern, str) {
if(str.length && pattern.length) {
var re = new RegExp(pattern, "g");
return re.test(str);
}
return false;
}
function ValidateNotice(input) {
ShowBaloon(input);
return false;
}
function init_balloon()
{
return;
ValidateForms();
CreateBaloon();
}
if (window.attachEvent) {
window.attachEvent("onload", init_balloon);
} else if (window.addEventListener) {
window.addEventListener("DOMContentLoaded", init_balloon, false);
} else {
document.addEventListener("DOMContentLoaded", init_balloon, false);
}