// {{{ CORE

var _jslObj = new Array, _jslObjCounter = 0, _jslOnEvents = new Array;

function _jslBrowserVersion() { // {{{
	var b=navigator.appName;
	if (b.indexOf('Netscape')!=-1) this.b="ns";
	else if ((b=="Opera") || (navigator.userAgent.indexOf("Opera")>0)) this.b = "opera";
	else if (b=="Microsoft Internet Explorer") this.b="ie";
	if (!b) alert('Unidentified browser.\nThis browser is not supported,');
	this.version=navigator.appVersion;
	this.v=parseInt(this.version, 10);
	this.ns=(this.b=="ns" && this.v>=4);
	this.ns4=(this.b=="ns" && this.v==4);
	this.ns6=(this.b=="ns" && this.v==5);
	this.ie=(this.b=="ie" && this.v>=4);
	this.ie4=(this.version.indexOf('MSIE 4')>0);
	this.ie5=(this.version.indexOf('MSIE 5')>0);
	this.ie55=(this.version.indexOf('MSIE 5.5')>0);
	this.ie6=(this.version.indexOf('MSIE 6.0')>0);
	this.opera=(this.b=="opera");
	this.dom=(document.createElement && document.appendChild && document.getElementsByTagName)?true:false;
	this.def=(this.ie||this.dom); // most used browsers, for faster if loops
	var ua=navigator.userAgent.toLowerCase();
	if (ua.indexOf("win")>-1) this.platform="win32";
	else if (ua.indexOf("mac")>-1) this.platform="mac";
	else this.platform="other";
} // }}}

var is = new _jslBrowserVersion();

function jslOnLoad() { // {{{
   for(var i = 0; i<arguments.length; i++) {
      jslOnEvent('load', arguments[i]);
   }
} // }}}

function jslOnEvent() { //{{{
   var event_name = '' + arguments[0];
   var chain = _jslOnEvents[event_name];
   if (! chain) {
      _jslOnEvents[event_name] = chain = new Array();
      var actual_fnc = eval('window.on' + event_name);
      if (actual_fnc) chain[chain.length] = actual_fnc;
      
      eval('window.on' + event_name + '=function() {var chain = _jslOnEvents[\'' + event_name +
         '\']; for (var i=0; i<chain.length; i++) chain[i](); }');
   }
   for(var i = 1; i<arguments.length; i++)
      chain[chain.length] = arguments[i];
} //}}}

function jslPostRun() { // {{{
   if (is.ie5 && !is.ie55 || is.opera) {
      for(var i = 0; i<arguments.length; i++) {
         jslOnLoad(arguments[i]);
      }
   }
   else {
      for(var i = 0; i<arguments.length; i++) {
         setTimeout(arguments[i], 200);
      }
   }
} // }}}

function jslPostRun1(fnc, delay) { // {{{
   if (is.ie5 && !is.ie55 || is.opera) {
      jslOnLoad(fnc);
   }
   else {
      setTimeout(fnc, delay ? delay : 10);
   }
} // }}}

function jslGetCookie(name, default_value) { // {{{
  var a, b, cook; 
  cook = ' ' + document.cookie + ';'
  a = cook.indexOf(' ' +name+"="); 
  if (a != -1)  {
     a += name.length+2; 
     b = cook.indexOf(";", a);
     if (b == -1) b = cook.length;
     return unescape(cook.substring(a, b));       
  } 
  return typeof(default_value) == 'undefined' ? null : default_value;
} // }}}

function jslSetCookie(name, value, path, expire, domain) { // {{{
  path = path ? "; path=" + path : "";
  expire = expire ? "; expires=" + expire : "";
  domain = domain ? "; domain=" + escape(domain) : "";
  document.cookie = name + "=" + escape(value) + path + expire + domain;
} // }}}

function jslTouchSessionCookie(path, expire) { // {{{
  var sid = jslGetCookie('SID');
  var idx = sid.indexOf('_');
  if (idx >= 0) {
      sid = sid.substr(0, idx + 1) + (1 * (sid.substr(idx+1)) + 1);
  }
  else
     sid += '_1';
     
  jslSetCookie('SID', sid, path, expire);
} // }}}

function _jslInitObj(obj) { // {{{
   if (!obj.style) obj.style = obj;
   obj.jslString = '_jslObj["'+obj.id+'"]';
   _jslObj[obj.id] = obj;
} // }}}

function jslObject(o, document_obj, nocache) { // {{{
   if (!o) return null;
   if (o.jslString)  return o;
   var obj = nocache ? null : _jslObj[o];
   if (!obj) {
      var doc = document_obj || document;
      obj = doc.getElementById 
          ? doc.getElementById(o)
          : doc.all 
            ? doc.all[o]
            : obj;
      if (obj) {
         _jslInitObj(obj);
      }
   }

   return obj;
} // }}}

function jslCreateChild(parent,id,before_obj) { // {{{
   parent = jslObject(parent);
   var obj = document.createElement('DIV');
   if (!parent) parent = document.body;
   if (!id) id = '_jslObject'+ ++_jslObjCounter;
   obj.id = id;
   if (before_obj)
      parent.insertBefore(obj, before_obj);
   else if (parent.tagName == 'BODY' && parent.firstChild)
      parent.insertBefore(obj, parent.firstChild);
   else
      parent.appendChild(obj);
   obj._jslParent = parent;
   _jslInitObj(obj);
   jslSetAttribute(obj, 'position', 'absolute');
   return obj;
} // }}}

