var browser = "";
var max_get_length = 1536; // 1.5KB

var filter_settings = null;
var filter_request_sequence_number = 1;
var filter_request_sequence_number_applied = 0;

var items_per_page = 10;
var paging_dialog_items = new Array();

var dialog = null;

var space_options =
[ 
  { space:"undefined", label: "Undefined", count:null },
  { space:"news", label: "News", count:null },
  { space:"talk", label: "Talks", count:null },
  { space:"ad", label: "Ads", count:null },
  { space:"blog", label: "Blogs", count:null },
  { space:"article", label: "Articles", count:null },
  { space:"photo", label: "Photo Feeds", count:null },
  { space:"video", label: "Video Feeds", count:null },
  { space:"audio", label: "Audio Feeds", count:null },
  { space:"printed", label: "Printed", count:null }
];

var category_map = undefined;

function create_dialog(dlg, save_func)
{
  el_attach_event(document, "mousedown", dialog_mousedown);
//  el_attach_event(document, "keydown", dialog_keydown);
//  document.onmousedown = dialog_mousedown;
  document.onkeydown = dialog_keydown;

  dlg.on_ok = save_func;
  dialog = dlg;
}

function dialog_mousedown(e)
{
  var target = el_target(e);
 
  if(dialog != null)
  {
    for(var el = target; el != null; el = el.parentNode)
    {
      if(el.id == dialog.id)
      {
        return;
      }
    }

    close_dialog();
  }
}

function dialog_keydown(e) 
{
  if(dialog != null)
  {
    var evt = e || window.event;
  
    if(evt.keyCode == 27)
    {
      close_dialog();
    }
    else if(evt.keyCode == 13)
    {
      if(dialog.on_ok != null)
      {
        dialog.on_ok();
        return false;
      }
    }
  }
}

function close_dialog()
{
  if(dialog != null)
  {
    dialog.innerHTML = "";
    dialog = null;
  }
}

function extract_param(param, query)
{
  var pos = query.indexOf(param);

  if(pos > 0)
  {
    param = "&" + param;
    pos = query.indexOf(param);
  }

  if(pos < 0)
  {
    return { param:"", found:false, query:query };
  }

  var offset = pos + param.length;
  var end = query.indexOf("&", offset);

  var res = { param:"", found:true, query:"" };

  if(end < 0)
  {
    res.param = query.slice(offset);
    res.query = query.slice(0, pos);
  }
  else
  {
    res.param = query.slice(offset, end);
    if(pos == 0) end++;
    res.query = query.slice(0, pos) + query.slice(end);
  }
  
  return res;
}

function navigate(url)
{
  if(window.mod_prepost !== undefined)
  {
    url = mod_prepost(url);
  }

  if(url.length > max_get_length)
  {
    el_post_url(url);
  }
  else
  {
    window.location = url;
  }  
}

function informer_params(just_style_flag)
{
  if(el_by_id("ir_msg_count") == null)
  {
    return "";
  }

  var res = just_style_flag === undefined ? "ir=1" : "";

  for(var i = 0; i < informer_options.length; ++i)
  {
    var io = informer_options[i];

    if(just_style_flag !== undefined && just_style_flag != io.just_style)
    {
      continue;
    }

    var value = informer_option(io.id);

    if(value == io.def)
    {
      continue;
    }

    res += (res == "" ? "" : "&") + io.param + "=" + el_mime_url_encode(value);
  }

  return res;
}

function post(ref_index, create_informer_mode, extra_post_refs)
{
  if(create_informer_mode)
  {
    var refs = extra_post_refs ? post_refs2 : post_refs;
    var parts = refs[ref_index].split("?", 2);
    var url = parts[0] + "?" + informer_params();

    if(parts.length > 1)
    {
      url += "&" + parts[1];
    }

    el_post_url(url);
  }
  else
  {
    var url = post_refs[ref_index];
    
    if(window.mod_prepost !== undefined)
    {
      url = mod_prepost(url);
    }

    el_post_url(url);
  }
}

