// @require('wsv.js');

function css_selector_match(selector, node) {
  // Determines if a given node matches a CSS selector
  
  // @param  string  'selector'  CSS selector
  // @param  object  'node'      DOM element node
  
  // @return  boolean  true if node matches selector; false otherwise
  
  var current_node,
      element,
      li,
      list;
  
  switch (selector)
    {
    case 'body_>_ul.main_h3':
      if (node.tagName != 'H3')
        {
        return false;
        }
      
      current_node = node;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.tagName == 'UL')
              && in_wsv('main', current_node.parentNode.className))
          {
          list = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      return (list != null && list.parentNode 
                && list.parentNode.tagName == 'BODY');
      break;
    case '#nav_+_ul.main_li:first-child_h3':
      if (node.tagName != 'H3')
        {
        return false;
        }
      
      current_node = node;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.tagName == 'LI')
              && (current_node.parentNode 
                   == current_node.parentNode.parentNode.firstChild))
          {
          li = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      if (li == null)
        {
        return false;
        }
      
      current_node = li;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.tagName == 'UL')
              && in_wsv('main', current_node.parentNode.className))
          {
          list = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      return (list.previousSibling 
                && list.previousSibling.id == 'nav');
      break;
    case '#portfolio_p_>_a:first-child':
      if (node.tagName != 'A')
        {
        return false;
        }
      
      if (!node.parentNode 
            || (node.parentNode.tagName != 'P')
            || (node.parentNode.firstChild != node))
        {
        return false;
        }
      
      current_node = node;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.id == 'portfolio'))
          {
          element = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      return (element != null);
      break;
    case '#service_icons_img:first-child':
      if ((node.tagName != 'IMG')
            || (node.parentNode.firstChild != node))
        {
        return false;
        }
      
      current_node = node;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.id == 'service_icons'))
          {
          element = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      return (element != null);
      break;
    case '#contact_dt.submit_+_dd':
      if (node.tagName != 'DD')
        {
        return false;
        }
      
      if (!node.previousSibling 
            || (node.previousSibling.tagName != 'DT')
            || !in_wsv('submit', node.previousSibling.className))
        {
        return false;
        }
      
      current_node = node;
      while (current_node.parentNode)
        {
        if ((current_node.parentNode.nodeType == 1)
              && (current_node.parentNode.id == 'contact'))
          {
          element = current_node.parentNode;
          break;
          }
        current_node = current_node.parentNode;
        }
      
      return (element != null);
      break;
    }
}
