function tree_toggle(event) {
	event = event || window.event;
	var clickedElem = event.target || event.srcElement;
    clickedElem = Element.extend(clickedElem);
	if (!clickedElem.hasClassName('Expand')) {
		return; // клик не там
	}

	// Node, на который кликнули
	var node = clickedElem.up();
	if (!node.hasClassName('ExpandOpen') && !node.hasClassName('ExpandClosed')) {
		return; // клик на листе
	}

	// определить новый класс для узла
	//var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
	// заменить текущий класс на newClass
	// регексп находит отдельно стоящий open|close и меняет на newClass
	//var re =  /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
	//node.className = node.className.replace(re, '$1'+newClass+'$3')
	
	if (node.hasClassName('ExpandOpen')) {
	    node.addClassName('ExpandClosed');
	    node.removeClassName('ExpandOpen');
	} else {
	    node.removeClassName('ExpandClosed');
	    node.addClassName('ExpandOpen');
	}
}

function tree_toggle_ajax(event, url) {
	event = event || window.event;
	var clickedElem = event.target || event.srcElement;
    clickedElem = Element.extend(clickedElem);
    
	if (!clickedElem.hasClassName('Expand')) {
		return; // клик не там
	}

	// Node, на который кликнули
	var node = clickedElem.up();
	if (node.hasClassName('ExpandLeaf')) {
		return; // клик на листе
	}
	
	if (node.down('.Container').childElements().length > 0) {
        if (node.hasClassName('ExpandOpen')) {
            node.addClassName('ExpandClosed');
            node.removeClassName('ExpandOpen');
        } else {
            node.removeClassName('ExpandClosed');
            node.addClassName('ExpandOpen');
        }
	} else {
	    clickedElem.removeClassName('Expand')
	               .addClassName('ExpandLoading');
	    var req = new Ajax.Request(
		url,
		{
			method : 'POST',
			parameters : {'id': node.down('input[type=checkbox]').id},
			onSuccess : buildTree
		});
	}
}

function buildTree(xhr) {
    var resp = eval( '(' + xhr.responseText + ')' );
	if(!resp) {
		return false;
	}
	
    container = $(resp['id']).next('.Container');
    checked = $(resp['id']).checked;
    
    expand = $(resp['id']).previous('.ExpandLoading');
    if (expand) {
        expand.addClassName('Expand')
	          .removeClassName('ExpandLoading');
    }
	    
    if (container.childElements().length == 0) {
        if (resp['list'] && resp['list'].length != 0) {
            $H(resp['list']).each(function (pair) {
                li = new Element('li', {'class':'Node ExpandLeaf'})
                   .update(new Element('div', {'class':'Expand'}))
                   .insert(new Element('input', {'type':'checkbox','value':pair.key,'name':'citySelect[c][]'}))
                   .insert(new Element('div', {'class':'Content'}).update(pair.value));
                container.insert(li);
            });
            
            if (checked) {
                container.childElements().each(function (elem) {
                    elem.down('input[type=checkbox]').checked = true;
                });
            }
            $(resp['id']).up().removeClassName('ExpandClosed').addClassName('ExpandOpen');
        } else {
            $(resp['id']).up().removeClassName('ExpandClosed').addClassName('ExpandLeaf');
        }
    }
}


function hasClass(elem, className) {
	return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className);
}

function check_toggle(event) {
    event = event || window.event;
	var clickedElem = event.target || event.srcElement;
    
	up = Element.up(clickedElem);
	if (clickedElem.type == 'checkbox') {
	    checked = clickedElem.checked;
    	Element.select(up, 'input[type=checkbox]').each(function (elem) {
    	    elem.checked = checked;
    	    elem.enable();
    	});
    	
    	Selector.matchElements(clickedElem.ancestors(), 'li.Node').each(function (elem) {
    	    d = elem.childNodes[3];
    	    if (d) {
    	        count = d.childNodes.length;
    	        en_count = 0;
    	        
    	        Element.childElements(d).each(function (elem2) {
    	            elem3 = elem2.childNodes[1];
            	    if (elem3.checked/* && !elem3.disabled*/) {
    	                en_count++;
    	            }
            	});
            	
            	input = Element.extend(elem.childNodes[1]);
            	if (count == 0) {
            	    input.enable();
            	} else if (count == en_count && count > 0) {
            	    //input.enable();
            	    input.checked = true;
            	} else if(en_count == 0) {
            	    //input.enable();
            	    input.checked = false;
            	} else {
            	    //input.disable();
            	    input.checked = false;
            	}
    	    }
    	});
	}
}

function update_city_names(event)
{
    event = event || window.event;
    var clickedElem = event.target || event.srcElement;
    if (clickedElem.type == 'checkbox') {
        root = Element.extend(clickedElem).up('.IsRoot').up();
        text = new Array();
        root.childElements().each(function (elem) {
            cn      = elem.childNodes;
            content = cn[2].innerHTML;
            check   = cn[1];
            if (check.checked/* && !check.disabled*/) {
                text.push(content);
            } else {
                text2 = new Array();
                Element.childElements(elem.childNodes[3]).each(function (elem2) {
                    cn2       = elem2.childNodes;
                    content2 = cn2[2].innerHTML;
                    check2   = cn2[1];
                    if (check2.checked/* && !check2.disabled*/) {
                        text2.push(content2);
                    } else/* if (check2.checked && check2.disabled)*/ {
                        text3 = new Array();
                        Element.childElements(elem2.childNodes[3]).each(function (elem3) {
                            cn3       = elem3.childNodes;
                            content3 = cn3[2].innerHTML;
                            check3   = cn3[1];
                            if (check3.checked/* && !check3.disabled*/) {
                                text3.push(content3);
                            } else {
                                text4 = new Array();
                                el = elem3.childNodes[3];
                                if (el) {
                                    Element.childElements(el).each(function (elem4) {
                                        cn4       = elem4.childNodes;
                                        content4 = cn4[2].innerHTML;
                                        check4   = cn4[1];
                                        if (check4.checked/* && !check3.disabled*/) {
                                            text4.push(content4);
                                        }});}
                                        if (text4.length > 0) {
                                            text3.push(content3 + ' ( г. ' + text4.join(', ') + ')');
                                        }}});
                                        if (text3.length > 0) {
                                            text2.push(text3.join(', ') + ' - ' + content2);
                                        }}});
                                        if (text2.length > 0) {
                                            text.push(text2.join('<br/>&nbsp&nbsp&nbsp&nbsp&nbsp' +
                                            		'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'));
                                        }}});
                                        $('city_names').update(text.join(', '));
    }
}

