﻿if (typeof jQuery!="undefined") $(document).ready(function() {
    if(typeof jQuery.datepicker!="undefined")
    {/* Attach datepicker for all date field */
        $('input[type=text][csDataType=Date]').each(
                function(){
                if ($(this).attr("readonly")!=""||$(this).attr("disabled")!="") return;
                $(this).datepicker({ showOn: 'button',
                buttonImage: Image_Resources['calendar.gif'],buttonImageOnly: true,dateFormat: 'dd/mm/yy',
                monthNames: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
                monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
                dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
                changeMonth: true,
			    changeYear: true
                ,onSelect: function(dateText, inst) {//raise event after select
                if (document.getElementById($(this).attr("id").replace("txt","cval"))==null)  
                    document.all?$(this).get(0).fireEvent("onblur"):$(this).blur();//raise blur event if validator not found
                else
                    document.all?$(this).get(0).fireEvent("onchange"):$(this).change();//raise change event for validator
                }
                ,beforeShow: function(input, inst){
                    input.value=FormatDateTimeEx(input.value);//format value before show select   
                    }           
                })}); 
        $('img.ui-datepicker-trigger').css({'cursor' : 'pointer'});// set cursor or some style for image
    }
    /* customize ui style */
    jQuery('<style type="text/css">'+
    '.ui-datepicker-next .ui-icon {background: url("'+Image_Resources['next.gif']+'") no-repeat;}'
    +'.ui-datepicker-prev .ui-icon {background: url("'+Image_Resources['prev.gif']+'") no-repeat;}'
    +'.ui-datepicker select.ui-datepicker-month {width:60%}'
    +'.ui-datepicker select.ui-datepicker-year {width:40%}'
    +'img.ui-datepicker-trigger {margin:0 2px;vertical-align:-2px;}'
    +'.ui-dialog .ui-dialog-titlebar-close span {background:'+"url("+Image_Resources['close.gif']+") center center"+'}' 
    +'.ui-dialog .ui-dialog-content {padding:0.5em;}'
    +'</style>').appendTo('head');
    /* Set tooltip for textbox */
    $('input[type=text][csDataType=Text]').attr("title",$(this).val());
    $('input[type=text][csDataType=Text]').blur(function(){$(this).attr("title",$(this).val());});
    /* Auto set required sign */
    $("table[class^=FMIS_table] td label").each(function(){
        var ctl=Control_GetByID($(this).attr("for"));
        if (ctl!=null&&$(ctl).attr("csrequired")=="true") $(this).after("&nbsp;<span class=\"FMIS_required\">*</span>");
    });
    /* Table row hover*/
    $("table.FMIS_table_display tr, table.FMIS_grid tr").hover(
                  function(){$(this).css("background-color","#cdcdff");}, 
                  function(){$(this).css("background-color","");}
                );
    /* Fix Default link button in FireFox */
    if (typeof WebForm_FireDefaultButton!='undefined')
    {
        var old_FireDefault = WebForm_FireDefaultButton;
        WebForm_FireDefaultButton = function(event, target) {
            var b = document.getElementById(target);
            if (b && typeof (b.click) == 'undefined') {
                b.click = function() {
                    var result = true;
                    if (b.onclick) result = b.onclick();
                    if (typeof (result) == 'undefined' || result) eval(b.getAttribute('href'));
                }
            }
            return old_FireDefault(event, target);
        }
    }
});
/**/
$(document).ready(function(){
	if ($(".ad_float").length>0)
    {Ad_Init();$(window).bind("resize",Ad_Init);}
});
function Ad_Init()
{
if ($(window).width()>1300)
{
    $(".ad_float").width(($(window).width()-1010)/2);
    $("#ad_float_left").css("left",2);
    $("#ad_float_left").show();
    $("#ad_float_right").css("left",$(window).width()-$("#ad_float_right").width()-2);
    $("#ad_float_right").show();
    $(window).bind("scroll",function(){if (!vScroll){vScroll=true;window.setTimeout(Ad_Float,330);}});
}
else
{
    $(".ad_float").hide();$(window).unbind("scroll");
}
}
var vScroll;
function Ad_Float()
{
    var a=$(document).scrollTop();    
    $("#ad_float_left").animate({top:a},500);    
    $("#ad_float_right").animate({top:a},500);    
    vScroll=false;
}
/*---------------------
<Other_Function>
---------------------*/
String.prototype.trim = function() {
//extend trim function for String class
    var str = this.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
};
function delete_confirm(vtype, vname) {
    //return confirm("Are you sure you want to delete "+vtype+" '"+vname+"'");
    if (vname != "")
        return confirm("Bạn có thực sự muốn xóa " + vtype + " '" + vname + "' không?");
    else
        return confirm("Bạn có thực sự muốn xóa " + vtype + " đang chọn không?");
}
function msg_confirm(vdesc) {
    //return confirm("Are you sure you want to delete "+vtype+" '"+vname+"'");
    return confirm("Bạn có thực sự muốn " + vdesc + " không?");
}
//
var Dialog_Func = [];
//
function Dialog_Init(dialogID,height,width)
{
    var objDialog=$("#"+dialogID);
    objDialog.dialog({autoOpen: false, height: height,width:width, modal: true});
}
function Dialog_Open(dialogID,retFunc)
{
    var objDialog=$("#"+dialogID);
    var objFrame = $(objDialog).children("iframe:first");
    if (objFrame.attr("src")==""||objFrame.attr("src")==null)
    {
        $("#"+dialogID).dialog({close:function(){
        $("#"+dialogID).children("iframe:first").removeAttr("src");
        }});
    }
    else
    { 
        if (objFrame.contents().get(0).location=="about:blank")
        {
            objFrame.css("background","url(./images/dnnanim.gif) no-repeat center center");
            objFrame.load(function(){$(this).css("background","");});
            objFrame.attr("src",objFrame.attr("src"));
        }
    }
    //
    objDialog.dialog("open");
    if (objFrame.attr("src")==""||objFrame.attr("src")==null)
    {
        objFrame.css("background","url(./images/dnnanim.gif) no-repeat center center");
        objFrame.load(function(){$(this).css("background","");});
        if (objDialog.attr("src")!=null)
        objFrame.attr("src",objDialog.attr("src"));
    }
    if (retFunc!=null) Dialog_Func[dialogID] = retFunc;
    return false;
}
function Dialog_Cancel(dialogID)
{
    var objDialog=$("#"+dialogID);
    $(objDialog).dialog("close");
    return false;
}
function Dialog_OK(dialogID,res)
{
    var objDialog=$("#"+dialogID);
    $(objDialog).dialog("close");
    var func = Dialog_Func[dialogID];
    try
    {
	if (func!=null) func(res);
	else document.location=document.location;   
    }
    catch(err)
    {
	alert("<Error in dialog return function>\n" + new String(err));
    }
}
function Dialog_AutoSize(dialogID,h)
{
    $("#"+dialogID).dialog({height:h});
}
//
function Element_scrollX(elementID,scrollAmount)
{
    var objElement=$("#"+elementID);
    var x=objElement.scrollLeft()+scrollAmount;
    var s = objElement.scrollLeft();
    objElement.animate({scrollLeft:x},function()
    {if (scrollAmount>0&&objElement.scrollLeft()==s)
        objElement.animate({scrollLeft:0});});    
    
}
//
function Control_Focus(ctlID)
//set control focus and scroll into view
{
    var objCtl;
    if (typeof(ctlID)=="string"){
        if (ctlID.substr(0,1)!="#") ctlID="#"+ctlID;objCtl= $(ctlID);
    }
    else
        objCtl= $(ctlID);
    if (objCtl!=null){objCtl.focus();
        var iTop=objCtl.offset().top+objCtl.height()+30;
        if ($(window).height()+$(window).scrollTop()<=iTop) window.scrollTo(0,iTop);    
        if(objCtl.value==objCtl.defaultValue){objCtl.select();}
    }
}
function Control_FirstFocus(ctlID)
//find first input control in element
{
    var objCtl;
    if (typeof(ctlID)=="string") 
        objCtl= $("#"+ctlID);
    else
        objCtl= $(ctlID);
    var objFirst;
    objFirst=objCtl.find(":input:visible:enabled:first");
    if (objFirst==null)
        objFirst=objCtl.find("textarea:first");        
    if (objFirst.attr("id")!=null)
        Control_Focus(objFirst);
}
function Control_GetByID(serverID,parentID)
//get control by server id in parent element (default is document element) 
{
    var objParent;
    if (typeof(parentID)=="string"&&parentID.substr(0,1)!="#")         
        objParent= $("#"+parentID);
    else if (parentID==null)
        objParent=$(document);
    else
        objParent= $(parentID);
        
    var objFirst;
    objFirst=objParent.find("[id$="+serverID+"]:first");
    return objFirst;
}
function Control_GetServerID(objControl)
//get control server id from client id
{
    var sID=""+$(objControl).attr("id");
    sID=sID.substr(sID.lastIndexOf("_")+1,100);
    return sID;  
}
function Control_SetDefault(objControl,defaultId)
//set default action of control when press Enter
{
    $(objControl).keypress(function(event) {
        Control_Default(event,defaultId,$(objControl));  
    }); 
}
function Control_Default(event,defaultId,parentElement)
//handle defaul action when press Enter
//using with attribute onkeypress="javascript:Control_Default(event,'defaultId',this)"
{
    var code = event.keyCode ? event.keyCode : event.which;
    //alert(code);
    if (code  == '13') 
    {
        var src = event.srcElement||event.target;
        if (!src||(src.tagName.toLowerCase()!="textarea"))//ignore when press on textarea
        {
            CancelEvt(event);  
            var objDefault;
            if (typeof defaultId=="string")
            {    
                if (defaultId.substr(0,1)!="#")
                    objDefault=Control_GetByID(defaultId,parentElement)   
                else
                    objDefault=$(defaultId);
            }
            if (objDefault==null) return;
            var h=$(objDefault).attr("href");
            if (h!=null&&h!="")
                eval(h);
            else
                $(objDefault).click();       
            return false;          
        }
        else
            return true;
    }
}
function UnderConstruction() {
    alert("Chức năng đang được xây dựng");
    return false;
}
function RefreshImage(img) 
//refresh image with random query for bypass client cache
{
    var newimage = new Image();
    newimage.src = img.src + "?" + Math.floor(Math.random() * 11);
    img.src = newimage.src;
}
function getParameter(parameterName)
//get param value from url query string
{
    parameterName = parameterName.toLowerCase();
    var queryString = window.location.search.substring(1);
    var parameters = new Array();
    var pos = -1;
    parameters = queryString.split('&');
    for (var i = 0; i < parameters.length; i++)
    {
        pos = parameters[i].toLowerCase().indexOf(parameterName + "=");
        if (pos == 0)
        {
            var parameterValue = parameters[i];
            parameterValue = parameterValue.substring(parameterValue.indexOf("=") + 1);
            return parameterValue;
        }
    }
    return "";
}
function CancelEvt(evt)
//cancel event on object
{
    evt = evt || window.event;
    if (evt.stopPropagation){
        evt.stopPropagation();
        evt.preventDefault();
    }else if(typeof evt.cancelBubble != "undefined"){
        evt.cancelBubble = true;
        evt.returnValue = false;
    }
    return false;
}
/*
</Other_Function>
*/
/*
<Cookie_Function>
*/
function Cookie_GetValue(c_name)
//Get cookie value
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    {
    c_start=c_start + c_name.length+1;
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    }
  }
