// ===================================================================================
// ----------------------------- START OF TABLE.js -----------------------------------
// ===================================================================================

var COLUMN_HEADER = 1000;
var COLUMN_NORMAL = 2000;

function isEven(num) {
	return !(num % 2);
}

function isOdd(num) {
	return !isEven(num);
}

function Column() {
	
	var flagStyle = false;
	var flagClass = false;
	var styleHTML = "";
	var CHHTML = "";
	var clValue = "";
	var hdrClass = "";
	var CLM_TYPE = COLUMN_NORMAL;
	var tagStart = "<td";
	var tagEnd = "</td>"
	
	this.setType = function (clType) {
		CLM_TYPE = clType;
		if (CLM_TYPE == COLUMN_NORMAL){
			tagStart = "<td";
			tagEnd = "</td>"
		} else {
			tagStart = "<th";
			tagEnd = "</th>"			
		}
	}
	
	// sample:    ""
	this.addValue = function (vlName) {
		clValue = vlName;		
	}
	
	// example:  "align: left;"
	this.addStyle = function (st) {
		flagStyle = true;	
		styleHTML = styleHTML + st;
	}

	this.addClass = function(className) {
		flagClass = true;
		hdrClass = "class=\"" + className + "\"";
	}	
	
	this.getHTML = function () {
		CHHTML = tagStart;
		
		if (flagClass) CHHTML = CHHTML + hdrClass;
		if (flagStyle) CHHTML = CHHTML + " style=\"" + styleHTML + "\"";
		
		CHHTML = CHHTML + ">" + clValue + tagEnd;

		return CHHTML;
	}
}

function Row(clr) {
	var theHTML = "";
	var clmHTML = "";
	var bgclr = clr;
	
	this.addColumn = function (column) {
		clmHTML = clmHTML + column.getHTML();
	}
	
	this.getHTML = function () {
		theHTML = "<tr " + bgclr + ">" + clmHTML + "</tr>";
		return theHTML;
	}	
}

function Table() {
	
	var flagClass = false;
	var strReturn = "";
	var strROW = "";
	var tblClass = "";
	
	this.addRow = function (row) {
		strROW = strROW + row.getHTML();
	}
		
	this.addClass = function(className) {
		flagClass = true;
		tblClass = "class=\"" + className + "\"";
	}	
		
	this.getHTML = function () {
		
		if (flagClass)
			strReturn = "<table " + tblClass + " >" + strROW + "</table>";
		else
			strReturn = "<table>" + strROW + "</table>";
					
		return strReturn;
	}
}

// ===================================================================================
// ----------------------------- END OF TABLE.js -------------------------------------
// ===================================================================================


// ===================================================================================
// ------------ START OF SearchResults.js --------------------------------------------
// ------------ @author Wisnu Prawoto on 15 January 2008 -----------------------------
// ===================================================================================

var MSG_NO_KEYWORD_TYPED = "Please type in any keywords to search for.";
var MSG_NO_RESULT = "There are no results matching the search criteria.";

var MaxResults = 0;

function HideElement(name) {
  	var element = document.getElementById(name);
	if (element != null) element.style.display = "none";
}
	
function ShowElement(name) {
  	var element = document.getElementById(name);
	if (element != null) element.style.display = "inline";
}

function checkSearchNoResult() {
	var el = xmlDoc.getElementsByTagName("Result");
	var t = el[0].getElementsByTagName("Count");
	MaxResults = parseInt(t[0].firstChild.data);
	if (MaxResults > 0) return true;
	else return false;
}

function PreviousPage() {
	clickedPrev = true;
	s_start = s_start - numberOfRows;	
	//alert("s_start = " + s_start);
	showSearchResults(s_start);
	return;	
}

function NextPage() {
	clickedNext = true;
	s_start = s_start + numberOfRows;
	//alert("s_start = " + s_start);
	showSearchResults(s_start);
	return;
}

function openLink(link) {
    var mywindow = window.open(link,"Link","menubar=1,resizable=1,status=1,toolbar=1,scrollbars=1,width=900,height=700");
	return;
}

// ===================================================================================
// ---------------------------------- Searching Functions ----------------------------
// ===================================================================================

var tblHeaders;
var tblFields;
var s_start = 0;
var clickedNext = false;
var clickedPrev = false;
var restrictToState = "";
var bMoreToDisplay = false;
var bShowAll = false;
var nPixelsPerRow = 50;

