/******************* Generic Form and Control Manipulation ***************/

function SFGetControlSet(ctlSet)
{
    return document.getElementsByName(ctlSet) ; 
}

function SFGetControl(ctlName)
{
    return document.getElementById(ctlName) ; 
}


function SFGetLabelValue( ctlName )
{
    ctl = document.getElementById(ctlName) ; 

    return ctl.innerHTML;
}

function SFGetRadioValue(ctlSet)
{
    var radios = SFGetControlSet(ctlSet) ;
    if (radios == null)    
        return null ;  

    if (radios.length == null || radios.length == 0)
       return (radios.checked?radios.value:null) ; 

    for (var ii=0 ; ii<radios.length ; ++ii)
        if (radios[ii].type != 'radio')
            return null ;  
        else if (radios[ii].checked)
            return radios[ii].value ; 

    return null ;
}

function SFGetRadioDefaultValue(ctlSet)
{
    var radios = SFGetControlSet(ctlSet) ;
    if (radios == null)
        return null ;  

    for (var ii=0 ; ii<radios.length ; ++ii)
        if (radios[ii].type != 'radio')
            return null ;  
        else if (radios[ii].defaultChecked)
            return radios[ii].value ; 
            
    return null ;
}

function SFGetSelectListLength(ctlName)
{
    return SFGetControl(ctlName).options.length ;
}

function SFGetSelectValue(ctlSet)
{
    var options = document.getElementById(ctlSet) ;
    if (options == null)
        return null ;  

    for (var ii=0 ; ii<options.length ; ++ii)
        if (options[ii].selected)
            return options[ii].value ; 

    return null ;
}

function SFGetSelectDefaultValue(ctlSet)
{
    var options = document.getElementById(ctlSet) ;
    if (options == null)
        return null ;  

    for (var ii=0 ; ii<options.length ; ++ii)
        if (options[ii].defaultSelected)
            return options[ii].value ; 

    return null ;
}

function SFGetCheckboxState(ctlName)
{
    return SFGetControl(ctlName).checked ; 
}

function SFRemoveAllWhitespace(strValue)
{
    return strValue.replace(/\s/gi, "") ; 
}

