  
//----------------------------------------------------------------------------
/*
  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 && elem.type == 'radio'){
      elem = elem.form.elements[elem.name];
    }
  }
  return elem;
}

function GetElementByTagAndClass(parent, tagName, className)
{
  var elems = parent.getElementsByTagName(tagName);
  for(var i = 0; i < elems.length; i++) {
    if(elems[i].className == className) return elems[i];
  }
  return undefined;
}

function GetElementByTagAndName(parent, tagName, name)
{
  var elems = parent.getElementsByTagName(tagName);
  for(var i = 0; i < elems.length; i++) {
    if(elems[i].name == name) return elems[i];
  }
  return undefined;
}

// 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;
}

function IsObjectARadioButtonArray(elem)
{
  return elem.length && elem[0].type && elem[0].type.toLowerCase() == 'radio' ? true : false; 
}

// 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;
}

function CheckboxesInvertSelection(ctrlName)
{
  var i;
  var ctrls = document.getElementsByName(ctrlName);
  for(i = 0; i < ctrls.length; i++){
    var ctrl = ctrls[i];
    ctrl.checked = !ctrl.checked;
  }
}

// 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);
}

// być może do poprawy
function CanFocus(elem)
{
  do {
    if(elem.disabled) return false;
    if(elem.type == 'hidden') return false;
    if(elem.style && elem.style.display == 'none') return false;
  } while(elem = elem.parentNode);
  return true;
}

// 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;
}

// Wartość 'background-position' ze stylu (bezpośredniego) zadanego elementu.
// Np.: '20px 50%'
function GetBackgroundPosition(elem)
{
  elem = FindElement(elem);
  if(elem.style.getPropertyValue)
    return elem.style.getPropertyValue('background-position'); // W3C
  else
    return elem.style.backgroundPosition; // IE
}

// Ustawia wartość 'background-position' stylu zadanego elementu.
function SetBackgroundPosition(elem, value)
{
  elem = FindElement(elem);
  if(elem.style.setProperty)
    elem.style.setProperty('background-position', value, 'important'); // W3C
  else
    elem.style.backgroundPosition = value; // IE
}

// Przesuwa tło danego elementu o podane wartości w pikselach.
// W stylu (bezpośrednio w HTML) pozycja tła (background-position)
// musi być określona w pikselach.
// imgWidth, imgHeight - opcjonalne podpowiedzi; przydatne w Operze,
//                       bo inaczej staje po penym czasie
function IncrementBackgroundPosition(elem, xOffset, yOffset, imgWidth, imgHeight)
{
  elem = FindElement(elem);
  var pos = GetBackgroundPosition(elem);
  pos.match(/(\S+)px\s+(\S+)px/i);
  var x = parseInt(RegExp.$1) + xOffset;
  if(imgWidth) x = (x + imgWidth*100) % imgWidth;
  var y = parseInt(RegExp.$2) + yOffset;
  if(imgHeight) y = (y + imgHeight*100) % imgHeight;
  SetBackgroundPosition(elem, x.toString() + 'px ' + y.toString() + 'px');
}


// 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;
}

// Kombinowane wysłanie formularza
function LNSubmitFormX(form, stepCount, fileToExecute, queryString, action)
{
  form = FindElement(form);
  var oldAction = form.action;
  var oldTarget = form.target;
  PageChainSetGoBack(form, stepCount);
  if(action){
    form.action = (action.substr(0, 2) == '//' ? GetVirtDir() + action.substr(2) : action);
  }
  BackASPSubmitForm(form, fileToExecute, queryString);
  form.action = oldAction;
  form.target = oldTarget;
}

// Kombinowane wysłanie formularza
function LNSubmitCheckX(form, stepCount, fileToExecute, queryString, action)
{
  form = FindElement(form);
  if(CheckFormFields(form)){
    LNSubmitFormX(form, stepCount, fileToExecute, queryString, action);
  }
}

// Kombinowane wysłanie formularza
function LNSubmitCheckY(form, action, fileToExecute, queryString)
{
  form = FindElement(form);
  if(CheckFormFields(form)){
    var oldAction = form.action;
    if(action){
      form.action = (action.substr(0, 2) == '//' ? GetVirtDir() + action.substr(2) : action);
    }
    BackASPSubmitForm(form, fileToExecute, queryString);
    form.action = oldAction;
  }
}

// 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;
}

// Wysyła formularz ustawiając standardowe pola sortowania dla typowej tabeli.
// Patrz lib/LayoutUtils.inc
function StdTableSort(form, pref, sortFld, queryString)
{
  form = FindElement(form);
  if(form.elements[pref + 'SortFld'].value == sortFld) {
    form.elements[pref + 'SortDir'].value =
       (form.elements[pref + 'SortDir'].value != 'desc' ? 'desc' : 'asc');
  }
  form.elements[pref + 'SortFld'].value = sortFld;
  if(queryString) form.action += (form.action.indexOf('?') >= 0 ? '&' : '?') + queryString;
  if(!form.action.match(/#/)) form.action += '#' + pref + 'StdTableSortGoTo';
  form.submit();
}
