﻿/*
 * SAP.js Version 1.0
 * Copyright (c) 2007-2008 SIRVINA corp. (www.sirvina.com)
 */
// --- CONSTANT --------------------------------------------------------------------
 var NO_ANSWER = "1";
 var SINGLE_ANSWER = "2";
 var MULTI_ANSWER = "3";
 var PRE_FORMAT = "4";
 var OPEN_ENDED = "5";
 var DEMOGRAPHIC = "6";
 var MATRIX_RATING = "7";
 var MATRIX_ADVANCED = "8";
 var RANK_ORDER = "9";
 var NUMERIC_ALLOCATION = "10";
 var COMPARE = "11";

 var ALLOW_TO_SKIP = "1";
 var SKIP_WITH_ALERT = "2";
 var MUST_ANSWER = "3";
 
 var ANS_VALID = 0;
 var ANS_ALERT = 1;
 var ANS_INVALID = 2;
 
 var RADIO = "1";
 var DROPDOWNLIST = "2";
 var CHECKBOX = "3";
 
 var FMT_DATE = "6";
 var FMT_EMAIL = "7";
 var FMT_INTEGER = "9";
 var FMT_POSITIVE_INTEGER = "10";
 var FMT_REAL = "11";
 var FMT_POSITIVE_REAL = "12";
 
 var MTX_REQ_ANY_ANS = "1";
 var MTX_REQ_ALL_ANS = "2";  
 var MTX_REQ_AT_LEAST_ANS = "3";  
 
// ---- Global String Object Util Function ---------------------------------
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

// --- Common Function --------------------------------------------------------------------
function getValue(clientID)
{
    var control = document.getElementById(clientID);
    if (control != null) { return control.value; } 
    else { return "";}
}
function setValue(clientID, value)
{
    var control = document.getElementById(clientID);
    if (control != null) { control.value = value; }
}

function closePreviewSurveyText(clientID)
{
   var action = "setStyleDisplay('" + clientID + "','none')";
   mytime = setTimeout(action, 4000);
}

function setStyleDisplay(clientID, value)
{
    var control = document.getElementById(clientID);
    if (control != null) { control.style.display = value; }
}

function removeRequireAsterisk(str)
{
    if (str.length <= 0) { return "" ; }
    var lowerStr = str.toLowerCase();
    var firstStr = "<span class=";
    if (lowerStr.indexOf(firstStr) == 0)
    {
        nextSpan = lowerStr.indexOf("*</span>");
        if (nextSpan > 0) { return str.substring(nextSpan + 8); }
    }
    return str;
}

function answerIsOfQuestion(questionID, rowValueStr)
{
    var questID = getQuestionIDFromRowValue(rowValueStr);
    if (questionID == questID) {return true;}
    return false;
}

function elementIsOfQuestionRow(questionID, rowValueStr)
{
    var questID = getQuestionIDFromRowValue(rowValueStr);
    var rowID = getRowIDFromRowValue(rowValueStr);
    if ((questionID == questID) && (rowID != "")) {return true;}
    return false;
}

function getPropertyFromKeyValueString(keyValueString, propertyKey)
{
    var arrProperty = keyValueString.split(',');
    var keyAndValue = "";
    var proKey = "";
    var proValue = "";
    for (var i = 0; i < arrProperty.length; i++)
    {
        keyAndValue = arrProperty[i];
        proKey = getPropertyKey(keyAndValue);
        proValue = getPropertyValue(keyAndValue);   
        if (proKey == propertyKey)
        {
            return proValue;
        }
    }
    return "";
}

function getPropertyKey(keyAndValue)
{
    var arrKeyValue = keyAndValue.split('=');
    if (arrKeyValue.length > 0)
    {
        return arrKeyValue[0];
    }
    return "";
}

function getPropertyValue(keyAndValue)
{
    var arrKeyValue = keyAndValue.split('=');
    if (arrKeyValue.length > 1)
    {
        return arrKeyValue[1];
    }
    return "";
}

function getNumberDecimalSeparator()
{
    return getValue("hdnDecSep"); 
    // Return the number decimal separator of SAP culture(if vi-VN return ','; if en-US return '.')
}

function string2DecimalScaleFour(str)
{
    return roundDecimalScaleFour(string2Decimal(str));   
}

function string2Decimal(str)
{
    str = str.trim();
    if (str == "") { return 0; }
    
    var sapDecSep = getNumberDecimalSeparator(); 
    str = str.replace(sapDecSep, '.');
    try 
    { 
        return parseFloat(str);
    } 
    catch (ex) { return 0; }          
}

function decimal2String(dec)
{
    var str = '' + dec;
    var sapDecSep = getNumberDecimalSeparator(); 
    return str.replace('.', sapDecSep);
}

function roundDecimalScaleFour(dec)
{
   return Math.round(dec * 10000) / 10000;
}

function string2Integer(str)
{
    str = str.trim();
    if (str == "") { return 0; }
    
    try { return parseInt(str, 10);  } 
    catch (ex) { return 0; }
}

function integer2String(integer)
{
    return ('' + integer);
}

