function parseQueryString(queryString){
  // define an object to contain the parsed query data
  var result = {};
  // if a query string wasn't specified, use the query string from the URI
  if (queryString == undefined){queryString = location.search ? location.search : '';}
  // remove the leading question mark from the query string if it is present
  if (queryString.charAt(0) == '?') queryString = queryString.substring(1);
  // replace plus signs in the query string with spaces
  queryString = queryString.replace(/\+/g, ' ');
  // split the query string around ampersands and semicolons
  var queryComponents = queryString.split(/[&;]/g);
  // loop over the query string components
  for (var i = 0; i < queryComponents.length; i++){
    // extract this component's key-value pair
    var keyValuePair = queryComponents[i].split('=');
    var key = decodeURIComponent(keyValuePair[0]);
    var value = decodeURIComponent(keyValuePair[1]);
    // update the parsed query data with this component's key-value pair
    result[key] = (keyValuePair.length == 1) ? '' : value;
  }
  return result; 
}

var u_query=parseQueryString();
if (u_query['ask']) {
  var u_svg_client=u_query['ask'];
  var u_authpath_base="/u_auth.php";
  var u_authpath=u_authpath_base+"/auth/"+u_svg_client;
} else {
  var u_svg_client="";
  var u_authpath_base="/u_auth.php";
  var u_authpath=u_authpath_base;
}

/** show a blocking message box in the front - hiding the rest of screen behind a grey cutton!
* classes u_popup_back & u_block_msg makes the layout!
* @param msg Message text
*/
var u_front_msg__firstloop_=false;
function u_front_msg(msg) {
  if (! u_front_msg__firstloop_) {
    u_front_msg__firstloop_=true;
    $("body").append("<div id=\"u_block_msg_back\" class=\"u_popup_back\">\n"
                   +"<div id=\"u_block_msg\" class=\"u_popup_box\">&#160;</div>\n"
                   +"</div>\n");
  }
  $("#u_block_msg").html(msg);
  $("#u_block_msg_back").show();
}
/** hide the blocking message - give screen free!
*/
function u_front_msg_ok() {
  $("#u_block_msg_back").hide();
}


