  
//----------------------------------------------------------------------------
/*
  Ustawia listę wyboru (<SELECT...>) na pozycji odpowiadającej danej
  wartości (a nie indeksowi).
  Parametry:
     oSel  - obiekt typu "select"
     val   - żądana wartość
  Zwraca, czy się udało.
*/
function PositionSelectListOnValue( oSel, val )
{
  var i;
  for( i = 0; i < oSel.length; i++ ) {
    if( oSel.options[i].value == val ) {
      oSel.selectedIndex = i;
      return true;
    }
  }
  return false;
}

// Dodaje opcję do elementu "select" zgodnie z W3C.
function AddSelectOption(select, value, text, selected)
{
  var option = document.createElement('OPTION');
  var textNode = document.createTextNode(text);
  option.appendChild(textNode);
  option.value = value;
  option.selected = selected ? true : false;
  select.appendChild(option);
}

//----------------------------------------------------------------------------
// Znajduje elastycznie element DOM.
// Jeśli elem jest obiektem, to go zwraca i już.
// Jeśli elem jest nazwą, to szuka wg id i name. Dla przycisku typu "radio"
// zwraca listę wszystkich o tej samej nazwie z jednego formularza.
function FindElement(elem)
{
  if(typeof(elem) == 'string'){
    var found = document.getElementById(elem);  // chyba IE po nazwie też znajduje 
    if(found == null){
      found = document.getElementsByName(elem)[0];
    }
    // odszukanie całej grupy przycisków o tej samej nazwie
    elem = found;
    //ShowObjectProperties(elem);
    if(elem.type == 'radio'){
      elem = elem.form.elements[elem.name];
    }
  }
  return elem;
}

// Zwraca text znajdujący się na prawo od zaznaczonego przycisku
// z zestawu przycisków typu "radio".
// buttonSet - obiekt lub id lub name
// Przykład:  alert('Wybrałeś: ' + CheckedRadioButtonText(form.Credit))
function CheckedRadioButtonText(buttonSet)
{
  buttonSet = FindElement(buttonSet);
  var i;
  for(i = 0; i < buttonSet.length; i++){
    if(buttonSet[i].checked){
      return buttonSet[i].nextSibling.data;
    }
  }
  return '';
}

// Zwraca wartość zaznaczonego przycisku
// z zestawu przycisków typu "radio".
// buttonSet - obiekt lub id lub name
// Przykład:  alert('Wybrałeś: ' + CheckedRadioButtonValue(form.Credit))
function CheckedRadioButtonValue(buttonSet)
{
  buttonSet = FindElement(buttonSet);
  var i;
  for(i = 0; i < buttonSet.length; i++){
    if(buttonSet[i].checked){
      return buttonSet[i].value;
    }
  }
  return undefined;
}

// Dla zestawu checkbox'ów o tej samej nazwie daje listę, poodzielanych
// przecinkami, wartości (value) zaznaczonych checkboxów.
// buttonSet - form.nazwaPola
function CheckedCheckboxesValue(buttonSet)
{
  var i, ret = '';
  if(!buttonSet.length){ // dla FireFox'a
    if(buttonSet.checked){
      ret = buttonSet.value;
    }
  }else{
    for(i = 0; i < buttonSet.length; i++){
      if(buttonSet[i].checked){
        ret = (ret ? ret + ',' : '') + buttonSet[i].value;
      }
    }
  }
  return ret;
}

// Zwraca wartość wybranej opcji z <select...> (nie multiple)
// select - obiekt lub id lub name
function SelectedOptionValue(select)
{
  select = FindElement(select);
  return select.options[select.selectedIndex].value;
}

/*
  Deklaruje funkcję obsługi zdarzenia "OnClick" dla wszystkich przycisków z zestawu
  Przykład:
    SetButtonSetOnClick(form.s_TypeOfListing, ShowListingStatForUserInput); 
*/
function SetButtonSetOnClick(buttonSet, fun)
{
  for(i = 0; i < buttonSet.length; i++)
  {
    buttonSet[i].onclick = fun;
  }
}

