/*  Prototype JavaScript framework, version 1.6.0.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.6.0.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,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      document.createElement('div').__proto__ &&
      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 }
};

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;


/* Based on Alex Arnell's inheritance implementation. */
var Class = {
  create: function() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

    function klass() {
      this.initialize.apply(this, arguments);
    }

    Object.extend(klass, Class.Methods);
    klass.superclass = parent;
    klass.subclasses = [];

    if (parent) {
      var subclass = function() { };
      subclass.prototype = parent.prototype;
      klass.prototype = new subclass;
      parent.subclasses.push(klass);
    }

    for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);

    if (!klass.prototype.initialize)
      klass.prototype.initialize = Prototype.emptyFunction;

    klass.prototype.constructor = klass;

    return klass;
  }
};

Class.Methods = {
  addMethods: function(source) {
    var ancestor   = this.superclass && this.superclass.prototype;
    var properties = Object.keys(source);

    if (!Object.keys({ toString: true }).length)
      properties.push("toString", "valueOf");

    for (var i = 0, length = properties.length; i < length; i++) {
      var property = properties[i], value = source[property];
      if (ancestor && Object.isFunction(value) &&
          value.argumentNames().first() == "$super") {
        var method = value, value = Object.extend((function(m) {
          return function() { return ancestor[m].apply(this, arguments) };
        })(property).wrap(method), {
          valueOf:  function() { return method },
          toString: function() { return method.toString() }
        });
      }
      this.prototype[property] = value;
    }

    return this;
  }
};

var Abstract = { };

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.isUndefined(object)) 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.isElement(object)) return;

    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (!Object.isUndefined(value))
        results.push(property.toJSON() + ': ' + value);
    }

    return '{' + results.join(', ') + '}';
  },

  toQueryString: function(object) {
    return $H(object).toQueryString();
  },

  toHTML: function(object) {
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
  },

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

  isElement: function(object) {
    return object && object.nodeType == 1;
  },

  isArray: function(object) {
    return object && object.constructor === Array;
  },

  isHash: function(object) {
    return object instanceof Hash;
  },

  isFunction: function(object) {
    return typeof object == "function";
  },

  isString: function(object) {
    return typeof object == "string";
  },

  isNumber: function(object) {
    return typeof object == "number";
  },

  isUndefined: function(object) {
    return typeof object == "undefined";
  }
});

Object.extend(Function.prototype, {
  argumentNames: function() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
    return names.length == 1 && !names[0] ? [] : names;
  },

  bind: function() {
    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  },

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

  curry: function() {
    if (!arguments.length) return this;
    var __method = this, args = $A(arguments);
    return function() {
      return __method.apply(this, args.concat($A(arguments)));
    }
  },

  delay: function() {
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  },

  wrap: function(wrapper) {
    var __method = this;
    return function() {
      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
    }
  },

  methodize: function() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      return __method.apply(null, [this].concat($A(arguments)));
    };
  }
});

Function.prototype.defer = Function.prototype.delay.curry(0.01);

Date.prototype.toJSON = function() {
  return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};

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

RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

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

var PeriodicalExecuter = Class.create({
  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);
  },

  execute: function() {
    this.callback(this);
  },

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

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } 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 = Object.isUndefined(count) ? 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 String(this);
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = Object.isUndefined(truncation) ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(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 = new Element('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 (!Object.isArray(hash[key])) 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) {
    return count < 1 ? '' : new Array(count + 1).join(this);
  },

  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;
    if (str.blank()) return false;
    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);
  },

  interpolate: function(object, pattern) {
    return new Template(this, pattern).evaluate(object);
  }
});

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 (Object.isFunction(replacement)) 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({
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    if (Object.isFunction(object.toTemplateReplacements))
      object = object.toTemplateReplacements();

    return this.template.gsub(this.pattern, function(match) {
      if (object == null) return '';

      var before = match[1] || '';
      if (before == '\\') return match[2];

      var ctx = object, expr = match[3];
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
      match = pattern.exec(expr);
      if (match == null) return before;

      while (match != null) {
        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
        ctx = ctx[comp];
        if (null == ctx || '' == match[3]) break;
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
        match = pattern.exec(expr);
      }

      return before + String.interpret(ctx);
    }.bind(this));
  }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

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

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

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

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

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

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

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

  grep: function(filter, iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var results = [];

    if (Object.isString(filter))
      filter = new RegExp(filter);

    this.each(function(value, index) {
      if (filter.match(value))
        results.push(iterator(value, index));
    });
    return results;
  },

  include: function(object) {
    if (Object.isFunction(this.indexOf))
      if (this.indexOf(object) != -1) return true;

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

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

  inject: function(memo, iterator, context) {
    iterator = iterator.bind(context);
    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, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator(value, index);
      if (result == null || value >= result)
        result = value;
    });
    return result;
  },

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

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

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

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

  sortBy: function(iterator, context) {
    iterator = iterator.bind(context);
    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 (Object.isFunction(args.last()))
      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,
  filter:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray,
  every:   Enumerable.all,
  some:    Enumerable.any
});
function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

if (Prototype.Browser.WebKit) {
  function $A(iterable) {
    if (!iterable) return [];
    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
        iterable.toArray) return iterable.toArray();
    var length = iterable.length || 0, results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
  }
}

Array.from = $A;

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(Object.isArray(value) ?
        value.flatten() : [value]);
    });
  },

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

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

  intersect: function(array) {
    return this.uniq().findAll(function(item) {
      return array.detect(function(value) { return item === value });
    });
  },

  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 (!Object.isUndefined(value)) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

// use native browser JS 1.6 implementation if available
if (Object.isFunction(Array.prototype.forEach))
  Array.prototype._each = Array.prototype.forEach;

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
  i || (i = 0);
  var length = this.length;
  if (i < 0) i = length + i;
  for (; i < length; i++)
    if (this[i] === item) return i;
  return -1;
};

if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
  var n = this.slice(0, i).reverse().indexOf(item);
  return (n < 0) ? n : i - n - 1;
};

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

function $w(string) {
  if (!Object.isString(string)) return [];
  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 (Object.isArray(arguments[i])) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  };
}
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';
  }
});

$w('abs round ceil floor').each(function(method){
  Number.prototype[method] = Math[method].methodize();
});
function $H(object) {
  return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {

  function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

  return {
    initialize: function(object) {
      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
    },

    _each: function(iterator) {
      for (var key in this._object) {
        var value = this._object[key], pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    },

    set: function(key, value) {
      return this._object[key] = value;
    },

    get: function(key) {
      return this._object[key];
    },

    unset: function(key) {
      var value = this._object[key];
      delete this._object[key];
      return value;
    },

    toObject: function() {
      return Object.clone(this._object);
    },

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

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

    index: function(value) {
      var match = this.detect(function(pair) {
        return pair.value === value;
      });
      return match && match.key;
    },

    merge: function(object) {
      return this.clone().update(object);
    },

    update: function(object) {
      return new Hash(object).inject(this, function(result, pair) {
        result.set(pair.key, pair.value);
        return result;
      });
    },

    toQueryString: function() {
      return this.map(function(pair) {
        var key = encodeURIComponent(pair.key), values = pair.value;

        if (values && typeof values == 'object') {
          if (Object.isArray(values))
            return values.map(toQueryPair.curry(key)).join('&');
        }
        return toQueryPair(key, values);
      }).join('&');
    },

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

    toJSON: function() {
      return Object.toJSON(this.toObject());
    },

    clone: function() {
      return new Hash(this);
    }
  }
})());

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
  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 (Object.isFunction(responder[callback])) {
        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 = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();

    if (Object.isString(this.options.parameters))
      this.options.parameters = this.options.parameters.toQueryParams();
    else if (Object.isHash(this.options.parameters))
      this.options.parameters = this.options.parameters.toObject();
  }
});

Ajax.Request = Class.create(Ajax.Base, {
  _complete: false,

  initialize: function($super, url, options) {
    $super(options);
    this.transport = Ajax.getTransport();
    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 = Object.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 {
      var response = new Ajax.Response(this);
      if (this.options.onCreate) this.options.onCreate(response);
      Ajax.Responders.dispatch('onCreate', this, response);

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

      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

      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 (Object.isFunction(extras.push))
        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() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

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

      var contentType = response.getHeader('Content-type');
      if (this.options.evalJS == 'force'
          || (this.options.evalJS && contentType
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
        this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
    } 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) || 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.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Response = Class.create({
  initialize: function(request){
    this.request = request;
    var transport  = this.transport  = request.transport,
        readyState = this.readyState = transport.readyState;

    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }

    if(readyState == 4) {
      var xml = transport.responseXML;
      this.responseXML  = Object.isUndefined(xml) ? null : xml;
      this.responseJSON = this._getResponseJSON();
    }
  },

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

  getStatusText: function() {
    try {
      return this.transport.statusText || '';
    } catch (e) { return '' }
  },

  getHeader: Ajax.Request.prototype.getHeader,

  getAllHeaders: function() {
    try {
      return this.getAllResponseHeaders();
    } catch (e) { return null }
  },

  getResponseHeader: function(name) {
    return this.transport.getResponseHeader(name);
  },

  getAllResponseHeaders: function() {
    return this.transport.getAllResponseHeaders();
  },

  _getHeaderJSON: function() {
    var json = this.getHeader('X-JSON');
    if (!json) return null;
    json = decodeURIComponent(escape(json));
    try {
      return json.evalJSON(this.request.options.sanitizeJSON);
    } catch (e) {
      this.request.dispatchException(e);
    }
  },

  _getResponseJSON: function() {
    var options = this.request.options;
    if (!options.evalJSON || (options.evalJSON != 'force' &&
      !(this.getHeader('Content-type') || '').include('application/json')) ||
        this.responseText.blank())
          return null;
    try {
      return this.responseText.evalJSON(options.sanitizeJSON);
    } catch (e) {
      this.request.dispatchException(e);
    }
  }
});

Ajax.Updater = Class.create(Ajax.Request, {
  initialize: function($super, container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    };

    options = Object.clone(options);
    var onComplete = options.onComplete;
    options.onComplete = (function(response, json) {
      this.updateContent(response.responseText);
      if (Object.isFunction(onComplete)) onComplete(response, json);
    }).bind(this);

    $super(url, options);
  },

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

    if (!options.evalScripts) responseText = responseText.stripScripts();

    if (receiver = $(receiver)) {
      if (options.insertion) {
        if (Object.isString(options.insertion)) {
          var insertion = { }; insertion[options.insertion] = responseText;
          receiver.insert(insertion);
        }
        else options.insertion(receiver, responseText);
      }
      else receiver.update(responseText);
    }
  }
});
/**
 * Ajax.Request.abort
 * extend the prototype.js Ajax.Request object so that it supports an abort method
 */
Ajax.Request.prototype.abort = function() {
    // prevent and state change callbacks from being issued
    this.transport.onreadystatechange = Prototype.emptyFunction;
    // abort the XHR
    this.transport.abort();
    // update the request counter
    Ajax.activeRequestCount--;
};

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(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(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  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 (Object.isString(element))
    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(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

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

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

if (!Node.ELEMENT_NODE) {
  // DOM level 2 ECMAScript Language Binding
  Object.extend(Node, {
    ELEMENT_NODE: 1,
    ATTRIBUTE_NODE: 2,
    TEXT_NODE: 3,
    CDATA_SECTION_NODE: 4,
    ENTITY_REFERENCE_NODE: 5,
    ENTITY_NODE: 6,
    PROCESSING_INSTRUCTION_NODE: 7,
    COMMENT_NODE: 8,
    DOCUMENT_NODE: 9,
    DOCUMENT_TYPE_NODE: 10,
    DOCUMENT_FRAGMENT_NODE: 11,
    NOTATION_NODE: 12
  });
}

(function() {
  var element = this.Element;
  this.Element = function(tagName, attributes) {
    attributes = attributes || { };
    tagName = tagName.toLowerCase();
    var cache = Element.cache;
    if (Prototype.Browser.IE && attributes.name) {
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
      delete attributes.name;
      return Element.writeAttribute(document.createElement(tagName), attributes);
    }
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
  };
  Object.extend(this.Element, element || { });
}).call(window);

Element.cache = { };

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, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element.innerHTML = content.stripScripts();
    content.evalScripts.bind(content).defer();
    return element;
  },

  replace: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    else if (!Object.isElement(content)) {
      content = Object.toHTML(content);
      var range = element.ownerDocument.createRange();
      range.selectNode(element);
      content.evalScripts.bind(content).defer();
      content = range.createContextualFragment(content.stripScripts());
    }
    element.parentNode.replaceChild(content, element);
    return element;
  },

  insert: function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = {bottom:insertions};

    var content, insert, tagName, childNodes;

    for (position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      insert = Element._insertionTranslations[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        insert(element, content);
        continue;
      }

      content = Object.toHTML(content);

      tagName = ((position == 'before' || position == 'after')
        ? element.parentNode : element).tagName.toUpperCase();

      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());

      if (position == 'top' || position == 'after') childNodes.reverse();
      childNodes.each(insert.curry(element));

      content.evalScripts.bind(content).defer();
    }

    return element;
  },

  wrap: function(element, wrapper, attributes) {
    element = $(element);
    if (Object.isElement(wrapper))
      $(wrapper).writeAttribute(attributes || { });
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
    else wrapper = new Element('div', wrapper);
    if (element.parentNode)
      element.parentNode.replaceChild(wrapper, element);
    wrapper.appendChild(element);
    return wrapper;
  },

  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 $(element).getElementsBySelector("*");
  },

  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 (Object.isString(selector))
      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 Object.isNumber(expression) ? ancestors[expression] :
      Selector.findElement(ancestors, expression, index);
  },

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

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

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

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

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

  identify: function(element) {
    element = $(element);
    var id = element.readAttribute('id'), self = arguments.callee;
    if (id) return id;
    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
    element.writeAttribute('id', id);
    return id;
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      var t = Element._attributeTranslations.read;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name]) name = t.names[name];
      if (name.include(':')) {
        return (!element.attributes || !element.attributes[name]) ? null :
         element.attributes[name].value;
      }
    }
    return element.getAttribute(name);
  },

  writeAttribute: function(element, name, value) {
    element = $(element);
    var attributes = { }, t = Element._attributeTranslations.write;

    if (typeof name == 'object') attributes = name;
    else attributes[name] = Object.isUndefined(value) ? true : value;

    for (var attr in attributes) {
      name = t.names[attr] || attr;
      value = attributes[attr];
      if (t.values[attr]) name = t.values[attr](element, value);
      if (value === false || value === null)
        element.removeAttribute(name);
      else if (value === true)
        element.setAttribute(name, name);
      else element.setAttribute(name, value);
    }
    return element;
  },

  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;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!element.hasClassName(className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    return element[element.hasClassName(className) ?
      'removeClassName' : 'addClassName'](className);
  },

  // 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);
    var originalAncestor = ancestor;

    if (element.compareDocumentPosition)
      return (element.compareDocumentPosition(ancestor) & 8) === 8;

    if (element.sourceIndex && !Prototype.Browser.Opera) {
      var e = element.sourceIndex, a = ancestor.sourceIndex,
       nextAncestor = ancestor.nextSibling;
      if (!nextAncestor) {
        do { ancestor = ancestor.parentNode; }
        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
      }
      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
    }

    while (element = element.parentNode)
      if (element == originalAncestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = element.cumulativeOffset();
    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) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
            property] = 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.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== '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;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(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 Element._returnOffset(valueL, valueT);
  },

  absolutize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'absolute') return;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    var offsets = element.positionedOffset();
    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';
    return element;
  },

  relativize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'relative') return;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

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

  cumulativeScrollOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  getOffsetParent: 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);
  },

  viewportOffset: 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 &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

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

    return Element._returnOffset(valueL, valueT);
  },

  clonePosition: function(element, source) {
    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 = source.viewportOffset();

    // find coordinate system to use
    element = $(element);
    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(element, 'position') == 'absolute') {
      parent = element.getOffsetParent();
      delta = parent.viewportOffset();
    }

    // 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)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Element.Methods.identify.counter = 1;

Object.extend(Element.Methods, {
  getElementsBySelector: Element.Methods.select,
  childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
  write: {
    names: {
      className: 'class',
      htmlFor:   'for'
    },
    values: { }
  }
};

if (Prototype.Browser.Opera) {
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
    function(proceed, element, style) {
      switch (style) {
        case 'left': case 'top': case 'right': case 'bottom':
          if (proceed(element, 'position') === 'static') return null;
        case 'height': case 'width':
          // returns '0px' for hidden elements; we want it to return null
          if (!Element.visible(element)) return null;

          // returns the border-box dimensions rather than the content-box
          // dimensions, so we subtract padding and borders from the value
          var dim = parseInt(proceed(element, style), 10);

          if (dim !== element['offset' + style.capitalize()])
            return dim + 'px';

          var properties;
          if (style === 'height') {
            properties = ['border-top-width', 'padding-top',
             'padding-bottom', 'border-bottom-width'];
          }
          else {
            properties = ['border-left-width', 'padding-left',
             'padding-right', 'border-right-width'];
          }
          return properties.inject(dim, function(memo, property) {
            var val = proceed(element, property);
            return val === null ? memo : memo - parseInt(val, 10);
          }) + 'px';
        default: return proceed(element, style);
      }
    }
  );

  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
    function(proceed, element, attribute) {
      if (attribute === 'title') return element.title;
      return proceed(element, attribute);
    }
  );
}

