var menus = new Array( ) ;
var menu_level = menus.length ;
var v_menu_level ;
menus[ menus.length ] = new menuq( "menu_level",
                                   "Select Menu Level",
                                   "naive,expert",
                                   "naive",
                                   'true' ) ;

var inter_all = menus.length ;
var v_inter_all ;
menus[ menus.length ] = new menuq( "inter_all",
                                   "Select Action Group",
                                   "analyze,check_assertions,check_certificate,optimize",
                                   "analyze",
                                   'true' ) ;

var assert_ctcheck = menus.length ;
var v_assert_ctcheck ;
menus[ menus.length ] = new menuq( "assert_ctcheck",
                                   "Perform Compile-Time Checks",
                                   "on,off",
                                   "on",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && true)' ) ;

var assert_rtcheck = menus.length ;
var v_assert_rtcheck ;
menus[ menus.length ] = new menuq( "assert_rtcheck",
                                   "Insert Run-Time Checks",
                                   "on,off",
                                   "off",
                                   '((v_inter_all == "check_assertions") && true)' ) ;

var rt_instrumentation = menus.length ;
var v_rt_instrumentation ;
menus[ menus.length ] = new menuq( "rt_instrumentation",
                                   "Instrumentation Level",
                                   "low,medium,high",
                                   "low",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_rtcheck != "off"))' ) ;

var ass_not_stat_eval = menus.length ;
var v_ass_not_stat_eval ;
menus[ menus.length ] = new menuq( "ass_not_stat_eval",
                                   "Report Non-Verified Assrts",
                                   "off,warning,error",
                                   "off",
                                   '((v_inter_all == "check_assertions") && (v_assert_ctcheck == "on"))' ) ;

var pred_ctchecks = menus.length ;
var v_pred_ctchecks ;
menus[ menus.length ] = new menuq( "pred_ctchecks",
                                   "Predicate-Level CT Checks",
                                   "none,old,new,new_all,new_succ,new_all_succ",
                                   "new_all",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_ctcheck == "on"))' ) ;

var pp_ctchecks = menus.length ;
var v_pp_ctchecks ;
menus[ menus.length ] = new menuq( "pp_ctchecks",
                                   "Program-Point CT Checks",
                                   "none,old,new",
                                   "old",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_ctcheck == "on"))' ) ;

var verbose_ctchecks = menus.length ;
var v_verbose_ctchecks ;
menus[ menus.length ] = new menuq( "verbose_ctchecks",
                                   "Verbose CT Checking",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_ctcheck == "on"))' ) ;

var error_log = menus.length ;
var v_error_log ;
menus[ menus.length ] = new menuq( "error_log",
                                   "Create Error Log File",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_ctcheck == "on"))' ) ;

var check_config_ana = menus.length ;
var v_check_config_ana ;
menus[ menus.length ] = new menuq( "check_config_ana",
                                   "Customize Analysis Flags",
                                   "on,off",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_assert_ctcheck == "on"))' ) ;

var gen_certificate = menus.length ;
var v_gen_certificate ;
menus[ menus.length ] = new menuq( "gen_certificate",
                                   "Generate Certificate",
                                   "on,off",
                                   "off",
                                   '((v_inter_all == "check_assertions") && true)' ) ;

var inter_optimize = menus.length ;
var v_inter_optimize ;
menus[ menus.length ] = new menuq( "inter_optimize",
                                   "Select Optimize",
                                   "none,spec,parallelize,slice,poly_spec",
                                   "spec",
                                   '((v_inter_all == "optimize") && true)' ) ;

var spec_poly = menus.length ;
var v_spec_poly ;
menus[ menus.length ] = new menuq( "spec_poly",
                                   "Select Abs Specialization",
                                   "off,mono,poly",
                                   "off",
                                   '(((v_inter_optimize == "slice") && (v_inter_all == "optimize")) && true) || (((v_inter_optimize == "spec") && (v_inter_all == "optimize")) && true)' ) ;

var pres_inf_fail = menus.length ;
var v_pres_inf_fail ;
menus[ menus.length ] = new menuq( "pres_inf_fail",
                                   "Preserve  Finite Failure",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_spec_poly != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_spec_poly != "off"))' ) ;

