function include(libJS) {
    var xhttpT = getXHTTPTransport();
    xhttpT.open("GET", "admin/scripts/" + libJS.replace(/\./g, "/") + ".js", false);
    xhttpT.send(null);
    var responseText = xhttpT.responseText;
    var resp = null;
    try {
        resp = (typeof execScript != "undefined") ? execScript(responseText) : (this.eval ? this.eval(responseText) : eval(responseText));
    } catch(e) {
        return false;
    }
    return resp;
}

function getXHTTPTransport() {
    var result = false;
    var functs = [function() {
        return new XMLHttpRequest();
    },function() {
        return new ActiveXObject("Msxml2.XMLHTTP");
    },function() {
        return new ActiveXObject("Microsoft.XMLHTTP");
    }];
    for (var i = 0; i < functs.length; i++) {
        try {
            result = functs[i]();
            break;
        } catch(e) {
        }
    }
    return result;
}

//Подключение библиотеки ajax/core/jsonrpc.js
if (typeof (JSONRpcClient) == "undefined"){
    include('ajax/core/jsonrpc');
}
if (typeof (jsonrpc) == "undefined"){
    var jsonrpc = new JSONRpcClient(window.getBaseUrl() + "util/ajaxRpc.sx");
}
var maskFactory=null;
var pos = [];
var errFontColor="red";
var commonFontColor="black";
var errBorderColor="1px solid "+errFontColor;
var commonBorderColor="1px double buttonshadow";
var regExpMarker = "RegExp=";
var atTheEnd = false;
var nonSimbolFlag = false;
var onFocusMessage=false;
var rSimbolsArray=[];
var rndSimbol="";

if ((typeof (maskFactory) == "undefined") || maskFactory == null) getMaskFactory();
function getMaskFactory() {
  maskFactory = jsonrpc.maskdata.getFactory();
  rndSimbol=maskFactory.rndSymbol;
  rSimbolsArray= maskFactory.specialSymbols.set;
}

function getCaretPos(ev) {
    var e = window.event ? window.event : ev;
    var field = window.event ? e.srcElement : e.target;
    if (field == null) return;
    var caretPos = 0;
    if (document.selection) {  // IE Support
        field.focus();
        var oSel = document.selection.createRange(); // To get cursor position, get empty selection range
        oSel.moveStart('character', -field.value.length); // Move selection start to 0 position
        caretPos = oSel.text.length; // The caret position is selection length
    } else if (field.selectionStart || field.selectionStart == '0') {   // Firefox support
        caretPos = field.selectionStart;
    }
    pos[field] = caretPos;
}
function setCaretPos(field, pos) {
    if (!field) return;
    if (document.selection) {
        var tr = field.createTextRange();
        if (tr) {
            tr.moveStart("character", pos);
            tr.collapse();
            tr.select();
        }
    } else if (field.selectionStart || field.selectionStart == '0') {
        field.selectionStart = pos;
        field.selectionEnd = pos;
        field.focus();
    }
}
function checkCaretPos(ev) {
    var e = window.event ? window.event : ev;
    if (e.ctrlKey && (e.keyCode == 67 || e.keyCode == 86 || e.keyCode == 88))  return false;
    if ((e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 33 && e.keyCode <= 37) || (e.keyCode >= 186 && e.keyCode <= 192) || (e.keyCode >= 219 && e.keyCode <= 222) || (e.keyCode >= 96 && e.keyCode <= 107) || (e.keyCode >= 109 && e.keyCode <= 111) || e.keyCode == 8 || e.keyCode == 13 || e.keyCode == 9 || e.keyCode == 32 || e.keyCode == 39 || e.keyCode == 46) {
    } else return false;
    var src = window.event ? e.srcElement : e.target;
    var sMask = src.getAttribute("mask");
    if (sMask == null || trim(sMask) == "") return true;
    atTheEnd = false;
    var p = ( typeof(pos[src]) == "undefined") ? 0 : pos[src];

    nonSimbolFlag = true;
    switch (e.keyCode) {
        case 13: return true;
        case 9:  if (src.addEventListener) {
            src.blur();
        } return true;
        case 33: p = 0; break;
        case 34: p = src.value.length; break;
        case 35: p = src.value.length; break;
        case 36: p = 0; break;
        case 37: if (p > 0) p--; break;
        case 39: if (p < src.value.length) p++; break;
        case 8: if (p > 0) pos[src] = p - 1; return deleteCharOnMask(src, 1);
        case 46: return deleteCharOnMask(src);
        default : nonSimbolFlag = false; if (p >= sMask.length) {
            atTheEnd = true;
            return true;
        } //else p++;
    }
    pos[src] = p;
    if (nonSimbolFlag && src.addEventListener) setCaretPos(src, pos[src]);
    return true;
}

