var mutexes = new Array();
var _MENU_MUTEX = 1;
var _SAVE_MUTEX = 2;
var _EDITOR_MUTEX = 3;


function xb_get_element(id)
{
  var el = document.all ? document.all[id] : document.getElementById(id);
  if (el)
    return el;
  else
    return null;
}

/** 
  generic tabs
*/
// highlight tab
function load_table_fangzi(sentfrom,numpage)
{
            var xhr_object = null; 
            if(window.XMLHttpRequest) // Firefox 
	            xhr_object = new XMLHttpRequest(); 
	        else if(window.ActiveXObject) // Internet Explorer 
	            xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
	        else { // XMLHttpRequest non supporté par le navigateur 
	            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
	            return; 
            } 
            var filename = "getresults.aspx";
            //var method   ="GET"
            xhr_object.open("POST", filename, false); 
            xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	        if(sentfrom=="searchkeyword1cn")
            {
                var sentvalue = document.getElementById("searchkeyword1cn").value;
                xhr_object.send("countnum=ok&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="searchkeyword1")
            {
                var sentvalue = document.getElementById("searchkeyword1").value;
                xhr_object.send("countnum=ok&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="rmb1")
            {
                var sentvalue = document.getElementById("rmb1").value+":"+document.getElementById("rmb2").value;
                xhr_object.send("countnum=rm&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="rmb1cn")
            {
                var sentvalue = document.getElementById("rmb1cn").value+":"+document.getElementById("rmb2cn").value;
                xhr_object.send("countnum=rm&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="yearselect")
            {
                var sentvalue = document.getElementById("yearselect").value;
                xhr_object.send("countnum=ys&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="yearselectcn")
            {
                var sentvalue = document.getElementById("yearselectcn").value;
                xhr_object.send("countnum=ys&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="nbrerooms")
            {
                var sentvalue = document.getElementById("nbrerooms").value;
                xhr_object.send("countnum=nr&sentvalue="+sentvalue); 
            }
            else if(sentfrom=="nbreroomscn")
            {
                var sentvalue = document.getElementById("nbreroomscn").value;
                xhr_object.send("countnum=nr&sentvalue="+sentvalue); 
            }
            else
            {
	            xhr_object.send("&countnum=ok"); 
	            //yearselectnbrerooms
	        //xhr_object.send("robert=de");
	        }  
	        if(xhr_object.readyState == 4) { 
	                
	                
	                if(typeof(xhr_object.responseText) != "undefined") {
	                     $('countnum').innerHTML=xhr_object.responseText;
	                     
	                }
	                else
	                {
	                    alert("reloux");
	                }
	        }
	        
            xhr_object.open("POST", filename, false); 
            xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr_object.send("sentfr="+sentfrom+"&numpage="+numpage); 
            //xhr_object.send("sentfr="+sentfrom); 
	        if(xhr_object.readyState == 4) { 
	                
	                
	                if(typeof(xhr_object.responseText) != "undefined") {
	                    
	                     $('resultpanel').innerHTML=xhr_object.responseText;
	                }
	                else
	                {
	                    alert("reloux");
	                }
	        }
	        
	        
}

function highlight_tab(tab,sb_prefix,sb_override,state)
{
  // override if currently selected
  // else highlight
  var search_type = xb_get_element(sb_prefix + 'search_type').value;
  if (search_type == sb_override)
    return;
  if (state)
  {
    tab.className = 'hilite';
  }
  else
  {
    tab.className = '';
  }
}
function validate_sb(boxid)
{
  if (xb_get_element('t_search_type') && typeof(RFilters)!='undefined')
  {
    if (xb_get_element('t_search_type').value == 'h')
    {
      RFilters.toggleLoadingMessage(1);
    }
  }
  var zsb = xb_get_element(boxid ? boxid : 'navsearch');
  if (zsb)
  {
    var tv = trim(zsb.value);
    if (tv=='' || tv==zsbdef)
    {
      alert('Please  enter a city, state, ZIP code, or address.');
      zsb.value = zsbdef;
      zsb.focus();
      return false;
    } 
    else 
      return true;
  }
}
function popWindow(url, name, width, height) 
{
  var x = (screen.width - width)/2;
  var y = (screen.height - height)/2;
  var opts = 'height=' + height + ',width=' + width + ",screenX=" + x + ",left=" + x + ",screenY=" + y + ",top=" + y + ',location=no,scrollbars=yes,menubar=no,resizable=no,status=no,toolbar=no';
  _nw = window.open(url, name, opts);
  _nw.focus();
}
// No scrollbars
function popWindowNew(url, name, width, height) 
{
  var x = (screen.width - width)/2;
  var y = (screen.height - height)/2;
  var opts = 'height=' + height + ',width=' + width + ",screenX=" + x + ",left=" + x + ",screenY=" + y + ",top=" + y + ',location=no,scrollbars=no,menubar=no,resizable=no,status=no,toolbar=no';
  _nw = window.open(url, name, opts);
  _nw.focus();}
function showVideo()
{
  var req = getHTTPObject();
  req.open("GET", site_root +'q_video_html.php');
  req.onreadystatechange =
    function()
    {
      if (req.readyState == 4)
      {
        var video = req.responseText;
        if (xb_get_element('real-estate-video'))
          xb_get_element('real-estate-video').innerHTML = video;
      }
    }
    req.send(null);
}
// generic toggle
function toggle_element(id, trigger_id, show_text, hide_text)
{
  if (!(e = document.getElementById(id)))
    return false;
  te = document.getElementById(trigger_id);
  if (e.style.display == 'none')
  {
    e.style.display = 'inline';
    if (te)
      te.innerHTML = hide_text;
  }
  else
  {
    e.style.display = 'none';
    if (te)
      te.innerHTML = show_text;
  }
}
// generic toggle
function toggle_element_triangle(id, trigger)
{
  var el = xb_get_element(id);
  if (!el)
    return;
  if (el.style.display == 'none')
  {
    unhide(id);
    trigger.className = trigger.className.replace(/srp_filter_closed/,'srp_filter_open');
  }
  else
  {
    hide(id);
    trigger.className = trigger.className.replace(/srp_filter_open/,'srp_filter_closed');
  }
}

function clear(f)
{
  if (xb_get_element(f))
    xb_get_element(f).value = '';
}

function unhide(f)
{
  if (xb_get_element(f))
    xb_get_element(f).style.display = 'inline';
}
function hide(f)
{
  if (xb_get_element(f))
    xb_get_element(f).style.display = 'none';
  // unhide selects
  if (navigator.appName.indexOf("Microsoft")!=-1)
    unhide_selects();
}
/*function setCookie(cookieName,cookieValue,expireDate) 
{
  if (typeof(expireDate)=='undefined')
    var expireDate = '';
  document.cookie = cookieName +"="+ escape(cookieValue) +";expires=\""+ expireDate +"\";path=/;";
}
function getCookie(name) 
{
  var start = document.cookie.indexOf( name + "=" );
  var len = start + name.length + 1;
  if ( ( !start ) &&
    ( name != document.cookie.substring( 0, name.length ) ) )
  {
    return null;
  }
  if ( start == -1 ) return null;
  var end = document.cookie.indexOf( ";", len );
  if ( end == -1 ) end = document.cookie.length;
  return unescape( document.cookie.substring( len, end ) );
}*/
// clear element and dependencies

// function to create an xml request object
function getHTTPObject()
{
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try
    {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e)
    {
      try
      {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (E)
      {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
    try
    {
      xmlhttp = new XMLHttpRequest();
    }
    catch (e)
    {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
function doNothing(e)
{
  if (!e)
  {
    var e = window.event;
  }
  e.cancelBubble = true;
  if (e.stopPropagation)
  {
    e.stopPropagation();
  }
}
// misc. text-related functions
function trim(s)
{
  if (!s)
    return '';
  return s.replace(/^\s*|\s*$/g,"");
}

function pull_address(s)
{
  if (s.indexOf('@') == 0)
    return s;
  else
    return s.substring(0, s.indexOf('@'));
}
function mel(m,s)
{
  var f = m + '@' + 'trulia' + '.' + 'com';
  document.write('<a href=\"mailto:' + f + (s ? '?subject=' + s : '') + '\">' + f + '</a>');
}
function bad_email_alert()
{
  alert("Please enter a valid email address, such as name@domain.com.");
}
// ajax login
var user_email = '';
var field_to_focus = '';
function hide_boxes()
{
  hide('login_box');
  restore_link('signup');
  restore_link();
}
function hide_boxescoco()
{
  hide('coco_box');
  restore_link('signup');
  restore_link();
}
function hide_boxessimilar()
{
  hide('similar_box');
  restore_link('signup');
  restore_link();
}
function hide_boxesfriend()
{
  hide('friend_box');
  restore_link('signup');
  restore_link();
}
function hide_boxessave()
{
  hide('save_box');
  restore_link('signup');
  restore_link();
}
function position_at_event(box_id, the_w, the_h, e, y_nudge)
{
  if (typeof(y_nudge)=='undefined')
    y_nudge = 0;
    
  var the_box = xb_get_element(box_id);
  if (!the_box)
    return;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  var c = get_eloc(e);
  var ww = c.ww;
  var wh = c.wh;
  var scrollTop = c.scrollTop;
  var posx = c.x;
  var posy = c.y;
  // offset
  if (posx + the_w > ww)
    posx = ww - the_w;
  if (posy + the_h > wh + scrollTop)
    posy = wh + scrollTop - the_h + y_nudge;
  if (posx < 0)
    posx = 0;
  if (posy < 0)
    posy = 0;
  the_box.style.position = 'absolute';
  the_box.style.top = posy + 'px';
  the_box.style.left = posx + 'px';
  // if this is for IE, hide the selects
  hide_selects(posx, posy, the_w, the_h);
}
function position_at_center(box_id, the_w, the_h)
{
  var the_box = xb_get_element(box_id);
  if (!the_box)
    return;
  var zcx,zcy;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (isie)
  {
    zcx = (document.body.clientWidth - the_w) / 2 - 100;
    zcy = document.body.clientHeight / 2 - 200;
  }
  else
  {
    zcx = (window.innerWidth - the_w) / 2;
    zcy = window.innerHeight / 2 - 200;
  }
  if (zcy < 20)
    zcy = 20;
  the_box.style.right = zcx + 'px';
  // take scroll into acct
  var clientSize = f_clientSize();
  var scrtop = clientSize.scrollTop;
  the_box.style.top = (zcy+scrtop) + 'px';
}
function center_div_on_page(obj)
{
  var div_width = parseInt(obj.style.width);
  var div_height = parseInt(obj.style.height);
  var isMSIE = false;

  var center_x,center_y;
  if (navigator.appName == "Microsoft Internet Explorer")
  {
    center_x = (document.body.clientWidth / 2);
    center_y = (document.body.clientHeight / 2);
  }
  else
  {
    center_x = (window.innerWidth / 2);
    center_y = (window.innerHeight / 2);
  }

  // Build obj of heigh/width params
  var clientParams = f_clientSize();
  obj.style.top = (center_y + clientParams.scrollTop) - Math.round(div_height/2) + 'px';
  obj.style.left = center_x - Math.round(div_width/2) + 'px';
}
function show_login(e, state, center)
{
  //var the_box = xb_get_element('login_box');
  var the_w = 310;
  var the_h = 260;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (state == 'login')
    the_h = 200;// hauteur de la fenetre login
  // show box near event
  if (e)// vrai dans le cas du login
  {
	position_at_event('login_box', the_w, the_h, e);
  }
  else
  {
    if (center == true)
    {
      position_at_center('login_box', the_w, the_h);
    }
    else
    {
      the_box.style.right = '0px';
      the_box.style.top = '20px';
    }
    close_modals_except('login_box');
  }
  unhide('login_box');
  toggle_login_form(state);
  if (state == 'login')
  {
    restore_link('login');
    restore_link('signup');
  }
  else
  {
    restore_link('signup');
    restore_link('login');
  }
}

function show_coco(e, state, center)
{
  var the_box = xb_get_element('coco_box');
  var the_w = 310;
  var the_h = 260;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (state == 'login')
    the_h = 200;// hauteur de la fenetre login
  // show box near event
  if (e)// vrai dans le cas du login
  {
	position_at_event('coco_box', the_w, the_h, e);
  }
  else
  {
    if (center == true)
    {
      position_at_center('coco_box', the_w, the_h);
    }
    else
    {
      the_box.style.right = '0px';
      the_box.style.top = '20px';
    }
    close_modals_except('coco_box');
  }
  unhide('coco_box');
  toggle_login_form(state);
  if (state == 'login')
  {
    restore_link('login');
    restore_link('signup');
  }
  else
  {
    restore_link('signup');
    restore_link('login');
  }
}
function show_friend(e, state, center)
{
  var the_box = xb_get_element('friend_box');
  var the_w = 310;
  var the_h = 260;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (state == 'login')
    the_h = 200;// hauteur de la fenetre login
  // show box near event
  if (e)// vrai dans le cas du login
  {
	position_at_event('friend_box', the_w, the_h, e);
  }
  else
  {
    if (center == true)
    {
      position_at_center('friend_box', the_w, the_h);
    }
    else
    {
      the_box.style.right = '0px';
      the_box.style.top = '20px';
    }
    close_modals_except('friend_box');
  }
  unhide('friend_box');
  toggle_login_form(state);
  if (state == 'login')
  {
    restore_link('login');
    restore_link('signup');
  }
  else
  {
    restore_link('signup');
    restore_link('login');
  }
}
function show_similar(e, state, center)
{
  var the_box = xb_get_element('similar_box');
  var the_w = 310;
  var the_h = 260;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (state == 'login')
    the_h = 200;// hauteur de la fenetre login
  // show box near event
  if (e)// vrai dans le cas du login
  {
	position_at_event('similar_box', the_w, the_h, e);
  }
  else
  {
    if (center == true)
    {
      position_at_center('similar_box', the_w, the_h);
    }
    else
    {
      the_box.style.right = '0px';
      the_box.style.top = '20px';
    }
    close_modals_except('similar_box');
  }
  unhide('similar_box');
  toggle_login_form(state);
  if (state == 'login')
  {
    restore_link('login');
    restore_link('signup');
  }
  else
  {
    restore_link('signup');
    restore_link('login');
  }
}
function show_save(e, state, center)
{
  var the_box = xb_get_element('save_box');
  var the_w = 310;
  var the_h = 260;
  var isie = (navigator.appName.indexOf("Microsoft")!=-1);
  if (state == 'login')
    the_h = 200;// hauteur de la fenetre login
  // show box near event
  if (e)// vrai dans le cas du login
  {
	position_at_event('save_box', the_w, the_h, e);
  }
  else
  {
    if (center == true)
    {
      position_at_center('save_box', the_w, the_h);
    }
    else
    {
      the_box.style.right = '0px';
      the_box.style.top = '20px';
    }
    close_modals_except('save_box');
  }
  unhide('save_box');
  toggle_login_form(state);
  if (state == 'login')
  {
    restore_link('login');
    restore_link('signup');
  }
  else
  {
    restore_link('signup');
    restore_link('login');
  }
}
function show_logout()
{
  hide('login_box');
}
// generic email form validation
function validate_email(the_field)
{
  if (!(emf = document.getElementById(the_field)))
    return false;
  emf_e = trim(emf.value);
  if (is_valid_email(emf_e,emf) == EMAIL_BAD_SYNTAX)
  {
    return false;
  }
  return true;
}

function is_valid_email(d)
{
  emf = document.getElementById(d);
  e = trim(emf.value).toLowerCase();
  if (e == '')
    return false;
  regex = /^\s*[a-z0-9-+\_\.]+@[a-z0-9-_\.]+\.[a-z]{2,4}\s*$/;
  if(!regex.test(e))
  {
    bad_email_alert();
    d.focus();
    return false;
  }
  return true;
}
function check_other(a,b,d,f,c)
{
    ok='1';
    ema = document.getElementById(a);
    emb = document.getElementById(b);
    emd = document.getElementById(d);
    emf = document.getElementById(f);
    emc = document.getElementById(c);
    e = trim(emc.value).toLowerCase();
    if (e == '')
      ok='0';
    regex = /^\s*[a-z0-9-+\_\.]+@[a-z0-9-_\.]+\.[a-z]{2,4}\s*$/;
    if(!regex.test(e))
    {
      bad_email_alert();
      ok='0';
    }
    if(emd.value!="" && emf.value!="")
    {
        if(emd.value!=emf.value)
        {
            emd.value='';
            emf.value='';
            alert("The password fields don't match");
            ok='0';
        }
    }
    else
    {
        alert("The password information are not filled");
        ok='0'
    }
    if(ema.value=="" || emb.value=="")
    {
        alert("One of some information are not filled");
        ok='0';
        
    }
    if(ok=='0')
    {

        return false;
        
    }
    else
    {
        return true;
    }
}

function go_to_page(page)
{
  window.location = site_root + page;
}
function toggle_select_boxes(state)
{
  var s = document.getElementsByTagName('select');
  var d = state > 0 ? 'inline' : 'none';
  for (var i = 0; i < s.length; ++i)
  {
    s[i].style.display = d;
  }
}
function resetif(id, resetval, ifval)
{ 
  var e = xb_get_element(id);
  if (e && (e.value == ifval || trim(e.value) == ''))
    e.value = resetval;
}
function clearif(id,val)
{
  var e = xb_get_element(id);
  if (e && e.value == val)
    e.value = '';
}
function pull_select_value(sid, type)
{
  var s = xb_get_element(sid);
  if (!s)
    return '';
  var e = s.options[s.selectedIndex];
  if (type == 'text')
    return e.text;
  else
    return e.value;
}
function hide_selects(left, top, width, height)
{
  return;
  if (navigator.appName.indexOf("Microsoft")==-1)
    return;
  var s = document.getElementsByTagName('select');
  var x,y,w;
  for (var i = 0; i < s.length; ++i)
  {
    x = findPosX(s[i]);
    y = findPosY(s[i]);
    w = findWidth(s[i]);
    if (w == 'NaN' || w < 0)
      w = 0;
    if (x + w >= left && x <= left + width && y >= top && y <= top + height)
    {
      s[i].style.display = 'none';
    }
  }
}
function unhide_selects()
{
  return;
  var s = document.getElementsByTagName('select');
  for (var i = 0; i < s.length; ++i)
    s[i].style.display = 'inline';
}
function findPosX(obj)
{
  var curleft = 0;
  if (obj.offsetParent)
  {
    while (obj.offsetParent)
    {
      curleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  }
  else if (obj.x)
    curleft += obj.x;
  return curleft;
}
function findPosY(obj)
{
  var curtop = 0;
  if (obj.offsetParent)
  {
    while (obj.offsetParent)
    {
      curtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  }
  else if (obj.y)
    curtop += obj.y;
  return curtop;
}
function findWidth(obj)
{
  var w = 0;
  if (obj.width && parseInt(obj.width) > 0)
    return parseInt(obj.width);
  else if (obj.style.width && parseInt(obj.style.width) > 0)
    return parseInt(obj.style.width);
  while (obj.parentNode || w <= 0)
  {
    if (obj.parentNode.style.width)
    {
      w = parseInt(obj.parentNode.style.width);
      return w;
    }      
    else if (obj.parentNode.width)
    {
      w = parseInt(obj.parentNode.width);
      return w;
    }
    else
    {
      obj = obj.parentNode;
    }
  }
  return w;
}

//returns event location
function get_eloc(e)
{
  if (!e && window.event)
    e = window.event;
  var posx, posy, scrtop, scrleft, ww, wh;
  var c = new Object;
  var clientSize = f_clientSize();
  ww = clientSize.width;
  wh = clientSize.height;
  scrtop = clientSize.scrollTop;
  scrleft = clientSize.scrollLeft;
  if (e.pageX || e.pageY)
  {
    posx = e.pageX;
    posy = e.pageY;
  }
  else if (e.clientX || e.clientY)
  {
    posx = e.clientX + scrleft;
    posy = e.clientY + scrtop;
  }
  c.x = posx;
  c.y = posy;
  c.ww = ww;
  c.wh = wh;
  c.scrollTop = scrtop;
  c.scrollLeft = scrleft;
  return c;
}
// captures event coords into global var zevt
function capture_coords(e)
{
  zevt = get_eloc(e);
}


// closes all div popups except for one
function close_modals_except(id)
{
  switch(id)
  {
    case 'email_box':
      close_error_window();
      set_show_prefs('li_box', 'li_show');
      hide('li_box');
      break;
    case 'error_box':
      set_show_prefs('li_box', 'li_show');
      hide('li_box');
      close_email_property_window();
      break;
    case 'login_box':
      close_error_window();
      close_email_property_window();
      close_email_search_window();
      break;
    case 'email_search_box':
      hide_boxes();
      hide('ea_form_top');
    default:
      break;
  }
}

function array_unique(a)
{
  var tmp = new Array();
  var al = a.length;
  for (var i = 0; i < al; ++i)
  {
    if (!in_array(a[i], tmp))
      tmp.push(a[i]);
  }
  return tmp;
}
function get_array_index(v, a)
{
  var found = -1;
  for (var i = 0; i < a.length; ++i)
  {
    if (a[i] == v)
    {
      found = i;
      break;
    }
  }
  return found;
}
function f_clientSize()
{
  var c = new Object;
  c.width = f_clientWidth();
  c.height = f_clientHeight();
  c.scrollLeft = f_scrollLeft();
  c.scrollTop =  f_scrollTop();
  return c;
}
function f_clientWidth() 
{
  return f_filterResults 
  (
    window.innerWidth ? window.innerWidth : 0,
    document.documentElement ? document.documentElement.clientWidth : 0,
    document.body ? document.body.clientWidth : 0
  );
}
function f_clientHeight() 
{
  return f_filterResults 
  (
    window.innerHeight ? window.innerHeight : 0,
    document.documentElement ? document.documentElement.clientHeight : 0,
    document.body ? document.body.clientHeight : 0
  );
}
function f_scrollLeft() 
{
  return f_filterResults 
  (
    window.pageXOffset ? window.pageXOffset : 0,
    document.documentElement ? document.documentElement.scrollLeft : 0,
    document.body ? document.body.scrollLeft : 0
  );
}
function f_scrollTop() 
{
  return f_filterResults 
  (
    window.pageYOffset ? window.pageYOffset : 0,
    document.documentElement ? document.documentElement.scrollTop : 0,
    document.body ? document.body.scrollTop : 0
  );
}
function f_filterResults(n_win, n_docel, n_body) 
{
  var n_result = n_win ? n_win : 0;
  if (n_docel && (!n_result || (n_result > n_docel)))
    n_result = n_docel;
  return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
function add_bookmark(url, title)
{
  if (window.external) 
    window.external.AddFavorite(url, title); 
  else
  {
    if (navigator.userAgent.toLowerCase().indexOf('safari') > -1)
      alert('To bookmark this page, press the command key + D.');
    else    
      alert('Right-click anywhere on the page and select Bookmark This Page... in the popup menu.');
  }
}

// returns array of IDs for tags of type tag whose IDs begin with prefix
function get_ids_with_prefix(tag,prefix)
{
  var s = new Array();
  var e = document.getElementsByTagName(tag);
  for (var i = 0; i < e.length; ++i)
  {
    if (e[i].id && e[i].id.indexOf(prefix) == 0)
      s.push(e[i].id);
  }
  return s;
}
// hide filter menus
function close_all_menus(e)
{
  if(typeof(e) == 'undefined')
    var e = window.event;
  if (e)
    doNothing(e);
  toggle_menu(e,mutexes[_MENU_MUTEX],0);
  release_mutex(_MENU_MUTEX);
}
// toggles filter menus
function toggle_menu(e,mid,state)
{
  var menu = xb_get_element(mid);
  if (!menu)
    return;
  if (window.event)
    window.event.cancelBubble = true;
  else
    if (e && e.stopPropagation)
      e.stopPropagation();
  // open
  if (xb_get_element(mid).style.display == 'none' && state != 0 || state == 1)
  {
    // if you can't set the mutex, clear that one mutex
    if (!set_mutex(_MENU_MUTEX, mid))
    {
      hlt_menu(e,xb_get_element(mutexes[_MENU_MUTEX]),0);
      hide(mutexes[_MENU_MUTEX]);
      release_mutex(_MENU_MUTEX);
    }
    unhide(mid);
    hlt_menu(e,menu,2);
    set_mutex(_MENU_MUTEX, mid);
    return;  
  }
  // close
  if (xb_get_element(mid).style.display == 'inline' && state != 1 || state == 0)
  {
    hide(mid);
    hlt_menu(e,menu,0);
    release_mutex(_MENU_MUTEX);
  }
}
// hlt menu title
function hlt_menu(e,menu,state)
{
  // get title
  var menut = menu.previousSibling;
  if (typeof(menut.className) == 'undefined' || menut.className.indexOf('menu_title') < 0)
    return;
  switch(state)
  {
    case 1:
      menut.className = 'menu_title_h';
      break;
    case 2:
      menut.className = 'menu_title_active';
      break;
    case 0:
    default:
      menut.className = 'menu_title';
      break;
  }
}

var save_queue = new Queue();
var sub_queue = new Queue();

// ******************************
// **** mutex management fns ****
// ******************************
// mutex release
function release_mutex(type)
{
  set_mutex(type, null);
}
// check on the mutex
function is_mutex_free(type)
{
  return (typeof(mutexes[type]) == 'undefined' || mutexes[type] == null);
}
// set a mutex
function set_mutex(type, value)
{
  // can't set mutex if already exists
  if (!is_mutex_free(type) && value != null)
  {
    return false;
  }
  else
  {
    mutexes[type] = value;
    return true;
  }
}

