﻿function $e(element){if(arguments.length>1){for(var i=0,elements=[],c=arguments.length;i<c;i++)elements.push($e(arguments[i]));return elements;}if(typeof(element)=='string'){element=document.getElementById(element);}return element;}
function $setStyle(a, b){a=$e(a);var c = a.style;for(var d in b){c[d]=b[d];}return a;}
function $remove(a){a=$e(a);a.parentNode.removeChild(a);return a;}
function $show(element){element=$e(element);element.style.display='block';}
function $hide(element){element=$e(element);element.style.display='none';}
function $readAttribute(a, b){a=$e(a);if(typeof(a)=='object' && a.attributes.getNamedItem(b)!=null){return a.attributes.getNamedItem(b).value;}else{return null;}}
function $setAttribute(a, b, c){a=$e(a);a.setAttribute(b, c);}
function $ac(parent, child){child=$e(child);parent=$e(parent);parent.appendChild(child);}
function $ce(a){if(typeof(a)=='string'){var b=document.createElement(a);return b;}else{alert('Argument must be a string')}}
function $l(a){return a.length;}
function $v(a){a=$e(a);return a.value;}
function $et(element, Position){element=$e(element);if(element==null){return 0;}if(element.style && (typeof(element.style.top)=='string')){if(typeof(Position)=='number'){element.style.top=Position+'px';}else{Position=parseInt(element.style.top);}if(isNaN(Position)){Position=0;}}else if(element.style && element.style.pixelTop){if(typeof(Position)=='number'){element.style.pixelTop=Position;}else{Position = element.style.pixelTop;}}return Position;}
function $ew(a, b){a=$e(a);if(a==null){return 0;}if(a.style && (typeof(a.style.left)=='string')){if(typeof(b)=='number'){a.style.width=b+'px';}else{b=parseInt(a.style.width);if(isNaN(b)){b=a.clientWidth;}}}return b;}
function CreateNamespace(ns){var nsParts=ns.split(".");var root=window;for(var iLoop=0;iLoop<nsParts.length;iLoop++){if(typeof root[nsParts[iLoop]]=="undefined"){root[nsParts[iLoop]]=new Object();}root=root[nsParts[iLoop]];}}
function $resetPointer(){document.body.style.cursor='default';} 
function $setPointer(){document.body.style.cursor='hand';}
function $waitPointer(){document.body.style.cursor='Wait';}
function $getWidth(element){return $e(element).getDimensions().width;}
function $getHeight(element){return $e(element).getDimensions().height;}
function  $hasClassName(element, className) {
    if (!(element = $e(element))) return;
    var elementClassName = element.className;
    if (elementClassName.length == 0) return false;
    if (elementClassName == className ||
        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
      return true;
    return false;
  }
  
  function $getStyle(element, style)
  {
    element = $e(element);
    var value = element.style[style];
    if (!value) 
	{
		value = null;
	}

	return (value == 'auto' ? null : value);
  }


  function $getPosition(element) 
  {
	var valueT = 0, valueL = 0;
	
	var element = $e(element);
	if (element.offsetParent) 
	{
		do 
		{
			valueT += element.offsetTop  || 0;
			valueL += element.offsetLeft || 0;

		} while (element = element.offsetParent);
	}
	else
	{
		return [valueL, valueT];
	}
	return [valueL, valueT];
  }

 function $clonePosition(element, source) 
 {
	element = $e(element);

	var left = $getPosition(source)[0];
	var top  = $getPosition(source)[1];
	var position = $getStyle(element, 'position');

	if (position == null)
	{
		position = 'absolute';
	}
	$setStyle(element, { position : position, left : left + 'px', top : top + 'px'});

    return element;
  }

  
  
function $clear(array){array.length = 0;return array;}
  
  function $toColorPart(number) {
    return number.toString(16);
  }


  function $times(number, iterator) {
    $R(0, number, true).each(iterator);
    return number;
  }

  function $toPaddedString(number, length, radix) {
    var string = number.toString(radix || 10);
    return $times('0', length - string.length) + string;
  }

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}


var Prototype = {
  Version: '1.5.1',

  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      (document.createElement('div').__proto__ !==
       document.createElement('form').__proto__)
  },

  ScriptFragment: '<script[^>]*>([\u0001-\uFFFF]*?)</script>',
  JSONFilter: /^\/\*-secure-\s*(.*)\s*\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
}


var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch(type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }
    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (object.ownerDocument === document) return;
    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (value !== undefined)
        results.push(property.toJSON() + ': ' + value);
    }
    return '{' + results.join(', ') + '}';
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({}, object);
  }
});



Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}



