function RequiredField(sender, args)
{   

    var val = args.Value;
    if((val.indexOf("Enter ") != -1 || val=="")&& !Skip( sender.id )){
        errorCss(sender.id, true);
        toggleError(sender.id,true,"This is a Required Field");
        args.IsValid = false;
        return false;
    }else{
        errorCss(sender.id, false);
        toggleError(sender.id,false);
    }
    args.IsValid = true;
    return true;
}

function RequiredFieldShowHidden(sender, args)
{   
    var val = args.Value;
    if((val.indexOf("Enter ") != -1 || val=="")&& !Skip( sender.id )){
        errorCss(sender.id, true);
        toggleError(sender.id,true,"This is a Required Field");
        
        var fieldobj = parseFieldName(sender.id, true);
        var obj = $(fieldobj.path + 'selectedAddress');       
        obj.style.display = "block";
        
        args.IsValid = false;
        return false;
    }else{
        errorCss(sender.id, false);
        toggleError(sender.id,false);
    }
    args.IsValid = true;
    return true;
}

function RequiredDropDown(sender, args)
{   
    var val = args.Value;
    
    if((val == -1) && !Skip( sender.id )){
        errorCss(sender.id, true);
        toggleError(sender.id,true,"This is a Required Field");
        args.IsValid = false;
        return false;
    }else{
        errorCss(sender.id, false);
        toggleError(sender.id,false);
    }
    args.IsValid = true;
    return true;
}

function RequiredCheckBox(sender, args)
{   
    var fieldobj = parseFieldName(sender.id, true);
    var obj = document.getElementById(fieldobj.path + fieldobj.field);
     
    if((!obj.checked)&& !Skip( sender.id )){
        errorCss(sender.id, true);
        toggleError(sender.id,true,"This is a Required Field");
        args.IsValid = false;
        return false;
    }else{
        errorCss(sender.id, false);
        toggleError(sender.id,false);
    }
    args.IsValid = true;
    return true;
}

function validateEmail(sender, args) {
    var objRegExp  = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;
    
    if(args.Value!="" && !Skip()){
        if(!objRegExp.test(args.Value)){
            errorCss(sender.id, true);
            toggleError(sender.id,true,"Invalid Email Address");
            args.IsValid = false;
            return false;
        }else{
            errorCss(sender.id, false);
            toggleError(sender.id,false);
        }
    }
    args.IsValid = true;
    return true;
}

function validateCompare(sender, args) {
    var fieldobj = parseFieldName(sender.id, false);
    var compareWith = document.getElementById( fieldobj.path + fieldobj.field ); 
    
    if( compareWith ){
        
        if( (compareWith.value != args.Value) && !Skip() ){
            
            errorCss(sender.id, true);
            toggleError(sender.id,true,"The Fields Do Not Match");
            args.IsValid = false;
            return;
        }else{
            errorCss(sender.id, false);
            toggleError(sender.id,false);
        }
    }else{
   /*
        errorCss(sender.id, true);
    */    args.IsValid = true;
        return;
    
    }
    args.IsValid = true
}

var sender1;
var sender2;
function validateExclusive(sender, args) {
if (sender1)
    {
    if (sender1.id!=sender.id) { sender2=sender; }
    if (sender2)
        {
        var fieldobj1 = parseFieldName(sender1.id, false);
        var fieldobj2 = parseFieldName(sender2.id, false);
        var ele1 =document.getElementById(fieldobj1.path + fieldobj1.field);
        var ele2 =document.getElementById(fieldobj2.path + fieldobj2.field);
        if (ele1.value=='' || ele2.value=='')
            {
                errorCss(sender1.id, false);
                toggleError(sender1.id,false);
                errorCss(sender2.id, false);
                toggleError(sender2.id,false);
                args.IsValid = true;
                return;
            }else{
                errorCss(sender1.id, true);
                toggleError(sender1.id,true,"Can only have one or the other");
                errorCss(sender2.id, true);
                toggleError(sender2.id,true,"Can only have one or the other");
                args.IsValid = false;
            }
        }
    }
else
    {
    sender1=sender;
    args.IsValid = true;
    }
}