var exec_unif = menus.length ;
var v_exec_unif ;
menus[ menus.length ] = new menuq( "exec_unif",
                                   "Execute Unif at Spec Time",
                                   "off,on",
                                   "on",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_spec_poly != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_spec_poly != "off"))' ) ;

var spec_postproc = menus.length ;
var v_spec_postproc ;
menus[ menus.length ] = new menuq( "spec_postproc",
                                   "Perform Postprocessing Phase",
                                   "off,on",
                                   "on",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_spec_poly != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_spec_poly != "off"))' ) ;

var peval_ana = menus.length ;
var v_peval_ana ;
menus[ menus.length ] = new menuq( "peval_ana",
                                   "Select Analysis Domain",
                                   "none,pd,pdb,def,gr,share,shareson,shfr,shfrson,shfrnv,son,share_amgu,share_clique,sharefree_amgu,sharefree_clique,aeq,depth,path,difflsign,fr,frdef,lsign,eterms,ptypes,svterms,terms",
                                   "pd",
                                   '(((v_inter_optimize == "slice") && (v_inter_all == "optimize")) && true) || (((v_inter_optimize == "spec") && (v_inter_all == "optimize")) && true)' ) ;

var local_control = menus.length ;
var v_local_control ;
menus[ menus.length ] = new menuq( "local_control",
                                   "Select Local Control",
                                   "off,orig,inst,det,det_la,depth,first_sol,first_sol_d,all_sol,hom_emb,hom_emb_anc,hom_emb_as,df_hom_emb_as,df_tree_hom_emb,df_hom_emb",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((((v_menu_level == "expert") && (v_inter_all == "analyze")) && (v_types != "none")) || ((((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && true) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && true)))' ) ;

var unf_depth = menus.length ;
var v_unf_depth ;
menus[ menus.length ] = new menuq( "unf_depth",
                                   "Select Depth",
                                   "int",
                                   "1",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && ((v_local_control == "det_la") || (v_local_control == "first_sol_d") || (v_local_control == "depth"))) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && ((v_local_control == "det_la") || (v_local_control == "first_sol_d") || (v_local_control == "depth")))' ) ;

var comp_rule = menus.length ;
var v_comp_rule ;
menus[ menus.length ] = new menuq( "comp_rule",
                                   "Select Computation Rule",
                                   "leftmost,local_builtin,local_emb,jump_builtin,safe_jb,bind_ins_jb",
                                   "leftmost",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var part_conc = menus.length ;
var v_part_conc ;
menus[ menus.length ] = new menuq( "part_conc",
                                   "Select Partial Concretization",
                                   "off,mono,multi",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var inter_opt_arg_filt = menus.length ;
var v_inter_opt_arg_filt ;
menus[ menus.length ] = new menuq( "inter_opt_arg_filt",
                                   "Perform Argument Filtering",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var global_control = menus.length ;
var v_global_control ;
menus[ menus.length ] = new menuq( "global_control",
                                   "Select Global Control",
                                   "off,id,inst,hom_emb",
                                   "hom_emb",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_inter_all == "analyze") && (((v_ana_nf == "none") && (v_types == "svterms") && (v_local_control != "off")) || ((v_ana_nf == "none") && (v_types == "eterms") && (v_local_control != "off")))) || ((((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))))' ) ;

var global_trees = menus.length ;
var v_global_trees ;
menus[ menus.length ] = new menuq( "global_trees",
                                   "Use Global Trees",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var min_crit = menus.length ;
var v_min_crit ;
menus[ menus.length ] = new menuq( "min_crit",
                                   "Post-minimization",
                                   "none,equal,isomorphic,builtins",
                                   "none",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var abs_spec_defs = menus.length ;
var v_abs_spec_defs ;
menus[ menus.length ] = new menuq( "abs_spec_defs",
                                   "Abstract Spec Definitions",
                                   "off,rem,exec,all",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var rem_use_cls = menus.length ;
var v_rem_use_cls ;
menus[ menus.length ] = new menuq( "rem_use_cls",
                                   "Remove Useless Clauses",
                                   "off,pre,post,both",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && (v_local_control != "off")) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && (v_local_control != "off"))' ) ;

var filter_nums = menus.length ;
var v_filter_nums ;
menus[ menus.length ] = new menuq( "filter_nums",
                                   "Select Filter Numbers",
                                   "off,safe,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_optimize == "slice") && (v_inter_all == "optimize")) && ((v_global_control == "hom_emb") || (v_local_control == "hom_emb_as") || (v_local_control == "hom_emb"))) || (((v_menu_level == "expert") && (v_inter_optimize == "spec") && (v_inter_all == "optimize")) && ((v_global_control == "hom_emb") || (v_local_control == "hom_emb_as") || (v_local_control == "hom_emb")))' ) ;

var modes = menus.length ;
var v_modes ;
menus[ menus.length ] = new menuq( "modes",
                                   "Select Mode Analysis",
                                   "none,pd,pdb,def,gr,share,shareson,shfr,shfrson,shfrnv,son,share_amgu,share_clique,sharefree_amgu,sharefree_clique,aeq,depth,path,difflsign,fr,frdef,lsign",
                                   "shfr",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var types = menus.length ;
var v_types ;
menus[ menus.length ] = new menuq( "types",
                                   "Select Type Analysis",
                                   "none,eterms,ptypes,svterms,terms",
                                   "eterms",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var redundancy = menus.length ;
var v_redundancy ;
menus[ menus.length ] = new menuq( "redundancy",
                                   "Allow Redundancy",
                                   "on,off",
                                   "on",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_modes == "sharefree_clique") || (v_modes == "sharefree_amgu") || (v_modes == "share_clique") || (v_modes == "share_amgu"))) || ((v_inter_all == "analyze") && ((v_modes == "sharefree_clique") || (v_modes == "sharefree_amgu") || (v_modes == "share_clique") || (v_modes == "share_amgu")))' ) ;

var normalization = menus.length ;
var v_normalization ;
menus[ menus.length ] = new menuq( "normalization",
                                   "Normalization Threshold",
                                   "int",
                                   "100",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_modes == "sharefree_clique") || (v_modes == "share_clique"))) || ((v_inter_all == "analyze") && ((v_modes == "sharefree_clique") || (v_modes == "share_clique")))' ) ;

var ana_nf = menus.length ;
var v_ana_nf ;
menus[ menus.length ] = new menuq( "ana_nf",
                                   "Perform Non-Failure Analysis",
                                   "none,nf,nfg",
                                   "none",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var ana_cost = menus.length ;
var v_ana_cost ;
menus[ menus.length ] = new menuq( "ana_cost",
                                   "Select Cost Analysis",
                                   "none,steps_ub,steps_lb,steps_ualb,steps_o",
                                   "none",
                                   '((v_inter_all == "analyze") && true) || (((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on"))' ) ;

var ana_det = menus.length ;
var v_ana_det ;
menus[ menus.length ] = new menuq( "ana_det",
                                   "Perform Determinism Analysis",
                                   "none,det",
                                   "none",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var type_eval = menus.length ;
var v_type_eval ;
menus[ menus.length ] = new menuq( "type_eval",
                                   "Perform Type Eval",
                                   "on,off",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && (((v_ana_nf == "none") && (v_types == "svterms")) || ((v_ana_nf == "none") && (v_types == "eterms"))))' ) ;

var variants = menus.length ;
var v_variants ;
menus[ menus.length ] = new menuq( "variants",
                                   "Select Variants",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && (((v_ana_nf == "none") && (v_types == "svterms")) || ((v_ana_nf == "none") && (v_types == "eterms"))))' ) ;

var widencall = menus.length ;
var v_widencall ;
menus[ menus.length ] = new menuq( "widencall",
                                   "Select WidenCall",
                                   "com_child,onlyfixp,off",
                                   "com_child",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && (((v_ana_nf == "none") && (v_types == "svterms")) || ((v_ana_nf == "none") && (v_types == "eterms"))))' ) ;

var type_precision = menus.length ;
var v_type_precision ;
menus[ menus.length ] = new menuq( "type_precision",
                                   "Select Type Precision",
                                   "defined,all",
                                   "all",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && ((v_ana_nf == "none") && (v_types != "none")))' ) ;

var fixpoint = menus.length ;
var v_fixpoint ;
menus[ menus.length ] = new menuq( "fixpoint",
                                   "Select Analysis Algorithm",
                                   "plai,dd,di,check_di,check_di2,check_di3,check_di4,check_di5,poly_spec",
                                   "plai",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && ((v_ana_nf == "none") && (v_local_control == "off")))' ) ;

var multi_success = menus.length ;
var v_multi_success ;
menus[ menus.length ] = new menuq( "multi_success",
                                   "Multivariant Success",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || (((v_menu_level == "expert") && (v_inter_all == "analyze")) && true)' ) ;

var pp_info = menus.length ;
var v_pp_info ;
menus[ menus.length ] = new menuq( "pp_info",
                                   "Print Program Point Info",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var vers = menus.length ;
var v_vers ;
menus[ menus.length ] = new menuq( "vers",
                                   "Multi-variant Analysis Results",
                                   "off,on",
                                   "off",
                                   '(((v_menu_level == "expert") && (v_inter_all == "analyze")) && true)' ) ;

var collapse_ai_vers = menus.length ;
var v_collapse_ai_vers ;
menus[ menus.length ] = new menuq( "collapse_ai_vers",
                                   "Collapse AI Info",
                                   "off,on",
                                   "on",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && (v_check_config_ana == "on")) || ((v_inter_all == "analyze") && true)' ) ;

var type_output = menus.length ;
var v_type_output ;
menus[ menus.length ] = new menuq( "type_output",
                                   "Select Type Output",
                                   "defined,all",
                                   "all",
                                   '(((v_menu_level == "expert") && (v_inter_all == "check_assertions")) && ((v_ana_nf == "none") || (v_check_config_ana == "on"))) || ((v_inter_all == "analyze") && ((v_ana_nf == "none") && (v_types != "none")))' ) ;

//////////////////////
//    GLOBAL VARS   //
//////////////////////


var nc   = (document.layers) ? true:false ;
var ie   = (document.all) ? true:false ;
var n6   = (document.getElementById) ? true:false ;
var gebn = (document.getElementByName) ? true:false ;


//////////////////////
//  MENU QUESTION   //
//////////////////////


// menu question 
function menuq ( flag , title , options , def_opt , guard )
{
    // fields
    this.flag     = flag                 ;
    this.title    = title                ;
    this.options  = options.split( "," ) ;
    this.def_opt  = def_opt              ;
    this.guard    = guard                ;
    this.in_use   = true                 ;
    this.is_combo = (options != "int")   ;
    
    // methods
    this.display_menu              = display_menu            ;
    this.exec_guard                = exec_guard              ;
    this.activate                  = activate                ;
    this.get_combo                 = get_combo               ;
    this.get_text_field            = get_text_field          ;
    this.get_combo_title           = get_combo_title         ;
    this.fill_combo                = fill_combo              ;
    this.update_flag_value         = update_flag_value       ;
    this.update_flag_with_value    = update_flag_with_value  ;
    this.update_flag_with_index    = update_flag_with_index  ;
    this.set_flag_def_opt          = set_flag_def_opt        ;
    this.get_flag_value            = get_flag_value          ;
}


function display_menu ( )
{
   if ( this.is_combo )
       {
	   document.write( ' <div id="t_'  + this.flag + '">' ) ;
	   document.write( ' <div class="title">' + this.title ) ;
	   document.write( ' <select name="' + this.flag + '" class="select" onchange="update_menu(this)"></select>\n</div>\n</div>\n' ) ;
       }
   else
       {
	   document.write( ' <div id="t_'  + this.flag + '">' ) ;
	   document.write( ' <div class="title">' + this.title ) ;
	   document.write( ' <input name="' + 
	                      this.flag + 
                              '" class="text" onchange="update_menu(this)" value="' + 
                              this.def_opt + 
                              '">\n</div>\n</div>\n' ) ;
       }
}


function exec_guard ( )
{
    this.in_use = eval( this.guard ) ;
}


function activate ( v )
{
   var combo       = this.get_combo( )       ;
   var combo_t     = this.get_combo_title( ) ;
   
   combo.disabled = !v ;
      
//   if ( document.styleSheets )
     {
	if ( !ie )
       	     combo_t.style.visibility = (v)? 'visible': 'hidden' ;
	
	combo_t.style.height     = (v)? "auto" : 0 + "px" ;
     }
}


function get_combo ( )
{
  if ( gebn )
    return document.getElementByName( this.flag ) ;
  else
    return eval( "document.frmMenu." + this.flag ) ;
}


function get_text_field ( )
{
  return this.get_combo( ) ;
}


function get_combo_title ( )
{
  if ( n6 )
    return document.getElementById( "t_" + this.flag ) ;
  else if(ie)
    return document.all[ "t_" + this.flag ] ;
  else
    return eval( "t_" + this.flag ) ;
}


function update_flag_value ( )
{
    this.update_flag_with_value( this.options[ this.get_combo( ).selectedIndex ] ) ;
}


function set_flag_def_opt ( )
{
    this.update_flag_with_value( this.def_opt ) ;
}


function update_flag_with_index ( i )
{
    this.update_flag_with_value( this.options[ i ] ) ;
}


function update_flag_with_value ( value )
{
    eval( 'v_' + this.flag + '= "' + value + '"' ) ;
}


function get_flag_value ( )
{
    return eval( 'v_' + this.flag ) ;
}


function fill_combo ( )
{
  //   if ( !this.in_use )
  //      return ;

   if ( this.is_combo )
     {
	 var combo = this.get_combo( ) ;

	 clear( combo ) ;
	 
	 for ( var o = 0  ;  o < this.options.length ; o ++ )
	    {
	       combo.options[ combo.length ] = new Option( this.options[ o ] , this.options[ o ] ) ;
	  
	       if ( this.options[ o ] == this.get_flag_value( ) )
		    combo.selectedIndex = o ;
	    }
     }
   else // It has to be a text box!!!
     {
	 var textf = this.get_text_field( ) ;
	
	 textf.value = this.def_opt ;
     }
}


function clear ( combo )
{
   for ( var c = combo.length  ;  c > 0 ; c -- )
         combo.options[ c ] = null ;
}


//////////////////////
// Normal functions //
//////////////////////

function fill_menu_combo_by_number ( m )
{
   menus[ m ].fill_combo( ) ;
}


function flag_to_number ( flag )
{
   return eval( flag ) ;
}


function fill_menu_combo_by_name ( combo_name )
{
   var menu_number = flag_to_number( combo_name ) ;
   
   fill_menu_combo_by_number( menu_number ) ;
}


function draw_menus ( )
{
   for ( var m = 0  ;  m < menus.length  ;  m ++ )
	 menus[ m ].display_menu( ) ;
}


function fill_all_menu_combos ( )
{
   for ( var m = 0  ;  m < menus.length  ;  m ++ )  
     {
         fill_menu_combo_by_number( m ) ;
	 menus[ m ].activate( menus[ m ].in_use ) ;
     }
}


function exec_menu_guards ( )
{
   for ( var m = 0  ;  m < menus.length  ;  m ++ )
	 menus[ m ].exec_guard( ) ;
}


function update_def_values ( )
{
   for ( var m = 0  ;  m < menus.length  ;  m ++ )
         menus[ m ].set_flag_def_opt( ) ;
}


//////////////////////
//      HOOKS       //
//////////////////////

function update_menu ( combo , index )
{
   var cm = flag_to_number( combo.name ) ;
   
   menus[ cm ].update_flag_with_index( combo.selectedIndex ) ;

 
   for ( var m = 0  ;  m < menus.length  ;  m ++ )
      {
  	 var b4 = menus[ m ].in_use ; 
	 
	 menus[ m ].exec_guard( ) ;
	 
	 if ( b4 != menus[ m ].in_use )
	   {
	     //	     alert( menus[ m ].title + " changed" ) ;
              menus[ m ].activate( !b4 ) ;
	   }
      }
}



function submit_everything ( )
{
   for ( var m = 0  ;  m < menus.length  ;  m ++ )
	 menus[ m ].activate( true ) ;
	//get_combo( ).disabled = false ;
   
   return true ;
}


//////////////////////
//       INIT       //
//////////////////////

// CAUTION: Combos are not generated in this point, 
//          so we cannot access them.
function init ( )
{
   // we do have to init flags with defaults values
   update_def_values( ) ;
   
   // Lets see which menus have to be displayed
   exec_menu_guards( ) ;
}
