/*global SISAL */

/**
 * La variabile rappresenta il namespace utilizzato per tutto il codice javascript di interfaccia con il sistema gestore conti (ams).
 */
SISAL.AMS = (function AMS() {
    
    var isAlphaSpan = "a-zA-Z",
        isAlphaRegExp = new RegExp("[" + isAlphaSpan + "]+"),
        isNotAlphaRegExp = new RegExp("[^" + isAlphaSpan + "]+"),
        isAlphaNumSpan = "a-zA-Z0-9",
        isAlphaNumRegExp = new RegExp("[" + isAlphaNumSpan + "]+"),
        isNotAlphaNumRegExp = new RegExp("[^" + isAlphaNumSpan + "]+"),
        hasAlphaRegExp = new RegExp(".*[" + isAlphaSpan + "]+.*"),
        isNumRegExp = new RegExp("\\d+"),
        isNotNumRegExp = new RegExp("\\D+"),
        hasNumRegExp = new RegExp(".*\\d+.*");
    
    /**
     * La funzione verifica se un valore contiene solo lettere dell'alfabeto.
     * @param value il valore da verificare (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isAlpha(value)
    {
        return !SISAL.isNullOrEmpty(value) && isAlphaRegExp.test(value) && !isNotAlphaRegExp.test(value);
    }
    
    /**
     * La funzione verifica se un valore contiene solo lettere dell'alfabeto o numeri.
     * @param value il valore da verificare (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isAlphaNum(value)
    {
        return !SISAL.isNullOrEmpty(value) && isAlphaNumRegExp.test(value) && !isNotAlphaNumRegExp.test(value);
    }
    
    /**
     * La funzione verifica se un valore contiene solo lettere dell'alfabeto (almeno una) e numeri (almeno uno).
     * @param value il valore da verificare (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isStrictAlphaNum(value)
    {
        return isAlphaNum(value) && hasAlphaRegExp.test(value) && hasNumRegExp.test(value);
    }
    
    /**
     * La funzione verifica se un valore contiene solo lettere dell'alfabeto o caratteri inclusi nell'elenco.
     * @param value il valore da verificare (obbligatorio) STRING
     * @param chars i caratteri ammissibili (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isAlphaSp(value, chars)
    {
        return !SISAL.isNullOrEmpty(value) && (new RegExp("[" + isAlphaSpan + chars + "]+")).test(value) && !(new RegExp("[^" + isAlphaSpan + chars + "]+")).test(value);
    }
    
    /**
     * La funzione verifica se un valore contiene solo lettere dell'alfabeto, numeri o caratteri inclusi nell'elenco.
     * @param value il valore da verificare (obbligatorio) STRING
     * @param chars i caratteri ammissibili (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isAlphaNumSp(value, chars)
    {
        return !SISAL.isNullOrEmpty(value) && (new RegExp("[" + isAlphaNumSpan + chars + "]+")).test(value) && !(new RegExp("[^" + isAlphaNumSpan + chars + "]+")).test(value);
    }
    
    /**
     * La funzione verifica se un valore ha lunghezza compresa tra min e max inclusi, oppure pari a min se max è omesso.
     * @param value il valore da verificare (obbligatorio) STRING
     * @param min la lunghezza minima o la lunghezza, se max è omesso (obbligatorio) NUMBER
     * @param max la lunghezza massima (opzionale, default: null) NUMBER
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isLong(value, min, max)
    {
        return !SISAL.isNullOrEmpty(value) && (value.length >= min && value.length <= (SISAL.isNullOrEmpty(max) ? min : max));
    }
    
    /**
     * La funzione verifica se un valore contiene solo numeri.
     * @param value il valore da verificare (obbligatorio) STRING
     * @return true se la verifica ha esito positivo, false altrimenti
     * @type boolean
     */
    function isNum(value)
    {
        return !SISAL.isNullOrEmpty(value) && isNumRegExp.test(value) && !isNotNumRegExp.test(value);
    }
    
	return {
	    isAlpha: isAlpha,
        isAlphaNum: isAlphaNum,
        isStrictAlphaNum: isStrictAlphaNum,
        isAlphaSp: isAlphaSp,
        isAlphaNumSp: isAlphaNumSp,
	    isLong: isLong,
	    isNum: isNum
	};
}());

if (SISAL.logger.isInfoEnabled())
{
    SISAL.logger.info("SISAL.AMS - namespace creato");
}