return "";
}
function Cookie_SetValue(c_name,value,expiredays)
//Set cookie value
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}
/*
</Cookie_Function>
*/
//
/*
<Message_Popup>
*/
function Msg_Popup(sIcon, sMsg, bStick) {
    //check cookie for disable show popup message when user click Back on web browser
    var MsgToken=""+Cookie_GetValue("MsgToken");
    if (MsgToken!=""&&MsgToken!=$("#MsgToken").val()) return;
    //
    if (msgDisplay)
    { 
        if (bStick)
        {   if (vShow) {setTimeout(function() { Msg_Popup(sIcon, sMsg); },500); return;}
            else $("#msgPopup").hide();}
        else 
        {   setTimeout(function() { Msg_Popup(sIcon, sMsg); }, 1000); msgWait = true; return;}
    }
    msgDisplay = true;msgWait = false;
    var divPopUp = document.getElementById('msgPopup');
    if (divPopUp == null) {
        $("<div id='msgPopup' style='display:none'><div id='msgText'></div><img id='msgClose' src='"+Image_Resources['close.gif']+"' /></div>").appendTo("body");
        $("#msgClose").bind("click",function(){$("#msgPopup").hide();msgDisplay=false;});
    }
    $("#msgText").html(sMsg);$("#msgPopup").attr("icon",sIcon);$("#msgPopup").attr("class",sIcon);
    setTimeout(function(){Show_Popup(bStick);}, 250);//delay for another script on document loading
}
var msgDisplay = false;var msgWait;var vShow;var vScroll;
function Show_Popup(bStick) {  
    var iTop = Popup_Position();
    var iHeight = $("#msgPopup").height();
    vShow=true;$("#msgPopup").height(0);
    $("#msgPopup").css("top", iTop+iHeight);
    //delay setting
    var iDelay = 3500;if (msgWait) iDelay = 1000;//short delay when show multi popup
    //animate effect
    $("#msgPopup").animate({ height: iHeight, top: iTop, opacity: 0.9 }, "slow"
    , function() {
        vShow=false;window.setTimeout(function(){$(window).one("resize",function(){$("#msgPopup").hide();});},250);
        if (bStick!=true) setTimeout(function(){$("#msgPopup").fadeOut("slow", function() {msgDisplay = false;});}, iDelay);
    })
    $(window).bind("scroll",function(){if (!vScroll){vScroll=true;window.setTimeout(Popup_Position,250);}});
}
function Popup_Position()
//calculate message popup top position and size with any stylesheet setting 
{
    var iPadding;    
    //
    var iWidth = $(window).width();
    iPadding=parseIntEx($("#msgPopup").css("padding-left"));
    iPadding+=parseIntEx($("#msgPopup").css("padding-right"));
    iPadding+=parseIntEx($("#msgPopup").css("borderLeftWidth"));
    iPadding+=parseIntEx($("#msgPopup").css("borderRightWidth"));
    iWidth-=iPadding;
    //
    var iTop = $(document).scrollTop() + $(window).height();
    iPadding=parseIntEx($("#msgPopup").css("padding-top"));
    iPadding+=parseIntEx($("#msgPopup").css("padding-bottom"));
    iPadding+=parseIntEx($("#msgPopup").css("borderTopWidth"));
    iPadding+=parseIntEx($("#msgPopup").css("borderBottomWidth"));
    iPadding+=parseIntEx($("#msgPopup").css("margin-bottom"));
    iTop-=iPadding;iTop -= $("#msgPopup").height();
    //
    $("#msgPopup").css("width",iWidth);   
    if (vScroll ==true) $("#msgPopup").animate({top:iTop},500);
    else $("#msgPopup").css("top", iTop);
    //
    vScroll=false;return iTop;
}
function parseIntEx(val)
{
    var ret=parseInt(val);
    if (isNaN(ret))
        return 0;
    else
        return ret; 
}
//new added
function Message_Information(sMsg, bStick) {Msg_Popup("infor",sMsg,bStick);}
function Message_Warning(sMsg, bStick) {Msg_Popup("warning",sMsg,bStick);}
function Message_Success(sMsg, bStick) {Msg_Popup("success",sMsg,bStick);}
function Message_Error(sMsg, bStick) {Msg_Popup("error",sMsg,bStick);}
/*
</Message_Popup>
/*------------
<Dropdown_List>
-------------*/
/* Type ahead dropdownlist */
var typeAheadData =
{
    keyStrokes: "",
    focusDDLId: "",
    ResetOnNewDDLRequest: function(id) {
        if (this.focusDDLId != id) {
            this.focusDDLId = id; this.keyStrokes = "";
        }
    }
};
function TADD_OnKeyDown(tb, event) {
    //alert(event);
    if (event.ctrlKey)
        return;

    typeAheadData.ResetOnNewDDLRequest(tb.id);

    switch (event.keyCode) {
        case 9: //Tab
            return;
        case 16: //Shift
            return;
        case 18: //Alt
            return;
        case 27: //Esc
            return;
        case 38: //Up
        case 37: //Left
            event.keyCode = 38;
            return;
        case 39: //Right
            event.keyCode = 40;
            return;
        case 40: //Down 
            typeAheadData.keyStrokes = "";
            return;
        case 13: //Enter 
            typeAheadData.keyStrokes = "";
            tb.fireEvent("onchange");
            return;
        case 8:  //Backspace  
            if (typeAheadData.keyStrokes.length > 0) {
                typeAheadData.keyStrokes = typeAheadData.keyStrokes.substr(0,
        typeAheadData.keyStrokes.length - 1);
            }
            event.cancelBubble = true;
            event.returnValue = false;
            break;
        default:
            if (event.keyCode >= 112 && event.keyCode <= 123) return; //F1-F12
            var c = '';
            if ((event.keyCode >= 96) && (event.keyCode <= 105)) //Numbers 0-9
            {
                c = (event.keyCode - 96).toString();
            }
            else {
                c = String.fromCharCode(event.keyCode).toLowerCase();
            }
            if (c != null) {
                typeAheadData.keyStrokes += c;
            }
            event.cancelBubble = true;
            event.returnValue = false;
            break;
    }

    if (TADD_SelectItem(typeAheadData) == false) {
        typeAheadData.keyStrokes = c;
        if (TADD_SelectItem(typeAheadData) == true) {
            tb.fireEvent("onchange");
            //window.status="KeyStrokes: " + typeAheadData.keyStrokes;
            return;
        }
        typeAheadData.keyStrokes = "";
        tb.selectedIndex = 0;
        //window.status="Not found"+event.keyCode; 
    }
    else {
        tb.fireEvent("onchange");
        //window.status="KeyStrokes: " + typeAheadData.keyStrokes;
    }
}
function TADD_SelectItem(typeAheadData) {
    var ddl = document.getElementById(typeAheadData.focusDDLId);
    var iStart = ddl.selectedIndex + 1;
    //ddl.selectedIndex = 0;//-1;
    if (typeAheadData.keyStrokes.length > 0) {
        for (i = iStart; i < ddl.options.length; i++) {
            var sText = new String(ddl.options[i].text);
            if (sText.charAt(0) == String.fromCharCode(160)) {
                var iIndex = sText.indexOf(" ") + 1;
                sText = sText.substring(iIndex, sText.length);
            }
            if ((sText.length >= typeAheadData.keyStrokes.length)
      && (sText.substr(0, typeAheadData.keyStrokes.length).toLowerCase() == typeAheadData.keyStrokes)) {
                ddl.selectedIndex = i;
                return true;
            }
        }
        //alert("1");
        for (i = 0; i < iStart; i++) {
            var sText = new String(ddl.options[i].text);
            if (sText.charAt(0) == String.fromCharCode(160)) {
                var iIndex = sText.indexOf(" ") + 1;
                sText = sText.substring(iIndex, sText.length);
            }
            if ((sText.length >= typeAheadData.keyStrokes.length)
      && (sText.substr(0, typeAheadData.keyStrokes.length).toLowerCase() == typeAheadData.keyStrokes)) {
                ddl.selectedIndex = i;
                return true;
            }
        }
    }
    return false;
}
/*------------
</Dropdown_List>
-------------*/
/*---------------------------------------
Validator function for working with control
-----------------------------------------*/
function TextBox_SetValidate(objTextBoxID, sDataType, sMin, sMax) {
    var objTextBox = document.getElementById(objTextBoxID);
    objTextBox.setAttribute("csDataType", sDataType);
    objTextBox.setAttribute("csMinValue", sMin);
    objTextBox.setAttribute("csMaxValue", sMax);
    objTextBox.onkeypress = function() { return CheckInput(this, event); };
    objTextBox.onblur = function() { return ValidControl(this); }
}
// Validator function
function Validate_CheckBox(source, args) {
/* function set validator required for checkbox */
    var vCheckBox = document.getElementById(source.getAttribute("Checkbox"));
    if (!vCheckBox.checked) { args.IsValid = false; } else { args.IsValid = true; }
}
function Validate_Password(source, args) {
    if (args.Value.length < 4) { args.IsValid = false; } else { args.IsValid = true; }
}
function Validate_Summary() {
    var objSummary = document.getElementById('cvalSummary');
    if (objSummary == null) return;
    if (Page_ClientValidate("") == false)
        objSummary.style.display = "block";
    else
        objSummary.style.display = "none";

}