var tmpLINK = "<A HREF=\"javascript:openLink('";
var tmpEND = "');\">";
var tmpANCHOR = "</A>";
var tmpRESTRICT = "<A HREF=\"javascript:RestrictState('";
  
function resetAll() {
	var strUrl="";
	strUrl = window.location.href;
	window.location.href = strUrl;
	return;
}

function getSearchTableHeader(row) {
	for (x in tblHeaders) {
		column = new Column();	
		column.setType(COLUMN_HEADER);
		column.addValue(tblHeaders[x]);
		
		row.addColumn(column);
	}

	return row;
}

function getHTMLTable(el, keyField, start, restrict) {

	var entry = "", tblHTML = "", tmp = "";
	var vVal = "", fldName = "";
	var table, row, column;
	var keyVal;
	var dsid, dsName, dsAgency, LocLink;
	var nCount = 0;
	var nValidRecords = 0;  // The number of valid records found (ie. correct state) to compare with the start parameter to know when we should actually start displaying records
		
	var n_el = el.length;
	bMoreToDisplay = false;

	table = new Table();
	row = new Row("class=\"ResultHeader\"");
	row = getSearchTableHeader(row);
	table.addRow(row);
	
	for (i = 0; i < n_el ; i++) {

		if (isOdd(nCount)) 
			row = new Row("class=\"ResultOdd\"");
		else
			row = new Row("class=\"ResultEven\"");

		keyVal = getValue(el, i, keyField);

		var state = getValue(el, i, "State");

		if (!restrict || restrictToState == "" || restrictToState == state) {
		
			nValidRecords += 1;
			
			if (nValidRecords > start) {
				if (nCount < numberOfRows || !restrict) {
					for (x in tblFields) {

						fldName = tblFields[x];	
						vVal = getValue(el, i, fldName);

						if (x == 0) {
							if (LinkType == RESULT_LINKTYPE) {
								tmp = tmpLINK + publishingPathName + "?Open&ID=" + keyVal + tmpEND + vVal + tmpANCHOR;
							}
							else if (LinkType == COUNT_LINKTYPE && bAllState && !bShowAll) {
								if (vVal == "Total") {
									tmp = tmpRESTRICT + tmpEND + vVal + tmpANCHOR;
								}
								else {
									tmp = tmpRESTRICT + vVal + tmpEND + vVal + tmpANCHOR;
								}
							}
							else {
								tmp = vVal;
							}
						}
						else {
							tmp = vVal;
						}
				
						column = new Column();
						column.setType(COLUMN_NORMAL);
						column.addValue(tmp);
						row.addColumn(column);

					}

					table.addRow(row);
					nCount += 1;
				}
				else {
					bMoreToDisplay = true;
				}
			}
		}
	}
	
	if (userAction == REPORT_ACTION) {
		if (bShowAll) {
			HideElement("ShowAllButton");
		} else {
			if (bMoreToDisplay || clickedNext) {
				ShowElement("ShowAllButton");
			} else {
				if (restrictToState) {
					ShowElement("ShowAllButton");
				} else {
					HideElement("ShowAllButton");
				}
			}
		}
	} else {
		if (bShowAll) {
			HideElement("ShowAllButton");
		} else {
			if (bMoreToDisplay || clickedNext) {
				ShowElement("ShowAllButton");
			} else {
				HideElement("ShowAllButton");
			}
		}
	}

	tblHTML = table.getHTML();
	return tblHTML;
}

