function LimitAllRelated(f)
{
	if (!f) { f = dsFormObj; }
	if (!f) { f = document.forms["dsForm"]; }
	if (!f) { f = document.forms[0]; }
	if (f) {
		for (var i = 0; i < f.elements.length; i++) {
			if (f.elements[i].type.indexOf("select-one") != -1 && f.elements[i].className.indexOf("rel_") == -1) {
				var sel = f.elements[i];
				LimitRelated(sel);
			}
		}
	}
}

function LimitRelated(sel) {
	if (sel) {
		var f = sel.form;
		if (sel.type.indexOf("select-one") != -1 && f && sel.name.length > 0) {
			for (var i = 0; i < f.elements.length; i++) {
				var pre = new RegExp("\\brel_" + sel.name + "\\b","i");
				if (f.elements[i].className.search(pre) > -1 && f.elements[i].type.indexOf("select") != -1) {
					var rsel = f.elements[i];
					var rselA = window["options_" + rsel.name];
					if (!rselA) {
						CreateSelectOptionsArray(rsel);
						rselA = window["options_" + rsel.name];
					}
					if (rselA) {
						rsel.options.length = 0;
						var j = 0;
						var ec = 0;
						var k = 0;
						for (k = 0; k < rselA.length; k++) {
							if ((sel.value == rselA[k].Parent) || (rselA[k].Parent == "null") || (rselA[k].Parent == "empty") || (sel.value == "%ALL%")) {
								rsel.options[j] = new Option(rselA[k].Title,rselA[k].Value);
								rsel.options[j].className = rselA[k].Parent;
								rsel.options[j].selected = rselA[k].Selected;
								j++;
								if (rselA[k].Parent == "empty") {
									ec++;
								}
							}
						}
						if ((ec > 0) && ((j - ec) > 0)) {
							for (k = 0; k < rsel.options.length; k++) {
								if (rsel.options[k].className == "empty") {
									rsel.options[k] = null;
									k--;
								}
							}
						}
					}
					FireOnChange(rsel);
				}
			}
		}
	}
}

function CreateSelectOptionsArray(sel) {
	if (sel) {
		if (sel.type.indexOf("select") != -1) {
			var varname = "options_" + sel.name;
			window[varname] = [];
			for (var i = 0; i < sel.options.length; i++) {
				var o = sel.options[i];
				window[varname][i] = new SelectOption(o.innerHTML,o.value,o.className,o.selected);
			}
		}
	}
}

function FireOnChange(el) {
	if (el) {
		if (el.fireEvent) {
			el.fireEvent("onchange");
		} else {
			var evt = document.createEvent("HTMLEvents");
			evt.initEvent("change",true,true);
			el.dispatchEvent(evt);
		}
	}
}

function SelectOption(t,v,p,s) {
	this.Title = t;
	this.Value = v;
	this.Parent = p;
	this.Selected = s;
}

function FilterSelect(sel,f,foverride) {
	if (sel) {
		var vr = true;
		try {
			if (typeof f === "string" && f.length > 0) {f = new RegExp(f,"i");} else {f = new RegExp(".","i");}
		} catch(er) {
			vr = false;
		}
		if (sel.type.indexOf("select") != -1 && sel.name.length > 0 && vr) {
			selA = window["options_" + sel.name];
			if (!selA) {
				CreateSelectOptionsArray(sel);
				selA = window["options_" + sel.name];
			}
			if (selA) {
				sel.options.length = 0;
				var j = 0;
				for (var i = 0; i < selA.length; i++) {
					if (selA[i].Title.search(f) > -1 || (foverride && selA[i].Parent === foverride)) {
						sel.options[j] = new Option(selA[i].Title,selA[i].Value);
						sel.options[j].className = selA[i].Parent;
						sel.options[j].selected = selA[i].Selected;
						j++;
					}
				}
			}
			FireOnChange(sel);
		}
	}
}

function SelectValue(sel,v,setto) {
	var m = -1;
	if (sel && v) {
		var ia = isArray(v);
		if (sel.type.indexOf("select") != -1) {
			if (setto !== false) { setto = true; }
			for (var i = 0; i < sel.options.length; i++) {
				if (inarray(v,sel.options[i].value,true)) {
					sel.options[i].selected = setto;
					FireOnChange(sel);
					if (ia) { m++; } else { return i; }
				}
			}
		}
	}
	return m;
}