﻿function processCategories(listId)
{
    if (!listId || !document.getElementById(listId)) {
        return false;
    }

    var categoriesList = document.getElementById(listId);
    var listsCollection = new Array();

    for (var i = 0; i < categoriesList.childNodes.length; ++i) {
        var child = categoriesList.childNodes.item(i);
        
        if (1 === child.nodeType && 'li' === child.tagName.toLowerCase()) {
            var label = null;
            
            for (var j = 0; j < child.childNodes.length; ++j) {
                if (1 === child.childNodes.item(j).nodeType && 'label' === child.childNodes.item(j).tagName.toLowerCase()) {
                    label = child.childNodes.item(j);
                }
            }
            
            if (null !== label) {
                label.className = 'checkbox';
                var control = label.getElementsByTagName('button').item(0);
                var subList = child.getElementsByTagName('ul').item(0);
                var subLabels = subList.getElementsByTagName('label');

                control.childrenTotalCount = subLabels.length;
                control.childrenSelectedCount = 0;
                
                for (var k = 0; k < subLabels.length; ++k) {
                    var subLabel = subLabels.item(k);
                    var subControl = subLabel.getElementsByTagName('button').item(0);
                    var subOnclickHandler = (function (sctrl, ctrl) {
                        return function (ev) {
                            if (sctrl._selected) {
                                ctrl.childrenSelectedCount += 1;
                            } else {
                                ctrl.childrenSelectedCount -= 1;
                            }
                            
                            if (ctrl.childrenTotalCount > ctrl.childrenSelectedCount) {
                                ctrl.bclear();
                            } else {
                                ctrl.bset();
                            }
                        }
                    })(subControl, control);

                    subControl.addOnclickHandler(subOnclickHandler);
                }

                listsCollection.push(subList);
                subList.listsCollection = listsCollection;

                var onclickHandler = (function (li, ul, ctrl) {
                    return function (ev) {
                        var event = ev || window.event;
                        
                        if (event._processed2) {
                            return false;
                        } else {
                            event._processed2 = true;
                        }
                        
                        var subList = li.getElementsByTagName('ul').item(0);
                        
                        if (!subList) {
                            return false;
                        }
                        
                        if (ctrl._selected) {
                            ctrl.childrenSelectedCount = ctrl.childrenTotalCount;
                        } else {
                            ctrl.childrenSelectedCount = 0;
                        }

                        var subLabels = subList.getElementsByTagName('label');

                        for (var k = 0; k < subLabels.length; ++k) {
                            var subLabel = subLabels.item(k);
                            var subControl = subLabel.getElementsByTagName('button').item(0);

                            if (ctrl._selected) {
                                subControl.bset();
                                /*ul.style.display = 'block';*/
                            } else {
                                subControl.bclear();
                                /*ul.style.display = 'none';*/
                            }
                        }
                        
                        ev && ev.preventDefault && ev.preventDefault();
                        window.event && (window.event.cancelBubble = true);
                        window.event && (window.event.returnValue = false);
                    }
                })(child, subList, control);

                var labelOnclickHandler = (function (ul, ctrl, lbl) {
                    return function (ev) {
                        var event = ev || window.event;
                        
                        if (event._processed2) {
                            return false;
                        } else {
                            event._processed2 = true;
                        }

                        if (ul.listsCollection && ul.listsCollection.length) {
                            for (var i in ul.listsCollection) {
                                if (ul !== ul.listsCollection[i]) {
                                    ul.listsCollection[i].style.display = 'none';
                                }
                            }
                        }

                        if ('' == ul.style.display || 'none' == ul.style.display) {
                            ul.style.display = 'block';
                            lbl.style.fontWeight = 'normal';
                        } else {
                            ul.style.display = 'none';

                            if (ctrl.childrenSelectedCount > 0 && ctrl.childrenSelectedCount < ctrl.childrenTotalCount) {
                                lbl.style.fontWeight = 'bold';
                            }
                        }

                        ev && ev.preventDefault && ev.preventDefault();
                        window.event && (window.event.cancelBubble = true);
                        window.event && (window.event.returnValue = false);
                    }
                })(subList, control, label);

                if (label.addEventListener) {
                    /*control.addEventListener('click', onclickHandler, false);*/
                    label.addEventListener('click', labelOnclickHandler, false);
                } else if (label.attachEvent) {
                    /*control.attachEvent('onclick', onclickHandler);*/
                    label.attachEvent('onclick', labelOnclickHandler);
                }

                control.addOnclickHandler(onclickHandler);
            }
        }
    }
}