/** build a folder-file tree
* @param json_obj JSon Data opject
* @param tag_id tag id for output
* @param click_func function calling if file clicked
* @code
* function(){ file_name=$(this).attr("title"); alert(file_name); }
* @endcode
*/
var s="";
function u_ls_json2tree(json_obj,name,tag_id,click_func) {
   u_o("ls:u_ls_json2tree");
   $("#"+tag_id).empty();
   s="";
   u_ls_json2tree__h(json_obj,name,tag_id,1,"","");
   $("#"+tag_id).html(s);
   $(".u_ls_fname").click(click_func);
}
//helper for u_ls_json2tree_h()
function u_compare_dirs(a,b) {
  if(a.name > b.name)
    return 1;
  if(a.name < b.name)
    return -1;
  return 0;
}
function u_ls_json2tree__h(data,name,box,level,path,datafile) {
   if (level>20) return;
   if (level>1) {s+="<div id=\""+box+"\" name=\""+name+"\" class=\"u_ls_b"+level+"\" style=\"display:none;\">";}
   data.dirs.sort(u_compare_dirs);
   var d_num=data.dirs.length;
   var f_num=data.files.length;
   ////u_o("path="+path+" l="+level+" d_num="+d_num+" f_num="+f_num);
   var first_=1; var zumbr=""; 
   data.files.sort();
   for (var i = 0; i < f_num; i++) {
      file=data.files[i];
      zumbr=" <br/>";
      if (level==4 && first_==1) {
        re = /([0-9][0-9])([0-9][0-9])([0-9][0-9])\_([0-9][0-9])([pm][0-9]*)*\.usc/i;
        var ixi=file.match(re);
        //u_o("u_ls_json2tree__h():ixi="+ixi.join('x'));
        if (ixi.length>2) {first_=0; s+="<div class=\"u_ls_dh\">"+ixi[3]+"."+ixi[2]+".20"+ixi[1]+" datafile of hour </div>";}
      } else if (level==3 && first_==1) {
        re = /([0-9][0-9])([0-9][0-9])([0-9][0-9])([pm][0-9]*)*\.usc/i;
        var ixi=file.match(re);
        //u_o("u_ls_json2tree__h():ixi="+ixi.join('x'));
        if (ixi && ixi.length>2) {first_=0; s+="<div class=\"u_ls_dh\">"+ixi[2]+".20"+ixi[1]+" datafile of day</div>";}
      } else if (level==2 && first_==1) {
        re = /([0-9][0-9])([0-9][0-9])([pm][0-9]*)*\.usc/i;
        var ixi=file.match(re);
        //u_o("u_ls_json2tree__h():ixi="+ixi.join('x'));
        if (ixi && ixi.length>2) {first_=0; s+="<div class=\"u_ls_dh\">datafile of month</div>";}
      }

      ////u_o("file:"+file+" l="+level)
      var ftr=box+"_f"+i+"_tr";
/*      s+= "<tr id=\""+ftr+"\" class=\"u_ls_f_tr\" title=\""+path+"/"+file+"\">"
         +  "<td class=\"u_ls_f_td\">&#160;</td>"
         +  "<td class=\"u_ls_file\">"+file+"</td>"
         +"</tr>";*/      
      if (level==2) {
        re = /([0-9][0-9])([0-9][0-9])([pm][0-9]*)*\.usc/i;
        var kurz=file.match(re);
        if (kurz && kurz.count<1) {sh=file;} else {sh=kurz[2]+"."+kurz[1];}
      } else {
        re = /([0-9][0-9])([pm][0-9]*)*\.usc/i;
        var kurz=file.match(re);
        if (kurz && kurz.count<1) {sh=file;} else {sh=kurz[1];}
      }
      s+= "<div class=\"u_ls_fname u_ls_f"+level+"\" title=\""+path+"/"+file+"\">"+sh+"</div>";
   }
   s+= zumbr; 
   first_=1;
   for (var i = 0; i < d_num; i++) {
      dir=data.dirs[i];
      if (dir.name!="events" && dir.name!="uwav") {
        if (level==1 && first_==1) {first_=0;s+="<div class=\"u_ls_dh\">avialable datafiles:</div>";}
        if (level==2 && first_==1) {first_=0;s+="<div class=\"u_ls_dh\">subfolders with daily datafiles of the month</div>";}
        if (level==3 && first_==1) {first_=0;s+="<div class=\"u_ls_dh\">"+dir.name.substr(2,2)+".20"+dir.name.substr(0,2)+" subfolders with hourly datafiles of the day</div>";}
        ////u_o("ls:"+dir.name+" l="+level)
        var next_class="u_ls_b"+(level+1);
        if (level==1) {
          datafile=dir.name;
          var next_box=box+"_"+datafile;
        } else {
          var next_box=box+"_"+i;
        }
        if (level==2) {d_n=dir.name.substr(2,2)+"."+dir.name.substr(0,2) ;} 
        else if (level==3) {d_n=dir.name.substr(4,2);} 
        else {d_n=dir.name;}
        //u_o("d_n:"+d_n+" l="+level);
        s+= "<div class=\"u_ls_d u_ls_d"+level+"\" name=\""+dir.name+"\""
           +  " onclick=\"u_ls_open('"+next_box+"','"+dir.name+"',"+level+");\">"
           +    d_n
           + "</div>";
        u_ls_json2tree__h(dir,name,next_box,level+1,path+"/"+dir.name,datafile);
      }
   }
   if (level>1) {s+="</div>";}
   return;
}

function u_ls_open(box,name,level) {
  tag=document.getElementById(box);
  state=tag.style.display;
  $(".u_ls_b"+(level+1)+"[name=u_ds_b]").hide();
  if (level>1) {
    $(".u_ls_d"+level).removeClass("u_ls_d_sel");
  } else {
    $(".u_ls_d").removeClass("u_ls_d_sel");
  }
  if (state=='none') {
    $(".u_ls_d"+level+"[name="+name+"]").addClass("u_ls_d_sel");
    tag.style.display='block';
  } else {
    tag.style.display='none';
  }
}

