/*  */

function BCustomForm(formId)
{
    /* form checking */

    var _form = document.getElementById(formId);

    if (!_form) {
        return false;
    }

    /* auxillary functions */
    var isFF = function () {
        return navigator && navigator.userAgent && -1 !== navigator.userAgent.toLowerCase().indexOf('firefox');
    }
    
    var isOpera = function () {
        return navigator && navigator.userAgent && -1 !== navigator.userAgent.toLowerCase().indexOf('opera');
    }

    var _operaRefresh = function () {
        if (isOpera()) {
            _form.style.visibility = 'hidden';
            _form.style.visibility = 'visible';
        }
    }
    
    var _fakeFocusFF = function (evt) {
        if (isFF()) {
            this.style.border = '1px dotted #838383';
        }
    }
    var _fakeBlurFF = function (evt) {
        if (isFF()) {
            this.style.borderWidth = '0px';
        }
    }

    var _getNodeText = function (node) {

        if (!node || !node.nodeType || !node.childNodes) return '';

        if (3 == node.nodeType) return node.nodeValue;

        var result = '';

        for (var i = 0; i < node.childNodes.length; ++i) {
            result += _getNodeText(node.childNodes.item(i));
        }

        return result;
    }

    /*
    var _disableTextSelection = function (elem) {
        elem && (elem.onmousedown = function () { return false; });
        elem && (elem.onselectstart = function () { return false; });
    }
    */

    /* private members */

    var _paintedControlCollection;
    var _labelCollection;
    var _selectCollection;
    var _replaceCollection;

    var _hiddenInputs = new (function() {

        var _collection = new Array();

        var _createElement = function (name, value) {
            var element = document.createElement('input');
            element.type = 'hidden';
            element.name = name;
            element.value = value;
            element.className = 'bn';

            return element;
        }

        this.addElementByName = function (name, value) {
            var element = _createElement(name, value);
            _collection[name] = element;

            return element;
        }

        this.addElement = function (name, value) {
            var element = _createElement(name, value);
            _collection.push(element);

            return element;
        }

        this.getElementByName = function (name) {
            return _collection[name];
        }
        
        this.getElementsByName = function (name) {
            var result = new Array();
            
            for (var i in _collection) {
                if (name == _collection[i].name) {
                    result.push(_collection[i].name);
                }
            }
            
            return result;
        }

        this.containsName = function (name) {
            return null != _collection[name];
        }
        
        this.addToForm = function () {
            var to = _form;

            if (_form.getElementsByTagName('fieldset').length > 0) {
                to = _form.getElementsByTagName('fieldset').item(0);
            }

            for (var i in _collection) {
                to.appendChild(_collection[i]);
            }
        }
    })();

    var _customRadioCollection = new (function () {

        var _collection = new Array();

        this.addElement = function (radio) {

            var control = _createCustomControl(radio);

            if (radio.checked || radio.getAttribute('checked')) {
                /* radio.getAttribute('checked') is for FF when page is just refreshed, not submitted */
                _hiddenInputs.getElementByName(radio.name).value = radio.value;
                control.className = 'radiobtn selected';
                control._selected = true;
            } else {
                control.className = 'radiobtn';
            }

            if (!_collection[radio.name]) {
                _collection[radio.name] = new Array();
            }

            _collection[radio.name].push(control);
            
            return control;
        }

        this.getElementsByName = function (name) {
            return _collection[name];
        }
    })();

    var _createCustomControl = function(input) {

        var control = document.createElement('button');

        try {
            control.type = 'button';
        } catch (e) {}

        control.appendChild(document.createComment('*'));
        control.onclick = function () { return false; }
        
        control.onfocus = _fakeFocusFF;
        control.onblur = _fakeBlurFF;

        if (input.getAttribute('id')) {
            control.setAttribute('id', input.getAttribute('id'));
        }

        /* for IE */
        control.setAttribute('name', 'foo');

        control._name = input.name;
        control._value = input.value;

        if (!control._value) {
            try {
                control._value = input.getAttribute('value');
            } catch (e) {}
        }

        control._type = input.type;
        control._disabled = !!input.disabled || !!input.readonly || !!input.readOnly;
        control._onclick = input.onclick;
        control.onclickHandlerQueue = new Array();

        return control;
    }

    /* class functions */

    var _initialize = function() {
        _paintedControlCollection = new Array();
        _selectCollection = new Array();
        _labelCollection   = new Array();
        _replaceCollection = new Array();
    }

    var _addEventListener = function(element, eventName, eventHandler) {
        if (element.addEventListener) {
            element.addEventListener(eventName, eventHandler, false);
        } else if (element.attachEvent) {
            element.attachEvent('on' + eventName, eventHandler);
        }
    }
    
    var _removeEventListener = function (element, eventName, eventHandler) {
        if (element.removeEventListener) {
            element.removeEventListener(eventName, eventHandler, false);
        } else if (element.detachEvent) {
            element.detachEvent('on' + eventName, eventHandler);
        }
    }

    var _createCustomCheckbox = function(checkbox) {

        var onclick = function(ev) {

            var event = ev || window.event;
            var target = (ev && ev.target) || (window.event && window.event.srcElement);

            if (event._processed) {
                return false;
            } else {
                event._processed = true;
            }

            if (target._disabled) {
                return false;
            }

            window.event && (window.event.cancelBubble = true);
            window.event && (window.event.returnValue  = false);

            var ret = target.bclick();

            if (target.onclickHandlerQueue) {
                for (var i in target.onclickHandlerQueue) {
                    try {
                        target.onclickHandlerQueue[i](ev);
                    } catch (e) {}
                }
            }

            return ret;
        }

        var hidden = _hiddenInputs.addElement(checkbox.name, checkbox.checked ? checkbox.value : '');
        var control = _createCustomControl(checkbox);

        control.hiddenControl = hidden;

        if (checkbox.checked) {
            control.className = 'selected';
            control._selected = true;
        } else {
            control._selected = false;
        }

        control.bclick = (function (pc) {
            return function () {
                pc._onclick && pc._onclick();

                if (pc._selected) {
                    return pc.bclear();
                } else {
                    return pc.bset();
                }
            }
        })(control);
        control.bset = (function (pc) {
            return function () {
                if (pc._disabled) {
                    return false;
                }

                pc.hiddenControl.value = pc._value;

                if (pc._label) {
                    pc._label.className = pc._label.className.replace(' selected', '').replace('selected', '') + ' selected';
                } else {
                    pc.className = 'selected';
                }

                pc._selected = true;
                return true;
            }
        })(control);
        control.bclear = (function (pc) {
            return function () {
                if (pc._disabled) {
                    return false;
                }

                pc.hiddenControl.value = '';

                if (pc._label) {
                    pc._label.className = pc._label.className.replace(' selected', '').replace('selected', '');
                } else {
                    pc.className = '';
               	    pc._selected = false;
                }

                pc._selected = false;
                return true;
            }
        })(control);
        control.disable = (function (pc) {
            return function () {
                if (pc._label) {
                    pc._label.className = pc._label.className.replace(' notactive', '').replace('notactive', '');
                    pc._label.className += ' notactive';

                    if (!pc._selected) {
                        pc._label.className = pc._label.className.replace(' bnChield', '').replace('bnChield', '');
                        pc._label.className += ' bnChield';
                    }
                }

                pc._disabled = true;
            }
        })(control);
        control.enable = (function (pc) {
            return function () {
                if (pc._label) {
                    pc._label.className = pc._label.className.replace(' notactive', '').replace(' bnChield', '');
                }

                pc._disabled = false;
            }
        })(control);
        control.checkDisabled = (function (pc) {
            return function () {
                return !!pc._disabled;
            }
        })(control);
        control.checkSelected = (function (pc) {
            return function () {
                return !!pc._selected;
            }
        })(control);
        
        control.addOnclickHandler = (function (ctrl) {
            return function (handler) {
                ctrl.onclickHandlerQueue.push(handler);
            }
        })(control);

        _addEventListener(control, 'click', onclick);
        _replaceCollection.push({'old': checkbox, 'new': control});
        _paintedControlCollection.push(control);

    }

    var _createCustomRadio = function(radio) {

        var radioOnclick = function(ev) {

            var event = ev || window.event;
            var target = (ev && ev.target) || (window.event && window.event.srcElement);

            if (event._processed) {
                return false;
            } else {
                event._processed = true;
            }

            if (target._disabled) {
                return false;
            }

            target.bclick();

            if (target.onclickHandlerQueue) {
                for (var i in target.onclickHandlerQueue) {
                    try {
                        target.onclickHandlerQueue[i](ev);
                    } catch (e) {}
                }
            }

            _operaRefresh();
        }

        if (!_hiddenInputs.containsName(radio.name)) {
            _hiddenInputs.addElementByName(radio.name, '');
        }

        var element = _customRadioCollection.addElement(radio);

        element.bclick = (function (pc) {
            return function () {
                if (pc._disabled) {
                    return false;
                }

                pc._onclick && pc._onclick();
                var elements = _customRadioCollection.getElementsByName(pc._name);

                for (var i = 0; i < elements.length; ++i) {
                    elements[i]._selected = false;

                    if (elements[i]._label) {
                        elements[i]._label.className = elements[i]._label.className.replace(' selected', '').replace('selected', '');
                        elements[i].className = '';
                    } else {
                        elements[i].className = 'radiobtn';
                    }
                }

                _hiddenInputs.getElementByName(pc._name).value = pc._value;
                pc._selected = true;

                if (pc._label) {
                    pc._label.className = pc._label.className.replace(' selected', '').replace('selected', '') + ' selected';
                    pc.className = '';
                } else {
                    pc.className = 'radiobtn selected';
                }

                _operaRefresh();
            }
        })(element);
        
        element.bclear = (function (pc) {
            return function () {
                if (pc._disabled) {
                    return false;
                }

                if (pc._selected) {
                    pc._selected = false;
                    _hiddenInputs.getElementByName(pc._name).value = '';

                    if (pc._label) {
                        pc._label.className = pc._label.className.replace(' selected', '').replace('selected', '');
                        pc.className = '';
                    } else {
                        pc.className = 'radiobtn';
                    }
                }
            }
        })(element);

        element.isSelected = (function (pc) {
            return function () {
                return !!pc._selected;
            }
        })(element);
        element.isSet = element.isSelected; /* for backward compatibility */
        element.addOnclickHandler = (function (ctrl) {
            return function (handler) {
                ctrl.onclickHandlerQueue.push(handler);
            }
        })(element);

        _addEventListener(element, 'click', radioOnclick);
        _replaceCollection.push({'old': radio, 'new': element});
        _paintedControlCollection.push(element);
    }


    var _hideOptionList = function (ev, paintedControl, showSelected) {
        var event = ev || window.event;
        var target = event.target || window.event.srcElement;
        
        if (event._processed) {
            return false;
        }

        if (target && target.tagName && 'var' == target.tagName.toLowerCase()) {
            return false;
        }
        
        if ('button' == target.tagName.toLowerCase() && target.parentNode == paintedControl) {
            return false;
        }

        if (!target.selectOptionsList) {
            if (target.parentNode && target.parentNode.selectOptionsList) {
                target = target.parentNode;
            }
        }

        if (paintedControl.showList && paintedControl != target &&
            (paintedControl.selectDisplay != target || !target.selectOptionsList) &&
            !(target.parentNode && target.parentNode.selectOptionsList)) {

            paintedControl.hideOptList();
        }
    }

    var _closeSelectOneElements = function () {
        for (var i = 0; i < _selectCollection.length; ++i) {
            _selectCollection[i].hideOptList();
        }
    }

    var _createCustomSelectOne = function(selectOne) {

        var paintedControl, hiddenControl;
        var selectArrow;
        var selectOptionsList;
        var selectOptionsListContent;
        
        var getTitleToDisplay = function (pc, title) {
            var maxLength = 30;

            if (pc.style.width) {
                try {
                    maxLength = parseInt(pc.style.width);
                    maxLength = parseInt(maxLength / 7);
                } catch (e) {}
            } else if (pc.offsetWidth) {
                try {
                    maxLength = parseInt(pc.offsetWidth / 7);
                } catch (e) {
                }
            }

            return title.length > maxLength ? title.substr(0, maxLength) + '...' : title;
        }

        var documentOnclick = function (ev) {
            _hideOptionList(ev, paintedControl, true);
        }

        var selectOneOptionOnclick = function (ev) {
            var event = ev || window.event;
            var target = event.target || window.event.srcElement;

            if (target && 'var' == target.tagName.toLowerCase()) {
                return false;
            }

            target.selectDisplay.selectOptionsList.selectedOptionTitle = _getNodeText(target);
            target.selectDisplay.hideOptList();
            
            if (target.selectDisplay.getElementsByTagName('button').length > 0) {
                target.selectDisplay.getElementsByTagName('button')[0].focus();
            }

            for (var k = 0; k < target.optionsList.selectOptionsListContent.childNodes.length; ++k) {
                target.optionsList.selectOptionsListContent.childNodes.item(k).style.fontWeight = 'normal';
            }

            target.style.fontWeight = 'bold';

            var oldValue = _hiddenInputs.getElementByName(target._name).value;
            _hiddenInputs.getElementByName(target._name).value = target.value;

            target._onclick && target._onclick();

            if (target.selectDisplay._onchange && target.value != oldValue) {
                target.selectDisplay._onchange(target.value);
            }

            _operaRefresh();
            event._processed = true;
            return false;
        }

        var _createCustomSelectOneOption = function (selectOne, option) {
            var optionValue = option.getAttribute('value');
            var optionTitle = _getNodeText(option);
            var selectOption = document.createElement('a');
            selectOption.setAttribute('href', 'javascript:void(0);');
            selectOption._name = selectOne.name;
            selectOption._onclick = option.onclick;
            selectOption.value = optionValue;
            selectOption.title = optionTitle;
            selectOption.appendChild(document.createTextNode(optionTitle));

            return selectOption;
        }
        var fillOptionListContent = function () {

            var options = selectOne.getElementsByTagName('option');

            for (var j = 0; j < options.length; ++j) {
                var option = options.item(j);
                var selectOption = _createCustomSelectOneOption(selectOne, option);

                if (option.className && 'originalLang' === option.className) {
                    selectOption.className += 'fc_pink';
                }

                selectOption.selectDisplay = paintedControl;
                selectOption.optionsList = selectOptionsList;

                selectOptionsListContent.appendChild(selectOption);

                if (options.item(j).selected) {
                    paintedControl.insertBefore(document.createTextNode(getTitleToDisplay(paintedControl, selectOption.title)), paintedControl.childNodes.item(1));
                    selectOption.style.fontWeight = 'bold';
                    selectOption._selected = true;
                    hiddenControl.value = options.item(j).value;
                }

                if (options.item(j).selected) {
                    selectOptionsList.selectedOptionTitle = _getNodeText(options.item(j));
                }

                _addEventListener(selectOption, 'click', selectOneOptionOnclick);
            }

            if (!selectOptionsList.selectedOptionTitle) {
                selectOptionsList.selectedOptionTitle = '...';
            }

            if (options.length < 6) {
                selectOptionsList.className = 'ha';
                selectOptionsList.selectOptionsListContent.className = 'ha pr0Children';
                selectOptionsList._heightAuto = true;
            }
        }

        var selectOneOnclick = function (ev) {
            /* show or hide the dropdown list  */

            var event = ev || window.event;
            var target = event.target || window.event.srcElement;

            if (!target || event._processed) {
                return false;
            }

            if (!target.selectOptionsList) {
                if (!(target.parentNode && target.parentNode.selectOptionsList)) {
                    return false;
                } else {
                    target = target.parentNode;
                }
            }
            
            if (target._disabled) {
                target.hideOptList();
                return true;
            }

            if (!target.showList) {
                _closeSelectOneElements(); /* fix for IE */
                target.showOptList();
            } else {
                target.hideOptList();
            }

            return false;
        }

        hiddenControl = _hiddenInputs.addElementByName(selectOne.name, '');

        /* initialize paintedControl */
        paintedControl = document.createElement('dfn');

        paintedControl.bclear = (function (pc) {
            return function () {
                pc.showList = false;
                pc.selectOptionsList.style.display = 'none';
                pc.hiddenControl.value = '';
                
                if (pc.childNodes.length > 1) {
                    if (3 === pc.childNodes.item(1).nodeType) {
                        pc.removeChild(pc.childNodes.item(1));
                    } else if ('button' == pc.childNodes.item(1).tagName.toLowerCase()) {
                        pc.childNodes.item(1).replaceChild(document.createTextNode(' '), pc.childNodes.item(1).firstChild);
                    }
                } 
                
                for (var i = 0; i < pc.selectOptionsListContent.childNodes.length; ++i) {
                    var opt = pc.selectOptionsListContent.childNodes.item(i);
                    opt._selected = false;
                    opt.style.fontWeight = 'normal';
                }
            }
        })(paintedControl);
        paintedControl.getValue = (function (pc) {
            return function () {
                return pc.hiddenControl.value;
            }
        })(paintedControl);
        paintedControl.getSelectedIndex = (function (pc) {
            return function () {
                for (var i = 0; i < pc.selectOptionsListContent.childNodes.length; ++i) {
                    var opt = pc.selectOptionsListContent.childNodes.item(i);

                    if (pc.hiddenControl.value == opt.value) {
                        return i;
                    }
                }

                return false;
            }
        })(paintedControl);
        paintedControl.hideOptList = (function (pc) {
            return function () {
                if (!pc.selectOptionsList) {
                    return false;
                }

                pc.selectOptionsList.style.display = 'none';
                pc.showList = false;

                /* to delete */
                if (2000 == pc.parentNode.style.zIndex) {
                    pc.parentNode.style.zIndex = 1990;
                }

                if (pc.selectOptionsList.selectedOptionTitle &&
                    pc.childNodes.item(1) &&
                    3 != pc.childNodes.item(1).nodeType) {

                    var title = pc.selectOptionsList.selectedOptionTitle;
                    var titleNode = document.createElement('button');
                    titleNode.setAttribute('name', 'foo');

                    try {
                        titleNode.setAttribute('type', 'button');
                        titleNode.type = 'button';
                    } catch (e) {}

                    titleNode.onclick = (function (pct) {
                        return function (evt) {
                            var event = evt || window.event;
                            
                            if (!event._processed) {
                                pct.showOptList();
                                event._processed = true;
                            }
                        }
                    })(pc);
                    var keyPressedHandler = (function (pct) {
                        return function (evt) {
                            var event = evt || window.event;
                            var target = event.target || event.srcElement;
                            var keyCode = event.keyCode;
                            
                            if (40 == keyCode) {
                                /* arrow down */
                                if (pct.getSelectedIndex() < pct.selectOptionsListContent.childNodes.length) {
                                    pct.selectNext();
                                }
                            } else if (38 == keyCode) {
                                /* arrow up */
                                if (pct.getSelectedIndex() > 0) {
                                    pct.selectPrevious();
                                }
                            } else if (32 == keyCode || 13 == keyCode) {
                                /* space bar or return */
                                /*pc.hideOptList();*/
                            }

                            if (40 == keyCode || 38 == keyCode || 32 == keyCode || 13 == keyCode) {
                                event.preventDefault && event.preventDefault();
                                event.stopPropagation && event.stopPropagation();
                                event.returnValue = false;
                                event.cancelBubble = true;
                                event._processed = true;
                                return false;
                            }

                            return true;
                        }
                    })(pc);
                    
                    titleNode.onfocus = _fakeFocusFF;
                    titleNode.onblur = _fakeBlurFF;

                    var maxLength = 30;

                    title = getTitleToDisplay(pc, title);
                    titleNode.appendChild(document.createTextNode(title));

                    if (isFF()) {
                        var insertTitle = (function (_pc, _titleNode) {
                            return function () {
                                _pc.insertBefore(_titleNode, _pc.childNodes.item(1));
                            }
                        })(pc, titleNode);
                        window.setTimeout(insertTitle, 10);
                    } else {
                        pc.insertBefore(titleNode, pc.childNodes.item(1));
                    }
                    pc.selectOptionsList.selectedOptionTitle = null;
                    _addEventListener(titleNode, 'keydown', keyPressedHandler);
                }
            }
        })(paintedControl);
        paintedControl.showOptList = (function (pc) {
            return function () {
                if ((pc.childNodes.item(1) && 3 === pc.childNodes.item(1).nodeType) ||
                    (pc.childNodes.item(1) && 'button' === pc.childNodes.item(1).tagName.toLowerCase())) {

                    var title;
                    
                    if (3 === pc.childNodes.item(1).nodeType) {
                        title = pc.childNodes.item(1).nodeValue;
                    } else {
                        title = pc.childNodes.item(1).firstChild.nodeValue;
                    }

                    pc.selectOptionsList.selectedOptionTitle = title;
                    pc.removeChild(pc.childNodes.item(1));
                }

                pc.selectOptionsList.style.display = 'block';
                pc.selectOptionsList.scrollTop = 0;
                pc.selectOptionsList.selectOptionsListContent.scrollTop = 0;
                pc.selectOptionsList.scrollbar && pc.selectOptionsList.scrollbar.refresh();
                pc.showList = true;

                /* fix for arabic version */
                if (pc.selectOptionsList.scrollHeight > pc.selectOptionsList.offsetHeight) {
                    var offsetHeight = pc.selectOptionsList.offsetHeight;
                    var scrollHeight = pc.selectOptionsList.scrollHeight;
                    pc.selectOptionsListContent.style.overflowY = 'hidden';
                    pc.selectOptionsListContent.style.height = offsetHeight + 'px';
                }

                if (pc.hiddenControl.value) {
                    var list = pc.selectOptionsList.selectOptionsListContent;
                    var offset = 0;
                    var found = false;

                    for (var j = 0; j < list.childNodes.length; ++j) {
                        if (list.childNodes.item(j).value == pc.hiddenControl.value) {
                            found = true;
                            pc.selectOptionsList.scrollbar && pc.selectOptionsList.scrollbar.scrollTo(offset);
                        } else if (!found) {
                            offset += list.childNodes.item(j).offsetHeight;
                        }
                    }
                }

                /* temp */                
                pc.parentNode.style.zIndex = 2000;
            }
        })(paintedControl);
        paintedControl.enable = (function (pc) {
            return function () {
                pc._disabled = false;
            }
        })(paintedControl);
        paintedControl.disable = (function (pc) {
            return function () {
                pc._disabled = true;
            }
        })(paintedControl);
        paintedControl.selectByIndex = (function (pc) {
            return function (index) {
                var list = pc.selectOptionsListContent;
                
                try {
                    index = parseInt(index);
                } catch (e) {
                    return false;
                }

                if (index >= list.childNodes.length || index < 0) {
                    return false;
                }

                pc.bclear();
                pc.hiddenControl.value = list.childNodes.item(index).value;
                list.childNodes.item(index).style.fontWeight = 'bold';
                
                var buttons = pc.getElementsByTagName('button');

                if (buttons.length > 0 && buttons[0].firstChild && 3 == buttons[0].firstChild.nodeType) {
                    var newTitle = list.childNodes.item(index).firstChild.nodeValue;
                    newTitle = getTitleToDisplay(pc, newTitle);
                    buttons[0].replaceChild(document.createTextNode(newTitle), buttons[0].firstChild);
                } else {
                    return false;
                }

                return true;
            }
        })(paintedControl);
        paintedControl.selectNext = (function (pc) {
            return function () {
                return pc.selectByIndex(pc.getSelectedIndex() + 1);
            }
        })(paintedControl);
        paintedControl.selectPrevious = (function (pc) {
            return function () {
                return pc.selectByIndex(pc.getSelectedIndex() - 1);
            }
        })(paintedControl);

        if (selectOne.getAttribute('id')) {
            paintedControl.setAttribute('id', selectOne.getAttribute('id'));
        }

        paintedControl.className = selectOne.className;
        paintedControl._name = selectOne.name;
        paintedControl._disabled = !!selectOne.disabled;
        paintedControl.showList = false;
        paintedControl.hiddenControl = hiddenControl;
        selectOne.onchange && (paintedControl._onchange = selectOne.onchange);
        selectOne.style && selectOne.style.display && 'none' == selectOne.style.display && (paintedControl.style.display = 'none');

        /* initialize selectArrow */
        selectArrow = document.createElement('em');
        paintedControl.appendChild(selectArrow);

        /* initialize selectOptionsList */
        selectOptionsList = document.createElement('cite');
        selectOptionsList.style.display = 'none';

        /* initialize selectOptionsListContent */
        selectOptionsListContent = document.createElement('ins');
        selectOptionsListContent.style.overflowY = 'hidden';
        selectOptionsList.selectOptionsListContent = selectOptionsListContent;
        selectOptionsList.appendChild(selectOptionsListContent);

        paintedControl.selectOptionsList = selectOptionsList;
        paintedControl.selectOptionsListContent = selectOptionsListContent;
        paintedControl.appendChild(selectOptionsList);

        fillOptionListContent();

        _addEventListener(document, 'click', documentOnclick);
        _addEventListener(paintedControl, 'click', selectOneOnclick);

        _selectCollection.push(paintedControl);
        _replaceCollection.push({'old': selectOne, 'new': paintedControl});
        _paintedControlCollection.push(paintedControl);
    }

    var _createCustomSelectMultiple = function(element) {
        var createLinearOptionsList = function (element) {
            var linearOptionsList = new Array();

            for (var j = 0; j < element.childNodes.length; ++j) {
                var child = element.childNodes.item(j);

                if (1 == child.nodeType) {
                    if ('optgroup' == child.tagName.toLowerCase()) {
                        linearOptionsList.push(child);
                        var options = child.getElementsByTagName('option');

                        for (var k = 0; k < options.length; ++k) {
                            linearOptionsList.push(options.item(k));

                            if (options.item(k).selected) {
                                if (null == options.item(k).parentNode._selectedItemsCount) {
                                    options.item(k).parentNode._selectedItemsCount = 0;
                                } else {
                                    options.item(k).parentNode._selectedItemsCount += 1;
                                }
                            }
                        }
                    } else if ('option' == child.tagName.toLowerCase()) {
                        linearOptionsList.push(child);
                    }
                }
            }

            return linearOptionsList;
        }
        var createCustomOptionLeft = function (option, pc) {
            var onclick = function (ev) {
                var target = (ev && ev.target) || (window.event && window.event.srcElement);
                
                if (target.paintedControl && target.paintedControl._disabled) {
                    return true;
                }

                target.bclick();
            }

            var selectOptionLeft = document.createElement('span');
            selectOptionLeft.paintedControl = pc;
            selectOptionLeft.value = option.value;
            selectOptionLeft.appendChild(document.createTextNode(_getNodeText(option)));
            selectOptionLeft.bclick = (function (op) {
                return function () {
                    if (op._selected) {
                        op.className = '';
                        op.hiddenControl.value = '';
                        op.right.style.display = 'none';
                    } else {
                        op.className = 'sel';
                        op.hiddenControl.value = op.value;
                        op.right.style.display = 'block';
                    }

                    op.right.parentNode.parentNode.scroller2 && op.right.parentNode.parentNode.scroller2.refresh(true);
                    op._selected = !op._selected;
                }
            })(selectOptionLeft);
            selectOptionLeft.bset = (function (op) {
                return function () {
                    op.className = 'sel';
                    op.hiddenControl.value = op.value;
                    op.right.style.display = 'block';
                    op._selected = true;
                }
            })(selectOptionLeft);
            selectOptionLeft.bclear = (function (op) {
                return function () {
                    op.className = '';
                    op.hiddenControl.value = '';
                    op.right.style.display = 'none';
                    op._selected = false;
                }
            })(selectOptionLeft);

            _addEventListener(selectOptionLeft, 'click', onclick);
            
            return selectOptionLeft;
        }
        var createCustomOptionRight = function (option, pc) {
            var onclick = function (ev) {
                var target = (ev && ev.target) || (window.event && window.event.srcElement);
                
                if (target.paintedControl && target.paintedControl._disabled) {
                    return true;
                }

                target.left.className = '';
                target.left.hiddenControl.value = '';
                target.left._selected = false;
                target.style.display = 'none';
                target.parentNode.parentNode.scroller2 && target.parentNode.parentNode.scroller2.refresh(true);
            }

            var selectOptionRight = document.createElement('span');
            selectOptionRight.paintedControl = pc;
            selectOptionRight.appendChild(document.createTextNode(_getNodeText(option)));

            _addEventListener(selectOptionRight, 'click', onclick);
            return selectOptionRight; 
        }
        var createCustomOptions = function (paintedControl, fromSelectContainer, toSelectContainer, linearOptionsList) {
            var createSelectAll = function(option) {

                var selectAllOnclick = function (ev) {
                    var event = ev || window.event;
                    var target = event.target || window.event.srcElement;

                    if (target.paintedControl && target.paintedControl._disabled) {
                        return true;
                    }

                    var container = target.parentNode;
                    var selectedAll = !!target._selectedAll;

                    for (var j = 1; j < container.childNodes.length; ++j) {
                        var item = container.childNodes.item(j);
                        if (('' === item.style.display || 'block' === item.style.display) && item.hiddenControl) {
                            item.className = selectedAll ? '' : 'sel';
                            item._selected = !selectedAll;
                            item.hiddenControl.value = selectedAll ? '' : item.value;
                            item.right.style.display = selectedAll ? 'none' : 'block';
                        }
                    }

                    target._selectedAll = !target._selectedAll;
                    container.parentNode.scroller2 && container.parentNode.scroller2.refresh(false);

                    event.preventDefault && event.preventDefault();
                    event.returnValue = false;
                    event.cancelBubble = true;

                    return false;
                };
                
                var selectAll = document.createElement('span');
                selectAll.paintedControl = paintedControl;
                selectAll.className = 'sa';
                selectAll.appendChild(document.createTextNode(_getNodeText(option)));
                _addEventListener(selectAll, 'click', selectAllOnclick);
                
                return selectAll;
            }

            for (var j = 0; j < linearOptionsList.length; ++j) {
                var option = linearOptionsList[j];

                if ('option' == option.tagName.toLowerCase()) {
                    var selectOptionLeft, selectOptionRight;

                    if ('select_all' === option.className && 0 === fromSelectContainer.childNodes.length) {
                        selectOptionLeft = createSelectAll(option);
                        fromSelectContainer.appendChild(selectOptionLeft);
                    } else {
                        selectOptionLeft = createCustomOptionLeft(option, paintedControl);
                        selectOptionRight = createCustomOptionRight(option, paintedControl);

                        var hiddenControl = _hiddenInputs.addElement(element.name, option.selected ? option.value : '');

                        selectOptionRight.left = selectOptionLeft;
                        selectOptionLeft.right = selectOptionRight;
                        selectOptionLeft.hiddenControl = hiddenControl;

                        if (option.selected) {
                            selectOptionLeft._selected = true;
                            selectOptionLeft.className = 'sel';
                        } else {
                            selectOptionLeft._selected = false;
                            selectOptionRight.style.display = 'none';
                        }

                        if (-1 !== option.className.indexOf('option_disabled')) {
                            selectOptionLeft.bclear();
                            selectOptionLeft.style.display = 'none';
                        }

                        paintedControl._disabled && (selectOptionLeft.onclick = function () {}, selectOptionRight.onclick = function () {});

                        toSelectContainer.appendChild(selectOptionRight);

                        if (!paintedControl._disabled || option.selected) {
                            fromSelectContainer.appendChild(selectOptionLeft);
                        }
                        
                        if ('optgroup' === option.parentNode.tagName.toLowerCase()) {
                            if (option.parentNode.paintedOptgroup && option.parentNode.paintedOptgroup.paintedOptions) {
                                option.parentNode.paintedOptgroup.paintedOptions.push(selectOptionLeft);
                            }
                        }
                    }
                } else {
                    var selectOptionLeft = document.createElement('span'); 
                    selectOptionLeft.className = 'optgroup';
                    selectOptionLeft.paintedControl = paintedControl;
                    selectOptionLeft._selected = false;
                    selectOptionLeft.appendChild(document.createTextNode(option.getAttribute('label')));
                    option.paintedOptgroup = selectOptionLeft;

                    if (!paintedControl._disabled || option._selectedItemsCount) {
                        fromSelectContainer.appendChild(selectOptionLeft);
                    }
                    
                    selectOptionLeft.paintedOptions = new Array();
                    selectOptionLeft.onclick = (function (pog) {
                        return function () {
                            if (pog.paintedControl._disabled) {
                                return true;
                            }

                            if (pog.paintedOptions && pog.paintedOptions.length > 0) {
                                for (var o in pog.paintedOptions) {
                                    if (pog._selected) {
                                        pog.paintedOptions[o].bclear();
                                    } else {
                                        pog.paintedOptions[o].bset();
                                    }
                                }

                                pog._selected = !pog._selected;
                                pog.paintedControl.scroller2 && pog.paintedControl.scroller2.refresh();
                            }
                        }
                    })(selectOptionLeft);
                }
            }
        }
        
        var paintedControl = document.createElement('div');
        paintedControl.bclear = (function (pc) {
            return function () {
                var optionsList = pc.firstChild;

                for (var i = 0; optionsList.childNodes.length; ++i) {
                    var listItem = optionsList.childNodes.item(i);
                    listItem.hiddenControl && (listItem.hiddenControl.value = '');
                    listItem.className && (listItem.className = '');
                    listItem._selected && (listItem._selected = false);
                    listItem.right && (listItem.right.style.display = 'none');
                }
            }
        })(paintedControl);
        paintedControl.hideOption = function (val) {
            var optionsList = this.firstChild;

            for (var i = 0; i < optionsList.childNodes.length; ++i) {
                var listItem = optionsList.childNodes.item(i);

                if (val == listItem.value) {
                    listItem.style.display = 'none';
                    listItem.right.style.display = 'none';
                    listItem.hiddenControl.value = '';
                    listItem.className = '';
                    listItem._selected = false;
                }
            }

            this.scroller1 && this.scroller1.refresh();
            this.scroller2 && this.scroller2.refresh();
        }
        paintedControl.showOptions = function () {
            var optionsList = this.firstChild;

            for (var i = 0; i < optionsList.childNodes.length; ++i) {
                var listItem = optionsList.childNodes.item(i);
                
                if ('none' === listItem.style.display) {
                    listItem.style.display = 'block';
                }
            }

            this.scroller1 && this.scroller1.refresh();
            this.scroller2 && this.scroller2.refresh();
        }
        paintedControl.enable = (function (pc) {
            return function () {
                pc._disabled = false;
            }
        })(paintedControl);
        paintedControl.disable = (function (pc) {
            return function () {
                pc._disabled = true;
            }
        })(paintedControl);

        !!element.getAttribute('id') && paintedControl.setAttribute('id', element.getAttribute('id'));
        paintedControl.className = 'selectMenu';
        paintedControl._disabled = !!element.disabled;
        paintedControl._readonly = !!element.readonly;
        element.onchange && (paintedControl._onchange = element.onchange);
        var fromSelectContainer, toSelectContainer, slidebar, buttonUp, buttonDown, fakeButton;

        slidebar = document.createElement('div');
        slidebar.className = 'slidebar';
        buttonUp = document.createElement('span');
        buttonDown = document.createElement('span');
        buttonUp.className = 'up';
        buttonDown.className = 'down';
        slidebar.appendChild(buttonUp);
        slidebar.appendChild(buttonDown);
        
        fakeButton = document.createElement('button');
        fakeButton.appendChild(document.createComment('*'));
        fakeButton.setAttribute('name', 'foo');
        fakeButton.onfocus = _fakeFocusFF;
        fakeButton.onblur = _fakeBlurFF;
        try {
            fakeButton.setAttribute('type', 'button');
            fakeButton.type = 'button';
        } catch (e) {}

        /* other pages */
        fromSelectContainer = document.createElement('div');
        fromSelectContainer.className = 'lp';
        toSelectContainer = document.createElement('div');

        paintedControl.appendChild(fromSelectContainer);
        paintedControl.appendChild(slidebar);
        paintedControl.appendChild(toSelectContainer);
        paintedControl.appendChild(fakeButton);

        paintedControl._disabled && (toSelectContainer.style.display = 'none');
        paintedControl._readonly && (toSelectContainer.style.display = 'none');
        var linearOptionsList = createLinearOptionsList(element);
        createCustomOptions(paintedControl, fromSelectContainer, toSelectContainer, linearOptionsList);

        _replaceCollection.push({'old': element, 'new': paintedControl});
        _paintedControlCollection.push(paintedControl);
    }

    var _createCustomSelectMultipleAlt = function(element) {
        var createCustomOption = function (option, paintedControl) {
            var selectOption = document.createElement('a');
            selectOption.setAttribute('href', 'javascript:void(0);');
            selectOption._name = element.name;
            selectOption._onclick = option.onclick;
            selectOption.value = option.getAttribute('value');
            selectOption.title = _getNodeText(option);
            selectOption.paintedControl = paintedControl;
            selectOption.appendChild(document.createTextNode(_getNodeText(option)));

            return selectOption;
        }
        var createCustomOptionSelected = function (option) {
            var selectOptionSelected = document.createElement('span');
            selectOptionSelected.appendChild(document.createTextNode(_getNodeText(option)));

            return selectOptionSelected;
        }
        var selectOptionOnclick = function (ev) {
            var event = ev || window.event;
            var target = event.target || window.event.srcElement;

            if (target && 'var' == target.tagName.toLowerCase()) {
                return false;
            }

            target.optionsList.style.display = 'none';

            if ('' === target.hiddenControl.value) {
                target.style.fontWeight = 'bold';
                target.hiddenControl.value = target.value;
                target.right.style.display = 'block';
            } else {
                target.style.fontWeight = 'normal';
                target.hiddenControl.value = '';
                target.right.style.display = 'none';
            }

            target._selected = !target._selected;
            target._onclick && target._onclick();

            if (target.paintedControl && target.paintedControl._onchange) {
                var values = new Array();

                var hiddens = _hiddenInputs.getElementsByName(target._name);
                for (var hi in hiddens) {
                    if (hiddens[hi].value) {
                        values.push(parseInt(hiddens[hi].value));
                    }
                }

                /* it is just ad hoc solution, romove this hard coded replacing */
                /* Das ist Achtung!!! */
                if (values.length > 0) {
                    window.getBrands && document.getElementById('fbrand').replaceOptions(getBrands(values.join(',')));
                }
            }

            target.paintedControl.scroller2 && target.paintedControl.scroller2.refresh();
            target.paintedControl.showList = false;
            /*target.paintedControl.selectDisplay.showList = false;*/

            return false;
        }
        var selectOptionSelectedOnclick = function (ev) {
            var target = (ev && ev.target) || (window.event && window.event.srcElement);
            target.left.style.fontWeight = 'normal';
            target.left.hiddenControl.value = '';
            target.left._selected = false;
            target.style.display = 'none';
            target.parentNode.parentNode.scroller2 && target.parentNode.parentNode.scroller2.refresh(true);
        }

        var createCustomOptions = function (paintedControl, fromSelectContainer, toSelectContainer) {
            var selectOptionsList = fromSelectContainer.selectOptionsList;
            var selectOptionsListContent = selectOptionsList.selectOptionsListContent; 
            var options = element.getElementsByTagName('option');

            for (var j = 0; j < options.length; ++j) {
                var option = options.item(j);

                var selectOption = createCustomOption(option, paintedControl);
                var selectOptionSelected = createCustomOptionSelected(option);

                selectOption.selectDisplay = fromSelectContainer;
                selectOption.optionsList = selectOptionsList;

                selectOptionsListContent.appendChild(selectOption);
                toSelectContainer.appendChild(selectOptionSelected);

                selectOptionSelected.left = selectOption;
                selectOption.right = selectOptionSelected;

                selectOption.hiddenControl = _hiddenInputs.addElement(element.name, option.selected ? option.value : '');

                _addEventListener(selectOption, 'click', selectOptionOnclick);
                _addEventListener(selectOptionSelected, 'click', selectOptionSelectedOnclick);

                if (option.selected) {
                    selectOption._selected = true;
                    selectOption.style.fontWeight = 'bold';
                } else {
                    selectOption._selected = false;
                    selectOptionSelected.style.display = 'none';
                }
            }
        }

        var paintedControl = document.createElement('div');
        !!element.getAttribute('id') && paintedControl.setAttribute('id', element.getAttribute('id'));
        paintedControl.className = 'selectMenu';
        paintedControl._disabled = !!element.disabled;
        element.onchange && (paintedControl._onchange = element.onchange);
        paintedControl.bclear = (function (pc) {
            return function () {
                var list = pc.selectDisplay.selectOptionsListContent;

                for (var i = 0; i < list.childNodes.length; ++i) {
                    var item = list.childNodes.item(i);
                    item.hiddenControl.value = '';
                    item.style.fontWeight = 'normal';
                    item.right.style.display = 'none';
                }
            }
        })(paintedControl);
        var fromSelectContainer, toSelectContainer, slidebar, buttonUp, buttonDown;

        slidebar = document.createElement('div');
        slidebar.className = 'slidebar';
        buttonUp = document.createElement('span');
        buttonDown = document.createElement('span');
        buttonUp.className = 'up';
        buttonDown.className = 'down';
        slidebar.appendChild(buttonUp);
        slidebar.appendChild(buttonDown);

        /* multiple select for brief search results: dropdown list with list of selected elements */
        fromSelectContainer = document.createElement('dfn');
        fromSelectContainer.className = 'multiSelectOne';
        toSelectContainer = document.createElement('div');
        toSelectContainer.className = 'lp';
        paintedControl.className += ' ' + element.className;

        paintedControl.appendChild(fromSelectContainer);
        paintedControl.selectDisplay = fromSelectContainer;
        paintedControl.appendChild(toSelectContainer);
        paintedControl.appendChild(slidebar);

        var selectArrow;
        selectArrow = document.createElement('em');

        var selectOptionsList;
        selectOptionsList = document.createElement('cite');

        var selectOptionsListContent;
        selectOptionsListContent = document.createElement('ins');
        selectOptionsListContent.style.overflowY = 'hidden';

        selectOptionsList.selectOptionsListContent = selectOptionsListContent;
        selectOptionsList.appendChild(selectOptionsListContent);
        selectOptionsList.style.display = 'none';
        fromSelectContainer.appendChild(selectArrow);
        fromSelectContainer.appendChild(selectOptionsList);
        fromSelectContainer.selectOptionsList = selectOptionsList;
        fromSelectContainer.selectOptionsListContent = selectOptionsListContent;
        fromSelectContainer.paintedControl = paintedControl;
        paintedControl.selectOptionsList = selectOptionsList;

        var selectOneOnclick = function (ev) {
            var event = ev || window.event;
            var target = event.target || event.srcElement;
            
            if (event._processed) {
                return false;
            }

            if (!target.selectOptionsList) {
                if (!target.parentNode.selectOptionsList) {
                    return false;
                } else {
                    target = target.parentNode;
                }
            }

            if (!target.paintedControl.showList) {
                target.paintedControl.showOptList();
            } else {
                target.paintedControl.hideOptList();
            }

            /* To delete. */
            target.parentNode.style.zIndex = '2000';
            return false;
        }

        var documentOnclick = function (ev) {
            _hideOptionList(ev, paintedControl, false);
        }

        _addEventListener(fromSelectContainer, 'click', selectOneOnclick);
        _addEventListener(document, 'click', documentOnclick);
        createCustomOptions(paintedControl, fromSelectContainer, toSelectContainer);
        
        paintedControl.hideOptList = (function (pc) {
            return function () {
                pc.selectOptionsList.style.display = 'none';
                pc.showList = false;
            }
        })(paintedControl)
        paintedControl.showOptList = (function (pc) {
            return function () {
                pc.selectOptionsList.style.display = 'block';
                pc.selectOptionsList.scrollTop = 0;
                pc.selectOptionsList.selectOptionsListContent.scrollTop = 0;
                pc.selectDisplay.scroller1 && pc.selectDisplay.scroller1.refresh && pc.selectDisplay.scroller1.refresh();
                pc.showList = true;
            }
        })(paintedControl)

        paintedControl.replaceOptions = (function (pctrl) {return function (elements) {
            var fromContainer = pctrl.selectDisplay;
            var toContainer = pctrl.childNodes.item(0);
            var selectOptionsList = fromContainer.getElementsByTagName('cite').item(0);
            var selectOptionsListContent = selectOptionsList.firstChild;

            while (selectOptionsListContent.childNodes.length > 0) {
                selectOptionsListContent.firstChild.hiddenControl.parentNode.removeChild(selectOptionsListContent.firstChild.hiddenControl);
                selectOptionsListContent.removeChild(selectOptionsListContent.firstChild);
            }

            while (toContainer.childNodes.length > 0) {
                toContainer.removeChild(toContainer.firstChild);
            }

            for (var ii in elements) {
                /* here some conventions about format? */
                if (null != elements[ii].title && null != elements[ii].value) {
                    var elem = document.createElement('a');
                    elem.appendChild(document.createTextNode(elements[ii].title));

                    /*var option = options.item(j);*/
                    var optionValue = elements[ii].value;
                    var optionTitle = elements[ii].title;
                    var selectOption = document.createElement('a');
                    var selectOptionSelected = document.createElement('span');
                    ///selectOption.name = element.name;
                    selectOption.value = optionValue;
                    selectOption.title = optionTitle;
                    selectOption.paintedControl = pctrl;
                    selectOption.selectDisplay = fromSelectContainer;
                    selectOption.optionsList = selectOptionsList;
                    selectOption.appendChild(document.createTextNode(optionTitle));
                    selectOptionSelected.appendChild(document.createTextNode(optionTitle));
                    selectOptionsListContent.appendChild(selectOption);

                    selectOptionSelected.left = selectOption;
                    selectOption.right = selectOptionSelected;

                    var hiddenControl = _hiddenInputs.addElement(element.name, '');
                    selectOption.hiddenControl = hiddenControl;
                    _form.appendChild(hiddenControl);

                    selectOption.onclick = function (ev) {
                        var event = ev || window.event;
                        var target = event.target || window.event.srcElement;

                        if (target && 'var' == target.tagName.toLowerCase()) {
                            return false;
                        }

                        target.optionsList.style.display = 'none';

                        if ('' === target.hiddenControl.value) {
                            target.style.fontWeight = 'bold';
                            target.hiddenControl.value = target.value;
                            target.right.style.display = 'block';
                        } else {
                            target.style.fontWeight = 'normal';
                            target.hiddenControl.value = '';
                            target.right.style.display = 'none';
                        }

                        target._selected = !target._selected;
                        target._onclick && target._onclick();
                        target.paintedControl && target.paintedControl._onchange && target.paintedControl._onchange(target.value);

                        return false;
                    }
                    selectOptionSelected.onclick = function (ev) {
                        var target = (ev && ev.target) || (window.event && window.event.srcElement);
                        /*target.source.className = '';*/
                        target.left.style.fontWeight = 'normal';
                        target.left.hiddenControl.value = '';
                        target.left._selected = false;
                        target.style.display = 'none';
                        target.parentNode.parentNode.scroller2 && target.parentNode.parentNode.scroller2.refresh(true);
                    }

                    hiddenControl.value = '';
                    selectOption._selected = false;
                    selectOptionSelected.style.display = 'none';

                    toContainer.appendChild(selectOptionSelected);
                }
            }
        }})(paintedControl);

        _replaceCollection.push({'old': element, 'new': paintedControl});
        _paintedControlCollection.push(paintedControl);
    }

    var _processText = function(element) {
        element.onclick && (element._onclick = element.onclick);
        element.onclick = function (ev) {
            var target = (ev && ev.target) || (window.event && window.event.srcElement);
            target.focus && target.focus();
            this._onclick && this._onclick();
        }
    }

    var _processSubmit = function(element) {

        if (element.onclick) {
            element._onclick = element.onclick;
        }

        var _submitter = function (ev) {
            var target = ev && ev.target || window.event && window.event.srcElement;
            target && target.form && target.form.submit && target.form.submit();
        }

        if (-1 !== element.className.indexOf('js_submitonclick')) {
            if (element.addEventListener) {
                element.addEventListener('click', _submitter, false);
            } else if (element.attachEvent) {
                element.attachEvent('onclick', _submitter);
            } else {
                element.onclick = _submitter;
            }
        }
    }

    var _processFormElements = function() {

        for (var i = 0; i < _form.length; ++i) {

            var element = _form[i];

            if (!element || !element.name || !element.type) {
                continue;
            }

            switch (element.type) {
            case 'checkbox':
                if (element.className != "nonstyled_form_element")
                {
                   _createCustomCheckbox(element);
                }
                break;
            case 'radio':
                _createCustomRadio(element);
                break;
            case 'select-one':
                if (element.className != "nonstyled_form_element")
                {
                   _createCustomSelectOne(element);
                }
                break;
            case 'select-multiple':
                if ('selectMenuAlt' === element.className) {
                    _createCustomSelectMultipleAlt(element);
                } else {
                    _createCustomSelectMultiple(element);
                }
                break;
            case 'text':
            case 'password':
                _processText(element);
                break;
            case 'submit':
                _processSubmit(element);
                break;
            default:
                break;
            }
        }
    }

    var _processFormLabels = function() {
        var labels = _form.getElementsByTagName('label');

        for (var i = 0; i < labels.length; ++i) {
            var labelItem = labels.item(i);
            var labelledControl = null;

            var forAttribute = '';

            if (labelItem.getAttribute('for')) {
                forAttribute = labelItem.getAttribute('for');
            } else if (!labelItem.getAttribute('for') && labelItem.htmlFor) {
                forAttribute = labelItem.htmlFor;
            }

            if ('' != forAttribute) {
                labelledControl = document.getElementById(forAttribute);
            }

            if (null != labelledControl) {
                labelledControl._label = labelItem;
            } else if ('' == forAttribute) {
                /* for nested input */
                var inputs = labelItem.getElementsByTagName('input');

                if (inputs.length > 0) {
                    for (var j = 0; j < inputs.length; ++j) {
                        if ('radio' == inputs.item(j).type || 'checkbox' == inputs.item(j).type) {
                            inputs.item(j)._label = labelItem;
                            break;
                        }
                    }
                }
            }

            _labelCollection.push(labelItem);
        }
    }

    var _replaceFormElements = function() {
        for (var n = 0; n < _replaceCollection.length; ++n) {
            var elem = _replaceCollection[n];

            if (elem) {
                if (elem['old'] && elem['old']._label) {
                    elem['new']._label = elem['old']._label;
                    elem['new']._label.paintedControl = elem['new'];

                    switch (elem['new']._type) {
                    case 'radio':
                        elem['new']._label.className = elem['new']._label.className.replace(' checkbox', '').replace('checkbox', '') + ' ' + (elem['new']._selected ? 'checkbox radiobtns selected' : 'checkbox radiobtns');
                        elem['new'].className = elem['new'].className.replace(' selected', '').replace('selected', '').replace(' radiobtn', '').replace('radiobtn', '');
                        break;
                    case 'checkbox':
                        elem['new']._label.className = elem['new']._label.className.replace(' checkbox', '').replace('checkbox', '') + ' ' + (elem['new']._selected ? 'checkbox selected' : 'checkbox');
                        elem['new'].className = elem['new'].className.replace(' selected', '').replace('selected', '').replace(' checkbox', '').replace('checkbox', '');
                        break;
                    }

                    /*elem['new'].className && (elem['old']._label.className = elem['new'].className);*/
                    elem['new']._label.onclick = function (ev) {
                        var event = ev || window.event;
                        var target = event.target || window.event.srcElement;

                        if (event._processed) {
                            return false;
                        } else {
                            event._processed = true;
                        }

                        if (target.paintedControl) {
                            target = target.paintedControl;
                            /* if label exists, no span classes needed */

                            if ('checkbox' == target._type || 'radio' == target._type) {
                                target.className = '';
                            }
                        } else if (target.parentNode && target.parentNode.paintedControl) {
                            /* to escape added into LABEL tag QA */
                            target = target.parentNode.paintedControl;

                            if ('checkbox' == target._type || 'radio' == target._type) {
                                target.className = '';
                            }
                        } else {
                            return true;
                        }

                        if (target._disabled) {
                            return false;
                        }

                        if ('checkbox' == target._type || 'radio' == target._type) {
                            target.bclick();
                        }

                        if (target.onclickHandlerQueue && target.onclickHandlerQueue.length) {
                            for (var x in target.onclickHandlerQueue) {
                                target.onclickHandlerQueue[x](ev);
                            }
                        }

                        window.event && (window.event.cancelBubble = true);
                        window.event && (window.event.returnValue = false);
                        ev && ev.preventDefault();

                        return true;
                    }

                    if (true && elem['new']._disabled) {
                        if ('checkbox' == elem['new']._type) {
                            elem['new']._label.className = elem['new']._label.className.replace(' selected', '') + ' notactive';
                            !elem['new']._selected && (elem['new']._label.className += ' bnChield');
                        } else if ('radio' == elem['new']._type) {
                            elem['new']._label.className = elem['new']._label.className.replace(' selected', '') + ' notactiveRB';
                            !elem['new']._selected && (elem['new']._label.className += ' bnChield');
                        }
                    }
                }

                elem['old'].parentNode.replaceChild(elem['new'], elem['old']);

                /* mega hack for alternate multiple select */
                if (elem['new'].className && -1 !== elem['new'].className.indexOf('selectMenuAlt')) {
                    if (elem['new'].parentNode.getElementsByTagName('label').length > 0) {
                        elem['new'].parentNode.getElementsByTagName('label').item(0).appendChild(elem['new'].firstChild);
                    }
                }

                /* super hack for select-one */
                if ('select-one' === elem['old'].type) {
                    elem['new'].showOptList();
                    elem['new'].hideOptList();
                    /*elem['new'].style.width = elem['new'].offsetWidth + 'px';*/
                }
                
                /* ultra hack for select-multiple */
                if ('select-multiple' === elem['old'].type &&
                    (!elem['new'].className || -1 == elem['new'].className.indexOf('selectMenuAlt'))) {

                    var btn = document.createElement('button');

                    if (isFF()) {
                        btn.onfocus = function (evt) { this.style.border = '1px dotted #838383'; }
                        btn.onblur = function (evt) { this.style.borderWidth = '0px'; }
                    }

                    /*elem['new'].insertBefore(btn, elem['new'].firstChild);*/
                }

                /* scrollbar for select-one element */
                var id = parseInt(Math.random() * 10000).toString() + (new Date()).getMilliseconds().toString();

                if ('select-one' == elem['old'].type && elem['new'].selectOptionsList && !elem['new'].selectOptionsList._heightAuto && window.BCustomScroller) {
                    var scrollbar, buttonUp, buttonDown, slider;
                    scrollbar = document.createElement('var');
                    scrollbar.className = 'selectScroll';
                    scrollbar.setAttribute('id', 'csb_' + id);
                    buttonUp = document.createElement('var');
                    buttonUp.className = 'bcsb_top';
                    buttonUp.setAttribute('id', 'csb_b_up_' + id);
                    buttonDown = document.createElement('var');
                    buttonDown.className = 'bcsb_down';
                    buttonDown.setAttribute('id', 'csb_b_down_' + id);
                    slider = document.createElement('var');
                    slider.className = 'slider';
                    slider.setAttribute('id', 'csb_sld_' + id);
                    scrollbar.appendChild(buttonUp);
                    scrollbar.appendChild(slider);
                    scrollbar.appendChild(buttonDown);
                    elem['new'].selectOptionsList.firstChild.setAttribute('id', 'text_' + id);
                    elem['new'].selectOptionsList.appendChild(scrollbar);
                    var customScrollbar = new BCustomScroller('text_' + id, 'csb_' + id, 'csb_sld_' + id, 'csb_b_up_' + id, 'csb_b_down_' + id, {'slider_height': 18, 'offset_top': 8, 'scrollbar_height': 69});
                    elem['new'].selectOptionsList.scrollbar = customScrollbar;
                } else if ('select-multiple' == elem['old'].type && window.BCustomScroller) {
                    if (elem['new'].className && -1 !== elem['new'].className.indexOf('selectMenuAlt')) {
                        var scrollbar, buttonUp, buttonDown, slider;
                        scrollbar = document.createElement('var');
                        scrollbar.className = 'selectScroll';
                        scrollbar.setAttribute('id', 'csb_' + id);
                        buttonUp = document.createElement('var');
                        buttonUp.className = 'bcsb_top';
                        buttonUp.setAttribute('id', 'csb_b_up_' + id);
                        buttonDown = document.createElement('var');
                        buttonDown.className = 'bcsb_down';
                        buttonDown.setAttribute('id', 'csb_b_down_' + id);
                        slider = document.createElement('var');
                        slider.className = 'slider';
                        slider.setAttribute('id', 'csb_sld_' + id);
                        scrollbar.appendChild(buttonUp);
                        scrollbar.appendChild(slider);
                        scrollbar.appendChild(buttonDown);
                        elem['new'].selectOptionsList.firstChild.setAttribute('id', 'text_' + id);
                        elem['new'].selectOptionsList.appendChild(scrollbar);
                        var customScrollbar = new BCustomScroller('text_' + id, 'csb_' + id, 'csb_sld_' + id, 'csb_b_up_' + id, 'csb_b_down_' + id, {'slider_height': 18, 'offset_top': 8, 'scrollbar_height': 69});
                        elem['new'].selectDisplay.scroller1 = customScrollbar;

                        var list = elem['new'].childNodes.item(0);
                        scrollbar = elem['new'].childNodes.item(1);
                        var buttonUp = scrollbar.childNodes.item(0);
                        var buttonDown = scrollbar.childNodes.item(1);
                        list.setAttribute('id', 'ml_' + id);
                        scrollbar.setAttribute('id', 'ml_csb_' + id);
                        buttonDown.setAttribute('id', 'ml_bd_' + id);
                        buttonUp.setAttribute('id', 'ml_bu_' + id);
                        elem['new'].scroller2 = new BCustomScroller('ml_' + id, 'ml_csb_' + id, null, 'ml_bu_' + id, 'ml_bd_' + id, {'offset_top': 10, 'scrollbar_height': 90}, true);
                    } else {
                        var list = elem['new'].childNodes.item(0), list2 = elem['new'].childNodes.item(2);
                        var scrollbar = elem['new'].childNodes.item(1);
                        var buttonUp = scrollbar.childNodes.item(0);
                        var buttonDown = scrollbar.childNodes.item(1);
                        list.setAttribute('id', 'ml_' + id);
                        list2.setAttribute('id', 'ml2_' + id);
                        scrollbar.setAttribute('id', 'ml_csb_' + id);
                        buttonDown.setAttribute('id', 'ml_bd_' + id);
                        buttonUp.setAttribute('id', 'ml_bu_' + id);
                        elem['new'].scroller1 = new BCustomScroller('ml_' + id, 'ml_csb_' + id, null, 'ml_bu_' + id, 'ml_bd_' + id, {'offset_top': 10, 'scrollbar_height': 90}, true);
                        elem['new'].scroller2 = new BCustomScroller('ml2_' + id);
                    }
                }
            }
        }
    }

    _initialize();
    _processFormElements();
    _processFormLabels();
    _replaceFormElements();
    _hiddenInputs.addToForm();

    this.refresh = function () {
    }
    
    this.clear = (function (pcc) {
        return  function () {
            for (var i = 0; i < _form.length; ++i) {
                if (_form[i].type && ('text' === _form[i].type || 'textarea' === _form[i].type) && !_form[i].disabled) {
                    _form[i].value = '';
                }
            }

            for (var k in pcc) {
                var paintedControl = pcc[k];
                paintedControl.bclear();
            }
            
            pcc;
        }
    })(_paintedControlCollection);

    window.adjustWindowHeight && window.adjustWindowHeight();
    return true;
}