function existIn(obj, search) {
  return obj && typeof(obj)=="object" && typeof(obj[search])!="undefined";
}

function deleteCharOnMask(field, m) {
    if (field == null) return true;
    var str = field.value;
    var sMask = field.getAttribute("mask");
    if (sMask == null || trim(sMask) == "") return true;
    var p = pos[field];

    if (existIn(rSimbolsArray, sMask.charAt(p)) || sMask.charAt(p) == rndSimbol) {
        field.value = str.substring(0, p) + sMask.charAt(p) + str.substring(p + 1, str.length);
        setCaretPos(field, p);
    } else {
        if (m) setCaretPos(field, p);
    }
    return false;
}

function applyMask(ev) {
    if (nonSimbolFlag) return false;
    var e = window.event ? window.event : ev;
    var field = window.event ? e.srcElement : e.target;
    var str = field.value;
    var strLen = str.length;
    var sMask = field.getAttribute("mask");
    if (sMask == null || trim(sMask) == "") return true;
    if (strLen > sMask.length || atTheEnd) return false;

    var p = pos[field] = pos[field] + 1;
    var pm = p - 1;

    var code = window.event ? e.keyCode : e.which;
    var keyTyped = String.fromCharCode(code);

    if (!existIn(rSimbolsArray, sMask.charAt(pm)) && (sMask.charAt(pm) != rndSimbol) && (field.value.charAt(pm) == sMask.charAt(pm))) {
        setCaretPos(field, p);
        pm = p;
        p = pos[field] = p + 1;
    }

    if (sMask.charAt(pm) == rndSimbol) {
        var test = jsonrpc.maskdata.checkRange(keyTyped, sMask, pm);
        if (test) {
            field.value = field.value.substring(0, p - 1) + keyTyped + field.value.substring(p, strLen);
            setCaretPos(field, p);
        }
        return false;
    }

    var flag = testSymbol(sMask.charAt(pm), keyTyped); //jsonrpc.maskdata.testSymbol(sMask.charAt(pm), keyTyped);
    if (flag) {
        field.value = field.value.substring(0, p - 1) + keyTyped + field.value.substring(p, strLen);
        setCaretPos(field, p);
        return false;
    }

    pos[field] = pos[field] - 1;
    return false;
}
function testSymbol(maskSimbol, c) {
   var map = maskFactory.symbolMap.map[maskSimbol];
   if (map) var ranges=map.charRanges;
   if (typeof(ranges)=="undefined") return jsonrpc.maskdata.testSymbol(maskSimbol, c);
   var result = ranges == null;
   for(var i=0; !result && i < ranges.length; i++) {
        result = ranges[i].fromChar <= c && c <= ranges[i].toChar;
   }
  return result;
}
function clearAllSpecialSimbols(str, mask) {
    return (!str || trim(str) == "")?"":!mask ? str : jsonrpc.maskdata.getValue(mask, str);
}
function parseMask(sMask) {
    return sMask && sMask.indexOf('{') > -1 ? jsonrpc.maskdata.parseMask(sMask) : (typeof(sMask)=="undefined")?null:sMask;
}

function testValueByMask(field, flag, sMask, mode) {
    if (!field) return false;
    var mask=null;
    if (sMask == null) {
        mask = field.getAttribute("mask");
        sMask = parseMask(mask);
    }
    if (sMask == null || trim(sMask) == "") return true;
    if (mask!=null && sMask!=mask ) field.setAttribute("mask", sMask);

    var fieldType = (field.tagName.toUpperCase() == "INPUT"); // input-true; span-false;
    var str = (fieldType) ? field.value : field.innerHTML;
    if (str == null || trim(str) == "") {
        return true;
    }
    if (str == sMask) {
        if (flag) {
            if (fieldType) field.value = ""; else field.innerHTML = "";
        }
        return true;
    }
    var res = jsonrpc.maskdata.validate(sMask, str);

    if (res == null) {
        return false;
    }
    if (mode) {
        res = res.split(rndSimbol).join('');
    }
    if (fieldType) field.value = res; else field.innerHTML = res;
    pos[field] = 0;
    return true;
}

