//-----global.js-----


// JavaScript Document
//funcion encargada de crear el objeto
function externalLinks() {
 if (!document.getElementsByTagName) return;
 var anchors = document.getElementsByTagName("a");
 for (var i=0; i<anchors.length; i++) {
   var anchor = anchors[i];
   if (anchor.getAttribute("href") &&
       anchor.getAttribute("rel") == "external")
     anchor.target = "_blank";
 }
}


 function obj_ajax() {         
	try {                 
		 xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}
	catch (e) {                 
		 try {                          
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
		 catch (E) {                           
			 xmlhttp = false;}
         }
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {                 
 		xmlhttp = new XMLHttpRequest(); }
  return xmlhttp
 }
 
 function extension(str_filename){
	var i = str_filename.length;
	var slicer = String(slicer)
	var ext = String('')
	do{ 
		slicer = str_filename.slice(i-1,i);
		ext = slicer+ext
		i--
	} 
	while(slicer != '.' && i > 1)
	
	ext = ext.toLowerCase();
	return(ext);
}

function esNumero(valor)
{
	if (esEntero(valor) || esDecimal(valor))
		return true;
	return false;
}

function esEntero(valor)
{
  var checkOK = "0123456789-";
  var checkStr = valor;
  var allValid = true;
  var allNum = "";
  for (k = 0;  k < checkStr.length;  k++)
  {
    ch = checkStr.charAt(k);
    for (j = 0;  j < checkOK.length;  j++)
      if (ch == checkOK.charAt(j))
        break;
    if (j == checkOK.length)
    {
      allValid = false;
      break;
    }
    allNum += ch;
  }
  if (!allValid)
  {
    return false;
  }
  return true;
}

function esDecimal(valor)
{
  var checkOK = "0123456789-,.";
  var checkStr = valor;
  var allValid = true;
  var decPoints = 0;
  var allNum = "";
  for (k = 0;  k < checkStr.length;  k++)
  {
    ch = checkStr.charAt(k);
    for (j = 0;  j < checkOK.length;  j++)
      if (ch == checkOK.charAt(j))
        break;
    if (j == checkOK.length)
    {
      allValid = false;
      break;
    }
    if ((ch == ",") || (ch == "."))
    {
      allNum += ".";
      decPoints++;
    }
    else 
		allNum += ch;
  }
  if (!allValid)
    return false;
  if (decPoints > 1 || decPoints == 0)
    return false;
  return true;
}

function Chek_input(campo){
	if (Trim(document.getElementById(campo).value)=="")
		return false;
	return true;
}

function LTrim(s){
	var i=j=0;
	for(i=0; i<=s.length-1; i++)
		if(s.substring(i,i+1) != ' '){
			j=i;
			break;
		}
	return s.substring(j, s.length);
}

function RTrim(s){
	var j=0;
	for(var i=s.length-1; i>-1; i--)
		if(s.substring(i,i+1) != ' '){
			j=i;
			break;
		}
	return s.substring(0, j+1);
}

function Trim(s){
	return LTrim(RTrim(s));
}

function aleatorio(inferior,superior){
	numPosibilidades = superior - inferior
	aleat = Math.random() * numPosibilidades
	aleat = Math.round(aleat)
return parseInt(inferior) + aleat
} 





//-----prototype.js-----


/*  Prototype JavaScript framework, version 1.5.1.1
 *  (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://www.prototypejs.org/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.5.1.1',

  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      (document.createElement('div').__proto__ !==
       document.createElement('form').__proto__)
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  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;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch(type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }
    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (object.ownerDocument === document) return;
    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (value !== undefined)
        results.push(property.toJSON() + ': ' + value);
    }
    return '{' + results.join(', ') + '}';
  },

  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 = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

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

Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

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

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

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

Date.prototype.toJSON = function() {
  return '"' + this.getFullYear() + '-' +
    (this.getMonth() + 1).toPaddedString(2) + '-' +
    this.getDate().toPaddedString(2) + 'T' +
    this.getHours().toPaddedString(2) + ':' +
    this.getMinutes().toPaddedString(2) + ':' +
    this.getSeconds().toPaddedString(2) + '"';
};

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;
      }
    }
  }
}
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

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+$/, '');
  },

  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 self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

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

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

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

        if (key in hash) {
          if (hash[key].constructor != Array) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = 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);
  },

  times: function(count) {
    var result = '';
    for (var i = 0; i < count; i++) result += this;
    return result;
  },

  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.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  isJSON: function() {
    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/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;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

with (String.prototype.escapeHTML) div.appendChild(text);

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 $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead');

var Enumerable = {
  each: function(iterator) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator(value, index++);
      });
    } catch (e) {
      if (e != $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 $break;
    });
    return result;
  },

  any: function(iterator) {
    var result = false;
    this.each(function(value, index) {
      if (result = !!(iterator || Prototype.K)(value, index))
        throw $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 $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 $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 = $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 = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($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 $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;
  }
}

if (Prototype.Browser.WebKit) {
  $A = Array.from = function(iterable) {
    if (!iterable) return [];
    if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&
      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 = $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(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

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

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

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

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (value !== undefined) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

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

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

if (Prototype.Browser.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(object) {
  if (object instanceof Hash) this.merge(object);
  else Object.extend(this, object || {});
};

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

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

      if (value && typeof value == 'object') {
        if (value.constructor == Array) value.each(function(value) {
          parts.add(pair.key, value);
        });
        return;
      }
      parts.add(pair.key, value);
    });

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

  toJSON: function(object) {
    var results = [];
    this.prototype._each.call(object, function(pair) {
      var value = Object.toJSON(pair.value);
      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);
    });
    return '{' + results.join(', ') + '}';
  }
});

Hash.toQueryString.addPair = function(key, value, prefix) {
  key = encodeURIComponent(key);
  if (value === undefined) this.push(key);
  else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
}

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 $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(', ') + '}>';
  },

  toJSON: function() {
    return Hash.toJSON(this);
  }
});

function $H(object) {
  if (object instanceof Hash) return object;
  return new Hash(object);
};

// Safari iterates over shadowed properties
if (function() {
  var i = 0, Test = function(value) { this.key = value };
  Test.prototype.key = 'foo';
  for (var property in new Test('bar')) i++;
  return i > 1;
}()) Hash.prototype._each = function(iterator) {
  var cache = [];
  for (var key in this) {
    var value = this[key];
    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;
    cache.push(key);
    var pair = [key, value];
    pair.key = key;
    pair.value = value;
    iterator(pair);
  }
};
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 $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 = Object.clone(this.options.parameters);

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

    this.parameters = params;

    if (params = Hash.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      if (this.options.onCreate) this.options.onCreate(this.transport);
      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();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.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
        $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);
      }

      var contentType = this.getHeader('Content-type');
      if (contentType && contentType.strip().
        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/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 ? json.evalJSON() : null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } 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 = $(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 $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(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, $(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) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  }

} else document.getElementsByClassName = function(className, parentElement) {
  var children = ($(parentElement) || document.body).getElementsByTagName('*');
  var elements = [], child, pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");
  for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
    var elementClassName = child.className;
    if (elementClassName.length == 0) continue;
    if (elementClassName == className || elementClassName.match(pattern))
      elements.push(Element.extend(child));
  }
  return elements;
};

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

if (!window.Element) var Element = {};

Element.extend = function(element) {
  var F = Prototype.BrowserFeatures;
  if (!element || !element.tagName || element.nodeType == 3 ||
   element._extended || F.SpecificElementExtensions || element == window)
    return element;

  var methods = {}, tagName = element.tagName, cache = Element.extend.cache,
   T = Element.Methods.ByTag;

  // extend methods for all tags (Safari doesn't need this)
  if (!F.ElementExtensions) {
    Object.extend(methods, Element.Methods),
    Object.extend(methods, Element.Methods.Simulated);
  }

  // extend methods for specific tags
  if (T[tagName]) Object.extend(methods, T[tagName]);

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

  element._extended = Prototype.emptyFunction;
  return element;
};

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

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

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

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

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

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

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

  replace: function(element, html) {
    element = $(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 = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $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 = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

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

  descendants: function(element) {
    return $A($(element).getElementsByTagName('*')).each(Element.extend);
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

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

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

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

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

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

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return expression ? Selector.findElement(ancestors, expression, index) :
      ancestors[index || 0];
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    var descendants = element.descendants();
    return expression ? Selector.findElement(descendants, expression, index) :
      descendants[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return expression ? Selector.findElement(previousSiblings, expression, index) :
      previousSiblings[index || 0];
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return expression ? Selector.findElement(nextSiblings, expression, index) :
      nextSiblings[index || 0];
  },

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

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

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      if (!element.attributes) return null;
      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];
      return attribute ? attribute.nodeValue : null;
    }
    return element.getAttribute(name);
  },

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

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

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

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

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

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

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

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

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

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(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 $(element).innerHTML.blank();
  },

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

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

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value) {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles, camelized) {
    element = $(element);
    var elementStyle = element.style;

    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property])
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
          (camelized ? property : property.camelize())] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = $(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 = $(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 = $(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 = $(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 = $(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,
  childElements: Element.Methods.immediateDescendants
});

if (Prototype.Browser.Opera) {
  Element.Methods._getStyle = Element.Methods.getStyle;
  Element.Methods.getStyle = function(element, style) {
    switch(style) {
      case 'left':
      case 'top':
      case 'right':
      case 'bottom':
        if (Element._getStyle(element, 'position') == 'static') return null;
      default: return Element._getStyle(element, style);
    }
  };
}
else if (Prototype.Browser.IE) {
  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset'+style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      style.filter = filter.replace(/alpha\([^\)]*\)/gi,'');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  // IE is missing .innerHTML support for TABLE-related elements
  Element.Methods.update = function(element, html) {
    element = $(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;
      }
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      depth.times(function() { div = div.firstChild });
      $A(div.childNodes).each(function(node) { element.appendChild(node) });
    } else {
      element.innerHTML = html.stripScripts();
    }
    setTimeout(function() { html.evalScripts() }, 10);
    return element;
  }
}
else if (Prototype.Browser.Gecko) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

Element._attributeTranslations = {
  names: {
    colspan:   "colSpan",
    rowspan:   "rowSpan",
    valign:    "vAlign",
    datetime:  "dateTime",
    accesskey: "accessKey",
    tabindex:  "tabIndex",
    enctype:   "encType",
    maxlength: "maxLength",
    readonly:  "readOnly",
    longdesc:  "longDesc"
  },
  values: {
    _getAttr: function(element, attribute) {
      return element.getAttribute(attribute, 2);
    },
    _flag: function(element, attribute) {
      return $(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;
    }
  }
};

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

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

Element.Methods.ByTag = {};

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
 document.createElement('div').__proto__) {
  window.HTMLElement = {};
  window.HTMLElement.prototype = document.createElement('div').__proto__;
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || {});
  else {
    if (tagName.constructor == Array) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = {};
    Object.extend(Element.Methods.ByTag[tagName], 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);
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = {};
    window[klass].prototype = document.createElement(tagName).__proto__;
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (typeof klass == "undefined") continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;
};

var Toggle = { display: Element.toggle };

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

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

Abstract.Insertion.prototype = {
  initialize: function(element, content) {
    this.element = $(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 $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 = $(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($A(this).concat(classNameToAdd).join(' '));
  },

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

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

Object.extend(Element.ClassNames.prototype, Enumerable);
/* Portions of the Selector class are derived from Jack Slocumâ€™s DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create();

Selector.prototype = {
  initialize: function(expression) {
    this.expression = expression.strip();
    this.compileMatcher();
  },

  compileMatcher: function() {
    // Selectors with namespaced attributes can't use the XPath version
    if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression))
      return this.compileXPathMatcher();

    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e]; return;
    }
    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(typeof c[i] == 'function' ? c[i](m) :
    	      new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le,  m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(typeof x[i] == 'function' ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
    return this.matcher(root);
  },

  match: function(element) {
    return this.findElements(document).include(element);
  },

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

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
};

Object.extend(Selector, {
  _cache: {},

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: "[@#{1}]",
    attr: function(m) {
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (typeof h === 'function') return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
      'checked':     "[@checked]",
      'disabled':    "[@disabled]",
      'enabled':     "[not(@disabled)]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, m, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
    className:    'n = h.className(n, r, "#{1}", c); c = false;',
    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
    },
    pseudo:       function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/,
    attrPresence: /^\[([\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._counted = true;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._counted) {
          n._counted = true;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
	      if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      tagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() == tagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!nodes && root == document) return targetNode ? [targetNode] : [];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._counted) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._counted) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled) results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv.startsWith(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
  },

  matchElements: function(elements, expression) {
    var matches = new Selector(expression).findElements(), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._counted) results.push(element);
    h.unmark(matches);
    return results;
  },

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

  findChildElements: function(element, expressions) {
    var exprs = expressions.join(','), expressions = [];
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(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 = $(element).getValue();
        if (value != null) {
         	if (key in result) {
            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 $A($(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 = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $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 = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

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

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

  request: function(form, options) {
    form = $(form), options = Object.clone(options || {});

    var params = options.parameters;
    options.parameters = form.serialize(true);

    if (params) {
      if (typeof params == 'string') params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(form.readAttribute('action'), options);
  }
}

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

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

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

Form.Element.Methods = {
  serialize: function(element) {
    element = $(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 = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

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

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

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

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

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

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

var Field = Form.Element;
var $F = Form.Element.Methods.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   = $(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  = $(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 = $(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
      (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

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

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

    if (name == 'keypress' &&
        (Prototype.Browser.WebKit || element.attachEvent))
      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 (Prototype.Browser.IE)
  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 = $(source);
    var p = Position.page(source);

    // find coordinate system to use
    target = $(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 = $(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 = $(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 (Prototype.Browser.WebKit) {
  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();
function displayName() {
  var cookies = document.cookie;
  var pos = cookies.indexOf('display_name=');
  if (pos != -1) {
    var start = pos+13;
    var end = cookies.indexOf(';',start);
    if (end == -1) {end = cookies.length;}
    return decodeURIComponent(cookies.substring(start,end));
  }
  return null;
}







//-----myLayout.js-----


//****************************************SETS & UPDATES CSS
//****************************************
function initializeVars(jsVars)
{
	if(jsVars==''){
		if(window.loadVars){
		if(loadVars=="true"){
			//estas variables las inciializo por las duda porque se agregaron cuando ya habia registros grabados
			$("backImageCategoryId").value='';
			
			//leo las variables de las cookies
			for(i=0;i<varBacks.length;i++)
			{
				varValue=Cookie.get(varBacks[i]);
				if((varValue=="isfalse")||(varValue=="istrue"))
					$(varBacks[i]).checked=(varValue=="istrue")?1:0;
				else
					$(varBacks[i]).value=varValue;
			 }
			 if((appType==1)&&($("themeId").value!=''))
			 {
				 updateTheme($("themeId").value); 
			 }
		}
		else{ //valores por defecto
			$("backImageCategory").value='';
			$("searchBackKeyword").value='';
			$("image_keywords").value='';
			$("backImage").value='';
			$("backImageNone").checked=false;
			$("backFixed").checked=false;
			$("backPosition").value='top';
			$("backRepeat").value='repeat';
			$("backColor").value='E1E1E1';
			$("backImageCategoryId").value='';
			if($("themeId").value=='')
				$("backImageUrl").value='';
		}
		}
		$("backImage").value='';
		$("backColor_boxes").value='';
		$("borderColor_boxes").value='';
		setBorderCss('boxes','none');
		setBorderSize('boxes',1);		
		$("color_links").value='000000';
		$("color_content").value='000000';
		$("color_title").value='000000';
		setFontType('title','default','verdana')
		setFontSize('title','default','12px')
		setFontType('content','default','verdana');
		setFontSize('content','default','10px');
		setFontType('links','default','verdana');
		setFontSize('links','default','12px');	
		if(appType==1){
			$("contactBackImage").value='';
			$("contactBackImageNone").checked=false;
			$("contactBackImageNro").value='0';
			$("extendedBackImage").value='';
			$("extendedBackImageNone").checked=false;
			$("extendedBackImageNro").value='0';
			setBorderImg('center','none');
			$("borderColor_boxes2").value='';
			setBorderImg('boxes','none');
			$("moreHideExtendedNet").checked=false;
			$("moreHideContactTb").checked=false;
		}		
		if(appType==2){
			setBorderCss('center','none');
			setBorderSize('center',1);
			$("backTransparent_center").checked=false;
			$("moreHideVanityBars").checked=false;
			$("moreHideDetails").checked=false;
		}
		if(appType==3){
			$("headersColor_center").value='E6F1F3';
			$("btnColor_center").value='D1E6E9';
			$("btnOverColor_center").value='17728F';
			$("backTransparent_boxes").checked=false;
			}
		if(appType!=3){
			$("backColor_center").value='FFFFFF';
			$("borderColor_center").value='';
			$("moreReverseProfile").checked=false;
			$("moreRemoveGeneral").checked=false;
			$("moreHideFriends").checked=false;
			if($("moreTransparency").value!=0){
				$("moreTransparency").value='0';
				newValue('0','transparentia');
			}	
		}
	}
	else {//valores  de un userLayouts
		arrVars=jsVars.split("|");
		for(i=0;i<arrVars.length;i++){
			auxValue=arrVars[i].split("=");
			if((auxValue[1]=="false")||(auxValue[1]=="true")){
				$(auxValue[0]).checked=(auxValue[1]=="true")?1:0;
				}
			else{				
				switch(appType){
					case 1:{
						switch(auxValue[0]){
							case 'borderImg_center':{setBorderImg('center',auxValue[1]);break;}
							case 'borderOpc_boxes':{setBorderCss('boxes',auxValue[1]);break;}
							case 'borderSize_boxes':{setBorderSize('boxes',auxValue[1]);break;}
							case 'borderImg_boxes':{setBorderImg('boxes',auxValue[1]);break;}
							case 'fontType_links':{setFontType('title','default',auxValue[1]);break;}
							case 'fontType_content':{setFontSize('title','default',auxValue[1]);break;}
							case 'fontType_title':{setFontType('content','default',auxValue[1]);break;}
							case 'fontSize_links':{setFontSize('content','default',auxValue[1]);break;}
							case 'fontSize_content':{setFontType('links','default',auxValue[1]);break;}
							case 'fontSize_title':{setFontSize('links','default',auxValue[1]);break;}
							default:{$(auxValue[0]).value=auxValue[1];};
						}
						break;}
					case 2:{
						switch(auxValue[0]){
							case 'borderOpc_center':{setBorderCss('center',auxValue[1]);break;}
							case 'borderSize_center':{setBorderSize('center',auxValue[1]);break;}
							case 'borderOpc_boxes':{setBorderCss('boxes',auxValue[1]);break;}
							case 'borderSize_boxes':{setBorderSize('boxes',auxValue[1]);break;}
							case 'fontType_links':{setFontType('title','default',auxValue[1]);break;}
							case 'fontType_content':{setFontSize('title','default',auxValue[1]);break;}
							case 'fontType_title':{setFontType('content','default',auxValue[1]);break;}
							case 'fontSize_links':{setFontSize('content','default',auxValue[1]);break;}
							case 'fontSize_content':{setFontType('links','default',auxValue[1]);break;}
							case 'fontSize_title':{setFontSize('links','default',auxValue[1]);break;}
							default:$(auxValue[0]).value=auxValue[1];
						}
						break;}
					case 3:{
						switch(auxValue[0]){
							case 'borderOpc_boxes':{setBorderCss('boxes',auxValue[1]);break;}
							case 'borderSize_boxes':{setBorderSize('boxes',auxValue[1]);break;}
							case 'fontType_links':{setFontType('title','default',auxValue[1]);break;}
							case 'fontType_content':{setFontSize('title','default',auxValue[1]);break;}
							case 'fontType_title':{setFontType('content','default',auxValue[1]);break;}
							case 'fontSize_links':{setFontSize('content','default',auxValue[1]);break;}
							case 'fontSize_content':{setFontType('links','default',auxValue[1]);break;}
							case 'fontSize_title':{setFontSize('links','default',auxValue[1]);break;}
							default:$(auxValue[0]).value=auxValue[1];
						}
						break;}
					}
			}
		}
		if(appType!=3){
			if($("moreTransparency").value!=0){
				$("moreTransparency").value='0';
				newValue('0','transparentia');
			}	
		}
	}
	if((appType==$("profileType").value)&&($("profileName").value!="")){
			$("welcome").innerHTML='Welcome <span class="welcomeBig">'+$("profileName").value+'</span>';
	}
	myLayout.updateStyle();
}

function setBorderCss(element,value){
	document.getElementById("borderOpc_" + element + "_" + $('borderOpc_'+[element]).value).className="unselected";
	document.getElementById("borderOpc_" + element + "_" + value).className="selected";
	$('borderOpc_'+[element]).value=value;
	myLayout.updateStyle();
}

function setBorderSize(element,value){
	document.getElementById("borderSize_" + element + "_" + $('borderSize_'+[element]).value).className="unselected";
	document.getElementById("borderSize_" + element + "_" + value).className="selected";
	$('borderSize_'+[element]).value=value;
	myLayout.updateStyle();
}

function setBorderImg(element,value){
	document.getElementById("borderImg_" + element + "_" + $('borderImg_'+[element]).value).className="unselected";
	document.getElementById("borderImg_" + element + "_" + value).className="selected";
	$('borderImg_'+[element]).value=value;
	myLayout.updateStyle();
}

function setFontType(element,item,value){
	document.getElementById("fontType_" + element + "_" + $('fontTypeSel_'+[element]).value).className="unselected";
	document.getElementById("fontType_" + element + "_" + item).className="selected";
	$('fontType_'+[element]).value=value;
	$('fontTypeSel_'+[element]).value=item;
	myLayout.updateStyle();
}

function setFontSize(element,item,value){
	//document.getElementById("fontSize_" + element + "_" + $('fontSizeSel_'+[element]).value).className="unselected"; //??
	document.getElementById("fontSize_" + element + "_" + item).className="selected";
	$('fontSize_'+[element]).value=value;
	$('fontSizeSel_'+[element]).value=item;
	myLayout.updateStyle();
}

function updateLayoutsBackUrl(url){
	$('themeName').value="";
	$('backImageCategory').value="";
	$("backImageCategoryId").value="";
	$('searchBackKeyword').value=$('image_keywords').value;
	
	//creamos el objeto     
	 _obj_ajax=obj_ajax();   
	 
	 _values_send="url=" + url;  	 
	 _URL_="copy_imgbackground.php?";   
	 _obj_ajax.open("GET",_URL_ + _values_send,true);   
	 
	 $("wait").show();
	 _obj_ajax.onreadystatechange=function() {              
	if (_obj_ajax.readyState==4) {
		if(_obj_ajax.status==200){	
			  if (_obj_ajax.responseText!="false"){
				$('backImageUrl').value=_obj_ajax.responseText;
				$('backImage').value="body {background-image:url(" + $('backImageUrl').value + ");  ";
				$("backImageNone").checked=false;
				myLayout.updateStyle();
				 $("wait").hide();
				}
			else{
				error="updateLayoutsBackUrl";
				}
			}
		}
	}  
 	_obj_ajax.send(null); 
}

function updateLayoutsBackImg(nro,name,categoryId,path)
{
	if (nro!=0)
	{

		$('themeName').value="";
		$('backImageCategory').value=name;
		$('backImageCategoryId').value=categoryId;
		$('searchBackKeyword').value="";
		$('backImageUrl').value=path;
		$("backImageNone").checked=false;
		myLayout.updateStyle();
	}
}

function updateContactBackImg(nro, a, b, imag){
	//si se paso un nro o no esta tildado el checkbox de ocultar la imagen debo mostrarla
	if ((nro!=0)||(!document.getElementById("contactBackImageNone").checked)){
		//sino vino un nro, me fijo si tenia uno de antes
		if(nro==0)
			nro=$('contactBackImageNro').value;
		//si existe alguna imagen genero el codigo
		if(nro!=0){
			path_cnt=imag;
			_value="table.contactTable {width:292px !important; height:166px !important;background-image:url(" + path_cnt + ");background-repeat: no-repeat; background-color:transparent; background-attachment:scroll; background-position:center center; padding:0px !important;} ";
			_value+=".contactTable table, table.contactTable td {background-color:transparent;  background-image:none;  padding:0px !important;} ";
			_value+=".contactTable a {display:block; height:28px; width:115px;} .r{} .contactTable a img {filter:alpha(opacity=0); opacity:0; border:0px !important;} ";
			_value+=".contactTable .text {font-size:1px !important;} ";
			$('contactBackImage').value=_value;
			$('contactBackImageNro').value=nro;
			$("contactBackImageNone").checked=false;
			}
		}
	else
		//oculto la imagen
		$('contactBackImage').value="";
	myLayout.updateStyle();
}

function updateExtendedBackImg(nro){
	//si se paso un nro o no esta tildado el checkbox de ocultar la imagen debo mostrarla
	if ((nro!=0)||(!document.getElementById("extendedBackImageNone").checked)){
		//sino vino un nro, me fijo si tenia uno de antes
		if(nro==0)
			nro=$('extendedBackImageNro').value;
		//si existe alguna imagen genero el codigo
		if(nro!=0){
			path_ntw="images/"+nro+".jpg";
			_value='span.blacktext12 {width: 435px;  height: 74px;background-image:url(' + path_ntw + ');background-repeat: no-repeat; !important; display:block}';
			_value+='span.blacktext12 span {display:none} ';
			$('extendedBackImage').value=_value;
			$('extendedBackImageNro').value=nro;
			$("extendedBackImageNone").checked=false;
			}
		}
	else{
		if(document.getElementById("extendedBackImageNone").checked){
			//oculto la imagen
			$('extendedBackImage').value="";
			}
		}
	myLayout.updateStyle();
}


function saveBordersImgs(){
	//parche para uso local y debug
	
	if(appPath=="http://localhost/mylayouts"){
		myLayout.updateStyle();
		saveData();	
		$("loadVerify").hide();
	}
	else{
		if(($("borderImg_center").value!="none")||($("borderImg_boxes").value!="none")){
			numRandom = aleatorio(10000,99999) ;
			//genero la nueva imagen
			_obj_ajax=obj_ajax(); 
			//reviso valor por defecto center style
			color2_center="000000";
			if($("borderColor_center").value!='')
				color2_center=$("borderColor_center").value;
			
			//reviso valores por defecto boxes
			opcSel_boxes=0;
			color1_boxes="666666";
			color2_boxes="000000";				
			if($("borderImg_boxes").value!="none")
				opcSel_boxes=$("borderImg_boxes").value;
			if($("backColor_boxes").value!='')
				color1_boxes=$("backColor_boxes").value;	
			if($("borderColor_boxes2").value!='')
				color2_boxes=$("borderColor_boxes2").value;
				
			_values_send='sessionId=' + sessionId + '&numRandom=' + numRandom + '&color1_center=' + $("backColor_center").value + '&color2_center=' + color2_center + '&opcSel_center=' + $("borderImg_center").value + '&color1_boxes=' + color1_boxes + '&color2_boxes=' + color2_boxes + '&opcSel_boxes=' + opcSel_boxes;
			 $("errorVerify").innerHTML="";
			 $("errorVerify").hide();
			 $('btnVerify').hide();
			 $("loadVerify").show();
			 
			_URL_="includes/borders_generator.php?";   
			_obj_ajax.open("GET",_URL_ + _values_send,true);   
			_obj_ajax.onreadystatechange=function() {                 
			if (_obj_ajax.readyState==4) {	
				if(_obj_ajax.status==200){   	
					if (_obj_ajax.responseText!="false"){	
						myLayout.updateStyle();
						saveData();	
						$("loadVerify").hide();
						}
					else{
						error="borders_generator";
						}
					 }
				}
			}  
			_obj_ajax.send(null); 
		  }
		else{
			myLayout.updateStyle();
			saveData();	
			$("loadVerify").hide();
		}
	}
}




//important
var Layout = Class.create();
Layout.prototype = {
 initialize: function(css_selectors, options) {
	 
    this.insertionID = options.insertionID;
    this.frame = $(options.frame);
    this.css_selectors = $H(css_selectors);
    window.onresize = this.onResize.bind(this);
    var self = this;
    this.css_selectors.each(function(keyVal) {
      var name = keyVal[0];
      var inputSrc, inputChange;
      if (keyVal[1].usage == 'boolean') {
        inputSrc = 'checked';
        inputChange = 'click';
     }
      else {
        inputSrc = 'value';
        inputChange = 'change';
     }
      $(name)['on'+inputChange] = function() {
        self.updateStyle(true);
     };
   });
 },
  _generateCSS: function() {
	 var cssCode="";
	 var marginHead="";
 	 var self = this;
	 
	//evaluo condiciones espciales
	
	//condiciones referentes al background
	this.updateLayoutBackImg();
	
	if(appType==1)
	{
		//Condiciones para el center style y los boxes
		if(($("borderImg_center").value!="none")||($("borderImg_boxes").value!="none")){
			
			img_center=img_328b=img_328t=img_435b=img_435t="";
			//parche para uso local y debug
			
			//alert('myLayout.sj - line 405 - appPath: '+appPath);
			
			if(appPath=="http://localhost/mylayouts")
			{
				img_center= appPath + '/imgs/edit/center/'+$("borderImg_center").value+'.png';
				img_328b= appPath + '/imgs/edit/boxes/'+$("borderImg_boxes").value+'_328b.png';
				img_328t= appPath + '/imgs/edit/boxes/'+$("borderImg_boxes").value+'_328t.png';
				img_435b= appPath + '/imgs/edit/boxes/'+$("borderImg_boxes").value+'_435b.png';
				img_435t= appPath + '/imgs/edit/boxes/'+$("borderImg_boxes").value+'_435t.png';
			}
			else
			{
				
				if(opened!="Update")
				{
				
					//controlo si debo poner el center style
					if($("borderImg_center").value!="none"){
						//genero la nueva imagen
						color1=$("backColor_center").value;
						color2=$("borderColor_center").value;
						if(color2=='')
							color2="000000";	
						img_center= appPath + '/includes/bordes.php?color1=' + color1 + '&color2=' + color2 + '&img=' + appPath + '/imgs/edit/center/' + $("borderImg_center").value + '.png';
					}
					//boxes
					opcSel=0;
					color1="666666";
					color2="000000";				
					if($("borderImg_boxes").value!="none")
						opcSel=$("borderImg_boxes").value;
					if($("backColor_boxes").value!='')
						color1=$("backColor_boxes").value;	
					if($("borderColor_boxes2").value!='')
						color2=$("borderColor_boxes2").value;
					img_328b= appPath + '/includes/bordes.php?color1=' + color1 + '&color2=' + color2 + '&img=' + appPath + '/imgs/edit/boxes/' + opcSel + '_328b.png';
					img_328t= appPath + '/includes/bordes.php?color1=' + color1 + '&color2=' + color2 + '&img=' + appPath + '/imgs/edit/boxes/' + opcSel + '_328t.png';
					img_435b= appPath + '/includes/bordes.php?color1=' + color1 + '&color2=' + color2 + '&img=' + appPath + '/imgs/edit/boxes/' + opcSel + '_435b.png';
					img_435t= appPath + '/includes/bordes.php?color1=' + color1 + '&color2=' + color2 + '&img=' + appPath + '/imgs/edit/boxes/' + opcSel + '_435t.png';
				}
				else
				{
				//controlo si debo poner el center style
				if($("borderImg_center").value!="none"){
					img_center= appPath + '/imgs/render_final/c' + $("borderImg_center").value + '_' + sessionId + numRandom + '.png';
				}
				opcSel=0;
				if($("borderImg_boxes").value!="none")
					opcSel=$("borderImg_boxes").value;
				//boxes
				img_328b= appPath + '/imgs/render_final/b328b' + opcSel + '_' + sessionId + numRandom + '.png';
				img_328t= appPath + '/imgs/render_final/b328t' + opcSel + '_' + sessionId + numRandom + '.png';
				img_435b= appPath + '/imgs/render_final/b435b' + opcSel + '_' + sessionId + numRandom + '.png';
				img_435t= appPath + '/imgs/render_final/b435t' + opcSel + '_' + sessionId + numRandom + '.png';
	
				}
			}
		
			cssCode+='.bodyContent table {border-collapse: separate; line-height: auto;} ';
			cssCode+='body * {line-height: 14px;} ';
			cssCode+='body{line-height: 1px;background-color: FFFFFF; color: 000000; background-repeat: no-repeat; background-position: top center;background-image: url("http://www.weebly.com/weebly/render/users/320266/307212425890884//bga.png");background-attachment: fixed;overflow-x: hidden; margin-top: 0px;} ';
			cssCode+='body table div {position: relative; padding-top: 50px; height: 220px; top: -220px; left: 4px; background-repeat: repeat-y;  background-position: top center;  background-image: url("' + img_center + '"); %%CENTERBG%%} ';
			cssCode+='body table div div {background-image: none; position: static; top: 0px; left: 0px; padding-top: 0px; height: auto;} ';
			cssCode+=' body table table div {background-image: none; position: static; top: 0px; left: 0px; padding-top: 0px; height: auto;}'; 
			cssCode+='body div table div {position: static; top: 0px; left: 0px; padding-top: 0px; height: auto;} ';
			cssCode+='p {margin: 0px 0px 1em 0px; color: 000000; !important}a, a:link, a:visited{color: 000000; text-decoration: none;}a:hover{color: 000000; text-decoration: none}img {border: none}br {line-height: 20px;}form{border-width:0px;background-color:none;}input {background-color:transparent !important}body>div {margin-left: 10px;}table, tr, td, table table, table table td {border-width:0px; background-color: transparent;}table table table td{background-color:transparent;margin:0px;padding: 0 26px 15px 26px}table table table table{border-width:0px;background-color:transparent;padding:0px;margin:0px; background-image: none;}table table table table td{padding:0px;margin:0px;}';
			cssCode+='table table table {margin:0px;background-color:' + $("backColor_boxes").value + ';width: 100% !important;border-width: 0px; border-style: solid; border-color: transparent;table-layout: auto;}';
			cssCode+='.friendsComments {table-layout: auto; height: auto;} ';
			cssCode+='.friendsComments table table {width: 435px; height: 300px;} ';
			cssCode+='.friendsComments table, .friendsComments tbody, .friendsComments tr, .friendsComments td {table-layout: auto;height: auto;}';
			cssCode+='body td table, body div table {margin-top: 0;}';
			cssCode+='.nametext {overflow: hidden;height: auto;width: 270px;text-align: left;color: 000000;padding: 0px 0px 3px 15px;display: block;margin: 14px 0px 0px 0px;border-width: 0px;}';
			cssCode+='.profileInfo table {padding: 0 0 10px 0;}';
			cssCode+='.profileInfo br {line-height: 0px;}';
			cssCode+='.profileInfo .nametext {padding-bottom: 0px !important;padding-bottom: 15px;} ';
			cssCode+='.profileInfo table td.text {padding: 0; margin: 0;} ';
			cssCode+='.profileInfo table td.text:last-child {padding-right: 5px;} ';
			cssCode+='.profileInfo table td {padding: 0; margin: 0; position: relative; left: 11px;}';
			cssCode+='.contactTable {width: 328px !important; background-color:' + $("backColor_boxes").value + '; height: 185px;} ';
			cssCode+='.contactTable table {margin-bottom: 10px;} ';
			cssCode+='.contactTable td {padding: 0px;	margin: 0px;		text-align: center;}';
			cssCode+='.contactTable td table {background-color: transparent;}';
			cssCode+='.contactTable a {padding: 0px;	margin: 0px 0px 1px 5px;	display: block;	height: 30px;	width: 136px;	background-color: transparent;}';
			cssCode+='table tr td table tr td table tr td div strong {display: block;	width: 270px;}';
			cssCode+='.blurbs span {display: none;}';
			cssCode+='.blurbs table span {display: block;}';
			cssCode+='.whitetext12{color: 000000; margin: 0px 0px 4px 0px; padding: 0px 0px 6px 15px; text-align: left; display: block; border-width: 0px 0px 0px 0px; border-style: double; border-color: d7c59f; width: 270px} ';
			cssCode+='.userProfileDetail .whitetext12 {padding: 0px 0px 6px 8px;} ';
			cssCode+='.blacktext12{color: 000000; display: block; margin-top: 14px;}';
			cssCode+='.btext{color: 000000;  margin: 14px 0px 4px 0px; padding: 0px 0px 3px 0px; display: block;text-align: left; border-width: 0px 0px 0px 0px; border-style: double; border-color: d7c59f}';
			cssCode+='.orangetext15{color: 000000; margin: 14px 0px 4px 0px; padding: 0px 0px 3px 0px; text-align: left; display: block; border-width: 0px 0px 0px 0px; border-style: double; border-color: d7c59f; width: 372px}';
			cssCode+='.friendSpace td.text table a.redlink {display: inline;} ';
			cssCode+='table tr td table tr td.text table tr td.text table tr td table tr td img {max-width: 225px !important; width: auto !important; width: 225px;} ';
			cssCode+='table tr td table tr td.text table tr td.text table tr td table tr td img.ImgOnlineNow {width: auto;} ';
			cssCode+='table tr td table tr td.text table tr td.text table tr td table tr td a img {width: 90px;} ';
			cssCode+='table table td.text table.friendSpace td.text a img {width: auto;} ';
			cssCode+='table tr td table tr td.text table tr td.text table tr td table tr td object, table tr td table tr td.text table tr td.text table tr td table tr td embed {max-width: 225px !important; max-height: 185px !important; width: auto !important; width: 225px; height: auto !important; height: 185px;} ';
			cssCode+='u {text-decoration: none;}';
			cssCode+='body * {background-repeat: repeat-y;  background-position: top center;  background-image: url("' + img_center + '"); %%CENTERBG%%}body * * {background-image: none;} ';
			cssCode+='body table td {padding: 0 7px 0 0px;} ';
			cssCode+='body table td.text {padding: 0 19px 0 4px;} ';
			cssCode+='body table table table td.text {padding: 0px;}'; 
			cssCode+='body table table td {position: relative; left: 13px;} ';
			cssCode+='body table table table td {position: static;} ';
			cssCode+='body table table td.text {position: static;} ';
			cssCode+='body table table table td {padding: 0;} ';
			cssCode+='table table table.latestBlogEntry {background-color: transparent; ' + $("backColor_boxes").value + ';} ';
			cssCode+='table table table table, table table table.friendSpace table span, table table table.friendsComments table span {background-color: E6E2AF;} ';
			cssCode+='table table table.friendSpace, table table table.blurbs table, table table table.userProfileURL table, table table table.friendSpace table, table table table.friendsComments table {background-color: transparent;} ';
			cssCode+='.userProfileDetail, .userProfileCompany, .profileInfo, .userProfileNetworking, .userProfileSchool, .interestsAndDetails {margin: 0px;  background-color: transparent; background-image: url("' + img_328t + '"); background-repeat: no-repeat; background-position: top left;  width: 100% !important;  color: 000000;  padding: 0px;  width: 328px !important;} ';
			cssCode+='.userProfileDetail table, .userProfileCompany table, .profileInfo table, .userProfileNetworking table, .userProfileSchool table, .interestsAndDetails table {background: transparent url("' + img_328b + '") no-repeat bottom left;  padding-bottom: 15px; padding-top: 10px;  width: 100%;}';
			cssCode+='.userProfileNetworking table td, .userProfileCompany table td {padding: 0 15px 10px 15px;}';
			cssCode+='.profileInfo table a img {margin-left: 15px;}';
			cssCode+='.profileInfo table a {line-height: 40px;}';
			cssCode+='.userProfileDetail table td, .userProfileCompany table td, .interestsAndDetails table td {position: relative; top: -10px; left: 0px; padding: 0 15px;}';
			cssCode+='.userProfileCompany table br {line-height: 15px;}';
			cssCode+='.userProfileCompany table {height: auto !important;  height: 75px;}';
			cssCode+='.userProfileDetail table {height: auto !important;  height: 195px;}';
			cssCode+='.userProfileURL {background: none;}';		
			cssCode+='.blurbs, .friendSpace, .friendsComments {padding: 0;  background: transparent url("' + img_435t + '") no-repeat top left;  overflow: hidden;  width: 435px;}';
			cssCode+='.blurbs td, .friendSpace td, .friendsComments td {background: transparent url("' + img_435b + '") no-repeat bottom left;  padding: 0 15px 15px 15px;}';
			if (($('extendedBackImageNro').value=='0')||($("extendedBackImageNone").checked)){
				cssCode+='.extendedNetwork {padding: 0;  background: transparent url("' + img_435t + '") no-repeat top left;  overflow: hidden;  width: 435px;}';
				cssCode+='.extendedNetwork td {background: transparent url("' + img_435b + '") no-repeat bottom left;  padding: 0 15px 15px 15px;}';
				cssCode+='span.blacktext12 {width: 435px;  height: 74px;}';
				}
			else{
				cssCode+='.extendedNetwork {padding: 0;  background: transparent url("") no-repeat top left;  overflow: hidden;  width: 435px;}';
				cssCode+='.extendedNetwork td {background: transparent url("") no-repeat bottom left;  padding: 0 15px 15px 15px;}';
				}
			cssCode+='.friendSpace td td, .friendsComments td td {background: none;  padding: 0;} ';
			cssCode+='body table table td.text table.friendSpace td, body table table td.text table.friendsComments td {padding: 0 15px 20px 15px;} ';
			cssCode+='body table table td.text table.friendSpace td td, body table table td.text table.friendsComments td td {padding: 0;} ';
			cssCode+='.extendedNetwork span {display: block;}';
			cssCode+='.latestBlogEntry {background-color: ' + $("backColor_boxes").value + ';}';
			cssCode+='.blurbs td td{background: transparent;}';
			cssCode+='.blurbs td.text {display: none;}';
			cssCode+='.blurbs table .text .orangetext15,.blurbs table .text span{display: inline;}';
			cssCode+='.blurbs table br {line-height: 0px;}';
			cssCode+='.blurbs table .text br {line-height: 20px;}';
			cssCode+='body table {margin-top: 0px;position: relative;padding: 0 1px 10px 1px;left: 5px;}body table table table {left: 0px;}';
			cssCode+='body table {position: relative;padding: 0 1px 10px 1px;left: 5px;}body table table table {left: 0px;}';
			cssCode+='.whitetext12{width: auto}';
			cssCode+='.contactTable {width: 100% !important; padding: 0px;}';
			cssCode+='.userProfileDetail, .userProfileCompany, .profileInfo, .userProfileNetworking, .userProfileSchool {width: 335px !important;}';
			cssCode+='.userProfileDetail table, .userProfileCompany table, .profileInfo table, .userProfileNetworking table, .userProfileSchool table, .interestsAndDetails table {padding: 0 15px 15px 15px;}';
			cssCode+='.profileInfo table a img {margin-left: 0;}';
			cssCode+='.profileInfo table a {line-height: 20px;}';
			cssCode+='.orangetext15 {width: auto;}';
			cssCode+='.nametext {height: 35px;width: auto;}';
			cssCode+='.masthead {top: 164; margin-left: -420px;} ';
			cssCode+='.mastbottom {bottom: 164; margin-left: -420px;} ';
			cssCode+='body table td {padding: 0 13px 0 0px;}body table td:first-child {padding: 0 0px 0 0px;}';
			cssCode+='.blurbs table tr td,.extendedNetwork table tr td, .friendSpace table tr td, .friendsComments table tr td {padding: 0 15px 15px 15px;}';
			cssCode+='.blurbs table tr td td,.extendedNetwork table tr td td, .friendSpace table tr td td, .friendsComments table tr td td {padding: 0 0px;}table table table td{padding: 0;} ';
			cssCode+='body table table td.text table {position: relative; left: -17px;} ';
			cssCode+='body table table td.text table table {position: static;} ';
			cssCode+='body table table {position: relative; left: 20px;} ';
			cssCode+='body table table table {position: static;} ';
			cssCode+='body table div {left: 0px;} ';
			cssCode+='body>table table td.text table.friendsComments td.text>table:last-child>tbody>tr:last-child a {display: block; text-align: left; margin-left: 320px;} ';
			cssCode+='table table table.latestBlogEntry {background-color: ' + $("backColor_boxes").value + ';} ';
			cssCode+='table table table table, table table table.friendSpace table span, table table table.friendsComments table span {background-color: transparent;}';
			
		}
		
		//opciones que afectan a los boxes
		if(($('backColor_boxes').value!='')||($('borderColor_boxes').value!='')||($('borderOpc_boxes').value!='none')||($('borderSize_boxes').value!='1')){
			cssCode+="table,tr,td{background-color: transparent;border-style: none;}  ";
			cssCode+="table table table{background-color: transparent;border-style: none;}  ";
			cssCode+="table table,table table table table,table table table td{background: transparent;border-style: none;} ";
			
			if(($("borderImg_boxes").value=="none")&&($("borderImg_center").value=="none")){
				if($("backColor_boxes").value!="")
					cssCode+="table table table{background-color: "+$("backColor_boxes").value+"} ";
				}
			if($("borderImg_boxes").value=="none"){
				if($("borderOpc_boxes").value!="none")
					cssCode+= "table table table{border-style: "+$("borderOpc_boxes").value+";}"
				if($("borderSize_boxes").value!="1")
					cssCode+="table table table{border-width:"+$("borderSize_boxes").value+"px !important;} "			
				if($("borderColor_boxes").value!="")
					cssCode+="table table table{border-color:"+$("borderColor_boxes").value+" !important;}";
				else
					if($("borderOpc_boxes").value!="none")
						cssCode+="table table table{border-color:000000 !important;}";
				}
				
				
		}
	}
	
	if(appType==2)
	{
		//Coriijo bugs (hi5)
		cssCode='body{background-image:none;}#user-details{border:none;}';
	}
	
	
	this.css_selectors.each(function(keyVal) {
	 if($(keyVal[1]).default_val!=$(keyVal[0]).value){
      var rules = keyVal[1];
      if (rules.func) {
        cssCode += Layout.prototype[rules.func].call(self, keyVal[0].value);
     }
      else if (rules.usage == 'boolean') {
        if ($(keyVal[0]).checked) {
          cssCode += rules.css;
       }
     }
      else if (rules.usage == 'replace') {
        var selectorValue = $(keyVal[0]).value;
        if (rules[selectorValue] != null) {
          cssCode += rules[selectorValue];
       }
        else {
          cssCode += rules.css.gsub('@arg@', selectorValue);
       }
     }
	}
   });

	if(appType==1)
	{
		if($("themeId").value!="")
			marginHead = '.navigationBar table{margin-bottom:200px;} ';
	
		imgTopLeft = '';
		
		
		/*if(opened!="Update") //codigo del preview
		{
			$('cssCode').value=$('cssTheme').value+"<style>"+marginHead+cssCode+'</style>';			
		}
		else //codigo final para copiar
		*/
			$('cssCode').value=$('cssTheme').value+"<style>"+marginHead+'</style><span style="display:none">MYRAWR.COM</span><style>'+cssCode+'</style>'+imgTopLeft;			
			
		return marginHead+cssCode;
	}
	else{
		
		$('cssCode').value=cssCode;
		return cssCode;
	}
 },
  updateStyle: function(warnSafari) {
	if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
      if (warnSafari) {
        alert('On Safari browser, Step 3 options do not show up in this preview but will take place in your final layout.');
     }
   }
    else {
    	
      var styleElt = this._getStyleElt();
      var cssText = this._generateCSS();
	  if (styleElt.styleSheet) {
      	styleElt.styleSheet.cssText = cssText;
     }
      else {
        styleElt.innerHTML = cssText;
     }
   }
	$('wait').hide();
 },
  updateLayoutBackImg: function(){
    var _value;
	_value="body {";	
	if ($('backImageUrl').value!="")
		_value+="background-image:url(" + $('backImageUrl').value + ");";
	_value+="background-position: "+ $('backPosition').value+" center;";
	_value+="background-repeat: "+ $('backRepeat').value+";";
	if($('backFixed').checked)
		_value+=" background-attachment:fixed;";
	_value+="} ";
	if($("backImageNone").checked){
		_value="body {background-image:none;} ";
		}
	$('backImage').value=_value;
	return _value;
 },
  onResize: function() {
    if (this.usingDiv) {this.updateBackgroundPosition();}
 },
  _getStyleElt: function() {
  	return this._getPreviewElt(this.insertionID);
 },
  _getPreviewElt: function(id) {
    var frameDoc = this.frame.contentWindow.document;
    return frameDoc.getElementById(id);
 } 
};