function checkCardNumber(sender, args)
{ 
    if(args.Value!="" && !Skip()){
   
        if(!isNumeric(args.Value)){
            if(!(isNumeric(args.Value.substring(12)) && (args.Value.substring(0,12) == "xxxxxxxxxxxx"))){
                errorCss(sender.id, true);
                toggleError(sender.id,true,"Invalid Cardnumber");
                args.IsValid = false;
                return false;
            }
        }
        else{
            errorCss(sender.id, false);
            toggleError(sender.id,false);
        }
    }
    args.IsValid = true;
    return true;  
}

function validatePhoneNumber(sender, args)
{ 
    if(args.Value!="" && !Skip()){
   
        if(!isNumeric(args.Value.replace(/ /,''))){
            if(!(isNumeric(args.Value.substring(1)) && (args.Value.substring(0,1) == "+"))){
                errorCss(sender.id, true);
                toggleError(sender.id,true,"Please enter a valid phone number.");
                args.IsValid = false;
                return false;
            }
        }
        else{
            errorCss(sender.id, false);
            toggleError(sender.id,false);
        }
    }
    args.IsValid = true;
    return true;  
}
          
function isNumeric(sText) {
   var ValidChars = "0123456789";
   var Char;
   for (i = 0; i < sText.length; i++) {
       Char = sText.charAt(i);
       if (ValidChars.indexOf(Char) == -1) {
          return false;
       }
    }
   return true;
}
function toggleError(id,show,txt){
    var fieldobj = parseFieldName(id, true);
    var msg = document.getElementById("msg_"+fieldobj.field);
    if(msg){
        if(show){
                if(msg.tagName == 'SPAN') {
                    msg.style.display = "inline";
                    }
                else{
                    msg.style.display = "block";
					msg.className = "errorMsg";
                    }
                
                msg.innerHTML = txt;
        }else{
            if(msg) msg.style.display = "none";
        }
    }
}

var flag=0;
function errorCss( id, err )
{
   
    var fieldobj = parseFieldName(id, true);
    var obj = document.getElementById("con_"+fieldobj.field);
    var sum = document.getElementById("ErrorSummary");
    
    if(obj){
        if(err){
            
            flag++;
            if( obj.className.indexOf("fieldError")==-1 ){
                obj.className = obj.className + " fieldError";
            }
            if (flag==1) {
                obj.scrollIntoView(true);
                obj.focus();
            }
            if(sum) {
                sum.style.display = "block";
            }
        }else{
            if( obj.className.indexOf("fieldError")!=-1 ){
                obj.className = obj.className.substring( 0, obj.className.indexOf("fieldError") );
                flag--;
            }
            //if(sum) sum.style.display = "none"; 
        }
    }
}

function Skip(id){
    var skipobj = document.getElementById("SkipValidation");
    var fldobj = document.getElementById(id);
    
    if(skipobj && fldobj){
    
        var ary = skipobj.value.split(",");
        var group = fldobj.getAttribute("CustomGroup");
        if(group != null){
            for( var i = 0; i < ary.length; i++ ){
                
                if( ary[i] == group ){
                    return true;
                } 
            }
        }
    }
    return false;
}



function toggleSkipGroup(group,leave){
    var obj = document.getElementById("SkipValidation");
    if(obj){
        var str = obj.value
        
        if(str.indexOf(group) > -1){
            //Remove
            if( leave != true ){
			    str = ( str.indexOf( "," + group  ) > -1 ? remove( str, "," + group ):remove( str, group) );
			    if( str.indexOf(",")==0 ){
				    str = str.substring( 1, str.length );
			    }
			}
        }else{
            //Add
			str = str + ( str == "" ? group : "," + group );
        }
		obj.value = str;
    }
}

function remove(s, t) {
    i = s.indexOf(t);
    r = "";
    if (i == -1) return s;
    r += s.substring(0,i) + remove(s.substring(i + t.length), t);
    return r;
}

function parseFieldName( id, compare ){

    var path, field
    if(id.indexOf("val_")!= -1){
        path = id.substring( 0, id.indexOf("val_") );
        field = id.substring(id.indexOf("val_") + 4);
        
        if( compare && field.indexOf("_compare")!=-1 ){
        
            field = field.substring(0, field.indexOf("_compare") + 8 );
        } else if( field.indexOf("_")!=-1 ){
            field = field.substring(0, field.indexOf("_"));
        }
        var obj = { path:path, field:field };
        return obj
    }
    return obj;    
}