function initMask(field) {
    if (field == null) return;
    if (field.getAttribute("regexp_rule") != null) return;
    var re = eval("/^(" + regExpMarker + ")+/");
    var mask = field.getAttribute("mask");

    //if this is not mask but RegExp then we handle it in other way.
    if (mask && mask.match(re) != null) {
        field.setAttribute("regexp_rule", mask.substring(regExpMarker.length));
        initRegExpValidating(field);
        return;
    }

    var sMask = parseMask(mask);
    if (sMask == null || trim(sMask) == "") return;
    if (sMask!=mask ) field.setAttribute("mask", sMask);

    var c,badValue=false;
    if (field.value == "" || trim(field.value) == "") field.value = sMask;
    else if (!testValueByMask(field, null, sMask, null)) {
        if(!field.getAttribute("firtsCheck")) {
            onFocusMessage=true;
            if(confirm("Значение поля: "+field.value+"- не соответствует формату ввода: "+sMask+" !\nОчистить поле?")) {
                if (c=field.getAttribute("oldColor")) {
                    field.style.color=c;
                }
                field.value = "";
                if (field.style.border.indexOf(errFontColor) != -1) field.style.border = commonBorderColor;
                field.setAttribute("firtsCheck",true);
        //     field.focus();
                return;
            } else {
                field.setAttribute("oldColor",(field.style.color!="")?field.style.color:commonFontColor);
                field.style.color=errFontColor;
                field.setAttribute("readonly",true);
                badValue=true;
            }
        }
    }

    if (!badValue) field.setAttribute("firtsCheck",true);
    onFocusMessage=false;

    if (field.addEventListener) {
       if (!badValue) field.addEventListener("click", getCaretPos, false);
        field.addEventListener("blur", hideEvents, false);
    } else if (field.attachEvent) {
        if (!badValue) field.attachEvent("onclick", getCaretPos);
        field.attachEvent("onblur", hideEvents);
    }
    if (!badValue) {
        field.onkeydown = function (event) {
            return checkCaretPos(event);
        };
        field.onkeypress = function (event) {
            try {
                if (setChanged) setChanged();
            } catch(e) {}
            return applyMask(event);
        };
    }
    field.oncontextmenu = new Function('return false');
    pos[field] = 0;
    setCaretPos(field, pos[field]);
}
function hideEvents(ev) {
    var e = window.event ? window.event : ev;
    var field = window.event ? e.srcElement : e.target;
    if (!field) return;
    if (field.removeEventListener) {
        field.removeEventListener("click", getCaretPos, false);
        field.removeEventListener("contextmenu", new Function("return false"), true);
    } else if (field.detachEvent) {
        field.detachEvent("onclick", getCaretPos);
        field.detachEvent("oncontextmenu", new Function("return false"));
        field.detachEvent("onblur", hideEvents);
    }

    //если значение поля было невалидно, то его не редактировали.
    //поэтому повторно его не проверяем.
    if (field.getAttribute("readonly")) {
        field.removeAttribute("readonly");
        return;
    }
    if (field.onblur == null || typeof(field.onblur) == "undefined") {
        if (validateField(field,((onFocusMessage)?true:null),true) == 1) {
            if (field.style.border.indexOf(errFontColor) != -1) field.style.border = commonBorderColor;
        }
        else field.style.border = errBorderColor;
    }
}
function validateField(field, skipMess, skipClean) {
    if (field == null) return -1;
    if (field.value == "") return 1;
    if (!testValueByMask(field, true, null/*mask*/, true)) {
        if (!skipMess) {
           var title = field.getAttribute("attrTitle");
           var titleStr=(title != null && title != "") ? ' для поля: "' + title + '"':'';
           alert("Введено некорректное значение" + titleStr + ".\nФормат ввода: " + field.getAttribute("mask"));
        }
        return 0;
    } else {
          if (!skipClean) field.value = clearAllSpecialSimbols(field.value, field.getAttribute("mask"));
    }
    return 1;
}

//Оставлена для совместимости со старыми проектами
function showFullValue(field) {
    if (!field) return;
    if (!testValueByMask(field, null, null, true)) {
        if (field.tagName.toUpperCase() == "INPUT") field.value = ""; else field.innerHTML = "";
    }
}

