var timerClass = function(func, interval) {
  this.func = func;
  this.repeat = interval > 0;
  this.interval = this.repeat ? interval : -interval;
  this.data = new Array();
  if (arguments.length > 2) {
    for (var i = 2; i < arguments.length; ++i) 
      this.data.push(arguments[i]);
  }
  
  function runfunc() {
    if (!this.data.length)
      this.func();
    else {
      this.func.apply(this.func.callee,this.data);
    }
  }
  
  this.stop = function() {
    window.clearInterval(this.id)
  }
  
  if (this.repeat) 
    this.id = window.setInterval(function() { runfunc.call(this); }.bind(this),this.interval);
  else  
    this.id = window.setTimeout(function() { runfunc.call(this); }.bind(this),this.interval);
}

// elküldi a formot a beírt adatokkal a címsorban szereplő címre
function submit_self(form)
{
  form.action = document.location.href;
  form.submit();
}

function setup_focus(form)
{
  var elems = Form.getElements(form);
  for (var i = 0; i < elems.length; ++i) {
    elems[i].observe('focus',function(e) { Event.element(e).focused = true; } );
    elems[i].observe('blur',function(e) { Event.element(e).focused = false; } );
  }
}

function setup_blur(form,func,interval)
{
  if (form.blur__started === true) 
    return;
  form.blur__started = true;
  var elems = Form.getElements(form);
  var obj = { 'form': form, 'func': func, 'interval': interval };
  for (var i = 0; i < elems.length; ++i) {
    elems[i].blur__obj = obj;
    elems[i].focus__func = function(e) { Event.element(e).focused = true; };
    elems[i].blur__func = function(e) {
        Event.element(e).focused = false;
        startTiming(function() {
            var elems_ = Form.getElements(this.form);
            var focused = false;
            for (var j = 0; j < elems_.length && !focused; ++j) 
              focused = elems_[j].focused;
            if (!focused)
              this.func();
          }.bind(Event.element(e).blur__obj) ,Event.element(e).blur__obj.interval, false);
      };
    elems[i].observe('focus', elems[i].focus__func);
    elems[i].observe('blur', elems[i].blur__func);
  }
}

function stop_blur(form)
{
  if (form.blur__started === undefined || !form.blur__started)
    return;
  form.blur__started = false;

  var elems = Form.getElements(form);
  for (var i = 0; i < elems.length; ++i) {
    elems[i].focused = false;
    elems[i].stopObserving('focus', elems[i].focus__func);
    elems[i].stopObserving('blur', elems[i].blur__func);
    elems[i].focus__func = null;
    elems[i].blur__func = null;
    elems[i].blur__obj = null;
  }
}

function indexOfValue(select,value)
{
  for (var i = 0; i < select.options.length; ++i)
    if (select.options[i].value == value)
      return i;
  return -1;
}

function selectValue(select,value)
{
  var ix = indexOfValue(select,value);
  if (ix >= 0)
    select.selectedIndex = ix;
}

function limitHTMLWordCount(text,max)
{
  var result = '';
  var cnt = 0;
  var parents = new Array();
  var frag = new Element('div', {} );
  frag.innerHTML = text;
  if (frag.childNodes.length == 0)
    return;
  var current = frag.firstChild;
  while (current) {
    if (cnt == max) {
      var next = current.nextSibling;
      current.parentNode.removeChild(current);
      if (next)
        current = next;
      else
        current = parents.pop();
    } else if (current.nodeType == 3) {
      var words = current.nodeValue.split(' ');
      var pos = 0;
      for (var i = 0; i < words.length && cnt < max; ++i) {
        if (!words[i].blank())
          cnt++;
        pos += words[i].length+1;
      }
      if (cnt == max) 
        current.nodeValue = current.nodeValue.substr(0,pos-1);
        
      if (current.nextSibling)
        current = current.nextSibling;  
      else
        current = parents.pop();
    } else if (current.childNodes && current.childNodes.length > 0) {
      if (current.nextSibling)
        parents.push(current.nextSibling);
      current = current.firstChild;
    } else {
      if (current.nextSibling)
        current = current.nextSibling;  
      else
        current = parents.pop();
    }
  }
  return frag.innerHTML;
}

