//***********************************************************
//** FormÀÇ ValidationÀ» Ã¼Å©ÇÑ´Ù.
//**
//** - pyukcho (pyukcho@gmail.com)
//** --------------------------------------------------------
// ** - Sample : <input type='text' id='acc_email:m:e'  name='acc_email'>
// ** - 2006/07/14 - name ´ë½Å id¸¦ »ç¿ëÇÏ°Ô º¯°æ
// ** - 2006/08/16 - ajax post¸¦ À§ÇÑ checkbox °ª Ã³¸® º¯°æ
//************************************************************
function Validation(formObj) {
    this.form = formObj;            // ´ë»óÆû Æû
    this.postStr = "";

    // ³»ºÎ ¸Þ¼¼Áö ¼³Á¤
    this.message = new Dictionary();
    this.message.put(   "m"       , "It is the required field."); 	//¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÏ´Â °ªÀÔ´Ï´Ù.
    this.message.put(   "/"       , "The format is not correct.");	//ÀÔ·Â°ªÀÌ ÁöÁ¤µÈ Çü½Ä°ú ÀÏÄ¡ ÇÏÁö ¾Ê½À´Ï´Ù.
    this.message.put(   "f"       , "Actual number is required. ");	//ÀÔ·Â°ªÀÌ ½Ç¼öÇüÀÌ ¾Æ´Õ´Ï´Ù.
    this.message.put(   "i"       , "The field value requires integer.");//ÀÔ·Â°ªÀÌ Á¤¼öÇüÀÌ ¾Æ´Õ´Ï´Ù.
    this.message.put(   "l"       , "The field value requires long type. ");//ÀÔ·Â°ªÀÌ LongÇüÀÌ ¾Æ´Õ´Ï´Ù.
    this.message.put(   "H"       , "It should not include Korean letter.");//ÀÔ·Â°ªÀº ÇÑ±ÛÀ» Æ÷ÇÔÇÒ ¼ö ¾ø½À´Ï´Ù.
    this.message.put(   "h"       , "The field value  does not include Korean letter. ");//ÀÔ·Â°ªÀº ÇÑ±ÛÀÌ Æ÷ÇÔµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.
    this.message.put(   "e"       , "The email format is not correct. ");//Email Çü½ÄÀÌ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.
    this.message.put(   "y"       , "The format of the year is not correct.");//³âµµ Çü½ÄÀÌ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.
    this.message.put(   "d"       , "The format of the date is not correct.");//³¯Â¥Çü½ÄÀÌ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù.

    // form Object¸¦ Ajax·Î Àü´ÞÇÏ±â À§ÇØ¼­ Æû°´Ã¼¸¦ UTF8·Î ÀÎÄÚµùµÈ str ÇüÅÂ·Î ¹Ý°æÇÑ´Ù.
    this.getFormToPost = function() {
        return this.postStr;
    }
    
    // ÀüÃ¼ Æû Ã¼Å© 
    this.checkAll = function () {

        return this.checkAllInput() && this.checkAllSelect() && this.checkAllTextarea();
    }

    // <input type="text"> Ã¼Å©
    this.checkAllInput = function () {
        for (var i=0; i< this.form.elements.length; i++) {
            if (this.form.elements[i].tagName == "INPUT") {
                if ( !this.checkObject(this.form.elements[i])) return false;
            }
            
            // Ajax¿¡¼­ »ç¿ëÇÒ Post °ªÀ» ¼³Á¤
            var flag = true;
            var objValue= this.form.elements[i].value;
            if(this.form.elements[i].tagName == "INPUT" && this.form.elements[i].type == "radio") {
                flag     = this.form.elements[i].checked ? true : false;
            } else if (this.form.elements[i].tagName == "INPUT" && this.form.elements[i].type == "checkbox") {
                flag     = this.form.elements[i].checked ? true : false;
                // objValue = flag  ? "Y" : "N";
            } 
            
            this.postStr += flag ? this.form.elements[i].name + "=" + encodeURIComponent(objValue) + "&" : "";
        }
        return true;
    }

    this.checkAllSelect = function () {
        for (var i=0; i< this.form.elements.length; i++) {
            if (this.form.elements[i].tagName == "SELECT") {
                if ( !this.checkObject(this.form.elements[i])) return false;
            }
        }
        return true;
    }

    this.checkAllTextarea = function () {
        for (var i=0; i< this.form.elements.length; i++) {
            if (this.form.elements[i].tagName == "TEXTAREA") {
                if ( !this.checkObject(this.form.elements[i])) return false;
            }
        }
        return true;
    }

    // ÇÏ³ªÀÇ ÀÔ·ÂÇ×¸ñ¿¡ ´ëÇÑ Ã¼Å©
    this.checkObject = function(eleObj) {
        // var lio = eleObj.name.lastIndexOf(":");
        // id¸¦ ÀÖ´Ù¸é ID ±â¹ÝÀ¸·Î ¾ø´Ù¸é name ±â¹ÝÀ¸·Î ¿É¼Ç Ã¼Å©¸¦ ÇÑ´Ù. 
        var splitName = (isNullObject(eleObj.id) ? eleObj.name.split(":") : eleObj.id.split(":") );
        var objValue  = eleObj.value;
        if (splitName.length > 1) {
            // ÇØ´ç ObjectÀÇ validation°ª Ã¼Å© 
            var objValidationFlag = true;

            for ( var j = 1; j < splitName.length ; j++) {
                switch (splitName[j].charAt(0) ) {
                    // ÇÊ¼ö ÀÔ·Â Ã³¸® 
                    case "m":
                        objValidationFlag = isMandatory(objValue);
                        break;

                    // Regular Ç×¸ñ Ã¼Å© 
                    case "/":
                        objValidationFlag = isEmpty(objValue) ? true : isSearch(objValue, splitName[j]);
                        break;

                    // Float Ã¼Å©
                    case "f":
                        objValidationFlag = isEmpty(objValue) ? true : isFloat(objValue);
                        break;

                    // Int Ã¼Å©
                    case "i":
                        objValidationFlag = isEmpty(objValue) ? true : isInt(objValue);
                        break;

                    // Long Ã¼Å©
                    case "l":
                        objValidationFlag = isEmpty(objValue) ? true : isLong(objValue);
                        break;

                    // ÇÑ±ÛÀÌ Æ÷ÇÔµÇ¾î ÀÖ´Â°¡ °Ë»ç
                    case "h":
                        objValidationFlag = isEmpty(objValue) ? true : isHangul(objValue);
                        break;

                    // ÇÑ±ÛÀÌ Æ÷ÇÔµÇ¾î ÀÖÁö ¾ÊÀº°¡ Ã¼Å©
                    case "H":
                        objValidationFlag = isEmpty(objValue) ? true : !isHangul(objValue);
                        break;

                    // Email Ã¼Å©
                    case "e":
                        objValidationFlag = isEmpty(objValue) ? true : isEmail(objValue);
                        break;

                    // ³âµµÃ¼Å©
                    case "y":
                        objValidationFlag = isEmpty(objValue) ? true : isYear(objValue);
                        break;
                        
                    // ³¯Â¥Ã¼Å©
                    case "d":
                        objValidationFlag = isEmpty(objValue) ? true : isDate(objValue);
                        break;                        
                }
                
                var divMsgId = 'divValid_'+eleObj.id;
                var divMsg = document.getElementById(divMsgId);
                
                var divAltId = 'divAlert_'+eleObj.id;
                var divAlt	= document.getElementById(divAltId);
                
                if(!objValidationFlag) {
                	var msg = ""; //"[" + (isNullObject(eleObj.alt) ? splitName[0] : eleObj.alt) + "]" + " Field => \n";
					if(divAlt)
					{
						msg += divAlt.innerText;	
					}
					else
					{
						msg += this.message.get(splitName[j].charAt(0));
					}

                    if(divMsg)
                    {
                    	//divMsg.innerHTML = msg;
                    	divMsg.style.display = 'block';
                    }
                    else alert(msg);
                    
                    try{eleObj.focus();} catch (e) {}
                    return false;   
                }
                else
                {
                	if(divMsg)divMsg.style.display = 'none';
                }
            }

            // Á¸ÀçÇÏ´Â°¡ Ã¼Å©
            var intendedObj = document.getElementsByName(splitName[0])[0];
            if (isNullObject(intendedObj)) {
                // input Å¸ÀÔÀÇ »õ·Î¿î °´Ã¼ »ý¼º
                var newObj = document.createElement("INPUT");
                newObj.type  = "hidden";
                newObj.name  = splitName[0];
                newObj.id    = splitName[0];
                newObj.value = objValue

                this.form.appendChild(newObj);
            } else {
                // TODO: µ¿ÀÏ ÀÌ¸§ÀÇ °´Ã¼°¡ µÎ°³ ÀÌ»óÀÏ ¼ö ÀÖ´Ù.
                // - Áö±ÝÀº ÇÏ³ª¸¸ ¸¸µç´Ù. 
                intendedObj.value = objValue
            }
            
        }

        return true;
    }
}

