src/hg/js/utils.js 1.14

1.14 2009/03/30 21:12:19 tdreszer
Support for setting a variable then posting (allows reset to default)
Index: src/hg/js/utils.js
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/js/utils.js,v
retrieving revision 1.13
retrieving revision 1.14
diff -b -B -U 1000000 -r1.13 -r1.14
--- src/hg/js/utils.js	9 Mar 2009 18:35:29 -0000	1.13
+++ src/hg/js/utils.js	30 Mar 2009 21:12:19 -0000	1.14
@@ -1,190 +1,252 @@
 // Utility JavaScript
 // $Header$
 
 var debug = false;
 
 function clickIt(obj,state,force)
 {
 // calls click() for an object, and click();click() if force
     if(obj.checked != state) {
         obj.click();
     } else if (force) {
         obj.click();
         obj.click();    //force onclick event
     }
 }
 function setCheckBoxesWithPrefix(obj, prefix, state)
 {
 // Set all checkboxes with given prefix to state boolean
     var list = inputArrayThatMatches("checkbox","id",prefix,"");
     for (var i=0;i<list.length;i++) {
         var ele = list[i];
             if(ele.checked != state)
                 ele.click();  // Forces onclick() javascript to run
     }
 }
 
 function setCheckBoxesThatContain(nameOrId, state, force, sub1)
 {
 // Set all checkboxes which contain 1 or more given substrings in NAME or ID to state boolean
 // First substring: must begin with it; 2 subs: beg and end; 3: begin, middle and end.
 // This can force the 'onclick() js of the checkbox, even if it is already in the state
     if(debug)
         alert("setCheckBoxesContains is about to set the checkBoxes to "+state);
     var list;
     if(arguments.length == 4)
         list = inputArrayThatMatches("checkbox",nameOrId,sub1,"");
     else if(arguments.length == 5)
         list = inputArrayThatMatches("checkbox",nameOrId,sub1,arguments[4]);
     else if(arguments.length == 6)
         list = inputArrayThatMatches("checkbox",nameOrId,sub1,arguments[4],arguments[5]);
     for (var ix=0;ix<list.length;ix++) {
         clickIt(list[ix],state,force);
     }
     return true;
 }
 
 function inputArrayThatMatches(inpType,nameOrId,prefix,suffix)
 {
     // returns an array of input controls that match the criteria
     var found = new Array();
     var fIx = 0;
     if (document.getElementsByTagName)
     {
         var list;
         if(inpType == 'select')
             list = document.getElementsByTagName('select');
         else
             list = document.getElementsByTagName('input');
         for (var ix=0;ix<list.length;ix++) {
             var ele = list[ix];
             if(inpType.length > 0 && inpType != 'select' && ele.type != inpType)
                 continue;
             var identifier = ele.name;
             if(nameOrId.search(/id/i) != -1)
                 identifier = ele.id;
             var failed = false;
             if(prefix.length > 0)
                 failed = (identifier.indexOf(prefix) != 0)
             if(!failed && suffix.length > 0)
                 failed = (identifier.lastIndexOf(suffix) != (identifier.length - suffix.length))
             if(!failed) {
                 for(var aIx=4;aIx<arguments.length;aIx++) {
                     if(identifier.indexOf(arguments[aIx]) == -1) {
                         failed = true;
                         break;
                     }
                 }
             }
             if(!failed) {
                 found[fIx] = ele;
                 fIx++;
             }
         }
     } else {
         // NS 4.x - I gave up trying to get this to work.
         if(debugLevel>2)
            alert("arrayOfInputsThatMatch is unimplemented for this browser");
     }
     return found;
 }
 function showSubTrackCheckBoxes(onlySelected)
 {
 // If a Subtrack configuration page has show "only selected subtracks" option,
 // This can show/hide tablerows that contain the checkboxes
 // Containing <tr>'s must be id'd with 'tr_' + the checkbox id,
 // while checkbox id must have 'cb_' prefix (ie: 'tr_cb_checkThis' & 'cb_checkThis')
    if (document.getElementsByTagName)
    {
         var list = document.getElementsByTagName('tr');
         for (var ix=0;ix<list.length;ix++) {
             var tblRow = list[ix];
             if(tblRow.id.indexOf("tr_cb_") >= 0) {  // marked as tr containing a cb
                 if(!onlySelected) {
                     tblRow.style.display = ''; //'table-row' doesn't work in some browsers (ie: IE)
                 } else {
                     var associated_cb = tblRow.id.substring(3,tblRow.id.length);
                     chkBox = document.getElementById(associated_cb);
                     if(chkBox!=undefined && chkBox.checked && chkBox.disabled == false)
                         tblRow.style.display = '';
                     else
                         tblRow.style.display = 'none';  // hides
                 }
             }
         }
    }
    else if (document.all) {
         if(debug)
             alert("showSubTrackCheckBoxes is unimplemented for this browser");
    } else {
         // NS 4.x - I gave up trying to get this to work.
         if(debug)
            alert("showSubTrackCheckBoxes is unimplemented for this browser");
    }
 }
 
 function hideOrShowSubtrack(obj)
 {
 // This can show/hide a tablerow that contains a specific object
 // Containing <tr>'s must be id'd with 'tr_' + obj.id
 // Also, this relies upon the "displaySubtracks" radio button control
     var tblRow = document.getElementById("tr_"+obj.id);
 
     if(!obj.checked || obj.disabled)
     {
         var list = document.getElementsByName("displaySubtracks");
         for (var ix=0;ix<list.length;ix++) {
             if(list[ix].value == "selected") {
                 if(list[ix].checked)
                     tblRow.style.display = 'none';  // hides
                 else
                     tblRow.style.display = ''; //'table-row' doesn't work in some browsers (ie: IE)
                 break;
             }
         }
     }
     else
         tblRow.style.display = '';
 }
 
 function waitCursor(obj)
 {
     //document.body.style.cursor="wait"
     obj.style.cursor="wait";
 }
 
 function endWaitCursor(obj)
 {
     obj.style.cursor="";
 }
 
 function getURLParam()
 {
 // Retrieve variable value from an url.
 // Can be called either:
 //     getURLParam(url, name)
 // or:
 //     getURLParam(name)
 // Second interface will default to using window.location.href
     var strHref, strParamName;
     var strReturn = "";
     if(arguments.length == 1) {
           strHref = window.location.href;
           strParamName = arguments[0];
     } else {
           strHref = arguments[0];
           strParamName = arguments[1];
     }
     if ( strHref.indexOf("?") > -1 ){
       var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
       var aQueryString = strQueryString.split("&");
       for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
          if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ){
             var aParam = aQueryString[iParam].split("=");
             strReturn = aParam[1];
             break;
          }
       }
     }
     return unescape(strReturn);
 }
