    function vis_echo()
    {
     var obj = document.tek_kalkulator;
     var tmp = "";
     for (i=0; i<obj.length; i++)
     {
       if (obj[i].name.indexOf("___echo")!=-1)
       {
                 // alert("Update echo: " + obj[i].name + " (" + navn + ") = " + verdi + " (fra: " +  obj[i].value + ") ");
         tmp += obj[i].name + "=" + obj[i].value + "\n";
       }
     }
     alert(tmp);
     }

//Globale variablar
endret_prosjekt = false;

//Serialisering
function lagre_prosjekt()
{
  //Send (post) ALLE data i FORM
  document.tek_kalkulator.submit();
}

function lagre_prosjekt_nytt()
{
  //Send (post) ALLE data i FORM
  document.tek_kalkulator.uid.value = "";
  document.tek_kalkulator.submit();
}

function tilbakestill()
{
//tilbakestiller form data
  document.tek_kalkulator.reset();

}

//Rapport
function vis_rapport()
{
  if (endret_prosjekt)
  {
    var svar = confirm("Prosjektet har blitt endret siden siste lagring. Rapporten henter data fra sist lagring.\n\nVil du fortsette [OK] for å se rapporten eller avbryte for å lagre?");
    if (!svar) return;
  }
  window.open('rapport/rapport.php?rapid='+document.tek_kalkulator.uid.value);
}

//Registering av ny bruker
function sjekk_ny_bruker(obj)
{
  if (obj.navn.value == "" || obj.epost.value == "" || obj.passord.value == "")
  {
    alert("Navn, e-post og passord må fylles ut!");
    return false;
  }
}



function sjekk_form_nyttpassord(obj)
{
  if (obj.epost.value == "")
  {
     alert("E-post (brukernavn) må fylles ut!");
    return false;
  }
}

//Administrasjon

function rediger_rad(uid, tabell, preq)
{
  document.location = "?" + preq + "&tab_uid="+uid+"&tab="+tabell;
}

function oppdater_header(value)
{
  var obj = document.getElementById("header_tittel");
  obj.innerHTML = value;
}

//REGISTRERING AV ENDRINGER I KONTROLL

function reg_endring(obj, nokkel)
{
  //vis_echo();
 if (obj.name == 'bygningskategori' && !(isNaN(document.tek_kalkulator.bruksareal.value) || document.tek_kalkulator.bruksareal.value ==''))
 {
       //Oppdaterer felt for brukervalgt varmebehov
       if (hent_radio_verdi(document.tek_kalkulator.bygningskategori) == 'Småhus')
       {
        var obj_ = document.tek_kalkulator;
        oppdater_felt('ed_aanvpm2_rom', Math.round(eval(hent_db_verdi_(hent_radio_verdi(obj_.bygningskategori), 'sum_oppvarming'))*100)/100);
        obj_.ed_aanvpm2_tvann.value = eval(hent_db_verdi_(hent_radio_verdi(obj_.bygningskategori), 'vannoppvarming'));
       }
       else
       {
        var obj_ = document.tek_kalkulator;
        obj_.ed_aanvpm2_rom.value = eval(hent_db_verdi_(hent_radio_verdi(obj_.bygningskategori), 'romoppvarming'));
        obj_.ed_aanvpm2_tvann.value = eval(hent_db_verdi_(hent_radio_verdi(obj_.bygningskategori), 'vannoppvarming'));
       }
 }

 if (nokkel == '_annet')
 {
       //For angitt objekt oppdater alle ekko. Først sjekk om obj er radio eller textfelt
       if (obj.type == 'radio')
       {
        var nyobj = eval("document.tek_kalkulator."+obj.name+'_annet');

        //For angitt objekt oppdater alle ekko.
        oppdater_echo(obj.name, nyobj.value);
         //Oppdater alle felt som refererar til databaseverdiar. I dette tilfellet ''
        oppdater_db_felt(obj.name, false);
       }
       else
       {
         var find = '_annet';
         var nnavn = obj.name.substring(0,(obj.name.length - find.length));
         if (hent_radio_verdi(eval('document.tek_kalkulator.'+nnavn))=='Annet')
         {
           //For angitt objekt oppdater alle ekko.
           oppdater_echo(nnavn, obj.value);
         }
       }
 }

 else

 {
      //For angitt objekt oppdater alle ekko.
      oppdater_echo(obj.name, obj.value);

      //Oppdater alle felt som refererar til databaseverdiar.
      oppdater_db_felt(obj.name, nokkel);
 }


//Konverterer tall fra europeiske
 konverter_tall_input();
 
 //Start beregning
 oppdater_beregning(obj.name, nokkel);
 
 endret_prosjekt = true;
}

    //FUNKSJONER FOR OPPDATERING OG BEREGNINGER