function show_settings_dialog(extra_params)
{
  var place_holder = el_by_id("settings_ph");

  place_holder.extra_params = extra_params;
  
  var text = "<div id='settings_dialog' class='dialog'>\
<table id='settings_dialog_option_table'>";

  text += "<tr><td><label for='interface_lang'>\
Interface Language:</label></td><td><select id='interface_lang'>";

  var interface_langs = 
  [ 
    { id:"eng", label: "English" }, 
    { id:"rus", label: "Russian" }
  ];

  for(var i = 0; i < interface_langs.length; i++)
  {
    var opt = interface_langs[i];
    
    text += "<option id=\"il_" + opt.id + "\" " + 
            (current_language == opt.id ? 
            "selected=\"true\"" : "") + ">" + opt.label + 
            "</option>";
  }

  text += "</select><td></tr>"

  var options = 
  [ 
    { param:"n", 
      label:"Messages Language:", 
      current:search_filter_lang,
      xml:"language"
    },
    { param:"y", 
      label:"Message Sources Country:", 
      current:search_filter_country,
      xml:"country"
    }
  ];

  for(var i = 0; i < options.length; i++)
  {
    var opt = options[i];
    var id = "fo_" + opt.param + "_" + opt.xml;

    text += "<tr><td>";


    text += "<label for=\"" + id + "\">" + opt.label + 
            "</label></td><td>";

    text += "<select id='" + id + 
            "' name='filter_options' onchange='filter_option_changed()'>";


    text += "<option id='" + opt.current + 
            "' selected='true' disabled='true'>Loading ...</option>";

    text += "</select></td></tr>";
  }


  text += "<tr><td><label for='sort_settings'>\
Sort Messages By:</label></td><td><select id='sort_settings'>";

  var sort_options = 
  [ 
    { id:0, label: "Relevance&#xA0;Descending" }, 
    { id:8, label: "Popularity&#xA0;Descending" },
    { id:1, label: "Publication&#xA0;Date&#xA0;Descending" },
    { id:3, label: "Fetch&#xA0;Date&#xA0;Descending" },
    { id:6, label: "Event&#xA0;Size&#xA0;Descending" },
    { id:5, label: "Relevance&#xA0;Ascending" },
    { id:9, label: "Popularity&#xA0;Ascending" },
    { id:2, label: "Publication&#xA0;Date&#xA0;Ascending" },
    { id:4, label: "Fetch&#xA0;Date&#xA0;Ascending" },
    { id:7, label: "Event&#xA0;Size&#xA0;Ascending" }
  ];

  for(var i = 0; i < sort_options.length; i++)
  {
    var opt = sort_options[i];
    
    text += "<option id=\"so_" + opt.id + "\" " + (sorting_type == opt.id ? 
            "selected=\"true\"" : "") + ">" + opt.label + 
            "</option>";
  }

  text += "</select><td></tr><tr><td><label for='rpp_settings'>\
Display Results Per Page:</label></td><td><select id='rpp_settings'>";

  var results_per_page_options = [ 10, 20, 30, 50, 100 ];

  for(var i = 0; i < results_per_page_options.length; i++)
  {
    var rp = results_per_page_options[i];
    
    text += "<option id=\"rp_" + rp + "\" " + (results_per_page == rp ? 
            "selected=\"true\"" : "") + ">" + rp + 
            "</option>";
  }

  text += "</select><td></tr>";

  var bool_settings = 
  [ 
    { param:"b", on:"0", off:"3", label: "Include Message Duplicates", def: 0 },
    { param:"e", on:"0", off: "1", label: "Show Message Annotations", def: 1 }, 
    { param:"i", on:"1", off: "0", label: "Show Message Images", def: 1 },
    { param:"c", on:"2", off:"1", label: "Display Messages In 2 Columns", def: 1 },
    { param:"p", on:"l", off:"s", label: "Display Messages With Large Print", def: 0 }
  ];

  for(var i = 0; i < bool_settings.length; i++)
  {
    var opt = bool_settings[i];
    var id = "bo_" + opt.param + "_" + opt.on + "_" + opt.off + "_" + opt.def;

    text += "<tr><td colspan='2'><input type='checkbox' id='" + id + 
            "' name='bool_settings'";

    if(view_option[opt.param] == opt.on)
    {
      text += " checked=\"checked\"";
    }

    text += "/><label for='" + id + "'>" + opt.label + "</label></td></tr>"
  }

  text += "</table><div id='settings_dialog_warn'>Note: settings will not be saved if cookies have been disabled in your browser.</div>\
<button onclick='dialog.on_ok();'>Save</button>&nbsp;\
<button onclick='set_default_settings();'>Restore&nbsp;Defaults</button>&nbsp;\
<button onclick='close_dialog();'>Cancel</button></div>";

  place_holder.innerHTML = text;

  create_dialog(place_holder, save_settings);
  filter_option_changed();
}

function filter_option_changed()
{
  var elems = document.getElementsByName("filter_options");
  var changed = false;

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var options = elem.options;

    for(var j = 0; j < options.length; j++)
    {
      var opt = options[j];
      var pos = opt.text.lastIndexOf("(");
      
      if(pos >= 0)
      {
        opt.text = opt.text.slice(0, pos);
      }
    }
  }

  filter_settings = new Array();
  filter_settings.request_sequence_number = filter_request_sequence_number++;

  send_filter_settings_request(false);
}