function isInt(sText)
{
    var validChars = "0123456789";
    var chr;
    for (var i = 0; i < sText.length; i++) 
    { 
        chr = sText.charAt(i); 
        if (validChars.indexOf(chr) == -1) { return false; }
    }
    return true;
}
//////////////////////////////////////////////////////////////
//-- Row Properties ------------------------------------------

function getQuestionIDFromRowValue(rowValueStr)
{
    return getPropertyFromKeyValueString(rowValueStr, "qId");
} 

function getRowIDFromRowValue(rowValueStr)
{
    return getPropertyFromKeyValueString(rowValueStr, "rId");
}  

function getFormatIDFromRowValue(rowValueStr)
{
    return getPropertyFromKeyValueString(rowValueStr, "fmtId");
}

function getIsOtherRowFromRowValue(rowValueStr)
{
    var isOther = getPropertyFromKeyValueString(rowValueStr, "oth");
    isOther = isOther.toLowerCase();
    if (isOther == "true") { return true; }
    return false;
}

function getIsExclusiveFromRowValue(rowValueStr)
{
    var isExclusive = getPropertyFromKeyValueString(rowValueStr, "exc");
    isExclusive = isExclusive.toLowerCase();
    if (isExclusive == "true") { return true; }
    return false;
}

function getIsSumRowFromRowValue(rowValueStr)
{
    var isSumRow = getPropertyFromKeyValueString(rowValueStr, "sum");
    isSumRow = isSumRow.toLowerCase();
    if (isSumRow == "true") { return true; }
    return false;
}

// For RankOrder
function getTxtAnswerClientIDFromRowValue(rowValueStr)
{
    return getPropertyFromKeyValueString(rowValueStr, "txtACID");
}

// For PreFormat
function getRowErrorClientIDFromRowValue(rowValueStr)
{
    return getPropertyFromKeyValueString(rowValueStr, "rErrCID");
}
//////////////////////////////////////////////////////////////
//-- Question Properties -------------------------------------
function getQuestionProperties(questionID)
{
    return getValue(getValue("hdn_" + questionID));
}

function getQuestionProperty(questionID, propertyKey)
{
    questionProperties = getQuestionProperties(questionID);
    return getPropertyFromKeyValueString(questionProperties, propertyKey);
}

function getQuestionRootClientID(questionID)
{
    return getQuestionProperty(questionID, "rootCId");
}

function getQuestionNameClientID(questionID)
{
    return getQuestionProperty(questionID, "qNameCId");
}

function getQuestionErrorTextClientID(questionID)
{
    return getQuestionProperty(questionID, "errCId");
}

function getQuestionType(questionID)
{
    return getQuestionProperty(questionID, "qType");
}

function getRequiredAnswerID(questionID)
{
    var reqAns = getQuestionProperty(questionID, "reqAns");
    if (reqAns == "") { reqAns = ALLOW_TO_SKIP;  }
    return reqAns;
}

function getQuestionShowType(questionID)
{
    return getQuestionProperty(questionID, "showType");
}

function getCmbAnswerClientID(questionID) //for demographic
{
    return getQuestionProperty(questionID, "cmbAnsCId");
}

function getDdlAnswerClientID(questionID)
{
    return getQuestionProperty(questionID, "ddlAnsCId");
}

function getMinAnswer4MultiAnswer(questionID)
{
    var minAns = getQuestionProperty(questionID, "minAns"); 
    try
    {
        return parseInt(minAns);
    } 
    catch(ex) {return -1;}
    
    return -1;
}

function getMaxAnswer4MultiAnswer(questionID)
{
    var maxAns = getQuestionProperty(questionID, "maxAns"); 
    try
    {
        return parseInt(maxAns); 
    } 
    catch(ex) {return -1;}
    return -1;
}

function showHideErrorMessage(questionID, isShow)
{
    var msg = document.getElementById(getQuestionErrorTextClientID(questionID));
    if (msg) 
    {
        if (isShow) { msg.style.display = 'block'; }
        else { msg.style.display = 'none'; }
    }
}

function getQuestionName(questionID)
{
    var qName = document.getElementById(getQuestionNameClientID(questionID));
    if (qName) { return removeRequireAsterisk(qName.innerHTML); }
    return "";
}

// For Open-Ended Question
function getTxtAnswerClientID(questionID)
{
    return getQuestionProperty(questionID, "txtAnsCId");
}

// Used by: Compare and RankOrder. Each compare row has 2 radio buttons (2 compared elements)
function getNumberOfRow(questionID)
{
    try
    {
        return parseInt(getQuestionProperty(questionID, "numRow"));
    } catch (err)
    { return 0; }
}

function getFormatID(questionID)
{
    return getQuestionProperty(questionID, "fmtId");
}

function getOperatorID1(questionID)
{
    return getQuestionProperty(questionID, "oper1");
}

function getNumericAllocValue1(questionID)
{
    return getQuestionProperty(questionID, "val1");
}

function getOperatorID2(questionID)
{
    return getQuestionProperty(questionID, "oper2");
}

function getNumericAllocValue2(questionID)
{
    return getQuestionProperty(questionID, "val2");
}

