// $Id$

// Test for cookie support.  Display error message if missing.
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
 * ***************************************************** */

/*
* Check a form form required fields
*
* Looks for fields in the form with class=required. e.g.
* <form onsubmit="return checkForm(this.id);">
*       <input id="foo" class="required" />
*  </form>
*/
function checkForm(formId) {
    
    // Remove any messages if they exist
    clearError();
    clearMessage();

    // Get the required fields
    var reqFields = $$('#' + formId + ' .required');
            
    var badFields = 0;

    // Iterate over each required field
    reqFields.each( function(reqField) {
        
        // 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;
}

/*
* Checks a field to see if a value is set/selected
*/
function checkField(field) {
    
    var state = 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;
}

/*
* Highlights/Unhighlights a field
*/
function highlightField(field, on) {
    
    // Set the field background color
    if (on) field.addClassName('invalid');
    else field.removeClassName('invalid');
    
    // 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 == field.id) {
            if (on) label.addClassName('invalid');
            else label.removeClassName('invalid');
        }
    });
}

/**
* Selects all checkboxes w/in a given form/group
*/
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;
        }
    }
}


/* ***************************************************** *
 * Errors and messages
 * ***************************************************** */

/**
* Clears all errors and removes highlighting from required fields
*/
function clearError() {
    
    // Get the required fields
    var reqFields = $$('.required');
    
     // 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);
}

/**
* Displays an error message
*/
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);
    }
}

/**
* Clears an error message
*/
function clearMessage() {
    
    var message;
    if (message = $('formMessage')) {
        message.parentNode.removeChild(message);
    }
}

/**
* Displays a non-error 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);
}


/* ***************************************************** *
 * Ajax 
 * ***************************************************** */

/**
* Returns the current time as a query param
* Used in Ajax requests because of IE6 behavior that caches requests
*/
function noCacheParam() {
    var now = new Date();
    return '&r=' + now.getTime();
}

/**
* Displays an error message for Ajax requetss
*/
function ajaxFailure(request) {
    alert('There was an error processing the request: ' + request.responseText);
}

/**
* Parses JSON hash responses
*/
function jsonParse(request) {

    // Parse the JSON response
    var res = request.responseText.evalJSON(true);
    if (!res) {
        ajaxFailure(request);
        return false;
    }

    // Convert to a hash
    res = $H(res);

    return res;
}

/**
* Returns the base URL from the base href tag
*/
function baseURL() {
    var base = $$('base');
    return base.length ? base[0].href : '';
}