function Switch2Input(input_obj) {
    if (GetDataType(input_obj) == "Date") {
        input_obj.value = GetDateInput(input_obj.value);
        input_obj.select();
    }
}
function GetDataType(input_obj) {
    var sDataType = input_obj.getAttribute("csDataType");
    if (sDataType == null) sDataType = "Text";
    return sDataType;
}
function SetDataType(input_obj, sDataType) {
    input_obj.setAttribute("csDataType") = sDataType;
}
//'Format du lieu nhap
function FormatData(actobj) {
    var dec_num;
    var dtValue;
    var sDataType;
    sDataType = GetDataType(actobj);
    dtValue = "" + actobj.value;
    dtValue = dtValue.trim();
    if (dtValue == "") return "";
    //
    if (sDataType.indexOf("Decimal") == 0 || sDataType == "%" || sDataType == "Integer" || sDataType == "SignInteger") {
        switch (sDataType) {
            case "%":
                //'Kieu du lieu la % 			
                dec_num = 2;
                break;
            case "Integer":
            case "SignInteger":
                //'Kieu du lieu nguyen
                dec_num = 0;
                break;
            default:
                //'Kieu du lieu thap phan		    
                dec_num = CNumber(sDataType.charAt(sDataType.length - 1));
                //'Neu khong co phan thap phan thi lay default la 2
                if (dec_num == 0) dec_num = 2;
        }
        dtValue = FormatNumberEx(dtValue, dec_num);
        if (dtValue > 100 && sDataType == "%") dtValue = 100;
    }
    else {        
        switch (sDataType) {
        case "Date":
            dtValue = FormatDateTimeEx(dtValue);
            //'Kiem tra truong hop chat chi lay dang DD/MM
            if (actobj.maxlength > 0 && actobj.maxlength < 2147483647)
                dtValue = dtValue.substr(0, actobj.maxlength);
            break;
        case "DateOrYear":
            if (dtValue.length>4) 
                dtValue=FormatDateTimeEx(dtValue);
            else if (dtValue.length==2)
                dtValue=FormatDateTimeEx("01/01/"+dtValue,"yyyy"); 
            else if (!IsNumeric(dtValue)) dtValue="";
            break; 
        case "DateOrDay":
            if (dtValue.length<5) 
                dtValue=FormatDateTimeEx(dtValue,"dd/MM");
            else 
                dtValue=FormatDateTimeEx(dtValue);
            break;
        case "Time":
            dtValue = FormatTime(dtValue);
            break; 
        case "Text":
            var maxLength=actobj.getAttribute("maxlength");
            if (maxLength!=null)
            if (dtValue.length>maxLength)
                dtValue=dtValue.substring(0,maxLength);
        }
    }
    var sCasing = actobj.getAttribute("csCasing");
    //alert(sCasing);
    switch (sCasing) {
        case "Upper":
            dtValue = dtValue.toUpperCase();
            break;
        case "Lower":
            dtValue = dtValue.toLowerCase();
            break;
    }
    //alert(dtValue);
    return dtValue;
}
function GetRangeValue(obj, attName) {
    var objID = new String(obj.getAttribute(attName));
    //'Tim object Min hoac Max	
    var rtValue = "";
    while (1 == 1) {
        //'Kiem tra value co phai la object hay khong
        if (objID == "") break;
        objValue = document.getElementById(objID);
        if (objValue == null) {
            rtValue = objID;
            break;
        }
        else {
            if (objValue.value != "" && objValue.value != null) {
                rtValue = objValue.value;
                break;
            }
            else {
                objID = objValue.getAttribute(attName);
            }
        }
    }
    return rtValue;
}
function VerifyDataCustom(obj) {
/* 
Ham check rieng cho truong hop gan voi CustomValidator
-   Purpose: dung lai ham VerifyData nhung kiem tra ca truong hop null value
-   Paramter:
    obj:     control input du lieu
-   Return: tra ve ma message    
*/
    if (obj.value == "" || obj.value == null) {
        if (obj.getAttribute("csRequired") == "true")
        {
            var sType=GetDataType(obj);
            var retVal;
            if (sType==null||sType=="") 
                retVal="MSG_REQUIRED;";
            else
                retVal="MSG_"+sType+";";
            if (obj.getAttribute("maxlength")!="0")
                retVal+=obj.getAttribute("maxlength");
            return retVal;    
        }
    }
    return VerifyData(obj);
}