function getIsDayBeforeMonth(questionID)
{
    var isDayBeforeMonth = getQuestionProperty(questionID, "dayBe4Mn");
    isDayBeforeMonth = isDayBeforeMonth.toLowerCase();
    if (isDayBeforeMonth == 'true') { return true; }
    else { return false; }
}

//For: Matrix Rating
function getMatrixAnswerTypeID(questionID)
{
    return getQuestionProperty(questionID, "mtxAnsTp");
}

function getNumOfRequiredAnswer(questionID)
{
    return getQuestionProperty(questionID, "numReqAns");
}

function getIsAbsoluteRanking(questionID)
{
    return getQuestionProperty(questionID, "absoRnk");
}

// Also number of matrix columns
function getNumberOfScaleItem(questionID)
{
    return getQuestionProperty(questionID, "numScaItem");
}

//////////////////////////////////////////////////////////////
var originalURL = window.location.href;

function validateAllQuestion()
{
    var questionID;
    var questProper;
    var totalValidNum = 0;
    var totalAlertNum = 0;
    var validNum = 0;
    var arrInvalidQuestID = new Array();
    var arrAlertQuestID = new Array();
    
    var arrQuestProper = document.getElementsByName("_QuestionProperties");
    for (var i = 0; i < arrQuestProper.length; i++)
    {
        questionID = arrQuestProper[i].id.replace("hdn_",""); 
        showHideErrorMessage(questionID, false);
        validNum = validateOneQuestion(questionID);
        if (validNum == ANS_INVALID)
        {
            arrInvalidQuestID[arrInvalidQuestID.length] = questionID; 
        }
        else if (validNum == ANS_ALERT)
        {
            arrAlertQuestID[arrAlertQuestID.length] = questionID; 
        }
    }
    
    var strMsg = "";
    if (arrInvalidQuestID.length > 0) 
    { 
        strMsg = getValue("hdnCheckAns") + "\n\n";
        for (var i =0; i < arrInvalidQuestID.length; i++)
        {
            strMsg += clearHTML(getQuestionName(arrInvalidQuestID[i])) + "\n"; //lhvu - 00064 - Clear html when alert in sap - 07/05/2008
        }
        strMsg += "\n";
        alert(strMsg);
        
        window.location.href = originalURL + '#' + arrInvalidQuestID[0];
        return false; 
    }
    
    if (arrAlertQuestID.length > 0) 
    {
        strMsg = getValue("hdnNotCompAns") + "\n\n";
        for (var i =0; i < arrAlertQuestID.length; i++)
        {
            strMsg += clearHTML(getQuestionName(arrAlertQuestID[i])) + "\n"; //lhvu - 00064 - Clear html when alert in sap - 07/05/2008
        }
        strMsg += "\n" + getValue("hdnConOrNot") + "\n";
        return confirm(strMsg);
    }
    
    window.scrollTo(0,0); // nqminh - 00044 - Go To Top Of Next Section
    return true;
}

function validateOneQuestion(questionID)
{
    var questionType = getQuestionType(questionID);
    if  (questionType == SINGLE_ANSWER) {return validateSingleAnswer(questionID); }
    if  (questionType == MULTI_ANSWER) {return validateMultiAnswer(questionID); }
    if  (questionType == PRE_FORMAT) {return validatePreformat(questionID); }
    if  (questionType == OPEN_ENDED) {return validateOpenEnded(questionID); }
    if  (questionType == DEMOGRAPHIC) {return validateDemographic(questionID); }
    if  (questionType == MATRIX_RATING) {return validateMatrixRating(questionID); }
    if  (questionType == MATRIX_ADVANCED) {return validateMatrixAdvanced(questionID); }
    if  (questionType == RANK_ORDER) {return validateRankOrder(questionID); }
    if  (questionType == NUMERIC_ALLOCATION) {return validateNumericAllocation(questionID); }
    if  (questionType == COMPARE) {return validateCompare(questionID); }
       
    return ANS_VALID; 
}

// ---- Single Answer (SA) Question Type -------------------------------------------------------------
function onclickSingleAnswer(current, questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                elm.checked = false;
            }
        }
    }
    current.checked = true;
}

function validateSingleAnswer(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    
    if (requiredAnswerID == ALLOW_TO_SKIP) 
    {
        return ANS_VALID;
    }
    
    var showType = getQuestionShowType(questionID);
    var haveAnswer = true;
    if (showType == RADIO) { haveAnswer = anyCheckedRadioButton(questionID); }
    else { haveAnswer = anySelectedValueAnswerDropdownList(questionID); }
     
    if (requiredAnswerID == SKIP_WITH_ALERT) 
    {
        if (haveAnswer) { return ANS_VALID; }
        else 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_ALERT; 
        }
    } 
    
    if (requiredAnswerID == MUST_ANSWER) 
    {
        if (haveAnswer) { return ANS_VALID; } 
        else 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_INVALID; 
        }
    }
    
    return ANS_VALID;
}

function anyCheckedRadioButton(questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                if (elm.checked) {return true;}
            }
        }
    }
    return false;
}