//***********************************************************
//** °¢Á¾ Validation Ã¼Å© ÇÔ¼ö 
//***********************************************************
function check_m(el) {
    return isMandatory(el) ;
}

function isMandatory(el) {
    return (el == "" || el == null) ? false : true;
}

function isSearch(el, pattern) {
    eval("var fm = " + pattern + ";");
    var p = el.search(fm);
    return (p == -1 ? false : true);    
}

function isFloat(el) {
    if (isNaN(parseFloat(el))) {
        return false;
    }
    return true;
}

function isInt(el) {
    if (isNaN(parseInt(el)) ||
        (parseInt(el) != parseFloat(el))) {
        return false;
    }
    return true;
}

function isLong( el) {
    return isInt(el);
}

function isNullObject(el){
    return (el == "undefined" || el==null) ? true : false;
}

function isEmpty(el){
    return ( el == null  || el == "" ) ? true : false;
}

function isEmail(el) {
    var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i

    return (el.search(filter) == -1 ? false : true);
}

// ÇÑ±Û Ã¼Å©ÇÏ´Â°ÍÀÌ ¾Æ´Ï¶ó À¯´ÏÄÚµåÃ¼Å©ÇÏ´Â°ÍÀÌ³×.. ÂÁ.. ^^;;
// ¸Ó Å©°Ô ¹®Á¦´Â ¾ø°ÚÁö... 
function isHangul(el) {
    return (escape(el).search(/%u/i) == -1 ? false : true );
}

