/*
  ĵavaskripta programo por kukolo
  - 2010-01-16 nova proceduro antauxagordu por "cxiuj"-butonoj
  - 2009-12-19 apartigis la programon en propran dosieron
*/

/* ---------- pagxaj variabloj ---------- */

var kadrumo;
var klakoj              = new Array();                // tabelo por montro-malmontro de ĉapitroj

/* ---------- lingvaj variabloj ---------- */

var fleksioKaza         = new fleksio('kaza');
var fleksioNombra       = new fleksio('nombra');
var fleksioNombraKaza   = new fleksio('nombrakaza');
var fleksioTempa        = new fleksio('tempa');
var ilVortoj            = new Array();                // ne etuskigindaj il-vortoj de guglo
ilVortoj['OR']          = 1;

/* ---------- pagxaj funkcioj ---------- */

window.onload = function() {                          // je malfermo de la pagxo...
  document.getElementById('deEsprimo').value = '';    // malplenigo
  document.getElementById('alEsprimo').value = '';    // malplenigo
  document.getElementById('deEsprimo').select();      // ... kursoron en la unuan serĉofakon
  self.scrollTo(0, 0);                                // ... iras al la supro de la pagxo
  var divs = document.getElementsByTagName('div');    // plenigas la tabelon de cxapitroj
  for (d in divs) {
    klakoj[divs[d].id] = 0;
  }
  // alert(top.location.href);
  //(top.location.href.indexOf("kukolingo") != -1) && (getElementById('kukolingo').check());
  //(top.location.href.indexOf("kukolo") != -1)    && (getElementById('kukolo').check());
  //(top.location.href.indexOf("kukoleto") != -1)  && (getElementById('kukoleto').check());
  (top.location.href.indexOf("kukolingo.htm") != -1) && (kadrumo = 'kukolingo');
  (top.location.href.indexOf("kukolo.htm")    != -1) && (kadrumo = 'kukolo');
  (top.location.href.indexOf("kukoleto.htm")  != -1) && (kadrumo = 'kukoleto');
  document.getElementById(kadrumo).checked = true;

}

function agordo() {
  with(document) {
    (getElementById('c').checked) && (this.literumoC = 1); // ĉu ĉapelskribo
    (getElementById('h').checked) && (this.literumoH = 1); // ĉu hoskribo
    (getElementById('i').checked) && (this.literumoI = 1); // ĉu isolat3-a skribo
    (getElementById('x').checked) && (this.literumoX = 1); // ĉu iksskribo
	
    (getElementById('fn').checked) && (this.fleksioN  = 1); // ĉu fleksiu nombre
    (getElementById('fk').checked) && (this.fleksioK  = 1); // ĉu fleksiu kaze
    (getElementById('ft').checked) && (this.fleksioT  = 1); // ĉu fleksiu tempe

    (getElementById('l').checked) && (this.frazo     = 1); // ĉu laŭvorta serĉo

    var plusoj;
    (getElementById('pCxiam').checked)  && (plusoj = getElementById('pCxiam').value);
    (getElementById('p7').checked)      && (plusoj = getElementById('p7').value);
    (getElementById('pNeniam').checked) && (plusoj = getElementById('pNeniam').value);
    (getElementById('pe').checked) &&
    (this.plusEstas = plusoj);  // plejo da signoj por "+estas"
    (getElementById('pk').checked) &&
    (this.plusKaj = plusoj);  // plejo da signoj por "+kaj"
    (getElementById('pl').checked) &&
    (this.plusLa  = plusoj);  //  plejo da signoj por "+la" (aux lauxelekta vorto)
  
    var fokuso = getElementById('fokuso');                 // traserĉota retejo
    (fokuso.value.match(/\S/)) && (this.fokuso = " site:" + fokuso.value);

    var retindekso = getElementById('retindekso');         // pridemandata serĉilo
    this.retindekso = retindekso.options[retindekso.selectedIndex].value;
  }
}

