
// end shortcuts
var gIsSafari = (/Safari|Konqueror|KHTML/gi).test(navigator.userAgent);
var gIsOpera = navigator.userAgent.match(/opera/gi);
var gIsIE = !gIsSafari && !gIsOpera && navigator.userAgent.match( /msie/gi );
var gIsFirefox = navigator.userAgent.match(/firefox/gi);
var gIsCamino =  navigator.userAgent.match(/camino/gi);
var gIsSeaMonkey = navigator.userAgent.match(/seamonkey/gi);
var gIsMozilla = gIsFirefox || gIsCamino || gIsSeaMonkey;

var gBrowserHistoryReady = false;


// constants
var LEFT_NAV_WIDTH = 320;


function $(id){
  return document.getElementById(id);
}


function notifyMapDataArrived(){

  // update the zoom levels
//   if( BEBO.mapZoomLevels ){
//     gMap.setMapZoomLevels( BEBO.mapZoomLevels );
//   }

	gMap.redraw();
}



var gApp = function(){

  var _yuiLogger = null;


  function init() {


    // init the logging panel
    _initLogging();

    if( gIsLoggedIn ){
      YAHOO.log( "User is LOGGED IN" );
    } else {
      YAHOO.log( "User is NOT LOGGED IN" );
    }

    if( gIsAdminUser ){
      YAHOO.log( "User is ADMIN." );
    } else {
      YAHOO.log( "User is NOT ADMIN." );
    }
    

    gViewport.init();

		// set viewport size and initialize startup panels
		gViewport.windowResize();

		_displayLoginPanel();

    enableFileUpload();
    //$("uploadImageFile").disabled = false;
    //    $("uploadImageByUrlBtn").disabled = false;

		initialized = true;

    YAHOO.util.History.onLoadEvent.subscribe( _browserHistoryOnLoad );

		if( gHighlightParam ) {
			var pos = gHighlightParam.split(",");
			gMap.highlightSquares( pos[0], pos[1], pos[2], pos[3], true, "#00ff00"); 
		} else if( gSoldImage ){
			// show the user a message if we faked their image being on the map after purchase
      gNewImageProcess.showSoldPanel();
    }

  };



  // used to detect if the left mouse button was pressed when an event occurred
  if( gIsOpera || gIsMozilla ){
    var isLeftMouseDown = function ( e ){
      return e.button == 0;
    };
  } else {
    var isLeftMouseDown = function ( e ){
      return e.button == 1;
    };
  }


  function enableFileUpload(){
    // $$$$$ if the window isnt loaded yet, try again later with a timeout
    try { 
      $("uploadFrame").contentWindow.enableFileUpload();
     } catch (e){
       setDocumentDomain();  // defined in BeboNation.jsp (hack)
      YAHOO.log("Upload frame not loaded. Waiting to enable file uploads");
      setTimeout(gApp.enableFileUpload, 50);
    }
  }


	function gotoLoginPage(){
		// $$$$$ could compute map coords to return to after sign in.
    var loginUrl = "/PleaseSignIn.jsp?Page=" + encodeURIComponent( "BeboNation_jsp" );
    navigatePage( loginUrl );
	};

  function gotoRegistrationPage(){
		// $$$$$ could compute map coords to return to after sign in.
    var loginUrl = "/c/invite/join?Member=N";
    navigatePage( loginUrl );
  };

  

  function navigatePage( url ){
    try {
      window.location.assign( url );
    } catch (e) {
      window.location = url;
    }
  };


  function _browserHistoryOnLoad(){
    YAHOO.log( "Browser History Object loaded." );

  };


  function _initLogging(){
		var logConfig = {
			width: "400px",
			height: "200px"
		};
		
	  var yLogReader = new YAHOO.widget.LogReader(null, logConfig);
    yLogReader.hide();
    
	  // Customize the formatting of output to LogReader 
	  yLogReader.formatMsg = function(oLogMsg) { 
	    var category = oLogMsg.category; 
	    return "<p><span class='"+category+"'>"+category+"</span> "+ oLogMsg.msg+"</p>"; 
	  }; 

    _yuiLogger = yLogReader;

    YUE.addListener( document, "keydown", _toggleLogger);
  };
	
  function _resetLogging(){
    YAHOO.widget.Logger.reset();
  };

  function _toggleLogger( o ){
    if( o.keyCode == 76 && o.shiftKey && o.ctrlKey ){
      if( _yuiLogger._elContainer.style.display == "none" ){
        _yuiLogger.show();
      } else {
        _yuiLogger.hide();
      }
    }
  };




	function _displayLoginPanel() {
		var elAuthPanel = document.getElementById( "authPanel" );
		var elSignedInPanel = document.getElementById( "signedInPanel" );
		var elSignedOutPanel = document.getElementById( "signedOutPanel" );
		
		if( gIsLoggedIn ){
			YUD.setStyle( elSignedInPanel, "visibility","visible" );
			YUD.setStyle( elSignedOutPanel, "display", "none" );
		} else {
			YUD.setStyle( elSignedInPanel, "display","none" );
			YUD.setStyle( elSignedOutPanel, "visibility", "visible" );
		}

		YUD.setStyle( elAuthPanel, "visibility", "visible" );
	};





  function getSquareOwner( gridX, gridY ){

    // BeboNation.getProfileUrlForSquare
    var jsonrpcCallback = { success: _squareOwnerResponseHandler,
                            failure: _squareOwnerResponseHandler };

    gNewImageProcess.showLoadingPanel();
    
    JSON_RPC.send( jsonrpcCallback, "BeboNation.getProfileUrlForSquare", gridX, gridY );
  };




  function _squareOwnerResponseHandler( o ) {

    if( typeof(o) == "string" ){

      if( o == "PRIVATE" ){
        alert("The owner of the image you clicked has a private profile.");   // $$$$$ i18n
      } else {
        YAHOO.log( "owner: " + o );
        var host = window.location.hostname;
        var port = window.location.port;
        
        if( port == 80 ){
          var url = "http://" + host + o;        
        } else {
          var url = "http://" + host + ":" + port + o;
        }
        
        try {
          gMap.addCurrentMapPositionToBrowserHistory();
        } catch ( ignore ){}
        navigatePage( url );

      }
    } else {
      alert("You clicked on an empty area of the map.");
    }

    gNewImageProcess.hideLoadingPanel();

  };


  // *************
  //    LINK TO
  // *************

  var _copyLinkBoxShowing = false;
  var _linkToImageBoxShowing = false;

  function showLinkToViewBox(){
    
    var elLinkCopyBox = $("linkCopyBox");  // box with link to copy/paste

    if( !_copyLinkBoxShowing ){
      // link box is not showing, so show it
      var mapPos = gMap.getMapPositionAsString();
      _showLinkCopyBox( "http://" + window.location.host + "/BeboNation.jsp?mapPos=" + mapPos );
    } else {
      // link box is showing so hide it
      hideLinkCopyBox();
    }

  };

  function showLinkToImageBox(){
    var elLinkCopyBox = $("linkCopyBox");  // box with link to copy/paste

    if( !_linkToImageBoxShowing ){
      if( _copyLinkBoxShowing ){
        hideLinkCopyBox();
      }
      
      $("linkToImageBox").style.display = "block";
      $("linkLoadingMessage").style.visibility = "hidden";
      $("linkClickMessage").style.visibility = "visible";
      _linkToImageBoxShowing = true;

      gViewport.startLinkToImage();
    } else {
      // link box is showing so hide it
      hideLinkUI();
    }
  };

  function _showLoadingLinkToImage(){
    $("linkToImageBox").style.display = "block";
    $("linkLoadingMessage").style.visibility = "visible";
    $("linkClickMessage").style.visibility = "hidden";
  }


  function _hideLinkToImageBox(){
    $("linkToImageBox").style.display = "none";
    $("linkLoadingMessage").style.visibility = "hidden";
    $("linkClickMessage").style.visibility = "hidden";

    _linkToImageBoxShowing = false;
  }

  function cancelLinkToImage(){
    gViewport.endLinkToImage();
    _hideLinkToImageBox();
    hideLinkCopyBox();
  };

  function _showLinkCopyBox( link ){
    if( _linkToImageBoxShowing ){
      _hideLinkToImageBox();
    }
    
		$("linkCopyBox").style.display = "block";

    var elViewLinkText = $("viewLinkText");
		elViewLinkText.value = link;
		elViewLinkText.focus();
		elViewLinkText.select();

    _copyLinkBoxShowing = true;
  };

  function hideLinkCopyBox(){
    $("linkCopyBox").style.display = "none";
    _copyLinkBoxShowing = false;
    _hideLinkToImageBox();
  };


	function hideLinkUI(){  // cleaner external interface to closing the link UI
		if( _copyLinkBoxShowing || _linkToImageBoxShowing ){
			cancelLinkToImage();
		}
	}



  function getLinkToImage( e ){

    _showLoadingLinkToImage();    

    // BeboNation.getProfileUrlForSquare
    var jsonrpcCallback = { success: _getLinkResponseHandler,
                            failure: _getLinkResponseHandler };
    
    var gridXY = gMap.getGridXY( e );
    JSON_RPC.send( jsonrpcCallback, "BeboNation.getLinkForSquare", gridXY[0], gridXY[1] );
  };



  function _getLinkResponseHandler( o ) {
    if( typeof(o) == "string" ){
			var linkUrl = "http://" + window.location.host + o;
      _showLinkCopyBox( linkUrl );
    } else {
      alert( "There is no image where you clicked." );    // $$$$$ i18n
      hideLinkUI();
    }
  };

  




  // *****************
  //    END LINK TO
  // *****************



  return {
    init : init,
			gotoLoginPage: gotoLoginPage,
      gotoRegistrationPage : gotoRegistrationPage,
      isLeftMouseDown : isLeftMouseDown,
      getSquareOwner : getSquareOwner,
      _resetLogging : _resetLogging,
			navigatePage : navigatePage,
      showLinkToViewBox : showLinkToViewBox,
      showLinkToImageBox : showLinkToImageBox,
      cancelLinkToImage : cancelLinkToImage,
      hideLinkCopyBox : hideLinkCopyBox,
      getLinkToImage : getLinkToImage,
      enableFileUpload : enableFileUpload,
			hideLinkUI : hideLinkUI
      };
	
}();


YUE.addListener( window, "load", gApp.init );

