/* =======================================
 * Validate Объект для создания          |
 * правил обработки полей формы          |
 * Автор Андрей Сергеев <sasand@tut.by>  |
 *                                       |
 *========================================
*/
function Validate(FormId,ColorBAD,ColorOK, Msg)
{
        this.BoolVal = false;
        this.count = 0;
        this.form = document.getElementById(FormId);
        this.CheckValue = CheckValue;
        this.ColorBAD = ColorBAD;
        this.ColorOK = ColorOK;
        var DataObject = new Object();
        DataObject.BoolVal = new Array();
        DataObject.elements = new Array();
        DataObject.message = Msg;
        this.form.onsubmit = function()
        {
                var BoolVal = 'BAD';
                var sbm = true;
                var erContent = new String();
                erContent = DataObject.message + '\n';
                for(i = 0; i<DataObject.elements.length; i++)
                {
                        BoolVal = DataObject.elements[i].getAttribute("right");
                        
                        if(BoolVal == 'BAD')
                        {
                                DataObject.elements[i].style.borderColor = '#FF0000';
                                erContent += DataObject.elements[i].getAttribute("ERmsg") + '\n';
                                if(sbm == true)
                                {
                                        var FirstElement = DataObject.elements[i];
                                }
                                sbm = false;
                        }
                }
                if(FirstElement)
                {
                        var ERmess = FirstElement.getAttribute("ERmsg");
                        alert(erContent);
                        FirstElement.focus();
                }
                if(BoolVal == 'BAD')
                        return sbm;
                else if(BoolVal == 'OK')
                        return sbm;
        }
        this.AddRule = function (key,eventUs,imp,type,start,end,template,msg)
        {
                var element = document.getElementById(key);
                var right = document.createAttribute("right");
                var bdColor = document.createAttribute("BADColor");
                var okColor = document.createAttribute("OKColor");
                var mess = document.createAttribute("ERmsg");
                mess.value = msg;
                bdColor.value = this.ColorBAD;
                okColor.value = this.ColorOK;
                element.setAttributeNode(bdColor);
                element.setAttributeNode(okColor);
                element.setAttributeNode(mess);
                if(imp == true)
                {
                        right.value = 'BAD';
                }
                else
                {
                        right.value = 'OK';
                }
                if(element.value != '' && type != 'numeric')
                {
                        right.value = 'OK';
                }
                //alert(right);
                element.setAttributeNode(right);
                element.onblur = function () { CheckValue(type,start,end,template,element,imp);}
                eval ("element.on"+eventUs+" = function () {CheckValue(type,start,end,template,element,imp);}");
                DataObject.elements[this.count] = element;
                this.count++;
        }
}
function CheckValue(type,start,end,template,element,imp)
{
        var value = element.value;
        switch (type)
        {
                case 'text':
                        if(CheckText(start,end,value,imp)==false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'regexp':
                        if(CheckRegExp(start,end,value,imp,template)==false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'login':
                        template = '[\\w\\d_]';
                        if(CheckRegExp(start,end,value,imp,template)==false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'int':
                        if(CheckInt(start,end,value,imp) == false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'mail':
                        if(CheckEmail(value,imp) == false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'file':
                        if(CheckFile(value,imp,template,end) == false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'enum':
                        if(CheckEnum(value,imp,template,end) == false)
                        {
                                element.style.borderColor = element.getAttribute("BADColor");
                                element.setAttribute('right','BAD');
                        }
                        else
                        {
                                element.style.borderColor = element.getAttribute("OKColor");
                                element.setAttribute('right','OK');
                        }
                break;
                case 'numeric':
                	if(CheckNumeric(value,imp,start,end) == false)
                	{
                		element.style.borderColor = element.getAttribute("BADColor");
                		element.setAttribute('right','BAD');
                	}
                	else
                	{
                		element.style.borderColor = element.getAttribute("OKColor");
                        element.setAttribute('right','OK');
                	}
                break;
        }
}

function CheckText(start,end,value,imp)
{
        //alert ('CheckText');
        var longWord =/[\w\d_\-]{21,}/;
        if(value.match(longWord) != null)
        {
                MakeDIV('Please check your message for words longer than 20 symbols');
                return false;
        }
        else
        {
                var div = document.getElementById('divMSG');
                if(div)
                {
                        var parent = div.parentNode;
                        parent.removeChild(div);
                }
        }
        if(imp == true)
        {
                if(value.length >= start && value.length <= end)
                {
                        return true;
                }
                else return false;
        }
        else
        {
                if(value.length > 0)
                {
                        if(value.length >= start && value.length <= end)
                        {
                                return true;
                        }
                        else return false;
                }
                else return true;
        }
}

function CheckRegExp(start,end,value,imp,template)
{
        if(start > 0 || end > 0)
        {
                eval ('var newRegExp = /^'+template+'{'+start+','+end+'}$/');
        }
        else
        {
                eval ('var newRegExp = /('+template+')+/');
        }
        if(imp == true)
        {
                if(value.match(newRegExp) == null)
                {
                        return false;
                }
                else return true;
        }
        else
        {
                if(value.length > 0)
                {
                        if(value.match(newRegExp) == null)
                        {
                                return false;
                        }
                        else return true;
                }
                else return true;
        }
}

function CheckInt(start,end,value,imp)
{
        if(imp == true)
        {
                value = parseInt(value);
                if(value >= start && value <= end)
                {
                        return true;
                }
                else return false;
        }
        else
        {
                if(value.length > 0)
                {
                        value = parseInt(value);
                        if(value >= start && value <= end)
                        {
                                return true;
                        }
                        else return false;
                }
                else return true;
        }
}
function CheckEmail(value,imp)
{
        //alert("Hello");
        var RegExp = /[\w\d\'\s]*[\w\d][\w\d\,\.\-]*\@(?:[\w\d][\w\d\-]+\.)+[a-zA-Z]{2,4}/;
        if(imp == true)
        {
                if(value.match(RegExp) == null)
                {
                        return false;
                }
                else return true;
        }
        else
        {
                if(value.length > 0)
                {
                        if(value.match(RegExp) == null)
                        {
                                return false;
                        }
                        else return true;
                }
                else return true;
        }
}
function CheckFile(value,imp,template,end)
{
        var RegExpSpl = /\|/;
        var ExtRegExp = /[\w\d:\s\\_\-()]+\.([\w\d_]+)/;
        var file_ext = value.match(ExtRegExp);
        if(file_ext == null)
        {
                if(imp == true)
                {
                        return false;
                }
                else
                {
                        return true;
                }
        }
        var isValid = new Boolean(false);
        file_ext = file_ext[1];
        var ext = template.split(RegExpSpl,end);
        for(i = 0; i < ext.length; i++)
        {
                if(file_ext == ext[i])
                {
                        isValid = true;
                        break;
                }
                else isValid = false;
        }
        if(imp == true)
        {
                if(isValid == false)
                {
                        return false;
                }
                else
                {
                        return true;
                }
        }
        else
        {
                if(value.length > 0)
                {
                        if(isValid == false)
                        {
                                return false;
                        }
                        else
                        {
                                return true;
                        }
                }
                else return true;
        }
}

function MakeDIV(text)
{
        var div = document.getElementById('divMSG');
        if(div)
        {
                div.innerHTML = text;
        }
        else
        {
                var newDIV = document.createElement("div");
                newDIV.style['position'] = 'absolute';
                var x = document.body.scrollWidth / 2;
                var y = document.body.scrollTop + 20;
                newDIV.setAttribute('id', 'divMSG');
                newDIV.style['background'] = '#00FF00';
                newDIV.style['border'] = 'solid 1px #FF0000';
                newDIV.style['margin'] = '1px';
                newDIV.style['padding'] = '2px';
                newDIV.style['font'] = 'bolder 11px Tahoma';
                newDIV.style['color'] = '#FF0000';
                newDIV.innerHTML = text;
                document.body.appendChild(newDIV);
                newDIV.style['left'] = x + 'px';
                newDIV.style['top'] = y + 'px';
        }
}
function CheckEnum(value,imp,template,end)
{
        var RegExpSpl = /,/;
        var params = template.split(RegExpSpl,end);
        var isValid = new Boolean(false);
        if(imp == true && value.length == 0)
        {
                return false;
        }
        else if (imp == false && value.length == 0)
        {
                return true;
        }
        for (i = 0; i < params.length; i++)
        {
                if(value == params[i])
                {
                        isValid = true;
                        break;
                }
                else isValid = false;
        }
        if(imp == true)
        {
                if(isValid == true)
                {
                        return true;
                }
                else
                {
                        return false;
                }
        }
        else
        {
                if(value.length > 0)
                {
                        if(isValid == true)
                        {
                                return true;
                        }
                        else
                        {
                                return false;
                        }
                }
                else return true;
        }
}

function CheckNumeric(value,imp,start,end)
{
	if(imp == true && value.length == 0) return false;
	if(imp == true)
	{
		if(isNaN(value)) return false;
		if(value.length < start || value.length > end) return false;
		else return true;
	}
	else
	{
		if(value.length > 0)
		{
			if(value.length < start || value.length > start) return false;
			else return true;
		}
		return true;
	}
}
