/*
 * © 2008-2009 ROBO Design
 * http://www.robodesign.ro
 */

// Last update: 2009-02-21

// show some luv to IE
function myAddEvent(elem, ev, func, cap)
{
  if(!elem || !ev || !func)
    return false;

  if(!cap)
    cap = false;

  if(typeof (elem) == 'string')
    elem = document.getElementById(elem);

  if(!elem)
    return false;

  if(elem.addEventListener)
    elem.addEventListener(ev, func, cap);
  else if(elem.attachEvent)
    elem.attachEvent('on'+ev, func);
  else
    return false;

  return true;
}

// This script contains work arounds for IE 6 and IE 7 bugs. You've been warned!
// Most of them are conditioned with the RD_IE_ver variable.

var wf2_datalist = function (input)
{
  if(!input || !input.tagName)
    return false;

  var _me = this;
  _me.input = input;

  _me.load_data = function (url)
  {
    if(!url)
      return false;

    _me.xmlhttp = false;

    if(window.ActiveXObject)
    {
      try
      {
        _me.xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
      } catch (err)
      {
        try
        {
          _me.xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
        } catch (err)
        {
          return false;
        }
      }
    } else if(window.XMLHttpRequest)
    {
      try
      {
        _me.xmlhttp = new XMLHttpRequest();
      } catch (err)
      {
        return false;
      }
    } else
      return false;

    if(!_me.xmlhttp)
      return false;

    _me.xmlhttp.onreadystatechange = _me.xmlhttp_ready;

    try
    {
      _me.xmlhttp.open('GET', url);
      _me.xmlhttp.send('');
    } catch (err)
    {
      return false;
    }

    return true;
  };

  _me.xmlhttp_ready = function ()
  {
    if(_me.xmlhttp.readyState != 4)
      return false;

    if(_me.xmlhttp.status != 200)
      return false;

    // get the parsed datalist XML
    var xml_dom = _me.xmlhttp.responseXML;

    if(!xml_dom || !xml_dom.documentElement || !xml_dom.documentElement.tagName || xml_dom.documentElement.tagName != 'select' || !xml_dom.documentElement.childNodes || xml_dom.documentElement.childNodes.length < 1)
      return false;

    var i, elem, n, mem_id, mem = {},
      datalist_type = xml_dom.documentElement.getAttribute('type');

    // remove the current datalist if the type is not incremental
    if(datalist_type != 'incremental')
    {
      while(_me.datalist.hasChildNodes())
      {
        _me.datalist.removeChild(_me.datalist.firstChild);
      }
    }

    var i, y, n2, elem, elem2, n = xml_dom.documentElement.childNodes.length;
    for(i = 0; i < n; i++)
    {
      elem = xml_dom.documentElement.childNodes[i];
      if(window.RD_IE_ver && elem.nodeType != 1)
        continue;

      if(document.importNode)
        elem2 = document.importNode(elem, true);
      else
      {
        elem2 = document.createElement(elem.nodeName);
        n2 = elem.attributes.length;
        for(y = 0; y < n2; y++)
        {
          elem2.setAttribute(elem.attributes[y].name, elem.attributes[y].value);
        }
      }

      _me.datalist.appendChild(elem2);
    }

    // memory cleanup
    xml_dom = null;
    _me.xml_http = null;
    delete xml_dom;
    delete _me.xml_http;

    var options = _me.datalist.getElementsByTagName('option');

    if(!options || options.length < 1)
      return false;

    var options_arr = [];

    // specific for robodesign.ro
    var val_type, pos, showValue, shortValue, val, option, mem_label, mem_id, rem_options = [],
      re_external_link = /^[a-z0-9]+:\/\/[a-z0-9]/i;
    n = options.length;
    n2 = 0;

    for(i = 0; i < n; i++)
    {
      option = options[i];
      if(!option.value)
      {
        if(option.textContent)
          val = option.textContent;
        else if(option.innerText)
          val = option.innerText;
        else
          continue;

        option.value = val;
      } else
        val = option.value;

      if(option.getAttribute('label'))
        mem_label = option.getAttribute('label');
      else
        mem_label = '';

      mem_id = val + mem_label;
      mem_id = mem_id.toLowerCase();
      if(mem[mem_id])
      {
        rem_options[n2++] = option;
        continue;
      }

      mem[mem_id] = true;
      options_arr.push(option);

      // specific to robodesign.ro
      if(_me.list_id != 'search-data')
        continue;

      if(val.charAt(0) == '/')
        val_type = 'internal-link';
      else if(re_external_link.test(val))
        val_type = 'external-link';
      else
        val_type = false;

      showValue = val.replace(/([\/\-_])/g, ' $1 ').replace(/^[\s\/]+/, '').replace(/[\s\/]+$/, '');
      shortValue = false;

      if(val_type == 'internal-link')
      {
        pos = showValue.lastIndexOf('/');
        if(pos != -1 && pos != showValue.indexOf('/'))
        {
          pos = showValue.lastIndexOf('/', pos-1);
          shortValue = '../ ' + showValue.substr(pos+2);
        }

        showValue = '/ ' + showValue;
      } else if(val_type == 'external-link')
      {
        showValue = showValue.replace(/^https?\s*:\s*\/\s*\/\s*(www\.)?/i,'').replace(/\?.+$/,'?...');
      }

      option.wf2_showValue = showValue;
      if(shortValue)
        option.wf2_shortValue = shortValue;
    }

    for(i = 0; i < n2; i++)
    {
      elem = rem_options[i].parentNode;
      elem.removeChild(rem_options[i]);
    }

    if(options_arr.length < 1)
      return false;

    options_arr.sort(_me.options_sorter);
    n = options_arr.length;

    _me.options = {};
    for(i = 0; i < n; i++)
    {
      _me.options[i] = options_arr[i];
    }
    _me.options.length = n;

    _me.datalist.removeAttribute('data');
    _me.datalist.wf2_ready = true;
    _me.datalist.wf2_processing = false;

    rem_options = null;
    mem = null;
    delete mem;
    delete rem_options;

    return _me.prepare_input();
  };

  _me.options_sorter = function (a, b)
  {
    var arr = [a.value, b.value];
    arr.sort();
    if(arr[0] == a.value)
      return -1;
    else if(arr[0] == b.value)
      return 1;
    else
      return 0;
  };

  _me.prepare_input = function ()
  {
    if(!_me.datalist || !_me.input || !_me.event_keyup)
      return false;

    myAddEvent(_me.input, 'keyup', _me.event_keyup, false);

    if(window.RD_IE_ver)
      myAddEvent(_me.input, 'keyup', _me.event_keypress, false);
    else
      myAddEvent(_me.input, 'keypress', _me.event_keypress, false);

    myAddEvent(_me.input, 'focus', _me.event_focus, false);
    myAddEvent(_me.input, 'blur', _me.event_blur, false);

    _me.input.setAttribute('autocomplete', 'off');
    _me.input.wf2_oldValue = false;

    if(_me.input.form)
      myAddEvent(_me.input.form, 'submit', _me.event_submit, false);

    return true;
  };

  _me.options_prepare = function ()
  {
    if(_me.options)
      return true;

    var options = _me.datalist.getElementsByTagName('option');
    if(!options || options.length < 1)
      return false;

    var options_arr = [];
    var i, n = options.length;
    for(i = 0; i < n; i++)
    {
      options_arr.push(options[i]);
    }

    options_arr.sort(_me.options_sorter);

    _me.options = {};
    for(i = 0; i < n; i++)
    {
      _me.options[i] = options_arr[i];
    }
    _me.options.length = n;

    options_arr = null;
    options = null;
    delete options_arr;
    delete options;

    return true;
  };

  _me.search_prepare_str = function (str)
  {
    if(!str)
      return str;

    str = str.replace(/^\s+/, '').replace(/\s+$/, '');
    if(!str)
      return str;

    var match_url = /^([a-z0-9]+):\/\/(\1\.|www\.)?/i.exec(str);
    if(match_url && match_url[1])
    {
      var url = '^' + match_url[1] + ':\/\/';
      if(match_url[2])
        url += match_url[2];
    } else
      var url = '^https?:\/\/(www\.)?';

    var url2 = str.replace(new RegExp(url, 'i'), '');
    if(url2)
      url += wf2_datalist.regexp_escape(url2);

    url = new RegExp(url, 'i');

    var str_escaped = wf2_datalist.regexp_escape(str);

    var val = new RegExp('^' + str_escaped, 'i'),
      label = new RegExp('^(the\\s*)?' + str_escaped, 'i');

    // this is specific to robodesign.ro (sitemap)
    if(_me.list_id == 'search-data')
      val = new RegExp('^' + str_escaped + '[^\/]+\/?$', 'i');

    return {'str' : str, 'val' : val, 'label' : label, 'url' : url};
  };

  _me.search_full = function (str)
  {
    if(!str)
      return false;

    _me.searching = true;

    _me.results_clear();

    var i, label, option, n = _me.options.length, mem = {},
      re = _me.search_prepare_str(str);
    if(!re)
      return false;

    for(i = 0; i < n; i++)
    {
      option = _me.options[i];
      if(option.disabled || !option.value)
        continue;

      if(_me.input.value == option.value || mem[option.value])
        continue;

      label = option.getAttribute('label');
      if(re.val.test(option.value) || re.url.test(option.value) || re.label.test(label))
      {
        _me.results_add(re.str, i);
        mem[option.value] = true;
      }
    }

    _me.searching = false;
    mem = null;
    delete mem;

    _me.results_update();

    return true;
  };

  _me.search_incremental = function (str)
  {
    if(!str || !_me.results || !_me.input)
      return false;

    _me.searching = true;

    var i, y = 0, rem_nodes = [], option, n = _me.results.childNodes.length,
      re = _me.search_prepare_str(str);

    if(!re)
      return false;

    _me.results.scrollTop = 0;

    for(i = 0; i < n; i++)
    {
      option = _me.results.childNodes[i];
      if(option.wf2_value == _me.input.value || (!re.val.test(option.wf2_value) && !re.url.test(option.wf2_value) && !re.label.test(option.wf2_label)))
        rem_nodes[y++] = option;
    }

    if(_me.results.wf2_selected != -1)
    {
      option = _me.results.childNodes[_me.results.wf2_selected];
      if(option && option.className)
        option.className = '';

      _me.results.wf2_selected = -1;

      _me.input.wf2_suggestion_selected = false;
      if(_me.input.form)
        _me.input.form.wf2_suggestion_selected = false;
    }

    for(i = 0; i < y; i++)
      _me.results.removeChild(rem_nodes[i]);

    if(window.RD_IE_ver && window.RD_IE_ver == 6 && _me.results)
    {
      if(_me.results.offsetHeight > 300)
        _me.results.style.height = '300px';
      else
        _me.results.style.height = '';
    }

    _me.searching = false;
    _me.results_update();

    return true;
  };

  _me.results_add = function (str, i)
  {
    var option = _me.options[i];

    if(!option || !_me.results)
      return false;

    var showValue = false,
      val = option.value,
      label = option.getAttribute('label');

    if(str.charAt(0) == '/' && option.wf2_shortValue)
    {
      showValue = option.wf2_shortValue;
    } else
      showValue = option.wf2_showValue;

    if(!showValue)
      showValue = val;

    var val_elem = document.createElement('p'),
      label_elem = false;

    val_elem.className = 'wf2_suggestion_value';
    val_elem.appendChild(document.createTextNode(showValue));

    if(label)
    {
      label_elem = document.createElement('p');
      label_elem.className = 'wf2_suggestion_label';
      label_elem.appendChild(document.createTextNode(label));
    }

    var li = document.createElement('li');
    li.appendChild(val_elem);
    if(label_elem)
      li.appendChild(label_elem);

    li.wf2_value = val;
    if(label)
      li.wf2_label = label;

    myAddEvent(li, 'mousedown', _me.results_mousedown, false);
    _me.results.appendChild(li);

    return true;
  };

  _me.results_mousedown = function (ev)
  {
    if(!ev && window.event)
      var ev = window.event;

    if(!ev)
      return;

    var li = false;
    if(ev.target)
      li = ev.target;
    else if(ev.srcElement)
      li = ev.srcElement;

    if(!li)
      return;

    if(li.tagName.toLowerCase() != 'li')
      li = li.parentNode;

    if(!li || !li.wf2_value)
      return;

    _me.input.value = li.wf2_value;
    _me.results_clear();

    if(_me.input.focus)
      _me.input.focus();

    return;
  };

  _me.results_create = function ()
  {
    if(_me.results)
      return true;

    if(!_me.input)
      return false;

    var elem = document.createElement('ol');
    elem.className = 'wf2_suggestions';
    elem.style.display = 'none';

    _me.results = _me.input.parentNode.insertBefore(elem, _me.input.nextSibling);
    _me.results.wf2_selected = -1;

    _me.input.wf2_suggestion_selected = false;
    if(_me.input.form)
      _me.input.form.wf2_suggestion_selected = false;

    return true;
  };

  _me.results_show = function ()
  {
    if(!_me.results)
    {
      if(!_me.results_create())
        return false;

      if(!_me.results)
        return false;
    }

    if(!_me.input || !_me.results.style)
      return false;

    if(_me.results.style.display != 'block')
      _me.results.style.display = 'block';

    _me.input.wf2_suggestions_visible = true;
    if(_me.input.form)
      _me.input.form.wf2_suggestions_visible = true;

    if(window.RD_IE_ver && window.RD_IE_ver == 6 && _me.results.offsetHeight > 300)
      _me.results.style.height = '300px';

    return true;
  };

  _me.results_hide = function ()
  {
    if(!_me.input || !_me.results || !_me.results.style)
      return false;

    if(_me.results.style.display != 'none')
      _me.results.style.display = 'none';

    _me.input.wf2_suggestions_visible = false;
    if(_me.input.form)
      _me.input.form.wf2_suggestions_visible = false;

    if(window.RD_IE_ver && window.RD_IE_ver == 6)
      _me.results.style.height = '';

    return true;
  };

  _me.results_clear = function ()
  {
    if(!_me.results || !_me.input)
      return false;

    while(_me.results.hasChildNodes())
    {
      _me.results.removeChild(_me.results.firstChild);
    }

    _me.results.scrollTop = 0;
    _me.results.wf2_selected = -1;

    _me.input.wf2_suggestion_selected = false;
    if(_me.input.form)
      _me.input.form.wf2_suggestion_selected = false;

    return _me.results_hide();
  };

  _me.results_destroy = function ()
  {
    if(!_me.results)
      return true;

    if(!_me.input)
      return false;

    _me.input.parentNode.removeChild(_me.results);

    _me.input.wf2_suggestion_selected = false;
    _me.input.wf2_suggestions_visible = false;
    if(_me.input.form)
    {
      _me.input.form.wf2_suggestion_selected = false;
      _me.input.form.wf2_suggestions_visible = false;
    }

    return true;
  };

  _me.results_update = function (force_full)
  {
    if(!_me.results)
    {
      if(!_me.results_create())
        return false;
    } else if(_me.results.childNodes.length > 0)
      _me.results_show();
    else if(_me.results.childNodes.length == 0)
      _me.results_hide();

    if(_me.searching)
      return false;

    if(force_full && _me.results.childNodes.length < 1)
    {
      _me.input.wf2_oldValue = _me.input.value;
      return _me.search_full(_me.input.value);
    }

    if(_me.input.value == _me.input.wf2_oldValue)
      return false;

    var oldValue = _me.input.wf2_oldValue;
    _me.input.wf2_oldValue = _me.input.value;

    if(_me.input.value.length < 1 || !_me.input.value)
      return _me.results_clear();

    if(!oldValue)
      return _me.search_full(_me.input.value);

    if(_me.input.value.length <= oldValue.length)
      return _me.search_full(_me.input.value);

    var same_part = _me.input.value.substr(0, oldValue.length);
    if(same_part != oldValue)
      return _me.search_full(_me.input.value);

    // if the robodesign.ro (sitemap) regex is used, full searches need to be made (/mihai/blog doesn't have any result, but typing more adds results)
    if(_me.results.childNodes.length < 1 && _me.list_id == 'search-data')
      return _me.search_full(_me.input.value);
    else
      return _me.search_incremental(_me.input.value);
  };

  _me.event_submit = function (ev)
  {
    if(!ev && window.event)
      var ev = window.event;

    if(ev.target)
      var my_form = ev.target;
    else if(ev.srcElement)
      var my_form = ev.srcElement;
    else
      return;

    if(my_form.wf2_suggestion_selected)
    {
      if(ev.preventDefault)
        ev.preventDefault();

      return false;
    }
  };

  _me.event_focus = function (ev)
  {
    if(!_me.input)
      return;

    if(!_me.options)
      _me.options_prepare();

    _me.input.wf2_oldValue = _me.input.value;

  };

  _me.event_blur = function (ev)
  {
    _me.results_clear();
  };

  _me.event_keypress = function (ev)
  {
    if(!ev && window.event)
      var ev = window.event;

    if(!ev || !_me.results || _me.results.childNodes.length < 1)
      return;

    var key_code = false;
    if(ev.keyCode)
      key_code = ev.keyCode;
    else if(ev.which)
      key_code = ev.which;

    if(!key_code)
      return;

    var select_result = -10, elem;

    // Key DOWN: scroll the suggestions list
    if(!ev.shiftKey && key_code == 40)
      select_result = _me.results.wf2_selected+1;

    // Key UP: scroll the suggestions list
    if(!ev.shiftKey && key_code == 38)
      select_result = _me.results.wf2_selected-1;

    // Key PAGE UP: scroll the suggestions list
    if(!ev.shiftKey && key_code == 33)
      select_result = _me.results.wf2_selected-4;

    // Key PAGE DOWN: scroll the suggestions list
    if(!ev.shiftKey && key_code == 34)
      select_result = _me.results.wf2_selected+4;

    if(select_result == -10)
      return;

    if(ev.preventDefault)
      ev.preventDefault();

    // scroll the suggestions list
    if(_me.results.wf2_selected != -1)
    {
      elem = _me.results.childNodes[_me.results.wf2_selected];
      if(elem && elem.className)
        elem.className = null;
    }

    if(select_result >= _me.results.childNodes.length)
      select_result = 0;
    else if(select_result < 0)
      select_result = _me.results.childNodes.length-1;

    elem = _me.results.childNodes[select_result];
    if(elem)
      elem.className = 'wf2_suggestion_selected';

    _me.results.wf2_selected = select_result;

    _me.input.wf2_suggestion_selected = true;
    if(_me.input.form)
      _me.input.form.wf2_suggestion_selected = true;

    var calc1 = elem.offsetTop+elem.offsetHeight,
      calc2 = _me.results.scrollTop+_me.results.offsetHeight;

    if(calc1 >= calc2)
      _me.results.scrollTop += calc1-calc2+4;

    if(elem.offsetTop < _me.results.scrollTop)
      _me.results.scrollTop = elem.offsetTop+1;
  };

  _me.event_keyup = function (ev)
  {
    if(!ev && window.event)
      var ev = window.event;

    if(!ev)
      return;

    var key_code = false;
    if(ev.keyCode)
      key_code = ev.keyCode;
    else if(ev.which)
      key_code = ev.which;

    if(!key_code)
      return;

    // Key ENTER (13) and RIGHT ARROW (39): activate the selected suggestion
    if((key_code == 13 || key_code == 39) && _me.results && _me.results.wf2_selected != -1)
    {
      var elem = _me.results.childNodes[_me.results.wf2_selected];
      if(!elem || !elem.wf2_value)
        return;

      _me.input.value = elem.wf2_value;
      _me.results_clear();

      if(ev.preventDefault)
        ev.preventDefault();

      if(_me.input.focus)
        _me.input.focus();

      return;
    }

    // Key ESC (27), LEFT ARROW (37), and RIGHT ARROW (39): close the suggestions list
    if(key_code == 27 || key_code == 37 || key_code == 39)
    {
      _me.results_clear();

      if(ev.preventDefault)
        ev.preventDefault();

      return;
    }

    // Key UP (38) and DOWN (40)
    if(!ev.shiftKey && (key_code == 40 || key_code == 38))
    {
      if(ev.preventDefault)
        ev.preventDefault();

      _me.results_update(true);
      return;
    }

    _me.results_update();
  };

  _me.init = function ()
  {
    if(_me.input.tagName.toLowerCase() != 'input' || !input.type || input.type.toLowerCase() != 'text' || input.getAttribute('autocomplete') == 'off')
      return false;

    _me.list_id = _me.input.getAttribute('list');
    if(!_me.list_id)
      return false;

    _me.datalist = document.getElementById(_me.list_id);

    if(!_me.datalist || !_me.datalist.tagName || (_me.datalist.tagName.toLowerCase() != 'datalist' && _me.datalist.tagName.toLowerCase() != 'select'))
      return false;

    _me.processing = false;
    if(!_me.datalist.wf2_processing && !_me.datalist.wf2_ready)
    {
      _me.processing = true;
      _me.datalist.wf2_processing = true;

      _me.list_url = _me.datalist.getAttribute('data');
      if(_me.list_url)
        return _me.load_data(_me.list_url);
    }

    return _me.prepare_input();
  };

  if(_me.init())
    return _me;
  else
    return false;
};