function oppdater_beregning(trigobj, trignokkel)
{

      var obj = document.tek_kalkulator;

      //Sjekk om tilstrekkelig data er til stede for beregninger.
      if (er_radio_valgt(obj.bygningskategori))
      {

       //Beregning av årlig netto varmebehov per m2

       if (hent_radio_verdi(obj.bygningskategori) == 'Småhus')
       {
        var aanvpm2_rom = eval(hent_db_verdi_(hent_radio_verdi(obj.bygningskategori), 'sum_oppvarming'));
        oppdater_felt('an_rom_varmebehov', Math.round(aanvpm2_rom*10)/10);
        var aanvpm2_tvann = eval(hent_db_verdi_(hent_radio_verdi(obj.bygningskategori), 'vannoppvarming'));
        oppdater_felt('an_tappevann_varmebehov', Math.round(aanvpm2_tvann*10)/10);
       }
       else
       {
        var aanvpm2_rom = eval(hent_db_verdi_(hent_radio_verdi(obj.bygningskategori), 'romoppvarming'));
        oppdater_felt('an_rom_varmebehov', Math.round(aanvpm2_rom*10)/10);
        var aanvpm2_tvann = eval(hent_db_verdi_(hent_radio_verdi(obj.bygningskategori), 'vannoppvarming'));
        oppdater_felt('an_tappevann_varmebehov', Math.round(aanvpm2_tvann*10)/10);
       }

       
       //Totalt årlig netto varmebehov
       //Sjekker om bruksareal er fylt ut
       if (isNaN(obj.bruksareal.value) || obj.bruksareal.value =='') return;

       var taanvpm2;
       if (obj.ed_aanvpm2_rom.value != aanvpm2_rom)
       {
          taanvpm2 = (obj.ed_aanvpm2_rom.value*obj.bruksareal.value)+(aanvpm2_tvann*obj.bruksareal.value);
       }
       else
       {
          taanvpm2 = (aanvpm2_rom*obj.bruksareal.value)+(aanvpm2_tvann*obj.bruksareal.value);
       }

       oppdater_felt('tan_varmebehov', Math.round(taanvpm2));
       //alert(trigobj);
       //Konklusjon 2
       if ( parseInt(taanvpm2) >= hent_db_verdi('tan_varmebehov_krav') )
       {
         oppdater_felt('konklusjon_2', hent_db_verdi('konklusjon_2_ok'));
         //obj.konklusjon_2.style.background='#CCFFCC';
       }
       else
       {
         oppdater_felt('konklusjon_2', hent_db_verdi('konklusjon_2_ikke_ok'));
         //obj.konklusjon_2.style.background='#FFCCCC';
         if (trigobj == 'bruksareal' || trigobj == 'bygningskategori' || trigobj == 'ed_aanvpm2_rom') alert(hent_db_verdi('konklusjon_2_ikke_ok'));
       }
      }
      else
      {
         return;
      }

      //Oppdaterer lenker til energipriser - system 1
      var tekst = "";
      if(hent_radio_verdi(obj.eb_1))
      {
       for (var i in db["lenker"])
       {
         if (i.indexOf(hent_radio_verdi(obj.eb_1)) != -1) tekst += db["lenker"][i];
       }
       document.getElementById("eb_lenker_1").innerHTML = tekst;
      }

      tekst = "";
      if(hent_radio_verdi(obj.eb_2))
      {
       for (var i in db["lenker"])
       {
         if (i.indexOf(hent_radio_verdi(obj.eb_2)) != -1) tekst += db["lenker"][i];
       }
       document.getElementById("eb_lenker_2").innerHTML = tekst;
      }

      aanvpm2_rom = obj.ed_aanvpm2_rom.value;

      //Netto varmetilførsel alternativt varmesystem romoppvarming(kWh)
      var nvav = ((aanvpm2_rom*obj.bruksareal.value) * (obj.eb_romoppvarming_andel_system_1.value / 100));
      oppdater_felt('nv_rom_alt_varmesystem', Math.round(nvav));

      //Netto varmetilførsel alternativt varmesystem tappevann(kWh)
      var nvav_ = ((aanvpm2_tvann*obj.bruksareal.value) * (obj.eb_tappevann_andel_system_1.value / 100));
      oppdater_felt('nv_tappevann_alt_varmesystem', Math.round(nvav_));

      //Energiprisdifferanse alternative systemer
      //var epdas = (obj.db_eb_2.value / obj.db_eb_system_2.value) - (obj.db_eb_1.value / obj.db_eb_system_1.value);
      //oppdater_felt('epd_alternative_systemer', Math.round(epdas*100)/100);

      //PRE Beregning VG ROM
      if (!(hent_radio_verdi(obj.system_1) && hent_radio_verdi(obj.system_2) && hent_radio_verdi(obj.eb_1) && hent_radio_verdi(obj.eb_2))) return;

      //Beregning VG ROM
      //Sjekkar om brukar har angitt eigedefinert tal for virkningsgrad
      //I så tilfelle skal dei ikkje reberegnast.
      //alert(obj.cb_gulvvarme_system_1.checked + " " +obj.cb_tappevann_system_1.checked+ " " +obj.cb_gulvvarme_system_2.checked+ " " + obj.cb_tappevann_system_2.checked);

       if (obj.cb_gulvvarme_system_1.checked && isNumeric(obj.ed_gulvvarme_system_1.value))
       {
          var db_gv_system_1 = obj.ed_gulvvarme_system_1.value;
       }
       else
       {
          var db_gv_system_1 = er_separert_tall(hent_db_verdi_(hent_radio_verdi(obj.system_1), 'vg_gulvvarme'));

        //Oppdaterar felt i kalkulator med dei nye utligna verdiane
        //oppdater_felt('db_gulvvarme_system_1', Math.round(vg_rom_system_1*100)/100);
       }

       if (obj.cb_tappevann_system_1.checked && isNumeric(obj.ed_tappevann_system_1.value))
       {
          var db_pv_system_1 = obj.ed_tappevann_system_1.value;
       }
       else
       {
          var db_pv_system_1 = obj.db_tappevann_system_1.value;
       }

       if (obj.cb_gulvvarme_system_2.checked && isNumeric(obj.ed_gulvvarme_system_2.value))
       {
         var db_gv_system_2 = obj.ed_gulvvarme_system_2.value;
       }
       else
       {
         var db_gv_system_2 = er_separert_tall(hent_db_verdi_(hent_radio_verdi(obj.system_2), 'vg_gulvvarme'));

        //Oppdaterar felt i kalkulator med dei nye utligna verdiane
        //oppdater_felt('db_gulvvarme_system_2', Math.round(vg_rom_system_2*100)/100);
       }

       if (obj.cb_tappevann_system_1.checked && isNumeric(obj.ed_tappevann_system_2.value))
       {
          var db_pv_system_2 = obj.ed_tappevann_system_2.value;
       }
       else
       {
          var db_pv_system_2 = obj.db_tappevann_system_2.value;
       }

       //Bereknar  virkningsgrader
       var vg_rom_system_1 = obj.bruksareal.value / ((obj.m2_gulvvarme_system_1.value/db_gv_system_1) + ((obj.bruksareal.value-obj.m2_gulvvarme_system_1.value)/db_pv_system_1));
       var vg_rom_system_2 = obj.bruksareal.value / ((obj.m2_gulvvarme_system_2.value/db_gv_system_2) + ((obj.bruksareal.value-obj.m2_gulvvarme_system_2.value)/db_pv_system_2));

       //Oppdaterar felt i kalkulator med dei nye utligna verdiane
       oppdater_felt('db_gulvvarme_system_1', Math.round(vg_rom_system_1*100)/100);

       //Oppdaterar felt i kalkulator med dei nye utligna verdiane
       oppdater_felt('db_gulvvarme_system_2', Math.round(vg_rom_system_2*100)/100);

            //Årlig besparelse
      var aabsp = nvav * ((obj.db_eb_2.value / vg_rom_system_2)-(obj.db_eb_1.value / vg_rom_system_1)) + nvav_ * ((obj.db_eb_2.value / db_pv_system_2)-(obj.db_eb_1.value / db_pv_system_1));

      //oppdater_felt('aarlig_besparelse', Math.round(((nvav+nvav_)*epdas)));
      oppdater_felt('aarlig_besparelse', Math.round(aabsp));

      //Privatøkonomisk besparelse
      var pos = (aabsp * eval(hent_db_verdi('formel_pb')));
      oppdater_felt('po_besparelse', Math.round(pos));

      //Investeringskostnader
      summer_felter('belop_system_1', 'ikost_system_1', 'reinvestering_system_1');
      summer_felter('belop_system_2', 'ikost_system_2', 'reinvestering_system_2');

      //Nåverdi investeringskostnader
      var nvis1 = parseFloat(obj.ikost_system_1.value) + parseFloat(obj.reinvestering_system_1.value);
      var nvis2 = parseFloat(obj.ikost_system_2.value) + parseFloat(obj.reinvestering_system_2.value)
      oppdater_felt('naaverdi_ikost_system_1', Math.round(nvis1));
      oppdater_felt('naaverdi_ikost_system_2', Math.round(nvis2));

      //Merkostnad investering
      var mki = (nvis1 - nvis2);
      oppdater_felt('merkostnad_investering', Math.round(mki));

      //Nåverdi vedlikeholdskostnader og differanse
      var nvvk1 = (obj.aarlig_vedlikehold_system_1.value * eval(hent_db_verdi('formel_pb')));
      var nvvk2 = (obj.aarlig_vedlikehold_system_2.value * eval(hent_db_verdi('formel_pb')));
      oppdater_felt('nv_vkost_system_1', Math.round(nvvk1));
      oppdater_felt('nv_vkost_system_2', Math.round(nvvk2));
      oppdater_felt('differanse', Math.round((nvvk1 - nvvk2)));

      //RESULTAT

      oppdater_felt('nv_resultat', Math.round((pos - mki - (nvvk1 - nvvk2))));

      //Konklusjon 1
      if ((pos - mki - (nvvk1 - nvvk2))>0)
      {
         oppdater_felt('konklusjon_1', hent_db_verdi('konklusjon_1_ok'));
         //obj.konklusjon_1.style.background='#CCFFCC';
      }
      else
      {
         oppdater_felt('konklusjon_1', hent_db_verdi('konklusjon_1_ikke_ok'));
         //obj.konklusjon_1.style.background='#FFCCCC';
      }

      //Konklusjon 3
      //TEK10:
      //Sjekkar om arealet er st¿rre eller mindre enn 500 rutemeter
      // > 500 : Sjekk om 60%
      // < 500 : Sjekk om 40%
      if (obj.bruksareal.value > 500) 
      {
       	if ( parseInt(nvav+nvav_) < (taanvpm2*0.6) )
      	{
      	   oppdater_felt('konklusjon_3', hent_db_verdi('konklusjon_3_500_ok'));
      	   //obj.konklusjon_2.style.background='#CCFFCC';
      	}
      	else
      	{
      	   oppdater_felt('konklusjon_3', hent_db_verdi('konklusjon_3_500_ikke_ok'));
      	   //obj.konklusjon_2.style.background='#FFCCCC';
      	}
      }
      else
      {
       	if ( parseInt(nvav+nvav_) < (taanvpm2*0.4) )
      	{
      	   oppdater_felt('konklusjon_3', hent_db_verdi('konklusjon_3_ok'));
      	   //obj.konklusjon_2.style.background='#CCFFCC';
      	}
      	else
      	{
      	   oppdater_felt('konklusjon_3', hent_db_verdi('konklusjon_3_ikke_ok'));
      	   //obj.konklusjon_2.style.background='#FFCCCC';
      	}
      }

      konverter_tall_output();
    }