function VerifyData(obj) {
/* 
Ham check data cho o nhap lieu
-   Purpose: format du lieu theo kieu data, kiem tra gia tri theo khoang nhap cho phep
-   Paramter:
    obj:     control input du lieu
-   Return: tra ve ma message check range   
*/
    var sMsg;
    if (obj.value == "" || obj.value == null)
        return "";
    //Kiem tra du lieu nhap va gan lai gia tri cho object	    
    obj.value = FormatData(obj);
    if (obj.value == "" || obj.value == null)
        return "MSG_"+obj.getAttribute("csDataType")+";";
    else // Check range
        sMsg = CheckRange(obj);
    //
    return sMsg;
}

//
function CheckRange(obj) {
/* 
Kiem tra gia tri nhap trong khoang
-   Purpose: kiem tra gia tri theo khoang nhap cho phep
-   Paramter:
    obj:     control input du lieu
-   Return: tra ve ma message check range   
*/
    var MinValue = GetRangeValue(obj, "csMinValue");
    var MaxValue = GetRangeValue(obj, "csMaxValue");

    var isGreate = false;
    var isLess = false;
    var cValue;

    if (obj.value == "")
        return;

    sDataType = GetDataType(obj)
    if (sDataType.indexOf("Decimal") == 0)
        sDataType = "Decimal";

    if ("Integer,SignInteger,Decimal".indexOf(sDataType) > -1) {
        cValue = CNumber(obj.value);
        if (IsNumeric(MinValue))
            MinValue = CNumber(MinValue);
        else
            MinValue = null;

        if (IsNumeric(MaxValue))
            MaxValue = CNumber(MaxValue);
        else
            MaxValue = null;
    }
    else
        if (sDataType == "Date") {
        cValue = GetDateInput(obj.value);
        cValue = CDate(cValue);

        if (IsDate(MinValue))
            MinValue = CDate(MinValue);
        else
            MinValue = null;

        if (IsDate(MaxValue))
            MaxValue = CDate(MaxValue);
        else
            MaxValue = null;      
    }
    else
        return;

    if (MinValue != null) {
        isLess = (cValue < MinValue);       					
        if (sDataType == "Date")
            MinValue = FormatDateTime(MinValue);
    }
    if (MaxValue != null) {
        isGreate = (cValue > MaxValue);        
        if (sDataType == "Date")
            MaxValue = FormatDateTime(MaxValue);
    }
    var str = "";
    if (isGreate || isLess) {        
        if (MinValue != null && MaxValue != null)
            str = "MSG_RANGE;" + MinValue + ";" + MaxValue;
        else {
            if (MinValue != null)
                str = "MSG_RANGE;" + MinValue + ";";
            else {
                if (MaxValue != null)
                    str = "MSG_RANGE;;" + MaxValue;
            }
        }
    }   
    return str;
}
function CheckInput(obj_input, e) {
/* 
Kiem tra ky tu nhap 
-   Purpose: handle su kien keypress cua o nhap lieu va check ky tu nhap
-   Paramter:
    obj:     control input du lieu
    e:       object event (ho tro multibrowser)
-   Return: true (cho phep nhap); false (khong cho phep nhap)
*/
    var sChar = (e.charCode);
    if (typeof sChar == "undefined") sChar = e.keyCode;
    //alert(sChar);
    //alert(String.fromCharCode(sChar));
    if (sChar == 0 || sChar == 13 || sChar == 46 || sChar == 8 || sChar == 9) return true
    sChar = String.fromCharCode(sChar);
    var tmp_str = "0123456789";
    var sValue = obj_input.value;
    var sType = GetDataType(obj_input);
    if (sType.indexOf("Decimal") == 0) sType = "Decimal";
    switch (sType) {
        case "SignInteger":
            if (sChar == "-") {
                if (sValue.indexOf("-") == -1) {
                    obj_input.value = "-" + sValue;
                    return false;
                }
                else
                    return true;
            }
            break;
        case "Integer":
            break;
        case "Decimal":
        case "%":
            if (sValue.indexOf(CS_NUMBER_DECIMAL) == -1)
                tmp_str += CS_NUMBER_DECIMAL;
            break;
        case "Date","DateOrYear","DateOrDay":
            tmp_str += "/- ";
            break;
        case "Time":
            tmp_str += ":";
            break;
        default:
            return true;
    }
    //
    var retVal=(tmp_str.indexOf(sChar) != -1);
    if (retVal&&"Decimal,Integer".indexOf(sType)!=-1)
    {window.setTimeout(function(){obj_input.value=FormatData(obj_input);},200);}
    return retVal; 
}