function jslRemoveObject(obj) { // {{{
   obj = jslObject(obj);
   obj._jslParent.removeChild(obj);
} // }}}

function jslCloneObject(obj) { // {{{
   if(typeof(obj) != 'object' || obj == null) return obj;
    // XXX neviem ako spravne zduplikovat objekt so zachovanim triedy.
    // pre nase uceli zatial staci robit polia (a hashe)
   var new_obj = new Array();
   //new_obj.length = obj.length;
   for(var i in obj) new_obj[i] = jslCloneObject(obj[i]);
   return new_obj;
} ///}}}

function jslGetLeft(obj) { obj = jslObject(obj); return obj.offsetLeft; }
function jslSetLeft(obj,x) { obj = jslObject(obj); obj.style.left = x; }

function jslGetTop(obj) { obj = jslObject(obj); return obj.offsetTop; }
function jslSetTop(obj,x) { obj = jslObject(obj); obj.style.top = x; }

function jslGetWidth(obj) { obj = jslObject(obj); return obj.offsetWidth; }
function jslSetWidth(obj,x) { obj = jslObject(obj); obj.style.width = x; }

function jslGetHeight(obj) { obj = jslObject(obj); return obj.offsetHeight; }
function jslSetHeight(obj,x) { obj = jslObject(obj); obj.style.height = x; }

function jslGetBottom(obj) { obj = jslObject(obj); return jslGetTop(obj) + jslGetHeight(obj); }

function jslGetClip(obj) { // {{{
   obj = jslObject(obj);
	var c = obj.style.clip;
	if (c.indexOf("rect(")>-1) {
 		c=c.split("rect(")[1].split(")")[0].split("px");
 		for (var i=0;i<c.length;i++) c[i]=parseInt(c[i], 10);
 		return [c[0],c[1],c[2],c[3]];
	}
	else return [0,this.w,this.h,0];
} // }}}

function jslSetClip(obj, c) { // {{{
	obj.style.clip = 'rect('+c[0]+'px '+c[1]+'px '+c[2]+'px '+c[3]+'px)';
} // }}}

function jslGetHTML(obj) { obj = jslObject(obj); return obj.innerHTML; }
function jslSetHTML(obj, html) { obj = jslObject(obj); obj.innerHTML = html; }

function jslGetAttribute(obj, attr) { // {{{
   obj = jslObject(obj);
   switch (attr) {
      case 'clip': return jslGetClip(obj);
      case 'html': return obj.innerHTML;
      case 'class': return obj.className;
      case 'left': return obj.offsetLeft;
      case 'top': return obj.offsetTop;
      case 'width': return obj.offsetWidth;
      case 'height': return obj.offsetHeight;
      default: return eval ('obj.style.' + attr);
   }
} // }}}

function jslSetAttribute(obj, attr, value) { // {{{
   obj = jslObject(obj);
   switch (attr) {
      case 'clip': jslSetClip(obj,value); break;
      case 'html': obj.innerHTML = value; break;
      case 'class': obj.className = value; break;
      default: eval ('obj.style.' + attr + '=value');
   }
} // }}}

function jslSetAttributes() { // {{{
   for(var i=1; i<arguments.length; i+=2) {
     jslSetAttribute(arguments[0], arguments[i], arguments[i+1]);
   }
} // }}}

function jslShow() { // {{{
   for(var i=0; i<arguments.length; i++) {
      jslSetAttribute(arguments[i], 'visibility', 'visible');
   }
} // }}}

function jslHide() { // {{{
   for(var i=0; i<arguments.length; i++) {
      jslSetAttribute(arguments[i], 'visibility', 'hidden');
   }
} // }}}

function _jslEventHandler(ev) { // {{{
  ev = ev ? ev : event;
  ev.X = ev.offsetX ? ev.offsetX : ev.layerX;
  ev.Y = ev.offsetY ? ev.offsetY : ev.layerY;
  ev.X = ev.X || 0;
  ev.Y = ev.Y || 0;
  this._jslHandlerTmp = this._jslHandler[ev.type];
  retval = this._jslHandlerTmp(ev);
  return retval;
} // }}}

function jslSetHandler(obj, type, handler) { // {{{
   obj = jslObject(obj);

   if (!obj._jslEventListener) {
      obj._jslEventHandler = _jslEventHandler;
      obj._jslEventListener = function(ev){obj._jslEventHandler(ev)};
   }
   
   var wrapper = null;
   
   if (handler) {
      if (!obj._jslHandler) {
         obj._jslHandler = new Array;
      }
      obj._jslHandler[type] = handler;
      wrapper = obj._jslEventListener;
   }
   if (obj.addEventListener) {
     obj.removeEventListener(type, obj._jslEventListener, false);
     if (wrapper) obj.addEventListener(type, obj._jslEventListener, false);
   }
   else if (obj.attachEvent) {
     obj.detachEvent('on' + type, obj._jslEventListener);
     if (wrapper) obj.attachEvent('on' + type, obj._jslEventListener);
   }
   else {
     eval ('obj.on'+type+'=' + wrapper);
   }
} // }}}

// }}}

// {{{ IMAGES

function jslImgLoad() { // {{{
   if (document.images) { 
      var img = jslObject(arguments[0]);
      var i, j;
      img._jslImages = new Array;
      arguments[0] = img.src;
      for ( i = 0, j = 0; i < arguments.length; i++, j++ ) {
         img._jslImages[j] = new Image;
         img._jslImages[j].src = arguments[i];
      }
   }
} // }}}

function jslImgSwap(obj, idx) { // {{{
   obj = jslObject(obj);
   if (obj && obj._jslImages) {
      obj.src = obj._jslImages[idx].src;
   }
} // }}}

