/*
    project: WestLB
    type: javascript
    description: useful functions
    (c) Aperto AG 2004. All rights reserved.
*/


/* binding onload event to function */
addEvent(window, 'load', init);


/* functions to be executed on onload */
function init() {
    scanForms();
}


/* 
Implement getElementById method for browsers without DOM support, which in that case returns null.
This is for not having to detect the getElementById object all the time in other code.
What always, for every browser, should be done is to check, if the returned object is not null to 
prevent script errors, as the getElementById method returns also null if the id passed as parameter
is not found in the document.

Example:
    var elem = document.getElementById(myId);
    if (elem) {
        // process elem 
    }
*/
if (!document.getElementById) {
    document.getElementById = function() {
        return null;
    };
}


/*
Implement Array.push method if not supported by a browser
*/
if (!Array.prototype.push) {
    Array.prototype.push = function() {
        for (var i = 0; i < arguments.length; i++) {
            this[this.length] = arguments[i];
        }
        return this.length;
    }
}


/* Thanks to Scott Andrew */
function addEvent(obj, evType, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, false);
        return true;
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {
        return false;
    }
}


/* close window */
function closeWindow() {
    window.close();
    return false;
}


/* open print preview window */
function openPrintWindow(file) {
    if (typeof printWin == 'undefined') {
        var printWin;
    }
    printWin = window.open(file, 'printWindow', 'width=816,height=600,resizable,scrollbars');
    printWin.focus();

    return false;
}


/* insert save page link (IE specific) */
function insertSavePage(text, cssClass) {
    if (document.all && document.execCommand) {
        var footer = document.getElementById('footer');
        if (footer) {
            var footerUl = document.getElementById('site-functions');
            if (footerUl == null) {
                footerUl = document.createElement('UL');
                footerUl.className = "iconList";
                footerUl.setAttribute('id', 'site-functions');
                footer.appendChild(footerUl);
            }

            var footerLi = document.createElement('LI');

            var footerA = document.createElement('A');
            footerA.setAttribute('className', cssClass);
            footerA.setAttribute('href', '#');
            footerA.setAttribute('title', text);
            footerA.attachEvent('onclick', savePage);
            footerA.appendChild(document.createTextNode(text));

            footerLi.appendChild(footerA);
            footerUl.appendChild(footerLi);
        }
    }
}


/* save page (IE specific) */
function savePage() {
    if (document.all && document.execCommand) {
        document.execCommand('SaveAs',true,'.html');
        return false;
    }
}


/* find a parent with a specific tag name */
function getParentWithTagName(elm, name) {
    if (elm.tagName == name.toUpperCase()) {
        return elm;
    } else {
        return getParentWithTagName(elm.parentNode, name);
    }
}


// add stylesheet to document
function setStyleSheet(file) {
    if (document.createElement && document.appendChild && document.getElementsByTagName) {
        var stylesheet = document.createElement('link');
        stylesheet.setAttribute('rel', 'stylesheet');
        stylesheet.setAttribute('type', 'text/css');
        stylesheet.setAttribute('media', 'screen');
        stylesheet.setAttribute('href', file);
    
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(stylesheet);
    }
}


// object with infos about browser
function getBrowserObj() {
    var Browser = new Object();
    Browser.AvailableWidth = screen.availWidth;
    Browser.AvailableHeight = screen.availHeight;
    Browser.ColorDepth = screen.colorDepth;
    Browser.BrowserVersion = navigator.appVersion;
    Browser.BrowserName = navigator.appName;
    Browser.UserAgent = navigator.userAgent;
    Browser.DocumentURL = document.URL;
    
    return Browser;
}


// Check, if an object is an array
function isArray(obj) {
    if (typeof obj == "object" && obj != null) {
        if (obj.constructor.toString().indexOf("Array") != -1) {
            return true;
        }
    }
    return false;
}

// Read a cookie
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(";");
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == " ") {
            c = c.substring(1, c.length);
        }
        if (c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return null;
}


// Write a cookie
function setCookie(name, value, expire, domainName) {
    var expires = (expire) ? "; expires=" + expire.toGMTString() : "";
    var domain = (domainName) ? "; domain=" + domainName : "";
    document.cookie = name + "=" + value + expires + "; path=/" + domain;
}