function trim(str){
     return str.replace(/(^\s*)|(\s*$)/ig, "");
 }

function isYear(str) {
    return isSearch(str, "/^\d{0,4}$/i");      // <- /^\d{4}$/i
}

function isDate(str) {
    return isSearch(str, "/^(\d{1,4})\\/((0[1-9])|(1[0-2]))\\/((0[1-9])|([1-2][0-9])|(3[0-1]))$/i");
} 
//******************************************************************
//*** Dictionary(^^) / HashMap(^^) ºñ½º¹«¸® -.-;;
// - ¸Ó ÇÏ´Ù°¡ ¸¸µé¾ú´Âµ¥....ÂÁ...´ë·« Àß¾²¸é ÁÁÀ½...¤»¤»
// - pyukcho
// - keys : ... ex] for( var key in object.keys())
//******************************************************************
function Dictionary () {
    this.nodeObject = new Object();
    this.count=0;


    this.put = function (key, value) {
        obj = this.nodeObject;
        this.searchFlag = 0;

        var addFlag = true;
        for(var n in obj) {
            if(n == key) {
                obj[key] = value;
                addFlag = false;
            }
        }

        if(addFlag) {
            obj[key] = value;
            this.count++;
        }
    }

    this.get = function(key) {
        obj = this.nodeObject;

        return obj[key];
    }

    this.keys = function(){
        return this.nodeObject;
    }

    this.del = function(key){
        this.put(key, null);
        this.count--;
    }
    
    this.size = function(){
        return this.count;
    }
}

function fn_valid_submit(f)
{
	if(!f)return;
	if (!fn_validation(f)) return;
	f.submit();	
}
function fn_validation(f)
{
	if (!new Validation(f).checkAll()) return false;
	else return true;
}

function fn_valid_ajaxSubmit(f,rtnFunc)
{
	if(!f)return;
	if(rtnFunc==null || rtnFunc=="")rtnFunc = "fn_response_page";
	if (!fn_validation(f)) return;
	else ajaxSubmit(f,rtnFunc);	
}

