/*
  valitsee checkboxeja
*/
var hide;
function box(id, hide) {
  var lol  = $('#'+id).css('display');
  if ( lol == 'block' ) {
    var toggle  = 'none';
  } else {
    var toggle  = 'block';
  }

  $('#'+id).css({
    display: toggle
  });

  jQuery('[rel=navi]').each(function(i){
    if( this.id != id ){
      $('#'+this.id).css({
        display: 'none'
      });
      delayedThrottler.throttle(this.id, 0, function() {});
    }
  });
  if ( hide == true ) {
    setTimeout('delayedThrottler.throttle("'+id+'", 0, function(){});', 250);
  }
}

/*
  sama kuin yllä? mutta ei kuitenkaan, koska tässä suoritetaan tuo kysely kun toggle vaihdetaan
*/
function box2(id, hide) {
  var lol  = $('#'+id).css('display');

  if ( lol == 'block' ) {
    var toggle  = 'none';
  } else {
    var toggle  = 'block';
  }
  
  /*
  // DIFF START
  if ( toggle == 'none' ) {
    submitFormQuery3('', true);
  }
  // DIFF END
  */
  // JG: miksi lista halutaan päivittää kun ruksi-boksin sulkee? lista päivittyy jo siinä kun rukseja ruksailee
  

  $('#'+id).css({
    display: toggle
  });

  jQuery('[rel=navi]').each(function(i){
    if( this.id != id ){
      $('#'+this.id).css({
        display: 'none'
      });
      delayedThrottler.throttle(this.id, 0, function() {});
    }
  });
  if ( hide == true ) {
    setTimeout('delayedThrottler.throttle("'+id+'", 0, function(){});', 250);
  }
}

/*
  tämä on etusivulla. (ts. palauttaa vain tuon lukumäärän) ja
  ilmeisesti asetuksia tuon haku/list/suggest=truen kautta palauttaa sitten noita ehdotuksia
*/
function submitFormQuery2(force) {
  
  var jq = $('#jq').val();
  if ( hide != 1 && ( jq.length > 0 || jq.length == 0 || force == true )) {
    
    var str = $('form#qform').serialize();
    
    // remove from cache
    var rand_no = Math.random();
    var rand_str = ""+rand_no;
    rand_str = rand_str.replace('.', '');

    $.getJSON("/haku/list?"+str+'&page=1&suggest=true&t='+rand_str, function(data){
      
      $('#numFound').text(data.response.numFound); // Työpaikkojen määrä
      $('#numFoundApps').text(data.response.numFoundApps); // Ilmoitusten määrä
      $('#numFoundText').show();
      $('#numFoundAppsText').show(); 
      $('#loading').html('');
      $('#q-suggest').html('');
      if ( $('#jq').val().length > 0 ) {
        var suggestions = data.facet_counts;
        var tbuf = "";
        if (suggestions != undefined) {
          var facetField = data.responseHeader.params['facet.field'];
          var fields = suggestions.facet_fields[facetField];
          if ((fields.length > 0) || ((fields.length == 2) && (fields[0] != document.getElementById('jq').value))) {
            tbuf += '<table class="suggest" id="keynav">';
            var navid = 1;
            for (var i=0; i < fields.length; i+=2) {
              var field = fields[i];
              if (field == undefined) break;
              var fieldFreq = fields[i+1];
              tbuf += '<tr id="nav'+navid+'"><td class="job"><a style="cursor:pointer;" id="nav'+navid+'link" onClick="suggestSubmit(\''+field+'\');">' + field + '</a></td><td class="freq">' + fieldFreq + '</td></tr>';
              navid++;
            }
            tbuf += "</table>";
          }
        }
        $('#q-suggest').html(tbuf);
        /* Ehdotuksien selausavustaja. Toiminta löytyy keybrowse.js */
        navs = navid-1;
        if (curr > navs) { if (navs!=0) {document.getElementById("nav"+navs).style.background=hColor;} curr = navs;}
        if (curr > 0) { document.getElementById("nav"+curr).style.background=hColor; }
      } else { curr = 0; }
    });

    var new_action = null;
    var o_action = "/haku";
    // sitten dopit
    if($('input.form-checkbox:checked').val() != null && $('input.form-checkbox:checked').val() != "" && $('input.form-checkbox:checked').val() != 0){
      // jos joku toimiala on klikattu
      new_action = o_action + '?pos=valittu';
    }
    if ( $('#jq').val().length > 0 ) {
      new_action = o_action + '?pos=hakusana';
    }
    if(new_action != null){
      $('#qform').attr('action', new_action);
    }

    searchAnalyticsAjax('http://tyopaikat.oikotie.fi/', rand_str);
  }
}

