window.status = "Loading fade package...";

var fadeSteps = 4;				// Number of steps to loop
var fademsec = 25;				// The time between each step (note that most computer have problem
								// handling to small values due to hardware limitations)


var fadeArray = new Array();	// Needed to keep track of wich elements are animating

//////////////////  fade  ////////////////////////////////////////////////////////////
//                                                                                  //
//   parameter: fadeIn                                                              //
// description: A boolean value. If true the element fades in, otherwise fades out  //
//              The steps and msec are optional. If not provided the default        //
//              values are used                                                     //
//                                                                                  //
//////////////////////////////////////////////////////////////////////////////////////

function fade(el, fadeIn, steps, msec) {
    if (steps == null) steps = fadeSteps;
    if (msec == null) msec = fademsec;

	if (el.fadeIndex == null)
		el.fadeIndex = fadeArray.length;
	fadeArray[el.fadeIndex] = el;

	if (el.fadeStepNumber == null) {
		if (el.style.visibility == "hidden")
			el.fadeStepNumber = 0;
		else
			el.fadeStepNumber = steps;
		if (fadeIn)
			el.style.filter = "Alpha(Opacity=0)";
		else
			el.style.filter = "Alpha(Opacity=100)";
	}

	window.setTimeout("repeatFade(" + fadeIn + "," + el.fadeIndex + "," + steps + "," + msec + ")", msec);
}

//////////////////////////////////////////////////////////////////////////////////////
//  Used to iterate the fading

function repeatFade(fadeIn, index, steps, msec) {
	el = fadeArray[index];

	c = el.fadeStepNumber;
	if (el.fadeTimer != null)
		window.clearTimeout(el.fadeTimer);
	if ((c == 0) && (!fadeIn)) {			//Done fading out!
		el.style.visibility = "hidden";		// If the platform doesn't support filter it will hide anyway
//		el.style.filter = "";
		return;
	}
	else if ((c==steps) && (fadeIn)) {	//Done fading in!
		el.style.filter = "";
		el.style.visibility = "visible";
		return;
	}
	else {
		(fadeIn) ? 	c++ : c--;
		el.style.visibility = "visible";
		el.style.filter = "Alpha(Opacity=" + 100*c/steps + ")";

		el.fadeStepNumber = c;
		el.fadeTimer = window.setTimeout("repeatFade(" + fadeIn + "," + index + "," + steps + "," + msec + ")", msec);
	}
}

window.status = "";

var overOptionCss = "background: highlight; color: highlighttext";
var sizedBorderCss = "2 inset buttonhighlight";

var globalSelect;	//This is used when calling an unnamed selectbox with onclick="this.PROPERTY"

var ie4 = (document.all != null);

var browserType=navigator.userAgent;

var q = 0;

function initSelectBox(el) {
    copySelected(el);
    var size = el.getAttribute("size");

    // These two lines combined with execution in optionClick() allow you to write:
    //		onchange="alert(this.options[this.selectedIndex].value)"
    el.options = el.children[1].children;
    el.selectedIndex = findSelected(el);	//Set the index now!
    // Some methods that are supported on the real SELECT box
    el.remove = new Function("i", "int_remove(this,i)");
    el.item   = new Function("i", "return this.options[i]");
    el.add    = new Function("e", "i", "int_add(this, e, i)");
    // The real select box let you have lot of options with the same NAME. In that case the item
    // needs two arguments. When using DIVs you can't have two with the same NAME (or ID) and
    // then there is no need for the second argument
    el.options[el.selectedIndex].selected = true;
    dropdown = el.children[1];

    if (size != null) {
        if (size > 1) {
            el.size = size;
            dropdown.style.zIndex = 0;
            initSized(el);
        } else {
            el.size = 1;
            dropdown.style.zIndex = 99;
            if (dropdown.offsetHeight > 200) {
                dropdown.style.height = "200";
                dropdown.style.overflow = "auto";
            }
        }
    }
    highlightSelected(el,true);
}

function int_remove(el,i) {
	if (el.options[i] != null)
		el.options[i].outerHTML = "";
}

