Team:Evry/arbor/arbor/src/etc.js

From 2012.igem.org

Revision as of 17:55, 18 September 2012 by TriCer (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

// // etc.js // // misc utilities //

 var trace = function(msg){
   if (typeof(window)=='undefined' || !window.console) return
   var len = arguments.length
   var args = []
   for (var i=0; i<len; i++) args.push("arguments["+i+"]")
   eval("console.log("+args.join(",")+")")
 }  
 var dirname = function(path){
   var pth = path.replace(/^\/?(.*?)\/?$/,"$1").split('/')
   pth.pop()
   return "/"+pth.join("/")
 }
 var basename = function(path){
   // var pth = path.replace(/^\//,).split('/')
   var pth = path.replace(/^\/?(.*?)\/?$/,"$1").split('/')
   
   var base = pth.pop()
   if (base=="") return null
   else return base
 }
 var _ordinalize_re = /(\d)(?=(\d\d\d)+(?!\d))/g
 var ordinalize = function(num){
   var norm = ""+num
   if (num < 11000){
     norm = (""+num).replace(_ordinalize_re, "$1,")
   } else if (num < 1000000){
     norm = Math.floor(num/1000)+"k"
   } else if (num < 1000000000){
     norm = (""+Math.floor(num/1000)).replace(_ordinalize_re, "$1,")+"m"
   }
   return norm
 }
 /* Nano Templates (Tomasz Mazur, Jacek Becela) */
 var nano = function(template, data){
   return template.replace(/\{([\w\-\.]*)}/g, function(str, key){
     var keys = key.split("."), value = data[keys.shift()]
     $.each(keys, function(){ 
       if (value.hasOwnProperty(this)) value = value[this] 
       else value = str
     })
     return value
   })
 }
 
 var objcopy = function(old){
   if (old===undefined) return undefined
   if (old===null) return null
   
   if (old.parentNode) return old
   switch (typeof old){
     case "string":
     return old.substring(0)
     break
     
     case "number":
     return old + 0
     break
     
     case "boolean":
     return old === true
     break
   }
   var newObj = ($.isArray(old)) ? [] : {}
   $.each(old, function(ik, v){
     newObj[ik] = objcopy(v)
   })
   return newObj
 }
 
 var objmerge = function(dst, src){
   dst = dst || {}
   src = src || {}
   var merge = objcopy(dst)
   for (var k in src) merge[k] = src[k]
   return merge
 }
 
 var objcmp = function(a, b, strict_ordering){
   if (!a || !b) return a===b // handle null+undef
   if (typeof a != typeof b) return false // handle type mismatch
   if (typeof a != 'object'){
     // an atomic type
     return a===b
   }else{
     // a collection type
     
     // first compare buckets
     if ($.isArray(a)){
       if (!($.isArray(b))) return false
       if (a.length != b.length) return false
     }else{
       var a_keys = []; for (var k in a) if (a.hasOwnProperty(k)) a_keys.push(k)
       var b_keys = []; for (var k in b) if (b.hasOwnProperty(k)) b_keys.push(k)
       if (!strict_ordering){
         a_keys.sort()
         b_keys.sort()
       }
       if (a_keys.join(',') !== b_keys.join(',')) return false
     }
     
     // then compare contents
     var same = true
     $.each(a, function(ik){
       var diff = objcmp(a[ik], b[ik])
       same = same && diff
       if (!same) return false
     })
     return same
   }
 }
 var objkeys = function(obj){
   var keys = []
   $.each(obj, function(k,v){ if (obj.hasOwnProperty(k)) keys.push(k) })
   return keys
 }
 
 var objcontains = function(obj){
   if (!obj || typeof obj!='object') return false
   for (var i=1, j=arguments.length; i<j; i++){
     if (obj.hasOwnProperty(arguments[i])) return true
   }
   return false
 }
 var uniq = function(arr){
   // keep in mind that this is only sensible with a list of strings
   // anything else, objkey type coercion will turn it into one anyway
   var len = arr.length
   var set = {}
   for (var i=0; i<len; i++){
     set[arr[i]] = true
   }
   return objkeys(set) 
 }
 var arbor_path = function(){
   var candidates = $("script").map(function(elt){
     var src = $(this).attr('src')
     if (!src) return
     if (src.match(/arbor[^\/\.]*.js|dev.js/)){
       return src.match(/.*\//) || "/"
     }
   })
   if (candidates.length>0) return candidates[0] 
   else return null
 }