function u_ls_jsonurl2tree(url,box,click_file_func) {
   u_o("ls:u_ls_jsonurl2tree url="+url);
   $.getJSON(url,function(data){
      u_o("getJSON ls "+data.type);
      u_ls_json2tree(data,box,box,click_file_func);
   });
}

/** build a folder-file tree
* @param json_obj JSon Data opject
* @param tag_id tag id for output
* @param click_func function calling if file clicked
* @code
* function(){ file_name=$(this).attr("title"); alert(file_name); }
* @endcode
*/
var u_ls_selector_nr=0;
function u_ls_selector(tag_id,json_url,click_file_func,options) {
  var box="u_ls_"+u_ls_selector_nr;
  $("#"+tag_id).append("<div id=\""+box+"\" class=\"u_ls\">\n"
                    +"<table><td id=\""+box+"_c\" class=\"u_json_reload\">&#160;</td><td id=\""+box+"_cb\"></td></table>\n"
                    +"</div>\n");
  //$("#"+box+"_c").click(function(){
  //   u_ls_jsonurl2tree(json_url,box+"_cb",click_file_func);
  //});
  //u_ls_jsonurl2tree(json_url,box+"_cb",click_file_func);
  u_ls_selector_nr++;
}

var u_info_box_nr=1;//info_box counter
function u_info(tag_id,text,options) {
  $("#"+tag_id).append("<div id=\"u_info_"+u_info_box_nr+"\" class=\"u_info\">"
                      +"<div id=\"u_info_"+u_info_box_nr+"_c\" class=\"u_info_c\" "
                      +"onclick=\"$('#"+tag_id+"b').show()\">&#160;xx</div>\n"
                      +"<div id=\"u_info_"+u_info_box_nr+"_cb\" class=\"u_info_cb\""
                      +"onclick=\"$('#"+tag_id+"').hide()\">"+text+"</div>\n"
                      +"</div>\n");
   u_info_box_nr++;//global counter
}

function u_add_button(box,id,title,click_button_func) {
   $("#"+box).append("<span id="+box+"_"+id+"_c>"+title+"</span>");
   $("#"+box+"_"+id+"_c").click(click_button_func);
}

var u_o__t0X = new Date();
var u_o__t0=u_o__t0X.getTime()
function u_o(str) {
   var t= new Date();
   dt=(t.getTime()-u_o__t0);
   $("#u_o").prepend("<div>"+(dt/1000)+" :"+str+"</div>");
   //window.dump((dt/1000)+" :"+str);
}

////
/// open and close elements by id
//
//open close or toggle tags by id
// 'b' block 'i' inline 'c' close 'tb' toggleBlock/Inline follow by ids
// numers are complieted with 'a_'.nr
function u_v() {
  state='o';
  arg=0; while (arg<arguments.length) {
    id=arguments[arg];
    if ((id=='c') || (id=='i') || (id=='ti') || (id=='b') || (id=='tb')) {
      state=id;
    } else if (document.getElementById(id)) {
      tag=document.getElementById(id);
      if (state=='ti') {
        if (tag.style.display=='none') {state='i';}
        else                           {state='c';}
      } else if (state=='tb') {
        if (tag.style.display=='none') {state='b';}
        else                           {state='c';}
      }
      if (state=='b') {
        tag.style.display='block';
        //a_d('x','b '+id);
      } else if (state=='i') {
        tag.style.display='inline';
        //a_d('x','i '+id);
      } else  {
        tag.style.display='none';
        //a_d('x','c '+id);
      }
    }
    arg++;
  }
}
function u_plus(basename) {
  u_v('i',basename+'_minus','c',basename+'_plus');
}
function u_minus(basename) {
  u_v('c',basename+'_minus','i',basename+'_plus');
}

function u_t_bool(tag,bool,t_text,f_text) {
  eval("val_="+bool+"=!"+bool+";");
  if (val_==0) {$(tag).text(t_text);} else {$(tag).text(f_text);}
  u_o("u_t_bool(): "+bool+"="+val_);
}

