
// Need to set this through a makefile or something
function GetURL() {
  return 'http://www.pacificfishtrax.org/pyrview2/index.py';
}

var PF = {
  callbacks : new Array(),

  processJSON : function(id, data) {
    return PF.callbacks[id](data);
  },

  id : 0,

  gensym : function() { return PF.id++; },

  callJSON : function(id, url, callback) { 
    // not using jQuery here.  
    // jQuery seems to trigger a XMLHttpRrequest call
    // which incurs a permission denied error
    var script = document.createElement( 'script' );
    script.type = 'text/javascript';
    script.src = url;
    PF.callbacks[id] = callback;
    document.getElementsByTagName('head')[0].appendChild( script );
  },

  FGet : function (service, adaptor, callback) {
  // Call a service, formatting the results with adaptor
  function prepValues(name, vals) {
     var qss = "";
     var list = '';
     if (typeof vals == 'object') {
        list = vals;
     }
     if (vals.split) {
        list = [vals];
     } 
     for (var i=0; i < list.length; i++) {
       qss = qss + '&' + name + '=' + escape(list[i]);
     }
     return qss;
  }

  var id = PF.gensym();
  var qs = GetQueryString();
  qs = "/get?"+qs+"&adaptor="+escape(adaptor)+prepValues("service",service) +"&id="+id;
  var url = GetURL() + qs;

  //JQ('body').append(url + "<br>");
  //assumes all results are json
  PF.callJSON(id, url, callback);
}
};


function FinishRefresh() {
 // do anything that needs to be done when all parameters are finished refreshing. 
};

JQ(document).ready(
function() {

var params = JQ("//[@class*=pyrviewparameter]");
var refreshables = params.filter('.refreshable');
params.bind("change",    
   function() { 
      // Refresh the SQL-driven parameters
      var i = params.index(this);
      if (i < params.size()-1 && i >= 0) {
        var after = params.filter(':gt('+ i +')');
        var torefresh = after.filter('.refreshable');
        torefresh.fadeOut('fast');
        if (torefresh.size() > 0) {
          RefreshParameter(JQ(torefresh.get(0)));
        } else {
          FinishRefresh();
        }
      }
  }
)


// refresh the parameters
if (refreshables.size() > 0) {
  RefreshParameter(JQ(refreshables.get(0)));
}

});

function loadJson( url ) {
  // not using jQuery here.  
  // jQuery seems to trigger a XMLHttpRrequest call
  // which incurs a permission denied error
  var script = document.createElement( 'script' );
  script.type = 'text/javascript';
  script.src = url;
  document.getElementsByTagName('head')[0].appendChild( script );
}

function RefreshParameter(selectnode) {
  var param = selectnode.attr('id');
  if (selectnode.filter('select').size() > 0) {
    adaptor = 'JSONOptions';
    callback = ProcessDomain;
  } else {
    adaptor = 'JSONSetValue';
    callback = function(response) {
       SetValue(response.parameter, response.value)
    };
  }
  selectnode.end();

  PF.FGet(param, adaptor, callback);
}


function GetQueryString() {
  // TODO: Make these three cases all one xpath expression

  function prepValues(name, val) { 
     var qss = "";
     var vs = val.split(','); 
     for (var i=0; i < vs.length; i++) {
       qss = qss + '&' + name + '=' + vs[i];  
     }
     return qss;
  }

  // collect text area parameters
  qs = ''
  JQ("//textarea[@class*=pyrviewparameter]").each(
    function(i) {
     var val;
     if (JQ(this).attr("type") == "hidden") {
       val = JQ(this).val();
     } else {
       // user input
       val = escape(JQ(this).val());
     }
     qs = qs + prepValues(JQ(this).attr('name'), val);
    }
  );

  // now collect input parameters
  JQ("//input[@class*=pyrviewparameter]").each(
    function(i) {
      qs = qs + prepValues(JQ(this).attr('name'), JQ(this).val());
    }
  );
  // now collect calculated parameters
  JQ("//div[@class*=pyrviewparameter]").each(
    function(i) {
      qs = qs + prepValues(JQ(this).attr('name'), JQ(this).text());
    }
  );

  // now collect select box parameters
  JQ("//select[@class*=pyrviewparameter]/option:selected").each(
    function(i) {
      
      qs = qs + prepValues(JQ(this).parent().attr('name'), JQ(this).val());
    }
  );
  return qs;
}


function SetValue(parameter, val) {
      // json callback calls SeValue to update a parmeter with a dynamic default
      var node = JQ("//*[@class*=pyrviewparameter][@id='" + parameter +"']");
      node.val(val);
      // html method may not work properly on IE
      //node.html(val);
      if (node.attr('type') != 'hidden') {
        node.fadeIn('normal');
      }
      var next = NextSQLParameter(parameter);
      if (null == next) {
        FinishRefresh();
      } else {
        RefreshParameter(next);
      }
}

function NextSQLParameter(param) {
  // Return the Next SQL Parameter in document order from the argument
  var sels = JQ("//[@class*=pyrviewparameter][@class*=refreshable]");
  var index = -1;
  sels.each( function(i) {
    if ( JQ(this).attr('id') == param ) {
      index = i+1;
    }
  });
  if (index >= sels.size() | index == -1) {
    return null;
  } else {
    return JQ(sels.get(index));
  }
}


function ProcessDomain(domain) {
      // This call can be slow in IE 6 when parsing a large domain
      // All the time is spent on the regular expression exec method
      var dom = JQ(domain);

      var param = dom.attr("id");
      var selectnode = JQ('//select[@id=' + param +']');

      // Damn bug with context argument.
      //s = JQ('//option:selected', selectnode);
  
      newopts = dom.children();
 
      var s = new Array();
      
      // This can be a lot simpler with jQuery voodoo, but I ran aground
      selectnode.children().each( function(i) {
        if (JQ(this).attr('selected')) {
          s.push(JQ(this).val());
        } 
      }); 

      selectnode.empty();
      selectnode.append(newopts); 

      selectnode.children().each(
         function(i) { 
           JQ(this).attr("selected", false);
           var v1 = JQ(this).val();
           var i=0;
           for (var i in s) {
             if (s[i] == v1) {
               JQ(this).attr("selected", true);
               break;
             }
           } 
         } 
      ); 

      selectnode.fadeIn('slow');
      var next = NextSQLParameter(param);
      if (null == next) {
        FinishRefresh();
      } else {
        RefreshParameter(next);
      }

}

