/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MARICOPA COUNTY FAMILY COURT INTERFACE
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Cathmhaol.MCFCAttorney = function(name, id) {
	this.name = name;
	this.id = id;
};
Cathmhaol.MCFCCaseParty = function(fn, ln, objAtty) {
	this.firstname = fn;
	this.lastname = ln;
	this.attorney = objAtty;
	this.toHtmlObject = function(lastFirst) {
		var span = document.createElement("span");

		var fn = document.createElement("span");
		fn.className = "firstname";
		fn.innerHTML = this.firstname;

		var ln = document.createElement("span");
		ln.className = "lastname";
		ln.innerHTML = this.lastname;

		var sep = document.createElement("span");
		sep.className = "name-separator";
		sep.innerHTML = (lastFirst ? ", " : " ");

		if (lastFirst) { span.appendChild(ln); } else { span.appendChild(fn); }
		span.appendChild(sep);
		if (lastFirst) { span.appendChild(fn); } else { span.appendChild(ln); }
		return span;
	}
};
Cathmhaol.MCFCInterface = function() {
	this.init(arguments);
};
Cathmhaol.MCFCInterface.prototype = {
	_CASE_NUMBER_EXP: null,
	_FIRST_NAME_EXP: null,
	_LAST_NAME_EXP: null,

	oCjlAjax: null,

	async: true,
	caseNumber: null,
	caseOpposingPartyFirstName: null,
	caseOpposingPartyLastName: null,
	casePartyFirstName: null,
	casePartyLastName: null,
	casePartyTypeIndicatorPetitioner: null,
	casePartyTypeIndicatorRespondent: null,
	displayBlock: null,
	isLoaded: false,
	numberOfMatches: 0,
	petitioners: null,
	respondents: null,
	selectionInstructions: null,
	status: null,

	init: function(args) {
		var _this = this;

		this._CASE_NUMBER_EXP = /casenumber/i;
		this._FIRST_NAME_EXP = /firstname/i;
		this._LAST_NAME_EXP = /lastname/i;

		this.petitioners = new Array();
		this.respondents = new Array();

		this._setStatus("Initializing");
		for (var intArgIndex = 0; intArgIndex < args.length; intArgIndex++) {
			switch (typeof args[intArgIndex]) {
				case "undefined":
					break;
				case "boolean":
					this.async = args[intArgIndex];
					break;
				case "string":
					this.displayBlock = args[intArgIndex];
					break;
				default:
					var obj = args[intArgIndex];
					if (this._CASE_NUMBER_EXP.test(obj.name)) {
						this.caseNumber = obj;
					} else if (this._FIRST_NAME_EXP.test(obj.name)) {
						this.casePartyFirstName = obj;
					} else if (this._LAST_NAME_EXP.test(obj.name)) {
						this.casePartyLastName = obj;
					}
					break;
			}
		}
		this._setStatus("");
		this.oCjlAjax = new Cathmhaol.Ajax();
		this.oCjlAjax.RequestObject.onreadystatechange = function () { _this._handleStateChange() };
	},
	check: function() {
		this.displayReset();
		if (this.caseNumber != null && this.caseNumber.value != "") {
			this.checkCaseNumber();
		} else if (this.casePartyFirstName != null && this.casePartyLastName != null && this.casePartyFirstName.value != "" && this.casePartyLastName.value != "") {
			this.checkParty();
		}
	},
	checkCaseNumber: function() {
		if (this._hasCaseNumber() && this._isValidCaseNumber()) {
			this.oCjlAjax.open("http://www.cathmhaol.com/products/xml/mcscfunnel.asp?caseNumber="+this.caseNumber.value, this.async);
		} else {
			this._handleError("Unable to open socket - "+this.caseNumber.value+" is invalid", false);
		}
	},
	checkParty: function() {
		if (this._hasName() && this._isValidName()) {
			this.oCjlAjax.open("http://www.cathmhaol.com/products/xml/mcscfunnel.asp?firstName="+this.casePartyFirstName+"&lastName="+this.casePartyLastName, this.async);
		} else {
			this._handleError("Unable to open socket - invalid party name", false);
		}
	},
	displayReset: function() {
		var objDivInstructions = document.createElement("div");
		objDivInstructions.className = "instructions";

		var objDom = new Cathmhaol.Document();
		var objDiv = objDom._getObject("mcfc_info");
		objDom.addClass(objDiv,"hidden");
		while (objDiv.hasChildNodes()) {
			var removalCandidate = objDiv.lastChild;
			if (removalCandidate.className == "instructions") {
				objDivInstructions = removalCandidate;
			}
			objDiv.removeChild(removalCandidate);
		}
		objDiv.appendChild(objDivInstructions);
	},
	displayResults: function() {
		var objDom = new Cathmhaol.Document();
		var objDiv = objDom._getObject("mcfc_info");

		var objParties = document.createElement("ul");
		objParties.className = "caseparty";

		var objSeparator = document.createElement("span");
		objSeparator.innerHTML = ", ";
		
		for (var i=0; i<this.petitioners.length; i++) {
			fn = this.petitioners[i].firstname;
			ln = this.petitioners[i].lastname;
			var objParty = this._createPartyObject("petitioner", i);
			objParty.appendChild(this.petitioners[i].toHtmlObject(true));
			objParties.appendChild(objParty);
		}

		for (var i=0; i<this.respondents.length; i++) {
			fn = this.respondents[i].firstname;
			ln = this.respondents[i].lastname;
			var objParty = this._createPartyObject("respondent", i);
			objParty.appendChild(this.respondents[i].toHtmlObject(true));
			objParties.appendChild(objParty);
		}
		objDiv.appendChild(objParties);
		objDom.removeClass(objDiv,"hidden");
	},
	_createPartyObject: function(strPartyType, intPartyIndex) {
		var _this = this;
		var strId = strPartyType+"-"+intPartyIndex
		var objParty = document.createElement("li");
		objParty.className = strPartyType;
		objParty.id = strId;
		objParty.onclick = function() { _this._setParty(strId); }
		objParty.onmouseout = function() { window.status=""; return true; }
		objParty.onmouseover = function() { window.status="Click to select"; return true; }
		return objParty;
	},
	_handleError: function(errorObject, errorMessage, openSearchWindow) {
		this._setStatus(errorMessage);
		if (openSearchWindow) {
			var objUtil = new Cathmhaol.Utilities();
			objUtil.popUp("http://www.cathmhaol.com/products/xml/mcscfunnel.asp", null, null, "scrollbars=1,statusbar=1", "mcscfunnel");
		}
	},
	_handleStateChange: function() {
		switch (this.oCjlAjax.RequestObject.readyState) {
			case 4:
				if (this.oCjlAjax.RequestObject.status == 200) {
					try {
						var nlCourtCases = this.oCjlAjax.RequestObject.responseXML.getElementsByTagName("courtcase");
						this.numberOfMatches = nlCourtCases.length;
						if (this.numberOfMatches == 1) {
							var noCourtCase = nlCourtCases.item(0);
							if (noCourtCase != undefined && noCourtCase != null) {
								if (this.caseNumber.value == "") { this.caseNumber.value = noCourtCase.getAttribute("casenumber"); }
								var nlPetitioners = noCourtCase.getElementsByTagName("petitioners");
								var nlParties = nlPetitioners.item(0).getElementsByTagName("caseparty")
								for (var intPartyIndex=0; intPartyIndex<nlParties.length; intPartyIndex++) {
									var noParty = nlParties.item(intPartyIndex);
									var noAtty = noParty.getElementsByTagName("attorney").item(0);
									var objAtty = new Cathmhaol.MCFCAttorney(noAtty.getAttribute("name"), noAtty.getAttribute("id"));
									var objParty = new Cathmhaol.MCFCCaseParty(noParty.getAttribute("firstname"), noParty.getAttribute("lastname"), objAtty);
									this.petitioners[this.petitioners.length] = objParty;
								}
								var nlRespondents = noCourtCase.getElementsByTagName("respondents");
								var nlParties = nlRespondents.item(0).getElementsByTagName("caseparty")
								for (var intPartyIndex=0; intPartyIndex<nlParties.length; intPartyIndex++) {
									var noParty = nlParties.item(intPartyIndex);
									var noAtty = noParty.getElementsByTagName("attorney").item(0);
									var objAtty = new Cathmhaol.MCFCAttorney(noAtty.getAttribute("name"), noAtty.getAttribute("id"));
									var objParty = new Cathmhaol.MCFCCaseParty(noParty.getAttribute("firstname"), noParty.getAttribute("lastname"), objAtty);
									this.respondents[this.respondents.length] = objParty;
								}
							}
							this._setStatus("Data loaded - CaseNumber: "+this.caseNumber.value+" :: "+this.petitioners.length+" Petitioner"+(this.petitioners.length == 1 ? "" : "s")+" :: "+this.respondents.length+" Respondent"+(this.respondents.length == 1 ? "" : "s"));
							this.displayResults();
						} else {
							this._handleError("Search error - opening search form", true);
						}
					} catch( e ) {
						this._handleError("Unspecified error", true);
					}
				}
				break;
			default:
				this.oCjlAjax.displayState();
				break;
		}
	},
	_hasCaseNumber: function() {
		if (this.caseNumber) {
			return (this.caseNumber.value != "");
		}
		return false;
	},
	_hasName: function() {
		if (this.casePartyFirstName && this.casePartyLastName) {
			return (this.casePartyFirstName.value != "" && this.casePartyLastName.value != "");
		}
		return false;
	},
	_isValidCaseNumber: function() {
		if (this.caseNumber) {
			if (this.caseNumber.value != "") {
				var FC_MINOR_CHILDREN = /^fc\s?\d{4}-\d{6}$/i;
				var FC_NO_CHILDREN = /^fn\s?\d{4}-\d{6}$/i;
				var DOMESTIC_RELATIONS = /^dr\s?\d{4}-\d{6}$/i;
				return (FC_MINOR_CHILDREN.test(this.caseNumber.value) || FC_NO_CHILDREN.test(this.caseNumber.value) || DOMESTIC_RELATIONS.test(this.caseNumber.value));
			}
		}
		return false;
	},
	_isValidName: function() {
		if (this.casePartyFirstName && this.casePartyLastName) {
			return (this.casePartyFirstName.value != "" && this.casePartyLastName.value != "");
		}
		return false;
	},
	_parseParty: function(noParty) {
		var fn = "";
		var ln = "";
		var nlNameSpan = noParty.getElementsByTagName("span"); //this returns the span containing the firstname and lastname spans
		var nlNameWords = nlNameSpan.item(0).getElementsByTagName("span");
		for (var i=0; i<nlNameWords.length; i++) {
			noWord = nlNameWords.item(i);
			if (noWord.className == "firstname") { fn = noWord.innerHTML; }
			if (noWord.className == "lastname") { ln = noWord.innerHTML; }
		}
		return {firstname: fn, lastname: ln};
	},
	_setParty: function(docId) {
		//<li class="{respondent|petitioner}" id="{respondent|petitioner}-#">
		//	<span>
		//		<span class="{firstname|lastname}">firstname|lastname</span>
		//		<span class="name-separator">{, | }</span>
		//		<span class="{firstname|lastname}">firstname|lastname</span>
		//	</span>
		//</li>
		var noSelectedParty = document.getElementById(docId); // this will return the li of the selected item
		var noOtherParty = (noSelectedParty.nextSibling ? noSelectedParty.nextSibling : noSelectedParty.previousSibling);

		var objSelectedPartyName = this._parseParty(noSelectedParty);
		if (this.casePartyFirstName) { this.casePartyFirstName.value = objSelectedPartyName.firstname; }
		if (this.casePartyLastName) {this.casePartyLastName.value = objSelectedPartyName.lastname; }

		var objOtherPartyName = this._parseParty(noOtherParty);
		if (this.caseOpposingPartyFirstName) { this.caseOpposingPartyFirstName.value = objOtherPartyName.firstname; }
		if (this.caseOpposingPartyLastName) { this.caseOpposingPartyLastName.value = objOtherPartyName.lastname; }

		var partyType = noSelectedParty.className;
		switch (partyType) {
			case "petitioner":
				if (this.casePartyTypeIndicatorPetitioner) { this.casePartyTypeIndicatorPetitioner.checked = true; }
				break;
			case "respondent":
				if (this.casePartyTypeIndicatorRespondent) { this.casePartyTypeIndicatorRespondent.checked = true; }
				break;
		}
	},
	_setStatus: function(message) {
		this.status = message;
		window.status = this.status;
		return true;
	}
};

