String.prototype.findAndReplace = function(search, replacement) {
    return this.split(search).join(replacement);
};

function createElement(element) {
    if (document.createElementNS) {
        return document.createElementNS('http://www.w3.org/1999/xhtml', element);
    }
    if (document.createElement) {
        return document.createElement(element);
    }
    return false;
}

function getStyle(element, cssProp, cssPropName){
    if (element.currentStyle) {
        return element.currentStyle[cssProp];
    } else if (window.getComputedStyle){
        var elementStyle = window.getComputedStyle(element, "")
        return elementStyle.getPropertyValue(cssPropName)
    }
}

function isAllWhitespace(node) {
    return !(/[^\t\n\r ]/.test(node.data));
}

function toggleSelect(id, obj) {
    if (!document.getElementById) return;
    
    if (obj.value.indexOf('Deselect') != -1) {
        var val = false;
        obj.value = 'Select All';
    } else {
        var val = true;
        obj.value = 'Deselect All';
    }
	
    var form = document.getElementById(id);
    for (var i = 0; i < form.elements.length; ++i) {
    	  if (form.elements[i].type == 'checkbox') {
            form.elements[i].checked = val;
        }
    }
}

function getSearchTerm(obj) {
    if (!obj) return 'search';
    var searchTerm = obj.value.toLowerCase();
    return searchTerm.findAndReplace(' ', '');  
}

function checkSearch(field) {
    if (document.getElementById) {
        var searchTerm = getSearchTerm(document.getElementById(field));
        if (searchTerm == 'search') {
           alert("Please enter a valid search term.");
           return false;
        } else if (searchTerm.length < 3) {
           alert("Your search term must be at least 3 characters long.");
           return false;
        }
    }
    return true;
}

function checkAdvancedSearch() {
    if (document.getElementById && document.getElementsByTagName) {
        var searchForm = document.getElementById('advanced-search-form');
        var searchFields = searchForm.getElementsByTagName('input');
         
        var emptyFields = 0;
        var totalFields = 0;
        for (var i = 0; i < searchFields.length; ++i) {
            if (searchFields[i].getAttribute('type') == 'text') {
                ++totalFields;

                var val = searchFields[i].value.findAndReplace(' ', '');
                if (val.length < 3) {
                    ++emptyFields;
                }
            }
        }
        if (emptyFields == totalFields) {
            alert("You must enter a search term with at least 3 characters");
            return false;
        }
    }
    return true;
}

function toggleSearchField(obj, txt1, txt2) {
    var searchTerm = getSearchTerm(obj);
    if (searchTerm == txt1) {
        obj.value = txt2;
    }
}


function toggleHighlighting(link) {
    if (document.getElementsByTagName) {
        var highlighted = '';
        var spans = document.getElementsByTagName('span');
        for (var i = 0; i < spans.length; ++i) {
            if (spans[i].className == 'highlight-text') {
                if (highlighted == '') {
                    highlighted = searchTextNodes(spans[i], '');
                }
                spans[i].className = 'highlight-text-' + highlighted;
            } else if (spans[i].className.indexOf('highlight-text') != -1) {
                spans[i].className = 'highlight-text';
            } 
        }
        if (highlighted == '') {
            var linkText = document.createTextNode('Highlighting off');
        } else {
            var linkText = document.createTextNode('Highlighting on');
        }
        link.replaceChild(linkText, link.firstChild);

        return false;
    }
    return true;
}


function searchTextNodes(node, txt) {
    if (node.nodeType == 3) {
        return node.nodeValue;
    }
    var kids = node.childNodes;
    var txt = '';
    for (var i = 0; i < kids.length; ++i) {
        txt += searchTextNodes(kids[i], txt);
    }
    return txt;
}