/*
    extra functionality and validation to forms
*/


// array for error messages
var errorMsg = new Array();
// error message to be shown
var submitMsg = '';

// number of selected options in select field, number of children in a group
var count = 0;
// helperarray for checking checkboxgroups
var checkBoxGroupMin = new Array();
var checkBoxGroupMax = new Array();

// array for validation constrains
var fieldValidations = new Array();

// Array of objects, each has 're', a regular expression that matches one date format
var dateParsePatterns = [
    // DD.MM.YYYY
    { re: /(\d{1,2})\.(\d{1,2})\.(\d{4})$/ },
    // DD/MM/YYYY
    { re: /(\d{1,2})\/(\d{1,2})\/(\d{4})$/ },
    // DD MMM
    { re: /(\d{1,2})\s([A-Za-z]{3})$/ },
    // DD MMM YYYY
    { re: /(\d{1,2})\s([A-Za-z]{3})\s(\d{4})$/ },
    // DD-MMM-YYYY
    // "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
    { re: /(\d{1,2})-([A-Za-z]{3})-(\d{4})$/ },
    // DD MonthName, YYYY
    // "January" / ...
    { re: /(\d{1,2})\s([A-Za-z]+),\s?(\d{4})$/ },
    // DayName, DDst MonthName YYYY
    { re: /([A-Za-z]+),\s?(\d{1,2})(?:st|nd|rd|th)?\s([A-Za-z]+)\s(\d{4})$/ }
];
// translation array of date formats
var dateTranslation = [
    { orig: '%d.%m.%Y', trans: 'DD.MM.YYYY' },
    { orig: '%d/%m/%Y', trans: 'DD/MM/YYYY' },
    { orig: '%d %b', trans: 'DD MMM' },
    { orig: '%d %b %Y', trans: 'DD MMM YYYY' },
    { orig: '%d-%b-%Y', trans: 'DD-MMM-YYYY' },
    { orig: '%d %B, %Y', trans: 'DD MonthName, YYYY' },
    { orig: '%A, %d %B %Y', trans: 'DayName, DDst MonthName YYYY' }
];


// check for getting focus/blur state right
var focusBlur = true;
// holds a interval to set focus on a field
var focusInt;


// loop through all the available forms in the content section
function scanForms() {
    var wrapper = document.getElementById('contentWrapper');
    if (wrapper) {
        loopForm(wrapper,'input');
        loopForm(wrapper,'select');
        loopForm(wrapper,'textarea');
    }

    var searchInput = document.getElementById('searchInput');
    if (searchInput) {
        loopForm(searchInput,'input');
    }

}


/*
  Modified from article: Simple Tricks for More Usable Forms
  (c) 2004 by Simon Willison
  original at: http://www.sitepoint.com/print/1273
*/
function loopForm(wrapper, tagName) {
//function loopForm(wrapper, tagName, defArray) {
    var formElm = wrapper.getElementsByTagName(tagName);

    for (var i = 0; i < formElm.length; i++) {
        if (tagName == 'input') {
            if (formElm[i].type == 'text' || formElm[i].type == 'password' || formElm[i].type == 'radio' || formElm[i].type == 'checkbox') {
                addEvent(formElm[i], 'focus', onElmFocusBlur);
                addEvent(formElm[i], 'blur', onElmFocusBlur);
                
                if (fieldValidations[formElm[i].id] != null) {
                    addEvent(formElm[i], 'change', function(e) {
                        if (document.attachEvent) {
                            focusBlur = validateField(e.srcElement, 'simple');
                        } else {
                            focusBlur = validateField(this, 'simple');
                        }
                        return focusBlur;
                    });
                }
            }
        } else {
            addEvent(formElm[i], 'focus', onElmFocusBlur);
            addEvent(formElm[i], 'blur', onElmFocusBlur);

            if (fieldValidations[formElm[i].id] != null) {
                addEvent(formElm[i], 'change', function(e) {
                    if (document.attachEvent) {
                        focusBlur = validateField(e.srcElement, 'simple');
                    } else {
                        focusBlur = validateField(this, 'simple');
                    }
                    return focusBlur;
                });
            }
        }
    }
}


function setFocus(source) {
    source.focus();
}