function ShowCharInput(obj_input,e){
/* 
-   Purpose:    Hien thi so ky tu da nhap va so ky tu toi da
-   Paramter:
        obj_input:  input control
        e:          doi tuong event
-   Return: 
*/
    var sCode = e.charCode;
    if (typeof sCode == "undefined") sCode = (e.keyCode); 
    sCode=parseInt(sCode);
    if (!(sCode==8||sCode==46||(sCode>31&&sCode<127))||sCode==0) return true;   
    if (sCode>=35&&sCode<=40) return true;
    var cvalControlId = $(obj_input).attr("id").replace("txt","cval");   
    if ($("#"+cvalControlId)!=null)
        window.setTimeout(function()  
            {var curChar = $(obj_input).val().length;
            var maxChar = $(obj_input).attr("maxlength");  
            if (maxChar!=null&&curChar>maxChar)
            {$(obj_input).val($(obj_input).val().substring(0,maxChar));
            curChar=maxChar;}       
            $("#"+cvalControlId).text("Số ký tự tối đa: "+maxChar+"; Số ký tự còn lại: "+(maxChar-curChar));
            $("#"+cvalControlId).show();}
        ,100); 
   return true; 
}

function LimitCharInput(obj_input,e){
/* 
-   Purpose:    Ho tro limit maxlength cho textarea
-   Paramter:
        obj_input:  input control
        e:          doi tuong event
-   Return: false: k cho phep nhap
*/
    var sCode =parseInt(e.keyCode);
    
    var maxLength = $(obj_input).attr("maxlength");
    if (maxLength==null) return true;
    var length = $(obj_input).val().length;
    if(length >= maxLength) {
        switch (sCode) {
        case 8:case 9:case 17:case 46:  // allow delete,tab,backspace
            break;
        case 35:case 36:case 37:case 38:case 39:case 40: // and cursor keys        
            break;
        default:
            if (sCode>31&&sCode<97) {
            return false;}
        }     
    }
    return true; 
}

