// =========================================================
// live controls specific code 
// (this is re-usable, for an example look at search form)
// =========================================================

var valueChangeListeners = new Array();
var controlRefs = new Object();
var deps = new Object();

// --------------------------------------------------------------
// multi select controls
// --------------------------------------------------------------

/* expects div id */
function initMultiSelect( id, controlName, groupId, value )
{
	var elem = document.getElementById( id );
	if( !elem )
		return;
		
	elem.setAttribute( "value", value );
	if( controlName ) {
		elem.setAttribute("controlName", controlName);
	}
	if( groupId ) {
		elem.setAttribute("groupId", groupId );
	}
}


/* expects group div id */
function initGroupMultiSelect( id, label, noneSelectedLabel )
{
	var elem = document.getElementById( id );
	if( !elem ) {
		return;
	}
	elem.setAttribute("label", label );
	
	if( noneSelectedLabel ) {
		elem.setAttribute("noneSelectedLabel", noneSelectedLabel );
	}
}

/* expects group div */
function updateGroupLabel( elem )
{
	if( !elem )
		return;
	var label = null;
	for( var i=0; i<elem.childNodes.length; ++i ) {
		if( elem.childNodes[i].nodeName && 
			elem.childNodes[i].nodeName.toLowerCase() == "span" ) {
			
			label = elem.childNodes[i];
			break;
		}
	}
	if( !label )
		return;
		
	var selected = 0;
	var brother = elem;
	while( brother = brother.nextSibling ) {
		if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
			continue;
		if( brother.className.indexOf( "multi-subentry" ) == -1 )
			break;
		if( brother.className.indexOf( "-selected" ) != -1 )
			selected ++;
	}
	
	var text = elem.getAttribute("label");
	while( label.firstChild ) {
		label.removeChild( label.firstChild );
	}
	if( selected == 0 ) {
		var noneSelectedLabel = elem.getAttribute("noneSelectedLabel");
		if( !noneSelectedLabel ) {
			noneSelectedLabel = "Any";
		}
		label.appendChild( document.createTextNode( text + " (" + noneSelectedLabel + ")" ) );
		label.style.fontWeight = "normal";
	}
	else {
		label.appendChild( document.createTextNode( text + " (" + selected + ")" ) );
		label.style.fontWeight = "bold";
	}
}

/* expects img element */
function expandMultiSelect( elem )
{
	if( !elem ) 
		return;
		
	var child = elem.parentNode;
	while( child = child.nextSibling ) {
		if( child.nodeName && child.nodeName.toLowerCase() != "div" )
			continue;
		if( child.className.indexOf( "multi-subentry" ) == -1 )
			break;
		child.style.display = "block";
	}
	elem.onclick = function() { collapseMultiSelect( elem ); };
	elem.src = "img/controls/minus.gif";
	
	// find the label
	var brother = elem;
	while( brother = brother.nextSibling ) {
		if( brother.nodeName.toLowerCase() == "span" ) {
			brother.onclick = function() { collapseMultiSelect( elem ); };
			break;
		}
	}
}

/* expects img element */
function collapseMultiSelect( elem )
{
	if( !elem )
		return;
	
	var child = elem.parentNode;
	while( child = child.nextSibling ) {
		if( child.nodeName && child.nodeName.toLowerCase() != "div" )
			continue;
		if( child.className.indexOf( "multi-subentry" ) == -1 )
			break;
		child.style.display = "none";
	}
	elem.onclick = function() { expandMultiSelect( elem ); };
	elem.src = "img/controls/plus.gif";
	
	// find the label
	var brother = elem;
	while( brother = brother.nextSibling ) {
		if( brother.nodeName.toLowerCase() == "span" ) {
			brother.onclick = function() { expandMultiSelect( elem ); };
			break;
		}
	}
}

/* expects div element */
function selectMulti( elem, ignoreCrossPost )
{
	if( !elem )
		return;
	for( var i=0; i<elem.childNodes.length; ++i ) {
		if( "img" == elem.childNodes[i].nodeName.toLowerCase() &&
			elem.childNodes[i].src && elem.childNodes[i].src.indexOf( "checkbox_unchecked.gif" ) != -1 ) {
			elem.childNodes[i].src = "img/controls/checkbox_checked.gif";
			break;
		}
	}
	
	if( elem.className && elem.className.indexOf( "multi-entry" ) != -1  )
		elem.className = "multi-entry-selected";
	else
		elem.className = "multi-subentry-selected";
	
	elem.onclick = function() { deselectMulti( elem ); };
	
	if( elem.getAttribute("groupId") ) {
		var group = document.getElementById( elem.getAttribute("groupId") );
		updateGroupLabel( group );
	}
	
	var hidden = document.getElementById( elem.getAttribute("controlName") + "_value" );
	if( hidden ) {
		if( !hidden.value ) {
			hidden.value = elem.getAttribute( "value" );
		}
		else {
			var values = hidden.value.split( /,/ );
			var found = false;
			for( var i=0; i<values.length; ++i ) {
				if( values[i] == elem.getAttribute("value") ) {
					found = true;
					break;
				}
			}
			if( !found ) {
				hidden.value += "," + elem.getAttribute("value");
			}
		}
		//alert( "HIDDEN: " + hidden.name + ":" + hidden.value );
	}
	
	if( !ignoreCrossPost ) {
		postControlValueSelected( elem.getAttribute("controlName"), elem.getAttribute("value") );
	}
}