//****************************************OTHER FUNCTIONS & CLASSES
//****************************************
function Util() {
  throw new Error("Util is a static class. You can't create instances of it.");
}

Util.windowSize = function() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
 } else if( document.documentElement &&
    ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
 } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
 }
  return {width: myWidth, height: myHeight};
};

Util.createElement = function(doc,tagName) {
  var newElt = doc.createElement(tagName);
  if (typeof(newElt) != 'object') {newElt = doc.standardCreateElement(tagName);}
  return newElt;
};
  
/**
 * Given an HTMLElement, return the HTMLDocument it belongs to
 */
Util.getEltDoc = function(anElt) {
  if (anElt.ownerDocument) {return anElt.ownerDocument;}
  if (anElt.document) {return anElt.document;}
  return document;
};

/**
 * This method calls document.createElement() to create a new element, and 
 * then initialized the new element with the values provided by the caller.
 *
 * @scope    public class method
 * @param    tagName    The HTML tag for the element ("div", "p", "span", etc.). 
 * @param    cssClassName    Optional. The HTML/CSS class to assign to the new element. 
 * @param    attributesInJson    Optional. A JSON object with additional attributes to set on the new element. 
 * @param    text    Optional. A text string to put in a text node within the new element. 
 * @return   The newly created HTML element.
 */
Util.newElement = function(tagName, cssClassName, attributesInJson, text, style, doc) {

  if (!doc) {doc = document;}
  var newElement = Util.createElement(doc,tagName);
  if (cssClassName) {
    newElement.className = cssClassName;
 }
  if (attributesInJson) {
    for (var key in attributesInJson) {
      if (key == 'id') {
        newElement.id = attributesInJson[key];
     } else {
        if (key == 'jfor') {
          newElement.setAttribute('for', attributesInJson[key]);
       }
        else {
          newElement.setAttribute(key, attributesInJson[key]);
       }
     }
   }
 }
  if (style) {
      for (key in style) {
        if (key == 'cssFloat' && Util.isIE()) {
          newElement.style['styleFloat'] = style[key];
       }
        else {
          newElement.style[key] = style[key];
       }
     }
 }    
  if (text) {
    newElement.appendChild(doc.createTextNode(text));
 }
  return newElement;
};


/**
 * Given an HTML element, we first call document.createElement() to 
 * create a new element, and then call appendChild() to add the new 
 * element to the given element.
 *
 * Example:
 * <pre>
 * var menuUrl = "http://en.wikipedia.org/";
 * var menuText = "Wikipedia";
 * var menuItem = Util.appendNewElement(mainMenu, "li", NavbarView.CSS_CLASS_MENU_ITEM);
 * var link = Util.appendNewElement(menuItem, "a", null, {href: menuUrl}, menuText);
 * </pre>
 *
 * @scope    public class method
 * @param    parentElement    The existing element that we should append the new element to. 
 * @param    tagName    The HTML tag for the element ("div", "p", "span", etc.). 
 * @param    cssClassName    Optional. The HTML/CSS class to assign to the new element. 
 * @param    attributesInJson    Optional. A JSON object with additional attributes to set on the new element. 
 * @param    text    Optional. A text string to put in a text node within the new element. 
 * @return   The newly created HTML element.
 */
Util.appendNewElement = function(parentElement, tagName, cssClassName, attributesInJson, text,style) {
  var doc = Util.getEltDoc(parentElement);
  var newElement = Util.newElement(tagName, cssClassName, attributesInJson, text,style,doc);
  parentElement.appendChild(newElement);
  return newElement;
};


/**
 * Given an HTML element, we first call document.createTextNode() to 
 * create a new text node, and then call appendChild() to add the new 
 * text node to the given element.
 *
 * @scope    public class method
 * @param    parentElement    The existing element that we should append the new element to. 
 * @param    textString    The text string to put in the text node.
 * @return   The newly created text node.
 */
Util.appendNewTextNode = function(parentElement, textString) {

  var doc = Util.getEltDoc(parentElement);
  var newTextNode = doc.createTextNode(textString);
  parentElement.appendChild(newTextNode);
  return newTextNode;
};

Util.blankString = function(str) {
  return !(str && !str.match(/^\s*$/));
};

function appendScript(url) {
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.charset = "utf-8";
  script.src = url;
  script.type = 'text/javascript';
  head.appendChild(script);
}

var ImagePicker = Class.create();
ImagePicker.prototype = {
  initialize: function(options) {
    options = Object.extend({
      selectedClass: 'selected',
      searchField: 'image_keywords',
      defaultEngine: 'yahoo'
   }, options || {});
    this.pickerDiv = $(options.pickerDiv);
    this.spinner = $(options.spinner);
    this.selectedClass = options.selectedClass;
    this.currentEngine = options.defaultEngine;
    this.searchField = $(options.searchField);
    this.setupEngineLinks();
   // $('image_preview').onclick = this.previewUrl.bindAsEventListener(this);
    //this.setupFreeLinks();
    //if (Prototype.Browser.WebKit) {$('upload_form').hide();}
 },
 /* setupFreeLinks: function() {
    var freeLinks = $$('#free_images a');
    var freeImages = $$('#free_images img');
    freeLinks.each(function(link, index) {
      var image = freeImages[Math.floor(index/2)];
      var fullSrc = image.src.sub('_thumb','');
      var imgInfo = new ImageInfo('free image',fullSrc);
      imgInfo.keywords = image.title;
      link.onclick = function() {le.setBackgroundForCheck(imgInfo);};
   });
 },*/
  setupEngineLinks: function() {
    var self = this;
    $H(ImageSearcher.engines).keys().each(function(engine) {
      self.setAnEngineLink(engine);
   });
 },
  setAnEngineLink: function(engineStr) {
    var elt = $('more_'+engineStr);
    var self = this;
    if (this.currentEngine == engineStr) {
      elt.onclick = null;
      Element.addClassName(elt, 'current');
   }
    else {
      elt.onclick = function() {self.selectNewEngine(engineStr, true);};
      Element.removeClassName(elt, 'current');
   }
 },
  selectNewEngine: function(engineStr, search) {
    if (engineStr != this.currentEngine) {
      Element.removeClassName(this.searchField, this.currentEngine);
      this.currentEngine = engineStr;
      Element.addClassName(this.searchField, this.currentEngine);
      this.setupEngineLinks();
      if (search) {this.search();}
   }
 },
    
  search: function(options) {
    options = Object.extend({
      engine: this.currentEngine,
      keywords: this.searchField.value
   }, options || {});

    Element.hide('more_image_results');
    Element.hide('previous_image_results');
    
    if (Util.blankString(options.keywords)) {return;}
    this.searchField.value = options.keywords;
    this.selectNewEngine(options.engine);
    Element.show(this.spinner);
    this.imageSearcher = new ImageSearcher(this, options);
 },
  
  update: function(images, options) {
    Element.hide(this.spinner);
    if (images.length > 0) {
      this.pickerDiv.innerHTML = '';
      var pickerDiv = this.pickerDiv;
      this.images = images;
      var self = this;
      images.each(function(imageInfo) {
        var thumbDiv = Util.appendNewElement(pickerDiv,'div','thumb');
        var link = Util.appendNewElement(thumbDiv,'a', null, {href:'javascript:void(0)'});
        var img = imageInfo.getThumbImage(96,96);
        imageInfo.keywords = options.keywords;
        img.onclick = function() {self.selectImage(this);};
        link.appendChild(img);
     });
      var moreLink = $('more_image_results');
      var newOptions = {keywords: options.keywords, page: options.page+1};
      moreLink.onclick = function() {self.search(newOptions);};
      Element.show('more_image_results');      
	  var backLink = $('previous_image_results');
	  var backOptions = {keywords: options.keywords, page: options.page-1};
	  backLink.onclick = function() {self.search(backOptions);};
	  if(options.page>1)
	      Element.show('previous_image_results');
	  else
	  	 Element.hide('previous_image_results');
   }
    else {
      this.pickerDiv.innerHTML = 'Sorry, no results found!';
   }
 },
  
  selectImage: function(image) {
    if (this.selectedImage == image) {return;}
    if (this.selectedImage && this.selectedImage.parentNode) {
      Element.removeClassName(this.selectedImage.parentNode, this.selectedClass);
   }
    if (image && image.parentNode) {
      Element.addClassName(image.parentNode, this.selectedClass);
   }
    this.selectedImage = image;
    $('backImageUrl').value = image.imgInfo.url;
	updateLayoutsBackUrl(image.imgInfo.url);
    //le.setBackgroundForCheck(image.imgInfo);
 },
  previewUrl: function() {
    var imgInfo = new ImageInfo('submitted url',$('backImageUrl').value);
	alert("2"+imgInfo);
    //le.setBackgroundForCheck(imgInfo);
 },
  updateErr: function(msg) {
    alert(msg);
 }
};

var ImageSearcher = Class.create();
ImageSearcher.engines = {
  yahoo: {
    baseURL: 'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=GArrmr_V34EaZ_IRTfXQlloNngp2Bd1K4KA3o5e5reuMT.Xbs8GTxyXS_kbDVQ--&output=json&results=8&callback=ImageSearcher.updateFunc&query=',
    updateFunc: function(results) {
      var images = [];
      results.ResultSet.Result.each(function(result) {
       // if (result.Width >= 300 && result.Height >= 225) {
          imgInfo = new ImageInfo(result.Title, result.Url, result.Thumbnail.Url,
             result.Width, result.Height, result.Thumbnail.Width, result.Thumbnail.Height);
          imgInfo.engine = 'Yahoo';
          imgInfo.creditsLink = result.RefererUrl;
          images.push(imgInfo);
        //}
     });
      this.picker.update(images, this.options);
   },
    pageParameter: function(page) {
      return 'start=' +((page-1)*8+1); // extra parens needed, otherwise will be casted as string
   }
 },
  flickr: {
   	baseURL: 'http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=0384128911b7cc5aab30e07584a307b9&per_page=8&sort=interestingness-desc&format=json&jsoncallback=ImageSearcher.updateFunc&license=4,5,6&text=',
    updateFunc:  function(results) {
      var errMsg = null;
        try {
          if (results.stat == 'ok') {
            var images = [];
            results.photos.photo.each(function(photo) {
              var imgUrl = 'http://farm' + photo.farm + 
                '.static.flickr.com/'+photo.server+'/'+photo.id+'_'+photo.secret+'.jpg';
              var thumbUrl = 'http://farm' + photo.farm + 
                '.static.flickr.com/'+photo.server+'/'+photo.id+'_'+photo.secret+'_s.jpg';
              var imgInfo = new ImageInfo(photo.title, imgUrl, thumbUrl, 1024, 768, 75, 75);
              imgInfo.engine = 'flickr';
              imgInfo.creditsLink = 'http://flickr.com/photos/' + photo.owner + '/' + photo.id;
              images.push(imgInfo);
           });
            this.picker.update(images, this.options);
         }
          else {
            errMsg = results.message;
         }
       }
        catch (e) {
          errMsg = e;
          throw e;
       }
        if (errMsg) {this.picker.updateErr(errMsg);}
   },
    pageParameter: function(page) {
      return 'page='+page;
   }
 },
  google: {
    baseURL: 'images/myflyproxy.php?keywords=',
    updateFunc: function(returnObj) {
      var images = [];
      returnObj.results.each(function(result) {
        //if (result.imageWidth >= 300 && result.imageHeight >= 225) {
          imgInfo = new ImageInfo(result.displayUrl, result.imageUrl, result.thumbnailUrl,
            result.imageWidth, result.imageHeight, result.thumbnailWidth, result.thumbnailHeight);
          imgInfo.creditsLink = result.url;
          imgInfo.engine = 'Google';
          images.push(imgInfo);
       //}
     });
      this.picker.update(images, this.options);
   },
    pageParameter: function(page) {
      return 'start=' +((page-1)*8+1); // extra parens needed, otherwise will be casted as string

   },
    fetchImages: function(imgSearcher) {
      if (imgSearcher.options.page > 1) {return false;} //use proxy
      var gSearch = new GimageSearch();
      gSearch.setResultSetSize(GSearch.LARGE_RESULTSET);
      gSearch.setSearchCompleteCallback(this, this.updateFunc2, [gSearch, imgSearcher]);
	  gSearch.execute(imgSearcher.options.keywords);	  
      return true;
   },
    updateFunc2: function(gSearch, imgSearcher) {
      var images = [];
      gSearch.results.each(function(result) {
        //if (result.width >= 300 && result.height >= 225) {
          imgInfo = new ImageInfo(result.visibleUrl, result.unescapedUrl, result.tbUrl,
            result.width, result.height, result.tbWidth, result.tbHeight);
          imgInfo.creditsLink = result.originalContextUrl;
          imgInfo.engine = 'Google';
          images.push(imgInfo);
       //}
     });
      imgSearcher.picker.update(images, imgSearcher.options);
   }
 }
};

ImageSearcher.prototype = {	
  initialize: function (picker, options) {
    this.picker = picker;
    options = Object.extend({
      engine: 'yahoo',
      page: 1
   }, options || {});
    this.options = options;
    var engineObj = ImageSearcher.engines[options.engine];
	if (!(engineObj.fetchImages && engineObj.fetchImages(this))) {
      ImageSearcher.updateFunc = engineObj.updateFunc.bind(this);
      var searchURL = engineObj.baseURL + encodeURIComponent(options.keywords); 
      if  (options.page) {searchURL += '&'+engineObj.pageParameter(options.page);}
	 setTimeout(function() {appendScript(searchURL);}, 8); //ie6 does not like appendscript from link onclick
   }
 }
} ;

