
	dojo.require('dojo.xml.Parse');
	
	function RegionMenu(mode, showUserRegions) {

		this.mode = mode; // content, header, manage
		this.selected; // index of which menu item is currently selected
		this.resultsMode; // userRegions or regionList
		this.showUserRegions = showUserRegions;
		this.regions = new Array();

		this.menuInput = getElement('regionMenuInput_'+this.mode);
		this.resultsDiv = getElement('regionMenuResults_'+this.mode);
		this.containerDiv = getElement('regionMenuContainer_'+this.mode);
		this.menuButton = getElement('regionMenuButton_'+this.mode);


		this.listen = function() {
			dojo.event.connect(this.menuInput, 'onkeydown', this, 'doEnter');
			dojo.event.connect(this.menuInput, 'onkeyup', this, 'doKeyEvent');
			dojo.event.connect(this.menuInput, 'onblur', 'resetKillForm');
			if(this.menuButton) {
				dojo.event.connect(this.menuButton, 'onclick', this, 'doUserRegions');
			}
		};

		this.doKeyEvent = function(evt) {
			if(this.isNavKey(evt)) {
				this.doNavKeys(evt);
			} else if(this.menuInput.value.trim().length < 3) {
				this.regions = new Array(0);
				this.showMenu();
			} else {
				var thisMenu = this;
				dojo.io.bind({
					mimetype: 'text/xml',
					url: '/_login/proxy?path='+encodeURIComponent('/servista/match?s='+encodeURIComponent(thisMenu.menuInput.value.trim())),
					handle: function(type, data, evt) {
						if(type == 'error') {
							// alert('An error has occurred. Please try again.');
						} else if(type == 'load') {
							var numResults = thisMenu.loadData(data);
							if(numResults == 0) {
								thisMenu.showMenu(true); // true == no results
							} else {
								thisMenu.showMenu();
							}
						}
					}
				});		
			}
		}


		this.doEnter = function(evt) {
			if(evt.keyCode == 13) {
				var items = this.resultsDiv.getElementsByTagName('LI');
				if(this.mode == 'header') {
					if(items && items.length > 0) {
						location.href = items[this.selected].getElementsByTagName('A')[0].href;
					}
				} else if(this.mode == 'manage' && items.length > 0) {
					if(!this.selected) this.selected = 0;
					doAddRegion(items[this.selected].id.replace('regionMenuMangeId_', ''));
					getElement('regionMenuContainer_'+mode).style.display = 'none';
					clearRegionMenu(this.menuInput.id,this.resultsDiv.id);
				} else if(this.mode == 'content') {
					if(this.menuInput.value.trim().length == 0) {
						resetKillForm();
					} else {
						killForm = true;
						if(items && items.length > 0) {
							addRegionToContent(this.mode, items[this.selected]);
						}
					}
				}
			}
		}


		this.isNavKey = function(evt) {
			// return key, page up/down, end/home, arrow keys
			if(evt.keyCode == 13 || (evt.keyCode >= 33 && evt.keyCode <= 40)) {
				return true;
			} else {
				return false;
			}
		}


		this.doNavKeys = function(evt) {
			if(!keyEventInAction) { // safari hack
				if(evt.keyCode == 38) { // ARROW UP
					this.moveSelection('up');
				} else if(evt.keyCode == 40) { // ARROW DOWN
					this.moveSelection('down');
				} else if(evt.keyCode == 13) { // RETURN
					this.doEnter(evt);
				} else {
					// DO NOTHING FOR NOW
					// page_up = 33; page_down = 34; end = 35; home = 36; left = 37; right = 39;
				}
				keyEventInAction = true;
				setTimeout("restartKeyEvent();", 1);
			}
		}

		
		this.moveSelection = function(direction) {
			var items = this.resultsDiv.getElementsByTagName('LI');
			if(direction == 0 && items.length > 0) {
				this.selected = 0;
			} else if(direction == 'down' && this.selected < items.length-1) {
				items[this.selected].className = '';
				this.selected++;
			} else if(direction == 'up' && this.selected > 0 && items.length >= this.selected) {
				items[this.selected].className = '';
				this.selected--;
			}

			var item = items[this.selected];
			if(item) {
				item.className = 'selected';
				if(this.selected > 0) {
					item.scrollIntoView(false);
				}
			}
		}

	
		this.loadData = function(data) {
			this.regions = new Array(0);
			var parser = new dojo.xml.Parse();
			var result = parser.parseElement(data.getElementsByTagName('Result')[0]);
			if(result && result.region && result.region.length > 0) {
				for(var i=0; i < result.region.length; i++) {
					this.regions.push(new Region(result.region[i]));
				}
			}
			return this.regions.length;
		}

	
		this.doUserRegions = function(evt) {
			if(this.resultsDiv.innerHTML && this.resultsMode == 'userRegions') {
				this.resultsDiv.innerHTML = '';
				this.containerDiv.style.display = 'none';
				this.selected = null;
			} else {
				this.resultsMode = 'userRegions';
				var thisMenu = this;
				dojo.io.bind({
					mimetype: 'text/plain',
					url: '/_wine/user/showRegions?mode='+this.mode,
					handle: function(type, data, evt) {
						if(type == 'error') {
							// alert('An error has occurred. Please try again.');
						} else if(type == 'load' && data) {
							thisMenu.resultsDiv.innerHTML = '<ul>'+data+'</ul>';
							thisMenu.containerDiv.style.display = 'block';
							thisMenu.moveSelection(0);
							thisMenu.menuInput.focus();							
						}
					}
				});
			}
		}


		this.showMenu = function(noResults) {
			this.resultsMode = 'regionList';
			var iHTML = '';
			for(var i=0; i < this.regions.length; i++) {
				if(this.mode == 'manage') {
					iHTML += this.regions[i].manage(this);
				} else if(this.mode == 'header') {
					iHTML += this.regions[i].header(this);
				} else if(this.mode == 'content') {
					iHTML += this.regions[i].content(this);
				}
			}
			if(iHTML) {
				iHTML = '<ul>'+iHTML+'</ul>';
				this.containerDiv.style.display = 'block';
			} else if(noResults) {
				iHTML = 'No results were found.';
				this.containerDiv.style.display = 'block';
				this.selected = null;
			} else {
				this.containerDiv.style.display = 'none';
				this.selected = null;
			}
	
			this.resultsDiv.innerHTML = iHTML;
			if(!this.selected) {
				this.moveSelection(0);
			}
		}


		// START LISTENING FOR REGION MENU INPUT/ClICKS
		this.listen();
	}
	
	
	function Region(node) {
		this.id = node.id[0].value.trim();
		this.domainName = node.domainname[0].value.trim();
		this.url = 'http://'+this.domainName+'.newsvine.com';
		this.displayName = node.regiondisplay[0].value.trim();
		if(node.states[0].value) this.displayName += ', ' + node.states[0].value.trim();
		if(node.parent[0].value) this.displayName += ', ' + node.parent[0].value.trim();
		
		this.LI = function() {
			var html = '<li><em>'+this.displayName+'</em></li>';
			return html;
		}
	
		this.manage = function(regionMenu) {
			//return '<li><span><a href="javascript:void(0);doAddRegion('+this.id+');clearRegionMenu(\''+regionMenu.menuInput.id+'\',\''+regionMenu.resultsDiv.id+'\');" class="noborder" style="float: left"><img src="http://www.newsvine.com/_vine/images/_/b_plus.gif" width="19" height="17" alt="Add Region" /></a></span> <a href="'+this.url+'" class="noborder">'+this.displayName+'</a></li>';
			return '<li id="regionMenuMangeId_'+this.id+'"><a href="'+this.url+'" class="noborder"><img src="http://www.newsvine.com/_vine/images/_/b_plus.gif" width="19" height="17" alt="Add Region" title="Add Region" style="float: left; margin: 0 5px 5px 0; z-index: 1000" onclick="void(0);doAddRegion('+this.id+');clearRegionMenu(\''+regionMenu.menuInput.id+'\',\''+regionMenu.resultsDiv.id+'\'); return false" />'+this.displayName+'</a></li>';
		}
	
		this.header = function(regionMenu) {
			return '<li><a href="'+this.url+'">'+this.displayName+'</a></li>';
		}
	
		this.content = function(regionMenu) {
			return '<li id="addRegionToContent_'+this.id+'"><a href="javascript:void(0);" onclick="addRegionToContent(\''+regionMenu.mode+'\', this.parentNode);">'+this.displayName+'</a></li>';
		}
	
	}
		

	// this is needed for lameass safari/dojo onkeyup bug with arrow keys
	// yes, a better solution probably exists
	var keyEventInAction = false;
	function restartKeyEvent() {
		keyEventInAction = false;
	}

	function resetKillForm() {
		killForm = false;
	}