function BCustomScroller(textId, scrollbarId, sliderId, buttonUpId, buttonDownId, sizes, neverHide)
{
    var _text = document.getElementById(textId);
    var _scrollbar = document.getElementById(scrollbarId);
    var _slider = document.getElementById(sliderId);
    var _btnUp = document.getElementById(buttonUpId);
    var _btnDown = document.getElementById(buttonDownId);

    var _scrollbarHeight = sizes && sizes['scrollbar_height'] || 106;
    var _sliderHeight = sizes && sizes['slider_height'] || 18;
    var _maxUp = sizes && sizes['offset_top'] || 19;
    var _maxDown = _scrollbarHeight - _sliderHeight;

    if (!_text) {
        return false;
    }

    _text.style.overflowY = 'hidden';

    var _viewHeight = _text.clientHeight;
    var _totalHeight = _text.scrollHeight;
    _slider && (_slider.style.top = _maxUp + 'px');
    var _coordsInfo = {'top': _maxUp, 'min_y': null, 'max_y': null};

    this.refresh = function (noScroll) {
        /*_slider.style.top = _maxUp + 'px';*/
        _viewHeight = _text.clientHeight;
        _totalHeight = _text.scrollHeight;

        !noScroll && (_text.scrollTop = 0);
        !noScroll && (_coordsInfo.top = _maxUp);
        !noScroll && _slider && (_slider.style.top = _maxUp + 'px');

        if (_viewHeight >= _totalHeight) {
            /*_scrollbar.style.display = 'none';*/
            return false;
        } else {
            _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
            _scrollbar && (_scrollbar.style.display = 'block');
            return true;
        }
    }
    
    this.scrollTo = function (scrollFromTop) {
        try {
            scrollFromTop = parseInt(scrollFromTop);
        } catch (e) {
            return false;
        }
    
        if (scrollFromTop <= 0) {
            return false;
        }

        if (this.refresh()) {
            if (scrollFromTop > _text.scrollHeight - _text.clientHeight) {
                scrollFromTop = _text.scrollHeight - _text.clientHeight;
            }

            _text.scrollTop = scrollFromTop;
            _coordsInfo.top = scrollFromTop * (_scrollbarHeight - _sliderHeight - _maxUp) / (_totalHeight - _viewHeight) + _maxUp;
            _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
        }
    }

    if (_viewHeight >= _totalHeight) {
        /*return true;*/
        _scrollbar && !neverHide && (_scrollbar.style.display = 'none');
    } else {
        _scrollbar && (_scrollbar.style.display = 'block');
    }

    var _onDragStart = function (ev) {
        var event = ev || window.event;
        var target = event.target || window.event.srcElement;
        _coordsInfo.y = event.clientY;

        if (document.attachEvent) {
            document.attachEvent('onmousemove', _onDragDo);
            document.attachEvent('onmouseup', _onDragEnd);
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        } else if (document.addEventListener) {
            document.addEventListener('mousemove', _onDragDo, true);
            document.addEventListener('mouseup', _onDragEnd, true);
            event.preventDefault();
        }
    }
    var _onDragDo = function (ev) {
        var event = ev || window.event;
        var target = event.target || event.srcElement;
        var mouseY = event.clientY;
        _coordsInfo.top = _coordsInfo.top + mouseY - _coordsInfo.y;
        _coordsInfo.y = mouseY;

        if (_coordsInfo.top > _maxDown) {
            _coordsInfo.top = _maxDown;
        } else if (_coordsInfo.top < _maxUp) {
            _coordsInfo.top = _maxUp;
        }

        _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
        _text.scrollTop = (_scrollbarHeight - _sliderHeight - _maxUp) && parseInt((_totalHeight - _viewHeight) * ((_coordsInfo.top - _maxUp) / (_scrollbarHeight - _sliderHeight - _maxUp)));
    }
    var _onDragEnd = function (ev) {
        if (document.detachEvent) {
            document.detachEvent('onmousemove', _onDragDo);
            document.detachEvent('onmouseup', _onDragEnd);
        } else if (document.removeEventListener) {
            document.removeEventListener('mousemove', _onDragDo, true);
            document.removeEventListener('mouseup', _onDragEnd, true);
        }
    }

    var _intervalId = null;
    var _onPressStart = function (ev) {
        var event = ev || window.event;
        var target = event.target || event.srcElement;

        if (target == _btnUp) {
            _intervalId = window.setInterval(function () {_scroll('up')}, 50);
        } else if (target == _btnDown) {
            _intervalId = window.setInterval(function () {_scroll('down')}, 50);
        }
    }
    var _onPressEnd = function (ev) {
        window.clearInterval(_intervalId);
    }

    var _scroll = function (direction) {
        var textStep = 3;
        var sliderStep = textStep * (_scrollbarHeight - _sliderHeight - _maxUp) / (_totalHeight - _viewHeight);

        if ('down' == direction) {
            if (_coordsInfo.top < _maxDown && _text.scrollTop < _totalHeight - _viewHeight) {
                _coordsInfo.top += sliderStep;
                _coordsInfo.top > _maxDown && (_coordsInfo.top = _maxDown);
                _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
                _text.scrollTop += textStep;
            } else {
                return true;
            }
        } else if ('up' == direction) {
            if (_coordsInfo.top > _maxUp && _text.scrollTop > 0) {
                _coordsInfo.top -= sliderStep;
                _coordsInfo.top < _maxUp && (_coordsInfo.top = _maxUp);
                _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
                _text.scrollTop = _text.scrollTop - (_text.scrollTop > textStep ? textStep : 0);
            } else {
                return true;
            }
        }
    }

    var _wheel = function (ev) {
        var event = ev || window.event;
        var target = event.target || event.srcElement;

        if (_text != target && _text != target.parentNode && _text != target.parentNode.parentNode) {
            return true;
        }

        var delta = 0;

        if (event.wheelDelta) {
            delta = event.wheelDelta/120;

            /*
            if (navigator.userAgent && -1 === navigator.userAgent.indexOf('Opera')) {
                delta = -delta;
            }
            */
        } else if (event.detail) {
            delta = -event.detail/3;
        } else {
            return true;
        }

        var step = parseInt(delta * 7);

        if (!!delta) {
            if (delta > 0 && _text.scrollTop > 0 || delta < 0 && _totalHeight - _viewHeight > _text.scrollTop) {
                _text.scrollTop -= step;
            }

            var topDelta = step * (_scrollbarHeight - _sliderHeight - _maxUp) / (_totalHeight - _viewHeight);

            if (Math.abs(parseInt(_coordsInfo.top - topDelta)) >= _maxUp && Math.abs(parseInt(_coordsInfo.top - topDelta)) <= _maxDown) {
                 _coordsInfo.top -= topDelta;
                 
                 if (_coordsInfo.top < _maxUp) {
                    _coordsInfo.top = _maxUp;
                 }
                _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
            } else {
                if (topDelta > 0) {
                    _coordsInfo.top = _maxUp;
                } else {
                    _coordsInfo.top = _maxDown;
                }

                _slider && (_slider.style.top = parseInt(_coordsInfo.top) + 'px');
            }
        }

        event.preventDefault && event.preventDefault();
	    event.returnValue = false;

	    return false;
    }

    _slider && (_slider.onmousedown = _onDragStart);
    _btnUp && (_btnUp.onmousedown = _btnDown.onmousedown = _onPressStart);
    _btnUp && (_btnUp.onmouseup = _btnDown.onmouseup = _onPressEnd);

    if (window.addEventListener) {
        /** DOMMouseScroll is for mozilla. */
        window.addEventListener('mousewheel', _wheel, false);
        window.addEventListener('DOMMouseScroll', _wheel, false);
    } else if (document.attachEvent) {
        /** IE/Opera. */
        document.attachEvent('onmousewheel', _wheel);
    } else {
        window.onmousewheel = document.onmousewheel = _wheel;
    }
}