//eg u_show_hide(this,block_id,t_text,f_text,'b')
function u_show_hide(tag,tag_id,t_text,f_text,display_type) {
  var val_=true;
  eval("var tof=typeof(u_show_hide_"+tag_id+")");
  //u_o("typeof val_ u_show_hide_"+tag_id+":"+typeof(val_)+"/"+is);
  if (tof == "undefined") {
    eval("u_show_hide_"+tag_id+"=false;");
  } 
  eval("val_=u_show_hide_"+tag_id+"=!u_show_hide_"+tag_id+";");
  if (val_==0) {$(tag).text(t_text); u_v('c',tag_id);} else {$(tag).text(f_text); u_v(display_type,tag_id);}
}

/** gives the absolute position of a object*/
function u_xy_of(target) {
  r=new Array;
  t=target; r[0]=t.offsetLeft; r[1]=t.offsetTop;
  while (t.tagName != 'BODY') {
    t=t.offsetParent;
    r[0]+=t.offsetLeft;
    r[1]+=t.offsetTop;
  }
  return r;
}

/** gives the absolute position of a object*/
function u_geometry(target) {
  var g=new Object;
  t=target; g.x=t.offsetLeft; g.y=t.offsetTop;
  g.dy=t.offsetHeight;
  g.dx=t.offsetWidth;
  while (t.tagName != 'BODY') {
    t=t.offsetParent;
    g.x+=t.offsetLeft;
    g.y+=t.offsetTop;
  }
  g.pw=window.innerWidth;
  g.ph=window.innerHeight;
  g.pxo=window.pageXOffset;
  g.pyo=window.pageYOffset;
  g.xl=g.x-g.pxo;
  g.xr=g.pw-g.xl-g.dx;
  g.yo=g.y-g.pyo;
  g.yu=g.ph-g.yo-g.dy;
  //alert("u_pos_of():xl_x_xr,yo_y_yu="+g.xl+"_"+g.x+"_"+g.xr+","+g.yo+"_"+g.y+"_"+g.yu+" dxy="+g.dx+"_"+g.dy);
  return g;
}

var u_info_ticker__nr=-1;
var u_info_ticker__old=99;
var u_info_ticker__x=0;
function u_info_ticker()  {
   u_info_ticker__x=u_info_ticker__nr+1;
   u_info_off(this);
   $(".u_img_info").each(function (i) {
      if (i==u_info_ticker__x) {
        u_info_ticker__old=u_info_ticker__x;
        u_info_on(this);
        u_info_ticker__nr++;
      }
      u_o("u_info_ticker(): i="+i+" tick="+u_info_ticker__nr);
   });
   if (u_info_ticker__x!=u_info_ticker__nr) {u_info_ticker__nr=-1;}
   window.setTimeout('u_info_ticker()',1000);
}

function u_img_info_on(t) {
      var p=u_xy_of(t);dx=t.width; dy=t.height;
      $("#u_img_info").css({ "top" : p[1], "left" : p[0]
                        , "width" : dx, "height" : dy
                        ,"display" : "block"});//.text("p="+p[0]+","+p[1]+" s="+dx+","+dy);
}

function u_img_info_off(t) { $("#u_img_info").css("display","none"); }

var u_info_onX__close_=1;
function u_info_onX(t) {
      u_info_onX__close_=0;
      //var p=u_xy_of(t);
      var g=u_geometry(t); 
      var ox=Math.min(g.dx/5,10);
      var oy=Math.min(g.dy/5,10);
      var h=150; var w=200;
      var le=g.x+g.dx-ox; var clx="l"; var cly="u";
      if (le+w>g.pxo+g.pw>0  && g.x+ox-w>0) { le=g.x+ox-w; clx="r";}
      var to=g.y-h+oy;
      if (to-window.pageYOffset<0) { to=g.y+g.dy-ox; }
      //$("#u_info");
      //var h=document.getElementById("u_info").offsetHeight;
      //var w=document.getElementById("u_info").offsetWidth;
      if (t.title) {var info=t.title;} else {var info="sorry, no info found.";} 
      $("#u_info").css({ "top" : to, "left" : le ,"display" : "block"}).attr("class","u_info_"+cly+clx).html(info);
      u_o("u_info_onX(): Xo="+window.pageXOffset
                               +" Yo="+window.pageYOffset
                               +" xl_x_xr,yo_y_yu="+g.xl+"_"+g.x+"_"+g.xr+","+g.yo+"_"+g.y+"_"+g.yu
                               +" dxy="+g.dx+"_"+g.dy
                               +" w="+w
                               +" h="+h);
}