// }}}

// {{{ ANIMATION

function jslTime() { // {{{
	var d = new Date()
	return d.getTime();
} // }}}

function _jslAnimate() { // {{{
	var newTime = jslTime();
	this._jslAnimCurrent += newTime - this._jslAnimTime;
	if (this._jslAnimCurrent < this._jslAnimDuration) {
		this._jslAnimTime = newTime;
		this._jslAnimFunc(this._jslAnimCurrent/this._jslAnimDuration);
		setTimeout(this.jslString + '._jslAnimate()',10);
	}
	else {
		this._jslAnimFunc(1);
	}
} // }}}

function jslAnimation(obj,duration,func) { // {{{
   obj = jslObject(obj);
	obj._jslAnimFunc = func;
	obj._jslAnimDuration = duration;
	obj._jslAnimTime = jslTime();
	obj._jslAnimCurrent = 0;
	obj._jslAnimate = _jslAnimate;
	obj._jslAnimate();
} // }}}

function jslAnimationStop(obj) { jslAnimation(obj, 0, function(){}); }

function jslAnimQuadratic(t) { return t < 0.5 ? 2*t*t : 1-2*(1-t)*(1-t); }

// }}}

// {{{ DYNAMIC DOWNLOAD

jslDownloader = function(dummy_iframe_url) { //{{{
   this._iframeDIV = jslCreateChild();
   this._iframeID  = '_ifrm' + this._iframeDIV.id;
   jslSetAttributes(
      this._iframeDIV,
      'visibility', 'hidden',
      'html', '<iframe id="' + this._iframeID + '" ' + 
         (dummy_iframe_url && dummy_iframe_url != '' ? 'src="' + dummy_iframe_url + '" ' : '') +
         ' style="width:1px; height:1px;"></iframe>'
   );
   this._iframe    = jslObject(this._iframeID);
   this._timeout = null;
} //}}}

jslDownloader.prototype.retrieveURL = function(url, callback, reset_url) { //{{{
   this.callback = callback;
   this._iframe.src = reset_url || '';
   this._iframe.src = url;
   this._iframe._parentObj = this;
   this._reset_url = reset_url;
   this._timeout    = setTimeout( this._iframe.jslString + '._parentObj.timeOut()', 60000);
} //}}}

jslDownloader.prototype.reset = function() { //{{{
   this._iframe.src = this._reset_url || '';
} //}}}

jslDownloader.prototype.timeOut = function() { //{{{
   this.reset();
   this._timeout = null;
   this.onLoad(null);
} //}}}

jslDownloader.prototype.onLoad = function(data) { //{{{
   if (this._timeout) {
      clearTimeout( this._timeout );
      this._timeout = null;
   }
   this.callback(data);
} //}}}

function jslOnDownload(data) { //{{{
   _jslDownloaderAsync.onLoad(data);
} //}}}

var _jslDownloaderAsync, _jslDownloadQueue = new Array, _jslDownloadQueueHead = -1; 

function _jslDownloadCallback(data) { // {{{
   if (_jslDownloadQueueHead >= 0) {
           var tmp;
           tmp = _jslDownloadQueue[_jslDownloadQueueHead][1];
           tmp( data );
           _jslDownloadQueueHead++;
           if (_jslDownloadQueueHead < _jslDownloadQueue.length) {
              _jslDownloadAsync(_jslDownloadQueue[_jslDownloadQueueHead][0], 
                  _jslDownloadQueue[_jslDownloadQueueHead][2]);
           }
           else {
              _jslDownloadQueue = new Array;
              _jslDownloadQueueHead = -1;
           }
   }
} // }}}

function _jslDownloadAsync(url, dummy_iframe_url) { // {{{
   if (!_jslDownloaderAsync) _jslDownloaderAsync = new jslDownloader(dummy_iframe_url);
   _jslDownloaderAsync.retrieveURL(url, _jslDownloadCallback, dummy_iframe_url);
} // }}}

function jslDownloadAsync(url, callback, dummy_iframe_url) { // {{{
   _jslDownloadQueue[_jslDownloadQueue.length] = [url, callback, dummy_iframe_url];
   if (_jslDownloadQueueHead<0) {
     _jslDownloadQueueHead = 0;
     _jslDownloadAsync(url, dummy_iframe_url);
   }
} // }}}

// }}}

// {{{ MISC

var _jslHideOnPopup = new Array, _jslPopupLevel = 0;
var _jslCz2Ascii_table = null;

function jslHideOnPopup() { // {{{
   for(var i = 0; i<arguments.length; i++) {
      _jslHideOnPopup[_jslHideOnPopup.length] = jslObject(arguments[i]);
   }
} // }}}

function jslPopupOpen() { // {{{
   if (! _jslPopupLevel) {
      for(var i = 0; i<_jslHideOnPopup.length; i++) {
         var o = _jslHideOnPopup[i];
         o._jslHideOnPopup = jslGetAttribute(o, 'visibility');
         jslHide(o);
      }
   }
   _jslPopupLevel++;
} // }}}

function jslPopupClose() { // {{{
   _jslPopupLevel--;
   if (! _jslPopupLevel) {
      for(var i = 0; i<_jslHideOnPopup.length; i++) {
         var o = _jslHideOnPopup[i];
         jslSetAttribute(o, 'visibility', o._jslHideOnPopup);
      }
   }
} // }}}