function send_filter_settings_request(every)
{
  var elems = document.getElementsByName("filter_options");

  var request;

  try
  {
    request = new ActiveXObject("Msxml2.XMLHTTP");
  }
  catch(e)
  {
    request = new XMLHttpRequest();
  }

  var data = 
  { req: request, 
    sel_indexes: new Array(),
    sequence_number: filter_settings.request_sequence_number,
    every: every
  };

  request.onreadystatechange = 
   get_update_filter_items_request_onreadystatechange(data);

  var params = "t=x&z=bh&s=1&r=0";

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var p = elem.id.split("_", 3)[1];
    var id = elem.options[elem.selectedIndex].id;

    params += "&" + p + "=" + el_mime_url_encode(id);
    data.sel_indexes[p] = id;
  }

  if(every)
  {
    params += "&q=EVERY";
  }
  else
  {
    params += "&" + search_query;
  }

  request.open("POST", search_path, true);

  request.setRequestHeader("Content-type", 
                           "application/x-www-form-urlencoded");
  
  request.send(params);
}

function save_settings()
{
  var settings = el_by_id("interface_lang");
  var lang = settings.options[settings.selectedIndex].id.split("_", 2)[1];
  
  var current_path = window.location.href.split("?")[0];

  if(search_path == current_path && !moderation_mode)
  {
    var parts = search_path.split("/");
    current_path = "";

    for(var i = 0; i < parts.length; i++)
    {
      if(i) current_path += "/";
      current_path += i == 4 && parts[i] != "search" ? lang : parts[i];
    }

    current_path += "?";
  }
  else
  {
    current_path += "?lang=" + lang + "&";
  }

  if(dialog.extra_params != "")
  {
    current_path += dialog.extra_params + "&";
  }

  settings = el_by_id("sort_settings");
  var opt = settings.options[settings.selectedIndex];
  var sort_mode = opt.id.split("_", 2)[1];

  var url = current_path + "slg=1&a=s-" + sort_mode;

  search_query = 
    extract_param("a=", extract_param("slg=", search_query).query).query;

  var elems = document.getElementsByName("filter_options");

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var opt_vals = elem.id.split("_", 3);
    var optv = opt_vals[1] + "=";

    url += "&" + optv + "s-" + 
      el_mime_url_encode(elem.options[elem.selectedIndex].id);

    search_query = extract_param(optv, search_query).query;
  }

  settings = el_by_id("rpp_settings");
  opt = settings.options[settings.selectedIndex];

  if(settings.selectedIndex >= 0)
  {
    var rpp = opt.id.split("_", 2)[1];
    url += "&r=s-" + rpp;
    search_query = extract_param("r=", search_query).query;
  }

  elems = document.getElementsByName("bool_settings");

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var opt_vals = elem.id.split("_", 5);
    var optv = opt_vals[1] + "=";

    url += "&" + optv + "s-" + 
      el_mime_url_encode(elem.checked ? opt_vals[2] : opt_vals[3]);

    search_query = extract_param(optv, search_query).query;
  }

  if(search_query != "")
  {
    url += "&" + search_query;
  }

  close_dialog();
  navigate(url);
}

function set_default_settings()
{
  var select = el_by_id("interface_lang");
  var elems = select.options;

  var eng_index = -1;
  var i = 0;
  for(; i < elems.length; i++)
  {
    var elem = elems[i];
    var opt_vals = elem.id.split("_", 2);
    var lang = opt_vals[1];
    
    if(lang == default_language)
    {
      select.selectedIndex = i;
      break;
    }
    else if(lang == "eng")
    {
      eng_index = i;
    }
  }

  if(i == elems.length && eng_index >= 0)
  {
    select.selectedIndex = eng_index;
  }

  elems = document.getElementsByName("filter_options");
  var sel_changed = false;

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i]

    if(elem.selectedIndex)
    {
      elem.selectedIndex = 0;
      sel_changed = true;
    }
  }

  if(sel_changed)
  {
    filter_option_changed();
  }

  el_by_id("sort_settings").selectedIndex = 0;
  el_by_id("rpp_settings").selectedIndex = 0;
  
  var elems = document.getElementsByName("bool_settings");

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var opt_vals = elem.id.split("_", 5);
    elem.checked = opt_vals[4] == "1";
  }
}