function searchAnalyticsAjax(refUrl, randStr) {

  var toimiala = '';
  var sijainti = '';

  $('#toimialatContent input[type=checkbox]:checked').each(function(){
    if ($(this).val()!='') {
      if (toimiala != '')
        toimiala += ',';
      toimiala += $.trim($('label[for='+$(this).attr('id')+']').text());
    }
  });
  $('#sijainnitContent input[type=checkbox]:checked').each(function(){
    if ($(this).val()!='0') {
      if (sijainti != '')
        sijainti += ',';
      sijainti += $.trim($('label[for='+$(this).attr('id')+']').text());
    }
  });

  if(toimiala != '' || sijainti != '') {

    if (randStr == null || randStr == '') {
      var randNo = Math.random();
      var randStr = ""+randNo;
      randStr = randStr.replace('.', '');
    }

    queryArray = Array();
    queryArray.push('Log=1');
    queryArray.push('dr='+refUrl);
    if (toimiala != '') {
      //oikoty_toimiala
      queryArray.push('oikoty_toimiala='+toimiala);
    }
    if (sijainti != '') {
      //oikoty_maakunta
      queryArray.push('oikoty_maakunta='+sijainti);
    }
    queryArray.push('cb='+randStr);
    //$.get('http://analytics.sanoma.fi/zag.gif?'+queryArray.join('&'));
    var img = new Image();
    $(img).attr('src', 'http://analytics.sanoma.fi/zag.gif?'+queryArray.join('&'));
  }
}

/*
 *  poistaa linkistä / parametreistä turhat muuttujat
 *
 */
function clearFormVars(str){
  var result = '';
  var query = str;
  var pairs = query.split("&");
  for(var i = 0; i < pairs.length; i++) {
    var pos = pairs[i].indexOf('=');
    if (pos == -1) continue;
    var argname = pairs[i].substring(0,pos);
    var value = pairs[i].substring(pos+1);
    if(argname != 'form_token' && argname != 'form_build_id' && argname != 'page_for_listing' && argname != 'form_id' && argname != 'hae' && argname != 'lt' && value != ''){
      result += '&'+argname+'='+value;
    }
  }
  if(result.length > 1){
    result = result.substring(1);
  }
  return result;
}

/*
  kirjoita sivun alkuun sisäinen linkki
  link tulee "normi" muodossa
*/
// globaaliin kontekstiin
var gLinks;

function writeInnerLink(link){
  var append = true;
  gLinks = new Array();

  var eLinks = $('a.iLinkForHistory');
  jQuery.each(eLinks, function(index, value) {
    gLinks[index] = value.name;
  });


  for(var i = 0;i < gLinks.length;i++){
    if(gLinks[i] == link){
      append = false;
    }
  }
  if(append){
    $('body #haullaLoytyi').append('<a name="'+ link +'" class="iLinkForHistory" />');
  }
}