function onElmFocusBlur(e) {
    if (focusInt) {
        clearInterval(focusInt);
    }
    
    if (typeof e == 'undefined') {
        e = window.event;
    }

    var source;
    if (typeof e.target != 'undefined') {
        source = e.target;
    } else if (typeof e.srcElement != 'undefined') {
        source = e.srcElement;
    } else {
        return;
    }

    setClassName(source,e);

    if (!focusBlur && e.type == 'blur') {
        focusBlur = true;
        if (document.attachEvent) {
            source.focus();
        } else {
            e.preventDefault();
            focusInt = window.setInterval(setFocus, 50, source);
        }
    }
}


/* set className of a form element */
function setClassName(source,e) {
    var focusClass = 'onFocus';
    var sourceClass = source.className;
    var sourceClasses = "";

    if (sourceClass) {
        if (sourceClass.indexOf(focusClass)==-1) {
            sourceClasses = sourceClass;
        } else {
            sourceClasses = sourceClass.substring(0,sourceClass.length-focusClass.length-1);
        }
    
        if (e.type == 'focus') {
            sourceClass = sourceClasses + " " + focusClass;
        } else {
            sourceClass = sourceClasses;
        }
        
        source.className = sourceClass;
    }
}


/* ---   validation part   --- */
function getLabel(field, msgType) {
    var label = "";

    if (msgType != 'radiogroup' && msgType != 'minchecked' && msgType != 'maxchecked') {
        label = field.parentNode.getElementsByTagName('label')[0].innerHTML;
    } else {
        var legendEls = getParentWithTagName(field, 'fieldset').getElementsByTagName('legend');
        var h4Els = getParentWithTagName(field, 'fieldset').getElementsByTagName('h4'); // legend element may be replaced by h4
        var el = (legendEls.length > 0) ? legendEls[0] : ((h4Els.length > 0) ? h4Els[0] : null);
        if (el && el.childNodes.length > 0)  {
            label = el.childNodes[0].nodeValue; // retrieve text node
        }
    }

    if (label.charAt(label.length-1) == ':') {
        label = label.substring(0,label.length-1);
    }

    return label;
}


function setCheckBoxGroupState() {
    var wrapper = document.getElementById('content');
    var inputs = wrapper.getElementsByTagName('input');

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox') {
            inputs[i].name = '';
        }
    }
}


function submitBrowserObject(browser) {
    var wrapper = document.getElementById('content');
    var inputs = wrapper.getElementsByTagName('input');
    var trimmed;

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'hidden') {
            for (var j in browser) {
                trimmed = j.replace(/\./, "");
                trimmed = "browser" + trimmed;
                
                if (inputs[i].id == trimmed) {
                    inputs[i].value = browser[j];
                }
            }
        } 
    }
}


function validateForm(formObj) {
    //loop through all the fields which are 'mandatory' and check that they have a valid value
    //list all the mandatory fields which should be completely in one message
    var field;
    var firstField = null;
    var valid = true;
    var msg = 'extended';
    submitMsg = '';

    for (var i in fieldValidations) {
        field = document.getElementById(i);

        if (field && fieldValidations[i].mandatory == true) {
            valid = validateField(field, msg);

            if (!valid && firstField == null) {
                firstField = field;
            }
        }
    }
    
    if (typeof browser == "undefined") {
        submitBrowserObject(getBrowserObj());
    } else if (typeof browser == "object") {
        submitBrowserObject(browser);
    }

    if (firstField != null) {
        valid = false;
        alert(submitMsg);
        firstField.focus();
    }

    return valid;
}


function validateField(field, msg) {
    if (fieldValidations[field.id] == null) {
        return true;
    } else {
        var validationObj = fieldValidations[field.id];
        var valid = true;

        for (var i in validationObj) {
            valid = validate(field, i, validationObj, msg);

            if (!valid) {
                break;
            }
        }

        return valid;
    }
}