function antauxAgordu(id, klasnomo, defauxlto) {
  if (klasnomo == '') { // oni alklakis la estran butonon ("cxiuj")
    butonestro = document.getElementById(id);
	butonpeono = document.getElementsByClassName(id);
	for (b in butonpeono) {  // regas la estra butono
	  butonpeono[b].checked = butonestro.checked;
	}
  }
  else { // oni alklakis alian butonon
    butonestro = document.getElementById(klasnomo);
	butonpeono = document.getElementsByClassName(klasnomo);
	butonestro.checked = true;
	for (b in butonpeono) { // unu malobea sklavobutono regas
	  if (butonpeono[b].checked == false) {
	    butonestro.checked = false;
		break;
	  }
	}
  }
  if (typeof defauxlto != 'undefined') {
    butonoDefauxlta = document.getElementById(defauxlto);
	butonpeonoj = butonpeono.length;
	butonfalsoj = 0;
	for (b in butonpeono) {
	  if (butonpeono[b].checked == false) {
	    butonfalsoj += 1;
	  }
	}
	if (butonfalsoj == butonpeonoj) {
	  butonoDefauxlta.checked = true;
	}
  }
}

function alternu(id) {                 // montras aux malmontras la enhavojn de ĉapitroj
  var ero = document.getElementById(id);
  ero.style.display = 'none';
  ((++klakoj[id] % 2) == 1) && (ero.style.display = 'block');
}

function getElementStyle(element, prop) { // author: travis beckham, squidfingers.com
  if (element.style[prop]) { // inline style property
    return element.style[prop];
  }
  else if (element.currentStyle) { // external stylesheet for Explorer
    return element.currentStyle[prop];
  }
  else if (document.defaultView && document.defaultView.getComputedStyle) { // external stylesheet for Mozilla and Safari 1.3+
    prop = prop.replace(/([A-Z])/g,"-$1");
    prop = prop.toLowerCase();
    return document.defaultView.getComputedStyle(element,"").getPropertyValue(prop);
  }
  else { // Safari 1.2
    return null;
  }
}

document.getElementsByClassName = function(klasnomo) {
  var klasanoj = new Array();
  if (klasnomo != ""){
    var cxio = document.getElementsByTagName('*');
    var jxokero = new RegExp("(^|\\s)" + klasnomo + "(\\s|$)");
    for (var i = 0; i < cxio.length; i++) {
      var klaso = (cxio[i].className) ? cxio[i].className : "";
      if (klaso != "" && klaso.match(jxokero)){
        klasanoj.push(cxio[i]);
      }
    }
  }
  return klasanoj;
}  

function kadrumu(kiel) {       // alternas inter kadraj kaj senkadra versioj
  switch(kiel) {
    case 'kukolingo.htm':
    case 'kukolo.htm':
      top.location = self.location.href.replace(/\\/g, "/").substr(0, 
      self.location.href.lastIndexOf("/")+1) + kiel;
      break;
    default:
      top.location = self.location;
      break;
  }
}

function kopiu(fontoId, celoId) {       // xx
  var fonto = document.getElementById(fontoId);
  var celo  = document.getElementById(celoId);
  celo.value = fonto.options[fonto.selectedIndex].value;
  
}

function litergrandigu(kiom, kio) {           // grandigas aŭ malgrandigas la literojn
  (typeof kio == 'undefined') && (kio = document.getElementsByTagName('body')[0]);
  (isNaN(kiom))               && (kiom = 1);
  var fontSize = getElementStyle(kio, "fontSize");
  var jam      = fontSize.match(/\d+/) - 0;
  var unuo     = fontSize.match(/[A-Za-z]+/);
  kio.style.fontSize = ((jam + kiom) + unuo);
}

/* ---------- lingvaj funkcioj ---------- */

function fleksio(speco) {
  var formoj = new Array();
  switch(speco) {
    case 'kaza':
      formoj.push('n', '');
      break;
    case 'nombra':
      formoj.push('j', '');
      break;
    case 'nombrakaza':
      formoj.push('jn', 'j', 'n', '');
      break;
    case 'tempa':
      formoj.push('os', 'as', 'is', 'us', 'u', 'i');
      break;
    default:
      formoj.push('');
  }
  this.formoj = formoj;
}