/*
  parsii # merkin jälkeisen tavaran ja palauttaa pagen
  JG: oikeasti tekee seuraavaa: 
       - tutkii hashia (#) ja siirtää siinä olevat asetukset formiin
       - ei palauta enää pagea, sitä ei tarvitse palauttaa
       - skip_jq_update = ei päivitetä jq:ta, tätä tarvitaan vain silloin kun hakusanaa on muutettu
  
*/
function parseInnerLinkParameters(skip_jq_update){


  var page = -1;
  var params = window.location.hash;
  var pairs = params.substring(1).split("&");
  
  for (var i = 0; i < pairs.length; i++) {
    
    var pos = pairs[i].indexOf('=');
    if (pos == -1) continue;
    var argname = pairs[i].substring(0,pos);
    var value = pairs[i].substring(pos+1);
    
    if(value != ''){
      
      // hakusana (ei muuteta silloin kun hakutulokset päivitetään hakusanan muuttumisen triggeröimänä)
      if(argname == 'jq' && skip_jq_update != true){
            value = decodeURIComponent(value); // ie, chrome jne tarvitsevat. muuten esim hakusana "päällikkö" muuttuu hakusanakentässä uri-encodattuun muotoon
            $('#jq').attr('value', value );
            $('#lt').attr('value', value );
      }
      
      // sivu
      else if(argname == 'page' && value != ''){
        setPageInForm(value, null); // jos tullaan ajax linkistä niin tämä muuttaa takaisin vääräksi.
      }
      
      // sorttaus
      else if(argname == 'sort' && value != ''){
        /*
        value = value.replace('+', ' ');
        $('#sort').attr('value',value); // sortti tuupataan lomakkeeseen?
        // tarkista onko oikea valittu yläreunasta
        checkSortValid(value);
        */
      }
      
      // julkaistu (radio-buttoneita)
      else if (argname == 'julkaistu' && value != '') {
        $('#edit-' + argname + '-' + value).attr('selected', true);
      }
      
      // checkboxit (toimiala, maakunta, tslaatu, tlaatu)
      else {
        argname = argname.replace(/[^a-zA-Z 0-9]+/g,'');
        argname = argname.replace('toimiala','toimiala-');
        argname = argname.replace('maakunta','maakunta-');
        argname = argname.replace('tslaatu','tslaatu-');
        argname = argname.replace('tlaatu','tlaatu-');
        $('#edit-'+argname+'').attr('checked', true);
      }
      
    }
    
  }
  
}

/*
  tarkistaa onko jotain valittu
*/
function checkSortValid(value){
  var oValue = value; // arvo johon verrataan
  if(  $('#qresult th.selected').length == 0 ){ // mitään ei valittu
    var buf = "";
    value = value.replace('+asc', '');
    if(oValue != value){
      buf = '&nbsp;<img src="/sites/all/themes/tyopaikat_oikotie_fi/img/icon_sortup.gif" />';
    } else {
      buf = '&nbsp;<img src="/sites/all/themes/tyopaikat_oikotie_fi/img/icon_sortdown.gif" />';
    }
    value = value.replace('+desc', '');
    var colName = value.replace(/\./g,'');
    $('#qresult th').removeClass('selected');
    $('#'+colName).addClass('selected');
    if(value != 'score'){
      $('#'+ value + '.sort').html(buf);
    }
  }
}

/*
  asettaa lomakkeen pagen
*/
function setPageInForm(page, link){
  $('#page_for_listing').attr('value',page);
  if(link != null){
    window.location.hash = link;
  }
}

/*
  palauttaa pagen
*/
function returnInnerLinkParameterPage(){
  page = -1;
  params = window.location.hash;
  var pairs = params.substring(1).split("&");
  for(var i = 0; i < pairs.length; i++) {
    var pos = pairs[i].indexOf('=');
    if (pos == -1) continue;
    var argname = pairs[i].substring(0,pos);
    var value = pairs[i].substring(pos+1);
    if(value != ''){
      if(argname == 'page'){
        page = value;
      }
    }
  }
  return page;
}

/*
 *  hakee jq:n arvon
 *
 */
function getJQ(){
  return $('#jq').attr('value');
}


/*
 *  palauttaa tiedon onko IE 6 kyseessä
 *  FIXME: Ei toimi. Palauttaa true myös IE8:lla...
 *  Ehheh... appVersion on yleensä IE:lle jotain "4.0 (compatible; MSIE8; ...)"
 *  Mitäs käy kun siitä parsitaan float? Saadaan 4 <= 6 , eli IE6
 */