function validate(field, type, obj, msg) {
    switch(type) {
        case 'text':
            if (obj.mandatory && obj.text && typeof(obj.min) == 'undefined' && checkMinLength(field.value, 1)) {
                showErrorMsg(field, 'minlength', 1, msg);
                return false;
            }
            break;
        case 'numeric':
            if (checkNumeric(field.value)) {
                showErrorMsg(field, 'numeric', obj.numeric, msg);
                return false;
            }
            break;
        case 'email':
            if (checkEmail(field.value, type)) {
                showErrorMsg(field, 'email', obj.email, msg);
                return false;
            }
            break;
        case 'westlb':
            if (checkEmail(field.value, type)) {
                showErrorMsg(field, 'westlb', obj.westlb, msg);
                return false;
            }
            break;
        case 'date':
            if (typeof(obj.dateformat) == 'undefined' && checkDate(field.value)) {
                showErrorMsg(field, 'date', obj.date, msg);
                return false;
            }
            break;
        case 'dateformat':
            if (checkDate(field.value)) {
                showErrorMsg(field, 'dateformat', obj.dateformat, msg);
                return false;
            }
            break;
        case 'select':
            if (obj.mandatory && obj.select && typeof(obj.min) == 'undefined' && checkMinOptions(field, 1)) {
                showErrorMsg(field, 'minselect', 1, msg);
                return false;
            }
            break;
        case 'min':
            if (obj.text && checkMinLength(field.value, obj.min)) {
                showErrorMsg(field, 'minlength', obj.min, msg);
                return false;
            } else if (obj.numeric && checkMinNumber(field.value, obj.min)) {
                showErrorMsg(field, 'min', obj.min, msg);
                return false;
            } else if (obj.email && checkMinEmail(field.value, obj.min)) {
                showErrorMsg(field, 'minemail', obj.min, msg);
                return false;
            } else if (obj.select && checkMinOptions(field, obj.min)) {
                showErrorMsg(field, 'minselect', obj.min, msg);
                return false;
            } else if (obj.checkboxgroup && checkMinCheckBoxGroup(field, obj.min, msg)) {
                showErrorMsg(field, 'minchecked', obj.min, msg);
                return false;
            }
            break;
        case 'max':
            if (obj.text && checkMaxLength(field.value, obj.max)) {
                showErrorMsg(field, 'maxlength', obj.max, msg);
                return false;
            } else if (obj.numeric && checkMaxNumber(field.value, obj.max)) {
                showErrorMsg(field, 'max', obj.max, msg);
                return false;
            } else if (obj.email && checkMaxEmail(field.value, obj.max)) {
                showErrorMsg(field, 'maxemail', obj.max, msg);
                return false;
            } else if (obj.select && checkMaxOptions(field, obj.max)) {
                showErrorMsg(field, 'maxselect', obj.max, msg);
                return false;
            } else if (obj.checkboxgroup && checkMaxCheckBoxGroup(field, obj.max, msg)) {
                showErrorMsg(field, 'maxchecked', obj.max, msg);
                return false;
            }
            break;
        case 'checkbox':
            if (obj.mandatory && checkSingleCheckBox(field)) {
                showErrorMsg(field, 'checkbox', obj.checkbox, msg);
                return false;
            }
            break;
        case 'checkboxgroup':
            break;
        case 'radiogroup':
            if (obj.mandatory && checkRadio(field)) {
                showErrorMsg(field, 'radiogroup', obj.radio, msg);
                return false;
            }
            break;
    }

    return true;
}


function showErrorMsg(elm, msgType, value, msg) {
    var alertMsg = '';
    var elmLabel = getLabel(elm, msgType);

    if (msg == 'simple' || submitMsg == '') {
        alertMsg = errorMsg['headline'] + "\n";
    }

    alertMsg += "\n\n" + errorMsg['field'] + " " + parseLabel(elmLabel);

    if (msg != 'simple') {
        alertMsg += "  (" + errorMsg['mandatory'] +")\n";
    } else {
        alertMsg += "\n";
    }

    var cause = "\n" + errorMsg['cause'] + " " + errorMsg[msgType] + " ";
    value += " ";
    count = " " + count + " ";

    switch (msgType) {
        case 'min':
        case 'max':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause + value;
            break;
        case 'minlength':
        case 'maxlength':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause + value + errorMsg['char'];
            break;
        case 'minemail':
        case 'maxemail':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause + value + errorMsg['address'];
            break;
        case 'email':
        case 'westlb':
        case 'numeric':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause;
            break;
        case 'date':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause;
            break;
        case 'dateformat':
            alertMsg += errorMsg['entry'] + quoteValue(elm.value) + cause + translateDate(value);
            break;
        case 'minselect':
        case 'maxselect':
            alertMsg += errorMsg['selection'] + count + errorMsg['option'] + cause + value + errorMsg['option'];
            break;
        case 'checkbox':
            alertMsg += errorMsg['selection'] + count + errorMsg['checkboxgroup'] + cause;
            break;
        case 'minchecked':
        case 'maxchecked':
            alertMsg += errorMsg['selection'] + count + errorMsg['checkboxgroup'] + cause + value + errorMsg['checkboxgroup'];
            break;
        case 'radiogroup':
            alertMsg += errorMsg['selection'] + count + errorMsg['option'] + cause;
            break;
    }

    if (msg == 'simple') {
        alert(alertMsg);
    } else {
        submitMsg += alertMsg;
    }
}