+
+function makeHiddenInput(theForm,aName,aValue)
+{   // Create a hidden input to hold a value
+    $(theForm).find("input:last").after("<input type=hidden name='"+aName+"' value='"+aValue+"'>");
+}
+
+function updateOrMakeNamedVariable(theForm,aName,aValue)
+{   // Store a value to a named input.  Will make the input if necessary
+    var inp = $(theForm).find("input[name='"+aName+"']:last");
+    if(inp != undefined && inp.length > 0)
+        inp.val(aValue);
+    else
+        makeHiddenInput(theForm,aName,aValue);
+}
+
+function parseUrlAndUpdateVars(theForm,href)
+{   // Parses the URL and converts GET vals to POST vals
+    var url = href;
+    var extraIx = url.indexOf("?");
+    if(extraIx > 0) {
+        var extra = url.substring(extraIx+1);
+        url = url.substring(0,extraIx);
+        // now extra must be repeatedly broken into name=var
+        extraIx = extra.indexOf("=");
+        for(;extraIx > 0;extraIx = extra.indexOf("=")) {
+            var aValue;
+            var aName = extra.substring(0,extraIx);
+            var endIx = extra.indexOf("&");
+            if( endIx>0) {
+                aValue = extra.substring(extraIx+1,endIx);
+                extra  = extra.substring(endIx+1);
+            } else {
+                aValue = extra.substring(extraIx+1);
+                extra  = "";
+            }
+            if(aName.length>0 && aValue.length>0)
+                updateOrMakeNamedVariable(theForm,aName,aValue);
+        }
+    }
+    return url;
+}
+
+function postTheForm(formName,href)
+{   // posts the form converting GET vars to Post vars first
+    // Need to parse out vars and ensure doing post!
+    var goodForm=$("form[name='"+formName+"']");
+    if(goodForm.length == 1) {
+        var url = parseUrlAndUpdateVars(goodForm,href);
+        $(goodForm).attr('action',url);
+        $(goodForm).submit();
+    }
+    return false; // Meaning do not continue with anything else
+}
+function setVarAndPostForm(aName,aValue,formName)
+{   // Sets a specific variable then posts
+    var goodForm=$("form[name='"+formName+"']");
+    if(goodForm.length == 1) {
+        updateOrMakeNamedVariable(goodForm,aName,aValue);
+    }
+    return postTheForm(formName,window.location.href);
+}
+