
// **** DYNAMIC TEXT FUNCTIONS ****

var DOM = (document.getElementById) ? 1 : 0;
var IE4 = (document.all) ? 1 : 0;
var NS4 = (document.layers) ? 1 : 0;
var oldBrowserAlert = false;

var dynamicTexts = new Array();

function getElem(id)
{
     if (DOM || IE4)
        return DOM ? document.getElementById(id) : document.all[id];
else
	return null;
}

// Tämä lisää dynaamisen tekstikentän kutsukohtaan
function placeDynamicText(layerId, text)
{
    var style ="width: 100%;";  // border: solid red;
    // talletetaan globaaliksi initialisoinita varten
    dynamicTexts[layerId] = text;    
    
    // Tulostaa tyylimäärityksen layer- nimiselle tyylille
    if (NS4) {
      document.write(
      '<style type="text/css">.' + layerId + 
      ' { position: relative; visibility: show; white-space: nowrap}<\/style>');
    }
    else {
      document.write(
      '&nbsp;<style type="text/css">.' + layerId + ' { ' + style + 'position: absolute; visibility: visible; white-space: nowrap}<\/style>');
    }
    
    // Tähän parsitaan se teksti jota voidaan muuttaa
    document.write(
    '<span id="' + layerId + '" style="' + style + 'position: absolute; visibility: hidden; white-space: nowrap"></span>');

    // Tämä on varateksti, jos selain ei osaa näyttää sitä dynaamista kikkaretta...
    if (!DOM && !IE4 && !NS4)
        text = "";
    document.write(
    '<span id="' + layerId + '_shadow" class="' + layerId + '">' + text + '</span>');
}    

// Tämä initialisoi arvot tekstikohtiin
// Pakko tehdä näin jälkikäteen, jotta layerit saadaan siirrettyä pixelitarkasti paikalleen.
function initDynamicTexts()
{
    for (var layerId in dynamicTexts)
    {
        updateDynamicText(layerId, dynamicTexts[layerId]);
    }
}

// Tämä päivittää siihen arvon
// Jos selain ei tue tätä, niin antaa alertin, kerran
function updateDynamicText(layerId, text)
{
    var shadowId;
    shadowId = layerId + "_shadow";
    
    if (DOM || IE4) {
       var layer, shadow, parent, left = 0, top = 0;
       layer  = DOM ? document.getElementById(layerId) : document.all[layerId];
       layer.innerHTML = text;
       if (layer.style.visibility != "visible") {
         parent = DOM ? document.getElementById(shadowId) : document.all[shadowId];
         shadow = parent;
         do {
           left += parent.offsetLeft;
           top  += parent.offsetTop;
           parent = parent.offsetParent;
         } while (parent);
	 // nyt top osoittaa keskelle parent-elementtiä. nostetaan layerin
	 // keksiviivaa parentin keskiviivan tasolle!
//	 top -= layer.offsetHeight / 4;
	 layer.style.left = left;
	 layer.style.top  = top;
	 layer.style.visibility = 'visible';
	 shadow.style.visibility = 'hidden';
      }	 
    }
    else if (NS4) {
       document.layers[layerId].document.open();
       document.layers[layerId].document.write(text);
       document.layers[layerId].document.close();
       if (document.layers[layerId].visibility != "show") {
           document.layers[layerId].left = document.layers[shadowId].pageX;
 	   document.layers[layerId].top = document.layers[shadowId].pageY;
           document.layers[layerId].visibility = 'show';
	   document.layers[shadowId].visibility = 'hide';
       }
   } 
   else {
     // unsupported browser
     if (!oldBrowserAlert)
     {
       oldBrowserAlert = true;
       alert("Selaimesi ei tue layereita, joten ruudulla näkyvä teksti voi olla vanhentunutta tietoa.");
     }
   }
}



//***** LAYER FUNCTIONS *****

var visibleLayers = Array();

function showLayer(parent, layerId, lleft, ltop, content)
{
    if (showLayer.arguments.length < 4)
    {
       lleft = 20;
       ltop  = 20;
    }
    
    if (DOM || IE4) {
       var layer, pleft = 0, ptop = 0;
       layer  = DOM ? document.getElementById(layerId) : document.all[layerId];
       if (content) layer.innerHTML = content;
       if (layer.style.visibility != "visible") {
         do {
           pleft += parent.offsetLeft;
           ptop  += parent.offsetTop;
           parent = parent.offsetParent;
         } while (parent);
	 // nyt top osoittaa keskelle parent-elementtiä. nostetaan layerin
	 // keksiviivaa parentin keskiviivan tasolle!
	 layer.style.left = pleft + lleft;
	 layer.style.top  = ptop + ltop;
	 layer.style.visibility = 'visible';
      }	 
    }
    else if (NS4) {
       if (content)
       {
           document.layers[layerId].document.open();
           document.layers[layerId].document.write(text);
           document.layers[layerId].document.close();
       }   	   
       if (document.layers[layerId].visibility != "show") {
           document.layers[layerId].left = parent.pageX + lleft;
 	   document.layers[layerId].top = parent.pageY + ltop;
           document.layers[layerId].visibility = 'show';
       }
   } 
}

			   
function hideLayer(id)
{
      if (!document.getElementById) return;
      visibleLayers[id] = 'hidden';
      setTimeout("hideVisibleLayer('" + id + "')", 1000);
}