function TranslateMsg(sMsg) {
/* 
Chuyen tu message code -> message text
-   Purpose: tap trung vao 1 ham de de quan ly
-   Paramter:
    sMsg:     ma message
-   Return: noi dung message
*/
    var sReturn;
    var arr = sMsg.split(";");
    switch (arr[0]) {
        case "MSG_DateOrYear":
            sReturn = "Vui lòng nhập dữ liệu kiểu \"" + CS_DATE_INPUT_FORMAT +"\" hoặc số năm (yyyy)";
            break;
        case "MSG_DateOrDay":
            sReturn = "Vui lòng nhập dữ liệu kiểu \"" + CS_DATE_INPUT_FORMAT +"\" hoặc \"" + CS_DATE_INPUT_FORMAT.replace("/yyyy","")+"\"";
            break;
        case "MSG_Date":
            sReturn = "Vui lòng nhập dữ liệu kiểu \"" + CS_DATE_INPUT_FORMAT +"\"";
            break;
        case "MSG_DateOrYear":
            sReturn = "Vui lòng nhập dữ liệu kiểu ngày tháng hoặc năm";
            break;
        case "MSG_Time":
            sReturn = "Vui lòng nhập dữ liệu kiểu giờ \"HH:mm\"";
            break;
        case "MSG_Integer","MSG_SignInteger","MSG_Decimal":
            sReturn = "Vui lòng nhập dữ liệu kiểu số";
            break;
        case "MSG_REQUIRED","MSG_Text":
            sReturn = "Vui lòng nhập dữ liệu";
            if (arr.length==2&&CNumber(arr[1])>0)
                sReturn+=", tối đa " + arr[1] + " ký tự";
            break;
        case "MSG_RANGE":
            var sMin = arr[1];
            var sMax = arr[2];
            if (sMin != '' && sMax != '')
                sReturn = "Vui lòng nhập giá trị trong khoảng từ " + sMin + " đến " + sMax;
            else {
                if (sMin != '')
                    sReturn = "Vui lòng nhập giá trị lớn hơn hoặc bằng " + sMin;
                else {
                    if (sMax != '')
                        sReturn = "Vui lòng nhập giá trị nhỏ hơn hoặc bằng " + sMax;
                }
            }
            break;
        default:
            return sReturn;
    }
    return sReturn;
}
function CustomValidator(oSrc, args) {
/* 
-   Purpose: ham client validate cho CustomValidator
-   Paramter:
    oSrc:     object Validate (giong nhu code server)
    args:     args o phia client (dung IsValid giong nhu code server)
-   Return: noi dung message
*/
    var controlID = oSrc.controltovalidate;
    var objControl = document.getElementById(controlID);
    if (objControl == null) return;
    var msg = VerifyDataCustom(objControl);
    if (msg != "" && msg != null) {
        msg = TranslateMsg(msg);
        oSrc.errormessage = msg;
        oSrc.innerHTML = msg;
        args.IsValid = false;
    }
    else
        args.IsValid = true;
}
/* Bien phuc vu ham ValidControl 
tranh truong hop lien tuc hien alert
*/
var m_HasError;// luu gia tri co loi hay khong
var m_IdError;// luu id cua control gay loi
function ValidControl(objControl) {
/* 
-   Purpose: validate input control on blur
-   Paramter:
    objControl:     input control
-   Return: true (has error); false (no error)
*/
    if (objControl.id != m_IdError)
        if (m_HasError == true) return;
    var msg = VerifyData(objControl);
    if (msg != "" && msg != null) {
        msg = TranslateMsg(msg);
        m_HasError = true;
        m_IdError = objControl.id;
        alert(msg);
        setTimeout("document.getElementById('" + m_IdError + "').focus()", 5);
        return false;
    }
    else {
        m_HasError = false;
        return true;
    }
}
function ShowInValid() {
    var objSummary = document.getElementById('cvalSummary');
    if (objSummary != null) objSummary.style.display = "block";
}
/*---------------------------------------
Common function for working with Numeric
-----------------------------------------
CS_NUMBER_DECIMAL is server decimal separator
CS_NUMBER_GROUP is server group separator
*/
var CS_NUMBER_DECIMAL = ".";
var CS_NUMBER_GROUP = ",";
var CS_CLIENT_DECIMAL = new String(3/2).substr(1,1);//store curent client decimal char
/*
IsNumeric  		: check text is numeric or not
CNumber			: convert text to number
FormatNumber	: format number to display format
FormatNumberEx	: format number to display format with correct not numeric value
*/
function IsNumeric(input_value) {
    //
    if (input_value.indexOf(CS_NUMBER_DECIMAL) != -1) {
        if (input_value.indexOf(CS_NUMBER_DECIMAL) < input_value.indexOf(CS_NUMBER_GROUP))
            return false;
    }
    if (input_value.charAt(0) == "-")
        input_value = input_value.substring(1);
    if (CS_NUMBER_DECIMAL == ".") {
        var x = input_value.replace(/,/g, "");
        var anum = /(^\d+$)|(^\d+\.\d+$)/;
    }
    else {
        var x = input_value.replace(/\./g, "");
        var anum = /(^\d+$)|(^\d+\,\d+$)/;
    }
    if (anum.test(x))
        return true;
    else {
        return false;
    }
}
function CNumber(input_value) {
    if (!IsNumeric(input_value))
        return 0;
    if (CS_CLIENT_DECIMAL == ".")
        input_value = input_value.replace(/,/g, "");
    else {
        input_value = input_value.replace(/\./g, "");
        input_value = input_value.replace(/,/g, ".");
    }
    return parseFloat(input_value);
}
function FormatNumber(input_value, dec_num) {
    var x;
    if (CS_NUMBER_DECIMAL == ".")
        x = input_value.replace(/,/g, "");
    else
        x = input_value.replace(/\./g, "");
    //
    dec_num = Math.pow(10, dec_num);
    x = "" + Math.round(eval(x) * dec_num) / dec_num;
    var dp = x.indexOf(CS_NUMBER_DECIMAL);
    if (dp == -1)
        dp = x.length - 1;
    else
        dp = dp - 1;
    //		
    input_value = x.substring(dp + 1);
    for (i = 0; i <= dp; i++) {
        if (i / 3 == Math.floor(i / 3) && i != 0)
            input_value = CS_NUMBER_GROUP + input_value;
        input_value = x.charAt(dp - i) + input_value;
    }
    return input_value;
}
function FormatNumberEx(dtValue, dec_num) {
    if (!IsNumeric(dtValue)) {
        return 0;
    }
    dtValue = FormatNumber(dtValue, dec_num);
    return dtValue;
}
/*---------------------------------------
Common function for working with Date
-----------------------------------------
CS_DATE_INPUT_FORMAT is server date input format
CS_DATE_DISPLAY_FORMAT is server date display format
CS_DATE_MONTH_NAMES is server Abbreviated month names array
*/
var CS_DATE_INPUT_FORMAT = "dd/MM/yyyy";
var CS_DATE_DISPLAY_FORMAT = "dd/MM/yyyy"; //"dd-MMM-yyyy";
var CS_DATE_MONTH_NAMES = new Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC");
/*
IsDate			: check is date or not
GetDateInput	: change data from display format to edit format
CDate			: convert to date type
FormatDateTime 	: format to display format
FormatDateTimeEx: format to display format with support quick input
*/
function IsDate(input_value) {
    return (CDate(input_value) != null);
}
function GetDateInput(display_value) {
    if (display_value == "") return "";
    var monthfield;
    var dayfield;
    var yearfield;

    display_value = display_value.replace(/-/g, "/");
    yearfield = display_value.split("/")[2];
    if (CS_DATE_INPUT_FORMAT.indexOf("dd") == 0) {
        monthfield = display_value.split("/")[1];
        dayfield = display_value.split("/")[0];
    }
    else {
        monthfield = display_value.split("/")[0];
        dayfield = display_value.split("/")[1];
    }
    if (eval(dayfield) < 10 && dayfield.length < 2) dayfield = "0" + dayfield;
    if (monthfield.length == 3) {
        var i = 0;
        for (i = 0; i <= CS_DATE_MONTH_NAMES.length - 1; i++) {
            if (CS_DATE_MONTH_NAMES[i] == monthfield) {
                monthfield = i + 1;
                break;
            }
        }
    }
    else
        if (IsNumeric(monthfield)) monthfield = eval(monthfield);
    //        
    display_value = CS_DATE_INPUT_FORMAT;
    display_value = display_value.replace("yyyy", yearfield);
    display_value = display_value.replace("MMM", CS_DATE_MONTH_NAMES[eval(monthfield)]);
    if (eval(monthfield) < 10) monthfield = "0" + monthfield;
    display_value = display_value.replace("MM", monthfield);
    //
    display_value = display_value.replace("dd", dayfield);
    return display_value;
}
function CDate(input_value) {
    var monthfield;
    var dayfield;
    var yearfield;

    var validformat = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/; //Basic check for full  format validity 
    if (!validformat.test(input_value)) {
        validformat = /^\d{1,2}\/\d{1,2}$/; //Basic check for  yearless format validity 
        if (!validformat.test(input_value))
            return null;    //incorect format        
        else
            yearfield = (new Date()).getFullYear();
    }
    else {
        yearfield = input_value.split("/")[2];
        //support Y2K correct
        yearfield = eval(yearfield);
        if (yearfield < 50) yearfield = yearfield + 2000;
    }
    //Detailed check for valid date ranges
    //Current format is dd/MM/yyyy
    if (CS_DATE_INPUT_FORMAT.indexOf("dd") == 0) {
        monthfield = input_value.split("/")[1];
        dayfield = input_value.split("/")[0];
    }
    else //Current format is MM/dd/yyyy
    {
        monthfield = input_value.split("/")[0];
        dayfield = input_value.split("/")[1];
    }
    var dayobj = new Date(yearfield, monthfield - 1, dayfield);
    if ((dayobj.getMonth() + 1 != monthfield) || (dayobj.getDate() != dayfield) || ((dayobj.getFullYear() != yearfield) && (dayobj.getYear() != yearfield)))
        return null; //incorect value
    else
        return dayobj;
}
function FormatDateTime(input_value) {
    return FormatDateTime(input_value,CS_DATE_DISPLAY_FORMAT); 
}