var ImageInfo = Class.create();
ImageInfo.prototype = {
  initialize: function(title, url, thumbUrl, width, height, thumbWidth, thumbHeight, backgroundID, keywords) {
    this.title = title;
    this.url = url;
    this.thumbUrl = thumbUrl;
    this.width = width;
    this.height = height;
    this.thumbWidth = thumbWidth;
    this.thumbHeight = thumbHeight;
    this.backgroundID = backgroundID;
    this.keywords = keywords;
 },
  getThumbImage: function(idealWidth, idealHeight) {
    //var img = new Image();
    var img = Util.newElement('img');
    img.title = this.title + ': ' + this.width + 'x' + this.height;
    img.imgInfo = this;
    // if at first you don't succeed, try, try again!
    img.errFunc = function() {this.src = this.imgInfo.thumbUrl;};
    img.onerror = function() {setTimeout(img.errFunc.bind(img), Math.floor(Math.random()*100+1));};
    img.src = this.thumbUrl;
    if (this.thumbWidth && this.thumbHeight) {
      this.setThumbImageDimensions(img, idealWidth, idealHeight);
   }
    else {
      var self = this;
      img.onload = function() {
        self.thumbHeight = this.height;
        self.thumbWidth = this.width;
        self.setThumbImageDimensions(this, idealWidth, idealHeight);
     };
   }
    return img;
 },
  getKeywords: function() {
    if (this.keywords) {
      return this.keywords.gsub(/\./,' ').strip().gsub(/\s+/,' ').toLowerCase();
   }
    else {return '';}
 },
  setThumbImageDimensions: function(img, idealWidth, idealHeight) {
    if (this.thumbWidth/idealWidth < this.thumbHeight/idealHeight) {
      img.width = idealWidth;
      img.height = this.thumbHeight*idealWidth/this.thumbWidth;
      var offset = (img.height-idealHeight)/2;
      img.style.marginTop = -offset + 'px';
      img.style.marginLeft = '0px';
      img.style.clip = 'rect(' + offset + 'px, ' + idealWidth + 'px, ' + (offset+idealHeight) + 'px, 0px)';
   }
    else {
      img.height = idealHeight;
      img.width = this.thumbWidth*idealHeight/this.thumbHeight;
      var offset = (img.width-idealWidth)/2;
      img.style.marginTop = '0px';
      img.style.marginLeft = -offset+'px';
      img.style.clip = 'rect(0px, ' + (offset+idealWidth) + 'px, ' + idealHeight + 'px, ' + offset + 'px)';
   }
    img.style.width = img.width + 'px';
    img.style.height = img.height + 'px';
    //img.style.position = 'absolute';
 },
  getEngineLabel: function() {
    var label = this.engine || '';
    if (this.engine) {
      if (this.engine == 'flickr') {label += ' user';}
      else {label += ' search result';}
   }
    return label;
 },
  getCreditsHTML: function() {
    var html = '';
    if (this.creditsLink && this.engine) {
      html += 'background from <a href="'+this.creditsLink+'" target="_blank">' + this.getEngineLabel() + '</a>';
   }
    return html;
 },
  getFormParameters: function() {
    var parms =  'background[original_url]=' + encodeURIComponent(this.url);
    if (this.engine) {parms += '&background[engine]=' + this.engine;}
    if (this.creditsLink) {parms += '&background[credits_link]=' + encodeURIComponent(this.creditsLink);}
    return parms;
 }
};





//-----interface.js-----


Event.observe(window, 'load', initializeInterface, false);
Event.observe(window, 'load', loadAccordions, false);

//****************************************MENU
//****************************************
function initializeInterface(){		
	//creo los picker de colores
	new Control.ColorPicker('backColor', {onUpdate: $('backColor').onchange});
	new Control.ColorPicker("color_content", {onUpdate: $('color_content').onchange});
	new Control.ColorPicker("color_title", {onUpdate: $('color_title').onchange});
	new Control.ColorPicker("color_links", {onUpdate: $('color_links').onchange});
	new Control.ColorPicker("borderColor_boxes", {onUpdate: $('borderColor_boxes').onchange});
	new Control.ColorPicker("backColor_boxes", {onUpdate: $('backColor_boxes').onchange});
	switch(appType){
		case 1:{
			new Control.ColorPicker("backColor_center", {onUpdate: $('backColor_center').onchange});
			new Control.ColorPicker("borderColor_center", {onUpdate: $('borderColor_center').onchange});
			new Control.ColorPicker("borderColor_boxes2", {onUpdate: $('borderColor_boxes2').onchange});
			break;}
		case 2:{
			new Control.ColorPicker("backColor_center", {onUpdate: $('backColor_center').onchange});
			new Control.ColorPicker("borderColor_center", {onUpdate: $('borderColor_center').onchange});
			break;}
		case 3:{
			new Control.ColorPicker("headersColor_center", {onUpdate: $('headersColor_center').onchange});
			new Control.ColorPicker("btnColor_center", {onUpdate: $('btnColor_center').onchange});
			new Control.ColorPicker("btnOverColor_center", {onUpdate: $('btnOverColor_center').onchange});
			break;}
	}
	//inicializo los tabs
	viewInTab(1,'backgroundImages_page');
	viewInTab(2,'fontTitle');
	if(appType==1){		
		viewInTab(0,'allThemes');
		viewInTab(3,'bordesCss_boxes');
		viewInTab(4,'backboxes');   	
	}
	
	if(appType!=3){
		//configuro el slider de transparencia
		var el = document.getElementById("transparentia");
		el.onDragStart = function() {
			in_elem = document.getElementById('transparentiain').className = "move2ondrag";
			in_elem = document.getElementById('transparentia').className = "sliderondrag";
		}
		el.onDrag = function() {
			var value_elem = document.getElementById('transparentia_value');	
		};
		el.onDragStop = function() {
			in_elem = document.getElementById('transparentiain').className = "move2";
			in_elem = document.getElementById('transparentia').className = "slider";
			valor=Math.round(Number(this.value));
			if(valor>0)
				$('moreTransparency').value= 100-(valor/2);
			else
				$('moreTransparency').value= 0;
			myLayout.updateStyle();
		}
		form_slider(el, '100');
	}
	
	//configuro el drag de los paneles
	new Draggable('panelThemesOpts',{revert:false,handle: 'topThemesOpts', starteffect:false,reverteffect:false,endeffect:false});
	new Draggable('panelPagesOpts',{revert:false,handle: 'topPagesOpts', starteffect:false,reverteffect:false,endeffect:false});
	new Draggable('panelBoxesOpts',{revert:false,handle: 'topBoxesOpts', starteffect:false,reverteffect:false,endeffect:false});
	new Draggable('panelUpdateOpts',{revert:false,handle: 'topUpdateOpts', starteffect:false,reverteffect:false,endeffect:false});
	
	$('wait').hide();
}

//****************************************MENU
//****************************************
function myCallBackOnFinishUp(obj){
	  $('btnFormDown').show();
	  $('btnFormUp').hide();
}

function myCallBackOnFinishDown(obj){
 	  $('btnFormDown').hide();
	  $('btnFormUp').show();
}

function formUp(){
	if(opened!=""){
		new Effect.BlindUp($("panel" + opened + "Opts"));
		$('btn'+opened).removeClassName('btn'+opened+'Sel');
		opened="";
		}
	new Effect.SlideUp($('back_menu'),{afterFinish:myCallBackOnFinishUp});
	new Effect.Appear($('back_customize'));
	id=setInterval('Effect.Pulsate(\'btnCustomize\')',15000);
}

function formDown(){
	new Effect.Fade($('back_customize'));
	clearInterval(id);	
	new Effect.SlideDown($('back_menu'),{afterFinish:myCallBackOnFinishDown});	
}
	
//****************************************ACCORDION 
//****************************************
var themesAccordion;
var pageAccordion;
var boxesAccordion;
var updateAccordion;
var opened="";	
var tabOpened= new Array("","","","","");
var numRandom;
var loadThemes=true;
var loadUserLayouts=true;
var loadRecents=true;
var loadBacks=true;
var loadBacksContact=true;
var loadBacksExtended=true;
//variables para las cookies del background
varBacks=Array('backImageCategory','searchBackKeyword','image_keywords','backImageUrl','backImageNone','backFixed','backPosition','backRepeat','backColor','backImageCategoryId','themeId','themeName','profileId','profileName','profileType');
//varBacks=Array('backImageCategory','searchBackKeyword','image_keywords','backImageUrl','backImageNone','backFixed','backPosition','backRepeat','backColor');



function loadAccordions() {
	themesAccordion = new accordion('panelThemesOpts', {
		classNames : {
			toggle : 'titleSection',
			toggleActive : 'titleSection_active',
			content : 'contentSection'
		},
		defaultSize : {
			width : 351
		}
	});	
	
	  pagesAccordion = new accordion('panelPagesOpts', {
		classNames : {
			toggle : 'titleSection2',
			toggleActive : 'titleSection_active2',
			content : 'contentSection2'
		},
		defaultSize : {
			width : 351
		}
	});
	
	  boxesAccordion = new accordion('panelBoxesOpts', {
		classNames : {
			toggle : 'titleSection3',
			toggleActive : 'titleSection_active3',
			content : 'contentSection3'
		},
		defaultSize : {
			width : 351
		}
	});
	
	 updateAccordion = new accordion('panelUpdateOpts', {
		classNames : {
			toggle : 'titleSection4',
			toggleActive : 'titleSection_active4',
			content : 'contentSection4'
		},
		defaultSize : {
			width : 351
		}
	});
	themesAccordion.activate($$('#panelThemesOpts .titleSection')[0]);
	pagesAccordion.activate($$('#panelPagesOpts .titleSection2')[0]);
	boxesAccordion.activate($$('#panelBoxesOpts .titleSection3')[0]);
	updateAccordion.activate($$('#panelUpdateOpts .titleSection4')[0]);	
}


//****************************************PANELS & TABS 
//****************************************

function closePanel() {
	if(opened!=""){
		new Effect.BlindUp($("panel" + opened + "Opts"));
		$('btn'+opened).removeClassName('btn'+opened+'Sel');
	}
	opened = '';
}

function showPanel(opt){
	if(opened!=opt){
		if(opened!=""){			
			new Effect.BlindUp($("panel" + opened + "Opts"));
			$('btn'+opened).removeClassName('btn'+opened+'Sel');			
		}
		if(opt=="Update")
			showVerify();
		opened=opt;
		new Effect.BlindDown($("panel" + opened + "Opts"),{afterFinish:myCallBackOnFinishShowPanel});
		$('btn'+opened).addClassName('btn'+opened+'Sel');
		//carga de thumbnails segun el itemn seleccionado
		switch(opened){
			case "Themes":
			{
				if (appType==1)
				{
					if(loadThemes)
					{
						loadThumbThemes(-1,"",1);	
						loadThemes=false;
					}
				}
				else
				{
					if(loadUserLayouts)
					{
						loadThumbUserLayouts(-1,"",1);	
						loadUserLayouts=false;
					}
				}
				break;
			}
			case "Pages":{
				if(loadBacks){
					loadThumbImages(-1,-1,"Layouts",1)
					loadBacks=false;
					}					
				break;}
		}
	}
}

function myCallBackOnFinishShowPanel(){
}

function viewInTab(navList, opt )
{
	//alert('opt: '+opt);
	
	if(tabOpened[navList]!=opt)
		if(tabOpened[navList]!="")
		{
			$('links'+ navList + "_" + tabOpened[navList]).removeClassName('tabSelected');
			$(tabOpened[navList]).hide();
		}
	tabOpened[navList]=opt;	
	$(tabOpened[navList]).show();
	$('links'+ navList + "_" + tabOpened[navList]).addClassName('tabSelected');

	//carga de thumbnails segun el itemn seleccionado
	switch(opt)
	{
		case "userLayouts":
		{
			if(loadUserLayouts)
			{

				loadThumbUserLayouts(-1,"",1);	
				loadUserLayouts=false;
			}
			break;
		}
		case "recentLayouts":
		{
			if(loadRecents)
			{
				loadThumbUserLayouts(-1,"",1);	
				loadUserLayouts=false;
			}
			break;
		}
		case "backContactTb":
		{
			if(loadBacksContact)
			{
				loadContactTables(2685,-1,"Contact",1)
				loadBacksContact=false;
			}					
			break;
		}
		case "backExtended":
		{
			if(loadBacksExtended)
			{
				loadThumbImages(2681,-1,"Extended",1)
				loadBacksExtended=false;
			}
			break;
		}
		case "uploadBackground_page":
		{
			$("errorUpload").innerHTML="&nbsp;";
			$("errorUpload").hide();
			$("upload_file").value="";
			break;
		}
	}
}

//******************************************BACKGROUND IMAGE UPLOAD
//******************************************
function checkUpload(){
	 $("errorUpload").innerHTML="&nbsp;";
	 $("errorUpload").hide();
	 if($("upload_file").value==""){
		  $("errorUpload").innerHTML="Must select a file";
		  $("errorUpload").show();
		 return false;
		 }
	fileType=extension($("upload_file").value);
	 if((fileType!=".gif")&&(fileType!=".jpg")&&(fileType!=".png")){
		  $("errorUpload").innerHTML="Only jpg, png or gif files";
		  $("errorUpload").show();
		 return false;
		 }
	 $('btnUpload').hide();
	 $('wait').show();
	 $("upload_form").submit();
}

function resUpload(resu)
{
		
	$('btnUpload').show();
	$('wait').hide();
	if(resu=="false")
	{
		$("errorUpload").innerHTML="Unknown error in upload";
		$("errorUpload").show();
	}
	else
	{
		$('backImageUrl').value=resu;
		$('backImage').value="body {background-image:url(" + $('backImageUrl').value + ");  ";
		$("backImageNone").checked=false;
		$('themeName').value="";
		$('backImageCategory').value="";
		$('backImageCategoryId').value="";
		$('searchBackKeyword').value="";
		myLayout.updateStyle();
	}
}

//******************************************UPDATE YOUR PROFILE
//******************************************
function verifyName(checkName){
	if((checkName==1)&&($('myName').value=="")){
		$('errorVerify').innerHTML="You must enter your Name";	
		return;
	}
    if ($('categories_drop').value == '-1') {
        $('errorVerify').innerHTML="You must Choose a category";	
		return;
    }
	if(checkName==0)
		$('myName').value="";
		
	$('errorVerify').innerHTML="";
	
	if(appType==1)
	{
		saveBordersImgs();
	}
	else{
		saveData();	
		$("loadVerify").hide();
		}
}

function saveData(){
	//creamos el objeto     
	 _obj_ajax=obj_ajax(); 
	 
	for(i=0,sep="",jsVars="";i<varNames.length;i++){
		//pregunto si es un checkbox (no encontre la funcion prototype que hace eso)
		if($(varNames[i]).value=="true"){
			if($(varNames[i]).checked)
				jsVars+=sep + varNames[i] + "=true";
			else
				jsVars+=sep + varNames[i] + "=false";
		}
		else
		 jsVars+=sep + varNames[i] + "=" + $(varNames[i]).value;
		
		sep="|";
	 }
	 
   _values_send="myName="+$("myName").value+"&ctgid=" + $('categories_drop').value + "&jsVars="+jsVars+"&cssCode="+$("cssCode").value+"&appType="+appType;  
   if($("profileType").value==appType)
		_values_send+="&profileId="+$("profileId").value;
 
	 _URL_="saveData.php?";     
	 _obj_ajax.open("POST",_URL_,true); 
	 _obj_ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	_obj_ajax.onreadystatechange=function() {                 
	 if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){		
				var userLayoutId=_obj_ajax.responseText;
				
				//alert('id: '+userLayoutId);
				
				getCode(userLayoutId);
			 }
		}
	 }  
	_obj_ajax.send(_values_send); 
}

function getCode(userLayoutId){
	//creamos el objeto     
	 _obj_ajax=obj_ajax(); 
	 _values_send="userLayoutId="+userLayoutId;  
	 _URL_="getCode.php?";     
	 _obj_ajax.open("POST",_URL_,true); 
	 _obj_ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	_obj_ajax.onreadystatechange=function() {                 
	 if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){
			$('userLayoutId').value = userLayoutId;
			/*TB_show("Get your code","showCode.php?TB_iframe=true&height=300&width=400"); 
			new Effect.BlindUp($("panel" + opened + "Opts"));
			$('btn'+opened).removeClassName('btn'+opened+'Sel');
			opened="";*/
			window.location = 'moveToInfo.php'; //this is OK
			 }
		}
	 }  
	_obj_ajax.send(_values_send); 
}

function showVerify(){
	$('btnVerify').show();
	$('verifyUrl').show();
	$('manualInstall').hide();
	$('autoInstall').hide();
	}
	
function showManual(){
	$('verifyUrl').hide();
	$('autoInstall').hide();
	$('manualInstall').show();
	}

function showAuto()
{
	$('verifyUrl').hide();
	$('autoInstall').hide();
	$('manualInstall').show();
}

//****************************************THUBNAILS
//****************************************
function loadThumbImages(categoryId,sCategoryId,type,page){
	//creamos el objeto     
	 _obj_ajax=obj_ajax();   
	 
	 _values_send="categoryId=" + categoryId + "&sCategoryId=" + sCategoryId + "&page=" + page + "&type=" + type;  	 
	 _URL_="load_images.php?";   
	 _obj_ajax.open("GET",_URL_ + _values_send,true);   
	 
	 _obj_ajax.onreadystatechange=function() {                 
	if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){   	
			  if (_obj_ajax.responseText!="false"){
			  	$("thumbs"+type).innerHTML=_obj_ajax.responseText;
				}
			else{
				error="loadThumbImages";
				}
			 }
		}
	 }  
 	_obj_ajax.send(null); 
	}
	
function loadContactTables(categoryId,sCategoryId,type,page){
	//creamos el objeto     
	 _obj_ajax=obj_ajax();   
	 
	 _values_send="categoryId=" + categoryId + "&sCategoryId=" + sCategoryId + "&page=" + page + "&type=" + type;  	 
	 _URL_="load_images.php?";   
	 _obj_ajax.open("GET",_URL_ + _values_send,true);   
	 
	 _obj_ajax.onreadystatechange=function() {                 
	if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){   	
			  if (_obj_ajax.responseText!="false"){
			  	$("thumbs"+type).innerHTML=_obj_ajax.responseText;
				}
			else{
				error="loadThumbImages";
				}
			 }
		}
	 }  
 	_obj_ajax.send(null); 
	}

function loadThumbThemes(categoryId,txtSearch,page){
  
	 _obj_ajax=obj_ajax();   
	 
	 _values_send="categoryId=" + categoryId + "&page=" + page + "&txtSearch=" + txtSearch;  	 
	 _URL_="load_themes.php?";   
	 _obj_ajax.open("GET",_URL_ + _values_send,true);   
	 
	 _obj_ajax.onreadystatechange=function() {                 
	if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){   	
			  if (_obj_ajax.responseText!="false"){
			  	$("thumbsTheme").innerHTML=_obj_ajax.responseText;
				}
			else{
				error="loadThumbThemes";
				}
			 }
		}
	 }  
 	_obj_ajax.send(null); 
	}
	
function loadThumbUserLayouts(categoryId,txtSearch,page){
	 _obj_ajax=obj_ajax();   
	 
	 _values_send="categoryId=" + categoryId + "&page=" + page + "&txtSearch=" + txtSearch;  	 
	 _URL_="load_userlayouts.php?";   
	 _obj_ajax.open("GET",_URL_ + _values_send,true);   
	 
	 _obj_ajax.onreadystatechange=function() {                 
	if (_obj_ajax.readyState==4) {	
		if(_obj_ajax.status==200){   	
			  if (_obj_ajax.responseText!="false"){
			  	$("thumbsUserLayouts").innerHTML=_obj_ajax.responseText;
				}
			else{
				error="loadThumbUserLayouts";
				}
			 }
		}
	 }  
 	_obj_ajax.send(null); 
}
	
function goSearchTheme(){
	loadThumbThemes(-1,document.getElementById("txtSearch").value,1)
}

//****************************************UPDATE THEME AND USER LAYOUTS
//****************************************
function startOver(){
	//para que lea las cookies si es necesario
	loadVars=paramLoadVars;
	
	if(opened!=""){
		new Effect.BlindUp($("panel" + opened + "Opts"));
		$('btn'+opened).removeClassName('btn'+opened+'Sel');
		opened="";
		}
	if($("load_themeId").value!="")
		updateTheme($("load_themeId").value);
	else
		if($("load_userLayoutId").value!="")
			updateUserLayout($("load_userLayoutId").value);
		else{
			initializeVars('');
			document.getElementById("previewFrame").src="profile_preview"+appSufix+".php";
			}
}

function startBlank(){
	if(opened!=""){
		new Effect.BlindUp($("panel" + opened + "Opts"));
		$('btn'+opened).removeClassName('btn'+opened+'Sel');
		opened="";
		}
	//para que no lea los cookies		
	loadVars='';
	//incializo todas las variables
	initializeVars('');
	document.getElementById("previewFrame").src="profile_preview"+appSufix+".php";
}

function updateTheme(id){	
	$('wait').show();
	//para que no lea los cookies		
	loadVars='';
	document.getElementById("previewFrame").src="profile_preview"+appSufix+".php?id="+id;
}	

function updateUserLayout(id){
	$('wait').show();
	document.getElementById("previewFrame").src="profile_preview"+appSufix+".php?userLayoutId="+id;
}

function changeEdit(opc){
	switch (opc){
		case 1:
			sufix="";break;
		case 2:
			sufix="_h";break;
		case 3:
			sufix="_f";break;
	}		
	//guardo las variables en cookies
	
	
	/*
	for(i=0;i<varBacks.length;i++)
	{
		alert(varBacks[i]+' : '+$(varBacks[i]).value);
	}
	*/
	
	
	for(i=0;i<varBacks.length;i++)
	{
		//pregunto si es un checkbox (no encontre la funcion prototype que hace eso)
		if($(varBacks[i]).value=="true")
		{			
			if($(varBacks[i]).checked)
				Cookie.set(varBacks[i],"istrue",1);
			else
				Cookie.set(varBacks[i],"isfalse",1);
		}
		else

			if((varBacks[i]!='profileName')&&(varBacks[i]!='profileType'))
				Cookie.set(varBacks[i],$(varBacks[i]).value,1);
			else
			{
				if(appType==$("profileType").value)
				{
					Cookie.set(varBacks[i],$(varBacks[i]).value,1);
				}
			}
	 }	
	 /*
	for(i=0;i<varBacks.length;i++)
	{
		alert(varBacks[i]+' : '+$(varBacks[i]).value);
	}
	*/
	document.location.href="index" + sufix + ".php?loadVars=true&titlekw="+$("titlekw").value;
}


//*****************************************
//*****************************************





//-----scriptaculous.js-----


// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// 
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

var Scriptaculous = {
  Version: '1.5.1',
  require: function(libraryName) {
    // inserting via DOM fails in Safari 2.0, so brute force approach
    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
  },
  load: function() {
    if((typeof Prototype=='undefined') ||
      parseFloat(Prototype.Version.split(".")[0] + "." +
                 Prototype.Version.split(".")[1]) < 1.4)
      throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0");
    
    $A(document.getElementsByTagName("script")).findAll( function(s) {
      return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
    }).each( function(s) {
      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
      var includes = s.src.match(/\?.*load=([a-z,]*)/);
      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
       function(include) { Scriptaculous.require(path+include+'.js') });
    });
  }
}

Scriptaculous.load();





//-----dragdrop.js-----


// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// 
// See scriptaculous.js for full license.

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

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null  
    }, arguments[1] || {});

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if((typeof containment == 'object') && 
        (containment.constructor == Array)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }
    
    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },

  isContained: function(element, drop) {
    var parentNode = element.parentNode;
    return drop._containers.detect(function(c) { return parentNode == c });
  },

  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect( 
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    
    if(this.last_active) this.deactivate(this.last_active);
    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop)) {
        if(drop.onHover)
           drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
        if(drop.greedy) { 
          Droppables.activate(drop);
          throw $break;
        }
      }
    });
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) 
        this.last_active.onDrop(element, this.last_active.element, event);
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
}

var Draggables = {
  drags: [],
  observers: [],
  
  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
      
      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(document, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },
  
  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(document, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },
  
  activate: function(draggable) {
    window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
    this.activeDraggable = draggable;
  },
  
  deactivate: function(draggbale) {
    this.activeDraggable = null;
  },
  
  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    // Mozilla-based browsers fire successive mousemove events with
    // the same coordinates, prevent needless redrawing (moz bug?)
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;
    this.activeDraggable.updateDrag(event, pointer);
  },
  
  endDrag: function(event) {
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },
  
  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },
  
  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },
  
  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },
  
  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
  },
  
  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
}

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

var Draggable = Class.create();
Draggable.prototype = {
  initialize: function(element) {
    var options = Object.extend({
      handle: false,
      starteffect: function(element) { 
        new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7}); 
      },
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
      },
      endeffect: function(element) { 
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); 
      },
      zindex: 1000,
      revert: false,
      snap: false   // false, or xy or [x,y] or function(x,y){ return [x,y] }
    }, arguments[1] || {});

    this.element = $(element);
    
    if(options.handle && (typeof options.handle == 'string'))
      this.handle = Element.childrenWithClassName(this.element, options.handle)[0];  
    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;

    Element.makePositioned(this.element); // fix IE    

    this.delta    = this.currentDelta();
    this.options  = options;
    this.dragging = false;   

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);
    
    Draggables.register(this);
  },
  
  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },
  
  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },
  
  initDrag: function(event) {
    if(Event.isLeftClick(event)) {    
      // abort on form elements, fixes a Firefox issue
      var src = Event.element(event);
      if(src.tagName && (
        src.tagName=='INPUT' ||
        src.tagName=='SELECT' ||
        src.tagName=='BUTTON' ||
        src.tagName=='TEXTAREA')) return;
        
      if(this.element._revert) {
        this.element._revert.cancel();
        this.element._revert = null;
      }
      
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
      
      Draggables.activate(this);
      Event.stop(event);
    }
  },
  
  startDrag: function(event) {
    this.dragging = true;
    
    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }
    
    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }
    
    Draggables.notify('onStart', this, event);
    if(this.options.starteffect) this.options.starteffect(this.element);
  },
  
  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);
    Position.prepare();
    Droppables.show(pointer, this.element);
    Draggables.notify('onDrag', this, event);
    this.draw(pointer);
    if(this.options.change) this.options.change(this);
    
    // fix AppleWebKit rendering
    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
    Event.stop(event);
  },
  
  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.ghosting) {
      Position.relativize(this.element);
      Element.remove(this._clone);
      this._clone = null;
    }

    if(success) Droppables.fire(event, this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && typeof revert == 'function') revert = revert(this.element);
    
    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      this.options.reverteffect(this.element, 
        d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect) 
      this.options.endeffect(this.element);

    Draggables.deactivate(this);
    Droppables.reset();
  },
  
  keyPress: function(event) {
    if(!event.keyCode==Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },
  
  endDrag: function(event) {
    if(!this.dragging) return;
    this.finishDrag(event, true);
    Event.stop(event);
  },
  
  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];
    
    var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this));
    
    if(this.options.snap) {
      if(typeof this.options.snap == 'function') {
        p = this.options.snap(p[0],p[1]);
      } else {
      if(this.options.snap instanceof Array) {
        p = p.map( function(v, i) {
          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
      } else {
        p = p.map( function(v) {
          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
      }
    }}
    
    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";
    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  }
}

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

var SortableObserver = Class.create();
SortableObserver.prototype = {
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },
  
  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },
  
  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
}

var Sortable = {
  sortables: new Array(),
  
  options: function(element){
    element = $(element);
    return this.sortables.detect(function(s) { return s.element == element });
  },
  
  destroy: function(element){
    element = $(element);
    this.sortables.findAll(function(s) { return s.element == element }).each(function(s){
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');
    });
    this.sortables = this.sortables.reject(function(s) { return s.element == element });
  },
  
  create: function(element) {
    element = $(element);
    var options = Object.extend({ 
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,      // fixme: unimplemented
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      hoverclass:  null,
      ghosting:    false,
      format:      null,
      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || {});

    // clear any old sortable with same element
    this.destroy(element);

    // build options for the draggables
    var options_for_draggable = {
      revert:      true,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    // build options for the droppables  
    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover,
      greedy:      !options.dropOnEmpty
    }

    // fix for gecko engine
    Element.cleanWhitespace(element); 

    options.draggables = [];
    options.droppables = [];

    // make it so

    // drop on empty handling
    if(options.dropOnEmpty) {
      Droppables.add(element,
        {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});
      options.droppables.push(element);
    }

    (this.findElements(element, options) || []).each( function(e) {
      // handles are per-draggable
      var handle = options.handle ? 
        Element.childrenWithClassName(e, options.handle)[0] : e;    
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      options.droppables.push(e);      
    });

    // keep reference
    this.sortables.push(options);

    // for onupdate
    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  // return all suitable-for-sortable elements in a guaranteed order
  findElements: function(element, options) {
    if(!element.hasChildNodes()) return null;
    var elements = [];
    $A(element.childNodes).each( function(e) {
      if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() &&
        (!options.only || (Element.hasClassName(e, options.only))))
          elements.push(e);
      if(options.tree) {
        var grandchildren = this.findElements(e, options);
        if(grandchildren) elements.push(grandchildren);
      }
    });

    return (elements.length>0 ? elements.flatten() : null);
  },

  onHover: function(element, dropon, overlap) {
    if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode) 
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode) 
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },

  onEmptyHover: function(element, dropon) {
    if(element.parentNode!=dropon) {
      var oldParentNode = element.parentNode;
      dropon.appendChild(element);
      Sortable.options(oldParentNode).onChange(element);
      Sortable.options(dropon).onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Element.hide(Sortable._marker);
  },

  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return; 

    if(!Sortable._marker) {
      Sortable._marker = $('dropmarker') || document.createElement('DIV');
      Element.hide(Sortable._marker);
      Element.addClassName(Sortable._marker, 'dropmarker');
      Sortable._marker.style.position = 'absolute';
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }    
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.style.left = offsets[0] + 'px';
    Sortable._marker.style.top = offsets[1] + 'px';
    
    if(position=='after')
      if(sortable.overlap == 'horizontal') 
        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
      else
        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
    
    Element.show(Sortable._marker);
  },

  serialize: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag:  sortableOptions.tag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format || /^[^_]*_(.*)$/
    }, arguments[1] || {});
    return $(this.findElements(element, options) || []).map( function(item) {
      return (encodeURIComponent(options.name) + "[]=" + 
              encodeURIComponent(item.id.match(options.format) ? item.id.match(options.format)[1] : ''));
    }).join("&");
  }
}





//-----slider.js-----


// Copyright (c) 2005 Marty Haught, Thomas Fuchs 
//
// See http://script.aculo.us for more info
// 
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

if(!Control) var Control = {};
Control.Slider = Class.create();

