/** Copyright (C) 2010 Bob Rose */
function MapCreate () {
  var m_geocoder;    // handle to Google geocoder
	var m_geocodeCache; // handle addr conversion
  var m_baseIcon;    // base icon to derive custom icons from
    
  var m_searchControl; // Google maps ajax search
  var m_localSearch;   // Local search 
    
    var m_adminDialog; // Admin
    var m_loadDialog;  // Load maps    
    var m_loginDialog; // Login
    var m_resetPwDialog; // Reset pw
    var m_registerDialog; // Regiser
    var m_accountDialog; // Account    
    var m_addressDialog; // Address dialog
    var m_layerDialog;   // Layer dialog
    var m_helpDialog;    // Help
    var m_aboutDialog;   // About
    var m_embedDialog;   // Embed this map
    
    var m_userName;
    var m_userId;
        
    var m_userRoles;     // Roles the user is associated with
    //var m_numPublished= 0; // Number of published maps    
    //var m_numMine   = 0; // number of my maps
	
    var m_ignoreOnChange = false; // Flag to ignore select state change, if we do it ourselves
    
    
    // Track down and stash a pointer to some key DOM elements/dojo widgets
    var m_userInfo;
    var m_mapStats;    
    var m_mapName;    
    var m_mapTags;        
    var m_mapDescription;    
    var m_mapShared;        
	var m_mapPrivate;
	var m_mapPublished;
    var m_mapAddress;
    var m_mapTitle;    
    var m_mapNote;
    var m_mapTable;
    var m_mapAddressUrl;
    var m_mapAddressUrlTitle;    
    var m_layerUrl;    
    var m_layerTitle;    
    var m_layerNote;            
    var m_userTable;    
    var m_allMapsTable;        
	var m_mapInfo = null;
    var m_mineCheck;
    var m_publishedCheck;        
    
    
    var m_resources;
    
    var m_addressList; // HTML Address Table
    
    var m_saveOnLogin;
    
    var m_viewMapId = null;
    var m_isReadOnly = false;  
    
	var INDICATOR = "<img align='absbottom' src='images/indicator.gif' width='12' height='12' border='0'>";	      
    var URL_START = "http://maptrot.com";
    var MAP_VIEW  = "/mapView.jsp";      
	  
    var m_editingAddress = "";    

	var  m_editingLayer = -1;    
	
	var m_thisCreator = this;
	
	var m_mapView = null;
	
	
	this.windowInit = function () {
	  m_mapView = new MapView();	  
	  m_mapView.windowInit();		
	  init();
	}

	this.windowResize = function () {
		m_mapView.windowResize();
	}
	
	
    var init = function () {

        var djConfig = {isDebug: true /*, debugAtAllCosts: true*/ };

      m_resources = new MaptrotResources();
      
      document.title = m_resources.TITLE;
      
     
      // Get the map DOM elements
      m_userInfo       = dojo.byId("userInfo");
      m_mapStats       = dojo.byId("mapStats");      
	  m_mapName        = document.getElementById("mapName");	      
	  m_mapTags        = document.getElementById("mapTags");	      	  
      m_mapDescription = dojo.byId("mapDescription");    
      m_mapShared      = dojo.byId("mapShared");            
      m_mapPrivate     = dojo.byId("mapPrivate");            
      m_mapPublished   = dojo.byId("mapPublished");                        
      m_mapAddress     = dojo.byId("address");
      m_mapTitle       = dojo.byId("addressTitle");            
      m_mapNote        = dojo.byId("addressNote");      
      m_mapAddressUrl      = dojo.byId("addressUrl");                  
      m_mapAddressUrlTitle = dojo.byId("addressUrlTitle");                        
      m_layerUrl           = dojo.byId("layerUrl");
      m_layerTitle         = dojo.byId("layerTitle");
      m_layerNote          = dojo.byId("layerNote");   
      
	  m_mineCheck          = dojo.byId("mineCheck");
      m_publishedCheck        = dojo.byId ("publishedCheck");      
      
      
      m_userName       = "";
      m_userId         = 0;
      m_userRole       = null;      
      
	  m_addressList    = dojo.byId("addressList")
	  
	  m_saveOnLogin    = false;
	  
      // Add/Edit Address
	  m_addressDialog = dojo.widget.byId("addressEntryDialog");	
	  m_layerDialog   = dojo.widget.byId("layerEntryDialog");		  
	  
	  
	  if (navigator.appVersion.indexOf("MSIE 6.0")>0) {
		  showDialog(m_addressDialog);
		  hideDialog(m_addressDialog);	  
		  showDialog(m_layerDialog);
		  hideDialog(m_layerDialog);	  		  
	  }
	  	  
      // Load Dialog
	  m_loadDialog = dojo.widget.byId("loadMapDialog");
	  
	  m_mapTable = dojo.widget.byId("loadMapTable");
	  if (null != m_mapTable) {
		  m_mapTable.onSelect = selectMap;
	  }
	  
	  // Help
	  m_helpDialog = dojo.widget.byId("helpDialog");
	  
	  // About 
	  m_aboutDialog = dojo.widget.byId("aboutDialog");	  
	  
	  // embed
	  m_embedDialog = dojo.widget.byId("embedMapDialog");	  	  

	  
	  // Admin
	  m_adminDialog = dojo.widget.byId("adminDialog");

	  m_userTable = dojo.widget.byId("usersTable");
	  if (null != m_userTable) {
		  m_userTable.onSelect = selectUser;  
	  }	  
	  m_allMapsTable = dojo.widget.byId("allMapsTable");	
	  if (null != m_allMapsTable) {
		  m_allMapsTable.onSelect = selectMap;  
	  }
	  
      // Login Dialog
	  m_loginDialog = dojo.widget.byId("loginDialog");

	  // Forgot pw
	  m_resetPwDialog = dojo.widget.byId("resetPWDialog");
	  //var resetPw= dojo.widget.byId("resetPw");
	  //dojo.event.connect(resetPw, 'onClick', 'resetPw');	  	  	  
	  //var cancelReset= dojo.widget.byId("cancelReset");
	  //dojo.event.connect(cancelReset, 'onClick', 'closeResetPw');	  	  

      // Register Dialog
	  m_registerDialog = dojo.widget.byId("registerDialog");

	 // AccountDialog
	  m_accountDialog = dojo.widget.byId("accountDialog");
//	  var cancelAccount= dojo.widget.byId("cancelAccount");
//	  dojo.event.connect(cancelAccount, 'onClick', 'closeAccount');	  	  
//	  var doAccount= dojo.widget.byId("doUpdateAccountButton");
//	  dojo.event.connect(doAccount, 'onClick', 'accountSubmit');		  	  	  	  
	  
	  // Load tooltip text content
	  setTooltip("deleteMapTooltip", m_resources.DELETE_MAP_TT);
	  setTooltip("saveMapPosTooltip", m_resources.SAVE_MAP_POS_TT);

	  setTooltip("mapNameTooltip", m_resources.MAP_NAME_TT);
	  setTooltip("mapTagsTooltip", m_resources.MAP_TAGS_TT);	  
	  setTooltip("mapDescriptionTooltip", m_resources.MAP_DESCRIPTION_TT);	  
	  setTooltip("mapPrivateTooltip", m_resources.MAP_PRIVATE_TT);
	  setTooltip("mapSharedTooltip", m_resources.MAP_SHARED_TT);	  
	  setTooltip("mapPublishedTooltip", m_resources.MAP_PUBLISHED_TT);	  
	  
	  setTooltip("mapTagTooltip", m_resources.MAP_TAG_TT);	  	  

	  setTooltip("addressTooltip",m_resources.ADDRESS_TT );	  
	  setTooltip("addressTitleTooltip", m_resources.ADDRESS_TITLE_TT);	  
	  setTooltip("addressNoteTooltip", m_resources.ADDRESS_NOTE_TT);	  
	  setTooltip("addressUrlTooltip", m_resources.ADDRESS_URL_TT);	  
	  setTooltip("addressUrlTextTooltip", m_resources.ADDRESS_URL_TITLE_TT);	  
	  
	  GEvent.addListener(m_mapView.getMap(), "click", function(marker, point) {
		  if (!marker) {
			  if ((null == m_mapInfo) || (isMyMap())) {		  	
			// look for another point near this one using: distanceFrom(other)		  	
			// If there's one nearby, ignore the click
			/*var maxZoom = 17;
			var z = m_mapView.getMap().getZoom();				
			var zl = maxZoom - z;
			var maxDist = Math.pow(2, zl) * 20;
			for (var i=0;i<m_addrCache.length;i++) {
				if (null == m_addrCache[i]) {
					continue;
				}
				var nextPoint = m_addrCache[i].point;
				var distToPoint = point.distanceFrom(nextPoint);
				if (distToPoint < maxDist) {
					return;
				}
			}*/
			m_mapAddress.value = point.lat().toFixed(4)+", "+point.lng().toFixed(4);
			m_thisCreator.addAddress(m_mapTitle);
		  	}
		  }
		});          
			  
	  
	  m_thisCreator.newMap();	  	  	
	  doServletCall ("GetUserInfo", m_thisCreator.showUserInfoResult);	  
    }
    
    
   // Pop up an about box
    this.about = function(){
       m_aboutDialog.restoreWindow();
       showDialog(m_aboutDialog);
    }
    
    this.closeAbout = function () {
    	hideDialog(m_aboutDialog);
    }
    
	// Pop up some help
    this.help = function() {
    	showDialog(m_helpDialog);
    }
    
    
    this.closeHelp= function () {
    	hideDialog(m_helpDialog);
    }    
    
    var doServletCall = function (action, callback, request, error, sync) {
      if ((undefined != request) && (null != request)) {
      	request.action = action;
      }
      else {
	    request = {action: action};
      }
      if (undefined == error) {
      	error = servletCallError;
      }
      
      if (undefined == sync) {
      	sync = false;
      }

      setStatus(m_resources.WORKING);
      dojo.io.bind({
    	url: "/actionServlet",
    	content: request,
   		load: callback,
   		sync: sync,
   		mimetype: "text/plain",
   		method:"POST",
   		error:error
       	}); 	      	
    }
	var servletCallError = function (a) {
		setStatus(m_resources.UNKNOWN_ERROR, true);
	}
	    
    
   var setTooltip = function (id, s) {
   		  var elem = dojo.widget.byId(id);
   		  if (null != elem) {
			elem.domNode.innerHTML = s;
   		  }
    }

    var isMyMap = function (mapInfo) {
    	if (undefined == mapInfo) {
	    	if (null == m_mapInfo) {
	    		return true;
	    	}
	    	return m_mapInfo.isMyMap(m_userId);
    	}
    	if (null == mapInfo) {
    		return true;
    	}
    	else {
			return mapInfo.isMyMap(m_userId);    		
    	}
    }
    
    var isLoggedIn = function () {
		return !((undefined == m_userName) || ("" === m_userName));
    }
    

    this.showUserInfoResult= function(type, result) {
		clearStatus();
    	var res = JSON.parse(result);
    	m_userName = res.userName;
    	m_userRoles = res.userRoles;   
    	m_userId    = res.userId;
    	/*if (undefined != res.numMine) {
		   	m_numMine  = res.numMine;
		   	m_numPublished= res.numPublished;    			   	
    	}*/
    	showUserInfo();
    }
	this.uncache = function (url) {
		var d = new Date();
		var time = d.getTime();
		return url + "&time="+time;
	}    

 
    
  var printMap = function () {
		var url = "/newWindow.jsp?jsp=mapView.jsp&mapId="+m_mapInfo.getId()+"&format=print";
		window.open(url,"_blank","location=no,resizable=yes,menubar=yes,scrollbars=auto,toolbar=no,width=670,height=670,dependent=no");		
	}
	
	var viewMap = function (mapInfo) {
		var url = "/newWindow.jsp?jsp=mapView.jsp&mapId="+mapInfo.getId()+"&format=view";
		window.open(url,"_blank","location=yes,resizable=yes,menubar=yes,scrollbars=auto,toolbar=yes,width=750,height=670,dependent=no");		
	}	

	this.embedMap = function () {
		var mapCode = dojo.byId("embedMapCode");
		if (null != mapCode) {
			var code = "<iframe src='"+URL_START+MAP_VIEW+"?mapId="+m_mapInfo.getId()+"&format=embed' style='border:1px solid black; width: 450px; height:350px;'>\n</iframe>";
			mapCode.innerHTML = "<textarea cols=105 rows=4>"+code+"</textarea>";
			showDialog(m_embedDialog);
		}
	}
	
	this.closeEmbedMap = function () {
		hideDialog(m_embedDialog);
	}
	
    var hasRole = function (roleName) {
    	if (null != m_userRoles) {
    		for (var i = 0;i<m_userRoles.length;i++) {
    			if (roleName == m_userRoles[i]) {
    				return true;
    			}
    		}
    	}
    	return false;
    }
    
    var isAdmin = function () {
    	return hasRole("admin");
    }
    
    var showPlural = function (num) {
    	return (1 == num) ? "" : "s";
    }
    var showUserInfo = function () {
    	var userInfo;
    	var mapStats;
    	// Show shared info
     	mapStats = "<a title='Select a Published Map to view' href='browseMaps.jsp' target='_blank'>Browse Published Maps</a><br>";
	    if (isLoggedIn()) {
	      mapStats +="<a title='Select one of my maps' href='#' onclick='m_mapper.showMapsMine()'>Browse My Maps</a>";
		  userInfo = "<span class='welcome'>Welcome "+m_userName + "</span><a href='#' onClick='m_mapper.logout()'>logout</a><a title='My account information. Change password, email, zipcode, etc.' href='#' onClick='m_mapper.myAccount()'>account</a>"; 
		  if (isAdmin()) {
		  	userInfo += "<a href='#' onClick='m_mapper.admin()'>admin</a>"; 
		  }
		  m_mineCheck.checked = true;
          m_mineCheck.disabled = false;
          m_publishedCheck.disabled = false;          
	    }
	    else {
          userInfo = "<a title='Login to save and share maps' href='#' onClick='m_mapper.login()'>login</a><a title='Register here so you can login!'  href='#' onClick='m_mapper.register()'>register</a>"; 	    	
		  m_mineCheck.checked = false;          
          m_mineCheck.disabled = true;
          m_publishedCheck.disabled = true;                    
	    }
		m_userInfo.innerHTML = userInfo;
		m_mapStats.innerHTML = mapStats;
    }

	this.closeLoadMap = function () {
		hideDialog(m_loadDialog);
	}
	// Close load dialog
    this.closeLoad= function() {
    	hideDialog(m_loadDialog);
    }
        	    
    var selectMap = function (e) {
    	m_thisCreator.closeLoad();    	
    	m_thisCreator.closeAdmin();
		var row = dojo.html.getParentByType(e.target,"tr");    
		var mapId = row.getAttribute("value");		
		loadTheMap(mapId);			    	

    }   
    // Login
    
    // Popup up the login window
    this.login = function(msg) {   
    	dojo.byId("loginIntro").innerHTML = msg ? msg : m_resources.LOGIN_INTRO;
        dojo.byId("loginError").innerHTML = "";
     	dojo.byId("registerInvite").innerHTML = m_resources.REGISTER_INVITE;        

     	dojo.byId("username").value="";
    	dojo.byId("password").value=""; 
    	showDialog(m_loginDialog);
    }
    
    this.loginSubmit = function () {
    	var user = dojo.byId("username");
    	var pass = dojo.byId("password");    	
    	var request = {userName:user.value, password:pass.value};
        doServletCall ("GetUserInfo", m_thisCreator.loginResult, request, loginError);  					    		        	    	
    }
    
	var loginError = function ( type, error ) {
		//clearBanner();
		loginFail();
	}   
	
	this.loginResult = function (op, result) {
	   	clearStatus();		
    	var res= JSON.parse(result);
    	if ("SUCCESS" == res.STATUS) {
    		hideDialog(m_loginDialog);
		   	m_userName = res.userName;
     	   	m_userId   = res.userId;		   	
		   	m_userRoles= res.userRoles;		   	
		   	//m_numMine  = res.numMine;
		   	//m_numPublished= res.numPublished;		   	
		    
		   	showUserInfo();
		   	if (true == m_saveOnLogin) {
		   		m_thisCreator.saveMap();
		   		m_saveOnLogin = false;
		   		return;
		   	}
		   			   	
		   	if (null != m_mapInfo) {
				newMap();		   		
		   	}

    	}
    	else {
        	loginFail();
    	}
	}
	
	var loginFail = function () {
    	dojo.byId("loginError").innerHTML = m_resources.LOGIN_FAIL;		
	}
	
	this.forgotPassword = function () {
		//console.log("forgot");
		showDialog(m_resetPwDialog);
	}
	
	this.resetPw =  function () {
		//console.log("do it");
		closeResetPw();
	}
	this.closeResetPw  = function () {
		hideDialog(m_resetPwDialog);
	}
	     
    // cancel login
    this.closeLogin= function() {
    	hideDialog(m_loginDialog);
   		m_saveOnLogin = false;    	
    }
    
    // cancel Account
    this.closeAccount= function() {
    	hideDialog(m_accountDialog);
    }        
    
    // cancel register
    this.closeRegister= function() {
    	hideDialog(m_registerDialog);
    }    
    
    // logout
    this.logout = function () {
    	m_thisCreator.newMap();
        doServletCall ("Logout", m_thisCreator.showUserInfoResult);
    }
    
    this.admin = function () {
        doServletCall ("GetUsers", m_thisCreator.adminResult);    	
    }
    
    this.adminResult = function (op, result) {
    	var users= JSON.parse(result);
		m_userTable.store.setData(users);    	
        doServletCall ("GetMaps", m_thisCreator.showAllMapsResult, {allMaps:true});    			
	}
    
    this.showAllMapsResult = function (op, result) {
		clearStatus();
    	var allMaps= JSON.parse(result);
		m_allMapsTable.store.setData(allMaps);    	    	
		showDialog(m_adminDialog);
    }

	var mineFilter = function (userName) {
		return (userName == m_userName);
	}
	
	this.mineClicked = function () {
		if (m_mineCheck.checked) {
			m_mapTable.setFilter("userName", mineFilter);
		}
		else {
			m_mapTable.clearFilter("userName");
		}
	}
	
	this.publishedFilter = function (isPub) {
		return ("Published" == isPub);
	}
		

	this.publishedClicked = function () {
		if (m_publishedCheck.checked) {
			m_mapTable.setFilter("mapVisibility", m_thisCreator.publishedFilter);
		}
		else {
			m_mapTable.clearFilter("mapVisibility");
		}
	}	    
    
	// cancel admin
    this.closeAdmin= function() {
    	hideDialog(m_adminDialog);
    }    	    

	
	this.showMapsPublished= function () {
		m_publishedCheck.checked = true;		
     	m_mineCheck.checked   = false;	
		loadMap();	
	}
	
	this.showMapsMine  = function () {
		m_publishedCheck.checked = false;		
     	m_mineCheck.checked   = true;	
		loadMap();
	}
	    
    
    this.register = function () {
    	hideDialog(m_loginDialog);
    	dojo.byId("registerIntro").innerHTML = m_resources.REGISTER_INTRO;
        dojo.byId("registerError").innerHTML = "";    	
		dojo.byId("createUsername").value="";
    	dojo.byId("createPassword").value="";    	
    	dojo.byId("createPassword2").value="";
    	dojo.byId("createEmail").value="";	
    	dojo.byId("createZipcode").value="";  	    	    	

		showDialog(m_registerDialog);
    }
    
    this.registerSubmit = function () {
	    dojo.widget.byId("doRegisterButton").setDisabled(true);
		var user = dojo.byId("createUsername");
    	var pass = dojo.byId("createPassword");    	
    	var pass2 = dojo.byId("createPassword2");    	    	
    	var email = dojo.byId("createEmail");    	    	
    	var zip   = dojo.byId("createZipcode");    	    	    	    	
    	var request = {userName:user.value, password:pass.value, password2:pass2.value, email:email.value, zipcode:zip.value};    	
        doServletCall ("RegisterUser", m_thisCreator.registerResult, request);
    }
    
	this.registerError = function ( type, error ) {
		//clearBanner();		
		registerFail("REGISTER_FAIL");
	}    

	this.registerResult = function (op, result) {
		clearStatus();
    	var res= JSON.parse(result);
    	if ("SUCCESS" == res.STATUS) {
    		hideDialog(m_registerDialog);
			m_thisCreator.login(m_resources.REGISTER_SUCCESS);
    	}
    	else {
        	m_thisCreator.registerFail(res.MESSAGE);        	
    	}
	    dojo.widget.byId("doRegisterButton").setDisabled(false);    	    	
	}
	
	this.registerFail = function (message) {
    	dojo.byId("registerError").innerHTML = m_resources[message];
	}
    
    this.myAccount = function () {
    	var request = {Id:m_userId};
        doServletCall ("GetUsers", m_thisCreator.showAccountInfo, request);    	
    }
    
    this.showAccountInfo = function (op, result) {
    	clearStatus();
    	var res= JSON.parse(result);
    	// let user change pw, email, zip
    	//dojo.byId("accountIntro").innerHTML = m_resources.ACCOUNT_INTRO;
        dojo.byId("accountError").innerHTML = "";    	    	
    	dojo.byId("updateUserName").innerHTML = res.userName;

		dojo.byId("updateOldPassword").value="";
    	dojo.byId("updatePassword").value="";    	
    	dojo.byId("updatePassword2").value="";
    	dojo.byId("updateEmail").value=res.email;
    	dojo.byId("updateZipcode").value=res.zipcode;   	    	
    	
    	m_accountDialog.userId = res.Id;
    	showDialog(m_accountDialog);
    }
    
  this.accountSubmit = function () {
  	    var userName = dojo.byId("updateUserName");
    	var oldP  = dojo.byId("updateOldPassword");    	
    	var pass  = dojo.byId("updatePassword");    	    	
    	var pass2 = dojo.byId("updatePassword2");    	    	
    	var email = dojo.byId("updateEmail");    	    	
    	var zip   = dojo.byId("updateZipcode");    	    	    	    	

    	var request = {Id:m_accountDialog.userId, currentPassword: oldP.value, password:pass.value, password2:pass2.value, email:email.value, zipcode:zip.value};    	
        doServletCall ("RegisterUser", m_thisCreator.accountResult, request);
    }
    
	this.accountError = function ( type, error ) {
		accountFail("ACCOUNT_FAIL");
	}    

	this.accountResult = function (op, result) {
		clearStatus();			
    	var res= JSON.parse(result);
    	if ("SUCCESS" == res.STATUS) {
    		hideDialog(m_accountDialog);
    	}
    	else {
        	accountFail(res.MESSAGE);
    	}
	}
	
	var accountFail = function (message) {
    	dojo.byId("accountError").innerHTML = m_resources[message];
	}
        
    
    this.deleteMap = function() {
    	if (null == m_mapInfo) {
    		alert (m_resources.NO_MAP_OPEN);
    		return;
    	}
	    if (!isLoggedIn()) {
	    	setStatus("Please Login to Delete Map", true);
			return;
	    }    	
	    
    	var reallyDel = confirm("Delete Map: "+m_mapName.value);
    	if (true == reallyDel) {
    		setStatus(m_resources.DELETING);
       		var request = {Id: m_mapInfo.getId()};    		
            doServletCall ("DeleteMap", m_thisCreator.deleteMapResult, request);    		
    	}
    }
    
    this.deleteMapResult = function (op, result) {	
    	var res= JSON.parse(result);    		
    	clearBanner();
    	setStatus(m_resources.DELETED);
    	m_mapInfo.clear();
    	m_mapInfo = null;

    	m_thisCreator.newMap();    	
     	doServletCall ("GetUserInfo", m_thisCreator.showUserInfoResult);

    }

	var clearBanner = function () {
		setBanner("");
	}
	
    var setBanner = function (s) {
		var banner = dojo.byId("titleBanner");
		if (null != banner) {
			banner.innerHTML=s;
		}    	
    }
    
   	var clearStatus= function () {
		setStatus("");
		m_mapView.setDefaultCursor();
	}    


	var setStatus= function (s, hideIndicator) {
		var status= dojo.byId("statusDisplay");
		if (null != status) {
			if ("" == s) {
				status.innerHTML=s;
			} 
			else {
				if (hideIndicator) {
					status.innerHTML=s;	
				} 
				else {
					status.innerHTML=INDICATOR+s;
					m_mapView.setWaitCursor();		
				}
			}
		}    	
    }


   var selectUser= function (e) {
    	m_thisCreator.closeAdmin();
		var row = dojo.html.getParentByType(e.target,"tr");    	   	

    	var request = {Id:row.getAttribute("value")};
        doServletCall ("GetUsers", m_thisCreator.showAccountInfo, request);       	
    }    
    
    var loadTheMap= function (mapId) {
    	//console.log("Load:"+mapId);
		setStatus(m_resources.LOADING);    	
		var request = {Id: mapId};
        doServletCall ("GetMap", m_thisCreator.showLoadedMapResult, request);  				
    }

  this.showLoadedMapResult = function(a, result) {
    	var mapInfo= new MapInfo(JSON.parse(result));
    	if (!isMyMap(mapInfo) && !isAdmin()) {
			viewMap(mapInfo);
			clearStatus();    				
    		return;
    	}
		m_thisCreator.newMap();		    				    			    	    	
    	if (null != m_mapInfo) {
    		m_mapInfo.clear();
    	}
    	m_mapInfo = mapInfo;
    	m_mapView.setMapInfo(m_mapInfo);
		updateMapInfo();
		m_mapView.showMap(true);
    }
    

	var updateMapInfo = function () {
	
		if (null != m_mapName) {
			m_mapName.value = m_mapInfo.getName();
		}	
		if (null !=	m_mapDescription) {
			m_mapDescription.value= m_mapInfo.getDescription();						
		}

		if (null != m_mapPrivate) {
			m_mapPrivate.checked = m_mapInfo.getPrivate();
		}
				
		if (null != m_mapShared) {
			m_mapShared.checked = m_mapInfo.getShared();
		}

		if (null != m_mapPublished) {
			m_mapPublished.checked = m_mapInfo.getPublished();
		}				

		m_mapTags.value = m_mapInfo.getTags();
		
		setBanner("Map Name: "+m_mapInfo.getName());					
	}
	

	  
    this.addAddress = function (focusOn) {
 		m_addressDialog.titleBarText.innerHTML="Add Location";    	
    	showDialog(m_addressDialog);
    	if (undefined == focusOn) {
	   	   	m_mapAddress.focus();    	
    	}
    	else {
    		focusOn.focus();
    	}
    }
    
    this.addLayer = function (focusOn) {
 		m_layerDialog.titleBarText.innerHTML="Add Layer";    	
    	showDialog(m_layerDialog);
    	if (undefined == focusOn) {
	   	   	m_layerUrl.focus();    	
    	}
    	else {
    		focusOn.focus();
    	}    	
    }
    

  
  this.editLayer= function (id) {  
  	    m_editingLayer = id;
		var layer = m_mapView.getLayer(id);		 
	    m_layerUrl.value    = layer.getUrl();
	    m_layerTitle.value    = layer.getTitle()
	    m_layerNote.value = layer.getDescription();
	 	m_layerDialog.titleBarText.innerHTML="Edit Layer";    	 		
	    showDialog(m_layerDialog); 		
	   	m_layerUrl.focus();    	    	
   	}
  	
  var doEditLayer= function () {
    	if (-1 == m_editingLayer) {
    		alert("Error, no editing Layer");
    		m_thisCreator.cancelEditLayer();
    	}

	   	m_mapView.getMap().closeInfoWindow();
		// Update the map
		m_mapView.updateLayer(m_editingLayer, m_layerUrl.value, m_layerTitle.value, m_layerNote.value);
  		m_thisCreator.saveMap();		
		m_thisCreator.cancelEditLayer();		
    }   	

    
    this.cancelEditLayer= function () {    	
    	hideDialog(m_layerDialog);
		clearLayerInfo();
    }
    
    var clearLayerInfo = function () {
    	m_layerUrl.value   = "";    	
    	m_layerNote.value  = "";
    	m_layerTitle.value = "";    	    	
    }
    


	this.addLayerSubmit = function () {
		if ("" == m_layerUrl.value) {
			alert("Please enter URL for KML or GeoRss Data");
			return;
		}
		if (tooLong (m_layerUrl.value, 255, "URL")) {    	
			return;
		}   		
		if (tooLong (m_layerTitle.value, 45, "Title")) {    	
			return;
		}   				
		if (tooLong (m_layerNote.value, 512, "Note")) {    	
			return;
		}   						
 		if ("Edit Layer" == m_layerDialog.titleBarText.innerHTML) {
			doEditLayer();
 		}
 		else {
			doAddLayer();
 		}
	}
	

	var doAddLayer = function () {
		m_mapView.addLayer(m_layerUrl.value, m_layerTitle.value, m_layerNote.value);
  		m_thisCreator.saveMap();		
		m_thisCreator.cancelEditLayer();		
	}
	
	this.deleteLayer = function (id) {
		var layer = m_mapView.getLayer(id);
		var showLabel = layer.getTitle() ? layer.getTitle() : layer.getUrl();
    	var reallyDel = confirm("Delete Layer: "+ showLabel);
    	if (!reallyDel) {    	
    		return;
    	}		
    	m_mapView.deleteLayer(id);
		m_thisCreator.saveMap();    	
	}	
	
	this.showLayerInfo= function (id) {
		//var layer = m_mapView.getLayer(id);		
		//console.log("show layer: "+layer.getTitle());
		m_mapView.showLayerInfo(id);
	}		
	
	this.cancelShowLayer = function () {
		m_mapView.cancelShowLayer();
	}
	
	this.checkBoxChanged= function (id) {
		//var box = document.getElementById("Layer"+id);
		//m_mapView.layerVisible(id,box.checked);
		m_mapView.checkBoxChanged(id);
	}			
	
	// Hide and show dialog, but making sure it it's not null
    var hideDialog = function (d) {
    	if (null != d) {
    		d.hide();
    	}
    }
    var showDialog = function (d) {
    	if (null != d) {
    		d.show();
    	}
    }

    
    // newMap is called on init, and from the 'new' button
    this.newMap = function () {
		clearMap();
		clearStatus();
    }    
    
      
   // Clear out the form fields
    var clearMap = function()
    {
		m_mapView.clearMap();    	
		m_mapName.value = "New Map";
		setBanner(m_mapName.value);
		m_mapName.focus();
		m_mapName.select();
		m_mapTags.value = "";
		m_mapDescription.value = "";
		
		clearLayerInfo();
			
    	clearTable(dojo.byId("addressListBody"));
    	clearTable(dojo.byId("layerListBody"));
		
		if (null != m_mapInfo) {
			m_mapInfo.clear();
			m_mapInfo = null;
		}

		dojo.byId("userNameBanner").innerHTML = "";

		clearEntryFields();
		m_mapPrivate.checked = false;
	    m_mapShared.checked  = true;
		m_mapPublished.checked = false;
		m_thisCreator.cancelEditAddress();
    }    

	var  removeUnicode = function (addr) {
		addr = addr.replace(/&#8242;/g, "'");
		addr = addr.replace(/&#8243;/g, "\"");		
		return addr;
	}
	

  this.editAddress = function (index) {    	
		var location = m_mapView.getLocation(index);  	
	    m_mapAddress.value = removeUnicode(location.address);
	    m_mapNote.value    = location.note;    	
	    m_mapTitle.value    = location.title;    	    	
	    m_mapAddressUrl.value = location.url;    	    	
	    m_mapAddressUrlTitle.value = location.urlTitle;    	    	        
	 	m_editingAddress = index;    	
	 	m_addressDialog.titleBarText.innerHTML="Edit Location";    	 		
	    showDialog(m_addressDialog); 		
	   	m_mapAddress.focus();    	    	
   	}
   
  
    
    var doEditAddress = function () {
    	if ("" == m_editingAddress) {
    		alert("Error, no editing address");
    		m_thisCreator.cancelEditAddress();
    	}
	    if (tooLong (m_mapNote.value, 255, "Map Note")) {    	
	    	return;
	    }
    	
		// Update the map
	   	m_mapView.getMap().closeInfoWindow();
		var marker = m_mapView.getLocation(m_editingAddress).marker;
		m_mapView.showAddress({addressIndex:m_editingAddress, address:m_mapAddress.value, title: m_mapTitle.value, note: m_mapNote.value, url: m_mapAddressUrl.value, urlTitle: m_mapAddressUrlTitle.value},marker, false, isMyMap(m_mapInfo), m_thisCreator.goodAddress);
    }  
      
    this.goodAddress = function () {
		m_thisCreator.saveMap();
		m_thisCreator.cancelEditAddress();    
    }
    	
    	
    this.cancelEditAddress = function () {    	
    	hideDialog(m_addressDialog);
    	m_mapAddress.value = "";
    	m_mapNote.value    = "";
    	m_mapTitle.value    = "";    	
        m_mapAddressUrl.value = "";
        m_mapAddressUrlTitle.value = "";
    	if ("" != m_editingAddress) {
	    	m_editingAddress = "";	    	
    	}

    }


    this.deleteAddress = function (index) {
    	var location = m_mapView.getLocation(index);
		var title = location.title;
		var address = location.address;
    	var reallyDel = confirm("Delete Location: "+ (title ? title : address));
    	if (!reallyDel) {    	
    		return;
    	}
    	m_mapView.removeLocation(index);
    	
		m_thisCreator.saveMap();
		m_thisCreator.cancelEditAddress();
    }    
    
	var loadMap= function() {
       doServletCall ("GetMaps", showMapsResult);  		
    }
    
    var showMapsResult = function (op, result) {    
		clearStatus();    			
		showDialog(m_loadDialog);		
    	var maps = JSON.parse(result);
		m_mapTable.store.setData(maps);
		m_thisCreator.mineClicked();
     	m_thisCreator.publishedClicked();	   		
		
		if (0 == maps.length) {
			dojo.byId("selectMapMessage").innerHTML = "";						
			dojo.byId("noMapsMessage").innerHTML = m_resources.NO_MAPS;
		}
		else {
			dojo.byId("selectMapMessage").innerHTML = m_resources.SELECT_MAP;			
         	dojo.byId("noMapsMessage").innerHTML = "";			
		}
	}    
    var clearTable = function (table) {
    	if (null == table) {
    		return;
    	}
		var rows = table.rows;
		if (rows.length>0) {
			for (var i=rows.length-1;i>=0;i--) {
				table.deleteRow(i);
			}
		}
    }
  

    // called when the form is submitted, or button is pressed, shows the address or an
	this.mapIt = function()
    { 
 		if ("Edit Location" == m_addressDialog.titleBarText.innerHTML) {
			doEditAddress();
			return;
 		}
		if (tooLong (m_mapNote.value, 255, "Map Note")) {    	
			return;
		}    	
		m_mapView.showAddress({address:m_mapAddress.value, title: m_mapTitle.value, note: m_mapNote.value, url: m_mapAddressUrl.value, urlTitle: m_mapAddressUrlTitle.value}, null,null, isMyMap(m_mapInfo), m_thisCreator.goodAddress);
    }
    
    var clearEntryFields = function() {
		m_mapAddress.value = "";
	    m_mapNote.value = "";  
	    m_mapTitle.value = "";		        
	    m_mapAddressUrl.value = "";
	    m_mapAddressUrlTitle.value = "";                
    }
    
    var tooLong = function (s, len, fieldName) {
		if ((null == s) || ("" == s)) {
			return false;
		}
    	if (s.length >len) {
    		alert(fieldName+m_resources.MAX_STRING_MESSAGE+len);
    		return true;
    	}
    	return false;
    }
    

	this.saveMapPos = function () {
		if (null != m_mapInfo) {    	
			if (m_userId != m_mapInfo.getUserId()) {
				return;
	    	}		
			
			var center = m_mapView.getMap().getCenter();
			var request = {Id: m_mapInfo.getId(), 
	                       mapZoom: m_mapView.getMap().getZoom(), 
	                       mapCenter: JSON.stringify([center.lat(),center.lng()])};
	        doServletCall ("SaveMap", saveMapResult, request);  				
		}
	}	    
	
	var saveError = function (type, error)  {
		 doServletCall ("GetUserInfo", m_thisCreator.showUserInfoResult);
	}	
	
	this.saveMap= function() {
	    if (!isLoggedIn()) {
	    	setStatus("Please Login to Save Map", true);
	    	m_saveOnLogin=true;
			return;
	    }

	    if (tooLong (m_mapName.value, 45, "Map Name")) {    	
	    	return;
	    }	    
	    
	    if (tooLong (m_mapTags.value, 45, "Map Tags")) {    	
	    	return;
	    }	    	    
	    doSave();
    }
    
    var doSave = function () {
    	var addr = m_mapView.getLocations();
    	if (false === addr) {
    		return;
    	}
        var addressList = {addresses: addr};
        var layerList   = {layers: m_mapView.getLayers()};
		if (tooLong(m_mapDescription.value, 500, "Map Description")) {
			return;
		}
	    setStatus(m_resources.SAVING);		        
	    
		var center = m_mapView.getMap().getCenter();
		var zoom   = m_mapView.getMap().getZoom();              
			    
		var mapId = (null != m_mapInfo) ? m_mapInfo.getId() : "";
		var request = {Id: mapId, mapShared:m_mapShared.checked, mapPublished:m_mapPublished.checked, 
		               mapName: m_mapName.value, mapTags: m_mapTags.value, mapDescription: m_mapDescription.value, 
		               mapLayers: JSON.stringify(layerList),
		               mapAddresses: JSON.stringify(addressList)};
        doServletCall ("SaveMap", saveMapResult, request, saveError);  					    		    
    }
    
    var saveMapResult = function (op, result) {
    	if ("USER_NOT_LOGGEDIN" == result) {
    		clearStatus();
    		doServletCall ("GetUserInfo", m_thisCreator.showUserInfoResult);			
			alert("You are no longer logged in.  Please login again to save map.");
			return;
    	}    	
    	var res= JSON.parse(result);
    	if ("SUCCESS" == res.STATUS) {
	    	setStatus(m_resources.SAVED);
	    	m_mapInfo = new MapInfo(res);
	    	m_mapView.setMapInfo(m_mapInfo);
   			setBanner(m_mapInfo.getName());
		    m_mapView.updateMapTools();	 
			doServletCall ("GetUserInfo", m_thisCreator.showUserInfoResult);		       	
    	}
    	else {
			servletCallError();
    	}
    }
    		
	this.centerOn = function (index) { 
		return m_mapView.centerOn(index);
	}    		
	
	this.zoomIn = function () {
		return m_mapView.zoomIn();
	}
	
	this.zoomOut = function () {
		return m_mapView.zoomOut();
	}
	
	this.printMap = function () {
		return m_mapView.printMap();
	}

}