var globalIE6 = "null";
function isIE6(){

  if(globalIE6 == "null"){
    var browser=navigator.appName;
    var b_version=navigator.appVersion;
    var version=parseFloat(b_version);
    if (browser=="Microsoft Internet Explorer" && version<=6 ){
      globalIE6 = true;
      return true;
    } else {
      globalIE6 = false;
      return false;
    }
  } else {
    return globalIE6;
  }
}

/*
  tämä haku on sitten tuolla /haku sivulla. Kutsutaan usein ja todella paljon.
  @page - sivu jolla ollaan
  @force - pakotus aloittaa haku -- 

  kaikki arvot poimitaan lomakkeesta
*/
function submitFormQuery3(page, skip_jq_update) {


  // haetaan page lomakkeelta (tarvitaan "palaa hakutuloksiin" linkin yhteydessä)
  if (page === 'fetch') page = $('#page_for_listing').attr('value'); 
    
  parseInnerLinkParameters(skip_jq_update);
  
  var tuloksiaPerSivu = 30;
  var html = '';
  
  var jq = getJQ();
  
  // Formin actioniksi "/haku" (poikkeuksia: Adeccon external-hakusivu, SoTe-alavertikaali)
  var $qform = $('#qform');
  if (
    $qform.attr('action').substr(0,10) != '/haku/ext/' &&
    $qform.find('#edit-custom').val() != 'sote'
  ) {
    $('#qform').attr('action', '/haku');
  }
  
  
  var str = '';
  if ($('form#qform').length) str = $('form#qform').serialize();
  str = clearFormVars(str);
  
  // remove from cache
  var rand_no = Math.random();
  var rand_str = ""+rand_no;
  rand_str = rand_str.replace('.', '');
  
  var jsonUrl = "/haku/list?"+str+'&page='+ page +'&t='+rand_str;
  if (isIE6()) jsonUrl += '&ie6=true';
  
  $.getJSON(jsonUrl, function(data){
    
    // Päivitetään määrä ja hakuehdot
    $('#numFound').text(data.response.numFound);
    $('#searchTerms').html(data.hakuehdot);
    
    // Muodostetan tulostaulukko, loopataan ilmoitukset läpi
    $.each(data.response.docs, function(i,item){
      var jobId = item['job.id'];
      var jobName = item['job.name'];
      var companyName = item['company.name'];
      var jobLocCity = '';
      var jobPublicStart = item['job.publication.start'];
      var jobPublicEnd = item['job.application.end'] != null ? item['job.application.end'] : item['job.publication.end'];
      var listEmphasis = item['searchlistemphasis'];
      
      jobS = jobPublicStart;

      var dd = 1, mm = 1, hh = 1;
      if(jobPublicStart.substring(8,9) == '0'){
        dd = parseInt(jobPublicStart.substring(9,10));
      } else {
        dd = parseInt(jobPublicStart.substring(8,10));
      }
      if(jobPublicStart.substring(5,6) == '0'){
        mm = parseInt(jobPublicStart.substring(6,7)) - 1;
      } else {
        mm = parseInt(jobPublicStart.substring(5,7)) - 1;
      }
      yy = jobPublicStart.substring(0,4);
      hh = parseInt(jobPublicStart.substring(11,13));

      var st = new Date(Date.UTC(yy, mm, dd, hh));
      
      jobPublicStart = '';
      if(st.getDate() < 10){
        jobPublicStart = jobPublicStart + '0' + st.getDate() + '.';
      } else {
        jobPublicStart = jobPublicStart + st.getDate() + '.';
      }
      if(st.getMonth() < 9){
        jobPublicStart = jobPublicStart + '0' + (st.getMonth()+1) + '.';
      } else {
        jobPublicStart = jobPublicStart + (st.getMonth()+1) + '.';
      }
      jobPublicStart = jobPublicStart + st.getFullYear();


      if(jobPublicEnd != null){
        jobPublicEnd = jobPublicEnd.substring(8,10)+'.'+jobPublicEnd.substring(5,7)+'.'+jobPublicEnd.substring(0,4);
      } else {
        jobPublicEnd = "";
      }

      if ( item['job.loc.city'] ) {
        item['job.loc.city'] = item['job.loc.city'].slice(0,10); // Näytetään korkeintaan 5 sijaintia
        jobLocCity = item['job.loc.city'].join("<br />");
        jobLocCity = jobLocCity.replace(/cityAbroad/ig, "Ulkomaat");
        jobLocCity = jobLocCity.replace(/abroad/ig, "Ulkomaat");
      }

      // Listabannerit
      if (i == 5 && $('#list-banner-1').length) {
        html += '<tr><td id="list-banner-td-1" class="list-banner" colspan="5">'+''+'</td></tr>';
      }
      if (i == 17 && $('#list-banner-2').length) {
        html += '<tr><td id="list-banner-td-2" class="list-banner" colspan="5">'+''+'</td></tr>';
      }
      
      
      trClass = (listEmphasis != '0') ? 'rowemp' : '';
      trClass += (i % 2 == 1) ? ' rowodd' : '';
      html += '<tr class="'+trClass+'">';
      
      var path = window.location.pathname;
      if (path.search("haku/ext/sefe") > 0) {
        // Sefen paikat auki omaan ikkunaan
        html += '<td><div class="jobNameWrapper"><a target="_blank" href="/tyopaikka/'+jobId+'">'+jobName+'</a></div></td>';
      } else if (path.search("haku/ext") > 0) {
        html += '<td><div class="jobNameWrapper"><a href="/tyopaikka/'+jobId+'?mode=ripped">'+jobName+'</a></div></td>';
      } else {
        html += '<td><div class="jobNameWrapper"><a href="/tyopaikka/'+jobId+'">'+jobName+'</a></div></td>';
      }

      html += '<td><div class="companyNameWrapper">'+companyName+'</div></td>';
      html += '<td><div class="cityWrapper">'+jobLocCity+'</div></td>';
      html += '<td><div class="pubWrapper">'+jobPublicStart+'</div></td>';
      //html += '<td><div class="pubWrapper">'+jobPublicEnd+'</div></td>';
      html += '</tr>';

    });
    
    // Ei tuloksia, näytetään ohjeteksti
    if (html == '') { 
      var eituloksia = '<tr><td colspan="5"><div id="search-status"><div id="search-status-inner"><h4>Hakuehdoillasi ei löytynyt yhtään työpaikkailmoitusta.</h4><p>Kokeile löytyisikö ilmoituksia seuraavilla keinoilla:</p><ul><li>Lisää ilmoituksen toimialoja</li><li>Lisää ilmoituksen sijaintialueita</li><li>Tarkista kirjoititko oikein käyttämäsi hakusanan</li></ul><p>Voit myös tehdä näillä hakukriteereillä <a href="#" onclick="searchAdwatchSubmit(); return false;">ilmoitusvahdin</a>.</p></div></div></td></tr>';
      $('#result-tbody').html(eituloksia);
      $('div#search-resultcolumn').removeClass('has-results');
    }
    
    // Näytetään tulokset
    else {
      
      $('div#search-resultcolumn').addClass('has-results');
      
      $('#search-status').html('');
      
      $('#qresult thead').show();      
      
      // Listabannerit aina talteen ensin
      tmpBanner = $('#list-banner-td-1').children();
      if (tmpBanner.length > 0) {
        listBanner1 = tmpBanner;
      }
      tmpBanner = $('#list-banner-td-2').children();
      if (tmpBanner.length > 0) {
        listBanner2 = tmpBanner;
      }
      
      // Uusi hakutulosdata
      $('#result-tbody').html(html);
      
      
      // Listabannerit paikalleen
      if (listBanner1 != null) listBanner1.appendTo('#list-banner-td-1');
      if (listBanner2 != null) listBanner2.appendTo('#list-banner-td-2');
      
      $('tr.rowemp').prev('tr').addClass('rowemp-prev');
    }
    
    
    
    
    
    
    // SIVUTUS
    
    // Lasketaan sivujen määrä ja tarkistetaan että sivu on olemassa
    var tablePager = $('#result-tfoot tr td');
    var sivuja  = Math.ceil(data.response.numFound/tuloksiaPerSivu);
    if (page > sivuja && sivuja > 0) { 
      setPageInForm(1);
      writeNewHash(str + '&page=1');
      submitFormQuery3();
    }
    tablePager.empty();
    
    // Tarvitaan sivutus
    if (sivuja > 1){
      // Lasketaan ekan sivun numero (valittu sivu - 2) ja vikan sivun numero
      var alku = 1;
      if (page >= 3) alku = (page - 2);
      var loppu = alku + 4;
      if (loppu > sivuja) loppu = sivuja;
      
      // Luodaan pager html
      var pageInt = parseInt(page);
      var anchor, destPage, destStr, cssClass;
      
      // Edellinen linkki
      if (page > 1) {
        destPage = pageInt - 1;
        anchor = createPagerAnchor(str, destPage, '&laquo; Edellinen', '', 'prev');
        tablePager.append(anchor);
      }
      else tablePager.append('<span>&laquo; Edellinen</span>');
      
      // Numerolinkit
      for (i = alku; i <= loppu; i++) {
        cssClass = (page == i) ? 'selected' : '';
        anchor = createPagerAnchor(str, i, i, cssClass);
        tablePager.append(anchor);
        //writeInnerLink(); // Tämä tekee jotain jännää...
      }
      
      // Seuraava linkki
      if (page < sivuja) {
        destPage = pageInt + 1;
        anchor = createPagerAnchor(str, destPage, 'Seuraava &raquo;', '', 'next');
        tablePager.append(anchor);
      }
      else tablePager.append('<span>Seuraava &raquo;</span>');
      
      $('div#search-resultcolumn')
        .addClass('has-results')
        .addClass('has-pager');
      
    } 
    
    // Ei ole sivutusta: ei tuloksia tai vain yksi sivu
    else { 
      $('div#search-resultcolumn').removeClass('has-pager');
    }
    
    
    $('table#qresult').fadeTo('fast', 1, function(){
      $('#haku-loading').fadeTo('slow', 0);
    });
    
    

  });
  
  writeNewHash(str+'&page='+page);
  checkSortValid($('#sort').attr('value'));

  searchAnalyticsAjax('http://tyopaikat.oikotie.fi/', null);
    
}