function update_filter_items(request, sel_indexes, every)
{
  var elems = document.getElementsByName("filter_options");
  var changed = false;

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    var elem_id = elem.id;

    var j = 0;
    for(; j < filter_settings.length && filter_settings[j].id != elem_id; j++);

    var filter;

    if(j < filter_settings.length)
    {
      filter = filter_settings[j];
    }
    else
    {
      filter = { id: elem_id, options: new Array() };
      filter_settings.push(filter);
    }

    var vals = elem_id.split("_", 3);
    var param = vals[1];
    var xml_elem_name = vals[2];

    var elements = el_child_node(el_child_node(el_child_node(
                                 request.responseXML, 
                                 "result"), 
                                 "stat"), 
                                 xml_elem_name).childNodes;

    var selected_item_id = sel_indexes[param];

    var filter_options = filter.options;

    for(var j = 0; j < elements.length; j++)
    {
      var element = elements[j];

      if(element.tagName == "item")
      {
        var id = el_child_text(element, "id");
        var value = el_child_text(element, "val");
        var count = parseInt(element.getAttribute("count"));

        var k = 0;
        for(; k < filter_options.length && filter_options[k].id != id; k++);

        var option;
        if(k < filter_options.length)
        {
          option = filter_options[k];
        }
        else
        {
          if(!every && !count)
          {
            continue;
          }

          option = { id: id, 
                     value: value, 
                     req_count: 0, 
                     total_count: 0, 
                     selected: id == selected_item_id 
                   };

          filter_options.push(option);
        }

        if(every)
        {
          option.total_count = count;
        }
        else
        {
          option.req_count = count;
        }
      }
    }
  }

  if(!every)
  {
    send_filter_settings_request(true);
    return;
  }

  var changed = false;
  var is_msie = browser == "msie";

  for(var i = 0; i < filter_settings.length; i++)
  {
    var elem_id = filter_settings[i].id;
    var elem = el_by_id(elem_id);

    var options = elem.options;

    while(options.length)
    {
      elem.remove(0);
    }

    var filter_options = filter_settings[i].options;
    var selected = false;

    var j = 1;
    for(; j < filter_options.length && filter_options[j].req_count; j++);

    var highlight = j < filter_options.length;

    for(j = 0; j < filter_options.length; j++)
    {
      var fopt = filter_options[j];

      if(!is_msie && j && filter_options[j - 1].req_count && 
         fopt.req_count == 0)
      {
        var opt = document.createElement('option');
        opt.innerHTML = "&mdash;";
        opt.disabled = true;

        try
        {
          elem.add(opt, null); // standards compliant
        }
        catch(ex)
        {
          elem.add(opt); // IE only
        }
      }

      var opt = document.createElement('option');

      opt.id = fopt.id;
      
      var text = fopt.value + " (";

      if(fopt.total_count != fopt.req_count)
      {
        text += fopt.req_count + " of ";
      }

      text += fopt.total_count + ")";
      opt.text = text;

      if(fopt.selected)
      {
        opt.selected = true;
        selected = true;
      }
   
      try
      {
        elem.add(opt, null); // standards compliant
      }
      catch(ex)
      {
        elem.add(opt); // IE only
      }

      if(is_msie && j && highlight && !fopt.req_count)
      {
        options[options.length - 1].style.color = "rgb(70,70,70)";
      }
    }

    elem.disabled = false;      

    if(!selected)
    {
      elem.selectedIndex = 0;
      changed = true;
    }
  }

  if(changed)
  {
    filter_option_changed();
  }
}

function get_update_filter_items_request_onreadystatechange(data)
{
  var onready = function()
  { 
    if(data.req.readyState == 4)
    {
      var dlg = el_by_id("settings_dialog");

      if(dlg != null)
      {
        switch(data.req.status)
        {
          case 200:
          {
            if(filter_settings != null &&
               filter_settings.request_sequence_number == data.sequence_number)
            {
              update_filter_items(data.req, data.sel_indexes, data.every);
            }

            break;
          }
          default:
          {
            alert("Server communication failure. Error code: " + 
                  data.req.status);
            break;
          }
        }
      }
      
    }
  }

  return onready;
}