function buildSearchResults() {
	if (! checkSearchNoResult()) alert(MSG_NO_RESULT);
	else {
		showSearchResults(0);

		if (userAction == REPORT_ACTION) {
			var stateRestrict = document.getElementById("stateRestrict");
			
			if (bReportCounts) {
				showCount();
				
				if (bAllState && !bShowAll) {
					stateRestrict.style.display="block";
					
					if (restrictToState == "") {
						stateRestrict.innerHTML = "<strong>Displaying:</strong> All States";
					}
					else {
						stateRestrict.innerHTML = "<strong>Displaying:</strong> " + restrictToState;
					}
				}
				else {
					stateRestrict.style.display="none"; 
				}
			}
			else {
				if (bAllState && !bShowAll) {
					stateRestrict.style.display="block";

					var restrictURLs = tmpRESTRICT + tmpEND + "All States" + tmpANCHOR;
					var el = xmlDoc.getElementsByTagName("ReportCount");
					var n_el = el.length;
					
					for (i = 0; i < n_el; i++) {
						vVal = getValue(el, i, "State");
						if (vVal != "Total") {
							restrictURLs += ", " + tmpRESTRICT + vVal + tmpEND + vVal + tmpANCHOR;
						}
					}
					
					if (restrictToState == "") {
						stateRestrict.innerHTML = "<strong>Displaying:</strong> All States";
					}
					else {
						stateRestrict.innerHTML = "<strong>Displaying:</strong> " + restrictToState;
					}
					
					stateRestrict.innerHTML += "<BR>" + restrictURLs;
				}
				else {
					stateRestrict.style.display="none";
				}
			}
			
			var ReportCriteria = document.getElementById("ReportCriteria");
			ReportCriteria.style.display = "block";
			ReportCriteria.innerHTML = "<BR><BR>" + "<strong>Criteria:</strong> " + PrintableCriteria;
		}
	}
	return;
}
	
function checkNext(start) {
	if (bMoreToDisplay)
		ShowElement("NextButton");
	else 
		HideElement("NextButton");
	return;
}

function checkPrevious() {
	if (clickedNext)
		ShowElement("PreviousButton");
	return;
}

function HideTableButtons() {
	clickedNext = false;
	clickedPrev = false;	
	HideElement("NextButton");
	HideElement("PreviousButton");
	return;
}

function RestrictState(state) {
	s_start = 0;
	restrictToState = state;
	HideTableButtons();
	buildSearchResults();
	return;
}

function showSearchResults(start) {
	if (start == 0) HideTableButtons();	
	
	var el;
	var key = "ID";	

	var ProgressDiv = document.getElementById("Progress");
	ProgressDiv.style.display = "inline";
	
	var SRId = document.getElementById("SearchResults");
	SRId.style.display="block";
	if (bShowAll) {
		ProgressDiv.innerHTML = "All";
		SRId.style.height = (MaxResults * nPixelsPerRow) + "px";
	} else {
		var from = s_start + 1;
		var to = s_start + numberOfRows;
		var max = MaxResults;
		if (restrictToState != "") {
			var elResult = xmlDoc.getElementsByTagName("Result");
			var elStateCount = elResult[0].getElementsByTagName("Count" + restrictToState);
			max = parseInt(elStateCount[0].firstChild.data);
		}
		if (to > max) to = max;
		ProgressDiv.innerHTML = from + "-" + to + " of " + max;
		if (MaxResults < numberOfRows) {
			SRId.style.height = (max * nPixelsPerRow) + "px";
		} else {
			SRId.style.height = (numberOfRows * nPixelsPerRow) + "px";
		}
	}
	
	ShowElement("ExportButton");
	ShowElement("PrintButton");
	
	el = xmlDoc.getElementsByTagName("ResultEntry");
	tblHeaders = new Array();
	tblFields = new Array();
	tblHeaders[0] = "Name";
	tblFields[0] = "Name";
	tblHeaders[1] = "Suburb";
	tblFields[1] = "Suburb";
	tblHeaders[2] = "Treatment Types";
	tblFields[2] = "TreatmentTypes";

	LinkType = RESULT_LINKTYPE;

	if (bShowAll) {
		SRId.innerHTML = getHTMLTable(el, key, start, false);
	} else {
		SRId.innerHTML = getHTMLTable(el, key, start, true);
	}
	
	checkNext(start);	
	checkPrevious();
	
	return;
}