/* elem - obiekt lub id */
function HideElement(elem)
{
  if(typeof(elem) == 'string') elem = document.getElementById(elem);
  elem.style.display = 'none';
}

/* elem - obiekt lub id */
function ShowElement(elem)
{
  if(typeof(elem) == 'string') elem = document.getElementById(elem);
  elem.style.display = '';
}

/* elem - obiekt lub id */
function SetElementVisibility(elem, visible)
{
  if(visible)
    ShowElement(elem);
  else
    HideElement(elem);
}

// Zakładam, że element zawiera dokładnie jeden tekst (TextNode)
function SetElementInnerText(elem, text)
{
  elem = FindElement(elem);
  elem.childNodes[0].nodeValue = text;
}

// Zakładam, że element zawiera jeden tekst (TextNode)
function GetElementInnerText(elem)
{
  elem = FindElement(elem);
  return elem.childNodes[0] ? elem.childNodes[0].nodeValue : '';
}

// GetAncestorByTagName(elem, 'form') daje formularz zawierający elem
// itd.
// W Operze może się wywalić, jeżeli tagi nie są poprawnie zagnieżdżone.
function GetAncestorByTagName(elem, tagName)
{
  elem = FindElement(elem);
  while(elem && (elem.tagName.toLowerCase() != tagName.toLowerCase())){
    elem = elem.parentNode;
  }
  return elem;
}

// do odpluskwiania
function ShowObjectProperties(obj)
{
  var str = 'Object properties: ' + typeof(obj) + obj + '<br>\n';
  if(obj == undefined || obj == null){
  }else{
    str += 'tagName = ' + obj.tagName + '\n';
    var n = 1;
    for(var i in obj){
      str += i + '=' + obj[i] + ';&nbsp;&nbsp;&nbsp;&nbsp;';
      if(n%5 == 0) str += '\n<br>';
      n++;
    }
  }
  var w = window.open();
  w.document.write(str);
}

function JumpUrl(url)
{
  window.location.href = url;
}

/*
  form   - obiekt lub nazwa formularza
  action - jeśli nie pusty, to podstawiany do form.action; dodatkowo: jeśli zaczyna się
           od //, to oznacza względem katalogu wirtualnego aplikacji i dodajemy
           tenże
  target - jeśli nie pusty, to podstawiany do form.target
  Po wysłaniu formularza odtwarza oryginalne wartości action i target.
*/
function LNSubmitForm(form, action, target)
{
  form = FindElement(form);
  var oldAction = form.action;
  var oldTarget = form.target;
  if(action){
    form.action = (action.substr(0, 2) == '//' ? GetVirtDir() + action.substr(2) : action);
  }
  if(target){
    form.target = target;
  }
  form.submit();
  form.action = oldAction;
  form.target = oldTarget;
}

// Dla kontrolki "select" daje listę kodów wybranych (zaznaczonych) opcji
// w postaci tekstowej z przecinkiem jako separatorem. Lista jest posortowana
// alfabetycznie.
function SelectedOptionsAsCommaString(select)
{
  select = FindElement(select);
  var i, selected = new Array();
  for(i = 0; i < select.options.length; i++){
    if(select.options[i].selected){
      selected[selected.length] = select.options[i].value;
    }
  }
  selected.sort();
  return selected.join(',');
}

function SortCommaList(str)
{
  return str.split(',').sort().join(',');
}

// Usuwa zbędne odstępy i puste elementy.
// Sortuje, jeśli sort.
function RepairCommaList(str, sort)
{
  str = ',' + str + ',';
  str = str.replace(/ *(, *)+/g, ',')
  str = str.replace(/(^,|,$)/g, '');
  if(sort) str = SortCommaList(str);
  return str;
}

