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 levels = locationLevels[i];
	  if (!unsorted || (unsorted && unsorted == false)) {
		levels.sort(sortLocationLevels);
	  }
        
        var initSel = initSelected[i];
        for (var j=0; j<levels.length; j++)
        {
            var ll = levels[j];
            if (!bSel)
            {
                select.options[select.options.length]=new Option(ll.name, ll.id);
            }
        }        
    }
    // select options
    for (var i=0; i<selects.length; i++)
    {
        var select = getSelect(i);
        var initSel = initSelected[i];
        if (initSel && initSel.length>0 && !(initSel.length==1 && initSel[0]=="0"))
        {
            for (var j=0; j<select.options.length; j++)
            {
                var ll = getSelectedLocationLevel(select.options[j].value);
                if (initSel && ((ll && isIn(ll.id, initSel)) || 
                        (isIn(select.options[j].value, initSel))))
                {
                    select.options[j].selected=true;
                    if (select.options[j].value!="0")
                    {
                        if (select.type=="select-one")
                        {
                            locationChange(select, select.options[j].value);
                        }
                    }
                }
            }
        }
    }
}

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);
						tmpArr[tmpArr.length]=ll.id;
					}
				}
				if (parentIds.length!=0)
				{
					parentIds=tmpArr;
				}
			} 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))
                    {
                        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;
}
