//David Ells - 12.12.2006
//XmlRequester : object used for quick and dirty ajax calls.
//
//url (string) - URL of xml to retrieve
//asynch (boolean) - Perform request asynchronously
//callbackFunction (function) - Function to call when xml is retrieved.
//				Function signature must be function(xmlDoc), where xmlDoc
//				is an xml document object.
function XmlRequester (){
	//this.asynch = asynch;
	this.asynch = null;
	//this.callBack = callbackFunction;
	this.callBack = null;
	this.currentXml = false;
	this.done = false;
	this.http_req_obj = false;
	//this.url = url;
	this.url = null;
	
	//if(!callbackFunction){
		this.callBack = function() { alert('No callback set for XmlRequester object!'); };
	//}
	
	this.init = function(){
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			this.http_req_obj = new XMLHttpRequest();
			if (this.http_req_obj.overrideMimeType) {
				this.http_req_obj.overrideMimeType('text/xml');
			}
		} else if (window.ActiveXObject) { // IE
			try {
				this.http_req_obj = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
				this.http_req_obj = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
	
		if (!this.http_req_obj) {
			alert('Giving up :( Cannot create an XMLHTTP instance');
			return false;
		}
		
		var thisRef = this;  //For dealing with odd scoping rules in the assignment below.
		this.http_req_obj.onreadystatechange = function(){ thisRef.readyStateChange(thisRef); };
	};
	
	this.request = function(url, asynch, callbackFunction){
		this.done = false;
		this.callBack = callbackFunction;
		//this.http_req_obj.open('GET', this.url, this.asynch);
		this.http_req_obj.open('GET', url, asynch);
		this.http_req_obj.send(null);
	};
	
	this.readyStateChange = function(obj){
		//if (obj.http_req_obj.readyState == 1) {}
		if (obj.http_req_obj.readyState == 4) {
			if (obj.http_req_obj.status == 200) {
				obj.currentXml = obj.http_req_obj.responseXML;
				obj.callBack(obj.currentXml);
				obj.done = true;
			} else {
					alert('There was a problem with the request.');
			}
		}
	};
	
	this.init();
	//this.request();
}




//---------------------- rss functions ----------------------------

function getSimpleRssLinkHtml(rssXmlDoc){
	var html = '';
	var items = generateArrayFromRssXml(rssXmlDoc);
	
	for (var i = 0; i < items.length; i++){
			html += '<a href="'+items[i]['link']+'" >';
			html += items[i]['title']+'</a></br>\n';
			html += '<p>'+items[i]['description']+'</p>';
	}
	return html;
}

function generateArrayFromRssXml(rssXmlDoc){
	var XMLNodes = rssXmlDoc.getElementsByTagName('item');
	
	var XMLItems = new Array();
	for (var i = 0; i < XMLNodes.length; i++){
		 XMLItems[i] = new Array();
		 for (var k = 0; k < XMLNodes[i].childNodes.length; k++){
			  if(XMLNodes[i].childNodes[k].firstChild != null) {
			  	 var tagName = XMLNodes[i].childNodes[k].tagName;
				 var data = XMLNodes[i].childNodes[k].firstChild.data;
				 switch(tagName) {
					default: XMLItems[i][tagName] = data; break;
				 }
			  }
		 }
	}
	return XMLItems;
}

//-----------------------------------------------------------------



//---------------- page specific tabbing functions -----------------

function selectTab(tabName){
	var tabList = document.getElementById('innernav');
	if(tabList){
		var selectedLinkName;
		var tabLinks = tabList.getElementsByTagName('a');
		if(tabLinks){
			for(var i = 0; i < tabLinks.length; i++){
				if(tabLinks[i].name == tabName){
					tabLinks[i].className = 'overviewOn';
					selectedLinkName = tabLinks[i].name;
				} else {
					tabLinks[i].className = 'overview';
				}
			}
		}
		if(selectedLinkName){
			setTabbedContent(selectedLinkName);
		}
	}
}


function setTabbedContent(linkName){
	var selectedDivId;
	switch(linkName){
		case 'welcomeLink' : selectedDivId = 'welcomeDiv'; break;
		case 'missionLink' : selectedDivId = 'missionDiv'; break;
		case 'givingLink' : selectedDivId = 'givingDiv'; break;
		case 'newsLink' : selectedDivId = 'newsDiv'; break;
	}
	if(selectedDivId){
		var selectedDiv = document.getElementById(selectedDivId);
		if(selectedDiv){
			clearTabbedContent();
			
			//Dynamically set height of contentBody
			var contentBody = document.getElementById('tabbedContentBody');
			if(contentBody){
				var divHeight = getElementHeight(selectedDiv);
				contentBody.style.height = (Math.max(divHeight, 300) + 20) + "px";
			}	
			
			selectedDiv.style.visibility = "visible";
		}
	}
}


function clearTabbedContent(){
	var contentBody = document.getElementById('tabbedContentBody');
	if(contentBody){
		//var contentDivs = contentBody.childNodes;
		var contentDivs = contentBody.getElementsByTagName('div');
		for(var i = 0; i < contentDivs.length; i++){
			if(contentDivs[i].className == 'tabContentDiv'){
				contentDivs[i].style.visibility = "hidden";
			}
		}
	}
}

//--------------------------------------------------------------



//--------------- page specific html generators ----------------

function getMissionBioHtml(xmlBioDoc){
	var bioHtml = '';
	var bioItemArray = generateArrayFromRssXml(xmlBioDoc);
	
	for (var i = 0; i < bioItemArray.length; i++){
		bioHtml += '<a href="'+bioItemArray[i]['link']+'" >';
		bioHtml += bioItemArray[i]['title']+'</a></br>\n';
		bioHtml += '<p>'+bioItemArray[i]['description']+'</p>';
	}
	if(bioHtml != ''){
		bioHtml = '<h2>Missionary Biographies</h2>' + bioHtml;
	}
	
	return bioHtml;
}


function getProjectHtml(xmlProjectDoc){
	var html = '';
	var resultLimit = 5;
	var items = generateArrayFromRssXml(xmlProjectDoc);
	
	for (var i = 0; i < items.length && i < resultLimit; i++){
		html += '<a href="'+items[i]['link']+'" >';
		html += items[i]['title']+'</a></br>\n';
		html += '<p>'+items[i]['description']+'</p>';
	}
	if(resultLimit < items.length){
		html += '<a href="">More ADVANCE projects...</a><br/>';
	}
	if(html != ''){
		html = '<h2>ADVANCE Projects</h2>' + html;
	}
	return html;
}


function getUmnsNewsHtml(xmlNewsDoc){
	var html = '';
	var resultLimit = 5;
	var items = generateArrayFromRssXml(xmlNewsDoc);
	
	for (var i = 0; i < items.length && i < resultLimit; i++){
		html += '<a href="'+items[i]['link']+'" >';
		html += items[i]['title']+'</a></br>\n';
		html += '<p>'+items[i]['description']+'</p>';
	}
	//DVM 1/28/07 - Changed from United Methodist News Service Stories to Global Ministries Mission News
	//              and from United Methodist News Service to Global Ministries Mission News 
	//				and added url for hyperlink
	if(resultLimit < items.length){
		html += '<a href="http://new.gbgm-umc.org/news/">More Global Ministries Mission News...</a><br/>';
	}
	if(html != ''){
		html = '<h2>Global Ministries Mission News</h2>' + html;
	}
	//DVM 1/28/07 - replace smart quotes 
	//			  - didn't work - smart quotes were from GBGM feed
	//html = html.replace(/‘/g, "'");
	//html = html.replace(/’/g, "'");
	//html = html.replace(/“/g, "\"");
	//html = html.replace(/”/g, "\"");
	
	return html;
}

function getConferenceInfoHtml(xmlConferenceDoc){
	var html = '<h4>Contact Information</h4>';
	//temporary data
	
	var conferenceName = getSingleTagDataSafely(xmlConferenceDoc, "name");
	if(conferenceName){
		var email = getSingleTagDataSafely(xmlConferenceDoc, "email");
		var website = getSingleTagDataSafely(xmlConferenceDoc, "website");
		var street = getSingleTagDataSafely(xmlConferenceDoc, "street");
		var city = getSingleTagDataSafely(xmlConferenceDoc, "city");
		var state = getSingleTagDataSafely(xmlConferenceDoc, "state");
		var zip = getSingleTagDataSafely(xmlConferenceDoc, "zip");
		var country = getSingleTagDataSafely(xmlConferenceDoc, "country");
		var phone = getSingleTagDataSafely(xmlConferenceDoc, "phone");
		var fax = getSingleTagDataSafely(xmlConferenceDoc, "fax");
		
		html += '<b>' + conferenceName + '</b><br/>';
		if(street)
			html += street;
		if(city)
			html += '<br/>' + city; 
		if(state)
			html += ', ' + state;
		if(country)
			html += ', ' + country + '<br/>';

		if(phone) 
			html += 'Phone: ' + phone + '<br/>';
		if(fax) 
			html += 'Fax: ' + fax + '<br/>';
			
		html += '<br/>';
		
		if(website) 
			html += 'Website: <a href="'+website+'">' + website + '</a><br/>';
		if(email) 
			html += 'Contact Us: <a href="mailto:' + email + '">' + email + '</a><br/>';

	} else {
		html += '<br/>Contact information unavailable';
	}
	
	return html;
}

function getConferenceAddressString(xmlConferenceDoc){
	var addressStr = '';
	
	var street = getSingleTagDataSafely(xmlConferenceDoc, "street");
	var city = getSingleTagDataSafely(xmlConferenceDoc, "city");
	var state = getSingleTagDataSafely(xmlConferenceDoc, "state");
	var zip = getSingleTagDataSafely(xmlConferenceDoc, "zip");
	var country = getSingleTagDataSafely(xmlConferenceDoc, "country");
	
	if(street)  addressStr += street;
	if(city)    addressStr += ', ' + city;
	if(state)   addressStr += ', ' + state;
	if(zip)     addressStr += ', ' + zip;
	if(country) addressStr += ', ' + country;
	
	return addressStr;
}

function getConferenceAddressGeocode(xmlConferenceDoc){
    var latitude = getSingleTagDataSafely(xmlConferenceDoc, "latitude");
    var longitude = getSingleTagDataSafely(xmlConferenceDoc, "longitude");
    return new Array(latitude, longitude);
}

function getMapHtml(xmlContactDoc){
	var html = '';
	
	html += '<h4>Area Map</h4>';
	html += '<div id="googleMapDiv" name="googleMapDiv" style="height:350px; width:250px;"></div>';
	
	return html;
}

function getBishopLinksHtml(xmlConferenceDoc){
	var html = '';
	var bishopBio = getSingleTagDataSafely(xmlConferenceDoc, "bishopbio");
	var bishopPubs = getSingleTagDataSafely(xmlConferenceDoc, "bishoppubs");
	
	if(bishopBio || bishopPubs)
		html += '<br/>';
	if(bishopBio)
		html += '<a href="'+bishopBio+'">View Bishop\'s Biography</a><br/><br/>';
	if(bishopPubs)
		html += '<a href="'+bishopPubs+'">Read Bishop\'s Writings Online</a><br/>';
	
	return html;
}

function getBishopInfoHtml(xmlConferenceDoc){
	
	function validBishopImgUrl(url){
		var r = /p=.+/;
		return r.test(url);
	}
	
	var html = '';
	var conference = xmlConferenceDoc.getElementsByTagName("conference")[0];
	if(conference){
		var intro = getSingleTagDataSafely(xmlConferenceDoc, "intro");
		if(intro){
			html += "<p><b>" + intro + "</b></p>";
		}
		var bishopName = getSingleTagDataSafely(xmlConferenceDoc, "bishopname");
		var bishopImgUrl = getSingleTagDataSafely(xmlConferenceDoc, "bishopimgurl");
		var bishopMessage = getSingleTagDataSafely(xmlConferenceDoc, "bishopmessage");
		if(bishopMessage && bishopMessage != ''){
			html += '<h2>Bishop\'s Message</h2>';
			if(bishopImgUrl && validBishopImgUrl(bishopImgUrl)){
				html += '<table cellpadding="8"><tr><td style="position:relative;" width="140" height="240">';
				html += '<img src="' + bishopImgUrl + '" style="border:1px solid #000; position:relative; width:140px;" />';
				if(bishopName){
					html += '<p style="padding-top:4px"><b> Bishop ' + bishopName + '</b></p>';
				}
				html += '</td><td valign="top" width="250">';
				html += '<p>' + bishopMessage + '</p>';
				html += '</td></tr></table>';
			} else {
				html += '<p>' + bishopMessage + '</p>';
			}
		}
	}
	return html;
}

function getFacZipFormHtml(){
	html = '';
	
	html += '<h4>FIND A CHURCH NEAR YOU</h4>';
	html += '<input id="facZip" name="facZip" type="text" maxlength="10" size="10" value="Enter Zip" onFocus="clearField(this);" style="font-size:10px; width:105px; margin-right:2px; border:1px solid #CCC;"/>';
	//html += '<a style="cursor:pointer;" onClick="sendToFacZipResult()">GO</a>';
	html += '<a style="cursor:pointer;" onClick="sendToFacZipResult()">	<img src="http://www.umc.org/atf/cf/{DB6A45E4-C446-4248-82C8-E131B6424741}/button-go.gif" /></a>';

	//html += '<h4>Find A Church Near You</h4><form name="form" action="http://archives.umc.org/Directory/ChurchListing.asp"><input maxlength="9" size="10" value="Enter Zip" onFocus="clearField(this);" onBlur="getDefaultValue(this);" class="textbox" name="zipcode" /> <input type="image" src="http://www.umc.org/atf/cf/{DB6A45E4-C446-4248-82C8-E131B6424741}/button-go.gif" class="submitbutton"><input class="rb1" tabindex="12" type="hidden" value="Preferredname" name="Sort" /><input type="hidden" value="25" name="MaxRecords" /><input type="hidden" value="1" name="zipJs" /><input type="hidden" value="07" name="TypeID" /><input type="hidden" value="222" name="mid" /><input type="hidden" value=" " name="ReturnAll" /><input type="hidden" value="Forget" name="Remember" /></form>';

	return html;
}

//------------------------------------------------------------



//---------- page specific ajax calling functions ------------

function ajaxFillWithMissionBio(div, xmlFeed){	
	function asynchFillBio(xmlDoc){
		div.innerHTML = getMissionBioHtml(xmlDoc);
	}
	if(div && xmlFeed){
		globalXmlRequester.request(xmlFeed, true, asynchFillBio);
	}
}

function ajaxFillWithProjects(div, xmlFeed){	
	function asynchFillProjects(xmlDoc){
		div.innerHTML = getProjectHtml(xmlDoc);
	}	
	if(div && xmlFeed){
		globalXmlRequester.request(xmlFeed, true, asynchFillProjects);
	}
}

function ajaxFillWithUmnsNews(div, xmlFeed){
	function asynchFillNews(xmlDoc){
		div.innerHTML = getUmnsNewsHtml(xmlDoc);
	}
	if(div && xmlFeed){
		globalXmlRequester.request(xmlFeed, true, asynchFillNews);
	}
}

function ajaxFillContactInfoAndMap(xmlFeed){
	function asynchFillAllContactInfo(xmlDoc){
		var welcomeDiv = document.getElementById('welcomeDiv');
		welcomeDiv.innerHTML = getBishopInfoHtml(xmlDoc);
		
		var contactInfoDiv = document.getElementById('contactInfoDiv');
		contactInfoDiv.innerHTML = getConferenceInfoHtml(xmlDoc);
		
		var bishopLinksDiv = document.getElementById('bishopLinksDiv');
		bishopLinksDiv.innerHTML = getBishopLinksHtml(xmlDoc);
		
		var areaMapDiv = document.getElementById('areaMapDiv');
		areaMapDiv.innerHTML = getMapHtml(xmlDoc);
		
		var googleMapDiv = document.getElementById('googleMapDiv');
		//fillGoogleMapDiv('810 12th Avenue South, Nashville, TN, 37221', googleMapDiv);
		fillGoogleMapDiv(getConferenceAddressString(xmlDoc),
                         getConferenceAddressGeocode(xmlDoc),
                         googleMapDiv);
		
		selectTab('welcomeLink');
	}

	if(xmlFeed){
		globalXmlRequester.request(xmlFeed, true, asynchFillAllContactInfo);
	}

}

	
function fillGoogleMapDiv(address, geocodeArray, div) {
	var map = new GMap2(div);
	var geocoder = new GClientGeocoder();
	var areaMapDiv = document.getElementById('areaMapDiv');

    var latitude = geocodeArray[0];
    var longitude = geocodeArray[1];

    //alert("lat = " + latitude + ", long = " + longitude);
    if(latitude && longitude){
        setmap(new GLatLng(latitude, longitude));
    } else {
	    geocoder.getLatLng(
	    	address,
            setmap
	    );
    }
    
    function setmap (point) {
		if (!point) {
			areaMapDiv.innerHTML = "";
		} else {
			map.setCenter(point, 10);
			var marker = new GMarker(point);
			map.addOverlay(marker);
			marker.openInfoWindowHtml(address);
			map.addControl(new GSmallMapControl());
			//map.addControl(new GScaleControl());
        }
    }
        
}
//---------------------------------------------------------------


//------------------ umcom misc. funcs ---------------
//DVM 1/28/07 - replaced karchives with archives
function sendToFacZipResult(){
	var facZip = document.getElementById('facZip');
	var zip = facZip.value;
	var r = /^\d{5}(-\d{4})?$/;
	if(r.test(zip)){
		var resultUrl = "http://archives.umc.org/Directory/ChurchListing.asp?address=Street+or+address&City=City&StateLong=&State=&zipcode="
		resultUrl += zip + "&distance=Any&MaxRecords=25&Sort=Preferredname&findbutton.x=49&findbutton.y=7&findbutton=Find+Church&TypeID=07&mid=222&ReturnAll=&Remember=Forget&fromSrch=byloc";
		window.location = resultUrl;
	} else {
		alert("Zip must be in valid format.");
	}
}
//----------------------------------------------------


//------------------ utilities -----------------------

function addLoadListener(fn)
{
	if (typeof window.addEventListener != 'undefined'){	
		window.addEventListener('load', fn, false);
	}
 	else if (typeof document.addEventListener != 'undefined'){
	   	document.addEventListener('load', fn, false);
	}
 	else if (typeof window.attachEvent != 'undefined'){
	   	window.attachEvent('onload', fn);
 	} else {
		var oldfn = window.onload;
		if (typeof window.onload != 'function'){
			window.onload = fn;
		} else {
			window.onload = function(){
				oldfn();
				fn();
			};
		}
	}
}

// From "Javascript and DHTML Cookbook" by Danny Goodman 
// (Published by O'Reilly)
//
// Retrieve the rendered height of an element
function getElementHeight(elem) {
    var result = 0;
    if (elem.offsetHeight) {
        result = elem.offsetHeight;
    } else if (elem.clip && elem.clip.height) {
        result = elem.clip.height;
    } else if (elem.style && elem.style.pixelHeight) {
        result = elem.style.pixelHeight;
    }
    return parseInt(result);
}

function getSingleTagDataSafely(xml, tagName){
	var elem = xml.getElementsByTagName(tagName)[0];
	if(elem && elem.firstChild && elem.firstChild.data){
		return elem.firstChild.data;
	}
	else return null;
}

function debug(str) { 
	if(document.getElementById('debugger') == null){
		alert('debugger null?');
		var s = document.createElement('span');
		s.style.display = 'none';
		s.id = 'debugger';
		var b = document.getElementsByTagName('body')[0];
		b.appendChild(s);
	} else {
		var s = document.getElementById('debugger');
	}	
	s.innerHTML += str+'<br/>';
}

function isNetscape(){
	return (navigator.appName.indexOf('Netscape') > -1);
}

function enableUniversalBrowserRead(){
	try {
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	} catch (e) {
		alert("Permission UniversalBrowserRead denied.");
	}
}

//------------------------------------------------------


function test(){	
	debug("Debugging online...");
}


function initPage(){
	//if(isNetscape()){
	//	enableUniversalBrowserRead();
	//}
	
	var rightSideTable = document.getElementById('rightSideItems');
	rightSideTable.style.width = "250px";
	
	var welcomeDiv = document.getElementById('welcomeDiv');
		//var welcomeXmlFeed = "http://master.umc.org/rss/UMCSingleConferenceXML.asp?confid=12";
		var welcomeXmlFeed = welcomeDiv.getAttribute('xmlfeed');
	
	var missionBioDiv = document.getElementById('missionBioDiv');
		var missionBioXmlFeed = missionBioDiv.getAttribute('xmlfeed');
		
	//Volunteer ops will be hardcoded in the page
	//var volunteerDiv = document.getElementById('volunteerDiv');
	//	var volunteerXmlFeed = volunteerDiv.getAttribute('xmlfeed');
			
	var projectsDiv = document.getElementById('projectsDiv');
		var projectsXmlFeed = projectsDiv.getAttribute('xmlfeed');

	var umnsNewsDiv = document.getElementById('umnsNewsDiv');
		var umnsNewsXmlFeed = umnsNewsDiv.getAttribute('xmlfeed');
	
	
	

	
	var facDiv = document.getElementById('facDiv');
	facDiv.innerHTML = getFacZipFormHtml();
	
	//This points to a page that "proxies" xml requests, to get around
	//the security issues of XmlHttpRequests to other domains...
	//var proxyPageString = "http://dev.umc.org/xslTrans/getPage.aspx?url=";
	var proxyPageString = "http://www.umc.org/site/apps/rss/getpage.aspx?url=";
	
	
	//Go ajax crazy
	//DVM 1/28/07 - added encodeURI because Kintera proxy page was stripping/converting ? and &
	addToAjaxQueue(function(){ajaxFillContactInfoAndMap(proxyPageString + welcomeXmlFeed.replace(/&/g,"%26"));});
	//addToAjaxQueue(function(){selectTab('welcomeLink');});	
	addToAjaxQueue(function(){ajaxFillWithMissionBio(missionBioDiv, proxyPageString + missionBioXmlFeed.replace(/&/g,"%26"));});
	//addToAjaxQueue(function(){ajaxFillWithProjects(volunteerDiv, proxyPageString + volunteerXmlFeed);});
	addToAjaxQueue(function(){ajaxFillWithProjects(projectsDiv, proxyPageString + projectsXmlFeed.replace(/&/g,"%26"));});
	addToAjaxQueue(function(){ajaxFillWithUmnsNews(umnsNewsDiv, proxyPageString + umnsNewsXmlFeed.replace(/&/g,"%26"));});
	
	callNextInAjaxQueue();
	
	
}

var globalXmlRequester = new XmlRequester();
var ajaxQueue = new Array();
var ajaxQueueIndex = 0;

function addToAjaxQueue(func){
	ajaxQueue[ajaxQueue.length] = func;
}

function callNextInAjaxQueue(){
	//alert(ajaxQueueIndex + " : " + globalXmlRequester.done);
	if(ajaxQueueIndex < ajaxQueue.length){
		if(globalXmlRequester.done || ajaxQueueIndex == 0){
			globalXmlRequester = new XmlRequester();
			ajaxQueue[ajaxQueueIndex++]();
		}
		window.setTimeout('callNextInAjaxQueue()', 500);
	}
	
}

addLoadListener(initPage);