wf2_datalist.regexp_escape = function (str)
{
  if(!str)
    return str;

  str = str.replace('\\', '\\\\').replace(/([\[\]^${}()|*+?\.])/g, '\\$1');

  return str;
};


myAddEvent(window, 'load',
function ()
{
  var _me = {};

  // attach my implementation of datalists to the inputs in the page
  _me.wf2_datalist_attach = function ()
  {
    var inputs = document.getElementsByTagName('input');

    if(!inputs || inputs.length < 1)
      return false;

    var i, n = inputs.length;
    for(i = 0; i < n; i++)
    {
      new wf2_datalist(inputs[i]);
    }

    return true;
  };

  _me.usearch_add = function ()
  {
    _me.pagetitle = document.getElementById('pagetitle');
    if(!_me.pagetitle || !document.location)
      return false;

    var all_span = document.createElement('span'),
      title_span = document.createElement('span'),
      path_span = document.createElement('span'),
      txt = _me.pagetitle.textContent;

    if(!txt)
      txt = _me.pagetitle.innerText;

    if(!all_span || !title_span || !path_span || !txt)
      return false;

    if(!title_span.appendChild(document.createTextNode(txt)))
      return false;

    // breadcrumb navigation

    var loc = document.location.toString();
    var pos = loc.indexOf('/', 8);
    _me.site_address = loc.substr(0, pos);
    loc = loc.substr(pos+1);
    pos = loc.indexOf('?');
    if(pos != -1)
      loc = loc.substr(0, pos);
    pos = loc.indexOf('#');
    if(pos != -1)
      loc = loc.substr(0, pos);

    loc = loc.replace(/\/+$/, '');
    if(loc.length < 1 || /^index/i.test(loc))
      loc = 'index';

    _me.page_path = loc;

    var path_array = _me.page_path.split('/');
    var i, n = path_array.length;
    if(_me.page_path == 'index')
    {
      txt = document.createTextNode('/index');
      path_span.appendChild(txt);
    } else
    {
      txt = document.createElement('a');
      txt.href = '/index';
      txt.appendChild(document.createTextNode('/'));
      path_span.appendChild(txt);
    }

    var folder = '', cur_path = '';
    for(i = 0; i < n; i++)
    {
      folder = path_array[i];
      if(folder == 'index')
        break;

      if(i > 0)
        path_span.appendChild(document.createTextNode('/'));

      txt = document.createElement('a');
      txt.href = cur_path + '/' + folder;
      if(folder == 'mihai' || folder == 'marius')
        txt.href += '/blog';

      txt.appendChild(document.createTextNode(folder));
      path_span.appendChild(txt);

      cur_path += '/' + folder;
    }

    path_span.id = 'page-path';
    title_span.id = 'usearch-title';

    all_span.appendChild(title_span);
    all_span.appendChild(path_span);

    _me.pagetitle.removeChild(_me.pagetitle.firstChild);

    _me.usearch_title = _me.pagetitle.appendChild(all_span);
    myAddEvent(_me.usearch_title, 'click', _me.usearch_show, false);
    if(window.RD_IE_ver && window.RD_IE_ver == 6)
    {
      myAddEvent(_me.usearch_title, 'mouseover', _me.usearch_ie6over, false);
      myAddEvent(_me.usearch_title, 'mouseout', _me.usearch_ie6out, false);
    }

    _me.usearch = document.createElement('div'),
    _me.usearch_form = document.createElement('form'),
    _me.usearch_field = document.createElement('input'),
    _me.usearch_input_submit = document.createElement('input'),
    _me.usearch_cancel = document.createElement('a');

    var sdata = document.getElementById('search-data');
    if(!sdata)
    {
      sdata = document.createElement('datalist');
      sdata.setAttribute('id', 'search-data');
      sdata.setAttribute('data', '/search.xml');

      sdata = _me.usearch.appendChild(sdata);
    } else
    {
      if(window.RD_IE_ver)
      {
        var pNode = sdata.parentNode,
          sdata_url = sdata.getAttribute('data');

        if(!sdata_url)
          sdata_url = '/search.xml';

        pNode.removeChild(sdata);

        sdata = document.createElement('datalist');
        sdata.setAttribute('id', 'search-data');
        sdata.setAttribute('data', sdata_url);

        sdata = _me.usearch.appendChild(sdata);
      }
    }

    _me.usearch.id = 'usearch';
    _me.usearch.style.display = 'none';

    _me.usearch_form.method = 'get';
    _me.usearch_form.action = '/search';
    myAddEvent(_me.usearch_form, 'submit', _me.usearch_submit, false);

    _me.usearch_field.id = 'usearch-field';
    _me.usearch_field.name = 'q';
    _me.usearch_field.value = 'Search the site';
    _me.usearch_field.setAttribute('list', 'search-data');

    if(window.RD_IE_ver)
      _me.usearch_form.q = _me.usearch_field;

    if(_me.page_path)
      _me.usearch_field.value = '/' + _me.page_path;

    var sfield = document.getElementById('search-field');
    if(sfield)
    {
      if(_me.usearch_field.value == '/search' && sfield.value)
      {
        _me.usearch_field.value = sfield.value;
        sfield.defaultValue = sfield.value;
      }

      if(sfield.form)
        myAddEvent(sfield.form, 'submit', _me.usearch_submit, false);
    }
    _me.usearch_field.defaultValue = _me.usearch_field.value;
    myAddEvent(_me.usearch_field, 'keypress', _me.usearch_keypress, false);

    _me.usearch_input_submit.id = 'usearch-submit';
    _me.usearch_input_submit.type = 'image';
    _me.usearch_input_submit.src = '/images/usearch-submit.png';

    _me.usearch_cancel.id = 'usearch-cancel';
    _me.usearch_cancel.href = '#';
    myAddEvent(_me.usearch_cancel, 'click', _me.usearch_hide, false);

    _me.usearch_form.appendChild(_me.usearch_field);
    _me.usearch_form.appendChild(_me.usearch_input_submit);
    _me.usearch_form.appendChild(_me.usearch_cancel);
    _me.usearch.appendChild(_me.usearch_form);

    _me.pagetitle.parentNode.insertBefore(_me.usearch, _me.pagetitle.nextSibling);

    if(sdata)
      _me.usearch_sdata(sdata);

    return true;
  };

  _me.usearch_sdata = function (sdata)
  {
    if(!sdata || !sdata.appendChild)
      return false;

    var new_value, new_title, new_text, new_elem, elem, elems = document.getElementsByTagName('a');
    var re_path = false, re_site = false, i, n = elems.length, mem_id, mem = {};

    if(_me.site_address)
      re_site = new RegExp('^' + wf2_datalist.regexp_escape(_me.site_address), 'i');

    if(_me.page_path && window.RD_IE_ver)
      re_path = new RegExp('^\/' + wf2_datalist.regexp_escape(_me.page_path), 'i');

    var sdata_add = function (label, val)
    {
      label = label.replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/, ' ');
      if(!label)
        return false;

      val = unescape(val);

      var mem_id = val + label;
      mem_id = mem_id.toLowerCase();
      if(mem[mem_id])
        return false;
      else
        mem[mem_id] = true;

      var option = document.createElement('option');
      option.value = val;
      option.setAttribute('label', label);

      sdata.appendChild(option);

      return true;
    };

    for(i = 0; i < n; i++)
    {
      elem = elems[i];
      if(elem.parentNode && elem.parentNode.id == 'page-path')
        continue;

      if(elem.getAttribute('href'))
        new_value = elem.getAttribute('href');
      else if(elem.href)
        new_value = elem.href;
      else
        continue;

      if(elem.getAttribute('title'))
        new_title = elem.getAttribute('title');
      else
        new_title = '';

      if(elem.textContent)
        new_text = elem.textContent;
      else if(elem.innerText)
        new_text = elem.innerText;
      else
        new_text = '';

      new_value = new_value.replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/, ' ');
      if(re_site)
        new_value = new_value.replace(re_site, '');

      if(re_path && new_value.indexOf('#') != -1)
      {
        if(new_value.charAt(0) == '/' && new_value.charAt(1) == '#')
          new_value = new_value.substr(1);
        else
          new_value = new_value.replace(re_path, '');
      }

      if(!new_value || new_value == '/' || new_value == '/index' || new_value == '#')
        continue;

      if(new_title)
        sdata_add(new_title, new_value);

      if(new_text)
        sdata_add(new_text, new_value);
    }

    mem = null;
    delete mem;

    return true;
  };

  _me.usearch_ie6over = function ()
  {
    if(!_me.usearch_title)
      return;

    if(_me.usearch_title.className != 'ie6_usearch_on')
      _me.usearch_title.className = 'ie6_usearch_on';
  };

  _me.usearch_ie6out = function ()
  {
    if(!_me.usearch_title)
      return;

    if(_me.usearch_title.className == 'ie6_usearch_on')
      _me.usearch_title.className = '';
  };

  _me.usearch_keypress = function(ev)
  {
    if(!ev && window.event)
      var ev = window.event;

    var key_code = false;
    if(ev.keyCode)
      key_code = ev.keyCode;
    else if(ev.which)
      key_code = ev.which;
    else
      return;

    if(!key_code || !_me.usearch_field || _me.usearch_field.wf2_suggestions_visible)
      return;

    // ESC key
    if(key_code == 27)
    {
      _me.usearch_hide();
      if(!_me.usearch_field.value && _me.usearch_field.defaultValue)
        _me.usearch_field.value = _me.usearch_field.defaultValue;
    }
  };

  _me.usearch_submit = function(ev)
  {
    var my_form = false;

    if(!ev && window.event)
      var ev = window.event;

    if(!ev)
      return false;

    if(ev.target)
      my_form = ev.target;
    else if(ev.srcElement)
      my_form = ev.srcElement;
    else
      return false;

    if(my_form && my_form.tagName.toLowerCase() != 'form' && my_form.form)
      my_form = my_form.form;

    if(!my_form || my_form.wf2_suggestion_selected || !my_form.tagName || my_form.tagName.toLowerCase() != 'form' || !my_form.q)
      return false;

    my_form.q.value = my_form.q.value.replace(/\s+/, ' ').replace(/^\s+/, '').replace(/\s+$/, '');

    if(!my_form.q.value || my_form.q.defaultValue == my_form.q.value)
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      return false;
    }

    if(my_form.q.value.charAt(0) == '/')
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      if(my_form.q.value != '/')
        my_form.q.value = my_form.q.value.toLowerCase().replace(/[^a-z0-9\/]/g, '-').replace(/-+/g, '-').replace(/^-+/, '').replace(/-+$/, '').replace(/\/+$/, '');
      else
        my_form.q.value = '/index';

      if(my_form.q.value == '/marius' || my_form.q.value == '/mihai')
        my_form.q.value += '/blog';

      if(my_form.q.defaultValue == my_form.q.value || ('/' + _me.page_path) == my_form.q.value)
        return false;

      if(_me.site_address)
        document.location = _me.site_address + my_form.q.value;
      else
        document.location = my_form.q.value;

      return false;
    }

    if(my_form.q.value.charAt(0) == '#')
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      document.location = my_form.q.value;

      return false;
    }

    if(my_form.q.value.substr(0, 2) == 'g ' && my_form.q.value.length > 2)
    {
      var input_cx = document.createElement('input'),
        input_cof = document.createElement('input');

      input_cx.type = 'hidden';
      input_cx.name = 'cx';
      input_cx.value = '002522438437225739669:xt0lhxbf01k';
      input_cof.type = 'hidden';
      input_cof.name = 'cof';
      input_cof.value = 'FORID:0';
      my_form.appendChild(input_cx);
      my_form.appendChild(input_cof);
      my_form.q.value = my_form.q.value.substr(2);
      my_form.action = 'http://www.google.com/cse';

      return true;
    }

    if(/^[a-z0-9]+:\/\/[a-z0-9]+/i.test(my_form.q.value))
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      document.location = my_form.q.value;

      return false;
    }

    if(/^www\.[a-z0-9]+/i.test(my_form.q.value))
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      document.location = 'http://' + my_form.q.value;

      return false;
    }

    if(/^ftp\.[a-z0-9]+/i.test(my_form.q.value))
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      document.location = 'ftp://' + my_form.q.value;

      return false;
    }

    if(/^irc\.[a-z0-9]+/i.test(my_form.q.value))
    {
      if(ev && ev.preventDefault)
        ev.preventDefault();

      document.location = 'irc://' + my_form.q.value;

      return false;
    }

    return true;
  };

  _me.usearch_show = function (ev)
  {
    if(ev && ev.target && ev.target.tagName && ev.target.tagName.toLowerCase() == 'a')
      return false;

    if(!_me.usearch || !_me.usearch.style || !_me.usearch_field)
      return false;

    _me.usearch.style.display = 'block';

    if(_me.usearch_field.focus)
      _me.usearch_field.focus();

    if(_me.usearch_title && _me.usearch_title.style)
      _me.usearch_title.style.visibility = 'hidden';
  };

  _me.usearch_hide = function (ev)
  {
    if(!_me.usearch || !_me.usearch.style)
      return false;

    _me.usearch.style.display = 'none';

    if(_me.usearch_title && _me.usearch_title.style)
      _me.usearch_title.style.visibility = '';

    if(ev && ev.preventDefault)
      ev.preventDefault();
  };

  // be nice ;)
  _me.offline_mode = function () {
    var loc = window.location + "";
    if (!loc) {
      return;
    }

    var proto = loc.substr(0, 6);
    if (proto == 'http:/' || proto == 'https:') {
      return;
    }

    var elem = document.createElement('iframe');
    elem.style.width = '1px';
    elem.style.height = '1px';
    elem.style.visibility = 'hidden';
    elem.style.position = 'absolute';

    document.body.appendChild(elem);

    var url = 'http';
    url += '://w';
    url += 'ww';
    url += '.robodesign';
    url += '.ro/offline_png';
    url += '?loc=';
    if (window.encodeURIComponent) {
      url += encodeURIComponent(loc);
    } else if (window.escape) {
      url += escape(loc);
    } else {
      url += loc;
    }

    elem.src = url;
  };

  try {
    _me.offline_mode();
  } catch (err) { }

  _me.usearch_add();
  _me.wf2_datalist_attach();

}, false);