function u_info_offX(t) { if (u_info_onX__close_==1) {$("#u_info").css("display","none");} }

function u_info_outX(t) { 
  u_info_onX__close_=1; //evt von anderen vor timeout wieder 0 gesetzt
  window.setTimeout('u_info_offX()',100);
}

var u_info_on__close_=1;
var u_info_on__id="-";
function u_info_on(t) {
      u_info_on__close_=0;
      //var p=u_xy_of(t);
      var g=u_geometry(t); 
      var ox=Math.min(g.dx/5,10);
      var oy=Math.min(g.dy/5,10);
      var h=150; var w=200;
      var le=g.x+g.dx-ox; var clx="l"; var cly="u";
      if (le+w>g.pxo+g.pw>0  && g.x+ox-w>g.pxo) { le=g.x+ox-w; clx="r";}
      var to=g.y-h+oy;
      if (to<g.pyo && g.y+g.dy-oy>g.pyo) { to=g.y+g.dy-oy; cly="o"; } //&& g.y+g.dy-ox>0
      //$("#u_info");
      //var h=document.getElementById("u_info").offsetHeight;
      //var w=document.getElementById("u_info").offsetWidth;
      if (t.title) {var info=t.title;} else {var info="sorry, no info found.";} 
      var id=t.id+"b";
      if (id!=u_info_on__id) {$(".u_info_block").css("display","none");}
      u_info_on__id=id;
      $("#"+id).css({ "top" : to, "left" : le ,"display" : "block"})
               .attr("class","u_info_"+cly+clx+" u_info_block");//.html(info);
      u_o("u_info_on(): Xo="+g.pxo
                               +" Yo="+g.pyo
                               +" xl_x_xr,yo_y_yu="+g.xl+"_"+g.x+"_"+g.xr+","+g.yo+"_"+g.y+"_"+g.yu
                               +" dxy="+g.dx+"_"+g.dy
                               +" w="+w
                               +" h="+h);/**/
}
function u_info_off(t) { if (u_info_on__close_==1) {$(".u_info_block").css("display","none");} }
function u_info_out(t) { 
  u_info_on__close_=1; //evt von anderen vor timeout wieder 0 gesetzt
  window.setTimeout('u_info_off()',100);
}
//var u_info__first_=true;
$(document).ready(function(){
  $(".u_img_info").mouseover(function(){u_img_info_on(this);});
  $("#u_img_info").mouseout(function(){u_img_info_off(this);});
  $("#u_info").mouseover(function(){u_info_onX__close_=0;});
  $(".u_info").mouseover(function(){u_info_onX(this);});
  $("#u_info,.u_info").mouseout(function(){u_info_outX(this);});
  $(".u_info_link").mouseover(function(){u_info_on(this);});
  $(".u_info_block,.u_info_link").mouseout(function(){u_info_out(this);});
  $(".u_info_block").mouseover(function(){u_info_on__close_=0;});
  //u_o("u_query: "+u_query.toSource());
  // u_o("onload: start_"+u_info_ticker__nr);
  //window.setTimeout('u_info_ticker()',1000);
});
////
// set boolean button
/*function u_info(tag_id,text,options) {
  $("#"+tag_id).append("<div id=\"u_info_"+u_info_box_nr+"\" class=\"u_info\">"
                      +"<div id=\"u_info_"+u_info_box_nr+"_c\" class=\"u_info_c\" "
                      +"onclick=\"$('#"+tag_id+"b').show()\">&#160;xx</div>\n"
                      +"<div id=\"u_info_"+u_info_box_nr+"_cb\" class=\"u_info_cb\""
                      +"onclick=\"$('#"+tag_id+"').hide()\">"+text+"</div>\n"
                      +"</div>\n");
   u_info_box_nr++;//global counter
}*/