function anySelectedValueAnswerDropdownList(questionID)
{
    var ddlAnsID = getDdlAnswerClientID(questionID);
    var ddlAns = document.getElementById(ddlAnsID);
    
    if (ddlAns)
    {
        if (ddlAns.selectedIndex > 0) { return true; }
        else { return false; }
    }
    return true;
}

//Start - lhvu --- 00071 --- Radio checked when focus other row textbox --- 14/05/2008
function onfocusSingleAnswerOtherRowTextbox(otherRowRadioCID , questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                elm.checked = false;
            }
        }
    }
    
    var optOtherRow = document.getElementById(otherRowRadioCID);
    if (optOtherRow) { optOtherRow.checked = true; }
}
//End - lhvu --- 00071 --- Radio checked when focus other row textbox --- 14/05/2008

// ---- Multi Answer Question Type --------------------------------------------------------------------------
function onclickMultiAnswer(current, questionID)
{
    var curIsExclusive = getIsExclusiveFromRowValue(current.value);
    var curChecked = current.checked;

    if (! curChecked) {return ;}

    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'checkbox')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                if (curIsExclusive) { elm.checked = false; } 
                else 
                {   
                    elmIsExclusive = getIsExclusiveFromRowValue(elm.value);
                    if (elmIsExclusive) { elm.checked = false; }
                }
            }
        }
    } 
    current.checked = curChecked; 
}

// Start - lhvu ---00071 --- Checkbox selected when focus other row textbox --- 14/05/2008
function onfocusMultiAnswerOtherRowTextbox(otherRowCheckboxCID, questionID)
{
    var chkOtherRow = document.getElementById(otherRowCheckboxCID);
    if (! chkOtherRow) { return; }
    
    var curIsExclusive = getIsExclusiveFromRowValue(chkOtherRow.value);
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'checkbox')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                if (curIsExclusive) { elm.checked = false; } 
                else 
                {   
                    elmIsExclusive = getIsExclusiveFromRowValue(elm.value);
                    if (elmIsExclusive) { elm.checked = false; }
                }
            }
        }
    } 
    
    chkOtherRow.checked = true; 
}
//End - lhvu --- 00071 --- Checkbox selected when focus other row textbox --- 15/05/2008

function validateMultiAnswer(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    var numOfAnswer = getNumberOfCheckedCheckBox(questionID);
    
    var validMinMax = checkMinMaxAnswer4MultiAnswer(questionID);
    
    var showErrorText = false;
    if (validMinMax == ANS_INVALID) { showErrorText = true; }
    
    if (requiredAnswerID == ALLOW_TO_SKIP) 
    {
        if (numOfAnswer > 0) 
        { 
            showHideErrorMessage(questionID, showErrorText);
            return validMinMax;
        }
        return ANS_VALID;
    } 
    
    if (requiredAnswerID == SKIP_WITH_ALERT) 
    {
        if (numOfAnswer == 0) 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_ALERT; 
        }  
        else 
        {
            showHideErrorMessage(questionID, showErrorText);
            return validMinMax;
        }
    } 
    
    if (requiredAnswerID == MUST_ANSWER) 
    {
        if (numOfAnswer == 0) 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_INVALID; 
        } 
        else 
        { 
            showHideErrorMessage(questionID, showErrorText);
            return validMinMax;
        }
    }
    return ANS_VALID;
}

function checkMinMaxAnswer4MultiAnswer(questionID)
{
    var minAns = getMinAnswer4MultiAnswer(questionID);
    var maxAns = getMaxAnswer4MultiAnswer(questionID);
    var numAns = getNumberOfCheckedCheckBox(questionID);
    
    if ((minAns <= 0) && (maxAns <= 0))
    {
        return ANS_VALID;            
    }
    
    if ((minAns > 0) && (maxAns <= 0))
    {
        if (numAns >= minAns) { return ANS_VALID;}
        else { return ANS_INVALID; }
    }
    
    if ((minAns <= 0) && (maxAns > 0))
    {
        if (numAns <= maxAns) { return ANS_VALID;}
        else { return ANS_INVALID; }
    }
    
    if ((minAns > 0) && (maxAns > 0) && (minAns == maxAns))
    {
        if (numAns == minAns) { return ANS_VALID;}
        else { return ANS_INVALID; }
    }
    
    if ((minAns > 0) && (maxAns > 0) && (minAns < maxAns))
    {
        if ((minAns <= numAns) && (numAns <= maxAns)) { return ANS_VALID;}
        else { return ANS_INVALID; }
    }
    
    return ANS_VALID;
}

function getNumberOfCheckedCheckBox(questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    var numOfChecked = 0;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'checkbox')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                if (elm.checked) {numOfChecked ++;}
            }
        }
    }
    return numOfChecked;
}

function getNumberOfCheckedRadio(questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    var numOfChecked = 0;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            if (answerIsOfQuestion(questionID, elm.value))
            {
                if (elm.checked) {numOfChecked ++;}
            }
        }
    }
    return numOfChecked;
}