function fill_items_table(index)
{
  var items = paging_dialog_items[dialog.items_key];
  var area = el_by_id("paging_dialog_area");

  var searched_items = null;
  var search = dialog.search.toLowerCase();

  if(search == "")
  {
    searched_items = items;
  }
  else
  {
    searched_items = { values:new Array(), current:-1};

    for(var i = 0; i < items.values.length; i++)
    {
      var id = items.values[i].id;

      if(id == "" || id.toLowerCase().indexOf(search) >= 0 ||
         items.values[i].value.toLowerCase().indexOf(search) >= 0)
      {
        if(i == items.current)
        {
          searched_items.current = searched_items.values.length;
        }

        searched_items.values.push(items.values[i]);
      }
    }
  }

  var paging_dialog = el_by_id("paging_dialog_stat");

  paging_dialog.innerHTML = searched_items.values.length + "/" + 
    items.values.length;

  if(index == null)
  {
    index = searched_items.current < 0 ? 0 :
       (Math.floor(searched_items.current / items_per_page) * items_per_page);
  }

  var text = "Page:";

  var pages = Math.ceil(searched_items.values.length / items_per_page);
  var curr_page = Math.floor(index / items_per_page);

  if(curr_page)
  {
    text += "&#xA0;<a href=\"javascript:fill_items_table(" + 
            (curr_page - 1) * items_per_page + ")\">&lt;</a>";
  }

  var pages_in_bar = 10;

  var from = Math.max(curr_page - pages_in_bar / 2, 0);
  var to = Math.min(from + pages_in_bar, pages);

  for(var i = from; i < to; i++)
  {
    if(i == curr_page)
    {
      text += "&#xA0;" + (i + 1);
    }
    else
    {
      text += "&#xA0;<a href=\"javascript:fill_items_table(" + 
              i * items_per_page + ")\">" + (i + 1) + "</a>";
    }
  }

  if(curr_page + 1 < pages)
  {
    text += "&#xA0;<a href=\"javascript:fill_items_table(" + 
            (curr_page + 1) * items_per_page + ")\">&gt;</a>";
  }

  var last = Math.min(searched_items.values.length, 
                      index + items_per_page);

  text += "<table class=\"option_select_table\">";

  for(var i = index; i < last; i++)
  {
    var item = searched_items.values[i];

    var a_tag1 = "<a href=\"" + make_source_url(item.id, true) + "\">";
    var a_tag2 = "<a href=\"" + make_source_url(item.id, false) + "\">";

    var url_text = item.id.length > 63 ? (item.id.substr(0, 60) + "...") : 
                   item.id;

    text += "<tr class='" + (i == searched_items.current ? 
            "paging_dialog_selected_row" : "paging_dialog_row") + 
            "'><td align='right' class='paging_dialog_counter_cell'>" + 
            a_tag1 + item.count +
            "</a></td><td class='paging_dialog_cell'>" + a_tag2 + 
            highlight_search(url_text, search) + 
            "</a></td><td class='paging_dialog_cell'>" + 
            highlight_search(item.value, search) + "</td></tr>";
  }

  text += "</table>";
  area.innerHTML = text;  
}

function highlight_search(text, search)
{
  if(search == "")
  {
    return el_xml_encode(text);
  }
  
  var res = "";
  var lwr_text = text.toLowerCase();
  var search_len = search.length;
  
  var begin = 0;
  var pos;

  while((pos = lwr_text.indexOf(search, begin)) >= 0)
  {
    res += el_xml_encode(text.slice(begin, pos)) + 
           "<span class='found_word'>" + 
           el_xml_encode(text.slice(pos, pos + search_len)) + "</span>";

    begin = pos + search_len;
  }

  if(begin != lwr_text.length)
  {
    res += el_xml_encode(text.slice(begin));
  }

  return res;
}

function make_source_url(feed, as_filter)
{
  var url = source_url(feed, as_filter);

  if(url.length > max_get_length || window.mod_prepost !== undefined)
  {
    return "javascript:set_source('" + el_mime_url_encode(feed) + 
           "'," + as_filter + ");";
  }
  else
  {
    return url;
  }  
}

function source_url(feed, as_filter)
{
  var url = search_path + "?";

  if(dialog.extra_params != "")
  {
    url += dialog.extra_params + "&";
  }

  var query = "";

  if(as_filter)
  {
    var res = extract_param("v=", search_query);

    if(res.param == "A")
    {
      url += "v=S" + el_mime_url_encode(feed);
      query = res.query;
    }
    else
    {
      url += "f=" + el_mime_url_encode(feed);
      var res = extract_param("f=", search_query);
      query = res.query;
    }
  }
  else
  {
    url += "v=S" + el_mime_url_encode(feed);

    var res = extract_param("v=", search_query);
    res = extract_param("f=", res.query);
    res = extract_param("g=", res.query);
    res = extract_param("h=", res.query);

    query = res.query;
  }
  
  if(query != "")
  {
    url += "&" + query;
  }

  return url;
}

function set_source(feed, as_filter)
{
  navigate(source_url(feed, as_filter));
}

function fill_paging_dialog(index)
{
  var paging_dialog = el_by_id("paging_dialog");
    
  if(paging_dialog == null)
  {
    return;
  }

  var items = paging_dialog_items[dialog.items_key];

  if(items == undefined)
  {
    paging_dialog.innerHTML = "Loading ...";

    var request;

    try
    {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      request = new XMLHttpRequest();
    }

    var data = 
    { req:request, 
      items_key:dialog.items_key,
      xml_element_name:dialog.xml_element_name
    };

    request.onreadystatechange = 
      get_items_request_onreadystatechange(data);

    res = extract_param("f=", search_query);
    var f = res.param;
    var query = res.query;

    if(f != "")
    {
      var new_q = "q=URL " + f;

      res = extract_param("q=", res.query);
      var q = res.param;
      query = res.query;

      if(q != "")
      {
        new_q += " AND ( " + q + " )";
      }

      query = new_q + "&" + query;
    }

    var params = "t=x&z=k&s=1&r=0&" + query;

    request.open("POST", search_path, true);

    request.setRequestHeader("Content-type", 
                             "application/x-www-form-urlencoded");
  
    request.send(params);
    return;
  }

  var text = "";

  text += "<div id='paging_dialog_header'>Search: \
<input type='text' id='paging_dialog_search'/>\
<span id='paging_dialog_stat'></span></div>";

  text += "<div id='paging_dialog_area'></div>\
<button onclick='close_dialog();'>Close</button>";
  paging_dialog.innerHTML = text;

  var edit = el_by_id("paging_dialog_search");
  edit.focus();

  fill_items_table(index);
}

