var selects=new Array();
var initSelected=new Array();
var firstEleSelected=new Array();
var locationLevels=new Array();
var lastSelects=new Array();
var formName=null;
var bSel = false;
var bPopulateFirstSelectOnly = false;

function LocationLevel(id, name, parentId) {
    this.id=id;
    this.name=name;
    this.parentId=parentId;
}

function sortLocationLevels(a,b) {
    if (a.name>b.name)
    {
        return 1;
    } else if (a.name<b.name)
    {
        return -1;
    }
    return 0;
}

function fixWidth() {
    for (var i=0; i<selects.length; i++)
    {
        var select = getSelect(i);
        if (select.style)
        {
            var amendWidth = select.style.width;
            var maxLength = 0;
            for (var j=0; j<select.options.length; j++)
            {
                var myOption = select.options[j];
                if (maxLength<myOption.text.length)
                {
                    maxLength = myOption.text.length;
                }
            }
            if (amendWidth)
            {
                select.style.width = (maxLength*5.2)+"px";
            }
        }
    }
}

function populateFirstSelectOnly() {    
    bPopulateFirstSelectOnly = true;
    for (var i=1; i<selects.length; i++)
    {
        var select = getSelect(i);
        select.options.length=firstEleSelected[i];
    }

}

function initLocationLevels(unsorted) {
	for (var i=0; i<selects.length; i++) {
		var select = getSelect(i);

	    var level = locationLevels[i];
	        
	    if (!unsorted || (unsorted && unsorted == false)) {
	    	level.sort(sortLocationLevels);
	    }
	        
	    var initSel = initSelected[i];
	    var optns = select.options;
	        
	    if (!select.isInitialized) {
	    	for (var k=0; k<level.length; k++) {
	    		var ll = level[k];
	    		if (!bSel) {
	    			optns[optns.length]=new Option(ll.name, ll.id);
	    		}
	    	}
	    }

	    if (initSel && initSel.length>0 && !(initSel.length==1 && initSel[0]=="0")) {
	    	for (var j=0; j<optns.length; j++) {
	    		if (isIn(optns[j].value, initSel)) {
	    			optns[j].selected=true;
	    			if (optns[j].value!="0") {
	    				if (select.type=="select-one") {
	    					locationChange(select, optns[j].value);
	    				}
	    			}
	    		}
	    	}
	    }
	    select.isInitialized=true;
    }
}

function locationChange(select, id) {
	if (select.selectedIndex >=0 ) {
		var bIn = false;
		var parentIds = new Array();
		var ll = getSelectedLocationLevel(select.options[select.selectedIndex].value);
		if (ll)
		{
			parentIds[0] = ll.id;
		} else if (id)
		{
			parentIds[0] = id;
		}

		for (var i=0; i<selects.length; i++)
		{
			var mySelect = getSelect(i);
			if (bIn) {
				var levels = locationLevels[i];
				var start=firstEleSelected[i];
				mySelect.options.length=start;
				var tmpArr = new Array();
				for (var j=0; j<levels.length; j++)
				{
					var ll = levels[j];
					if ((!bPopulateFirstSelectOnly && parentIds.length==0) || isIn(ll.parentId,parentIds))
					{
						mySelect.options[mySelect.options.length]=new Option(ll.name, ll.id, false, false);
						tmpArr[tmpArr.length]=ll.id;
					}
				}
				
	    	    if (mySelect.options.length > 1) {
	                mySelect.style.visibility = "visible";
	             }
	    	    
				if (parentIds.length!=0)
				{
					parentIds=tmpArr;
				}
				mySelect.isInitialized=true;
			} else {
				if (select==mySelect) {
					bIn = true;
					if (select.selectedIndex==0)
					{
						var tmpArr = new Array();
						for (var j=0; j<select.options.length; j++)
						{
							tmpArr[tmpArr.length]=select.options[j].value;
						}
						parentIds=tmpArr;
					}
				}
			}
			if (isLastSelect(mySelect)) {
				bIn = false;
			}
		}
	}
}

function getSelectedLocationLevel(id) {
    for (var i=0; i<locationLevels.length; i++)
    {
        for (var j=0; j<locationLevels[i].length; j++)
        {
            if (locationLevels[i][j].id==id)
            {
                return locationLevels[i][j];
            }
        }
    }
}

function isIn(id, ids) {
    for (var i=0; i<ids.length; i++)
    {
        if (ids[i]==id) {
            return true;
        }
    }
    return false;
}

function getSelect(i) {
    var select = eval("document.forms['"+formName+"'].elements['"+selects[i]+"']");
    if (!select.name)
    {
        select=select[i];
    }
    return select;
}

function selectOnlyFromLowest() {
    if (selects.length>0)
    {
        var b_FoundLevel = false;
        var lowestSelect = getSelect(selects.length-1);
        for (var i=selects.length-1; i>=0 && !b_FoundLevel; i--)
        {
            var select = getSelect(i);
            for (var j=select.options.length-1; j>=0; j--)
            {
                if (select.options[j].selected && select.options[j].value!="0")
                {
                    b_FoundLevel=true;
                    if (i!=(selects.length-1))
                    {
                    	// Disable 'all_locations' option:
                    	lowestSelect.options[0].selected=false;
                        lowestSelect.options[lowestSelect.options.length]=new Option(select.options[j].text, select.options[j].value);
                        lowestSelect.options[lowestSelect.options.length-1].selected=true;
                    }
                }
            }
        }
    }
}

function checkInvalidIds(warningMsg, clearOption) {
    var foundInvalid=false;
    var select = getSelect(selects.length-1);
    for (var j=select.options.length-1; j>=0 && !foundInvalid && invalidIds.length > 0; j--)
    {
        if (select.options[j].selected && select.options[j].value!="0")
        {
	      var selId = select.options[j].value;
		for (var k=0; k<invalidIds.length; k++) {
		    var invId = invalidIds[k];
		    if (invId == selId) {
			foundInvalid = true;
			alert(warningMsg);
			if (clearOption == true) {
			    select.options[j]=null;
			}
			break;
		    }
            }
        }
    }
    return foundInvalid;
}

function isLastSelect(sel) {

	var isLast = false;
	for (var i=0; i<lastSelects.length; i++) {
		if (lastSelects[i] == sel.name) {
			isLast = true;
		}
	}
	return isLast;
}