/*
function findAndShow(emptyNode) {
    var j,m,node;
    var re = eval("/^(" + regExpMarker + ")+/");
    for (j = 0; (node = document.getElementsByTagName("input").item(j)); j++) {
        if (node.type != "text") continue;
        m = node.getAttribute("mask");
        if (m == null) continue;
        if (m.match(re) != null) {//if this is not mask but RegExp then we handle it in other way.
            node.setAttribute("regexp_rule", m.substring(regExpMarker.length));
            node.removeAttribute("mask");
            initRegExpValidating(node);
//            continue;
        }
//        if (node.value == "") continue;
//        showFullValue(node);
    }
    for (j = 0; (node = document.getElementsByTagName("span").item(j)); j++) {
        m = node.getAttribute("mask");
        if (m == null) continue;
        if (emptyNode == null && (node.innerHTML == "" || node.innerHTML == "&nbsp;")) continue;
        if (m.match(re) != null) {//if this is not mask but RegExp then we handle it in other way.
            node.setAttribute("regexp_rule", m.substring(regExpMarker.length));
            node.removeAttribute("mask");
            initRegExpValidating(node);
//            continue;
        }
 //       showFullValue(node);
    }
}

if (typeof(root) == "undefined") {
    var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
}
if (root) {
    if (root.addEventListener) root.addEventListener("DOMContentLoaded", findAndShow, false); else if (root.attachEvent) root.attachEvent("onload", findAndShow);
} */


/* ------------------- test text field value by regular expression  -------------------------------*/

function validateFieldByRegExp(field, skipMess) {
    if (field == null || field.nodeType != 1 || field.tagName.toLowerCase() != "input" || field.type != "text") return true;
    var regexp_rule = field.getAttribute("regexp_rule");
    if (regexp_rule == null) return true;

    var str = field.value;
    var regexp = eval("/" + regexp_rule + "/g");
    var correct = (str == "") ? true : str.match(regexp);
    if (correct == null) {
        if (!skipMess) {
            var msg = "Проверьте правильность ввода поля " + ((field.getAttribute("attrTitle") != null ) ? field.getAttribute("attrTitle") : field.name) + "\nЕго значение не соответствует правилу ввода!";
            if (field.getAttribute("inline") != null){
                var hintNode = null;
                var elems = field.parentNode.getElementsByTagName("div");
                for(var p=0;p<elems.length;p++){
                    if (elems[p].className = "hint"){
                        hintNode = elems[p];
                        break;
                    }
                }
                if (!hintNode){
                    hintNode = document.createElement ("DIV");
                    hintNode.className = "hint";
                    hintNode.innerHTML = msg;
                    hintNode.style.background = "#fffcd1";
                    hintNode.style.border = "1px solid #b7b598";
                    hintNode.style.color = "#444";
                    hintNode.style.padding = "2px 5px";
                }

                if (field.nextSibling) {field.parentNode.insertBefore(hintNode, field.nextSibling);}
                else {field.parentNode.appendChild(hintNode);}
            } else {
                alert(msg);
            }
            field.style.border = errBorderColor;
            field.focus();
        }
        return false;
    } else {
        if (field.style.border.indexOf(errFontColor) != -1) field.style.border = commonBorderColor;
        var tmp = "";
        for (var i = 0; i < correct.length; i++) {
            tmp += correct[i];
        }
        field.value = tmp;
        return true;
    }
}

function applyRegExpRule(ev) {
    var e = window.event ? window.event : ev;
    var field = window.event ? e.srcElement : e.target;
    if (field == null) return;
    validateFieldByRegExp(field);
}

function initRegExpValidating(obj) {
    if (!obj) return;
    var regexp_rule = obj.getAttribute("regexp_rule");
    if (regexp_rule == null || regexp_rule == "") return;
    if (obj.getAttribute("setBlur") != null) return;
    if (obj.getAttribute("mask")) obj.removeAttribute("mask");
    //	alert(j+") "+obj.name+"\n\n"+onBlurFunc);

    var onBlurFunc = (obj.addEventListener) ? obj.onblur : obj.getAttribute("onblur");
    if (onBlurFunc == null || typeof(onBlurFunc) != "function") {
        if (obj.addEventListener) {
            obj.addEventListener("blur", applyRegExpRule, false);
        } else if (obj.attachEvent) {
            obj.attachEvent("onblur", applyRegExpRule);
        }
    } else {
        if (!obj.originalBlurFunc) {
            obj.originalBlurFunc = onBlurFunc;
            obj.onblur = function(event) {
                applyRegExpRule(event);
                var ret = (this.originalBlurFunc != null) ? this.originalBlurFunc() : null;
                return (typeof(ret) == "undefined" || ret == null) ? true : ret;
            };
        }
    }
    obj.setAttribute("setBlur", true);
    if (obj.value == "") return;
    if (!validateFieldByRegExp(obj, true)) obj.value = "";
}