// options:
//  axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
//  onChange(value)
//  onSlide(value)
Control.Slider.prototype = {
  initialize: function(handle, track, options) {
    var slider = this;
    
    if(handle instanceof Array) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }
    
    this.track   = $(track);
    this.options = options || {};

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);
    
    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    // Will be used to align the handle onto the track, if necessary
    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');
    
    this.trackLength = this.maximumOffset() - this.minimumOffset();
    this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if(this.options.disabled) this.setDisabled();

    // Allowed values array
    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if(this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    // Initialize handles in reverse (make sure first handle is active)
    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (slider.options.sliderValue instanceof Array ? 
          slider.options.sliderValue[i] : slider.options.sliderValue) || 
         slider.range.start), i);
      Element.makePositioned(h); // fix IE
      Event.observe(h, "mousedown", slider.eventMouseDown);
    });
    
    Event.observe(this.track, "mousedown", this.eventMouseDown);
    Event.observe(document, "mouseup", this.eventMouseUp);
    Event.observe(document, "mousemove", this.eventMouseMove);
    
    this.initialized = true;
  },
  dispose: function() {
    var slider = this;    
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(document, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
  },
  setEnabled: function(){
    this.disabled = false;
  },  
  getNearestValue: function(value){
    if(this.allowedValues){
      if(value >= this.allowedValues.max()) return(this.allowedValues.max());
      if(value <= this.allowedValues.min()) return(this.allowedValues.min());
      
      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if(currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        } 
      });
      return newValue;
    }
    if(value > this.range.end) return this.range.end;
    if(value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if(!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if(this.initialized && this.restricted) {
      if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat
    
    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = 
      this.translateToPx(sliderValue);
    
    this.drawSpans();
    if(!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * 
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) * 
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K); 
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ?
      this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
  },  
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if(this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if(this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if(this.options.endSpan)
      this.setSpan(this.options.endSpan, 
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if(this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if(Event.isLeftClick(event)) {
      if(!this.disabled){
        this.active = true;
        
        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if(track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track); 
          this.event = event;
          this.setValue(this.translateToValue( 
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          // find the handle (prevents issues with Safari)
          while((this.handles.indexOf(handle) == -1) && handle.parentNode) 
            handle = handle.parentNode;
        
          this.activeHandle    = handle;
          this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
          this.updateStyles();
        
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if(this.active) {
      if(!this.dragging) this.dragging = true;
      this.draw(event);
      // fix AppleWebKit rendering
      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if(this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if(this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },  
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if(this.initialized && this.options.onChange) 
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
}





//-----builder.js-----


// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// See scriptaculous.js for full license.

var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  //       due to a Firefox bug
  node: function(elementName) {
    elementName = elementName.toUpperCase();
    
    // try innerHTML approach
    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;
      
    // see if browser added wrapping tags
    if(element && (element.tagName != elementName))
      element = element.getElementsByTagName(elementName)[0];
    
    // fallback to createElement approach
    if(!element) element = document.createElement(elementName);
    
    // abort if nothing could be created
    if(!element) return;

    // attributes (or text)
    if(arguments[1])
      if(this._isStringOrNumber(arguments[1]) ||
        (arguments[1] instanceof Array)) {
          this._children(element, arguments[1]);
        } else {
          var attrs = this._attributes(arguments[1]);
          if(attrs.length) {
            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
              parentElement.innerHTML = "<" +elementName + " " +
                attrs + "></" + elementName + ">";
            } catch(e) {}
            element = parentElement.firstChild || null;
            // workaround firefox 1.0.X bug
            if(!element) {
              element = document.createElement(elementName);
              for(attr in arguments[1]) 
                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
            }
            if(element.tagName != elementName)
              element = parentElement.getElementsByTagName(elementName)[0];
            }
        } 

    // text, or array of children
    if(arguments[2])
      this._children(element, arguments[2]);

     return element;
  },
  _text: function(text) {
     return document.createTextNode(text);
  },
  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute=='className' ? 'class' : attribute) +
          '="' + attributes[attribute].toString().escapeHTML() + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e)
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children)) 
         element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  }
}





//-----yahoo.color.js-----


/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */

var YAHOO = function() { return {util: {}} } ();
YAHOO.util.Color = new function() {
  
  // Adapted from http://www.easyrgb.com/math.html
  // hsv values = 0 - 1
  // rgb values 0 - 255
  this.hsv2rgb = function (h, s, v) {
    var r, g, b;
    if ( s == 0 ) {
      r = v * 255;
      g = v * 255;
      b = v * 255;
    } else {

      // h must be < 1
      var var_h = h * 6;
      if ( var_h == 6 ) {
        var_h = 0;
      }

      //Or ... var_i = floor( var_h )
      var var_i = Math.floor( var_h );
      var var_1 = v * ( 1 - s );
      var var_2 = v * ( 1 - s * ( var_h - var_i ) );
      var var_3 = v * ( 1 - s * ( 1 - ( var_h - var_i ) ) );

      if ( var_i == 0 ) { 
        var_r = v; 
        var_g = var_3; 
        var_b = var_1;
      } else if ( var_i == 1 ) { 
        var_r = var_2;
        var_g = v;
        var_b = var_1;
      } else if ( var_i == 2 ) {
        var_r = var_1;
        var_g = v;
        var_b = var_3
      } else if ( var_i == 3 ) {
        var_r = var_1;
        var_g = var_2;
        var_b = v;
      } else if ( var_i == 4 ) {
        var_r = var_3;
        var_g = var_1;
        var_b = v;
      } else { 
        var_r = v;
        var_g = var_1;
        var_b = var_2
      }

      r = var_r * 255          //rgb results = 0 ÷ 255
      g = var_g * 255
      b = var_b * 255

      }
    return [Math.round(r), Math.round(g), Math.round(b)];
  };

  // added by Matthias Platzer AT knallgrau.at 
  this.rgb2hsv = function (r, g, b) {
      var r = ( r / 255 );                   //RGB values = 0 ÷ 255
      var g = ( g / 255 );
      var b = ( b / 255 );

      var min = Math.min( r, g, b );    //Min. value of RGB
      var max = Math.max( r, g, b );    //Max. value of RGB
      deltaMax = max - min;             //Delta RGB value

      var v = max;
      var s, h;
      var deltaRed, deltaGreen, deltaBlue;

      if ( deltaMax == 0 )                     //This is a gray, no chroma...
      {
         h = 0;                               //HSV results = 0 ÷ 1
         s = 0;
      }
      else                                    //Chromatic data...
      {
         s = deltaMax / max;

         deltaRed = ( ( ( max - r ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;
         deltaGreen = ( ( ( max - g ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;
         deltaBlue = ( ( ( max - b ) / 6 ) + ( deltaMax / 2 ) ) / deltaMax;

         if      ( r == max ) h = deltaBlue - deltaGreen;
         else if ( g == max ) h = ( 1 / 3 ) + deltaRed - deltaBlue;
         else if ( b == max ) h = ( 2 / 3 ) + deltaGreen - deltaRed;

         if ( h < 0 ) h += 1;
         if ( h > 1 ) h -= 1;
      }

      return [h, s, v];
  }

  this.rgb2hex = function (r,g,b) {
    return this.toHex(r) + this.toHex(g) + this.toHex(b);
  };

  this.hexchars = "0123456789ABCDEF";

  this.toHex = function(n) {
    n = n || 0;
    n = parseInt(n, 10);
    if (isNaN(n)) n = 0;
    n = Math.round(Math.min(Math.max(0, n), 255));

    return this.hexchars.charAt((n - n % 16) / 16) + this.hexchars.charAt(n % 16);
  };

  this.toDec = function(hexchar) {
    return this.hexchars.indexOf(hexchar.toUpperCase());
  };

  this.hex2rgb = function(str) { 
    var rgb = [];
    rgb[0] = (this.toDec(str.substr(0, 1)) * 16) + 
            this.toDec(str.substr(1, 1));
    rgb[1] = (this.toDec(str.substr(2, 1)) * 16) + 
            this.toDec(str.substr(3, 1));
    rgb[2] = (this.toDec(str.substr(4, 1)) * 16) + 
            this.toDec(str.substr(5, 1));
    // gLogger.debug("hex2rgb: " + str + ", " + rgb.toString());
    return rgb;
  };

  this.isValidRGB = function(a) { 
    if ((!a[0] && a[0] !=0) || isNaN(a[0]) || a[0] < 0 || a[0] > 255) return false;
    if ((!a[1] && a[1] !=0) || isNaN(a[1]) || a[1] < 0 || a[1] > 255) return false;
    if ((!a[2] && a[2] !=0) || isNaN(a[2]) || a[2] < 0 || a[2] > 255) return false;

    return true;
  };
}






//-----colorpicker.js-----


/* 
   colorPicker for script.aculo.us, version 0.9
   REQUIRES prototype.js, yahoo.color.js and script.aculo.us
   written by Matthias Platzer AT knallgrau.at
   for a detailled documentation go to http://www.knallgrau.at/code/colorpicker 
 */

if(!Control) var Control = {};
Control.colorPickers = [];
Control.ColorPicker = Class.create();
Control.ColorPicker.activeColorPicker;
Control.ColorPicker.CONTROL;
/**
 * ColorPicker Control allows you to open a little inline popUp HSV color chooser.
 * This control is bound to an input field, that holds a hex value.
 */
Control.ColorPicker.prototype = {
  initialize : function(field, options) {
    var colorPicker = this;
    Control.colorPickers.push(colorPicker);
    this.field = $(field);
    this.fieldName = this.field.name || this.field.id;
    this.options = Object.extend({
       //IMAGE_BASE : "imgs/colorPicker/"
       // liviu
       IMAGE_BASE : "images/"
    }, options || {});
    this.swatch = $(this.options.swatch) || this.field;
    this.rgb = {};
    this.hsv = {};
    this.isOpen = false;

    // create control (popUp) if not already existing
    // all colorPickers on a page share the same control (popUp)
    if (!Control.ColorPicker.CONTROL) {
      Control.ColorPicker.CONTROL = {};
      if (!$("colorpicker")) {
        var control = Builder.node('div', {id: 'colorpicker'});
        control.innerHTML = 
          '<div id="colorpicker-div">' + (
            // apply png fix for ie 5.5 and 6.0
            (/MSIE ((6)|(5\.5))/gi.test(navigator.userAgent) && /windows/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) ?
              '<img id="colorpicker-bg" src="' + this.options.IMAGE_BASE + 'blank.gif" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + this.options.IMAGE_BASE + 'pickerbg.png\', sizingMethod=\'scale\')" alt="">' :
              '<img id="colorpicker-bg" src="' + this.options.IMAGE_BASE + 'pickerbg.png" alt="">'
             ) +
          '<div id="colorpicker-bg-overlay" style="z-index: 1002;"></div>' +
          '<div id="colorpicker-selector"><img src="' + this.options.IMAGE_BASE + 'select.gif" width="11" height="11" alt="" /></div></div>' +
          '<div id="colorpicker-hue-container"><img src="' + this.options.IMAGE_BASE + 'hue.png" id="colorpicker-hue-bg-img"><div id="colorpicker-hue-slider"><div id="colorpicker-hue-thumb"><img src="' + this.options.IMAGE_BASE + 'hline.png"></div></div></div>' + 
          '<div id="colorpicker-footer"><span id="colorpicker-value">#<input type="text" onclick="this.select()" id="colorpicker-value-input" name="colorpicker-value" value=""></input></span><button id="colorpicker-okbutton">OK</button></div>'
        document.body.appendChild(control);
      }
      Control.ColorPicker.CONTROL = {
        popUp : $("colorpicker"),
        pickerArea : $('colorpicker-div'),
        selector : $('colorpicker-selector'),
        okButton : $("colorpicker-okbutton"),
        value : $("colorpicker-value"),
        input : $("colorpicker-value-input"),
        picker : new Draggable($('colorpicker-selector'), {
          snap: function(x, y) {
            return [
              Math.min(Math.max(x, 0), Control.ColorPicker.activeColorPicker.control.pickerArea.offsetWidth), 
              Math.min(Math.max(y, 0), Control.ColorPicker.activeColorPicker.control.pickerArea.offsetHeight)
            ];
          },
          zindex: 1009,
          change: function(draggable) {
            var pos = draggable.currentDelta();
            Control.ColorPicker.activeColorPicker.update(pos[0], pos[1]);
          }
        }),
        hueSlider: new Control.Slider('colorpicker-hue-thumb', 'colorpicker-hue-slider', {
          axis: 'vertical',
          onChange: function(v) {
            Control.ColorPicker.activeColorPicker.updateHue(v);
          }
        })
      };
      Element.hide($("colorpicker"));
    }
    this.control = Control.ColorPicker.CONTROL;

    // bind event listener to properties, so we can use them savely with Event[observe|stopObserving]
    this.toggleOnClickListener = this.toggle.bindAsEventListener(this);
    this.updateOnChangeListener = this.updateFromFieldValue.bindAsEventListener(this);
    this.closeOnClickOkListener = this.close.bindAsEventListener(this);
    this.updateOnClickPickerListener = this.updateSelector.bindAsEventListener(this);

    Event.observe(this.swatch, "click", this.toggleOnClickListener);
    Event.observe(this.field, "change", this.updateOnChangeListener);
    Event.observe(this.control.input, "change", this.updateOnChangeListener);

    this.updateSwatch();
  },
  toggle : function(event) {
    this[(this.isOpen) ? "close" : "open"](event);
    Event.stop(event);    
  },
  open : function(event) {
    Control.colorPickers.each(function(colorPicker) {
      colorPicker.close();
    });
    Control.ColorPicker.activeColorPicker = this;
    this.isOpen = true;
    Element.show(this.control.popUp);
    if (this.options.getPopUpPosition) {
       var pos = this.options.getPopUpPosition.bind(this)(event);
    } else {
      var pos = Position.cumulativeOffset(this.swatch || this.field);
      pos[0] = (pos[0] + (this.swatch || this.field).offsetWidth + 10);
    }
    this.control.popUp.style.left = (pos[0]) + "px";
    this.control.popUp.style.top = (pos[1]) + "px";
    this.updateFromFieldValue();
    Event.observe(this.control.okButton, "click", this.closeOnClickOkListener);
    Event.observe(this.control.pickerArea, "mousedown", this.updateOnClickPickerListener);
    if (this.options.onOpen) this.options.onOpen.bind(this)(event);
  },
  close : function(event) {
    if (Control.ColorPicker.activeColorPicker == this) Control.ColorPicker.activeColorPicker = null;
    this.isOpen = false;
    Element.hide(this.control.popUp);
    Event.stopObserving(this.control.okButton, "click", this.closeOnClickOkListener);
    Event.stopObserving(this.control.pickerArea, "mousedown", this.updateOnClickPickerListener);
    if (this.options.onClose) this.options.onClose.bind(this)();
  },
  updateHue : function(v) {
    var h = (this.control.pickerArea.offsetHeight - v * 100) / this.control.pickerArea.offsetHeight;
    if (h == 1) h = 0;
    var rgb = YAHOO.util.Color.hsv2rgb( h, 1, 1 );
    if (!YAHOO.util.Color.isValidRGB(rgb)) return;
    this.control.pickerArea.style.backgroundColor = "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")";
    this.update();
  },
  updateFromFieldValue : function(event) {
    if (!this.isOpen) return;
    var field = (event && Event.findElement(event, "input")) || this.field;
    var rgb = YAHOO.util.Color.hex2rgb( field.value );
    if (!YAHOO.util.Color.isValidRGB(rgb)) return;
    var hsv = YAHOO.util.Color.rgb2hsv( rgb[0], rgb[1], rgb[2] );
    this.control.selector.style.left = Math.round(hsv[1] * this.control.pickerArea.offsetWidth) + "px";
    this.control.selector.style.top = Math.round((1 - hsv[2]) * this.control.pickerArea.offsetWidth) + "px";
    this.control.hueSlider.setValue((1 - hsv[0]));
  },
  updateSelector : function(event) {
    var xPos = Event.pointerX(event);
    var yPos = Event.pointerY(event);
    var pos = Position.cumulativeOffset($("colorpicker-bg"));
    this.control.selector.style.left = (xPos - pos[0] - 6) + "px";
    this.control.selector.style.top = (yPos - pos[1] - 6) + "px";
    this.update((xPos - pos[0]), (yPos - pos[1]));
    this.control.picker.initDrag(event);
  },
  updateSwatch : function() {
    var rgb = YAHOO.util.Color.hex2rgb( this.field.value );
    if (!YAHOO.util.Color.isValidRGB(rgb)) return;
    this.swatch.style.backgroundColor = "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")";
    var hsv = YAHOO.util.Color.rgb2hsv( rgb[0], rgb[1], rgb[2] );
    this.swatch.style.color = (hsv[2] > 0.65) ? "#000000" : "#FFFFFF";
  },
  update : function(x, y) {
    if (!x) x = this.control.picker.currentDelta()[0];
    if (!y) y = this.control.picker.currentDelta()[1];

    var h = (this.control.pickerArea.offsetHeight - this.control.hueSlider.value * 100) / this.control.pickerArea.offsetHeight;
    if (h == 1) { h = 0; };
    this.hsv = {
      hue: 1 - this.control.hueSlider.value,
      saturation: x / this.control.pickerArea.offsetWidth,
      brightness: (this.control.pickerArea.offsetHeight - y) / this.control.pickerArea.offsetHeight
    };
    var rgb = YAHOO.util.Color.hsv2rgb( this.hsv.hue, this.hsv.saturation, this.hsv.brightness );
    this.rgb = {
      red: rgb[0],
      green: rgb[1],
      blue: rgb[2]
    };
    this.field.value = YAHOO.util.Color.rgb2hex(rgb[0], rgb[1], rgb[2]);
    this.control.input.value = this.field.value;
    this.updateSwatch();
    if (this.options.onUpdate) this.options.onUpdate.bind(this)(this.field.value);
  }
}





//-----effects.js-----


// 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.  

/* ------------- element ext -------------- */  
 
// 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.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.setStyle = function(element, style) {
  element = $(element);
  for(k in style) element.style[k.camelize()] = style[k];
}

Element.setContentZoom = function(element, percent) {  
  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) {  
  return $A($(element).getElementsByTagName('*')).select(
    function(c) { return Element.hasClassName(c, className) });
}

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') }
    }, arguments[2] || {});
    Effect[Element.visible(element) ? 
      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;
    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))
      Element.setStyle(this.element, {zoom: 1});
    var options = Object.extend({
      from: Element.getOpacity(this.element) || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    Element.setOpacity(this.element, 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) 
    Element.makePositioned(this.element);
    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
    this.originalTop  = parseFloat(Element.getStyle(this.element,'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) {
    Element.setStyle(this.element, {
      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 = Element.getStyle(this.element,'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 = Element.getStyle(this.element,'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)
      Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) Element.setStyle(this.element, 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';
      }
    }
    Element.setStyle(this.element, 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(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {
      backgroundImage: Element.getStyle(this.element, 'background-image') };
    Element.setStyle(this.element, {backgroundImage: 'none'});
    if(!this.options.endcolor)
      this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = Element.getStyle(this.element, '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) {
    Element.setStyle(this.element,{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() {
    Element.setStyle(this.element, 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) {
  var oldOpacity = Element.getInlineOpacity(element);
  var options = Object.extend({
  from: Element.getOpacity(element) || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { with(Element) { 
    if(effect.options.to!=0) return;
    hide(effect.element);
    setStyle(effect.element, {opacity: oldOpacity}); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  var options = Object.extend({
  from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
  to:   1.0,
  beforeSetup: function(effect) { with(Element) {
    setOpacity(effect.element, effect.options.from);
    show(effect.element); }}
  }, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

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

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

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

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = Element.getInlineOpacity(element);
  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) { with(Element) {
          [makePositioned,makeClipping].call(effect.element);
        }},
        afterFinishInternal: function(effect) { with(Element) {
          [hide,undoClipping,undoPositioned].call(effect.element);
          setStyle(effect.element, {opacity: oldOpacity});
        }}
      })
    }
  });
}

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: Element.getStyle(element, 'top'),
    left: Element.getStyle(element, 'left'),
    opacity: Element.getInlineOpacity(element) };
  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) { with(Element) {
          makePositioned(effect.effects[0].element); }},
        afterFinishInternal: function(effect) { with(Element) {
          [hide, undoPositioned].call(effect.effects[0].element);
          setStyle(effect.effects[0].element, oldStyle); }} 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $(element);
  var oldStyle = {
    top: Element.getStyle(element, 'top'),
    left: Element.getStyle(element, '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) { with(Element) {
        undoPositioned(effect.element);
        setStyle(effect.element, oldStyle);
  }}}) }}) }}) }}) }}) }});
}

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

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransistion: 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(element) };

  var dims = Element.getDimensions(element);    
  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) { with(Element) {
      hide(effect.element);
      makeClipping(effect.element);
      makePositioned(effect.element);
    }},
    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) { with(Element) {
               setStyle(effect.effects[0].element, {height: '0px'});
               show(effect.effects[0].element); }},
             afterFinishInternal: function(effect) { with(Element) {
               [undoClipping, undoPositioned].call(effect.effects[0].element); 
               setStyle(effect.effects[0].element, oldStyle); }}
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransistion: 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(element) };

  var dims = Element.getDimensions(element);
  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) { with(Element) {
           [makePositioned, makeClipping].call(effect.effects[0].element) }},
         afterFinishInternal: function(effect) { with(Element) {
           [hide, undoClipping, undoPositioned].call(effect.effects[0].element);
           setStyle(effect.effects[0].element, oldStyle); }}
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || {};
  var oldOpacity = Element.getInlineOpacity(element);
  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) { Element.setStyle(effect.element, {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) { with(Element) {
        [hide, undoClipping].call(effect.element); 
        setStyle(effect.element, oldStyle);
      }} });
  }}, arguments[1] || {}));
}






//-----accordion.js-----


// accordion.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
// 
// Accordion is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
//   Be a pro: 
//	    http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//

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

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

var accordion = Class.create();
accordion.prototype = {

	//
	//  Setup the Variables
	//
	showAccordion : null,
	currentAccordion : null,
	duration : null,
	effects : [],
	animating : false,
	
	//  
	//  Initialize the accordions
	//
	initialize: function(container, options) {
	  if (!$(container)) {
	    throw(container+" doesn't exist!");
	    return false;
	  }
	  
		this.options = Object.extend({
			resizeSpeed : 8,
			classNames : {
				toggle : 'accordion_toggle',
				toggleActive : 'accordion_toggle_active',
				content : 'accordion_content'
			},
			defaultSize : {
				height : null,
				width : null
			},
			direction : 'vertical',
			onEvent : 'click'
		}, options || {});
		
		this.duration = ((11-this.options.resizeSpeed)*0.15);

		var accordions = $$('#'+container+' .'+this.options.classNames.toggle);
		accordions.each(function(accordion) {
			Event.observe(accordion, this.options.onEvent, this.activate.bind(this, accordion), false);
			if (this.options.onEvent == 'click') {
			  accordion.onclick = function() {return false;};
			}
			
			if (this.options.direction == 'horizontal') {
				var options = $H({width: '0px'});
			} else {
				var options = $H({height: '0px'});			
			}
			options.merge({display: 'none'});			
			
			this.currentAccordion = $(accordion.next(0)).setStyle(options);			
		}.bind(this));
	},
	
	//
	//  Activate an accordion
	//
	activate : function(accordion) {
		if (this.animating) {
			return false;
		}
		
		this.effects = [];
	
		this.currentAccordion = $(accordion.next(0));
		this.currentAccordion.setStyle({
			display: 'block'
		});		
		
		this.currentAccordion.previous(0).addClassName(this.options.classNames.toggleActive);

		if (this.options.direction == 'horizontal') {
			this.scaling = $H({
				scaleX: true,
				scaleY: false
			});
		} else {
			this.scaling = $H({
				scaleX: false,
				scaleY: true
			});			
		}
			
		if (this.currentAccordion == this.showAccordion) {
		  this.deactivate();
		} else {
		  this._handleAccordion();
		}
	},
	// 
	// Deactivate an active accordion
	//
	deactivate : function() {
		var options = $H({
		  duration: this.duration,
			scaleContent: false,
			transition: Effect.Transitions.sinoidal,
			queue: {
				position: 'end', 
				scope: 'accordionAnimation'
			},
			scaleMode: { 
				originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
				originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
			},
			afterFinish: function() {
				this.showAccordion.setStyle({
          height: 'auto',
					display: 'none'
				});				
				this.showAccordion = null;
				this.animating = false;
			}.bind(this)
		});    
    options.merge(this.scaling);

    this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
    
		new Effect.Scale(this.showAccordion, 0, options);
	},

  //
  // Handle the open/close actions of the accordion
  //
	_handleAccordion : function() {
		var options = $H({
			sync: true,
			scaleFrom: 0,
			scaleContent: false,
			transition: Effect.Transitions.sinoidal,
			scaleMode: { 
				originalHeight: this.options.defaultSize.height ? this.options.defaultSize.height : this.currentAccordion.scrollHeight,
				originalWidth: this.options.defaultSize.width ? this.options.defaultSize.width : this.currentAccordion.scrollWidth
			}
		});
		options.merge(this.scaling);
		
		this.effects.push(
			new Effect.Scale(this.currentAccordion, 100, options)
		);

		if (this.showAccordion) {
			this.showAccordion.previous(0).removeClassName(this.options.classNames.toggleActive);
			
			options = $H({
				sync: true,
				scaleContent: false,
				transition: Effect.Transitions.sinoidal
			});
			options.merge(this.scaling);
			
			this.effects.push(
				new Effect.Scale(this.showAccordion, 0, options)
			);				
		}
		
    new Effect.Parallel(this.effects, {
			duration: this.duration, 
			queue: {
				position: 'end', 
				scope: 'accordionAnimation'
			},
			beforeStart: function() {
				this.animating = true;
			}.bind(this),
			afterFinish: function() {
				if (this.showAccordion) {
					this.showAccordion.setStyle({
						display: 'none'
					});				
				}
				$(this.currentAccordion).setStyle({
				  height: 'auto'
				});
				this.showAccordion = this.currentAccordion;
				this.animating = false;
			}.bind(this)
		});
	}
}
	





















































































/******************************************
* Slider Bar Form Element Script
* 
* Original program copyright David Harrison
*   d_s_h2@hotmail.com
* Version 2 copyright Eric C. Davis
*   eric@10mar2001.com
* 
* Visit http://www.dynamicdrive.com for
*   loads of other scripts.
* 
* This notice MUST stay intact for use.
*
* Modified by Tom Westcott
* http://www.cyberdummy.co.uk
******************************************/

var x, lgap,
	pel = null;

function newValue(value, tag) {
	el = document.getElementById(tag);
	var i = (Number(value));
	el2 = document.getElementById(tag + "out");
	width = (el2.style.width.replace(/\D/g,"") - 11);
	if(i > width) i = width;
	if(i < 0) i = 0;
	el.style.marginLeft = i + "px";
	el.inputElement.value = i;
}

function mousetracker (event) {
	if (!event) {
		event = window.event;
	}
	x = event.clientX;
	if (pel != null) {
		var width = pel.sliderWidth;
		pel.style.marginLeft = ( ( (lgap + x) > width) ? width : ( ( (lgap + x) < 0) ? 0 : lgap + x ) ) + "px"; //>
		pel.inputElement.value = pel.style.marginLeft.replace(/\D/g,"");
		pel.inputElement.onDrag();
	}
}

function track () {
	pel = this;
	// added this so it mouse strays from the drag tab mouse up still releases it
	if (document.addEventListener) {
                document.addEventListener('mouseup', stop, false);
        } else {
		document.onmouseup = stop;		
        }
	pel.inputElement.onDragStart();
	lgap = parseInt(pel.style.marginLeft.replace(/\D/g,""));
	if (isNaN(lgap)) {
		lgap = 0;
	}
	lgap -= x;
}

function stop() {
	pel.inputElement.onDragStop();
	pel = null;

	if (document.removeEventListener) {
                document.removeEventListener('mouseup', stop, false);
        } else {
                document.onmouseup = null;
        }
}

function form_slider (el, width) {
	var wid 		= parseInt(width);
	var newEl 		= document.createElement("input");
	newEl.type 		= "hidden";
	var outDiv 		= document.createElement("div");
	outDiv.className	= "move";
	outDiv.style.width 	= (wid+11) + "px";
	outDiv.id		= el.id + "out";
	var inDiv 		= document.createElement("div");
	inDiv.className 	= "move2";
	inDiv.id 		= el.id + "in";
	var slider 		= document.createElement("div");
	slider.className 	= el.className;
	slider.id 		= el.id;
	// convert original form element to new form element
	for (key in el) {
		try {
			newEl[key] = el[key];
		} catch (er) {
			// whoops! Can't assign that property.
		}
	}
	newEl.type 		= "hidden";
	newEl.className 	= "";
	newEl.name 		= el.name;
	newEl.id 		= el.id + "hidden";
	// assign persistent properties to slider div
	slider.inputElement	= newEl;
	slider.sliderWidth 	= wid;
	// assign events
	if (slider.addEventListener) {
		slider.addEventListener('mousedown', track, false);
		slider.addEventListener('mouseup', stop, false);
	} else {
		slider.onmousedown = track;
		slider.onmouseup = stop;
	}
	// put the new elements in the document
	outDiv.appendChild(inDiv);
	outDiv.appendChild(slider);
	value = el.value;
	id = el.id;
	el.parentNode.insertBefore(outDiv, el);
	// remove the old element before inserting the new element
	el.parentNode.removeChild(el);
	outDiv.parentNode.insertBefore(newEl, outDiv);
	if(value > 0) {
		newValue(value, id);
	}
}

if (window.addEventListener) {
	document.addEventListener('mousemove', mousetracker, false);
} else if (window.attachEvent) {
	document.attachEvent('onmousemove', mousetracker);
} else {
	document.onmousemove = mousetracker;
}






































































/*
 * jQuery 1.2 - New Wave Javascript
 *
 * Copyright (c) 2007 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2007-09-10 15:45:49 -0400 (Mon, 10 Sep 2007) $
 * $Rev: 3219 $
 */