Object.extend(String.prototype, (function() {
  var abc = { "A" : 10, "a" : 11, "Á" : 20, "á" : 21, "B" : 30, "b" : 31, "C" : 40, "c" : 41,
              "D" : 50, "d" : 51, "E" : 60, "e" : 61, "É" : 70, "é" : 71, "F" : 80, "f" : 81,
              "G" : 90, "g" : 91, "H" : 100, "h" : 101, "I" : 110, "i" : 111, "Í" : 120, "í" : 121,
              "J" : 130, "j" : 131, "K" : 140, "k" : 141, "L" : 150, "l" : 151, "M" : 160, "m" : 161,
              "N" : 170, "n" : 171, "O" : 180, "o" : 181, "Ó" : 190, "ó" : 191, "Ö" : 200, "ö" : 201,
              "Ő" : 210, "ő" : 211, "P" : 220, "p" : 221, "Q" : 230, "q" : 231, "R" : 240, "r" : 241,
              "S" : 250, "s" : 251, "T" : 260, "t" : 261, "U" : 270, "u" : 271, "Ú" : 280, "ú" : 281,
              "Ü" : 290, "ü" : 291, "Ű" : 300, "ű" : 301, "V" : 310, "v" : 311, "W" : 320, "w" : 321,
              "X" : 330, "x" : 331, "Y" : 340, "y" : 341, "Z" : 350, "z" : 351 };

  function compareIgnoreCase(str)
  {
    var len = Math.min(this.length,str.length);
    var wins = 0;
    var k = new Object();
    for (var i = 0; i < len; ++i) {
      var c1 = this.charAt(i);
      var c2 = str.charAt(i);
      if (c1 == c2)
        continue;
      var f1 = abc[c1];
      var f2 = abc[c2];
      if (f1 === undefined && f2 === undefined) {
        return c1 < c2 ? -1 : (c1 > c2 ? 1 : 0);
      }  
      if (f1 === undefined)
        return -1;
      if (f2 === undefined)
        return 1;
      var f1m = (f1 % 10);
      var f2m = (f2 % 10);
      
      if (f1-f1m == f2-f2m)
        continue;
      
      return f1-f1m < f2-f2m ? -1 : 1;
    }
    return this.length < str.length ? -1 : this.length > str.length ? 1 : 0;
  }
  
  function compare(str)
  {
    var len = Math.min(this.length,str.length);
    var wins = 0;
    var k = new Object();
    for (var i = 0; i < len; ++i) {
      var c1 = this.charAt(i);
      var c2 = str.charAt(i);
      if (c1 == c2)
        continue;
      var f1 = abc[c1];
      var f2 = abc[c2];
      if (f1 === undefined && f2 === undefined) {
        return c1 < c2 ? -1 : (c1 > c2 ? 1 : 0);
      }  
      if (f1 === undefined)
        return -1;
      if (f2 === undefined)
        return 1;
      var f1m = (f1 % 10);
      var f2m = (f2 % 10);
      
      if (f1-f1m == f2-f2m) {
        if (wins == 0 && (f1m != 0 || f2m != 0)) 
          wins = (f1m == 0 ? -1 : 1);
        continue;
      }  
        
      return f1-f1m < f2-f2m ? -1 : f1-f1m > f2-f2m ? 1 : 0;
    }
    return this.length < str.length ? -1 : this.length > str.length ? 1 : wins;
  }
  
  function prepare(str)
  {
    return str.toLowerCase().replace(/[^0-9a-zíöüóőúűéáÍÖÜÓŐÚŰÉÁ]/g,"")
           .replace(/[0-9]/g,"0").replace(/ph/g,"f")
           .replace(/[öóőÖÓŐouúUÚüÜűŰ]+/g,"o").replace(/(?:[éÉáÁa]|ve|va)/g,"e")
           .replace(/[íÍi]+/g,"i")
           .replace(/(?:cs|dzs|ty|tj|tch|ch|ts|t|sz|d)/g,"c").replace(/(?:ph|f|sh|sth)/g,"s")
           .replace(/(?:dj|zs|gy|ly|ny|bj|gj|kj|lj|tj|mj|nj)/g,"j").replace(/dz|tz|bz|lz|pz|/g,"z")
           .replace(/(?:nd|th|m|n|b|v|w)/g,"b")
           .replace(/(?:l|r)/g,"l").replace(/(?:k|g)/g,"k")
           .replace(/([dfghjklmnrtvwxyz])h/g,"$1").replace(/(.)\1/g,"$1");
  }
  
  function regEscapeName(str)
  {
    return str.replace(/([\\\s.+?*()\[\]=!<>^${}])/g,"\\$1");
  }
  
  function escapeName(str)
  {
    return str.replace(/([\\\s])/g,"\\$1");
  }
  
  function hasEscapedName(str)
  {
    return new RegExp("(?:^|(?:[^\\\\](?:\\\\\\\\)*|^(?:\\\\\\\\)*)\\s)"+regEscapeName(escapeName(str))+"(?:\\s|$)","i").test(this);
  }
  
  function addEscapedName(str)
  {
    if (this.hasEscapedName(str))
      return;
    return this+(this.length == 0 ? "" : " ")+escapeName(str);
  }
  
  function removeEscapedName(str)
  {
    if (!this.hasEscapedName(str))
      return;
    var re = new RegExp("(?:^|([^\\\\](?:\\\\\\\\)*|^(?:\\\\\\\\)*)\\s)"+regEscapeName(escapeName(str))+"(\\s|$)","i");
    return this.replace(re,"$1$2").replace(/^\s*/,"");
  }
  
  function levenshtein(str2)
  {
    str1 = prepare(this);
    str2 = prepare(str2);
    var an = Math.min(str1.length,10);
    var bn = Math.min(str2.length,10);
    
    if (an == 0 || bn == 0)
      return -1;
    
    var matrix = [];
    
    var astr = [];
    var bstr = [];
    for (var i = 0; i < an; ++i)
      astr.push(str1.charCodeAt(i));
    for (var i = 0; i < bn; ++i)
      bstr.push(str2.charCodeAt(i));
    
    var apos;
    var bpos;
    var val;
    
    var len = (an+1)*(bn+1);
    for (var i = 0; i < len; ++i) {
      apos = parseInt(i%(an+1));
      bpos = parseInt(i/(an+1));
      if (bpos == 0) {
        matrix.push(apos);
        continue;
      }
      if (apos == 0) {
        matrix.push(bpos);
        continue;
      }
      apos--;
      bpos--;
      
      if (astr[apos] == bstr[bpos]) {
        matrix.push(matrix[i-1-(an+1)]);
        continue;
      }
      
      if (matrix[i-(an+1)-1] < matrix[i-1] && matrix[i-(an+1)-1] < matrix[i-(an+1)])
        val = 1+Math.min(5,Math.abs(astr[apos]-bstr[bpos]))+matrix[i-(an+1)-1];
      else
        val = 1+Math.min(matrix[i-1],matrix[i-(an+1)],matrix[i-(an+1)-1]);
      
      matrix.push(val);
    }
    var matches = 0;
    apos = an;
    bpos = bn;
    var checkmatch = true;
    var achanged = false;
    var bchanged = false;
    while (apos > 0 && bpos > 0) {
      if (checkmatch && astr[apos-1] == bstr[bpos-1]) {
        matches++;
        checkmatch = false;
      }
      var va1b1 = matrix[(apos+1)*bpos-2];
      var va1b0 = matrix[(apos+1)*(bpos+1)-2];
      var va0b1 = matrix[(apos+1)*bpos-1];
      
      var apn0 = apos/an;
      var apn1 = (apos-1)/an;
      var bpn0 = bpos/bn;
      var bpn1 = (bpos-1)/bn;
      
      var ab11 = Math.abs(1-Math.min(apn1,bpn1)/Math.max(apn1,bpn1));
      var ab10 = Math.abs(1-Math.min(apn1,bpn0)/Math.max(apn1,bpn0));
      var ab01 = Math.abs(1-Math.min(apn0,bpn1)/Math.max(apn0,bpn1));
      var adiag = ab10 <= ab11 && ab10 <= ab01;
      var bdiag = ab01 <= ab11 && ab01 <= ab10;
      var mdiag = ab11 <= ab10 && ab11 <= ab01;
      
      if (va1b0 < va1b1 && va1b0 < va0b1 || 
          (va1b0 <= va0b1 && va1b0 == va1b1 && adiag ||
           va1b0 == va0b1 && va1b0 < va1b1 && (adiag || mdiag))) {
        achanged = true;
        apos--;
      } else if (va0b1 < va1b1 && va0b1 < va1b0 ||
           ( va0b1 == va1b1 && va0b1 <= va1b0 && bdiag ||
             va0b1 == va1b0 && va0b1 < va1b1 && (bdiag || mdiag))) {
        bchanged = true;
        bpos--;
      } else {
        achanged = true;
        bchanged = true;
        apos--;
        bpos--;
      }
      
      if (achanged && bchanged) {
        checkmatch = true;
        achanged = false;
        bchanged = false;
      }
    }
    
    return matrix[len-1]+Math.abs(Math.max(an,bn)-matches);
  }
  
  function validFilename()
  {
    return this.search(/^\s*[a-zA-Z_0-9éáőúűíöüóÉÁŐÚŰÖÜÓÍ!#$&)(%^\[\]][a-zA-Z_0-9\-+=éáőúűíöüóÉÁŐÚŰÖÜÓÍ.!#$&)(%^\[\] ]*\s*$/) == 0;
  }
  
  function replaceExtension(newext)
  {
    var ix = this.lastIndexOf('.');
    if (ix == -1)
      ix = this.length;
    
    return this.substr(0,ix)+"."+newext;
  }
  
  function fileExtension()
  {
    var ix = this.lastIndexOf('.');
    if (ix == -1)
      return "";
    return this.substr(ix+1);  
  }
  
  function shortenFilename(namesize)
  {
    var ext = this.fileExtension();
    if (ext != "") 
      return this.substr(0,this.lastIndexOf('.')+1).truncate(namesize,"...")+ext;
    else 
      result = this.truncate(namesize);
  }
  
  function trim()
  {
    return this.strip();
  }
  
  return {
    compare: compare,
    compareIgnoreCase: compareIgnoreCase,
    validFilename: validFilename,
    replaceExtension: replaceExtension,
    fileExtension: fileExtension,
    shortenFilename: shortenFilename,
    hasEscapedName: hasEscapedName,
    addEscapedName: addEscapedName,
    removeEscapedName: removeEscapedName,
    levenshtein: levenshtein,
    trim: trim
  };
})());