//////////////////////////////////////
function er_separert_tall(tall)
{
  var tmp = tall.split(" ").join("").replace(/,/, '.');
  //alert(isNumeric(tmp));
  if (isNumeric(tmp))
  {
     return tmp;
  }
  else return false;
}

function konverter_tall_input()
{
      //Formatering av tall
      var obj = document.tek_kalkulator;
      var est;
      for (r=0; r<obj.length; r++)
      {
        if (obj[r].type == 'text')
        {
          if (obj[r].id == 'nochange')
             {

            }
            else
            {
           est = er_separert_tall(obj[r].value);
           if (est) obj[r].value = est;
           }
        }
      }
}

function konverter_tall_output()
{
      //Formatering av tall
      var obj = document.tek_kalkulator;

      for (r=0; r<obj.length; r++)
      {
        if (obj[r].type == 'text')
        {
           if (isNumeric(obj[r].value))
           {
             if (obj[r].id == 'nochange')
             {
             }
            else
            {
              //Punktum<>komma
              obj[r].value = obj[r].value.replace(/\./, ',');
              //Tusenskille
              obj[r].value = ThouS(obj[r].value);
            }
           }
        }
      }
}

function ThouS(n) 
{
	var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'),
	sValue=n+'';
	sep = ' ';
	while(sRegExp.test(sValue)) 
	{
		sValue = sValue.replace(sRegExp, '$1'+sep+'$2');
	}
	return sValue;
}