function DateAdd(sType,dVal,aVal)
{ 
    var dayobj; 
    if (typeof dVal.getDate!="function")
        dayobj = CDate(dVal);
    else
        dayobj = dVal;  
    sType=new String(sType);    
    if (sType=="d"||sType=="day") 
        dayobj.setDate(dayobj.getDate()+aVal);
    else if (sType=="m"||sType=="mon")
        dayobj.setMonth(dayobj.getMonth()+aVal);
    else if (sType=="h"||sType=="hrs")
        dayobj.setHours(dayobj.getHours()+aVal);
    
    return dayobj;
}

function FormatDateTime(input_value,format) {
    var dayobj; 
    if (typeof input_value.getDate!="function")
        dayobj = CDate(input_value);
    else
        dayobj = input_value;

    if (dayobj == null)
        return ""; //incorect value
    else {
        var monthfield = dayobj.getMonth() + 1;
        var dayfield = dayobj.getDate();
        if (dayfield < 10) dayfield = "0" + dayfield;
        if (monthfield < 10) monthfield = "0" + monthfield;
        if (format==null) format=CS_DATE_DISPLAY_FORMAT;
        var temp = format;
        //
        temp = temp.replace("yyyy", dayobj.getFullYear());
        temp = temp.replace("yy", dayobj.getYear());
        //
        temp = temp.replace("MMM", CS_DATE_MONTH_NAMES[dayobj.getMonth()]);
        temp = temp.replace("MM", monthfield);
        //
        temp = temp.replace("dd", dayfield);
        //
        return temp;
    }
}