function get_items_request_onreadystatechange(data)
{
  var onready = function()
  { 
    if(data.req.readyState == 4)
    {
      var paging_dialog = el_by_id("paging_dialog");

      if(paging_dialog != null)
      {
        switch(data.req.status)
        {
          case 200:
          {
            if(paging_dialog != null)
            {
              paging_dialog.innerHTML = "Reading ...";
            }

            setTimeout(function() 
                       { 
                         process_items_request(data.req, 
                                               data.items_key, 
                                               data.xml_element_name); 
                       }, 
                       0);

            break;
          }
          default:
          {
            alert("Server communication failure. Error code: " + 
                  data.req.status);
            break;
          }
        }
      }
      
    }
  }

  return onready;
}

function process_items_request(request, items_key, xml_element_name)
{
  if(paging_dialog_items[items_key] != undefined)
  {
    return;
  }

  var elements = el_child_node(el_child_node(el_child_node(
                               request.responseXML, 
                               "result"), 
                               "stat"), 
                               xml_element_name).childNodes;


  var items = { values:new Array(), current:-1};
  paging_dialog_items[items_key] = items;

  for(var i = 0; i < elements.length; i++)
  {
    var element = elements[i];

    if(element.tagName == "item")
    {
      var item = 
      { id:el_child_text(element, "id"), 
        value:el_child_text(element, "val"),
        count:element.getAttribute("count")
      };

      if(item.id != "")
      {
        if(element.getAttribute("selected") == "true")
        {
          items.current = items.values.length;
        }

        items.values.push(item);
      }
    }
  }

  fill_paging_dialog(null);
}

function search_items()
{
  if(dialog == null)
  {
    return;
  }

  var edit = el_by_id("paging_dialog_search");

  if(edit != null)
  {
    if(edit.value == dialog.search)
    {
      if(dialog.search_changed)
      {
        dialog.search_changed = false;
        fill_items_table(null);
      }
    }
    else
    {
      dialog.search = edit.value;
      dialog.search_changed = true;
    }
  }

  setTimeout("search_items()", 500);
}

function show_paging_dialog(xml_element_name, extra_params)
{
  var ph_id = xml_element_name + "_ph";
  var place_holder = el_by_id(ph_id);

  place_holder.extra_params = extra_params;

  var text = "<div id=\"paging_dialog\" class=\"dialog\"></div>"

  place_holder.innerHTML = text;
  place_holder.search = "";
  place_holder.items_key = ph_id;
  place_holder.xml_element_name = xml_element_name;

  create_dialog(place_holder, null);

  fill_paging_dialog(null);
  search_items();
}

function space_opt_cmp(a, b)
{
  return a.label == b.label ? 0 : a.label < b.label ? -1 : 1;
}

function render_spaces(spaces, selected, separate)
{
  spaces.sort(space_opt_cmp);

  var text = "";

  for(var i = 0; i < spaces.length; i++)
  {
    var opt = spaces[i];

    text += '<div class="' + 
            (i == 0 && separate ? 'separated_space_option' : 'space_option');

    var id = "sp_" + opt.space;

    text += '"><input type="checkbox" id="' + id + '" name="space_options"';

    if(selected)
    {
      text += ' checked="checked"';
    }

    text += '/><label id="lsp_' + opt.space + '" for="' + id + '">' + 
            opt.label + "</label></div>";
  }

  return text;
}

function show_spaces_dialog(extra_params)
{
  var place_holder = el_by_id("spaces_ph");

  place_holder.extra_params = extra_params;
  
  var text = "<div id='space_dialog' class='dialog'>\
<div id='space_dialog_options'>";

  var filter_spaces = search_filter_spaces.split(" ");

  var selected_spaces = new Array();
  var not_selected_spaces = new Array();

  for(var i = 0; i < space_options.length; i++)
  {
    var opt = space_options[i];

    if(el_array_find(filter_spaces, opt.space) >= 0)
    {
      selected_spaces.push(opt);
    }
    else
    {
      not_selected_spaces.push(opt);
    }
  }

  if(selected_spaces.length == 0)
  {
    selected_spaces = not_selected_spaces;
    not_selected_spaces = new Array();
  }

  text += render_spaces(selected_spaces, true, false);

  text += 
    render_spaces(not_selected_spaces, false, selected_spaces.length > 0);

  text += "</div><div id='settings_dialog_warn'>Note: settings will not be saved if cookies have been disabled in your browser.</div>\
<div id='space_dialog_buttons'>\
<button onclick='dialog.on_ok();'>Save</button>&nbsp;\
<button onclick='set_default_spaces();'>Select&nbsp;all</button>&nbsp;\
<button onclick='close_dialog();'>Cancel</button></div>";

  text += "</div>";

  place_holder.innerHTML = text;

  create_dialog(place_holder, save_spaces);
  fill_spaces_dialog();
}

