// -------
// GLOBALS
// -------
var travelguideurl1 = '/consumer/travelguide.aspx';
var travelguideurl2 = '/consumer/travelguide.aspx?summary=1&';

// ----------
// INITIALIZE
// ----------
function initialize() {
	if ( (browser.isMac && browser.isIE) || (browser.isSafari && (browser.isSafari2 == false)) ) {
		// IE Mac or not Safari 2
		incompatible();
	} else {
		ajaxRequest(travelguideurl1,itemProcessReqChange,1);
	}
}

// ----
// AJAX
// ----
function ajaxRequest(url,func,targetLevel) {
	reqObj = false;
	
	if (window.XMLHttpRequest) {
		// Mozilla, Safari, IE7, etc.
		var reqObj = new XMLHttpRequest();
		
	} else if (window.ActiveXObject) {
		// IE < 7
		
		var aXmlHttpVersions = ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
		for (var i = 0; i < aXmlHttpVersions.length; i++) {
			try {
				reqObj = new ActiveXObject(aXmlHttpVersions[i]);
				if (reqObj) {
					break;
				}
			}
			catch (objException) {
				// Catch object exception errors so they don't display to the user...
			}
		}
	}
		
	if (reqObj) {
		if (func) {
			reqObj.onreadystatechange = function() { func(reqObj,targetLevel); }
		}
		reqObj.open("GET", url, true);
		reqObj.send(null);	
	}
	
	return reqObj;
}

// --------------
// AJAX CALLBACKS
// --------------
function itemProcessReqChange(reqObj,targetLevel) {

	if (reqObj.readyState == 4) {
		if (reqObj.status == 200 || window.location.href.indexOf("http") == -1) {
			buildItemList(reqObj,targetLevel);
		} else {
			alert("There was a problem retrieving the XML data:\n" + reqObj.statusText);
		}
	}
	document.body.style.cursor = 'default';
	return true;
}

function destinationProcessReqChange(reqObj,targetLevel) {
	
	if (reqObj.readyState == 4) {
		if (reqObj.status == 200 || window.location.href.indexOf("http") == -1) {
			var column = document.getElementById("destination");
			var str = reqObj.responseText;
			column.innerHTML = str;
		} else {
			alert("There was a problem retrieving the XML data:\n" + reqObj.statusText);
		}
	}
	document.body.style.cursor = 'default';
	return true;
}

// ------------
// CLICK EVENTS
// ------------
function itemLoad(xmlFile, a, targetLevel) {
	var categoriesnew = document.getElementById('categoriesnew');
	// categoriesnew.scrollLeft = (targetLevel-3) * 194;
	doScrollDiv(categoriesnew,categoriesnew.scrollLeft,(targetLevel-3) * 194,10,35);
		
	// Clear hilights in target level...
	clearOvers(document.getElementById('level-'+(targetLevel-1)));
	for (var i=(targetLevel-1); i>=1; i--) 
	{
        convertOverToOpen(document.getElementById('level-'+i));
	}
	
	currentItem = a;
	currentItem.className = "hi";
	document.body.style.cursor = 'wait';
	ajaxRequest(xmlFile,itemProcessReqChange,targetLevel);
}

function destinationLoad(xmlFile, a, targetLevel) {
	// var categoriesnew = document.getElementById('categoriesnew');
	// categoriesnew.scrollLeft = (targetLevel-3) * 194;
	
	// Clear hilights in target level...
	clearOvers(document.getElementById('level-'+(targetLevel-1)));
	for (var i=(targetLevel-1); i>=1; i--) {
		convertOverToOpen(document.getElementById('level-'+i));
	}
	
	currentItem = a;
	currentItem.className = "hi";
	document.body.style.cursor = 'wait';
	
	ajaxRequest(xmlFile,destinationProcessReqChange,targetLevel);
}