//////////////////////////

    function oppdater_db_felt(navn, nokkel)
    {
      var obj = document.tek_kalkulator;
      for (i=0; i<obj.length; i++)
      {
       if (obj[i].name == "db_" + navn)
       {
         obj[i].value = hent_db_verdi(nokkel);
       }
       if (obj[i].name == "db_eb_" + navn)
       {
         obj[i].value = hent_db_verdi(nokkel);
       }
       if (obj[i].name == "db_gulvvarme_" + navn)
       {
         obj[i].value = hent_db_verdi_(nokkel, 'vg_gulvvarme');
       }
       if (obj[i].name == "db_tappevann_" + navn)
       {
         obj[i].value = hent_db_verdi_(nokkel, 'vg_tappevann');
       }
    }
    }

    function oppdater_echo(navn, verdi)
    {
     var obj = document.tek_kalkulator;
     for (i=0; i<obj.length; i++)
     {
       if (obj[i].name == "___echo_" + navn)
       {
                 // alert("Update echo: " + obj[i].name + " (" + navn + ") = " + verdi + " (fra: " +  obj[i].value + ") ");
         obj[i].value = verdi;
       }
     }
     }

    //HJELPEFUNKSJONER

    function vis_hjelp(kontekst, nokkel)
    {
      var obj = document.getElementById(kontekst);
      obj.innerHTML = hent_db_verdi(nokkel);
      var objtab = document.getElementById(kontekst+"_tabell");
      objtab.style.visibility='visible';
    }

    function oppdater_felt(felt, verdi)
    {
     var obj = eval("document.tek_kalkulator." + felt);
     obj.value = verdi;
    }