else if (Prototype.Browser.IE) {
  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
    Element.Methods[method] = Element.Methods[method].wrap(
      function(proceed, element) {
        element = $(element);
        var position = element.getStyle('position');
        if (position != 'static') return proceed(element);
        element.setStyle({ position: 'relative' });
        var value = proceed(element);
        element.setStyle({ position: position });
        return value;
      }
    );
  });

  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) {
    function stripAlpha(filter){
      return filter.replace(/alpha\([^\)]*\)/gi,'');
    }
    element = $(element);
    var currentStyle = element.currentStyle;
    if ((currentStyle && !currentStyle.hasLayout) ||
      (!currentStyle && element.style.zoom == 'normal'))
        element.style.zoom = 1;

    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      (filter = stripAlpha(filter)) ?
        style.filter = filter : style.removeAttribute('filter');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = stripAlpha(filter) +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  Element._attributeTranslations = {
    read: {
      names: {
        'class': 'className',
        'for':   'htmlFor'
      },
      values: {
        _getAttr: function(element, attribute) {
          return element.getAttribute(attribute, 2);
        },
        _getAttrNode: function(element, attribute) {
          var node = element.getAttributeNode(attribute);
          return node ? node.value : "";
        },
        _getEv: function(element, attribute) {
          attribute = element.getAttribute(attribute);
          return attribute ? attribute.toString().slice(23, -2) : null;
        },
        _flag: function(element, attribute) {
          return $(element).hasAttribute(attribute) ? attribute : null;
        },
        style: function(element) {
          return element.style.cssText.toLowerCase();
        },
        title: function(element) {
          return element.title;
        }
      }
    }
  };

  Element._attributeTranslations.write = {
    names: Object.clone(Element._attributeTranslations.read.names),
    values: {
      checked: function(element, value) {
        element.checked = !!value;
      },

      style: function(element, value) {
        element.style.cssText = value ? value : '';
      }
    }
  };

  Element._attributeTranslations.has = {};

  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
      'encType maxLength readOnly longDesc').each(function(attr) {
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
  });

  (function(v) {
    Object.extend(v, {
      href:        v._getAttr,
      src:         v._getAttr,
      type:        v._getAttr,
      action:      v._getAttrNode,
      disabled:    v._flag,
      checked:     v._flag,
      readonly:    v._flag,
      multiple:    v._flag,
      onload:      v._getEv,
      onunload:    v._getEv,
      onclick:     v._getEv,
      ondblclick:  v._getEv,
      onmousedown: v._getEv,
      onmouseup:   v._getEv,
      onmouseover: v._getEv,
      onmousemove: v._getEv,
      onmouseout:  v._getEv,
      onfocus:     v._getEv,
      onblur:      v._getEv,
      onkeypress:  v._getEv,
      onkeydown:   v._getEv,
      onkeyup:     v._getEv,
      onsubmit:    v._getEv,
      onreset:     v._getEv,
      onselect:    v._getEv,
      onchange:    v._getEv
    });
  })(Element._attributeTranslations.read.values);
}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

else if (Prototype.Browser.WebKit) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;

    if (value == 1)
      if(element.tagName == 'IMG' && element.width) {
        element.width++; element.width--;
      } else try {
        var n = document.createTextNode(' ');
        element.appendChild(n);
        element.removeChild(n);
      } catch (e) { }

    return element;
  };

  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
  // KHTML/WebKit only.
  Element.Methods.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 Element._returnOffset(valueL, valueT);
  };
}

if (Prototype.Browser.IE || Prototype.Browser.Opera) {
  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
  Element.Methods.update = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);

    content = Object.toHTML(content);
    var tagName = element.tagName.toUpperCase();

    if (tagName in Element._insertionTranslations.tags) {
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
        .each(function(node) { element.appendChild(node) });
    }
    else element.innerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

if (document.createElement('div').outerHTML) {
  Element.Methods.replace = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) {
      element.parentNode.replaceChild(content, element);
      return element;
    }

    content = Object.toHTML(content);
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

    if (Element._insertionTranslations.tags[tagName]) {
      var nextSibling = element.next();
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
      parent.removeChild(element);
      if (nextSibling)
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
      else
        fragments.each(function(node) { parent.appendChild(node) });
    }
    else element.outerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

Element._returnOffset = function(l, t) {
  var result = [l, t];
  result.left = l;
  result.top = t;
  return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
  if (t) {
    div.innerHTML = t[0] + html + t[1];
    t[2].times(function() { div = div.firstChild });
  } else div.innerHTML = html;
  return $A(div.childNodes);
};

Element._insertionTranslations = {
  before: function(element, node) {
    element.parentNode.insertBefore(node, element);
  },
  top: function(element, node) {
    element.insertBefore(node, element.firstChild);
  },
  bottom: function(element, node) {
    element.appendChild(node);
  },
  after: function(element, node) {
    element.parentNode.insertBefore(node, element.nextSibling);
  },
  tags: {
    TABLE:  ['<table>',                '</table>',                   1],
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
    SELECT: ['<select>',               '</select>',                  1]
  }
};

(function() {
  Object.extend(this.tags, {
    THEAD: this.tags.TBODY,
    TFOOT: this.tags.TBODY,
    TH:    this.tags.TD
  });
}).call(Element._insertionTranslations);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    attribute = Element._attributeTranslations.has[attribute] || attribute;
    var 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.extend = (function() {
  if (Prototype.BrowserFeatures.SpecificElementExtensions)
    return Prototype.K;

  var Methods = { }, ByTag = Element.Methods.ByTag;

  var extend = Object.extend(function(element) {
    if (!element || element._extendedByPrototype ||
        element.nodeType != 1 || element == window) return element;

    var methods = Object.clone(Methods),
      tagName = element.tagName, property, value;

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

    for (property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in element))
        element[property] = value.methodize();
    }

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

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

  extend.refresh();
  return extend;
})();

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 (Object.isArray(tagName)) 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;
    for (var property in methods) {
      var value = methods[property];
      if (!Object.isFunction(value)) continue;
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = value.methodize();
    }
  }

  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 (Object.isUndefined(klass)) continue;
      copy(T[tag], klass.prototype);
    }
  }

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

  if (Element.extend.refresh) Element.extend.refresh();
  Element.cache = { };
};

document.viewport = {
  getDimensions: function() {
    var dimensions = { };
    var B = Prototype.Browser;
    $w('width height').each(function(d) {
      var D = d.capitalize();
      dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
        (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
    });
    return dimensions;
  },

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

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

  getScrollOffsets: function() {
    return Element._returnOffset(
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
  }
};
/* 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({
  initialize: function(expression) {
    this.expression = expression.strip();
    this.compileMatcher();
  },

  shouldUseXPath: function() {
    if (!Prototype.BrowserFeatures.XPath) return false;

    var e = this.expression;

    // Safari 3 chokes on :*-of-type and :empty
    if (Prototype.Browser.WebKit &&
     (e.include("-of-type") || e.include(":empty")))
      return false;

    // XPath can't do namespaced attributes, nor can it read
    // the "checked" property from DOM nodes
    if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
      return false;

    return true;
  },

  compileMatcher: function() {
    if (this.shouldUseXPath())
      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(Object.isFunction(c[i]) ? 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(Object.isFunction(x[i]) ? 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) {
    this.tokens = [];

    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
    var le, p, m;

    while (e && le !== e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          // use the Selector.assertions methods unless the selector
          // is too complex.
          if (as[i]) {
            this.tokens.push([i, Object.clone(m)]);
            e = e.replace(m[0], '');
          } else {
            // reluctantly do a document-wide search
            // and look for a match in the array
            return this.findElements(document).include(element);
          }
        }
      }
    }

    var match = true, name, matches;
    for (var i = 0, token; token = this.tokens[i]; i++) {
      name = token[0], matches = token[1];
      if (!Selector.assertions[name](element, matches)) {
        match = false; break;
      }
    }

    return match;
  },

  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: function(m) {
      m[1] = m[1].toLowerCase();
      return new Template("[@#{1}]").evaluate(m);
    },
    attr: function(m) {
      m[1] = m[1].toLowerCase();
      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 (Object.isFunction(h)) 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, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = Object.isFunction(x[i]) ? 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]*?)\4|([^'"][^\]]*?)))?\]/
  },

  // for Selector.match and Element#match
  assertions: {
    tagName: function(element, matches) {
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
    },

    className: function(element, matches) {
      return Element.hasClassName(element, matches[1]);
    },

    id: function(element, matches) {
      return element.id === matches[1];
    },

    attrPresence: function(element, matches) {
      return Element.hasAttribute(element, matches[1]);
    },

    attr: function(element, matches) {
      var nodeValue = Element.readAttribute(element, matches[1]);
      return Selector.operators[matches[2]](nodeValue, matches[3]);
    }
  },

  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--) {
          var 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, 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) {
      var uTagName = 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() === uTagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!targetNode) return [];
      if (!nodes && root == document) return [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 (Object.isNumber(expression)) {
      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;
  }
});

if (Prototype.Browser.IE) {
  // IE returns comment nodes on getElementsByTagName("*").
  // Filter them out.
  Selector.handlers.concat = function(a, b) {
    for (var i = 0, node; node = b[i]; i++)
      if (node.tagName !== "!") a.push(node);
    return a;
  };
}

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

  serializeElements: function(elements, options) {
    if (typeof options != 'object') options = { hash: !!options };
    else if (Object.isUndefined(options.hash)) options.hash = true;
    var key, value, submitted = false, submit = options.submit;

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            // a key is already present; construct an array of values
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return options.hash ? data : Object.toQueryString(data);
  }
};

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

  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) {
    var elements = $(form).getElements().findAll(function(element) {
      return 'hidden' != element.type && !element.disabled;
    });
    var firstByIndex = elements.findAll(function(element) {
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
    }).sortBy(function(element) { return element.tabIndex }).first();

    return firstByIndex ? firstByIndex : elements.find(function(element) {
      return ['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, action = form.readAttribute('action') || '';
    if (action.blank()) action = window.location.href;
    options.parameters = form.serialize(true);

    if (params) {
      if (Object.isString(params)) params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

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

    return new Ajax.Request(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 Object.toQueryString(pair);
      }
    }
    return '';
  },

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

  setValue: function(element, value) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    Form.Element.Serializers[method](element, value);
    return 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, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element, value);
      default:
        return Form.Element.Serializers.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (Object.isUndefined(value)) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (Object.isUndefined(value)) return element.value;
    else element.value = value;
  },

  select: function(element, index) {
    if (Object.isUndefined(index))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, value, single = !Object.isArray(index);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        value = this.optionValue(opt);
        if (single) {
          if (value == index) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = index.include(value);
      }
    }
  },

  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 = Class.create(PeriodicalExecuter, {
  initialize: function($super, element, frequency, callback) {
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },

  execute: function() {
    var value = this.getValue();
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
});

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

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

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

Abstract.EventObserver = Class.create({
  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, 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(Abstract.EventObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

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

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,
  KEY_INSERT:   45,

  cache: { },

  relatedTarget: function(event) {
    var element;
    switch(event.type) {
      case 'mouseover': element = event.fromElement; break;
      case 'mouseout':  element = event.toElement;   break;
      default: return null;
    }
    return Element.extend(element);
  }
});

Event.Methods = (function() {
  var isButton;

  if (Prototype.Browser.IE) {
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
    isButton = function(event, code) {
      return event.button == buttonMap[code];
    };

  } else if (Prototype.Browser.WebKit) {
    isButton = function(event, code) {
      switch (code) {
        case 0: return event.which == 1 && !event.metaKey;
        case 1: return event.which == 1 && event.metaKey;
        default: return false;
      }
    };

  } else {
    isButton = function(event, code) {
      return event.which ? (event.which === code + 1) : (event.button === code);
    };
  }

  return {
    isLeftClick:   function(event) { return isButton(event, 0) },
    isMiddleClick: function(event) { return isButton(event, 1) },
    isRightClick:  function(event) { return isButton(event, 2) },

    element: function(event) {
      var node = Event.extend(event).target;
      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
    },

    findElement: function(event, expression) {
      var element = Event.element(event);
      if (!expression) return element;
      var elements = [element].concat(element.ancestors());
      return Selector.findElement(elements, expression, 0);
    },

    pointer: function(event) {
      return {
        x: event.pageX || (event.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft)),
        y: event.pageY || (event.clientY +
          (document.documentElement.scrollTop || document.body.scrollTop))
      };
    },

    pointerX: function(event) { return Event.pointer(event).x },
    pointerY: function(event) { return Event.pointer(event).y },

    stop: function(event) {
      Event.extend(event);
      event.preventDefault();
      event.stopPropagation();
      event.stopped = true;
    }
  };
})();

Event.extend = (function() {
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
    m[name] = Event.Methods[name].methodize();
    return m;
  });

  if (Prototype.Browser.IE) {
    Object.extend(methods, {
      stopPropagation: function() { this.cancelBubble = true },
      preventDefault:  function() { this.returnValue = false },
      inspect: function() { return "[object Event]" }
    });

    return function(event) {
      if (!event) return false;
      if (event._extendedByPrototype) return event;

      event._extendedByPrototype = Prototype.emptyFunction;
      var pointer = Event.pointer(event);
      Object.extend(event, {
        target: event.srcElement,
        relatedTarget: Event.relatedTarget(event),
        pageX:  pointer.x,
        pageY:  pointer.y
      });
      return Object.extend(event, methods);
    };

  } else {
    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
    Object.extend(Event.prototype, methods);
    return Prototype.K;
  }
})();

Object.extend(Event, (function() {
  var cache = Event.cache;

  function getEventID(element) {
    if (element._eventID) return element._eventID;
    arguments.callee.id = arguments.callee.id || 1;
    return element._eventID = ++arguments.callee.id;
  }

  function getDOMEventName(eventName) {
    if (eventName && eventName.include(':')) return "dataavailable";
    return eventName;
  }

  function getCacheForID(id) {
    return cache[id] = cache[id] || { };
  }

  function getWrappersForEventName(id, eventName) {
    var c = getCacheForID(id);
    return c[eventName] = c[eventName] || [];
  }

  function createWrapper(element, eventName, handler) {
    var id = getEventID(element);
    var c = getWrappersForEventName(id, eventName);
    if (c.pluck("handler").include(handler)) return false;

    var wrapper = function(event) {
      if (!Event || !Event.extend ||
        (event.eventName && event.eventName != eventName))
          return false;

      Event.extend(event);
      handler.call(element, event);
    };

    wrapper.handler = handler;
    c.push(wrapper);
    return wrapper;
  }

  function findWrapper(id, eventName, handler) {
    var c = getWrappersForEventName(id, eventName);
    return c.find(function(wrapper) { return wrapper.handler == handler });
  }

  function destroyWrapper(id, eventName, handler) {
    var c = getCacheForID(id);
    if (!c[eventName]) return false;
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
  }

  function destroyCache() {
    for (var id in cache)
      for (var eventName in cache[id])
        cache[id][eventName] = null;
  }

  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }

  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }

      return element;
    },

    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);

      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;

      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }

      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;

      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }

      destroyWrapper(id, eventName, handler);

      return element;
    },

    fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;

      var event;
      if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        event = document.createEventObject();
        event.eventType = "ondataavailable";
      }

      event.eventName = eventName;
      event.memo = memo || { };

      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }

      return Event.extend(event);
    }
  };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
  fire:          Event.fire,
  observe:       Event.observe,
  stopObserving: Event.stopObserving
});

Object.extend(document, {
  fire:          Element.Methods.fire.methodize(),
  observe:       Element.Methods.observe.methodize(),
  stopObserving: Element.Methods.stopObserving.methodize(),
  loaded:        false
});

(function() {
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
     Matthias Miller, Dean Edwards and John Resig. */

  var timer;

  function fireContentLoadedEvent() {
    if (document.loaded) return;
    if (timer) window.clearInterval(timer);
    document.fire("dom:loaded");
    document.loaded = true;
  }

  if (document.addEventListener) {
    if (Prototype.Browser.WebKit) {
      timer = window.setInterval(function() {
        if (/loaded|complete/.test(document.readyState))
          fireContentLoadedEvent();
      }, 0);

      Event.observe(window, "load", fireContentLoadedEvent);

    } else {
      document.addEventListener("DOMContentLoaded",
        fireContentLoadedEvent, false);
    }

  } else {
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
    $("__onDOMContentLoaded").onreadystatechange = function() {
      if (this.readyState == "complete") {
        this.onreadystatechange = null;
        fireContentLoadedEvent();
      }
    };
  }
})();
/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
  Before: function(element, content) {
    return Element.insert(element, {before:content});
  },

  Top: function(element, content) {
    return Element.insert(element, {top:content});
  },

  Bottom: function(element, content) {
    return Element.insert(element, {bottom:content});
  },

  After: function(element, content) {
    return Element.insert(element, {after:content});
  }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