function contactMessage(contactForm) {
    if (document.getElementsByTagName) {
        var inputs = contactForm.getElementsByTagName('input');
        var numInputs = inputs.length;
        for (var i = 0; i < numInputs; ++i) {
            if (inputs[i].hasAttribute && inputs[i].hasAttribute('type') && inputs[i].getAttribute('type').toLowerCase() == 'submit') {
                var msg = createElement('p');
                msg.appendChild(document.createTextNode('Your message is being sent, this may take a few moments. Thank your for your patience'));
                inputs[i].parentNode.insertBefore(msg, inputs[i]);
                break;
            }
        }
    }
}

function validate(contactForm) {
    if (document.getElementById && document.getElementsByTagName && document.createTextNode) {
        var error = false;

        var formLabels = contactForm.getElementsByTagName('label');
        var paragraphs = contactForm.getElementsByTagName('p');

        for (var i = paragraphs.length - 1; i > -1; --i) {
            if (paragraphs[i].className == 'error-msg') {
                paragraphs[i].parentNode.removeChild(paragraphs[i]);
            }
        }

        for (var i = 0; i < formLabels.length; ++i) {
            var labelTxt = searchTextNodes(formLabels[i], '');

            if (labelTxt.indexOf('*') != -1) {
                var id = formLabels[i].htmlFor;    

                var formField = document.getElementById(id);

                var formFieldValue = (formField.nodeName.toLowerCase() == 'select') ? formField.options[formField.selectedIndex].value : formField.value;
                formFieldValue = formFieldValue.replace(' ', '');
                if (formFieldValue == '' || (labelTxt.indexOf('Email') != -1 && !validateEmail(formFieldValue))) {
                    error = true;
                    displayErrorMessage(formLabels[i]);
                }     
            }
        }
        return !error;
    }
    return true;
}

function displayErrorMessage(target, message) {
    if (!message) {
        var message = 'The ' + searchTextNodes(target, '').replace(/:|\*/g, '') + ' field must be filled in.';
    }
    var errorTag = createElement('p');
    errorTag.appendChild(document.createTextNode(message));
    errorTag.className = 'error-msg';

    var paragraphs = target.parentNode.getElementsByTagName('p');
    var n = paragraphs.length;
    while (n--) {
        if (paragraphs[n].className == 'error-msg') {
            target.parentNode.removeChild(paragraphs[n]);
        }
    }
    target.parentNode.appendChild(errorTag);
}

function validateEmail(email) {
    if (window.RegExp) {
        var regExp = /^([a-zA-Z0-9_\.\-])+\@([a-zA-Z0-9_\-]+\.)([a-zA-Z0-9\.]{2,})$/;
        return (regExp.test(email));
    }
    return (email.indexOf('@') != -1 && email.indexOf('.') != -1);
}


function checkSearchInput(id) {
    if (document.getElementById) {
        var searchBox = document.getElementById(id);
        var searchVal = searchBox.value.findAndReplace(' ', '');
        if (searchVal.length > 0 && searchVal.length < 3) {
            var errorMsg = document.createTextNode('The search will only find words with 3 or more characters.');
            var errorTag = createElement('p');
            if (errorTag) {
                errorTag.className = 'error-msg';
                errorTag.appendChild(errorMsg);
                searchBox.parentNode.appendChild(errorTag);
            }
            return false;
        }
    }
    return true;
}

function rememberMe() {
    if (document.getElementById) {
        var username = document.getElementById('name').value;
        if (username.findAndReplace(' ', '').length != 0) {
            var now = new Date();
            now.setTime(now.getTime() + 60 * 60 * 1000);
            document.cookie = 'moodle_username=' + username + '; expires=' + now.toGMTString();
        }
    }
}


function changeText(obj) {
    if (!document.getElementById) return;
	
    if (obj.options[obj.selectedIndex].value == 1) {
        document.getElementById('image-text').replaceChild(document.createTextNode('image'), document.getElementById('image-text').firstChild);
    } else {
        document.getElementById('image-text').replaceChild(document.createTextNode('images'), document.getElementById('image-text').firstChild);
    }
}