function int_add(el, e, i) {
	var html = "<div class='option' noWrap";
	if (e.value != null)
		html += " value='" + e.value + "'";
	if (e.style.cssText != null)
		html += " style='" + e.style.cssText + "'";
	html += ">";
	if (e.text != null)
		html += e.text;
	html += "</div>"

	if ((i == null) || (i >= el.options.length))
		i = el.options.length-1;

	el.options[i].insertAdjacentHTML("AfterEnd", html);
}

function initSized(el) {
//alert("initSized -------->");
	var h = 0;
	el.children[0].style.display = "none";

	dropdown = el.children[1];
	dropdown.style.visibility = "visible";

	if (dropdown.children.length > el.size) {
		dropdown.style.overflow = "auto";
		for (var i=0; i<el.size; i++) {
			h += dropdown.children[i].offsetHeight;
		}

		if (dropdown.style.borderWidth != null) {
			dropdown.style.pixelHeight = h + 4; //2 * parseInt(dropdown.style.borderWidth);
		}

		else
			dropdown.style.height = h;

	}

	dropdown.style.border = sizedBorderCss;


	el.style.height = dropdown.style.pixelHeight;
}

function copySelected(el) {
    var selectedIndex = findSelected(el);
    selectedCell = el.children[0].rows[0].cells[0];
    selectedDiv  = 	el.children[1].children[selectedIndex];
    selectedCell.innerHTML = selectedDiv.outerHTML;
}

// This function returns the first selected option and resets the rest
// in case some idiot has set more than one to selcted :-)
function findSelected(el) {
	var selected = null;


	ec = el.children[1].children;	//the table is the first child
	var ecl = ec.length;

	for (var i=0; i<ecl; i++) {
		if (ec[i].getAttribute("selected") != null) {
			if (selected == null) {	// Found first selected
				selected = i;
			}
			else
				ec[i].removeAttribute("selected");	//Like I said. Only one selected!
		}
	}
	if (selected == null)
		selected = 0;	//When starting this is the most logic start value if none is present

	return selected;
}

function toggleDropDown(el) {
    if (el.size == 1) {
        dropDown = el.children[1];

        if (dropDown.style.visibility == "") {
            dropDown.style.visibility = "hidden";
        }
        if (dropDown.style.visibility == "hidden") {
            showDropDown(dropDown);
        } else {
            hideDropDown(dropDown);
        }
    }
}

function optionClick() {
    el = getReal(window.event.srcElement, "className", "option");

    if (el.className == "option") {
        dropdown  = el.parentElement;
        selectBox = dropdown.parentElement;

        oldSelected = dropdown.children[findSelected(selectBox)]

        if(oldSelected != el) {
            oldSelected.removeAttribute("selected");
            el.setAttribute("selected", 1);
            selectBox.selectedIndex = findSelected(selectBox);
            document.getElementById(selectBox.id).value = document.getElementById(selectBox.id + selectBox.selectedIndex).value;
        }

        //document.getElementById('textIngBusc').value = document.getElementById(selectBox.id).type;

        if (selectBox.onchange != null) {	// This executes the onchange when you change the option
            if (selectBox.id != "") {		// For this to work you need to replace this with an ID or name
                eval(selectBox.onchange.replace(/this/g, selectBox.id));
            } else {
                globalSelect = selectBox;
                eval(selectBox.onchange.replace(/this/g, "globalSelect"));
            }
        }

        if (el.backupCss != null) {
            el.style.cssText = el.backupCss;
        }
        copySelected(selectBox);
        toggleDropDown(selectBox);
        highlightSelected(selectBox, true);
    }
}

function optionOver() {
	var toEl = getReal(window.event.toElement, "className", "option");
	var fromEl = getReal(window.event.fromElement, "className", "option");
	if (toEl == fromEl) return;
	var el = toEl;

	if (el.className == "option") {
		if (el.backupCss == null)
			el.backupCss = el.style.cssText;
		highlightSelected(el.parentElement.parentElement, false);
		el.style.cssText = el.backupCss + "; " + overOptionCss;
		this.highlighted = true;
	}
}

