// VARIABLES
var defaultEmptyOK   = false;
var checkNiceness    = true;

var digits           = "0123456789";
var digitsverify     = "0123456789Kk";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyzáéíóúñü";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚÑ";
var whiteSpace       = " \t\n\r";
var phoneChars       = "()-+ ";
var specialChars     = ",.():;#-+";
var specialChars2    = ",.?¿!¡():;%#$-+*&/=<>";

// MENSAJES
var mMessage         = "Este campo no puede ser vacío";
var pInteger         = "Este campo sólo acepta números enteros mayores o iguales a 0";
var pNumInt          = "Este campo acepta sólo Números";
var pEmail           = "Este campo acepta sólo emails";
var pNice            = "Este campo no acepta comillas";
var pDateAlphanumeric  = "Este campo acepta sólo fechas del formato establecido\no palabras";

var pName            = "Este campo acepta sólo Letras y Espacios";
var pAlphanumeric    = "Este campo acepta sólo Números y/o Letras";
var pAlphabetic      = "Este campo acepta sólo Letras";
var pNumber          = "Este campo acepta sólo Números Decimales";
var pPhoneNumber     = "Este campo acepta sólo Números y/o Caracteres ()-+";
var pDv              = "Dígito Verificador Incorrecto";
var pFdd             = "Día Incorrecto";
var pFmm             = "Mes Incorrecto";
var pFaaaa           = "Año Incorrecto";
var pNames           = "Este campo acepta sólo Letras, Numeros y Espacios";

// FUNCIONES BASICAS
function isEmpty(s)
{   
	return ( ( s == null ) || ( s.length == 0 ) )
}

function isWhitespace (c)
{
    return( whiteSpace.indexOf( c ) != -1 ) 
}

function isLetter (c)
{
    return( ( uppercaseLetters.indexOf( c ) != -1 ) ||
            ( lowercaseLetters.indexOf( c ) != -1 ) )
}

function isDigit (c)
{   
	 return( ( digits.indexOf( c ) != -1 ) )
}

function isPhone (c)
{
    return( ( phoneChars.indexOf( c ) != -1 ) || isDigit( c ) )
}

function isLetterOrDigit (c)
{   
	return ( isLetter( c ) || isDigit( c ) )
}

function isDv (c)
{
    return( digitsverify.indexOf( c ) != -1 ) 
}

function isNumInt (c)
{
    return( isInteger( c ) ) 
}

function isSpecial (c)
{
    return( specialChars.indexOf( c ) != -1 ) 
}

// FUNCIONES NUMEROS
function isInteger (s)
{   
	var i;
    if ( isEmpty( s ) ) 
       if ( isInteger.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isInteger.arguments[1] == true );
    
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if ( !isDigit( c ) ) return false;
    }
    return true;
}

function isNumber (s)
{   
	var i;
    var dotAppeared;
    dotAppeared = false;
    if ( isEmpty( s ) ) 
       if ( isNumber.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isNumber.arguments[1] == true );
    
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if( i != 0 ) {
            if ( c == "." ) {
                if( !dotAppeared )
                    dotAppeared = true;
                else
                    return false;
            } else     
                if ( !isDigit( c ) ) return false;
        } else { 
            if ( c == "." ) {
                if( !dotAppeared )
                    dotAppeared = true;
                else
                    return false;
            } else     
                if ( !isDigit( c ) && ( c != "-" ) || ( c == "+" ) ) return false;
        }
    }
    return true;
}

function isFdd (s)
{   var num;
	if (!isInteger(s)) return false;
	else{
		num = new Number(s);
		if ((num < 1) || (num>31)) return false;
		else return true;
	}
}

function isFmm (s)
{   var num;
	if (!isInteger(s)) return false;
	else{
		num = new Number(s);
		if ((num < 1) || (num>12)) return false;
		else return true;
	}
}

function isFaaaa (s)
{   var num;
	if (!isInteger(s)) return false;
	else{
		num = new Number(s);
		if ((num < 1900) || (num>2500)) return false;
		else return true;
	}
}

// FUNCIONES STRING
function isAlphabetic (s)
{   
	var i;
    if ( isEmpty( s ) ) 
       if ( isAlphabetic.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isAlphabetic.arguments[1] == true );
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );

        if ( !isLetter( c ) )
        return false;
    }
    return true;
}