/* expects div element */
function deselectMulti( elem, ignoreCrossPost )
{
	if( !elem )
		return;
		
	for( var i=0; i<elem.childNodes.length; ++i ) {
		if( "img" == elem.childNodes[i].nodeName.toLowerCase() &&
			elem.childNodes[i].src && elem.childNodes[i].src.indexOf( "checkbox_checked.gif" ) != -1 ) {
			
			elem.childNodes[i].src = "img/controls/checkbox_unchecked.gif";
			break;
		}
	}
	
	if( elem.className && elem.className.indexOf( "multi-entry" ) != -1  )
		elem.className = "multi-entry";
	else
		elem.className = "multi-subentry";
	
	elem.onclick = function() { selectMulti( elem ); };

	if( elem.getAttribute("groupId") ) {
		var group = document.getElementById( elem.getAttribute("groupId") );
		updateGroupLabel( group );
	}
	
	var hidden = document.getElementById( elem.getAttribute("controlName") + "_value" );
	if( hidden ) {
		if( hidden.value ) {
			var values = hidden.value.split( /,/ );
			var newValue = "";
			for( var i=0; i<values.length; ++i ) {
				if( values[i] == elem.getAttribute("value") ) {
					continue;
				}
				if( newValue.length > 0 ) {
					newValue += "," + values[i];
				}
				else {
					newValue = values[i];
				}
			}
			hidden.value = newValue;
		}
		//alert( "HIDDEN: " + hidden.name + ":" + hidden.value );
	}
	
	if( !ignoreCrossPost ) {
		postControlValueRemoved( elem.getAttribute("controlName"), elem.getAttribute("value") );
	}
}

/* expects div element*/
function selectAllMulti( elem )
{
	if( !elem )
		return;
		
	if( elem.className && elem.className.indexOf( "multi-group" ) != -1 ) {
		var brother = elem;
		while( brother = brother.nextSibling ) {
			if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
				continue;
			if( brother.className.indexOf( "multi-subentry" ) == -1 )
				break;
			if( brother.className.indexOf( "-selected" ) == -1 ) {
				selectMulti( brother, true );
			}
		}
		
		// set the span event handler
		/*
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].nodeName && elem.childNodes[i].nodeName.toLowerCase() == "span" ) {
				elem.childNodes[i].onclick = function() { deselectAllMulti( elem ); };
				break;
			}
		}
		*/
		
		// expand the whole group
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].nodeName && 
				elem.childNodes[i].nodeName.toLowerCase() == "img" ) {
				
				expandMultiSelect( elem.childNodes[i] );
				break;
			}
		}
		
		// cross post
		var hidden = document.getElementById( elem.id + "_value" );
		if( hidden ) {
			postControlValueSelected( elem.id, hidden.value );
		}
		
	}
	else {
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].className && 
				elem.childNodes[i].className.indexOf( "multi-entry" ) != -1 ) {
				if( elem.childNodes[i].className.indexOf( "-selected" ) == -1 ) {
					selectMulti( elem.childNodes[i] );
				}
			}
		}
	}
}

/* expects div element */
function deselectAllMulti( elem )
{
	if( !elem )
		return;
		
	var allValues = "";
		
	if( elem.className && elem.className.indexOf( "multi-group" ) != -1 ) {		
		var brother = elem;
		while( brother = brother.nextSibling ) {
			if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
				continue;
			if( brother.className && brother.className.indexOf( "multi-subentry" ) == -1 )
				break;
			if( brother.className.indexOf( "-selected" ) != -1 ) {
				
				if( allValues.length > 0 ) {
					allValues += ",";
				}
				allValues += brother.getAttribute("value");
				
				deselectMulti( brother, true );
			}
		}
		
		/*
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].nodeName && elem.childNodes[i].nodeName.toLowerCase() == "span" ) {
				elem.childNodes[i].onclick = function() { selectAllMulti( elem ); };
				break;
			}
		}
		*/
		
		// cause cross post
		var hidden = document.getElementById( elem.id + "_value" );
		if( hidden ) {
			postControlValueRemoved( elem.id, allValues );
		}
	}
	else {
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].className && 
				elem.childNodes[i].className.indexOf( "multi-entry" ) != -1 ) {
				if( elem.childNodes[i].className.indexOf( "-selected" ) != -1 ) {
					deselectMulti( elem.childNodes[i] );
				}
			}
		}
	}		
}