// This should be moved to script.aculo.us; notice the deprecated methods
// further below, that map to the newer Element methods.
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;
  },

  // 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 = Element.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 = Element.cumulativeScrollOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = Element.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;
  },

  // Deprecation layer -- use newer Element methods now (1.5.2).

  cumulativeOffset: Element.Methods.cumulativeOffset,

  positionedOffset: Element.Methods.positionedOffset,

  absolutize: function(element) {
    Position.prepare();
    return Element.absolutize(element);
  },

  relativize: function(element) {
    Position.prepare();
    return Element.relativize(element);
  },

  realOffset: Element.Methods.cumulativeScrollOffset,

  offsetParent: Element.Methods.getOffsetParent,

  page: Element.Methods.viewportOffset,

  clone: function(source, target, options) {
    options = options || { };
    return Element.clonePosition(target, source, options);
  }
};

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

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  function iter(name) {
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
  }

  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  function(element, className) {
    className = className.toString().strip();
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  } : function(element, className) {
    className = className.toString().strip();
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
    if (!classNames && !className) return elements;

    var nodes = $(element).getElementsByTagName('*');
    className = ' ' + className + ' ';

    for (var i = 0, child, cn; child = nodes[i]; i++) {
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
          (classNames && classNames.all(function(name) {
            return !name.toString().blank() && cn.include(' ' + name + ' ');
          }))))
        elements.push(Element.extend(child));
    }
    return elements;
  };

  return function(className, parentElement) {
    return $(parentElement || document.body).getElementsByClassName(className);
  };
}(Element.Methods);

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

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);

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

Element.addMethods();// JavaScript Document
//checking for empty fields
function trim(str) {
	return str.replace(/^\s*|\s*$|\n|\r/g,"");
}	
	
function is_field_empty (txtfield, errmsg, errdiv)
{
	//$(txtfield).className     = 'success_border';
	if("" == trim ($(txtfield).value))
	{
		$(errdiv).style.display   = "block";
		//$(txtfield).className     = 'error_border';
		$(errdiv).innerHTML       = errmsg;
		$(txtfield).value         = '';
		$(txtfield).focus();
		return false;
	}
	else
	{
		$(errdiv).innerHTML       = "";
		//$(txtfield).className     = 'success_border';
		$(errdiv).style.display   = "none";
	}
}
function is_drop_down_empty (sltfield, errmsg, errdiv)
{
	//$(sltfield).className    	 = 'success_border';
	if("" == trim ($(sltfield).value) || 0 == trim ($(sltfield).value))
	{
		$(errdiv).style.display   = "block";
		//$(sltfield).className     = 'error_border';
		$(errdiv).innerHTML       = errmsg;
		$(sltfield).focus();
		return false;
	}
	else
	{
		$(errdiv).innerHTML       = "";
		//$(sltfield).className     = 'success_border';
		$(errdiv).style.display   = "none";
	}
}
//email validation functions
function isValidEmail(email)
{
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	if (filter.test(email))
	{
		return true;
	}
	else
	{
		return false;
	}
}
function check_email(txtfield,errmsg,errdiv)
{
	if(!isValidEmail($(txtfield).value))
	{
		$(errdiv).style.display="block";
		$(errdiv).innerHTML=errmsg;
		$(txtfield).select();
		return false;
	}
	return true;
}//end of email validation functions
function isNumber(filed)
	{
		var fileds =filed;
		var valo = new String();
		var numere = "0123456789.";
		var chars = fileds.value.split("");
		for (i = 0; i < chars.length; i++)
		{
			if (numere.indexOf(chars[i]) != -1)
			valo += chars[i];
			else
			{
				fileds.value="";
				return false;
			}
		}
		return true;
	}
//phone number auto maintain position
function phone_no_maintain(position){
	if($('txtphone_'+position))
	if(($('txtphone_'+position).value.length)>2){
		position++;
		$('txtphone_'+position).focus();
	}
}
//phone no validation
function checkphoneno(phone) {
	if(/^\(\d{3}\)[\s]\d{3}[\s]\d{4}$/.test(phone) )
	{
		return true;
	}
	else if( /^\d{3}([-,\s])\d{3}([-,\s])\d{4}$/.test(phone) ){						
		ph = '('+phone.substring(0,3)+') '+phone.substring(4,7)+' '+phone.substring(8,15);
		phone.value = ph;
		return true;
	}
	else if(/^\(\d{3}\)([-,\s])\d{3}([-,\s])\d{4}$/.test(phone) ) {
		ph = phone.substring(0,5)+' '+phone.substring(6,9)+' '+phone.substring(10,15);
		phone.value = ph;
		return true;
	}
	else
	{
		return false;
	}
}

// check zipcode
	function checkzip(zip){
	if(zip.value.length != 5 ){
		return false;
	}else{
		return true;
		}
	
	}	
// check the number is numeric
	function IsNumeric(strString)
   //  check for valid numeric strings	
   {
   var strValidChars = "0123456789";
   var strChar;
   var blnResult = true;

   if (strString.length == 0) return false;

   //  test strString consists of valid characters listed above
   for (i = 0; i < strString.length && blnResult == true; i++)
      {
      strChar = strString.charAt(i);
      if (strValidChars.indexOf(strChar) == -1)
         {
         blnResult = false;
         }
      }
   return blnResult;
   }
   /**
   * password validation
   */
   function is_valid_password (pwd) {
        	var filter=/[a-zA-Z]/i
        	if (filter.test(pwd))
        	{
        	    var filter=/[0-9]/i;   	    
            	if (filter.test(pwd))
            	{	    
        	       	return true;
            	} else {
        	       	return false;    	    
            	}
        	}
        	else
        	{
        		return false;
        	}
        }  /* pagination */
function paginate($url)
{
	$('frmadhischool').action = $url;
	$('frmadhischool').submit();
}
/******* Functions for dropdown menu ********/
function at_attach(parent, child, showtype, position, cursor)
{
  var p = document.getElementById(parent);
  var c = document.getElementById(child);
  p["at_parent"]     = p.id;
  c["at_parent"]     = p.id;
  p["at_child"]      = c.id;
  c["at_child"]      = c.id;
  p["at_position"]   = position;
  c["at_position"]   = position;
  c.style.position   = "absolute";
  c.style.visibility = "hidden";
  if (cursor != undefined) p.style.cursor = cursor;
  switch (showtype)
  {
    case "click":
      p.onclick     = at_click;
      p.onmouseout  = at_hide;
      c.onmouseover = at_show;
      c.onmouseout  = at_hide;
      break;
    case "hover":
      p.onmouseover = at_show;
      p.onmouseout  = at_hide;
      c.onmouseover = at_show;
      c.onmouseout  = at_hide;
      break;
  }
}

// JavaScript Document
var IE 		=   !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1);
var Opera 	= 	navigator.userAgent.indexOf('Opera') > -1;
var WebKit	=	navigator.userAgent.indexOf('AppleWebKit/') > -1;
var Gecko	=  	navigator.userAgent.indexOf('Gecko') > -1 &&  navigator.userAgent.indexOf('KHTML') === -1;
var MobileSafari = !!navigator.userAgent.match(/Apple.*Mobile.*Safari/);
var minusval = (WebKit) ? -7 : 0;
function at_show_aux(parent, child)
{
  var p = document.getElementById(parent);
  var c = document.getElementById(child );
  var top  = (c["at_position"] == "y") ? p.offsetHeight+minusval : 0;
  var left = (c["at_position"] == "x") ? p.offsetWidth +minusval : 0;
  for (; p; p = p.offsetParent)
  {
    top  += p.offsetTop;
    left += p.offsetLeft;
  }
  c.style.position   = "absolute";
  c.style.top        = top +'px';
  c.style.top        = '150px';
  c.style.left       = left+'px';
  c.style.visibility = "visible";
}