function SFReplaceDoubleQuotes(ctlName)
{
	var control = SFGetControl(ctlName);
	control.value = control.value.replace(/"/g, "'") ; 
}

function SFEditFieldValue(ctlName)
{
    return SFRemoveAllWhitespace(SFGetControl(ctlName).value) ;
}

function SFEditFieldHasValue(ctlName)
{
    return (SFEditFieldValue(ctlName) != "") ;
}

function SFEditFieldIsDate(ctlName)
{   
    var ctl = SFGetControl(ctlName) ;
  
	var dateRE = /^ *([01]?\d)[\-|\/\.]([0123]?\d)[\-|\/\.]([12][8901]\d{2}) *$/ ;
	if (dateRE.test(ctl.value))
	{
		var match = ctl.value.match(dateRE) ; 
		if (match.length == 4)
		{
		    var testDate = new Date(match[3], Number(match[1])-1, match[2]) ;   

            if (testDate.getFullYear() == match[3] && 
                testDate.getMonth()    == Number(match[1])-1 &&
                testDate.getDate()     == match[2])
                return true ; 
		}
	}
    return false ;             
}

function SFEditFieldMatchesRegEx(ctlName, regEx)
{
    return (SFGetControl(ctlName).value.match(regEx) != null); 
}


/********************** Hide and Show Support ****************************/
function internal_ActionByType(type, action)
{
    var ctls = document.getElementsByTagName(type) ;
    
    var returnValue = true ; 
    for (var ii=0 ; ii<ctls.length ; ++ii)
        if (ctls[ii].name.indexOf("cmsForms_") == 0)
            switch (action)
            {
                case "disable":
                    SFDisableControl(ctls[ii].name) ; 
                    break ;
                case "reset":
                    SFResetToDefault(ctls[ii].name) ;
                    break ; 
                case "enable":
                    SFEnableControl(ctls[ii].name) ; 
                    break ;
                case "validate":
                    returnValue &= SFValidateControl(ctls[ii].name) ; 
                    break ;   
                case "clearCheck":
                    if (ctls[ii].type == "checkbox")
                        ctls[ii].checked = false ;                   
            }
            
    return returnValue ;            
}
function SFClearCheckBoxes()
{
    internal_ActionByType("input", "clearCheck") ; 
}

function SFDisableAll()
{
    internal_ActionByType("input", "disable") ; 
    internal_ActionByType("textarea", "disable") ; 
    internal_ActionByType("select", "disable") ; 
}

function SFResetAll()
{
    internal_ActionByType("input", "reset") ; 
    internal_ActionByType("textarea", "reset") ; 
    internal_ActionByType("select", "reset") ; 
}

function SFEnableAll()
{
    internal_ActionByType("input", "enable") ; 
}

function SFValidateAll(ctl)
{
    var allPassed = true ; 
    
    allPassed &= internal_ActionByType("select", "validate") ;
    allPassed &= internal_ActionByType("input", "validate") ;
    allPassed &= internal_ActionByType("textarea", "validate") ;

    if (allPassed)
        ctl.form.submit() ;
}

function SFValidateControl(ctlName)
{
    var messageName = "alert_" + ctlName ; 
    var controlIsValid = true ; 
    
    var ctl = document.getElementById(ctlName) ; 
    var displayName = ctlName.substring(ctlName.indexOf('_')+1); 
    var bIsRequired = false ; 
    if (ctl)
    {
        if (ctl.attributes["errorMessage"] && ctl.attributes["errorMessage"].value != "")
            displayName = ctl.attributes["errorMessage"].value ; 
        bIsRequired = ctl.attributes["isRequired"]  && ctl.attributes["isRequired"].value=='true' ;             
    }    

    if (ctl && ctl.tagName == "SELECT")
    {
        if (bIsRequired)
        {
            var selectedValue = SFGetSelectValue(ctlName) ; 
            if (!selectedValue || selectedValue == "")
                controlIsValid = false ;             
        }

        SFRespondToValidation(controlIsValid, messageName, displayName) ; 
    }
    else if (ctl && ctl.tagName == 'INPUT' && ctl.type=='checkbox')
    {
        if (bIsRequired)
        {
            controlIsValid = ctl.checked ;
            SFRespondToValidation(controlIsValid, messageName, displayName) ; 
        }
    }
    else if (!ctl || (ctl.tagName == 'INPUT' && ctl.type=='radio'))
    {
        if (!ctl)
        {
            var ctlGroup = document.getElementsByName(ctlName) ; 
            if (ctlGroup && ctlGroup.length > 0)
                bIsRequired =  ctlGroup[0].attributes["isRequired"]  && ctlGroup[0].attributes["isRequired"].value=='true'                
        }
    
        if (bIsRequired)
        {
            var selectedValue = SFGetRadioValue(ctlName) ; 
            if (!selectedValue || selectedValue == "")
                controlIsValid = false ;             
        }

        SFRespondToValidation(controlIsValid, messageName, displayName) ; 
    }
    else // input and textareas
    {
		SFReplaceDoubleQuotes(ctlName);
        bNeedsValidation = (ctl.attributes["validationType"] && ctl.attributes["validationType"].value != 'None') ; 
    
        if (bIsRequired && !SFEditFieldHasValue(ctlName))
            controlIsValid = false ; 
        else if (bNeedsValidation && !SFEditFieldMatchesRegEx(ctlName, ctl.attributes["regExp"].value))
            controlIsValid = false ; 

        SFRespondToValidation(controlIsValid, messageName, displayName) ; 
    }
    
    return controlIsValid ; 
}

function internal_MaskEdit(ctl)
{
    ctl.readOnly = true ; 
    ctl.style.border = "0 solid #FFFFFF" ; 
    ctl.style.backgroundColor = "#FFFFFF" ; 
    ctl.style.color = "#000000" ; 
}

function SFEnableControl(ctlName)
{
    var ctls = document.getElementsByName(ctlName) ; 
    
    for (var ii=0 ; ii<ctls.length ; ++ii)
        ctls[ii].disabled = false ; 
}

function SFDisableControl(ctlName)
{
    var ctl = document.getElementById(ctlName) ; 
    if (ctl && ctl.tagName == "SELECT")
    {
        var parentNode = ctl.parentNode ;
        if (!parentNode)
            return window.alert ("No parent element found for " + ctlName); 
            
        var inputControl = document.createElement("input") ; 
        if (!inputControl)
            return window.alert ("Unable to create element for " + ctlName) ; 

        if (ctl.selectedIndex >= 0)
            inputControl.value     = ctl.options[ctl.selectedIndex].text ;   
        inputControl.className = ctl.className ;              
        parentNode.insertBefore(inputControl, ctl) ;
        internal_MaskEdit(inputControl); 
        
        ctl.style.display = "none" ;         
    }
    else if (ctl && ctl.tagName == 'INPUT' && ctl.type=='checkbox')
        ctl.disabled = true ; 
    else if (!ctl || (ctl.tagName == 'INPUT' && ctl.type=='radio'))
    {
        var ctlGroup = document.getElementsByName(ctlName) ; 
        for (var ii=0 ; ii<ctlGroup.length ; ++ii)
            ctlGroup[ii].disabled = true ;
    }
    else // input and textareas
        internal_MaskEdit(ctl); 
}

function SFResetToDefault(ctlName)
{
    var ctl = document.getElementById(ctlName) ; 
    if (ctl && ctl.tagName == "SELECT")
    {
        var selectedIndex = -1 ; 
        for (var ii=0 ; ii<ctl.options.length ; ++ii)
            if (ctl.options[ii].defaultSelected)
                selectedIndex = ii ; 
                
        ctl.selectedIndex = selectedIndex ;                 
    }
    else if (ctl && ctl.tagName == 'INPUT' && ctl.type=='checkbox')
        ctl.checked = ctl.defaultChecked ; 
    else if (!ctl || (ctl.tagName == 'INPUT' && ctl.type=='radio'))
    {
        var ctlGroup = document.getElementsByName(ctlName) ; 
        for (var ii=0 ; ii<ctlGroup.length ; ++ii)
            ctlGroup[ii].checked = ctlGroup[ii].defaultChecked ;
    }
    else // input and textareas
        ctl.value = ctl.defaultValue ; 
}

function SFControlIsEnabled(ctlName)
{
    return document.getElementById(ctlName)!=null && !document.getElementById(ctlName).disabled ;
}

function SFControlExists(ctlName)
{
    return SFGetControl(ctlName)!=null ;
}

/************************* Change Detection ******************************/
function SFValueHasChanged(ctlName)
{
    var ctl = SFGetControl(ctlName) ; 
    if (ctl == null)
        return ; 

    var value ;         
    if (!ctl.tagName)
        value = SFGetRadioValue(ctlName) ; 
    else if (ctl.tagName == "SELECT")
        value = SFGetSelectValue(ctlName) ;    
    else if (ctl.tagName == 'INPUT' && ctl.type=='checkbox')
        value = ctl.checked?ctl.value:"" ; 
    else
        value = ((!ctl.value)?"":ctl.value) ; 

    var defaultValue ;         
    if (!ctl.tagName)
        defaultValue = SFGetRadioDefaultValue(ctlName) ; 
    else if (ctl.tagName == "SELECT")
        defaultValue = SFGetSelectDefaultValue(ctlName) ;    
    else if (ctl.tagName == 'INPUT' && ctl.type=='checkbox')
        defaultValue = ctl.defaultChecked?ctl.value:"" ; 
    else
        defaultValue = ((!ctl.defaultValue)?"":ctl.defaultValue) ; 
        
    defaultValue = (defaultValue?defaultValue:"") ; 
    value = (value?value:"") ;        

    return (defaultValue != value) ; 
}

/****************** OnLoad Control Value Setting *************************/
function SFSetRadioValue(ctlName, ctlValue)
{
    var ctl = SFGetControl(ctlName) ; 
    if (ctl == null)
        return ; 
        
    if (ctl.length && ctl.length > 0)
        for (var ii=0 ; ii<ctl.length ; ++ii)
            ctl.checked = (ctl.value == ctlValue) ; 
    else 
        ctl.checked = (ctl.value == ctlValue) ; 
}

function SFClearRadioButton(ctlName, ctlValue)
{
    var ctl = SFGetControl(ctlName) ; 
    if (ctl == null)
        return ;
        
    for (var ii=0 ; clt.length && ii<ctl.length ; ++ii)        
        if (ctl[ii].value == ctlValue)
            ctl[ii].selected = ctl[ii].checked = false ; 
}
function SFSetControlValue(ctlName, ctlValue, bFireChangeEvent)
{
    var ctl = document.getElementById(ctlName) ; 
    if (ctl == null)
    {
        ctl = document.getElementsByName(ctlName) ; 
        if (ctl == null || ctl.length == 0)
            return ;
    }

    if (ctl.length && ctl.length > 0)
    {
        for (var ii=0 ; ii<ctl.length ; ++ii)        
        {
            if (ctl[ii].value == ctlValue)
            {
                ctl[ii].selected = true ; 
                ctl[ii].checked = true ; 
                ctl[ii].defaultChecked = true ;
                ctl[ii].defaultSelected = true ;
                if (bFireChangeEvent && ctl[ii].onclick)
                    ctl[ii].onclick() ;
            }                        
        }

        // Handle dropdown's where the method is on the select            
        if (bFireChangeEvent && ctl.onchange)
            ctl.onchange() ;        
    }
    else if (ctl.tagName == 'INPUT' && ctl.type == 'radio')
    {
        var ctlGroup = document.getElementsByName(ctlName) ; 
        for (var ii=0 ; ii<ctlGroup.length ; ++ii)
            if (ctlGroup[ii].value == ctlValue)
            {
                ctlGroup[ii].checked = true ; 
                if (bFireChangeEvent && ctl.onclick)
                    ctl.onclick() ;        
            }
    }
    else if (ctl.tagName == 'INPUT' && ctl.type == 'checkbox')
    {
        ctl.defaultChecked = ctl.checked = (ctlValue != "" && ctlValue != 0 && ctlValue != "No"  && ctlValue != "off" && ctlValue != false) ; 
        if (bFireChangeEvent && ctl.onclick)
            ctl.onclick() ;
    }
    else
    {        
        ctl.value = ctlValue ; 
        ctl.defaultValue = ctlValue ; 
        if (bFireChangeEvent && ctl.onchange)       
            ctl.onchange() ; 
    }
}

/******************* Message Area Manipulation ***************************/
function SFExtractMessageControl()
{
    return document.getElementById("cmsForms_DataNotProvided") ; 
}

function SFFindMessage(msgCtl, msgName)
{
    return document.getElementById(msgName) ;
}

function SFAddMessage(msgName, msgText)
{
    var msgCtl = SFExtractMessageControl() ; 
    if (SFFindMessage(msgCtl, msgName))
        return ; 

    var newMessage = document.createElement("DIV") ; 
    newMessage.className = 'SFMessage' ; 
    newMessage.id = msgName ; 
    newMessage.innerHTML = "&nbsp;&nbsp;&nbsp;" + msgText;
    
    msgCtl.appendChild(newMessage);

    msgCtl.style.display = "block" ; 
    return true;
}

function SFRemoveMessage(msgName)
{
    var msgCtl = SFExtractMessageControl() ; 
    var ctlToRemove = SFFindMessage(msgCtl, msgName) ;
    if (ctlToRemove == null)
        return ; 
    msgCtl.removeChild(ctlToRemove) ;
}

function SFDisplayMessage(msgName, message) 
{
    if (SFFindMessage(SFExtractMessageControl(), msgName))
        return ; 

    SFAddMessage(msgName, message) ;
}

function SFRespondToValidation(testHasPassed, msgName, message)
{
    if (testHasPassed)
    {
        SFRemoveMessage(msgName) ; 
        return true ; 
    }
    else
    {
        SFDisplayMessage(msgName, message) ; 
        return false ; 
    }
}