function hideMulti( elem )
{
	if( !elem )
		return;
	if( elem.className.indexOf( "multi-group" ) != -1 ) {
		var brother = elem;
		while( brother = brother.nextSibling ) {
			if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
				continue;
			if( brother.className && brother.className.indexOf( "multi-subentry" ) == -1 )
				break;
			brother.style.display = "none";
		}
	}
	else if( elem.className.indexOf( "multi-select" ) != -1 ) {
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].nodeName && 
				elem.childNodes[i].nodeName.toLowerCase() == "div" ) {
				elem.childNodes[i].style.display = "none";
			}
		}
	}
	elem.style.display = "none";
}

function showMulti( elem )
{
	if( !elem )
		return;
	if( elem.className.indexOf( "multi-select" ) != -1 ) {
		for( var i=0; i<elem.childNodes.length; ++i ) {
			if( elem.childNodes[i].nodeName && 
				elem.childNodes[i].nodeName.toLowerCase() == "div" ) {
				elem.childNodes[i].style.display = "block";
			}
		}
	}
	elem.style.display = "block";
}


// --------------------------------------------------------------
// menu controls
// --------------------------------------------------------------
function enableMenuControl( containerId, controlId, labelText, enable )
{
	if( !containerId || !controlId )
		return;
	var container = document.getElementById( containerId );
	var control = document.getElementById( controlId );
	control.setAttribute("controlName", controlId );
	var label = document.getElementById( containerId + "_label" );
	if( !container || !control )
		return;
	if( label ) {
		label.style.visibility = "visible";
		if( labelText ) {
			while( label.firstChild ) {
				label.removeChild( label.firstChild );
			}
			label.appendChild( document.createTextNode( labelText ) );
		}
	}
	if( enable ) {
		control.removeAttribute( "disabled" );
		if( label ) {
			label.style.color = "black";
		}
	}
	else {
		control.setAttribute( "disabled", "true" );
		if( label ) {
			label.style.color = "gray";
		}
	}
}


// --------------------------------------------------------------
// general
// --------------------------------------------------------------



/* expects controlname and value */
function selectControl( controlName, value, ignoreCrossPost )
{
	if( !controlName || !value )
		return;
	var ctrl = document.getElementById( controlName );
	if( !ctrl )
		return;
	
	if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "div" ) {
		if( ctrl.className && ctrl.className.indexOf( "multi-select" ) != -1 ) {
			for( var i=0; i<ctrl.childNodes.length; ++i ) {
				if( ctrl.childNodes[i].nodeName && ctrl.childNodes[i].nodeName.toLowerCase() != "div" )
					continue;
				if( ctrl.childNodes[i].className && ctrl.childNodes[i].className.indexOf( "multi-entry" ) != -1 ) {
					if( ctrl.childNodes[i].getAttribute("value") == value ) {
						selectMulti( ctrl.childNodes[i], ignoreCrossPost );
						return;
					}
				}
			}
		}
		else if( ctrl.className && ctrl.className.indexOf( "multi-group" ) != -1 ) {
			var brother = ctrl;
			while( brother = brother.nextSibling ) {
				if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
					continue;
				if( brother.className && brother.className.indexOf( "multi-subentry") == -1 )
					break;
				if( brother.getAttribute("value") == value ) {
					selectMulti( brother, ignoreCrossPost );
					return;
				}
			}
		}
	}
	else if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "select" ) {
		for( var i=0; i<ctrl.childNodes.length; ++i ) {
			if( ctrl.childNodes[i].nodeName && ctrl.childNodes[i].nodeName.toLowerCase() != "option" )
				continue;
			if( ctrl.childNodes[i].getAttribute("value") == value ) {
				ctrl.childNodes[i].selected = true;
				if( !ignoreCrossPost ) {
					postControlValueSelected( controlName, value );
				}
			}
			else {
				ctrl.childNodes[i].removeAttribute( "selected" );
			}
		}
	}
	else if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "input" ) {
		if( controlName == "PRICE_FROM" || controlName == "PRICE_TO" ) {
			if( value == "0" ) {
				value = "";
			}
			if( value == "2147483647" ) {
				value = "";
			}
			
			if( value ) {
				ctrl.value= prettyNumberIfNecessary(value, "$");
			}
			else {
				ctrl.value = "";
			}
		}
		else {
			ctrl.value = prettyNumberIfNecessary(value);
		}
	}
}