(function(){if(typeof jQuery!="undefined")var _jQuery=jQuery;var jQuery=window.jQuery=function(a,c){if(window==this||!this.init)return new jQuery(a,c);return this.init(a,c);};if(typeof $!="undefined")var _$=$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;jQuery.fn=jQuery.prototype={init:function(a,c){a=a||document;if(typeof a=="string"){var m=quickExpr.exec(a);if(m&&(m[1]||!c)){if(m[1])a=jQuery.clean([m[1]],c);else{var tmp=document.getElementById(m[3]);if(tmp)if(tmp.id!=m[3])return jQuery().find(a);else{this[0]=tmp;this.length=1;return this;}else
a=[];}}else
return new jQuery(c).find(a);}else if(jQuery.isFunction(a))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](a);return this.setArray(a.constructor==Array&&a||(a.jquery||a.length&&a!=window&&!a.nodeType&&a[0]!=undefined&&a[0].nodeType)&&jQuery.makeArray(a)||[a]);},jquery:"1.2",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(a){var ret=jQuery(a);ret.prevObject=this;return ret;},setArray:function(a){this.length=0;Array.prototype.push.apply(this,a);return this;},each:function(fn,args){return jQuery.each(this,fn,args);},index:function(obj){var pos=-1;this.each(function(i){if(this==obj)pos=i;});return pos;},attr:function(key,value,type){var obj=key;if(key.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],key)||undefined;else{obj={};obj[key]=value;}return this.each(function(index){for(var prop in obj)jQuery.attr(type?this.style:this,prop,jQuery.prop(this,obj[prop],type,index,prop));});},css:function(key,value){return this.attr(key,value,"curCSS");},text:function(e){if(typeof e!="object"&&e!=null)return this.empty().append(document.createTextNode(e));var t="";jQuery.each(e||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)t+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return t;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,1,function(a){this.appendChild(a);});},prepend:function(){return this.domManip(arguments,true,-1,function(a){this.insertBefore(a,this.firstChild);});},before:function(){return this.domManip(arguments,false,1,function(a){this.parentNode.insertBefore(a,this);});},after:function(){return this.domManip(arguments,false,-1,function(a){this.parentNode.insertBefore(a,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(t){var data=jQuery.map(this,function(a){return jQuery.find(t,a);});return this.pushStack(/[^+>] [^+>]/.test(t)||t.indexOf("..")>-1?jQuery.unique(data):data);},clone:function(events){var ret=this.map(function(){return this.outerHTML?jQuery(this.outerHTML)[0]:this.cloneNode(true);});if(events===true){var clone=ret.find("*").andSelf();this.find("*").andSelf().each(function(i){var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});}return ret;},filter:function(t){return this.pushStack(jQuery.isFunction(t)&&jQuery.grep(this,function(el,index){return t.apply(el,[index]);})||jQuery.multiFilter(t,this));},not:function(t){return this.pushStack(t.constructor==String&&jQuery.multiFilter(t,this,true)||jQuery.grep(this,function(a){return(t.constructor==Array||t.jquery)?jQuery.inArray(a,t)<0:a!=t;}));},add:function(t){return this.pushStack(jQuery.merge(this.get(),t.constructor==String?jQuery(t).get():t.length!=undefined&&(!t.nodeName||t.nodeName=="FORM")?t:[t]));},is:function(expr){return expr?jQuery.multiFilter(expr,this).length>0:false;},hasClass:function(expr){return this.is("."+expr);},val:function(val){if(val==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,a=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){var val=jQuery.browser.msie&&!option.attributes["value"].specified?option.text:option.value;if(one)return val;a.push(val);}}return a;}else
return this[0].value.replace(/\r/g,"");}}else
return this.each(function(){if(val.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,val)>=0||jQuery.inArray(this.name,val)>=0);else if(jQuery.nodeName(this,"select")){var tmp=val.constructor==Array?val:[val];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,tmp)>=0||jQuery.inArray(this.text,tmp)>=0);});if(!tmp.length)this.selectedIndex=-1;}else
this.value=val;});},html:function(val){return val==undefined?(this.length?this[0].innerHTML:null):this.empty().append(val);},replaceWith:function(val){return this.after(val).remove();},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(fn){return this.pushStack(jQuery.map(this,function(elem,i){return fn.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,dir,fn){var clone=this.length>1,a;return this.each(function(){if(!a){a=jQuery.clean(args,this.ownerDocument);if(dir<0)a.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(a[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(document.createElement("tbody"));jQuery.each(a,function(){if(jQuery.nodeName(this,"script")){if(this.src)jQuery.ajax({url:this.src,async:false,dataType:"script"});else
jQuery.globalEval(this.text||this.textContent||this.innerHTML||"");}else
fn.apply(obj,[clone?this.cloneNode(true):this]);});});}};jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},a=1,al=arguments.length,deep=false;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};}if(al==1){target=this;a=0;}var prop;for(;a<al;a++)if((prop=arguments[a])!=null)for(var i in prop){if(target==prop[i])continue;if(deep&&typeof prop[i]=='object'&&target[i])jQuery.extend(target[i],prop[i]);else if(prop[i]!=undefined)target[i]=prop[i];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,win={};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){if(window.execScript)window.execScript(data);else if(jQuery.browser.safari)window.setTimeout(data,0);else
eval.call(window,data);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?win:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?win:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(obj,fn,args){if(args){if(obj.length==undefined)for(var i in obj)fn.apply(obj[i],args);else
for(var i=0,ol=obj.length;i<ol;i++)if(fn.apply(obj[i],args)===false)break;}else{if(obj.length==undefined)for(var i in obj)fn.call(obj[i],i,obj[i]);else
for(var i=0,ol=obj.length,val=obj[0];i<ol&&fn.call(val,i,val)!==false;val=obj[++i]){}}return obj;},prop:function(elem,value,type,index,prop){if(jQuery.isFunction(value))value=value.call(elem,[index]);var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(prop)?value+"px":value;},className:{add:function(elem,c){jQuery.each((c||"").split(/\s+/),function(i,cur){if(!jQuery.className.has(elem.className,cur))elem.className+=(elem.className?" ":"")+cur;});},remove:function(elem,c){elem.className=c!=undefined?jQuery.grep(elem.className.split(/\s+/),function(cur){return!jQuery.className.has(c,cur);}).join(" "):"";},has:function(t,c){return jQuery.inArray(c,(t.className||t).toString().split(/\s+/))>-1;}},swap:function(e,o,f){for(var i in o){e.style["old"+i]=e.style[i];e.style[i]=o[i];}f.apply(e,[]);for(var i in o)e.style[i]=e.style["old"+i];},css:function(e,p){if(p=="height"||p=="width"){var old={},oHeight,oWidth,d=["Top","Bottom","Right","Left"];jQuery.each(d,function(){old["padding"+this]=0;old["border"+this+"Width"]=0;});jQuery.swap(e,old,function(){if(jQuery(e).is(':visible')){oHeight=e.offsetHeight;oWidth=e.offsetWidth;}else{e=jQuery(e.cloneNode(true)).find(":radio").removeAttr("checked").end().css({visibility:"hidden",position:"absolute",display:"block",right:"0",left:"0"}).appendTo(e.parentNode)[0];var parPos=jQuery.css(e.parentNode,"position")||"static";if(parPos=="static")e.parentNode.style.position="relative";oHeight=e.clientHeight;oWidth=e.clientWidth;if(parPos=="static")e.parentNode.style.position="static";e.parentNode.removeChild(e);}});return p=="height"?oHeight:oWidth;}return jQuery.curCSS(e,p);},curCSS:function(elem,prop,force){var ret,stack=[],swap=[];function color(a){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(a,null);return!ret||ret.getPropertyValue("color")=="";}if(prop=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(prop.match(/float/i))prop=styleFloat;if(!force&&elem.style[prop])ret=elem.style[prop];else if(document.defaultView&&document.defaultView.getComputedStyle){if(prop.match(/float/i))prop="float";prop=prop.replace(/([A-Z])/g,"-$1").toLowerCase();var cur=document.defaultView.getComputedStyle(elem,null);if(cur&&!color(elem))ret=cur.getPropertyValue(prop);else{for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(a=0;a<stack.length;a++)if(color(stack[a])){swap[a]=stack[a].style.display;stack[a].style.display="block";}ret=prop=="display"&&swap[stack.length-1]!=null?"none":document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop)||"";for(a=0;a<swap.length;a++)if(swap[a]!=null)stack[a].style.display=swap[a];}if(prop=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var newProp=prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});ret=elem.currentStyle[prop]||elem.currentStyle[newProp];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left;var runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(a,doc){var r=[];doc=doc||document;jQuery.each(a,function(i,arg){if(!arg)return;if(arg.constructor==Number)arg=arg.toString();if(typeof arg=="string"){arg=arg.replace(/(<(\w+)[^>]*?)\/>/g,function(m,all,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)?m:all+"></"+tag+">";});var s=jQuery.trim(arg).toLowerCase(),div=doc.createElement("div"),tb=[];var wrap=!s.indexOf("<opt")&&[1,"<select>","</select>"]||!s.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||s.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!s.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!s.indexOf("<td")||!s.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!s.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+arg+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){if(!s.indexOf("<table")&&s.indexOf("<tbody")<0)tb=div.firstChild&&div.firstChild.childNodes;else if(wrap[1]=="<table>"&&s.indexOf("<tbody")<0)tb=div.childNodes;for(var n=tb.length-1;n>=0;--n)if(jQuery.nodeName(tb[n],"tbody")&&!tb[n].childNodes.length)tb[n].parentNode.removeChild(tb[n]);if(/^\s/.test(arg))div.insertBefore(doc.createTextNode(arg.match(/^\s*/)[0]),div.firstChild);}arg=jQuery.makeArray(div.childNodes);}if(0===arg.length&&(!jQuery.nodeName(arg,"form")&&!jQuery.nodeName(arg,"select")))return;if(arg[0]==undefined||jQuery.nodeName(arg,"form")||arg.options)r.push(arg);else
r=jQuery.merge(r,arg);});return r;},attr:function(elem,name,value){var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(t){return(t||"").replace(/^\s+|\s+$/g,"");},makeArray:function(a){var r=[];if(typeof a!="array")for(var i=0,al=a.length;i<al;i++)r.push(a[i]);else
r=a.slice(0);return r;},inArray:function(b,a){for(var i=0,al=a.length;i<al;i++)if(a[i]==b)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(first){var r=[],done={};try{for(var i=0,fl=first.length;i<fl;i++){var id=jQuery.data(first[i]);if(!done[id]){done[id]=true;r.push(first[i]);}}}catch(e){r=first;}return r;},grep:function(elems,fn,inv){if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++)if(!inv&&fn(elems[i],i)||inv&&!fn(elems[i],i))result.push(elems[i]);return result;},map:function(elems,fn){if(typeof fn=="string")fn=eval("false||function(a){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++){var val=fn(elems[i],i);if(val!==null&&val!=undefined){if(val.constructor!=Array)val=[val];result=result.concat(val);}}return result;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",styleFloat:jQuery.browser.msie?"styleFloat":"cssFloat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength"}});jQuery.each({parent:"a.parentNode",parents:"jQuery.dir(a,'parentNode')",next:"jQuery.nth(a,2,'nextSibling')",prev:"jQuery.nth(a,2,'previousSibling')",nextAll:"jQuery.dir(a,'nextSibling')",prevAll:"jQuery.dir(a,'previousSibling')",siblings:"jQuery.sibling(a.parentNode.firstChild,a)",children:"jQuery.sibling(a.firstChild)",contents:"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"},function(i,n){jQuery.fn[i]=function(a){var ret=jQuery.map(this,n);if(a&&typeof a=="string")ret=jQuery.multiFilter(a,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(i,n){jQuery.fn[i]=function(){var a=arguments;return this.each(function(){for(var j=0,al=a.length;j<al;j++)jQuery(a[j])[n](this);});};});jQuery.each({removeAttr:function(key){jQuery.attr(this,key,"");this.removeAttribute(key);},addClass:function(c){jQuery.className.add(this,c);},removeClass:function(c){jQuery.className.remove(this,c);},toggleClass:function(c){jQuery.className[jQuery.className.has(this,c)?"remove":"add"](this,c);},remove:function(a){if(!a||jQuery.filter(a,[this]).r.length){jQuery.removeData(this);this.parentNode.removeChild(this);}},empty:function(){jQuery("*",this).each(function(){jQuery.removeData(this);});while(this.firstChild)this.removeChild(this.firstChild);}},function(i,n){jQuery.fn[i]=function(){return this.each(n,arguments);};});jQuery.each(["Height","Width"],function(i,name){var n=name.toLowerCase();jQuery.fn[n]=function(h){return this[0]==window?jQuery.browser.safari&&self["inner"+name]||jQuery.boxModel&&Math.max(document.documentElement["client"+name],document.body["client"+name])||document.body["client"+name]:this[0]==document?Math.max(document.body["scroll"+name],document.body["offset"+name]):h==undefined?(this.length?jQuery.css(this[0],n):null):this.css(n,h.constructor==String?h:h+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&!context.nodeType)context=null;context=context||document;var ret=[context],done=[],last;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){var nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName.toUpperCase()))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var nodeName=m[2],merge={};m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName.toUpperCase()){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=jQuery.filter(m[3],r,true).r;else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(\d*)n\+?(\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"n+"+m[3]||m[3]),first=(test[1]||1)-0,last=test[2]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==1){if(last==0||node.nodeIndex==last)add=true;}else if((node.nodeIndex+last)%first==0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(element,type,handler,data){if(jQuery.browser.msie&&element.setInterval!=undefined)element=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var parts=type.split(".");type=parts[0];handler.type=parts[1];var events=jQuery.data(element,"events")||jQuery.data(element,"events",{});var handle=jQuery.data(element,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(element,arguments);return val;});var handlers=events[type];if(!handlers){handlers=events[type]={};if(element.addEventListener)element.addEventListener(type,handle,false);else
element.attachEvent("on"+type,handle);}handlers[handler.guid]=handler;this.global[type]=true;},guid:1,global:{},remove:function(element,type,handler){var events=jQuery.data(element,"events"),ret,index;if(typeof type=="string"){var parts=type.split(".");type=parts[0];}if(events){if(type&&type.type){handler=type.handler;type=type.type;}if(!type){for(type in events)this.remove(element,type);}else if(events[type]){if(handler)delete events[type][handler.guid];else
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(element.removeEventListener)element.removeEventListener(type,jQuery.data(element,"handle"),false);else
element.detachEvent("on"+type,jQuery.data(element,"handle"));ret=null;delete events[type];}}for(ret in events)break;if(!ret){jQuery.removeData(element,"events");jQuery.removeData(element,"handle");}}},trigger:function(type,data,element,donative,extra){data=jQuery.makeArray(data||[]);if(!element){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{var val,ret,fn=jQuery.isFunction(element[type]||null),evt=!data[0]||!data[0].preventDefault;if(evt)data.unshift(this.fix({type:type,target:element}));if(jQuery.isFunction(jQuery.data(element,"handle")))val=jQuery.data(element,"handle").apply(element,data);if(!fn&&element["on"+type]&&element["on"+type].apply(element,data)===false)val=false;if(evt)data.shift();if(extra&&extra.apply(element,data)===false)val=false;if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(element,'a')&&type=="click")){this.triggered=true;element[type]();}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var c=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in c){args[0].handler=c[j];args[0].data=c[j].data;if(!parts[1]||c[j].type==parts[1]){var tmp=c[j].apply(this,args);if(val!==false)val=tmp;if(tmp===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target&&event.srcElement)event.target=event.srcElement;if(jQuery.browser.safari&&event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var e=document.documentElement,b=document.body;event.pageX=event.clientX+(e&&e.scrollLeft||b.scrollLeft||0);event.pageY=event.clientY+(e&&e.scrollTop||b.scrollTop||0);}if(!event.which&&(event.charCode||event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(){var a=arguments;return this.click(function(e){this.lastToggle=0==this.lastToggle?1:0;e.preventDefault();return a[this.lastToggle].apply(this,[e])||false;});},hover:function(f,g){function handleHover(e){var p=e.relatedTarget;while(p&&p!=this)try{p=p.parentNode;}catch(e){p=this;};if(p==this)return false;return(e.type=="mouseover"?f:g).apply(this,[e]);}return this.mouseover(handleHover).mouseout(handleHover);},ready:function(f){bindReady();if(jQuery.isReady)f.apply(document,[jQuery]);else
jQuery.readyList.push(function(){return f.apply(this,[jQuery]);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}if(jQuery.browser.mozilla||jQuery.browser.opera)document.removeEventListener("DOMContentLoaded",jQuery.ready,false);if(!window.frames.length)jQuery(window).load(function(){jQuery("#__ie_init").remove();});}}});jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,o){jQuery.fn[o]=function(f){return f?this.bind(o,f):this.trigger(o);};});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(jQuery.browser.mozilla||jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);else if(jQuery.browser.msie){document.write("<scr"+"ipt id=__ie_init defer=true "+"src=//:><\/script>");var script=document.getElementById("__ie_init");if(script)script.onreadystatechange=function(){if(this.readyState!="complete")return;jQuery.ready();};script=null;}else if(jQuery.browser.safari)jQuery.safariTimer=setInterval(function(){if(document.readyState=="loaded"||document.readyState=="complete"){clearInterval(jQuery.safariTimer);jQuery.safariTimer=null;jQuery.ready();}},10);jQuery.event.add(window,"load",jQuery.ready);}jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(i,val){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null},lastModified:{},ajax:function(s){var jsonp,jsre=/=(\?|%3F)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);var q=s.url.indexOf("?");if(q>-1){s.data=(s.data?s.data+"&":"")+s.url.slice(q+1);s.url=s.url.slice(0,q);}if(s.dataType=="jsonp"){if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&s.data&&s.data.match(jsre)){jsonp="jsonp"+jsc++;s.data=s.data.replace(jsre,"="+jsonp);s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get")s.data=(s.data?s.data+"&":"")+"_="+(new Date()).getTime();if(s.data&&s.type.toLowerCase()=="get"){s.url+="?"+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if(!s.url.indexOf("http")&&s.dataType=="script"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(!jsonp&&(s.success||s.complete)){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async);if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();return xml;function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock?this.oldblock:"";if(jQuery.css(this,"display")=="none")this.style.display="block";}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");if(this.oldblock=="none")this.oldblock="block";this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var opt=jQuery.speed(speed,easing,callback);return this[opt.queue===false?"each":"queue"](function(){opt=jQuery.extend({},opt);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]?)([\d.]+)(.*)$/),start=e.cur(true)||0;if(parts){end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=end+unit;start=(end/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-"?-1:1)*end)+start;e.custom(start,end,unit);}else
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(!fn){fn=type;type="fx";}if(!arguments.length)return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(){var timers=jQuery.timers;return this.each(function(){for(var i=0;i<timers.length;i++)if(timers[i].elem==this)timers.splice(i--,1);}).dequeue();}});var queue=function(elem,type,array){if(!elem)return;var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.curCSS(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.css(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(){return self.step();}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timers.length==1){var timer=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length)clearInterval(timer);},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(){var t=(new Date()).getTime();if(t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var absolute=jQuery.css(elem,"position")=="absolute",parent=elem.parentNode,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&!absolute&&parseInt(version)<522;if(elem.getBoundingClientRect){box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));if(msie){var border=jQuery("html").css("borderWidth");border=(border=="medium"||jQuery.boxModel&&parseInt(version)>=7)&&2||border;add(-border,-border);}}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&/^t[d|h]$/i.test(parent.tagName)||!safari2)border(offsetParent);if(safari2&&!absolute&&jQuery.css(offsetParent,"position")=="absolute")absolute=true;offsetParent=offsetParent.offsetParent;}while(parent.tagName&&/^body|html$/i.test(parent.tagName)){if(/^inline|table-row.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if(safari&&absolute)add(-doc.body.offsetLeft,-doc.body.offsetTop);}results={top:top,left:left};}return results;function border(elem){add(jQuery.css(elem,"borderLeftWidth"),jQuery.css(elem,"borderTopWidth"));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}};})();








































//-----api.js-----


if (!window['google']) {
window['google'] = {};
}
if (!window['google']['loader']) {
window['google']['loader'] = {};
google.loader.ServiceBase = 'http://www.google.com/uds';
google.loader.ApiKey = 'ABQIAAAA7d4SxF_Vp0WjP56yFVPCBxRJUKQnMwbg0ASlWRohIiUfa1bKKBSp6i7C8o3hv0PICpcSl5AoCylByA';
google.loader.KeyVerified = true;
google.loader.LoadFailure = false;
google.loader.AdditionalParams = '';
(function() { 
function p(a){if(a in s){return s[a]}return s[a]=navigator.userAgent.toLowerCase().indexOf(a)!=-1}
var s={};function x(){return p("msie")}
function y(){return p("safari")||p("konqueror")}
;
function I(a,b){var c=function(){}
;c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c}
var k={};var g={};var o=null;var D=false;function m(a){this.a=a}
m.prototype.b=function(a,b){var c="";if(b!=undefined){if(b["locale"]!=undefined){c+="&hl="+encodeURIComponent(b["locale"])}if(b["nocss"]!=undefined){c+="&output="+encodeURIComponent("nocss="+b["nocss"])}if(b["callback"]!=undefined){var d=z(b["callback"],this.a);c+="&callback="+encodeURIComponent(d)}if(b["other_params"]!=undefined){c+="&"+b["other_params"]}}if(o!=null&&!D){c+="&key="+encodeURIComponent(o);D=true}return google.loader.ServiceBase+"/?file="+this.a+"&v="+a+google.loader.AdditionalParams+
c}
;m.prototype.e=function(){return true}
;function l(a,b,c,d,e,f,E){this.a=a;this.j=b;this.i=c;this.d=d;this.f=e;this.h=f;this.c=E||{}}
I(l,m);l.prototype.b=function(a,b){var c="";if(this.d!=undefined){c+="&"+this.d+"="+encodeURIComponent(o?o:google.loader.ApiKey)}if(this.f!=undefined){c+="&"+this.f+"="+encodeURIComponent(a)}if(b!=undefined&&this.c!=undefined){for(var d in b){if(this.c[":"+d]!=undefined){var e;if(d=="callback"){e=z(b[d],this.a)}else{e=b[d]}var f=this.c[":"+d];if(typeof f=="string"){c+="&"+f+"="+encodeURIComponent(e)}else{c+="&"+f(e)}}else if(d=="other_params"){c+="&"+b[d]}}}google[this.a]={};if(!this.i&&c!=""){c=
"?"+c.substring(1)}w("el",this.a);return this.j+c}
;l.prototype.e=function(){return this.h}
;function J(a,b,c){var d=k[":"+a];if(!d){throw A("Module: '"+a+"' not found!");}else{var e=c&&c["callback"]!=null;if(e&&!d.e()){throw A("Module: '"+a+"' must be loaded before DOM onLoad!");}else if(e){if(g[a]){g[a].actualCallbacks.push(c["callback"])}else if(google[a]){setTimeout(c["callback"],0)}else{t("script",d.b(b,c),e)}}else{t("script",d.b(b,c),e)}}}
function A(a){var b=new Error(a);b.toString=function(){return this.message}
;return b}
function N(a,b){if(b){M(a)}else{r(window,"load",a)}}
function r(a,b,c){if(a.addEventListener){a.addEventListener(b,c,false)}else if(a.attachEvent){a.attachEvent("on"+b,c)}else{var d=a["on"+b];if(d!=null){a["on"+b]=H([c,d])}a["on"+b]=c}}
function H(a){return function(){for(var b=0;b<a.length;b++){a[b]()}}
}
var j=[];function M(a){if(j.length==0){r(window,"load",q);if(!x()&&!y()&&p("mozilla")||window.opera){window.addEventListener("DOMContentLoaded",q,false)}else if(x()){setTimeout(B,10)}else if(y()){setTimeout(C,10)}}j.push(a)}
function B(){try{if(j.length>0){document.firstChild.doScroll("left");q()}}catch(a){setTimeout(B,10)}}
var K={loaded:true,complete:true};function C(){if(K[document.readyState]){q()}else if(j>0){setTimeout(C,10)}}
function q(){for(var a=0;a<j.length;a++){j[a]()}j.length=0}
function L(a){var b=window.location.href;var c;var d=b.length;for(var e in a){var f=b.indexOf(e);if(f!=-1&&f<d){c=e;d=f}}o=c?a[c]:null}
function t(a,b,c){if(c){var d;if(a=="script"){d=document.createElement("script");d.type="text/javascript";d.src=b}else if(a=="css"){d=document.createElement("link");d.type="text/css";d.href=b;d.rel="stylesheet"}document.getElementsByTagName("head")[0].appendChild(d)}else{if(a=="script"){document.write('<script src="'+b+'" type="text/javascript"><\/script>')}else if(a=="css"){document.write('<link href="'+b+'" type="text/css" rel="stylesheet"></link>')}}}
function z(a,b){g[b]=function(){for(var c=0;c<g[b].actualCallbacks.length;c++){setTimeout(g[b].actualCallbacks[c],0)}delete g[b]}
;g[b].actualCallbacks=[a];return"google.loader.callbacks."+b}
function h(a,b){var c=a.split(/\./);var d=window;for(var e=0;e<c.length-1;e++){if(!d[c[e]]){d[c[e]]={}}d=d[c[e]]}d[c[c.length-1]]=b}
h("google.load",J);h("google.setOnLoadCallback",N);h("google.loader.writeLoadTag",t);h("google.loader.setApiKeyLookupMap",L);h("google.loader.callbacks",g);h("google_exportSymbol",h);
function i(){}
var v=i.g=false;var F=i.k=5;var n=i.n=[];var G=i.m=function(){if(!v){r(window,"unload",u);v=(i.g=true)}}
;var w=i.record=function(a,b){G();var c=a+(b?"="+b:"");n.push("r"+n.length+"="+encodeURIComponent(c));if(n.length>F){setTimeout(u,0)}}
;var u=i.l=function(){if(n.length){var a=new Image;a.src=google.loader.ServiceBase+"/stats?"+n.join("&")+"&nocache="+Number(new Date);n.length=0}}
;h("google.loader.recordStat",w);
k[":search"]=new m("search");k[":feeds"]=new m("feeds");k[":language"]=new m("language");k[":maps"]=new l("maps","http://maps.google.com/maps?file=googleapi",true,"key","v",true,{":locale":"hl",":callback":function(a){return"callback="+encodeURIComponent(a)+"&async=2"}
});k[":gdata"]=new l("gdata","http://gd.google.com/gd/api?file=gdata.js",true,"key","v",false);k[":sharing"]=new l("sharing","http://www.google.com/s2/sharing/js",false,"key","v",false,{":locale":"hl"});

 })()
}
if (window['google'] != undefined && window['google']['loader'] != undefined) {
if (!window['google']['search']) {
window['google']['search'] = {};
google.search.CurrentLocale = 'es';
google.search.ShortDatePattern = 'DMY';
google.search.Version = '1.0';
google.search.JSHash = '827f423b91df4dc97aaeb3a17d5711a0';
google.loader.ApiKey = 'ABQIAAAAJXT5qYPgWPtjQtArRwZEohSiADrdezK9JIx4gquGlIsBGsH0eBQKUdwc0J06yEsvH0a4l1p7UfB7Yg';
google.loader.KeyVerified = true;
google.loader.LoadFailure = false;

var _UDS_MSG_SEARCHER_IMAGE = ('Imagen');

var _UDS_MSG_SEARCHER_WEB = ('Web');

var _UDS_MSG_SEARCHER_BLOG = ('Blog');

var _UDS_MSG_SEARCHER_VIDEO = ('V\u00eddeo');

var _UDS_MSG_SEARCHER_LOCAL = ('Local');

var _UDS_MSG_SEARCHCONTROL_SAVE = ('guardar');

var _UDS_MSG_SEARCHCONTROL_KEEP = ('conservar');

var _UDS_MSG_SEARCHCONTROL_INCLUDE = ('incluir');

var _UDS_MSG_SEARCHCONTROL_COPY = ('copiar');

var _UDS_MSG_SEARCHCONTROL_CLOSE = ('cerrar');

var _UDS_MSG_SEARCHCONTROL_SPONSORED_LINKS = ('V\u00ednculos patrocinados');

var _UDS_MSG_SEARCHCONTROL_SEE_MORE = ('ver m\u00e1s...');

var _UDS_MSG_SEARCHCONTROL_WATERMARK = ('recortado de Google');

var _UDS_MSG_SEARCHER_CONFIG_SET_LOCATION = ('Ubicaci\u00f3n relacionada con la b\u00fasqueda');

var _UDS_MSG_SEARCHER_CONFIG_DISABLE_ADDRESS_LOOKUP = ('Inhabilitar la b\u00fasqueda de direcciones');

var _UDS_MSG_SEARCHER_NEWS = ('Noticias');

function _UDS_MSG_MINUTES_AGO(AGE_MINUTES_AGO) {
  return ('hace ' + AGE_MINUTES_AGO + ' minutos');
}

var _UDS_MSG_ONE_HOUR_AGO = ('hace 1 hora');

function _UDS_MSG_HOURS_AGO(AGE_HOURS_AGO) {
  return ('hace ' + AGE_HOURS_AGO + ' horas');
}

function _UDS_MSG_NEWS_ALL_N_RELATED(NUMBER) {
  return ('y ' + NUMBER + ' art\u00edculos relacionados');
}

var _UDS_MSG_NEWS_RELATED = ('Art\u00edculos relacionados');

var _UDS_MSG_BRANDING_STRING = ('con la tecnolog\u00eda de Google');

var _UDS_MSG_SORT_BY_DATE = ('Ordenar por fecha');

var _UDS_MSG_MONTH_ABBR_JAN = ('Ene');

var _UDS_MSG_MONTH_ABBR_FEB = ('Feb');

var _UDS_MSG_MONTH_ABBR_MAR = ('Mar');

var _UDS_MSG_MONTH_ABBR_APR = ('Abr');

var _UDS_MSG_MONTH_ABBR_MAY = ('May');

var _UDS_MSG_MONTH_ABBR_JUN = ('Jun');

var _UDS_MSG_MONTH_ABBR_JUL = ('Jul');

var _UDS_MSG_MONTH_ABBR_AUG = ('Ago');

var _UDS_MSG_MONTH_ABBR_SEP = ('Sep');

var _UDS_MSG_MONTH_ABBR_OCT = ('Oct');

var _UDS_MSG_MONTH_ABBR_NOV = ('Nov');

var _UDS_MSG_MONTH_ABBR_DEC = ('Dic');

var _UDS_MSG_DIRECTIONS = ('direcciones');

var _UDS_MSG_CLEAR_RESULTS = ('borrar resultados');

var _UDS_MSG_SHOW_ONE_RESULT = ('mostrar un resultado');

var _UDS_MSG_SHOW_MORE_RESULTS = ('mostrar m\u00e1s resultados');

var _UDS_MSG_SHOW_ALL_RESULTS = ('mostrar todos los resultados');

var _UDS_MSG_SETTINGS = ('ajustes');

var _UDS_MSG_SEARCH = ('buscar');

var _UDS_MSG_SEARCH_UC = ('Buscar');

var _UDS_MSG_POWERED_BY = ('con la tecnolog\u00eda de');

function _UDS_MSG_LOCAL_ATTRIBUTION(LOCAL_RESULTS_PROVIDER) {
  return ('Directorios empresariales proporcionados por ' + LOCAL_RESULTS_PROVIDER);
}

var _UDS_MSG_SEARCHER_BOOK = ('B\u00fasqueda de libros');

function _UDS_MSG_FOUND_ON_PAGE(FOUND_ON_PAGE) {
  return ('P\u00e1gina ' + FOUND_ON_PAGE);
}

function _UDS_MSG_TOTAL_PAGE_COUNT(PAGE_COUNT) {
  return ('' + PAGE_COUNT + ' p\u00e1ginas');
}

var _UDS_MSG_SEARCHER_BY = ('de');

var _UDS_MSG_SEARCHER_CODE = ('C\u00f3digo');

var _UDS_MSG_UNKNOWN_LICENSE = ('Licencia desconocida');

var _UDS_MSG_SEARCHER_GSA = ('Google Search Appliance');

var _UDS_MSG_SEARCHCONTROL_MORERESULTS = ('M\u00e1s resultados');

var _UDS_MSG_SEARCHCONTROL_PREVIOUS = ('Anterior');

var _UDS_MSG_SEARCHCONTROL_NEXT = ('Siguiente');

var _UDS_MSG_GET_DIRECTIONS = ('Obtener indicaciones');

var _UDS_MSG_GET_DIRECTIONS_TO_HERE = ('Hasta aqu\u00ed');

var _UDS_MSG_GET_DIRECTIONS_FROM_HERE = ('Desde aqu\u00ed');

var _UDS_MSG_CLEAR_RESULTS_UC = ('Borrar resultados');

var _UDS_MSG_SEARCH_THE_MAP = ('buscar en el mapa');

var _UDS_MSG_SCROLL_THROUGH_RESULTS = ('desplazarse por los resultados');

var _UDS_MSG_EDIT_TAGS = ('editar etiquetas');

var _UDS_MSG_TAG_THIS_SEARCH = ('etiquetar esta b\u00fasqueda');

var _UDS_MSG_SEARCH_STRING = ('cadena de b\u00fasqueda');

var _UDS_MSG_OPTIONAL_LABEL = ('etiqueta opcional');

var _UDS_MSG_DELETE = ('suprimir');

var _UDS_MSG_DELETED = ('suprimido');

var _UDS_MSG_CANCEL = ('cancelar');

var _UDS_MSG_UPLOAD_YOUR_VIDEOS = ('subir tu propio v\u00eddeo');

var _UDS_MSG_IM_DONE_WATCHING = ('he acabado de verlo');

var _UDS_MSG_CLOSE_VIDEO_PLAYER = ('cerrar reproductor de v\u00eddeo');

var _UDS_MSG_NO_RESULTS = ('No hay resultados.');

var _UDS_MSG_LINKEDCSE_ERROR_RESULTS = ('El motor de b\u00fasqueda de cupones se est\u00e1 cargando. Vuelve a intentarlo transcurridos unos segundos.');

var _UDS_MSG_COUPONS = ('Cupones');
google.loader.writeLoadTag("script", google.loader.ServiceBase + "/js/search.827f423b91df4dc97aaeb3a17d5711a0.compiled.js");
}
}






//-----cookies.js-----


var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};





//-----search.js-----