// ---- Open-Ended Question Type --------------------------------------------------------------------------
function validateOpenEnded(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    
    if (requiredAnswerID == ALLOW_TO_SKIP) 
    {   
        return ANS_VALID;
    }
    
    var vchAnswer = getValue(getTxtAnswerClientID(questionID)).trim();
    if(vchAnswer == "")
    {
        if (requiredAnswerID == SKIP_WITH_ALERT) 
        {
            showHideErrorMessage(questionID, true);
            return ANS_ALERT; 
        }
        else
        {
            showHideErrorMessage(questionID, true);
            return ANS_INVALID;
        }
    }
    
    return ANS_VALID;
}

// ---- Rank-Order Question Type -------------------------------------------------------------
function validateRankOrder(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    var numberOfRow = getNumberOfRow(questionID); 

    var elm;
    var rowValueStr;
    var rankValueStr = "";
    var vchRank;
    var rowID;
    
    var ansValidCode;
    var isAnsInvalid = false;
    var isAnsAlert = false;
    
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'hidden')
        {
            rowValueStr = elm.value;
            if (elementIsOfQuestionRow(questionID, rowValueStr))
            {
                rowID = getRowIDFromRowValue(rowValueStr);
                vchRank = getValue(getTxtAnswerClientIDFromRowValue(rowValueStr)).trim();
                ansValidCode = validateRankValue(questionID, rowID, requiredAnswerID, numberOfRow, vchRank, rankValueStr);
                
                if (vchRank != "") { rankValueStr += "," + vchRank; }  
                if (ansValidCode == ANS_INVALID) {isAnsInvalid = true;}
                if (ansValidCode == ANS_ALERT) {isAnsAlert = true;}
            }
        }
    }
    
    if (isAnsInvalid)
    {
        showHideErrorMessage(questionID, true);
        return ANS_INVALID; 
    }
    if (isAnsAlert)
    {
        showHideErrorMessage(questionID, true);
        return ANS_ALERT; 
    }
    return ANS_VALID; 
}

function validateRankValue(questionID, rowID, requiredAnswerID, numberOfRow, vchRank, rankValueStr)
{
    var intRank; 
    var msgMustAnswer = "*";
    var msgInvalidInteger = getValue("msgInv_" + questionID);
    var msgOverLimit = getValue("msgOve_" + questionID);
    var msgDuplicateValue = getValue("msgDup_" + questionID);

    showRowErrorMessage(rowID, "");    
    if (vchRank == "")
    {
        if (requiredAnswerID == MUST_ANSWER) 
        { 
            showRowErrorMessage(rowID, msgMustAnswer); 
            return ANS_INVALID;
        } 
        else if (requiredAnswerID == SKIP_WITH_ALERT){ return ANS_ALERT; } 
        else { return ANS_VALID; }   
    }
    else 
    {
        if (! isInt(vchRank)) 
        { 
            showRowErrorMessage(rowID, msgInvalidInteger); 
            return ANS_INVALID;
        }
        
        try { intRank = parseInt(vchRank); }
        catch(ex) { intRank = -1; }
        
        if ((intRank < 1) || (intRank > numberOfRow))
        {
             showRowErrorMessage(rowID, msgOverLimit);
             return ANS_INVALID;        
        }  
        
        if (isDuplicateRankValue(rankValueStr, vchRank)) 
        {
             showRowErrorMessage(rowID, msgDuplicateValue);  
             return ANS_INVALID;      
        }
        
        return ANS_VALID;
    }
    
    return ANS_VALID;
}

function isDuplicateRankValue(rankValueStr, rankValue)
{
    var arrRank  = rankValueStr.split(',');
    var length = arrRank.length;
    for (var i = 0; i < length; i++)
    { 
        if ( arrRank[i] == rankValue) {return true;}
    }
    return false;
}

function showRowErrorMessage(rowID, message)
{
    var msg = document.getElementById("rErr_" + rowID);
    if (msg) { msg.innerHTML = message; }
}

//--------------------------------------------------------------------------------------------
// ---- Numeric Allocation Question Type -----------------------------------------------------
function validateNumericAllocation(questionID)
{
    var anyRowHasAnswer = false;
    var allRowHasAnswer = true;
    var elm;
    var rowValueStr;
    var vchAnswer;
    var isSumRow;
    var totalValue = 0;
    var formatID = getFormatID(questionID);    
    
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'hidden')
        {
            rowValueStr = elm.value;
            if (elementIsOfQuestionRow(questionID, rowValueStr))
            {
                isSumRow = getIsSumRowFromRowValue(rowValueStr);
                vchAnswer = getValue(getTxtAnswerClientIDFromRowValue(rowValueStr)).trim();
                if (isSumRow) 
                { 
                    totalValue = getNumericAnswerValue(formatID, vchAnswer);
                }
                else 
                { 
                    if  (vchAnswer == "") { allRowHasAnswer = false; }
                    else { anyRowHasAnswer = true;  }
                }  
            }
        }
    }
    
    var requiredAnswerID = getRequiredAnswerID(questionID);
    if ((requiredAnswerID == MUST_ANSWER) && (! allRowHasAnswer)) 
    { 
        showHideErrorMessage(questionID, true);
        return ANS_INVALID;   
    } 
    
    if ((requiredAnswerID == SKIP_WITH_ALERT) && (! anyRowHasAnswer))
    {
        showHideErrorMessage(questionID, true);
        return ANS_ALERT;   
    } 
    
    if (anyRowHasAnswer)
    {
        if (! validateTotalValue(totalValue, questionID)) 
        {
            showHideErrorMessage(questionID, true);
            return ANS_INVALID;
        }    
    }
    return ANS_VALID; 
}

