// Rosenzweig
// This function adds a new event to any existing
// events when a window loads. All it needs is a function
// passed in that it will execute
function addWindowOnLoadEvent( fn ){ 
 if (window.addEventListener){ 
   window.addEventListener('load', fn, false); 
   return true; 
 } else if (window.attachEvent){ 
   var r = window.attachEvent("on"+'load', fn); 
   return r; 
 } else { 
   return false; 
 } 
}

function enableSubmitButtons() {
	var submit1 = document.getElementById( "doAction" );
	var submit2 = document.getElementById( "doAction0" );
	var submit3 = document.getElementById( "saveChangesAndReturnToPriorPage" );
	var submit4 = document.getElementById( "saveChangesAndReturnToPriorPage0" );
	var submit5 = document.getElementById( "saveChangesAndRefreshPage" );
	var submit6 = document.getElementById( "saveChangesAndRefreshPage0" );

	if ( submit1 != undefined ) {
		submit1.disabled = false;
	}
	if ( submit2 != undefined ) {
		submit2.disabled = false;
	}
	if ( submit3 != undefined ) {
		submit3.disabled = false;
	}
	if ( submit4 != undefined ) {
		submit4.disabled = false;
	}
	if ( submit5 != undefined ) {
		submit5.disabled = false;
	}
	if ( submit6 != undefined ) {
		submit6.disabled = false;
	}
}

function disableSubmitButtons() {
	addWindowOnLoadEvent( function() {
		var submit1 = document.getElementById( "doAction" );
		var submit2 = document.getElementById( "doAction0" );
		var submit3 = document.getElementById( "saveChangesAndReturnToPriorPage" );
		var submit4 = document.getElementById( "saveChangesAndReturnToPriorPage0" );
		var submit5 = document.getElementById( "saveChangesAndRefreshPage" );
		var submit6 = document.getElementById( "saveChangesAndRefreshPage0" );

		if ( submit1 != undefined ) {
			submit1.disabled = true;
		}
		if ( submit2 != undefined ) {
			submit2.disabled = true;
		}
		if ( submit3 != undefined ) {
			submit3.disabled = true;
		}
		if ( submit4 != undefined ) {
			submit4.disabled = true;
		}
		if ( submit5 != undefined ) {
			submit5.disabled = true;
		}
		if ( submit6 != undefined ) {
			submit6.disabled = true;
		}
		// Important piece here, so that we know if the buttons
		// have been disabled before enabling them later.
		window.submitsAreDisabled = true;
	} );
}

function perform_DO(params) {
	disableSubmitButtons();
	
	haveNotSeenError = true;
	    // branch for native XMLHttpRequest object
	//alert(this.url);
	var select = document.getElementById(this.id);
	if (select.length > 0 && select.selectedIndex != -1) {
		selectText = select.options[select.selectedIndex].text;
		selectValue = select.options[select.selectedIndex].value;
	}
	removeAllOptions(select);
    // Have to assign "this" to a variable - not sure why can't use directly
   var self = this;
	this.makeCall(params, function() {
            self.processReqChange(self);
        });
}

function performAdd_DO(params, selected, postScript) {
	haveNotSeenError = true;
	    // branch for native XMLHttpRequest object
	//alert(this.url);
	var select = document.getElementById(this.id);
	if (select.length > 0 && select.selectedIndex != -1) {
		selectText = select.options[select.selectedIndex].text;
		selectValue = select.options[select.selectedIndex].value;
	}
    // Have to assign "this" to a variable - not sure why can't use directly
   var self = this;
	this.makeCall(params, function() {
            self.processReqChangeAddOnly(self, selected, postScript);
        });
}

function createURL(urlToUse, params){
		var tmpURL;
        var posOfQ = urlToUse.indexOf("?");
        if (posOfQ != -1){
        	var beforeQ = urlToUse.substring(0, posOfQ + 1);
        	var afterQ = urlToUse.substring(posOfQ + 1, urlToUse.length);
        	tmpURL = beforeQ + params + "&" + afterQ;
        } else {
        	tmpURL = urlToUse + "?" + params;
        }
        return tmpURL;
}

function makeCall_DO(params, funct) {
    if (window.XMLHttpRequest) {
        this.req = new XMLHttpRequest();

        // Assign a closure to the onreadystatechange callback
        this.req.onreadystatechange = funct;
        this.req.open("GET", createURL(this.url, params), true);
        this.req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        this.isIE = true;
        this.req = new ActiveXObject("Microsoft.XMLHTTP");
        if (this.req) {
	        // Assign a closure to the onreadystatechange callback
	        this.req.onreadystatechange = funct;
	        tmpURL = this.url + "?" + params;
            this.req.open("GET", createURL(this.url, params), true);
            this.req.send();
        }
    }
}