function vorto(konsisto) {
  var avortas      = new RegExp("(.*)aj?n?$", "i");
  var ovortas      = new RegExp("(.*)oj?n?$", "i");
  var plurvocxeras = new RegExp("[ieaou].*[ieaou]", "i")
  var utabelvortas = new RegExp("^((\u0109|k|nen|t)?iu)j?n?$", "i")
  var verbas       = new RegExp("(.*)([iaou]s|i|u)$", "i");
  this.klasilo     = '';                    // defaŭlto
  this.klaso       = 'x';
  this.radikalo    = konsisto;
  if (plurvocxeras.test(konsisto)) {        // nur plursilabaj vortoj
    if (avortas.test(konsisto)) {
      this.klasilo      = 'a';
      this.klaso        = 'a';
      this.radikalo     = RegExp.$1;
    }
    if (ovortas.test(konsisto)) {
      this.klasilo      = 'o';
      this.klaso        = 'o';
      this.radikalo     = RegExp.$1;
    }
    if (verbas.test(konsisto)) {
      this.klasilo      = '';
      this.klaso        = 'i';
      this.radikalo     = RegExp.$1;
    }
    if (utabelvortas.test(konsisto)) {
      this.klasilo      = '';
      this.klaso        = 'u';
      this.radikalo     = RegExp.$1;
    }
  }
  // metodoj
  this.fleksiu = function(fleksio) {
    var formoj  = new Array();
    for (var f in fleksio.formoj) {
      formoj.push(this.radikalo + this.klasilo + fleksio.formoj[f]);
    }
    return formoj;
  }
}

function transformu(deEsprimo, alEsprimo) { // kontrolas je cxiu klavlevo aux rubrik-klako
  var de           = document.getElementById(deEsprimo);   // serĉo-tekstujo
  var al           = document.getElementById(alEsprimo);   // alivortuma tesktujo
  var bufro        = "";
  var sercxoManiero = document.getElementById('sercxoManiero');
  var cxapelas     = new RegExp("[\u0109\u011d\u0125\u0135\u015d\u016d]", "i");
  var iksas        = new RegExp("[cghjsu]x", "i");
  var plusVorto    = document.getElementById('plusVorto');

  al.value = "";
  var agordoNuna = new agordo();

  if (de.value.match(/\S/)) {     // se io estas klavita
    // cxapelizas
	(iksas.test(de.value)) && (de.value = de.value.literumu('x', 'ĉ'));
    // normas spacojn
	var vortoj = de.value.replace(/^\s+|\s+$/g, "").split(/\s+/);
    for (var v in vortoj) {
      // etuskligas krom il-vortoj
      (ilVortoj[vortoj[v]] != 1) && (vortoj[v] = vortoj[v].toLowerCase());
      // transformas al objekto vorto
      var vortoNuna = new vorto(vortoj[v]);
      var formoj    = new Array();
      // kalkulas fleksiajn formojn
      switch(vortoNuna.klaso) {
        case "a": case "o": case "u":
          (agordoNuna.fleksioN) &&
          (formoj = vortoNuna.fleksiu(fleksioNombra));

          (agordoNuna.fleksioK) &&
          (formoj = vortoNuna.fleksiu(fleksioKaza));

          (agordoNuna.fleksioN) && (agordoNuna.fleksioK) &&
          (formoj = vortoNuna.fleksiu(fleksioNombraKaza));
          break;
        case "i":
          (agordoNuna.fleksioT) &&
          (formoj = vortoNuna.fleksiu(fleksioTempa));
          break;
      }
      (formoj.length == 0) && (formoj.push(vortoj[v]));
      // kalkulas alternativajn literumojn
      if (cxapelas.test(vortoNuna.radikalo)) {   // ĉapela vorto
        var aliformoj    = new Array();
        for (f in formoj) {
		  (agordoNuna.literumoC)  &&
          (aliformoj.push(formoj[f]));
		  (agordoNuna.literumoX)  &&
          (aliformoj.push(formoj[f].literumu('ĉ', 'x')));
          (agordoNuna.literumoH)  &&
          (aliformoj.push(formoj[f].literumu('ĉ', 'h')));
          (agordoNuna.literumoI)  &&
          (aliformoj.push(formoj[f].literumu('ĉ', 'i')));
        }
        formoj = aliformoj;
      }
      if (vortoj[v].substr(0, 1) == "-") {
	    // formoj de nesercxata vorto => kaj (gugle: spaco)
        (vortoj[v] = formoj.join(' '));
      }
	  else {
	    // formoj de sercxata vorto => aux (gugle: OR)
        vortoj[v] = formoj.join(' OR ');
      }
    }
    bufro = vortoj.join(' ');
    
    // ĉirkaŭas per citiloj, se serĉo de laŭvorta esprimo estas petata
    (agordoNuna.frazo) && (bufro = '"' + bufro + '"');
    
    // aldonas esperantajn vortojn, se tio estas petata
    var longo = de.value.join(' ').length;
    (longo < agordoNuna.plusEstas) && (bufro += " +estas");
    (longo < agordoNuna.plusKaj) && (bufro += " +kaj");
    (longo < agordoNuna.plusLa)  && (bufro += " +" + plusVorto.value.trim());

    // fokusas la serĉon al aparta retejo
    (agordoNuna.fokuso) && (bufro += agordoNuna.fokuso);

    // fokusas la serĉon al aparta indekso
    (agordoNuna.retindekso) && (sercxoManiero.action = agordoNuna.retindekso);
  }
  al.value = bufro.join(' ');                 // normas spacojn
}