function FormatDateTimeEx(dtValue,format) {
    //Ho tro su dung dau cach
    dtValue = dtValue.replace(/ /g, "/");
    //Ho tro su dung dau -
    dtValue = dtValue.replace(/-/g, "/");
    if (!IsDate(dtValue)) {
        var Pattern;
        //Truong hop nhap 8 so. vd: 01012006
        Pattern = /^\d{8}$/;
        if (Pattern.test(dtValue))
            dtValue = dtValue.substr(0, 2) + "/" + dtValue.substr(2, 2) + "/" + dtValue.substr(4, 4);
        else {    //Truong hop nhap 6 so. vd: 010106
            Pattern = /^\d{6}$/;
            if (Pattern.test(dtValue))
                dtValue = dtValue.substr(0, 2) + "/" + dtValue.substr(2, 2) + "/" + dtValue.substr(4, 2);
            else {
                //Truong hop nhap 4 so. vd: 0101
                Pattern = /^\d{4}$/;
                if (Pattern.test(dtValue) && (dtValue.length == 4))
                    dtValue = dtValue.substr(0, 2) + "/" + dtValue.substr(2, 2);
                else {
                    //Truong hop nhap 2 so. vd: 01
                    Pattern = /^\d{2}$/;
                    if (Pattern.test(dtValue) && (dtValue.length == 2)) {
                        if (eval(dtValue) < 32)
                            dtValue = dtValue + "/" + ((new Date()).getMonth() + 1);
                    }
                }
            }
        }
    }
    if (format==null) format=CS_DATE_DISPLAY_FORMAT;
    return FormatDateTime(dtValue,format);
}

function IsTime(input_value) {
    var validformat = /^\d{1,2}\:\d{1,2}$/; //Basic check for full  format validity 
    if (validformat.test(input_value)) {
        var vH=input_value.split(":")[0];    
        var vM=input_value.split(":")[1];    
        if (vH<0||vH>23)
            return false;
        else if (vM<0||vM>59) 
            return false;
        else
            return true;
    }
    else
    { return false; }
}

function FormatTime(dtValue) {
    if (!IsTime(dtValue)) {
        var Pattern;
        //Truong hop nhap 4 so. vd: 0101
        Pattern = /^\d{4}$/;
        if (Pattern.test(dtValue) && (dtValue.length == 4))
            dtValue = dtValue.substr(0, 2) + ":" + dtValue.substr(2, 2);
        else {
            //Truong hop nhap 2 so. vd: 01
            Pattern = /^\d{2}$/;
            if (Pattern.test(dtValue) && (dtValue.length == 2)) {
                if (eval(dtValue) < 24)
                    dtValue = dtValue + ":00";
            }
        }
    }
    return dtValue;
}
