e1ba0aaa1baec345d56cc8a518b8450c3e5d74c3 tdreszer Wed Jan 22 14:31:22 2014 -0800 Checking in new feature 'drag-select highlight', which was originally coded by Larry. Redmine #709 (been on the shelf for awhile). diff --git src/hg/js/utils.js src/hg/js/utils.js index 3fab845..a8f1eee 100644 --- src/hg/js/utils.js +++ src/hg/js/utils.js @@ -1,2534 +1,2551 @@ // Utility JavaScript // "use strict"; 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 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;aIx2) alert("arrayOfInputsThatMatch is unimplemented for this browser"); } return found; } function normed(obj) { // returns undefined, the obj or the obj normalized from one member array if (obj == undefined || obj == null || obj.length == 0) return undefined; if (obj.length == 1) return obj[0]; return obj; // (obj.length > 1) } 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(""); } 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); inp.disabled = false; } else makeHiddenInput(theForm,aName,aValue); } function disableNamedVariable(theForm,aName) { // 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.disabled = true; } 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 with a passed in href var goodForm=$("form[name='"+formName+"']"); if(goodForm.length == 1) { if(href != undefined && href.length > 0) { $(goodForm).attr('action',href); // just attach the straight href } $(goodForm).attr('method','POST'); $(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); } // json help routines function tdbGetJsonRecord(trackName) { return hgTracks.trackDb[trackName]; } function tdbIsFolder(tdb) { return (tdb.kindOfParent == 1); } // NOTE: These must jive with tdbKindOfParent() and tdbKindOfChild() in trackDb.h function tdbIsComposite(tdb) { return (tdb.kindOfParent == 2); } function tdbIsMultiTrack(tdb) { return (tdb.kindOfParent == 3); } function tdbIsView(tdb) { return (tdb.kindOfParent == 4); } // Don't expect to use function tdbIsContainer(tdb) { return (tdb.kindOfParent == 2 || tdb.kindOfParent == 3); } function tdbIsLeaf(tdb) { return (tdb.kindOfParent == 0); } function tdbIsFolderContent(tdb) { return (tdb.kindOfChild == 1); } function tdbIsCompositeSubtrack(tdb) { return (tdb.kindOfChild == 2); } function tdbIsMultiTrackSubtrack(tdb) { return (tdb.kindOfChild == 3); } function tdbIsSubtrack(tdb) { return (tdb.kindOfChild == 2 || tdb.kindOfChild == 3); } function tdbHasParent(tdb) { return (tdb.kindOfChild != 0 && tdb.parentTrack); } function aryFind(ary,val) {// returns the index of a value on the array or -1; for(var ix=0;ix rangeMax) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be between "+rangeMin+" and "+rangeMax+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be between "+rangeMin+" and "+rangeMax+"."); obj.value = obj.defaultValue; return false; } } } else if(isInteger(min)) { if(val < rangeMin) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be no less than "+rangeMin+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be no less than "+rangeMin+"."); obj.value = obj.defaultValue; return false; } } } else if(isInteger(max)) { if(val > rangeMax) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be no greater than "+rangeMax+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be no greater than "+rangeMax+"."); obj.value = obj.defaultValue; return false; } } } return true; } } function validateFloat(obj,min,max) { // validates an float which may be restricted to a range (if min and/or max are numbers) var title = obj.title; var rangeMin=parseFloat(min); var rangeMax=parseFloat(max); if(title.length == 0) title = "Value"; var popup=( $.browser.msie == false ); for(;;) { if((obj.value == undefined || obj.value == "") && isFloat(obj.defaultValue)) obj.value = obj.defaultValue; if(!isFloat(obj.value)) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be a number.",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be a number."); // try a prompt box! obj.value = obj.defaultValue; return false; } } var val = parseFloat(obj.value); if(isFloat(min) && isFloat(max)) { if(val < rangeMin || val > rangeMax) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be between "+rangeMin+" and "+rangeMax+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be between "+rangeMin+" and "+rangeMax+"."); obj.value = obj.defaultValue; return false; } } } else if(isFloat(min)) { if(val < rangeMin) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be no less than "+rangeMin+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be no less than "+rangeMin+"."); obj.value = obj.defaultValue; return false; } } } else if(isFloat(max)) { if(val > rangeMax) { if(popup) { obj.value = prompt(title +" is invalid.\nMust be no greater than "+rangeMax+".",obj.value); continue; } else { alert(title +" of '"+obj.value +"' is invalid.\nMust be no greater than "+rangeMax+"."); obj.value = obj.defaultValue; return false; } } } return true; } } function validateUrl(url) { // returns true if url is a valid url, otherwise returns false and shows an alert // I got this regexp from http://stackoverflow.com/questions/1303872/url-validation-using-javascript var regexp = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i; if(regexp.test(url)) { return true; } else { alert(url + " is an invalid url") return false; } } function metadataIsVisible(trackName) { var divit = $("#div_"+trackName+"_meta"); if (divit == undefined || divit.length == 0) return false; return ($(divit).css('display') != 'none'); } function metadataShowHide(trackName,showLonglabel,showShortLabel) { // Will show subtrack specific configuration controls // Config controls not matching name will be hidden var divit = $("#div_"+trackName+"_meta"); if (divit == undefined || divit.length == 0) return false; var img = $(divit).prev('a').find("img"); if (img != undefined && $(img).length == 1) { img = $(img)[0]; if ($(divit).css('display') == 'none') $(img).attr('src','../images/upBlue.png'); else $(img).attr('src','../images/downBlue.png'); } if($(divit).css('display') == 'none') { if (typeof(subCfg) !== "undefined") { var cfg = normed($("#div_cfg_"+trackName)); if (cfg != undefined) // Hide any configuration when opening metadata $(cfg).hide(); } if($(divit).find('table').length == 0) { lookupMetadata(trackName,showLonglabel,showShortLabel); return false; } } var tr = $(divit).parents('tr'); if (tr.length > 0) { tr = tr[0]; var bgClass = null; var classes = $( tr ).attr("class").split(" "); for (var ix=0;ix