function jslOpenInOpener(win, url) { // {{{
  if (win.opener && !win.opener.closed) {
    if (document.all && navigator.userAgent.indexOf(' MSIE 4.') < 0) {
      eval('try{win.opener.location=url;}catch(error){win.open(url);}');
    }
    else {
      win.opener.location.href=url;
    }
  }
  else {
    win.open(url);
  }
} // }}}

function jslEscapeString(s) { //{{{
   return s.replace(/(['"\\])/g, '\\$1').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
} //}}}

function jslEscapeStringHTML(s, escape_quota) { //{{{
   var res = s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
   return escape_quota ? res.replace(/"/g, '&quot;') : res;
} //}}}

function jslUnescapeStringHTML(s) { ///{{{
   return s.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
} ///}}}

function jslCz2Ascii(s) { //{{{
   var ret = '';
   if (!_jslCz2Ascii_table) {
      _jslCz2Ascii_table = new Array();
      var from_chars = ';ݞ';
      var to_chars   = 'aaAAcCdDeeEEiIlLnNooOOrrRRsStTuuUUyYzZ';
      for (var i = 0; i < from_chars.length; i++) 
         _jslCz2Ascii_table[from_chars.charAt(i)] = to_chars.charAt(i);
      }
   for (var i = 0; i < s.length; i++) ret += _jslCz2Ascii_table[s.charAt(i)] || s.charAt(i);
   return ret;
} //}}}

function jslModifyUrl(url, new_prms, old_prms_regex_test) { //{{{
   var url_elements = url.indexOf('?') < 0 ? [url, ''] : url.split('?');
   var prms = [];
   if (url_elements[1]) {
      var prms_array = url_elements[1].indexOf('&') < 0 ? 
         [ url_elements[1] ] : url_elements[1].split('&');
      for (var i = 0; i < prms_array.length; i++) {
         var prm_val = prms_array[i].indexOf('=') < 0 ? [prms_array[i], ''] : prms_array[i].split('=');
         var prm_name = unescape(prm_val[0]);
         if (! old_prms_regex_test || old_prms_regex_test.test(prm_name)) {
            prms[prm_name] = unescape(prm_val[1]);
         }
      }
   }
   for (var i in new_prms) {
      prms[i] = new_prms[i];
   }
   new_prms = '';

   for (var i in prms) {
      if (typeof(prms[i]) != 'undefined' && prms[i]) new_prms += '&' + escape(i) + '=' + escape(prms[i]).replace(/\//g,'%2F');
   }

   return url_elements[0] + (new_prms ? '?' + new_prms.substr(1)  : '');
} //}}}

function jslUrlParam(url, param) { //{{{
   var url_elements = url.indexOf('?') < 0 ? [url, ''] : url.split('?');
   var prms = [];
   if (url_elements[1]) {
      var prms_array = url_elements[1].indexOf('&') < 0 ? 
         [ url_elements[1] ] : url_elements[1].split('&');
      for (var i = 0; i < prms_array.length; i++) {
         var prm_val = prms_array[i].indexOf('=') < 0 ? [prms_array[i], ''] : prms_array[i].split('=');
         var prm_name = unescape(prm_val[0]);
         prms[prm_name] = unescape(prm_val[1]);
      }
   }
   return prms[param];
} //}}}

function jslIsCheckgroupChecked(ctrl) { //{{{
   if (ctrl)
   {
      if (ctrl.length) 
      {
         for (var i = 0; i < ctrl.length; i++)
            if (ctrl[i].checked) return true;
      }
      else
         return ctrl.checked;
   }
   return false;
} //}}}

function jslGetRadioValue(ctrl) { //{{{
   if (ctrl)
   {
      if (ctrl.length) 
      {
         for (var i = 0; i < ctrl.length; i++)
            if (ctrl[i].checked) return ctrl[i].value;
      }
      else
         return ctrl.checked ? ctrl.value : null;
   }
   return null;
} //}}}

function jslGetCheckgroupValue(ctrl) { //{{{
   if (ctrl)
   {
      var ret = [];
      if (ctrl.length) 
      {
         for (var i = 0; i < ctrl.length; i++)
            if (ctrl[i].checked) ret[ret.length] = ctrl[i].value;
      }
      else if (ctrl.checked)
         ret = [ctrl.value];

      return ret;
   }
   return null;
} //}}}

function jslCheckWholeCheckgroup(ctrl) { //{{{
   if (ctrl)
   {
      if (ctrl.length) 
      {
         for (var i = 0; i < ctrl.length; i++) ctrl[i].checked = true;
      }
      else
         ctrl.checked = true;;
   }
} //}}}

function jslInvertCheckgroup(ctrl) { //{{{
   if (ctrl)
   {
      if (ctrl.length) 
      {
         for (var i = 0; i < ctrl.length; i++) ctrl[i].checked = !ctrl[i].checked;
      }
      else
         ctrl.checked = ! ctrl.checked;
   }
} //}}}

function jslSelectCtrlOptionMove(from_ctrl, to_ctrl, mirror_prms) { //{{{
   //mirror_prms: mode (from, to), ctrl (hidden)
   if (from_ctrl && to_ctrl && from_ctrl.options && to_ctrl.options) {
      var from_ctrl_single = from_ctrl.type == 'select-one';
      var to_ctrl_single = to_ctrl.type == 'select-one';
      var move_obj = new Array;
      var move_idx = new Array;
      for (var i = 0; i < from_ctrl.length; i++) {
         if (from_ctrl.options[i].selected) {
            move_idx.push(i)
            move_obj.push(new Option(from_ctrl.options[i].text, from_ctrl.options[i].value));
         }
      }
      for (var i = move_idx.length; i--;) from_ctrl.options[move_idx[i]] = null;
      if (from_ctrl_single && move_idx.length > 0 && from_ctrl.length > 0) {
         var i = move_idx[0];
         from_ctrl.selectedIndex = i < from_ctrl.length ? i : from_ctrl.length-1;
      }
      var ti = 0;
      var fi = 0;
      var new_options = new Array();
      var pos = -1;
      while (fi < move_obj.length || ti < to_ctrl.length) {
         if (ti >= to_ctrl.length || fi < move_obj.length && jslCz2Ascii(move_obj[fi].text) <= jslCz2Ascii(to_ctrl.options[ti].text)) 
         {
            pos = new_options.length;
            new_options.push(move_obj[fi++]);
         }
         else {
            new_options.push(new Option(to_ctrl.options[ti].text, to_ctrl.options[ti].value));
            ti++;
         }
      }
      for (fi = 0; fi < new_options.length; fi++)
         to_ctrl.options[fi] = new_options[fi];
      if (to_ctrl_single && pos >= 0) to_ctrl.selectedIndex = pos;
      if (mirror_prms) {
         var m_from = mirror_prms.mode == 'from' ? from_ctrl : to_ctrl;
         var m_val = [];
         for (var i = 0; i < m_from.length; i++) m_val.push(m_from.options[i].value);
         if (mirror_prms.ctrl) mirror_prms.ctrl.value = m_val.join(';');
      }
      jslEqualCtrlWidth(from_ctrl, to_ctrl);
   }
} //}}}

function jslEqualCtrlWidth(ctrl1, ctrl2) { //{{{
   var o1 = jslObject(ctrl1);
   var o2 = jslObject(ctrl2);
   if (o1 && o2) {
      var w1 = jslGetWidth(o1);
      var w2 = jslGetWidth(o2);
      if (w1 > w2) jslSetWidth(o2, w1); else jslSetWidth(o1, w2);
   }
} //}}}

function jslSelectCtrlSelectAll(ctrl) { //{{{
   if (ctrl.type == 'select-multiple')
      for (var i = 0; i < ctrl.length; i++) ctrl.options[i].selected = true;
} //}}}

function jslSelectFindAsType(ctrl, event) { //{{{
   if (event.type == 'keydown')
      ctrl.__jsl_find_as_type_key_code = event.keyCode;
   else if (event.type == 'keyup') {
      if (ctrl.__jsl_find_as_type_key_code > 0) {
         ctrl.__jsl_find_as_type_key_code = null;
         ctrl.__jsl_find_as_type_typing = false;
      }
   }
   else if (event.type == 'keypress') {
      var key_code = is.ie ? event.keyCode : event.which;
      if (key_code > 0) {
         var key = String.fromCharCode(key_code);
         ctrl.__jsl_find_as_type_key_code = 0;
         var key_ascii = jslCz2Ascii(key);
         if (ctrl.__jsl_find_as_type_typing) {
            if (! ctrl.__jsl_find_as_type_failed) {
               ctrl.__jsl_find_as_type_string += key;
               var l = ctrl.__jsl_find_as_type_string.length;
               ctrl.__jsl_find_as_type_failed = true;
               for (var i = is.ie ? ctrl.selectedIndex : 0; i < ctrl.length; i++)
               {
                  if (jslCz2Ascii(ctrl.options[i].text.substr(0, l)) == ctrl.__jsl_find_as_type_string) {
                     ctrl.__jsl_find_as_type_failed = false;
                     ctrl.selectedIndex = i;
                     return false;
                  }
               }
            }
         }
         else {
            ctrl.__jsl_find_as_type_typing = true;
            ctrl.__jsl_find_as_type_failed = true;
            ctrl.__jsl_find_as_type_string = key;
            for (var i = 0; i < ctrl.length; i++)
               if (jslCz2Ascii(ctrl.options[i].text.charAt(0)) == key) {
                  ctrl.__jsl_find_as_type_failed = false;
                  ctrl.selectedIndex = i;
                  return false;
               }
         }
         return false;
      }
      else
         ctrl.__jsl_find_as_type_typing = false;
   }
   return true;
} //}}}

function jslGoURL(url, cookies, target, wnd_prms) { //{{{

   var prms = new Array;
   for (var i = 0; i < cookies.length; i++) {
      var cookie = jslGetCookie(cookies[i][0]);
      var prm_name    = cookies[i][1];
      prms['' + prm_name] = cookie || null;
   }

   url = jslModifyUrl(url, prms);

   var w = window;
   if (target == '_top')
      w = window.top;
   else if (target) {
      window.top.open(url, target == '_blank' ? '' : target, wnd_prms || '');
      return;
   }

   w.location.href = url;
} //}}}

// }}}

// DIALOGS {{{

function jslShowDialog(url, name, dlg_arguments, show_params, modal, modal_callback) { //{{{
   var top_wnd = window.top;

   if (modal && top_wnd.__jsl_modal_dialog && !top_wnd.__jsl_modal_dialog.closed) {
      top_wnd.__jsl_modal_dialog.focus();
      return null;
   }
   if (typeof(dlg_arguments) == "undefined" || dlg_arguments == null) dlg_arguments = {};
   if (typeof(show_params) == "undefined") show_params='';

   var width = 750;
   var height = 450;
   var cookie_name = '';
   var w, h;
   if (/width=(\d+)/.test(show_params)) 
      w = parseInt(RegExp.$1, 10);
   else
      show_params += ",width=" + width;
   if (/height=(\d+)/.test(show_params)) 
      h = parseInt(RegExp.$1, 10);
   else
      show_params += ",height=" + height;
   if (w > 150) width = w;
   if (h > 100) height = h;

   if (name) {
      cookie_name = 'dlgdim_' + name;
      dlg_arguments['dim_cookie_name'] = cookie_name;

      var dim = jslGetCookie(cookie_name);

      if (/^(\d+),(\d+)$/.test(dim)) {
         var w  = parseInt(RegExp.$1, 10);
         var h = parseInt(RegExp.$2, 10);
         if (w > 150) width = w;
         if (h > 100) height = h;
      }
   }
   show_params = show_params.replace(/width=\d+/, 'width=' + width).replace(/height=\d+/, 'height=' + height);

   if (modal) {
      _jslDisableForms(top_wnd);
      top_wnd.__jsl_showdialog_body_onbeforeupload_prev = top_wnd.document.body.onbeforeunload;
      top_wnd.__jsl_showdialog_onbeforeupload_prev = top_wnd.onbeforeunload;
      top_wnd.document.body.onbeforeunload = function() {
         if (top_wnd.__jsl_modal_dialog && !top_wnd.__jsl_modal_dialog.closed) {
            top_wnd.__jsl_modal_dialog.close();
         }
         if (top_wnd.__jsl_showdialog_body_onbeforeupload_prev)
            return top_wnd.__jsl_showdialog_body_onbeforeupload_prev();
      }
      top_wnd.onbeforeunload = function() {
         if (top_wnd.__jsl_modal_dialog && !top_wnd.__jsl_modal_dialog.closed) {
            top_wnd.__jsl_modal_dialog.close();
         }
         if (top_wnd.__jsl_showdialog_onbeforeupload_prev)
            return top_wnd.__jsl_showdialog_onbeforeupload_prev();
      }
   }

   var w = top_wnd.open(url, name, show_params.replace(/^,/, ''));
   if (w)
   {
      w.dialogArguments = dlg_arguments;
      w.__dim_w_diff = 0;
      w.__dim_h_diff = 0;
      w.__dim_w_orig = width;
      w.__dim_h_orig = height;
      w.__dim_onload = function() { 
         if (w.document.body && w.document.body.clientWidth > 0) {
            w.__dim_w_diff = w.document.body.clientWidth - w.__dim_w_orig;
            w.__dim_h_diff = w.document.body.clientHeight - w.__dim_h_orig;
            w.clearInterval(w.__dim_onload_interval_id);
            w.__dim_onload_interval_id = null;
         }
      };
      top_wnd.__jsl_modal_callback        = null;
      top_wnd.__jsl_modal_callback_data   = null;
      w.__dim_onload_interval_id = w.setInterval( w.__dim_onload, 100);
      if (modal) {
         top_wnd.__jsl_modal_callback = modal_callback;
         top_wnd.__jsl_modal_dialog = w;
      }

      w.focus();
   }
   return w;
} //}}}

function jslCloseDialog() { //{{{
   if (typeof(dialogArguments) != 'undefined') {
      var cookie_name  = dialogArguments['dim_cookie_name'];
      if (cookie_name) {
         var cookie_value = (document.body.clientWidth - __dim_w_diff ) + ',' + 
                            (document.body.clientHeight - __dim_h_diff );
         
         var d = new Date();
         var expire =  d.getTime() + 3600000 * 24 * 31;
         d.setTime(expire);
         jslSetCookie(cookie_name, cookie_value, '/', d.toGMTString());
      }
   }
} //}}}

function jslModalDialogReturn(data) { //{{{
   var w = window.top || window;
   if (w.opener && !w.opener.closed)
      w.opener.__jsl_modal_callback_data = w.opener.jslCloneObject(data || w.returnValue);
   if (!w.closed) w.close();
} //}}}

function _jslDisableForms(wnd) { //{{{
   var windows = [wnd];
   while (windows.length > 0) {
      var w = windows.shift();

      if (!w.__jsl_is_disabled) {
         w.__jsl_is_disabled = true;

         w.__jsl_disfrms_onfocus_prev = w.onfocus;
         w.document.__jsl_disfrms_onclick_prev = w.document.onclick;
         w.onfocus = wnd.jslCheckModalDialog;
         w.document.onclick = wnd.jslCheckModalDialog;

         if (w.document && w.document.body) {
            w.document.body.__jsl_disfrms_onfocus_prev = w.document.body.onfocus;
            w.document.body.onfocus = wnd.jslCheckModalDialog;
         }

         if (! /\/tiny_mce\/jscripts\/blank.htm$/.test(w.location))
         {
            var tags = ['applet', 'object', 'embed', 'a', 'select', 'input', 'textarea', 'buttons'];
            var fnc_onclick = function() {return false};
            for (var i=0; i<tags.length; i++) {
               var objs = w.document.getElementsByTagName(tags[i]);
               for (var j=0; j<objs.length; j++) {
                  if (/^(applet|object|embeded)$/i.test(tags[i]))
                  {
                     var o = objs[j];

                     if (is.ie) {
                        try {
                           var s = document.createElement('DIV');
                           o.offsetParent.insertBefore(s, o);

                           for (sn in o.currentStyle) s.style[sn] = o.currentStyle[sn];

                           o.__jsl_disfrms_visibility = o.style.display;
                           o.__jsl_disfrms_spacer_obj = s;
                           o.style.display = 'none';
                        }
                        catch (e) {
                           o.__jsl_disfrms_visibility = o.style.visibility;
                           o.style.visibility = 'hidden';
                        }
                     }
                     else {
                        o.__jsl_disfrms_visibility = o.style.visibility;
                        o.style.visibility = 'hidden';
                     }
                     
                  }
                  if (/^(a)$/i.test(tags[i]))
                  {
                     objs[j].__jsl_disfrms_onclick = objs[j].onclick;
                     objs[j].onclick = fnc_onclick;
                  }
                  if (! /^(a)$/i.test(tags[i]))
                  {
                     objs[j].__jsl_disfrms_disabled = objs[j].disabled;
                     objs[j].disabled = true;
                  }
               }
            }
         }
      }

      for (var i=0; i < w.frames.length; i++)
      {
         try {
            var a = w.frames[i].location.href;
            windows.push(w.frames[i]);
         }
         catch (e) {
         }
      }
   }
} //}}}

function _jslEnableForms(wnd) { //{{{
   var windows = [wnd];
   while (windows.length > 0) {
      var w = windows.shift();

      if (! (w.tagName == 'IFRAME' && /^mce_editor_\d+$/.test(w.id)) )
      {
         if (w.__jsl_is_disabled) {
            w.__jsl_is_disabled = false;

            w.onfocus = w.__jsl_disfrms_onfocus_prev || null;
            w.document.onclick = w.document.__jsl_disfrms_onclick_prev || null;

            if (w.document && w.document.body) {
               w.document.body.onfocus = w.document.body.__jsl_disfrms_onfocus_prev || null;
            }
         
            if (! /\/tiny_mce\/jscripts\/blank.htm$/.test(w.location))
            {
               var tags = ['applet', 'object', 'embed', 'a', 'select', 'input', 'textarea', 'buttons'];
               for (var i=0; i<tags.length; i++) {
                  var objs = w.document.getElementsByTagName(tags[i]);
                  for (var j=0; j<objs.length; j++) {
                     if (/^(applet|object|embeded)$/i.test(tags[i]))
                     {
                        var o = objs[j];
                        if (o.__jsl_disfrms_spacer_obj) {
                           objs[j].style.display = objs[j].__jsl_disfrms_visibility;
                           o.__jsl_disfrms_spacer_obj.removeNode(true);
                        }
                        else {
                           objs[j].style.visibility = objs[j].__jsl_disfrms_visibility;
                        }
                     }
                     if (/^(a)$/i.test(tags[i]))
                     {
                        objs[j].onclick = objs[j].__jsl_disfrms_onclick || null;
                     }
                     if (! /^(a)$/i.test(tags[i]))
                     {
                        objs[j].disabled = objs[j].__jsl_disfrms_disabled || null;
                     }
                  }
               }
            }
         }
         
         for (var i=0; i < w.frames.length; i++)
         {
            try {
               var a = w.frames[i].location.href;
               windows.push(w.frames[i]);
            }
            catch (e) {
            }
         }
      }
   }
} //}}}

function jslCheckModalDialog() { //{{{
   var top_wnd = window.top;
   if (top_wnd.__jsl_chk_moddlg_timeout) top_wnd.clearTimeout(top_wnd.__jsl_chk_moddlg_timeout);

   top_wnd.__jsl_chk_moddlg_timeout = top_wnd.setTimeout(function() {
      if (top_wnd.__jsl_modal_dialog && ! top_wnd.__jsl_modal_dialog.closed) 
         top_wnd.__jsl_modal_dialog.focus();
      else {
         top_wnd.__jsl_modal_dialog = null;
         top_wnd.document.body.onbeforeunload = top_wnd.__jsl_showdialog_body_onbeforeupload_prev;
         top_wnd.onbeforeunload = top_wnd.__jsl_showdialog_onbeforeupload_prev;
         top_wnd.__jsl_showdialog_body_onbeforeupload_prev = null;
         top_wnd.__jsl_showdialog_onbeforeupload_prev = null;
         _jslEnableForms(top_wnd);
         if (top_wnd.__jsl_modal_callback) {
            top_wnd.__jsl_modal_callback(top_wnd.__jsl_modal_callback_data);
            top_wnd.__jsl_modal_callback = null;
         }
      }
   }, 50);
} //}}}

// }}}

// DBG {{{

function jslGetDbgWindow() {
   var top_wnd = window.top;
   while (w.opener) {
      w = w.opener.top;
   }
   return w;
}

function jslLogString(msg) {
   var w = jslGetDbgWindow();
   var o = w.jslGetDbgDiv();
   var h = w.jslGetHTML(o);
   h += '<p>' + msg + '</p>';
   w.jslSetHTML(o, h);
}

function jslGetDbgDiv() {
   var w = jslGetDbgWindow();
   var o = w.jslObject('__jsl_dbg_div');
   if (!o) {
      o = w.jslCreateChild(w.document.body, '__jsl_dbg_div');
      w.jslSetAttributes(o, 'border', '1px solid black', 'background', 'white', 'color', 'black',
         'fontsize', '9px', 'overflow', 'auto', 'padding', '3px', 'width', '50%', 'height', '100px',
         'zindex', '65000', 'left', '0', 'top', '0px');
   }

   return o;
}

//}}}

// DATE {{{

function jslIsLeapYear(y) { //{{{
   return y % 400 == 0 || y % 4 == 0 && y % 100 != 0;
}//}}}

function jslCheckDate(d,m,y) { //{{{
   var days = [31,28,31,30,31,30,31,31,30,31,30,31];
   if (jslIsLeapYear(y)) days[1] = 29;
   
   return m >= 1 && m <= 12 && d >= 1 && d <= days[m - 1];
}//}}}

// }}}

// MASK INPUT {{{

function jslDateMaskKey(ctrl, e, type) { //{{{
   //type: 0 = date, 1 = datetime

   if (is.ie && e.type == 'keypress' || !is.ie && e.type == 'keydown') return;

   var valid_from = '0'.charCodeAt();
   var valid_to   = '9'.charCodeAt();
   var max = type == 0 ? 10 : 16;
   var sep = new Array; 
   sep[5] = sep[2] = '.';
   if (type == 1) {
      sep[13] = ':';
      sep[10] = ' ';
   }
   
   var pos = 0;
   if (is.ie) {
      var dummy = ctrl.createTextRange();
      dummy.move('character', -ctrl.maxLength);
      var s = document.selection.createRange();
      while (pos < max && ! s.inRange(dummy)) { pos ++; dummy.move('character') };
   }
   else {
      pos = ctrl.selectionStart;
   }
   var c          = e.charCode || e.keyCode;
   if (c >= 96 && c <= 105) c -= 96 - valid_from;
   var txt        = ctrl.value;

   if (c >= valid_from && c <= valid_to) {
      if (sep[pos]) {
         txt = txt.substr(0, pos) + sep[pos] + txt.substr(++pos);
      }
      if (pos < max) {
         txt = txt.substr(0, pos) + String.fromCharCode(c) + txt.substr(++pos);
      }
      if (sep[pos]) {
         txt = txt.substr(0, pos) + sep[pos] + txt.substr(++pos);
      }
   }
   else if (c == 8) { //backspace
      if (pos) {
         if (sep[--pos]) pos --;
         txt = txt.substr(0, pos) + '_' + txt.substr(pos + 1);
      }
   }
   else if (c == 46) { //del
      if (! sep[pos]) {
         var i = pos + 1;
         while (i < max && ! sep[i]) i++;
         txt = txt.substr(0, pos) + txt.substr(pos + 1, i - pos - 1) + '_' + txt.substr(i);
      }
   }
   else if (c >= 35 && c <= 40 || c < 32 || c >= 112 && c <= 123) {
//            e.returnValue = false;
      return true;
   }
   else {
      if (sep[pos]) pos++;

      var i = pos;
      var empty = true;
      while (empty && i >= 0 && ! sep[i]) if (txt.charAt(i--) != '_') empty = false;
      i = pos;
      while (i < max && ! sep[i]) if (txt.charAt(i++) != '_') empty = false;

      if (! empty) pos = i + 1;
   }
   
   ctrl.value = txt;
   if (is.ie) {
      var dummy = ctrl.createTextRange();
      dummy.move('character', - ctrl.maxLength);
      dummy.move('character', pos);
      dummy.select();
   }
   else {
      ctrl.selectionStart = ctrl.selectionEnd = pos;
   }
   e.cancelBubble = true;
   e.returnValue = false;
   return false;
} //}}}

function jslDateMaskBlur(ctrl, e, type) { //{{{
   var element_count = type == 0 ? 3 : 5;
   var txt = ctrl.value.replace(/_/g,'');
   var elements = txt.split(/[^0-9]/);
   var ok_count = 0;
   var re_num = /^[0-9]+$/;
   for (var i = 0; i < elements.length; i++) {
      if (re_num.test(elements[i])) {
         ok_count ++;
         elements[i] = parseInt( elements[i], 10 );
      }
   }
   if (!ok_count) { ctrl.value = ''; return false; }
   
   if (elements[2] < 1000) elements[2] += elements[2] < 30 ? 2000 : 1900;

   var error = ok_count != element_count || ! jslCheckDate(elements[0], elements[1], elements[2]);
   if (type == 1 && ! error) {
      error = elements[4] > 59 || elements[3] > 23;
   }

   if (error) {
 //     alert(["patn zadan datum", "patn zadan datum a as"][type] + ' !');
//            e.cancelBubble = true;
//            setTimeout(function() {ctrl.focus()}, 100);
      return false;
   }

   if (type == 1 && elements[4].length < 2) elements[4] = '0' + elements[4];
   txt = '' + (elements[0] < 10 ? '0' : '') +elements[0] + '.' + (elements[1] < 10 ? '0' : '') + elements[1] + '.' + elements[2];
   if (type == 1) txt += ' ' + (elements[3] < 10 ? '0' : '') + elements[3] + ':' + (elements[4] < 10 ? '0' : '') + elements[4];
   
   ctrl.value = txt;

   return true;
} //}}}

function jslDateMaskFocus(ctrl, e, type) { //{{{
   var element_count = type == 0 ? 3 : 5;
   var max        = type == 0 ? 10 : 16;
   var lengths = [2,2,4,2,2];
   var txt = ctrl.value;
   var elements = txt.split(/[^0-9_]/);

   for (var i = 0; i < element_count; i++) {
      var d = lengths[i] - (elements[i] ? elements[i].length : 0);
      var s = ''; while (d--) s += '_';
      elements[i] = elements[i] ? s + elements[i] : s;
   }
   
   var txt = elements[0] + '.' + elements[1] + '.' + elements[2];
   if (type == 1) txt += ' ' + elements[3] + ':' + elements[4];

   if (is.ie) {
      ctrl.value = txt;
      setTimeout( function() {
         var s = ctrl.createTextRange();
         s.move('character', - ctrl.maxLength);
         s.select();
      }, 1 );
   }
   else {
      ctrl.value = txt;
      setTimeout( function() {ctrl.selectionStart = ctrl.selectionEnd = 0}, 1 );
   }
} //}}}

// }}}

