/*

Milonic DHTML Menu - JavaScript Website Navigation System.
Version 5.728 - Built: Thursday July 7 2005 - 14:34
Copyright 2005 (c) Milonic Solutions Limited. All Rights Reserved.
This is a commercial software product, please visit http://www.milonic.com/ for more information.
See http://www.milonic.com/license.php for Commercial License Agreement
All Copyright statements must always remain in place in all files at all times
*******  PLEASE NOTE: THIS IS NOT FREE SOFTWARE, IT MUST BE LICENSED FOR ALL USE  ******* 

License Details:
 Number: 194900
    URL: Unlicensed
   Type: Reseller
  Dated: Saturday August 21 2004

*/


_mD=2;_d=document;_dB=_d.body;_n=navigator;_L=location;_nv=$tL(_n.appVersion);_nu=$tL(_n.userAgent);_ps=parseInt(_n.productSub);_f=false;_t=true;_n=null;_W=window;$$=" ";$="";_wp=_W.createPopup;ie=(_d.all)?_t:_f;ie4=(!_d.getElementById&&ie)?_t:_f;ie5=(!ie4&&ie&&!_wp)?_t:_f;ie55=(!ie4&&ie&&_wp)?_t:_f;ns6=(_nu.indexOf("gecko")!=-1)?_t:_f;konq=(_nu.indexOf("konqueror")!=-1)?_t:_f;sfri=(_nu.indexOf("safari")!=-1)?_t:_f;if(konq||sfri){_ps=0;ns6=0}ns4=(_d.layers)?_t:_f;ns61=(_ps>=20010726)?_t:_f;ns7=(_ps>=20020823)?_t:_f;ns72=(_ps>=20040804)?_t:_f;op=(_W.opera)?_t:_f;if(op||konq)ie=0;op5=(_nu.indexOf("opera 5")!=-1)?_t:_f;op6=(_nu.indexOf("opera 6")!=-1||_nu.indexOf("opera/6")!=-1)?_t:_f;op7=(_nu.indexOf("opera 8")!=-1||_nu.indexOf("opera 7")!=-1||_nu.indexOf("opera/7")!=-1)?_t:_f;mac=(_nv.indexOf("mac")!=-1)?_t:_f;if(ns6||ns4||op||sfri)mac=_f;ns60=_f;if(ns6&&!ns61)ns60=_t;if(op7)op=_f;IEDtD=0;if(!op&&((_d.all||ns7)&&_d.compatMode=="CSS1Compat")||(mac&&_d.doctype&&_d.doctype.name.indexOf(".dtd")!=-1))IEDtD=1;_jv="javascript:void(0)";_lN="\n";_rstC=inDragMode=_d.dne=lcl=$R=$mD=_mcnt=_sL=_sT=_ofMT=_oldbW=_bW=_oldbH=_bl=_el=_st=_en=_cKA=0;_startM=_c=1;_oldel=_itemRef=_mn=-1;_zi=_aN=_bH=999;if(op)ie55=_f;ab$="absolute";$O="menu";$5="hidden";_d.write("<style>.milonic{width:1px;visibility:hidden;position:absolute}</style>");function _nA(){return new Array()}function _StO(_fnc,_ms){return setTimeout(_fnc,_ms)}tTipt=$;_m=_nA();_mi=_nA();_sm=_nA();_tsm=_nA();_cip=_nA();$S3="2E636F6D2F";$S4="646D2E706870";_MT=_StO($,0);_oMT=_StO($,0);_cMT=_StO($,0);_mst=_StO($,0);_Mtip=_StO($,0);$u="undefined ";lNum=194900;lURL="Unlicensed";lVer="5.728";_Lhr=_L.href;$6="visible";if(op5){$5=$tU($5);$6=$tU($6)}function M_hideLayer(){}function _oTree(){}function mmMouseMove(){}function _cL(){}function _ocURL(){}function mmClick(){}function autoOT(){}function _X_(){}function _iF0C(){}function showtip(){}function mmVisFunction(){}function remove(_ar,_dta){var _tar=_nA();for(_a=0;_a<_ar.length;_a++){if(_ar[_a]!=_dta){_tar[_tar.length]=_ar[_a]}}return _tar}function copyOf(_w){for(_cO in _w){this[_cO]=_w[_cO]}}function $tL($v){if($v)return $v.toLowerCase()}function $tU($v){if($v)return $v.toUpperCase()}function $pU($v){if($v)return parseInt($v)}function drawMenus(){_startM=1;_oldbH=0;_oldbW=0;for(_y=_mcnt;_y<_m.length;_y++){o$(_y,1)}}_$S={menu:0,text:1,url:2,showmenu:3,status:4,onbgcolor:5,oncolor:6,offbgcolor:7,offcolor:8,offborder:9,separatorcolor:10,padding:11,fontsize:12,fontstyle:13,fontweight:14,fontfamily:15,high3dcolor:16,low3dcolor:17,pagecolor:18,pagebgcolor:19,headercolor:20,headerbgcolor:21,subimagepadding:22,subimageposition:23,subimage:24,onborder:25,ondecoration:26,separatorsize:27,itemheight:28,image:29,imageposition:30,imagealign:31,overimage:32,decoration:33,type:34,target:35,align:36,imageheight:37,imagewidth:38,openonclick:39,closeonclick:40,keepalive:41,onfunction:42,offfunction:43,onbold:44,onitalic:45,bgimage:46,overbgimage:47,onsubimage:48,separatorheight:49,separatorwidth:50,separatorpadding:51,separatoralign:52,onclass:53,offclass:54,itemwidth:55,pageimage:56,targetfeatures:57,visitedcolor:58,pointer:59,imagepadding:60,valign:61,clickfunction:62,bordercolor:63,borderstyle:64,borderwidth:65,overfilter:66,outfilter:67,margin:68,pagebgimage:69,swap3d:70,separatorimage:71,pageclass:72,menubgimage:73,headerborder:74,pageborder:75,title:76,pagematch:77,rawcss:78,fileimage:79,clickcolor:80,clickbgcolor:81,clickimage:82,clicksubimage:83,imageurl:84,pagesubimage:85,dragable:86,clickclass:87,clickbgimage:88,imageborderwidth:89,overseparatorimage:90,clickseparatorimage:91,pageseparatorimage:92,menubgcolor:93};function mm_style(){for($i in _$S)this[$i]=_n;this.built=0}_$M={items:0,name:1,top:2,left:3,itemwidth:4,screenposition:5,style:6,alwaysvisible:7,align:8,orientation:9,keepalive:10,openstyle:11,margin:12,overflow:13,position:14,overfilter:15,outfilter:16,menuwidth:17,itemheight:18,followscroll:19,menualign:20,mm_callItem:21,mm_obj_ref:22,mm_built:23,menuheight:24,ignorecollision:25,divides:26,zindex:27};function menuname(name){for($i in _$M)this[$i]=_n;this.name=$tL(name);_c=1;_mn++;this.menunumber=_mn}function _incItem(_it){_mi[_bl]=_nA();for($i in _x[6])if(_x[6][$i])_mi[_bl][_$S[$i]]=_x[6][$i];_mi[_bl][0]=_mn;_it=_it.split(";");for(_a=0;_a<_it.length;_a++){_sp=_it[_a].indexOf("`");if(_sp!=-1){_tI=_it[_a];if(_sp==_it[_a].lastIndexOf("`")){for(_b=_a;_b<_it.length;_b++){if(_it[_b+1]){_tI+=";"+_it[_b+1];_a++;if(_it[_b+1].indexOf("`")!=-1)_b=_it.length}}}_it[_a]=_tI.replace(/`/g,$)}_sp=_it[_a].indexOf("=");if(_sp==-1){if(_it[_a])_si=_si+";"+_it[_a]}else{_si=_it[_a].slice(_sp+1);_w=_it[_a].slice(0,_sp);if(_w=="showmenu")_si=$tL(_si)}if(_it[_a]){_mi[_bl][_$S[_w]]=_si}}_m[_mn][0][_c-2]=_bl;_c++;_bl++}_c=0;function ami(txt){_t=this;if(_c==1){_c++;_m[_mn]=_nA();_x=_m[_mn];for($i in _t)_x[_$M[$i]]=_t[$i];_x[21]=-1;_x[0]=_nA();if(!_x[12])_x[12]=0;_MS=_m[_mn][6];_MN=_m[_mn];if(_MN[15]==_n)_MN[15]=_MS.overfilter;if(_MN[16]==_n)_MN[16]=_MS.outfilter;_MS[65]=(_MS.borderwidth)?$pU(_MS.borderwidth):0;_MS[64]=_MS.borderstyle;_MS[63]=_MS.bordercolor;if(_W.ignoreCollisions){_MN[25]=1}if(!_MS.built){_WzI=_zi;if(_W.menuZIndex){_WzI=_W.menuZIndex;_zi=_WzI}lcl++;_vC=_MS.visitedcolor;if(_vC){_oC=_MS.offcolor;if(!_oC)_oC="#000000";if(!_vC)_vC="#ff0000";_Lcl="<style>.linkclass"+lcl+":link{color:"+_oC+"}.linkclass"+lcl+":visited{color:"+_vC+"}</style>";_d.write(_Lcl);_MS.linkclass="linkclass"+lcl}_MS.built=1}}_incItem(txt)}menuname.prototype.aI=ami;

/*  Prototype JavaScript framework, version 1.5.0
 *  (c) 2005-2007 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.5.0',
  BrowserFeatures: {
    XPath: !!document.evaluate
  },

  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
  emptyFunction: function() {},
  K: function(x) { return x }
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({}, object);
  }
});

Function.prototype.bind = function() {
  var __method = this, args = $prot_A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($prot_A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $prot_A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($prot_A(arguments)));
  }
}

Object.extend(Number.prototype, {
  toColorPart: function() {
    var digits = this.toString(16);
    if (this < 16) return '0' + digits;
    return digits;
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $prot_R(0, this, true).each(iterator);
    return this;
  }
});

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback(this);
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}
String.interpret = function(value){
  return value == null ? '' : String(value);
}

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return this;
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : this;
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$prot_/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var div = document.createElement('div');
    var text = document.createTextNode(this);
    div.appendChild(text);
    return div.innerHTML;
  },

  unescapeHTML: function() {
    var div = document.createElement('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $prot_A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$prot_/);
    if (!match) return {};

    return match[1].split(separator || '&').inject({}, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var name = decodeURIComponent(pair[0]);
        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;

        if (hash[name] !== undefined) {
          if (hash[name].constructor != Array)
            hash[name] = [hash[name]];
          if (value) hash[name].push(value);
        }
        else hash[name] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function(){
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.replace(/\\/g, '\\\\');
    if (useDoubleQuotes)
      return '"' + escapedString.replace(/"/g, '\\"') + '"';
    else
      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}

String.prototype.parseQuery = String.prototype.toQueryParams;

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }
}

var $prot_break    = new Object();
var $prot_continue = new Object();

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        try {
          iterator(value, index++);
        } catch (e) {
          if (e != $prot_continue) throw e;
        }
      });
    } catch (e) {
      if (e != $prot_break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator) {
    var index = -number, slices = [], array = this.toArray();
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.map(iterator);
  },

  all: function(iterator) {
    var result = true;
    this.each(function(value, index) {
      result = result && !!(iterator || Prototype.K)(value, index);
      if (!result) throw $prot_break;
    });
    return result;
  },

  any: function(iterator) {
    var result = false;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $prot_break;
    });
    return result;
  },

  collect: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      results.push((iterator || Prototype.K)(value, index));
    });
    return results;
  },

  detect: function(iterator) {
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $prot_break;
      }
    });
    return result;
  },

  findAll: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(pattern, iterator) {
    var results = [];
    this.each(function(value, index) {
      var stringValue = value.toString();
      if (stringValue.match(pattern))
        results.push((iterator || Prototype.K)(value, index));
    })
    return results;
  },

  include: function(object) {
    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $prot_break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = fillWith === undefined ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator) {
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $prot_A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator) {
    var trues = [], falses = [];
    this.each(function(value, index) {
      ((iterator || Prototype.K)(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value, index) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator) {
    return this.map(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $prot_A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($prot_A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
}

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray
});
var $prot_A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse)
  Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(value && value.constructor == Array ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $prot_A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  indexOf: function(object) {
    for (var i = 0, length = this.length; i < length; i++)
      if (this[i] == object) return i;
    return -1;
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function() {
    return this.inject([], function(array, value) {
      return array.include(value) ? array : array.concat([value]);
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  }
});

Array.prototype.toArray = Array.prototype.clone;

function $prot_w(string){
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if(window.opera){
  Array.prototype.concat = function(){
    var array = [];
    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for(var i = 0, length = arguments.length; i < length; i++) {
      if(arguments[i].constructor == Array) {
        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  }
}
var Hash = function(obj) {
  Object.extend(this, obj || {});
};

Object.extend(Hash, {
  toQueryString: function(obj) {
    var parts = [];

	  this.prototype._each.call(obj, function(pair) {
      if (!pair.key) return;

      if (pair.value && pair.value.constructor == Array) {
        var values = pair.value.compact();
        if (values.length < 2) pair.value = values.reduce();
        else {
        	key = encodeURIComponent(pair.key);
          values.each(function(value) {
            value = value != undefined ? encodeURIComponent(value) : '';
            parts.push(key + '=' + encodeURIComponent(value));
          });
          return;
        }
      }
      if (pair.value == undefined) pair[1] = '';
      parts.push(pair.map(encodeURIComponent).join('='));
	  });

    return parts.join('&');
  }
});

Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
  _each: function(iterator) {
    for (var key in this) {
      var value = this[key];
      if (value && value == Hash.prototype[key]) continue;

      var pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  },

  keys: function() {
    return this.pluck('key');
  },

  values: function() {
    return this.pluck('value');
  },

  merge: function(hash) {
    return $prot_H(hash).inject(this, function(mergedHash, pair) {
      mergedHash[pair.key] = pair.value;
      return mergedHash;
    });
  },

  remove: function() {
    var result;
    for(var i = 0, length = arguments.length; i < length; i++) {
      var value = this[arguments[i]];
      if (value !== undefined){
        if (result === undefined) result = value;
        else {
          if (result.constructor != Array) result = [result];
          result.push(value)
        }
      }
      delete this[arguments[i]];
    }
    return result;
  },

  toQueryString: function() {
    return Hash.toQueryString(this);
  },

  inspect: function() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  }
});

function $prot_H(object) {
  if (object && object.constructor == Hash) return object;
  return new Hash(object);
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $prot_R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
}

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (typeof responder[callback] == 'function') {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) {}
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
  }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
  setOptions: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   ''
    }
    Object.extend(this.options, options || {});

    this.options.method = this.options.method.toLowerCase();
    if (typeof this.options.parameters == 'string')
      this.options.parameters = this.options.parameters.toQueryParams();
  }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
  _complete: false,

  initialize: function(url, options) {
    this.transport = Ajax.getTransport();
    this.setOptions(options);
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = this.options.parameters;

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    params = Hash.toQueryString(params);
    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='

    // when GET, append parameters to URL
    if (this.method == 'get' && params)
      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;

    try {
      Ajax.Responders.dispatch('onCreate', this, this.transport);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous)
        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      var body = this.method == 'post' ? (this.options.postBody || params) : null;

      this.transport.send(body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (typeof extras.push == 'function')
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $prot_H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    return !this.transport.status
        || (this.transport.status >= 200 && this.transport.status < 300);
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState];
    var transport = this.transport, json = this.evalJSON();

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + this.transport.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(transport, json);
      } catch (e) {
        this.dispatchException(e);
      }

      if ((this.getHeader('Content-type') || 'text/javascript').strip().
        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$prot_/i))
          this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
      Ajax.Responders.dispatch('on' + state, this, transport, json);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) { return null }
  },

  evalJSON: function() {
    try {
      var json = this.getHeader('X-JSON');
      return json ? eval('(' + json + ')') : null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval(this.transport.responseText);
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
  initialize: function(container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    }

    this.transport = Ajax.getTransport();
    this.setOptions(options);

    var onComplete = this.options.onComplete || Prototype.emptyFunction;
    this.options.onComplete = (function(transport, param) {
      this.updateContent();
      onComplete(transport, param);
    }).bind(this);

    this.request(url);
  },

  updateContent: function() {
    var receiver = this.container[this.success() ? 'success' : 'failure'];
    var response = this.transport.responseText;

    if (!this.options.evalScripts) response = response.stripScripts();

    if (receiver = $prot_(receiver)) {
      if (this.options.insertion)
        new this.options.insertion(receiver, response);
      else
        receiver.update(response);
    }

    if (this.success()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
  initialize: function(container, url, options) {
    this.setOptions(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = {};
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(request) {
    if (this.options.decay) {
      this.decay = (request.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = request.responseText;
    }
    this.timer = setTimeout(this.onTimerEvent.bind(this),
      this.decay * this.frequency * 1000);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $prot_(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($prot_(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $prot_(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(query.snapshotItem(i));
    return results;
  };
}

document.getElementsByClassName = function(className, parentElement) {
  if (Prototype.BrowserFeatures.XPath) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  } else {
    var children = ($prot_(parentElement) || document.body).getElementsByTagName('*');
    var elements = [], child;
    for (var i = 0, length = children.length; i < length; i++) {
      child = children[i];
      if (Element.hasClassName(child, className))
        elements.push(Element.extend(child));
    }
    return elements;
  }
};

/*--------------------------------------------------------------------------*/

if (!window.Element)
  var Element = new Object();

Element.extend = function(element) {
  if (!element || _nativeExtensions || element.nodeType == 3) return element;

  if (!element._extended && element.tagName && element != window) {
    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;

    if (element.tagName == 'FORM')
      Object.extend(methods, Form.Methods);
    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
      Object.extend(methods, Form.Element.Methods);

    Object.extend(methods, Element.Methods.Simulated);

    for (var property in methods) {
      var value = methods[property];
      if (typeof value == 'function' && !(property in element))
        element[property] = cache.findOrStore(value);
    }
  }

  element._extended = true;
  return element;
};

Element.extend.cache = {
  findOrStore: function(value) {
    return this[value] = this[value] || function() {
      return value.apply(null, [this].concat($prot_A(arguments)));
    }
  }
};

Element.Methods = {
  visible: function(element) {
    return $prot_(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $prot_(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    $prot_(element).style.display = 'none';
    return element;
  },

  show: function(element) {
    $prot_(element).style.display = '';
    return element;
  },

  remove: function(element) {
    element = $prot_(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, html) {
    html = typeof html == 'undefined' ? '' : html.toString();
    $prot_(element).innerHTML = html.stripScripts();
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  replace: function(element, html) {
    element = $prot_(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    if (element.outerHTML) {
      element.outerHTML = html.stripScripts();
    } else {
      var range = element.ownerDocument.createRange();
      range.selectNodeContents(element);
      element.parentNode.replaceChild(
        range.createContextualFragment(html.stripScripts()), element);
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  },

  inspect: function(element) {
    element = $prot_(element);
    var result = '<' + element.tagName.toLowerCase();
    $prot_H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $prot_(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $prot_(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $prot_A($prot_(element).getElementsByTagName('*'));
  },

  immediateDescendants: function(element) {
    if (!(element = $prot_(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($prot_(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $prot_(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $prot_(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $prot_(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (typeof selector == 'string')
      selector = new Selector(selector);
    return selector.match($prot_(element));
  },

  up: function(element, expression, index) {
    return Selector.findElement($prot_(element).ancestors(), expression, index);
  },

  down: function(element, expression, index) {
    return Selector.findElement($prot_(element).descendants(), expression, index);
  },

  previous: function(element, expression, index) {
    return Selector.findElement($prot_(element).previousSiblings(), expression, index);
  },

  next: function(element, expression, index) {
    return Selector.findElement($prot_(element).nextSiblings(), expression, index);
  },

  getElementsBySelector: function() {
    var args = $prot_A(arguments), element = $prot_(args.shift());
    return Selector.findChildElements(element, args);
  },

  getElementsByClassName: function(element, className) {
    return document.getElementsByClassName(className, element);
  },

  readAttribute: function(element, name) {
    element = $prot_(element);
    if (document.all && !window.opera) {
      var t = Element._attributeTranslations;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name])  name = t.names[name];
      var attribute = element.attributes[name];
      if(attribute) return attribute.nodeValue;
    }
    return element.getAttribute(name);
  },

  getHeight: function(element) {
    return $prot_(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $prot_(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $prot_(element))) return;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$prot_)")))
      return true;
    return false;
  },

  addClassName: function(element, className) {
    if (!(element = $prot_(element))) return;
    Element.classNames(element).add(className);
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $prot_(element))) return;
    Element.classNames(element).remove(className);
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $prot_(element))) return;
    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
    return element;
  },

  observe: function() {
    Event.observe.apply(Event, arguments);
    return $prot_A(arguments).first();
  },

  stopObserving: function() {
    Event.stopObserving.apply(Event, arguments);
    return $prot_A(arguments).first();
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $prot_(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $prot_(element).innerHTML.match(/^\s*$prot_/);
  },

  descendantOf: function(element, ancestor) {
    element = $prot_(element), ancestor = $prot_(ancestor);
    while (element = element.parentNode)
      if (element == ancestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $prot_(element);
    var pos = Position.cumulativeOffset(element);
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $prot_(element);
    if (['float','cssFloat'].include(style))
      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
    style = style.camelize();
    var value = element.style[style];
    if (!value) {
      if (document.defaultView && document.defaultView.getComputedStyle) {
        var css = document.defaultView.getComputedStyle(element, null);
        value = css ? css[style] : null;
      } else if (element.currentStyle) {
        value = element.currentStyle[style];
      }
    }

    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
      value = element['offset'+style.capitalize()] + 'px';

    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
    if(style == 'opacity') {
      if(value) return parseFloat(value);
      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if(value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }
    return value == 'auto' ? null : value;
  },

  setStyle: function(element, style) {
    element = $prot_(element);
    for (var name in style) {
      var value = style[name];
      if(name == 'opacity') {
        if (value == 1) {
          value = (/Gecko/.test(navigator.userAgent) &&
            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
          if(/MSIE/.test(navigator.userAgent) && !window.opera)
            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
        } else if(value === '') {
          if(/MSIE/.test(navigator.userAgent) && !window.opera)
            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
        } else {
          if(value < 0.00001) value = 0;
          if(/MSIE/.test(navigator.userAgent) && !window.opera)
            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
              'alpha(opacity='+value*100+')';
        }
      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
      element.style[name.camelize()] = value;
    }
    return element;
  },

  getDimensions: function(element) {
    element = $prot_(element);
    var display = $prot_(element).getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $prot_(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $prot_(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $prot_(element);
    if (element._overflow) return element;
    element._overflow = element.style.overflow || 'auto';
    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $prot_(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  }
};

Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});

Element._attributeTranslations = {};

Element._attributeTranslations.names = {
  colspan:   "colSpan",
  rowspan:   "rowSpan",
  valign:    "vAlign",
  datetime:  "dateTime",
  accesskey: "accessKey",
  tabindex:  "tabIndex",
  enctype:   "encType",
  maxlength: "maxLength",
  readonly:  "readOnly",
  longdesc:  "longDesc"
};

Element._attributeTranslations.values = {
  _getAttr: function(element, attribute) {
    return element.getAttribute(attribute, 2);
  },

  _flag: function(element, attribute) {
    return $prot_(element).hasAttribute(attribute) ? attribute : null;
  },

  style: function(element) {
    return element.style.cssText.toLowerCase();
  },

  title: function(element) {
    var node = element.getAttributeNode('title');
    return node.specified ? node.nodeValue : null;
  }
};

Object.extend(Element._attributeTranslations.values, {
  href: Element._attributeTranslations.values._getAttr,
  src:  Element._attributeTranslations.values._getAttr,
  disabled: Element._attributeTranslations.values._flag,
  checked:  Element._attributeTranslations.values._flag,
  readonly: Element._attributeTranslations.values._flag,
  multiple: Element._attributeTranslations.values._flag
});

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    var t = Element._attributeTranslations;
    attribute = t.names[attribute] || attribute;
    return $prot_(element).getAttributeNode(attribute).specified;
  }
};

// IE is missing .innerHTML support for TABLE-related elements
if (document.all && !window.opera){
  Element.Methods.update = function(element, html) {
    element = $prot_(element);
    html = typeof html == 'undefined' ? '' : html.toString();
    var tagName = element.tagName.toUpperCase();
    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
      var div = document.createElement('div');
      switch (tagName) {
        case 'THEAD':
        case 'TBODY':
          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
          depth = 2;
          break;
        case 'TR':
          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
          depth = 3;
          break;
        case 'TD':
          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
          depth = 4;
      }
      $prot_A(element.childNodes).each(function(node){
        element.removeChild(node)
      });
      depth.times(function(){ div = div.firstChild });

      $prot_A(div.childNodes).each(
        function(node){ element.appendChild(node) });
    } else {
      element.innerHTML = html.stripScripts();
    }
    setTimeout(function() {html.evalScripts()}, 10);
    return element;
  }
};

Object.extend(Element, Element.Methods);

var _nativeExtensions = false;

if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
    var className = 'HTML' + tag + 'Element';
    if(window[className]) return;
    var klass = window[className] = {};
    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
  });

Element.addMethods = function(methods) {
  Object.extend(Element.Methods, methods || {});

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    var cache = Element.extend.cache;
    for (var property in methods) {
      var value = methods[property];
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = cache.findOrStore(value);
    }
  }

  if (typeof HTMLElement != 'undefined') {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
    copy(Form.Methods, HTMLFormElement.prototype);
    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
      copy(Form.Element.Methods, klass.prototype);
    });
    _nativeExtensions = true;
  }
}

var Toggle = new Object();
Toggle.display = Element.toggle;

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
  this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $prot_(element);
    this.content = content.stripScripts();

    if (this.adjacency && this.element.insertAdjacentHTML) {
      try {
        this.element.insertAdjacentHTML(this.adjacency, this.content);
      } catch (e) {
        var tagName = this.element.tagName.toUpperCase();
        if (['TBODY', 'TR'].include(tagName)) {
          this.insertContent(this.contentFromAnonymousTable());
        } else {
          throw e;
        }
      }
    } else {
      this.range = this.element.ownerDocument.createRange();
      if (this.initializeRange) this.initializeRange();
      this.insertContent([this.range.createContextualFragment(this.content)]);
    }

    setTimeout(function() {content.evalScripts()}, 10);
  },

  contentFromAnonymousTable: function() {
    var div = document.createElement('div');
    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
    return $prot_A(div.childNodes[0].childNodes[0].childNodes);
  }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
  initializeRange: function() {
    this.range.setStartBefore(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment, this.element);
    }).bind(this));
  }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(true);
  },

  insertContent: function(fragments) {
    fragments.reverse(false).each((function(fragment) {
      this.element.insertBefore(fragment, this.element.firstChild);
    }).bind(this));
  }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
  initializeRange: function() {
    this.range.selectNodeContents(this.element);
    this.range.collapse(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.appendChild(fragment);
    }).bind(this));
  }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
  initializeRange: function() {
    this.range.setStartAfter(this.element);
  },

  insertContent: function(fragments) {
    fragments.each((function(fragment) {
      this.element.parentNode.insertBefore(fragment,
        this.element.nextSibling);
    }).bind(this));
  }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $prot_(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($prot_A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($prot_A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $prot_A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);
var Selector = Class.create();
Selector.prototype = {
  initialize: function(expression) {
    this.params = {classNames: []};
    this.expression = expression.toString().strip();
    this.parseExpression();
    this.compileMatcher();
  },

  parseExpression: function() {
    function abort(message) { throw 'Parse error in selector: ' + message; }

    if (this.expression == '')  abort('empty expression');

    var params = this.params, expr = this.expression, match, modifier, clause, rest;
    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$prot_/i)) {
      params.attributes = params.attributes || [];
      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
      expr = match[1];
    }

    if (expr == '*') return this.params.wildcard = true;

    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
      modifier = match[1], clause = match[2], rest = match[3];
      switch (modifier) {
        case '#':       params.id = clause; break;
        case '.':       params.classNames.push(clause); break;
        case '':
        case undefined: params.tagName = clause.toUpperCase(); break;
        default:        abort(expr.inspect());
      }
      expr = rest;
    }

    if (expr.length > 0) abort(expr.inspect());
  },

  buildMatchExpression: function() {
    var params = this.params, conditions = [], clause;

    if (params.wildcard)
      conditions.push('true');
    if (clause = params.id)
      conditions.push('element.readAttribute("id") == ' + clause.inspect());
    if (clause = params.tagName)
      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
    if ((clause = params.classNames).length > 0)
      for (var i = 0, length = clause.length; i < length; i++)
        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
    if (clause = params.attributes) {
      clause.each(function(attribute) {
        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
        var splitValueBy = function(delimiter) {
          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
        }

        switch (attribute.operator) {
          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
          case '|=':      conditions.push(
                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
                          ); break;
          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
          case '':
          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
        }
      });
    }

    return conditions.join(' && ');
  },

  compileMatcher: function() {
    this.match = new Function('element', 'if (!element.tagName) return false; \
      element = $prot_(element); \
      return ' + this.buildMatchExpression());
  },

  findElements: function(scope) {
    var element;

    if (element = $prot_(this.params.id))
      if (this.match(element))
        if (!scope || Element.childOf(element, scope))
          return [element];

    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');

    var results = [];
    for (var i = 0, length = scope.length; i < length; i++)
      if (this.match(element = scope[i]))
        results.push(Element.extend(element));

    return results;
  },

  toString: function() {
    return this.expression;
  }
}

Object.extend(Selector, {
  matchElements: function(elements, expression) {
    var selector = new Selector(expression);
    return elements.select(selector.match.bind(selector)).map(Element.extend);
  },

  findElement: function(elements, expression, index) {
    if (typeof expression == 'number') index = expression, expression = false;
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    return expressions.map(function(expression) {
      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
        var selector = new Selector(expr);
        return results.inject([], function(elements, result) {
          return elements.concat(selector.findElements(result || element));
        });
      });
    }).flatten();
  }
});

function $prot_$prot_() {
  return Selector.findChildElements(document, $prot_A(arguments));
}
var Form = {
  reset: function(form) {
    $prot_(form).reset();
    return form;
  },

  serializeElements: function(elements, getHash) {
    var data = elements.inject({}, function(result, element) {
      if (!element.disabled && element.name) {
        var key = element.name, value = $prot_(element).getValue();
        if (value != undefined) {
          if (result[key]) {
            if (result[key].constructor != Array) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return getHash ? data : Hash.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, getHash) {
    return Form.serializeElements(Form.getElements(form), getHash);
  },

  getElements: function(form) {
    return $prot_A($prot_(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $prot_(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $prot_A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $prot_(form);
    form.getElements().each(function(element) {
      element.blur();
      element.disabled = 'true';
    });
    return form;
  },

  enable: function(form) {
    form = $prot_(form);
    form.getElements().each(function(element) {
      element.disabled = '';
    });
    return form;
  },

  findFirstElement: function(form) {
    return $prot_(form).getElements().find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $prot_(form);
    form.findFirstElement().activate();
    return form;
  }
}

Object.extend(Form, Form.Methods);

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $prot_(element).focus();
    return element;
  },

  select: function(element) {
    $prot_(element).select();
    return element;
  }
}

Form.Element.Methods = {
  serialize: function(element) {
    element = $prot_(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = {};
        pair[element.name] = value;
        return Hash.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $prot_(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  clear: function(element) {
    $prot_(element).value = '';
    return element;
  },

  present: function(element) {
    return $prot_(element).value != '';
  },

  activate: function(element) {
    element = $prot_(element);
    element.focus();
    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
      !['button', 'reset', 'submit'].include(element.type) ) )
      element.select();
    return element;
  },

  disable: function(element) {
    element = $prot_(element);
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $prot_(element);
    element.blur();
    element.disabled = false;
    return element;
  }
}

Object.extend(Form.Element, Form.Element.Methods);
var Field = Form.Element;
var $prot_F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
      default:
        return Form.Element.Serializers.textarea(element);
    }
  },

  inputSelector: function(element) {
    return element.checked ? element.value : null;
  },

  textarea: function(element) {
    return element.value;
  },

  select: function(element) {
    return this[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
}

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
  initialize: function(element, frequency, callback) {
    this.frequency = frequency;
    this.element   = $prot_(element);
    this.callback  = callback;

    this.lastValue = this.getValue();
    this.registerCallback();
  },

  registerCallback: function() {
    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  onTimerEvent: function() {
    var value = this.getValue();
    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
      ? this.lastValue != value : String(this.lastValue) != String(value));
    if (changed) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
  initialize: function(element, callback) {
    this.element  = $prot_(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback.bind(this));
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return event.target || event.srcElement;
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $prot_(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $prot_(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
        || element.detachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      try {
        element.detachEvent('on' + name, observer);
      } catch (e) {}
    }
  }
});

/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
  Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if(element.tagName=='BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = this.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = this.realOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = this.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  page: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent==document.body)
        if (Element.getStyle(element,'position')=='absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!window.opera || element.tagName=='BODY') {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return [valueL, valueT];
  },

  clone: function(source, target) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || {})

    // find page position of source
    source = $prot_(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $prot_(target);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(target,'position') == 'absolute') {
      parent = Position.offsetParent(target);
      delta = Position.page(parent);
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
  },

  absolutize: function(element) {
    element = $prot_(element);
    if (element.style.position == 'absolute') return;
    Position.prepare();

    var offsets = Position.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
  },

  relativize: function(element) {
    element = $prot_(element);
    if (element.style.position == 'relative') return;
    Position.prepare();

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
  }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned.  For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
  Position.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return [valueL, valueT];
  }
}

Element.addMethods();
// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/ 

// converts rgb() and #xxx to #xxxxxx format,  
// returns self (or first argument) if not convertable  
String.prototype.parseColor = function() {  
  var color = '#';
  if(this.slice(0,4) == 'rgb(') {  
    var cols = this.slice(4,this.length-1).split(',');  
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  } else {  
    if(this.slice(0,1) == '#') {  
      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
      if(this.length==7) color = this.toLowerCase();  
    }  
  }  
  return(color.length==7 ? color : (arguments[0] || this));  
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {  
  return $prot_A($prot_(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) {  
  return $prot_A($prot_(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
  element = $prot_(element);  
  element.setStyle({fontSize: (percent/100) + 'em'});   
  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  return element;
}

Element.getOpacity = function(element){
  return $prot_(element).getStyle('opacity');
}

Element.setOpacity = function(element, value){
  return $prot_(element).setStyle({opacity:value});
}

Element.getInlineOpacity = function(element){
  return $prot_(element).style.opacity || '';
}

Element.forceRerendering = function(element) {
  try {
    element = $prot_(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
  var args = arguments;
  this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
    
    element = $prot_(element);
    $prot_A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $prot_(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $prot_A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $prot_(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[element.visible() ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
  linear: Prototype.K,
  sinoidal: function(pos) {
    return (-Math.cos(pos*Math.PI)/2) + 0.5;
  },
  reverse: function(pos) {
    return 1-pos;
  },
  flicker: function(pos) {
    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
  },
  wobble: function(pos) {
    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
  },
  pulse: function(pos, pulses) { 
    pulses = pulses || 5; 
    return (
      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
      );
  },
  none: function(pos) {
    return 0;
  },
  full: function(pos) {
    return 1;
  }
};

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval) 
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++) 
      if(this.effects[i]) this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $prot_H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn + (this.options.duration*1000);
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $prot_H();
    for(property in this)
      if(typeof this[property] != 'function') data[property] = this[property];
    return '#<Effect:' + data.inspect() + ',options:' + $prot_H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
  initialize: function() {
    var options = Object.extend({
      duration: 0
    }, arguments[0] || {});
    this.start(options);
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $prot_(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $prot_(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  initialize: function(element, percent) {
    this.element = $prot_(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || {});
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');
    
    this.originalStyle = {};
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));
      
    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;
    
    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if(fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));
    
    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
    
    this.dims = null;
    if(this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if(/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if(!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if(this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = {};
    if(this.options.scaleX) d.width = Math.round(width) + 'px';
    if(this.options.scaleY) d.height = Math.round(height) + 'px';
    if(this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if(this.elementPositioning == 'absolute') {
        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if(this.options.scaleY) d.top = -topd + 'px';
        if(this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $prot_(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {};
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if(!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $prot_R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $prot_R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $prot_R(0,2).inject('#',function(m,v,i){
      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $prot_(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $prot_(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
  from: element.getOpacity() || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { 
    if(effect.options.to!=0) return;
    effect.element.hide().setStyle({opacity: oldOpacity}); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  element = $prot_(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show(); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
  element = $prot_(element);
  var oldStyle = { 
    opacity: element.getInlineOpacity(), 
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200, 
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
     Object.extend({ duration: 1.0, 
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element)
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || {})
   );
}

Effect.BlindUp = function(element) {
  element = $prot_(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      } 
    }, arguments[1] || {})
  );
}

Effect.BlindDown = function(element) {
  element = $prot_(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
    },  
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || {}));
}

Effect.SwitchOff = function(element) {
  element = $prot_(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, { 
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) { 
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      })
    }
  }, arguments[1] || {}));
}

Effect.DropOut = function(element) {
  element = $prot_(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned(); 
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        } 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $prot_(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element, 
      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
  element = $prot_(element).cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || {})
  );
}

Effect.SlideUp = function(element) {
  element = $prot_(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },  
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
      effect.element.down().undoPositioned();
    }
   }, arguments[1] || {})
  );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, { 
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping(); 
    },  
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping(); 
    }
  });
}

Effect.Grow = function(element) {
  element = $prot_(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();    
  var initialMoveX, initialMoveY;
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0; 
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }
  
  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01, 
    beforeSetup: function(effect) {
      effect.element.hide().makeClipping().makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'}).show(); 
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
             }
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $prot_(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':  
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }
  
  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({            
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned().makeClipping(); 
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $prot_(element);
  var options    = arguments[1] || {};
  var oldOpacity = element.getInlineOpacity();
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
  reverser.bind(transition);
  return new Effect.Opacity(element, 
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
  element = $prot_(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 5, Object.extend({   
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, { 
      scaleContent: false, 
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || {}));
};

Effect.Morph = Class.create();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $prot_(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: {}
    }, arguments[1] || {});
    if (typeof options.style == 'string') {
      if(options.style.indexOf(':') == -1) {
        var cssText = '', selector = '.' + options.style;
        $prot_A(document.styleSheets).reverse().each(function(styleSheet) {
          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
          else if (styleSheet.rules) cssRules = styleSheet.rules;
          $prot_A(cssRules).reverse().each(function(rule) {
            if (selector == rule.selectorText) {
              cssText = rule.style.cssText;
              throw $prot_break;
            }
          });
          if (cssText) throw $prot_break;
        });
        this.style = cssText.parseStyle();
        options.afterFinishInternal = function(effect){
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            if(transform.style != 'opacity')
              effect.element.style[transform.style.camelize()] = '';
          });
        }
      } else this.style = options.style.parseStyle();
    } else this.style = $prot_H(options.style)
    this.start(options);
  },
  setup: function(){
    function parseColor(color){
      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $prot_R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;

      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if(property == 'opacity') {
        value = parseFloat(value);
        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if(Element.CSS_LENGTH.test(value)) 
        var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$prot_/),
          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;

      var originalValue = this.element.getStyle(property);
      return $prot_H({ 
        style: property, 
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      });
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      )
    });
  },
  update: function(position) {
    var style = $prot_H(), value = null;
    this.transforms.each(function(transform){
      value = transform.unit=='color' ?
        $prot_R(0,2).inject('#',function(m,v,i){
          return m+(Math.round(transform.originalValue[i]+
            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
        transform.originalValue + Math.round(
          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
      style[transform.style] = value;
    });
    this.element.setStyle(style);
  }
});

Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || {};
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      var data = $prot_H(track).values().first();
      this.tracks.push($prot_H({
        ids:     $prot_H(track).keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var elements = [$prot_(track.ids) || $prot_$prot_(track.ids)].flatten();
        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $prot_w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');
  
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$prot_/;

String.prototype.parseStyle = function(){
  var element = Element.extend(document.createElement('div'));
  element.innerHTML = '<div style="' + this + '"></div>';
  var style = element.down().style, styleRules = $prot_H();
  
  Element.CSS_PROPERTIES.each(function(property){
    if(style[property]) styleRules[property] = style[property]; 
  });
  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
  }
  return styleRules;
};

Element.morph = function(element, style) {
  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
  return element;
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
  function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
  s = effect.gsub(/_/, '-').camelize();
  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
  new Effect[effect_class](element, options);
  return $prot_(element);
};

Element.addMethods();
// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality 
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least, 
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method 
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most 
// useful when one of the tokens is \n (a newline), as it 
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = {}
Autocompleter.Base = function() {};
Autocompleter.Base.prototype = {
  baseInitialize: function(element, update, options) {
    this.element     = $prot_(element); 
    this.update      = $prot_(update);  
    this.hasFocus    = false; 
    this.changed     = false; 
    this.active      = false; 
    this.index       = 0;     
    this.entryCount  = 0;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || {};

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow || 
      function(element, update){ 
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false, 
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide || 
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string') 
      this.options.tokens = new Array(this.options.tokens);

    this.observer = null;
    
    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);
    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
    Event.observe(this.update, "blur", this.onBlur.bindAsEventListener(this)); // Correction bug IE sur le scrolling
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix && 
      (navigator.appVersion.indexOf('MSIE')>0) &&
      (navigator.userAgent.indexOf('Opera')<0) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update, 
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $prot_(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },
  
  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;

    var aClass = this.update.className;
    var cssRules = 'rules';
    for (var sSheet=0; sSheet < document.styleSheets.length; sSheet++){
      for (var rule=0; rule < document.styleSheets[sSheet][cssRules].length; rule++) {
	var currentClass = document.styleSheets[sSheet][cssRules][rule].selectorText.substring(1);
	if (currentClass == aClass) {
	  rWidth= document.styleSheets[sSheet][cssRules][rule].style["width"];
	}
      }
    }
    this.update.style.width=rWidth;
    this.iefix.style.width=rWidth;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
      }
     else 
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer = 
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex) 
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },
  
  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },
  
  onBlur: function(event) {
    // needed to make click events working
    // correction bug IE sur le scrolling. Si au moment du onblur sur le champ input, l'element qui a le focus est le div de resultat
    // on fait rien
    if(document.activeElement==this.update) return;
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;     
  }, 
  
  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ? 
          Element.addClassName(this.getEntry(i),"selected") : 
          Element.removeClassName(this.getEntry(i),"selected");
        
      if(this.hasFocus) { 
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },
  
  markPrevious: function() {
    if(this.index > 0) this.index--
      else this.index = this.entryCount-1;
//    this.getEntry(this.index).scrollIntoView(true);
//  bug utilisation des curseur dans la liste
    this.getEntry(this.index).scrollIntoView(false);
  },
  
  markNext: function() {
    if(this.index < this.entryCount-1) this.index++
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },
  
  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },
  
  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },
  
  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
    
    var lastTokenPos = this.findLastToken();
    if (lastTokenPos != -1) {
      var newValue = this.element.value.substr(0, lastTokenPos + 1);
      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value;
    } else {
      this.element.value = value;
    }
    this.element.focus();
    
    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount = 
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else { 
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;
      
      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;   
    if(this.getToken().length>=this.options.minChars) {
      this.startIndicator();
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
  },

  getToken: function() {
    var tokenPos = this.findLastToken();
    if (tokenPos != -1)
      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$prot_/,'');
    else
      var ret = this.element.value;

    return /\n/.test(ret) ? '' : ret;
  },

  findLastToken: function() {
    var lastTokenPos = -1;

    for (var i=0; i<this.options.tokens.length; i++) {
      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
      if (thisTokenPos > lastTokenPos)
        lastTokenPos = thisTokenPos;
    }
    return lastTokenPos;
  }
}

Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    entry = encodeURIComponent(this.options.paramName) + '=' + 
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams) 
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }

});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
//                    text only at the beginning of strings in the 
//                    autocomplete array. Defaults to true, which will
//                    match text at the beginning of any *word* in the
//                    strings in the autocomplete array. If you want to
//                    search anywhere in the string, additionally set
//                    the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
//                   a partial match (unlike minChars, which defines
//                   how many characters are required to do any match
//                   at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
//                 Defaults to true.
//
// It's possible to pass in a custom function as the 'selector' 
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create();
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&  
          ret.length < instance.options.choices ; i++) { 

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ? 
            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) { 
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars && 
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ? 
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || {});
  }
});

// AJAX in-place editor
//
// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
}

Ajax.InPlaceEditor = Class.create();
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
Ajax.InPlaceEditor.prototype = {
  initialize: function(element, url, options) {
    this.url = url;
    this.element = $prot_(element);

    this.options = Object.extend({
      paramName: "value",
      okButton: true,
      okText: "ok",
      cancelLink: true,
      cancelText: "cancel",
      savingText: "Saving...",
      clickToEditText: "Click to edit",
      okText: "ok",
      rows: 1,
      onComplete: function(transport, element) {
        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
      },
      onFailure: function(transport) {
        alert("Error communicating with the server: " + transport.responseText.stripTags());
      },
      callback: function(form) {
        return Form.serialize(form);
      },
      handleLineBreaks: true,
      loadingText: 'Loading...',
      savingClassName: 'inplaceeditor-saving',
      loadingClassName: 'inplaceeditor-loading',
      formClassName: 'inplaceeditor-form',
      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
      highlightendcolor: "#FFFFFF",
      externalControl: null,
      submitOnBlur: false,
      ajaxOptions: {},
      evalScripts: false
    }, options || {});

    if(!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + "-inplaceeditor";
      if ($prot_(this.options.formId)) {
        // there's already a form with that name, don't specify an id
        this.options.formId = null;
      }
    }
    
    if (this.options.externalControl) {
      this.options.externalControl = $prot_(this.options.externalControl);
    }
    
    this.originalBackground = Element.getStyle(this.element, 'background-color');
    if (!this.originalBackground) {
      this.originalBackground = "transparent";
    }
    
    this.element.title = this.options.clickToEditText;
    
    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
    Event.observe(this.element, 'click', this.onclickListener);
    Event.observe(this.element, 'mouseover', this.mouseoverListener);
    Event.observe(this.element, 'mouseout', this.mouseoutListener);
    if (this.options.externalControl) {
      Event.observe(this.options.externalControl, 'click', this.onclickListener);
      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
    }
  },
  enterEditMode: function(evt) {
    if (this.saving) return;
    if (this.editing) return;
    this.editing = true;
    this.onEnterEditMode();
    if (this.options.externalControl) {
      Element.hide(this.options.externalControl);
    }
    Element.hide(this.element);
    this.createForm();
    this.element.parentNode.insertBefore(this.form, this.element);
    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
    // stop the event to avoid a page refresh in Safari
    if (evt) {
      Event.stop(evt);
    }
    return false;
  },
  createForm: function() {
    this.form = document.createElement("form");
    this.form.id = this.options.formId;
    Element.addClassName(this.form, this.options.formClassName)
    this.form.onsubmit = this.onSubmit.bind(this);

    this.createEditField();

    if (this.options.textarea) {
      var br = document.createElement("br");
      this.form.appendChild(br);
    }

    if (this.options.okButton) {
      okButton = document.createElement("input");
      okButton.type = "submit";
      okButton.value = this.options.okText;
      okButton.className = 'editor_ok_button';
      this.form.appendChild(okButton);
    }

    if (this.options.cancelLink) {
      cancelLink = document.createElement("a");
      cancelLink.href = "#";
      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
      cancelLink.onclick = this.onclickCancel.bind(this);
      cancelLink.className = 'editor_cancel';      
      this.form.appendChild(cancelLink);
    }
  },
  hasHTMLLineBreaks: function(string) {
    if (!this.options.handleLineBreaks) return false;
    return string.match(/<br/i) || string.match(/<p>/i);
  },
  convertHTMLLineBreaks: function(string) {
    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
  },
  createEditField: function() {
    var text;
    if(this.options.loadTextURL) {
      text = this.options.loadingText;
    } else {
      text = this.getText();
    }

    var obj = this;
    
    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
      this.options.textarea = false;
      var textField = document.createElement("input");
      textField.obj = this;
      textField.type = "text";
      textField.name = this.options.paramName;
      textField.value = text;
      textField.style.backgroundColor = this.options.highlightcolor;
      textField.className = 'editor_field';
      var size = this.options.size || this.options.cols || 0;
      if (size != 0) textField.size = size;
      if (this.options.submitOnBlur)
        textField.onblur = this.onSubmit.bind(this);
      this.editField = textField;
    } else {
      this.options.textarea = true;
      var textArea = document.createElement("textarea");
      textArea.obj = this;
      textArea.name = this.options.paramName;
      textArea.value = this.convertHTMLLineBreaks(text);
      textArea.rows = this.options.rows;
      textArea.cols = this.options.cols || 40;
      textArea.className = 'editor_field';      
      if (this.options.submitOnBlur)
        textArea.onblur = this.onSubmit.bind(this);
      this.editField = textArea;
    }
    
    if(this.options.loadTextURL) {
      this.loadExternalText();
    }
    this.form.appendChild(this.editField);
  },
  getText: function() {
    return this.element.innerHTML;
  },
  loadExternalText: function() {
    Element.addClassName(this.form, this.options.loadingClassName);
    this.editField.disabled = true;
    new Ajax.Request(
      this.options.loadTextURL,
      Object.extend({
        asynchronous: true,
        onComplete: this.onLoadedExternalText.bind(this)
      }, this.options.ajaxOptions)
    );
  },
  onLoadedExternalText: function(transport) {
    Element.removeClassName(this.form, this.options.loadingClassName);
    this.editField.disabled = false;
    this.editField.value = transport.responseText.stripTags();
    Field.scrollFreeActivate(this.editField);
  },
  onclickCancel: function() {
    this.onComplete();
    this.leaveEditMode();
    return false;
  },
  onFailure: function(transport) {
    this.options.onFailure(transport);
    if (this.oldInnerHTML) {
      this.element.innerHTML = this.oldInnerHTML;
      this.oldInnerHTML = null;
    }
    return false;
  },
  onSubmit: function() {
    // onLoading resets these so we need to save them away for the Ajax call
    var form = this.form;
    var value = this.editField.value;
    
    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
    // to be displayed indefinitely
    this.onLoading();
    
    if (this.options.evalScripts) {
      new Ajax.Request(
        this.url, Object.extend({
          parameters: this.options.callback(form, value),
          onComplete: this.onComplete.bind(this),
          onFailure: this.onFailure.bind(this),
          asynchronous:true, 
          evalScripts:true
        }, this.options.ajaxOptions));
    } else  {
      new Ajax.Updater(
        { success: this.element,
          // don't update on failure (this could be an option)
          failure: null }, 
        this.url, Object.extend({
          parameters: this.options.callback(form, value),
          onComplete: this.onComplete.bind(this),
          onFailure: this.onFailure.bind(this)
        }, this.options.ajaxOptions));
    }
    // stop the event to avoid a page refresh in Safari
    if (arguments.length > 1) {
      Event.stop(arguments[0]);
    }
    return false;
  },
  onLoading: function() {
    this.saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  showSaving: function() {
    this.oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    Element.addClassName(this.element, this.options.savingClassName);
    this.element.style.backgroundColor = this.originalBackground;
    Element.show(this.element);
  },
  removeForm: function() {
    if(this.form) {
      if (this.form.parentNode) Element.remove(this.form);
      this.form = null;
    }
  },
  enterHover: function() {
    if (this.saving) return;
    this.element.style.backgroundColor = this.options.highlightcolor;
    if (this.effect) {
      this.effect.cancel();
    }
    Element.addClassName(this.element, this.options.hoverClassName)
  },
  leaveHover: function() {
    if (this.options.backgroundColor) {
      this.element.style.backgroundColor = this.oldBackground;
    }
    Element.removeClassName(this.element, this.options.hoverClassName)
    if (this.saving) return;
    this.effect = new Effect.Highlight(this.element, {
      startcolor: this.options.highlightcolor,
      endcolor: this.options.highlightendcolor,
      restorecolor: this.originalBackground
    });
  },
  leaveEditMode: function() {
    Element.removeClassName(this.element, this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this.originalBackground;
    Element.show(this.element);
    if (this.options.externalControl) {
      Element.show(this.options.externalControl);
    }
    this.editing = false;
    this.saving = false;
    this.oldInnerHTML = null;
    this.onLeaveEditMode();
  },
  onComplete: function(transport) {
    this.leaveEditMode();
    this.options.onComplete.bind(this)(transport, this.element);
  },
  onEnterEditMode: function() {},
  onLeaveEditMode: function() {},
  dispose: function() {
    if (this.oldInnerHTML) {
      this.element.innerHTML = this.oldInnerHTML;
    }
    this.leaveEditMode();
    Event.stopObserving(this.element, 'click', this.onclickListener);
    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
    if (this.options.externalControl) {
      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
    }
  }
};

Ajax.InPlaceCollectionEditor = Class.create();
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
  createEditField: function() {
    if (!this.cached_selectTag) {
      var selectTag = document.createElement("select");
      var collection = this.options.collection || [];
      var optionTag;
      collection.each(function(e,i) {
        optionTag = document.createElement("option");
        optionTag.value = (e instanceof Array) ? e[0] : e;
        if((typeof this.options.value == 'undefined') && 
          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
        if(this.options.value==optionTag.value) optionTag.selected = true;
        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
        selectTag.appendChild(optionTag);
      }.bind(this));
      this.cached_selectTag = selectTag;
    }

    this.editField = this.cached_selectTag;
    if(this.options.loadTextURL) this.loadExternalText();
    this.form.appendChild(this.editField);
    this.options.callback = function(form, value) {
      return "value=" + encodeURIComponent(value);
    }
  }
});

// Delayed observer, like Form.Element.Observer, 
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create();
Form.Element.DelayedObserver.prototype = {
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $prot_(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $prot_F(this.element); 
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $prot_F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $prot_F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $prot_F(this.element));
  }
};

Autocompleter.TzrLocal = Class.create();
Autocompleter.TzrLocal.prototype = Object.extend(new Autocompleter.Base(), {
  initialize:function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },
  
  getUpdatedChoices:function(){
    var t = this.getToken();
    var fields = this.options.force_target_fields;
    if (!fields || fields == 'undefined')
    fields = new Array(); 
    /* voir : stocker les requests et les reutiliser si ncessaire */
    x_xlinkdef_autocomplete(this.options.moid, this.options.table, this.options.field, t, true, fields, this.onComplete.bind(this));
  },
  onComplete:function(ajasonResponse){
    this.options.array = new Array();
    this.options.values = new Array();
    for(r in ajasonResponse){
      this.options.array[this.options.array.length] = ajasonResponse[r];
      this.options.values[this.options.values.length] = r;
    }
    if (this.options.values[0] != '...')
	this.updateChoices(this.options.selector(this));
    else{
      this.options.values[0]='';
      this.updateChoices('<ul><li id="...">'+this.options.array[0]+'<li></ul>');
    }
  },
  // ...
  afterSelection:function(foo){	
    data = $prot_A(arguments);
    if (this.options.target && data[1].id != '...'){
      document.getElementById(this.options.target).value = data[1].id;
    }
  },
  // updateElement refait pour prendre en compte le message
  myUpdate:function(selectedElement){
    if (selectedElement.id == '...'){
      return;
    }
    // update std (copie de l'original)
    var value = '';
    if (this.options.select) {
      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
    
    var lastTokenPos = this.findLastToken();
    if (lastTokenPos != -1) {
      var newValue = this.element.value.substr(0, lastTokenPos + 1);
      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value;
    } else {
      this.element.value = value;
    }
    this.element.focus();
    
    if (this.options.afterUpdateElement)
    this.options.afterUpdateElement(this.element, selectedElement);
  },
  setOptions: function(options) {
    this.options = Object.extend(    {
    choices: 9999,
	       minChars:2,
	       partialSearch: true,
	       partialChars: 2,
	       ignoreCase: true,
	       fullSearch: true,
	       updateElement:this.myUpdate.bind(this),
	       afterUpdateElement: this.afterSelection.bind(this),
	       selector: function(instance) {
      var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;
	
        for (var i = 0; i < instance.options.array.length &&
          ret.length < instance.options.choices ; i++) {

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ? elem.toLowerCase().indexOf(entry.toLowerCase()) : elem.indexOf(entry);

	  if (foundPos >= 0) {
	    if(i%2)
	     className="suggestli1";
	    else
	     className="suggestli2";
	    ret.push("<li class='"+className+"' id='"+instance.options.values[i]+"'>" + elem + "</li>");
	    /* a voir dans la doc y avait beaucoup plus de choses */
	  }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || {});
  }
});


/**
 * SWFFormFix v2.1.0: SWF ExternalInterface() Form Fix - http://http://www.teratechnologies.net/stevekamerman/
 *
 * SWFFormFix is (c) 2007 Steve Kamerman and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Project sponsored by Tera Technologies - http://www.teratechnologies.net/
 */
////////////////////////////////////////////////////
////////////  Configurable options  ////////////////
////////////////////////////////////////////////////
var EnableFullAuto	= true; // set this to true and all of your flash objects will be fixed automatically
var SWFFormFixDebug = false; // set this to true to be alerted whenever a flash object is found and fixed
var NotLoadedWarning = true; // set this to true to alert the users when they try to access a function from
							 // the ExternalInterface() that isn't loaded yet
var NotLoadedMsg = "Please wait for the page to load..."; // this is the warning they will see
////////////////////////////////////////////////////
//////////  END Configurable options  //////////////
////////////////////////////////////////////////////
/**
 * Usage:
 * ------------------------------------------------------------
 * There are three ways to use SWFFormFix, FULL AUTO, Auto and Manual mode.
 * To use either method you need to include this file in the 
 * HEAD section of your page like this: 

<script src="swfformfix.js" type="text/javascript"></script>

 * 
 * NOTE: If you want Javascript to call Flash, you need to make
 * a dummy object like follows:
 
window["myFlashObject"] = new Object();

 * Put this line directly above your call to SWFObject().
 * Replace "myFlashObject" with the ID of your object (the 2nd
 * parameter you give to SWFObject() ).  This will prevent your
 * page from dieing with an error like "myFlashObject is undefined".
 * 
 * --> FULL AUTO Mode:
 * This will attempt to find every Flash Movie that you have on
 * the page and apply the fix to each of them as the page loads.
 * It will poll the page for all the objects and determine if it
 * needs to apply the fix to them every 100ms until the page is
 * completely loaded.  All you need to do to use this mode is
 * include the script in the head of your document and set the
 * "EnableFullAuto" directive to true at the top of the script.
 *
 * --> Auto Mode:
 * This will attempt to find every Flash Movie that you have on
 * the page and apply the fix to each of them.  To use auto mode
 * put the following code before the </body> tag. More specifically
 * it needs to be AFTER your last Flash object.

<script type="text/javascript">
// <![CDATA[
	SWFFormFixAuto();
// ]]>
</script>

 * 
 * --> Manual Mode:
 * This lets you fix just a single Flash object if you don't want
 * the auto mode to try to fix every Flash object on the page.
 * This mode is faster than the auto mode and may work better in
 * some situations.  To use manual mode put the following code
 * after the Flash object you want to fix, where "myFlashObject"
 * is the ID of the Flash Object:

Example for normal EMBED style:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="200" height="100" id="myFlashObject" align="middle">
<param name="movie" value="myMovie.swf" />
<param name="quality" value="high" />
<embed src="myMovie.swf" quality="high" width="200" height="100" name="myFlashObject" type="application/x-shockwave-flash" />
</object>

<script type="text/javascript">
// <![CDATA[
SWFFormFix("myMovieObjectName");
// ]]>
</script>

Example for SWFObject style:

<div id="flashcontent" style="width:200px;height:100px;">This is replaced by the Flash movie.</div>
<script type="text/javascript">
// <![CDATA[
// Please note that the ID that you need to use for SWFFormFix() is the second argument in SWFObject().
var so = new SWFObject("myMovie.swf", "myFlashObject","200", "100", "6.0.0", "#ffffff");
so.addParam("quality", "high");
so.write("flashcontent");
SWFFormFix("myFlashObject");
// ]]>
</script>

 * 
 * Changelog:
 * ------------------------------------------------------------
 * v2.1
 *   Fixed IE cache bug that prevents JS -> Flash after refresh.  Now SWFFormFix
 *   rebuilds all the ExternalInterface() methods that were inadvertently destroyed.
 * v2.0
 *   Added FULL AUTO mode - just enable it below and include the script!
 *   Special thanks to Geoff Stearns from deconcept and onDOMload by Aaron Barker
 * 
 * v1.0
 *   Added the SWFFormFixAuto() function, very well optimized and fast.
 * 
 * v0.2
 *   Changed helper element from <input> element to hidden <div> element
 *
 * v0.1
 *   Initial release.
 */

finished = false; // this is set to true when the body's onload is called, to stop the script
timeout = 10; // seconds to wait before giving up
starttime = new Date().getTime();
flashObjectList = Array();
fixedList = Array();
makeFuncArr = Array();
SWFFormFixAuto2 = function(){
//alert("running...");
	if(navigator.appName.toLowerCase() != "microsoft internet explorer")return true;
	var flashObjectList = document.getElementsByTagName("object");
	for(var i=0;i<flashObjectList.length;i++){
		var obj = flashObjectList[i];
		// here's all the objects on the page, now lets find the flash objects
		if(obj.getAttribute('classid') == "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"){
			var id = obj.getAttribute('id');
			var alreadyfixed = false;
			for(var c=0;c<fixedList.length;c++){if(fixedList[i] == id)alreadyfixed=true;}
			// this is a flash movie, apply the fix (unless it's already been fixed)
			if(!alreadyfixed){
				var debugtxt = '';
				for(var b in window[id]){
					// ExternalInterface() tried to add some functions to the incorrect object
					if(typeof(window[id][b])=="function"){
						// this function will need to be rebuilt when the page is done loading.
						makeFuncArr.push(Array(obj,b));
						obj[b] = function(){
							if(NotLoadedWarning)alert(NotLoadedMsg);
							return("");
						}
/*
 * it seems like this would work to copy the function, but it doesn't:
 *
 * eval('obj[b]='+window[id][b].toString());
 * 
 * This is the actual function that we're trying to copy:

function () { 
  return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}

 * it will fail if you copy it to the new object though because "instance" and "name" are undefined
 * Here's how to see the actual function def: document.getElementById("txt_debug").value=window[id][b];
 */
					}
				}
				window[id]=obj;
				if(SWFFormFixDebug)alert("Fixed: "+id);
			}
		}
	}
	if(!finished){
		setTimeout("SWFFormFixAuto2()", 100);
	}else{
		for(var i=0;i<makeFuncArr.length;i++){
			// this is executed after the page is loaded - it rebuilds the custom
			// ExternalInterface() functions
			SWFFormFix_rebuildExtFunc(makeFuncArr[i][0],makeFuncArr[i][1]);
		}
	}
	return true;
}
SWFFormFix_rebuildExtFunc = function(obj,functionName){
	eval('obj[functionName] = function(){return eval(this.CallFunction("<invoke name=\\"'+functionName+'\\" returntype=\\"javascript\\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));}');
	if(SWFFormFixDebug)alert("Rebuilt ExternalInterface() function: "+functionName);
}
SWFFormFixOnloadAppend = function() {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = function(){
			finished=true;
		}
	} else {
		window.onload = function() {
			oldonload();
			finished=true;
		}
	}
}
SWFFormFixAuto = function(){
	if(navigator.appName.toLowerCase() != "microsoft internet explorer")return true;
	var objects = document.getElementsByTagName("object");
	if(objects.length == 0) return true;
	for(i=0;i<objects.length;i++){
		// here's all the objects on the page, now lets find the flash objects
		if(objects[i].classid == "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"){
			// this is a flash movie, apply the fix
			window[objects[i].id] = objects[i];
		}
	}
	var out = "";
	return true;
}
SWFFormFix = function(swfname){
	if(navigator.appName.toLowerCase() != "microsoft internet explorer")return false;
	var testnodename = "SWFFormFixTESTER";
	document.write('<div id="'+testnodename+'" onclick="SWFFormFixCallback(this,\''+swfname+'\');return false;" style="display:none">&nbsp;</div>');
	document.getElementById(testnodename).onclick();
}
SWFFormFixCallback = function (obj,swfname){
	var path = document;
	var error = false;
	var testnode = obj;
	while(obj = obj.parentNode){
		if(obj.nodeName.toLowerCase() == "form"){
			if(obj.name != undefined && obj.name != null && obj.name.length > 0){
				path = path.forms[obj.name];
			}else{
				alert("Error: one of your forms does not have a name!");
				error = true;
			}
		}
	}
	testnode.parentNode.removeChild(testnode);
	if(error) return false;
	window[swfname]=path[swfname];
	return true;
}
function noCacheIE(url){
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	if(!isIE)return(url);
	var newUrl = '?';
	if(url.indexOf('?') != -1)newUrl = '&';
	var now = new Date();
	var rand = Math.random().toString().substring(2,4);
	newUrl = url+newUrl+"noCacheIE="+rand+'-'+now.getTime().toString();
	return(newUrl);
}
if(EnableFullAuto){
	SWFFormFixAuto2();
	SWFFormFixOnloadAppend();
}
/**
 * mmSWFUpload 0.8.5: Flash upload dialog - http://profandesign.se/swfupload/
 *
 * SWFUpload is (c) 2006 Lars Huring and Mammon Media and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * VERSION HISTORY
 * 0.5 - First release
 *
 * 0.6 - 2006-11-24
 * - Got rid of flash overlay
 * - SWF size reduced to 840b
 * - CSS-only styling of button
 * - Add upload to links etc.
 *
 * 0.7 - 2006-11-27
 * - Added filesize param and check in SWF
 *
 * 0.7.1 - 2006-12-01
 * - Added link_mode param for standalone links
 * if set to "standalone", createElement("a") won't run.
 * - Added link_text param if css isn't needed.
 * - Renamed cssClass to css_class for consistency
 *
 * 0.8 - 2006-12-06
 * - Updates to .swf to queue all requests
 *
 * 0.8.5 - 2006-12-11
 * - Added "upload_queue_complete_callback" - swf notifies when all files in queue are uploaded
 *
 */
/**
 * integration :
 * dynamlic swfid (passed with settins : this.settings.swfid
 * applying formfix2 patch for use in IE : SWFFormFix(id) after object creation
 * append tzr callbabck function in this source (cf bottom of file)
 */
function fileLoader(){
   this.mmSWFUpload = {
	init: function(settings) {
	  this.settings = settings;
	  // Remove background flicker in IE
	  try {
	    document.execCommand('BackgroundImageCache', false, true);
	  } catch(e) {}
	  // Create SWFObject
	  var so = new SWFObject(this.settings.pathto+"upload.swf", this.settings.swfid, "200px", "20px", this.addSetting("flash_version", "8"), "#ffffff");
	  if(deconcept.SWFObjectUtil.getPlayerVersion(so.getAttribute("version")).major >= 8) {
	    so.addParam("menu", "false");
	    so.addParam("allowScriptAccess", "sameDomain");
	    // Add all settings to flash
	    so.addVariable("linkText", this.addSetting("link_text", "test"));
	    so.addVariable("dispZoneID", this.addSetting("dispid", ""));
	    so.addVariable("uploadBackend", this.addSetting("upload_backend", ""));
	    so.addVariable("uploadStartCallback", this.addSetting("upload_start_callback", ""));
	    so.addVariable("uploadProgressCallback", this.addSetting("upload_progress_callback", ""));
	    so.addVariable("uploadCompleteCallback", this.addSetting("upload_complete_callback", ""));
	    so.addVariable("uploadCancelCallback", this.addSetting("upload_cancel_callback", ""));
	    so.addVariable("uploadErrorCallback", this.addSetting("upload_error_callback", "this.handleErrors"));
	    so.addVariable("allowedFiletypes", this.addSetting("allowed_filetypes", "*.gif;*.jpg;*.png"));
	    so.addVariable("allowedFilesize", this.addSetting("allowed_filesize", "1000"));
	    so.addVariable("uploadQueueCompleteCallback", this.addSetting("upload_queue_complete_callback", ""));
	    so.addVariable("keepAliveUrl", this.addSetting("keep_alive_url", this.settings.keep_alive_url));
	    so.addVariable("keepAliveInterval", this.addSetting("keep_alive_interval", this.settings.keep_alive_interval));
	    // Output the flash
	    so.write(this.addSetting("target", this.settings.target));
	    SWFFormFix(this.settings.swfid);
	    if(this.addSetting("link_mode", "") == "") {
	      // Set up button and styles
	      var swfc = document.getElementById(this.settings["target"]);
	    }
	  }
	  if(this.settings["debug"] == true) {
	    this.debug();
	  }
	},
	// Make sure that we get a few default values
	addSetting: function(s, d) {
	  if(!this.settings[s]) {
	    this.settings[s] = d;
	  }
	  return this.settings[s];
	},
	// Default error handling.
	handleErrors: function(errcode, file, msg) {
	  switch(errcode) {
	    case -10:	// HTTP error
	    // alert(errcode + ", " + file + ", " + msg);
	    break;
	    case -20:	// No backend file specified
	    alert(errcode + ", " + file + ", " + msg);
	    break;
	    case -30:	// IOError
	    alert(errcode + ", " + file + ", " + msg);
	    break;
	    case -40:	// Security error
	    alert(errcode + ", " + file + ", " + msg);
	    break;
	    case -50:	// Filesize too big
	    alert(errcode + ", " + file + ", " + msg);
	    break;
	  }
	},
	getMovie: function(movieName) {
	  if (navigator.appName.indexOf("Microsoft") != -1) {
	    return window[movieName]
	  }	else {
	    return document[movieName]
	  }
	},
	callSWF: function() {
	  this.getMovie(this.settings.swfid).uploadImage();
	},
	debug: function() {
	  document.write("<strong>Pathto:</strong> " + this.settings["pathto"] + "<br />");
	  document.write("<strong>Id:</strong> " + this.settings["swfid"] + "<br />");
	  document.write("<strong>Target:</strong> " + this.settings["target"] + "<br />");
	  document.write("<strong>Upload start callback:</strong> " + this.settings["upload_start_callback"] + "<br />");
	  document.write("<strong>Upload progress callback:</strong> " + this.settings["upload_progress_callback"] + "<br />");
	  document.write("<strong>Upload complete callback:</strong> " + this.settings["upload_complete_callback"] + "<br />");
	  document.write("<strong>Upload filetypes:</strong> " + this.settings["allowed_filetypes"] + "<br />");
	  document.write("<strong>Max filesize:</strong> " + this.settings["allowed_filesize"] + "kb <br />");
	  document.write("<strong>Link mode:</strong> " + this.settings["link_mode"] + "<br />");
	  document.write("<strong>Link text:</strong> " + this.settings["link_text"] + "<br />");
	  document.write("<strong>CSS class:</strong> " + this.settings["css_class"] + "<br />");
	  document.write("<strong>Upload backend file:</strong> " + this.settings["upload_backend"] + "<br />");
	  document.write("<strong>Upload error callback:</strong> " + this.settings["upload_error_callback"] + "<br />");
	  document.write("<strong>Upload cancel callback:</strong> " + this.settings["upload_cancel_callback"] + "<br />");
	  document.write("<strong>Upload queue complete callback:</strong> " + this.settings["upload_queue_complete_callback"] + "<br />");
	}
    }
}
/**
 * SWFObject v1.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
 *   legal reasons.
 */
if(typeof deconcept=="undefined") {var deconcept=new Object();}
if(typeof deconcept.util=="undefined") {deconcept.util=new Object();}
if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){
	if(!document.createElement||!document.getElementById) {return;}
	this.DETECT_KEY = _b ? _b : "detectflash";
	this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
	this.params=new Object();
	this.variables=new Object();
	this.attributes=new Array();
	if(_1){this.setAttribute("swf",_1);}
	if(id){this.setAttribute("id",id);}
	if(w){this.setAttribute("width",w);}
	if(h){this.setAttribute("height",h);}
	if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
	this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion(this.getAttribute("version"),_7);
	if(c) {this.addParam("bgcolor",c);}
	var q=_8?_8:"high";
	this.addParam("quality",q);
	this.setAttribute("useExpressInstall",_7);
	this.setAttribute("doExpressInstall",false);
	var _d=(_9)?_9:window.location;
	this.setAttribute("xiRedirectUrl",_d);
	this.setAttribute("redirectUrl","");
	if(_a) {this.setAttribute("redirectUrl",_a);}
};
deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
	this.attributes[_e]=_f;
	},
	getAttribute: function(_10){
		return this.attributes[_10];
	},
	addParam: function(_11,_12){
		this.params[_11]=_12;
	},
	getParams: function(){
		return this.params;
	},
	addVariable: function(_13,_14) {
		this.variables[_13]=_14;
	},
	getVariable: function(_15) {
		return this.variables[_15];
	},
	getVariables: function(){
		return this.variables;
	},
	getVariablePairs: function(){
		var _16=new Array();
		var key;
	var _18=this.getVariables();
for(key in _18){
_16.push(key+"="+_18[key]);}
return _16;
},
getSWFHTML:function(){
	var _19="";
	if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
		if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");}
		_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
		_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
		var _1a=this.getParams();
		for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
		var _1c=this.getVariablePairs().join("&");
		if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}
		_19+="/>";
	} else {
	
		if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
		_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
		_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
		var _1d=this.getParams();
		for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
		var _1f=this.getVariablePairs().join("&");
		if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}
		_19+="</object>"
	;}
		return _19;
	},

write:function(_20){
if(this.getAttribute("useExpressInstall")){
	var _21=new deconcept.PlayerVersion([6,0,65]);
	if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
	this.setAttribute("doExpressInstall",true);
	this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
	document.title=document.title.slice(0,47)+" - Flash Player Installation";
	this.addVariable("MMdoctitle",document.title);}}
	if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
	var n=(typeof _20=="string")?document.getElementById(_20):_20;
	n.innerHTML=this.getSWFHTML();
	return true;
}
else{
if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
return false;}};
deconcept.SWFObjectUtil.getPlayerVersion=function(_23,_24){
var _25=new deconcept.PlayerVersion([0,0,0]);
if(navigator.plugins&&navigator.mimeTypes.length){
var x=navigator.plugins["Shockwave Flash"];
if(x&&x.description){_25=new deconcept.PlayerVersion(x.description.replace(/([a-z]|[A-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
}else{try{
var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
for(var i=3;axo!=null;i++){
axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+i);
_25=new deconcept.PlayerVersion([i,0,0]);}}
catch(e){}
if(_23&&_25.major>_23.major){return _25;}
if(!_23||((_23.minor!=0||_23.rev!=0)&&_25.major==_23.major)||_25.major!=6||_24){
try{_25=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}
catch(e){}}}
return _25;};
deconcept.PlayerVersion=function(_29){
this.major=parseInt(_29[0])!=null?parseInt(_29[0]):0;
this.minor=parseInt(_29[1])||0;
this.rev=parseInt(_29[2])||0;};
deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
if(this.major<fv.major){return false;}
if(this.major>fv.major){return true;}
if(this.minor<fv.minor){return false;}
if(this.minor>fv.minor){return true;}
if(this.rev<fv.rev){return false;}return true;};
deconcept.util={getRequestParameter:function(_2b){
var q=document.location.search||document.location.hash;
if(q){
var _2d=q.indexOf(_2b+"=");
var _2e=(q.indexOf("&",_2d)>-1)?q.indexOf("&",_2d):q.length;
if(q.length>1&&_2d>-1){
return q.substring(q.indexOf("=",_2d)+1,_2e);
}}return "";}};
if(Array.prototype.push==null){
Array.prototype.push=function(_2f){
this[this.length]=_2f;
return this.length;};}
var getQueryParamValue=deconcept.util.getRequestParameter;
var FlashObject=deconcept.SWFObject; // for backwards compatibility
var SWFObject=deconcept.SWFObject;
/* 
   add callback functions for tzr folder fields
   -> opening file selection dialog
   -> displaying selected files
   -> display upload progess bar 
   -> managing form's tzr save button
   -> set auto submode
*/
if (typeof(TZR) != 'undefined'){
  TZR.uploads = new Array();
  TZR.uploadsaveform = null;
  TZR.customValid = function(){
    return TZR.isFormOk;
  }
  function checkUpload(){
    if (!TZR.nocheckuploads && TZR.isFormOk)
      TZR.isFormOk = (TZR.uploads.length == 0);
  }
  TZR.swdebug = function(message){
        try{console.log(message);}catch(ie){}
  }
  TZR.autosubform2 = function(fileObj){
    var progress = swfupload_getid(fileObj.dispid+'_'+fileObj.name + "_id");
    var form = null;
    try{form = progress.form;}catch(e){}
    if (form == null){
      return;
    }
    var mess = document.getElementById('autosaveconfirmmessage').innerHTML;
    if (TZR.uploadsaveform == null && TZR.uploads.length == 1 && confirm(mess)){
      TZR.nocheckuploads = true;
      if (TZR.isFormValidWithFocus(form, true)){
	TZR.uploadsaveform = form;
      }
      TZR.nocheckuploads = false;
    }
  }
  TZR.addOnSubmit('checkUpload()');
}
function swfupload_getid(id) {
	this.obj = document.getElementById(id);
	return this.obj;
}
swfupload_getid.prototype.ih = function() {}
uploadStart = function(fileObj) {
  if (typeof('TZR') != 'undefined'){
  swfupload_getid(fileObj.dispid).style.display = "block";
  TZR.uploads.push('foo');
  }
  var div = document.createElement("div");
  div.style.margin='2px';
  var field = document.createElement("input");
  field.setAttribute('id', fileObj.dispid+'_'+fileObj.name+'_id');
  field.setAttribute('readonly', 'readonly');
  field.setAttribute('type', 'text');
  field.setAttribute('name', '_rename[' + fileObj.name + ']');
  field.setAttribute('value', fileObj.name);
  field.setAttribute('size', 30);
  var s = document.createElement('span');
  s.setAttribute('id', fileObj.dispid+'_'+fileObj.name+'_id_size');
  s.style.fontWeight='bold';
  s.style.paddingLeft='5px';
  div.appendChild(field);
  div.appendChild(s);
  swfupload_getid(fileObj.dispid).appendChild(div);
  if (typeof('TZR') != 'undefined'){
    TZR.autosubform2(fileObj);
  }
}
uploadProgress = function(fileObj, bytesLoaded) {
  var progress = swfupload_getid(fileObj.dispid+'_'+fileObj.name + "_id");
  var percent = Math.ceil((bytesLoaded / fileObj.size) * 100)
  progress.style.background = "url(/tzr/templates/swfupload/progressbar.png) no-repeat -" + (100 - percent) + "px 0";
}
uploadComplete = function(fileObj) {
  var progress = swfupload_getid(fileObj.dispid+'_'+fileObj.name + "_id");
  progress.style.background = "";
  progress.style.backgroundColor = "#dc931a";
  var size = swfupload_getid(fileObj.dispid+'_'+fileObj.name+'_id_size');
  size.innerHTML=fileObj.size<1000?fileObj.size+' o':Math.round(fileObj.size/1000)+' Ko';
  if (typeof('TZR') != 'undefined'){
    var foo = TZR.uploads.shift();
    if (TZR.uploads.length == 0 && TZR.uploadsaveform != null){
      if (TZR.isFormValidWithFocus(TZR.uploadsaveform, true)){
	TZR.uploadsaveform.submit();
      }
    }
  }
}
uploadQueueComplete = function(fileObj) {
  /* intervien sur multi quand tous on ne doit rien faire */
}
uploadCancel = function() {
  /* intervient quand on ferme la fen avec annuler : start n'a pas eu lieu */
  swfupload_getid("SWFUpload").ih();
}
/* to restore html upload mode : clear uploaded files array */
uploadswapmode = function(fieldname){
  TZR.uploads = new Array(); 
  var std = document.getElementById(fieldname+'stdupload');
  var mf =  document.getElementById(fieldname+'mfupload');
  if (std.style.display == 'none'){
    document.getElementById(fieldname+'swaplink').style.display='none';
    document.forms.editform.elements[fieldname+'_STDMODE'].value='stdmode';
    std.style.display = 'block';
    mf.style.display = 'none';
  }
}


<!--function correctPNG() // correctly handle PNG transparency in Win IE 5.5 or higher.   {   for(var i=0; i<document.images.length; i++)      {   var img = document.images[i]   var imgName = img.src.toUpperCase()   if (imgName.substring(imgName.length-3, imgName.length) == "PNG" )      {   var imgID = (img.id) ? "id='" + img.id + "' " : ""   var imgClass = (img.className) ? "class='" + img.className + "' " : ""   var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "   var imgStyle = "display:inline-block;" + img.style.cssText     if (img.align == "left" ) imgStyle = "float:left;" + imgStyle   if (img.align == "right" ) imgStyle = "float:right;" + imgStyle   if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle     var strNewHTML = "<span " + imgID + imgClass + imgTitle   + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"      + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"   + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"     img.outerHTML = strNewHTML   i = i-1      }      }   }/** navigation*//* N'existe plus depuis repassage en Milonic. A supprimer?sfHover = function() {	var sfEls = document.getElementById("tzr-menu").getElementsByTagName("LI");	for (var i=0; i<sfEls.length; i++) {		sfEls[i].onmouseover=function() {			this.className+=" sfhover";		}		sfEls[i].onmouseout=function() {			this.className=this.className.replace(new RegExp(" sfhover\\b"), "");		}	}}if (window.attachEvent) window.attachEvent("onload", sfHover);*///-->
/*

Milonic DHTML Menu - JavaScript Website Navigation System.
Version 5.728 - Built: Thursday July 7 2005 - 14:34
Copyright 2005 (c) Milonic Solutions Limited. All Rights Reserved.
This is a commercial software product, please visit http://www.milonic.com/ for more information.
See http://www.milonic.com/license.php for Commercial License Agreement
All Copyright statements must always remain in place in all files at all times
*******  PLEASE NOTE: THIS IS NOT FREE SOFTWARE, IT MUST BE LICENSED FOR ALL USE  ******* 

License Details:
 Number: 194900
    URL: Unlicensed
   Type: Reseller
  Dated: Saturday August 21 2004

*/


function $P($){clearTimeout($);return _n}$a=$;$7=0;$8=0;function _DC(){$b()}function _5($){return eval($)}function $c($v){if((ns6&&!ns60)&&_M[14]=="fixed"){_pp=$D($v);$E($v,_pp[0]-_sT,_pp[1]-_sL)}}_X=_n;_Y=_n;function gMY(e){showtip(tTipt);$a=$;if(ns6){_X=e.pageX;_Y=e.pageY;$a=e.target.id}else{e=event;_X=e.clientX;_Y=e.clientY}if(!op&&_d.all&&_dB){_X+=_dB.scrollLeft;_Y+=_dB.scrollTop;if(IEDtD&&!mac){_Y+=_sT;_X+=_sL;}}if(inDragMode){_gm=$F($O+DragLayer);$E(_gm,_Y-DragY,_X-DragX);if(ie55){_gm=$F("iFM"+$mD);if(!_gm)_gm==$F("iF"+$mD);if(_gm){$E(_gm,_Y-DragY,_X-DragX)}}return _f}mmMouseMove()}if(!_W.disableMouseMove)_d.onmousemove=gMY;_dC=_DC;if(_d.onclick)_dC=_dC+_d.onclick;_d.onclick=_DC;_toL=_n;_TbS="<table class=milonictable border=0 cellpadding=0 cellspacing=0 style='padding:0px' ";function $F($v){if(_d.getElementById)return _d.getElementById($v);if(_d.all)return _d.all[$v]}function $E(_gm,_t,_l,_h,_w){_px="px";_gs=_gm.style;if(op){_px=$;if(_w!=_n)_gs.pixelWidth=_w;if(_h!=_n)_gs.pixelHeight=_h}else{if(_w!=_n)_gs.width=_w+_px;if(_h!=_n)_gs.height=_h+_px;}if(!isNaN(_t)&&_t!=_n)_gs.top=_t+_px;if(!isNaN(_l)&&_l!=_n)_gs.left=_l+_px}$_=6;function $D(_gm){if(!_gm)return;_h=_gm.offsetHeight;_w=_gm.offsetWidth;if(op5){_h=_gm.style.pixelHeight;_w=_gm.style.pixelWidth}_tgm=_gm;_t=0;while(_tgm!=_n){_t+=_tgm.offsetTop;_tgm=_tgm.offsetParent}_tgm=_gm;_l=0;while(_tgm!=_n){_l+=_tgm.offsetLeft;_tgm=_tgm.offsetParent}if(sfri){_l-=$8;_t-=$7}if(mac&&_dB){_mcdb=_dB.currentStyle;_mcf=_mcdb.marginTop;if(_mcf)_t=_t+$pU(_mcf);_mcf=_mcdb.marginLeft;if(_mcf)_l=_l+$pU(_mcf)}_gpa=new Array(_t,_l,_h,_w);return(_gpa)}C$=1;$4="return _f";if(ie55)$4="try{if(ap.filters){return 1}}catch(e){}";_d.write("<"+"script>function $9(ap){"+$4+"}<"+"/script>");function $2(_gm,$m){if($9(_gm)){_gs=_gm.style;_flt=(_gs.visibility==$6)?_m[$m][16]:_m[$m][15];if(_flt){if(_gm.filters[0])_gm.filters[0].stop();iedf=$;iedf="FILTER:";_flt=_flt.split(";");for(_x=0;_x<_flt.length;_x++){iedf+=" progid:DXImageTransform.Microsoft."+_flt[_x];if($tU(_nv).indexOf("MSIE 5.5")>0)_x=_aN;}_gs.filter=iedf;_gm.filters[0].apply();}}}function $3(_gm,$m){if($9(_gm)){_flt=(_gm.style.visibility==$6)?_m[$m][15]:_m[$m][16];if(_flt){_gm.filters[0].play()}}}function $Y(_mD,_show){_gmD=$F($O+_mD);if(!_gmD)return;_gDs=_gmD.style;_m[_mD][22]=_gmD;if(_show){M_hideLayer(_mD,_show);if(_mLk!=Math.ceil(_mLt*_mLf.length))_mi=_nA();if((_m[_mD][7]==0&&_ofMT==1))return;if(_gDs.visibility!=$6){$2(_gmD,_mD);if(!_m[_mD][27])_gDs.zIndex=_zi;else _gDs.zIndex=_m[_mD][27];_gDs.visibility=$6;$3(_gmD,_mD);$V(_mD,1);mmVisFunction(_mD,_show);if(!_m[_mD][7])_m[_mD][21]=_itemRef;$mD++}}else{if(_m[_mD][21]>-1&&_itemRef!=_m[_mD][21])d$(_m[_mD][21]);if(_gDs.visibility==$6){if(!(ie||op7)&&_m[_mD][13]=="scroll")_gDs.overflow=$5;hmL(_mD);$V(_mD,0);mmVisFunction(_mD,_show);$2(_gmD,_mD);_gDs.visibility=$5;if(ns6||mac){_gDs.top="-999px";_gDs.left="-999px"}$3(_gmD,_mD);$mD--}_m[_mD][21]=-1}}function $Z(){_Mtip=$P(_Mtip);_W.status=$;if(_oldel>-1)d$(_oldel,1);_oldel=-1;for(_a=0;_a<_m.length;_a++){if(_m[_a]&&!_m[_a][7]&&(!_m[_a][10])){$Y(_a,0);M_hideLayer(_a,0)}else{hmL(_a)}}$mD=0;_zi=_WzI;_itemRef=-1;_sm=new Array;$j=-1;if(_W.resetAutoOpen)_ocURL()}function $d($v){if($v+$$==$u)return-1;return _mi[$v][0]}function lChk(){alert(_5($qe("5F6D4C6B2B5F6C4E2B5F6D4C662B5F6C4E2B5F6D4C62")))}function $e($v){_tm=$d($v);if(_tm==-1)return-1;for(_x=0;_x<_mi.length;_x++);if(_mi[_x]&&_mi[_x][3]==_m[_tm][1])return _mi[_x][0]}_mLt=19490.;function $f($v){_tm=$d($v);if(_tm==-1)return-1;for(_x=0;_x<_mi.length;_x++)if(_mi[_x][3]==_m[_tm][1])return _x}function $h($v){$v=$tL($v);for(_x=0;_x<_m.length;_x++)if(_m[_x]&&$v==_m[_x][1])return _x}_mot=0;function e$(){$g=arguments;_i=$g[0];_I=_mi[_i];$G=$F("mmlink"+_I[0]);hrs=$G.style;_lnk=$F("lnk"+_i);if((_I[34]=="header"&&!_I[2])||_I[34]=="form"){$L(_i);hrs.visibility=$5;return}_mot=$P(_mot);_gmi=$F("el"+_i);if(_gmi.e$==1){$E($G,_gmi.t,_gmi.l,_gmi.h,_gmi.w);hrs.visibility=$6;return}_gmi.e$=1;$y=_m[_I[0]];if(!$y[9]&&mac)$A=$D($F("pTR"+_i));else $A=$D(_gmi);_pm=$F($O+_I[0]);_pp=$D(_pm);if(_pm.style.visibility!=$6)_pm.style.visibility=$6;if($G){$G._itemRef=_i;$G.href=_jv;if(sfri)$G.href=_n;if(_I[2])$G.href=_I[2];if(_I[34]=="disabled")$G.href=_jv;hrs.visibility=$6;if(_I[76])$G.title=_I[76];else $G.title=$;if(!_I[57])$G.target=(_I[35]?_I[35]:$);hrs.zIndex=1;if(_I[34]=="html"){hrs.zIndex=-1;hrs=_gmi.style}if((_I[86]||_I[34]=="dragable")&&inDragMode==0){if(_lnk)_lnk.href=_jv;drag_drop(_I[0]);if(ns6||ns7){hrs.zIndex=-1}}if(_I[34]=="tree")_gmi.pt=_n;if(_gmi.pt!=_pp[0]||_gmi.pl!=_pp[1]||_gmi.ph!=_pp[2]||_gmi.pw!=_pp[3]){_bwC=0;if(!$G.border&&$G.border!=_I[25]){hrs.border=_I[25];$G.border=_I[25];$G.C=$pU(hrs.borderTopWidth)*2}if($G.C)_bwC=$G.C;_tlcor=0;if(mac)if(_m[_I[0]][12])_tlcor=_m[_I[0]][12];if(konq||sfri)_tlcor-=_m[_I[0]][6][65];_gmi.t=$A[0]-_pp[0]+_tlcor;_gmi.l=$A[1]-_pp[1]+_tlcor;if(_m[_I[0]][14]=="relative"){_rcor=0;if(!mac&&ie)_rcor=_m[_I[0]][6][65];if($y[2]!="CSS")_gmi.t=$A[0]+_rcor;if($y[3]!="CSS")_gmi.l=$A[1]+_rcor;if(sfri){_gmi.t=$A[0]+$7;_gmi.l=$A[1]+$8}}if(!IEDtD&&(ie||op7))_bwC=0;_gmi.h=$A[2]-_bwC;_gmi.w=$A[3]-_bwC;_gmi.pt=_pp[0];_gmi.pl=_pp[1];_gmi.ph=_pp[2];_gmi.pw=_pp[3]}$E($G,_gmi.t,_gmi.l,_gmi.h,_gmi.w)}if(_m[_I[0]].Ti==_i)return;_Cr=(ns6)?_n:$;hrs.cursor=_Cr;if(_I[59]){if(_I[59]=="hand"&&ns6)_I[59]="pointer";hrs.cursor=_I[59]}if(_I[32]&&_I[29])$F("img"+_i).src=_I[32];if(_I[3]&&_I[3]!="M_doc*"&&_I[24]&&_I[48])$F("simg"+_i).src=_I[48];if(_lnk){_lnk.oC=_lnk.style.color;if(_I[6])_lnk.style.color=_I[6];if(_I[26])_lnk.style.textDecoration=_I[26]}if(_I[53]){_gmi.className=_I[53];if(_lnk)_lnk.className=_I[53]}if(_I[5])_gmi.style.background=_I[5];if(_I[47])_gmi.style.backgroundImage="url("+_I[47]+")";if(_I[71]&&_I[90])$F("sep"+_i).style.backgroundImage="url("+_I[90]+")";if(!mac){if(_I[44])_lnk.style.fontWeight="bold";if(_I[45])_lnk.style.fontStyle="italic"}if(_I[42]&&$g[1])_5(_I[42])}_mLk=_5($qe("6C4E756D"));function d$(){$g=arguments;_i=$g[0];if(_i==-1)return;_gmi=$F("el"+_i);if(!_gmi)return;if(_gmi.e$==0)return;_gmi.e$=0;_gs=_gmi.style;_I=_mi[_i];_tI=$F("img"+_i);if(_tI&&_I[29])_tI.src=_I[29];if(_I[3]&&_I[24]&&_I[48])$F("simg"+_i).src=_I[24];_lnk=$F("lnk"+_i);if(_lnk){if(_startM||op)_lnk.oC=_I[8];if(_I[34]!="header")_lnk.style.color=_lnk.oC;if(_I[26])_lnk.style.textDecoration="none";if(_I[33])_lnk.style.textDecoration=_I[33]}if(_I[54]){_gmi.className=_I[54];if(_lnk)_lnk.className=_I[54]}if(_I[7])_gs.background=_I[7];if(_I[46])_gs.backgroundImage="url("+_I[46]+")";if(_I[71]){s_I=$F("sep"+_i);if(s_I)s_I.style.backgroundImage="url("+_I[71]+")"}if(!mac){if(_I[44]&&(_I[14]=="normal"||!_I[14]))_lnk.style.fontWeight="normal";if(_I[45]&&(_I[13]=="normal"||!_I[13]))_lnk.style.fontStyle="normal"}if(!_startM&&_I[43]&&$g[1])_5(_I[43])}function $C($v){for(_a=0;_a<$v.length;_a++)if($v[_a]!=$m)if(!_m[$v[_a]][7])$Y($v[_a],0)}function f$(){_st=-1;_en=_sm.length;_mm=_iP;if(_iP==-1){if(_sm[0]!=$j)return _sm;_mm=$j}for(_b=0;_b<_sm.length;_b++){if(_sm[_b]==_mm)_st=_b+1;if(_sm[_b]==$m)_en=_b}if(_st>-1&&_en>-1){_tsm=_sm.slice(_st,_en)}return _tsm}function _cm3(){_tar=f$();$C(_tar);for(_b=0;_b<_tar.length;_b++){if(_tar[_b]!=$m)_sm=remove(_sm,_tar[_b])}}function $r(){_dB=_d.body;if(!_dB)return;$7=_dB.offsetTop;$8=_dB.offsetLeft;if(!op&&(_d.all||ns72)){_mc=_dB;if(IEDtD&&!mac&&!op7)_mc=_d.documentElement;if(!_mc)return;_bH=_mc.clientHeight;_bW=_mc.clientWidth;_sT=_mc.scrollTop;_sL=_mc.scrollLeft;if(konq)_bH=_W.innerHeight}else{_bH=_W.innerHeight;_bW=_W.innerWidth;if(ns6&&_d.documentElement.offsetWidth!=_bW)_bW=_bW-16;_sT=self.scrollY;_sL=self.scrollX;if(op){_sT=_dB.scrollTop;_sL=_dB.scrollleft}}}_mLf=_5($qe("6C55524C"));function $H(_i){var _I=_mi[_i];if(_I[3]){_oldMC=_I[39];_I[39]=0;_oldMD=_menuOpenDelay;_menuOpenDelay=0;_gm=$F($O+$h(_I[3]));_ofMT=1;if(_gm.style.visibility==$6&&_I[40]){$Y($h(_I[3]),0);e$(_i)}else{h$(_i)}_menuOpenDelay=_oldMD;_I[39]=_oldMC}else{if(_I[2]&&_I[39])_5(_I[2])}}function $x($v){$vv=0;if($v)$vv=$v;if(isNaN($v)&&$v.indexOf("offset=")==0)$vv=$pU($v.substr(7,99));return $vv}function popup(){_itemRef=-1;var $g=arguments;_MT=$P(_MT);_oMT=$P(_oMT);if($g[0]){if($g[0]!="M_toolTips")$Z();$m=$h($g[0]);_M=_m[$m];if(!_M)return;if(!_M[23]&&!_startM){_M[23]=1;g$($m)}_tos=0;if($g[2])_tos=$g[2];_los=0;if($g[3])_los=$g[3];_gm=$F($O+$m);if(_M[2]||_M[3]){_tP=_n;_lT=_n;if(!isNaN(_M[2]))_tP=_M[2];if(!isNaN(_M[3]))_lT=_M[3];$E(_gm,_tP,_lT)}_sm[_sm.length]=$m;$pS=0;if(!_startM&&_M[13]=="scroll")$pS=1;if($g[1]){if(!_gm)return;_gp=$D(_gm);if($g[1]==1){if(_M[2])if(isNaN(_M[2]))_tos=$x(_M[2]);else{_tos=_M[2];_Y=0}if(_M[3])if(isNaN(_M[3]))_los=$x(_M[3]);else{_los=_M[3];_X=0}if(!_M[25]){if(_Y+_gp[2]+16>(_bH+_sT))_tos=_bH-_gp[2]-_Y+_sT-16;if(_X+_gp[3]>(_bW+_sL))_los=_bW-_gp[3]-_X+_sL-6}$E(_gm,_Y+_tos,_X+_los)}else{_po=$F($g[1]);_pp=$D(_po);if(!_M[25]){if(!$pS)if(_pp[0]+_gp[2]+16>(_bH+_sT))_tos=_bH-_gp[2]-_pp[0]+_sT-16;if(_pp[1]+_gp[3]>_bW+_sL)_los=_bW-_gp[3]-_pp[1]+_sL-2}_ttop=(_pp[0]+_pp[2]+$x(_M[2])+_tos);$E(_gm,_ttop,(_pp[1]+$x(_M[3])+_los));if($g[4])_M.ttop=_ttop}$c(_gm)}_oldbH=-1;_zi=_zi+100;_oMT=$P(_oMT);_moD=($g[5])?$g[5]:0;_oMT=_StO("$Y("+$m+",1)",_moD);$z($m);if($pS)$1($m);_M[21]=-1}}function popdown(){tTipt=$;_MT=_StO("$Z()",_menuCloseDelay);_oMT=$P(_oMT)}function g$($m){if(op5||op6)return;_gm=$F($O+$m);if(!_m[$m][23])$E(_gm,-999,-999);_it=o$($m,0);_mcnt--;_gm.innerHTML=_it;$z($m)}$j=-1;_mLb=_5($qe("6C566572"));function h$(_i){tTipt=$;if(_itemRef>-1&&_itemRef!=_i)hmL(_mi[_itemRef][0]);_itemRef=_i;_I=_mi[_i];if(!_I[65])_I[65]=0;_I[3]=$tL(_I[3]);_mopen=_I[3];$m=$h(_mopen);var _M=_m[$m];if(_I[34]=="ToolTip")return;if(!_I||_startM||inDragMode)return;$y=_m[_I[0]];_MT=$P(_MT);if(_m[_I[0]][7]&&$j!=_I[0]){hmL($j);$C(_sm);_oMT=$P(_oMT);_sm=_nA();if(!_W.resetAutoOpen)_DC()}if(_mopen){if(_M&&!_M[23]){if(!_startM)_M[23]=1;g$($m)}}if(_oldel>-1){_gm=0;if(_I[3]){_gm=$F($O+$h(_I[3]));if(_gm&&_gm.style.visibility==$6&&_i==_oldel){e$(_i,1);return}}if(_oldel!=_i)k$(_oldel);_oMT=$P(_oMT)}_cMT=$P(_cMT);$m=-1;_itemRef=_i;_moD=_menuOpenDelay;$Q=0;if($y[9]){$Q=1;if(!_W.horizontalMenuDelay)_moD=0}e$(_i,1);if(!_sm.length){_sm[0]=_I[0];$j=_I[0]}_iP=$d(_i);if(_iP==-1)$j=_I[0];_cMT=_StO("_cm3()",_moD);if(_I[39]){if(_mopen){_gm=$F($O+$m);if(_gm&&_gm.style.visibility==$6){_cMT=$P(_cMT);_tsm=_sm[_sm.length-1];if(_tsm!=$m)$Y(_tsm,0)}}}if(_W.forgetClickValue)$R=0;if(_mopen&&(!_I[39]||$R)&&_I[34]!="tree"&&_I[34]!="disabled"){$r();_pm=$F($O+_I[0]);_pp=$D(_pm);$m=$h(_mopen);if(_I[41])_M[10]=1;if($y.kAm!=_n&&$y.kAm+$$!=$u){_m[$y.kAm][7]=0;_sm[_sm.length]=$y.kAm}$y.kAm=_n;if(_M&&_M[10]){$y.kAm=$m;_m[$y.kAm][7]=1}$z($m);if($m>-1){if(_oldel>-1&&(_mi[_oldel][0]+_I[0]))$Y($m,0);_oMT=_StO("$Y("+$m+",1)",_moD);_mnO=$F($O+$m);_mp=$D(_mnO);_gmi=$F("el"+_i);if(!$Q&&mac)_gmi=$F("pTR"+_i);_gp=$D(_gmi);if($Q){$l=_gp[1];$k=_pp[0]+_pp[2]-_I[65]}else{$l=_pp[1]+_pp[3]-_I[65];$k=_gp[0]}if(sfri){if($y[14]=="relative"){$l=$l+$8;$k=$k+$7}}if(!$Q&&$y[13]=="scroll"&&!op){$k=(ns6&&!ns7)?$k-gevent:$k-_pm.scrollTop}if(!_M[25]){if(!$Q&&(!_M[2]||isNaN(_M[2]))){_hp=$k+_mp[2];if(_hp>_bH+_sT){$k=(_bH-_mp[2])+_sT-4}}if($l+_mp[3]+3>_bW+_sL){if(!$Q&&(_pp[1]-_mp[3])>0){$l=_pp[1]-_mp[3]-_subOffsetLeft+$y[6][65]}else{$l=(_bW-_mp[3])-8+_sL}}}if($Q){if(_M[11]=="rtl"||_M[11]=="uprtl")$l=$l-_mp[3]+_gp[3]+$y[6][65];if(_M[11]=="up"||_M[11]=="uprtl"||($y[5]&&$y[5].indexOf("bottom")!=-1)){$k=_pp[0]-_mp[2]-1}}else{if(_M[11]=="rtl"||_M[11]=="uprtl")$l=_pp[1]-_mp[3]-(_subOffsetLeft*2);if(_M[11]=="up"||_M[11]=="uprtl"){$k=_gp[0]-_mp[2]+_gp[2]}$k+=_subOffsetTop;$l+=_subOffsetLeft}if(_M[2]!=_n){if(isNaN(_M[2])&&_M[2].indexOf("offset=")==0){$k=$k+$x(_M[2])}else{$k=_M[2]}}if(_M[3]!=_n){if(isNaN(_M[3])&&_M[3].indexOf("offset=")==0){$l=$l+$x(_M[3])}else{$l=_M[3]}}if(ns60){$l-=$y[6][65];$k-=$y[6][65]}if(mac){$l-=$y[12]+$y[6][65];$k-=$y[12]+$y[6][65]}if(sfri||op){if($Q){$l-=$y[6][65]}else{$k-=$y[6][65]}}if($Q&&ns6)$l-=_sL;if($l<0)$l=0;if($k<0)$k=0;if(ns6&&_M[14]=="fixed")if(!_m[$e(_i)])$k-=_sT;$E(_mnO,$k,$l);if(_M[5])p$($m);if(!_startM&&_M[13]=="scroll")$1($m);_zi++;if(_sm[_sm.length-1]!=$m)_sm[_sm.length]=$m}}i$(_iP);_oldel=_i;if(_ofMT==0)_oMT=$P(_oMT);_ofMT=0}_sBarW=0;function $1($m){if(op)return;_M=_m[$m];if(_M.ttop){_o4s=_M[2];_M[2]=_M.ttop}if(_M[2])$Q=1;_gm=$F($O+$m);if(!_gm||_M[9])return;_mp=$D(_gm);_gmt=$F("tbl"+$m);_gt=$D(_gmt);_MS=_M[6];_Bw=_MS[65]*2;_Mw=_M[12]*2;_cor=(_MS[65]*2+_M[12]*2);_smt=_gt[2];if($Q)_smt=_gt[2]+_gt[0]-_sT;if(_smt<_bH-16){_gm.style.overflow=$;$k=_n;if(!$Q&&(_gt[0]+_gt[2]+16)>(_bH+_sT)){$k=(_bH-_gt[2])+_sT-16}if(!_M[24])$E(_gm,$k);$z($m);if(!_M[24]){if(_M.ttop)_M[2]=_o4s;return}}_gm.style.overflow="auto";_sbw=_gt[3];$E(_gm,_n,_n,40,40);$BW=_gm.offsetWidth-_gm.clientWidth;if(mac)$BW=18;if(IEDtD){_sbw+=$BW-_Bw}else{if(ie)_sbw+=$BW+_Mw;else _sbw+=$BW-_Bw;if(ns6&&!ns7)_sbw=_gt[3]+15;}$k=_n;if($Q){_ht=_bH-_gt[0]-16+_sT}else{_ht=_bH-14;$k=6+_sT}$l=_n;if(!_M[25]&&_mp[1]+_sbw>(_bW+_sL))$l=(_bW-_sbw)-2;if(_M[2]&&!isNaN(_M[2])){$k=_M[2];_ht=(_bH+_sT)-$k-6;if(_ht>_gt[2])_ht=_gt[2]}if(_M[24])_ht=_M[24];if(ns7)_ht=_ht-_Bw-10;if(op7)_sbw+=_cor;if(_ht>0){if(_M[24])$k=_n;$E(_gm,$k,$l,_ht+2-_M[12],_sbw);if(_M[24]&&!_M[25]){_mp=$D(_gm);if(_mp[0]+_mp[2]-_sT>_bH){$k=_mp[0]-_mp[2]}$E(_gm,$k)}$c(_gm)}if(_M.ttop)_M[2]=_o4s}function i$(_mpi){if(_mpi>-1){_ci=_m[_mpi][21];while(_ci>-1){if(_mi[_ci][34]!="tree")e$(_ci);_ci=_m[_mi[_ci][0]][21]}}}function $I(){_mot=_StO('k$(this._itemRef)',50);_MT=_StO("$b()",_menuCloseDelay);_ofMT=1}function $b(){$a=$a.substr(0,4);if((_ps>20040600&&_ps<20041100)&&$a=="mmli"||$a==$O)return;if(_ofMT==1){$Z();$R=0}}function $J(){_mot=$P(_mot);_MT=$P(_MT);_ofMT=0}function $w(_i){if(_i[18])_i[8]=_i[18];if(_i[19])_i[7]=_i[19];if(_i[56])_i[29]=_i[56];if(_i[69])_i[46]=_i[69];if(_i[85]&&_i[3])_i[24]=_i[85];if(_i[72])_i[54]=_i[72];if(_i[75])_i[9]=_i[75];if(_i[92])_i[71]=_i[92];_i.cpage=1}_hrF=_L.pathname+_L.search;_hx=_Lhr.split("/");_fNm="/"+_hx[_hx.length-1];function $q(){_I=_mi[_el];_This1=0;if(_I[77])if(_hrF.indexOf(_I[77])>-1)_This1=1;if(_I[2]){_url=_I[2];if(_hrF==_url||_hrF==_url+"/"||_url==_Lhr||_url+"/"==_Lhr||_fNm=="/"+_url)_This1=1}if(_This1==1){$w(_I);_cip[_cip.length]=_el}}function j$(_i){}function _cA(_N,_O,_i){_I=_mi[_i];if(_I[_N]){_tmp=_I[_N];_I[_N]=_I[_O];_I[_O]=_tmp}else return;if(_N==81&&_I[7]){$F("el"+_i).style.background=_I[7]}if(_N==80&&_I[8]){$F("lnk"+_i).oC=_I[8];$F("lnk"+_i).style.color=_I[8]}if(_N==87&&_I[54]){$F("el"+_i).className=_I[54];if(_lnk)_lnk.className=_I[54]}if(_N==88&&_I[46]){$F("el"+_i).style.backgroundImage="url("+_I[88]+")";d$(_i)}if(_N==91&&_I[71]){$F("sep"+_i).style.backgroundImage="url("+_I[91]+")"}_gm=$F("simg"+_i);if(_gm&&_N==83&&_I[24]&&_I[3])_gm.src=_I[24];_gm=$F("img"+_i);if(_gm&&_N==82&&_I[29])_gm.src=_I[29]}function _caA(_i){_cA(80,8,_i);_cA(81,7,_i);_cA(82,29,_i);_cA(83,24,_i);_cA(87,54,_i);_cA(88,46,_i);_cA(91,71,_i)}function $K(_i){_I=_mi[_i];_M=_m[_I[0]];_caA(_i);if(_M[11]=="tab"){if((_M.Ti||_M.Ti==0)&&_M.Ti!=_i)$K(_M.Ti);_M.Ti=_i}_oTree();if(_I[62])_5(_I[62]);mmClick();if(_I[57]){_w=open(_I[2],_I[35],_I[57]);_w.focus();return _f}if(_I[2]){if(_I[34]=="html")_Lhr=_I[2];if(_W.closeAllOnClick)$Z();return _t}$R=0;if(_I[39]){$R=1;$H(_i)}return _f}function $t(_I,_gli,_M){if(!_I[1])return $;_Ltxt=_I[1];_TiH=((_I[34]=="header"||_I[34]=="form"||_I[34]=="dragable"||_I[86])?1:0);_ofc=(_I[8]?"color:"+_I[8]:$);if(!_TiH&&_I[58]&&!_I.cpage)_ofc=$;_fsize=(_I[12]?";font-Size:"+_I[12]:$);_fstyle=(_I[13]?";font-Style:"+_I[13]:";font-Style:normal");_fweight=(_I[14]?";font-Weight:"+_I[14]:";font-Weight:normal");_ffam=(_I[15]?";font-Family:"+_I[15]:$);_tdec=(_I[33]?";text-Decoration:"+_I[33]:";text-Decoration:none;");_disb=(_I[34]=="disabled"?"disabled":$);_clss=$$;if(_I[54]){_clss=" class='"+_I[54]+"' ";if(!_I[33])_tdec=$$;if(!_I[13])_fstyle=$$;if(!_I[14])_fweight=$$}else if(_I[58]){_clss=" class='"+_m[_mi[_gli][0]][6].linkclass+"' "}_tpee=$$;_tpe="a";if(_TiH||!_I[2])_tpe="div";if(_tpe!="a")_tpee=" onclick=$K("+_gli+") ";_rawC=(_I[78]?_I[78]:$);$B=$;if(_M[8])$B+=";text-align:"+_M[8];else if(_I[36])$B+=";text-align:"+_I[36];_link="<"+_tpe+_tpee+" name=mM1 onfocus='_iF0C("+_gli+")'  href='"+_I[2]+"' "+_disb+_clss+" id=lnk"+_gli+" style='border:none;"+$B+";background:transparent;display:block;"+_ofc+_ffam+_fweight+_fstyle+_fsize+_tdec+_rawC+"'>"+_Ltxt+"</"+_tpe+">";return _link}function hmL(_mn){_hm=$F("mmlink"+_mn);if(_hm)_hm.style.visibility=$5}function k$(_i){_oMT=$P(_oMT);tTipt=$;if(_i>-1)hmL(_mi[_i][0]);d$(_i,1)}function _iniIF($m){_M=_m[$m];_M._iFT=$P(_M._iFT);_M._iFT=_StO("l$("+$m+")",150);}function l$($m){if(_m[$m][13]!="scroll"){$z($m);p$($m)}}function m$(_i,_Tel){_it=$;_el=_Tel;_I=_mi[_el];$m=_I[0];var _M=_m[$m];$q();if(_I[34]=="header"){if(_I[20])_I[8]=_I[20];if(_I[21])_I[7]=_I[21];if(_I[74])_I[9]=_I[74]}_ofb=(_I[46]?"background-image:url("+_I[46]+");":$);if(!_ofb)_ofb=(_I[7]?"background:"+_I[7]+";":$);$n=" onmouseover=h$("+_Tel+") ";_link=$t(_I,_el,_M);$o="height:100%;";if(_M[18])$o="height:"+$pX(_M[18]);if(_I[28])$o="height:"+$pX(_I[28]);_clss=$;if(_I[54])_clss=" class='"+_I[54]+"' ";if($Q){if(_i==0)_it+="<tr>";if(_I[50])_I[27]=_I[50]}else{if(_I[49])_I[27]=_I[49];if(_M[26]){if(_i==0||(_M[26]==_rwC)){_it+="<tr id=pTR"+_el+">";_rwC=0}_rwC++}else{_it+="<tr id=pTR"+_el+">"}}_subC=0;if(_I[3]&&_I[24])_subC=1;_timg=$;_bimg=$;if(_I[34]=="tree"){if(_I[3]){_M[8]="top";_I[30]=" top"}else{if(_I[79]){_subC=1;_I[24]=_I[79];_I[3]="M_doc*"}}}if(_I[29]){_imalgn=$;if(_I[31])_imalgn=" align="+_I[31];_imvalgn=$;if(_I[30])_imvalgn=" valign="+_I[30];_imcspan=$;if(_subC&&_imalgn&&_I[31]!="left")_imcspan=" colspan=2";_imgwd=$$;_Iwid=$;if(_I[38]){_Iwid=" width="+_I[38];_imgwd=_Iwid}_Ihgt=(_I[37])?" height="+_I[37]:$;_impad=(_I[60])?" style='padding:"+$pX(_I[60])+"'":$;_alt=(_I[76])?" alt='"+_I[76]+"'":$;_timg="<td "+_imcspan+_imvalgn+_imalgn+_imgwd+_impad+">"+(_I[84]?"<a href='"+_I[84]+"'>":$)+"<img onload=_iniIF("+$m+") border="+(_I[89]?_I[89]:0)+" style='display:block' "+_Iwid+_Ihgt+_alt+" id=img"+_el+" src='"+_I[29]+"'>"+(_I[84]?'</a>':'')+"</td>";if(_I[30]=="top")_timg+="</tr><tr>";if(_I[30]=="right"){_bimg=_timg;_timg=$}if(_I[30]=="bottom"){_bimg="<tr>"+_timg+"</tr>";_timg=$}}$B=(_I[11]?";padding:"+$pX(_I[11]):$);if(!_I[1])$B=$;_algn=$;if(_M[8])_algn+=" align="+_M[8];if(_I[61])_algn+=" valign="+_I[61];_offbrd=$;if(_I[9])_offbrd="border:"+_I[9]+";";_nw=" nowrap ";_iw=$;if(_I[55])_iw=_I[55];if(_M[4])_iw=_M[4];if(_I[55]!=_M[6].itemwidth)_iw=_I[55];if(_iw){_nw=$;_iw=" width="+_iw}if(_subC||_I[29]){_Limg=$;_Rimg=$;_itrs=$;_itre=$;if(_I[3]&&_I[24]){_subIR=0;if(_M[11]=="rtl"||_M[11]=="uprtl")_subIR=1;_imf=(_M[13]!="scroll")?" onload=_iniIF("+$m+")":$;_img="<img id=simg"+_el+_imf+" src='"+_I[24]+"'>";_simgP=$;if(_I[22])_simgP=";padding:"+$pX(_I[22]);_imps="width=1";if(_I[23]){_iA="width=1";_ivA=$;_imP=_I[23].split($$);for(_ia=0;_ia<_imP.length;_ia++){if(_imP[_ia]=="left")_subIR=1;if(_imP[_ia]=="right")_subIR=0;if(_imP[_ia]=="top"||_imP[_ia]=="bottom"||_imP[_ia]=="middle"){_ivA="valign="+_imP[_ia];if(_imP[_ia]=="bottom")_subIR=0}if(_imP[_ia]=="center"){_itrs="<tr>";_itre="</tr>";_iA="align=center width=100%"}}_imps=_iA+$$+_ivA}_its=_itrs+"<td "+_imps+" style='font-size:1px"+_simgP+"'>";_ite="</td>"+_itre;if(_subIR){_Limg=_its+_img+_ite}else{_Rimg=_its+_img+_ite}}_it+="<td "+_iw+" id=el"+_el+$n+_clss+" style='padding:0px;"+_offbrd+_ofb+$o+";'>";_pw=" width=100% ";if(_I[1]&&_iw)_pw=_iw;if(_W.noSubImageSpacing)_pw=$;_it+=_TbS+_pw+" height=100% id=MTbl"+_el+">";_it+="<tr id=td"+_el+">";_it+=_Limg;_it+=_timg;if(_link){_it+="<td "+_pw+_nw+_algn+" style='"+$B+"'>"+_link+"</td>"}_it+=_bimg;_it+=_Rimg;_it+="</tr>";_it+="</table>";_it+="</td>"}else{_TabI=$;if(_W.includeTabIndex)_TabI=" tabindex="+_el;if(_link)_it+="<td "+_iw+_clss+_nw+_TabI+" id=el"+_el+$n+_algn+" style='"+$B+_offbrd+$o+_ofb+"'>"+_link+"</td>"}if((_M[0][_i]!=_M[0][_M[0].length-1])&&_I[27]>0){_sepadd=$;_brd=$;if(!_I[10])_I[10]=_I[8];_sbg=";background:"+_I[10];if(_I[71])_sbg=";background-image:url("+_I[71]+");";if($Q){if(_I[49]){_sepA="middle";if(_I[52])_sepA=_I[52];_sepadd=$;if(_I[51])_sepadd="style=padding:"+$pX(_I[51]);_it+="<td id=sep"+_el+" nowrap "+_sepadd+" valign="+_sepA+" align=left width=1px><div style='font-size:1px;width:"+$pX(_I[27])+";height:"+$pX(_I[49])+";"+_brd+_sbg+";'></div></td>"}else{if(_I[16]&&_I[17]){_bwid=_I[27]/2;if(_bwid<1)_bwid=1;_brdP=_bwid+"px solid ";_brd+="border-right:"+_brdP+_I[16]+";";_brd+="border-left:"+_brdP+_I[17]+";";if(mac||sfri||(ns6&&!ns7)){_it+="<td style='width:"+$pX(_I[27])+"empty-cells:show;"+_brd+"'></td>"}else{_iT=_TbS+"><td></td></table>";if(ns6||ns7)_iT=$;_it+="<td style='empty-cells:show;"+_brd+"'>"+_iT+"</td>"}}else{if(_I[51])_sepadd="<td nowrap width="+$pX(_I[51])+"></td>";_it+=_sepadd+"<td id=sep"+_el+" style='padding:0px;width:"+$pX(_I[27])+_brd+_sbg+"'>"+_TbS+" width="+$pX(_I[27])+"><td style=padding:0px;></td></table></td>"+_sepadd}}}else{if(_I[16]&&_I[17]){_bwid=_I[27]/2;if(_bwid<1)_bwid=1;_brdP=_bwid+"px solid ";_brd="border-bottom:"+_brdP+_I[16]+";";_brd+="border-top:"+_brdP+_I[17]+";";if(mac||ns6||sfri||konq||IEDtD||op)_I[27]=0}if(_I[51])_sepadd="<tr><td height="+_I[51]+"></td></tr>";_sepW="100%";if(_I[50])_sepW=_I[50];_sepA="center";if(_I[52])_sepA=_I[52];if(!mac)_sbg+=";overflow:hidden";_it+="</tr>"+_sepadd+"<tr><td style=padding:0px; id=sep"+_el+" align="+_sepA+"><div style='"+_sbg+";"+_brd+"width:"+$pX(_sepW)+";padding:0px;height:"+$pX(_I[27])+"font-size:1px;'></div></td></tr>"+_sepadd+$}}if(_I[34]=="tree"){if(ie&&!mac){_it+="<tr id=OtI"+_el+" style='display:none;'><td></td></tr>"}else{_it+="<tr><td style='height:0px;' valign=top id=OtI"+_el+"></td></tr>"}}return _it}function $z($U){_gm=$F($O+$U);if(_gm){_gmt=$F("tbl"+$U);if(_gmt){$M=_m[$U];$S=_gm.style;$T=_gmt.offsetWidth;_cor=($M[12]*2+$M[6][65]*2);if(op5)_gm.style.pixelWidth=_gmt.style.pixelWidth+_cor;_px=$;if(mac){_px="px";_MacA=$D(_gmt);if(_MacA[2]==0&&_MacA[3]==0){_StO("$z("+$U+")",200);return}if(IEDtD)_cor=0;$S.overflow=$5;$S.height=(_MacA[2]+_cor)+"px";$S.width=(_MacA[3]+_cor)+"px"}else{if($M[14]=="relative"||ns6){_cor=0;$S.width=($T+_cor)+"px"}if($M[17])$S.width=$M[17]+_px;else if($M[13]=="scroll"){if(op7)$T=$T+_cor;$S.width=$T}}}}}gevent=0;function getEVT(evt,$m){if(evt.target.tagName=="TD"){_egm=$F($O+$m);gevent=evt.layerY-(evt.pageY-$7)+_egm.offsetTop}}function $L(_i){if(_i>-1){_I=_mi[_i];if(_I[4]){_W.status=_I[4];return _t}_W.status=$;if(!_I[2])return _t}}function $pX(px){px=(!isNaN(px))?px+="px;":px+=";";return px}_ifc=0;_fSz="'>";function o$($m,_begn){_mcnt++;var _M=_m[$m];_mt=$;if(!_M)return;_MS=_M[6];_tWid=$;$k=$;$l=$;if(_M[7]==0)_M[7]=_n;if((!_M[14])&&(!_M[7]))$k="top:-"+$pX(_aN);if(_M[2]!=_n)if(!isNaN(_M[2]))$k="top:"+$pX(_M[2]);if(_M[3]!=_n)if(!isNaN(_M[3]))$l="left:"+$pX(_M[3]);$mHeight=$;if(_M[9]=="horizontal"||_M[9]==1){_M[9]=1;$Q=1;if(_M[18])$mHeight=" height="+_M[18]}else{_M[9]=0;$Q=0}_ofb=$;if(_MS.offbgcolor)_ofb="background:"+_MS.offbgcolor;_brd=$;_brdP=$;_brdwid=$;if(_MS[65]||_MS[65]==0){_brdsty="solid";if(_MS[64])_brdsty=_MS[64];_brdcol=_MS.offcolor;if(_MS[63])_brdcol=_MS[63];if(_MS[65]||_MS[65]==0)_brdwid=_MS[65];_brdP=_brdwid+"px "+_brdsty+$$;_brd="border:"+_brdP+_brdcol+";"}_Mh3=_MS.high3dcolor;_Ml3=_MS.low3dcolor;if(_Mh3&&_Ml3){_h3d=_Mh3;_l3d=_Ml3;if(_MS.swap3d){_h3d=_Ml3;_l3d=_Mh3}_brdP=_brdwid+"px solid ";_brd="border-bottom:"+_brdP+_h3d+";";_brd+="border-right:"+_brdP+_h3d+";";_brd+="border-top:"+_brdP+_l3d+";";_brd+="border-left:"+_brdP+_l3d+";"}_ns6ev=$;if(_M[13]=="scroll"&&ns6&&!ns7)_ns6ev="onmousemove='getEVT(event,"+$m+")'";_bgimg=$;if(_MS.menubgimage)_bgimg=";background-image:url("+_MS.menubgimage+");";_wid=$;if(!_M[7]&&_W.fixMozillaZIndex&&ns6)_M[14]="fixed";_posi=ab$;if(_M[14]){_posi=_M[14];if(_M[14]=="relative"){_posi=$;$k=$;$l=$}if(_M[14]=="fixed"&&!ns6)_posi=ab$}$B="padding:0px;";if(_M[12])$B=";padding:"+$pX(_M[12]);_cls="mmenu";if(_MS.offclass)_cls=_MS.offclass;if(_posi)_posi="position:"+_posi;_visi=$5;if(_begn==1){if(_M[17])_wid=";width:"+$pX(_M[17]);if(_M[24])_wid+=";height:"+$pX(_M[24]);_mbgc=$;if(_MS.menubgcolor)_mbgc=";background-color:"+_MS.menubgcolor;_mt+="<div class='"+_cls+"' onmouseout=$I() onmouseover=$J() onselectstart='return _f' "+_ns6ev+" id=menu"+$m+" style='"+$B+_ofb+";"+_brd+_wid+"z-index:499;visibility:"+_visi+";"+_posi+";"+$k+";"+$l+_bgimg+_mbgc+"'>"}if(_M[7]||!_startM||(op5||op6)||_W.buildAllMenus){if(!(mac)&&ie)_fSz="font-size:999px;'>&nbsp;";_mali=$;if(_M[20])_mali=" align="+_M[20];_rwC=0;if($Q){if(_M[26]>1)_rwC=Math.ceil(_M[0].length/_M[26]);_rwT=_rwC}else{if(_M[6].itemwidth)_tWid=+_M[6].itemwidth;if(_M[4])_tWid=+_M[4]}if(_M[17])_tWid=+_M[17];if(_tWid)_tWid="width="+_tWid;_mt+=_TbS+$mHeight+_tWid+" id=tbl"+$m+$$+_mali+">";for(_b=0;_b<_M[0].length;_b++){_mt+=m$(_b,_M[0][_b]);_el++;if($Q&&_rwC>1){if(_b+1==_rwT){_mt+="</tr><tr>";_rwT=_rwT+_rwC}}}if(mac&&!$Q)_mt+="<tr><td id=btm"+$m+"></td></tr>";_mt+="</table>"+$$;_M[23]=1;_tpe=((ns61&&_M[6].type=="tree")?"div":"a");_mt+="<"+_tpe+" name=mM1 id=mmlink"+$m+" href=# onclick='return $K(this._itemRef)'  onmouseover='_mot=$P(_mot);return $L(this._itemRef)' style='line-height:normal;background:transparent;text-decoration:none;height:1px;width:1px;overflow:hidden;position:"+ab$+";"+_fSz+"</"+_tpe+">"}else{if(_begn==1)for(_b=0;_b<_M[0].length;_b++){$q();_el++}}if(_begn==1)_mt+="</div>";if(_begn==1)_d.write(_mt);else return _mt;if(_M[7])_M[22]=$F($O+$m);if(_M[7]){if(ie55)$U($m)}else{if(ie55&&_ifc<_mD)$U($m);_ifc++}if(_M[19]){_M[19]=_M[19].toString();_fs=_M[19].split(",");if(!_fs[1])_fs[1]=50;if(!_fs[2])_fs[2]=2;_M[19]=_fs[0];$X($m,_fs[1],_fs[2])}if($m==_m.length-1){_mst=$P(_mst);_mst=_StO("$N()",150);$p();getMenuByItem=$d;getParentItemByItem=$f;_drawMenu=o$;BDMenu=g$;gmobj=$F;menuDisplay=$Y;gpos=$D;spos=$E;_fixMenu=$z;getMenuByName=$h;itemOn=e$;itemOff=d$;_popi=h$;clickAction=$K;_setPosition=p$;closeAllMenus=$Z}}$S2="6D696C6F6E6963";function $p(){if(_cip.length>0){for(_c=0;_c<_cip.length;_c++){_ci=_cip[_c];_mni=$f(_ci);if(_mni==-1)_mni=_ci;if(_mni+$$!=$u){while(_mni!=-1){_I=_mi[_mni];$w(_I);_gi=$F("el"+_mni);if(_gi)_gi.e$=1;d$(_mni);_omni=_mni;_mni=$f(_mni);if(_mni==_omni||_mni+$$==$u)_mni=-1}}}}}function p$($m){var _M=_m[$m];if(_M[5]){_gm=$F($O+$m);if(!_gm)return;_gp=$D(_gm);_osl=0;_omnu3=0;if(isNaN(_M[3])&&_M[3].indexOf("offset=")==0){_omnu3=_M[3];_M[3]=_n;_osl=_omnu3.substr(7,99);_gm.leftOffset=_osl}_lft=_n;if(!_M[3]){if(_M[5].indexOf("left")!=-1)_lft=0;if(_M[5].indexOf("center")!=-1)_lft=(_bW/2)-(_gp[3]/2);if(_M[5].indexOf("right")!=-1)_lft=(_bW-_gp[3]);if(_gm.leftOffset)_lft=_lft+$pU(_gm.leftOffset)}_ost=0;_omnu2=0;if(isNaN(_M[2])&&_M[2].indexOf("offset=")==0){_omnu2=_M[2];_M[2]=_n;_ost=_omnu2.substr(7,99);_gm.topOffset=_ost}_tp=_n;if(!_M[2]>=0){_tp=_n;if(_M[5].indexOf("top")!=-1)_tp=0;if(_M[5].indexOf("middle")!=-1)_tp=(_bH/2)-(_gp[2]/2);if(_M[5].indexOf("bottom")!=-1)_tp=_bH-_gp[2];if(_gm.topOffset)_tp=_tp+$pU(_gm.topOffset)}if(_lft<0)_lft=0;if(_tp)_tp=$pU(_tp);if(_lft)_lft=$pU(_lft);$E(_gm,_tp,_lft);if(_M[19])_M[19]=_tp;if(_M[7])$V($m,1);_gm._tp=_tp}}function $X($m,b$,a$){if(!_startM&&!inDragMode){var _M=_m[$m];_fogm=_M[22];_fgp=$D(_fogm);_tt=(_sT>_M[2]-_M[19])?_sT-(_sT-_M[19]):_M[2]-_sT;if(_fgp&&_fgp[0]-_sT!=_tt){diff=_sT+_tt;_rcor=(diff-_fgp[0]<1)?a$:-a$;_fv=$pU((diff-_rcor-_fgp[0])/a$);if(a$==1)_fv=$pU((diff-_fgp[0]));if(_fv!=0)diff=_fgp[0]+_fv;$E(_fogm,diff);if(_fgp._tp)_M[19]=_fgp._tp;if(ie55){_fogm=$F("ifM"+$m);if(_fogm)$E(_fogm,diff)}}}_fS=_StO("$X('"+$m+"',"+b$+","+a$+")",b$)}function $qe(_s){$_s=_s.split($);$s=$;for(_a=0;_a<_s.length;_a++){$s+="%"+$_s[_a]+$_s[_a+1];_a++}return unescape($s)}$S1="687474703A2F2F7777772E";;function $N(){$r();if(_bH!=_oldbH||_bW!=_oldbW){for(_a=0;_a<_m.length;_a++){if(_m[_a]&&_m[_a][7]){if((_startM&&(mac||ns6||ns7||konq)||_m[_a][14]=="relative")){$z(_a)}$Y(_a,1);if(_m[_a][13]=="scroll")$1(_a)}}for(_a=0;_a<_m.length;_a++){if(_m[_a]&&_m[_a][5]){p$(_a)}}}if(_startM){$mD=0;$J();_ofMT=1}_startM=0;_oldbH=_bH;_oldbW=_bW;if(op){_oldbH=0;_oldbW=0}_mst=_StO("$N()",150)}function $U($m){if(_W._CFix)return;_ssrc=$;if(_L.protocol=="https:"){_ssrc=" src=/blank.html";if(_W.blankPath)_ssrc=_W.blankPath}$mV="ifM"+$m;if(!_m[$m][7]){$mV="iF"+$mD;$mD++}_d.write("<iframe class=mmenu FRAMEBORDER=0 id="+$mV+_ssrc+" style='top:-999px;left:-999px;filter:Alpha(Opacity=0);position:"+ab$+";'></iframe>")}if(!(op5||op6))_5("setIn"+$qe("74657276616C28275F634C282927")+","+_aN+")");function $V($m,_on){var _M=_m[$m];if(ns6||_M.treemenu||_M[14]=="relative"||_W._CFix)return;if(ie55){if(_on){if(_M[7]){_iFf="iFM"+$m}else{_iFf="iF"+$mD}_iF=$F(_iFf);if(!_iF){if(_d.readyState!="complete")return;_iF=_d.createElement("iframe");if(_L.protocol=="https:")_iF.src="/blank.html";_iF.id=_iFf;_iF.style.filter="Alpha(Opacity=0)";_iF.style.position=ab$;_iF.style.className="mmenu";if(!_M[27])_iF.style.zIndex=_m.length-1;if(_dB.appendChild)_dB.appendChild(_iF)}_gp=$D(_M[22]);if(_iF){$E(_iF,_gp[0],_gp[1],_gp[2],_gp[3]);_iF.style.visibility=$6;if(!_M[27])_iF.style.zIndex=_m.length-1}}else{_gm=$F("iF"+($mD-1));if(_gm)_gm.style.visibility=$5}}}

