54c1befd1ac95aab8c80c7e2e400a90d01849237
angie
  Fri Jan 9 16:41:47 2015 -0800
New CGI hgAi (Annotation Integrator) that uses new ReactJS/ImmutableJS framework.hgAi.c has three modes of operation:
- HTML output for simple main page with a <div> container to be filled in by javascript
- JSON responses to ajax requests from javascript (using hg/lib/cartJson.c)
- text output for queries on track data

hgAi.jsx is the React/JSX UI view code, compiled to bundle/reactHgAi.js.
hgAiModel.js is a subclass of js/model/lib/ImModel.js that gets initial state
from the server and then responds to user actions.

diff --git src/hg/lib/hCommon.c src/hg/lib/hCommon.c
index 8bd3c7d..88ac7e2 100644
--- src/hg/lib/hCommon.c
+++ src/hg/lib/hCommon.c
@@ -11,30 +11,31 @@
 #include "errAbort.h"
 
 
 static char *_hgcName = "../cgi-bin/hgc";	/* Path to click processing program. */
 static char *_hgTracksName = "../cgi-bin/hgTracks"; /* Path back to genome browser. */
 static char *_hgTrackUiName = "../cgi-bin/hgTrackUi"; /* Path to extended ui program. */
 static char *_hgFileUiName = "../cgi-bin/hgFileUi";   /* Path to downloladable files CGI. */
 static char *_hgTextName = "../cgi-bin/hgText"; /* Path back to the text browser. */
 static char *_hgTablesName = "../cgi-bin/hgTables"; /* Path back to the table browser. */
 static char *_hgVaiName = "../cgi-bin/hgVai"; /* Path back to the variant annotation integrator. */
 static char *_hgCustomName = "../cgi-bin/hgCustom"; /* Path back to the custom tracks manager. */
 static char *_hgHubConnectName = "../cgi-bin/hgHubConnect"; /* Path back to the track hub manager. */
 static char *_hgSessionName = "../cgi-bin/hgSession";	/* Path to session manager. */
 static char *_hgPalName = "../cgi-bin/hgPal"; /* Path back to the protein aligner */
 static char *_hgVarAnnogratorName = "../cgi-bin/hgVarAnnogrator"; /* Path to variant annot intgr */
+static char *_hgAiName = "../cgi-bin/hgAi"; /* Path to annotation intgrator */
 
 char *hgPalName()
 /* Relative URL to click processing program. */
 {
 return _hgPalName;
 }
 
 char *hgcName()
 /* Relative URL to click processing program. */
 {
 return _hgcName;
 }
 
 char *hgTracksName()
 /* Relative URL to browser. */
@@ -84,30 +85,36 @@
 return _hgHubConnectName;
 }
 
 char *hgSessionName()
 /* Relative URL to session manager. */
 {
 return _hgSessionName;
 }
 
 char *hgVarAnnogratorName()
 /* Relative URL to variant annotation integrator program. */
 {
 return _hgVarAnnogratorName;
 }
 
+char *hgAiName()
+/* Relative URL to annotation integrator program. */
+{
+return _hgAiName;
+}
+
 static void finishCloneName(char *fragName, char *e, char cloneName[128])
 /* Finish conversion from frag to clone or clone.ver name. */
 {
 int size;
 
 if (e == NULL)
     e = fragName + strlen(fragName);
 size = e - fragName;
 if (size >= 128)
     errAbort("name too long %s\n", fragName);
 memcpy(cloneName, fragName, size);
 cloneName[size] = 0;
 }
 
 void fragToCloneName(char *fragName, char cloneName[128])