// Fixes issues with RadioButtons in a repeater control
function SetUniqueRadioButton(nameregex, current)
{
   re = new RegExp(nameregex);
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (elm.type == 'radio')
      {
         if (re.test(elm.name))
         {
            elm.checked = false;
         }
      }
   }
   current.checked = true;
}

/*==================================================================================================

Application:   Utility Function
Author:        John Gardner

Version:       V1.0
Date:          18th November 2003
Description:   Used to check the validity of a UK postcode

Version:       V2.0
Date:          8th March 2005
Description:   BFPO postcodes implemented.
The rules concerning which alphabetic characters are allowed in which part of the 
postcode were more stringently implementd.
  
Version:       V3.0
Date:          8th August 2005
Description:   Support for Overseas Territories added                 
  
Version:       V3.1
Date:          23rd March 2008
Description:   Problem corrected whereby valid postcode not returned, and 'BD23 DX' was invalidly 
treated as 'BD2 3DX' (thanks Peter Graves)        
  
Version:       V4.0
Date:          7th October 2009
Description:   Character 3 extended to allow 'pmnrvxy' (thanks to Jaco de Groot)  

Version:       V4.1
8th September 2011
Support for Anguilla overseas territory added              
  
Parameters:    toCheck - postcodeto be checked. 

This function checks the value of the parameter for a valid postcode format. The space between the 
inward part and the outward part is optional, although is inserted if not there as it is part of the 
official postcode.

If the postcode is found to be in a valid format, the function returns the postcode properly 
formatted (in capitals with the outward code and the inward code separated by a space. If the 
postcode is deemed to be incorrect a value of false is returned.
  
Example call:
  
if (checkPostCode (myPostCode)) {
alert ("Postcode has a valid format")
} 
else {alert ("Postcode has invalid format")};
                    
--------------------------------------------------------------------------------------------------*/

function checkPostCode(sender, args) {

    // Permitted letters depend upon their position in the postcode.
    var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
    var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
    var alpha3 = "[abcdefghjkpmnrstuvwxy]";                         // Character 3
    var alpha4 = "[abehmnprvwxy]";                                  // Character 4
    var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5

    // Array holds the regular expressions for the valid postcodes
    var pcexp = new Array();

    // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
    pcexp.push(new RegExp("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$", "i"));

    // Expression for postcodes: ANA NAA
    pcexp.push(new RegExp("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$", "i"));

    // Expression for postcodes: AANA  NAA
    pcexp.push(new RegExp("^(" + alpha1 + "{1}" + alpha2 + "{1}" + "?[0-9]{1}" + alpha4 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$", "i"));

    // Exception for the special postcode GIR 0AA
    pcexp.push(/^(GIR)(\s*)(0AA)$/i);

    // Standard BFPO numbers
    pcexp.push(/^(bfpo)(\s*)([0-9]{1,4})$/i);

    // c/o BFPO numbers
    pcexp.push(/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);

    // Overseas Territories
    pcexp.push(/^([A-Z]{4})(\s*)(1ZZ)$/i);

    // Anguilla
    pcexp.push(/^(ai-2640)$/i);

    // Load up the string to check
    var postCode = args.Value;

    // Assume we're not going to find a valid postcode
    var valid = false;

    // Check the string against the types of post codes
    for (var i = 0; i < pcexp.length; i++) {
        if (pcexp[i].test(postCode)) {

            // The post code is valid - split the post code into component parts
            pcexp[i].exec(postCode);

            // Copy it back into the original string, converting it to uppercase and inserting a space 
            // between the inward and outward codes
            postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();

            // If it is a BFPO c/o type postcode, tidy up the "c/o" part
            postCode = postCode.replace(/C\/O\s*/, "c/o ");

            // If it is the Anguilla overseas territory postcode, we need to treat it specially
            if (args.Value.toUpperCase() == 'AI-2640') { postCode = 'AI-2640' };

            // Load new postcode back into the form element
            valid = true;

            // Remember that we have found that the code is valid and break from loop
            break;
        }
    }

    // Return with either the reformatted valid postcode or the original invalid 
    // postcode
    
    if (valid) {
        
        // get field that needs to be updated
        var fieldobj = parseFieldName(sender.id, false);
        
        //update field with new PostCode value
        document.getElementById(fieldobj.path + fieldobj.field).value = postCode;
               
    } else {
        
        // if postcode is invalid then display error message
        toggleError(sender.id, true, "Please enter a valid Post Code");
        errorCss(sender.id, true);
        return false;
        
    }
}