/*
  luo pagerin linkin
*/
function createPagerAnchor(str, destPage, text, cssClass, cssId){
  var destStr, anchor;
  destStr = str + '&page=' + destPage;
  anchor = $('<a></a>');
  anchor
    .html(text)
    .attr('href', '#' + destStr)
    .click(function(){
      
      $('#haku-loading').fadeTo('fast', 1, function(){
        $('table#qresult').fadeTo('slow', 0);
      });
      
      // Scrollataan ylös, sen jälkeen päivitetään tulos
      $.scrollTo('h1', 500, { 
        onAfter:function(){ 
          setPageInForm(destPage, destStr);
          submitFormQuery3(destPage);
        } 
      });
      
      return false;
      
    });
  if (cssId != '') anchor.attr('id', cssId)
  if (cssClass != '') anchor.addClass(cssClass);
  return anchor;
}


/*
  toggleSelectin tarvitsema toiminto jota kutsutaan ennen submitForm3:sta
  hakee formista tavarat ja tuuppaa ne hashiin
*/
function formToHash(){
  
  var str = $('form#qform').serialize();
  
  var $page_for_listing = $('input#page_for_listing');
  var page = $page_for_listing.val();
  
  str = clearFormVars(str);
  
  writeNewHash(str + '&page=' + page);
  
}