function parseLabel(elmLabel) {
    // Check for span in IE...
    var labelIndex = elmLabel.indexOf('<SPAN');
    // Check for span in firefox ...
    if (labelIndex == -1) {
        labelIndex = elmLabel.indexOf('<span');
    }
    if (labelIndex != -1) {
        elmLabel = elmLabel.substring(0,labelIndex);
    }
    return elmLabel;
}


function quoteValue(value) {
    if (checkHasContent(value)) {
        return (' \"' + value + '\"');
    } else {
        return "";
    }
}


function translateDate(value) {
    var count;

    for (var i = 0; i < dateTranslation.length; i++) {
        count = 1;

        for (var j = 0; j < value.length; j++) {
            if (dateTranslation[i].orig.charAt(j) == value.charAt(j)) {
                count ++;
            }
        }

        if (count == value.length) {
            return dateTranslation[i].trans;
        }
    }
    
    return dateTranslation[1].trans;
}


function checkHasContent(elmValue) {
    return (elmValue != "");
}


function checkMinLength(elmValue, min) {
    return (elmValue.length < min);
}


function checkMaxLength(elmValue, max) {
    return (elmValue.length > max);
}


function checkMinNumber(elmValue, min) {
    return (elmValue < min);
}


function checkMaxNumber(elmValue, max) {
    return (elmValue > max);
}


function checkMinEmail(elmValue, min) {
    var emails = new Array(1);

    if (elmValue.indexOf(',') != -1) {
        emails = elmValue.split(',');
    }        

    return (emails.length < min);
}


function checkMaxEmail(elmValue, max) {
    var emails = new Array(1);

    if (elmValue.indexOf(',') != -1) {
        emails = elmValue.split(',');
    }        

    return (emails.length > max);
}


function loopSelect(elmChildren, count) {
    for (var i = 0; i < elmChildren.length; i++) {
        if (elmChildren[i].tagName == 'OPTGROUP') {
            count = loopSelect(elmChildren[i].childNodes, count);
        } else if (elmChildren[i].selected && !elmChildren[i].defaultSelected) {
            count++;
        }
    }

    return count;
}


function checkMinOptions(elm, min) {
    count = loopSelect(elm.childNodes, 0);

    return (count < min);
}


function checkMaxOptions(elm, max) {
    count = loopSelect(elm.childNodes, 0);

    return (count > max);
}


function checkNumeric(elmValue) {
    if (checkHasContent(elmValue)) {
        return isNaN(elmValue);
    } else {
        return false;
    }
}


function checkEmail(elmValue, type) {
    if (checkHasContent(elmValue)) {
        var emails = new Array();
        var valid = false;

        if (elmValue.indexOf(',') != -1) {
            emails = elmValue.split(',');
        } else {
            emails[0] = elmValue;
        }
            
        for (var i = 0; i < emails.length; i++) {
            if (type == 'email') {
                valid = checkEmailChars(emails[i]);
            } else if (type == 'westlb') {
                valid = checkEmailWestLB(emails[i]);
            }

            if (valid) {
                break;
            }
        }
       
        return valid;
    } else {
        return false;
    }
}


function checkEmailChars(elmValue) {
    return (elmValue.indexOf('@') == -1 || elmValue.indexOf('.') == -1);
}