// handle onreadystatechange event of req object
function processReqChange_DO(self) {
    // only if req shows "loaded"
    if (self.req.readyState == 4) {
        // only if "OK"
		var select = document.getElementById(self.id);
		var progressBar = document.getElementById( self.id + "ProgressBar" );
        if (self.req.status == 200) {
		 	var objDom = new XMLDoc(self.req.responseText, function(e){ self.xmlError(e, self)})
			//get the root node
			var objDomTree = objDom.docNode;
			if (objDomTree != null) {
				//get all of the elements named "OPTION"
				var optionElements = objDomTree.getElements("option");
				// iterate over the array
				var foundSelected = false;
				if (optionElements != null) {
					for(i=0; i < optionElements.length; i++) {
						var value = optionElements[i].getElements("value")[0].getText();
						var text = optionElements[i].getElements("text")[0].getText();
						if (self.selectedValue == value) {
							foundSelected = true;
							break;
						}
					}
				}
			}
			if (!foundSelected && self.selectedText != "") {
				addOption(select, self.selectedText, self.selectedValue, true);
				foundSelected = true;
			}
			if (self.noSelectionText != "") {
				addOption(select, self.noSelectionText, self.noSelectionText, !foundSelected);
			}
			if (optionElements != null) {
				for(i=0; i < optionElements.length; i++) {
					var value = optionElements[i].getElements("value")[0].getText();
					var text = optionElements[i].getElements("text")[0].getText();
					var s = false
					if (self.selectedValue == value) {
						s = true;
					}
					addOption(select, text, value, s);
				}
			}
			for (k = 0; k < self.actions.length;k++) {
				addOption(select, self.actions[k], self.actions[k], false);
			}
			// Display the dropdown (popup) menu
			select.style.display = 'inline';
			// Hide the progress bar
			progressBar.style.display = 'none';
			// Enable submit buttons
			if ( window.submitsAreDisabled ) {
				enableSubmitButtons();
			}
			else {
				// Pause two seconds to allow the window to finish loading
				// before enabling the submit buttons. You'll only hit this
				// branch if the AJAX request for the dropdown comes back
				// VERY fast.
				setTimeout( 'enableSubmitButtons()', 2000 );
			}
		} else {
            alert("There was a problem retrieving the XML data:\n" +
                self.req.statusText);
         }
   }
}

function processReqChangeAddOnly_DO(self, selected, postScript) {
    // only if req shows "loaded"
    if (self.req.readyState == 4) {
        // only if "OK"
		var select = document.getElementById(self.id);
        if (self.req.status == 200) {
		 	var objDom = new XMLDoc(self.req.responseText, function(e){ self.xmlError(e, self)})
			//get the root node
			var objDomTree = objDom.docNode;
			if (objDomTree != null) {
				//get all of the elements named "OPTION"
				var optionElements = objDomTree.getElements("option");
				// iterate over the array
				if (optionElements != null) {
					for(i=0; i < optionElements.length; i++) {
						var value = optionElements[i].getElements("value")[0].getText();
						var text = optionElements[i].getElements("text")[0].getText();
						var s = false
	
						addOption(select, text, value, selected);
					}
				}
				if (postScript != null && postScript != "") {
					eval(postScript);
				}
			}
		} else {
            alert("There was a problem retrieving the XML data:\n" +
                self.req.statusText);
         }
   }
}

function xmlError_DO(e, self) {
	//there was an error, show the user
	if(self.haveNotSeenError) {
		alert("XML: " + e);
		self.haveNotSeenError = false;
	}
	return false;
} //end function xmlError

function DynamicOptions (id, url, actions, noSelectionText, selectedText, selectedValue) {
	this.isIE = false;

// global request and XML document objects
	this.req = null;
	this.haveNotSeenError = true;
	this.noSelectionText = noSelectionText;
	this.id = id;
	this.selectedText = selectedText;
	this.selectedValue = selectedValue;
	this.actions = actions;
	this.firstTime = true;
	this.perform = perform_DO;
	this.processReqChange = processReqChange_DO;
	this.xmlError = xmlError_DO;
	this.url = url;
	this.makeCall = makeCall_DO;
	this.processReqChangeAddOnly = processReqChangeAddOnly_DO;
	this.performAdd=performAdd_DO;
}