/* expects controlname and value */
function deselectControl( controlName, value, ignoreCrossPost )
{
	if( !controlName || !value )
		return;
	var ctrl = document.getElementById( controlName );
	if( !ctrl )
		return;
	
	if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "div" ) {
		if( ctrl.className && ctrl.className.indexOf( "multi-select" ) != -1 ) {
			for( var i=0; i<ctrl.childNodes.length; ++i ) {
				if( ctrl.childNodes[i].nodeName && ctrl.childNodes[i].nodeName.toLowerCase() != "div" )
					continue;
				if( ctrl.childNodes[i].className && ctrl.childNodes[i].className.indexOf( "multi-entry" ) != -1 ) {
					if( ctrl.childNodes[i].getAttribute("value") == value ) {
						deselectMulti( ctrl.childNodes[i], ignoreCrossPost );
						return;
					}
				}
			}
		}
		else if( ctrl.className && ctrl.className.indexOf( "multi-group" ) != -1 ) {
			var brother = ctrl;
			while( brother = brother.nextSibling ) {
				if( brother.nodeName && brother.nodeName.toLowerCase() != "div" )
					continue;
				if( brother.className && brother.className.indexOf( "multi-subentry") == -1 )
					break;
				if( brother.getAttribute("value") == value ) {
					deselectMulti( brother, ignoreCrossPost );
					return;
				}
			}
		}
	}
	else if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "select" ) {
		for( var i=0; i<ctrl.childNodes.length; ++i ) {
			if( ctrl.childNodes[i].nodeName && ctrl.childNodes[i].nodeName.toLowerCase() != "option" )
				continue;
			ctrl.childNodes[i].removeAttribute( "selected" );
		}
		if( !ignoreCrossPost ) {
			postControlValueRemoved( controlName, value );
		}
	}
}

function postControlValueSelected( ctrlName, ctrlValue )
{
	if( !ctrlName || !ctrlValue )
		return;
		
	for( var i=0; i<valueChangeListeners.length; ++i ) {
		valueChangeListeners[i]( ctrlName, ctrlValue, true );
	}	
		
	var dependents = deps[ctrlName+':'+ctrlValue];
	if( !dependents )
		return;
	for( var i=0; i<dependents.length; ++i ) {
		var ctrl = document.getElementById( dependents[i] );
		if( !ctrl )
			continue;
		if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "select" ) {
			enableMenuControl( ctrl.parentNode.id, dependents[i], null, true );
		}
		else if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "div" ) {
			showMulti( ctrl );
		}
		
		if( typeof controlRefs[dependents[i]] != "undefined" ) {
			controlRefs[dependents[i]] += 1;
		}
		else {
			controlRefs[dependents[i]] = 1;
		}
	}
}

function postControlValueRemoved( ctrlName, ctrlValue )
{
	if( !ctrlName || !ctrlValue )
		return;
		
	for( var i=0; i<valueChangeListeners.length; ++i ) {
		valueChangeListeners[i]( ctrlName, ctrlValue, false );
	}
	
	var dependents = deps[ctrlName+':'+ctrlValue];
	if( !dependents )
		return;
		
	for( var i=0; i<dependents.length; ++i ) {
		var ctrl = document.getElementById( dependents[i] );
		if( !ctrl )
			continue;

		var refs = 0;
		if( typeof controlRefs[dependents[i]] != "undefined" ) {
			controlRefs[dependents[i]] -= 1;
			refs = controlRefs[dependents[i]];
		}
		if( refs > 0 )
			continue;
				
		if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "select" ) {
			enableMenuControl( ctrl.parentNode.id, ctrl.getAttribute("controlName"), null, false );
		}
		else if( ctrl.nodeName && ctrl.nodeName.toLowerCase() == "div" ) {
			if( ctrl.className.indexOf( "multi-group" ) != -1 ) {
				deselectAllMulti( ctrl );
				var img = null;
				for( var j=0; j<ctrl.childNodes.length; ++j ) {
					if( ctrl.childNodes[j].nodeName && ctrl.childNodes[j].nodeName.toLowerCase() == "img" ) {
						img = ctrl.childNodes[j];
						break;
					}
				}
				collapseMultiSelect( img );
			}
			else {
				deselectMultiSelect( ctrl );
			}
			hideMulti( ctrl );
		}
	}
}