function showCount() {
	var el;
	var key = "State";
	var lbl = document.getElementById("countLabel");
	lbl.style.display = "block";
	lbl.innerHTML = "<strong>Count of:</strong> " + getFieldValue(document.forms['report'].elements['reportCounts'], 'radio');

	var SRId = document.getElementById("countResults");
	SRId.style.display="block"; 

//	el = xmlDoc.getElementsByTagName("ReportCount");
//	tblHeaders = new Array();
//	tblFields = new Array();
//	tblHeaders[0] = "State";
//	tblFields[0] = "State";
//	tblHeaders[1] = "Count";
//	tblFields[1] = "Count";

//	LinkType = COUNT_LINKTYPE;

//	SRId.innerHTML = getHTMLTable(el, key, 0, false);


	// Table rotated so building manually rather than calling getHTMLTable
	var table;
	var row;
	var column;
	
	el = xmlDoc.getElementsByTagName("ReportCount");
	var n_el = el.length;
	
	table = new Table();
	
	row = new Row("");
	column = new Column();
	column.setType(COLUMN_HEADER);
	column.addValue("State");
	row.addColumn(column);
	
	for (i = 0; i < n_el ; i++) {
		vVal = getValue(el, i, "State");
		
		column = new Column();
		column.setType(COLUMN_NORMAL);
		
		if (!bShowAll) {
			if (vVal == "Total") {
				column.addValue(tmpRESTRICT + tmpEND + vVal + tmpANCHOR);
			}
			else {
				column.addValue(tmpRESTRICT + vVal + tmpEND + vVal + tmpANCHOR);
			}
		}
		else {
			column.addValue(vVal);
		}
		
		row.addColumn(column);
	}
	
	table.addRow(row);
	
	row = new Row("");
	column = new Column();
	column.setType(COLUMN_HEADER);
	column.addValue("Count");
	row.addColumn(column);
	
	for (i = 0; i < n_el ; i++) {
		vVal = getValue(el, i, "Count");
		
		column = new Column();
		column.setType(COLUMN_NORMAL);
		column.addValue(vVal);
		row.addColumn(column);
	}
	
	table.addRow(row);
	
	SRId.innerHTML = table.getHTML();
	
	return;
}

function showAll() {
	bShowAll = true;
	buildSearchResults();
}

// ===================================================================================
// ------------ END OF SearchResults.js --------------------------------------------
// ===================================================================================


// ===================================================================================
// ---------------------------------- Start of SearchData.js -------------------------
// ---------------------------------- Created by Wisnu Prawoto -----------------------
// ===================================================================================

var fSearchData = 1000;
var KeywordType = "&TYPE=KEYWORD";
var ReportType = "&TYPE=REPORT";
var SEARCH_ACTION = 3000;
var REPORT_ACTION = 4000;
var userAction = 0;
var bReportCounts = false;
var RESULT_LINKTYPE = 1;
var COUNT_LINKTYPE = 2;
var LinkType = 0;
var bAllState = false;
var ExportQuery = "";
var PrintableCriteria = "";

function getAgentName(AgentName) {
	return mainPathName + "/" + AgentName + "?OpenAgent";
}

function callbackFunctions(fType) {
	if(fType == fSearchData) {
		checkSearchNoResult(); // Added this here to set MaxResults for the alert check
		if (MaxResults > LargeResultSetSize) alert("More than " + LargeResultSetSize + " results found, please refine your search.");
		bShowAll = false;
		buildSearchResults();
		
		// Keyword Search
		HideElement("flashmap");
		HideElement("searchblock");
		ShowElement("smallmap");
		ShowElement("statehotline");
		
		// Report
		HideElement("FieldsetCriteria");
		HideElement("FieldsetActions");
		
		if (userAction == SEARCH_ACTION) {
			var breadcrumbs = document.getElementById("breadcrumbs");
			breadcrumbs.innerHTML += " - Search Results";
		}
	}
}

function getXMLDataFromAgent(query) {
	var strUrl="";
	strUrl = getAgentName("SearchData") + query;
   	loadXMLDoc(strUrl, fSearchData, xmlReturn);
	ExportQuery = query;
	return;
}

function exportToExcel() {
	// if contentDocument exists, W3C compliant (Mozilla)
	if (document.getElementById("Export").contentDocument){
		dummydoc = document.getElementById("Export").contentDocument;
	} else {
		// IE
		dummydoc = document.frames["Export"].document;
	}
	dummydoc.forms[0].xmlDoc.value = xmlText;
	dummydoc.forms[0].Username.value = Username;
	dummydoc.forms[0].submit();
}

function replaceQuote(tmpStr, repChar) {
	while (tmpStr.indexOf('"') != -1) {
		tmpStr = tmpStr.replace('"',repChar);
	}
	return tmpStr;
}

function searchAll() {
	var state;
	
	clickedPrev = false;
	clickedNext = false;
	s_start = 0;
	
	HideTableButtons();	
	userAction = SEARCH_ACTION;

	var form = document.forms['search'];

	if (form.elements['searchState'] != null)
		state = form.elements['searchState'].value;
	else
		state = ""
	
	if (state == "") {
		var query = KeywordType + "&KEYWORDS=";	
	}
	else {
		var query = KeywordType + "&STATE=" + state + "&KEYWORDS=";	
	}

	getXMLDataFromAgent(query);
	return;
}