(function() { 
google_exportSymbol("UDS_ServiceBase",google.loader.ServiceBase);google_exportSymbol("UDS_OriginalAppPath",google.loader.OriginalAppPath);google_exportSymbol("UDS_ApiKey",google.loader.ApiKey);google_exportSymbol("UDS_KeyVerified",google.loader.KeyVerified);google_exportSymbol("UDS_LoadFailure",google.loader.LoadFailure);google_exportSymbol("UDS_CurrentLocale",google.search.CurrentLocale);google_exportSymbol("UDS_ShortDatePattern",google.search.ShortDatePattern);google_exportSymbol("UDS_Version",
google.search.Version);google_exportSymbol("UDS_JSHash",google.search.JSHash);
var i=new Object;i["blank"]="&nbsp;";i["image"]=_UDS_MSG_SEARCHER_IMAGE;i["web"]=_UDS_MSG_SEARCHER_WEB;i["blog"]=_UDS_MSG_SEARCHER_BLOG;i["video"]=_UDS_MSG_SEARCHER_VIDEO;i["local"]=_UDS_MSG_SEARCHER_LOCAL;i["news"]=_UDS_MSG_SEARCHER_NEWS;i["book"]=_UDS_MSG_SEARCHER_BOOK;i["save"]=_UDS_MSG_SEARCHCONTROL_SAVE;i["keep"]=_UDS_MSG_SEARCHCONTROL_KEEP;i["include"]=_UDS_MSG_SEARCHCONTROL_INCLUDE;i["copy"]=_UDS_MSG_SEARCHCONTROL_COPY;i["close"]=_UDS_MSG_SEARCHCONTROL_CLOSE;i["sponsored-links"]=_UDS_MSG_SEARCHCONTROL_SPONSORED_LINKS;
i["see-more"]=_UDS_MSG_SEARCHCONTROL_SEE_MORE;i["watermark"]=_UDS_MSG_SEARCHCONTROL_WATERMARK;i["search-location"]=_UDS_MSG_SEARCHER_CONFIG_SET_LOCATION;i["disable-address-lookup"]=_UDS_MSG_SEARCHER_CONFIG_DISABLE_ADDRESS_LOOKUP;i["sort-by-date"]=_UDS_MSG_SORT_BY_DATE;i["pbg"]=_UDS_MSG_BRANDING_STRING;i["n-minutes-ago"]=_UDS_MSG_MINUTES_AGO;i["n-hours-ago"]=_UDS_MSG_HOURS_AGO;i["one-hour-ago"]=_UDS_MSG_ONE_HOUR_AGO;i["all-n-related"]=_UDS_MSG_NEWS_ALL_N_RELATED;i["related-articles"]=_UDS_MSG_NEWS_RELATED;
i["page-count"]=_UDS_MSG_TOTAL_PAGE_COUNT;var A=new Array;A[0]=_UDS_MSG_MONTH_ABBR_JAN;A[1]=_UDS_MSG_MONTH_ABBR_FEB;A[2]=_UDS_MSG_MONTH_ABBR_MAR;A[3]=_UDS_MSG_MONTH_ABBR_APR;A[4]=_UDS_MSG_MONTH_ABBR_MAY;A[5]=_UDS_MSG_MONTH_ABBR_JUN;A[6]=_UDS_MSG_MONTH_ABBR_JUL;A[7]=_UDS_MSG_MONTH_ABBR_AUG;A[8]=_UDS_MSG_MONTH_ABBR_SEP;A[9]=_UDS_MSG_MONTH_ABBR_OCT;A[10]=_UDS_MSG_MONTH_ABBR_NOV;A[11]=_UDS_MSG_MONTH_ABBR_DEC;i["month-abbr"]=A;i["directions"]=_UDS_MSG_DIRECTIONS;i["clear-results"]=_UDS_MSG_CLEAR_RESULTS;
i["show-one-result"]=_UDS_MSG_SHOW_ONE_RESULT;i["show-more-results"]=_UDS_MSG_SHOW_MORE_RESULTS;i["show-all-results"]=_UDS_MSG_SHOW_ALL_RESULTS;i["settings"]=_UDS_MSG_SETTINGS;i["search"]=_UDS_MSG_SEARCH;i["search-uc"]=_UDS_MSG_SEARCH_UC;i["powered-by"]=_UDS_MSG_POWERED_BY;i["sa"]=_UDS_MSG_SEARCHER_GSA;i["by"]=_UDS_MSG_SEARCHER_BY;i["code"]=_UDS_MSG_SEARCHER_CODE;i["unknown-license"]=_UDS_MSG_UNKNOWN_LICENSE;i["more-results"]=_UDS_MSG_SEARCHCONTROL_MORERESULTS;i["previous"]=_UDS_MSG_SEARCHCONTROL_PREVIOUS;
i["next"]=_UDS_MSG_SEARCHCONTROL_NEXT;i["get-directions"]=_UDS_MSG_GET_DIRECTIONS;i["to-here"]=_UDS_MSG_GET_DIRECTIONS_TO_HERE;i["from-here"]=_UDS_MSG_GET_DIRECTIONS_FROM_HERE;i["clear-results-uc"]=_UDS_MSG_CLEAR_RESULTS_UC;i["search-the-map"]=_UDS_MSG_SEARCH_THE_MAP;i["scroll-results"]=_UDS_MSG_SCROLL_THROUGH_RESULTS;i["edit-tags"]=_UDS_MSG_EDIT_TAGS;i["tag-search"]=_UDS_MSG_TAG_THIS_SEARCH;i["search-string"]=_UDS_MSG_SEARCH_STRING;i["optional-label"]=_UDS_MSG_OPTIONAL_LABEL;i["delete"]=_UDS_MSG_DELETE;
i["deleted"]=_UDS_MSG_DELETED;i["cancel"]=_UDS_MSG_CANCEL;i["upload-video"]=_UDS_MSG_UPLOAD_YOUR_VIDEOS;i["im-done"]=_UDS_MSG_IM_DONE_WATCHING;i["close-player"]=_UDS_MSG_CLOSE_VIDEO_PLAYER;i["no-results"]=_UDS_MSG_NO_RESULTS;i["linked-cse-error-results"]=_UDS_MSG_LINKEDCSE_ERROR_RESULTS;i["coupons"]=_UDS_MSG_COUPONS;
Function.prototype.E=function(a){var b=function(){}
;b.prototype=a.prototype;this.prototype=new b;this.prototype.__super__=function(c,d,f,e){var h=Array.prototype.ae.apply(arguments,[1,arguments.length]);return c.apply(this,h)}
}
;var _json_cache_defeater_=(new Date).getTime();var _json_request_require_prep=true;function ob(a){return a+"&key="+UDS_ApiKey+"&v="+UDS_Version}
function ma(a){if(ga("msie")&&Ic("msie 6.0")){var b=t(this,nb,[a]);setTimeout(b,0)}else{nb(a)}}
function nb(a){var b=document.getElementsByTagName("head")[0];var c=document.createElement("script");c.type="text/javascript";c.charset="utf-8";var d=_json_request_require_prep?ob(a):a;if(na()||qb()){d=d+"&nocache="+_json_cache_defeater_++}c.src=d;var f=function(){c.onload=null;var h=c.parentNode;h.removeChild(c);delete c}
;var e=function(h){var j=(h?h:window.event).target?(h?h:window.event).target:(h?h:window.event).srcElement;if(j.readyState=="loaded"||j.readyState=="complete"){j.onreadystatechange=null;f()}}
;if(navigator.product=="Gecko"){c.onload=f}else{c.onreadystatechange=e}b.appendChild(c)}
function P(a,b){return function(){return b.apply(a,arguments)}
}
function t(a,b,c){return function(){return b.apply(a,c)}
}
function Q(a){while(a.firstChild){a.removeChild(a.firstChild)}}
function Rb(a,b){if(a){try{Q(a);a.appendChild(b)}catch(c){}}return b}
function g(a,b){try{a.appendChild(b)}catch(c){}return b}
function ab(a,b){a.innerHTML=b}
function $a(a){return document.createTextNode(a?a:"")}
function m(a,b){var c=document.createElement("div");if(a){c.innerHTML=a}if(b){c.className=b}return c}
function o(a){var b=document.createElement("div");if(a){b.className=a}return b}
function xa(a,b){var c=document.createElement("span");if(a){g(c,$a(a))}if(b){c.className=b}return c}
function W(a,b,c){var d=document.createElement("table");d.setAttribute("cellSpacing",a?a:0);d.setAttribute("cellPadding",b?b:0);if(c){d.className=c}return d}
function O(a,b,c){var d=a.insertRow(-1);if(!d){alert(d)}for(var f=0;f<b;f++){w(d,c)}return d}
function w(a,b){var c=a.insertCell(-1);if(b){c.className=b}return c}
function J(a,b,c,d){var f=document.createElement("img");f.src=a;if(b){f.width=b}if(c){f.height=c}if(d){f.className=d}return f}
function bb(a,b,c,d){var f;if(na()){f=o(d);f.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+a+'")';f.style.width=b+"px";f.style.height=c+"px"}else{f=J(a,null,null,d)}return f}
function da(a,b,c,d,f){var e=document.createElement("a");e.href=a;if(b){if(d){g(e,xa(b,d))}else{g(e,$a(b))}}if(c){e.target=c}if(f){e.title=f}return e}
function u(a,b,c,d,f){var e=m(null,d);var h=document.createElement("a");h.href=a;h.innerHTML=b;if(d){h.className=d}if(c){h.target=c}if(f){h.title=f}e.appendChild(h);return e}
function Ya(a){var b=document.createElement("form");if(a){b.className=a}return b}
function ca(a,b){var c=document.createElement("input");c.type="submit";c.value=a;if(b){c.className=b}return c}
function Za(a,b,c){var d=document.createElement("input");d.setAttribute("autoComplete","off");d.type="text";if(a==-1){n(d,"util-css-expand")}else{d.size=a>0?a:10}if(b){n(d,b)}if(c){d.value=c}return d}
function ka(a,b,c,d){var f=document.createElement("input");f.type="checkbox";f.name=a;f.value=b;if(d){f.className=d}if(c){f.checked=c}return f}
function B(a,b){a.className=b}
function n(a,b){Pb(a,b)}
function z(a,b){Sb(a,b)}
function Qb(a,b){if(a==null||a.className==null)return false;var c=a.className.split(" ");for(var d=0;d<c.length;d++){if(c[d]==b){return true}}return false}
function Pb(a,b){if(Qb(a,b))return;a.className+=" "+b}
function Sb(a,b){if(a.className==null)return;var c=a.className.split(" ");var d=[];var f=false;for(var e=0;e<c.length;e++){if(c[e]!=b){if(c[e]){d.push(c[e])}}else{f=true}}if(f){a.className=d.join(" ")}}
function ba(a){if(V!=""){return V}var b=a.toLowerCase().split(".");if(b.length<2){V=(ba.wa=".com")}var c=b.pop();var d=b.pop();if(c.length==2){if(ja[d]&&ja[d][c]==1){V=(ba.wa="."+d+"."+c)}else{V=(ba.wa="."+c)}}else{V=(ba.wa=".com")}return V}
var V=ba.wa="";var ja={co:{ck:1,cr:1,hu:1,id:1,il:1,"in":1,je:1,jp:1,ke:1,kr:1,ls:1,nz:1,th:1,ug:1,uk:1,ve:1,vi:1,za:1},com:{ag:1,ar:1,au:1,bo:1,br:1,bz:1,co:1,cu:1,"do":1,ec:1,fj:1,gi:1,gr:1,gt:1,hk:1,jm:1,ly:1,mt:1,mx:1,my:1,na:1,nf:1,ni:1,np:1,pa:1,pe:1,ph:1,pk:1,pr:1,py:1,sa:1,sg:1,sv:1,tr:1,tw:1,ua:1,uy:1,vc:1,vn:1},off:{ai:1}};function Od(a){var b=a.toLowerCase().split(".");if(b.length<2){return false}var c=b.pop();var d=b.pop();if((d=="igoogle"||d=="gmodules"||d=="googlesyndication")&&c=="com"
){return true}if(c.length==2&&b.length>0){if(ja[d]&&ja[d][c]==1){d=b.pop()}}return d=="google"}
function ga(a){if(a in Oa){return Oa[a]}return Oa[a]=navigator.userAgent.toLowerCase().indexOf(a)!=-1}
function Ic(a){if(a in Pa){return Pa[a]}return Pa[a]=navigator.appVersion.toLowerCase().indexOf(a)!=-1}
var Oa={};var Pa={};function na(){return ga("msie")}
function qb(){return ga("safari")||ga("konqueror")}
function pb(){return ga("opera")}
function Ob(a){this.branding=a+"branding";this.vertical=a+"branding-vertical";this.img=a+"branding-img";this.userDefined=a+"branding-user-defined";this.imgNoClear=a+"branding-img-noclear";this.clickable=a+"branding-clickable";this.text=a+"branding-text"}
function Nd(a,b,c,d){var f=new Ob(a);var e=o(f.branding);var h=W(null,null,f.branding);g(e,h);var j=!c;if(!j){n(e,f.vertical);n(h,f.vertical)}var l=O(h,0);var p;var q;if(j){p=l;q=l}else{p=l;q=O(h,0)}var r="/css/small-logo.png";var s=51;var x=15;if(d){if(typeof d=="string"){if(d.match(/^http:\/\/www\.youtube\.com/)){r="/css/youtube-logo-55x24.png";s=55;x=24;n(e,f.branding+"-youtube");if(!j){n(e,f.vertical+"-youtube");n(h,f.vertical+"-youtube")}}}}var F=w(p,f.text);var v=w(q,f.imgNoClear);var y=m(i[
"powered-by"],f.text);var C=UDS_ServiceBase+r;var D=bb(C,s,x,f.imgNoClear);g(F,y);if(d){var fa="http://www.google.com";if(typeof d=="string"&&(d.match(/^http:\/\/[a-z]*\.google\.com/)||d.match(/^http:\/\/www\.youtube\.com/))){fa=d}var Na=da(fa,null,"_BLANK");Na.className=f.clickable;g(Na,D);g(v,Na)}else{g(v,D)}if(b){Q(b);g(b,e)}return e}
function Md(a,b){var c;var d=a.getFullYear();var f=a.getMonth();var e=i["month-abbr"][f];var h=a.getDate();if(h<10){h="0"+h}switch(b){case "MDY":c=e+" "+h+", "+d;break;case "YMD":c=d+" "+e+" "+h;break;default:case "DMY":c=h+" "+e+" "+d;break}return c}
var Nb=Xa.ib=3600000;var Ld=Xa.jb=60000;var Kd=Xa.hb=86400000;function Xa(a,b){var c=new Date;var d=c.getTime();var f=a.getTime();var e;if(d<f){return i["n-minutes-ago"](2)}var h=d-f;if(h<Nb){var j=parseInt(h/Ld);if(j<=1){e=2}else{e=j}return i["n-minutes-ago"](e)}if(h<Kd){var l=parseInt(h/Nb);if(l<=1){return i["one-hour-ago"]}else{e=l;return i["n-hours-ago"](e)}}return Md(a,b)}
;
function k(){}
var E=k.wd="gs-result";var vd=k.dd="gs-error-result";var zd=k.nd="gs-no-results-result";k.ed="gs-id";var va=k.Ed="gs-spacer";var I=k.Hd="gs-title";var M=k.Dd="gs-snippet";var N=k.Id="gs-visibleUrl";var Lb=k.Jd="gs-visibleUrl-long";var Hd=k.Kd="gs-visibleUrl-short";var Id=k.Ld="gs-watermark";var Dd=k.xd="gs-results-attribution";var Db=k.Vc="gs-address";var Kb=k.Fd="gs-street";var Eb=k.Yc="gs-city";var Hb=k.ud="gs-region";var rd=k.$c="gs-country";var Fb=k.rd="gs-phone";var sd=k.ad="gs-directions";var td=
k.bd="gs-directions-to-from";var wd=k.hd="gs-label";var Jb=k.Ad="gs-secondary-link";var od=k.Wc="gs-author";var Gb=k.td="gs-publisher";var yd=k.ld="gs-location";var qd=k.Zc="gs-clusterUrl";var sa=k.gd="gs-image-box";var pd=k.Xc="gs-image-box gs-book-image-box";var ia=k.Gd="gs-text-box";k.md="gs-metadata";var Ed=k.yd="gs-row-1";var Fd=k.zd="gs-row-2";k.Bd="gs-shadow";var Cd=k.qd="gs-pages";var Bd=k.pd="gs-page-edge";var H=k.fd="gs-image";var Gd=k.Cd="gs-size";var Ad=k.od="gs-pageCount";var ua=k.sd=
"gs-publishedDate";var Ib=k.vd="gs-relativePublishedDate";var Jd=k.Md="gs-webAd";var xd=k.kd="gs-localAd";var Cb=k.Uc="gs-ad-marker";var ta=k.jd="gs-line";var ud=k.cd="gs-divider";var Tc=k.fc="gsc-control";var $c=k.pc="gsc-narrow";var zb=k.Cc="gsc-search-box";var Ab=k.Dc="gsc-search-button";var tb=k.Vb="gsc-clear-button";var vb=k.lc="gsc-input";var Kc=k.Ob="gsc-branding";k.Ub="gsc-branding-vertical";var Mc=k.Qb="gsc-branding-img";var Oc=k.Tb="gsc-branding-user-defined";var Nc=k.Rb="gsc-branding-img-noclear"
;var Lc=k.Pb="gsc-branding-clickable";var sb=k.Sb="gsc-branding-text";var Ra=k.xc="gsc-resultsRoot";var ed=k.yc="gsc-results";var Qa=k.rc="gsc-result";var dd=k.wc="gsc-resultsHeader";var U=k.Ac="gsc-resultsbox-invisible";var L=k.Bc="gsc-resultsbox-visible";var Yc=k.kc="gsc-expansionArea";var kd=k.Oc="gsc-trailing-more-results";var Vc=k.hc="gsc-cursor-box";var Uc=k.gc="gsc-cursor";var Xc=k.jc="gsc-cursor-page";var Wc=k.ic="gsc-cursor-current-page";var Jc=k.Mb="gsc-ad-box";var ld=k.Pc="gsc-twiddleRegionCell"
;var Pc=k.Wb="gsc-configLabelCell";var Qc=k.Xb="gsc-configLabel";var md=k.Qc="gsc-twiddle";var ha=k.Rc="gsc-twiddle-closed";var ra=k.Sc="gsc-twiddle-opened";var jd=k.Nc="gsc-title";var gd=k.Ec="gsc-stats";var wb=k.mc="gsc-keeper";var cd=k.uc="gsc-result-selector gsc-one-result";var bd=k.tc="gsc-result-selector gsc-more-results";var ad=k.sc="gsc-result-selector gsc-all-results";var fd=k.zc="gsc-results-selector";var yb=k.qc="gsc-one-result-active";var xb=k.oc="gsc-more-results-active";var rb=k.Nb=
"gsc-all-results-active";var Wa=k.Mc="gsc-tabsArea";var Bb=k.Lc="gsc-tabsAreaInvisible";var id=k.Gc="gsc-tabHeader";var Ua=k.Jc="gsc-tabhActive";var Va=k.Kc="gsc-tabhInactive";var Sa=k.Hc="gsc-tabdActive";var Ta=k.Ic="gsc-tabdInactive";var hd=k.Fc="gsc-tabData";var ub=k.dc="gsc-config";var qa=k.cc="gsc-configSetting";var T=k.bc="gsc-configSettingSubmit";var pa=k.Zb="gsc-configSettingCheckbox";var oa=k.Yb="gsc-configSettingCheckboxLabel";var Sc=k.ac="gsc-configSettingInput";var Rc=k.$b="gsc-configSettingInputLabel"
;var Zc=k.nc="gsc-locationConfig";var nd=k.Tc="gsc-video-player";k.Lb="as-results";k.Kb="as-result-vertical";k.Jb="as-result-horizontal";k.Ib="as-result-cell";k.Hb="as-branding-cell";
var Tb=GSearch.BASE=UDS_ServiceBase;var X=GSearch.LARGE_RESULTSET="large";var G=GSearch.SMALL_RESULTSET="small";GSearch.LARGE_RESULTS=8;GSearch.LARGE_ADS=4;GSearch.SMALL_RESULTS=4;GSearch.SMALL_ADS=2;var Ub=GSearch.KEEP_SWEEPER_DELAY=5000;GSearch.LINK_TARGET_TOP="_top";GSearch.LINK_TARGET_SELF="_self";GSearch.LINK_TARGET_PARENT="_parent";var cb=GSearch.LINK_TARGET_BLANK="_blank";var Z=GSearch.ORDER_BY_RELEVANCE="order-by-relevance";var Y=GSearch.ORDER_BY_DATE="order-by-date";var Xb=GSearch.RESTRICT_TYPE=
"restrict-type";var eb=GSearch.RESTRICT_SAFESEARCH="restrict-safesearch";var hb=GSearch.SAFESEARCH_STRICT="active";var gb=GSearch.SAFESEARCH_OFF="off";var fb=GSearch.SAFESEARCH_MODERATE="moderate";GSearch.strings=i;function GSearch(){this.Od=null;this.K=null;this.gb=0;this.ya=0;this.Ma=true;this.l={width:100,height:75};this.O=cb;this.bb=1;this.setResultSetSize(G);this.clearResults();this.Fa=null;this.Ga=null;this.Va=null;this.Pa=null;this.ha=null;this.ga=null;this.la=null;this.m="null";this.h=null;
this.i=null;this.gwsUrl=null;this.G=new Array;if(typeof window==="object"&&window.location&&window.location.hostname&&window.location.hostname!=""){this.Oa=ba(window.location.hostname)}else{this.Oa=".com"}this.aa=null;this.da=null}
GSearch.deferRequest=function(a){var b=t(this,ma,[a]);setTimeout(b,0)}
;GSearch.prototype.Ab=function(){var a=this.M+"?hl="+UDS_CurrentLocale+"&source=uds";if(this.i){a=a+this.i}else{a=a+"&q="}if(this.$&&this.$!=""){return this.$}else{return a}}
;GSearch.prototype.setQueryAddition=function(a){if(a==null||a==""){this.h=null}else{this.h=a}}
;GSearch.prototype.F=function(a,b,c){var d=Tb+this.H+"?callback="+a+"&context="+b+"&lstkp="+this.mb()+"&rsz="+this.ra+"&hl="+UDS_CurrentLocale;if(this.Oa){d+="&gss="+this.Oa}if(UDS_JSHash){d+="&sig="+UDS_JSHash}if(c){d+="&start="+c}return d}
;GSearch.prototype.setLinkTarget=function(a){this.O=a}
;GSearch.prototype.d=function(){if(this.O&&this.O!=""){return this.O}else{return null}}
;GSearch.prototype.$a=function(){this.gb++;this.ya++;if(this.la){clearTimeout(this.la)}this.la=setTimeout(t(this,this.execute,[null]),Ub)}
;GSearch.prototype.mb=function(){clearTimeout(this.la);var a=this.ya;this.ya=0;return a}
;GSearch.prototype.Na=function(){if(this.Fa==null){this.Fa="gsc-"+this.m+"Result"}return this.Fa}
;GSearch.prototype.C=function(){if(this.Ga==null){this.Ga="gs-"+this.m+"Result"}return this.Ga}
;GSearch.prototype.vb=function(){if(this.Va==null){this.Va=i[this.m]}if(this.ha){return this.ha}else{return this.Va}}
;GSearch.prototype.tb=function(){if(this.Pa==null){this.Pa=i[this.m]}if(this.ha){return this.ha}else{return this.Pa}}
;GSearch.prototype.getResultSetSize=function(){return this.ra}
;GSearch.prototype.setResultSetSize=function(a){switch(a){case X:this.ra=X;break;default:case G:this.ra=G;break}}
;GSearch.prototype.execute=function(a){var b=this.u(a,null,null);if(window._googleudsextrastuff){b=b+window._googleudsextrastuff}this.cursor=null;this.yb=a;ma(b);if(this.G&&this.G.length>0){for(var c=0;c<this.G.length;c++){this.G[c].execute(a)}}}
;GSearch.prototype.Za=function(a){if(this.cursor&&a<this.cursor.pages.length){var b=this.u(this.yb,null,null,this.cursor.pages[a].start);this.cursor=null;ma(b)}}
;GSearch.prototype.addRelatedSearcher=function(a){if(this.G){this.G.push(a)}}
;GSearch.prototype.getExecuteUrl=function(a,b,c){var d=this.u(a,b,c);return ob(d)}
;GSearch.prototype.B=function(a){var b="http://code.google.com/apis/ajaxsearch/faq.html";var c=i["watermark"]+" - "+this.nb();var d=u(b,c,"_blank",Id);g(a,d)}
;GSearch.prototype.nb=function(){var a=new Date;var b=a.getMonth()+1+"/"+a.getFullYear();return b}
;GSearch.prototype.formatToShortDate=function(a){var b;var c=a.getFullYear();var d=a.getMonth();var f=i["month-abbr"][d];var e=a.getDate();if(e<10){e="0"+e}switch(UDS_ShortDatePattern){case "MDY":b=f+" "+e+", "+c;break;case "YMD":b=c+" "+f+" "+e;break;default:case "DMY":b=e+" "+f+" "+c;break}return b}
;var db=GSearch.ib=3600000;var Wb=GSearch.jb=60000;var Vb=GSearch.hb=86400000;GSearch.prototype.formatToRelativeDate=function(a){var b=new Date;var c=b.getTime();var d=a.getTime();var f;if(c<d){return i["n-minutes-ago"](2)}var e=c-d;if(e<db){var h=parseInt(e/Wb);if(h<=1){f=2}else{f=h}return i["n-minutes-ago"](f)}if(e<Vb){var j=parseInt(e/db);if(j<=1){return i["one-hour-ago"]}else{f=j;return i["n-hours-ago"](f)}}return this.formatToShortDate(a)}
;GSearch.prototype.clearResults=function(){this.gwsUrl=null;this.Zd=null;this.results=new Array;this.adResults=new Array}
;GSearch.prototype.Ya=function(){if(this.Xa){this.Xa()}}
;GSearch.prototype.onSearchComplete=function(a,b,c,d){if(a==null&&b==204){return}this.gwsUrl=null;if(this.results&&this.results.length>0){for(var f=0;f<this.results.length;f++){if(this.results[f].html){Mb(this.results[f].html)}}}if(this.adResults&&this.adResults.length>0){for(var f=0;f<this.adResults.length;f++){if(this.adResults[f].html){Mb(this.adResults[f].html)}}}if(a&&a.results&&a.results.length>0){this.results=a.results;if(a.cursor&&a.cursor.moreResultsUrl){this.gwsUrl=a.cursor.moreResultsUrl}
else if(this.i&&this.M){this.gwsUrl=this.Ab()}}else{this.results=new Array}if(a&&a.adResults&&a.adResults.length>0){this.adResults=a.adResults}else{this.adResults=new Array}this.completionStatus=b;this.hashStatus=d;this.completionFailureDetails=c;if(a&&a.resultAttribution&&a.resultAttribution!=null&&a.resultAttribution!=""){this.qa=a.resultAttribution}else{this.qa=null}if(a&&a.cursor&&a.cursor.pages&&a.cursor.pages.length>0){this.cursor=a.cursor}if(this.Ma){this.Wa()}this.Ya()}
;GSearch.prototype.getAttribution=function(){var a=null;if(this.qa){a=m(this.qa,Dd)}return a}
;GSearch.prototype.Wa=function(){var a;var b;for(a=0;a<this.results.length;a++){b=this.results[a];this.createResultHtml(b)}for(a=0;a<this.adResults.length;a++){b=this.adResults[a];this.ia(b)}}
;GSearch.prototype.ia=function(a){if(a.html){delete a.html}}
;GSearch.prototype.setSearchCompleteCallback=function(a,b,c){if(!c){c=[null]}this.Xa=t(a,b,c)}
;var K=GSearch.AllocateCompletionMapContext=function(a,b){var c=false;var d=null;if(a.length){for(var f=0;f<a.length;f++){if(a[f]==null){a[f]=b;d=f;c=true;break}}}if(!c){d=a.length;a.push(b)}return d}
;GSearch.prototype.setUserDefinedLabel=function(a){this.ha=a}
;GSearch.prototype.setUserDefinedClassSuffix=function(a){this.ga=a}
;GSearch.prototype.setNoHtmlGeneration=function(){this.Ma=false}
;GSearch.scaleImage=function(a,b,c,d,f){var e=c.width/a;var h=c.height/b;var j=Math.min(e,h);var l=Math.min(j,1);var p=new Object;p.width=Math.round(a*l);p.height=Math.round(b*l);if(d){d.width=p.width;d.height=p.height;if(f){var q=(c.width-p.width)/2;d.style.left=q+"px"}}return p}
;var Yb=GSearch.VERTICAL_BRANDING=1;GSearch.HORIZONTAL_BRANDING=2;GSearch.getBranding=function(a,b,c){return Nd("gsc-",a,b&&b==Yb,c)}
;GSearch.setOnLoadCallback=function(a,b){google.setOnLoadCallback(a,b)}
;var wa;function Mb(a){if(!wa){wa=document.createElement("DIV")}wa.appendChild(a);wa.innerHTML=""}
GSearch.prototype.qb=function(a){var b=this.aa;if(a){b=a}var c=new Object;var d=o(this.C());n(d,E);n(d,vd);var f;f=m(b,M);g(d,f);c.html=d;return c}
;GSearch.prototype.rb=function(a){var b=this.da;if(a){b=a}var c=new Object;var d=o(this.C());n(d,E);n(d,zd);var f;f=m(b,M);g(d,f);c.html=d;return c}
;
function GwebSearch(){GSearch.call(this);this.m="web";this.H="/GwebSearch";this.M="http://www.google.com/search";this.c=null;this.s=S;this.L=null;this.Ha=null;this.$=null;this.p=null}
GwebSearch.E(GSearch);GwebSearch.RESULT_CLASS="GwebSearch";GwebSearch.AD_CLASS="GwebSearch.ad";var La=GwebSearch.cxRestriction_CX="cx";var mb=GwebSearch.cxRestriction_CREF="cref";var S=GwebSearch.cxRestriction_NONE="none";var Ma=GwebSearch.N=new Array;GwebSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Ma[e];Ma[e]=null;h.onSearchComplete(b,c,d,f)}
;GwebSearch.prototype.u=function(a,b,c,d){var f;if(c==null){f=K(Ma,this)}else{f=c}var e;if(b==null){e="GwebSearch.RawCompletion"}else{e=b}var h=this.F(e,f,d);if(a){var j;var l=a;if(this.h){l=l+" "+this.h}if(this.c&&this.s!=S&&this.Ha){var p=this.Ha;var q=l;if(this.L!=null){q=l+" more:"+this.L}p=p.replace(/__HL__/,UDS_CurrentLocale);p=p.replace(/__QUERY__/,encodeURIComponent(q));this.$=p}if(this.c&&this.s==S){l=l+" site:"+this.c}j="";if(this.c&&this.s!=S){if(this.s==La){j=j+"&cx="+this.c}else if(this.s==
mb){j=j+"&cref="+encodeURIComponent(this.c)}if(this.L!=null){l=l+" more:"+this.L}}j=j+"&q="+encodeURIComponent(l);if(this.p){j=j+"&safe="+this.p}h=h+j;this.i=j;if(d&&d!=0){this.i=this.i+"&start="+d}}return h}
;GwebSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c;c=u(a.unescapedUrl,a.title,this.d(),I);g(b,c);c=m(a.content,M);g(b,c);c=m(a.visibleUrl,N);g(b,c);n(c,Hd);var d=a.unescapedUrl.indexOf(a.visibleUrl);var f=a.visibleUrl;if(d!=-1&&d!=0){f=a.unescapedUrl.substring(d)}c=m(f,N);n(c,Lb);g(b,c);a.html=b;this.B(a.html)}
;GwebSearch.prototype.ia=function(a){if(a.html){delete a.html}var b=o(Jd);n(b,E);var c;c=u(a.unescapedUrl,a.title,this.d(),I);g(b,c);if(a.content1){c=m(a.content1,ta);g(b,c)}if(a.content2){c=m(a.content2,ta);g(b,c)}c=m(a.visibleUrl,N);var d=J(a.impressionUrl,12,12,Cb);g(c,d);g(b,c);a.html=b;this.B(a.html)}
;GwebSearch.prototype.setSiteRestriction=function(a,b,c){this.$=null;this.aa=null;var d=false;if(a==null||typeof a=="string"&&a==""){d=false;this.c=null;this.s=S;this.L=null;this.aa=null}else if(typeof a=="string"){d=a.match(/^\d{21}:.*/);if(d){this.c=a;this.s=La}else{this.c=a;this.s=S}}else{if(a.siteUrl){d=false;this.c=a.siteUrl}else if(a.cseId){d=true;this.c=a.cseId;this.s=La}else if(a.crefUrl){d=true;this.c=a.crefUrl;this.s=mb;this.aa=i["linked-cse-error-results"]}else{d=false;this.c=null;this.s=
S;this.L=null}}if(d){if(b){this.L=b}if(c){if(c.match(/__HL__/)&&c.match(/__QUERY__/)){this.Ha=c}}}}
;GwebSearch.prototype.setRestriction=function(a,b){if(a==eb){if(b){if(b==hb||b==gb||b==fb){this.p=b}else{this.p=null}}else{this.p=null}}}
;
function GadSenseSearch(a){GSearch.call(this);this.m="ad";this.Ia=null;this.Ja=null;if(a){if(window["google_dynamic_adsense_units"]==null){return}var b=window["google_dynamic_adsense_units"][a];if(b!=null&&b._bind()){this.Ia=b}}else{var c=window.googleAFSAdsUpdater;if(c!=null&&c._bind()){this.Ja=c}}}
GadSenseSearch.E(GSearch);GadSenseSearch.prototype.execute=function(a,b){var c=a;if(this.h){c=c+" "+this.h}if(this.Ia){this.Ia._updateAds(c)}else if(this.Ja){this.Ja._updateAds(c)}}
;
function GsaSearch(a){GSearch.call(this);this.lb=a;this.m="sa";this.H="/ajax"}
GsaSearch.E(GSearch);GsaSearch.RESULT_CLASS="GsaSearch";GsaSearch.AD_CLASS="GsaSearch.ad";var Ja=GsaSearch.N=new Array;GsaSearch.RawCompletion=function(a,b,c){var d=0;if(a){d=parseInt(a)}var f=Ja[d];Ja[d]=null;f.onSearchComplete(b,c)}
;var Dc=GsaSearch.NEXT_PAGE="next";var Ec=GsaSearch.PREV_PAGE="prev";GsaSearch.prototype.execute=function(a,b){var c=this.u(a,null,null,b);ma(c)}
;GsaSearch.prototype.u=function(a,b,c,d){var f;if(c==null){f=K(Ja,this)}else{f=c}var e;if(b==null){e="GsaSearch.RawCompletion"}else{e=b}var h=this.F(e,f,d);if(a){var j=a;if(this.h){j=j+" "+this.h}h=h+"&q="+encodeURIComponent(j)}return h}
;GsaSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c;c=u(a.unescapedUrl,a.title,this.d(),I);g(b,c);c=m(a.content,M);g(b,c);c=m(a.visibleUrl,N);g(b,c);n(c,Lb);a.html=b;this.B(a.html)}
;var Fc=GsaSearch.Pd="&ajax_version=1.0&client=default_frontend&site=default_collection&ie=UTF-8&oe=UTF-8";GsaSearch.prototype.F=function(a,b,c){var d=this.lb+this.H+"?ajax_callback="+a+"&ajax_context="+b+"&hl="+UDS_CurrentLocale+Fc+"&num="+this.oa+this.ub(c);return d}
;GsaSearch.prototype.$a=function(){this.gb++;this.ya++}
;GsaSearch.prototype.onSearchComplete=function(a,b){if(a==null&&b==204){return}if(a&&a.results&&a.results.length>0){this.results=new Array;for(var c=0;c<a.results.length;c++){var d=a.results[c];var f=new Object;f.GsearchResultClass=d.GsearchResultClass;f.unescapedUrl=d.unescapedUrl;f.url=d.url;f.visibleUrl=d.visibleUrl;f.title=d.title;f.titleNoFormatting=d.titleNoFormatting;f.content=d.snippet;this.results.push(f)}this.ta=a.start_index;this.ja=a.end_index;this.Ka=a.est}else{this.results=new Array;
this.ta=0;this.ja=0;this.Ka=0}this.completionStatus=b;this.hashStatus=200;this.completionFailureDetails="";this.qa=null;if(this.Ma){this.Wa()}this.Ya()}
;GsaSearch.prototype.setResultSetSize=function(a){this.__super__(GSearch.prototype.setResultSetSize,a);switch(this.ra){case X:this.oa=8;break;case G:this.oa=4;break}}
;GsaSearch.prototype.ub=function(a){var b="";if(a&&this.completionStatus==200&&this.ta&&this.ja&&this.Ka){if(a==Dc){if(this.ja<this.Ka){b="&start="+this.ja}}else if(a==Ec){var c;if(this.ta>this.oa+1){c=this.ta-(this.oa+1)}else{c=0}b="&start="+c}}return b}
;
function GnewsSearch(){GSearch.call(this);this.m="news";this.H="/GnewsSearch";this.M="http://news.google.com/nwshp";this.$d=null;this.f=false;this.Z=true;this.K=P(this,Cc);this.Y="gsc-newsConfig";this.b=null}
GnewsSearch.E(GSearch);GnewsSearch.RESULT_CLASS="GnewsSearch";var Ia=GnewsSearch.N=new Array;GnewsSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Ia[e];Ia[e]=null;h.onSearchComplete(b,c,d,f)}
;GnewsSearch.prototype.u=function(a,b,c){var d;if(c==null){d=K(Ia,this)}else{d=c}var f;if(b==null){f="GnewsSearch.RawCompletion"}else{f=b}var e=this.F(f,d);if(a){var h;var j=a;if(this.h){j=j+" "+this.h}if(this.c){j=j+" source:"+this.c}h="&q="+encodeURIComponent(j);if(this.f){h=h+"&scoring=d"}if(this.c){e=e.replace(/&hl=.*&/,"&hl=en&")}e=e+h;this.i=h}return e}
;GnewsSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c;c=u(a.unescapedUrl,a.title,this.d(),I);g(b,c);c=m(a.publisher,Gb);g(b,c);var d=a.location.split(",");if(d.length>1){var f=", "+d[d.length-1];c=m(f,yd);g(b,c)}var e=new Date(a.publishedDate);c=m(" - "+this.formatToShortDate(e),ua);g(b,c);var e=new Date(a.publishedDate);c=m(" - "+this.formatToRelativeDate(e),Ib);g(b,c);c=m(a.content,M);g(b,c);if(a.clusterUrl&&a.clusterUrl!=""){c=u(a.clusterUrl,
i["related-articles"]+"&nbsp;&raquo;",this.d(),qd);g(b,c)}a.html=b;this.B(a.html)}
;GnewsSearch.prototype.setSiteRestriction=function(a){if(a==null||a==""){this.c=null}else{this.c=a.replace(/\s/g,"_")}}
;GnewsSearch.prototype.setResultOrder=function(a){if(a==Y){this.f=true}else if(a==Z){this.f=false}else{this.f=false}}
;var Cc=GnewsSearch.prototype.Qa=function(a,b){if(b){if(this.b==null){var c=o(qa);this.b=ka(null,"0",this.f?true:false,pa);g(c,this.b);g(c,m(i["sort-by-date"],oa));var d=o(T);g(d,ca(i["close"],T));g(c,d);g(a,c);this.b.focus()}else{this.b.checked=this.f?true:false;this.b.focus()}}else{if(this.b){if(this.b.checked){this.setResultOrder(Y)}else{this.setResultOrder(Z)}}}}
;
function GimageSearch(){GSearch.call(this);this.bb=2;this.m="image";this.H="/GimageSearch";this.M="http://images.google.com/images";this.p=null;this.l={width:112,height:84}}
GimageSearch.E(GSearch);var sc=GimageSearch.RESULT_CLASS="GimageSearch";GimageSearch.AD_CLASS="GwebSearch.ad";var Fa=GimageSearch.N=new Array;GimageSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Fa[e];Fa[e]=null;h.onSearchComplete(b,c,d,f)}
;GimageSearch.prototype.u=function(a,b,c,d){var f;if(c==null){f=K(Fa,this)}else{f=c}var e;if(b==null){e="GimageSearch.RawCompletion"}else{e=b}var h=this.F(e,f,d);if(a){var j;var l=a;if(this.h){l=l+" "+this.h}j="&q="+encodeURIComponent(l);if(this.p){j=j+"&safe="+this.p}h=h+j;this.i=j;if(d&&d!=0){this.i=this.i+"&start="+d}}return h}
;GimageSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c=o(sa);var d=GSearch.scaleImage(a.tbWidth,a.tbHeight,this.l);var f=J(a.tbUrl,d.width,d.height,H);var e=(this.l.width-d.width)/2;f.style.left=e+"px";f.title=a.titleNoFormatting+" ("+a.visibleUrl+")";var h=da(a.unescapedUrl,null,this.d(),H);B(h,H);g(h,f);g(c,h);g(b,c);var j=o(ia);var l;l=m(a.content,M);l.title=a.contentNoFormatting;g(j,l);var p=a.width+" x "+a.height;l=m(p,Gd);g(j,l);l=u(a.originalContextUrl,
a.visibleUrl,this.d(),N);l.title=a.visibleUrl;g(j,l);g(b,j);a.html=b;this.B(a.html)}
;GimageSearch.prototype.setRestriction=function(a,b){if(a==eb){if(b){if(b==hb||b==gb){this.p=b}else if(b==fb){this.p=null}else{this.p=null}}else{this.p=null}}}
;
function GlocalSearch(){GSearch.call(this);this.z=null;this.w="San Francisco, CA";this.r=null;this.ca=true;this.S=false;this.Z=true;this.K=P(this,zc);this.Y=Zc;this.m="local";this.H="/GlocalSearch";this.j=null;this.R=null}
GlocalSearch.E(GSearch);GlocalSearch.RESULT_CLASS="GlocalSearch";GlocalSearch.AD_CLASS="GlocalSearch.ad";var Ha=GlocalSearch.N=new Array;GlocalSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Ha[e];Ha[e]=null;h.onSearchComplete(b,c,d,f)}
;GlocalSearch.prototype.u=function(a,b,c){var d;if(c==null){d=K(Ha,this)}else{d=c}var f;if(b==null){f="GlocalSearch.RawCompletion"}else{f=b}var e=this.F(f,d);if(a){e=e+"&q="+encodeURIComponent(a)}var h;if(this.z){var j;var l;if(this.ca){j=this.z.getCenterLatLng();l=this.z.getSpanLatLng();h="&sll="+j.y+","+j.x;h+="&sspn="+l.height+","+l.width;h+=Ga(j.y,j.x);e+=h}else{j=this.z.getCenter();l=this.z.getBounds().toSpan().toUrlValue();h="&sll="+j.y+","+j.x;h+="&sspn="+l;h+=Ga(j.y,j.x);e+=h}}else if(this.r)
{h="&sll="+this.r.y+","+this.r.x;h+=Ga(this.r.y,this.r.x);e+=h}else if(this.w){h="&near="+encodeURIComponent(this.w);e+=h}if(this.S){e+="&nogeocode=t"}return e}
;var yc=GlocalSearch.Yd=3.141592653589;var xc=GlocalSearch.Qd=6367000;var Bc=GlocalSearch.de=16093;var Ga=GlocalSearch.centerToGll=function(a,b){var c=Bc;var d=2*c/xc*2*yc;var f=a-d;var e=b-d;var h=a+d;var j=b+d;var l="&gll="+parseInt(f*1000000)+","+parseInt(e*1000000)+","+parseInt(h*1000000)+","+parseInt(j*1000000)+"&llsep=500,500";return l}
;GlocalSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c;c=u(a.url,a.title,this.d(),I);g(b,c);var d=o(Db);c=m(a.streetAddress,Kb);g(d,c);var f="";if(a.city!=""){f=a.city;if(a.region!=""){f+=", "}}c=m(f,Eb);g(d,c);c=m(a.region,Hb);g(d,c);c=m(a.country,rd);g(d,c);g(b,d);if(a.phoneNumbers&&a.phoneNumbers.length){var e=null;var h=null;var j=a.phoneNumbers[0];var l;for(var p=0;p<a.phoneNumbers.length;p++){l=a.phoneNumbers[p];if(l.type=="main"){e=l;break}
if(l.type==""||l.type=="mobile"&&h==null){h=l}}if(e){l=e}else if(h){l=h}else{l=j}c=m(l.number,Fb);g(b,c)}if(a.ddUrl&&a.ddUrl!=""){c=u(a.ddUrl,i["directions"],this.d(),sd);g(b,c)}if(a.ddUrlToHere&&a.ddUrlToHere!=""&&a.ddUrlFromHere&&a.ddUrlFromHere!=""){c=o(td);var q=m(i["get-directions"]+":",wd);c.appendChild(q);q=u(a.ddUrlToHere,i["to-here"],this.d(),Jb);c.appendChild(q);q=m("-",va);c.appendChild(q);q=u(a.ddUrlFromHere,i["from-here"],this.d(),Jb);c.appendChild(q);g(b,c)}a.html=b;this.B(a.html)}
;GlocalSearch.prototype.ia=function(a){if(a.html){delete a.html}var b=o(xd);n(b,E);var c;c=u(a.unescapedUrl,a.title,this.d(),I);g(b,c);if(a.content1){c=m(a.content1,ta);g(b,c)}if(a.content2){c=m(a.content2,ta);g(b,c)}if(a.phoneNumber){c=m(a.phoneNumber,Fb);g(b,c)}c=m(a.visibleUrl,N);var d=J(a.impressionUrl,12,12,Cb);g(c,d);g(b,c);if(a.streetAddress&&a.city&&a.region){var f=o(Db);var e=a.streetAddress+", ";c=m(e,Kb);g(f,c);e=a.city+", ";c=m(e,Eb);g(f,c);e=a.region;c=m(e,Hb);g(f,c);g(b,f)}a.html=b;
this.B(a.html)}
;GlocalSearch.prototype.setCenterPoint=function(a){if(a.centerAndZoom){this.ca=true;this.z=a;this.r=null;this.w="";if(this.j){this.j=null}}else if(a.setCenter){this.ca=false;this.z=a;this.r=null;this.w="";if(this.j){this.j=null}}else if(a.x&&a.y){this.ca=true;this.r=a;this.z=null;this.w="";if(this.j){this.j=null}}else{if(a!=null&&a!=""){this.ca=true;this.z=null;this.w=a;this.r=null;if(this.j){this.j=null}var b=new GlocalSearch;b.setSearchCompleteCallback(this,this.kb,[b,a]);b.execute(a)}}}
;GlocalSearch.prototype.kb=function(a,b){if(a.results&&a.results.length){if(window.GMap){var c=new GPoint(parseFloat(a.results[0].lng),parseFloat(a.results[0].lat));this.r=c}else{this.r=null}this.w=b;this.Z=true;this.z=null}}
;var zc=GlocalSearch.prototype.Qa=function(a,b){if(b){if(this.j==null){var c=null;if(this.z==null){var d=o(qa);this.j=Za(null,Sc,this.w==""?null:this.w);g(d,m(i["search-location"],Rc));g(d,this.j);g(a,d);c=this.j}d=o("gsc-configSetting");this.R=ka(null,"0",this.S?true:false,pa);g(d,this.R);g(d,m(i["disable-address-lookup"],oa));if(c==null){c=this.R}var f=m(null,"gsc-configSettingSubmit");g(f,ca(i["close"],T));g(d,f);g(a,d);c.focus()}}else{if(this.j){if(this.j.value){this.w=this.j.value;this.setCenterPoint(
this.w)}this.j=null}if(this.R){if(this.R.checked){this.S=true}else{this.S=false}this.R=null}Q(a)}}
;var tc=GlocalSearch.ADDRESS_LOOKUP_DISABLED="disabled";var uc=GlocalSearch.ADDRESS_LOOKUP_ENABLED="enabled";GlocalSearch.prototype.setAddressLookupMode=function(a){if(a==tc){this.S=true}else if(a==uc){this.S=false}}
;var wc=GlocalSearch.STATIC_MAP_ZOOM_FARTHEST=17;GlocalSearch.STATIC_MAP_ZOOM_DEFAULT=4;var vc=GlocalSearch.STATIC_MAP_ZOOM_CLOSEST=0;var lb=GlocalSearch.STATIC_MAP_MAX_POINTS=8;var Ac=GlocalSearch.resizeStaticMapUrl=function(a,b,c,d){var f=a.staticMapUrl;f=f.replace(/&h=\d*/,"&h="+b);f=f.replace(/&w=\d*/,"&w="+c);if(d&&d>=vc&&d<=wc){f=f.replace(/&zl=\d*/,"&zl="+d)}a.staticMapUrl=f;return f}
;GlocalSearch.computeStaticMapUrl=function(a,b,c,d){var f="&Point=b&Point.latitude_e6=__LAT__&Point.longitude_e6=__LNG__&Point.iconid=__ICONID__&Point=e";var e="";var h="http://mt.google.com/mapdata?cc=us&tstyp=5&zl=4&w=150&h=100";var j=new Object;j.staticMapUrl=h;h=Ac(j,b,c,d);if(d==null){h=h.replace(/&zl=\d*/,"")}var l=a.length;if(l>lb){l=lb}for(var p=0;p<l;p++){var q;var r;var s=a[p];if(s.lat&&s.lng){if(typeof s.lat=="string"){q=parseFloat(s.lat);r=parseFloat(s.lng)}else{q=s.lat;r=s.lng}}else if(
s.x&&s.y){q=s.y;r=s.x}else{return null}var x=q*1000000;var F=r*1000000;var v=f.replace(/__LAT__/,x);v=v.replace(/__LNG__/,F);var y=51+p;if(l==1){y=15}v=v.replace(/__ICONID__/,y);e=e+v}var C=h+e;return C}
;
function GblogSearch(){GSearch.call(this);this.m="blog";this.H="/GblogSearch";this.M="http://blogsearch.google.com/blogsearch";this.c=null;this.f=false;this.Z=true;this.K=P(this,pc);this.Y="gsc-blogConfig";this.b=null}
GblogSearch.E(GSearch);GblogSearch.RESULT_CLASS="GblogSearch";GblogSearch.AD_CLASS="GwebSearch.ad";var Da=GblogSearch.N=new Array;GblogSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Da[e];Da[e]=null;h.onSearchComplete(b,c,d,f)}
;GblogSearch.prototype.u=function(a,b,c){var d;if(c==null){d=K(Da,this)}else{d=c}var f;if(b==null){f="GblogSearch.RawCompletion"}else{f=b}var e=this.F(f,d);if(a){var h;var j=a;if(this.h){j=j+" "+this.h}if(this.c){j=j+" blogurl:"+this.c}h="&q="+encodeURIComponent(j);if(this.f){h=h+"&scoring=d"}e=e+h;this.i=h}return e}
;GblogSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c;c=u(a.postUrl,a.title,this.d(),I);g(b,c);var d=new Date(a.publishedDate);c=m(this.formatToShortDate(d),ua);g(b,c);d=new Date(a.publishedDate);c=m(this.formatToRelativeDate(d),Ib);g(b,c);c=m(a.content,M);g(b,c);c=u(a.blogUrl,a.blogUrl,this.d(),N);g(b,c);a.html=b;this.B(a.html)}
;GblogSearch.prototype.setSiteRestriction=function(a){if(a==null||a==""){this.c=null}else{this.c=a}}
;GblogSearch.prototype.setResultOrder=function(a){if(a==Y){this.f=true}else if(a==Z){this.f=false}else{this.f=false}}
;var pc=GblogSearch.prototype.Qa=function(a,b){if(b){if(this.b==null){var c=o(qa);this.b=ka(null,"0",this.f?true:false,pa);g(c,this.b);g(c,m(i["sort-by-date"],oa));var d=o(T);g(d,ca(i["close"],T));g(c,d);g(a,c);this.b.focus()}else{this.b.checked=this.f?true:false;this.b.focus()}}else{if(this.b){if(this.b.checked){this.setResultOrder(Y)}else{this.setResultOrder(Z)}}}}
;
function GvideoSearch(){GSearch.call(this);this.m="video";this.H="/GvideoSearch";this.M="http://video.google.com/videosearch";this.f=false;this.Z=true;this.K=P(this,Hc);this.Y="gsc-videoConfig";this.b=null}
GvideoSearch.E(GSearch);var Gc=GvideoSearch.RESULT_CLASS="GvideoSearch";GvideoSearch.AD_CLASS="GwebSearch.ad";var Ka=GvideoSearch.N=new Array;GvideoSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Ka[e];Ka[e]=null;h.onSearchComplete(b,c,d,f)}
;GvideoSearch.prototype.u=function(a,b,c,d){var f;if(c==null){f=K(Ka,this)}else{f=c}var e;if(b==null){e="GvideoSearch.RawCompletion"}else{e=b}var h=this.F(e,f,d);if(a){var j;var l=a;if(this.h){l=l+" "+this.h}j="&q="+encodeURIComponent(l);if(this.f){j=j+"&scoring=d"}h=h+j;this.i=j;if(d&&d!=0){this.i=this.i+"&start="+d}}return h}
;GvideoSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}var b=o(this.C());n(b,E);var c=o(sa);var d=o(ia);var f=W();var e=O(f,0);var h=w(e,sa);var j=w(e,ia);g(h,c);g(j,d);g(b,f);var l=GSearch.scaleImage(a.tbWidth,a.tbHeight,this.l);var p=J(a.tbUrl,l.width,l.height,H);var q=da(a.url,null,this.d(),H);B(q,H);g(q,p);g(c,q);var r;r=u(a.url,a.title,this.d(),I);g(d,r);var s=m(a.content,M);if(na()){s.style.height="2.6em"}g(d,s);var x=new Date(a.published);r=m(this.formatToShortDate(x)
,ua);g(d,r);var F="http://"+a.publisher;r=u(F,a.publisher,this.d(),Gb);g(d,r);a.html=b;this.B(a.html)}
;GvideoSearch.createPlayer=function(a,b){var c=null;if(a.playUrl&&a.playUrl!=""){var d=a.playUrl;var f=nd;if(b){f=b}if(pb()){var e=document.createElement("object");e.className=f;e.setAttribute("type","application/x-shockwave-flash");e.setAttribute("data",d);c=o(b);c.appendChild(e)}else{var e=document.createElement("embed");e.className=f;e.setAttribute("type","application/x-shockwave-flash");e.setAttribute("src",d);if(a.videoType){if(a.videoType=="Google"){e.setAttribute("bgcolor","#000000")}else{
e.setAttribute("wmode","transparent")}}else{e.setAttribute("bgcolor","#000000")}c=o(b);c.appendChild(e)}}return c}
;GvideoSearch.prototype.setResultOrder=function(a){if(a==Y){this.f=true}else if(a==Z){this.f=false}else{this.f=false}}
;var Hc=GvideoSearch.prototype.Qa=function(a,b){if(b){if(this.b==null){var c=o(qa);this.b=ka(null,"0",this.f?true:false,pa);g(c,this.b);g(c,m(i["sort-by-date"],oa));var d=o(T);g(d,ca(i["close"],T));g(c,d);g(a,c);this.b.focus()}else{this.b.checked=this.f?true:false;this.b.focus()}}else{if(this.b){if(this.b.checked){this.setResultOrder(Y)}else{this.setResultOrder(Z)}}}}
;
function GbookSearch(){GSearch.call(this);this.m="book";this.H="/GbookSearch";this.M="http://books.google.com/books";this.ka=false}
GbookSearch.E(GSearch);GbookSearch.RESULT_CLASS="GbookSearch";GbookSearch.AD_CLASS="GwebSearch.ad";var qc=GbookSearch.TYPE_ALL_BOOKS=1;var rc=GbookSearch.TYPE_FULL_VIEW_BOOKS=2;var Ea=GbookSearch.N=new Array;GbookSearch.RawCompletion=function(a,b,c,d,f){var e=0;if(a){e=parseInt(a)}var h=Ea[e];Ea[e]=null;h.onSearchComplete(b,c,d,f)}
;GbookSearch.prototype.u=function(a,b,c){var d;if(c==null){d=K(Ea,this)}else{d=c}var f;if(b==null){f="GbookSearch.RawCompletion"}else{f=b}var e=this.F(f,d);if(a){var h;var j=a;if(this.h){j=j+" "+this.h}h="&q="+encodeURIComponent(j);if(this.ka){h=h+"&as_brr=1"}e=e+h;this.i=h}return e}
;GbookSearch.prototype.createResultHtml=function(a){if(a.html){delete a.html}a.thumbnailHtml=this.pb(a);var b=o(this.C());n(b,E);var c=o(ia);var d=W();var f=O(d,0);var e=w(f,sa);var h=w(f,ia);g(e,a.thumbnailHtml.cloneNode(true));g(h,c);g(b,d);var j;j=u(a.unescapedUrl,a.title,this.d(),I);g(c,j);j=m(i["by"]+"&nbsp;"+a.authors,od);g(c,j);j=o(va);g(c,j);if(a.publishedYear){j=m(a.publishedYear,ua);g(c,j)}if(parseInt(a.pageCount)>0){j=m("-&nbsp;"+i["page-count"](a.pageCount),Ad);g(c,j)}j=u("http://books.google.com"
,"books.google.com",this.d(),N);g(c,j);a.html=b;this.B(a.html)}
;GbookSearch.prototype.pb=function(a){var b="http://books.google.com/googlebooks/";var c=o(pd);var d=o(Ed);var f=J(b+"pages-trans.gif",null,null,Cd);g(d,f);f=J(b+"p_edge-trans.gif",null,null,Bd);g(d,f);g(c,d);d=o(Fd);var e=GSearch.scaleImage(a.tbWidth,a.tbHeight,this.l);f=J(a.tbUrl,e.width,e.height,H);var h=da(a.unescapedUrl,null,this.d(),H);B(h,H);g(h,f);g(d,h);g(c,d);return c}
;GbookSearch.prototype.setRestriction=function(a,b){if(a==Xb){if(b){if(b==qc){this.ka=false}else if(b==rc){this.ka=true}else{this.setRestriction(a,null)}}else{this.ka=false}}}
;
function GsearcherOptions(){this.v=aa;this.cb=this.v;this.root=null;this.l={width:112,height:84};this.Ba={width:100,height:75};this.da=null}
GsearcherOptions.prototype.setExpandMode=function(a){switch(a){case Zb:case ea:case aa:this.v=a;break;default:this.v=aa;break}this.cb=this.v}
;GsearcherOptions.prototype.setRoot=function(a){Q(a);this.root=a}
;GsearcherOptions.prototype.setNoResultsString=function(a){this.da=a}
;GsearcherOptions.prototype.setImageResultsTbHeight=function(a){if(a>100){a=100}this.l.height=a;this.l.width=Math.round(a*1.33)}
;GsearcherOptions.prototype.setVideoResultsTbHeight=function(a){if(a>100){a=100}this.Ba.height=a;this.Ba.width=Math.round(a*1.33)}
;function GdrawOptions(){this.input=null;this.eb=null;this.t=$}
GdrawOptions.prototype.setInput=function(a){this.input=a}
;GdrawOptions.prototype.setSearchFormRoot=function(a){this.eb=a}
;GdrawOptions.prototype.setDrawMode=function(a){if(a==$||a==la){this.t=a}else{this.t=$}}
;function R(a,b,c){this.e=c;this.La=false;this.Ea=false;this.gs=a;this.g=null;this.Db=t(b,mc,[this]);this.Gb=t(b,za,[this,Ca]);this.Fb=t(b,za,[this,Ba]);this.Eb=t(b,za,[this,kb]);this.Cb=t(b,lc,[this]);this.Bb=t(b,ic,[this]);this.gs.setSearchCompleteCallback(b,GSearchControl.prototype.onSearchComplete,[this]);this.gs.setResultSetSize(b.resultSetSize);this.gs.setLinkTarget(b.O);this.root=null;this.Aa=null;this.U=null;this.Ra=null;this.I=null;this.T=null;this.o=null;this.ba=true}
GSearchControl.NO_RESULTS_DEFAULT_STRING=i["no-results"];var fc=GSearchControl.TIMEOUT_SHORT=350;var ya=GSearchControl.TIMEOUT_MEDIUM=500;var ec=GSearchControl.TIMEOUT_LONG=700;var Zb=GSearchControl.EXPAND_MODE_CLOSED=1;var ea=GSearchControl.EXPAND_MODE_OPEN=2;var aa=GSearchControl.EXPAND_MODE_PARTIAL=3;var $=GSearchControl.DRAW_MODE_LINEAR=1;var la=GSearchControl.DRAW_MODE_TABBED=2;function GSearchControl(a){if(!UDS_KeyVerified){if(GSearchControl.keyCheck()){UDS_KeyVerified=true}else{return}}this.resultSetSize=
G;this.t=$;this.root=null;this.searchButton=null;this.input=null;this.xa=ya;this.wb=t(this,jc,[null]);this.xb=t(this,kc,[null]);this.ea=null;this.Ta=null;this.Sa=null;this.V=null;this.zb=false;this.X=false;this.O=cb;this.ma=i["copy"];this.a=new Array;this.Ca=new Array;var b;if(a){for(var c=0;c<a.length;c++){b=new R(a[c],this,false);this.a.push(b)}}}
try{GSearchControl.appPath=window.location.href}catch(Pd){GSearchControl.appPath=null}GSearchControl.keyCheck=function(){var a=true;if(Od(window.location.host)){return true}if(UDS_LoadFailure){if(UDS_OriginalAppPath&&GSearchControl.appPath){if(GSearchControl.appPath==UDS_OriginalAppPath){UDS_LoadFailure=false;a=true}else{UDS_LoadFailure=false;a=true}}}UDS_KeyVerified=true;UDS_LoadFailure=false;return a}
;GSearchControl.prototype.addSearcher=function(a,b){if(!b){b=new GsearcherOptions}if(a.m=="ad"){this.Ca.push(a)}else{a.G=null;var c=new R(a,this,b);this.a.push(c)}}
;GSearchControl.prototype.draw=function(a,b){var c=null;var d=null;if(b){if(b.t){this.t=b.t;c=b.input;d=b.eb}else{this.t=$}}else{this.t=$}this.root=o(Tc);if(c!=null){this.input=c;this.input.onkeyup=this.wb;this.input.onpaste=this.xb}else{if(d==null){d=this.root}var f=new GSearchForm(true,d);f.setOnSubmitCallback(this,GSearchControl.prototype.submit);f.setOnClearCallback(this,GSearchControl.prototype.clearAllResults);this.input=f.input}this.W=o(U);if(this.t==la){this.A=o(Bb);g(this.root,this.A);this.k=
new Array;this.q=0;for(var e=0;e<this.a.length;e++){var h=new Object;var j=this.a[e].gs.vb();j=j.replace(/ /g,"&nbsp;");h.D=m(j);h.J=null;h.D.onclick=t(this,nc,[e]);this.k[e]=h;g(this.A,h.D);var l=va;if(pb()){l=l+" "+va+"-opera"}var p=xa(" ",l);g(this.A,p);this.a[e].e.setExpandMode(ea)}}g(this.root,this.W);for(var e=0;e<this.a.length;e++){if(this.a[e].e.root){this.a[e].ba=false;this.a[e].root=this.a[e].e.root;n(this.a[e].root,Ra);z(this.a[e].root,L);n(this.a[e].root,U)}else{this.a[e].root=o(Ra)}if(
this.a[e].gs.ga){var q=Ra+"-"+this.a[e].gs.ga;n(this.a[e].root,q)}if(this.t==la){this.k[e].J=this.a[e].root}var r=W(null,null,dd);var s=O(r,0);this.a[e].Q=w(s,ld);var x=w(s,Pc);this.a[e].Aa=m("",md);g(this.a[e].Q,this.a[e].Aa);var F=m(this.a[e].gs.tb(),jd);g(this.a[e].Aa,F);this.a[e].U=m("",gd);g(this.a[e].Q,this.a[e].U);var v=m();var y=m(i["blank"],cd);var C=m(i["blank"],bd);var D=m(i["blank"],ad);y.title=i["show-one-result"];C.title=i["show-more-results"];D.title=i["show-all-results"];g(v,y);g(
v,C);g(v,D);y.onclick=this.a[e].Gb;C.onclick=this.a[e].Fb;D.onclick=this.a[e].Eb;this.a[e].Ra=v;this.a[e].Ua(Aa);g(this.a[e].Q,this.a[e].Ra);this.a[e].Aa.onclick=this.a[e].Db;if(this.a[e].gs.K){this.a[e].n=xa("",Qc);ab(this.a[e].n,i["blank"]);n(this.a[e].n,ha);g(x,this.a[e].n);this.a[e].n.onclick=this.a[e].Cb;this.a[e].n.title=i["settings"];this.a[e].I=o(ub);n(this.a[e].I,this.a[e].gs.Y);this.a[e].T=Ya(ub);n(this.a[e].T,this.a[e].gs.Y);this.a[e].T.onsubmit=this.a[e].Bb;g(this.a[e].I,this.a[e].T);
this.a[e].I.style.display="none"}this.a[e].o=o(ed);n(this.a[e].o,this.a[e].gs.Na());if(this.a[e].e.root==null){g(this.W,this.a[e].root)}g(this.a[e].root,r);if(this.a[e].I){g(this.a[e].root,this.a[e].I)}g(this.a[e].root,this.a[e].o)}if(this.t==la){for(var e=0;e<this.a.length;e++){n(this.k[e].D,id);n(this.k[e].J,hd);if(e==this.q){n(this.k[e].D,Ua);n(this.k[e].J,Sa)}else{n(this.k[e].D,Va);n(this.k[e].J,Ta)}}}if(a){Rb(a,this.root);var fa=this.sb();if(fa&&fa<300){this.zb=true;n(this.root,$c)}}}
;GSearchControl.prototype.setTimeoutInterval=function(a){switch(a){case fc:case ya:case ec:this.xa=a;break;default:this.xa=ya;break}}
;var dc=GSearchControl.KEEP_LABEL_SAVE="save";var cc=GSearchControl.KEEP_LABEL_KEEP="keep";var bc=GSearchControl.KEEP_LABEL_INCLUDE="include";var ac=GSearchControl.KEEP_LABEL_COPY="copy";var $b=GSearchControl.KEEP_LABEL_BLANK="blank";GSearchControl.prototype.setOnKeepCallback=function(a,b,c){if(c){switch(c){case dc:case cc:case bc:case ac:case $b:this.ma=i[c];break;default:this.ma=c;break}}this.ea=P(a,b)}
;var nc=GSearchControl.prototype.ce=function(a){if(this.q==a){return}z(this.k[this.q].D,Ua);z(this.k[this.q].J,Sa);n(this.k[this.q].D,Va);n(this.k[this.q].J,Ta);this.q=a;n(this.k[this.q].D,Ua);n(this.k[this.q].J,Sa);z(this.k[this.q].D,Va);z(this.k[this.q].J,Ta)}
;GSearchControl.prototype.submit=function(){if(this.input.value.length){this.execute()}else{this.clearAllResults()}return false}
;GSearchControl.prototype.execute=function(a){var b;if(a){b=a;this.input.value=b}else{b=this.input.value}if(b.length){this.X=false;B(this.W,L);if(this.A){B(this.A,Wa)}for(var c=0;c<this.a.length;c++){if(!this.a[c].ba){z(this.a[c].root,U);n(this.a[c].root,L)}if(this.Ta){this.Ta(this,this.a[c].gs,b)}if(this.a[c].gs.G){this.a[c].gs.G=null}this.a[c].gs.execute(b)}for(var c=0;c<this.Ca.length;c++){this.Ca[c].execute(b)}}}
;var jc=GSearchControl.prototype.Sd=function(){var a=this.input.value;if(a&&a!=""){if(this.V){clearTimeout(this.V)}this.V=setTimeout(t(this,GSearchControl.prototype.execute,[null]),this.xa)}}
;var kc=GSearchControl.prototype.Td=function(){if(this.V){clearTimeout(this.V)}this.V=setTimeout(t(this,GSearchControl.prototype.execute,[null]),this.xa)}
;GSearchControl.prototype.setResultSetSize=function(a){var b=true;switch(a){case X:this.resultSetSize=a;b=true;break;default:case G:this.resultSetSize=G;b=false;break}for(var c=0;c<this.a.length;c++){this.a[c].gs.setResultSetSize(a)}}
;GSearchControl.prototype.setLinkTarget=function(a){this.O=a;for(var b=0;b<this.a.length;b++){this.a[b].gs.setLinkTarget(a)}}
;GSearchControl.prototype.setNoResultsString=function(a){for(var b=0;b<this.a.length;b++){this.a[b].e.setNoResultsString(a)}}
;var mc=GSearchControl.prototype.Xd=function(a){if(a.La){this.P(a,false)}else{this.P(a,true)}}
;GSearchControl.prototype.P=function(a,b,c){if(!b){z(a.Q,ra);n(a.Q,ha);a.La=false;a.o.style.display="none";if(c){var d="(0)";a.U.innerHTML=d}else{var d="("+(a.gs.results.length+a.gs.adResults.length)+")";a.U.innerHTML=d}}else{z(a.Q,ha);n(a.Q,ra);a.La=true;a.o.style.display="block"}}
;var ic=GSearchControl.prototype.Rd=function(a){this.fa(a,false,true);return false}
;var lc=GSearchControl.prototype.Wd=function(a){if(a.gs.Z){if(a.Ea){this.fa(a,false,true)}else{this.fa(a,true,true)}}}
;GSearchControl.prototype.fa=function(a,b,c){if(!b){if(a.n){z(a.n,ra);n(a.n,ha);a.n.innerHTML=i["blank"];a.Ea=false;a.gs.K(a.T,false);a.I.style.display="none";if(c){this.execute()}}}else{if(a.n){n(a.n,ra);z(a.n,ha);a.n.innerHTML=i["close"];a.Ea=true;a.I.style.display="block";a.gs.K(a.T,true)}}}
;var jb=GSearchControl.prototype.Ud=function(a,b){if(this.ea){b.gs.$a();this.ea(a)}}
;GSearchControl.prototype.cancelSearch=function(){this.X=true}
;GSearchControl.prototype.clearAllResults=function(){this.input.value="";B(this.W,U);if(this.A){B(this.A,Bb)}for(var a=0;a<this.a.length;a++){if(!this.a[a].ba){z(this.a[a].root,L);n(this.a[a].root,U)}var b=this.a[a];Q(b.o);b.g=null;this.P(b,false,true);this.fa(b,false,false)}}
;GSearchControl.prototype.onSearchComplete=function(a){var b;var c;var d=false;var f;if(this.X){return}Q(a.o);a.g=null;this.P(a,false,true);this.fa(a,false,false);a.Ua(Aa);var e=a.gs.results;if(a.gs.aa&&a.gs.completionStatus>=400){e=new Array;e.push(a.gs.qb())}else if(e.length==0&&a.e.da&&a.gs.completionStatus==200){e=new Array;e.push(a.gs.rb(a.e.da))}for(var c=0;c<e.length;c++){b=e[c];if(!b.html){a.gs.createResultHtml(b)}if(b.html){d=true;f=o(a.gs.Na());n(f,Qa);if(a.gs.ga){var h=Qa+"-"+a.gs.ga;n(
f,h)}var j=b.html.cloneNode(true);if(b.GsearchResultClass==sc){if(a.e.l){if(a.e.l.width!=a.gs.l.width||a.e.l.height!=a.gs.l.height){var l=j.getElementsByTagName("img");for(var p=0;p<l.length;p++){GSearch.scaleImage(b.tbWidth,b.tbHeight,a.e.l,l[p],true)}}}}else if(b.GsearchResultClass==Gc){if(a.e.Ba){var l=j.getElementsByTagName("img");for(var p=0;p<l.length;p++){GSearch.scaleImage(b.tbWidth,b.tbHeight,a.e.Ba,l[p])}}}g(f,j);if(this.ea){var q=this.ma;var r=m("",wb);ab(r,q);g(f,r);r.onclick=t(this,jb,
[b,a])}var s=a.gs.bb;if(c>=s){if(!a.g){a.g=o(Yc);g(a.o,a.g);if(a.e.v==aa){a.g.style.display="none"}}g(a.g,f)}else{g(a.o,f)}}}if(a.g&&a.gs.i&&a.gs.gwsUrl){f=u(a.gs.gwsUrl,i["more-results"]+"&nbsp;&raquo;",a.gs.d(),kd);if(a.gs.cursor){var x=o(Vc);var F=this.ob(a);x.appendChild(F);x.appendChild(f);g(a.g,x)}else{g(a.g,f)}}var v=a.g?a.g:a.o;if(a.gs.adResults.length){var y=o(Jc);for(var c=0;c<a.gs.adResults.length;c++){if(c==0){var f=m(i["sponsored-links"],ud);g(y,f)}b=a.gs.adResults[c];if(!b.html){a.gs.ia(
b)}if(b.html){d=true;f=o(a.gs.Na());n(f,Qa);g(f,b.html.cloneNode(true));if(this.ea){var r=m(this.ma,wb);g(f,r);r.onclick=t(this,jb,[b,a])}g(y,f)}}g(v,y)}if(!d){a.U.innerHTML="(0)";a.o.innerHTML="";this.P(a,false)}else{var C;var C="("+(a.gs.results.length+a.gs.adResults.length)+")";a.U.innerHTML=C;if(a.e.v==aa||a.e.v==ea){this.P(a,true)}else{this.P(a,false)}var D=a.gs.getAttribution(true);if(D){g(a.o,D)}}a.e.v=a.e.cb;if(this.Sa){this.Sa(this,a.gs)}}
;GSearchControl.prototype.ob=function(a){var b=o(Uc);var c=a.gs.cursor;for(var d=0;d<c.pages.length;d++){var f=Xc;if(d==c.currentPageIndex){f=f+" "+Wc}var e=m(d+1,f);e.onclick=t(this,hc,[a,d]);b.appendChild(e)}return b}
;var ib=GSearchControl.Nd={border:"border",borderColor:"border-color",borderStyle:"border-style",borderWidth:"border-width",borderTop:"border-top",borderTopColor:"border-top-color",borderTopStyle:"border-top-style",borderTopWidth:"border-top-width",borderRight:"border-right",borderRightColor:"border-right-color",borderRightStyle:"border-right-style",borderRightWidth:"border-right-width",borderBottom:"border-bottom",borderBottomColor:"border-bottom-color",borderBottomStyle:"border-bottom-style",borderBottomWidth:
"border-bottom-width",borderLeft:"border-left",borderLeftColor:"border-left-color",borderLeftStyle:"border-left-style",borderLeftWidth:"border-left-width",color:"color",cssFloat:"float",styleFloat:"float",clear:"clear",cursor:"cursor",display:"display",font:"font",fontFamily:"font-family",fontSize:"font-size",fontStyle:"font-style",fontWeight:"font-weight",height:"height",margin:"margin",marginTop:"margin-top",marginRight:"margin-right",marginBottom:"margin-bottom",marginLeft:"margin-left",overflow:
"overflow",padding:"padding",paddingTop:"padding-top",paddingRight:"padding-right",paddingBottom:"padding-bottom",paddingLeft:"padding-left",textAlign:"text-align",textDecoration:"text-decoration",textTransform:"text-transform",verticalAlign:"vertical-align",visibility:"visibility",width:"width"};var gc=GSearchControl.inlineCurrentStyle=function(a,b){if(qb()){alert("GSearchControl.inlineCurrentStyle is not supported on Safari");return}var c=true;if(b){c=b}if(c){for(var d=0;d<a.childNodes.length;d++
){gc(a.childNodes[d],true)}}if(a.nodeType==1){var f;var e;var h=false;var j=false;if(window.getComputedStyle){f=window.getComputedStyle(a,null);e=true;h=true}else if(a.currentStyle){f=a.currentStyle;e=false;h=true}if(h){for(var l in f){if(ib[l]){var p=ib[l];var q=f[l];if(l=="display"&&q=="none"){a.innerHTML="";j=true}if(f[l]!=""){if(e){a.style.setProperty(p,q,"")}else{a.style.setAttribute(p,q,"")}}}}if(j){if(e==false){a.outerHTML="<div style='display:none'/>"}}}}}
;GSearchControl.prototype.sb=function(a){var b=a?a:this.root;var c=null;if(window.getComputedStyle){c=window.getComputedStyle(b,null)}else if(b.currentStyle){c=b.currentStyle}else if(document.defaultView.getComputedStyle){c=document.defaultView.getComputedStyle(b,null)}if(c){return parseInt(c["width"])}else{return 300}}
;GSearchControl.prototype.setSearchCompleteCallback=function(a,b){this.Sa=P(a,b)}
;GSearchControl.prototype.setSearchStartingCallback=function(a,b){this.Ta=P(a,b)}
;var Aa=R.SRC_INIT=0;var Ca=R.SRC_ONE=1;var Ba=R.SRC_MORE=2;var kb=R.SRC_ALL=3;R.prototype.Ua=function(a){var b=fd+" ";if(a==Aa){if(this.e.v==aa){b+=yb}else if(this.gs.getResultSetSize()==G){b+=xb}else{b+=rb}}else if(a==Ca){b+=yb}else if(a==Ba){b+=xb}else{b+=rb}B(this.Ra,b)}
;var za=GSearchControl.prototype.Vd=function(a,b){a.Ua(b);var c=false;switch(b){default:case Ca:if(a.g){a.g.style.display="none"}break;case Ba:if(a.g){a.g.style.display="block"}if(a.gs.getResultSetSize()!=G){c=true}a.gs.setResultSetSize(G);break;case kb:if(a.g){a.g.style.display="block"}if(a.gs.getResultSetSize()!=X){c=true}a.gs.setResultSetSize(X);break}if(c){var d;d=this.input.value;if(d.length){this.X=false;B(this.W,L);if(this.A){B(this.A,Wa)}if(!a.ba){z(a.root,U);n(a.root,L)}a.e.v=ea;a.gs.execute(
d)}}}
;var hc=GSearchControl.prototype.Za=function(a,b){this.X=false;B(this.W,L);if(this.A){B(this.A,Wa)}if(!a.ba){z(a.root,U);n(a.root,L)}a.e.v=ea;a.gs.Za(b)}
;function GSearchForm(a,b,c){var d=Ya(zb);d.acceptCharset="utf-8";var f=null;var e=i["search-uc"];var h=i["search"];if(c){if(c.buttonText){e=c.buttonText;h=c.buttonText}if(c.clickableBrandingUrl){var j="http://www.google.com";if(typeof c.clickableBrandingUrl=="string"&&c.clickableBrandingUrl.match(/^http:\/\/[a-z]*\.google\.com/)){j=c.clickableBrandingUrl}f=da(j,null,"_BLANK");f.className=Lc}}this.searchButton=ca(e,Ab);this.searchButton.title=h;var l;if(a){l=Mc;this.Da=m(i["blank"],tb);this.Da.title=
i["clear-results"]}else{l=Nc}this.input=Za(null,vb,null);this.input.name="search";var p=W(null,null,zb);g(d,p);var q=O(p,0);this.ab=w(q,vb);var r=w(q,Ab);if(a){var s=w(q,tb);g(s,this.Da)}g(this.ab,this.input);g(r,this.searchButton);var x=W(null,null,Kc);g(d,x);q=O(x,0);this.userDefinedCell=w(q,Oc);var F=w(q,sb);var v=w(q,l);var y=m(i["powered-by"],sb);var C=UDS_ServiceBase+"/css/small-logo.png";var D=bb(C,51,15,l);g(F,y);if(f){g(f,D);g(v,f)}else{g(v,D)}this.db=d;Q(b);g(b,this.db)}
GSearchForm.prototype.setOnSubmitCallback=function(a,b){this.fb=t(this,oc,[this]);this.va=t(a,b,[this]);this.db.onsubmit=this.fb;this.searchButton.onclick=this.fb}
;GSearchForm.prototype.setOnClearCallback=function(a,b){this.Da.onclick=t(a,b,[this])}
;var oc=GSearchForm.prototype.be=function(a){var b=this.ab.offsetWidth;var c=this.input.value;if(this.va){this.va()}if(na()){var d=this;var f;if(c.length*8>=b){f=b-6}else{f="99%"}setTimeout(function(){d.input.style.width=f}
,1)}return false}
;GSearchForm.prototype.execute=function(a){if(a){this.input.value=a}if(this.va){this.va()}}
;
google_exportSymbol("google.search.WebSearch",GwebSearch);google_exportSymbol("google.search.BookSearch",GbookSearch);google_exportSymbol("google.search.BlogSearch",GblogSearch);google_exportSymbol("google.search.VideoSearch",GvideoSearch);google_exportSymbol("google.search.NewsSearch",GnewsSearch);google_exportSymbol("google.search.LocalSearch",GlocalSearch);google_exportSymbol("google.search.ImageSearch",GimageSearch);google_exportSymbol("google.search.AdSenseSearch",GadSenseSearch);google_exportSymbol(
"google.search.SaSearch",GsaSearch);google_exportSymbol("google.search.Search",GSearch);google_exportSymbol("google.search.SearchControl",GSearchControl);google_exportSymbol("google.search.SearchForm",GSearchForm);google_exportSymbol("google.search.SearcherOptions",GsearcherOptions);google_exportSymbol("google.search.DrawOptions",GdrawOptions);google_exportSymbol("GwebSearch",GwebSearch);google_exportSymbol("GbookSearch",GbookSearch);google_exportSymbol("GblogSearch",GblogSearch);google_exportSymbol(
"GvideoSearch",GvideoSearch);google_exportSymbol("GnewsSearch",GnewsSearch);google_exportSymbol("GlocalSearch",GlocalSearch);google_exportSymbol("GimageSearch",GimageSearch);google_exportSymbol("GadSenseSearch",GadSenseSearch);google_exportSymbol("GsaSearch",GsaSearch);google_exportSymbol("GSearch",GSearch);google_exportSymbol("GSearchControl",GSearchControl);google_exportSymbol("GSearchForm",GSearchForm);google_exportSymbol("GsearcherOptions",GsearcherOptions);google_exportSymbol("GdrawOptions",
GdrawOptions);

 })()






