
var Hint = document.createElement('div');
Hint.style.display = 'none';
Hint.timer_id = undefined;
 
Hint.style.fontFamily = 'Arial'; // шрифт подсказки
Hint.style.fontSize = '8pt'; // размер шрифта
Hint.style.color = '#000000'; // цвет шрифта
 
Hint.style.border = '1px solid #7D8891'; // граница подсказки
Hint.style.backgroundColor = '#FFFFE1'; // фон подсказки
Hint.style.padding = '1px 5px'; // поля подсказки
 
Hint.style.position = 'absolute'; 
Hint.style.zIndex = '100';
 
Hint.style.cursor = 'default';
Hint.onmousedown = function(){ HideHint(); }
 
function ShowHint(el, msg, dX, dY, spX, spY, time) {
    if (Hint.timer_id) {
        window.clearTimeout(Hint.timer_id);
        Hint.timer_id = undefined;
    }
 
    if (typeof(el) == 'string') el = document.getElementById(I);
 
    Hint.innerHTML = msg;
    Hint.style.top = '-100px';
    Hint.style.left = '-1000px';
    Hint.style.display = 'block';
 
    var w = parseInt(el.offsetWidth); 
    var h = parseInt(el.offsetHeight);
 
    var t = 0; 
    var l = 0; 
    var obj = el; 
    while(obj) { 
        t += parseInt(obj.offsetTop);   
        l += parseInt(obj.offsetLeft); 
        obj = obj.offsetParent;     
    }
 
    switch(dX) {
        case 0:
            Hint.style.left = l - parseInt(Hint.offsetWidth) - spX + 'px';
            break;
        case 1:
            Hint.style.left = l + spX + 'px';
            break;
        case 2:
            Hint.style.left = l + w - parseInt(Hint.offsetWidth) - spX + 'px';
            break;
        case 3:
            Hint.style.left = l + w + spX + 'px';
            break;
    }
 
    switch(dY) {
        case 0:
            Hint.style.top = t - parseInt(Hint.offsetHeight) - spY + 'px';
            break;
        case 1:
            Hint.style.top = t + spY + 'px';
            break;
        case 2:
            Hint.style.top = t + h - parseInt(Hint.offsetHeight) - spY + 'px';
            break;
        case 3:
            Hint.style.top = t + h + spY + 'px';
            break;
    }
 
    if (time) Hint.timer_id = setTimeout('HideHint()', time);
}
 
function HideHint() {
    if (Hint.timer_id) {
        window.clearTimeout(Hint.timer_id);
        Hint.timer_id = undefined;
    }
    Hint.style.display = 'none';
}
 
function SetHint() {
    document.body.appendChild(Hint);
}
 
if (typeof document.attachEvent != 'undefined') window.attachEvent('onload', SetHint);
else window.addEventListener('load', SetHint, false);

function DataCheck(I, VList, hint, dX, dY, spX, spY, time) {
    var keydown = false;
    var keyup = true;
 
    r = VList.split('').join('|');
    if (/z/.test(r)) r = r.replace(/z/g,'[a-z]');
    else if (/я/.test(r)) r = r.replace(/я/g,'[а-яё]');
    else if (/a/.test(r)) r = r.replace(/a/g,'[a-zа-яё]');
    else if (/\*/.test(r)) r = r.replace(/\*/g,'[a-zа-яё0-9]');
    r = r.replace(/\(/g,'\\(').replace(/\)/g,'\\)').replace(/\//g,'\\/').replace(/9/g,'\\d').replace(/\./g,'\\.');
 
    var r = new RegExp(r,'i');
 
    function isValid(key) {
        if (VList != '') {
            key = String.fromCharCode(key);
            return r.test(key);
 
        } else return false;
    }
 
    I.onkeydown = function(e, key){
        e = e || event;
        key = e.keyCode || e.charCode;
 
        if (key <= 31 || (key >= 33 && key <= 35) || (key >= 36 && key <=40) || key == 45 || key == 46 || (key >= 112 && key <= 123)) {
            keydown = true;
            if (key != 16) keyup = false;
 
        } else keydown = false;
    }
 
    I.onkeypress = function(e, key) {
        if (keydown) {
            keydown = false;
            return true;
        }
 
        e = e || event;
        key = e.keyCode || e.charCode;
 
        if (e.ctrlKey || e.altKey || !keyup || isValid(key)) return true;
        else {
            showCheckHint();
            return false;
        }
    }
 
    I.onkeyup = function() {
        keyup = true;
    }
 
    I.getCPE = function() {
        if (this.selectionStart) return (this.value.length - this.selectionStart); //Gecko
            else if (document.selection) { //IE
 
            var tr = document.selection.createRange();
            tr.moveEnd('character', this.value.length);
 
            return tr.text.length;
        }
    }
 
    I.setCPE = function(CaretPos) {
        if(this.setSelectionRange) this.setSelectionRange(this.value.length - CaretPos, this.value.length - CaretPos);
        else {
 
            var tr = this.createTextRange();
            tr.collapse(true);
            tr.move('character', this.value.length - CaretPos);
            tr.select();
        }
    }
 
    function myPaste() {
        setTimeout(function() {
            var val_arr = I.value.split('');
            var res_arr = [];
            var change = false;
 
            for(var i = 0; i < val_arr.length; i++)
                if (r.test(val_arr[i]) && VList != '') res_arr.push(val_arr[i]);
                else change = true;
 
            if (change) {
                var pos = I.getCPE();
                I.value = res_arr.join('');
                I.setCPE(pos);
 
                showCheckHint();
            }
        }, 0);
    }
 
    if (!window.opera) I.onpaste = myPaste;
    else I.addEventListener('input', myPaste, false);
 
    function showCheckHint() {
        if (hint) {
            if (dX == undefined) dX = 3;
            if (dY == undefined) dY = 1;
            if (spX == undefined) spX = 5;
            if (spY == undefined) spY = 2;
            if (time == undefined) time = 2500;
 
            if (VList != '') {
                var msg = 'Разрешено вводить только <strong>';
                var vlist_arr = VList.split('');
 
                for (i = 0; i < vlist_arr.length; i++) {
                    if (i > 0) msg += ' ';
 
                    if (vlist_arr[i] == 'a') msg += 'буквы русского и латинского алфавитов';
                    else if (vlist_arr[i] == 'z') msg += 'буквы латинского алфавита';
                    else if (vlist_arr[i] == 'я') msg += 'буквы русского алфавита';
                    else if (vlist_arr[i] == '9') msg += 'цифры';
                    else if (vlist_arr[i] == '*') msg += 'буквы русского и латинского алфавитов цифры';
                    else if (vlist_arr[i] == ' ') msg += 'знак пробела';
                    else msg += vlist_arr[i];
                }
 
                msg += '</strong>';
 
            } else var msg = 'Запрещено вводить какие либо символы';
 
            ShowHint(I, msg, dX, dY, spX, spY, time);
        }
    }
} 