function at_show()
{
  var p = document.getElementById(this["at_parent"]);
  var c = document.getElementById(this["at_child" ]);
  at_show_aux(p.id, c.id);
  clearTimeout(c["at_timeout"]);
}
// ***** at_hide *****
function at_hide()
{
  var p = document.getElementById(this["at_parent"]);
  var c = document.getElementById(this["at_child" ]);
  c["at_timeout"] = setTimeout("document.getElementById('"+c.id+"').style.visibility = 'hidden'", 0);
}
// ***** at_click *****
function at_click()
{
  var p = document.getElementById(this["at_parent"]);
  var c = document.getElementById(this["at_child" ]);
  if (c.style.visibility != "visible") at_show_aux(p.id, c.id); else c.style.visibility = "hidden";
  return false;
}
/******** ENDS the dropdown menu code*/
function checkuser(){
	var error =''

	if (false == is_field_empty ("firstname", 'Enter First Name',"errordiv")) {
		$('psword').value =''; 
		$('psword1').value =''; 
	    return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	if (false == is_field_empty ("lastname", 'Enter Last Name',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	if (false == is_field_empty ("forumalias", 'Enter Forum Alias',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		if($('forumalias').value.length < 3){
		 	$('errordiv').style.display     = "block";
			$('errordiv').innerHTML     = "Forum Alias should be minimum 3 characters";
			$('forumalias').focus();
			$('psword').value =''; 
			$('psword1').value =''; 
			return false;
		 }
		$('errordiv').style.display     = "none";
	}
	
	
	
	if (false == is_field_empty ("license", 'Select License Type',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
	}

	if (false == is_field_empty ("email", 'Enter Email Id',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
			if (false == is_field_empty ("confirmemail", 'Enter Confirm Email Id',"errordiv")) {
				$('psword').value =''; 
				$('psword1').value ='';  
				return false;
			} else {
		$('errordiv').style.display     = "none";
		}
		$('errordiv').style.display     = "none";
	}
	
	if (checkEmail($('email').value) == false){
		$('errordiv').style.display     = "block";
		$('errordiv').innerHTML     = "Email is not valid ";
		 $('psword').value =''; 
			$('psword1').value ='';  
		 return false;
	}else{
		if($('email').value != $('confirmemail').value){
			$('errordiv').style.display     = "block";
			$('errordiv').innerHTML     = "Email Id and Confirm Email Id do not match";
			$('email').focus();
			 $('psword').value =''; 
			$('psword1').value =''; 
			return false;			
			}
		
		
	}
	if (false == is_field_empty ("psword", 'Enter Password',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		 if($('psword').value.length >= 8){
			 	if(is_valid_password ($('psword').value) == true){
					 $('errordiv').style.display     = "none";
					}
				else{
						$('errordiv').style.display     = "block";
						$('errordiv').innerHTML     = "Password should be in alphanumeric format";
						$('psword').focus();
						 $('psword').value =''; 
						$('psword1').value =''; 
						return false;

					}
				 $('errordiv').style.display     = "none";
			 }else{
				 
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Password should be minimum 8 characters";
				$('psword').focus();
				 $('psword').value =''; 
				$('psword1').value =''; 
				return false;
				 }
		$('errordiv').style.display     = "none";
		
	}

	if (false == is_field_empty ("psword1", 'Enter Confirm Password',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	
	if (trim($('psword').value) != trim($('psword1').value)) {
		$('errordiv').style.display     = "block";
		$('errordiv').innerHTML     = "Password and Confirm Password do not match";
		$('psword').focus();
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
		
	}

	if (false == is_field_empty ("address", 'Enter Address',"errordiv")) {
	     $('psword').value =''; 
		$('psword1').value =''; 
		return false;
	} else {
		$('errordiv').style.display     = "none";
	}

	if (false == is_field_empty ("state", 'Select State',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
	}

	if (false == is_field_empty ("city", 'Enter City',"errordiv")) {
	     $('psword').value =''; 
		$('psword1').value =''; 
		return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	if (false == is_field_empty ("phone", 'Enter Phone Number',"errordiv")) {
	     $('psword').value =''; 
		$('psword1').value =''; 
		return false;
	} else {
		if(checkphoneno($('phone').value) == true){
		$('errordiv').style.display     = "none";
		}else{
			$('errordiv').style.display     = "block";
			$('errordiv').innerHTML     = "Phone Number is not valid ";
			$('phone').focus();
			$('psword').value =''; 
			$('psword1').value =''; 
			return false;
			
			}

	}

	if (false == is_field_empty ("zipcode", 'Enter Zipcode',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		
			if(checkzip($('zipcode')) == true){
				if((IsNumeric($('zipcode').value) == true)){
						$('errordiv').style.display     = "none";
						}
						else{
							
							$('errordiv').style.display     = "block";
							$('errordiv').innerHTML     = "Zipcode must be 5 digits";
							$('zipcode').focus();
							 $('psword').value =''; 
							$('psword1').value =''; 
							return false;
							
							}
				$('errordiv').style.display     = "none";
				
			 }else{
					
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Zipcode must be 5 digits";
				$('zipcode').focus();
				 $('psword').value =''; 
				$('psword1').value =''; 
				return false;	
			 }
	}

	if (false == is_field_empty ("testimonial", 'Enter Testimonial',"errordiv")) {
	    $('psword').value =''; 
		$('psword1').value =''; 
	   return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	if (false == is_field_empty ("captcha_code", 'Enter Verification Code',"errordiv")) {
	     $('psword').value =''; 
		$('psword1').value =''; 
		return false;
	} else {
		$('errordiv').style.display     = "none";
	}


	$('step1').value =1
	$('myform').action = base_url+'index.php/user/register';	
	$('myform').submit();
}


	
	function checkEmail(email) {
	  if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)){
	  return (true)
	  } 
	  else{
		    return false
		  }
	  
    }
	// check zipcode
	function checkzip(z){
		if(z.value.length != 5){
			return false;
		}else{
			return true;
			}
		
		}
	

	function backhome(){
		$('myform').action = base_url+'index.php/home';	
		$('myform').submit();
	
		}
	function IsNumeric(strString)
   //  check for valid numeric strings	
   {
   var strValidChars = "0123456789";
   var strChar;
   var blnResult = true;

   if (strString.length == 0) return false;

   //  test strString consists of valid characters listed above
   for (i = 0; i < strString.length && blnResult == true; i++)
      {
      strChar = strString.charAt(i);
      if (strValidChars.indexOf(strChar) == -1)
         {
         blnResult = false;
         }
      }
   return blnResult;
   }


/*function checkbilling(){

	if($('bsame').checked == false){
		$('billing').style.display   = "block";
	
	}else{
	
		$('billing').style.display		= "none";
		$('b_address').value	 		= '';
		$('b_state').value		 		= '';
		$('b_city').value 		 		= '';
		$('b_zipcode').value 	 		= '';	

	}
}
*/

	function checkbilling(){

	
		if($('bsame').checked == false){	
		
			//$('shipping').style.display   = "block";
			$('b_address').value			= '';
			$('b_state').value		 		= '';
			$('b_city').value		 		= '';
			$('b_zipcode').value	 		= '';
			$('b_address').readOnly			= false;
			$('b_city').readOnly			= false;
			$('b_state').readOnly			= false;
			$('b_zipcode').readOnly			= false;
			
			$('b_state').setAttribute('readonly',false); 
			
		}else{
		
			//$('shipping').style.display		= "none";
			if( $('s_address').value !=''){
				//alert('hi');
				$('b_address').value			= $('s_address').value;
				$('b_state').value		 		= $('s_state').value;
				$('b_city').value		 		= $('s_city').value;
				$('b_zipcode').value	 		= $('s_zipcode').value;
				$('b_address').readOnly=true;
				$('b_city').readOnly=true;
				
				$('b_state').setAttribute('readonly',true); 
				$('b_zipcode').readOnly=true;
			}else{
				
				$('b_address').value			= '';
				$('b_state').value		 		= '';
				$('b_city').value		 		= '';
				$('b_zipcode').value	 		= '';
				
			}

		}
	}

// List ship method
function checkshipmethod(){
	
	/*if($('price').value !=0){
		
		alert('go');
		}else{
			alert('select course');	
			}*/
			
				
			/****/
			if (false == is_field_empty ("s_address", 'Enter Shipping Address',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
			
			if (false == is_field_empty ("s_state", 'Select Shipping State',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
	
			if (false == is_field_empty ("s_city", 'Enter Shipping City',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
		
			if (false == is_field_empty ("s_zipcode", 'Enter Shipping Zipcode',"errordiv")) {
				return false;
			} else {
				if(checkzip($('s_zipcode')) == true){
				if((IsNumeric($('s_zipcode').value) == true)){
						$('errordiv').style.display     = "none";
						}
						else{
							
							$('errordiv').style.display     = "block";
							$('errordiv').innerHTML     = "Shipping Zipcode must be 5 digits";
							$('s_zipcode').focus();
							return false;
							
							}
				$('errordiv').style.display     = "none";
				
			 }else{
					
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Shipping Zipcode must be 5 digits";
				$('s_zipcode').focus();
				return false;	
			 }

			}
			
	
	if($('bsame').checked == false){
			
						if (false == is_field_empty ("b_address", 'Enter Billing Address',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
	
			if (false == is_field_empty ("b_state", 'Select Billing State',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
	
			if (false == is_field_empty ("b_city", 'Enter Billing City',"errordiv")) {
				return false;
			} else {
				$('errordiv').style.display     = "none";
			}
		
			if (false == is_field_empty ("b_zipcode", 'Enter Billing Zipcode',"errordiv")) {
				return false;
			} else {
				if(checkzip($('b_zipcode')) == true){
				if((IsNumeric($('b_zipcode').value) == true)){
						$('errordiv').style.display     = "none";
						}
						else{
							
							$('errordiv').style.display     = "block";
							$('errordiv').innerHTML     = "Billing Zipcode must be 5 digits";
							$('b_zipcode').focus();
							return false;
							
							}
				$('errordiv').style.display     = "none";
				
			 }else{
					
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Billing Zipcode must be 5 digits";
				$('b_zipcode').focus();
				return false;	
			 }

			}
		


	}
	if($('price').value !=0){
		
		//alert('go');
	}
	else{

		$('errordiv').style.display     = "block";
		$('errordiv').innerHTML     = "Select at least one course";
		return false;
	}
	// ajax function for listing
if(checkzip($('b_zipcode')) == true){
	var weight = 0.0;
	//alert($('totalweight').value);
	//alert($('totalweightb').value);
	//alert($('subcourseweight').value);
	if($('totalweight').value!=0)
		weight= Math.round((parseFloat(weight)+ parseFloat($('totalweight').value))*10)/10;
	if($('totalweightb').value!=0)
		weight= Math.round((parseFloat(weight)+ parseFloat($('totalweightb').value))*10)/10;
	if($('subcourseweight').value!=0)
		weight= Math.round((parseFloat(weight)+ parseFloat($('subcourseweight').value))*10)/10;
		
		var cc= weight.toString();
		var weight =  BRS(cc);
	//alert(weight);
	$('mygif').style.display ="block";
	$('mygif').innerHTML = '<img src='+base_url+'images/spinner.gif>';  
	var update_div  =   'showship';	
	var url             =   base_url + "index.php/register_ajax/get_ship";
	var params      =   's_address='+escape($('s_address').value)+'&s_city='+escape($('s_city').value)+'&s_zipcode='+escape($('s_zipcode').value)+'&s_state='+escape($('s_state').value)
						+'&s_country='+escape($('s_country').value)+'&s_phone='+escape($('bphone').value)+'&weight='+weight;
  //  url = base_url + url;
  
	new Ajax.Request(url,{
	                       method      : "post",
	                       onSuccess   : shoshipmethod,
						   parameters  : params,
	                       onFailure   : disp_shiperror
	                     }
	                );


// end ajax function 
}else{
	
	$('errordiv').style.display     = "block";
	$('errordiv').innerHTML     = "Billing Zipcode must be 5 digits";
	$('b_zipcode').focus();
	return false;	

	
	}
	
}    
function disp_shiperror() {
		alert("Ajax request failed");
		$('mygif').style.display ="none";
}
	

function shoshipmethod(resp_obj)
    {
		var update_div  =   'showship';	
		if(trim(resp_obj.responseText) !='error'){
			$(update_div).style.display ="block";
			$(update_div).innerHTML = resp_obj.responseText;
			$('shipbutton').style.display ="none";
			$('mygif').style.display ="none";
		}else{
			$('shipbutton').style.display ="block";
			$('mygif').style.display ="none";
			$('errordiv').style.display ="block";
			$('errordiv').innerHTML ="Recipient country requires a postal code served by FedEx";
			$(update_div).style.display ="none";
			}
    }
	
	function checkrate(){
		
		if($('showship').style.display =="block"){
				$('shipbutton').style.display ="block";	
				$('shipprice').value = 0;
				$('totalprice').value = 0;
			
				$('showship').style.display = "none";
				
			}
			

		}

 function checkrate1(){
	// alert('hi');
	 	if($('showship').style.display =="block"){
				$('shipbutton').style.display ="block";	
				$('shipprice').value = 0;
				$('totalprice').value = 0;
				$('shipamount').innerHTML = $('shipprice').value;
				$('totalamount').innerHTML = '$'+$('totalprice').value;
				$('showship').style.display = "none";
				
			}
	 }
	 function BRS(Str) {
    var L = Str.length, P = Str.indexOf('.'), Q;
    if (P < 0) {
        return Str + ".0";
    }else{
	 return Str;
	}
   
}


// list ship method
function addcourses(){
	/*var my_month=new Date()
	var month=my_month.getMonth()+1;
	var year= my_month.getFullYear()*/
		var year=$('curyear').value
		var month=$('curmonth').value
	if($('shipprice').value == 0){
		$('errordiv').style.display     = "block";
		$('errordiv').innerHTML     = "Select ship method";
		return false;
	}
	if (false == is_field_empty ("cardtype", 'Select Card Type',"errordiv")) {
	    return false;
	} else {
		$('errordiv').style.display     = "none";
	}
	if (false == is_field_empty ("ccno", 'Enter Credit Card No',"errordiv")) {
	    return false;
	} 
	
	 if($('cardtype').value == 'Amex' ){
		if($('ccno').value.length != 15){
			
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	
		}
		if($('cvv2no').value.length != 4 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	

		}
	}else{
		if($('ccno').value.length != 16){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	

		}
		if($('cvv2no').value.length != 3 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	
		}
	}

		if(trim($('expyear').value) == year){
		
			if(trim($('expmonth').value) < month){
					$('errordiv').style.display     = "block";
					$('errordiv').innerHTML     = "Enter Valid Expiry month and Year";
					$('expmonth').focus();
					 return false;
			}
		}
		//$('step2').value =2;
		//alert(	$('step2'));
		$('course').action = base_url+'index.php/user/courseadd';	
	
		$('newimg').style.display ="block";
		$('newimg').innerHTML = '<img src='+base_url+'images/spinner.gif>'; 
		$('course').submit();



}
// add new course

	function addnewcourses(){
		/*var my_month=new Date()
		var month=my_month.getMonth()+1;
		var year= my_month.getFullYear()*/
		var year=$('curyear').value
		var month=$('curmonth').value
		
		if($('shipprice').value == 0){
		$('errordiv').style.display     = "block";
		$('errordiv').innerHTML     = "Select ship method";
		return false;
		}
		if (false == is_field_empty ("cardtype", 'Select Card Type',"errordiv")) {
		return false;
		} else {
		$('errordiv').style.display     = "none";
		}
		if (false == is_field_empty ("ccno", 'Enter Credit Card No',"errordiv")) {
		return false;
		} 
		
		if($('cardtype').value == 'Amex' ){
		if($('ccno').value.length != 15){
			
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	
		}
		if($('cvv2no').value.length != 4 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	
		
		}
		}else{
		if($('ccno').value.length != 16){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	
		
		}
		if($('cvv2no').value.length != 3 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	
		}
		}
		
		if(trim($('expyear').value) == year){
		
			if(trim($('expmonth').value) < month){
					$('errordiv').style.display     = "block";
					$('errordiv').innerHTML     = "Enter Valid Expiry month and Year";
					$('expmonth').focus();
					 return false;
			}
		}
		//$('step').value =1;
		//alert(	$('step2'));
		$('course').action = base_url+'index.php/user/listremainingcourse';	
		
		$('newimg').style.display ="block";
		$('newimg').innerHTML = '<img src='+base_url+'images/spinner.gif>'; 
		$('course').submit();
		
	
	}
	// add renew course
	function renew_course(){
		
		/*var my_month=new Date()
		var month=my_month.getMonth()+1;
		var year= my_month.getFullYear()*/
		var year=$('curyear').value
		var month=$('curmonth').value


		if (false == is_field_empty ("b_address", 'Enter Billing Address',"errordiv")) {
			return false;
		} else {
			$('errordiv').style.display     = "none";
		}
		
		if (false == is_field_empty ("b_state", 'Select Billing State',"errordiv")) {
			return false;
		} else {
			$('errordiv').style.display     = "none";
		}
		
		if (false == is_field_empty ("b_city", 'Enter Billing City',"errordiv")) {
			return false;
		} else {
			$('errordiv').style.display     = "none";
		}
		
		if (false == is_field_empty ("b_zipcode", 'Enter Billing Zipcode',"errordiv")) {
			return false;
		} else {
				if(checkzip($('b_zipcode')) == true){
				if((IsNumeric($('b_zipcode').value) == true)){
						$('errordiv').style.display     = "none";
						}
						else{
							
							$('errordiv').style.display     = "block";
							$('errordiv').innerHTML     = "Billing Zipcode must be 5 digits";
							$('b_zipcode').focus();
							return false;
							
							}
				$('errordiv').style.display     = "none";
				
			 }else{
					
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Billing Zipcode must be 5 digits";
				$('b_zipcode').focus();
				return false;	
			 }

		}
		
		if (false == is_field_empty ("cardtype", 'Select Card Type',"errordiv")) {
		return false;
		} else {
		$('errordiv').style.display     = "none";
		}
		if (false == is_field_empty ("ccno", 'Enter Credit Card No',"errordiv")) {
		return false;
		} 
		
		if($('cardtype').value == 'Amex' ){
		if($('ccno').value.length != 15){
			
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	
		}
		if($('cvv2no').value.length != 4 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	
		
		}
		}else{
		if($('ccno').value.length != 16){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Number";
				$('ccno').focus();
				return false;	
		
		}
		if($('cvv2no').value.length != 3 ){
				$('errordiv').style.display     = "block";
				$('errordiv').innerHTML     = "Enter valid Credit Card Validation Code";
				$('cvv2no').focus();
				return false;	
		}
		}
		
		if(trim($('expyear').value) == year){
		
			if(trim($('expmonth').value) < month){
					$('errordiv').style.display     = "block";
					$('errordiv').innerHTML     = "Enter Valid Expiry month and Year";
					$('expmonth').focus();
					 return false;
			}
		}

		
		$('renewcourse').action = base_url+'index.php/user/renewal';	
		$('newimg').style.display ="block";
		$('newimg').innerHTML = '<img src='+base_url+'images/spinner.gif>'; 

		$('renewcourse').submit();

	
	}
/**********Credit Card Validation**********************/

/*function checkcc(id){
	if(id == 1){
		var valid	=	0;
		valid		=	isCreditCard(document.checkout_one_form.card_number.value);
		if(!valid){		
		alert("Please enter a valid credit card number!");	
		return false;
		}
		else{
			
			return true;
		}
	}else{
	return true;
	}
	
}*/
 function isCreditCard(){
	// alert($('cardtype').value);
	if($('cardtype').value == 'Amex')	{
		
		document.getElementById('ccno').setAttribute('maxLength', 15);
		document.getElementById('cvv2no').setAttribute('maxLength', 4);
		
	}else{
		document.getElementById('ccno').setAttribute('maxLength', 16);
		document.getElementById('cvv2no').setAttribute('maxLength', 3);
		
	}
}


/*function isCreditCard(textObj){
	var ccNum;
	var odd = 1;
	var even = 2;
	var calcCard = 0;
	var calcs = 0;
	var ccNum2 = "";
	var aChar = '';
	var cc;
	var r;
	
	ccNum = textObj.value;
	for(var i = 0; i != ccNum.length; i++) {
	  aChar = ccNum.substring(i,i+1);
	  if(aChar == '-') {
		 continue;
	  }
	
	  ccNum2 = ccNum2 + aChar;
	}
	cc = parseInt(ccNum2);
	if(cc == 0) {
	  return false;
	}
	r = ccNum.length / 2;
	if(ccNum.length - (parseInt(r)*2) == 0) {
	  odd = 2;
	  even = 1;
	}
	
	for(var x = ccNum.length - 1; x > 0; x--) {
	  r = x / 2;
	  if(r < 1) {
		 r++;
	  }
	  if(x - (parseInt(r) * 2) != 0) {
		 calcs = (parseInt(ccNum.charAt(x - 1))) * odd;
	  }
	  else {
		 calcs = (parseInt(ccNum.charAt(x - 1))) * even;
	  }
	  if(calcs >= 10) {
		 calcs = calcs - 10 + 1;
	  }
	  calcCard = calcCard + calcs;
	}
	
	calcs = 10 - (calcCard % 10);
	if(calcs == 10) {
	  calcs = 0;
	}
	
	if(calcs == (parseInt(ccNum.charAt(ccNum.length - 1)))) {
	  return true;
	}
	else {
	  return false;
	}
	}*/


/****************************/
	
	function is_field_empty (txtfield, errmsg, errdiv)
	{
		if ("" == trim ($(txtfield).value))
		{
			$(errdiv).style.display   = "block";
			$(errdiv).innerHTML       = errmsg;
			$(txtfield).value         = '';
			$(txtfield).focus();
			return false;
		}
		else
		{
			$(errdiv).innerHTML       = "";
			$(errdiv).style.display   = "none";
			return true;
		}
	}
	
//phone no validation
function checkphoneno(v) {
					if(/^\(\d{3}\)[\s]\d{3}[\s]\d{4}$/.test(v) )
					{
						return true;
					}
					else if( /^\d{3}([-,\s])\d{3}([-,\s])\d{4}$/.test(v) ){						
						ph = '('+v.substring(0,3)+') '+v.substring(4,7)+' '+v.substring(8,15);
						v.value = ph;
						return true;
					}
					else if(/^\(\d{3}\)([-,\s])\d{3}([-,\s])\d{4}$/.test(v) ) {
						ph = v.substring(0,5)+' '+v.substring(6,9)+' '+v.substring(10,15);
						v.value = ph;
						return true;
					}
					else
					{
						return false;
					}
				}
				

// phone no validatin

	function is_valid_email (email){
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if (filter.test(email))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	 function trim(str) {
    	return str.replace(/^\s*|\s*$|\n|\r/g,"");
	}	
	
	
/*Validation for admin login*/
	function validateLogin(){
		var username=$('username');
		var password=$('password');
		$('display_error').style.display='none';
		
		if(trim(username.value)==''){
			$('error').innerHTML="Please Enter Username";
			return false;
		}
	
		if(trim(password.value)==''){
			$('error').innerHTML="Please Enter Password";
			return false;
		}

		return true;
	}

	
function regenerate_captcha(div_to_update)
{
    var update_div  =   div_to_update;
	
    var url             =   base_url + "index.php/user_ajax/regenerate_captcha";

  //  url = base_url + url;
	new Ajax.Request(url,{
	                       method      : "post",
	                       onSuccess   : update_captcha_div,
	                       onFailure   : disp_error
	                     }
	                );

    function update_captcha_div(resp_obj)
    {
        $(update_div).innerHTML = resp_obj.responseText;
    }	                
}

function disp_error() {
		alert("Ajax request failed");
}
	
 function is_valid_password (pwd) {
        	var filter=/[a-zA-Z]/i
        	if (filter.test(pwd))
        	{
        	    var filter=/[0-9]/i;   	    
            	if (filter.test(pwd))
            	{	    
        	       	return true;
            	} else {
        	       	return false;    	    
            	}
        	}
        	else
        	{
        		return false;
        	}
        }  


	function checkcourse(){
	
		$('price').value = 0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;

		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		
		/**grid**/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }

		
	 }


	// show Mandatory course terms and condition
	function showterms(id){
		//alert(id);
		//alert(carr.length);
		// intiate variable
		/*for(i=5;i<carr.length;i++)
		 alert(carr[i][0]);*/
		var showdivid = 'showdiv'+id
		$(showdivid).style.display = "block";
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse' + id;
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =false;

		if($(coursebdiv))
		$(coursebdiv).checked =false;

		$(agreediv).checked =false;
		$(disagreediv).checked =false;

		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;

		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		/*$$("input.bcheck").each(function (elem) { if(elem.checked) {
													   
			alert(elem.value);										   
													   
		} })*/
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
	/*	if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		/*******Grid********/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		
			$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }

		
		
		
		
	}
	
	// show Sub Optional course terms and condition
		function show_sub_opt_terms(id,index){
		//alert(id);
		// intiate variable
		var showdivid = 'showdiv'+id
		$(showdivid).style.display = "block";
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse' + id;
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =false;

		if($(coursebdiv))
		$(coursebdiv).checked =false;
		
			$('course0').checked = false;
			$('course0').disabled = true;
		

		$(agreediv).checked =false;
		$(disagreediv).checked =false;
		
			var radioLength			= index.length;		
				for(var i = 0; i < radioLength; i++) {
					if(index[i].checked) {
					var indexid = i;
					}
				}
			index[indexid].checked  = false;

		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;

		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		/*******Grid********/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		
				$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


 }
	
	// show Optional course terms and condition
	function show_opt_terms(id,index){
		//alert(id);
		// intiate variable
		var showdivid = 'showdiv'+id
		$(showdivid).style.display = "block";
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse' + id;
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =false;

		if($(coursebdiv))
		$(coursebdiv).checked =false;

		$(agreediv).checked =false;
		$(disagreediv).checked =false;
		
			var radioLength			= index.length;		
				for(var i = 0; i < radioLength; i++) {
					if(index[i].checked) {
					var indexid = i;
					}
				}
			index[indexid].checked  = false;

		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;

		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		
		/*******Grid********/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


 }

// check for Mandatory fields
	// check course
	function showcheck(id){
		
		// intiate variable
		if(id !=0){
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =true;
		if($(subcoursediv)){
			//$('course0').disabled = true;
			
		}

		if($(coursebdiv))
		$(coursebdiv).checked =true;
		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";
		//add price and weight of checked element
		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/

		
		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }

		// cart total 
		/*$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		
		$(showdivid).style.display = "none";
		}
	}
	// uncheck course
	function showuncheck(id){
		// intiate variable
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		$(showdivid).style.display = "none";
		
		if($(coursediv))
		$(coursediv).checked =false;		
		/*if($(subcoursediv))
		$(subcoursediv).checked =false;

		if($(coursebdiv))
		$(coursebdiv).checked =false;*/

		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		
		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		/******Grid***/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

			$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


		

	}
	
	// check for sub

	function show_radio_check(id,index){
		
		// intiate variable
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =true;
		if($(subcoursediv)){
			$('course0').checked = true;
			$('course0').disabled = true;
			
		}

		if($(coursebdiv))
		$(coursebdiv).checked =true;
		
			var radioLength			= index.length;	
			if(radioLength){
				for(var i = 0; i < radioLength; i++) {
					if(index[i].value == id) {
					var indexid = i;
					}
				}
				
			index[indexid].checked  = true;
			}

		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		
		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/

		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; }})
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		 gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


		// cart total 
	/*	$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		
		$(showdivid).style.display = "none";
	

		
	}
	
	function show_radio_uncheck(id,index){
		
		// intiate variable
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		$(showdivid).style.display = "none";
		
		if($(coursediv))
		$(coursediv).checked =false;
		if($(subcoursediv)){
			$('course0').checked = false;
			$('course0').disabled = true;
		}
		/*if($(coursebdiv))
		$(coursebdiv).checked =false;*/

			var radioLength			= index.length;		
				for(var i = 0; i < radioLength; i++) {
					if(index[i].value == id) {
					var indexid = i;
					}
				}
			index[indexid].checked  = false;
	
				
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		
		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		/***Grid**/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

				$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


		
		

	}

	
	// Check for Optional Fileds	
	function show_radio_check_opt(id,index){
	
		
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		
		if($(coursediv))
		$(coursediv).checked =true;
		if($(subcoursediv)){
			//$('course0').disabled = true;
			
		}

		if($(coursebdiv))
		$(coursebdiv).checked =true;
		if(index){
		var radioLength			= index.length;		
				for(var i = 0; i < radioLength; i++) {
					if(index[i].value == id) {
					var indexid = i;
					}
				}
			index[indexid].checked  = true;
		}
		
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";

		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/

		
		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })

		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';

		 gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }


		// cart total 
		/*$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		
		$(showdivid).style.display = "none";
		

		
	}
	function show_radio_uncheck_opt(id,index){
		
		// intiate variable
		var showdivid = 'showdiv'+id		
		var coursediv = 'course' + id;
		var subcoursediv = 'subcourse';
		var coursebdiv = 'course_b' +id;
		var agreediv = 'agree' + id;
		var disagreediv = 'disagree' + id;
		$(showdivid).style.display = "none";
		
		if($(coursediv))
		$(coursediv).checked =false;
		if($(subcoursediv)){
			/*$('course0').checked = false;
			$('course0').disabled = false;*/
		}
		if($(coursebdiv))
		$(coursebdiv).checked =false;

			var radioLength			= index.length;		
				for(var i = 0; i < radioLength; i++) {
					if(index[i].value == id) {
					var indexid = i;
					}
				}
			index[indexid].checked  = false;
	
				
		$('price').value =0;
		$('totalweight').value =0;
		$('totalweight').value = 0;
		$('totalweightb').value = 0;
		
		//add price and weight of checked element
		$$("input.subcheck").each(function (elem) { if(elem.checked) { $('price').value =  parseFloat($('price').value)+ parseFloat(( $("subprice" + elem.value).value ));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat(( $("courseweight" + elem.value).value));}
																																						  })
		$$("input.scheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) +  parseFloat(( $("courseprice" + elem.value).value));	$('totalweight').value =  parseFloat($('totalweight').value) +  parseFloat( ( $("courseweight" + elem.value).value));} })

		$$("input.bcheck").each(function (elem) { if(elem.checked) { $('price').value = parseFloat($('price').value) + parseFloat(( $("courseprice" + elem.value).value));	$('totalweightb').value =  parseFloat($('totalweightb').value) +   parseFloat(( $("courseweight_b" + elem.value).value));} })
		
		// cart total 
		//$('cartcourseprice').innerHTML   = $('price').value;
		$('shipprice').value =0;
		$('totalprice').value =0;
		/*if($('shipprice').value)
		$('cartshiprate').innerHTML      = $('shipprice').value;
		if($('totalprice').value)
		$('carttotalprice').innerHTML      = $('totalprice').value;*/
		/***Grid**/
		var a =0;
		var s =0;
		var gridtext = "<table cellspacing='0' cellpadding='5' border='0' width='629' class='gridborder'><tr class='gridtrfirst'><td class='firstrow' width='511'>Course Name</td><td  class='gridsectd' ></td> <td class='firstrow' width='118'>Amount($)</td></tr>";
		$$("input.scheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		}else{ gridtext = gridtext +''; } })
		$$("input.subcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' + '<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		$$("input.bcheck").each(function (elem) { if(elem.checked) {
			 a =1;	
			 if(s==0){
			var rstyle= 'gridrowfirst';
			 s=1;
			 }
			 else{	
			var rstyle= 'gridrowsec';
			  s=0;
			 }
			 gridtext =gridtext+ '<tr class='+rstyle+' ><td >'+carr[elem.value][0]+'</td>' +'<td  class=gridsectd ></td> <td>'+carr[elem.value][1]+'</td></tr>';
			 
													   
		} else{ gridtext = gridtext +''; }})
		var totalamnt= '$'+$('totalprice').value;
		 gridtext =gridtext+ '<tr class=gridtrfirst><td class=gridtrlast width=300 >Ship Rate -</td>' + '<td  class=gridsectd ></td> <td class=gridtrlastsec width=100  ><div id=shipamount>'+$('shipprice').value+'</div></td></tr>';
		gridtext =gridtext+ '<table cellspacing=0 cellpadding=5 border=0 width=624 ><tr><td class=gridtrlastprice width=506 >Total Price -</td>' + '<td class=gridlastsectd width=10px ></td> <td class=page_error width=118  ><div id=totalamount>'+totalamnt+'</div></td></tr></table>';
		gridtext =gridtext+"</table>";
		 if(a!=0){
			  //$('grid').className = 'gridborder';
			 $('grid').innerHTML   = gridtext;
			 
			 }else{
				  $('grid').innerHTML   = '';
				 
				 }




	}



// select rate
	function selectrate(val){
			$('shipprice').value=0;
			if($('price').value !=0){
				var shiprate= 'shiprate'+val;
				$('shipprice').value=$(shiprate).value;
				$('totalprice').value=Math.round((parseFloat($(shiprate).value) + parseFloat($('price').value) )*100)/100;
					//$('carttotal').style.display   = "block";
					//$('cartcourseprice').innerHTML   = $('price').value;
					if($('shipprice').value)
					//$('cartshiprate').innerHTML      = $('shipprice').value;
					$('shipamount').innerHTML      = $('shipprice').value;
					
					
					if($('totalprice').value)
					//$('carttotalprice').innerHTML      = $('totalprice').value;
					$('totalamount').innerHTML      = '$'+$('totalprice').value;
	
			}
			else{
				//alert('Select course');
				$('shipid').checked=false;
			}
	}
	
	function change_password() {
		$('flasherror').innerHTML 		=	'';
		$('errordisplay').innerHTML 	=	'';	
		$('flashsuccess').innerHTML 	=	'';	
		if(is_field_empty("old_password",'Please enter Current Password ',"errordisplay")==false){return false;}
		if(is_field_empty("new_password",'Please enter New Password ',"errordisplay")==false){return false;}
		if(is_field_empty("confirm_password",'Please Retype your Password ',"errordisplay")==false){return false;}
		var password		=	$('new_password').value;
		var confirmpassword	=	$('confirm_password').value;
		var oldpassword		=	$('old_password').value;
		if(password.length >= 8){
			 	if(is_valid_password (password) == true){
					 $('errordisplay').style.display     = "none";
				}else{
						$('errordisplay').style.display     = "block";
						$('errordisplay').innerHTML     = "Password should be in alphanumeric format";
						$('new_password').focus();
						return false;
					}
				 $('errordisplay').style.display     = "none";
			 }else{
				 
				$('errordisplay').style.display     = "block";
				$('errordisplay').innerHTML     = "Password should be minimum 8 characters";
				$('new_password').focus();
				return false;
			}
		$('errordisplay').style.display     = "none";
		if(password!=confirmpassword){
			$('errordisplay').style.display     = "block";
			$('errordisplay').innerHTML = 'Password and Confirm Password do not match';
			return false;
		}
		if(password == oldpassword){
			$('errordisplay').style.display     = "block";
			$('errordisplay').innerHTML = 'New Password should not be same as Current Password';
			return false;
		}
		$('change_password_form_adhi').action = base_url+'user/change_password/';
		$("change_password_form_adhi").submit();
	}
/************************************************************************************************************
JS Calendar
Copyright (C) September 2006  DTHMLGoodies.com, Alf Magne Kalleland

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.

Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com
	
************************************************************************************************************/	

/* Update log:
(C) www.dhtmlgoodies.com, September 2005

Version 1.2, November 8th - 2005 - Added <iframe> background in IE
Version 1.3, November 12th - 2005 - Fixed top bar position in Opera 7
Version 1.4, December 28th - 2005 - Support for Spanish and Portuguese
Version 1.5, January  18th - 2006 - Fixed problem with next-previous buttons after a month has been selected from dropdown
Version 1.6, February 22nd - 2006 - Added variable which holds the path to images.
									Format todays date at the bottom by use of the todayStringFormat variable
									Pick todays date by clicking on todays date at the bottom of the calendar
Version 2.0	 May, 25th - 2006	  - Added support for time(hour and minutes) and changing year and hour when holding mouse over + and - options. (i.e. instead of click)
Version 2.1	 July, 2nd - 2006	  - Added support for more date formats(example: d.m.yyyy, i.e. one letter day and month).

*/
var languageCode = 'en';	// Possible values: 	en,ge,no,nl,es,pt-br,fr	
							// en = english, ge = german, no = norwegian,nl = dutch, es = spanish, pt-br = portuguese, fr = french, da = danish, hu = hungarian(Use UTF-8 doctype for hungarian)

var calendar_display_time = true;
								
// Format of current day at the bottom of the calendar
// [todayString] = the value of todayString
// [dayString] = day of week (examle: mon, tue, wed...)
// [UCFdayString] = day of week (examle: Mon, Tue, Wed...) ( First letter in uppercase)
// [day] = Day of month, 1..31
// [monthString] = Name of current month
// [year] = Current year		
var todayStringFormat = '[todayString] [UCFdayString]. [day]. [monthString] [year]';						
var pathToImages = base_url+'images/icons/';	// Relative to your HTML file

var speedOfSelectBoxSliding = 200;	// Milliseconds between changing year and hour when holding mouse over "-" and "+" - lower value = faster
var intervalSelectBox_minutes = 5;	// Minute select box - interval between each option (5 = default)

var calendar_offsetTop = 0;		// Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
var calendar_offsetLeft = 0;	// Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
var calendarDiv = false;

var MSIE = false;
var Opera = false;
if(navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Opera')<0)MSIE=true;
if(navigator.userAgent.indexOf('Opera')>=0)Opera=true;


switch(languageCode){
	case "en":	/* English */
		var monthArray = ['January','February','March','April','May','June','July','August','September','October','November','December'];
		var monthArrayShort = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
		var dayArray = ['Mon','Tue','Wed','Thu','Fri','Sat','Su'];
		var weekString = 'Wk';
		var todayString = '';
		break;
	case "ge":	/* German */
		var monthArray = ['Januar','Februar','M�rz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'];
		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
		var dayArray = ['Mon','Die','Mit','Don','Fre','Sam','Son'];	
		var weekString = 'Woche';
		var todayString = 'Heute';		
		break;
	case "no":	/* Norwegian */
		var monthArray = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'];
		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Des'];
		var dayArray = ['Man','Tir','Ons','Tor','Fre','L&oslash;r','S&oslash;n'];	
		var weekString = 'Uke';
		var todayString = 'Dagen i dag er';
		break;	
	case "nl":	/* Dutch */
		var monthArray = ['Januari','Februari','Maart','April','Mei','Juni','Juli','Augustus','September','Oktober','November','December'];
		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Aug','Sep','Okt','Nov','Dec'];
		var dayArray = ['Ma','Di','Wo','Do','Vr','Za','Zo'];
		var weekString = 'Week';
		var todayString = 'Vandaag';
		break;	
	case "es": /* Spanish */
		var monthArray = ['Enero','Febrero','Marzo','April','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
		var monthArrayShort =['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'];
		var dayArray = ['Lun','Mar','Mie','Jue','Vie','Sab','Dom'];
		var weekString = 'Semana';
		var todayString = 'Hoy es';
		break; 	
	case "pt-br":  /* Brazilian portuguese (pt-br) */
		var monthArray = ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];
		var monthArrayShort = ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'];
		var dayArray = ['Seg','Ter','Qua','Qui','Sex','S&aacute;b','Dom'];
		var weekString = 'Sem.';
		var todayString = 'Hoje &eacute;';
		break;
	case "fr":      /* French */
		var monthArray = ['Janvier','F�vrier','Mars','Avril','Mai','Juin','Juillet','Ao�t','Septembre','Octobre','Novembre','D�cembre'];		
		var monthArrayShort = ['Jan','Fev','Mar','Avr','Mai','Jun','Jul','Aou','Sep','Oct','Nov','Dec'];
		var dayArray = ['Lun','Mar','Mer','Jeu','Ven','Sam','Dim'];
		var weekString = 'Sem';
		var todayString = "Aujourd'hui";
		break; 	
	case "da": /*Danish*/
		var monthArray = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'];
		var monthArrayShort = ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'];
		var dayArray = ['man','tirs','ons','tors','fre','l&oslash;r','s&oslash;n'];
		var weekString = 'Uge';
		var todayString = 'I dag er den';
		break;	
	case "hu":	/* Hungarian  - Remember to use UTF-8 encoding, i.e. the <meta> tag */
		var monthArray = ['Január','Február','Március','�?prilis','Május','Június','Július','Augusztus','Szeptember','Október','November','December'];
		var monthArrayShort = ['Jan','Feb','Márc','�?pr','Máj','Jún','Júl','Aug','Szep','Okt','Nov','Dec'];
		var dayArray = ['Hé','Ke','Sze','Cs','Pé','Szo','Vas'];
		var weekString = 'Hét';
		var todayString = 'Mai nap';	
		break;
	case "it":	/* Italian*/
		var monthArray = ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];
		var monthArrayShort = ['Gen','Feb','Mar','Apr','Mag','Giu','Lugl','Ago','Set','Ott','Nov','Dic'];
		var dayArray = ['Lun',';Mar','Mer','Gio','Ven','Sab','Dom'];
		var weekString = 'Settimana';
		var todayString = 'Oggi &egrave; il';
		break;		
	case "sv":	/* Swedish */
		var monthArray = ['Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December'];
		var monthArrayShort = ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'];
		var dayArray = ['M&aring;n','Tis','Ons','Tor','Fre','L&ouml;r','S&ouml;n'];
		var weekString = 'Vecka';
		var todayString = 'Idag &auml;r det den';
		break;
		

		
}



var daysInMonthArray = [31,28,31,30,31,30,31,31,30,31,30,31];
var currentMonth;
var currentYear;
var currentHour;
var currentMinute;
var calendarContentDiv;
var returnDateTo;
var returnFormat;
var activeSelectBoxMonth;
var activeSelectBoxYear;
var activeSelectBoxHour;
var activeSelectBoxMinute;

var iframeObj = false;
//// fix for EI frame problem on time dropdowns 09/30/2006
var iframeObj2 =false;
function EIS_FIX_EI1(where2fixit)
{ 

		if(!iframeObj2)return;
		iframeObj2.style.display = 'block';
		iframeObj2.style.height =document.getElementById(where2fixit).offsetHeight+1;
		iframeObj2.style.width=document.getElementById(where2fixit).offsetWidth;
		iframeObj2.style.left=getleftPos(document.getElementById(where2fixit))+1-calendar_offsetLeft;
		iframeObj2.style.top=getTopPos(document.getElementById(where2fixit))-document.getElementById(where2fixit).offsetHeight-calendar_offsetTop;
}

function EIS_Hide_Frame()
{		if(iframeObj2)iframeObj2.style.display = 'none';}
//// fix for EI frame problem on time dropdowns 09/30/2006
var returnDateToYear;
var returnDateToMonth;
var returnDateToDay;
var returnDateToHour;
var returnDateToMinute;

var inputYear;
var inputMonth;
var inputDay;
var inputHour;
var inputMinute;
var calendarDisplayTime = false;

var selectBoxHighlightColor = '#D60808'; // Highlight color of select boxes
var selectBoxRolloverBgColor = '#E6E6E6'; // Background color on drop down lists(rollover)

var selectBoxMovementInProgress = false;
var activeSelectBox = false;

function cancelCalendarEvent()
{
	return false;
}
function isLeapYear(inputYear)
{
	if(inputYear%400==0||(inputYear%4==0&&inputYear%100!=0)) return true;
	return false;	
	
}
var activeSelectBoxMonth = false;
var activeSelectBoxDirection = false;

function highlightMonthYear()
{
	if(activeSelectBoxMonth)activeSelectBoxMonth.className='';
	activeSelectBox = this;

	
	if(this.className=='monthYearActive'){
		this.className='';	
	}else{
		this.className = 'monthYearActive';
		activeSelectBoxMonth = this;
	}
	
	if(this.innerHTML.indexOf('-')>=0 || this.innerHTML.indexOf('+')>=0){
		if(this.className=='monthYearActive')
			selectBoxMovementInProgress = true; 
		else 
			selectBoxMovementInProgress = false;	
		if(this.innerHTML.indexOf('-')>=0)activeSelectBoxDirection = -1; else activeSelectBoxDirection = 1;	
			
	}else selectBoxMovementInProgress = false;
	
}

function showMonthDropDown()
{
	if(document.getElementById('monthDropDown').style.display=='block'){
		document.getElementById('monthDropDown').style.display='none';	
		//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	}else{
		document.getElementById('monthDropDown').style.display='block';		
		document.getElementById('yearDropDown').style.display='none';
		document.getElementById('hourDropDown').style.display='none';
		document.getElementById('minuteDropDown').style.display='none';
			if (MSIE)
		{ EIS_FIX_EI1('monthDropDown')}
		//// fix for EI frame problem on time dropdowns 09/30/2006

	}
}

function showYearDropDown()
{
	if(document.getElementById('yearDropDown').style.display=='block'){
		document.getElementById('yearDropDown').style.display='none';	
		//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	}else{
		document.getElementById('yearDropDown').style.display='block';	
		document.getElementById('monthDropDown').style.display='none';	
		document.getElementById('hourDropDown').style.display='none';
		document.getElementById('minuteDropDown').style.display='none';		
			if (MSIE)
		{ EIS_FIX_EI1('yearDropDown')}
		//// fix for EI frame problem on time dropdowns 09/30/2006

	}		

}
function showHourDropDown()
{
	if(document.getElementById('hourDropDown').style.display=='block'){
		document.getElementById('hourDropDown').style.display='none';	
		//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	}else{
		document.getElementById('hourDropDown').style.display='block';	
		document.getElementById('monthDropDown').style.display='none';	
		document.getElementById('yearDropDown').style.display='none';	
		document.getElementById('minuteDropDown').style.display='none';	
				if (MSIE)
		{ EIS_FIX_EI1('hourDropDown')}
		//// fix for EI frame problem on time dropdowns 09/30/2006
	}		

}
function showMinuteDropDown()
{
	if(document.getElementById('minuteDropDown').style.display=='block'){
		document.getElementById('minuteDropDown').style.display='none';	
		//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	}else{
		document.getElementById('minuteDropDown').style.display='block';	
		document.getElementById('monthDropDown').style.display='none';	
		document.getElementById('yearDropDown').style.display='none';	
		document.getElementById('hourDropDown').style.display='none';	
				if (MSIE)
		{ EIS_FIX_EI1('minuteDropDown')}
		//// fix for EI frame problem on time dropdowns 09/30/2006
	}		

}

function selectMonth()
{
	document.getElementById('calendar_month_txt').innerHTML = this.innerHTML
	currentMonth = this.id.replace(/[^\d]/g,'');

	document.getElementById('monthDropDown').style.display='none';
	//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	for(var no=0;no<monthArray.length;no++){
		document.getElementById('monthDiv_'+no).style.color='';	
	}
	this.style.color = selectBoxHighlightColor;
	activeSelectBoxMonth = this;
	writeCalendarContent();
	
}

function selectHour()
{
	document.getElementById('calendar_hour_txt').innerHTML = this.innerHTML
	currentHour = this.innerHTML.replace(/[^\d]/g,'');
	document.getElementById('hourDropDown').style.display='none';
	//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	if(activeSelectBoxHour){
		activeSelectBoxHour.style.color='';
	}
	activeSelectBoxHour=this;
	this.style.color = selectBoxHighlightColor;
}

function selectMinute()
{
	document.getElementById('calendar_minute_txt').innerHTML = this.innerHTML
	currentMinute = this.innerHTML.replace(/[^\d]/g,'');
	document.getElementById('minuteDropDown').style.display='none';
	//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	if(activeSelectBoxMinute){
		activeSelectBoxMinute.style.color='';
	}
	activeSelectBoxMinute=this;
	this.style.color = selectBoxHighlightColor;
}


function selectYear()
{
	document.getElementById('calendar_year_txt').innerHTML = this.innerHTML
	currentYear = this.innerHTML.replace(/[^\d]/g,'');
	document.getElementById('yearDropDown').style.display='none';
	//// fix for EI frame problem on time dropdowns 09/30/2006
				EIS_Hide_Frame();
	if(activeSelectBoxYear){
		activeSelectBoxYear.style.color='';
	}
	activeSelectBoxYear=this;
	this.style.color = selectBoxHighlightColor;
	writeCalendarContent();
	
}

function switchMonth()
{
	if(this.src.indexOf('left')>=0){
		currentMonth=currentMonth-1;;
		if(currentMonth<0){
			currentMonth=11;
			currentYear=currentYear-1;
		}
	}else{
		currentMonth=currentMonth+1;;
		if(currentMonth>11){
			currentMonth=0;
			currentYear=currentYear/1+1;
		}	
	}	
	
	writeCalendarContent();	
	
	
}

function createMonthDiv(){
	var div = document.createElement('DIV');
	div.className='monthYearPicker';
	div.id = 'monthPicker';
	
	for(var no=0;no<monthArray.length;no++){
		var subDiv = document.createElement('DIV');
		subDiv.innerHTML = monthArray[no];
		subDiv.onmouseover = highlightMonthYear;
		subDiv.onmouseout = highlightMonthYear;
		subDiv.onclick = selectMonth;
		subDiv.id = 'monthDiv_' + no;
		subDiv.style.width = '56px';
		subDiv.onselectstart = cancelCalendarEvent;		
		div.appendChild(subDiv);
		if(currentMonth && currentMonth==no){
			subDiv.style.color = selectBoxHighlightColor;
			activeSelectBoxMonth = subDiv;
		}				
		
	}	
	return div;
	
}

function changeSelectBoxYear(e,inputObj)
{
	if(!inputObj)inputObj =this;
	var yearItems = inputObj.parentNode.getElementsByTagName('DIV');
	if(inputObj.innerHTML.indexOf('-')>=0){
		var startYear = yearItems[1].innerHTML/1 -1;
		if(activeSelectBoxYear){
			activeSelectBoxYear.style.color='';
		}
	}else{
		var startYear = yearItems[1].innerHTML/1 +1;
		if(activeSelectBoxYear){
			activeSelectBoxYear.style.color='';

		}			
	}

	for(var no=1;no<yearItems.length-1;no++){
		yearItems[no].innerHTML = startYear+no-1;	
		yearItems[no].id = 'yearDiv' + (startYear/1+no/1-1);	
		
	}		
	if(activeSelectBoxYear){
		activeSelectBoxYear.style.color='';
		if(document.getElementById('yearDiv'+currentYear)){
			activeSelectBoxYear = document.getElementById('yearDiv'+currentYear);
			activeSelectBoxYear.style.color=selectBoxHighlightColor;;
		}
	}
}
function changeSelectBoxHour(e,inputObj)
{
	if(!inputObj)inputObj = this;
	
	var hourItems = inputObj.parentNode.getElementsByTagName('DIV');
	if(inputObj.innerHTML.indexOf('-')>=0){
		var startHour = hourItems[1].innerHTML/1 -1;
		if(startHour<0)startHour=0;
		if(activeSelectBoxHour){
			activeSelectBoxHour.style.color='';
		}
	}else{
		var startHour = hourItems[1].innerHTML/1 +1;
		if(startHour>14)startHour = 14;
		if(activeSelectBoxHour){
			activeSelectBoxHour.style.color='';

		}			
	}
	var prefix = '';
	for(var no=1;no<hourItems.length-1;no++){
		if((startHour/1 + no/1) < 11)prefix = '0'; else prefix = '';
		hourItems[no].innerHTML = prefix + (startHour+no-1);	
		
		hourItems[no].id = 'hourDiv' + (startHour/1+no/1-1);	
		
	}		
	if(activeSelectBoxHour){
		activeSelectBoxHour.style.color='';
		if(document.getElementById('hourDiv'+currentHour)){
			activeSelectBoxHour = document.getElementById('hourDiv'+currentHour);
			activeSelectBoxHour.style.color=selectBoxHighlightColor;;
		}
	}
}

function updateYearDiv()
{
	var div = document.getElementById('yearDropDown');
	var yearItems = div.getElementsByTagName('DIV');
	for(var no=1;no<yearItems.length-1;no++){
		yearItems[no].innerHTML = currentYear/1 -6 + no;	
		if(currentYear==(currentYear/1 -6 + no)){
			yearItems[no].style.color = selectBoxHighlightColor;
			activeSelectBoxYear = yearItems[no];				
		}else{
			yearItems[no].style.color = '';
		}
	}		
}

function updateMonthDiv()
{
	for(no=0;no<12;no++){
		document.getElementById('monthDiv_' + no).style.color = '';
	}		
	document.getElementById('monthDiv_' + currentMonth).style.color = selectBoxHighlightColor;
	activeSelectBoxMonth = 	document.getElementById('monthDiv_' + currentMonth);
}


function updateHourDiv()
{
	var div = document.getElementById('hourDropDown');
	var hourItems = div.getElementsByTagName('DIV');
	
	var addHours = 0;
	if((currentHour/1 -6 + 1)<0){
		addHours = 	(currentHour/1 -6 + 1)*-1;
	}
	for(var no=1;no<hourItems.length-1;no++){
		var prefix='';
		if((currentHour/1 -6 + no + addHours) < 10)prefix='0';
		hourItems[no].innerHTML = prefix +  (currentHour/1 -6 + no + addHours);	
		if(currentHour==(currentHour/1 -6 + no)){
			hourItems[no].style.color = selectBoxHighlightColor;
			activeSelectBoxHour = hourItems[no];				
		}else{
			hourItems[no].style.color = '';
		}
	}
}

function updateMinuteDiv()
{
	for(no=0;no<60;no+=intervalSelectBox_minutes){
		var prefix = '';
		if(no<10)prefix = '0';
	
		document.getElementById('minuteDiv_' + prefix + no).style.color = '';
	}	
	if(document.getElementById('minuteDiv_' + currentMinute)){	
		document.getElementById('minuteDiv_' + currentMinute).style.color = selectBoxHighlightColor;
		activeSelectBoxMinute = document.getElementById('minuteDiv_' + currentMinute);
	}
}



function createYearDiv()
{

	if(!document.getElementById('yearDropDown')){
		var div = document.createElement('DIV');
		div.className='monthYearPicker';
	}else{
		var div = document.getElementById('yearDropDown');
		var subDivs = div.getElementsByTagName('DIV');
		for(var no=0;no<subDivs.length;no++){
			subDivs[no].parentNode.removeChild(subDivs[no]);	
		}	
	}	
	
	
	var d = new Date();
	if(currentYear){
		d.setFullYear(currentYear);	
	}

	var startYear = d.getFullYear()/1 - 5;

	
	var subDiv = document.createElement('DIV');
	subDiv.innerHTML = '&nbsp;&nbsp;- ';
	subDiv.onclick = changeSelectBoxYear;
	subDiv.onmouseover = highlightMonthYear;
	subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;};	
	subDiv.onselectstart = cancelCalendarEvent;			
	div.appendChild(subDiv);
	
	for(var no=startYear;no<(startYear+10);no++){
		var subDiv = document.createElement('DIV');
		subDiv.innerHTML = no;
		subDiv.onmouseover = highlightMonthYear;
		subDiv.onmouseout = highlightMonthYear;		
		subDiv.onclick = selectYear;		
		subDiv.id = 'yearDiv' + no;	
		subDiv.onselectstart = cancelCalendarEvent;	
		div.appendChild(subDiv);
		if(currentYear && currentYear==no){
			subDiv.style.color = selectBoxHighlightColor;
			activeSelectBoxYear = subDiv;
		}			
	}
	var subDiv = document.createElement('DIV');
	subDiv.innerHTML = '&nbsp;&nbsp;+ ';
	subDiv.onclick = changeSelectBoxYear;
	subDiv.onmouseover = highlightMonthYear;
	subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;};		
	subDiv.onselectstart = cancelCalendarEvent;			
	div.appendChild(subDiv);		
	return div;
}

/* This function creates the hour div at the bottom bar */

function slideCalendarSelectBox()
{
	if(selectBoxMovementInProgress){
		if(activeSelectBox.parentNode.id=='hourDropDown'){
			changeSelectBoxHour(false,activeSelectBox);			
		}
		if(activeSelectBox.parentNode.id=='yearDropDown'){
			changeSelectBoxYear(false,activeSelectBox);			
		}
		
	}
	setTimeout('slideCalendarSelectBox()',speedOfSelectBoxSliding);
		
}

function createHourDiv()
{
	if(!document.getElementById('hourDropDown')){
		var div = document.createElement('DIV');
		div.className='monthYearPicker';
	}else{
		var div = document.getElementById('hourDropDown');
		var subDivs = div.getElementsByTagName('DIV');
		for(var no=0;no<subDivs.length;no++){
			subDivs[no].parentNode.removeChild(subDivs[no]);	
		}	
	}		
	
	if(!currentHour)currentHour=0;
	var startHour = currentHour/1;	
	if(startHour>14)startHour=14;

	var subDiv = document.createElement('DIV');
	subDiv.innerHTML = '&nbsp;&nbsp;- ';
	subDiv.onclick = changeSelectBoxHour;
	subDiv.onmouseover = highlightMonthYear;
	subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;};	
	subDiv.onselectstart = cancelCalendarEvent;			
	div.appendChild(subDiv);
		
	for(var no=startHour;no<startHour+10;no++){
		var prefix = '';
		if(no/1<10)prefix='0';
		var subDiv = document.createElement('DIV');
		subDiv.innerHTML = prefix + no;
		subDiv.onmouseover = highlightMonthYear;
		subDiv.onmouseout = highlightMonthYear;		
		subDiv.onclick = selectHour;		
		subDiv.id = 'hourDiv' + no;	
		subDiv.onselectstart = cancelCalendarEvent;	
		div.appendChild(subDiv);
		if(currentYear && currentYear==no){
			subDiv.style.color = selectBoxHighlightColor;
			activeSelectBoxYear = subDiv;
		}			
	}
	var subDiv = document.createElement('DIV');
	subDiv.innerHTML = '&nbsp;&nbsp;+ ';
	subDiv.onclick = changeSelectBoxHour;
	subDiv.onmouseover = highlightMonthYear;
	subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;};		
	subDiv.onselectstart = cancelCalendarEvent;			
	div.appendChild(subDiv);	
		
	return div;	
}
/* This function creates the minute div at the bottom bar */

function createMinuteDiv()
{
	if(!document.getElementById('minuteDropDown')){
		var div = document.createElement('DIV');
		div.className='monthYearPicker';
	}else{
		var div = document.getElementById('minuteDropDown');
		var subDivs = div.getElementsByTagName('DIV');
		for(var no=0;no<subDivs.length;no++){
			subDivs[no].parentNode.removeChild(subDivs[no]);	
		}	
	}		
	var startMinute = 0;	
	var prefix = '';
	for(var no=startMinute;no<60;no+=intervalSelectBox_minutes){
		
		if(no<10)prefix='0'; else prefix = '';
		var subDiv = document.createElement('DIV');
		subDiv.innerHTML = prefix + no;
		subDiv.onmouseover = highlightMonthYear;
		subDiv.onmouseout = highlightMonthYear;		
		subDiv.onclick = selectMinute;		
		subDiv.id = 'minuteDiv_' + prefix +  no;	
		subDiv.onselectstart = cancelCalendarEvent;	
		div.appendChild(subDiv);
		if(currentYear && currentYear==no){
			subDiv.style.color = selectBoxHighlightColor;
			activeSelectBoxYear = subDiv;
		}			
	}
	return div;	
}

function highlightSelect()
{
	
	if(this.className=='selectBoxTime'){
		this.className = 'selectBoxTimeOver';	
		this.getElementsByTagName('IMG')[0].src = pathToImages + 'down_time_over.gif';
	}else if(this.className=='selectBoxTimeOver'){
		this.className = 'selectBoxTime';	
		this.getElementsByTagName('IMG')[0].src = pathToImages + 'down_time.gif';			
	}
	
	if(this.className=='selectBox'){
		this.className = 'selectBoxOver';	
		this.getElementsByTagName('IMG')[0].src = pathToImages + 'down_over.gif';
	}else if(this.className=='selectBoxOver'){
		this.className = 'selectBox';	
		this.getElementsByTagName('IMG')[0].src = pathToImages + 'down.gif';			
	}
	
}

function highlightArrow()
{
	if(this.src.indexOf('over')>=0){
		if(this.src.indexOf('left')>=0)this.src = pathToImages + 'left.gif';	
		if(this.src.indexOf('right')>=0)this.src = pathToImages + 'right.gif';				
	}else{
		if(this.src.indexOf('left')>=0)this.src = pathToImages + 'left_over.gif';	
		if(this.src.indexOf('right')>=0)this.src = pathToImages + 'right_over.gif';	
	}
}

function highlightClose()
{
	if(this.src.indexOf('over')>=0){
		this.src = pathToImages + 'close.gif';
	}else{
		this.src = pathToImages + 'close_over.gif';	
	}	

}

function closeCalendar(){

	document.getElementById('yearDropDown').style.display='none';
	document.getElementById('monthDropDown').style.display='none';
	document.getElementById('hourDropDown').style.display='none';
	document.getElementById('minuteDropDown').style.display='none';
		
	calendarDiv.style.display='none';
	if(iframeObj){
		iframeObj.style.display='none';
		 //// //// fix for EI frame problem on time dropdowns 09/30/2006
			EIS_Hide_Frame();}
	if(activeSelectBoxMonth)activeSelectBoxMonth.className='';
	if(activeSelectBoxYear)activeSelectBoxYear.className='';
	

}

function writeTopBar()
{

	var topBar = document.createElement('DIV');
	topBar.className = 'topBar';
	topBar.id = 'topBar';
	calendarDiv.appendChild(topBar);
	
	// Left arrow
	var leftDiv = document.createElement('DIV');
	leftDiv.style.marginRight = '1px';
	var img = document.createElement('IMG');
	img.src = pathToImages + 'left.gif';
	img.onmouseover = highlightArrow;
	img.onclick = switchMonth;
	img.onmouseout = highlightArrow;
	leftDiv.appendChild(img);	
	topBar.appendChild(leftDiv);
	if(Opera)leftDiv.style.width = '16px';
	
	// Right arrow
	var rightDiv = document.createElement('DIV');
	rightDiv.style.marginRight = '1px';
	var img = document.createElement('IMG');
	img.src = pathToImages + 'right.gif';
	img.onclick = switchMonth;
	img.onmouseover = highlightArrow;
	img.onmouseout = highlightArrow;
	rightDiv.appendChild(img);
	if(Opera)rightDiv.style.width = '16px';
	topBar.appendChild(rightDiv);		

			
	// Month selector
	var monthDiv = document.createElement('DIV');
	monthDiv.id = 'monthSelect';
	monthDiv.onmouseover = highlightSelect;
	monthDiv.onmouseout = highlightSelect;
	monthDiv.onclick = showMonthDropDown;
	var span = document.createElement('SPAN');		
	span.innerHTML = monthArray[currentMonth];
	span.id = 'calendar_month_txt';
	monthDiv.appendChild(span);

	var img = document.createElement('IMG');
	img.src = pathToImages + 'down.gif';
	img.style.position = 'absolute';
	img.style.right = '0px';
	monthDiv.appendChild(img);
	monthDiv.className = 'selectBox';
	if(Opera){
		img.style.cssText = 'float:right;position:relative';
		img.style.position = 'relative';
		img.style.styleFloat = 'right';
	}
	topBar.appendChild(monthDiv);

	var monthPicker = createMonthDiv();
	monthPicker.style.left = '37px';
	monthPicker.style.top = monthDiv.offsetTop + monthDiv.offsetHeight + 1 + 'px';
	monthPicker.style.width ='60px';
	monthPicker.id = 'monthDropDown';
	
	calendarDiv.appendChild(monthPicker);
			
	// Year selector
	var yearDiv = document.createElement('DIV');
	yearDiv.onmouseover = highlightSelect;
	yearDiv.onmouseout = highlightSelect;
	yearDiv.onclick = showYearDropDown;
	var span = document.createElement('SPAN');		
	span.innerHTML = currentYear;
	span.id = 'calendar_year_txt';
	yearDiv.appendChild(span);
	topBar.appendChild(yearDiv);
	
	var img = document.createElement('IMG');
	img.src = pathToImages + 'down.gif';
	yearDiv.appendChild(img);
	yearDiv.className = 'selectBox';
	
	if(Opera){
		yearDiv.style.width = '50px';
		img.style.cssText = 'float:right';
		img.style.position = 'relative';
		img.style.styleFloat = 'right';
	}	
	
	var yearPicker = createYearDiv();
	yearPicker.style.left = '113px';
	yearPicker.style.top = monthDiv.offsetTop + monthDiv.offsetHeight + 1 + 'px';
	yearPicker.style.width = '35px';
	yearPicker.id = 'yearDropDown';
	calendarDiv.appendChild(yearPicker);
	
		
	var img = document.createElement('IMG');
	img.src = pathToImages + 'close.gif';
	img.style.styleFloat = 'right';
	img.onmouseover = highlightClose;
	img.onmouseout = highlightClose;
	img.onclick = closeCalendar;
	topBar.appendChild(img);
	if(!document.all){
		img.style.position = 'absolute';
		img.style.right = '2px';
	}
	
	

}

function writeCalendarContent()
{
	var calendarContentDivExists = true;
	if(!calendarContentDiv){
		calendarContentDiv = document.createElement('DIV');
		calendarDiv.appendChild(calendarContentDiv);
		calendarContentDivExists = false;
	}
	currentMonth = currentMonth/1;
	var d = new Date();	
	
	d.setFullYear(currentYear);		
	d.setDate(1);		
	d.setMonth(currentMonth);
	
	var dayStartOfMonth = d.getDay();
	if(dayStartOfMonth==0)dayStartOfMonth=7;
	dayStartOfMonth--;
	
	document.getElementById('calendar_year_txt').innerHTML = currentYear;
	document.getElementById('calendar_month_txt').innerHTML = monthArray[currentMonth];
	document.getElementById('calendar_hour_txt').innerHTML = currentHour;
	document.getElementById('calendar_minute_txt').innerHTML = currentMinute;
	
	var existingTable = calendarContentDiv.getElementsByTagName('TABLE');
	if(existingTable.length>0){
		calendarContentDiv.removeChild(existingTable[0]);
	}
	
	var calTable = document.createElement('TABLE');
	calTable.width = '100%';
	calTable.cellSpacing = '0';
	calendarContentDiv.appendChild(calTable);
	


	
	var calTBody = document.createElement('TBODY');
	calTable.appendChild(calTBody);
	var row = calTBody.insertRow(-1);
	row.className = 'calendar_week_row';
	var cell = row.insertCell(-1);
	cell.innerHTML = weekString;
	cell.className = 'calendar_week_column';
	cell.style.backgroundColor = selectBoxRolloverBgColor;
	
	for(var no=0;no<dayArray.length;no++){
		var cell = row.insertCell(-1);
		cell.innerHTML = dayArray[no]; 
	}
	
	var row = calTBody.insertRow(-1);
	var cell = row.insertCell(-1);
	cell.className = 'calendar_week_column';
	cell.style.backgroundColor = selectBoxRolloverBgColor;
	var week = getWeek(currentYear,currentMonth,1);
	cell.innerHTML = week;		// Week
	for(var no=0;no<dayStartOfMonth;no++){
		var cell = row.insertCell(-1);
		cell.innerHTML = '&nbsp;';
	}

	var colCounter = dayStartOfMonth;
	var daysInMonth = daysInMonthArray[currentMonth];
	if(daysInMonth==28){
		if(isLeapYear(currentYear))daysInMonth=29;
	}
	
	for(var no=1;no<=daysInMonth;no++){
		d.setDate(no-1);
		if(colCounter>0 && colCounter%7==0){
			var row = calTBody.insertRow(-1);
			var cell = row.insertCell(-1);
			cell.className = 'calendar_week_column';
			var week = getWeek(currentYear,currentMonth,no);
			cell.innerHTML = week;		// Week	
			cell.style.backgroundColor = selectBoxRolloverBgColor;			
		}
		var cell = row.insertCell(-1);
		if(currentYear==inputYear && currentMonth == inputMonth && no==inputDay){
			cell.className='activeDay';	
		}
		cell.innerHTML = no;
		cell.onclick = pickDate;
		colCounter++;
	}
	
	
	if(!document.all){
		if(calendarContentDiv.offsetHeight)
			document.getElementById('topBar').style.top = calendarContentDiv.offsetHeight + document.getElementById('timeBar').offsetHeight + document.getElementById('topBar').offsetHeight -1 + 'px';
		else{
			document.getElementById('topBar').style.top = '';
			document.getElementById('topBar').style.bottom = '0px';
		}
			
	}
	
	if(iframeObj){
		if(!calendarContentDivExists)setTimeout('resizeIframe()',350);else setTimeout('resizeIframe()',10);
	}
	
	
		
	
}

function resizeIframe()
{
	iframeObj.style.width = calendarDiv.offsetWidth + 'px';
	iframeObj.style.height = calendarDiv.offsetHeight + 'px' ;	
	
	
}

function pickTodaysDate()
{
	var d = new Date();
	currentMonth = d.getMonth();
	currentYear = d.getFullYear();
	pickDate(false,d.getDate());
	
}

function pickDate(e,inputDay)
{
	var month = currentMonth/1 +1;
	if(month<10)month = '0' + month;
	var day;
	if(!inputDay && this)day = this.innerHTML; else day = inputDay;
	
	if(day/1<10)day = '0' + day;
	if(returnFormat){
		returnFormat = returnFormat.replace('dd',day);
		returnFormat = returnFormat.replace('mm',month);
		returnFormat = returnFormat.replace('yyyy',currentYear);
		returnFormat = returnFormat.replace('hh',currentHour);
		returnFormat = returnFormat.replace('ii',currentMinute);
		returnFormat = returnFormat.replace('d',day/1);
		returnFormat = returnFormat.replace('m',month/1);
	
		returnDateTo.value = returnFormat;
		try{
			returnDateTo.onchange();
		}catch(e){
			
		}
	}else{
		for(var no=0;no<returnDateToYear.options.length;no++){
			if(returnDateToYear.options[no].value==currentYear){
				returnDateToYear.selectedIndex=no;
				break;
			}				
		}
		for(var no=0;no<returnDateToMonth.options.length;no++){
			if(returnDateToMonth.options[no].value==month){
				returnDateToMonth.selectedIndex=no;
				break;
			}				
		}
		for(var no=0;no<returnDateToDay.options.length;no++){
			if(returnDateToDay.options[no].value==day){
				returnDateToDay.selectedIndex=no;
				break;
			}				
		}		
		if(calendarDisplayTime){
			for(var no=0;no<returnDateToHour.options.length;no++){
				if(returnDateToHour.options[no].value==currentHour){
					returnDateToHour.selectedIndex=no;
					break;
				}				
			}			
			for(var no=0;no<returnDateToMinute.options.length;no++){
				if(returnDateToMinute.options[no].value==currentMinute){
					returnDateToMinute.selectedIndex=no;
					break;
				}				
			}		
		}		
	}
	closeCalendar();
	
}

// This function is from http://www.codeproject.com/csharp/gregorianwknum.asp
// Only changed the month add
function getWeek(year,month,day){
	day = day/1;
	year = year /1;
    month = month/1 + 1; //use 1-12
    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + 
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                 Math.floor(y/400) - 32045;      // (gregorian calendar)
    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;        
}

function writeTimeBar()
{
	var timeBar = document.createElement('DIV');
	timeBar.id = 'timeBar';
	timeBar.className = 'timeBar';	
	
	var subDiv = document.createElement('DIV');
	subDiv.innerHTML = 'Time:';
	//timeBar.appendChild(subDiv);
	
	// Year selector
	var hourDiv = document.createElement('DIV');
	hourDiv.onmouseover = highlightSelect;
	hourDiv.onmouseout = highlightSelect;
	hourDiv.onclick = showHourDropDown;
	hourDiv.style.width = '30px';
	var span = document.createElement('SPAN');		
	span.innerHTML = currentHour;
	span.id = 'calendar_hour_txt';
	hourDiv.appendChild(span);
	timeBar.appendChild(hourDiv);
	
	var img = document.createElement('IMG');
	img.src = pathToImages + 'down_time.gif';
	hourDiv.appendChild(img);
	hourDiv.className = 'selectBoxTime';
	
	if(Opera){
		hourDiv.style.width = '30px';
		img.style.cssText = 'float:right';
		img.style.position = 'relative';
		img.style.styleFloat = 'right';
	}	
	
	var hourPicker = createHourDiv();
	hourPicker.style.left = '130px';
	//hourPicker.style.top = monthDiv.offsetTop + monthDiv.offsetHeight + 1 + 'px';
	hourPicker.style.width = '35px';
	hourPicker.id = 'hourDropDown';
	calendarDiv.appendChild(hourPicker);
	
	// Add Minute picker
	
	// Year selector
	var minuteDiv = document.createElement('DIV');
	minuteDiv.onmouseover = highlightSelect;
	minuteDiv.onmouseout = highlightSelect;
	minuteDiv.onclick = showMinuteDropDown;
	minuteDiv.style.width = '30px';
	var span = document.createElement('SPAN');		
	span.innerHTML = currentMinute;

	span.id = 'calendar_minute_txt';
	minuteDiv.appendChild(span);
	timeBar.appendChild(minuteDiv);
	
	var img = document.createElement('IMG');
	img.src = pathToImages + 'down_time.gif';
	minuteDiv.appendChild(img);
	minuteDiv.className = 'selectBoxTime';
	
	if(Opera){
		minuteDiv.style.width = '30px';
		img.style.cssText = 'float:right';
		img.style.position = 'relative';
		img.style.styleFloat = 'right';
	}	
	
	var minutePicker = createMinuteDiv();
	minutePicker.style.left = '167px';
	//minutePicker.style.top = monthDiv.offsetTop + monthDiv.offsetHeight + 1 + 'px';
	minutePicker.style.width = '35px';
	minutePicker.id = 'minuteDropDown';
	calendarDiv.appendChild(minutePicker);
		
	
	return timeBar;
	
}

function writeBottomBar()
{
	var d = new Date();
	var bottomBar = document.createElement('DIV');	
	
	bottomBar.id = 'bottomBar';
	
	bottomBar.style.cursor = 'pointer';
	bottomBar.className = 'todaysDate';
	// var todayStringFormat = '[todayString] [dayString] [day] [monthString] [year]';	;;
	
	var subDiv = document.createElement('DIV');
	subDiv.onclick = pickTodaysDate;
	subDiv.id = 'todaysDateString';
	subDiv.style.width = (calendarDiv.offsetWidth - 95) + 'px';
	var day = d.getDay();
	if(day==0)day = 7;
	day--;
	
	var bottomString = todayStringFormat;
	bottomString = bottomString.replace('[monthString]',monthArrayShort[d.getMonth()]);
	bottomString = bottomString.replace('[day]',d.getDate());
	bottomString = bottomString.replace('[year]',d.getFullYear());
	bottomString = bottomString.replace('[dayString]',dayArray[day].toLowerCase());
	bottomString = bottomString.replace('[UCFdayString]',dayArray[day]);
	bottomString = bottomString.replace('[todayString]',todayString);
	
	
	subDiv.innerHTML = todayString + ': ' + d.getDate() + '. ' + monthArrayShort[d.getMonth()] + ', ' +  d.getFullYear() ;
	subDiv.innerHTML = bottomString ;
	bottomBar.appendChild(subDiv);
	
	var timeDiv = writeTimeBar();
	bottomBar.appendChild(timeDiv);
	
	calendarDiv.appendChild(bottomBar);	
	
	
		
}
function getTopPos(inputObj)
{
	
  var returnValue = inputObj.offsetTop + inputObj.offsetHeight;
  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetTop;
  return returnValue + calendar_offsetTop;
}

function getleftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;
  return returnValue + calendar_offsetLeft;
}

function positionCalendar(inputObj)
{
	calendarDiv.style.left = getleftPos(inputObj) + 'px';
	calendarDiv.style.top = getTopPos(inputObj) + 'px';
	if(iframeObj){
		iframeObj.style.left = calendarDiv.style.left;
		iframeObj.style.top =  calendarDiv.style.top;
		//// fix for EI frame problem on time dropdowns 09/30/2006
		iframeObj2.style.left = calendarDiv.style.left;
		iframeObj2.style.top =  calendarDiv.style.top;
	}
		
}
	
function initCalendar()
{
	if(MSIE){
		iframeObj = document.createElement('IFRAME');
		iframeObj.style.filter = 'alpha(opacity=0)';
		iframeObj.style.position = 'absolute';
		iframeObj.border='0px';
		iframeObj.style.border = '0px';
		iframeObj.style.backgroundColor = '#FF0000';
		//// fix for EI frame problem on time dropdowns 09/30/2006
		iframeObj2 = document.createElement('IFRAME');

		iframeObj2.style.position = 'absolute';
		iframeObj2.border='0px';
		iframeObj2.style.border = '0px';
		iframeObj2.style.height = '1px';
		iframeObj2.style.width = '1px';
		document.body.appendChild(iframeObj2);
		//// fix for EI frame problem on time dropdowns 09/30/2006
		// Added fixed for HTTPS
		iframeObj2.src = 'blank.html'; 
		iframeObj.src = 'blank.html'; 
		document.body.appendChild(iframeObj);
	}
		
	calendarDiv = document.createElement('DIV');	
	calendarDiv.id = 'calendarDiv';
	calendarDiv.style.zIndex = 10000;
	slideCalendarSelectBox();
	
	document.body.appendChild(calendarDiv);	
	writeBottomBar();	
	writeTopBar();
	
	
	
	if(!currentYear){
		var d = new Date();
		currentMonth = d.getMonth();
		currentYear = d.getFullYear();
	}
	writeCalendarContent();	


		
}

function setTimeProperties()
{
	if(!calendarDisplayTime){
		document.getElementById('timeBar').style.display='none'; 
		document.getElementById('timeBar').style.visibility='hidden'; 
		document.getElementById('todaysDateString').style.width = '100%';
		
			
	}else{ 
		document.getElementById('timeBar').style.display='block';
		document.getElementById('timeBar').style.visibility='visible';
		document.getElementById('hourDropDown').style.top = document.getElementById('calendar_minute_txt').parentNode.offsetHeight + calendarContentDiv.offsetHeight + document.getElementById('topBar').offsetHeight + 'px';
		document.getElementById('minuteDropDown').style.top = document.getElementById('calendar_minute_txt').parentNode.offsetHeight + calendarContentDiv.offsetHeight + document.getElementById('topBar').offsetHeight + 'px';
		document.getElementById('minuteDropDown').style.right = '50px';
		document.getElementById('hourDropDown').style.right = '50px';
		document.getElementById('todaysDateString').style.width = '115px';
	}	
}

function calendarSortItems(a,b)
{
	return a/1 - b/1;
}


function displayCalendar(inputField,format,buttonObj,displayTime,timeInput)
{
	//	alert(inputField.value);
	if(displayTime)calendarDisplayTime=true; else calendarDisplayTime = false;
	if(inputField.value.length>0){
		
		if(!format.match(/^[0-9]*?$/gi)){
			var items = inputField.value.split(/[^0-9]/gi);
			var positionArray = new Array();
			positionArray['m'] = format.indexOf('mm');
			if(positionArray['m']==-1)positionArray['m'] = format.indexOf('m');
			positionArray['d'] = format.indexOf('dd');
			if(positionArray['d']==-1)positionArray['d'] = format.indexOf('d');
			positionArray['y'] = format.indexOf('yyyy');
			positionArray['h'] = format.indexOf('hh');
			positionArray['i'] = format.indexOf('ii');
			
			var positionArrayNumeric = Array();
			positionArrayNumeric[0] = positionArray['m'];
			positionArrayNumeric[1] = positionArray['d'];
			positionArrayNumeric[2] = positionArray['y'];
			positionArrayNumeric[3] = positionArray['h'];
			positionArrayNumeric[4] = positionArray['i'];
			
			
			positionArrayNumeric = positionArrayNumeric.sort(calendarSortItems);
			var itemIndex = -1;
			currentHour = '00';
			currentMinute = '00';
			for(var no=0;no<positionArrayNumeric.length;no++){
				if(positionArrayNumeric[no]==-1)continue;
				itemIndex++;
				if(positionArrayNumeric[no]==positionArray['m']){
					currentMonth = items[itemIndex]-1;
					continue;
				}
				if(positionArrayNumeric[no]==positionArray['y']){
					currentYear = items[itemIndex];
					continue;
				}	
				if(positionArrayNumeric[no]==positionArray['d']){
					tmpDay = items[itemIndex];
					continue;
				}	
				if(positionArrayNumeric[no]==positionArray['h']){
					currentHour = items[itemIndex];
					continue;
				}	
				if(positionArrayNumeric[no]==positionArray['i']){
					currentMinute = items[itemIndex];
					continue;
				}	
			}

			currentMonth = currentMonth / 1;
			tmpDay = tmpDay / 1;
		}else{		
			var monthPos = format.indexOf('mm');
			currentMonth = inputField.value.substr(monthPos,2)/1 -1;	
			var yearPos = format.indexOf('yyyy');
			currentYear = inputField.value.substr(yearPos,4);		
			var dayPos = format.indexOf('dd');
			tmpDay = inputField.value.substr(dayPos,2);		
			
			var hourPos = format.indexOf('hh');
			if(hourPos>=0){
				tmpHour = inputField.value.substr(hourPos,2);	
				currentHour = tmpHour;
			}else{
				currentHour = '00';
			}
			var minutePos = format.indexOf('ii');
			if(minutePos>=0){
				tmpMinute = inputField.value.substr(minutePos,2);	
				currentMinute = tmpMinute;
			}else{
				currentMinute = '00';
			}	
		}
	}else{
		var d = new Date();
		currentMonth = d.getMonth();
		currentYear = d.getFullYear();
		currentHour = '08';
		currentMinute = '00';
		tmpDay = d.getDate();
	}
	
	inputYear = currentYear;
	inputMonth = currentMonth;
	inputDay = tmpDay/1;
	
	
	if(!calendarDiv){
		initCalendar();			
	}else{
		if(calendarDiv.style.display=='block'){
			closeCalendar();
			return false;
		}
		writeCalendarContent();
	}	
	
	
			
	returnFormat = format;
	returnDateTo = inputField;
	positionCalendar(buttonObj);
	calendarDiv.style.visibility = 'visible';	
	calendarDiv.style.display = 'block';	
	if(iframeObj){
		iframeObj.style.display = '';
		iframeObj.style.height = '140px';
		iframeObj.style.width = '195px';
				iframeObj2.style.display = '';
		iframeObj2.style.height = '140px';
		iframeObj2.style.width = '195px';
	}
	
	setTimeProperties();	
	updateYearDiv();
	updateMonthDiv();
	updateMinuteDiv();
	updateHourDiv();
	
}

function displayCalendarSelectBox(yearInput,monthInput,dayInput,hourInput,minuteInput,buttonObj)
{
	if(!hourInput)calendarDisplayTime=false; else calendarDisplayTime = true;
	
	currentMonth = monthInput.options[monthInput.selectedIndex].value/1-1;
	currentYear = yearInput.options[yearInput.selectedIndex].value;
	if(hourInput){
		currentHour = hourInput.options[hourInput.selectedIndex].value;
		inputHour = currentHour/1;
	}
	if(minuteInput){
		currentMinute = minuteInput.options[minuteInput.selectedIndex].value;
		inputMinute = currentMinute/1;
	}
	
	inputYear = yearInput.options[yearInput.selectedIndex].value;
	inputMonth = monthInput.options[monthInput.selectedIndex].value/1 - 1;
	inputDay = dayInput.options[dayInput.selectedIndex].value/1;
			
	if(!calendarDiv){
		initCalendar();			
	}else{
		writeCalendarContent();
	}		

	
	
	returnDateToYear = yearInput;
	returnDateToMonth = monthInput;
	returnDateToDay = dayInput;
	returnDateToHour = hourInput; 	
	returnDateToMinute = minuteInput; 	

	

	
	returnFormat = false;
	returnDateTo = false;
	positionCalendar(buttonObj);
	calendarDiv.style.visibility = 'visible';	
	calendarDiv.style.display = 'block';
	if(iframeObj){
		iframeObj.style.display = '';
		iframeObj.style.height = calendarDiv.offsetHeight + 'px';
		iframeObj.style.width = calendarDiv.offsetWidth + 'px';	
		//// fix for EI frame problem on time dropdowns 09/30/2006
		iframeObj2.style.display = '';
		iframeObj2.style.height = calendarDiv.offsetHeight + 'px';
		iframeObj2.style.width = calendarDiv.offsetWidth + 'px'
	}
	setTimeProperties();
	updateYearDiv();
	updateMonthDiv();
	updateHourDiv();
	updateMinuteDiv();
		
}

	//Trim Functions
	function ltrim(str) { 
		for(var k = 0; k < str.length && isWhitespace(str.charAt(k)); k++);
		return str.substring(k, str.length);
	}
	function rtrim(str) {
		for(var j=str.length-1; j>=0 && isWhitespace(str.charAt(j)) ; j--) ;
		return str.substring(0,j+1);
	}
	function trim(str) {
		return ltrim(rtrim(str));
	}
	function isAlphaNumeric(val){
		if (val.match(/^[a-zA-Z0-9]+$/))
		{
		return true;
		}
		else
		{
		return false;
		} 
	}
	function isWhitespace(charToCheck) {
		var whitespaceChars = " \t\n\r\f";
		return (whitespaceChars.indexOf(charToCheck) != -1);
	}
	//End Trim Functions
	//Email Validation
	function __fncCheckEMail(email, strMessage){
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if (filter.test(email)){
			testres=true
			return(testres)
		}else{
			alert(strMessage);
			testres=false
			return(testres)
		}
	}
	var day_temp 	= 0;
	var month_temp 	= 0;
	var year_temp 	= 0;
	
	/*Validation for user login*/
	function validate_user_Login(){
		$('server_error').style.display='none';
		if(is_field_empty("username",'Please enter Email',"error")==false){return false;}
		if(check_email("username",'Please enter valid Email',"error")==false){return false;}
		if(is_field_empty("password",'Please enter Password',"error")==false){return false;}
		$('loginform').submit();
	}
	function clearusername()
	{
		$('username').value='';
	}
	function clearpassword()
	{
		$('password').value='';
	}	
	
	/*Validation for forgot password*/
	function forgot_password(){
		$('flasherror').innerHTML 		=	'';
		$('errordisplay').innerHTML 	=	'';	
		$('flashsuccess').innerHTML 	=	'';	
		if(is_field_empty("email",'Please enter Email',"errordisplay")==false){return false;}
		if(check_email("email",'Please enter valid Email',"errordisplay")==false){return false;}
		
		$('forgot_password_form_adhi').action = base_url+'user/forgot_password/';
		$("forgot_password_form_adhi").submit();
	}

	/** class display  */
	
	function fncGetClass(subregion){
		$('hdnSubregion').value = subregion;
	}
	
	function fncNextPrevRegion (nav) {
	
		var offset = $('hdnOffset').value;
		//nav - 0 for previous, nav - 1 for next
		if(nav == 0) {
			offset = parseInt(offset)-5;
		} else if(nav == 1) {
			offset = parseInt(offset)+5;
		}
		var subregion 		= $('hdnSubregion').value ;
		var dated 			= $('hdnDated').value ;
		var url             =   base_url + "home/related_region/";
		
		var params = "dated="+dated+"&subregion="+subregion+"&offset="+offset;
	  //  url = base_url + url;
		new Ajax.Request(url,{
		                       method      : "post",
		                       parameters  : params,
		                       onSuccess   : update_captcha_div,
		                       onFailure   : disp_error
		                     }
		                );
	
		 $('divImage').innerHTML = '<center><img src="'+base_url+'images/spinner.gif"/></center>';
	    function update_captcha_div(resp_obj)
	    {
	        $('divShowRelatedImage').innerHTML = resp_obj.responseText;
	    }	
	    function disp_error() {
			alert("Ajax request failed");
		}
	}
	
	/** populates a select box dynamically using Json array**/
	function fncGetSubregion(main,sub){
				
		var numb 		= $(main).value;
		var obj 		= eval(content);
		if(obj != ''){
			$(sub).options.length	= null;
			$(sub).options[$(sub).options.length] = new Option('Select',0);
			if(obj.R[numb]){
				
				obj.R[numb].each(function(n){
					$(sub).options[$(sub).options.length] = new Option(n.name,n.id);  
				});
			}
		}
	}
	
	function fncDisplayDefaultList(timeid,day,month,year){
		fncGetNextCalendar(timeid);
		day_temp 	= day;
		month_temp 	= month;
		year_temp 	= year;
		//setTimeout("fncShowEventList("+day+","+month+","+year+")",700);
		
	}
	
	function fncGetNextCalendar(timeid){
		
		var url   		= base_url + "schedule/show_next_calendar/";
		var region 		= $('sltSearchRegion').value ;
		var subregion 	= $('sltSearchSubregion').value ;
		
		var params 	= "timeid="+timeid+"&region="+region+"&subregion="+subregion;
	  
		new Ajax.Request(url,{
		                       method      : "post",
		                       parameters  : params,
		                       onSuccess   : fncSuccess,
		                       onFailure   : fncError
		                     }
		                );
	
		 $('divUserCalendar').innerHTML = '<div style="width:300px;"><center><img src="'+base_url+'images/spinner.gif"/></center></div>';
		 
	    function fncSuccess(resp_obj)
	    {
	        $('divUserCalendar').innerHTML = resp_obj.responseText;
	        if(parseFloat($('hdnTimeline').value) == parseFloat(timeid)){
	        	fncShowEventList(day_temp,month_temp,year_temp);
	        }
	        
	    }	
	    function fncError() {
			alert("Ajax request failed");
		}
	}
	
	function fncShowEventList(day,month,year){
		current_date 	= month+'/'+day+'/'+year; 
		var url 		= base_url+'index.php/schedule/display_list';
		var region 		= $('sltSearchRegion').value;
		var subregion 	= $('sltSearchSubregion').value;
		var params 		= "datecurrent="+current_date+"&region_id="+region+"&subregion_id="+subregion;
		
		fncSetSelection(day);
		
		$('divDisplayEventList').style.display 	= 'block';
		$('divDisplayEventList').innerHTML 		= 'Please wait ...<img src="'+base_url+'images/spinner.gif">';
		
		new Ajax.Request(url,
	            { 
	                method		:"post",
	                parameters  : params,
	                onSuccess	: fncDisplayList
	            }
		);
		
	}
	//function used to change the selected dates color
	function fncSetSelection(day){
		var arrayElem      = $('tblCalendarId').getElementsByTagName('td');								
		for (var i in arrayElem)
		{
			if (arrayElem[i].id)
			{ 
				if(i<arrayElem.length)
				{
					if (arrayElem[i].id != day)
					{
						$(arrayElem[i].id).removeClassName('selectedDay');
					}
					else if (arrayElem[i].id == day)
					{ 
						$(arrayElem[i].id).addClassName('selectedDay');
					}
				}
			}
		}
	}
	function fncDisplayList(obj){
		$('divDisplayEventList').innerHTML = obj.responseText;
		$('divDisplayEventList').scrollTo();
	}