String.prototype.literumu = function(dekodo, alkodo) { // ŝanĝas literumon
  t = this;
  switch(dekodo + alkodo) {
    case 'ĉh':               // de utf8a kodo al hoskribo
      t = t.replace(/\u0109/gi, "ch");
      t = t.replace(/\u011d/gi, "gh");
      t = t.replace(/\u0125/gi, "hh");
      t = t.replace(/\u0135/gi, "jh");
      t = t.replace(/\u015d/gi, "sh");
      t = t.replace(/\u016d/gi, "u");
      break;
    case 'ĉi':               // de utf8a kodo al kodo isolat3
      t = t.replace(/\u0109/gi, "\u00E6");
      t = t.replace(/\u011d/gi, "\u00F8");
      t = t.replace(/\u0125/gi, "\u00B6");
      t = t.replace(/\u0135/gi, "\u00BC");
      t = t.replace(/\u015d/gi, "\u00FE");
      t = t.replace(/\u016d/gi, "\u00FD");
      break;
    case 'ĉx':               // de utf8a kodo al iksoskribo
      t = t.replace(/\u0109/gi, "cx");
      t = t.replace(/\u011d/gi, "gx");
      t = t.replace(/\u0125/gi, "hx");
      t = t.replace(/\u0135/gi, "jx");
      t = t.replace(/\u015d/gi, "sx");
      t = t.replace(/\u016d/gi, "ux");
      break;
    case 'xh':               // de iksoskribo al hoskribo
      t = t.replace(/cx/gi, "ch");
      t = t.replace(/gx/gi, "gh");
      t = t.replace(/hx/gi, "hh");
      t = t.replace(/jx/gi, "jh");
      t = t.replace(/sx/gi, "sh");
      t = t.replace(/ux/gi, "u");
      break;
    case 'xi':               // de iksoskribo al kodo isolat3
      t = t.replace(/cx/gi, "\u00E6");
      t = t.replace(/gx/gi, "\u00F8");
      t = t.replace(/hx/gi, "\u00B6");
      t = t.replace(/jx/gi, "\u00BC");
      t = t.replace(/sx/gi, "\u00FE");
      t = t.replace(/ux/gi, "\u00FD");
      break;
    default:                 // de iksoskribo al utf8a kodo
      t = t.replace(/cx/gi, "\u0109");
      t = t.replace(/gx/gi, "\u011d");
      t = t.replace(/hx/gi, "\u0125");
      t = t.replace(/jx/gi, "\u0135");
      t = t.replace(/sx/gi, "\u015d");
      t = t.replace(/ux/gi, "\u016d");
  }
  return t;
}

String.prototype.join = function(interajxo) {       // normas interspacojn
  return this.replace(/^\s+|\s+$/, "").split(/\s+/).join(interajxo);
}

String.prototype.trim = function() {       // forigas komencajn kaj finajn spacojn
  return this.replace(/^\s+|\s+$/, "");
}