function isAlphanumeric (s)
{   
	var i;
    if ( isEmpty( s ) ) 
       if ( isAlphanumeric.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isAlphanumeric.arguments[1] == true );
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if ( !(isLetter( c ) || isDigit( c ) ) )
        return false;
    }

    return true;
}

function isDatePassword (s)
{
    return isName (s)
}

function isName (s)
{
	var i;
    if ( isEmpty( s ) ) 
       if ( isName.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isName.arguments[1] == true );
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if ( !(isLetter( c ) || isWhitespace ( c ) ) )
        return false;
    }
    return true;
}

function isNames (s)
{
	var i;
    if ( isEmpty( s ) ) 
       if ( isNames.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isNames.arguments[1] == true );
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if ( !(isDigit( c ) || isWhitespace ( c ) || isLetter( c ) ) )
        return false;
    }
    return true;
}

// FUNCIONES FORMATO
function isPhoneNumber (s)
{
	var i;
    if ( isEmpty( s ) ) 
       if ( isPhoneNumber.arguments.length == 1 ) return defaultEmptyOK;
       else return ( isPhoneNumber.arguments[1] == true );
    for ( i = 0; i < s.length; i++ )
    {   
        var c = s.charAt( i );
        if ( !( isPhone( c ) ) ) 
			return false;
    }
    return true;
}

function isNice(s)
{
        var i = 1;
        while( i < s.length ) {
                if( ( s.charAt( i ) == "\"" ) || ( s.charAt( i ) == "'" ) ) return false;
                i++;
        }
        return true;
}

// FUNCIONES CHECKFIELD
function Empty (theField)
{
    alert(mMessage);
	theField.focus();
    return false;
}

function Invalid (theField, s)
{
	theField.select();
	alert(s);	
    theField.focus();
    return false;
}

function checkField (theField, theFunction, emptyOK )
{   
    var msg;
    if (checkField.arguments.length < 3) 
		emptyOK = defaultEmptyOK;
		
	if( theFunction == isInteger ) msg = pInteger;
	if( theFunction == isNumber ) msg = pNumber;
	if( theFunction == isAlphabetic ) msg = pAlphabetic;
	if( theFunction == isAlphanumeric ) msg = pAlphanumeric;
	if( theFunction == isName ) msg = pName;
	if( theFunction == isNames ) msg = pNames;
	if( theFunction == isPhoneNumber ) msg = pPhoneNumber;
	if( theFunction == isEmail ) msg = pEmail;
	if( theFunction == isNice ) msg = pNice;
	if( theFunction == isDv ) msg = pDv;
	if( theFunction == isDatePassword ) msg = pDateAlphanumeric;
	if( theFunction == isNumInt ) msg = pNumInt; 
	if( theFunction == isFdd ) msg = pFdd; 	
	if( theFunction == isFmm ) msg = pFmm; 	
	if( theFunction == isFaaaa ) msg = pFaaaa; 	
 
    if ((emptyOK == true) && (isEmpty(theField.value))) 
		return true;

    if ((emptyOK == false) && (isEmpty(theField.value))) 
        return Empty(theField);

    if ( checkNiceness && !isNice(theField.value))
        return Invalid(theField, pNice);

    if (theFunction(theField.value) == true) 
        return true;
    else
        return Invalid(theField,msg);

}