/*******************************************************************************
ADD / REMOVE USER REGIONS
*******************************************************************************/

function doAddRegion(regionId) {
	if(getElement('regionMenuContainer_manage').style.display == 'block') {
		getElement('regionMenuContainer_manage').style.display = 'none';
	}
	if(getElement('userRegion_'+regionId)) {
		alert('This region has already been added to your region list.');
		return false;
	}
	var removeLinkUser = '<a href="javascript:void(doRemoveRegion('+regionId+'));" class="noborder"><img src="http://www.newsvine.com/_vine/images/_/b_minus.gif" width="19" height="17" alt="Remove Region" /></a>';
	var removeLinkList = '<img src="http://www.newsvine.com/_vine/images/_/check_white.gif" width="19" height="17" alt="Remove Region" />';
	var iHTML = 'An error has occurred.';
	var items = getElement('region_'+regionId).parentNode.getElementsByTagName('A');
	if(items.length > 1) iHTML = '<a href="'+items[1].href+'">'+items[1].innerHTML+'</a>';
	getElement('region_'+regionId).innerHTML = removeLinkList;
	var newLI = document.createElement('LI');
	newLI.id = 'userRegion_'+regionId;
	newLI.innerHTML = removeLinkUser+' '+iHTML;
	getElement('userRegionList').appendChild(newLI);
	doAjax('/_action/user/addUserRegion?regionId='+regionId);
}