function validateTotalValue(totalValue, questionID)
{
    var oper1 = string2Integer(getOperatorID1(questionID));
    var oper2 = string2Integer(getOperatorID2(questionID));
    var comparedValue1 = string2DecimalScaleFour(getNumericAllocValue1(questionID));
    var comparedValue2 = string2DecimalScaleFour(getNumericAllocValue2(questionID));
    
    return (isValidTotalValue(oper1, comparedValue1, totalValue) 
        && isValidTotalValue(oper2, comparedValue2, totalValue));
}

function isValidTotalValue(oper, comparedValue, totalValue)
{
    if (oper <= 0) { return true; }
    if (oper == 1) { if (totalValue == comparedValue) { return true; } else { return false; } }
    if (oper == 2) { if (totalValue > comparedValue) { return true; } else { return false; } }
    if (oper == 3) { if (totalValue >= comparedValue) { return true; } else { return false; } }
    if (oper == 4) { if (totalValue < comparedValue) { return true; } else { return false; } }
    if (oper == 5) { if (totalValue <= comparedValue) { return true; } else { return false; } }
    return true;
}

function recalculateTotalValue(txtAnswer, questionID)
{
    var vchAnswer = txtAnswer.value.trim();
    var formatID = getFormatID(questionID);
    if (vchAnswer != "")
    {
        if ((formatID == FMT_INTEGER) || (formatID == FMT_POSITIVE_INTEGER))
        {
             txtAnswer.value = integer2String(string2Integer(vchAnswer)); 
        } 
        else 
        { 
            txtAnswer.value = decimal2String(string2DecimalScaleFour(vchAnswer)); 
        }
    }    
    calculateTotal(questionID);
}

function calculateTotal(questionID)
{
    var elm;
    var rowValueStr;
    var vchAnswer;
    var isSumRow;
    var sumRowClientID;
    var totalValue = 0;
    var formatID = getFormatID(questionID);    
    
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'hidden')
        {
            rowValueStr = elm.value;
            if (elementIsOfQuestionRow(questionID, rowValueStr))
            {
                isSumRow = getIsSumRowFromRowValue(rowValueStr);
                vchAnswer = getValue(getTxtAnswerClientIDFromRowValue(rowValueStr)).trim();
                
                if (isSumRow) { sumRowClientID = getTxtAnswerClientIDFromRowValue(rowValueStr); }
                else { totalValue += getNumericAnswerValue(formatID, vchAnswer); }  
            }
        }
    }
    if ((formatID == FMT_INTEGER) || (formatID == FMT_POSITIVE_INTEGER))
    {
        setValue(sumRowClientID, integer2String(totalValue));
    } 
    else 
    {   
        setValue(sumRowClientID, decimal2String(roundDecimalScaleFour(totalValue))); 
    }
}

function getNumericAnswerValue(formatID, vchAnswer)
{
    if ((formatID == FMT_INTEGER) || (formatID == FMT_POSITIVE_INTEGER))
    {
        return string2Integer(vchAnswer);
    } else { return string2DecimalScaleFour(vchAnswer); }
}

// ---- Preformat Question Type ---------------------------------------------------------------
function validatePreformat(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    var elm;
    var rowValueStr;
    var rowID;
    var formatID;
    var ansValidCode;
    var isAnsInvalid = false;
    var isAnsAlert = false;
    
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'hidden')
        {
            rowValueStr = elm.value;
            if (elementIsOfQuestionRow(questionID, rowValueStr))
            {
                rowID = getRowIDFromRowValue(rowValueStr);
                formatID = getFormatIDFromRowValue(rowValueStr);
                vchAnswer = getValue(getTxtAnswerClientIDFromRowValue(rowValueStr)).trim();
                ansValidCode = validatePreFormatValue(questionID, rowID, formatID, requiredAnswerID, vchAnswer, rowValueStr);
                if (ansValidCode == ANS_INVALID) {isAnsInvalid = true;}
                if (ansValidCode == ANS_ALERT) {isAnsAlert = true;}
            }
        }
    }
    
    if (isAnsInvalid)
    {
        showHideErrorMessage(questionID, true);
        return ANS_INVALID; 
    }
    if (isAnsAlert)
    {
        showHideErrorMessage(questionID, true);
        return ANS_ALERT; 
    }
    return ANS_VALID;   
}

