Event.observe(window, 'load', function() {
    if ($('noCookies') && document.domain.indexOf('.') > 0) {
        var date = new Date();
        var cookiestr = 'TEST' + date.getTime();
        document.cookie = "cookietest=" + cookiestr + "; path=/";
        if (document.cookie.indexOf(cookiestr, 0) < 0)
            Element.show('noCookies');
    }
});

/* ***************************************************** *
 * Form processing
 * ***************************************************** */

function checkForm(formId) {
    
    if ($('required')) {
        
        // Remove any messages if they exist
        clearError();
        clearMessage();

        // Get the required fields
        var reqFields = $('required').value.split(',');
                
        var badFields = 0;

        // Iterate over each required field
        reqFields.each( function(reqField) {
            
            // If the field is something like foo|bar, make sure one or the other is supplied
            if (reqField.match(/\|/)) {
                
                var state = 0;
                
                // Get the real field names
                var fieldNames = reqField.split('|');
                var invalid = [];
                
                // Iterate over each field and check
                fieldNames.each( function(fieldName) {
                    if (checkField(fieldName)) {
                        invalid.push(fieldName);
                    }
                    else {
                        state++;
                    }
                });
                
                // If state is > 0, then we found at least one valid field
                if (! state) {
                    invalid.each( function(field) {
                        highlightField(field, 1);
                    });
                    badFields++;
                }
            }
            else {
                
                // Check for field values
                var state = checkField(reqField);
                
                // If state > 0 then we found a bad field
                badFields += state;
                
                // Highlight if it's bad
                if (state) {
                    highlightField(reqField, state);
                }
            }
        });
        
        if (badFields) {
            displayError(formId, 'Please fill in a value for all required fields');
            return false;
        }
    }
    
    return true;
}

function checkField(name) {
    
    var state = 0;
    
    var field = $(name);
    if (! field) return 0;
    
    switch (field.type.toLowerCase()) {
        case 'text':
        case 'password':
        case 'textarea':
        case 'file':                    
            var state = field.value == '' ? 1 : 0;
            break;
                                    
        case 'select-one':
            state = field.options[field.selectedIndex].value == '' ? 1 : 0;
            break;
            
        case 'select-multiple':
            state = 1;
            var options = $A(field.options);
            options.each( function(option) {
                if (option.selected && option.value != '') {
                    state = 0;
                }
            });
            break;
            
        case 'radio':
        case 'checkbox':   
            var state = 1;
            var inputs = $A(document.getElementsByName(field.name));
            inputs.each( function(input) {
                if (input.checked) {
                    state = 0;
                }
            });
            break;
    }
    
    return state;
}

function highlightField(name, on) {
    
    var field = $(name);
    if (! field) return;
    
    // Set the field background color
    field.style.background = on ? '#ffcccc' : 'white';
    
    // Get all the labels in the document
    var labels = document.getElementsByTagName('label');
    $A(labels).each( function(label) {
        
        // Set the label color if the label is for the specified field
        var labelFor = label.getAttributeNode('for'); 
        if (labelFor && labelFor.value == name) {
            label.style.color = on ? 'red' : '';
        }
    });
}

function checkAll(formId, field, val) {
    
    var form;
    if (form = $(formId)) {        
        if (form.elements[field].length) {
            $A(form.elements[field]).each( function(checkbox) {
                checkbox.checked = val;
            });
        }
        else {
            form.elements[field].checked = !form.elements[field].checked;
        }
    }
}

function checkAndSubmit(formId, field, val, action, fields) {
    
    checkAll(formId, field, false);
    
    var form;
    if (form = $(formId)) {        
        if (form.elements[field].length) {
            $A(form.elements[field]).each( function(checkbox) {
                if (checkbox.value == val) {
                    checkbox.checked = true;
                }
            });
        }
        else {
            form.elements[field].checked = true;
        }
    }

    submitForm(formId, action, fields);    
}

function submitForm(formId, action, fields) {

    if (!action) {
        return;
    }
    
    var form;
    if (form = $(formId)) {        
        
        if (fields) {
            var field_list = fields.split('&'); 
            for (i = 0; i < field_list.length; i++) {
                var field = field_list[i].split('=');
                form.elements[field[0]].value = field[1];
            }
        }
                    
        setFormField(formId, 'action', action);
        form.submit();
    }
}

function setFormField(formId, field, value) {
    
    var form;
    if (form = $(formId)) {
        form.elements[field].value = value;
    }
}

function getFormField(formId, field) {
    
    var form;
    if (form = $(formId)) {
        return form.elements[field].value;
    }
    
    return '';
}

function checkChars(value, validChars) {

    var valid = true;

    for (var i = 0; i < value.length && valid; i++) {
        if (validChars.indexOf(value.charAt(i)) == -1) {
            valid = false;
        }
    }

    return valid;
}

/* ***************************************************** *
 * Errors and messages
 * ***************************************************** */

function clearError() {
    
    if ($('required')) {

        // Get the required fields
        var reqFields = $('required').value.split(',');
        
         // Iterate over each required field
        reqFields.each( function(reqField) {
            var field = $(reqField);
            if (field) {
                highlightField(field, 0);
            }
        });
    }
    
    // Remove the error message if one exists
    var error;
    if (error = $('checkFormError')) {
        error.parentNode.removeChild(error);
    }
}

function displayError(id, message) {
    
    var obj;
    if (obj = $(id)) {
        
        error = $(document.createElement('div'));
        error.className = 'error';
        error.style.fontWeight = 'bold';
        error.id = 'checkFormError';
        errorText = document.createTextNode(message);
        error.appendChild(errorText);
        
        obj.parentNode.insertBefore(error, obj);
        
        Element.scrollTo(error);
    }
}

function clearMessage() {
    
    var message;
    if (message = $('formMessage')) {
        message.parentNode.removeChild(message);
    }
}

function displayMessage(text) {
            
    // Remove the message if one exists
    clearMessage();
        
    var editForm;
    if (editForm = $('editForm')) {
        
        message = $(document.createElement('div'));
        message.className = 'message';
        message.id = 'formMessage';
        messageText = document.createTextNode(text);
        message.appendChild(messageText);
        
        body = document.getElementsByTagName('body');
        if (body.length) {                
            body[0].insertBefore(message, editForm);
        }
    }
    
    window.scrollTo(0,0);
}