function doRemoveRegion(regionId) {
	getElement('region_'+regionId).innerHTML = '<a href="javascript:void(doAddRegion('+regionId+'));" class="noborder"><img src="http://www.newsvine.com/_vine/images/_/b_plus.gif" width="19" height="17" alt="Add Region" /></a>';
	getElement('userRegion_'+regionId).parentNode.removeChild(getElement('userRegion_'+regionId));
	doAjax('/_action/user/removeUserRegion?regionId='+regionId);
}

function clearRegionMenu(menuId, divId) {
	getElement(menuId).value = '';
	getElement(divId).innerHTML = '';
	getElement(menuId).focus();
}



/*******************************************************************************
ADD / REMOVE REGIONS TO CONTENT
*******************************************************************************/

function addRegionToContent(mode, item) {

	// SET THE SELECTED REGION
	selRegion = getElement('regionMenuInput_'+mode).parentNode.getElementsByTagName('SPAN')[0];
	selRegion.innerHTML = item.getElementsByTagName('A')[0].innerHTML+' <a href="javascript:void(0);" onclick="removeRegionFromContent(this);" class="noborder"><img src="http://www.newsvine.com/_vine/images/_/icon_trash_mini.gif" width="11" height="11" title="Remove" alt="Remove" style="vertical-align: middle; margin-bottom: 2px" /></a>';
	getElement('saveRegion').value = item.id.replace('addRegionToContent_', '');

	// CLEAR THE REGION MENU
	getElement('regionMenuContainer_'+mode).style.display = 'none';
	clearRegionMenu('regionMenuInput_'+mode, 'regionMenuResults_'+mode);

}

function removeRegionFromContent(thisItem) {
	thisItem.parentNode.innerHTML = '';
	getElement('saveRegion').value = 1;
}