/*
  vaihda hash urlissa
*/
function writeNewHash(hash){
  var d1 = window.location.hostname;
  var d2 = window.location.pathname;
  var d3 = window.location.search;
  var fLink = 'http://'+d1+d2+d3+'#'+hash;
  window.location = fLink;
}





//  Päivittää search sidebar formia
//  JG: Kutsutaan mm. aina kun jotakin checkboxia klikataan. Katso myös teeman script.js. 
//  Tämä oli alunperin ihan erilainen funktio ja tämän lisäksi oli melkein samanlainen 
//  funktio ToggleCheck. Niiden toiminnallisuus on nyt refaktoroitu tähän funktioon.
//  - action: reset, update, init
//  - $element: input tai form, riippuen päivitetään yhtä laatikkoa vai koko formia
//  
//  Huom! Ilmoitussivun formissa on käytössä uusittu markup mutta hakusivulla vielä vanha markup.
//  Markuppien eroavaisuudet on jouduttu joissain kohdissa ottamaan huomioon tässä skriptissä.
//  Jos hakusivun markup saadaan joskus kokonana uudistettua niin sen jälkeen nuo kohdat voi
//  poistaa tästä skriptistä.
function checkSelected(action, $element){
  
  // Lista: itemit pois ja "kaikki" sana esiin
  if (action == 'reset' || action == 'update') {
    
    var $valitutDiv;
    if ($element.is('form')) $valitutDiv = $('div.valitut'); // Ollaan käsittelemässä koko formia
    else $valitutDiv = $element.parents('.selectionGroup').find('div.valitut'); // Klikattiin inputtia tai reset-linkkiä
    
    $valitutDiv.find('ul').hide(0).find('li').remove();
    $valitutDiv.find('div.valittu').show(0);
    
    // Muokataan rukseja jos on painettu resettiä
    if (action == 'reset') {
      
      // Hakusivun markup / Ilmoitussivun markup
      // TODO: parannetaan hakusivun markuppia jotta tätä erottelua ei tarvita
      var laatikko = $element.parents('table.laatikko');
      if (laatikko.length == 0) laatikko = $element.parents('div.form-box');
      laatikko.find('input').attr('checked', false);
      laatikko.find('input.reset-link').attr('checked', true);
      
      // Location-widgetin reset: triggeröidään click jokaiselle optionille (palautuvat kaupunki-selecteihin)
      if ($element.hasClass('reset-form-box-location')) {
        laatikko.find('select#edit-location-fake option').click();
      }
      
    };
    
  };
  
  // Valitaan käsiteltävät ruksit (koko formi tai vain yksi laatikko)
  var $ruksitut;
  if ($element.is('form')) $ruksitut = $('form#qform input:checked').not('form#qform input.reset-link');
  else $ruksitut = $element.parents('.selectionGroup').find('input:checked').not('input.reset-link');
  
  // Jos ei ole valintoja, varmistetaan että reset-inputit on aktiivisina
  if ($ruksitut.length == 0) {
    $('form#qform input.reset-link').attr('checked', true); // hakusivu
    $element.parents('div.form-box').find('input.reset-link').attr('checked', true); // ilmoitussivu
    if ($element.hasClass('form-box')) $element.find('input.reset-link').attr('checked', true); // ilmoitussivu
  }
  
  // Rukseja löytyy, luodaan valintoja vastaavat list-itemit
  $ruksitut.each(function(){
    
    // Apumuuttujia
    var $thisInput = $(this);
    var $thisGroup = $thisInput.parents('table.valintaTable');
    if ($thisGroup.length == 0) $thisGroup = $thisInput.parents('div.form-box');
    var $valitutDiv = $thisGroup.siblings('div.valitut');
    var teksti = $thisInput.parent('label').text();
    
    // Varmistetaan ettei "kaikki" ruksi ole ruksattu
    $thisGroup.find('input.reset-link').attr('checked', false);
    
    // Luodaan ruksattua ruksia vastaava list-item
    var $listItem = $('<li>' + teksti + '</li>');
    $valitutDiv.find('ul').show(0).append($listItem);
    $valitutDiv.find('div.valittu').hide(0);
    
    // List-itemiä klikkaamalla ruksi ja itemi poistetaan
    $listItem.click(function(){
      $thisInput.attr('checked', false);
      checkSelected('update', $thisInput);
      $thisInput.trigger('change');
    });
    
  });
  
  
  // Location-widget selecti (oma käsittelynsä tälle)
  if ($element.is('select#edit-selected-areas')) {
    
    if ($element.val()) {
      
      var $thisGroup = $element.parents('.form-box');
      var $valitutDiv = $thisGroup.siblings('div.valitut');
      var $fakeSelect = $thisGroup.find('select#edit-location-fake');
      
      // Lista esiin, "kaikki" sana piiloon
      $valitutDiv.find('ul').show(0);
      $valitutDiv.find('div.valittu').hide(0);
      
      // Käytetään feikki-selectiä jotta saadaan itemit samassa järjestyksessä
      $fakeSelect.find('option').each(function(){
        
        var $thisOption = $(this);
        var $listItem = $('<li>' + $thisOption.text() + '</li>');
        $valitutDiv.find('ul').append($listItem);
        
        // List-itemin click vastaa fake-selectissä optionin klikkaamista
        $listItem.click(function(){ 
          $fakeSelect.find('option[value=' + $thisOption.val() + ']').click();
        });
        
      });
    };
    
  }
  
  
  // Tehdään lopullisia päivityksiä sen mukaan millä sivulla ollaan
  var updateSearchResults = false;
  var updateNumFound = false;
  if ($('body.front').length > 0) updateNumFound = true;
  if ($('table#qresult').length > 0) updateSearchResults = true;
  
  // Päivitetään hakutulokset (hakusivu ja sen variaatiot)
  if (updateSearchResults) {
    formToHash();
    $('table#qresult').fadeTo('fast', 0, function(){
      $('#haku-loading').fadeTo('slow', 1);
      submitFormQuery3('fetch'); // fetch = haetaan page formista (tarvitaan "palaa hakutuloksiin" linkin kautta tultaessa)
    });
  }
  
  // Päivitetään tulosten määrä (mm. etusivulla)
  if (updateNumFound) {
    submitFormQuery2(false);
  }
  
}