function updateAuto(obj) {
    if (!document.getElementById) return;
	
    document.getElementById('auto-val').value = obj.options[obj.selectedIndex].value;
}

function checkAddBasket(obj) {
    if (!document.getElementById) return true;

    var inp = document.getElementById('basket-add');
    if (!inp) return true;
    
    if (inp.nodeName.toUpperCase() != 'SELECT') return true;

    if (inp.options[inp.options.selectedIndex].value == '') {
        alert('Please select the date of the course');
        return false;
    }

    return true;
}

function confirmEU() {
    return confirm('The course fees quoted on this site are reduced for EU citizens. If you have not been resident in the EU/EEA for the last 3 years, then please click CANCEL and contact our Adult Education office on 01420 592211, otherwise click on OK to proceed with your enrolment.');
}

function initSearchBox() {
    if (!document.getElementById) return;
 
    var sb = document.getElementById('search-box');
    if (!sb) return;

    sb.onfocus = function() {
        toggleSearchField(this, 'search', '');
    };
    sb.onblur = function() {
        toggleSearchField(this, '', 'search');
    };
}



function initToggleLinks() {
    if (!document.getElementById) return;

    var a, i = 0;
    while (a = document.getElementById('toggle-' + i)) {
        a.myid = i;
        a.onclick = toggleLink;  
        ++i;
    }
}


function toggleLink(e) {
    if (!e) var e = window.event;

    if (this.firstChild.nodeValue.indexOf('Show') != -1) {
        var newval = 'Hide';
        var oldval = 'Show';
    } else {
        var newval = 'Show';
        var oldval = 'Hide';
    }

    this.firstChild.nodeValue = this.firstChild.nodeValue.findAndReplace(oldval, newval);
    document.getElementById('hidden-' + this.myid).style.display = (oldval == 'Show') ? 'block' : 'none';

    if (e.preventDefault) {
        e.preventDefault();
    } else {
        e.returnValue = false;
    }
}


function focusBox(e) {
    if (!e && window.event) var e = window.event;
    if (!e) return;

    var target = e.target || e.srcElement;
    if (e.type == 'focus') {
        addCssClass(target, 'field-focus');
    } else {
        removeCssClass(target, 'field-focus');
    }
}


function createCssClassRegExp(name) {
    return new RegExp('(^| )' + name.replace('-', '\\-') + '($| )');
}

function hasCssClass(obj, name) {
    if (!obj.className || !window.RegExp) return false;
    var cssRegExp = createCssClassRegExp(name);
    return cssRegExp.test(obj.className);
}

function addCssClass(obj, name) {
    if (!obj.className) {
        obj.className = name;
        return true;
    }

    if (!hasCssClass(obj, name)) {
        obj.className += ' ' + name;
        return true;
    }
    return false;
}

function removeCssClass(obj, name) {
    if (!obj.className) return false;
    var cssRegExp = createCssClassRegExp(name);
    obj.className = obj.className.replace(cssRegExp, '');
    return true;
}

function initFormFields() {
    var textareas = document.getElementsByTagName('textarea');
    for (var i = 0; i < textareas.length; ++i) {
        addEvent(textareas[i], 'focus', focusBox);
        addEvent(textareas[i], 'blur', focusBox);
    }
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; ++i) {
        if (inputs[i].type && inputs[i].type.toLowerCase() == 'text') {
            addEvent(inputs[i], 'focus', focusBox);
            addEvent(inputs[i], 'blur', focusBox);
        }
    }
}


function highlightRow(obj) {
    obj.style.backgroundColor = (getStyle(obj, 'backgroundColor', 'background-color') == 'transparent') ? '#fef3a2' : 'transparent';
}

function init() {
    initSearchBox();
    initToggleLinks();
    initFormFields();
}

function addEvent(obj, ev, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(ev, fn, false);
    } else if (obj.attachEvent) {
        obj.attachEvent('on' + ev, fn);
    }
}


onload = init;
