function NavigInfo() {
  this.list=null;

  this.hasList = function (e) {
    if (this.list==1){
      alert("Option not available when a list or a crossmatch is used\nReturn to the constraint page (button 'Modify Query') to modify your options");
      return true;
    }
    return false;
  }

  this.display = function (e) {
    if (e.hasClass("on")){
      e.removeClass("on");e.addClass("off");
    }
    else {
      e.removeClass("off");e.addClass("on");
    }
  }

  this.displayTable = function () {
    var i,a,s,e=$("#navcat");
    if (e.length<1) return;
    a=e.find("a");
    for (i=0;i<a.length;i++) 
      if (a.eq(i).hasClass('menu')) {
        s=e.find("select");
        if (a.eq(i).hasClass("on")) s.attr("size",5);
        else s.attr("size",20);
        this.display(a.eq(i));
        return;
      }
  }

  this.displayComputed = function () {
    var a,c,e=$("#navaddcol");
    var usenav=$("form[name='form0'] input[name='-usenav']");
    if (e.length<1) return;
    a=e.find("a");
    for (i=0;i<a.length;i++) 
      if (a.eq(i).hasClass('menu')) {
        c=e.find("#navcstout");
        if (a.eq(i).hasClass("on")){
          if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()&(~4))
          c.addClass("hidden");
        }
        else{
          if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()|4)
          c.removeClass("hidden");
        }
        this.display(a.eq(i));
        return;
      }

  }

  this.gokeyword = function () {
    var i,j,url="";
    var inputname=["//kw.Wavelength", "//kw.Mission","//kw.Astronomy","//words","//source","//c","//ucd", "//media"];
    var f=$("#naviginfo");
    for (j=0;j<inputname.length;j++) {
      var l=f.find("input[name='"+inputname[j]+"']");
      for (i=0;i<l.length;i++){
        url=url+"&-"+l.eq(i).attr('name').replace(/^../,'')+"="+encodeURIComponent(l.eq(i).val());
      }
    }
    // get meta options 
    i=$("input[name='-meta']");
    if (i.length>0) url+="&-meta="+i.eq(0).val();
    else url+="&-meta=1";
    i=$("input[name='-meta.foor']");
    if (i.length>0) url+="&-meta.foot="+i.eq(0).val();
    else url+="&-meta.foot=1";
    i=$("input[name='-meta.ucd']");
    if (i.length>0) url+="&-meta.ucd="+i.eq(0).val();
    else url+="&-meta.ucd=2";

    window.open("/viz-bin/VizieR-2?"+url,"_self");
  }

  this.goTables = function() {
    if (this.hasList()) return false ;
    var tmpform=$("form[name='tmpform']");
    var crtform=$("form[name='form0']");
    if (tmpform.length>0) tmpform.remove();
    var action=crtform.find("input[name='-this']");
    if (action.length>0) action=action.eq(0).val().replace(/[a-z]*$/,"");
    else action="";
    $("form[name='temporary']").remove();
    tmpform=$("<form action='VizieR"+action+"' method='GET' name='temporary'/>").appendTo(crtform.parent());
    tmpform.addClass('hidden');
 
    var str="";
    var i,sources=crtform.find("select[name='//tables'] option");
    var obj,s,currentcat="!!EMPTY!!";// init to something for IE (function search)
    for(i=0;i<sources.length;i++) {
        s=obj=sources.eq(i).val();
        if (sources.eq(i).hasClass("cat") ){
            if (sources.eq(i).attr("selected")){
	        currentcat=obj;
                while (currentcat.search(/\+/)>-1) currentcat=currentcat.replace(/\+/,"_");
	    }
        }
        if (sources.eq(i).attr("selected")) { 
            while (s.search(/\+/)>-1) s=s.replace(/\+/,"_");
	    if (sources.eq(i).hasClass("cat") ){}
            else if (s.search(currentcat)!=-1) continue;
            str+=" "+obj;
        }
    }

    if (str.length==0) {alert("no table or catalog selected"); return;}
    $("<input name='-source' value='"+str+"'/>").appendTo(tmpform);
    $("<input name='-from' value='nav'/>").appendTo(tmpform);
    $("input[name='-nav']").appendTo(tmpform);
    tmpform.submit(); 
  }

  this.gocst = function () {
    this.go("NOEXEC");
    var form=$("form[name='form0']");
    if (form.length<1) return;

    var e,o=$("#tmpform");
    if (o.length>0) o.remove();
    nform=$("<form action='VizieR-3' method='POST' name='tmpform'/>").appendTo(form.parent());

    var i,l=form.find("input");
    for(i=0;i<l.length;i++){
      var name=l.eq(i).attr('name');
      if (!name) continue;
//      if (name=="-out.form") l.eq(i).val("HTML Table");
      if (l.eq(i).attr("type")=="checkbox" || l.eq(i).attr("type")=="radio"){
        if (l.eq(i).attr("checked")==false) continue;
      }
      nform.append($("<input type='hidden' name='"+name+"' value=\""+encodeURIComponent(l.eq(i).val())+"\"/>"));
    }
    l=form.find("select option:selected");
    for(i=0;i<l.length;i++){
      var name=l.eq(i).parent().attr('name');
      if (l.eq(i).val())
        nform.append($("<input type='hidden' name='"+name+"' value=\""+encodeURIComponent(l.eq(i).val())+"\"/>"));
      else nform.append($("<input type='hidden' name='"+name+"' value=\""+encodeURIComponent(l.eq(i).html())+"\"/>"));
    }
   
    e=nform.find("input[name='-to']").val("3");
    nform.find("input[name='-from']").remove();
    nform.find("input[name='-Bsource']").remove();
    nform.submit();
  }

  this.go = function (noexec) { 
    var form=$("form[name='form0']");
    if (!noexec)
      if (this.hasList()) return false;

    // if button name='//submit' exist then 
    // click on it
    var bt=form.find("input[name='//submit']");
    if (bt.length>0 && !noexec){
      bt.eq(0).click();
      return false;
    }
    if (!noexec) form.submit();
  }

  this.gomirror = function (){
   var form=$("form[name='form0']");
   var l=$("#navmirrors select option:selected");
   alert("Jump to Mirror "+l.eq(0).html()+" ("+l.eq(0).attr("title")+"/viz-bin/VizieR)");
   form.attr("action",l.eq(0).attr("title")+"/viz-bin/VizieR");
   //this.go();
   executeinhiddenform(l.eq(0).attr("title")+"/viz-bin/VizieR","-to",0);
  }


  this.hide = function (){
    var menu=$("#Vmenuappli");
    var core=$("#CDScore");
    var imgon=menu.find("#imgon");
    var imgoff=menu.find("#imgoff");
    var nav=$("#naviginfo");
    var usenav=$("form[name='form0'] input[name='-usenav']");
    var useval= usenav.eq(0).val();
    
    if (menu.length<1) return;
    if (menu.hasClass("menuon")){
      if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()&(~1));
      imgon.addClass("hidden");
      imgoff.removeClass("hidden");
      menu.removeClass("menuon");
      menu.addClass("menuoff");
      core.removeClass("withmenu");
      core.addClass("withoutmenu");
      var data=nav.find(".data");
      data.addClass("datahidden");
      data.removeClass("data");
    }
    else {
      if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()|1);
      imgon.removeClass("hidden");
      imgoff.addClass("hidden");
      menu.addClass("menuon");
      menu.removeClass("menuoff");
      core.addClass("withmenu");
      core.removeClass("withoutmenu");
      var data=nav.find(".datahidden");
      data.addClass("data");
      data.removeClass("datahidden");
    }
  }

  this.block = function(){
    var menu=$("#Vmenuappli");
    var pinon=menu.find("#pinon");
    var pinoff=menu.find("#pinoff");
    var usenav=$("form[name='form0'] input[name='-usenav']");
    if (pinon.hasClass("hidden")){
      if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()&(~2));
      pinon.removeClass("hidden");
      pinoff.addClass("hidden");
      menu.removeClass("fixed");
      menu.addClass("absolute");
    }
    else{
      if (usenav.length>0) usenav.eq(0).val(usenav.eq(0).val()|2);
      pinon.addClass("hidden");
      pinoff.removeClass("hidden");
      menu.addClass("fixed");
      menu.removeClass("absolute");
    }
  }

  this.freeEquinox = function(){
    var elt=$("#naviginfo #freeeq");
    var val=elt.parent().find("input[name='//outaddvalue']");
    if (val.length==0) return;
    elt.attr("name","-out.add");
    if (val.eq(0).val().search(/default/)>-1)elt.val("_RA*-c.eq,_DE*-c.eq");
    else if (val.eq(0).val().search(/\*[^-]*/)>-1)elt.val("_RA*-c.eq,_DE*-c.eq");
    else if (val.eq(0).val().search(/[ \t]+$/)>-1)elt.val("_RA*-c.eq,_DE*-c.eq");
    else if (val.eq(0).val().search(/^$/)>-1)elt.val("_RA*-c.eq,_DE*-c.eq");
    else elt.val("_RA"+val.eq(0).val()+",_DE"+val.eq(0).val());
    elt.attr("checked",true);
  }
 
  this.jsoncatalog=null;
 
  this.addcatalog = function(){
/*  NOTE: the following JQUERY code is understood by IE
    var str="<a href='#' style='display:none' id='newcatlink' rel='newcat'></a>";
    str+="<div id='newcat' style='display:none'>Add a new catalog:<br/>";
    str+="<input id='insource' name='-source'><input type='button' value='Go' onClick='ninfo.pushcat()'><br><a href='#' class='close'>close</a></div>";
*/
    var d=document.createElement("a");
    d.setAttribute("href","#");
    d.setAttribute("rel","newcat");
    d.id="newcatlink";
    document.getElementById("naviginfo").appendChild(d);

    d=document.createElement("div");
    d.id="newcat";
    d.innerHTML="Add a new catalog:<br/><input id='insource' name='-source' onkeyup='ninfo.validnewcat(event)'><input type='button' value='Go' onClick='ninfo.pushcat()'><br>";
    //d.innerHTML=d.innerHTML+"<a href='#' class='close'>close</a>";
    d.style.display="none";
    document.getElementById("naviginfo").appendChild(d);

    $("#newcatlink").simpleDialog({width:400,height:250,showCloseLabel:true,
                                   close:function () {$("#newcatlink").remove();$("#newcat").remove();}});
    $("#newcatlink").click();
  }

  this.validnewcat = function(event){
      if (!event) var event = window.event;
      var code=event.keyCode; //IE
      if (!code) code=event.which;
      if (code==13) ninfo.pushcat();
      return false;
  }


  this.gonewcat = function(val){
    if (val){
      var nselect=$("#navcriteria select");
      //get style
      var o=nselect.find("option").eq(0);
      nselect.append("<option selected='selected' class='cat' style='"+o.attr("style")+"' value='"+val+"'>"+val+"</option>");
      // look for tables
      if (this.jsoncatalog){
        var i;
        for (i=0;i<this.jsoncatalog.length;i++){
          if (this.jsoncatalog[i].name==val) {
            for (j=0;j<this.jsoncatalog[i].tables.length;j++) {
              var tname=this.jsoncatalog[i].tables[j].name.replace(/^.*\//,"");
              nselect.append("<option class='tab' value='"+this.jsoncatalog[i].tables[j].name+"'>.."+tname+"</option>"); 
            }
          }
        }
      }
      //nselect.append("<option value='"+val+"'>..table "+val+"</option>");
      var crtform=$("form[name='form0']");
      var action=crtform.find("input[name='-this']");
      if (action.length>0) {
        if (action.eq(0).val()<3 && action.eq(0).val()>-3) action.eq(0).val("-3");
        else if (action.eq(0).val()>0) action.eq(0).val(action.eq(0).val()*-1);
      }
      ninfo.goTables();
      $.simpleDialog.close();
    }
    else {
      var i,o=$("#insource").parent().find("select option:selected");
      for(i=0;i<o.length;i++){
        ninfo.gonewcat(o.eq(i).val());
        return;
      }
    }
  }
  this.pushcat = function(){
    var max=20;
    var cmd="/viz-bin/vizmine.exe?-vmine.out=json&-vmine.noskip&-vmine.max="+max+"&-vmine.weight=0&";
    var e=$("#insource");
    if (e.length==0) return;
    var newcat=e.parent();
    newcat.append("<div id='newcatwait'><img src='/vizier/VizieR/vizmine/blue.gif'></div>");

    $.ajax({
      url:cmd+"-source="+e.val(),
      global:false,
        type:"get",
        dataType:"json",
        timeout:5000,
        success: function(jso){
          newcat.find(".result").remove();
          newcat.append("<div class='result'>"+jso.count+" matching catalogs<br/></div>");
          var result=newcat.find(".result");
          var i,cat=jso.catalogs;
          ninfo.jsoncatalog=jso.catalogs;

          result.append("<select multipe='multiple' size='5'/>");
          var s=newcat.find("select").eq(0);
          for (i=0;i<cat.length;i++){
            var str=cat[i].title;
            var cl="Vbgcol"+(i%2);
            s.append("<option OnDblClick='ninfo.gonewcat()' class='"+cl+"' value='"+cat[i].name+"'><span class='catname'>"+cat[i].name+"</span>:"+str+"</option>");
          }
          
          if (jso.count>cat.length) result.append("<div class='warning'>truncated result</div>");
          result.append("<input type='button' onClick='ninfo.gonewcat()' value='Add'/>");
          $("#newcatwait").remove();
        },
        error: function(jso){
          newcat.find(".result").remove();
          newcat.append("<div class='result error'><b>ERROR</b><br/>"+jso.count+"</div>")
          $("#newcatwait").remove();
        }
    });
  }

  this.sortoption = function(e){
    var i,l=$("input[name='-sort']");
    for (i=0;i<l.length;i++){
      if (l.eq(i).attr("type")=="hidden")l.eq(i).val("");
    }
  }

  this.showConstraints = function(a){
    var e=$("#CDScore #resume");
    if (e.hasClass("hidden")) {
      e.removeClass("hidden"); $(a).removeClass("out");$(a).addClass("in");}
    else {
      e.addClass("hidden"); $(a).removeClass("in");$(a).addClass("out");}
  }
}