function optionOut() {
	var toEl = getReal(window.event.toElement, "className", "option");
	var fromEl = getReal(window.event.fromElement, "className", "option");

	if (fromEl == fromEl.parentElement.children[findSelected(fromEl.parentElement.parentElement)]) {
		if (toEl == null)
			return;
		if (toEl.className != "option")
			return;
	}

	if (toEl != null) {
		if (toEl.className != "option") {
			if (fromEl.className == "option")
				highlightSelected(fromEl.parentElement.parentElement, true);
		}
	}

	if (toEl == fromEl) return;
	var el = fromEl;

	if (el.className == "option") {
		if (el.backupCss != null)
			el.style.cssText = el.backupCss;
	}

}

function highlightSelected(el,add) {
	var selectedIndex = findSelected(el);

	selected = el.children[1].children[selectedIndex];

	if (add) {
		if (selected.backupCss == null)
			selected.backupCss = selected.style.cssText;
		selected.style.cssText = selected.backupCss + "; " + overOptionCss;
	}
	else if (!add) {
		if (selected.backupCss != null)
			selected.style.cssText = selected.backupCss;
	}
}

function hideShownDropDowns() {
	var el = getReal(window.event.srcElement, "className", "select");

	var spans = document.all.tags("SPAN");
	var selects = new Array();
	var index = 0;

	for (var i=0; i<spans.length; i++) {
		if ((spans[i].className == "select") && (spans[i] != el)) {
			dropdown = spans[i].children[1];
			if ((spans[i].size == 1) && (dropdown.style.visibility == "visible"))
				selects[index++] = dropdown;
		}
	}

	for (var j=0; j<selects.length; j++) {
		hideDropDown(selects[j]);
	}

}

function hideDropDown(el) {
	if (typeof(fade) == "function") {
        fade(el, false);
    } else {
        el.style.visibility = "hidden";
    }
}

function showDropDown(el) {
    if (typeof(fade) == "function") {
        fade(el, true);
    } else if (typeof(swipe) == "function") {
        swipe(el, 2);
    } else {
        el.style.visibility = "visible";
    }
}

function initSelectBoxes() {
    var spans = document.all.tags("SPAN");
    var selects = new Array();
    var index = 0;

    for (var i=0; i<spans.length; i++) {
        if (spans[i].className == "select") {
            selects[index++] = spans[i];
        }
    }

    for (var j=0; j<selects.length; j++) {
        initSelectBox(selects[j]);
    }
}

function getReal(el, type, value) {
    temp = el;
    while ((temp != null) && (temp.tagName != "BODY")) {
        if (eval("temp." + type) == value) {
            el = temp;
            return el;
        }
        temp = temp.parentElement;
    }
    return el;
}

if (browserType.indexOf("MSIE")!=-1) {
    window.onload = initSelectBoxes;
    document.onclick = hideShownDropDowns;
}

function writeSelectBox(matrix, id, size, events, css, css_class) {
	var d = window.document;

	var ie4 = (document.all != null);
    var browserType=navigator.userAgent;
    
    if (browserType.indexOf("MSIE")!=-1) {
		var s = createIEString(matrix, id, size, events, css, css_class);
		document.write(s);
	} else {
		var s = createXString(matrix, id, size, events, css, css_class);
		document.write(s);
	}
}