function hideVisibleLayer(id)
{
    if (!document.getElementById) return;
    
    if (visibleLayers[id] == 'hidden')
    {
        var layer = document.getElementById(id);
   	if (layer)
	{
	    layer.style.visibility='hidden';
	    visibleLayers[id] = null;
	}
    }
}



// **** BASIC FUNCTIONS FOR MANIPULATING ARRAYS & FORM LISTS ****

// Lisää valikkoon valinnan indexin kohtaan, 
// paitsi jos siellä on jo samalla arvolla -> korvataan.
// autoselect trueksi, jos haluaa että uus valinta valitaan.
// index voi olla "auto": lisää akkosittain sopivaan kohtaan, tekstin mukaan
//
// Palauttaa indexin, johon lisättiin.
function addOption(list, newvalue, newtext, autoSelect, index)
{
    var ind = getOptionIndex(list, newvalue);
    if (ind != null)
    {
        // Jos haluttiin aakkosjärjestys, helpointa poistaa ja lisätä uuestaa
	if (index == "auto")
	{
	    deleteOption(list, newvalue);
	}
	else
	{
            list.options[ind].text = newtext;
            return ind;
	}    
    }	

    var oldvalue, i;
    oldvalue = getValue(list);

    if (index == "auto")
    {
        index = null;
        var newLowerCase = newtext.toLowerCase();
        for (i = 0; i < list.options.length; i++)
	{
	    if (list.options[i].text.toLowerCase() > newLowerCase ||
	    list.options[i].text.substring(0,3) == "---")
	    {
	        index = i;
		break;
	    }
	}
    }
    
    if (index == null)
        index = list.options.length;

    if (index < 0)
        index = 0;

    // Lisätään listan loppuun uusi optio
    var no = new Option();
    list.options[list.options.length] = no;

    // Siirretään valintoja pois tieltä
    for (i = list.options.length - 1; i > index; i--) {
            list.options[i].value = list.options[i-1].value;
	    list.options[i].text  = list.options[i-1].text;
    }

    // Asetetaan uusi valinta paikalleen
    list.options[index].value = newvalue;
    list.options[index].text = newtext;

    // Valitaan uus valinta, jos autoselecti annettu
    if (autoSelect)
       list.selectedIndex = index;
    else
       setValue(list, oldvalue);
    
    return index;
}

// Poistaa valinnan, jolla annettu arvo.
// Jos valinta oli selected, asetetaan annettu defaultvalue
function deleteOption(list, value, defaultvalue)
{
    var deleted = false;
    var selectedIndexDeleted = false;
    
    for (var i = 0; i < list.options.length; i++) 
    {
        if (!deleted && list.options[i].value == value)
	{
	    deleted = true;
	    if (list.selectedIndex == i)
	        selectedIndexDeleted = true;
	}    
	    
	if (deleted && i < list.options.length - 1)
	{
	    list.options[i].value = list.options[i + 1].value;
	    list.options[i].text = list.options[i + 1].text;
	    
	    if (list.selectedIndex == i + 1)
	        list.selectedIndex = i;
	}
    }
    
    if (deleted)
    {
        list.options.length--; 
        if (selectedIndexDeleted)
	    setValue(list, defaultvalue);
    }	 
}

// Voi antaa järjestysehdon "string" tai "num"
function sortArray(values, sortmethod)
{
//alert(a.text + ":" + b.text);
    if ((a.text+"") < (b.text+"")) { return -1; }
          if ((a.text+"") > (b.text+""))
               { return 1; }
return 0;
    
}

// Korvaa valikon kaikki valinnat. values on assosiatiivinen taulukko
// Jos arvo oli valittu, palauttaa sen uudestaan mikäli sellanen löytyy
function setOptions(list, values, sort)
{
    var oldvalue;
    oldvalue = getValue(list);

//    if (sort)
//        sortArray(values, sort);

    list.options.length = 0;

    for (var i in values) {
        var no = new Option();
        no.value = i;
        no.text  = values[i];
    	list.options[list.options.length] = no;
    }

    setValue(list, oldvalue);
}

// Palauttaa listasta annetun arvon sisältävän vaihtoehdon indeksin
function getOptionIndex(list, value)
{
    if (!list.options)
      return null;
      
    for (var i = 0; i < list.options.length; i++)
    {
        if (list.options[i].value == value)
	    return i;
    }
    return null;
}

// palauttaa listan ihan kaikki arvot
function getAllValues(list)
{
   var values = new Array;
   for (var i = 0; i < list.options.length; i++)
       values[values.length] = list.options[i].value;

   return values;
}

// poistaa indeksi (jarjestysnumero!) taulukosta
function arrayDelete(index, arr)
{
   size = arr.length;
   if (index < size)
   {
     for (var i = index; i < size; i++) 
     {
     	  arr[i] = arr[i+1];
     }
     arr.length = size - 1;
   }  
}