/*
  etusivun tabien vaihto
*/
function switchLink(id) {
  $('#vasenAlaBlock a').removeClass('selected');
  $('#vasenAlaBlock div.lifts').css('display', 'none');

  $('#'+id+'Link').addClass('selected');
  $('#'+id+'Content').css('display', '');
}

/*
  kuvaus tähän
*/
/*
function edellinen(id, start, numfound) {
  var str = $('#query').val();
  var arr = '';

  if ( start > 0) {
    start  = start-1;
  } else {
    start  = 0;
  }

  $.getJSON(str+'&start='+start+'&rows=1', function(data){
    $.each(data.response.docs, function(i,item){
      var jobId        = '';
      $.each(item, function(b, lala) {
        if ( lala != undefined) {
          if ( b == 'id') {
            parent.location  = '/kurssi/'+lala+'_'+start;
          }
        }
      });
    });
  });
}
*/

/*
  kuvaus tähän
*/
/*
function seuraava(id, start, numfound) {
  var str = $('#query').val();
  var next = '';
  var jobId2  = '';

  if ( start < numfound) {
    start  = start+1;
  } else {
    start  = numfound;
  }

  $.getJSON(str+'&start='+start+'&rows=1', function(data){
    $.each(data.response.docs, function(i,item){
      var jobId        = '';
      $.each(item, function(b, lala) {
        if ( lala != undefined) {
          if ( b == 'id') {
            parent.location  = '/kurssi/'+lala+'_'+start;
          }
        }
      });
    });
  });
}
*/

/*
  kun dokumentti on ladattu kutsutaan
*/
var listBanner1 = null;
var listBanner2 = null;

$(document).ready(function() {
  listBanner1 = $('#list-banner-1').children().not('script').not('noscript');
  listBanner2 = $('#list-banner-2').children().not('script').not('noscript');
  $("[rel=navi]").blur(function () {
    jQuery('[rel=navi]').each(function(i){
      $('#'+this.id).css({
        display: 'none'
      });
      delayedThrottler.throttle(this.id, 0, function() {});
    });
  });

  // HP 20.9.2011: Varmistetaan hakusana pysyminen formissa
  // kun submitaan kesken tulosten latauksen.
  $('#qform').submit(function() {

    $('#jq').attr('value', $('#lt').val());

    // Normi käsittely..
    return true;
  });
});

/*
  kuvaus tähän
*/
function suggestSubmit(field) {
  //alert(field);
  document.getElementById('jq').value=field;
  document.forms.qform.submit();
  return false;
}