// ------------
// CONSTRUCTORS
// ------------
function buildItemList(reqObj,targetLevel) {

	// Clear target list
	var ul = document.getElementById("level-"+targetLevel).getElementsByTagName('ul')[0];	
	clearList(ul);
	
	// Clear lists beyond tagget
	for (var i=targetLevel+1; i<=9; i++) {
		var ul2 = document.getElementById("level-"+i).getElementsByTagName('ul')[0];
		clearList(ul2);
	}
	
	// Build HTML
	var categories = reqObj.responseXML.getElementsByTagName("item");
	for (var i = 0; i < categories.length; i++) {
		var title = getElementTextNS("","title",categories[i],0);
		var count = getElementTextNS("","count",categories[i],0);
		var link = getElementTextNS("", "link", categories[i],0);
		var hasSubCategories = getElementTextNS("", "subcategorycount", categories[i],0);
		if (hasSubCategories > 0)
		{
		    hasSubCategories = true;
		}
		else
		{
		    hasSubCategories = false;
		}
		var isCategory = true;
		var content = '';
		if (targetLevel == 1) {
		    isCategory = true;
			content = document.createTextNode(title);
		} else if (count == null || count == '' || count == 0) {
			isCategory = false;
			content = document.createTextNode(title);
		} else {
			content = document.createTextNode("All " + title + " ("+count+")");
		}
		
		if (link.indexOf("http") == -1) {
			// This is a relative URL
			var target = travelguideurl2 + link;
			if (isCategory == true){
			    target = target + "&psize=999";
			}
		} else {
			var target = link;
		}
		
		
		appendToList(ul, content, target, targetLevel+1, isCategory, hasSubCategories);
	}
	
	// Set 'Select Category' Message
	selecta('Select Category','level-'+(targetLevel+1));
}

function appendToList(list, content, target, targetLevel, isCategory, hasSubCategories) {
	// Create list item HTML
	
	// <li class="destination"><a href='javascript:void(0);' onclick='itemLoad(target,a,targetLevel);'>content</a></li>
	
	var li = document.createElement("li");
	if (isCategory==false) {
		li.setAttribute('class','destination');
		li.className = 'destination';
	}
	var a = document.createElement("a");
	a.setAttribute('href','javascript:void(0);');
	a.href = 'javascript:void(0);';
	
	a.appendChild(content);
	li.appendChild(a);
	
	if (isCategory == true) {
	    if (hasSubCategories)
	    {
		    addEventToObject(a, 'onclick', function() { itemLoad(target,a,targetLevel); } );
		}
		else
		{
		    var category = target.substring(target.indexOf("category="), target.indexOf("&", target.indexOf("category=")) );
		    if (resultURL != null)
		    {
		        addEventToObject(a, 'onclick', function() { window.location = resultURL + "?" + category; } );
		    }
		    else
		    {
		        addEventToObject(a, 'onclick', function() { window.location = "/searchresults.aspx?" + category; } );
		    }
		}
	} else {
		addEventToObject(a, 'onclick', function() { destinationLoad(target,a,targetLevel); } );
	}
		
	list.appendChild(li);
}

function addEventToObject(obj, evt, func) {
	var oldhandler = obj[evt];
	obj[evt] = (typeof obj[evt] != 'function') ? func : function(){oldhandler();func();};
}

// ----
// HTML
// ----
function selecta(str,col) {
	str = str.split(' ');
	var str1 = document.createTextNode(str[0]);
	var str2 = document.createTextNode(str[1]);
	var br = document.createElement('br');
	var li = document.createElement('li');
	li.id = "selecta";
	li.appendChild(str1);
	li.appendChild(br);
	li.appendChild(str2);
	var ul = document.getElementById(col).getElementsByTagName('ul')[0];
	
	clearList(ul);
	
	ul.appendChild(li);
}

// DESTRUCTORS
function clearList(target) {
   	while (target.childNodes.length > 0) {
   		target.removeChild(target.childNodes[target.childNodes.length - 1]);
   	}
}

function clearOvers(target) {
	target = target.getElementsByTagName('a');
	for (var i=0;i<target.length;i++) {
		target[i].className="";
	}
}

function convertOverToOpen(target) {
	target = target.getElementsByTagName('a');
	for (var i=0;i<target.length;i++) {
		if (target[i].className=="hi") {
			target[i].className="open";
		}
	}
}

// ----
// MISC
// ----
function incompatible() {
	
	var div = document.getElementById('categoriesnew');
	div.parentNode.removeChild(div);
	
	var wbh2 = document.getElementById('wbh2');
	wbh2.parentNode.removeChild(wbh2);
}

// ---------
// ANIMATION
// ---------
function easeInOut (t, b, c, d) {
	// t = time
	// d = duration
	// c = change
	// b = begin
	if ((t/=d/2) < 1) {
		return c/2 * t * t + b;
	} else {
		return -c/2 * ((--t)*(t-2) - 1) + b;
	}
}

function doScrollDiv(elem,startLeft,endLeft,steps,intervals) {
	if (elem.leftChangeMemInt) {
		window.clearInterval(elem.leftChangeMemInt);
	}
	var actStep = 0;
	elem.leftChangeMemInt = window.setInterval(
		function() {
			elem.currentLeft = easeInOut(actStep,startLeft,endLeft-startLeft,steps);
			elem.scrollLeft = elem.currentLeft;
			actStep++;
			if (actStep > steps) {
				window.clearInterval(elem.leftChangeMemInt);
			}
			} 
			,intervals)
}