function inArray(s, arr)
{
   for (var i = 0; i < arr.length; i++) 
   {
       if (s == arr[i])
	  return true; 
   }
   return false;
}
				

// Palauttaa taulukoiden yhteiset valinnat
function arrayFilter(arr1, arr2)
{
    var ret = new Array();

    for (i = 0; i < arr1.length; i++)
    {
      for (j = 0; j < arr2.length; j++)
      {
        if (arr1[i] == arr2[j])
	{
	  ret[ret.length] = arr1[i];
	  continue;
	}  
      }
    }
    return ret;
}


// klikauttaa kaikkia name-alkuisia checkboxeja
function checkBoxes (form, name, check) 
{
  for (var c = 0; c < form.elements.length; c++)
    if (form.elements[c].type == 'checkbox' 
        && form.elements[c].name.substring(0, name.length) == name)
      if (form.elements[c].checked)
         form.elements[c].checked = false;
      else
         form.elements[c].checked = true;
}

// Palauttaa elemname-alkuisten ruksittujen checkboxien arvot taulukossa
function getCheckedValuesByName(elemname, use_default)
{
  var values = new Array();
  for (var i = 0; i < document.f.elements.length; i++)
  {
    var e = document.f.elements[i];
    if ((e.type == "checkbox" || e.type == "radio") && 
        (use_default ? e.defaultChecked : e.checked) == true && 
        e.name.substring(0, elemname.length) == elemname)
    {
        values[values.length] = e.value;
    }
  }
  return values;
}

// Asettaa ruksin elemname-alkuisiin checkboxeihin,
// joilla sama arvo kuin taulukossa
function setCheckedValuesByName(elemname, values)
{
  for (var i = 0; i < document.f.elements.length; i++)
  {
    var e = document.f.elements[i];
    if ((e.type == "checkbox" || e.type == "radio") && 
        e.name.substring(0, elemname.length) == elemname &&
	inArray(e.value, values))
    {
           e.checked = true;
    }
  }
  return values;
}


// Palauttaa elemname-alkuisten elementtien arvot taulukossa
function getValuesByName(elemname)
{
  var values = new Array();
  
  for (var i = 0; i < document.f.elements.length; i++)
  {
    if (document.f.elements[i].name.substring(0, elemname.length) == elemname)
    {
        var obj = document.f.elements[i];
        values[values.length] = document.f.elements[i].value;
    }
  }
  return values;
}


// Lähde: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
function getValue(obj, use_default) 
{
var i;
if (!obj) alert("Virhe: getValue: ei objektia.");
  switch (obj.type) {
    case 'radio': case 'checkbox':
      return (((use_default) ? obj.defaultChecked : obj.checked) ? obj.value : null);
    case 'text': case 'hidden': case 'textarea':
      return (use_default) ? obj.defaultValue : obj.value;
    case 'password': 
      return ((use_default) ? null : obj.value);
    case 'select-one':
      if (use_default)
      {
        var o = obj.options;
        for(i=0; i < o.length; i++)
	{
	  if(o[i].defaultSelected)
	    return o[i].value;
        }
        return o[0].value;
      }
      if (obj.selectedIndex < 0)
        return null;
      return (obj.options.length > 0) ? obj.options[obj.selectedIndex].value : null;
    case 'select-multiple': 
      var values = new Array();
      for (i = 0; i < obj.options.length; i++) 
      {
        if ((use_default && obj.options[i].defaultSelected) ||
	   (!use_default && obj.options[i].selected))
	{
          values[values.length] = obj.options[i].value;
	}  
      }
      return (values.length == 0) ? null : values;
  }
  return null;
}



// Käytetään asettamaan monta arvoa kerralla multiboxiin...
// ts value voi olla taulukko
function setValue(obj, value)
{
  if (value == null) return null;
  
  var o,i;

  switch (obj.type) {
    case 'radio': case 'checkbox':
      return obj.value = value;
    case 'text': case 'hidden': case 'textarea':
      return obj.value = value;
    case 'password': 
      return obj.value = value;
    case 'select-one':
      o = obj.options;
      for(i = 0; i < o.length; i++)
	if (o[i].value == value)
	  return obj.selectedIndex = i;
      return null;
    case 'select-multiple': 
      o = obj.options;
      for(i = 0; i < o.length; i++)
      {
        o[i].selected = false;
        for (var j = 0; j < value.length; j++)
	{
	  if (o[i].value == value[j])
	      o[i].selected = true;
	}
      }	
      return null;
  }
  return null;
}

// Asettaa focuksen formin kenttään, jos ei parametria, niin käyttää ekaa
// formia. 
function f_setfocus( aForm )
{
if (!aForm) aForm = document.forms[0];

if( aForm.elements[0]!=null) {
var i;
var max = aForm.length;
for( i = 0; i < max; i++ ) {
if( aForm.elements[ i ].type != "hidden" &&
!aForm.elements[ i ].disabled &&
!aForm.elements[ i ].readOnly ) {
aForm.elements[ i ].focus();
break;
}
}
}
}


