var Prototype = { Version: '1.5.1.1', emptyFunction: function() { }};
var Class = {create: function() {return function() { this.initialize.apply(this, arguments); };}};
Object.extend = function(destination, source) {for (var property in source) destination[property] = source[property];return destination;};
Function.prototype.bind = function(object) {var __method = this;return function() {return __method.apply(object, arguments);};};
if (!Array.prototype.forEach) {Array.prototype.forEach = function(fn, bind){for(var i = 0; i < this.length ; i++)fn.call(bind, this[i], i);};};
Array.prototype.each = Array.prototype.forEach;
String.prototype.camelize = function(){return this.replace(/-\D/gi, function(match){return match.charAt(match.length - 1).toUpperCase();});};
var $A = function(iterable) {var nArray = [];for (var i = 0; i < iterable.length; i++)nArray.push(iterable[i]);return nArray;};
function $() {if (arguments.length == 1) return get$(arguments[0]);var elements = [];$c(arguments).each(function(el){elements.push(get$(el));});return elements;function get$(el){if (typeof el == 'string') el = document.getElementById(el);return el;};};
if (!window.Element) var Element = {};
Object.extend(Element, {
remove: function(element) {
element = $(element);
element.parentNode.removeChild(element);
},
hasClassName: function(element, className) {
element = $(element);
return !!element.className.match(new RegExp("\\b"+className+"\\b"));
},
addClassName: function(element, className) {
element = $(element);
if (!Element.hasClassName(element, className)) element.className = (element.className+' '+className);
},
include: function(pattern) {
return this.indexOf(pattern) > -1;
},
removeClassName: function(element, className) {
element = $(element);
if (Element.hasClassName(element, className)) element.className = element.className.replace(className, '');
}
});
document.getElementsByClassName = function(className){
var elements = [];
var all = document.getElementsByTagName('*');
$A(all).each(function(el){
if (Element.hasClassName(el, className))
elements.push(el);
});
return elements;
};
var Ajax = {
getTransport: function() {
return Try.these(
function() {return new XMLHttpRequest();},
function() {return new ActiveXObject('Msxml2.XMLHTTP');},
function() {return new ActiveXObject('Microsoft.XMLHTTP');}
) || false;
},
activeRequestCount: 0
}
Ajax.Responders = {
responders: [],
_each: function(iterator) {
this.responders._each(iterator);
},
register: function(responder) {
if (!this.include(responder))
this.responders.push(responder);
},
unregister: function(responder) {
this.responders = this.responders.without(responder);
},
dispatch: function(callback, request, transport, json) {
this.each(function(responder) {
if (typeof responder[callback] == 'function') {
try {
responder[callback].apply(responder, [request, transport, json]);
} catch (e) {}
}
});
}
};
var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead');
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0, length = this.length; i < length; i++)
iterator(this[i]);
},
clone: function() {
return [].concat(this);
}
});
var Try = {
these: function() {
var returnValue;
for (var i = 0, length = arguments.length; i < length; i++) {
var lambda = arguments[i];
try {
returnValue = lambda();
break;
} catch (e) {}
}
return returnValue;
}
};
var Enumerable = {
each: function(iterator) {
var index = 0;
try {
this._each(function(value) {
iterator(value, index++);
});
} catch (e) {
if (e != $break)
throw e;
 }
return this;
},
include: function(object) {
var found = false;
this.each(function(value) {
if (value == object) {
found = true;
throw $break;
}
});
return found;
}
}
Object.extend(Ajax.Responders, Enumerable);
Ajax.Responders.register({
onCreate: function() {
Ajax.activeRequestCount++;
},
onComplete: function() {
Ajax.activeRequestCount--;
}
});
Ajax.Base = function() {};
Ajax.Base.prototype = {
setOptions: function(options) {
this.options = {
method: 'post',
asynchronous: true,
contentType: 'application/x-www-form-urlencoded',
encoding: 'UTF-8',
parameters: ''
};
Object.extend(this.options, options || {});
this.options.method = this.options.method.toLowerCase();
if (typeof this.options.parameters == 'string')
this.options.parameters = this.options.parameters.toQueryParams();
}
}
Ajax.Request = Class.create();
Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
Object.extend(Object, {
clone: function(object) {
return Object.extend({}, object);
}
});
Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
_complete: false,
initialize: function(url, options) {
this.transport = Ajax.getTransport();
this.setOptions(options);
this.request(url);
},
evalJSON: function() {
try {
var json = this.getHeader('X-JSON');
return json ? json.evalJSON() : null;
} catch (e) { return null }
},
request: function(url) {
this.url = url;
this.method = this.options.method;
var params = Object.clone(this.options.parameters);
this.parameters = params;
if (params = Hash.toQueryString(params)) {
if (this.method == 'get')
this.url += (this.url.include('?') ? '&' : '?') + params;
else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
params += '&_=';
}
try {
if (this.options.onCreate)
this.options.onCreate(this.transport);
Ajax.Responders.dispatch('onCreate', this, this.transport);
this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous);
if(this.options.asynchronous)
setTimeout(function() { this.respondToReadyState(1); }.bind(this), 10);
this.transport.onreadystatechange = this.onStateChange.bind(this);
this.setRequestHeaders();
this.body = this.method == 'post' ? (this.options.postBody || params) : null;
this.transport.send(this.body);
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 : '');
if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
headers['Connection'] = 'close';
}
if(typeof this.options.requestHeaders == 'object') {
var extras = this.options.requestHeaders;
if(typeof extras.push == 'function')
for(var i = 0, length = extras.length; i < length; i += 2)
headers[extras[i]] = extras[i+1];
else
$H(extras).each(function(pair) { headers[pair.key] = pair.value });
}
for(var name in headers)
this.transport.setRequestHeader(name, headers[name]);
},
success: function() {
return !this.transport.status || (this.transport.status >= 200 && this.transport.status < 300);
},
respondToReadyState: function(readyState) {
var state = Ajax.Request.Events[readyState];
var transport = this.transport, json = this.evalJSON();
if (state == 'Complete') {
try {
this._complete = true;
 (this.options['on' + this.transport.status] || this.options['on' + (this.success() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json);
} catch (e) {
this.dispatchException(e);
}
var contentType = this.getHeader('Content-type');
if(contentType && contentType.strip().match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
this.evalResponse();
}
try {
(this.options['on' + state] || Prototype.emptyFunction)(transport, json);
Ajax.Responders.dispatch('on' + state, this, transport, json);
} catch (e) {
this.dispatchException(e);
}
if (state == 'Complete') {
this.transport.onreadystatechange = Prototype.emptyFunction;
}
},
getHeader: function(name) {
try {
return this.transport.getResponseHeader(name);
} 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);
}
});
Object.extend(String.prototype, {
include: function(pattern) {
return this.indexOf(pattern) > -1;
},
strip: function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
});
var Hash = function(object) {
if(object instanceof Hash)
this.merge(object);
 else
 Object.extend(this, object || {});
};
Object.extend(Hash, {
toQueryString: function(obj) {
var parts = [];
parts.add = arguments.callee.addPair;
this.prototype._each.call(obj, function(pair) {
if (!pair.key) return;
var value = pair.value;
if (value && typeof value == 'object') {
if (value.constructor == Array)
value.each(function(value) { parts.add(pair.key, value); });
return;
}
parts.add(pair.key, value);
});
return parts.join('&');
}
});

Object.extend(Hash.prototype, {
_each: function(iterator) {
for (var key in this) {
var value = this[key];
if(value && value == Hash.prototype[key])
continue;
var pair = [key, value];
pair.key = key;
pair.value = value;
iterator(pair);
}
}
});
Hash.toQueryString.addPair = function(key, value, prefix) {
key = encodeURIComponent(key);
if (value === undefined)
this.push(key);
else
this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
};

Xerces = Class.create();
Xerces.prototype = {
initialize: function() {
},
Create: function(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
},
Read: function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
},
Erase: function(name) {
this.Create(name,"",-1);
},
Find: function(name) {
var nameEQ = name + "=";
var xer = this.Read('xerces');
if(xer) {
var ca = xer.split('|');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
}
return null;
},
Edit: function(name, val) {
var nameEQ = name + '=';
var x = this.Read('xerces');
var s = '';
if(x) {
var ca = x.split('|');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) {
var v = nameEQ+val+'|';
s += v;
} else {
s += c;
s += '|';
}
}
}
this.Create('xerces', s, 1);
}
};