function save_spaces()
{
  var url = window.location.href.split("?")[0] + "?";

  if(this.extra_params != "")
  {
    url += this.extra_params + "&";
  }

  search_query = extract_param("se=", search_query).query;
  var elems = document.getElementsByName("space_options");

  var se_param = "";
  var all_checked = true;

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];

    if(elem.checked)
    {
      var opt_vals = elem.id.split("_");

      if(se_param == "")
      {
        se_param = "se=s-";
      }
      else
      {
        se_param += " ";
      }

      se_param += opt_vals[1];
    }
    else
    {
      all_checked = false;
    }
  }

  if(se_param == "" || all_checked)
  {
    se_param = "se=s-";
  }

  url += se_param + "&";

  if(search_query != "")
  {
    url += search_query;
  }

  close_dialog();
  navigate(url);
}

function set_default_spaces()
{
  var elems = document.getElementsByName("space_options");

  for(var i = 0; i < elems.length; i++)
  {
    var elem = elems[i];
    elem.checked = true;
  }
}

function fill_spaces_dialog()
{
  var spaces_dialog = el_by_id("space_dialog");
    
  if(spaces_dialog == null)
  {
    return;
  }

  if(space_options[0].count == null)
  {
    var request;

    try
    {
      request = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      request = new XMLHttpRequest();
    }

    var data = { req:request };

    request.onreadystatechange = 
      get_spaces_request_onreadystatechange(data);

    var params = "t=x&z=v&s=1&r=0&se=&" + 
                 extract_param("se=", search_query).query;

    request.open("POST", search_path, true);

    request.setRequestHeader("Content-type", 
                             "application/x-www-form-urlencoded");
  
    request.send(params);
    return;
  }

  for(var i = 0; i < space_options.length; i++)
  {
    var label = el_by_id("lsp_" + space_options[i].space);

    if(label != null)
    {
      label.innerHTML = el_xml_encode(el_text(label)) + 
                        ' <span class="space_msg_count">(' + 
                        space_options[i].count + ")</span>"
    }
  }
}

function get_spaces_request_onreadystatechange(data)
{
  var onready = function()
  { 
    if(data.req.readyState == 4)
    {
      var spaces_dialog = el_by_id("space_dialog");

      if(spaces_dialog != null)
      {
        switch(data.req.status)
        {
          case 200:
          {
            set_spaces_dialog_counters(data.req);
            break;
          }
          default:
          {
            alert("Server communication failure. Error code: " + 
                  data.req.status);
            break;
          }
        }
      }
      
    }
  }

  return onready;
}

function set_spaces_dialog_counters(request)
{
  var elements = el_child_node(el_child_node(el_child_node(
                               request.responseXML,
                               "result"), 
                               "stat"), 
                               "space").childNodes;

  for(var i = 0; i < elements.length; i++)
  {
    var element = elements[i];

    if(element.tagName == "item")
    {
      var id = el_child_text(element, "id");
      var j = 0;

      for(; j < space_options.length && space_options[j].space != id; j++);

//      alert(j + " " + element.getAttribute("count"));

      if(j < space_options.length)
      {
        space_options[j].count = element.getAttribute("count");
      }
    }
  }

  if(space_options[0].count != null)
  {
    fill_spaces_dialog();
  }
}


function fill_category_bar(request, cat_id, cat_parent_id)
{
  if(category_map != null)
  {
    return;
  }

  category_map = new Array();

  var elements = el_child_node(el_child_node(el_child_node(
                               request.responseXML, 
                               "result"), 
                               "stat"), 
                               "category").childNodes;

  var sss = true;

  for(var j = 0; j < elements.length; j++)
  {
    var element = elements[j];

    if(element.tagName == "item")
    {
      var parent = parseInt(element.getAttribute("parent"));
      
      if(category_map[parent] === undefined)
      {
        category_map[parent] = { subcats: new Array() };
      }

      var names = el_child_text(element, "val").split("/");

      category_map[parent].subcats.push(
        { id: parseInt(element.getAttribute("self")),
          name: names[names.length - 1],
          path: el_child_text(element, "id")
        });
    }
  }

  var obj = document.getElementById("loading_cat");
  obj.parentNode.removeChild(obj);

  show_cat(cat_id, cat_parent_id, true);
}