//Funksjon som summerer og beregner investeringer og nåverdi reinvesteringer
function summer_felter(prefix, tilinvfelt, tilreinvfelt)
{
 var obj = document.tek_kalkulator;
 var sum = "";
 var sum_reinv = "";
 var tmp, ant;
 for (i=0; i<obj.length; i++)
 {
  if ((obj[i].name.indexOf(prefix) == 0) && isNumeric(obj[i].value))
  {
   sum += obj[i].value;
   sum += "+";
   //Beregner nåverdi for (antall) reinvesteringer (Levetid bygg, 50 år delt på teknisk levetid)
   tmp = eval("document.tek_kalkulator.levetid_tinst_" + obj[i].name);
   //NB!! Bør bruke tmp.options[tmp.selectedIndex].value
   if ( (parseInt(tmp.value) > 0) && (parseInt(tmp.value) <= 50) )
      ant = Math.floor(50 / parseInt(tmp.value));
   else
      ant = 0;

   for (p=1; p<=ant && p<5; p++)
   {
     sum_reinv += (obj[i].value /(Math.pow(1.04, (parseInt(tmp.value)*p))));
     sum_reinv += "+";
   }
  }
 }
  sum += "0";
  sum_reinv += "0";
  var tf = eval("document.tek_kalkulator." + tilinvfelt);
     tf.value = Math.round(eval(sum));
  var trf = eval("document.tek_kalkulator." + tilreinvfelt);
      trf.value = Math.round(eval(sum_reinv));
}