function createIEString(matrix, id, size, onchange, css, css_class) {
    // Select startTag
    var str = "";
    
    str += '<input type="hidden"';
    if (id != null && id != "") {
        str += ' name="' + id + '"';
    }
    //str += ' value="' + valor_sel + '"';
    str += '>\n';
    
    str += '<span class="select"';
    if (id != null && id != "") {
        str += ' id="' + id + '"';
    }
    if (size == null || size == '') {
        size = 1;
    }
    str += ' size="' + size + '"';
    if (onchange != null && onchange != '') {
        str += ' onchange="' + onchange + '"';
    }
    if (css_class != null && css_class != '') {
        str += ' class="' + css_class + '"';
    }
    if (css != null && css != '') {
        str += ' style="' + css + '"';
    }
    str += '>\n';

    html = matrix[0].html;
    valor = matrix[0].value;
    for (var i=0; i<matrix.length; i++) {
        if (matrix[i].selected=="selected") {
            html      = matrix[i].html;
            valor     = matrix[i].value;
            break;
        }
    }

    // Table Tag
    if (css_class != null && css_class != '') {
        str += '  <table class="' + css_class + '" cellspacing="0" cellpadding="0" onclick="toggleDropDown(this.parentElement)">\n';
    } else {
        str += '  <table class="selectTable" cellspacing="0" cellpadding="0" onclick="toggleDropDown(this.parentElement)">\n';
    }
    str += '    <tr>\n';
    str += '      <td ';
    if (css_class != null && css_class != "") {
        str += ' class="' + css_class + '"';
    } else {
        str += 'class="selected"';
    }
    if (css != null && css != "") {
        str += ' style="' + css + '"';
    }
    str += '>' + html + '</td>\n';
    str += '      <td class="button"\n';
    str += ' onmousedown="this.style.border=\'2px inset ButtonHighLight\'"\n';
    str += ' onmouseup="this.style.border=\'2px outset ButtonHighLight\'">\n';
    str += '        6\n';
    str += '      </td>\n';
    str += '    </tr>\n';
    str += '  </table>\n';

    // DropDown startTag
    str += '  <div class="dropDown" onClick="optionClick()" onMouseOver="optionOver()" onMouseOut="optionOut()">\n';

    var val_sele=matrix[0].value;
    for (var i=0; i<matrix.length; i++) {
        html      = matrix[i].html;
        valor     = matrix[i].value;
        css       = matrix[i].css;
        css_class = matrix[i].css_class;
        selected  = matrix[i].selected;
        
        // Write option starttag
        str += '    <div class="option" id="' + id + i + '"';
        if (valor != null && valor != "") {
            str += ' value="' + valor + '"';
        }
        if (css_class != null && css_class != "") {
            str += ' class="' + css_class + '"';
        }
        if (css != null && css != "") {
            str += ' style="' + css + '"';
        }
        if (selected != null && selected == "selected") {
            str += ' selected';
            val_sele = valor;
        }
        str += '>\n';

        // Write HTML contents
        str += html += '\n';
        // Write end tag
        str += '    </div>\n';
    }

    //DropDown endtag
    str += '  </div>\n';

    // Span endTag
    str += '</span>\n';
    
    str += '<script type="text/javascript">document.getElementById("' + id + '").value = "' + val_sele + '";</script>\n';

    return str;
}

function createXString(matrix, id, size, onchange, css, css_class) {
    var str="";
    // Select startTag
    str += '<select';
    if (size == null) {
        size = 1;
    }
    str += ' size="' + size + '"';
    if (id != null && id != '') {
        str += ' id="' + id + '" name="' + id + '"';
    }
    if (onchange != null && onchange != '') {
        str += ' onchange="' + onchange + '"';
    }
    if (css_class != null && css_class != '') {
        str += ' class="' + css_class + '"';
    }
    if (css != null && css != '') {
        str += ' style="' + css + '"';
    }
    str += '>\n';
    // write options
    for (var i=0; i<matrix.length; i++) {
        html      = matrix[i].html;
        valor     = matrix[i].value;
        css       = matrix[i].css;
        css_class = matrix[i].css_class;
        selected  = matrix[i].selected;

        // Write option starttag
        str += '\n<option';
        if (valor != null && valor != "") {
            str += ' value="' + valor + '"';
        }
        if (selected != null && selected != "") {
            str += ' selected';
        }
        str += '>';

        // Write HTML contents
        str += stripTags(html);
        // Write end tag
        str += '</option>\n';
    }
    str += '\n</select>\n';

    return str;
}

function stripTags(str) {
    var s = 0;
    var e = -1;
    var r = "";

    s = str.indexOf("<",e);

    do {
        r += str.substring(e + 1,s);
        e = str.indexOf(">",s);
        s = str.indexOf("<",e);
    } while ((s != -1) && (e != -1))

    r += str.substring(e + 1,str.length);

    return r;
}

function Option(html, valor, css, css_class, selected) {
    this.html = html;
    this.value = valor;
    this.css = css;
    this.css_class = css_class;
    this.selected = selected;
}