function show_cat(cat_id, cat_parent_id, visibility)
{
  var cat_location = cat_id + "_" + cat_parent_id;

  if(visibility)
  {
    if(category_map === null)
    {
      return;
    }

    if(category_map === undefined)
    {
      category_map = null;

      var obj = document.getElementById("cat_exp_" + cat_location);      
      var el = document.createElement("div");

      el.id = "loading_cat";
      el.className = "right_bar_cat_loading";
      el.innerHTML = "Loading ...";
      obj.parentNode.insertBefore(el, obj);

      var request;

      try
      {
        request = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch(e)
      {
        request = new XMLHttpRequest();
      }

      var data = { req: request, 
                   cat_id: cat_id,
                   cat_parent_id: cat_parent_id
                 };

      request.onreadystatechange = 
        get_categories_onreadystatechange(data);

      request.open("POST", search_path, true);
    
      request.setRequestHeader("Content-type", 
                               "application/x-www-form-urlencoded");

      request.send("t=x&z=j&" + cat_query_prefix);
      return;
    }

    var cat = null;

    try
    {
      cat = category_map[cat_id];
      category_map[cat_id] = null;
    }
    catch(e)
    {
    }

    if(cat)
    {
      var plus = 
        el_child_node(document.getElementById("cat_exp_" + cat_location), 
                      "img").getAttribute("src");

      var minus = 
        el_child_node(document.getElementById("cat_col_" + cat_location), 
                      "img").getAttribute("src");

      var href = 
        document.getElementById("lnk_cat_" + cat_location).
          getAttribute("href");

      var post_prefix = null;
      var post_suffix = null;

      if(href.slice(0, 11) == "javascript:")
      {
        var pos1 = href.indexOf("(");
        
        if(pos1 > 0)
        {
          var pos2 = href.indexOf(",", pos1);

          if(pos2 > 0)
          {
            post_prefix = href.substr(0, pos1 + 1);
            post_suffix = href.substr(pos2);
          }
        }
      }

      var subcats = cat.subcats;

      for(var i = 0; i < subcats.length; ++i)
      {
        var subcat = subcats[i];
        var subcat_location = subcat.id + "_" + cat_id;
      
        if(document.getElementById("cat_" + subcat_location) != null)
        {
          continue;
        }

        var el = document.createElement("div");

        el.id = "cat_" + subcat_location;
        el.className = "right_block_subcat";

        var prefix = category_map[subcat.id] === undefined ?
          '<span class="right_block_cpad"></span>' :
          '<a id="cat_exp_' + subcat_location + 
          '" href="javascript:show_cat(' + 
          subcat.id + ", " + cat_id + ', true)"><img src="' + plus + 
          '" width="11" height="11" class="right_block_img"/></a>' + 
          '<a id="cat_col_' + subcat_location +
          '" style="display:none" href="javascript:show_cat(' + subcat.id +
          ', ' + cat_id + ', false)"><img src="' + minus + 
          '" width="11" height="11" class="right_block_img"/></a>';

        href = search_path + "?";

//        if(create_informer_mode)
//        {
//          href += "ir=1&";
//        }

        href += cat_query_prefix + "&v=C" + 
                el_mime_url_encode(
                  subcat.path.slice(0, subcat.path.length - 1));

        if(post_prefix != null)
        {
          var index = post_refs.length;
          post_refs.push(href);

          href = post_prefix + index + post_suffix;
        }

        el.innerHTML = prefix + '<a id="lnk_cat_' + subcat_location + 
                       '" href="' + href + '">' + el_xml_encode(subcat.name) +
                       '</a>';

        var cat_div = document.getElementById("cat_" + cat_location);

        var e = cat_div.firstChild;
        for(; e != null; e = e.nextSibling)
        {
          if(e.className == "right_block_subcat")
          {
            if(el_text(document.getElementById("lnk_" + e.id)) > subcat.name)
            {
              break;
            }
          }
        }

        cat_div.insertBefore(el, e);
      }
    }
  }

  var cat = document.getElementById("cat_" + cat_location);

  for(var el = cat.firstChild; el != null; el = el.nextSibling)
  {
    var id = el.id;

    if(id === undefined || id == null)
    {
      continue;
    }

    var id_prefix = id.substr(0, 8);

    if(id_prefix == "cat_exp_")
    {
      if(id.split("_")[2] != cat_id)
      {
        continue;
      }

      el.style.display = visibility ? "none" : "inline";
    }
    else if(id_prefix == "cat_col_")
    {
      if(id.split("_")[2] != cat_id)
      {
        continue;
      }

      el.style.display = visibility ? "inline" : "none";
    }
    else if(el.className == "right_block_subcat")
    {
      el.style.display = visibility ? "block" : "none";
    }
  }
}

function get_categories_onreadystatechange(data)
{
  var onready = function()
  { 
    if(data.req.readyState == 4)
    {
      switch(data.req.status)
      {
        case 200:
        {
          fill_category_bar(data.req, data.cat_id, data.cat_parent_id);
          break;
        }
        default:
        {
          category_map = undefined;
          break;
        }
      }      
    }
  }

  return onready;
}