function searchKeyword() {
	var state;
	
	clickedPrev = false;
	clickedNext = false;
	s_start = 0;
	
	HideTableButtons();	
	userAction = SEARCH_ACTION;

	var form = document.forms['search'];

	if (form.elements['searchState'] != null)
		state = form.elements['searchState'].value;
	else
		state = ""
	
	if (state == "") {
		var query = KeywordType + "&KEYWORDS=";	
	}
	else {
		var query = KeywordType + "&STATE=" + state + "&KEYWORDS=";	
	}

	var keywords = trimBlanks (form.elements['searchString'].value, "+");

	if (keywords.indexOf('"') != -1) {
		keywords = replaceQuote(keywords, '%qt');
	}
	
	// Keywords not mandatory
//	if  (keywords == "") {
//		alert(MSG_NO_KEYWORD_TYPED);
//	 	return;
//	}
	
	query = query + keywords;
	getXMLDataFromAgent(query);
	return;
}

function searchReport() {

	clickedPrev = false;
	clickedNext = false;
	s_start = 0;
	restrictToState = "";
	
	HideTableButtons();	
	userAction = REPORT_ACTION;

	var x; // Stores the multivalue field elements during processing

	var form = document.forms['report'];

	var query = ReportType;
	PrintableCriteria = "";

	// --- State ---
	var state = getFieldValue(form.elements['searchState'], 'select');

	if (state != "" && state != "All" && state.substr(0,4) != "All,") {
		query = query + "&STATE=" + state;
		bAllState = false;
	}
	else {
		bAllState = true;
	}

	// --- Treatment Types ---
	var treatmentTypes = getFieldValue(form.elements['searchTreatmentTypes'], 'select');

	if (treatmentTypes != "" && treatmentTypes != "All" & treatmentTypes.substr(0,4) != "All,") {
		query = query + "&TREATMENTTYPES=" + treatmentTypes;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Treatment Types - " + treatmentTypes;
	}

	// --- Population Group ---
	var populationGroup = getFieldValue(form.elements['searchPopulationGroup'], 'select');

	if (populationGroup != "" && populationGroup != "All" & populationGroup.substr(0,4) != "All,") {
		query = query + "&POPULATIONGROUP=" + populationGroup;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Population Group - " + populationGroup;
	}

	// --- Sector of Service ---
	var sectorOfService = getFieldValue(form.elements['searchSectorOfService'], 'select');

	if (sectorOfService != "" && sectorOfService != "All" & sectorOfService.substr(0,4) != "All,") {
		query = query + "&SECTOROFSERVICE=" + sectorOfService;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Sector of Service - " + sectorOfService;
	}

	// --- Target Substance ---
	var targetSubstance = getFieldValue(form.elements['searchTargetSubstance'], 'select');

	if (targetSubstance != "" && targetSubstance != "All" && targetSubstance.substr(0,4) != "All,") {
		query = query + "&TARGETSUBSTANCE=" + targetSubstance;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Target Substance - " + targetSubstance;
	}

	// --- Funding Source ---
	var fundingSource = getFieldValue(form.elements['searchFundingSource'], 'select');

	// TEMPORARY
	if (fundingSource.indexOf("Department of Health and Ageing") >= 0) {
		alert("Department of Health and Ageing funded services will be available soon.");
	}
	
	if (fundingSource != "" && fundingSource != "All" && fundingSource.substr(0,4) != "All,") {
		query = query + "&FUNDINGSOURCE=" + fundingSource;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Funding Source - " + fundingSource;
	}

	// --- Other Services ---
	var otherServices = getFieldValue(form.elements['searchOtherServices'], 'select');

	if (otherServices != "" && otherServices != "All" && otherServices.substr(0,4) != "All,") {
		query = query + "&OTHERSERVICES=" + otherServices;
		if (PrintableCriteria != "") PrintableCriteria += "; ";
		PrintableCriteria += "Other Services - " + otherServices;
	}

	// --- Display Counts ---
	var reportCounts = getFieldValue(form.elements['reportCounts'], 'radio');

	if (reportCounts != "") {
		query = query + "&REPORTCOUNTS=" + reportCounts;
		bReportCounts = true;
	}
	else {
		bReportCounts = false;
	}

	getXMLDataFromAgent(query);
	return;
}

// ===================================================================================
// ----------------------------------END of SearchData.js -------------------------
// ===================================================================================