//-----thickbox.js-----


/*
 * Thickbox 2.0 - One Box To Rule Them All.
 * By Cody Lindley (http://www.codylindley.com)
 * Copyright (c) 2006 cody lindley
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 * Thickbox is built on top of the very light weight jQuery library.
 */
 
//on page load call TB_init
jQuery(document).ready(TB_init);

//add thickbox to href elements that have a class of .thickbox
function TB_init(){
  jQuery("a.thickbox").click(function(){
  var t = this.title || this.name || null;
  var g = this.rel || false;
  TB_show(t,this.href,g);
  this.blur();
  return false;
  });  
}
function TB_init_id(img_id){
  document.getElementById("media_" + img_id).style.display="inline";
 jQuery("#media_" + img_id).click(function(){
  var t = this.title || this.name || null;
  var g = this.rel || false;
  TB_show(t,this.href,g);
  this.blur();
  return false;
  });
}
function TB_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
	  try {

	if (document.getElementById("TB_HideSelect") == null) {
    jQuery("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");
     var scrOfX = 0, scrOfY = 0;   
	  if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	  }
	  
	  
	  document.getElementById("TB_overlay").style.left = scrOfX.toString() + "px";
	  document.getElementById("TB_overlay").style.top = scrOfY.toString() + "px";
	  
	//jQuery("#TB_overlay").click(TB_remove);
    }
    
    if(caption==null){caption=""};
    
    jQuery(window).scroll(TB_position);
     
    TB_overlaySize();
    
    jQuery("body").append("<div id='TB_load'><img src='../imgs/site/loadingAnimation.gif' /></div>");
    TB_load_position();
    
    var urlString = /\.jpg|\.jpeg|\.png|\.gif|\.html|\.htm|\.php|\.cfm|\.asp|\.aspx|\.jsp|\.jst|\.rb|\.txt|\.bmp/g;
    var urlType = url.toLowerCase().match(urlString);
    
    if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images
        
      TB_PrevCaption = "";
      TB_PrevURL = "";
      TB_PrevHTML = "";
      TB_NextCaption = "";
      TB_NextURL = "";
      TB_NextHTML = "";
      TB_imageCount = "";
      TB_FoundURL = false;
      if(imageGroup){
        TB_TempArray = jQuery("a[@rel="+imageGroup+"]").get();
        for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML == "")); TB_Counter++) {
          var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);
            if (!(TB_TempArray[TB_Counter].href == url)) {            
              if (TB_FoundURL) {
                TB_NextCaption = TB_TempArray[TB_Counter].title;
                TB_NextURL = TB_TempArray[TB_Counter].href;
                TB_NextHTML = "<span id='TB_next'>  <a href='#'>Next ></a></span>";
              } else {
                TB_PrevCaption = TB_TempArray[TB_Counter].title;
                TB_PrevURL = TB_TempArray[TB_Counter].href;
                TB_PrevHTML = "<span id='TB_prev'>  <a href='#'>< Prev</a></span>";
              }
            } else {
              TB_FoundURL = true;
              TB_imageCount = "Image " + (TB_Counter + 1) +" of "+ (TB_TempArray.length);                      
            }
        }
      }
      imgPreloader = new Image();
      imgPreloader.onload = function(){
      
      imgPreloader.onload = null;
        
      // Resizing large images - orginal by Christian Montoya edited by me.
      var pagesize = TB_getPageSize();
      var x = pagesize[0] - 150;
      var y = pagesize[1] - 150;
      var imageWidth = imgPreloader.width;
      var imageHeight = imgPreloader.height;
      if (imageWidth > x) {
        imageHeight = imageHeight * (x / imageWidth); 
        imageWidth = x; 
        if (imageHeight > y) { 
          imageWidth = imageWidth * (y / imageHeight); 
          imageHeight = y; 
        }
      } else if (imageHeight > y) { 
        imageWidth = imageWidth * (y / imageHeight); 
        imageHeight = y; 
        if (imageWidth > x) { 
          imageHeight = imageHeight * (x / imageWidth); 
          imageWidth = x;
        }
      }
      // End Resizing
      
      TB_WIDTH = imageWidth + 30;
      TB_HEIGHT = imageHeight + 60;
      jQuery("#TB_window").append("<a href='' id='TB_ImageOff' title='Cerrar'><img id='TB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"'/></a>" + "<div id='TB_caption'>"+caption+"<div id='TB_secondLine'>" + TB_imageCount + TB_PrevHTML + TB_NextHTML + "</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Cerrar'><img src='images/btn_closethickbox.png'/></a></div>");     
      
      jQuery("#TB_closeWindowButton").click(TB_remove);
      
      if (!(TB_PrevHTML == "")) {
        function goPrev(){
          if(jQuery(document).unclick(goPrev)){jQuery(document).unclick(goPrev)};
          jQuery("#TB_window").remove();
          jQuery("body").append("<div id='TB_window'></div>");
          jQuery(document).unkeyup();
          TB_show(TB_PrevCaption, TB_PrevURL, imageGroup);
          return false;  
        }
      
        jQuery("#TB_prev").click(goPrev);
        
        jQuery(document).keyup( function(e){ var key = e.keyCode; if(key == 37){goPrev()} });
      }
      
      
      
      if (!(TB_NextHTML == "")) {    
        function goNext(){
          jQuery("#TB_window").remove();
          jQuery("body").append("<div id='TB_window'></div>");
          jQuery(document).unkeyup();
          TB_show(TB_NextCaption, TB_NextURL, imageGroup);        
          return false;  
        }
        
        jQuery("#TB_next").click(goNext);
      
        jQuery(document).keyup( function(e){ var key = e.keyCode; if(key == 39){goNext()} });
      }
      
      TB_position();
      jQuery("#TB_load").remove();
      jQuery("#TB_ImageOff").click(TB_remove);
      jQuery("#TB_window").css({display:"block"}); //for safari using css instead of show
      }
    
      imgPreloader.src = url;
    }
    
    if(urlType=='.htm'||urlType=='.html'||urlType=='.php'||urlType=='.asp'||urlType=='.aspx'||urlType=='.jsp'||urlType=='.jst'||urlType=='.rb'||urlType=='.txt'||urlType=='.cfm' || (url.indexOf('TB_inline') != -1) || (url.indexOf('TB_iframe') != -1) ){//code to show html pages
      
      var queryString = url.replace(/^[^\?]+\??/,'');
      var params = TB_parseQuery( queryString );

      TB_WIDTH = (params['width']*1) + 30;
      TB_HEIGHT = (params['height']*1) + 40;
      ajaxContentW = TB_WIDTH - 30;
      ajaxContentH = TB_HEIGHT - 45;
      
      if(url.indexOf('TB_iframe') != -1){        
          urlNoQuery = url.substr(0,TB_strpos(url, "?"));      
          jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton'><img src='images//btn_closethickbox.png' border='0'/></a></div></div><iframe src='"+urlNoQuery+"' id='TB_iframeContent' style='width:"+(ajaxContentW + 30)+"px;height:"+(ajaxContentH + 18)+"px;' frameborder='0'></iframe>");
        }else{
          jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>Cerrar</a></div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>");
      }
          
      jQuery("#TB_closeWindowButton").click(TB_remove);
      
        if(url.indexOf('TB_inline') != -1){  
          jQuery("#TB_ajaxContent").html(jQuery('#' + params['inlineId']).html());
          TB_position();
          jQuery("#TB_load").remove();
          jQuery("#TB_window").css({display:"block"}); 
        }else if(url.indexOf('TB_iframe') != -1){
          TB_position();
          jQuery("#TB_load").remove();
          jQuery("#TB_window").css({display:"block"}); 
        }else{
          jQuery("#TB_ajaxContent").load(url, function(){
            TB_position();
            jQuery("#TB_load").remove();
            jQuery("#TB_window").css({display:"block"}); 
          });
        }
      
    }
    
    jQuery(window).resize(TB_position);
    
  } catch(e) {
    alert( e );
  }
}
//helper functions below
function TB_remove() {
  jQuery("#TB_window").fadeOut("fast",function(){jQuery('#TB_window,#TB_overlay,#TB_HideSelect').remove();});
  jQuery("#TB_load").remove();
  //jQuery(document).unkeyup(); //commented by Liviu 14.02.2008
  return false;
}
function TB_position() {
  var pagesize = TB_getPageSize();  
  var arrayPageScroll = TB_getPageScrollTop();
  
  var scrOfX = 0, scrOfY = 0;   
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
 
  jQuery("#TB_window").css({width:TB_WIDTH+"px",left: (((pagesize[0] - TB_WIDTH)/2)+scrOfX)+"px", top: (arrayPageScroll[1] + ((pagesize[1]-TB_HEIGHT)/2))+"px" });
  TB_overlaySize();
}
function TB_overlaySize(){
  if (window.innerHeight && window.scrollMaxY) {  
    yScroll = window.innerHeight + window.scrollMaxY;
  } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
    yScroll = document.body.scrollHeight;
  } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
    yScroll = document.body.offsetHeight;
    }
  jQuery("#TB_overlay").css("height",yScroll +"px");
  jQuery("#TB_HideSelect").css("height",yScroll +"px");
  
  var scrOfX = 0, scrOfY = 0;   
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  	document.getElementById("TB_overlay").style.left = scrOfX.toString() + "px";
	document.getElementById("TB_overlay").style.top = scrOfY.toString() + "px";
}
function TB_load_position() {
  var pagesize = TB_getPageSize();
  var arrayPageScroll = TB_getPageScrollTop();
  jQuery("#TB_load")
  .css({left: ((pagesize[0] - 100)/2)+"px", top: (arrayPageScroll[1] + ((pagesize[1]-100)/2))+"px" })
  .css({display:"block"});
}
function TB_parseQuery ( query ) {
   var Params = new Object ();
   if ( ! query ) return Params; // return empty object
   var Pairs = query.split(/[;&]/);
   for ( var i = 0; i < Pairs.length; i++ ) {
      var KeyVal = Pairs[i].split('=');
      if ( ! KeyVal || KeyVal.length != 2 ) continue;
      var key = unescape( KeyVal[0] );
      var val = unescape( KeyVal[1] );
      val = val.replace(/\+/g, ' ');
      Params[key] = val;
   }
   return Params;
}
function TB_getPageScrollTop(){
  var yScrolltop;
  if (self.pageYOffset) {
    yScrolltop = self.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop){   // Explorer 6 Strict
    yScrolltop = document.documentElement.scrollTop;
  } else if (document.body) {// all other Explorers
    yScrolltop = document.body.scrollTop;
  }
  arrayPageScroll = new Array('',yScrolltop) 
  return arrayPageScroll;
}
function TB_getPageSize(){
  var de = document.documentElement;
  var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
  var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
  
  arrayPageSize = new Array(w,h) 
  return arrayPageSize;
}
function TB_strpos(str, ch) {
for (var i = 0; i < str.length; i++)
if (str.substring(i, i+1) == ch) return i;
return -1;
}
function ShowThickboxHref() {
	var ahrefs = document.getElementsByTagName("a");
	for (var i=0; i<ahrefs.length; i++) {
		var a = ahrefs[i];
		if (a.className=='thickbox') {
			a.style.display="inline";
			};
		};
}