function checkEmailWestLB(elmValue) {
    return (elmValue.indexOf("@westlb") == -1);
}


function checkSingleCheckBox(elm) {
    count = 0;

    return (!elm.checked);
}


function checkMinCheckBoxGroup(elm, min, msg) {
    count = 0;

    var parent = getParentWithTagName(elm, 'fieldset');
    var inputs = parent.getElementsByTagName('input');
    var firstChild = true;

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox') {
            if (msg != 'simple') {
                if (checkBoxGroupMin.length == 0 || checkBoxGroupMin[i] != inputs[i].id) {
                    checkBoxGroupMin[i] = inputs[i].id;
                } else {
                   firstChild = false;
                }
            }
            if (inputs[i].checked) {
                count ++;
            }
        }
    }

    if (firstChild) {
        return (count < min);
    } else {
        return false;
    } 
}


function checkMaxCheckBoxGroup(elm, max, msg) {
    count = 0;

    var parent = getParentWithTagName(elm, 'fieldset');
    var inputs = parent.getElementsByTagName('input');
    var firstChild = true;

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == 'checkbox') {
            if (msg != 'simple') {
                if (checkBoxGroupMax.length == 0 || checkBoxGroupMax[i] != inputs[i].id) {
                    checkBoxGroupMax[i] = inputs[i].id;
                } else {
                   firstChild = false;
                }
            }
            if (inputs[i].checked) {
                count ++;
            }
        }
    }

    if (firstChild) {
        return (count > max);
    } else {
        return false;
    } 
}


function checkRadio(elm) {
    var wrapper = document.getElementById('content');
    var inputs = wrapper.getElementsByTagName('input');
    var valid = true;

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].name == elm.name) {
            if (elm.checked) {
                valid = false;
                break;
            }
        } 
    }

    return valid;
}


/*
  Modified from article: 'Magic' date parsing
  (c) 6th October 2003 by Simon Willison
  original at: http://simon.incutio.com/archive/2003/10/06/betterDateInput
*/
function checkDate(elmValue) {
    var valid = true;

    if (checkHasContent(elmValue)) {
        for (var i = 0; i < dateParsePatterns.length; i++) {
            var re = dateParsePatterns[i].re;
    
            if (re.test(elmValue)) {
                valid = false;
                break;
            }
        }
    } else {
        valid = false;
    }

    return valid;
}


// function to create a button which clears all checkboxes in a given form
function createClearAllButton(id, value) {
    var wrapper = document.getElementById(id);
    var ps = wrapper.getElementsByTagName('p');

    for (var i = 0; i < ps.length; i++) {
        if (ps[i].className == "last") {
            var clearButton = document.createElement('INPUT');
            clearButton.setAttribute('type', 'button');
            clearButton.setAttribute('value', value);
            clearButton.className = 'button';

            ps[i].appendChild(clearButton);

            addEvent(clearButton, 'click', function() {
                resetAllCheckBoxes('custArticleListForm', 'input', 'checkbox');
            });
            
        }
    }
}


// function to clear all checkboxes in a given form
function resetAllCheckBoxes(id, elm, elmType) {
    var wrapper = document.getElementById(id);
    var inputs = wrapper.getElementsByTagName(elm);

    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == elmType) {
            inputs[i].checked = false;
        }
    }
}

// Returns toplevel domain or null if domain consists of only one part
// (like 'localhost').
function getTopLevelDomain() {
    var domainName = null;
    var domainParts = location.hostname.split('.');
    if (domainParts.length > 1) {
        var x = 0;
        domainName = '';
        while (domainParts.length > 0 && x < 2) {
            domainName = domainParts.pop() + ((x == 1) ? '.' : '') + domainName;
            x++;
        }
    }
    return domainName;
}

// function to
function a_bteaser_mov(obj) {
    var a = obj.getElementsByTagName("a");
    if (a.length > 0) {
        window.status = a[0].href;
    }
    obj.style.cursor = "pointer";
}
function a_bteaser_mou(obj) {
    obj.style.cursor = "default";
    window.status = "";
}
function a_bteaser_cli(obj) {
    var a = obj.getElementsByTagName("a");
    if (a.length > 0) {
        window.location.href = a[0].href;
    }
}