function validatePreFormatValue(questionID, rowID, formatID, requiredAnswerID, vchAnswer, rowValueStr)
{
    var msgMustAnswer = "*";
    showRowErrorMessageByRowValueStr(rowValueStr, "");
    if (vchAnswer == "")
    {
        if (requiredAnswerID == MUST_ANSWER) 
        { 
            showRowErrorMessageByRowValueStr(rowValueStr, msgMustAnswer); 
            return ANS_INVALID;
        } 
        else if (requiredAnswerID == SKIP_WITH_ALERT){ return ANS_ALERT; } 
        else { return ANS_VALID; }   
    }
    else 
    {
        if (formatID == FMT_DATE) 
        { 
            var isDayBeforeMonth = getIsDayBeforeMonth(questionID); 
            if (! isValidDate(vchAnswer, isDayBeforeMonth))
            {
                var msgDateFormat = getValue("msgDtFmt_" + questionID);
                showRowErrorMessageByRowValueStr(rowValueStr, msgDateFormat); 
                return ANS_INVALID;
            }
        }
        if (formatID == FMT_EMAIL) 
        {
            if (! isValidEmail(vchAnswer))
            {
                var msgInvalidEmail = getValue("msgInvEmail_" + questionID);
                showRowErrorMessageByRowValueStr(rowValueStr, msgInvalidEmail);
                return ANS_INVALID;
            }
        }
        return ANS_VALID;
    }
    return ANS_VALID;
}

function showRowErrorMessageByRowValueStr(rowValueStr, message)
{
    var rowErrorClientID = getRowErrorClientIDFromRowValue(rowValueStr);
    showRowErrorMessageByClientID(rowErrorClientID, message);
}

function showRowErrorMessageByClientID(rowErrorClientID, message)
{
    var msg = document.getElementById(rowErrorClientID);
    if (msg) { msg.innerHTML = message; }
}

function checkNumberFormat(txtAnswer, formatID)
{
    var vchAnswer = txtAnswer.value.trim();
    if (vchAnswer == "") { return; }
    
    if ((formatID == FMT_INTEGER) || (formatID == FMT_POSITIVE_INTEGER))
    {
         txtAnswer.value = integer2String(string2Integer(vchAnswer)); 
    } 
    else if ((formatID == FMT_REAL) || (formatID == FMT_POSITIVE_REAL))
    { 
        txtAnswer.value = decimal2String(string2Decimal(vchAnswer)); 
    }
}

function checkEmailFormat(txtAnswer, rowID, questionID, rowErrorClientID)
{
    showRowErrorMessageByClientID(rowErrorClientID, "");
    var vchAnswer = txtAnswer.value.trim();
    if (vchAnswer == "") { return; }
    if (! isValidEmail(vchAnswer))
    {
        var msgInvalidEmail = getValue("msgInvEmail_" + questionID);
        showRowErrorMessageByClientID(rowErrorClientID, msgInvalidEmail);
    }
}

function isValidEmail(email)
{
    var re = new RegExp(/^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$/);
    if (email.match(re)) { return true;}
    else {return false;}
}

function checkDateFormat(txtAnswer, rowID, questionID, rowErrorClientID)
{
    showRowErrorMessageByClientID(rowErrorClientID, "");
    var vchAnswer = txtAnswer.value.trim();
    if (vchAnswer == "") { return; }
    isDayBeforeMonth = getIsDayBeforeMonth(questionID); 
    if (! isValidDate(vchAnswer, isDayBeforeMonth))
    {
        var msgDateFormat = getValue("msgDtFmt_" + questionID);
        showRowErrorMessageByClientID(rowErrorClientID, msgDateFormat);
    }
}

function isValidDate(dateStr, isDayBeforeMonth)
{
    var arrDate = dateStr.split('/');
    var day, month;
    try
    {
        if (isDayBeforeMonth)
        {
            day = string2Integer(arrDate[0]);
            month = string2Integer(arrDate[1]);
        } 
        else 
        {
            month = string2Integer(arrDate[0]);
            day = string2Integer(arrDate[1]);
        }
        if ((day < 1) || (day > 31)) {return false;}
        if ((month < 1) || (month > 12)) {return false;}
    }
    catch(ex) { return true; }
    return true;
}

// ---- Demographic Question Type -------------------------------------------------------------
function anyCheckedRadioButtonList(questionID) 
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            //if (answerIsOfQuestion(questionID, elm.value))
            //{
                if (elm.checked) {return true;}
            //}
        }
    }
    return false;
}

function anySelectedValueAnswerComboBox(questionID)
{
    var cmbAnsID = getCmbAnswerClientID(questionID);
    cmbAnsID = cmbAnsID + '_Input';
    var cmbAns = document.getElementById(cmbAnsID);
    if (cmbAns.value != '') { return true; }
    return false;
}

function validateDemographic(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    if (requiredAnswerID == ALLOW_TO_SKIP) 
    {
        return ANS_VALID;
    }
    
    var showType = getQuestionShowType(questionID);
    var haveAnswer = true;
    if (showType == RADIO) { haveAnswer = anyCheckedRadioButtonList(questionID); }
    else 
    { 
        ddlAnsID = getDdlAnswerClientID(questionID);        
        var ddlAns = document.getElementById(ddlAnsID);
        if (ddlAns)
        {
            if (ddlAns.selectedIndex > 0) { haveAnswer = true; }
            else haveAnswer = false;
        }
        else
        {
            haveAnswer = anySelectedValueAnswerComboBox(questionID); 
        }
    }
     
    if (requiredAnswerID == SKIP_WITH_ALERT) 
    {
        if (haveAnswer) { return ANS_VALID; }
        else 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_ALERT; 
        }
    } 
    
    if (requiredAnswerID == MUST_ANSWER) 
    {
        if (haveAnswer) { return ANS_VALID; } 
        else 
        { 
            showHideErrorMessage(questionID, true);
            return ANS_INVALID; 
        }
    }
    
    return ANS_VALID;
}

