// {{{ CORE

var _jslObj = new Array, _jslObjCounter = 0, _jslOnLoad = 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);
	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();

onload = function() { // {{{
   for(var i = 0; i<_jslOnLoad.length; i++) {
      _jslOnLoad[i]();
   }
} // }}}

function jslOnLoad() { // {{{
   for(var i = 0; i<arguments.length; i++) {
      _jslOnLoad[_jslOnLoad.length] = arguments[i];
   }
} // }}}

function jslPostRun() { // {{{
   if (is.ie5 && !is.ie55) {
      for(var i = 0; i<arguments.length; i++) {
         jslOnLoad(arguments[i]);
      }
   }
   else {
      for(var i = 0; i<arguments.length; i++) {
         setTimeout(arguments[i], 1);
      }
   }
} // }}}

function jslGetCookie(name) { // {{{
  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 null; 
} // }}}

function jslSetCookie(name, value, path, expire) { // {{{
  path = path ? "; path=" + path : "";
  expire = expire ? "; expires=" + expire : "";
  document.cookie = name + "=" + escape(value) + path + expire;
} // }}}

function jslTouchSessionCookie(path, expire) { // {{{
  var sid = jslGetCookie('SID');
  var idx = sid.indexOf('_');
  if (idx >= 0) {
      sid = sid.substr(0, idx + 1) + (parseInt(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) { // {{{
   if (!o) return null;
   if (o.jslString)  return o;
   var obj = _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) { // {{{
   parent = jslObject(parent);
   var obj = document.createElement('DIV');
   if (!parent) parent = document.body;
   if (!id) id = '_jslObject'+ ++_jslObjCounter;
   obj.id = id;
   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 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]);
 		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() { //{{{
   this._iframeDIV = jslCreateChild();
   this._iframeID  = '_ifrm' + this._iframeDIV.id;
   jslSetAttributes(
      this._iframeDIV,
      'visibility', 'hidden',
      'html', '<iframe id="' + this._iframeID + '" style="width:1px; height:1px;"></iframe>'
   );
   this._iframe    = jslObject(this._iframeID);
   this._timeout = null;
} //}}}

jslDownloader.prototype.retrieveURL = function(url, callback) { //{{{
   this.callback = callback;
   this._iframe.src = '';
   this._iframe.src = url;
   this._iframe._parentObj = this;
   this._timeout    = setTimeout( this._iframe.jslString + '._parentObj.timeOut()', 60000);
} //}}}

jslDownloader.prototype.reset = function() { //{{{
   this._iframe.src = '';
} //}}}

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]);
           }
           else {
              _jslDownloadQueue = new Array;
              _jslDownloadQueueHead = -1;
           }
   }
} // }}}

function _jslDownloadAsync(url) { // {{{
   if (!_jslDownloaderAsync) _jslDownloaderAsync = new jslDownloader();
   _jslDownloaderAsync.retrieveURL(url, _jslDownloadCallback);
} // }}}

function jslDownloadAsync(url, callback) { // {{{
   _jslDownloadQueue[_jslDownloadQueue.length] = [url, callback];
   if (_jslDownloadQueueHead<0) {
     _jslDownloadQueueHead = 0;
     _jslDownloadAsync(url);
   }
} // }}}

// }}}

// {{{ MISC

var _jslHideOnPopup = new Array, _jslPopupLevel = 0;

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');
} //}}}


// }}}