//-----autocopy.js-----


// File: copy-code.js
// Requires: prototype.js, scriptaculous.js?load=effects

	function copyToClipboard(elt,strMssgBoxId) {
		var urlSwf = "includes/cb.swf";
		//var strMssgBoxId = "notifyTextCopied";
		var eltNotify = null;

		// Display Notifications
		if((eltNotify = $(strMssgBoxId)) == null){
			// Attach the notification to the DOM
			var eltBody = document.getElementsByTagName('body').item(0);

			eltNotify = document.createElement('div');
			eltNotify.setAttribute('id', strMssgBoxId);
			eltNotify.style.display = 'none';

			eltNotify.innerHTML = 'Copied';

			eltBody.appendChild(eltNotify);
		}
		elt.onblur =
			function(e){
				Element.hide(eltNotify);
				return true;
			}

		var z = Position.cumulativeOffset(elt);
		var x = z[0];
		var y = z[1];

                Element.show(eltNotify);

                if(navigator.appName == 'Microsoft Internet Explorer'){
                        if(x < 100){
                                eltNotify.style.left = (x + (elt.offsetWidth - 23)) + 'px';
                        }
                        else{
                                eltNotify.style.left = (x - (eltNotify.offsetWidth + 2)) + 'px';
                        }
                }
                else{
                        if(x < 100){
                                eltNotify.style.left = (x + (elt.offsetWidth + 3)) + 'px';
                        }
                        else{
                                eltNotify.style.left = (x - (eltNotify.offsetWidth + 2)) + 'px';
                        }
                }

                eltNotify.style.top = y + 'px';

                //var xEffect = Effect.Fade(eltNotify, { fps: 75, from: 1.9, to: 0.0, duration: 1.5, queue: 'front' } );
                window.status = 'Copied text to clipboard';

		// Copy the text inside the text box to the user's clipboard
		var flashcopier = 'flashcopier';
		if(!$(flashcopier)){
			var divholder = document.createElement('div');
			divholder.id = flashcopier;

			document.body.appendChild(divholder);
		}

		$(flashcopier).innerHTML = '';
		var divinfo = '<embed src="' + urlSwf + '" name="copy_swf" FlashVars="clipboard='+escape(elt.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
		$(flashcopier).innerHTML = divinfo;

		elt.select();

		return true;
	}







