BOOL select_next_option( dom::element& option )
    {
       dom::element next = option.next_sibling();
       if( !next.is_valid() ) 
         goto ADD_NEW;
       if( !aux::streq(next.get_element_type(),"option") )
         goto ADD_NEW;
       next.set_state(STATE_FOCUS); 
       return TRUE;
ADD_NEW:
       std::wstring text = option.text();
       if(text.empty() || text == L" ")
       {
         ::MessageBeep(MB_ICONEXCLAMATION);
         return FALSE;
       }

       dom::element select = option.parent();
       next = dom::element::create("option", L" ");
       select.insert(next,option.index()+1);
       select.update();
       next.set_state(STATE_FOCUS); 
       return TRUE;
    }
 inline value_t get_option_value(const dom::element& opt )
 {
   const wchar_t* val = opt.get_attribute("value");
   if( val ) return value_t::from_string(val);
   return value_t(opt.text());
 }
 inline json::value get_option_value(const dom::element& opt )
 {
   const wchar_t* val = opt.get_attribute("value");
   if( val ) return json::value::from_string(val);
   return json::value(opt.text().c_str());
 }