# Source: startup.js

    /** @file This file contains the scripts used when LabelMe starts up. */

    /** Main entry point for the annotation tool. */
    function StartupLabelMe() {
      console.time('startup');

      // Check browser:
      GetBrowserInfo();
      if(IsNetscape() || (IsMicrosoft() && (bversion>=4.5)) || IsSafari() || IsChrome()) {
        // Write "start up" messages:
        WriteLogMsg('*start_loading');
        console.log('LabelMe: starting up...');

        // Initialize global variables:
        main_handler = new handler();
        main_canvas = new canvas('myCanvas_bg');
        main_media = new image('im');
        // Parse the input URL.  Returns false if the URL does not set the
        // annotation folder or image filename.  If false is returned, the
        // function fetches a new image and sets the URL to reflect the
        // fetched image.
        if(!main_media.GetFileInfo().ParseURL()) return;

        if(video_mode) {
          main_media = new video('videoplayer');
          main_media.GetFileInfo().ParseURL();
          console.log("Video mode...");
          var anno_file = main_media.GetFileInfo().GetFullName();
          main_media.GetNewVideo();
          anno_file = 'VLMAnnotations/' + anno_file + '.xml' + '?' + Math.random();
          ReadXML(anno_file,LoadAnnotationSuccess,LoadAnnotation404);
        }
        else {
          // This function gets run after image is loaded:
          function main_media_onload_helper() {
    	// Set the image dimensions:
    	main_media.SetImageDimensions();

    	// Read the XML annotation file:
    	var anno_file = main_media.GetFileInfo().GetFullName();
    	anno_file = 'Annotations/' + anno_file.substr(0,anno_file.length-4) + '.xml' + '?' + Math.random();
    	ReadXML(anno_file,LoadAnnotationSuccess,LoadAnnotation404);
          };

          // Get the image:
          main_media.GetNewImage(main_media_onload_helper);
        }
      }
      else {
        // Invalid browser, so display error page.
        $('body').remove();
        $('html').append('<body><p><img src="Icons/LabelMe.gif" /></p><br /><p>Sorry!  This page only works with Mozilla Firefox, Chrome, and Internet Explorer.  We may support other browsers in the future.</p><p><a href="http://www.mozilla.org">Download Mozilla Firefox?</a></p></body>');
      }
    }

    /** This function gets called if the annotation has been successfully loaded.
      * @param {string} xml - the xml regarding the current file
    */
    function LoadAnnotationSuccess(xml) {
      console.time('load success');

      // Set global variable:
      LM_xml = xml;
      if (video_mode){
        FinishStartup();
        return;
      }

      // Set AllAnnotations array:
      SetAllAnnotationsArray();

      console.time('attach main_canvas');
      // Attach valid annotations to the main_canvas:
      for(var pp = 0; pp < AllAnnotations.length; pp++) {
        var isDeleted = AllAnnotations[pp].GetDeleted();
        if((view_Existing&&!isDeleted)||(isDeleted&&view_Deleted)) {
          // Attach to main_canvas:
          main_canvas.AttachAnnotation(AllAnnotations[pp]);
        }
      }
      console.timeEnd('attach main_canvas');

      console.time('RenderAnnotations()');
      // Render the annotations:
      main_canvas.RenderAnnotations();
      console.timeEnd('RenderAnnotations()');

      console.timeEnd('load success');

      // Finish the startup scripts:
      FinishStartup();
    }

    /** Sets AllAnnotations array from LM_xml */
    function SetAllAnnotationsArray() {
      var obj_elts = LM_xml.getElementsByTagName("object");
      var num_obj = obj_elts.length;

      AllAnnotations = Array(num_obj);
      num_orig_anno = num_obj;

      console.time('initialize XML');
      // Initialize any empty tags in the XML file:
      for(var pp = 0; pp < num_obj; pp++) {
        var curr_obj = $(LM_xml).children("annotation").children("object").eq(pp);

        // Initialize object name if empty in the XML file:
        if(curr_obj.children("name").length == 0) curr_obj.append($("<name></name>"));

        // Set object IDs:
        if(curr_obj.children("id").length > 0) curr_obj.children("id").text(""+pp);
        else curr_obj.append($("<id>" + pp + "</id>"));

        /*************************************************************/
        /*************************************************************/
        // Scribble:
        // Initialize username if empty in the XML file. Check first if we
        // have a polygon or a segmentation:
        if(curr_obj.children("polygon").length == 0) { // Segmentation
          if(curr_obj.children("segm").children("username").length == 0) {
            curr_obj.children("segm").append($("<username>anonymous</username>"));
          }
        }
        else if(curr_obj.children("polygon").children("username").length == 0) curr_obj.children("polygon").append($("<username>anonymous</username>"));
        /*************************************************************/
        /*************************************************************/
      }
      console.timeEnd('initialize XML');

      console.time('addPartFields()');
      // Add part fields (this calls a funcion inside object_parts.js)
      addPartFields(); // makes sure all the annotations have all the fields.
      console.timeEnd('addPartFields()');

      console.time('loop annotated');
      // Loop over annotated objects
      for(var pp = 0; pp < num_obj; pp++) {
        AllAnnotations[pp] = new annotation(pp);

        /*************************************************************/
        /*************************************************************/
        // Scribble:
        // If annotation is polygon, insert polygon:
        if(obj_elts[pp].getElementsByTagName("polygon").length > 0){
          var pt_elts = obj_elts[pp].getElementsByTagName("polygon")[0].getElementsByTagName("pt");
          var numpts = pt_elts.length;
          AllAnnotations[pp].CreatePtsX(numpts);
          AllAnnotations[pp].CreatePtsY(numpts);
          for(ii=0; ii < numpts; ii++) {
            AllAnnotations[pp].GetPtsX()[ii] = parseInt(pt_elts[ii].getElementsByTagName("x")[0].firstChild.nodeValue);
            AllAnnotations[pp].GetPtsY()[ii] = parseInt(pt_elts[ii].getElementsByTagName("y")[0].firstChild.nodeValue);
          }
        }
        // Otherwise, insert segmentation:
        else if (scribble_mode){
          AllAnnotations[pp].SetType(1);
          AllAnnotations[pp].SetImName(obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("mask")[0].firstChild.nodeValue);
          AllAnnotations[pp].SetScribbleName(obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("scribbles")[0].getElementsByTagName("scribble_name")[0].firstChild.nodeValue);
          var xc1 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("scribbles")[0].getElementsByTagName("xmin")[0].firstChild.nodeValue);
          var yc1 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("scribbles")[0].getElementsByTagName("ymin")[0].firstChild.nodeValue);
          var xc2 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("scribbles")[0].getElementsByTagName("xmax")[0].firstChild.nodeValue);
          var yc2 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("scribbles")[0].getElementsByTagName("ymax")[0].firstChild.nodeValue);
          var xc3 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("box")[0].getElementsByTagName("xmin")[0].firstChild.nodeValue);
          var yc3 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("box")[0].getElementsByTagName("ymin")[0].firstChild.nodeValue);
          var xc4 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("box")[0].getElementsByTagName("xmax")[0].firstChild.nodeValue);
          var yc4 = parseInt (obj_elts[pp].getElementsByTagName("segm")[0].getElementsByTagName("box")[0].getElementsByTagName("ymax")[0].firstChild.nodeValue);

          AllAnnotations[pp].SetImageCorners(xc1,yc1,xc2,yc2);
          AllAnnotations[pp].SetCorners(xc3,yc3,xc4,yc4);
        }
        /*************************************************************/
        /*************************************************************/

      }
      console.timeEnd('loop annotated');
    }

    /** Annotation file does not exist, so load template. */
    function LoadAnnotation404(jqXHR,textStatus,errorThrown) {
      if(jqXHR.status==404)
        ReadXML(main_media.GetFileInfo().GetTemplatePath(),LoadTemplateSuccess,LoadTemplate404);
      else
        alert(jqXHR.status);
    }

    /** Annotation template does not exist for this folder, so load default */
    function LoadTemplate404(jqXHR,textStatus,errorThrown) {
      if(jqXHR.status==404)
        ReadXML('annotationCache/XMLTemplates/labelme.xml',LoadTemplateSuccess,function(jqXHR) {
    	alert(jqXHR.status);
          });
      else
        alert(jqXHR.status);
    }

    /** Actions after template load success
      * @param {string} xml - the xml regarding the current file
    */
    function LoadTemplateSuccess(xml) {
      // Set global variable:
      LM_xml = xml;

      // Set folder and image filename:
      LM_xml.getElementsByTagName("filename")[0].firstChild.nodeValue = '\n'+main_media.GetFileInfo().GetImName()+'\n';
      LM_xml.getElementsByTagName("folder")[0].firstChild.nodeValue = '\n'+main_media.GetFileInfo().GetDirName()+'\n';

      // Set global variable:
      num_orig_anno = 0;

      // Finish the startup scripts:
      FinishStartup();
    }

    /** Finish the startup process: */
    function FinishStartup() {
      // Load the annotation list on the right side of the page:
      if(view_ObjList && !video_mode) RenderObjectList();

      // Add actions:
      console.log('LabelMe: setting actions');
      if($('#img_url')) $('#img_url').attr('onclick','javascript:console.log(\'bobo\');location.href=main_media.GetFileInfo().GetImagePath();');
      $('#changeuser').attr("onclick","javascript:show_enterUserNameDIV(); return false;");
      $('#userEnter').attr("onkeyup","javascript:var c; if(event.keyCode)c=event.keyCode; if(event.which)c=event.which; if(c==13 || c==27) changeAndDisplayUserName(c);");
      $('#xml_url').attr("onclick","javascript:GetXMLFile();");
      $('#nextImage').attr("onclick","javascript:ShowNextImage()");
      $('#zoomin').attr("onclick","javascript:main_media.Zoom(1.15)");
      $('#zoomout').attr("onclick","javascript:main_media.Zoom(1.0/1.15)");
      $('#fit').attr("onclick","javascript:main_media.Zoom('fitted')");
      $('#erase').attr("onclick","javascript:main_handler.EraseSegment()");
      $('#myCanvas_bg_div').attr("onmousedown","javascript:StartDrawEvent(event);return false;");
      $('#myCanvas_bg_div').attr("oncontextmenu","javascript:return false;");
      $('#myCanvas_bg_div').attr("onmouseover","javascript:unselectObjects();");
      $('#select_canvas_div').attr("oncontextmenu","javascript:return false;");
      $('#query_canvas_div').attr("onmousedown","javascript:event.preventDefault();WaitForInput();return false;");
      $('#query_canvas_div').attr("onmouseup","javascript:event.preventDefault();");
      $('#query_canvas_div').attr("oncontextmenu","javascript:return false;");

      // Initialize the username:
      initUserName();

      // Enable scribble mode:
      if(scribble_mode) InitializeScribbleMode('label_buttons_drawing','main_media');

      // Set action when the user presses a key:
      document.onkeyup = main_handler.KeyPress;

      // Collect statistics:
      ref = document.referrer;

      // Write "finished" messages:
      WriteLogMsg('*done_loading_' + main_media.GetFileInfo().GetImagePath());
      console.log('LabelMe: finished loading');

      console.timeEnd('startup');
    }