function checkDV(objRut, objDV, emptyOK)
{

	rut = objRut.value;
	drut = objDV.value;
	rut = rut.replace(/ /g, "");
	drut = drut.replace(/ /g, "");
    
	if (( rut == "0" ) || ( rut == "00" ) || ( rut == "000" ) || ( rut == "0000" ) || ( rut == "00000" ) || ( rut == "000000" ) ||( rut == "0000000" ) || ( rut == "00000000" ))     
	{
		alert("El rut ingresado es incorrecto")    	
		objRut.focus();
		return false;    
	}

	if((rut == "") && (drut == "") && (emptyOK)) return true;
	var dvr = '0'  	
	suma = 0  	
	mul  = 2	  	
	for (i= rut.length -1 ; i >= 0; i--)    
	{    	
		suma = suma + rut.charAt(i) * mul        
		if (mul == 7)        	
			mul = 2        
		else            	
			mul++    
	}  	
	res = suma % 11  	
	if (res==1)    	
		dvr = 'k'  	
	else  		
		if (res==0)    		
			dvr = '0'  		
		else    	
		{      		
			dvi = 11-res      		
			dvr = dvi + ""    	
		}  	
	if ( dvr != drut.toLowerCase() )    
	{
		alert("El rut ingresado es incorrecto")    	
		objRut.focus();
		return false;    
	}
	else
		return true;	
}

        function isDate(dateStr){

                var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
                var matchArray = dateStr.match(datePat); // is the format ok?

                if (matchArray == null){
                        alert("Por favor ingrese una fecha dd/mm/aaaa o dd-mm-aaaa.");
                        dateStr.select();
                        dateStr.focus();
                        return false;
                }

                day = matchArray[1]; // parse date into variables
                month = matchArray[3];
                year = matchArray[5];

                if (month < 1 || month > 12){ // check month range
                        alert("El Mes debe estar entre 1 y 12");
                        dateStr.select();
                        dateStr.focus();
                        return false;
                }

                if (day < 1 || day > 31){
                        alert("El Dia debe estar entre 1 y 31.");
                        dateStr.select();
                        dateStr.focus();
                        return false;
                }

                if ((month==4 || month==6 || month==9 || month==11) && day==31){
                        alert("El Mes "+month+" no tiene 31 dias!")
                        dateStr.select();
                        dateStr.focus();
                        return false;
                }

                if (month == 2){ // check for february 29th
                        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
                        if (day > 29 || (day==29 && !isleap)){
                                alert("El año " + year + ", Febrero no tiene " + day + " dias!");
                                        dateStr.select();
                                        dateStr.focus();
                                return false;
                        }
                }
                return true; // date is valid
        }

//valida email
function isEmail(correo) {
                value = correo.value;
                var largo= value.length;
                var pt1=0;
                var pt2=0;
                var pt3=0;
                var arro=0;

                if (value == "")
                        return false;

                for(i=0;i<largo;i++){
                        c=value.charAt(i);
                        if (c=="@"){
                                if (arro == 0 && i != 0 && i < (largo - 5))
                                        arro=i;
                                else{
                                        alert("Correo Invalidado");
                                        correo.select();
                                        correo.focus();
                                        return false;
                                }
                        }
                        else
                                if (c=="."){
                                        if ((pt1 == 0) && (i > 2)  && (i < (largo - 2)))
                                                pt1=i;
                                        else
                                                if((pt2 == 0) && (i > (pt1+2)) && (pt1 > 0) && (i < (largo - 2)))
                                                        pt2 = i;
                                                else
                                                        if((pt3 == 0) && (i > (pt2+2))  && (pt2 > 0) && (i < (largo - 2)))
                                                                pt3 = i;
                                                        else{
                                                                alert("Correo Invalidado");
                                                                correo.select();
                                                                correo.focus();
                                                                return false;
                                                        }
                                }
                                else
                                if((c=="%") || (c == "#") || (c == "$") || (c == "&") || (c == "/") || (c == "?") || (c == "¡") || (c == "!") || (c == ";") || (c == ",") || (c == "+") || (c == "=") || (c == "<")  || (c == ">") || (c == "|") || (c == "`") || (c == "'") || (c == "'") || (c == "{") || (c == "}") || (c == " ")){
                                        alert("Correo Invalidado");
                                        correo.select();
                                        correo.focus();
                                        return false;
                                }
                        }
                        if((arro >= 3) && (arro < (largo-5)))
                                if((pt1 > 1)  && (pt1 < (largo-2)))
                                        if (pt2 > pt1)
                                                if (pt3 > pt2)
                                                        if (arro > pt3){
                                                                alert("Correo Invalidado");
                                                                correo.select();
                                                                correo.focus();
                                                                return false;
                                                        }
                                                        else
                                                                return true;
                                                else
                                                        if (arro > pt2){
                                                                alert("Correo Invalidado");
                                                                correo.select();
                                                                correo.focus();
                                                                return false;
                                                        }
                                                        else
                                                                return true;
                                        else
                                                if (arro > pt1){
                                                        alert("Correo Invalidado");
                                                        correo.select();
                                                        correo.focus();
                                                        return false;
                                                }
                                                else
                                                        return true;
                                else{
                                        alert("Correo Invalidado");
                                        correo.select();
                                        correo.focus();
                                        return false;
                                }
                        else{
                                alert("Correo Invalidado");;
                                correo.select();
                                correo.focus();
                                return false;
                        }
        }

function printPage()
{
    // Do print the page
    if (typeof(window.print) != 'undefined') {
        window.print();
    }
}