function hent_radio_verdi(obj)
{
  for (var i=0; i < obj.length; i++)
  {
   if (obj[i].checked)
   {
    return obj[i].value;
    }
  }
  return false;
}

function er_radio_valgt(obj)
{
  for (var i=0; i < obj.length; i++)
  {
   if (obj[i].checked)
   {
    return true;
   }
  }
  return false;
}


function isNumeric(value)
{
  if (value == null || value == '' || !value.toString().match(/^[-]?\d*\.?\d*$/))
  {
    return false;
  }
  else
  {
    return true;
  }
}

//Hent verdier fra "databasen"
function hent_db_verdi(nokkel)
{
if (nokkel == false || !nokkel) return '';
return db[nokkel];
}

//Hent verdier fra "databasen"
function hent_db_verdi_(nokkel, subnokkel)
{
if (nokkel == false || !nokkel) return '';
//alert("nokkel: " +nokkel+ ", subnokkel:" +subnokkel+ ", db:" +db[nokkel][subnokkel]);
return db[nokkel][subnokkel];
}

//AJAX?
     //Global variable containing request object
     var req;

     // Get an XMLHttpRequest object in a portable way.
     function newRequest()
     {
     req = false;
     // For Safari, Firefox, and other non-MS browsers
     if (window.XMLHttpRequest) {
     try {
       req = new XMLHttpRequest();
       } catch (e) {
       req = false;
       }
       } else if (window.ActiveXObject) {
       // For Internet Explorer on Windows
       try {
           req = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
       try {
           req = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {
           req = false;
           }
         }
        }
       }

  function visalle()
    {
      var obj = document.tek_kalkulator;
      var test="";
      var str = "";
      var count = 0;

      for (i=0; i<obj.length; i++)
      {
          if (obj[i].checked || obj[i].selected)
          {
          test += obj[i].name + ";" + obj[i].value + " : " + obj[i].length + "\n";
          count++;
          }
      }

      window.clipboardData.setData("text",test);
    }