// -- Matrix-Rating Question Type -------------------------------------------------------------
function onclickMatrixAnswer(current, questionID)
{
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    var currentRowId = getRowIDOfRadio(current.name);
    
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            if (getRowIDOfRadio(elm.name) == currentRowId)
            {
                elm.checked = false;
            }
        }
    }
    current.checked = true;
}

function getRowIDOfRadio(radioName)
{
    var arrResult = radioName.split("$");
    if (arrResult.length > 0) 
    {
        return arrResult[arrResult.length-1];
    }
    return "";
}

function validateMatrixRating(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    
    var questionRoot = document.getElementById(getQuestionRootClientID(questionID));
    var arrElement = questionRoot.getElementsByTagName("input");
    var length = arrElement.length;
    var elm;
    var hasAnswer = false;
    var matrixAnsTypeID = getMatrixAnswerTypeID(questionID);    
    var numOfRow = getNumberOfRow(questionID);    
    var numOfColumn = getNumberOfScaleItem(questionID);
    var isAbsoluteRanking = getIsAbsoluteRanking(questionID);
    var numOfCheck = 0;
    var arrRadioList = new Array();
    var lengthRadioList = 0;
    
    for(var i = 0; i < length; i++)
    {
        elm = arrElement[i];
        if (elm.type == 'radio')
        {
            arrRadioList[lengthRadioList++] = elm;
            if (elm.checked) { numOfCheck ++; }
        }
    }    
   
    if (isAbsoluteRanking == "true")
    {
        for(var i = 0; i < lengthRadioList; i++)
        {
            elm = arrRadioList[i];
            if (elm.checked) 
            {            
                for (var j = 0; j < numOfRow; j++) 
                {
                    idx = j*numOfColumn + i%numOfColumn;
                    if (idx != i && arrRadioList[idx].checked) 
                    { 
                        showHideErrorMessage(questionID, true);
                        return ANS_INVALID;
                    }
                }     
            }    
        }
    }
    
    if (requiredAnswerID == MUST_ANSWER)
    {
        if (numOfCheck == 0)
        {
            showHideErrorMessage(questionID, true);
            return ANS_INVALID;
        }
    }
    
    if (matrixAnsTypeID == MTX_REQ_AT_LEAST_ANS)
    {
        numOfReqAns = getNumOfRequiredAnswer(questionID);
        if ((numOfCheck < numOfReqAns) && (numOfCheck > 0) && (numOfReqAns > 0))
        {            
            showHideErrorMessage(questionID, true);
            return ANS_INVALID;
        }
    }
    
    if (matrixAnsTypeID == MTX_REQ_ALL_ANS)
    {
        if ((numOfCheck < numOfRow) && (numOfCheck > 0))
        {
            showHideErrorMessage(questionID, true);            
            return ANS_INVALID;
        }
    }
    
    if (requiredAnswerID == SKIP_WITH_ALERT)
    {
        if (numOfCheck == 0)
        {
            showHideErrorMessage(questionID, true);
            return ANS_ALERT;
        }
    }
    
    return ANS_VALID;
}

// ---- Compare Question Type -----------------------------------------------------------------
function validateCompare(questionID)
{
    var requiredAnswerID = getRequiredAnswerID(questionID);
    if (requiredAnswerID == ALLOW_TO_SKIP) 
    {   
        return ANS_VALID;
    }
    
    var numOfCompareRow = getNumberOfRow(questionID);
    var numOfChecked = getNumberOfCheckedRadio(questionID);
    
    if ((numOfCompareRow > 0) && (numOfChecked < numOfCompareRow))
    {
        if (requiredAnswerID == SKIP_WITH_ALERT) 
        {
            showHideErrorMessage(questionID, true);
            return ANS_ALERT; 
        }
        else
        {
            showHideErrorMessage(questionID, true);
            return ANS_INVALID;
        }   
    }
    return ANS_VALID;
}

// --Matrix-Advanced Question Type (Version 2) -------------------------------------------
function validateMatrixAdvanced(questionID)
{
    return ANS_VALID;
}

// Start - lhvu - 00064 - Clear html when alert in sap - 07/05/2008
function clearHTML(questionName)
{
    try
    {
        var reg = new RegExp("<[^>]*>","g");
        reg.global;
        
        questionName = questionName.replace(/\\r/gi,"");
        questionName = questionName.replace(/\\n/gi,"");
        questionName = questionName.replace(/\\t/gi,"");
        questionName = questionName.replace(/&nbsp;/gi, " ");
        questionName = questionName.replace(reg,""); 
        questionName = questionName.trim();
        return questionName;
    }
    catch(err)
    {
        return questionName;
    }
}
    
// End - lhvu - 00064 - Clear html when alert in sap - 07/05/2008
// ----END--------------------------------------------------------------------------