if (!window.Event) {
  var Event = new Object();
}

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,

  element: function(event) {
    return $e(event.target || event.srcElement);
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) ||
            ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY +
      (document.documentElement.scrollTop || document.body.scrollTop));
  },

  stop: function(event) {
    if (event != null)
    {
        if (event.preventDefault) {
          event.preventDefault();
          event.stopPropagation();
        } else {
          event.returnValue = false;
          event.cancelBubble = true;
        }
    }
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  },

  observers: false,

  _observeAndCache: function(element, name, observer, useCapture) {
    if (!this.observers) this.observers = [];
    if (element.addEventListener) {
      this.observers.push([element, name, observer, useCapture]);
      element.addEventListener(name, observer, useCapture);
    } else if (element.attachEvent) {
      this.observers.push([element, name, observer, useCapture]);
      element.attachEvent('on' + name, observer);
    }
  },

  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0, length = Event.observers.length; i < length; i++) {
      Event.stopObserving.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    element = $e(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
      (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    Event._observeAndCache(element, name, observer, useCapture);
  },

  stopObserving: function(element, name, observer, useCapture) {
    element = $e(element);
    useCapture = useCapture || false;

    if (name == 'keypress' &&
        (Prototype.Browser.WebKit || element.attachEvent))
      name = 'keydown';

    if (element.removeEventListener) {
      element.removeEventListener(name, observer, useCapture);
    } else if (element.detachEvent) {
      try {
        element.detachEvent('on' + name, observer);
      } catch (e) {}
    }
  }
});


if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $e(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(query.snapshotItem(i));
    return results;
  };

  document.getElementsByClassName = function(className, parentElement) {
    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
    return document._getElementsByXPath(q, parentElement);
  }

} else document.getElementsByClassName = function(className, parentElement) {
  var children = ($e(parentElement) || document.body).getElementsByTagName('*');
  var elements = [], child;
  for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
    if ($hasClassName(child, className))
      elements.push(child);
  }
  return elements;
};

    function DateAdd(objDate, strInterval, intIncrement)
    {
        if(typeof(objDate) == "string")
        {
            objDate = new Date(objDate);

            if (isNaN(objDate))
            {
                throw("DateAdd: Date is not a valid date");
            }
        }
        else if(typeof(objDate) != "object" || objDate.constructor.toString().indexOf("Date()") == -1)
        {
            throw("DateAdd: First parameter must be a date object");
        }
        
        if(
        strInterval != "M" 
        && strInterval != "D" 
        && strInterval != "Y" 
        && strInterval != "h" 
        && strInterval != "m"
        && strInterval != "uM"
        && strInterval != "uD"
        && strInterval != "uY"
        && strInterval != "uh"
        && strInterval != "um"
        && strInterval != "us"
        )
        {
            throw("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
        }
        
        if(typeof(intIncrement) != "number")
        {
            throw("DateAdd: Third parameter must be a number");
        }
        
        switch(strInterval)
        {
            case "M":
            objDate.setMonth(parseInt(objDate.getMonth()) + parseInt(intIncrement));
            break;
        
            case "D":
            objDate.setDate(parseInt(objDate.getDate()) + parseInt(intIncrement));
            break;
            
            case "Y":
            objDate.setYear(parseInt(objDate.getYear()) + parseInt(intIncrement));
            break;
            
            case "h":
            objDate.setHours(parseInt(objDate.getHours()) + parseInt(intIncrement));
            break;
            
            case "m":
            objDate.setMinutes(parseInt(objDate.getMinutes()) + parseInt(intIncrement));
            break;
            
            case "s":
            objDate.setSeconds(parseInt(objDate.getSeconds()) + parseInt(intIncrement));
            break;
            
            case "uM":
            objDate.setUTCMonth(parseInt(objDate.getUTCMonth()) + parseInt(intIncrement));
            break;
            
            case "uD":
            objDate.setUTCDate(parseInt(objDate.getUTCDate()) + parseInt(intIncrement));
            break;
            
            case "uY":
            objDate.setUTCFullYear(parseInt(objDate.getUTCFullYear()) + parseInt(intIncrement));
            break;
            
            case "uh":
            objDate.setUTCHours(parseInt(objDate.getUTCHours()) + parseInt(intIncrement));
            break;
            
            case "um":
            objDate.setUTCMinutes(parseInt(objDate.getUTCMinutes()) + parseInt(intIncrement));
            break;
            
            case "us":
            objDate.setUTCSeconds(parseInt(objDate.getUTCSeconds()) + parseInt(intIncrement));
            break;
        }
        return objDate;
    }


      //Number functions
      Number.prototype.isOdd = function() 
      {
        return !(this % 2 == 0);
      }
      
      Number.prototype.isEven = function()
      {
        return (this % 2 == 0);
      }
      
      
      