/*  Prototype JavaScript framework, version 1.5.0
*  (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://prototype.conio.net/
*
/*--------------------------------------------------------------------------*/
var Prototype = {
Version: '1.5.0',
BrowserFeatures: {
XPath: !!document.evaluate
},
ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
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;
}
},
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).concat($A(arguments)));
}
}
Object.extend(Number.prototype, {
toColorPart: function() {
var digits = this.toString(16);
if (this < 16) return '0' + digits;
return digits;
},
succ: function() {
return this + 1;
},
times: function(iterator) {
$R(0, this, true).each(iterator);
return 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 PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
stop: function() {
if (!this.timer) return;
clearInterval(this.timer);
this.timer = null;
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.callback(this);
} finally {
this.currentlyExecuting = false;
}
}
}
}
String.interpret = function(value){
return value == null ? '' : String(value);
}
Object.extend(String.prototype, {
gsub: function(pattern, replacement) {
var result = '', source = this, match;
replacement = arguments.callee.prepareReplacement(replacement);
while (source.length > 0) {
if (match = source.match(pattern)) {
result += source.slice(0, match.index);
result += String.interpret(replacement(match));
source  = source.slice(match.index + match[0].length);
} else {
result += source, source = '';
}
}
return result;
},
sub: function(pattern, replacement, count) {
replacement = this.gsub.prepareReplacement(replacement);
count = count === undefined ? 1 : count;
return this.gsub(pattern, function(match) {
if (--count < 0) return match[0];
return replacement(match);
});
},
scan: function(pattern, iterator) {
this.gsub(pattern, iterator);
return this;
},
truncate: function(length, truncation) {
length = length || 30;
truncation = truncation === undefined ? '...' : truncation;
return this.length > length ?
this.slice(0, length - truncation.length) + truncation : this;
},
strip: function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
},
stripTags: function() {
return this.replace(/<\/?[^>]+>/gi, '');
},
stripScripts: function() {
return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
},
extractScripts: function() {
var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
return (this.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
},
evalScripts: function() {
return this.extractScripts().map(function(script) { return eval(script) });
},
escapeHTML: function() {
var div = document.createElement('div');
var text = document.createTextNode(this);
div.appendChild(text);
return div.innerHTML;
},
unescapeHTML: function() {
var div = document.createElement('div');
div.innerHTML = this.stripTags();
return div.childNodes[0] ? (div.childNodes.length > 1 ?
$A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
div.childNodes[0].nodeValue) : '';
},
toQueryParams: function(separator) {
var match = this.strip().match(/([^?#]*)(#.*)?$/);
if (!match) return {};
return match[1].split(separator || '&').inject({}, function(hash, pair) {
if ((pair = pair.split('='))[0]) {
var name = decodeURIComponent(pair[0]);
var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
if (hash[name] !== undefined) {
if (hash[name].constructor != Array)
hash[name] = [hash[name]];
if (value) hash[name].push(value);
}
else hash[name] = 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);
},
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.replace(/\\/g, '\\\\');
if (useDoubleQuotes)
return '"' + escapedString.replace(/"/g, '\\"') + '"';
else
return "'" + escapedString.replace(/'/g, '\\\'') + "'";
}
});
String.prototype.gsub.prepareReplacement = function(replacement) {
if (typeof replacement == 'function') return replacement;
var template = new Template(replacement);
return function(match) { return template.evaluate(match) };
}
String.prototype.parseQuery = String.prototype.toQueryParams;
var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
initialize: function(template, pattern) {
this.template = template.toString();
this.pattern  = pattern || Template.Pattern;
},
evaluate: function(object) {
return this.template.gsub(this.pattern, function(match) {
var before = match[1];
if (before == '\\') return match[2];
return before + String.interpret(object[match[3]]);
});
}
}
var $break    = new Object();
var $continue = new Object();
var Enumerable = {
each: function(iterator) {
var index = 0;
try {
this._each(function(value) {
try {
iterator(value, index++);
} catch (e) {
if (e != $continue) throw e;
}
});
} catch (e) {
if (e != $break) throw e;
}
return this;
},
eachSlice: function(number, iterator) {
var index = -number, slices = [], array = this.toArray();
while ((index += number) < array.length)
slices.push(array.slice(index, index+number));
return slices.map(iterator);
},
all: function(iterator) {
var result = true;
this.each(function(value, index) {
result = result && !!(iterator || Prototype.K)(value, index);
if (!result) throw $break;
});
return result;
},
any: function(iterator) {
var result = false;
this.each(function(value, index) {
if (result = !!(iterator || Prototype.K)(value, index))
throw $break;
});
return result;
},
collect: function(iterator) {
var results = [];
this.each(function(value, index) {
results.push((iterator || Prototype.K)(value, index));
});
return results;
},
detect: function(iterator) {
var result;
this.each(function(value, index) {
if (iterator(value, index)) {
result = value;
throw $break;
}
});
return result;
},
findAll: function(iterator) {
var results = [];
this.each(function(value, index) {
if (iterator(value, index))
results.push(value);
});
return results;
},
grep: function(pattern, iterator) {
var results = [];
this.each(function(value, index) {
var stringValue = value.toString();
if (stringValue.match(pattern))
results.push((iterator || Prototype.K)(value, index));
})
return results;
},
include: function(object) {
var found = false;
this.each(function(value) {
if (value == object) {
found = true;
throw $break;
}
});
return found;
},
inGroupsOf: function(number, fillWith) {
fillWith = fillWith === undefined ? null : fillWith;
return this.eachSlice(number, function(slice) {
while(slice.length < number) slice.push(fillWith);
return slice;
});
},
inject: function(memo, iterator) {
this.each(function(value, index) {
memo = iterator(memo, value, index);
});
return memo;
},
invoke: function(method) {
var args = $A(arguments).slice(1);
return this.map(function(value) {
return value[method].apply(value, args);
});
},
max: function(iterator) {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
if (result == undefined || value >= result)
result = value;
});
return result;
},
min: function(iterator) {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
if (result == undefined || value < result)
result = value;
});
return result;
},
partition: function(iterator) {
var trues = [], falses = [];
this.each(function(value, index) {
((iterator || Prototype.K)(value, index) ?
trues : falses).push(value);
});
return [trues, falses];
},
pluck: function(property) {
var results = [];
this.each(function(value, index) {
results.push(value[property]);
});
return results;
},
reject: function(iterator) {
var results = [];
this.each(function(value, index) {
if (!iterator(value, index))
results.push(value);
});
return results;
},
sortBy: function(iterator) {
return this.map(function(value, index) {
return {value: value, criteria: iterator(value, index)};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}).pluck('value');
},
toArray: function() {
return this.map();
},
zip: function() {
var iterator = Prototype.K, args = $A(arguments);
if (typeof args.last() == 'function')
iterator = args.pop();
var collections = [this].concat(args).map($A);
return this.map(function(value, index) {
return iterator(collections.pluck(index));
});
},
size: function() {
return this.toArray().length;
},
inspect: function() {
return '#<Enumerable:' + this.toArray().inspect() + '>';
}
}
Object.extend(Enumerable, {
map:     Enumerable.collect,
find:    Enumerable.detect,
select:  Enumerable.findAll,
member:  Enumerable.include,
entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) {
return iterable.toArray();
} else {
var results = [];
for (var i = 0, length = iterable.length; i < length; i++)
results.push(iterable[i]);
return results;
}
}
Object.extend(Array.prototype, Enumerable);
if (!Array.prototype._reverse)
Array.prototype._reverse = Array.prototype.reverse;
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0, length = this.length; i < length; i++)
iterator(this[i]);
},
clear: function() {
this.length = 0;
return this;
},
first: function() {
return this[0];
},
last: function() {
return this[this.length - 1];
},
compact: function() {
return this.select(function(value) {
return value != null;
});
},
flatten: function() {
return this.inject([], function(array, value) {
return array.concat(value && value.constructor == Array ?
value.flatten() : [value]);
});
},
without: function() {
var values = $A(arguments);
return this.select(function(value) {
return !values.include(value);
});
},
indexOf: function(object) {
for (var i = 0, length = this.length; i < length; i++)
if (this[i] == object) return i;
return -1;
},
reverse: function(inline) {
return (inline !== false ? this : this.toArray())._reverse();
},
reduce: function() {
return this.length > 1 ? this : this[0];
},
uniq: function() {
return this.inject([], function(array, value) {
return array.include(value) ? array : array.concat([value]);
});
},
clone: function() {
return [].concat(this);
},
size: function() {
return this.length;
},
inspect: function() {
return '[' + this.map(Object.inspect).join(', ') + ']';
}
});
Array.prototype.toArray = Array.prototype.clone;
function $w(string){
string = string.strip();
return string ? string.split(/\s+/) : [];
}
if(window.opera){
Array.prototype.concat = function(){
var array = [];
for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
for(var i = 0, length = arguments.length; i < length; i++) {
if(arguments[i].constructor == Array) {
for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
array.push(arguments[i][j]);
} else {
array.push(arguments[i]);
}
}
return array;
}
}
var Hash = function(obj) {
Object.extend(this, obj || {});
};
Object.extend(Hash, {
toQueryString: function(obj) {
var parts = [];
this.prototype._each.call(obj, function(pair) {
if (!pair.key) return;
if (pair.value && pair.value.constructor == Array) {
var values = pair.value.compact();
if (values.length < 2) pair.value = values.reduce();
else {
key = encodeURIComponent(pair.key);
values.each(function(value) {
value = value != undefined ? encodeURIComponent(value) : '';
parts.push(key + '=' + encodeURIComponent(value));
});
return;
}
}
if (pair.value == undefined) pair[1] = '';
parts.push(pair.map(encodeURIComponent).join('='));
});
return parts.join('&');
}
});
Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
_each: function(iterator) {
for (var key in this) {
var value = this[key];
if (value && value == Hash.prototype[key]) continue;
var pair = [key, value];
pair.key = key;
pair.value = value;
iterator(pair);
}
},
keys: function() {
return this.pluck('key');
},
values: function() {
return this.pluck('value');
},
merge: function(hash) {
return $H(hash).inject(this, function(mergedHash, pair) {
mergedHash[pair.key] = pair.value;
return mergedHash;
});
},
remove: function() {
var result;
for(var i = 0, length = arguments.length; i < length; i++) {
var value = this[arguments[i]];
if (value !== undefined){
if (result === undefined) result = value;
else {
if (result.constructor != Array) result = [result];
result.push(value)
}
}
delete this[arguments[i]];
}
return result;
},
toQueryString: function() {
return Hash.toQueryString(this);
},
inspect: function() {
return '#<Hash:{' + this.map(function(pair) {
return pair.map(Object.inspect).join(': ');
}).join(', ') + '}>';
}
});
function $H(object) {
if (object && object.constructor == Hash) return object;
return new Hash(object);
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
initialize: function(start, end, exclusive) {
this.start = start;
this.end = end;
this.exclusive = exclusive;
},
_each: function(iterator) {
var value = this.start;
while (this.include(value)) {
iterator(value);
value = value.succ();
}
},
include: function(value) {
if (value < this.start)
return false;
if (this.exclusive)
return value < this.end;
return value <= this.end;
}
});
var $R = function(start, end, exclusive) {
return new ObjectRange(start, end, exclusive);
}
var Ajax = {
getTransport: function() {
return Try.these(
function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false;
},
activeRequestCount: 0
}
Ajax.Responders = {
responders: [],
_each: function(iterator) {
this.responders._each(iterator);
},
register: function(responder) {
if (!this.include(responder))
this.responders.push(responder);
},
unregister: function(responder) {
this.responders = this.responders.without(responder);
},
dispatch: function(callback, request, transport, json) {
this.each(function(responder) {
if (typeof responder[callback] == 'function') {
try {
responder[callback].apply(responder, [request, transport, json]);
} catch (e) {}
}
});
}
};
Object.extend(Ajax.Responders, Enumerable);
Ajax.Responders.register({
onCreate: function() {
Ajax.activeRequestCount++;
},
onComplete: function() {
Ajax.activeRequestCount--;
}
});
Ajax.Base = function() {};
Ajax.Base.prototype = {
setOptions: function(options) {
this.options = {
method:       'post',
asynchronous: true,
contentType:  'application/x-www-form-urlencoded',
encoding:     'UTF-8',
parameters:   ''
}
Object.extend(this.options, options || {});
this.options.method = this.options.method.toLowerCase();
if (typeof this.options.parameters == 'string')
this.options.parameters = this.options.parameters.toQueryParams();
}
}
Ajax.Request = Class.create();
Ajax.Request.Events =
['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
_complete: false,
initialize: function(url, options) {
this.transport = Ajax.getTransport();
this.setOptions(options);
this.request(url);
},
request: function(url) {
this.url = url;
this.method = this.options.method;
var params = this.options.parameters;
if (!['get', 'post'].include(this.method)) {
params['_method'] = this.method;
this.method = 'post';
}
params = Hash.toQueryString(params);
if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
if (this.method == 'get' && params)
this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
try {
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();
var body = this.method == 'post' ? (this.options.postBody || params) : null;
this.transport.send(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';
}
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);
}
if ((this.getHeader('Content-type') || 'text/javascript').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 }
},
evalJSON: function() {
try {
var json = this.getHeader('X-JSON');
return json ? eval('(' + json + ')') : null;
} catch (e) { return null }
},
evalResponse: function() {
try {
return eval(this.transport.responseText);
} catch (e) {
this.dispatchException(e);
}
},
dispatchException: function(exception) {
(this.options.onException || Prototype.emptyFunction)(this, exception);
Ajax.Responders.dispatch('onException', this, exception);
}
});
Ajax.Updater = Class.create();
Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
initialize: function(container, url, options) {
this.container = {
success: (container.success || container),
failure: (container.failure || (container.success ? null : container))
}
this.transport = Ajax.getTransport();
this.setOptions(options);
var onComplete = this.options.onComplete || Prototype.emptyFunction;
this.options.onComplete = (function(transport, param) {
this.updateContent();
onComplete(transport, param);
}).bind(this);
this.request(url);
},
updateContent: function() {
var receiver = this.container[this.success() ? 'success' : 'failure'];
var response = this.transport.responseText;
if (!this.options.evalScripts) response = response.stripScripts();
if (receiver = $(receiver)) {
if (this.options.insertion)
new this.options.insertion(receiver, response);
else
receiver.update(response);
}
if (this.success()) {
if (this.onComplete)
setTimeout(this.onComplete.bind(this), 10);
}
}
});
Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
initialize: function(container, url, options) {
this.setOptions(options);
this.onComplete = this.options.onComplete;
this.frequency = (this.options.frequency || 2);
this.decay = (this.options.decay || 1);
this.updater = {};
this.container = container;
this.url = url;
this.start();
},
start: function() {
this.options.onComplete = this.updateComplete.bind(this);
this.onTimerEvent();
},
stop: function() {
this.updater.options.onComplete = undefined;
clearTimeout(this.timer);
(this.onComplete || Prototype.emptyFunction).apply(this, arguments);
},
updateComplete: function(request) {
if (this.options.decay) {
this.decay = (request.responseText == this.lastText ?
this.decay * this.options.decay : 1);
this.lastText = request.responseText;
}
this.timer = setTimeout(this.onTimerEvent.bind(this),
this.decay * this.frequency * 1000);
},
onTimerEvent: function() {
this.updater = new Ajax.Updater(this.container, this.url, this.options);
}
});
function $(element) {
if (arguments.length > 1) {
for (var i = 0, elements = [], length = arguments.length; i < length; i++)
elements.push($(arguments[i]));
return elements;
}
if (typeof element == 'string')
element = document.getElementById(element);
return Element.extend(element);
}
if (Prototype.BrowserFeatures.XPath) {
document._getElementsByXPath = function(expression, parentElement) {
var results = [];
var query = document.evaluate(expression, $(parentElement) || document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0, length = query.snapshotLength; i < length; i++)
results.push(query.snapshotItem(i));
return results;
};
}
document.getElementsByClassName = function(className, parentElement) {
if (Prototype.BrowserFeatures.XPath) {
var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
return document._getElementsByXPath(q, parentElement);
} else {
var children = ($(parentElement) || document.body).getElementsByTagName('*');
var elements = [], child;
for (var i = 0, length = children.length; i < length; i++) {
child = children[i];
if (Element.hasClassName(child, className))
elements.push(Element.extend(child));
}
return elements;
}
};
/*--------------------------------------------------------------------------*/
if (!window.Element)
var Element = new Object();
Element.extend = function(element) {
if (!element || _nativeExtensions || element.nodeType == 3) return element;
if (!element._extended && element.tagName && element != window) {
var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
if (element.tagName == 'FORM')
Object.extend(methods, Form.Methods);
if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
Object.extend(methods, Form.Element.Methods);
Object.extend(methods, Element.Methods.Simulated);
for (var property in methods) {
var value = methods[property];
if (typeof value == 'function' && !(property in element))
element[property] = cache.findOrStore(value);
}
}
element._extended = true;
return element;
};
Element.extend.cache = {
findOrStore: function(value) {
return this[value] = this[value] || function() {
return value.apply(null, [this].concat($A(arguments)));
}
}
};
Element.Methods = {
visible: function(element) {
return $(element).style.display != 'none';
},
toggle: function(element) {
element = $(element);
Element[Element.visible(element) ? 'hide' : 'show'](element);
return element;
},
hide: function(element) {
$(element).style.display = 'none';
return element;
},
show: function(element) {
$(element).style.display = '';
return element;
},
remove: function(element) {
element = $(element);
element.parentNode.removeChild(element);
return element;
},
update: function(element, html) {
html = typeof html == 'undefined' ? '' : html.toString();
$(element).innerHTML = html.stripScripts();
setTimeout(function() {html.evalScripts()}, 10);
return element;
},
replace: function(element, html) {
element = $(element);
html = typeof html == 'undefined' ? '' : html.toString();
if (element.outerHTML) {
element.outerHTML = html.stripScripts();
} else {
var range = element.ownerDocument.createRange();
range.selectNodeContents(element);
element.parentNode.replaceChild(
range.createContextualFragment(html.stripScripts()), element);
}
setTimeout(function() {html.evalScripts()}, 10);
return element;
},
inspect: function(element) {
element = $(element);
var result = '<' + element.tagName.toLowerCase();
$H({'id': 'id', 'className': 'class'}).each(function(pair) {
var property = pair.first(), attribute = pair.last();
var value = (element[property] || '').toString();
if (value) result += ' ' + attribute + '=' + value.inspect(true);
});
return result + '>';
},
recursivelyCollect: function(element, property) {
element = $(element);
var elements = [];
while (element = element[property])
if (element.nodeType == 1)
elements.push(Element.extend(element));
return elements;
},
ancestors: function(element) {
return $(element).recursivelyCollect('parentNode');
},
descendants: function(element) {
return $A($(element).getElementsByTagName('*'));
},
immediateDescendants: function(element) {
if (!(element = $(element).firstChild)) return [];
while (element && element.nodeType != 1) element = element.nextSibling;
if (element) return [element].concat($(element).nextSiblings());
return [];
},
previousSiblings: function(element) {
return $(element).recursivelyCollect('previousSibling');
},
nextSiblings: function(element) {
return $(element).recursivelyCollect('nextSibling');
},
siblings: function(element) {
element = $(element);
return element.previousSiblings().reverse().concat(element.nextSiblings());
},
match: function(element, selector) {
if (typeof selector == 'string')
selector = new Selector(selector);
return selector.match($(element));
},
up: function(element, expression, index) {
return Selector.findElement($(element).ancestors(), expression, index);
},
down: function(element, expression, index) {
return Selector.findElement($(element).descendants(), expression, index);
},
previous: function(element, expression, index) {
return Selector.findElement($(element).previousSiblings(), expression, index);
},
next: function(element, expression, index) {
return Selector.findElement($(element).nextSiblings(), expression, index);
},
getElementsBySelector: function() {
var args = $A(arguments), element = $(args.shift());
return Selector.findChildElements(element, args);
},
getElementsByClassName: function(element, className) {
return document.getElementsByClassName(className, element);
},
readAttribute: function(element, name) {
element = $(element);
if (document.all && !window.opera) {
var t = Element._attributeTranslations;
if (t.values[name]) return t.values[name](element, name);
if (t.names[name])  name = t.names[name];
var attribute = element.attributes[name];
if(attribute) return attribute.nodeValue;
}
return element.getAttribute(name);
},
getHeight: function(element) {
return $(element).getDimensions().height;
},
getWidth: function(element) {
return $(element).getDimensions().width;
},
classNames: function(element) {
return new Element.ClassNames(element);
},
hasClassName: function(element, className) {
if (!(element = $(element))) return;
var elementClassName = element.className;
if (elementClassName.length == 0) return false;
if (elementClassName == className ||
elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
return true;
return false;
},
addClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element).add(className);
return element;
},
removeClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element).remove(className);
return element;
},
toggleClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
return element;
},
observe: function() {
Event.observe.apply(Event, arguments);
return $A(arguments).first();
},
stopObserving: function() {
Event.stopObserving.apply(Event, arguments);
return $A(arguments).first();
},
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.match(/^\s*$/);
},
descendantOf: function(element, ancestor) {
element = $(element), ancestor = $(ancestor);
while (element = element.parentNode)
if (element == ancestor) return true;
return false;
},
scrollTo: function(element) {
element = $(element);
var pos = Position.cumulativeOffset(element);
window.scrollTo(pos[0], pos[1]);
return element;
},
getStyle: function(element, style) {
element = $(element);
if (['float','cssFloat'].include(style))
style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
style = style.camelize();
var value = element.style[style];
if (!value) {
if (document.defaultView && document.defaultView.getComputedStyle) {
var css = document.defaultView.getComputedStyle(element, null);
value = css ? css[style] : null;
} else if (element.currentStyle) {
value = element.currentStyle[style];
}
}
if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
value = element['offset'+style.capitalize()] + 'px';
if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
if (Element.getStyle(element, 'position') == 'static') value = 'auto';
if(style == 'opacity') {
if(value) return parseFloat(value);
if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
if(value[1]) return parseFloat(value[1]) / 100;
return 1.0;
}
return value == 'auto' ? null : value;
},
setStyle: function(element, style) {
element = $(element);
for (var name in style) {
var value = style[name];
if(name == 'opacity') {
if (value == 1) {
value = (/Gecko/.test(navigator.userAgent) &&
!/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
if(/MSIE/.test(navigator.userAgent) && !window.opera)
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
} else if(value == '') {
if(/MSIE/.test(navigator.userAgent) && !window.opera)
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
} else {
if(value < 0.00001) value = 0;
if(/MSIE/.test(navigator.userAgent) && !window.opera)
element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
'alpha(opacity='+value*100+')';
}
} else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
element.style[name.camelize()] = 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};
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';
if (window.opera) {
element.style.top = 0;
element.style.left = 0;
}
}
return element;
},
undoPositioned: function(element) {
element = $(element);
if (element._madePositioned) {
element._madePositioned = undefined;
element.style.position =
element.style.top =
element.style.left =
element.style.bottom =
element.style.right = '';
}
return element;
},
makeClipping: function(element) {
element = $(element);
if (element._overflow) return element;
element._overflow = element.style.overflow || 'auto';
if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
element.style.overflow = 'hidden';
return element;
},
undoClipping: function(element) {
element = $(element);
if (!element._overflow) return element;
element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
element._overflow = null;
return element;
}
};
Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
Element._attributeTranslations = {};
Element._attributeTranslations.names = {
colspan:   "colSpan",
rowspan:   "rowSpan",
valign:    "vAlign",
datetime:  "dateTime",
accesskey: "accessKey",
tabindex:  "tabIndex",
enctype:   "encType",
maxlength: "maxLength",
readonly:  "readOnly",
longdesc:  "longDesc"
};
Element._attributeTranslations.values = {
_getAttr: function(element, attribute) {
return element.getAttribute(attribute, 2);
},
_flag: function(element, attribute) {
return $(element).hasAttribute(attribute) ? attribute : null;
},
style: function(element) {
return element.style.cssText.toLowerCase();
},
title: function(element) {
var node = element.getAttributeNode('title');
return node.specified ? node.nodeValue : null;
}
};
Object.extend(Element._attributeTranslations.values, {
href: Element._attributeTranslations.values._getAttr,
src:  Element._attributeTranslations.values._getAttr,
disabled: Element._attributeTranslations.values._flag,
checked:  Element._attributeTranslations.values._flag,
readonly: Element._attributeTranslations.values._flag,
multiple: Element._attributeTranslations.values._flag
});
Element.Methods.Simulated = {
hasAttribute: function(element, attribute) {
var t = Element._attributeTranslations;
attribute = t.names[attribute] || attribute;
return $(element).getAttributeNode(attribute).specified;
}
};
if (document.all && !window.opera){
Element.Methods.update = function(element, html) {
element = $(element);
html = typeof html == 'undefined' ? '' : html.toString();
var tagName = element.tagName.toUpperCase();
if (['THEAD','TBODY','TR','TD'].include(tagName)) {
var div = document.createElement('div');
switch (tagName) {
case 'THEAD':
case 'TBODY':
div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
depth = 2;
break;
case 'TR':
div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
depth = 3;
break;
case 'TD':
div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
depth = 4;
}
$A(element.childNodes).each(function(node){
element.removeChild(node)
});
depth.times(function(){ div = div.firstChild });
$A(div.childNodes).each(
function(node){ element.appendChild(node) });
} else {
element.innerHTML = html.stripScripts();
}
setTimeout(function() {html.evalScripts()}, 10);
return element;
}
};
Object.extend(Element, Element.Methods);
var _nativeExtensions = false;
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
var className = 'HTML' + tag + 'Element';
if(window[className]) return;
var klass = window[className] = {};
klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
});
Element.addMethods = function(methods) {
Object.extend(Element.Methods, methods || {});
function copy(methods, destination, onlyIfAbsent) {
onlyIfAbsent = onlyIfAbsent || false;
var cache = Element.extend.cache;
for (var property in methods) {
var value = methods[property];
if (!onlyIfAbsent || !(property in destination))
destination[property] = cache.findOrStore(value);
}
}
if (typeof HTMLElement != 'undefined') {
copy(Element.Methods, HTMLElement.prototype);
copy(Element.Methods.Simulated, HTMLElement.prototype, true);
copy(Form.Methods, HTMLFormElement.prototype);
[HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
copy(Form.Element.Methods, klass.prototype);
});
_nativeExtensions = true;
}
}
var Toggle = new Object();
Toggle.display = Element.toggle;
/*--------------------------------------------------------------------------*/
Abstract.Insertion = function(adjacency) {
this.adjacency = adjacency;
}
Abstract.Insertion.prototype = {
initialize: function(element, content) {
this.element = $(element);
this.content = content.stripScripts();
if (this.adjacency && this.element.insertAdjacentHTML) {
try {
this.element.insertAdjacentHTML(this.adjacency, this.content);
} catch (e) {
var tagName = this.element.tagName.toUpperCase();
if (['TBODY', 'TR'].include(tagName)) {
this.insertContent(this.contentFromAnonymousTable());
} else {
throw e;
}
}
} else {
this.range = this.element.ownerDocument.createRange();
if (this.initializeRange) this.initializeRange();
this.insertContent([this.range.createContextualFragment(this.content)]);
}
setTimeout(function() {content.evalScripts()}, 10);
},
contentFromAnonymousTable: function() {
var div = document.createElement('div');
div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
return $A(div.childNodes[0].childNodes[0].childNodes);
}
}
var Insertion = new Object();
Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
initializeRange: function() {
this.range.setStartBefore(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.parentNode.insertBefore(fragment, this.element);
}).bind(this));
}
});
Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
initializeRange: function() {
this.range.selectNodeContents(this.element);
this.range.collapse(true);
},
insertContent: function(fragments) {
fragments.reverse(false).each((function(fragment) {
this.element.insertBefore(fragment, this.element.firstChild);
}).bind(this));
}
});
Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
initializeRange: function() {
this.range.selectNodeContents(this.element);
this.range.collapse(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.appendChild(fragment);
}).bind(this));
}
});
Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
initializeRange: function() {
this.range.setStartAfter(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.parentNode.insertBefore(fragment,
this.element.nextSibling);
}).bind(this));
}
});
/*--------------------------------------------------------------------------*/
Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
initialize: function(element) {
this.element = $(element);
},
_each: function(iterator) {
this.element.className.split(/\s+/).select(function(name) {
return name.length > 0;
})._each(iterator);
},
set: function(className) {
this.element.className = className;
},
add: function(classNameToAdd) {
if (this.include(classNameToAdd)) return;
this.set($A(this).concat(classNameToAdd).join(' '));
},
remove: function(classNameToRemove) {
if (!this.include(classNameToRemove)) return;
this.set($A(this).without(classNameToRemove).join(' '));
},
toString: function() {
return $A(this).join(' ');
}
};
Object.extend(Element.ClassNames.prototype, Enumerable);
var Selector = Class.create();
Selector.prototype = {
initialize: function(expression) {
this.params = {classNames: []};
this.expression = expression.toString().strip();
this.parseExpression();
this.compileMatcher();
},
parseExpression: function() {
function abort(message) { throw 'Parse error in selector: ' + message; }
if (this.expression == '')  abort('empty expression');
var params = this.params, expr = this.expression, match, modifier, clause, rest;
while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
params.attributes = params.attributes || [];
params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
expr = match[1];
}
if (expr == '*') return this.params.wildcard = true;
while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
modifier = match[1], clause = match[2], rest = match[3];
switch (modifier) {
case '#':       params.id = clause; break;
case '.':       params.classNames.push(clause); break;
case '':
case undefined: params.tagName = clause.toUpperCase(); break;
default:        abort(expr.inspect());
}
expr = rest;
}
if (expr.length > 0) abort(expr.inspect());
},
buildMatchExpression: function() {
var params = this.params, conditions = [], clause;
if (params.wildcard)
conditions.push('true');
if (clause = params.id)
conditions.push('element.readAttribute("id") == ' + clause.inspect());
if (clause = params.tagName)
conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
if ((clause = params.classNames).length > 0)
for (var i = 0, length = clause.length; i < length; i++)
conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
if (clause = params.attributes) {
clause.each(function(attribute) {
var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
var splitValueBy = function(delimiter) {
return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
}
switch (attribute.operator) {
case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
case '|=':      conditions.push(
splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
); break;
case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
case '':
case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
}
});
}
return conditions.join(' && ');
},
compileMatcher: function() {
this.match = new Function('element', 'if (!element.tagName) return false; \
element = $(element); \
return ' + this.buildMatchExpression());
},
findElements: function(scope) {
var element;
if (element = $(this.params.id))
if (this.match(element))
if (!scope || Element.childOf(element, scope))
return [element];
scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
var results = [];
for (var i = 0, length = scope.length; i < length; i++)
if (this.match(element = scope[i]))
results.push(Element.extend(element));
return results;
},
toString: function() {
return this.expression;
}
}
Object.extend(Selector, {
matchElements: function(elements, expression) {
var selector = new Selector(expression);
return elements.select(selector.match.bind(selector)).map(Element.extend);
},
findElement: function(elements, expression, index) {
if (typeof expression == 'number') index = expression, expression = false;
return Selector.matchElements(elements, expression || '*')[index || 0];
},
findChildElements: function(element, expressions) {
return expressions.map(function(expression) {
return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
var selector = new Selector(expr);
return results.inject([], function(elements, result) {
return elements.concat(selector.findElements(result || element));
});
});
}).flatten();
}
});
function $$() {
return Selector.findChildElements(document, $A(arguments));
}
var Form = {
reset: function(form) {
$(form).reset();
return form;
},
serializeElements: function(elements, getHash) {
var data = elements.inject({}, function(result, element) {
if (!element.disabled && element.name) {
var key = element.name, value = $(element).getValue();
if (value != undefined) {
if (result[key]) {
if (result[key].constructor != Array) result[key] = [result[key]];
result[key].push(value);
}
else result[key] = value;
}
}
return result;
});
return getHash ? data : Hash.toQueryString(data);
}
};
Form.Methods = {
serialize: function(form, getHash) {
return Form.serializeElements(Form.getElements(form), getHash);
},
getElements: function(form) {
return $A($(form).getElementsByTagName('*')).inject([],
function(elements, child) {
if (Form.Element.Serializers[child.tagName.toLowerCase()])
elements.push(Element.extend(child));
return elements;
}
);
},
getInputs: function(form, typeName, name) {
form = $(form);
var inputs = form.getElementsByTagName('input');
if (!typeName && !name) return $A(inputs).map(Element.extend);
for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
var input = inputs[i];
if ((typeName && input.type != typeName) || (name && input.name != name))
continue;
matchingInputs.push(Element.extend(input));
}
return matchingInputs;
},
disable: function(form) {
form = $(form);
form.getElements().each(function(element) {
element.blur();
element.disabled = 'true';
});
return form;
},
enable: function(form) {
form = $(form);
form.getElements().each(function(element) {
element.disabled = '';
});
return form;
},
findFirstElement: function(form) {
return $(form).getElements().find(function(element) {
return element.type != 'hidden' && !element.disabled &&
['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
});
},
focusFirstElement: function(form) {
form = $(form);
form.findFirstElement().activate();
return form;
}
}
Object.extend(Form, Form.Methods);
/*--------------------------------------------------------------------------*/
Form.Element = {
focus: function(element) {
$(element).focus();
return element;
},
select: function(element) {
$(element).select();
return element;
}
}
Form.Element.Methods = {
serialize: function(element) {
element = $(element);
if (!element.disabled && element.name) {
var value = element.getValue();
if (value != undefined) {
var pair = {};
pair[element.name] = value;
return Hash.toQueryString(pair);
}
}
return '';
},
getValue: function(element) {
element = $(element);
var method = element.tagName.toLowerCase();
return Form.Element.Serializers[method](element);
},
clear: function(element) {
$(element).value = '';
return element;
},
present: function(element) {
return $(element).value != '';
},
activate: function(element) {
element = $(element);
element.focus();
if (element.select && ( element.tagName.toLowerCase() != 'input' ||
!['button', 'reset', 'submit'].include(element.type) ) )
element.select();
return element;
},
disable: function(element) {
element = $(element);
element.disabled = true;
return element;
},
enable: function(element) {
element = $(element);
element.blur();
element.disabled = false;
return element;
}
}
Object.extend(Form.Element, Form.Element.Methods);
var Field = Form.Element;
var $F = Form.Element.getValue;
/*--------------------------------------------------------------------------*/
Form.Element.Serializers = {
input: function(element) {
switch (element.type.toLowerCase()) {
case 'checkbox':
case 'radio':
return Form.Element.Serializers.inputSelector(element);
default:
return Form.Element.Serializers.textarea(element);
}
},
inputSelector: function(element) {
return element.checked ? element.value : null;
},
textarea: function(element) {
return element.value;
},
select: function(element) {
return this[element.type == 'select-one' ?
'selectOne' : 'selectMany'](element);
},
selectOne: function(element) {
var index = element.selectedIndex;
return index >= 0 ? this.optionValue(element.options[index]) : null;
},
selectMany: function(element) {
var values, length = element.length;
if (!length) return null;
for (var i = 0, values = []; i < length; i++) {
var opt = element.options[i];
if (opt.selected) values.push(this.optionValue(opt));
}
return values;
},
optionValue: function(opt) {
return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
}
}
/*--------------------------------------------------------------------------*/
Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
initialize: function(element, frequency, callback) {
this.frequency = frequency;
this.element   = $(element);
this.callback  = callback;
this.lastValue = this.getValue();
this.registerCallback();
},
registerCallback: function() {
setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
onTimerEvent: function() {
var value = this.getValue();
var changed = ('string' == typeof this.lastValue && 'string' == typeof value
? this.lastValue != value : String(this.lastValue) != String(value));
if (changed) {
this.callback(this.element, value);
this.lastValue = value;
}
}
}
Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
getValue: function() {
return Form.Element.getValue(this.element);
}
});
Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
getValue: function() {
return Form.serialize(this.element);
}
});
/*--------------------------------------------------------------------------*/
Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
initialize: function(element, callback) {
this.element  = $(element);
this.callback = callback;
this.lastValue = this.getValue();
if (this.element.tagName.toLowerCase() == 'form')
this.registerFormCallbacks();
else
this.registerCallback(this.element);
},
onElementEvent: function() {
var value = this.getValue();
if (this.lastValue != value) {
this.callback(this.element, value);
this.lastValue = value;
}
},
registerFormCallbacks: function() {
Form.getElements(this.element).each(this.registerCallback.bind(this));
},
registerCallback: function(element) {
if (element.type) {
switch (element.type.toLowerCase()) {
case 'checkbox':
case 'radio':
Event.observe(element, 'click', this.onElementEvent.bind(this));
break;
default:
Event.observe(element, 'change', this.onElementEvent.bind(this));
break;
}
}
}
}
Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
getValue: function() {
return Form.Element.getValue(this.element);
}
});
Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
getValue: function() {
return Form.serialize(this.element);
}
});
if (!window.Event) {
var Event = new Object();
}
Object.extend(Event, {
KEY_BACKSPACE: 8,
KEY_TAB:       9,
KEY_RETURN:   13,
KEY_ESC:      27,
KEY_LEFT:     37,
KEY_UP:       38,
KEY_RIGHT:    39,
KEY_DOWN:     40,
KEY_DELETE:   46,
KEY_HOME:     36,
KEY_END:      35,
KEY_PAGEUP:   33,
KEY_PAGEDOWN: 34,
element: function(event) {
return event.target || event.srcElement;
},
isLeftClick: function(event) {
return (((event.which) && (event.which == 1)) ||
((event.button) && (event.button == 1)));
},
pointerX: function(event) {
return event.pageX || (event.clientX +
(document.documentElement.scrollLeft || document.body.scrollLeft));
},
pointerY: function(event) {
return event.pageY || (event.clientY +
(document.documentElement.scrollTop || document.body.scrollTop));
},
stop: function(event) {
if (event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
event.returnValue = false;
event.cancelBubble = true;
}
},
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 != null) {
if (element.addEventListener) {
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {
this.observers.push([element, name, observer, useCapture]);
element.attachEvent('on' + name, observer);
}
}
},
unloadCache: function() {
if (!Event.observers) return;
for (var i = 0, length = Event.observers.length; i < length; i++) {
Event.stopObserving.apply(this, Event.observers[i]);
Event.observers[i][0] = null;
}
Event.observers = false;
},
observe: function(element, name, observer, useCapture) {
element = $(element);
useCapture = useCapture || false;
if (name == 'keypress' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.attachEvent))
name = 'keydown';
Event._observeAndCache(element, name, observer, useCapture);
},
stopObserving: function(element, name, observer, useCapture) {
element = $(element);
useCapture = useCapture || false;
if (name == 'keypress' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.detachEvent))
name = 'keydown';
if (element.removeEventListener) {
element.removeEventListener(name, observer, useCapture);
} else if (element.detachEvent) {
try {
element.detachEvent('on' + name, observer);
} catch (e) {}
}
}
});
/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
includeScrollOffsets: false,
prepare: function() {
this.deltaX =  window.pageXOffset
|| document.documentElement.scrollLeft
|| document.body.scrollLeft
|| 0;
this.deltaY =  window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop
|| 0;
},
realOffset: function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.scrollTop  || 0;
valueL += element.scrollLeft || 0;
element = element.parentNode;
} while (element);
return [valueL, valueT];
},
cumulativeOffset: function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop  || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
} while (element);
return [valueL, valueT];
},
positionedOffset: function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop  || 0;
valueL += element.offsetLeft || 0;
element = element.offsetParent;
if (element) {
if(element.tagName=='BODY') break;
var p = Element.getStyle(element, 'position');
if (p == 'relative' || p == 'absolute') break;
}
} while (element);
return [valueL, valueT];
},
offsetParent: function(element) {
if (element.offsetParent) return element.offsetParent;
if (element == document.body) return element;
while ((element = element.parentNode) && element != document.body)
if (Element.getStyle(element, 'position') != 'static')
return element;
return document.body;
},
within: function(element, x, y) {
if (this.includeScrollOffsets)
return this.withinIncludingScrolloffsets(element, x, y);
this.xcomp = x;
this.ycomp = y;
this.offset = this.cumulativeOffset(element);
return (y >= this.offset[1] &&
y <  this.offset[1] + element.offsetHeight &&
x >= this.offset[0] &&
x <  this.offset[0] + element.offsetWidth);
},
withinIncludingScrolloffsets: function(element, x, y) {
var offsetcache = this.realOffset(element);
this.xcomp = x + offsetcache[0] - this.deltaX;
this.ycomp = y + offsetcache[1] - this.deltaY;
this.offset = this.cumulativeOffset(element);
return (this.ycomp >= this.offset[1] &&
this.ycomp <  this.offset[1] + element.offsetHeight &&
this.xcomp >= this.offset[0] &&
this.xcomp <  this.offset[0] + element.offsetWidth);
},
overlap: function(mode, element) {
if (!mode) return 0;
if (mode == 'vertical')
return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
element.offsetHeight;
if (mode == 'horizontal')
return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
element.offsetWidth;
},
page: function(forElement) {
var valueT = 0, valueL = 0;
var element = forElement;
do {
valueT += element.offsetTop  || 0;
valueL += element.offsetLeft || 0;
if (element.offsetParent==document.body)
if (Element.getStyle(element,'position')=='absolute') break;
} while (element = element.offsetParent);
element = forElement;
do {
if (!window.opera || element.tagName=='BODY') {
valueT -= element.scrollTop  || 0;
valueL -= element.scrollLeft || 0;
}
} while (element = element.parentNode);
return [valueL, valueT];
},
clone: function(source, target) {
var options = Object.extend({
setLeft:    true,
setTop:     true,
setWidth:   true,
setHeight:  true,
offsetTop:  0,
offsetLeft: 0
}, arguments[2] || {})
source = $(source);
var p = Position.page(source);
target = $(target);
var delta = [0, 0];
var parent = null;
if (Element.getStyle(target,'position') == 'absolute') {
parent = Position.offsetParent(target);
delta = Position.page(parent);
}
if (parent == document.body) {
delta[0] -= document.body.offsetLeft;
delta[1] -= document.body.offsetTop;
}
if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
if(options.setHeight) target.style.height = source.offsetHeight + 'px';
},
absolutize: function(element) {
element = $(element);
if (element.style.position == 'absolute') return;
Position.prepare();
var offsets = Position.positionedOffset(element);
var top     = offsets[1];
var left    = offsets[0];
var width   = element.clientWidth;
var height  = element.clientHeight;
element._originalLeft   = left - parseFloat(element.style.left  || 0);
element._originalTop    = top  - parseFloat(element.style.top || 0);
element._originalWidth  = element.style.width;
element._originalHeight = element.style.height;
element.style.position = 'absolute';
element.style.top    = top + 'px';
element.style.left   = left + 'px';
element.style.width  = width + 'px';
element.style.height = height + 'px';
},
relativize: function(element) {
element = $(element);
if (element.style.position == 'relative') return;
Position.prepare();
element.style.position = 'relative';
var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
element.style.top    = top + 'px';
element.style.left   = left + 'px';
element.style.height = element._originalHeight;
element.style.width  = element._originalWidth;
}
}
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
Position.cumulativeOffset = function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop  || 0;
valueL += element.offsetLeft || 0;
if (element.offsetParent == document.body)
if (Element.getStyle(element, 'position') == 'absolute') break;
element = element.offsetParent;
} while (element);
return [valueL, valueT];
}
}
Element.addMethods();;
var Builder = {
NODEMAP: {
AREA: 'map',
CAPTION: 'table',
COL: 'table',
COLGROUP: 'table',
LEGEND: 'fieldset',
OPTGROUP: 'select',
OPTION: 'select',
PARAM: 'object',
TBODY: 'table',
TD: 'table',
TFOOT: 'table',
TH: 'table',
THEAD: 'table',
TR: 'table'
},
node: function(elementName) {
elementName = elementName.toUpperCase();
var parentTag = this.NODEMAP[elementName] || 'div';
var parentElement = document.createElement(parentTag);
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
} catch(e) {}
var element = parentElement.firstChild || null;
if(element && (element.tagName != elementName))
element = element.getElementsByTagName(elementName)[0];
if(!element) element = document.createElement(elementName);
if(!element) return;
if(arguments[1])
if(this._isStringOrNumber(arguments[1]) ||
(arguments[1] instanceof Array)) {
this._children(element, arguments[1]);
} else {
var attrs = this._attributes(arguments[1]);
if(attrs.length) {
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
parentElement.innerHTML = "<" +elementName + " " +
attrs + "></" + elementName + ">";
} catch(e) {}
element = parentElement.firstChild || null;
if(!element) {
element = document.createElement(elementName);
for(attr in arguments[1])
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
}
if(element.tagName != elementName)
element = parentElement.getElementsByTagName(elementName)[0];
}
}
if(arguments[2])
this._children(element, arguments[2]);
return element;
},
_text: function(text) {
return document.createTextNode(text);
},
_attributes: function(attributes) {
var attrs = [];
for(attribute in attributes)
attrs.push((attribute=='className' ? 'class' : attribute) +
'="' + attributes[attribute].toString().escapeHTML() + '"');
return attrs.join(" ");
},
_children: function(element, children) {
if(typeof children=='object') { // array can hold nodes and text
children.flatten().each( function(e) {
if(typeof e=='object')
element.appendChild(e)
else
if(Builder._isStringOrNumber(e))
element.appendChild(Builder._text(e));
});
} else
if(Builder._isStringOrNumber(children))
element.appendChild(Builder._text(children));
},
_isStringOrNumber: function(param) {
return(typeof param=='string' || typeof param=='number');
}
};
/* ------------- element ext -------------- */
String.prototype.parseColor = function() {
var color = '#';
if(this.slice(0,4) == 'rgb(') {
var cols = this.slice(4,this.length-1).split(',');
var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
} else {
if(this.slice(0,1) == '#') {
if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
if(this.length==7) color = this.toLowerCase();
}
}
return(color.length==7 ? color : (arguments[0] || this));
}
Element.collectTextNodes = function(element) {
return $A($(element).childNodes).collect( function(node) {
return (node.nodeType==3 ? node.nodeValue :
(node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
}).flatten().join('');
}
Element.collectTextNodesIgnoreClass = function(element, className) {
return $A($(element).childNodes).collect( function(node) {
return (node.nodeType==3 ? node.nodeValue :
((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
Element.collectTextNodesIgnoreClass(node, className) : ''));
}).flatten().join('');
}
Element.setStyle = function(element, style) {
element = $(element);
for(k in style) element.style[k.camelize()] = style[k];
}
Element.setContentZoom = function(element, percent) {
Element.setStyle(element, {fontSize: (percent/100) + 'em'});
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
}
Element.getOpacity = function(element){
var opacity;
if (opacity = Element.getStyle(element, 'opacity'))
return parseFloat(opacity);
if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
if(opacity[1]) return parseFloat(opacity[1]) / 100;
return 1.0;
}
Element.setOpacity = function(element, value){
element= $(element);
if (value == 1){
Element.setStyle(element, { opacity:
(/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
0.999999 : null });
if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
} else {
if(value < 0.00001) value = 0;
Element.setStyle(element, {opacity: value});
if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element,
{ filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
'alpha(opacity='+value*100+')' });
}
}
Element.getInlineOpacity = function(element){
return $(element).style.opacity || '';
}
Element.childrenWithClassName = function(element, className) {
return $A($(element).getElementsByTagName('*')).select(
function(c) { return Element.hasClassName(c, className) });
}
Array.prototype.call = function() {
var args = arguments;
this.each(function(f){ f.apply(this, args) });
}
/*--------------------------------------------------------------------------*/
var Effect = {
tagifyText: function(element) {
var tagifyStyle = 'position:relative';
if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
element = $(element);
$A(element.childNodes).each( function(child) {
if(child.nodeType==3) {
child.nodeValue.toArray().each( function(character) {
element.insertBefore(
Builder.node('span',{style: tagifyStyle},
character == ' ' ? String.fromCharCode(160) : character),
child);
});
Element.remove(child);
}
});
},
multiple: function(element, effect) {
var elements;
if(((typeof element == 'object') ||
(typeof element == 'function')) &&
(element.length))
elements = element;
else
elements = $(element).childNodes;
var options = Object.extend({
speed: 0.1,
delay: 0.0
}, arguments[2] || {});
var masterDelay = options.delay;
$A(elements).each( function(element, index) {
new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
});
},
PAIRS: {
'slide':  ['SlideDown','SlideUp'],
'blind':  ['BlindDown','BlindUp'],
'appear': ['Appear','Fade']
},
toggle: function(element, effect) {
element = $(element);
effect = (effect || 'appear').toLowerCase();
var options = Object.extend({
queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
}, arguments[2] || {});
Effect[Element.visible(element) ?
Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
}
};
var Effect2 = Effect; // deprecated
/* ------------- transitions ------------- */
Effect.Transitions = {}
Effect.Transitions.linear = function(pos) {
return pos;
}
Effect.Transitions.sinoidal = function(pos) {
return (-Math.cos(pos*Math.PI)/2) + 0.5;
}
Effect.Transitions.reverse  = function(pos) {
return 1-pos;
}
Effect.Transitions.flicker = function(pos) {
return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
Effect.Transitions.wobble = function(pos) {
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
Effect.Transitions.pulse = function(pos) {
return (Math.floor(pos*10) % 2 == 0 ?
(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
}
Effect.Transitions.none = function(pos) {
return 0;
}
Effect.Transitions.full = function(pos) {
return 1;
}
/* ------------- core effects ------------- */
Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
initialize: function() {
this.effects  = [];
this.interval = null;
},
_each: function(iterator) {
this.effects._each(iterator);
},
add: function(effect) {
var timestamp = new Date().getTime();
var position = (typeof effect.options.queue == 'string') ?
effect.options.queue : effect.options.queue.position;
switch(position) {
case 'front':
this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
e.startOn  += effect.finishOn;
e.finishOn += effect.finishOn;
});
break;
case 'end':
timestamp = this.effects.pluck('finishOn').max() || timestamp;
break;
}
effect.startOn  += timestamp;
effect.finishOn += timestamp;
if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
this.effects.push(effect);
if(!this.interval)
this.interval = setInterval(this.loop.bind(this), 40);
},
remove: function(effect) {
this.effects = this.effects.reject(function(e) { return e==effect });
if(this.effects.length == 0) {
clearInterval(this.interval);
this.interval = null;
}
},
loop: function() {
var timePos = new Date().getTime();
this.effects.invoke('loop', timePos);
}
});
Effect.Queues = {
instances: $H(),
get: function(queueName) {
if(typeof queueName != 'string') return queueName;
if(!this.instances[queueName])
this.instances[queueName] = new Effect.ScopedQueue();
return this.instances[queueName];
}
}
Effect.Queue = Effect.Queues.get('global');
Effect.DefaultOptions = {
transition: Effect.Transitions.sinoidal,
duration:   1.0,   // seconds
fps:        25.0,  // max. 25fps due to Effect.Queue implementation
sync:       false, // true for combining
from:       0.0,
to:         1.0,
delay:      0.0,
queue:      'parallel'
}
Effect.Base = function() {};
Effect.Base.prototype = {
position: null,
start: function(options) {
this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
this.currentFrame = 0;
this.state        = 'idle';
this.startOn      = this.options.delay*1000;
this.finishOn     = this.startOn + (this.options.duration*1000);
this.event('beforeStart');
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue == 'string' ?
'global' : this.options.queue.scope).add(this);
},
loop: function(timePos) {
if(timePos >= this.startOn) {
if(timePos >= this.finishOn) {
this.render(1.0);
this.cancel();
this.event('beforeFinish');
if(this.finish) this.finish();
this.event('afterFinish');
return;
}
var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
var frame = Math.round(pos * this.options.fps * this.options.duration);
if(frame > this.currentFrame) {
this.render(pos);
this.currentFrame = frame;
}
}
},
render: function(pos) {
if(this.state == 'idle') {
this.state = 'running';
this.event('beforeSetup');
if(this.setup) this.setup();
this.event('afterSetup');
}
if(this.state == 'running') {
if(this.options.transition) pos = this.options.transition(pos);
pos *= (this.options.to-this.options.from);
pos += this.options.from;
this.position = pos;
this.event('beforeUpdate');
if(this.update) this.update(pos);
this.event('afterUpdate');
}
},
cancel: function() {
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue == 'string' ?
'global' : this.options.queue.scope).remove(this);
this.state = 'finished';
},
event: function(eventName) {
if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
if(this.options[eventName]) this.options[eventName](this);
},
inspect: function() {
return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
}
}
Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
initialize: function(effects) {
this.effects = effects || [];
this.start(arguments[1]);
},
update: function(position) {
this.effects.invoke('render', position);
},
finish: function(position) {
this.effects.each( function(effect) {
effect.render(1.0);
effect.cancel();
effect.event('beforeFinish');
if(effect.finish) effect.finish(position);
effect.event('afterFinish');
});
}
});
Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
Element.setStyle(this.element, {zoom: 1});
var options = Object.extend({
from: Element.getOpacity(this.element) || 0.0,
to:   1.0
}, arguments[1] || {});
this.start(options);
},
update: function(position) {
Element.setOpacity(this.element, position);
}
});
Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
var options = Object.extend({
x:    0,
y:    0,
mode: 'relative'
}, arguments[1] || {});
this.start(options);
},
setup: function() {
Element.makePositioned(this.element);
this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0');
if(this.options.mode == 'absolute') {
this.options.x = this.options.x - this.originalLeft;
this.options.y = this.options.y - this.originalTop;
}
},
update: function(position) {
Element.setStyle(this.element, {
left: this.options.x  * position + this.originalLeft + 'px',
top:  this.options.y  * position + this.originalTop  + 'px'
});
}
});
Effect.MoveBy = function(element, toTop, toLeft) {
return new Effect.Move(element,
Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};
Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
initialize: function(element, percent) {
this.element = $(element)
var options = Object.extend({
scaleX: true,
scaleY: true,
scaleContent: true,
scaleFromCenter: false,
scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
scaleFrom: 100.0,
scaleTo:   percent
}, arguments[2] || {});
this.start(options);
},
setup: function() {
this.restoreAfterFinish = this.options.restoreAfterFinish || false;
this.elementPositioning = Element.getStyle(this.element,'position');
this.originalStyle = {};
['top','left','width','height','fontSize'].each( function(k) {
this.originalStyle[k] = this.element.style[k];
}.bind(this));
this.originalTop  = this.element.offsetTop;
this.originalLeft = this.element.offsetLeft;
var fontSize = Element.getStyle(this.element,'font-size') || '100%';
['em','px','%'].each( function(fontSizeType) {
if(fontSize.indexOf(fontSizeType)>0) {
this.fontSize     = parseFloat(fontSize);
this.fontSizeType = fontSizeType;
}
}.bind(this));
this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
this.dims = null;
if(this.options.scaleMode=='box')
this.dims = [this.element.offsetHeight, this.element.offsetWidth];
if(/^content/.test(this.options.scaleMode))
this.dims = [this.element.scrollHeight, this.element.scrollWidth];
if(!this.dims)
this.dims = [this.options.scaleMode.originalHeight,
this.options.scaleMode.originalWidth];
},
update: function(position) {
var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
if(this.options.scaleContent && this.fontSize)
Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
},
finish: function(position) {
if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle);
},
setDimensions: function(height, width) {
var d = {};
if(this.options.scaleX) d.width = width + 'px';
if(this.options.scaleY) d.height = height + 'px';
if(this.options.scaleFromCenter) {
var topd  = (height - this.dims[0])/2;
var leftd = (width  - this.dims[1])/2;
if(this.elementPositioning == 'absolute') {
if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
} else {
if(this.options.scaleY) d.top = -topd + 'px';
if(this.options.scaleX) d.left = -leftd + 'px';
}
}
Element.setStyle(this.element, d);
}
});
Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
this.start(options);
},
setup: function() {
if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; }
this.oldStyle = {
backgroundImage: Element.getStyle(this.element, 'background-image') };
Element.setStyle(this.element, {backgroundImage: 'none'});
if(!this.options.endcolor)
this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff');
if(!this.options.restorecolor)
this.options.restorecolor = Element.getStyle(this.element, 'background-color');
this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
},
update: function(position) {
Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){
return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
},
finish: function() {
Element.setStyle(this.element, Object.extend(this.oldStyle, {
backgroundColor: this.options.restorecolor
}));
}
});
Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
this.start(arguments[1] || {});
},
setup: function() {
Position.prepare();
var offsets = Position.cumulativeOffset(this.element);
if(this.options.offset) offsets[1] += this.options.offset;
var max = window.innerHeight ?
window.height - window.innerHeight :
document.body.scrollHeight -
(document.documentElement.clientHeight ?
document.documentElement.clientHeight : document.body.clientHeight);
this.scrollStart = Position.deltaY;
this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
},
update: function(position) {
Position.prepare();
window.scrollTo(Position.deltaX,
this.scrollStart + (position*this.delta));
}
});
/* ------------- combination effects ------------- */
Effect.Fade = function(element) {
var oldOpacity = Element.getInlineOpacity(element);
var options = Object.extend({
from: Element.getOpacity(element) || 1.0,
to:   0.0,
afterFinishInternal: function(effect) { with(Element) {
if(effect.options.to!=0) return;
hide(effect.element);
setStyle(effect.element, {opacity: oldOpacity}); }}
}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.Appear = function(element) {
var options = Object.extend({
from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
to:   1.0,
beforeSetup: function(effect) { with(Element) {
setOpacity(effect.element, effect.options.from);
show(effect.element); }}
}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.Puff = function(element) {
element = $(element);
var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') };
return new Effect.Parallel(
[ new Effect.Scale(element, 200,
{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
Object.extend({ duration: 1.0,
beforeSetupInternal: function(effect) { with(Element) {
setStyle(effect.effects[0].element, {position: 'absolute'}); }},
afterFinishInternal: function(effect) { with(Element) {
hide(effect.effects[0].element);
setStyle(effect.effects[0].element, oldStyle); }}
}, arguments[1] || {})
);
}
Effect.BlindUp = function(element) {
element = $(element);
Element.makeClipping(element);
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleX: false,
restoreAfterFinish: true,
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping].call(effect.element); }}
}, arguments[1] || {})
);
}
Effect.BlindDown = function(element) {
element = $(element);
var elementDimensions = Element.getDimensions(element);
return new Effect.Scale(element, 100,
Object.extend({ scaleContent: false,
scaleX: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) { with(Element) {
makeClipping(effect.element);
setStyle(effect.element, {height: '0px'});
show(effect.element);
}},
afterFinishInternal: function(effect) {
Element.undoClipping(effect.element);
}
}, arguments[1] || {})
);
}
Effect.SwitchOff = function(element) {
element = $(element);
var oldOpacity = Element.getInlineOpacity(element);
return new Effect.Appear(element, {
duration: 0.4,
from: 0,
transition: Effect.Transitions.flicker,
afterFinishInternal: function(effect) {
new Effect.Scale(effect.element, 1, {
duration: 0.3, scaleFromCenter: true,
scaleX: false, scaleContent: false, restoreAfterFinish: true,
beforeSetup: function(effect) { with(Element) {
[makePositioned,makeClipping].call(effect.element);
}},
afterFinishInternal: function(effect) { with(Element) {
[hide,undoClipping,undoPositioned].call(effect.element);
setStyle(effect.element, {opacity: oldOpacity});
}}
})
}
});
}
Effect.DropOut = function(element) {
element = $(element);
var oldStyle = {
top: Element.getStyle(element, 'top'),
left: Element.getStyle(element, 'left'),
opacity: Element.getInlineOpacity(element) };
return new Effect.Parallel(
[ new Effect.Move(element, {x: 0, y: 100, sync: true }),
new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
Object.extend(
{ duration: 0.5,
beforeSetup: function(effect) { with(Element) {
makePositioned(effect.effects[0].element); }},
afterFinishInternal: function(effect) { with(Element) {
[hide, undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element, oldStyle); }}
}, arguments[1] || {}));
}
Effect.Shake = function(element) {
element = $(element);
var oldStyle = {
top: Element.getStyle(element, 'top'),
left: Element.getStyle(element, 'left') };
return new Effect.Move(element,
{ x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) {
undoPositioned(effect.element);
setStyle(effect.element, oldStyle);
}}}) }}) }}) }}) }}) }});
}
Effect.SlideDown = function(element) {
element = $(element);
Element.cleanWhitespace(element);
var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
var elementDimensions = Element.getDimensions(element);
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
setStyle(effect.element, {height: '0px'});
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
undoClipping(effect.element);
if(/MSIE/.test(navigator.userAgent)){
undoPositioned(effect.element);
undoPositioned(effect.element.firstChild);
}else{
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
}
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
}, arguments[1] || {})
);
}
Effect.SlideUp = function(element) {
element = $(element);
Element.cleanWhitespace(element);
var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleX: false,
scaleMode: 'box',
scaleFrom: 100,
restoreAfterFinish: true,
beforeStartInternal: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping].call(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
}, arguments[1] || {})
);
}
Effect.Squish = function(element) {
return new Effect.Scale(element, window.opera ? 1 : 0,
{ restoreAfterFinish: true,
beforeSetup: function(effect) { with(Element) {
makeClipping(effect.element); }},
afterFinishInternal: function(effect) { with(Element) {
hide(effect.element);
undoClipping(effect.element); }}
});
}
Effect.Grow = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.full
}, arguments[1] || {});
var oldStyle = {
top: element.style.top,
left: element.style.left,
height: element.style.height,
width: element.style.width,
opacity: Element.getInlineOpacity(element) };
var dims = Element.getDimensions(element);
var initialMoveX, initialMoveY;
var moveX, moveY;
switch (options.direction) {
case 'top-left':
initialMoveX = initialMoveY = moveX = moveY = 0;
break;
case 'top-right':
initialMoveX = dims.width;
initialMoveY = moveY = 0;
moveX = -dims.width;
break;
case 'bottom-left':
initialMoveX = moveX = 0;
initialMoveY = dims.height;
moveY = -dims.height;
break;
case 'bottom-right':
initialMoveX = dims.width;
initialMoveY = dims.height;
moveX = -dims.width;
moveY = -dims.height;
break;
case 'center':
initialMoveX = dims.width / 2;
initialMoveY = dims.height / 2;
moveX = -dims.width / 2;
moveY = -dims.height / 2;
break;
}
return new Effect.Move(element, {
x: initialMoveX,
y: initialMoveY,
duration: 0.01,
beforeSetup: function(effect) { with(Element) {
hide(effect.element);
makeClipping(effect.element);
makePositioned(effect.element);
}},
afterFinishInternal: function(effect) {
new Effect.Parallel(
[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
new Effect.Scale(effect.element, 100, {
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
], Object.extend({
beforeSetup: function(effect) { with(Element) {
setStyle(effect.effects[0].element, {height: '0px'});
show(effect.effects[0].element); }},
afterFinishInternal: function(effect) { with(Element) {
[undoClipping, undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element, oldStyle); }}
}, options)
)
}
});
}
Effect.Shrink = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.none
}, arguments[1] || {});
var oldStyle = {
top: element.style.top,
left: element.style.left,
height: element.style.height,
width: element.style.width,
opacity: Element.getInlineOpacity(element) };
var dims = Element.getDimensions(element);
var moveX, moveY;
switch (options.direction) {
case 'top-left':
moveX = moveY = 0;
break;
case 'top-right':
moveX = dims.width;
moveY = 0;
break;
case 'bottom-left':
moveX = 0;
moveY = dims.height;
break;
case 'bottom-right':
moveX = dims.width;
moveY = dims.height;
break;
case 'center':
moveX = dims.width / 2;
moveY = dims.height / 2;
break;
}
return new Effect.Parallel(
[ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
], Object.extend({
beforeStartInternal: function(effect) { with(Element) {
[makePositioned, makeClipping].call(effect.effects[0].element) }},
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping, undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element, oldStyle); }}
}, options)
);
}
Effect.Pulsate = function(element) {
element = $(element);
var options    = arguments[1] || {};
var oldOpacity = Element.getInlineOpacity(element);
var transition = options.transition || Effect.Transitions.sinoidal;
var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
reverser.bind(transition);
return new Effect.Opacity(element,
Object.extend(Object.extend({  duration: 3.0, from: 0,
afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); }
}, options), {transition: reverser}));
}
Effect.Fold = function(element) {
element = $(element);
var oldStyle = {
top: element.style.top,
left: element.style.left,
width: element.style.width,
height: element.style.height };
Element.makeClipping(element);
return new Effect.Scale(element, 5, Object.extend({
scaleContent: false,
scaleX: false,
afterFinishInternal: function(effect) {
new Effect.Scale(element, 1, {
scaleContent: false,
scaleY: false,
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping].call(effect.element);
setStyle(effect.element, oldStyle);
}} });
}}, arguments[1] || {}));
}
;
/*--------------------------------------------------------------------------*/
var Droppables = {
drops: [],
remove: function(element) {
this.drops = this.drops.reject(function(d) { return d.element==$(element) });
},
add: function(element) {
element = $(element);
var options = Object.extend({
greedy:     true,
hoverclass: null
}, arguments[1] || {});
if(options.containment) {
options._containers = [];
var containment = options.containment;
if((typeof containment == 'object') &&
(containment.constructor == Array)) {
containment.each( function(c) { options._containers.push($(c)) });
} else {
options._containers.push($(containment));
}
}
if(options.accept) options.accept = [options.accept].flatten();
Element.makePositioned(element); // fix IE
options.element = element;
this.drops.push(options);
},
isContained: function(element, drop) {
var parentNode = element.parentNode;
return drop._containers.detect(function(c) { return parentNode == c });
},
isAffected: function(point, element, drop) {
return (
(drop.element!=element) &&
((!drop._containers) ||
this.isContained(element, drop)) &&
((!drop.accept) ||
(Element.classNames(element).detect(
function(v) { return drop.accept.include(v) } ) )) &&
Position.within(drop.element, point[0], point[1]) );
},
deactivate: function(drop) {
if(drop.hoverclass)
Element.removeClassName(drop.element, drop.hoverclass);
this.last_active = null;
},
activate: function(drop) {
if(drop.hoverclass)
Element.addClassName(drop.element, drop.hoverclass);
this.last_active = drop;
},
show: function(point, element) {
if(!this.drops.length) return;
if(this.last_active) this.deactivate(this.last_active);
this.drops.each( function(drop) {
if(Droppables.isAffected(point, element, drop)) {
if(drop.onHover)
drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
if(drop.greedy) {
Droppables.activate(drop);
throw $break;
}
}
});
},
fire: function(event, element) {
if(!this.last_active) return;
Position.prepare();
if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
if (this.last_active.onDrop)
this.last_active.onDrop(element, this.last_active.element, event);
},
reset: function() {
if(this.last_active)
this.deactivate(this.last_active);
}
}
var Draggables = {
drags: [],
observers: [],
register: function(draggable) {
if(this.drags.length == 0) {
this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
this.eventKeypress  = this.keyPress.bindAsEventListener(this);
Event.observe(document, "mouseup", this.eventMouseUp);
Event.observe(document, "mousemove", this.eventMouseMove);
Event.observe(document, "keypress", this.eventKeypress);
}
this.drags.push(draggable);
},
unregister: function(draggable) {
this.drags = this.drags.reject(function(d) { return d==draggable });
if(this.drags.length == 0) {
Event.stopObserving(document, "mouseup", this.eventMouseUp);
Event.stopObserving(document, "mousemove", this.eventMouseMove);
Event.stopObserving(document, "keypress", this.eventKeypress);
}
},
activate: function(draggable) {
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
this.activeDraggable = draggable;
},
deactivate: function() {
this.activeDraggable = null;
},
updateDrag: function(event) {
if(!this.activeDraggable) return;
var pointer = [Event.pointerX(event), Event.pointerY(event)];
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
this._lastPointer = pointer;
this.activeDraggable.updateDrag(event, pointer);
},
endDrag: function(event) {
if(!this.activeDraggable) return;
this._lastPointer = null;
this.activeDraggable.endDrag(event);
this.activeDraggable = null;
},
keyPress: function(event) {
if(this.activeDraggable)
this.activeDraggable.keyPress(event);
},
addObserver: function(observer) {
this.observers.push(observer);
this._cacheObserverCallbacks();
},
removeObserver: function(element) {  // element instead of observer fixes mem leaks
this.observers = this.observers.reject( function(o) { return o.element==element });
this._cacheObserverCallbacks();
},
notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
if(this[eventName+'Count'] > 0)
this.observers.each( function(o) {
if(o[eventName]) o[eventName](eventName, draggable, event);
});
},
_cacheObserverCallbacks: function() {
['onStart','onEnd','onDrag'].each( function(eventName) {
Draggables[eventName+'Count'] = Draggables.observers.select(
function(o) { return o[eventName]; }
).length;
});
}
}
/*--------------------------------------------------------------------------*/
var Draggable = Class.create();
Draggable.prototype = {
initialize: function(element) {
var options = Object.extend({
handle: false,
starteffect: function(element) {
new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7});
},
reverteffect: function(element, top_offset, left_offset) {
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
},
endeffect: function(element) {
new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0});
},
zindex: 1000,
revert: false,
scroll: false,
scrollSensitivity: 20,
scrollSpeed: 15,
snap: false   // false, or xy or [x,y] or function(x,y){ return [x,y] }
}, arguments[1] || {});
this.element = $(element);
if(options.handle && (typeof options.handle == 'string'))
this.handle = Element.childrenWithClassName(this.element, options.handle)[0];
if(!this.handle) this.handle = $(options.handle);
if(!this.handle) this.handle = this.element;
if(options.scroll) options.scroll = $(options.scroll);
Element.makePositioned(this.element); // fix IE
this.delta    = this.currentDelta();
this.options  = options;
this.dragging = false;
this.eventMouseDown = this.initDrag.bindAsEventListener(this);
Event.observe(this.handle, "mousedown", this.eventMouseDown);
Draggables.register(this);
},
destroy: function() {
Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
Draggables.unregister(this);
},
currentDelta: function() {
return([
parseInt(Element.getStyle(this.element,'left') || '0'),
parseInt(Element.getStyle(this.element,'top') || '0')]);
},
initDrag: function(event) {
if(Event.isLeftClick(event)) {
var src = Event.element(event);
if(src.tagName && (
src.tagName=='INPUT' ||
src.tagName=='SELECT' ||
src.tagName=='OPTION' ||
src.tagName=='BUTTON' ||
src.tagName=='TEXTAREA')) return;
if(this.element._revert) {
this.element._revert.cancel();
this.element._revert = null;
}
var pointer = [Event.pointerX(event), Event.pointerY(event)];
var pos     = Position.cumulativeOffset(this.element);
this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
Draggables.activate(this);
Event.stop(event);
}
},
startDrag: function(event) {
this.dragging = true;
if(this.options.zindex) {
this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
this.element.style.zIndex = this.options.zindex;
}
if(this.options.ghosting) {
this._clone = this.element.cloneNode(true);
Position.absolutize(this.element);
this.element.parentNode.insertBefore(this._clone, this.element);
}
if(this.options.scroll) {
this.originalScrollLeft = this.options.scroll.scrollLeft;
this.originalScrollTop = this.options.scroll.scrollTop;
}
Draggables.notify('onStart', this, event);
if(this.options.starteffect) this.options.starteffect(this.element);
},
updateDrag: function(event, pointer) {
if(!this.dragging) this.startDrag(event);
Position.prepare();
Droppables.show(pointer, this.element);
Draggables.notify('onDrag', this, event);
this.draw(pointer);
if(this.options.change) this.options.change(this);
if(this.options.scroll) {
this.stopScrolling();
var p = Position.page(this.options.scroll);
p[0] += this.options.scroll.scrollLeft;
p[1] += this.options.scroll.scrollTop;
p.push(p[0]+this.options.scroll.offsetWidth);
p.push(p[1]+this.options.scroll.offsetHeight);
var speed = [0,0];
if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
this.startScrolling(speed);
}
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
Event.stop(event);
},
finishDrag: function(event, success) {
this.dragging = false;
if(this.options.ghosting) {
Position.relativize(this.element);
Element.remove(this._clone);
this._clone = null;
}
if(success) Droppables.fire(event, this.element);
Draggables.notify('onEnd', this, event);
var revert = this.options.revert;
if(revert && typeof revert == 'function') revert = revert(this.element);
var d = this.currentDelta();
if(revert && this.options.reverteffect) {
this.options.reverteffect(this.element,
d[1]-this.delta[1], d[0]-this.delta[0]);
} else {
this.delta = d;
}
if(this.options.zindex)
this.element.style.zIndex = this.originalZ;
if(this.options.endeffect)
this.options.endeffect(this.element);
Draggables.deactivate(this);
Droppables.reset();
},
keyPress: function(event) {
if(event.keyCode!=Event.KEY_ESC) return;
this.finishDrag(event, false);
Event.stop(event);
},
endDrag: function(event) {
if(!this.dragging) return;
this.stopScrolling();
this.finishDrag(event, true);
Event.stop(event);
},
draw: function(point) {
var pos = Position.cumulativeOffset(this.element);
var d = this.currentDelta();
pos[0] -= d[0]; pos[1] -= d[1];
if(this.options.scroll) {
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
}
var p = [0,1].map(function(i){
return (point[i]-pos[i]-this.offset[i])
}.bind(this));
if(this.options.snap) {
if(typeof this.options.snap == 'function') {
p = this.options.snap(p[0],p[1]);
} else {
if(this.options.snap instanceof Array) {
p = p.map( function(v, i) {
return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
} else {
p = p.map( function(v) {
return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
}
}}
var style = this.element.style;
if((!this.options.constraint) || (this.options.constraint=='horizontal'))
style.left = p[0] + "px";
if((!this.options.constraint) || (this.options.constraint=='vertical'))
style.top  = p[1] + "px";
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
},
stopScrolling: function() {
if(this.scrollInterval) {
clearInterval(this.scrollInterval);
this.scrollInterval = null;
}
},
startScrolling: function(speed) {
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
this.lastScrolled = new Date();
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
},
scroll: function() {
var current = new Date();
var delta = current - this.lastScrolled;
this.lastScrolled = current;
this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
Position.prepare();
Droppables.show(Draggables._lastPointer, this.element);
Draggables.notify('onDrag', this);
this.draw(Draggables._lastPointer);
if(this.options.change) this.options.change(this);
}
}
/*--------------------------------------------------------------------------*/
var SortableObserver = Class.create();
SortableObserver.prototype = {
initialize: function(element, observer) {
this.element   = $(element);
this.observer  = observer;
this.lastValue = Sortable.serialize(this.element);
},
onStart: function() {
this.lastValue = Sortable.serialize(this.element);
},
onEnd: function() {
Sortable.unmark();
if(this.lastValue != Sortable.serialize(this.element))
this.observer(this.element)
}
}
var Sortable = {
sortables: new Array(),
options: function(element){
element = $(element);
return this.sortables.detect(function(s) { return s.element == element });
},
destroy: function(element){
element = $(element);
this.sortables.findAll(function(s) { return s.element == element }).each(function(s){
Draggables.removeObserver(s.element);
s.droppables.each(function(d){ Droppables.remove(d) });
s.draggables.invoke('destroy');
});
this.sortables = this.sortables.reject(function(s) { return s.element == element });
},
create: function(element) {
element = $(element);
var options = Object.extend({
element:     element,
tag:         'li',       // assumes li children, override with tag: 'tagname'
dropOnEmpty: false,
tree:        false,      // fixme: unimplemented
overlap:     'vertical', // one of 'vertical', 'horizontal'
constraint:  'vertical', // one of 'vertical', 'horizontal', false
containment: element,    // also takes array of elements (or id's); or false
handle:      false,      // or a CSS class
only:        false,
hoverclass:  null,
ghosting:    false,
scroll:      false,
format:      /^[^_]*_(.*)$/,
onChange:    Prototype.emptyFunction,
onUpdate:    Prototype.emptyFunction
}, arguments[1] || {});
this.destroy(element);
var options_for_draggable = {
revert:      true,
scroll:      options.scroll,
ghosting:    options.ghosting,
constraint:  options.constraint,
handle:      options.handle };
if(options.starteffect)
options_for_draggable.starteffect = options.starteffect;
if(options.reverteffect)
options_for_draggable.reverteffect = options.reverteffect;
else
if(options.ghosting) options_for_draggable.reverteffect = function(element) {
element.style.top  = 0;
element.style.left = 0;
};
if(options.endeffect)
options_for_draggable.endeffect = options.endeffect;
if(options.zindex)
options_for_draggable.zindex = options.zindex;
var options_for_droppable = {
overlap:     options.overlap,
containment: options.containment,
hoverclass:  options.hoverclass,
onHover:     Sortable.onHover,
greedy:      !options.dropOnEmpty
}
Element.cleanWhitespace(element);
options.draggables = [];
options.droppables = [];
if(options.dropOnEmpty) {
Droppables.add(element,
{containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});
options.droppables.push(element);
}
(this.findElements(element, options) || []).each( function(e) {
var handle = options.handle ?
Element.childrenWithClassName(e, options.handle)[0] : e;
options.draggables.push(
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
Droppables.add(e, options_for_droppable);
options.droppables.push(e);
});
this.sortables.push(options);
Draggables.addObserver(new SortableObserver(element, options.onUpdate));
},
findElements: function(element, options) {
if(!element.hasChildNodes()) return null;
var elements = [];
$A(element.childNodes).each( function(e) {
if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() &&
(!options.only || (Element.hasClassName(e, options.only))))
elements.push(e);
if(options.tree) {
var grandchildren = this.findElements(e, options);
if(grandchildren) elements.push(grandchildren);
}
});
return (elements.length>0 ? elements.flatten() : null);
},
onHover: function(element, dropon, overlap) {
if(overlap>0.5) {
Sortable.mark(dropon, 'before');
if(dropon.previousSibling != element) {
var oldParentNode = element.parentNode;
element.style.visibility = "hidden"; // fix gecko rendering
dropon.parentNode.insertBefore(element, dropon);
if(dropon.parentNode!=oldParentNode)
Sortable.options(oldParentNode).onChange(element);
Sortable.options(dropon.parentNode).onChange(element);
}
} else {
Sortable.mark(dropon, 'after');
var nextElement = dropon.nextSibling || null;
if(nextElement != element) {
var oldParentNode = element.parentNode;
element.style.visibility = "hidden"; // fix gecko rendering
dropon.parentNode.insertBefore(element, nextElement);
if(dropon.parentNode!=oldParentNode)
Sortable.options(oldParentNode).onChange(element);
Sortable.options(dropon.parentNode).onChange(element);
}
}
},
onEmptyHover: function(element, dropon) {
if(element.parentNode!=dropon) {
var oldParentNode = element.parentNode;
dropon.appendChild(element);
Sortable.options(oldParentNode).onChange(element);
Sortable.options(dropon).onChange(element);
}
},
unmark: function() {
if(Sortable._marker) Element.hide(Sortable._marker);
},
mark: function(dropon, position) {
var sortable = Sortable.options(dropon.parentNode);
if(sortable && !sortable.ghosting) return;
if(!Sortable._marker) {
Sortable._marker = $('dropmarker') || document.createElement('DIV');
Element.hide(Sortable._marker);
Element.addClassName(Sortable._marker, 'dropmarker');
Sortable._marker.style.position = 'absolute';
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
}
var offsets = Position.cumulativeOffset(dropon);
Sortable._marker.style.left = offsets[0] + 'px';
Sortable._marker.style.top = offsets[1] + 'px';
if(position=='after')
if(sortable.overlap == 'horizontal')
Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
else
Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
Element.show(Sortable._marker);
},
sequence: function(element) {
element = $(element);
var options = Object.extend(this.options(element), arguments[1] || {});
return $(this.findElements(element, options) || []).map( function(item) {
return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
});
},
setSequence: function(element, new_sequence) {
element = $(element);
var options = Object.extend(this.options(element), arguments[2] || {});
var nodeMap = {};
this.findElements(element, options).each( function(n) {
if (n.id.match(options.format))
nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
n.parentNode.removeChild(n);
});
new_sequence.each(function(ident) {
var n = nodeMap[ident];
if (n) {
n[1].appendChild(n[0]);
delete nodeMap[ident];
}
});
},
serialize: function(element) {
element = $(element);
var name = encodeURIComponent(
(arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
return Sortable.sequence(element, arguments[1]).map( function(item) {
return name + "[]=" + encodeURIComponent(item);
}).join('&');
}
}
;
var Autocompleter = {}
Autocompleter.Base = function() {};
Autocompleter.Base.prototype = {
baseInitialize: function(element, update, options) {
this.element     = $(element);
this.update      = $(update);
this.hasFocus    = false;
this.changed     = false;
this.active      = false;
this.index       = 0;
this.entryCount  = 0;
if (this.setOptions)
this.setOptions(options);
else
this.options = options || {};
this.options.paramName    = this.options.paramName || this.element.name;
this.options.tokens       = this.options.tokens || [];
this.options.frequency    = this.options.frequency || 0.4;
this.options.minChars     = this.options.minChars || 1;
this.options.onShow       = this.options.onShow ||
function(element, update){
if(!update.style.position || update.style.position=='absolute') {
update.style.position = 'absolute';
Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight});
}
Effect.Appear(update,{duration:0.15});
};
this.options.onHide = this.options.onHide ||
function(element, update){ new Effect.Fade(update,{duration:0.15}) };
if (typeof(this.options.tokens) == 'string')
this.options.tokens = new Array(this.options.tokens);
this.observer = null;
this.element.setAttribute('autocomplete','off');
Element.hide(this.update);
Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
},
show: function() {
if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
if(!this.iefix &&
(navigator.appVersion.indexOf('MSIE')>0) &&
(navigator.userAgent.indexOf('Opera')<0) &&
(Element.getStyle(this.update, 'position')=='absolute')) {
new Insertion.After(this.update,
'<iframe id="' + this.update.id + '_iefix" '+
'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
this.iefix = $(this.update.id+'_iefix');
}
if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
},
fixIEOverlapping: function() {
Position.clone(this.update, this.iefix);
this.iefix.style.zIndex = 1;
this.update.style.zIndex = 2;
Element.show(this.iefix);
},
hide: function() {
this.stopIndicator();
if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
if(this.iefix) Element.hide(this.iefix);
},
startIndicator: function() {
if(this.options.indicator) Element.show(this.options.indicator);
},
stopIndicator: function() {
if(this.options.indicator) Element.hide(this.options.indicator);
},
onKeyPress: function(event) {
if(this.active)
switch(event.keyCode) {
case Event.KEY_TAB:
case Event.KEY_RETURN:
this.selectEntry();
Event.stop(event);
case Event.KEY_ESC:
this.hide();
this.active = false;
Event.stop(event);
return;
case Event.KEY_LEFT:
case Event.KEY_RIGHT:
return;
case Event.KEY_UP:
this.markPrevious();
this.render();
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
return;
case Event.KEY_DOWN:
this.markNext();
this.render();
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
return;
}
else
if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN)
return;
this.changed = true;
this.hasFocus = true;
if(this.observer) clearTimeout(this.observer);
this.observer =
setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
},
activate: function() {
this.changed = false;
this.hasFocus = true;
this.getUpdatedChoices();
},
onHover: function(event) {
var element = Event.findElement(event, 'LI');
if(this.index != element.autocompleteIndex)
{
this.index = element.autocompleteIndex;
this.render();
}
Event.stop(event);
},
onClick: function(event) {
var element = Event.findElement(event, 'LI');
this.index = element.autocompleteIndex;
this.selectEntry();
this.hide();
},
onBlur: function(event) {
setTimeout(this.hide.bind(this), 250);
this.hasFocus = false;
this.active = false;
},
render: function() {
if(this.entryCount > 0) {
for (var i = 0; i < this.entryCount; i++)
this.index==i ?
Element.addClassName(this.getEntry(i),"selected") :
Element.removeClassName(this.getEntry(i),"selected");
if(this.hasFocus) {
this.show();
this.active = true;
}
} else {
this.active = false;
this.hide();
}
},
markPrevious: function() {
if(this.index > 0) this.index--
else this.index = this.entryCount-1;
},
markNext: function() {
if(this.index < this.entryCount-1) this.index++
else this.index = 0;
},
getEntry: function(index) {
return this.update.firstChild.childNodes[index];
},
getCurrentEntry: function() {
return this.getEntry(this.index);
},
selectEntry: function() {
this.active = false;
this.updateElement(this.getCurrentEntry());
},
updateElement: function(selectedElement) {
if (this.options.updateElement) {
this.options.updateElement(selectedElement);
return;
}
var value = '';
if (this.options.select) {
var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
} else
value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
var lastTokenPos = this.findLastToken();
if (lastTokenPos != -1) {
var newValue = this.element.value.substr(0, lastTokenPos + 1);
var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
if (whitespace)
newValue += whitespace[0];
this.element.value = newValue + value;
} else {
this.element.value = value;
}
this.element.focus();
if (this.options.afterUpdateElement)
this.options.afterUpdateElement(this.element, selectedElement);
},
updateChoices: function(choices) {
if(!this.changed && this.hasFocus) {
this.update.innerHTML = choices;
Element.cleanWhitespace(this.update);
Element.cleanWhitespace(this.update.firstChild);
if(this.update.firstChild && this.update.firstChild.childNodes) {
this.entryCount =
this.update.firstChild.childNodes.length;
for (var i = 0; i < this.entryCount; i++) {
var entry = this.getEntry(i);
entry.autocompleteIndex = i;
this.addObservers(entry);
}
} else {
this.entryCount = 0;
}
this.stopIndicator();
this.index = 0;
this.render();
}
},
addObservers: function(element) {
Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
Event.observe(element, "click", this.onClick.bindAsEventListener(this));
},
onObserverEvent: function() {
this.changed = false;
if(this.getToken().length>=this.options.minChars) {
this.startIndicator();
this.getUpdatedChoices();
} else {
this.active = false;
this.hide();
}
},
getToken: function() {
var tokenPos = this.findLastToken();
if (tokenPos != -1)
var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
else
var ret = this.element.value;
return /\n/.test(ret) ? '' : ret;
},
findLastToken: function() {
var lastTokenPos = -1;
for (var i=0; i<this.options.tokens.length; i++) {
var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
if (thisTokenPos > lastTokenPos)
lastTokenPos = thisTokenPos;
}
return lastTokenPos;
}
}
Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
initialize: function(element, update, url, options) {
this.baseInitialize(element, update, options);
this.options.asynchronous  = true;
this.options.onComplete    = this.onComplete.bind(this);
this.options.defaultParams = this.options.parameters || null;
this.url                   = url;
},
getUpdatedChoices: function() {
entry = encodeURIComponent(this.options.paramName) + '=' +
encodeURIComponent(this.getToken());
this.options.parameters = this.options.callback ?
this.options.callback(this.element, entry) : entry;
if(this.options.defaultParams)
this.options.parameters += '&' + this.options.defaultParams;
new Ajax.Request(this.url, this.options);
},
onComplete: function(request) {
this.updateChoices(request.responseText);
}
});
Autocompleter.Local = Class.create();
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
initialize: function(element, update, array, options) {
this.baseInitialize(element, update, options);
this.options.array = array;
},
getUpdatedChoices: function() {
this.updateChoices(this.options.selector(this));
},
setOptions: function(options) {
this.options = Object.extend({
choices: 10,
partialSearch: true,
partialChars: 2,
ignoreCase: true,
fullSearch: false,
selector: function(instance) {
var ret       = []; // Beginning matches
var partial   = []; // Inside matches
var entry     = instance.getToken();
var count     = 0;
for (var i = 0; i < instance.options.array.length &&
ret.length < instance.options.choices ; i++) {
var elem = instance.options.array[i];
var foundPos = instance.options.ignoreCase ?
elem.toLowerCase().indexOf(entry.toLowerCase()) :
elem.indexOf(entry);
while (foundPos != -1) {
if (foundPos == 0 && elem.length != entry.length) {
ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
elem.substr(entry.length) + "</li>");
break;
} else if (entry.length >= instance.options.partialChars &&
instance.options.partialSearch && foundPos != -1) {
if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
foundPos + entry.length) + "</li>");
break;
}
}
foundPos = instance.options.ignoreCase ?
elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
elem.indexOf(entry, foundPos + 1);
}
}
if (partial.length)
ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
return "<ul>" + ret.join('') + "</ul>";
}
}, options || {});
}
});
Field.scrollFreeActivate = function(field) {
setTimeout(function() {
Field.activate(field);
}, 1);
}
Ajax.InPlaceEditor = Class.create();
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
Ajax.InPlaceEditor.prototype = {
initialize: function(element, url, options) {
this.url = url;
this.element = $(element);
this.options = Object.extend({
okButton: true,
okText: "ok",
cancelLink: true,
cancelText: "cancel",
savingText: "Saving...",
clickToEditText: "Click to edit",
okText: "ok",
rows: 1,
onComplete: function(transport, element) {
new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
},
onFailure: function(transport) {
alert("Error communicating with the server: " + transport.responseText.stripTags());
},
callback: function(form) {
return Form.serialize(form);
},
handleLineBreaks: true,
loadingText: 'Loading...',
savingClassName: 'inplaceeditor-saving',
loadingClassName: 'inplaceeditor-loading',
formClassName: 'inplaceeditor-form',
highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
highlightendcolor: "#FFFFFF",
externalControl: null,
submitOnBlur: false,
ajaxOptions: {},
evalScripts: false
}, options || {});
if(!this.options.formId && this.element.id) {
this.options.formId = this.element.id + "-inplaceeditor";
if ($(this.options.formId)) {
this.options.formId = null;
}
}
if (this.options.externalControl) {
this.options.externalControl = $(this.options.externalControl);
}
this.originalBackground = Element.getStyle(this.element, 'background-color');
if (!this.originalBackground) {
this.originalBackground = "transparent";
}
this.element.title = this.options.clickToEditText;
this.onclickListener = this.enterEditMode.bindAsEventListener(this);
this.mouseoverListener = this.enterHover.bindAsEventListener(this);
this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
Event.observe(this.element, 'click', this.onclickListener);
Event.observe(this.element, 'mouseover', this.mouseoverListener);
Event.observe(this.element, 'mouseout', this.mouseoutListener);
if (this.options.externalControl) {
Event.observe(this.options.externalControl, 'click', this.onclickListener);
Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
}
},
enterEditMode: function(evt) {
if (this.saving) return;
if (this.editing) return;
this.editing = true;
this.onEnterEditMode();
if (this.options.externalControl) {
Element.hide(this.options.externalControl);
}
Element.hide(this.element);
this.createForm();
this.element.parentNode.insertBefore(this.form, this.element);
Field.scrollFreeActivate(this.editField);
if (evt) {
Event.stop(evt);
}
return false;
},
createForm: function() {
this.form = document.createElement("form");
this.form.id = this.options.formId;
Element.addClassName(this.form, this.options.formClassName)
this.form.onsubmit = this.onSubmit.bind(this);
this.createEditField();
if (this.options.textarea) {
var br = document.createElement("br");
this.form.appendChild(br);
}
if (this.options.okButton) {
okButton = document.createElement("input");
okButton.type = "submit";
okButton.value = this.options.okText;
okButton.className = 'editor_ok_button';
this.form.appendChild(okButton);
}
if (this.options.cancelLink) {
cancelLink = document.createElement("a");
cancelLink.href = "#";
cancelLink.appendChild(document.createTextNode(this.options.cancelText));
cancelLink.onclick = this.onclickCancel.bind(this);
cancelLink.className = 'editor_cancel';
this.form.appendChild(cancelLink);
}
},
hasHTMLLineBreaks: function(string) {
if (!this.options.handleLineBreaks) return false;
return string.match(/<br/i) || string.match(/<p>/i);
},
convertHTMLLineBreaks: function(string) {
return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
},
createEditField: function() {
var text;
if(this.options.loadTextURL) {
text = this.options.loadingText;
} else {
text = this.getText();
}
var obj = this;
if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
this.options.textarea = false;
var textField = document.createElement("input");
textField.obj = this;
textField.type = "text";
textField.name = "value";
textField.value = text;
textField.style.backgroundColor = this.options.highlightcolor;
textField.className = 'editor_field';
var size = this.options.size || this.options.cols || 0;
if (size != 0) textField.size = size;
if (this.options.submitOnBlur)
textField.onblur = this.onSubmit.bind(this);
this.editField = textField;
} else {
this.options.textarea = true;
var textArea = document.createElement("textarea");
textArea.obj = this;
textArea.name = "value";
textArea.value = this.convertHTMLLineBreaks(text);
textArea.rows = this.options.rows;
textArea.cols = this.options.cols || 40;
textArea.className = 'editor_field';
if (this.options.submitOnBlur)
textArea.onblur = this.onSubmit.bind(this);
this.editField = textArea;
}
if(this.options.loadTextURL) {
this.loadExternalText();
}
this.form.appendChild(this.editField);
},
getText: function() {
return this.element.innerHTML;
},
loadExternalText: function() {
Element.addClassName(this.form, this.options.loadingClassName);
this.editField.disabled = true;
new Ajax.Request(
this.options.loadTextURL,
Object.extend({
asynchronous: true,
onComplete: this.onLoadedExternalText.bind(this)
}, this.options.ajaxOptions)
);
},
onLoadedExternalText: function(transport) {
Element.removeClassName(this.form, this.options.loadingClassName);
this.editField.disabled = false;
this.editField.value = transport.responseText.stripTags();
},
onclickCancel: function() {
this.onComplete();
this.leaveEditMode();
return false;
},
onFailure: function(transport) {
this.options.onFailure(transport);
if (this.oldInnerHTML) {
this.element.innerHTML = this.oldInnerHTML;
this.oldInnerHTML = null;
}
return false;
},
onSubmit: function() {
var form = this.form;
var value = this.editField.value;
this.onLoading();
if (this.options.evalScripts) {
new Ajax.Request(
this.url, Object.extend({
parameters: this.options.callback(form, value),
onComplete: this.onComplete.bind(this),
onFailure: this.onFailure.bind(this),
asynchronous:true,
evalScripts:true
}, this.options.ajaxOptions));
} else  {
new Ajax.Updater(
{ success: this.element,
failure: null },
this.url, Object.extend({
parameters: this.options.callback(form, value),
onComplete: this.onComplete.bind(this),
onFailure: this.onFailure.bind(this)
}, this.options.ajaxOptions));
}
if (arguments.length > 1) {
Event.stop(arguments[0]);
}
return false;
},
onLoading: function() {
this.saving = true;
this.removeForm();
this.leaveHover();
this.showSaving();
},
showSaving: function() {
this.oldInnerHTML = this.element.innerHTML;
this.element.innerHTML = this.options.savingText;
Element.addClassName(this.element, this.options.savingClassName);
this.element.style.backgroundColor = this.originalBackground;
Element.show(this.element);
},
removeForm: function() {
if(this.form) {
if (this.form.parentNode) Element.remove(this.form);
this.form = null;
}
},
enterHover: function() {
if (this.saving) return;
this.element.style.backgroundColor = this.options.highlightcolor;
if (this.effect) {
this.effect.cancel();
}
Element.addClassName(this.element, this.options.hoverClassName)
},
leaveHover: function() {
if (this.options.backgroundColor) {
this.element.style.backgroundColor = this.oldBackground;
}
Element.removeClassName(this.element, this.options.hoverClassName)
if (this.saving) return;
this.effect = new Effect.Highlight(this.element, {
startcolor: this.options.highlightcolor,
endcolor: this.options.highlightendcolor,
restorecolor: this.originalBackground
});
},
leaveEditMode: function() {
Element.removeClassName(this.element, this.options.savingClassName);
this.removeForm();
this.leaveHover();
this.element.style.backgroundColor = this.originalBackground;
Element.show(this.element);
if (this.options.externalControl) {
Element.show(this.options.externalControl);
}
this.editing = false;
this.saving = false;
this.oldInnerHTML = null;
this.onLeaveEditMode();
},
onComplete: function(transport) {
this.leaveEditMode();
this.options.onComplete.bind(this)(transport, this.element);
},
onEnterEditMode: function() {},
onLeaveEditMode: function() {},
dispose: function() {
if (this.oldInnerHTML) {
this.element.innerHTML = this.oldInnerHTML;
}
this.leaveEditMode();
Event.stopObserving(this.element, 'click', this.onclickListener);
Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
if (this.options.externalControl) {
Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
}
}
};
Ajax.InPlaceCollectionEditor = Class.create();
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
createEditField: function() {
if (!this.cached_selectTag) {
var selectTag = document.createElement("select");
var collection = this.options.collection || [];
var optionTag;
collection.each(function(e,i) {
optionTag = document.createElement("option");
optionTag.value = (e instanceof Array) ? e[0] : e;
if(this.options.value==optionTag.value) optionTag.selected = true;
optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
selectTag.appendChild(optionTag);
}.bind(this));
this.cached_selectTag = selectTag;
}
this.editField = this.cached_selectTag;
if(this.options.loadTextURL) this.loadExternalText();
this.form.appendChild(this.editField);
this.options.callback = function(form, value) {
return "value=" + encodeURIComponent(value);
}
}
});
Form.Element.DelayedObserver = Class.create();
Form.Element.DelayedObserver.prototype = {
initialize: function(element, delay, callback) {
this.delay     = delay || 0.5;
this.element   = $(element);
this.callback  = callback;
this.timer     = null;
this.lastValue = $F(this.element);
Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
},
delayedListener: function(event) {
if(this.lastValue == $F(this.element)) return;
if(this.timer) clearTimeout(this.timer);
this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
this.lastValue = $F(this.element);
},
onTimerEvent: function() {
this.timer = null;
this.callback(this.element, $F(this.element));
}
};
;
if(!Control) var Control = {};
Control.Slider = Class.create();
Control.Slider.prototype = {
initialize: function(handle, track, options) {
var slider = this;
if(handle instanceof Array) {
this.handles = handle.collect( function(e) { return $(e) });
} else {
this.handles = [$(handle)];
}
this.track   = $(track);
this.options = options || {};
this.axis      = this.options.axis || 'horizontal';
this.increment = this.options.increment || 1;
this.step      = parseInt(this.options.step || '1');
this.range     = this.options.range || $R(0,1);
this.value     = 0; // assure backwards compat
this.values    = this.handles.map( function() { return 0 });
this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
this.options.startSpan = $(this.options.startSpan || null);
this.options.endSpan   = $(this.options.endSpan || null);
this.restricted = this.options.restricted || false;
this.maximum   = this.options.maximum || this.range.end;
this.minimum   = this.options.minimum || this.range.start;
this.alignX = parseInt(this.options.alignX || '0');
this.alignY = parseInt(this.options.alignY || '0');
this.trackLength = this.maximumOffset() - this.minimumOffset();
this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
this.active   = false;
this.dragging = false;
this.disabled = false;
if(this.options.disabled) this.setDisabled();
this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
if(this.allowedValues) {
this.minimum = this.allowedValues.min();
this.maximum = this.allowedValues.max();
}
this.eventMouseDown = this.startDrag.bindAsEventListener(this);
this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
this.eventMouseMove = this.update.bindAsEventListener(this);
this.handles.each( function(h,i) {
i = slider.handles.length-1-i;
slider.setValue(parseFloat(
(slider.options.sliderValue instanceof Array ?
slider.options.sliderValue[i] : slider.options.sliderValue) ||
slider.range.start), i);
Element.makePositioned(h); // fix IE
Event.observe(h, "mousedown", slider.eventMouseDown);
});
Event.observe(this.track, "mousedown", this.eventMouseDown);
Event.observe(document, "mouseup", this.eventMouseUp);
Event.observe(document, "mousemove", this.eventMouseMove);
this.initialized = true;
},
dispose: function() {
var slider = this;
Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
Event.stopObserving(document, "mouseup", this.eventMouseUp);
Event.stopObserving(document, "mousemove", this.eventMouseMove);
this.handles.each( function(h) {
Event.stopObserving(h, "mousedown", slider.eventMouseDown);
});
},
setDisabled: function(){
this.disabled = true;
},
setEnabled: function(){
this.disabled = false;
},
getNearestValue: function(value){
if(this.allowedValues){
if(value >= this.allowedValues.max()) return(this.allowedValues.max());
if(value <= this.allowedValues.min()) return(this.allowedValues.min());
var offset = Math.abs(this.allowedValues[0] - value);
var newValue = this.allowedValues[0];
this.allowedValues.each( function(v) {
var currentOffset = Math.abs(v - value);
if(currentOffset <= offset){
newValue = v;
offset = currentOffset;
}
});
return newValue;
}
if(value > this.range.end) return this.range.end;
if(value < this.range.start) return this.range.start;
return value;
},
setValue: function(sliderValue, handleIdx){
if(!this.active) {
this.activeHandle    = this.handles[handleIdx];
this.activeHandleIdx = handleIdx;
this.updateStyles();
}
handleIdx = handleIdx || this.activeHandleIdx || 0;
if(this.initialized && this.restricted) {
if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
sliderValue = this.values[handleIdx-1];
if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
sliderValue = this.values[handleIdx+1];
}
sliderValue = this.getNearestValue(sliderValue);
this.values[handleIdx] = sliderValue;
this.value = this.values[0]; // assure backwards compat
this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
this.translateToPx(sliderValue);
this.drawSpans();
if(!this.dragging || !this.event) this.updateFinished();
},
setValueBy: function(delta, handleIdx) {
this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
handleIdx || this.activeHandleIdx || 0);
},
translateToPx: function(value) {
return Math.round(
((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
(value - this.range.start)) + "px";
},
translateToValue: function(offset) {
return ((offset/(this.trackLength-this.handleLength) *
(this.range.end-this.range.start)) + this.range.start);
},
getRange: function(range) {
var v = this.values.sortBy(Prototype.K);
range = range || 0;
return $R(v[range],v[range+1]);
},
minimumOffset: function(){
return(this.isVertical() ? this.alignY : this.alignX);
},
maximumOffset: function(){
return(this.isVertical() ?
this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
},
isVertical:  function(){
return (this.axis == 'vertical');
},
drawSpans: function() {
var slider = this;
if(this.spans)
$R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
if(this.options.startSpan)
this.setSpan(this.options.startSpan,
$R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
if(this.options.endSpan)
this.setSpan(this.options.endSpan,
$R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
},
setSpan: function(span, range) {
if(this.isVertical()) {
span.style.top = this.translateToPx(range.start);
span.style.height = this.translateToPx(range.end - range.start + this.range.start);
} else {
span.style.left = this.translateToPx(range.start);
span.style.width = this.translateToPx(range.end - range.start + this.range.start);
}
},
updateStyles: function() {
this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
Element.addClassName(this.activeHandle, 'selected');
},
startDrag: function(event) {
if(Event.isLeftClick(event)) {
if(!this.disabled){
this.active = true;
var handle = Event.element(event);
var pointer  = [Event.pointerX(event), Event.pointerY(event)];
if(handle==this.track) {
var offsets  = Position.cumulativeOffset(this.track);
this.event = event;
this.setValue(this.translateToValue(
(this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
));
var offsets  = Position.cumulativeOffset(this.activeHandle);
this.offsetX = (pointer[0] - offsets[0]);
this.offsetY = (pointer[1] - offsets[1]);
} else {
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
handle = handle.parentNode;
this.activeHandle    = handle;
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
this.updateStyles();
var offsets  = Position.cumulativeOffset(this.activeHandle);
this.offsetX = (pointer[0] - offsets[0]);
this.offsetY = (pointer[1] - offsets[1]);
}
}
Event.stop(event);
}
},
update: function(event) {
if(this.active) {
if(!this.dragging) this.dragging = true;
this.draw(event);
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
Event.stop(event);
}
},
draw: function(event) {
var pointer = [Event.pointerX(event), Event.pointerY(event)];
var offsets = Position.cumulativeOffset(this.track);
pointer[0] -= this.offsetX + offsets[0];
pointer[1] -= this.offsetY + offsets[1];
this.event = event;
this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
if(this.initialized && this.options.onSlide)
this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
},
endDrag: function(event) {
if(this.active && this.dragging) {
this.finishDrag(event, true);
Event.stop(event);
}
this.active = false;
this.dragging = false;
},
finishDrag: function(event, success) {
this.active = false;
this.dragging = false;
this.updateFinished();
},
updateFinished: function() {
if(this.initialized && this.options.onChange)
this.options.onChange(this.values.length>1 ? this.values : this.value, this);
this.event = null;
}
};
/*
* common.js - Common functions
*/
function SetCookie(name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (2 < argc) ? argv[2] : null;
var path = (3 < argc) ? argv[3] : null;
var domain = (4 < argc) ? argv[4] : null;
var secure = (5 < argc) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
function getCookie(name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg) {
return getCookieVal(j);
}
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
function getTrackingUrl() {
return (document.location.pathname + document.location.search + document.location.hash);
}
function trimInput(input) {
if (input != null) {
return input.replace(/^\s*/, "").replace(/\s*$/, "");
}
return "";
}
function trimCustomerEmail(email) {
if (email != null) {
return email.replace(/^\s*/, "").replace(/\s*$/, "");
}
return "";
}
function toggleCheckBox(checkBoxElement) {
if (checkBoxElement.checked == false)
checkBoxElement.checked = true;
else
checkBoxElement.checked = false;
}
function ValidateWelcome() {
if (document.welcome.usefn != null && document.welcome.usefn.value != null) {
if (document.welcome.custfname.value == "") {
document.welcome.custfname.focus();
alert("Please provide a first name.");
return false;
}
}
if (! (document.welcome.optionalemail != null && document.welcome.optionalemail.value == "true") ||
(document.welcome.custemail.value.length >= 1 && document.welcome.custemail.value != "optional")) {
document.welcome.custemail.value = trimCustomerEmail(document.welcome.custemail.value);
if (document.welcome.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.welcome.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.welcome.custemail.value.indexOf("www.") == 0) {
document.welcome.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
}
if (document.welcome.custzip != null && document.welcome.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.welcome.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
if (document.welcome.usephone != null && document.welcome.usephone.value != null) {
var phone = document.welcome.custphone.value;
if (phone.indexOf("-") > 0 || phone.indexOf(" ") > 0 || phone.indexOf("(") > 0 || phone.indexOf(")") > 0) {
phone = phone.replace(/-/g, "").replace(/ /g, "").replace(/\(/g, "").replace(/\)/g, "");
}
if (phone == "") {
document.welcome.custphone.focus();
alert("Please provide a telephone number.");
return false;
} else if (phone.search(/^\d{10}$/) == -1) {
document.welcome.custphone.focus();
alert("Please enter a full 10-digit telephone number, including the area code.");
return false;
} else {
document.welcome.custphone.value = phone.substring(0,3) + "-" + phone.substring(3,6) + "-" + phone.substring(6,10);
if (phone.length >= 3 && checkValidPhoneAreaCode(phone.substring(0,3)) == false) {
document.welcome.custphone.focus();
return false;
} else if (phone.length >= 6 && checkValidPhoneMiddleNumber(phone.substring(3,6)) == false) {
document.welcome.custphone.focus();
return false;
}
}
}
return true;
}
function ValidateEOPForm() {
if (document.welcome.custzip != null && document.welcome.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.welcome.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
if (! (document.welcome.optionalemail != null && document.welcome.optionalemail.value == "true") ||
(document.welcome.custemail.value.length >= 1 && document.welcome.custemail.value != "optional")) {
document.welcome.custemail.value = trimCustomerEmail(document.welcome.custemail.value);
if (document.welcome.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.welcome.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.welcome.custemail.value.indexOf("www.") == 0) {
document.welcome.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
}
if (document.welcome.usefn != null && document.welcome.usefn.value != null) {
if (document.welcome.custfname.value == "") {
document.welcome.custfname.focus();
alert("Please provide a first name.");
return false;
}
}
if (document.welcome.usephone != null && document.welcome.usephone.value != null) {
var phone = document.welcome.custphone.value;
if (phone.indexOf("-") > 0 || phone.indexOf(" ") > 0 || phone.indexOf("(") > 0 || phone.indexOf(")") > 0) {
phone = phone.replace(/-/g, "").replace(/ /g, "").replace(/\(/g, "").replace(/\)/g, "");
}
if (phone == "") {
document.welcome.custphone.focus();
alert("Please enter a telephone number.");
return false;
} else if (phone.search(/^\d{10}$/) == -1) {
document.welcome.custphone.focus();
alert("Please enter a full 10-digit telephone number, including the area code.");
return false;
} else {
document.welcome.custphone.value = phone.substring(0,3) + "-" + phone.substring(3,6) + "-" + phone.substring(6,10);
if (phone.length >= 3 && checkValidPhoneAreaCode(phone.substring(0,3)) == false) {
document.welcome.custphone.focus();
return false;
} else if (phone.length >= 6 && checkValidPhoneMiddleNumber(phone.substring(3,6)) == false) {
document.welcome.custphone.focus();
return false;
}
}
}
return true;
}
function ValidateLoginForm() {
document.login.custemail.value = trimInput(document.login.custemail.value);
if (document.login.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.login.custemail.focus();
alert("Please provide a valid email address.");
return false;
}
else if (document.login.custpassword.value == "") {
document.login.custpassword.focus();
alert("Password is required.");
return false;
}
return true;
}
function ValidateForgotPasswordForm() {
document.forgot.custemail.value = trimInput(document.forgot.custemail.value);
if (document.forgot.custemail.value == "") {
document.forgot.custemail.focus();
alert("Please enter email address.");
return false;
} else if (document.forgot.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.forgot.custemail.focus();
alert("Please provide a valid email address.");
return false;
}
return true;
}
function ShowHideDiv(id, pId, mId) {
var div = document.getElementById(id);
div.style.display = (div.style.display == 'none' ? 'block' : 'none');
if (pId && mId) {
var pdiv = document.getElementById(pId);
var mdiv = document.getElementById(mId);
pdiv.style.display = (mdiv.style.display == 'none' ? 'none' : 'block');
mdiv.style.display = (pdiv.style.display == 'none' ? 'block' : 'none');
}
}
function ShowHideDiv(id) {
var div = document.getElementById(id);
div.style.display = (div.style.display == 'none' ? 'block' : 'none');
}
function openTermsPopUp() {
helpwin = window.open('/terms-of-use.do', 'help','scrollbars=yes,toolbar=no,width=750,height=480');
helpwin.focus();
}
function openUFTermsPopUp() {
helpwin = window.open('/terms-of-use.html', 'help','scrollbars=yes,toolbar=no,width=750,height=480');
helpwin.focus();
}
function countredirect() {
if (currentsecond != 1) {
currentsecond -= 1;
}
else {
var changetext = document.getElementById("changetext");
if (counter == 1) {
counter = 2;
changetext.innerHTML = newtext2;
}
else if (counter == 2) {
counter = 3;
changetext.innerHTML = newtext3;
}
else if (counter == 3) {
counter = 1;
changetext.innerHTML = newtext1;
}
currentsecond = countdownfrom + 1;
}
setTimeout("countredirect()", 1000);
}
var xmlDoc = getXmlHttpObject();
function getXmlHttpObject() {
var _xmlHttp;
try {
_xmlHttp=new XMLHttpRequest();
}
catch (e) {
try {
_xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
_xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return _xmlHttp;
}
function NewWindow(url, width, height) {
strOption = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=" + width + ",height=" + height;
newWin = window.open(url, '_new', strOption);
newWin.focus();
}
function NewWindowTarget(url, target, width, height) {
strOption = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=" + width + ",height=" + height;
newWin = window.open(url, target, strOption);
newWin.focus();
}
function hidelayer(lay) {
var ie4 = (document.all) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;
if (ie4) {
try {
document.all[lay].style.visibility = "hidden";
document.all[lay].style.display = "none";
} catch (e) {
}
}
if (ns6) {
try {
document.getElementById([lay]).style.visibility = "hidden";
document.getElementById([lay]).style.display = "none";
} catch (e) {
}
}
}
function showlayer(lay) {
var ie4 = (document.all) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;
if (ie4) {
try {
document.all[lay].style.visibility = "visible";
document.all[lay].style.display = "block";
} catch (e) {
}
}
if (ns6) {
try {
document.getElementById([lay]).style.visibility = "visible";
document.getElementById([lay]).style.display = "block";
} catch (e) {
}
}
}
function hideMultipleLayers(lay) {
var ie4 = (document.all) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;
var layers = lay.split(",");
if (ie4) {
for (i=0; i<layers.length; i++) {
try {
document.all[lay].style.visibility = "hidden";
document.all[lay].style.display = "none";
} catch (e) {
}
}
}
if (ns6) {
for (i=0; i<layers.length; i++) {
try {
document.getElementById([lay]).style.visibility = "hidden";
document.getElementById([lay]).style.display = "none";
} catch (e) {
}
}
}
}
function showMultipleLayers(lay) {
var ie4 = (document.all) ? true : false;
var ns6 = (document.getElementById && !document.all) ? true : false;
var layers = lay.split(",");
if (ie4) {
for (i=0; i<layers.length; i++) {
try {
document.all[lay].style.visibility = "visible";
document.all[lay].style.display = "block";
} catch (e) {
}
}
}
if (ns6) {
for (i=0; i<layers.length; i++) {
try {
document.getElementById([lay]).style.visibility = "visible";
document.getElementById([lay]).style.display = "block";
} catch (e) {
}
}
}
}
function redirectToPage(url) {
document.location = url;
}
function resizeIframe(element,addHeight) {
height=element.contentWindow.document.body.offsetHeight;
if(addHeight) {
height += addHeight;
}
height += "px";
element.style.height = height;
}
;
/*
* sales.js - Functions for Sales Pages
*/
/** Start - Generic functions **/
function openurl(url) {
if (window.opener != null) {
window.opener.location=url;
window.opener.focus();
window.close();
}
else {
window.location=url;
}
}
function parenturl(url) {
if (window.top != null) {
window.top.location=url;
window.top.focus();
}
else {
window.location=url;
}
}
function opennewurl(url) {
if (window.opener != null) {
newWin = window.open(url);
newWin.focus();
window.close();
}
else {
newWin = window.open(url);
newWin.focus();
}
}
function openCenterWin(url, name, theWidth, theHeight, scrollbars){
var theTop = (screen.height/2)-(theHeight/2);
var theLeft = (screen.width/2)-(theWidth/2);
var features = 'scrollbars='+scrollbars+',toolbar=no,height='+theHeight+',width='+theWidth+',top='+theTop+',left='+theLeft;
theWin = window.open(url, name, features);
if (theWin.opener == null) theWin.opener = self;
theWin.focus();
}
function gotoPage(url) {
window.opener.location = url;
window.opener.focus();
window.close();
}
function getQueryStringVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split('=');
if (pair[0] == variable) {
return pair[1];
}
}
}
function hideDiv() {
document.getElementById('wthvideo').style.visibility = 'hidden';
}
/** End - Generic functions **/
/**  Start - Validate functions **/
function ValidateUnsubscribeForm() {
document.unsubscribe.email.value = trimInput(document.unsubscribe.email.value);
if (document.unsubscribe.email.value == "") {
document.unsubscribe.email.focus();
alert("Please enter email address.");
return false;
} else if (document.unsubscribe.email.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.unsubscribe.email.focus();
alert("Please enter a valid email address.");
return false;
}
return true;
}
function ValidateContactUsForm() {
document.contactUsForm.email.value = trimInput(document.contactUsForm.email.value);
if (document.contactUsForm.email.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.contactUsForm.email.focus();
alert("Please provide a valid email address.");
return false;
}
else if (document.contactUsForm.message.value == "") {
document.contactUsForm.message.focus();
alert("Message is required.");
return false;
}
return true;
}
function ValidateSmartSearch() {
if (document.smartsearch.searchstring.value == "" || document.smartsearch.searchstring.value == "City & State, or Zip") {
document.smartsearch.searchstring.focus();
alert("Please enter a valid search string.");
return false;
}
return true;
}
function ValidateWelcomeOpenerRedirect(url) {
if (ValidateWelcome() == true) {
var query = "";
if (url.indexOf("?") > 0) {
query += "&";
} else {
query += "?";
}
query += "post=true&";
if (document.welcome.promotion != null && document.welcome.promotion.checked == true) {
query+="promotion=true";
}
window.opener.eval("properClickThrough = true;");
window.opener.location.href=url+query+"&custemail="+document.welcome.custemail.value+"&custzip="+document.welcome.custzip.value;
window.opener.focus();
window.close();
}
return false;
}
function ValidateWelcomeParentRedirect(url) {
if (ValidateWelcome() == true) {
var query = "";
if (url.indexOf("?") > 0) {
query += "&";
} else {
query += "?";
}
query += "post=true&";
if (document.welcome.promotion != null && document.welcome.promotion.checked == true) {
query+="promotion=true";
}
window.top.eval("properClickThrough = true;");
window.top.location.href=url+query+"&custemail="+document.welcome.custemail.value+"&custzip="+document.welcome.custzip.value;
}
return false;
}
function ValidateMainSearchEmail() {
document.mainsearch.custemail.value = trimCustomerEmail(document.mainsearch.custemail.value);
if (document.mainsearch.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.mainsearch.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.mainsearch.custemail.value.indexOf("www.") == 0) {
document.mainsearch.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
}
function validateCountySearch() {
if (document.countysearch.state.selectedIndex == 0) {
alert("Please select a state and county");
return false;
} else if (document.countysearch.county.selectedIndex == 0) {
alert("Please select a county");
return false;
}
}
function checkValidPhoneAreaCode(areaCode) {
var flag = false;
areaCode.scan('[2-9](?!(?=00|11|22|33|44|55|66|77|88))[0-8]\\d',function() {
flag = true;
});
if (flag!=true) {
alert("Please enter a valid area code.");
}
return flag;
}
function checkValidPhoneMiddleNumber(telephoneNumber) {
var flag = true;
telephoneNumber.scan('555|[01]\\d\\d',function() {
flag = false;
});
if (flag!=true) {
alert("Please enter a valid telephone number.");
}
return flag;
}
/**  End - Validate functions **/
/** Start - Homepage functions **/
function changeText() {
var changetext = document.getElementById("changetext");
var total = 1;
try { total = numOfText; }
catch (x) { }
var duration = 5000;
try { duration = numOfSeconds * 1000; }
catch (x) { }
if (total <= current) {
current = 0;
}
if (total > current) {
if (current == 0) { changetext.innerHTML = text1; }
else if (current == 1) { changetext.innerHTML = text2; }
else if (current == 2) { changetext.innerHTML = text3; }
else if (current == 3) { changetext.innerHTML = text4; }
else if (current == 4) { changetext.innerHTML = text5; }
else if (current == 5) { changetext.innerHTML = text6; }
else if (current == 6) { changetext.innerHTML = text7; }
else if (current == 7) { changetext.innerHTML = text8; }
else if (current == 8) { changetext.innerHTML = text9; }
else if (current == 9) { changetext.innerHTML = text10; }
current += 1;
}
if (total > 1) {
setTimeout("changeText()", duration);
}
}
function changeTestimonial() {
var changetext = document.getElementById("testimonialtext");
var total = 1;
try { total = numOfTestimonial; }
catch (x) { }
var durationTestimonial = 5000;
try { durationTestimonial = numOfSecondsTestimonial * 1000; }
catch (x) { }
if (total <= currentTestimonial) {
currentTestimonial = 0;
}
if (total > currentTestimonial) {
if (currentTestimonial == 0) { changetext.innerHTML = testimonial1; }
else if (currentTestimonial == 1) { changetext.innerHTML = testimonial2; }
else if (currentTestimonial == 2) { changetext.innerHTML = testimonial3; }
else if (currentTestimonial == 3) { changetext.innerHTML = testimonial4; }
else if (currentTestimonial == 4) { changetext.innerHTML = testimonial5; }
else if (currentTestimonial == 5) { changetext.innerHTML = testimonial6; }
else if (currentTestimonial == 6) { changetext.innerHTML = testimonial7; }
else if (currentTestimonial == 7) { changetext.innerHTML = testimonial8; }
else if (currentTestimonial == 8) { changetext.innerHTML = testimonial9; }
else if (currentTestimonial == 9) { changetext.innerHTML = testimonial10; }
currentTestimonial += 1;
}
if (total > 1) {
setTimeout("changeTestimonial()", durationTestimonial);
}
}
/** End - Homepage functions **/
/** Start - Popup page functions **/
function closePopup() {
window.close();
}
function openRepExamplesPopUp() {
helpwin = window.open('/sales/rep/get-listed-screenshots.jsp', 'content','scrollbars=yes,toolbar=no,width=560,height=530')
helpwin.focus();
}
function openHFRepExamplesPopUp() {
helpwin = window.open('/sales/rep/get-listed-screenshots-hf.jsp', 'content','scrollbars=no,toolbar=no,width=560,height=530')
helpwin.focus();
}
function openFFContactUsPopUp() {
openCenterWin("/contact-form.do", "_blank", 648, 600, "yes");
}
function openFlashTutorial() {
openCenterWin("http://" + location.host + "/member/tutorial.jsp","flashTutorial",680,480);
}
function openTutorial(url) {
openCenterWin(url, 'htmlTutorial', 780, 480, 'yes');
if (window.opener != null) {
window.close();
}
}
function openPrivacyPopUp() {
helpwin = window.open('/privacy-policy.do', 'help','scrollbars=yes,toolbar=no,width=750,height=480');
helpwin.focus();
}
function openContactUsPopUp() {
helpwin = window.open('/contact-form.do', 'help','scrollbars=yes,toolbar=no,width=794,height=548')
helpwin.focus();
}
/** End - Popup page functions **/
/** Start - SRP page functions **/
function openPropertyDetails(url) {
var sound = document.getElementById("sound")
if (sound) {
sound.src = "/images/click.wav";
}
newWin = window.open(url,'_blank','scrollbars=yes,toolbar=no,resizable=yes,width=768,height=540');
newWin.focus();
}
function showListingMessage(url) {
var status = confirm("You must LOG IN to view property details. Click \"OK\" to create a username and password.");
if (status) {
document.location.href = url;
}
}
function showSortByMessage(url) {
var status = confirm("This feature is available for REGISTERED MEMBERS only. Click \"OK\" to complete registration.");
if (status) {
document.location.href = url;
}
}
function showIconMessage(url) {
var status = confirm("This feature is available for REGISTERED MEMBERS only. Click \"OK\" to complete registration.");
if (status) {
document.location.href = url;
}
}
function editSavedTeaserItem(propertyid,checkboxID) {
var checkedValue;
if($(checkboxID).checked == true) {
checkedValue = "false";
} else {
checkedValue = "true";
}
editSavedTeaser(propertyid,checkedValue);
}
function editSavedTeaserItemAndToggleHide(propertyid,id) {
if(typeof editSavedTeaserItemAndToggleHide.checked =='undefined') editSavedTeaserItemAndToggleHide.checked="false";
if(editSavedTeaserItemAndToggleHide.checked == "true") {
$(id).show();
editSavedTeaserItemAndToggleHide.checked = "false";
} else {
$(id).hide();
editSavedTeaserItemAndToggleHide.checked = "true";
}
editSavedTeaser(propertyid,editSavedTeaserItemAndToggleHide.checked);
}
function editSavedTeaser(propertyid,flag) {
new Ajax.Request('/sales/nottobesaved.do?nottobesaved='+flag+'&propertyid='+propertyid);
}
/** End - SRP page functions **/
/** Start - Interstitial/Confirmation page functions **/
function getUpSellRegistration(productId,regProductId, transactionId, prodCampaignId, uType, formId, formName) {
var strURL = '/reg-upsell-serv.do';
xmlHttp = getXmlHttpObject();
strURL += '?utype=' + uType + '&formId=' + formId + '&formName=' + formName;
xmlHttp.onreadystatechange= setProcessUpSellRegistration;
xmlHttp.open("GET",strURL,true);
xmlHttp.send(null);
}
function setProcessUpSellRegistration() {
if (xmlHttp.readyState == 4) {
var _response = xmlHttp.responseXML;
var xroot = _response.getElementsByTagName('upsell-form').item(0);
var upsellResponse = "0";
var formId = "0";
var formName = "0";
var initialPageLoad = "i";
var successResponse = "s";
var failedResponse  = "f";
var preDisplay = "";
var postDisplay = "";
var imagePrefix = "i";
var preImageDisplay = "";
var postImageDisplay = "";
try {
upsellResponse = xroot.getElementsByTagName('feedback')[0].childNodes[0].nodeValue;
}
catch(e) { }
try {
formId = xroot.getElementsByTagName('formId')[0].childNodes[0].nodeValue;
}
catch(e) { }
try {
formName = xroot.getElementsByTagName('formName')[0].childNodes[0].nodeValue;
}
catch(e) { }
preDisplay = formName + initialPageLoad;
preImageDisplay = formName + imagePrefix + initialPageLoad;
hidelayer(preDisplay);
hidelayer(preImageDisplay);
if (upsellResponse == '1') {
postDisplay = formName + successResponse;
postImageDisplay = formName + imagePrefix + successResponse;
}
else {
postDisplay = formName + failedResponse;
postImageDisplay = formName + imagePrefix + failedResponse;
}
showlayer(postDisplay);
showlayer(postImageDisplay);
selectNextMethod(formId);
}
}
function displayProcessUpSellRegistration() {
hidelayer("submitButton");
hidelayer("feedback-pre");
showlayer("feedback-post");
setTimeout('processInterstitialConfirmation()', 3000);
}
function processInterstitialUpGrade(productId, regProductId, transactionId, campaignId, prodCampaignId, uType, formId, formName) {
hidelayer("submitButton");
showlayer("feedback-pre");
getUpSellRegistration(productId, regProductId, transactionId, prodCampaignId, uType, formId, formName);
}
function processUpsell(productId, regProductId, transactionId, campaignId, prodCampaignId, uType, formId, formName) {
processInterstitialUpGrade(productId, regProductId, transactionId, campaignId, prodCampaignId, uType, formId, formName);
}
function processInterstitialConfirmation() {
document.getElementById("interstitial").submit();
}
function displayProductDescription(productId)  {
document.all.description.innerHTML = description[productId];
}
/** End - Interstitial/Confirmation page functions **/
/** Start - Lightbox functions **/
function ShowEBookDiv() {
document.getElementById("bglayer").style.display = "inline";
document.getElementById("bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("eBookDiv").style.left = Math.round((document.body.clientWidth/2)-(600/2)) + "px";
document.getElementById("eBookDiv").style.top = "70px";
}
function hideEBookDiv() {
document.getElementById("bglayer").style.display = "none";
}
function ShowCCDiv() {
document.getElementById("bglayer").style.display = "inline";
document.getElementById("bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("ccDiv").style.left = Math.round((document.body.clientWidth/2)-(650/2)) + "px";
document.getElementById("ccDiv").style.top = "70px";
scroll(0,0);
}
function hideCCDiv() {
document.getElementById("bglayer").style.display = "none";
}
function showMessageDiv() {
window.location.hash = "messageDiv";
pageTracker._trackPageview(getTrackingUrl());
document.getElementById("message-bglayer").style.display = "inline";
document.getElementById("message-bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("messageDiv").style.left = Math.round((document.body.clientWidth/2)-(460/2)) + "px";
document.getElementById("messageDiv").style.top = (getScrollTop() + 100) + "px";
}
function closeMessageDiv() {
document.getElementById("message-bglayer").style.display = "none";
}
function showPropertyDetailsDiv(url) {
window.location.hash = "propertyDetailsDiv";
pageTracker._trackPageview(getTrackingUrl());
document.getElementById("propertydetails-bglayer").style.display = "inline";
document.getElementById("propertydetails-bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("propertyDetailsDiv").style.left = Math.round((document.body.clientWidth/2)-(800/2)) + "px";
document.getElementById("propertyDetailsDiv").style.top = (getScrollTop() + 15) + "px";
document.getElementById("propertyDetailsFrame").src = "";
var ifrm = document.getElementById("propertyDetailsFrame");
ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write("<html><body><div align='center' style='margin-top:200px;'><img src='/images/common/loading.gif' alt=''/></div></body></html>");
ifrm.document.close();
document.getElementById("propertyDetailsFrame").src = url;
}
function closePropertyDetailsDiv() {
document.getElementById("propertydetails-bglayer").style.display = "none";
document.getElementById("propertyDetailsFrame").src = "";
}
function showReportSampleDiv() {
window.location.hash = "reportSampleDiv";
pageTracker._trackPageview(getTrackingUrl());
document.getElementById("reportsample-bglayer").style.display = "inline";
document.getElementById("reportsample-bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("reportSampleDiv").style.left = Math.round((document.body.clientWidth/2)-(714/2)) + "px";
document.getElementById("reportSampleDiv").style.top = (getScrollTop() + 15) + "px";
if (document.welcome.linkAction.value == "5") {
document.getElementById("frameTd").style.height = "400px";
document.getElementById("reportSampleDiv").style.height = "400px";
document.getElementById("reportSampleFrame").style.height = "390px";
}
var ifrm = document.getElementById("reportSampleFrame");
ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write("<html><body><div align='center' style='margin-top:160px;'><img src='/images/common/loading.gif' alt=''/></div></body></html>");
ifrm.document.close();
document.getElementById("reportSampleFrame").src = "http://www.smartzip.com/html/sample.html";
}
function closeReportSampleDiv() {
document.getElementById("reportsample-bglayer").style.display = "none";
document.getElementById("reportSampleFrame").src = "";
}
function closeDiv() {
document.getElementById("bglayer").style.display = "none";
}
function getScrollTop() {
var scrOfY = 0;
if( typeof( window.pageYOffset ) == 'number' ) {
scrOfY = window.pageYOffset;
} else if( document.body && document.body.scrollTop) {
scrOfY = document.body.scrollTop;
} else if( document.documentElement && document.documentElement.scrollTop) {
scrOfY = document.documentElement.scrollTop;
}
return scrOfY;
}
/** End - Lightbox functions **/
/** Start - FAQs page functions **/
function expand(strId, qn, ans, status) {
var question = document.getElementById("faq" + strId);
var answer = document.getElementById("ans" + strId);
if (status == "true") {
question.innerHTML = "<a class='hyperlinktext' href=\"javascript: expand('" + strId + "', '" + qn + "', '" + ans + "', 'false')\"><u>" + qn + "</u></a>";
answer.innerHTML = ans + "<br/><br/>";
}
else if (status == "false") {
question.innerHTML = "<a class='hyperlinktext' href=\"javascript: expand('" + strId + "', '" + qn + "', '" + ans + "', 'true')\"><u>" + qn + "</u></a>";
answer.innerHTML = "";
}
}
/** End - FAQs page functions **/
/** Start - Account page functions **/
function modifyButton1(domElement) {
domElement.style.cursor = "wait";
domElement.onmouseover = "this.style.cursor='wait'";
domElement["onclick"] = "";
document.button1Form.submit();
}
function modifyButton2(domElement) {
domElement.style.cursor = "wait";
domElement.onmouseover = "this.style.cursor='wait'";
domElement["onclick"] = "";
document.button2Form.submit();
}
function modifyExtendButton(domElement) {
domElement.style.cursor = "wait";
domElement.onmouseover = "this.style.cursor='wait'";
domElement["onclick"] = "";
document.membershipExtendForm.submit();
}
/** End - Account page functions **/
function checkCCDetailsPopupForm() {
if (document.offer.ccnumber.value.indexOf("-") > 0) {
document.offer.ccnumber.value = document.offer.ccnumber.value.replace(/-/g, "");
}
if (isNaN(document.offer.ccnumber.value) || document.offer.ccnumber.value.length < 13) {
document.offer.ccnumber.focus();
alert("Please provide a valid Credit Card #");
return false;
}
else {
return true;
}
}
function createTestimonialsPagination() {
var numOfPages = document.testimonials.numOfPages.value;
for (i=1; i <= numOfPages; i++) {
x = document.getElementById("testimonials-page-" + i);
x.style.visibility = "hidden";
x.style.display = "none";
}
showlayer("testimonials-page-1");
updateTestimonialsPagination(1);
}
function goToTestimonialPage(page) {
var numOfPages = document.testimonials.numOfPages.value;
for (i=1; i <= numOfPages; i++) {
x = document.getElementById("testimonials-page-" + i);
x.style.visibility = "hidden";
x.style.display = "none";
}
showlayer("testimonials-page-" + page);
updateTestimonialsPagination(page);
location.href = "#";
var leftbg = document.getElementById("leftbg");
if (leftbg != null) {
leftbg.style.backgroundImage = "url('/images/realtystore/sales/testimonials/lhs_bg_pg" + page + ".jpg')";
}
}
function updateTestimonialsPagination(currentPage) {
var pagingMaxSize = 10;
var numOfPages = document.testimonials.numOfPages.value;
var paginationHtml = "";
if (currentPage > 1) {
paginationHtml += "<a style='font-size:12px;' href='javascript:goToTestimonialPage(" + (currentPage - 1) + ")'>&lt;&lt; prev&hellip;</a>&#160;<span class='paging-separator'>&#160;</span>";
}
var start = 1;
if (numOfPages > pagingMaxSize) {
if (currentPage > (pagingMaxSize/2)) {
start = currentPage - (pagingMaxSize/2);
}
if (numOfPages - start < pagingMaxSize) {
start = numOfPages - (pagingMaxSize - 1);
}
}
var count = 0;
for (i=start; i <= numOfPages && count < pagingMaxSize; i++) {
count += 1;
paginationHtml += "<a href='javascript:goToTestimonialPage(" + i + ")' class='paging";
if (currentPage == i) { paginationHtml += " highlighted"; }
paginationHtml += "'>" + i + "</a>";
paginationHtml += "<span class='paging-separator'>&#160;</span>";
}
if (currentPage < numOfPages) {
paginationHtml += "<span class='paging-separator'>&#160;</span><a style='font-size:12px;' href='javascript:goToTestimonialPage(" + (currentPage + 1) + ")'>&hellip;next &gt;&gt;</a>";
}
document.getElementById("pagination-area").innerHTML = paginationHtml;
}
;
/*
* secure.js - Functions for Secure Pages
*/
function ValidateCustomerFields() {
document.register.custemail.value = trimCustomerEmail(document.register.custemail.value);
if (document.register.custfname.value == "") {
document.register.custfname.focus();
alert("Please provide first name.");
return false;
}
else if (document.register.custlname.value == "") {
document.register.custlname.focus();
alert("Please provide last name.");
return false;
}
else if (document.register.phone1.value.search(/^\d{3}$/) == -1 ||
document.register.phone2.value.search(/^\d{3}$/) == -1 ||
document.register.phone3.value.search(/^\d{4}$/) == -1) {
document.register.phone1.focus();
alert("Please provide a valid phone number.");
return false;
}
else if (document.register.custaddress.value == "") {
document.register.custaddress.focus();
alert("Please provide a street address.");
return false;
}
else if (document.register.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.register.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
else if (document.register.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.register.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.register.custemail.value.indexOf("www.") == 0) {
document.register.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
return true;
}
function ValidateCCFields() {
try {
var x = document.register.othercctype.options[document.register.othercctype.selectedIndex].text;
if (document.register.cctype.options[document.register.cctype.selectedIndex].text == "Other Options") {
if (x == "Use Check") {
if (document.register.checkaccountname.value == "") {
document.register.checkaccountname.focus();
alert("Please provide a valid name on the account");
return false;
}
else if (document.register.checkroutingnumber.value.length < 9) {
document.register.checkroutingnumber.focus();
alert("Bank Routing Number must be 9-digits.");
return false;
}
else if (document.register.checkaccountnumber.value.length < 10) {
document.register.checkaccountnumber.focus();
alert("Account Number must be 10-digits.");
return false;
}
return true;
}
else {
document.register.othercctype.focus();
alert("Please select a Credit Card option.");
return false;
}
}
} catch (e) { }
CheckCCNumber();
if (document.register.cctype.selectedIndex == 0) {
document.register.cctype.focus();
alert("Please select a credit card type.");
return false;
}
else if (isNaN(document.register.ccnumber.value) || document.register.ccnumber.value.length < 13) {
document.register.ccnumber.focus();
alert("Please provide a valid Credit Card #");
return false;
}
else if (document.register.ccmonth.value == "null") {
alert("You have entered an invalid credit card expiration month.");
document.register.ccmonth.focus();
return false;
}
else if (document.register.ccyear.value == "null") {
alert("You have entered an invalid credit card expiration year.");
document.register.ccyear.focus()
return false;
}
else if (isNaN(document.register.cccvv2.value) || document.register.cccvv2.value.length < document.register.cccvv2.maxLength) {
var card = document.register.cctype.options[document.register.cctype.selectedIndex].text;
if (document.register.cctype.options[document.register.cctype.selectedIndex].value == 0) {
card = document.register.othercctype.options[document.register.othercctype.selectedIndex].text;
}
document.register.cccvv2.focus();
alert("Your " + card + " card verification number should contain " + document.register.cccvv2.maxLength + " digits. Please re-enter the full card verification number.");
return false;
}
if (!validateCreditCardType()) {
return false;
}
return true;
}
function validateCreditCardType() {
var validCreditCardType = false;
var creditCardValidationCounter = 0;
var CREDIT_CARD_TYPE = new Array();
CREDIT_CARD_TYPE[0] = "1" // Visa
CREDIT_CARD_TYPE[1] = "2" // Mastercard
CREDIT_CARD_TYPE[2] = "3" // American Express
CREDIT_CARD_TYPE[3] = "4" // Discover
var AMEX_PREFIX = new Array();
AMEX_PREFIX[0] = "34";
AMEX_PREFIX[1] = "37";
var DISCOVER_PREFIX = new Array();
DISCOVER_PREFIX[0] = "65";
DISCOVER_PREFIX[1] = "6011";
var MASTERCARD_PREFIX = new Array();
MASTERCARD_PREFIX[0] = "51";
MASTERCARD_PREFIX[1] = "52";
MASTERCARD_PREFIX[2] = "53";
MASTERCARD_PREFIX[3] = "54";
MASTERCARD_PREFIX[4] = "55";
var VISA_PREFIX = new Array();
VISA_PREFIX[0] = "4";
var creditCardNumber = document.register.ccnumber.value;
var creditCardType   = document.register.cctype.options[document.register.cctype.selectedIndex].value;
if (creditCardType == CREDIT_CARD_TYPE[0]) {
if (creditCardNumber.substring(0,1) == VISA_PREFIX[0]) {
validCreditCardType = true;
}
if (!validCreditCardType) {
alert('Please confirm your Visa card number corresponds to the Visa card type');
}
}
if (creditCardType == CREDIT_CARD_TYPE[1]) {
for (i = 0; i < MASTERCARD_PREFIX.length; i++) {
if (creditCardNumber.substring(0,2) == MASTERCARD_PREFIX[i]) {
validCreditCardType = true;
break;
}
}
if (!validCreditCardType) {
alert('Please confirm your Mastercard number corresponds to the Mastercard card type');
}
}
if (creditCardType == CREDIT_CARD_TYPE[2]) {
for (i = 0; i < AMEX_PREFIX.length; i++) {
if (creditCardNumber.substring(0,2) == AMEX_PREFIX[i]) {
validCreditCardType = true;
break;
}
}
if (!validCreditCardType) {
alert('Please confirm your American Express card number corresponds to the American Express card type');
}
}
if (creditCardType == CREDIT_CARD_TYPE[3]) {
if (creditCardNumber.substring(0,2) == DISCOVER_PREFIX[0]) {
validCreditCardType = true;
}
if (creditCardNumber.substring(0,4) == DISCOVER_PREFIX[1]) {
validCreditCardType = true;
}
if (!validCreditCardType) {
alert('Please confirm your Discover card number corresponds to the Discover card type');
}
}
return validCreditCardType;
}
function ValidateTermsAndConditions() {
if(document.register.tccheck.checked == false) {
alert("You need to agree the terms and conditions to continue....");
return false;
}
return true;
}
function CheckCCNumber() {
if (document.register.ccnumber.value.indexOf("-") > 0) {
document.register.ccnumber.value = document.register.ccnumber.value.replace(/-/g, "");
}
}
function checkShortSubmitCount(noIncrementCount) {
return processCheckSubmit("short", noIncrementCount);
}
function checkSubmitAndCustInfo(noIncrementCount) {
return processCheckSubmit("custinfo", noIncrementCount);
}
function checkSubmitAndCCInfo(noIncrementCount) {
return processCheckSubmit("ccinfo", noIncrementCount);
}
function processCheckSubmit(type, noIncrementCount) {
document.register.hasjavascript.value = "true";
var doIncrementCount = (noIncrementCount != true);
if (doIncrementCount) {
submitcount++;
}
if (1 == submitcount) {
var proceed = true;
if (type == "short") {
proceed = ValidateShort;
}
else if (type == "ccinfo") {
proceed = (ValidateCCFields() && ValidateCustomerFields() && ValidateTermsAndConditions());
}
else if (type == "custinfo") {
proceed = (ValidateCustomerFields() && ValidateCCFields() && ValidateTermsAndConditions());
}
else {
proceed = (ValidateCustomerFields() && ValidateCCFields() && ValidateTermsAndConditions());
}
if (proceed) {
setCCVBVAmount();
modifySubmitButton();
oldOnBeforeUnload = window.onbeforeunload;
window.onbeforeunload = null;
return true;
}
else {
submitcount = 0;
return false;
}
}
else {
alert("Only one click on SUBMIT is needed. We are verifying your account information. Thank you for your patience.");
return false;
}
return true;
}
function checkfirst() {
if (document.register.phone1.value.length >= 3) {
document.register.phone2.focus();
}
}
function checksecond() {
if (document.register.phone2.value.length >= 3) {
document.register.phone3.focus();
}
}
function checkCardVerification() {
var x = document.register.cctype.options[document.register.cctype.selectedIndex].value;
if (x == "0") {
showlayer("displayothercc");
checkOtherOptions();
return;
}
else if (x == "5") {
showlayer("checkinfo");
hideMultipleLayers("ccinfo,displayothercc,upsell1Top,upsell1Bottom");
}
else if (x == "") {
showlayer("ccinfo");
hideMultiplelayers("displayothercc,checkinfo,upsell1Top,upsell1Bottom");
}
else {
hideMultipleLayers("displayothercc,checkinfo");
showMultipleLayers("ccinfo,upsell1Top,upsell1Bottom");
}
getCategoryRegistrationAttributes();
confirmCVV2Length();
}
function checkOtherOptions() {
var x = document.register.othercctype.options[document.register.othercctype.selectedIndex].value;
if (x == "5") {
showlayer("checkinfo");
hideMultipleLayers("ccinfo,upsell1Top,upsell1Bottom");
}
else if (x == "") {
showlayer("ccinfo");
hideMultipleLayers("checkinfo,upsell1Top,upsell1Bottom");
}
else {
hidelayer("checkinfo");
showMultipleLayers("ccinfo,upsell1Top,upsell1Bottom");
}
getCategoryRegistrationAttributes();
}
function getSelectedProduct() {
if (document.register.spid.length == undefined) {
return document.register.spid.value;
}
else {
for (i=0; i<document.register.spid.length; i++) {
if (document.register.spid[i].checked) {
return document.register.spid[i].value;
}
}
}
}
function getCategoryRegistrationAttributes() {
var strURL = '/reg-form-serv.do';
var productId = getSelectedProduct();
var categoryId = document.register.catid.value;
var creditCardId = document.register.cctype.options[document.register.cctype.selectedIndex].value;
xmlHttp = getXmlHttpObject();
var newURL = strURL + '?catid=' + categoryId + '&spid=' + productId + '&cctype=' + creditCardId;
xmlHttp.onreadystatechange= setCategoryRegistrationAttributes;
xmlHttp.open("GET",newURL,true);
xmlHttp.send(null);
}
function determineRegistrationCall() {
if (parseInt(document.register.rrc.value) > 0) {
getCategoryRegistrationAttributes();
}
if (document.register.cccvv2.maxLength == -1) {
document.register.cccvv2.maxLength = 3;
}
}
function setCategoryRegistrationAttributes() {
if (xmlHttp.readyState == 4) {
var _response = xmlHttp.responseXML;
var xroot = _response.getElementsByTagName('registration-form').item(0);
try {
document.getElementById("promo1Top").innerHTML = xroot.getElementsByTagName('promo1-top')[0].childNodes[0].nodeValue;
}
catch (e) {
document.getElementById("promo1Top").innerHTML = '';
}
try {
document.getElementById("promo1Bottom").innerHTML = xroot.getElementsByTagName('promo1-bottom')[0].childNodes[0].nodeValue;
}
catch (e) {
document.getElementById("promo1Bottom").innerHTML = '';
}
try {
document.getElementById("termsTop").innerHTML = xroot.getElementsByTagName('terms-top')[0].childNodes[0].nodeValue;
}
catch (e) {
document.getElementById("termsTop").innerHTML = '';
}
try {
document.getElementById("termsBottom").innerHTML = xroot.getElementsByTagName('terms-bottom')[0].childNodes[0].nodeValue;
}
catch (e) {
document.getElementById("termsBottom").innerHTML = '';
}
try {
document.getElementById("disclaimer").innerHTML = xroot.getElementsByTagName('disclaimer')[0].childNodes[0].nodeValue;
}
catch (e) {
document.getElementById("disclaimer").innerHTML = '';
}
displayRegistrationAttributes();
}
}
function setCCVBVAmount() {
if (document.register.cc_amount0 != undefined) {
if (document.register.spid.length == undefined) {
document.register.cc_amount.value = document.register.cc_amount0.value;
}
else {
for (i=0; i<document.register.spid.length; i++) {
if (document.register.spid[i].checked) {
document.register.cc_amount.value = document.register.elements["cc_amount" + i].value;
}
}
}
}
}
function displayRegistrationAttributes() {
var promo1Top    = document.getElementById("promo1Top");
var promo1Bottom = document.getElementById("promo1Bottom");
var termsTop      = document.getElementById("termsTop");
var termsBottom   = document.getElementById("termsBottom");
var disclaimer    = document.getElementById("disclaimer");
if (promo1Top.innerHTML != '') { showlayer("promo1Top"); }
if (promo1Top.innerHTML == '') { hidelayer("promo1Top"); }
if (promo1Bottom.innerHTML != '') { showlayer("promo1Bottom"); }
if (promo1Bottom.innerHTML == '') { hidelayer("promo1Bottom"); }
if (termsTop.innerHTML != '') { showlayer("termsTop"); }
if (termsTop.innerHTML == '') { hidelayer("termsTop"); }
if (termsBottom.innerHTML != '') { showlayer("termsBottom"); }
if (termsBottom.innerHTML == '') { hidelayer("termsBottom"); }
if (disclaimer.innerHTML != '') { showlayer("disclaimer"); }
if (disclaimer.innerHTML == '') { hidelayer("disclaimer"); }
}
function confirmCVV2Length() {
var cvv2Length = document.register.cccvv2.maxLength;
if ((cvv2Length == undefined || cvv2Length == -1) && (document.register.cctype.options[document.register.cctype.selectedIndex].text != 'American Express')) {
document.register.cccvv2.maxLength = 3;
}
else if ((cvv2Length == undefined || cvv2Length == -1) && (document.register.cctype.options[document.register.cctype.selectedIndex].text == 'American Express')) {
document.register.cccvv2.maxLength = 4;
}
else if ((cvv2Length == 3) && (document.register.cctype.options[document.register.cctype.selectedIndex].text == 'American Express')) {
document.register.cccvv2.maxLength = 4;
}
else if ((cvv2Length == 4) && (document.register.cctype.options[document.register.cctype.selectedIndex].text != 'American Express')) {
document.register.cccvv2.maxLength = 3;
document.register.cccvv2.value = '';
}
else {
}
}
function openCvv2PopUp(url) {
var x = document.register.cctype.options[document.register.cctype.selectedIndex].value;
if (x == 0) {
try {
x = document.register.othercctype.options[document.register.othercctype.selectedIndex].value;
}
catch (e) { }
}
helpwin = window.open(url + x, 'help','toolbar=no,scrollbars=yes,width=700,height=480');
helpwin.focus();
}
;
function NewWindow(url, width, height) {
strOption = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=" + width + ",height=" + height;
newWin = window.open(url, '_new', strOption);
newWin.focus();
}
function openPage(url, width, height) {
if (!width) {
width = 768;
}
if (!height) {
height = 540;
}
var sound = document.getElementById("sound");
if (sound) {
sound.src = "/images/click.wav";
}
newWin = window.open(url, '_blank', 'scrollbars=yes,toolbar=no,resizable=yes,width='+width+',height='+height+',top='+((screen.availHeight - height) / 2)+',left='+((screen.availWidth - width) / 2));
newWin.focus();
}
function openPopupWindow(url) {
strOption = "toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,copyhistory=no";
newWin = window.open(url, '_new', strOption);
newWin.focus();
window.close();
}
function printPage() {
if (window.print) {
window.print();
}
else {
var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
WebBrowser1.ExecWB(6, 2);//Use a 1 vs. a 2 for a prompting dialog box    WebBrowser1.outerHTML = "";
}
}
function changeCounty() {
page = document.forms[0].page.value;
if (page == 'index'){
document.cookie= "searchstate=" + document.forms[0].state.value +"; expires=Friday, 31-Dec-2010 05:00:00 GMT";
}
county = document.forms[0].county.value;
for(ii=0;ii<document.forms[0].county.length;ii++){
if(document.forms[0].county[ii].checked ){
county = document.forms[0].county[ii].value;
break;
}
}
url = page + ".do?county=" + county;
url+= '&state='+ document.forms[0].state.value;
window.opener.location.href=url;
window.close();
}
function searchbySelected(x) {
for (i = 0; i < document.sortform.searchby.length; i++) {
if (document.sortform.searchby[i].value == x) {
document.sortform.searchby[i].checked = true;
}
}
}
function changeZip() {
if(document.forms[0].location.value == "neighbor") {
window.opener.document.neighborhood.zipcode.value=document.forms[0].zipcode.value;;
for(ii=0;ii<document.forms[0].zipcode.length;ii++) {
if(document.forms[0].zipcode[ii].checked) {
window.opener.document.neighborhood.zipcode.value=document.forms[0].zipcode[ii].value;;
break;
}
}
}
else {
document.cookie= "searchstate=" + document.forms[0].state.value +"; expires=Friday, 31-Dec-2010 05:00:00 GMT";
window.opener.document.forms[0].zipcode.value=document.forms[0].zipcode.value;;
if (window.opener.document.forms[0].city != null ) {
window.opener.document.forms[0].city.value=document.forms[0].city.value;
}
if (window.opener.document.forms[0].state != null) {
window.opener.document.forms[0].state.value=document.forms[0].state.value;
}
for(ii=0;ii<document.forms[0].zipcode.length;ii++) {
if(document.forms[0].zipcode[ii].checked ) {
window.opener.document.forms[0].zipcode.value=document.forms[0].zipcode[ii].value;;
break;
}
}
}
window.close();
}
function changeSearchState(selectedState, page) {
if( selectedState.value == "") {
alert("Please select a state");
return false;
}
else {
document.cookie= "searchstate=" + selectedState.value +"; expires=Friday, 31-Dec-2010 05:00:00 GMT";
}
location.href=page;
}
function clearSearchState(page) {
document.cookie= "searchstate=XX; expires=Friday, 31-Dec-2010 05:00:00 GMT";
location.href=page;
}
function saveSearch(url, address, zipcode) {
if (typeof(address) == "undefined") {
address = '';
}
if (typeof(zipcode) == "undefined") {
zipcode = '';
}
tab = document.getElementById("tab");
url += (address != '' ? '&address=' + address : '') +
(zipcode != '' ? '&zipcode=' + zipcode : '') +
(tab != null ? '&tab=' + tab.value : '') + '&';
hrefStr = window.location.href;
queryStr = hrefStr.substr(hrefStr.indexOf("?") + 1);
url += queryStr;
NewWindow(url, 350, 200);
}
var recordsPerPage = 10;
currentCol = 0
previousCol = -1
var month = new Array();
month["January"] = 1;
month["Feburary"] = 2;
month["March"] = 3;
month["April"] = 4;
month["May"] = 5;
month["June"] = 6;
month["July"] = 7;
month["Auguest"] = 8;
month["September"] = 9;
month["October"] = 10;
month["Novemeber"] = 11;
month["December"] = 12;
function CompareAlpha(a, b) {
if (a[currentCol] < b[currentCol]) { return -1; }
if (a[currentCol] > b[currentCol]) { return 1; }
return 0;
}
function CompareAlphaIgnore(a, b) {
strA = a[currentCol].toLowerCase();
strB = b[currentCol].toLowerCase();
if (strA < strB) { return -1; }
else {
if (strA > strB) { return 1; }
else { return 0; }
}
}
function CompareDate(a, b) {
datA = new Date(a[currentCol]);
datB = new Date(b[currentCol]);
if (datA < datB) { return -1; }
else {
if (datA > datB) { return 1; }
else { return 0; }
}
}
function CompareDateOur(a, b) {
strA = a[currentCol].split(", ");
strAA = strA[0].split(" ");
strB = b[currentCol].split(", ");
strBB = strB[0].split(" ");
datA = new Date(strA[1], month[strAA[0]], strAA[1]);
datB = new Date(strB[1], month[strBB[0]], strBB[1]);
if (datA < datB) { return -1; }
else {
if (datA > datB) { return 1; }
else { return 0; }
}
}
function CompareNumeric(a, b) {
numA = a[currentCol]
numB = b[currentCol]
if (isNaN(numA)) { return 0;}
else {
if (isNaN(numB)) { return 0; }
else { return numA - numB; }
}
}
function SortRecords(myArray, myCol, myType) {
var myRows = myArray.length;
var myCols = myArray[0].length;
currentCol = myCol
switch (myType) {
case "a":
myArray.sort(CompareAlpha);
if (myCol == 7) { myArray.reverse(); }
break;
case "ai":
myArray.sort(CompareAlphaIgnore);
break;
case "d":
myArray.sort(CompareDate);
break;
case "do":
myArray.sort(CompareDateOur);
break;
case "n":
myArray.sort(CompareNumeric);
break;
default:
myArray.sort()
}
return 0;
}
function formatCurrency(num) {
num = num.toString().replace(/\$|\,/g,'');
if (isNaN(num)) {
num = "0";
}
sign = (num == (num = Math.abs(num)));
num = Math.floor(num*100+0.50000000001);
num = Math.floor(num/100).toString();
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
num = num.substring(0,num.length-(4*i+3)) + ',' + num.substring(num.length-(4*i+3));
}
return (((sign)?'':'-') + '$' + num);
}
function Morgcal()
{
form = document.loan
LoanAmount= form.LoanAmount.value
DownPayment= "0"
AnnualInterestRate = form.InterestRate.value/100
Years= form.NumberOfYears.value
MonthRate=AnnualInterestRate/12
NumPayments=Years*12
Prin=LoanAmount-DownPayment
MonthPayment=Math.floor((Prin*MonthRate)/(1-Math.pow((1+MonthRate),(-1*NumPayments)))*100)/100
form.NumberOfPayments.value=NumPayments
form.MonthlyPayment.value=MonthPayment
}
function sortSearchResult(sortby) {
tabParam = $('tab').value;
sortbyParam = (sortby != null ? sortby.options[sortby.selectedIndex].value : '');
url = replaceUrlParam(window.location.href, "tab", tabParam);
finalUrl = replaceUrlParam(url , "sortby", sortbyParam);
$('sortform').action = finalUrl;
ajaxAnywhere.submitAJAX();
}
function sortSearch(searchUrl) {
var sortby = document.getElementById("sortby");
url = searchUrl + (sortby ? sortby.options[sortby.selectedIndex].value : '');
var queryStr = window.location.search;
if (queryStr) {
queryStr = queryStr.substr(1); // Drop the leading "?"
var params = queryStr.split("&");
for (var i = 0; i < params.length; i++) {
var param = params[i].split("=");
if (param[0] != "sortby") {
url +=  "&" + param[0] + "=" + param[1];
}
}
}
location.href = url;
}
function advancedSearch(searchUrl) {
url = searchUrl;
var sGet = window.location.search;
if (sGet) {
sGet = sGet.substr(1); // Drop the leading "?"
var sNVPairs = sGet.split("&");
for (var i = 0; i < sNVPairs.length; i++) {
var sNV = sNVPairs[i].split("=");
if (sNV[0] != "stype") {
url +=  "&" + sNV[0] + "=" + sNV[1];
}
}
}
location.href = url;
}
function newsearch(url) {
document.location.href = url;
}
function validateState(state) {
if (!state || state == null || state.value == "") {
alert("Please select a state");
return false;
}
return true;
}
function validateRealtorState() {
var realtorState = document.getElementById("realtorState");
return validateState(realtorState);
}
function validateNeighborhoodZip() {
var zipcode = document.forms["neighborhood"].zipcode;
if (!zipcode || zipcode == null || zipcode.value == "") {
alert("Please enter a valid ZIP code");
document.forms["neighborhood"].zipcode.focus();
return false;
}
return true;
}
function validateAuctionState() {
var auctionState = document.getElementById("auctionState");
return validateState(auctionState);
}
function validateForeclosureLawState() {
var foreclosureLawState = document.getElementById("foreclosureLawState");
return validateState(foreclosureLawState);
}
function validateHousingPredictorState() {
var housingPredictorState = document.getElementById("housingPredictorState");
return validateState(housingPredictorState);
}
function validateBank() {
var bankName = document.getElementById("bankName");
if (!bankName || bankName == null || bankName.value == "") {
alert("Please select a Bank");
return false;
}
return true;
}
function validateLTLoan() {
if (document.ltloan.loantype.value == "") {
alert("Please select a loan type");
return false;
}
if (document.ltloan.zipcode.value.length != 5 && window.location['pathname'] == '/finance-news.do') {
alert("Please enter a valid ZIP code");
return false;
}
return true;
}
function validateSureHits() {
if (document.sureHits.loantype.value == "") {
alert("Please select a loan type");
return false;
}
return true;
}
function displayLTLoanOptions() {
document.write("<option value=\"\">Select a Loan</option>");
document.write("<option value=\"1\">Purchase</option>");
document.write("<option value=\"2\">Refinance</option>");
document.write("<option value=\"3\">Home Equity</option>");
}
function displayLTLoanOptionsHF() {
document.write("<option value=\"\">Select a Loan</option>");
document.write("<option value=\"1\">Purchase</option>");
document.write("<option value=\"2\">Refinance</option>");
document.write("<option value=\"3\">Home Equity</option>");
}
function displayLTLoanOptionsUF() {
document.write("<option value=\"\">Select a Loan</option>");
document.write("<option value=\"1\">Purchase</option>");
document.write("<option value=\"2\">Refinance</option>");
document.write("<option value=\"3\">Home Equity</option>");
}
function searchRealtor(url, city) {
window.location.href = url + getRealtorLocation(city);
}
function initProgress() {
Element.show('progressMsg');
}
function resetProgress() {
Effect.Fade('progressMsg');
}
function deactivateTab(elem) {
if ($(elem) != null) {
$(elem).className = 'tab not_active';
}
}
if (!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
fun.call(thisp, this[i], i, this);
}
};
}
function showAllListings(fast) {
['foreclosuresTab', 'taxSalesTab', 'tab-rent-to-own'].forEach(deactivateTab);
$('allListingsTab').className = 'tab active';
if (!fast) {
$('sortform').action = prepareTabUrl("all");
ajaxAnywhere.submitAJAX();
}
}
function showForeclosures(fast) {
['allListingsTab', 'taxSalesTab', 'tab-rent-to-own'].forEach(deactivateTab);
$('foreclosuresTab').className = 'tab active';
if (!fast) {
$('sortform').action = prepareTabUrl("fore");
ajaxAnywhere.submitAJAX();
}
}
function showTaxSales(fast) {
['allListingsTab', 'foreclosuresTab', 'tab-rent-to-own'].forEach(deactivateTab);
$('taxSalesTab').className = 'tab active';
if (!fast) {
$('sortform').action = prepareTabUrl("tax");
ajaxAnywhere.submitAJAX();
}
}
function showRentToOwn(fast) {
['allListingsTab', 'foreclosuresTab', 'taxSalesTab'].forEach(deactivateTab);
$('tab-rent-to-own').className = 'tab active';
if (! fast) {
$('sortform').action = prepareTabUrl("rto");
ajaxAnywhere.submitAJAX();
}
}
function prepareTabUrl(tab) {
$('tab').value = tab;
url = replaceUrlParam(window.location.href, "tab", tab);
finalUrl = replaceUrlParam(url , "sortby", "");
return finalUrl;
}
function replaceUrlParam(url, replaceParam, replaceValue) {
hrefStr = url.substring(0, url.indexOf("?") + 1);
queryStr = url.substr(url.indexOf("?") + 1);
if (queryStr) {
var params = queryStr.split("&");
for (var i = 0; i < params.length; i++) {
var param = params[i].split("=");
if (param[0] != replaceParam) {
hrefStr += (i > 0 ? "&" : "") + param[0] + "=" + param[1];
}
}
hrefStr += (params.length > 0 ? "&" : "") + replaceParam + "=" + replaceValue;
}
return hrefStr;
}
;
var arVersion = navigator.appVersion.split("MSIE")
var version = parseFloat(arVersion[1])
function fixPNG2(myImage) {
if ((version >= 5.5) && (version < 7) && (document.body.filters)) {
var imgID = (myImage.id) ? "id='" + myImage.id + "' " : ""
var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : ""
var imgTitle = (myImage.title) ?
"title='" + myImage.title  + "' " : "title='" + myImage.alt + "' "
var imgStyle = "display:inline-block;" + myImage.style.cssText
var strNewHTML = "<span " + imgID + imgClass + imgTitle
+ " style=\"" + "width:" + myImage.width
+ "px; height:" + myImage.height
+ "px;" + imgStyle + ";"
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+ "(src=\'" + myImage.src + "\', sizingMethod='scale');\"></span>"
myImage.outerHTML = strNewHTML
}
}
function fixPNG(element) {
if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) {
var src;
if (element.tagName=='IMG') {
if (/\.png$/.test(element.src)) {
src = element.src;
element.src = "/images/space.gif";
}
}
else {
src = element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
if (src) {
src = src[1];
element.runtimeStyle.backgroundImage="none";
}
}
if (src) element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
}
}
function ValidateZipSearchForm() {
if (document.zipsearch.zipcode != null && document.zipsearch.zipcode.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
alert("Please provide a valid zip code.");
return false;
}
}
function ValidateAdvancedSearchForm() {
if (document.advancedsearch.usezip != null && document.advancedsearch.usezip.checked == true && document.advancedsearch.zipcode != null && document.advancedsearch.zipcode.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
alert("Please provide a valid zip code.");
return false;
}
else if (document.advancedsearch.zipcode != null && document.advancedsearch.zipcode.value != "" && document.advancedsearch.zipcode.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
alert("Please provide a valid zip code.");
return false;
}
}
;
/*
Do not remove or change this notice.
overlibmws.js core module - Copyright Foteos Macrides 2002-2005. All rights reserved.
Initial: August 18, 2002 - Last Revised: June 8, 2005
This module is subject to the same terms of usage as for Erik Bosrup's overLIB,
though only a minority of the code and API now correspond with Erik's version.
See the overlibmws Change History and Command Reference via:
http://www.macridesweb.com/oltest/
Published under an open source license: http://www.macridesweb.com/oltest/license.html
Give credit on sites that use overlibmws and submit changes so others can use them as well.
You can get Erik's version via: http://www.bosrup.com/web/overlib/
*/
var OLloaded=0,pmCnt=1,pMtr=new Array(),OLcmdLine=new Array(),OLrunTime=new Array(),OLv,OLudf,
OLpct=new Array("83%","67%","83%","100%","117%","150%","200%","267%"),OLrefXY,
OLbubblePI=0,OLcrossframePI=0,OLdebugPI=0,OLdraggablePI=0,OLexclusivePI=0,OLfilterPI=0,
OLfunctionPI=0,OLhidePI=0,OLiframePI=0,OLovertwoPI=0,OLscrollPI=0,OLshadowPI=0,OLprintPI=0;
if(typeof OLgateOK=='undefined')var OLgateOK=1;
var OLp1or2c='inarray,caparray,caption,closetext,right,left,center,autostatuscap,padx,pady,'
+'below,above,vcenter,donothing',OLp1or2co='nofollow,background,offsetx,offsety,fgcolor,'
+'bgcolor,cgcolor,textcolor,capcolor,width,wrap,wrapmax,height,border,base,status,autostatus,'
+'snapx,snapy,fixx,fixy,relx,rely,midx,midy,ref,refc,refp,refx,refy,fgbackground,bgbackground,'
+'cgbackground,fullhtml,capicon,textfont,captionfont,textsize,captionsize,timeout,delay,hauto,'
+'vauto,nojustx,nojusty,fgclass,bgclass,cgclass,capbelow,textpadding,textfontclass,'
+'captionpadding,captionfontclass,sticky,noclose,mouseoff,offdelay,closecolor,closefont,'
+'closesize,closeclick,closetitle,closefontclass,decode',OLp1or2o='text,cap,close,hpos,vpos,'
+'padxl,padxr,padyt,padyb',OLp1co='label',OLp1or2=OLp1or2co+','+OLp1or2o,OLp1=OLp1co+','+'frame';
OLregCmds(OLp1or2c+','+OLp1or2co+','+OLp1co);
function OLud(v){return eval('typeof ol_'+v+'=="undefined"')?1:0;}
if(OLud('fgcolor'))var ol_fgcolor="#ccccff";
if(OLud('bgcolor'))var ol_bgcolor="#333399";
if(OLud('cgcolor'))var ol_cgcolor="#333399";
if(OLud('textcolor'))var ol_textcolor="#000000";
if(OLud('capcolor'))var ol_capcolor="#ffffff";
if(OLud('closecolor'))var ol_closecolor="#eeeeff";
if(OLud('textfont'))var ol_textfont="Verdana,Arial,Helvetica";
if(OLud('captionfont'))var ol_captionfont="Verdana,Arial,Helvetica";
if(OLud('closefont'))var ol_closefont="Verdana,Arial,Helvetica";
if(OLud('textsize'))var ol_textsize=1;
if(OLud('captionsize'))var ol_captionsize=1;
if(OLud('closesize'))var ol_closesize=1;
if(OLud('fgclass'))var ol_fgclass="";
if(OLud('bgclass'))var ol_bgclass="";
if(OLud('cgclass'))var ol_cgclass="";
if(OLud('textpadding'))var ol_textpadding=2;
if(OLud('textfontclass'))var ol_textfontclass="";
if(OLud('captionpadding'))var ol_captionpadding=2;
if(OLud('captionfontclass'))var ol_captionfontclass="";
if(OLud('closefontclass'))var ol_closefontclass="";
if(OLud('close'))var ol_close="Close";
if(OLud('closeclick'))var ol_closeclick=0;
if(OLud('closetitle'))var ol_closetitle="Click to Close";
if(OLud('text'))var ol_text="Default Text";
if(OLud('cap'))var ol_cap="";
if(OLud('capbelow'))var ol_capbelow=0;
if(OLud('background'))var ol_background="";
if(OLud('width'))var ol_width=200;
if(OLud('wrap'))var ol_wrap=0;
if(OLud('wrapmax'))var ol_wrapmax=0;
if(OLud('height'))var ol_height= -1;
if(OLud('border'))var ol_border=1;
if(OLud('base'))var ol_base=0;
if(OLud('offsetx'))var ol_offsetx=10;
if(OLud('offsety'))var ol_offsety=10;
if(OLud('sticky'))var ol_sticky=0;
if(OLud('nofollow'))var ol_nofollow=0;
if(OLud('noclose'))var ol_noclose=0;
if(OLud('mouseoff'))var ol_mouseoff=0;
if(OLud('offdelay'))var ol_offdelay=300;
if(OLud('hpos'))var ol_hpos=RIGHT;
if(OLud('vpos'))var ol_vpos=BELOW;
if(OLud('status'))var ol_status="";
if(OLud('autostatus'))var ol_autostatus=0;
if(OLud('snapx'))var ol_snapx=0;
if(OLud('snapy'))var ol_snapy=0;
if(OLud('fixx'))var ol_fixx= -1;
if(OLud('fixy'))var ol_fixy= -1;
if(OLud('relx'))var ol_relx=null;
if(OLud('rely'))var ol_rely=null;
if(OLud('midx'))var ol_midx=null;
if(OLud('midy'))var ol_midy=null;
if(OLud('ref'))var ol_ref="";
if(OLud('refc'))var ol_refc='UL';
if(OLud('refp'))var ol_refp='UL';
if(OLud('refx'))var ol_refx=0;
if(OLud('refy'))var ol_refy=0;
if(OLud('fgbackground'))var ol_fgbackground="";
if(OLud('bgbackground'))var ol_bgbackground="";
if(OLud('cgbackground'))var ol_cgbackground="";
if(OLud('padxl'))var ol_padxl=1;
if(OLud('padxr'))var ol_padxr=1;
if(OLud('padyt'))var ol_padyt=1;
if(OLud('padyb'))var ol_padyb=1;
if(OLud('fullhtml'))var ol_fullhtml=0;
if(OLud('capicon'))var ol_capicon="";
if(OLud('frame'))var ol_frame=self;
if(OLud('timeout'))var ol_timeout=0;
if(OLud('delay'))var ol_delay=0;
if(OLud('hauto'))var ol_hauto=0;
if(OLud('vauto'))var ol_vauto=0;
if(OLud('nojustx'))var ol_nojustx=0;
if(OLud('nojusty'))var ol_nojusty=0;
if(OLud('label'))var ol_label="";
if(OLud('decode'))var ol_decode=0;
if(OLud('texts'))var ol_texts=new Array("Text 0","Text 1");
if(OLud('caps'))var ol_caps=new Array("Caption 0","Caption 1");
var o3_text="",o3_cap="",o3_sticky=0,o3_nofollow=0,o3_background="",o3_noclose=0,o3_mouseoff=0,
o3_offdelay=300,o3_hpos=RIGHT,o3_offsetx=10,o3_offsety=10,o3_fgcolor="",o3_bgcolor="",
o3_cgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",o3_width=200,o3_wrap=0,
o3_wrapmax=0,o3_height= -1,o3_border=1,o3_base=0,o3_status="",o3_autostatus=0,o3_snapx=0,
o3_snapy=0,o3_fixx= -1,o3_fixy= -1,o3_relx=null,o3_rely=null,o3_midx=null,o3_midy=null,o3_ref="",
o3_refc='UL',o3_refp='UL',o3_refx=0,o3_refy=0,o3_fgbackground="",o3_bgbackground="",
o3_cgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0,o3_fullhtml=0,o3_vpos=BELOW,
o3_capicon="",o3_textfont="Verdana,Arial,Helvetica",o3_captionfont="",o3_closefont="",
o3_textsize=1,o3_captionsize=1,o3_closesize=1,o3_frame=self,o3_timeout=0,o3_delay=0,o3_hauto=0,
o3_vauto=0,o3_nojustx=0,o3_nojusty=0,o3_close="",o3_closeclick=0,o3_closetitle="",o3_fgclass="",
o3_bgclass="",o3_cgclass="",o3_textpadding=2,o3_textfontclass="",o3_captionpadding=2,
o3_captionfontclass="",o3_closefontclass="",o3_capbelow=0,o3_label="",o3_decode=0,
CSSOFF=DONOTHING,CSSCLASS=DONOTHING,OLdelayid=0,OLtimerid=0,OLshowid=0,OLndt=0,over=null,
OLfnRef="",OLhover=0,OLx=0,OLy=0,OLshowingsticky=0,OLallowmove=0,OLcC=null,
OLua=navigator.userAgent.toLowerCase(),
OLns4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4),
OLns6=(document.getElementById)?1:0,
OLie4=(document.all)?1:0,
OLgek=(OLv=OLua.match(/gecko\/(\d{8})/i))?parseInt(OLv[1]):0,
OLmac=(OLua.indexOf('mac')>=0)?1:0,
OLsaf=(OLua.indexOf('safari')>=0)?1:0,
OLkon=(OLua.indexOf('konqueror')>=0)?1:0,
OLkht=(OLsaf||OLkon)?1:0,
OLopr=(OLua.indexOf('opera')>=0)?1:0,
OLop7=(OLopr&&document.createTextNode)?1:0;
if(OLopr){OLns4=OLns6=0;if(!OLop7)OLie4=0;}
var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0,
OLie5=0,OLie55=0;if(OLie4&&!OLop7){
if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){
OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;}if(OLns6)OLie4=0;}
if(OLns4)window.onresize=function(){location.reload();}
var OLchkMh=1,OLdw;
if(OLns4||OLie4||OLns6)OLmh();
else{overlib=nd=cClick=OLpageDefaults=no_overlib;}
/*
PUBLIC FUNCTIONS
*/
function overlib(){
if(!(OLloaded&&OLgateOK))return;
if((OLexclusivePI)&&OLisExclusive(arguments))return true;
if(OLchkMh)OLmh();
if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();
OLload(OLp1or2);OLload(OLp1);
OLfnRef="";OLhover=0;
OLsetRunTimeVar();
OLparseTokens('o3_',arguments);
if(!(over=OLmkLyr()))return false;
if(o3_decode)OLdecode();
if(OLprintPI)OLchkPrint();
if(OLbubblePI)OLchkForBubbleEffect();
if(OLdebugPI)OLsetDebugCanShow();
if(OLshadowPI)OLinitShadow();
if(OLiframePI)OLinitIfs();
if(OLfilterPI)OLinitFilterLyr();
if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")o3_status=o3_exclusivestatus;
else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;
else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;
if(!o3_delay){return OLmain();
}else{OLdelayid=setTimeout("OLmain()",o3_delay);
if(o3_status!=""){self.status=o3_status;return true;}
else if(!(OLop7&&event&&event.type=='mouseover'))return false;}
}
function nd(time){
if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){
if(time&&over&&!o3_delay){if(OLtimerid>0)clearTimeout(OLtimerid);
OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:
setTimeout("cClick()",(o3_timeout=OLndt=time));}else{
if(!OLshowingsticky){OLallowmove=0;if(over)OLhideObject(over);}}}}
return false;
}
function cClick(){
if(OLloaded&&OLgateOK){OLhover=0;if(over){
if(OLovertwoPI&&over==over2)cClick2();OLhideObject(over);OLshowingsticky=0;}}
return false;
}
function OLpageDefaults(){
OLparseTokens('ol_',arguments);
}
function no_overlib(){return false;}
/*
OVERLIB MAIN FUNCTION SET
*/
function OLmain(){
o3_delay=0;
if(o3_frame==self){if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}
if(o3_sticky)OLshowingsticky=1;OLdoLyr();OLallowmove=0;if(o3_timeout>0){
if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}
if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null){o3_ref="";o3_midx=0;o3_midy=0;}}
OLdisp(o3_status);if(OLdraggablePI)OLcheckDrag();
if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;
}
function OLload(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('o3_'+m[i]+'=ol_'+m[i]);}
function OLdoLGF(){
return (o3_background!=''||o3_fullhtml)?OLcontentBackground(o3_text,o3_background,o3_fullhtml):
(o3_cap=="")?OLcontentSimple(o3_text):
(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):OLcontentCaption(o3_text,o3_cap,'');
}
function OLmkLyr(id,f,z){
id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);
if(!d){if(OLns4)d=fd.layers[id]=new Layer(1024,f);else if(OLie4&&!document.getElementById){
fd.body.insertAdjacentHTML('BeforeEnd','<div id="'+id+'"></div>');d=fd.all[id];
}else{d=fd.createElement('div');if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;
if(OLns4)d.zIndex=z;else{var o=d.style;o.position='absolute';o.visibility='hidden';o.zIndex=z;}}
return d;
}
function OLdoLyr(){
if(o3_background==''&&!o3_fullhtml){
if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"';
if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';
if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';
if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';
if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';
if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';
if(o3_height>0)o3_height=' height="'+o3_height+'"';else o3_height='';}
if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();
if(o3_sticky&&OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}
if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);
o3_width=(OLns4?over.clip.width:over.offsetWidth);
if(OLns4&&o3_wrapmax<1)o3_wrapmax=o3_frame.innerWidth-40;
o3_wrap=0;if(o3_wrapmax>0&&o3_width>o3_wrapmax)o3_width=o3_wrapmax;lyrHtml=OLdoLGF();}
OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);
if(OLbubblePI)OLgenerateBubble(lyrHtml);
}
/*
LAYER GENERATION FUNCTIONS
*/
function OLcontentSimple(txt){
var t=OLbgLGF()+OLfgLGF(txt)+OLbaseLGF();
OLsetBackground('');return t;
}
function OLcontentCaption(txt,title,close){
var closing=(OLprintPI?OLprintCapLGF():''),closeevent='onmouseover',caption,t,
cC='javascript:return '+OLfnRef+(OLovertwoPI&&over==over2?'cClick2();':'cClick();');
if(o3_closeclick)closeevent=(o3_closetitle?'title="'+o3_closetitle+'" ':'')+'onclick';
if(o3_capicon!='')o3_capicon='<img src="'+o3_capicon+'" /> ';
if(close){closing+='<td align="right"><a href="'+cC+'" '
+closeevent+'="'+cC+'"'+(o3_closefontclass?' class="'+o3_closefontclass
+'">':'>'+OLlgfUtil(0,'','span',o3_closecolor,o3_closefont,o3_closesize))+close
+(o3_closefontclass?'':OLlgfUtil(1,'','span'))+'</a></td>';}
caption='<table'+OLwd(0)+' border="0" cellpadding="'+o3_captionpadding+'" cellspacing="0"'
+(o3_cgclass?' class="'+o3_cgclass+'"':o3_cgcolor+o3_cgbackground)+'><tr><td'+OLwd(0)
+(o3_cgclass?' class="'+o3_cgclass+'">':'>')+(o3_captionfontclass?'<div class="'
+o3_captionfontclass+'">':'<strong>'
+OLlgfUtil(0,'','div',o3_capcolor,o3_captionfont,o3_captionsize))+o3_capicon+title
+OLlgfUtil(1,'','div')+(o3_captionfontclass?'':'</strong>')+'</td>'+closing+'</tr></table>';
t=OLbgLGF()+(o3_capbelow?OLfgLGF(txt)+caption:caption+OLfgLGF(txt))+OLbaseLGF();
OLsetBackground('');return t;
}
function OLcontentBackground(txt, image, hasfullhtml){
var t;if(hasfullhtml){t=txt;}else{t='<table'+OLwd(1)
+' border="0" cellpadding="0" cellspacing="0" '+'height="'+o3_height
+'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'
+o3_padxl+'"></td><td valign="top"'+OLwd(2)+'>'
+OLlgfUtil(0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+txt+
OLlgfUtil(1,'','div')+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'
+o3_padyb+'"></td></tr></table>';}
OLsetBackground(image);return t;
}
function OLbgLGF(){
return '<table'+OLwd(1)+o3_height+' border="0" cellpadding="'+o3_border+'" cellspacing="0"'
+(o3_bgclass?' class="'+o3_bgclass+'"':o3_bgcolor+o3_bgbackground)+'><tr><td>';
}
function OLfgLGF(t){
return '<table'+OLwd(0)+o3_height+' border="0" cellpadding="'+o3_textpadding
+'" cellspacing="0"'+(o3_fgclass?' class="'+o3_fgclass+'"':o3_fgcolor+o3_fgbackground)
+'><tr><td valign="top"'+(o3_fgclass?' class="'+o3_fgclass+'"':'')+'>'
+OLlgfUtil(0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+t
+(OLprintPI?OLprintFgLGF():'')+OLlgfUtil(1,'','div')+'</td></tr></table>';
}
function OLlgfUtil(end,tfc,ele,col,fac,siz){
if(end)return ('</'+(OLns4?'font':ele)+'>');else return (tfc?'<div class="'+tfc+'">':
('<'+(OLns4?'font color="'+col+'" face="'+OLquoteMultiNameFonts(fac)+'" size="'+siz:ele
+' style="color:'+col+';font-family:'+OLquoteMultiNameFonts(fac)+';font-size:'+siz+';'
+(ele=='span'?'text-decoration:underline;':''))+'">'));
}
function OLquoteMultiNameFonts(f){
var i,v,pM=f.split(',');
for(i=0;i<pM.length;i++){v=pM[i];v=v.replace(/^\s+/,'').replace(/\s+$/,'');
if(/\s/.test(v) && !/['"]/.test(v)){v="\'"+v+"\'";pM[i]=v;}}
return pM.join();
}
function OLbaseLGF(){
return ((o3_base>0&&!o3_wrap)?('<table width="100%" border="0" cellpadding="0" cellspacing="0"'
+(o3_bgclass?' class="'+o3_bgclass+'"':'')+'><tr><td height="'+o3_base
+'"></td></tr></table>'):'')+'</td></tr></table>';
}
function OLwd(a){
return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');
}
function OLsetBackground(i){
if(i==''){if(OLns4)over.background.src=null;
else{if(OLns6)over.style.width='';over.style.backgroundImage='none';}
}else{if(OLns4)over.background.src=i;
else{if(OLns6)over.style.width=o3_width+'px';over.style.backgroundImage='url('+i+')';}}
}
/*
HANDLING FUNCTIONS
*/
function OLdisp(s){
if(!OLallowmove){if(OLshadowPI)OLdispShadow();if(OLiframePI)OLdispIfs();OLplaceLayer();
if(OLndt)OLshowObject(over);else OLshowid=setTimeout("OLshowObject(over)",1);
OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;
}
function OLplaceLayer(){
var snp,X,Y,pgLeft,pgTop,pWd=o3_width,pHt,iWd=100,iHt=100,SB=0,LM=0,CX=0,TM=0,BM=0,CY=0,
o=OLfd(),nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;
if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;
else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));
if(SB>20)SB=20;iWd=o3_frame.innerWidth;}
pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;
if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)SB=CX=5;else
if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);
LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}
if(o3_ref!=""||o3_fixx> -1||o3_relx!=null||o3_midx!=null){
if(o3_ref!=""){X=OLrefXY[0];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
if(o3_refp=='UR'||o3_refp=='LR')X-=5;}
else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){
if(o3_shadowx<0&&(o3_refp=='UL'||o3_refp=='LL'))X-=o3_shadowx;else
if(o3_shadowx>0&&(o3_refp=='UR'||o3_refp=='LR'))X-=o3_shadowx;}
}else{if(o3_midx!=null){
X=parseInt(pgLeft+((iWd-pWd-SB-LM)/2)+o3_midx);
}else{if(o3_relx!=null){
if(o3_relx>=0)X=pgLeft+o3_relx+LM;else X=pgLeft+o3_relx+iWd-pWd-SB;
}else{X=o3_fixx+LM;}}}
}else{
if(o3_hauto){
if(o3_hpos==LEFT&&OLx-pgLeft<iWd/2&&OLx-pWd-o3_offsetx<pgLeft+LM)o3_hpos=RIGHT;else
if(o3_hpos==RIGHT&&OLx-pgLeft>iWd/2&&OLx+pWd+o3_offsetx>pgLeft+iWd-SB)o3_hpos=LEFT;}
X=(o3_hpos==CENTER)?parseInt(OLx-((pWd+CX)/2)+o3_offsetx):
(o3_hpos==LEFT)?OLx-o3_offsetx-pWd:OLx+o3_offsetx;
if(o3_snapx>1){
snp=X % o3_snapx;
if(o3_hpos==LEFT){X=X-(o3_snapx+snp);}else{X=X+(o3_snapx-snp);}}}
if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)
X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;
pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;
if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;
else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;
if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;
if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;
if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)BM=CY=5;else
BM=(o3_shadowy>0)?o3_shadowy:0;CY=Math.abs(o3_shadowy);}
if(o3_ref!=""||o3_fixy> -1||o3_rely!=null||o3_midy!=null){
if(o3_ref!=""){Y=OLrefXY[1];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
if(o3_refp=='LL'||o3_refp=='LR')Y-=5;}else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){
if(o3_shadowy<0&&(o3_refp=='UL'||o3_refp=='UR'))Y-=o3_shadowy;else
if(o3_shadowy>0&&(o3_refp=='LL'||o3_refp=='LR'))Y-=o3_shadowy;}
}else{if(o3_midy!=null){
Y=parseInt(pgTop+((iHt-pHt-CY)/2)+o3_midy);
}else{if(o3_rely!=null){
if(o3_rely>=0)Y=pgTop+o3_rely+TM;else Y=pgTop+o3_rely+iHt-pHt-BM;}else{
Y=o3_fixy+TM;}}}
}else{
if(o3_vauto){
if(o3_vpos==ABOVE&&OLy-pgTop<iHt/2&&OLy-pHt-o3_offsety<pgTop)o3_vpos=BELOW;else
if(o3_vpos==BELOW&&OLy-pgTop>iHt/2&&OLy+pHt+o3_offsety+((OLns4||OLkht)?17:0)>pgTop+iHt-BM)
o3_vpos=ABOVE;}Y=(o3_vpos==VCENTER)?parseInt(OLy-((pHt+CY)/2)+o3_offsety):
(o3_vpos==ABOVE)?OLy-(pHt+o3_offsety+BM):OLy+o3_offsety+TM;
if(o3_snapy>1){
snp=Y % o3_snapy;
if(pHt>0&&o3_vpos==ABOVE){Y=Y-(o3_snapy+snp);}else{Y=Y+(o3_snapy-snp);}}}
if(!o3_nojusty&&Y+pHt+BM>pgTop+iHt)Y=pgTop+iHt-pHt-BM;if(!o3_nojusty&&Y-TM<pgTop)Y=pgTop+TM;
OLrepositionTo(over,X,Y);
if(OLshadowPI)OLrepositionShadow(X,Y);if(OLiframePI)OLrepositionIfs(X,Y);
if(OLns6&&o3_frame.innerHeight){iHt=o3_frame.innerHeight;OLrepositionTo(over,X,Y);}
if(OLscrollPI)OLchkScroll(X-pgLeft,Y-pgTop);
}
function OLfd(f){
var fd=((f)?f:o3_frame).document,fdc=fd.compatMode,fdd=fd.documentElement;
return (!OLop7&&fdc&&fdc!='BackCompat'&&fdd&&fdd.clientWidth)?fd.documentElement:fd.body;
}
function OLgetRefXY(r){
var o=OLgetRef(r),ob=o,rXY=[o3_refx,o3_refy],of;
if(!o)return [null,null];
if(OLns4){if(typeof o.length!='undefined'&&o.length>1){
ob=o[0];rXY[0]+=o[0].x+o[1].pageX;rXY[1]+=o[0].y+o[1].pageY;
}else{if((o.toString().indexOf('Image')!= -1)||(o.toString().indexOf('Anchor')!= -1)){
rXY[0]+=o.x;rXY[1]+=o.y;}else{rXY[0]+=o.pageX;rXY[1]+=o.pageY;}}
}else{rXY[0]+=OLpageLoc(o,'Left');rXY[1]+=OLpageLoc(o,'Top');}
of=OLgetRefOffsets(ob);rXY[0]+=of[0];rXY[1]+=of[1];
return rXY;
}
function OLgetRef(l){var r=OLgetRefById(l);return (r)?r:OLgetRefByName(l);}
function OLgetRefById(l,d){
var r="",j;l=(l||'overDiv');d=(d||o3_frame.document);
if(OLie4&&d.all){return d.all[l];}else if(d.getElementById){return d.getElementById(l);
}else if(d.layers&&d.layers.length>0){if(d.layers[l])return d.layers[l];
for(j=0;j<d.layers.length;j++){r=OLgetRefById(l,d.layers[j].document);if(r)return r;}}
return null;
}
function OLgetRefByName(l,d){
var r=null,j;d=(d||o3_frame.document);
if(typeof d.images[l]!='undefined'&&d.images[l]){return d.images[l];
}else if(typeof d.anchors[l]!='undefined'&&d.anchors[l]){return d.anchors[l];
}else if(d.layers&&d.layers.length>0){
for(j=0;j<d.layers.length;j++){r=OLgetRefByName(l,d.layers[j].document);
if(r&&r.length>0)return r;else if(r)return [r,d.layers[j]];}}
return null;
}
function OLgetRefOffsets(o){
var c=o3_refc.toUpperCase(),p=o3_refp.toUpperCase(),W=0,H=0,pW=0,pH=0,of=[0,0];
pW=(OLbubblePI&&o3_bubble)?o3_width:OLns4?over.clip.width:over.offsetWidth;
pH=(OLbubblePI&&o3_bubble)?OLbubbleHt:OLns4?over.clip.height:over.offsetHeight;
if((!OLop7)&&o.toString().indexOf('Image')!= -1){W=o.width;H=o.height;
}else if((!OLop7)&&o.toString().indexOf('Anchor')!= -1){c=o3_refc='UL';}else{
W=(OLns4)?o.clip.width:o.offsetWidth;H=(OLns4)?o.clip.height:o.offsetHeight;}
if((OLns4||(OLns6&&OLgek))&&o.border){W+=2*parseInt(o.border);H+=2*parseInt(o.border);}
if(c=='UL'){of=(p=='UR')?[-pW,0]:(p=='LL')?[0,-pH]:(p=='LR')?[-pW,-pH]:[0,0];
}else if(c=='UR'){of=(p=='UR')?[W-pW,0]:(p=='LL')?[W,-pH]:(p=='LR')?[W-pW,-pH]:[W,0];
}else if(c=='LL'){of=(p=='UR')?[-pW,H]:(p=='LL')?[0,H-pH]:(p=='LR')?[-pW,H-pH]:[0,H];
}else if(c=='LR'){of=(p=='UR')?[W-pW,H]:(p=='LL')?[W,H-pH]:(p=='LR')?[W-pW,H-pH]:
[W,H];}
return of;
}
function OLpageLoc(o,t){
var l=0;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){
l+=o['offset'+t];o=o.offsetParent;}l+=o['offset'+t];
return l;
}
function OLmouseMove(e){
var e=(e||event);
OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);
OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById())){
OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}
if(OLhover&&over&&o3_frame==self&&OLcursorOff())if(o3_offdelay<1)OLcC();else
{if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("OLcC()",o3_offdelay);}
}
function OLmh(){
var fN,f,j,k,s,mh=OLmouseMove,w=(OLns4&&window.onmousemove),re=/function[ ]*(\w*)\(/;
OLdw=document;if(document.onmousemove||w){if(w)OLdw=window;f=OLdw.onmousemove.toString();
fN=f.match(re);if(!fN||fN[1]=='anonymous'||fN[1]=='OLmouseMove'){OLchkMh=0;return;}
if(fN[1])s=fN[1]+'(e)';else{j=f.indexOf('{');k=f.lastIndexOf('}')+1;s=f.substring(j,k);}
s+=';OLmouseMove(e);';mh=new Function('e',s);}
OLdw.onmousemove=mh;if(OLns4)OLdw.captureEvents(Event.MOUSEMOVE);
}
/*
PARSING
*/
function OLparseTokens(pf,ar){
var i,v,md= -1,par=(pf!='ol_'),p=OLpar,q=OLparQuo,t=OLtoggle;OLudf=(par&&!ar.length?1:0);
for(i=0;i< ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}
else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;
}else{
if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[++i]+']');continue;}
if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+']');continue;}
if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}
if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}
if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}
if(ar[i]==BACKGROUND){q(ar[++i],pf+'background');continue;}
if(Math.abs(ar[i])==NOCLOSE){t(ar[i],pf+'noclose');continue;}
if(Math.abs(ar[i])==MOUSEOFF){t(ar[i],pf+'mouseoff');continue;}
if(ar[i]==OFFDELAY){p(ar[++i],pf+'offdelay');continue;}
if(ar[i]==RIGHT||ar[i]==LEFT||ar[i]==CENTER){p(ar[i],pf+'hpos');continue;}
if(ar[i]==OFFSETX){p(ar[++i],pf+'offsetx');continue;}
if(ar[i]==OFFSETY){p(ar[++i],pf+'offsety');continue;}
if(ar[i]==FGCOLOR){q(ar[++i],pf+'fgcolor');continue;}
if(ar[i]==BGCOLOR){q(ar[++i],pf+'bgcolor');continue;}
if(ar[i]==CGCOLOR){q(ar[++i],pf+'cgcolor');continue;}
if(ar[i]==TEXTCOLOR){q(ar[++i],pf+'textcolor');continue;}
if(ar[i]==CAPCOLOR){q(ar[++i],pf+'capcolor');continue;}
if(ar[i]==CLOSECOLOR){q(ar[++i],pf+'closecolor');continue;}
if(ar[i]==WIDTH){p(ar[++i],pf+'width');continue;}
if(Math.abs(ar[i])==WRAP){t(ar[i],pf+'wrap');continue;}
if(ar[i]==WRAPMAX){p(ar[++i],pf+'wrapmax');continue;}
if(ar[i]==HEIGHT){p(ar[++i],pf+'height');continue;}
if(ar[i]==BORDER){p(ar[++i],pf+'border');continue;}
if(ar[i]==BASE){p(ar[++i],pf+'base');continue;}
if(ar[i]==STATUS){q(ar[++i],pf+'status');continue;}
if(Math.abs(ar[i])==AUTOSTATUS){v=pf+'autostatus';
eval(v+'=('+ar[i]+'<0)?('+v+'==2?2:0):('+v+'==1?0:1)');continue;}
if(Math.abs(ar[i])==AUTOSTATUSCAP){v=pf+'autostatus';
eval(v+'=('+ar[i]+'<0)?('+v+'==1?1:0):('+v+'==2?0:2)');continue;}
if(ar[i]==CLOSETEXT){q(ar[++i],pf+'close');continue;}
if(ar[i]==SNAPX){p(ar[++i],pf+'snapx');continue;}
if(ar[i]==SNAPY){p(ar[++i],pf+'snapy');continue;}
if(ar[i]==FIXX){p(ar[++i],pf+'fixx');continue;}
if(ar[i]==FIXY){p(ar[++i],pf+'fixy');continue;}
if(ar[i]==RELX){p(ar[++i],pf+'relx');continue;}
if(ar[i]==RELY){p(ar[++i],pf+'rely');continue;}
if(ar[i]==MIDX){p(ar[++i],pf+'midx');continue;}
if(ar[i]==MIDY){p(ar[++i],pf+'midy');continue;}
if(ar[i]==REF){q(ar[++i],pf+'ref');continue;}
if(ar[i]==REFC){q(ar[++i],pf+'refc');continue;}
if(ar[i]==REFP){q(ar[++i],pf+'refp');continue;}
if(ar[i]==REFX){p(ar[++i],pf+'refx');continue;}
if(ar[i]==REFY){p(ar[++i],pf+'refy');continue;}
if(ar[i]==FGBACKGROUND){q(ar[++i],pf+'fgbackground');continue;}
if(ar[i]==BGBACKGROUND){q(ar[++i],pf+'bgbackground');continue;}
if(ar[i]==CGBACKGROUND){q(ar[++i],pf+'cgbackground');continue;}
if(ar[i]==PADX){p(ar[++i],pf+'padxl');p(ar[++i],pf+'padxr');continue;}
if(ar[i]==PADY){p(ar[++i],pf+'padyt');p(ar[++i],pf+'padyb');continue;}
if(Math.abs(ar[i])==FULLHTML){t(ar[i],pf+'fullhtml');continue;}
if(ar[i]==BELOW||ar[i]==ABOVE||ar[i]==VCENTER){p(ar[i],pf+'vpos');continue;}
if(ar[i]==CAPICON){q(ar[++i],pf+'capicon');continue;}
if(ar[i]==TEXTFONT){q(ar[++i],pf+'textfont');continue;}
if(ar[i]==CAPTIONFONT){q(ar[++i],pf+'captionfont');continue;}
if(ar[i]==CLOSEFONT){q(ar[++i],pf+'closefont');continue;}
if(ar[i]==TEXTSIZE){q(ar[++i],pf+'textsize');continue;}
if(ar[i]==CAPTIONSIZE){q(ar[++i],pf+'captionsize');continue;}
if(ar[i]==CLOSESIZE){q(ar[++i],pf+'closesize');continue;}
if(ar[i]==TIMEOUT){p(ar[++i],pf+'timeout');continue;}
if(ar[i]==DELAY){p(ar[++i],pf+'delay');continue;}
if(Math.abs(ar[i])==HAUTO){t(ar[i],pf+'hauto');continue;}
if(Math.abs(ar[i])==VAUTO){t(ar[i],pf+'vauto');continue;}
if(Math.abs(ar[i])==NOJUSTX){t(ar[i],pf+'nojustx');continue;}
if(Math.abs(ar[i])==NOJUSTY){t(ar[i],pf+'nojusty');continue;}
if(Math.abs(ar[i])==CLOSECLICK){t(ar[i],pf+'closeclick');continue;}
if(ar[i]==CLOSETITLE){q(ar[++i],pf+'closetitle');continue;}
if(ar[i]==FGCLASS){q(ar[++i],pf+'fgclass');continue;}
if(ar[i]==BGCLASS){q(ar[++i],pf+'bgclass');continue;}
if(ar[i]==CGCLASS){q(ar[++i],pf+'cgclass');continue;}
if(ar[i]==TEXTPADDING){p(ar[++i],pf+'textpadding');continue;}
if(ar[i]==TEXTFONTCLASS){q(ar[++i],pf+'textfontclass');continue;}
if(ar[i]==CAPTIONPADDING){p(ar[++i],pf+'captionpadding');continue;}
if(ar[i]==CAPTIONFONTCLASS){q(ar[++i],pf+'captionfontclass');continue;}
if(ar[i]==CLOSEFONTCLASS){q(ar[++i],pf+'closefontclass');continue;}
if(Math.abs(ar[i])==CAPBELOW){t(ar[i],pf+'capbelow');continue;}
if(ar[i]==LABEL){q(ar[++i],pf+'label');continue;}
if(Math.abs(ar[i])==DECODE){t(ar[i],pf+'decode');continue;}
if(ar[i]==DONOTHING){continue;}
i=OLparseCmdLine(pf,i,ar);}}
if((OLfunctionPI)&&OLudf&&o3_function)o3_text=o3_function();
if(pf=='o3_')OLfontSize();
}
function OLpar(a,v){eval(v+'='+a);}
function OLparQuo(a,v){eval(v+"='"+OLescSglQt(a)+"'");}
function OLescSglQt(s){return s.toString().replace(/'/g,"\\'");}
function OLtoggle(a,v){eval(v+'=('+v+'==0&&'+a+'>=0)?1:0');}
function OLhasDims(s){return /[%\-a-z]+$/.test(s);}
function OLfontSize(){
var i;if(OLhasDims(o3_textsize)){if(OLns4)o3_textsize="2";}else
if(!OLns4){i=parseInt(o3_textsize);o3_textsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
if(OLhasDims(o3_captionsize)){if(OLns4)o3_captionsize="2";}else
if(!OLns4){i=parseInt(o3_captionsize);o3_captionsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
if(OLhasDims(o3_closesize)){if(OLns4)o3_closesize="2";}else
if(!OLns4){i=parseInt(o3_closesize);o3_closesize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
if(OLprintPI)OLprintDims();
}
function OLdecode(){
var re=/%[0-9A-Fa-f]{2,}/,t=o3_text,c=o3_cap,u=unescape,d=!OLns4&&(!OLgek||OLgek>=20020826)
&&typeof decodeURIComponent?decodeURIComponent:u;if(typeof(window.TypeError)=='function'){
if(re.test(t)){eval(new Array('try{','o3_text=d(t);','}catch(e){','o3_text=u(t);',
'}').join('\n'))};if(c&&re.test(c)){eval(new Array('try{','o3_cap=d(c);','}catch(e){',
'o3_cap=u(c);','}').join('\n'))}}else{if(re.test(t))o3_text=u(t);if(c&&re.test(c))o3_cap=u(c);}
}
/*
LAYER FUNCTIONS
*/
function OLlayerWrite(t){
t+="\n";
if(OLns4){over.document.write(t);over.document.close();
}else if(typeof over.innerHTML!='undefined'){if(OLieM)over.innerHTML='';over.innerHTML=t;
}else{range=o3_frame.document.createRange();range.setStartAfter(over);
domfrag=range.createContextualFragment(t);
while(over.hasChildNodes()){over.removeChild(over.lastChild);}
over.appendChild(domfrag);}
if(OLprintPI)over.print=o3_print?t:null;
}
function OLshowObject(o){
OLshowid=0;o=(OLns4)?o:o.style;
if(((OLfilterPI)&&!OLchkFilter(o))||!OLfilterPI)o.visibility="visible";
if(OLshadowPI)OLshowShadow();if(OLiframePI)OLshowIfs();if(OLhidePI)OLhideUtil(1,1,0);
}
function OLhideObject(o){
if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}
if(OLtimerid>0)clearTimeout(OLtimerid);if(OLdelayid>0)clearTimeout(OLdelayid);
OLtimerid=0;OLdelayid=0;self.status="";o3_label=ol_label;
if(o3_frame!=self)o=OLgetRefById();
if(o){if(o.onmouseover)o.onmouseover=null;
if(OLscrollPI&&o==over)OLclearScroll();
if(OLdraggablePI)OLclearDrag();
if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();
var os=(OLns4)?o:o.style;os.visibility="hidden";
if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}
}
function OLrepositionTo(o,xL,yL){
o=(OLns4)?o:o.style;
o.left=(OLns4?xL:xL+'px');
o.top=(OLns4?yL:yL+'px');
}
function OLoptMOUSEOFF(c){
if(!c)o3_close="";
over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}
}
function OLcursorOff(){
var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight,
left=parseInt(o.left),top=parseInt(o.top),
right=left+o3_width,bottom=top+((OLbubblePI&&o3_bubble)?OLbubbleHt:pHt);
if(OLx<left||OLx>right||OLy<top||OLy>bottom)return true;
return false;
}
/*
REGISTRATION
*/
function OLsetRunTimeVar(){
if(OLrunTime.length)for(var k=0;k<OLrunTime.length;k++)OLrunTime[k]();
}
function OLparseCmdLine(pf,i,ar){
if(OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){
var j=OLcmdLine[k](pf,i,ar);if(j>-1){i=j;break;}}}
return i;
}
function OLregCmds(c){
if(typeof c!='string')return;
var pM=c.split(',');pMtr=pMtr.concat(pM);
for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);
}
function OLregRunTimeFunc(f){
if(typeof f=='object')OLrunTime=OLrunTime.concat(f);
else OLrunTime[OLrunTime.length++]=f;
}
function OLregCmdLineFunc(f){
if(typeof f=='object')OLcmdLine=OLcmdLine.concat(f);
else OLcmdLine[OLcmdLine.length++]=f;
}
OLloaded=1;
;
/**
* Copyright 2005 Darren L. Spurgeon
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var AjaxJspTag = {
Version: '1.2'
}
/**
* Global Variables
*/
AJAX_DEFAULT_PARAMETER = "ajaxParameter";
AJAX_PORTLET_MAX = 1;
AJAX_PORTLET_MIN = 2;
AJAX_PORTLET_CLOSE = 3;
AJAX_CALLOUT_OVERLIB_DEFAULT = "STICKY,"
+ "CLOSECLICK,"
+ "DELAY,250,"
+ "TIMEOUT,5000,"
+ "VAUTO,WRAPMAX,240,"
+ "CSSCLASS,FGCLASS,'olfg',BGCLASS,'olbg',CGCLASS,'olcg',"
+ "CAPTIONFONTCLASS,'olcap',CLOSEFONTCLASS,'olclo',TEXTFONTCLASS,'oltxt'";
/**
* Type Detection
*/
function isAlien(a) {
return isObject(a) && typeof a.constructor != 'function';
}
function isArray(a) {
return isObject(a) && a.constructor == Array;
}
function isBoolean(a) {
return typeof a == 'boolean';
}
function isEmpty(o) {
var i, v;
if (isObject(o)) {
for (i in o) {
v = o[i];
if (isUndefined(v) && isFunction(v)) {
return false;
}
}
}
return true;
}
function isFunction(a) {
return typeof a == 'function';
}
function isNull(a) {
return typeof a == 'object' && !a;
}
function isNumber(a) {
return typeof a == 'number' && isFinite(a);
}
function isObject(a) {
return (a && typeof a == 'object') || isFunction(a);
}
function isString(a) {
return typeof a == 'string';
}
function isUndefined(a) {
return typeof a == 'undefined';
}
/**
* Utility Functions
*/
function addOnLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
oldonload();
func();
}
}
}
/*
* Extract querystring from a URL
*/
function extractQueryString(url) {
var ret = (url.indexOf('?') >= 0 && url.indexOf('?') < (url.length-1))
? url.substr(url.indexOf('?')+1)
: '';
return ret;
}
/*
* Trim the querystring from a URL
*/
function trimQueryString(url) {
var ret = url.indexOf('?') >= 0
? url.substring(0, url.indexOf('?'))
: url;
return ret;
}
function delimitQueryString(qs) {
var ret = '';
if (qs.length > 0) {
var params = qs.split('&');
for (var i=0; i<params.length; i++) {
if (i > 0) ret += ',';
ret += params[i];
}
}
return ret;
}
function buildParameterString(parameterList) {
var returnString = '';
var params = (parameterList || '').split(',');
if (params != null) {
for (var p=0; p<params.length; p++) {
var pair = params[p].split('=');
var key = pair[0];
var val = pair[1];
if (!isEmpty(val) || isString(val)) {
var varList = val.match( new RegExp("\\{[\\w\\.\\(\\)\\[\\]]*\\}", 'g') );
if (!isNull(varList)) {
var field = $(varList[0].substring(1, varList[0].length-1));
switch (field.type) {
case 'checkbox':
case 'radio':
case 'text':
case 'textarea':
case 'password':
case 'hidden':
case 'select-one':
returnString += '&' + key + '=' + encodeURIComponent(field.value);
break;
case 'select-multiple':
var fieldValue = $F(varList[0].substring(1, varList[0].length-1));
for (var i=0; i<fieldValue.length; i++) {
returnString += '&' + key + '=' + encodeURIComponent(fieldValue[i]);
}
break;
default:
returnString += '&' + key + '=' + encodeURIComponent(field.innerHTML);
break;
}
} else {
returnString += '&' + key + '=' + encodeURIComponent(val);
}
}
}
}
if (returnString.charAt(0) == '&') {
returnString = returnString.substr(1);
}
return returnString;
}
function evalBoolean(value, defaultValue) {
if (!isNull(value) && isString(value)) {
return ("true" == value.toLowerCase() || "yes" == value.toLowerCase()) ? "true" : "false";
} else {
return defaultValue == true ? "true" : "false";
}
}
/* ---------------------------------------------------------------------- */
/* Example File From "_JavaScript and DHTML Cookbook"
Published by O'Reilly & Associates
Copyright 2003 Danny Goodman
*/
function getExpDate(days, hours, minutes) {
var expDate = new Date();
if (typeof days == "number" && typeof hours == "number" && typeof hours == "number") {
expDate.setDate(expDate.getDate() + parseInt(days));
expDate.setHours(expDate.getHours() + parseInt(hours));
expDate.setMinutes(expDate.getMinutes() + parseInt(minutes));
return expDate.toGMTString();
}
}
function getCookieVal(offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1) {
endstr = document.cookie.length;
}
return unescape(document.cookie.substring(offset, endstr));
}
function getCookie(name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg) {
return getCookieVal(j);
}
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
function setCookie(name, value, expires, path, domain, secure) {
document.cookie = name + "=" + escape (value) +
((expires) ? "; expires=" + expires : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
}
function deleteCookie(name,path,domain) {
if (getCookie(name)) {
document.cookie = name + "=" +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
"; expires=Thu, 01-Jan-70 00:00:01 GMT";
}
}
/* ---------------------------------------------------------------------- */
/* End Copyright 2003 Danny Goodman */
/**
* Response Parsers
*/
AbstractResponseParser = function() {};
ResponseTextParser = Class.create();
ResponseTextParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "text";
},
load: function(request) {
this.content = request.responseText;
this.split();
},
split: function() {
this.itemList = new Array();
var lines = this.content.split('\n');
for (var i=0; i<lines.length; i++) {
this.itemList.push(lines[i].split(','));
}
}
});
ResponseXmlParser = Class.create();
ResponseXmlParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "xml";
},
load: function(request) {
this.content = request.responseXML;
this.parse();
},
parse: function() {
var root = this.content.documentElement;
var responseNodes = root.getElementsByTagName("response");
this.itemList = new Array();
if (responseNodes.length > 0) {
var responseNode = responseNodes[0];
var itemNodes = responseNode.getElementsByTagName("item");
for (var i=0; i<itemNodes.length; i++) {
var nameNodes = itemNodes[i].getElementsByTagName("name");
var valueNodes = itemNodes[i].getElementsByTagName("value");
if (nameNodes.length > 0 && valueNodes.length > 0) {
var name = nameNodes[0].firstChild.nodeValue;
var value = valueNodes[0].firstChild.nodeValue;
this.itemList.push(new Array(name, value));
}
}
}
}
});
ResponseHtmlParser = Class.create();
ResponseHtmlParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "html";
},
load: function(request) {
this.content = request.responseText;
}
});
ResponseXmlToHtmlParser = Class.create();
ResponseXmlToHtmlParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "xmltohtml";
},
load: function(request) {
this.xml = request.responseXML;
this.parse();
},
parse: function() {
this.content = '';
var root = this.xml.documentElement;
var responseNodes = root.getElementsByTagName("response");
if (responseNodes.length > 0) {
var responseNode = responseNodes[0];
var itemNodes = responseNode.getElementsByTagName("item");
for (var i=0; i<itemNodes.length; i++) {
var nameNodes = itemNodes[i].getElementsByTagName("name");
var valueNodes = itemNodes[i].getElementsByTagName("value");
if (nameNodes.length > 0 && valueNodes.length > 0) {
var name = nameNodes[0].firstChild.nodeValue;
var value = valueNodes[0].firstChild.nodeValue;
this.content += '<h1>' + name + '</h1>';
this.content += '<div>' + value + '</div>';
}
}
}
}
});
ResponseXmlToHtmlListParser = Class.create();
ResponseXmlToHtmlListParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "xmltohtmllist";
},
load: function(request) {
this.xml = request.responseXML;
this.parse();
},
parse: function() {
var ul = '<ul>';
var root = this.xml.documentElement;
var responseNodes = root.getElementsByTagName("response");
if (responseNodes.length > 0) {
var responseNode = responseNodes[0];
var itemNodes = responseNode.getElementsByTagName("item");
for (var i=0; i<itemNodes.length; i++) {
var nameNodes = itemNodes[i].getElementsByTagName("name");
var valueNodes = itemNodes[i].getElementsByTagName("value");
if (nameNodes.length > 0 && valueNodes.length > 0) {
var name = nameNodes[0].firstChild.nodeValue;
var value = valueNodes[0].firstChild.nodeValue;
ul += '<li id="' + value + '">' + name + '</li>';
}
}
}
ul += '</ul>';
this.content = ul;
}
});
ResponseXmlToHtmlLinkListParser = Class.create();
ResponseXmlToHtmlLinkListParser.prototype = Object.extend(new AbstractResponseParser(), {
initialize: function() {
this.type = "xmltohtmllinklist";
},
load: function(request) {
this.xml = request.responseXML;
this.collapsedClass = request.collapsedClass;
this.treeClass = request.treeClass;
this.nodeClass = request.nodeClass;
this.expandedNodes = new Array();
this.parse();
},
parse: function() {
var ul = document.createElement('ul');
ul.className = this.treeClass;
var root = this.xml.documentElement;
var responseNodes = root.getElementsByTagName("response");
if (responseNodes.length > 0) {
var responseNode = responseNodes[0];
var itemNodes = responseNode.getElementsByTagName("item");
for (var i=0; i<itemNodes.length; i++) {
var nameNodes = itemNodes[i].getElementsByTagName("name");
var valueNodes = itemNodes[i].getElementsByTagName("value");
var urlNodes = itemNodes[i].getElementsByTagName("url");
var collapsedNodes = itemNodes[i].getElementsByTagName("collapsed");
if (nameNodes.length > 0 && valueNodes.length > 0) {
var name = nameNodes[0].firstChild.nodeValue;
var value = valueNodes[0].firstChild.nodeValue;
var url = urlNodes[0].firstChild.nodeValue;
var collapsed = collapsedNodes[0].firstChild.nodeValue.toLowerCase() == "true";
var li = document.createElement('li');
ul.appendChild(li);
var img = document.createElement('img');
li.appendChild(img);
img.id = 'img_' + value;
img.className = this.collapsedClass;
var link  = document.createElement('a');
li.appendChild(link);
link.href = url;
link.className = this.nodeClass;
link.appendChild(document.createTextNode(name));
var div = document.createElement('div');
li.appendChild(div);
div.id = value;
if(!collapsed)
this.expandedNodes.push(value);
}
}
}
this.content = ul;
}
});
/**
* AjaxTags
*/
AjaxJspTag.Base = function() {};
AjaxJspTag.Base.prototype = {
resolveParameters: function() {
var qs = delimitQueryString(extractQueryString(this.url));
if (this.options.parameters) {
this.options.parameters += ',' + qs;
} else {
this.options.parameters = qs;
}
this.url = trimQueryString(this.url);
if (this.options.parameters.length > 0
&& this.options.parameters.charAt(this.options.parameters.length-1) == ',') {
this.options.parameters = this.options.parameters.substr(0,this.options.parameters.length-1);
}
}
}
/**
* UPDATEFIELD TAG
*/
AjaxJspTag.UpdateField = Class.create();
AjaxJspTag.UpdateField.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
eventType: options.eventType ? options.eventType : "click",
parser: options.parser ? options.parser : new ResponseTextParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
setListeners: function() {
eval("$(this.options.action).on"+this.options.eventType+" = this.execute.bindAsEventListener(this)");
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var params = buildParameterString(this.options.parameters);
var targetList = this.options.target.split(',');
var obj = this; // required because 'this' conflict with Ajax.Request
var setFunc = this.setField;
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
var results = obj.options.parser.itemList;
obj.options.handler(request, {targets: targetList, items: results});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(request, options) {
for (var i=0; i<options.targets.length && i<options.items.length; i++) {
$(options.targets[i]).value = options.items[i][1];
}
}
});
/**
* SELECT TAG
*/
AjaxJspTag.Select = Class.create();
AjaxJspTag.Select.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
if (this.options.executeOnLoad == "true") {
this.execute();
}
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
eventType: options.eventType ? options.eventType : "change",
parser: options.parser ? options.parser : new ResponseXmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
setListeners: function() {
Event.observe($(this.options.source),
this.options.eventType,
this.execute.bindAsEventListener(this),
false);
eval("$(this.options.source).on"+this.options.eventType+" = function(){return false;};");
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var params = buildParameterString(this.options.parameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
var results = obj.options.parser.itemList;
obj.options.handler(request, {target: obj.options.target,
items: results,
defaultOptions: obj.options.defaultOptions});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(request, options) {
var defaultSelectedValues = (options.defaultOptions || '').split(",");
$(options.target).options.length = 0;
$(options.target).disabled = false;
for (var i=0; i<options.items.length; i++) {
var newOption = new Option(options.items[i][0], options.items[i][1]);
for (j=0; j<defaultSelectedValues.length && newOption.selected == false; j++) {
if (defaultSelectedValues[j] == options.items[i][1]) {
newOption.selected = true;
}
}
$(options.target).options[i] = newOption;
}
}
});
/**
* HTMLCONTENT TAG
*/
AjaxJspTag.HtmlContent = Class.create();
AjaxJspTag.HtmlContent.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameterName: options.parameterName ? options.parameterName : AJAX_DEFAULT_PARAMETER,
parameters: options.parameters || '',
eventType: options.eventType ? options.eventType : "click",
parser: options.parser ? options.parser : new ResponseHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
setListeners: function() {
if (this.options.source) {
eval("$(this.options.source).on"+this.options.eventType+" = this.execute.bindAsEventListener(this)");
} else if (this.options.sourceClass) {
var elementArray = document.getElementsByClassName(this.options.sourceClass);
for (var i=0; i<elementArray.length; i++) {
eval("elementArray[i].on"+this.options.eventType+" = this.execute.bindAsEventListener(this)");
}
}
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var ajaxParameters = this.options.parameters;
if (this.options.sourceClass) {
var re = new RegExp("(\\{"+this.options.parameterName+"\\})", 'g');
var elem = Event.element(e);
if (elem.type) {
ajaxParameters = ajaxParameters.replace(re, $F(elem));
} else {
ajaxParameters = ajaxParameters.replace(re, elem.innerHTML);
}
}
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Updater(this.options.target, this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
}
});
/**
* TREE TAG
*/
AjaxJspTag.Tree = Class.create();
AjaxJspTag.Tree.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.execute();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
eventType: options.eventType ? options.eventType : "click",
parser: options.parser ? options.parser : new ResponseXmlToHtmlLinkListParser(),
handler: options.handler ? options.handler : this.handler,
collapsedClass: options.collapsedClass ? options.collapsedClass : "collapsedNode",
expandedClass: options.expandedClass ? options.expandedClass : "expandedNode",
treeClass: options.treeClass ? options.treeClass : "tree",
nodeClass: options.nodeClass || ''
}, options || {});
this.calloutParameter = AJAX_DEFAULT_PARAMETER;
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
if(this.options.target != null) {
var imgElem = $("img_" + this.options.target);
if(imgElem != null) {
var expanded = this.toggle(imgElem);
if(!expanded) {
$(this.options.target).innerHTML = "";
return;
}
}
}
var ajaxParameters = this.options.parameters || '';
var re = new RegExp("(\\{"+this.calloutParameter+"\\})", 'g');
ajaxParameters = ajaxParameters.replace(re, this.options.target);
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(Object.extend(request, {
collapsedClass: obj.options.collapsedClass,
treeClass:      obj.options.treeClass,
nodeClass:      obj.options.nodeClass}));
var results = obj.options.parser.itemList;
obj.options.handler(request, {target:    obj.options.target,
parser:    obj.options.parser,
eventType: obj.options.eventType,
url:       obj.url});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
toggle: function (e) {
var expanded =  e.className == this.options.expandedClass;
e.className =  expanded ? this.options.collapsedClass : this.options.expandedClass;
return !expanded;
},
handler: function(request, options) {
var parser = options.parser;
var target = $(options.target);
target.appendChild(parser.content);
var images = target.getElementsByTagName("img");
for (var i=0; i<images.length; i++) {
var fullId = images[i].id;
var id = fullId.substring(fullId.indexOf('_') + 1);
var toggleFunction = "function() {toggleTreeNode('" +  id + "', '" + options.url + "', null);}";
eval("images[i].on" + options.eventType + "=" + toggleFunction);
}
var expandedNodes = parser.expandedNodes;
for (var i=0; i<expandedNodes.length; i++) {
toggleTreeNode(expandedNodes[i], options.url, null);
}
}
});
/**
* TABPANEL TAG
*/
AjaxJspTag.TabPanel = Class.create();
AjaxJspTag.TabPanel.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.execute();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
eventType: options.eventType ? options.eventType : "click",
parser: options.parser ? options.parser : new ResponseHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
this.resolveParameters();
var params = buildParameterString(this.options.parameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Updater(this.options.target, this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
var src;
if (obj.options.source) {
src = obj.options.source;
} else {
src = document.getElementsByClassName(obj.options.currentStyleClass,
$(obj.options.panelId))[0];
}
obj.options.handler(request, {source: src,
panelStyleId: obj.options.panelId,
currentStyleClass: obj.options.currentStyleClass});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(request, options) {
var cur = document.getElementsByClassName(options.currentStyleClass, $(options.panelStyleId));
if(cur.length > 0)
cur[0].className = '';
options.source.className = options.currentStyleClass;
}
});
/**
* PORTLET TAG
*/
AjaxJspTag.Portlet = Class.create();
AjaxJspTag.Portlet.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
if (this.options.executeOnLoad == "true") {
this.execute();
}
if (this.preserveState) this.checkCookie();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
target: options.source+"Content",
close: options.source+"Close",
refresh: options.source+"Refresh",
toggle: options.source+"Size",
isMaximized: true,
expireDays: options.expireDays || "0",
expireHours: options.expireHours || "0",
expireMinutes: options.expireMinutes || "0",
executeOnLoad: evalBoolean(options.executeOnLoad, true),
refreshPeriod: options.refreshPeriod || null,
eventType: options.eventType ? options.eventType : "click",
parser: options.parser ? options.parser : new ResponseHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
if (parseInt(this.options.expireDays) > 0
|| parseInt(this.options.expireHours) > 0
|| parseInt(this.options.expireMinutes) > 0) {
this.preserveState = true;
this.options.expireDate = getExpDate(
parseInt(this.options.expireDays),
parseInt(this.options.expireHours),
parseInt(this.options.expireMinutes));
}
this.isAutoRefreshSet = false;
},
setListeners: function() {
if (this.options.imageClose) {
eval("$(this.options.close).on"+this.options.eventType+" = this.closePortlet.bindAsEventListener(this)");
}
if (this.options.imageRefresh) {
eval("$(this.options.refresh).on"+this.options.eventType+" = this.refreshPortlet.bindAsEventListener(this)");
}
if (this.options.imageMaximize && this.options.imageMinimize) {
eval("$(this.options.toggle).on"+this.options.eventType+" = this.togglePortlet.bindAsEventListener(this)");
}
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
this.resolveParameters();
var params = buildParameterString(this.options.parameters);
var obj = this; // required because 'this' conflict with Ajax.Request
if (this.options.refreshPeriod && this.isAutoRefreshSet == false) {
var freq = this.options.refreshPeriod;
this.ajaxPeriodicalUpdater = new Ajax.PeriodicalUpdater(this.options.target, this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
frequency: freq,
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {},
onSuccess: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
this.isAutoRefreshSet = true;
} else {
this.ajaxUpdater = new Ajax.Updater(this.options.target, this.url, {
asynchronous: true,
method: 'get',
parameters: params,
evalScripts: true,
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
}
},
checkCookie: function() {
var cVal = getCookie("AjaxJspTag.Portlet."+this.options.source);
if (cVal != null) {
if (cVal == AJAX_PORTLET_MIN) {
this.togglePortlet();
} else if (cVal == AJAX_PORTLET_CLOSE) {
this.closePortlet();
}
}
},
stopAutoRefresh: function() {
if (this.ajaxPeriodicalUpdater != null
&& this.options.refreshPeriod
&& this.isAutoRefreshSet == true) {
this.ajaxPeriodicalUpdater.stop();
}
},
startAutoRefresh: function() {
if (this.ajaxPeriodicalUpdater != null && this.options.refreshPeriod) {
this.ajaxPeriodicalUpdater.start();
}
},
refreshPortlet: function(e) {
this.stopAutoRefresh();
if (this.ajaxPeriodicalUpdater != null) {
this.startAutoRefresh();
} else {
this.execute();
}
},
closePortlet: function(e) {
this.stopAutoRefresh();
Element.remove(this.options.source);
if (this.preserveState) {
setCookie("AjaxJspTag.Portlet."+this.options.source,
AJAX_PORTLET_CLOSE,
this.options.expireDate);
}
},
togglePortlet: function(e) {
Element.toggle(this.options.target);
if (this.options.isMaximized) {
$(this.options.toggle).src = this.options.imageMaximize;
this.stopAutoRefresh();
} else {
$(this.options.toggle).src = this.options.imageMinimize;
this.startAutoRefresh();
}
this.options.isMaximized = !this.options.isMaximized;
if (this.preserveState) {
setCookie("AjaxJspTag.Portlet."+this.options.source,
(this.options.isMaximized == true ? AJAX_PORTLET_MAX : AJAX_PORTLET_MIN),
this.options.expireDate);
}
}
});
/**
* AUTOCOMPLETE TAG
*/
Ajax.XmlToHtmlAutocompleter = Class.create();
Object.extend(Object.extend(Ajax.XmlToHtmlAutocompleter.prototype, Autocompleter.Base.prototype), {
initialize: function(element, update, url, options) {
this.baseInitialize(element, update, options);
this.options.asynchronous  = true;
this.options.onComplete    = this.onComplete.bind(this);
this.options.defaultParams = this.options.parameters || null;
this.url                   = url;
},
getUpdatedChoices: function() {
entry = encodeURIComponent(this.options.paramName) + '=' +
encodeURIComponent(this.getToken());
this.options.parameters = this.options.callback ?
this.options.callback(this.element, entry) : entry;
var params = buildParameterString(this.options.defaultParams);
if (!isEmpty(params) || (isString(params) && params.length > 0)) {
this.options.parameters += '&' + params;
}
new Ajax.Request(this.url, this.options);
},
onComplete: function(request) {
var parser = new ResponseXmlToHtmlListParser();
parser.load(request);
this.updateChoices(parser.content);
}
});
AjaxJspTag.Autocomplete = Class.create();
AjaxJspTag.Autocomplete.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
$(this.options.source).setAttribute("autocomplete", "off");
new Insertion.After(this.options.source, '<div id="' + this.options.divElement + '" class="' + this.options.className + '"></div>');
this.execute();
},
setOptions: function(options) {
this.options = Object.extend({
divElement: "ajaxAuto_" + options.source,
indicator: options.indicator || '',
parameters: options.parameters || '',
parser: options.parser ? options.parser : new ResponseHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.XmlToHtmlAutocompleter(
this.options.source,
this.options.divElement,
this.url, {minChars: obj.options.minimumCharacters,
tokens: obj.options.appendSeparator,
indicator: obj.options.indicator,
parameters: obj.options.parameters,
evalScripts: true,
afterUpdateElement: function(inputField, selectedItem) {
obj.options.handler(null, {
selectedItem: selectedItem,
tokens: obj.options.appendSeparator,
target: obj.options.target,
inputField: inputField,
postFunction: obj.options.postFunction
}
);
}
}
);
},
handler: function(request, options) {
if (options.target) {
if (options.tokens) {
if ($(options.target).value.length > 0) {
$(options.target).value += options.tokens;
}
$(options.target).value += options.selectedItem.id;
} else {
$(options.target).value = options.selectedItem.id;
}
}
if (options.postFunction != null) {
var onupdateHandler = $(options.inputField).onupdate;
$(options.inputField).onupdate = '';
options.postFunction(request);
$(options.inputField).onupdate = onupdateHandler;
}
}
});
/**
* TOGGLE TAG
*/
AjaxJspTag.Toggle = Class.create();
AjaxJspTag.Toggle.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
if (this.options.messageClass) {
this.messageContainer = new Insertion.Top($(this.options.source),
'<div id="'+ this.options.source +'_message" class="' + this.options.messageClass +'"></div>');
}
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || 'rating={ajaxParameter}',
parser: options.parser ? options.parser : new ResponseTextParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
this.ratingParameter = AJAX_DEFAULT_PARAMETER;
},
setListeners: function() {
var elements = $(this.options.source).getElementsByTagName('a');
for (var j=0; j<elements.length; j++) {
elements[j].onmouseover = this.raterMouseOver.bindAsEventListener(this);
elements[j].onmouseout = this.raterMouseOut.bindAsEventListener(this);
elements[j].onclick = this.raterClick.bindAsEventListener(this);
}
},
getCurrentRating: function(list) {
var selectedIndex = -1;
for (var i=0; i<list.length; i++) {
if (Element.hasClassName(list[i], this.options.selectedClass)) {
selectedIndex = i;
}
}
return selectedIndex;
},
getCurrentIndex: function(list, elem) {
var currentIndex = 0;
for (var i=0; i<list.length; i++) {
if (elem == list[i]) {
currentIndex = i;
}
}
return currentIndex;
},
raterMouseOver: function (e) {
var container = Event.findElement(e, 'div');
var elements = container.getElementsByTagName('a');
var selectedIndex = this.getCurrentRating(elements);
var currentIndex = this.getCurrentIndex(elements, Event.element(e));
if (this.options.messageClass) {
$(container.id+'_message').innerHTML = Event.element(e).title;
}
for (var i=0; i<elements.length; i++) {
if (selectedIndex > -1) {
if (i <= selectedIndex && i <= currentIndex)
Element.addClassName(elements[i], this.options.selectedOverClass);
else if (i <= selectedIndex && i > currentIndex)
Element.addClassName(elements[i], this.options.selectedLessClass);
else if (i > selectedIndex && i <= currentIndex)
Element.addClassName(elements[i], this.options.overClass);
} else {
if (i <= currentIndex) Element.addClassName(elements[i], this.options.overClass);
}
}
},
raterMouseOut: function (e) {
var container = Event.findElement(e, 'div');
var elements = container.getElementsByTagName('a');
if (this.options.messageClass) {
$(container.id+'_message').innerHTML = '';
}
for (var i=0; i<elements.length; i++) {
Element.removeClassName(elements[i], this.options.selectedOverClass);
Element.removeClassName(elements[i], this.options.selectedLessClass);
Element.removeClassName(elements[i], this.options.overClass);
}
},
raterClick: function (e) {
var container = Event.findElement(e, 'div');
var elements = container.getElementsByTagName('a');
var currentIndex = this.getCurrentIndex(elements, Event.element(e));
for (var i=0; i<elements.length; i++) {
Element.removeClassName(elements[i], this.options.selectedOverClass);
Element.removeClassName(elements[i], this.options.selectedLessClass);
Element.removeClassName(elements[i], this.options.overClass);
if (i <= currentIndex) {
if (Element.hasClassName(container, 'onoff')
&& Element.hasClassName(elements[i], this.options.selectedClass)) {
Element.removeClassName(elements[i], this.options.selectedClass);
} else {
Element.addClassName(elements[i], this.options.selectedClass);
}
} else if (i > currentIndex) {
Element.removeClassName(elements[i], this.options.selectedClass);
}
}
var ratingToSend = elements[currentIndex].title;
if (Element.hasClassName(container, 'onoff')) {
var ratings = this.options.ratings.split(',');
if (ratings[0] == ratingToSend) ratingToSend = ratings[1];
else ratingToSend = ratings[0];
}
this.execute(ratingToSend);
if (this.options.state) {
$(this.options.state).value = ratingToSend;
}
},
execute: function(ratingValue) {
if (this.options.preFunction != null) this.options.preFunction();
var ajaxParameters = this.options.parameters || '';
var re = new RegExp("(\\{"+this.ratingParameter+"\\})", 'g');
ajaxParameters = ajaxParameters.replace(re, ratingValue);
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var toggleStateFunc = this.getToggleStateValue;
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
var results = obj.options.parser.itemList;
obj.options.handler(request, {items: results});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(request, options) {
},
getToggleStateValue: function(name, results) {
for (var i=0; i<results.length; i++) {
if (results[i][0] == name) return results[i][1];
}
return "";
}
});
/**
* CALLOUT TAG
*/
AjaxJspTag.Callout = Class.create();
AjaxJspTag.Callout.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
overlib: options.overlib || AJAX_CALLOUT_OVERLIB_DEFAULT,
parser: options.parser ? options.parser : new ResponseXmlToHtmlParser(),
handler: options.handler ? options.handler : this.handler,
openEvent: options.openEvent ? options.openEvent : "mouseover",
closeEvent: options.closeEvent ? options.closeEvent : "mouseout"
}, options || {});
this.calloutParameter = AJAX_DEFAULT_PARAMETER;
},
setListeners: function() {
if (this.options.sourceClass) {
var elemList = document.getElementsByClassName(this.options.sourceClass);
for (var i=0; i<elemList.length; i++) {
eval("elemList[i].on"+this.options.openEvent+" = this.calloutOpen.bindAsEventListener(this)");
eval("elemList[i].on"+this.options.closeEvent+" = this.calloutClose.bindAsEventListener(this)");
}
}
},
calloutOpen: function(e) {
this.execute(e);
},
calloutClose: function(e) {
nd();
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var ajaxParameters = this.options.parameters || '';
var re = new RegExp("(\\{"+this.calloutParameter+"\\})", 'g');
var elem = Event.element(e);
if (elem.type) {
ajaxParameters = ajaxParameters.replace(re, $F(elem));
} else {
ajaxParameters = ajaxParameters.replace(re, elem.innerHTML);
}
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
obj.options.handler(obj.options.parser.content, {title: obj.options.title,
overlib: obj.options.overlib});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(content, options) {
if (options.overlib) {
if (options.title) {
return eval("overlib(content,CAPTION,options.title,"+options.overlib+")");
} else {
return eval("overlib(content,"+options.overlib+")");
}
} else {
if (options.title) {
return overlib(content,CAPTION,options.title);
} else {
return overlib(content);
}
}
}
});
;
/*
Copyright 2005  Vitaliy Shevchuk (shevit@users.sourceforge.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
function AjaxAnywhere() {
this.id = AjaxAnywhere.defaultInstanceName;
this.formName = null;
this.notSupported = false;
this.delayBeforeContentUpdate = true;
this.delayInMillis = 100;
this.callbackExecuted = true;
if (window.XMLHttpRequest) {
this.req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
this.req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
this.req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e1) {
this.notSupported = true;
alert('XMLHTTPRequest not supported');
alert(e1);
/* XMLHTTPRequest not supported */
}
}
}
if (this.req == null || typeof this.req == "undefined") {
this.notSupported = true;
alert('XMLHTTP not supported');
}
}
AjaxAnywhere.defaultInstanceName = "default";
AjaxAnywhere.ASYNCH_KEY = "automated.test.session=false";
AjaxAnywhere.SYNCH_KEY = "automated.test.session=true";
/**
* this features are added for better support of in-browser automated test frameworks like Selenium
* if URL or query string contains "automated.test.sessionh=false" this method sets a session cookie to indicate that
* for this session XmlHttpRequest must operate in synchronous mode.
* click() method of in-browser test framework must not return untill page zones are correctly updated
*/
AjaxAnywhere.parseQueryString = function(){
if (location.href.indexOf(AjaxAnywhere.ASYNCH_KEY)!=-1)
document.cookie = AjaxAnywhere.ASYNCH_KEY;
else if (location.href.indexOf(AjaxAnywhere.SYNCH_KEY)!=-1)
document.cookie = AjaxAnywhere.SYNCH_KEY;
}
AjaxAnywhere.parseQueryString();
/**
* returns true if curreny session is markes to work in synchronous mode for better compatibility with in-browser test,
* like Selenium
*/
AjaxAnywhere.prototype.isAsynch = function (){
return document.cookie.indexOf(AjaxAnywhere.SYNCH_KEY)==-1;
}
/**
* Stores substitutes SubmitButton names in to redo sustitution if a button was eventually inside a refresh zone.
*/
AjaxAnywhere.prototype.substitutedSubmitButtons = new Array();
AjaxAnywhere.prototype.substitutedSubmitButtonsInfo = new Object();
/**
* Returns a Form object that corresponds to formName property of this AjaxAnywhere class instance.
*/
AjaxAnywhere.prototype.findForm = function () {
var form;
if (this.formName != null)
form = document.forms[this.formName];
else if (document.forms.length > 0)
form = document.forms[0];
if (typeof form != "object")
alert("AjaxAnywhere error: Form with name [" + this.formName + "] not found");
return form;
}
/**
* Binds this instance to window object using "AjaxAnywhere."+this.id as a key.
*/
AjaxAnywhere.prototype.bindById = function () {
var key = "AjaxAnywhere." + this.id;
window[key] = this;
}
/**
* Finds an instance by id.
*/
AjaxAnywhere.findInstance = function(id) {
var key = "AjaxAnywhere." + id;
return window[key];
}
/**
* This function is used to submit all form fields by AJAX request to the server.
* If the form is submited with &lt;input type=submit|image&gt;, submitButton should be a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.submitAJAX = function(additionalPostData, submitButton) {
if (this.notSupported)
return this.onSubmitAjaxNotSupported(additionalPostData, submitButton);
if (additionalPostData == null || typeof additionalPostData == "undefined")
additionalPostData = "";
this.bindById();
var form = this.findForm();
var actionAttrNode = form.attributes["action"];
var url = actionAttrNode == null?null:actionAttrNode.nodeValue;
if ((url == null) || (url == ""))
url = location.href;
var pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
if ((url == null) || (url == ""))
url = location.href;
pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
var zones = this.getZonesToReload(url, submitButton);
if (zones == null) {
this.submitOld(form,submitButton)
return;
}
this.dropPreviousRequest();
this.req.open("POST", url, this.isAsynch());
this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
var postData = this.preparePostData(submitButton);
if (zones != "")
postData = '&aazones=' + encodeURIComponent(zones) + "&" + postData + "&" + additionalPostData;
else
postData += "&" + additionalPostData;
this.sendPreparedRequest(postData);
}
/**
* sends a GET request to the server.
*/
AjaxAnywhere.prototype.getAJAX = function(url, zonesToRefresh) {
if (this.notSupported)
return this.onGetAjaxNotSupported(url);
this.bindById();
if (zonesToRefresh == null || typeof zonesToRefresh == "undefined")
zonesToRefresh = "";
var urlDependentZones = this.getZonesToReload(url);
if (urlDependentZones == null) {
location.href = url;
return;
}
if (urlDependentZones.length != 0)
zonesToRefresh += "," + urlDependentZones;
this.dropPreviousRequest();
url += (url.indexOf("?") != -1) ? "&" : "?";
url += "aaxmlrequest=true&aa_rand=" + Math.random();
if (zonesToRefresh != null && zonesToRefresh != "")
url += '&aazones=' + encodeURIComponent(zonesToRefresh);
this.req.open("GET", url, this.isAsynch());
this.sendPreparedRequest("");
}
/**
* @private
*/
AjaxAnywhere.prototype.sendPreparedRequest = function (postData) {
this.req.setRequestHeader("Accept", "text/xml");
var callbackKey = this.id + "_callbackFunction";
if (typeof window[callbackKey] == "undefined")
window[callbackKey] = new Function("AjaxAnywhere.findInstance(\"" + this.id + "\").callback(); ");
this.req.onreadystatechange = window[callbackKey];
this.showLoadingMessage();
this.callbackExecuted = false;
this.req.send(postData);
this.onRequestSent();
if ((!this.isAsynch()) && (!this.callbackExecuted )){
window[callbackKey](); // look like firefox does not execute the callback for synch xmlhttprequest call.
}
}
/**
* Used internally by AjaxAnywhere. Aborts previous request if not completed.
*/
AjaxAnywhere.prototype.dropPreviousRequest = function() {
if (this.req.readyState != 0 && this.req.readyState != 4) {
this.req.abort();
this.handlePrevousRequestAborted();
}
}
/**
* Internally used to prepare Post data.
* If the form is submited with &lt;input type=submit|image&gt;, submitButton is a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.preparePostData = function(submitButton) {
var form = this.findForm();
var result = "&aaxmlrequest=true";
for (var i = 0; i < form.elements.length; i++) {
var el = form.elements[i];
if (el.tagName.toLowerCase() == "select") {
for (var j = 0; j < el.options.length; j++) {
var op = el.options[j];
if (op.selected)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(op.value);
}
} else if (el.tagName.toLowerCase() == "textarea") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.tagName.toLowerCase() == "input") {
if (el.type.toLowerCase() == "checkbox" || el.type.toLowerCase() == "radio") {
if (el.checked)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() == "submit") {
if (el == submitButton) // is "el" the submit button that fired the form submit?
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() != "button") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
}
}
}
if (typeof submitButton != 'undefined' && submitButton != null && submitButton.type.toLowerCase() == "image") {
if (submitButton.name == null || submitButton.name == "" || typeof submitButton.name == "undefined")
result += "&x=1&y=1"; // .x and .y coordinates calculation is not supported.
else
result += "&" + encodeURIComponent(submitButton.name) + ".x=1&" +
encodeURIComponent(submitButton.name) + ".y=1";
}
return result;
}
/**
* Pauses the thread of execution for the specified number of milliseconds
* @private
*/
function delay(millis) {
date = new Date();
var curDate = null;
do {
curDate = new Date();
}
while (curDate - date < millis);
}
/**
* Handle wrong content type.
*/
AjaxAnywhere.prototype.handleWrongContentType = function()
{
alert("AjaxAnywhere error : content-type in not text/xml : [" + this.req.getResponseHeader('content-type') + "]");
}
/**
* A callback. internally used
*/
AjaxAnywhere.prototype.callback = function() {
if (this.req.readyState == 4) {
this.callbackExecuted = true;
this.onBeforeResponseProcessing();
this.hideLoadingMessage();
if (this.req.status == 200) {
if (this.req.getResponseHeader('content-type').toLowerCase().substring(0, 8) != 'text/xml') {
this.handleWrongContentType();
return;
}
var docs = this.req.responseXML.getElementsByTagName("document");
var redirects = this.req.responseXML.getElementsByTagName("redirect");
var zones = this.req.responseXML.getElementsByTagName("zone");
var exceptions = this.req.responseXML.getElementsByTagName("exception");
var scripts = this.req.responseXML.getElementsByTagName("script");
var images = this.req.responseXML.getElementsByTagName("image");
if (redirects.length != 0) {
var newURL = redirects[0].firstChild.data;
location.href = newURL;
}
if (docs.length != 0) {
var newContent = docs[0].firstChild.data;
delete this.req;
document.close();
document.write(newContent);
document.close();
}
if (images.length != 0) {
var preLoad = new Array(images.length);
for (var i = 0; i < images.length; i++) {
var img = images[i].firstChild;
if (img != null) {
preLoad[i] = new Image();
preLoad[i].src = img.data;
}
}
if (this.delayBeforeContentUpdate) {
delay(this.delayInMillis);
}
}
if (zones.length != 0) {
for (var i = 0; i < zones.length; i++) {
var zoneNode = zones[i];
var name = zoneNode.getAttribute("name");
var id = zoneNode.getAttribute("id");
var html = "";
for (var childIndex = 0; childIndex < zoneNode.childNodes.length; childIndex++) {
html += zoneNode.childNodes[childIndex].data
}
var zoneHolder = name!=null?
document.getElementById("aazone." + name):
document.getElementById(id);
if (zoneHolder != null && typeof(zoneHolder) != "undefined") {
zoneHolder.innerHTML = html;
}
}
}
if (exceptions.length != 0) {
var e = exceptions[0];
var type = e.getAttribute("type");
var stackTrace = e.firstChild.data;
this.handleException(type, stackTrace);
}
if (scripts.length != 0) {
for (var $$$$i = 0; $$$$i < scripts.length; $$$$i++) {
var script = scripts[$$$$i].firstChild;
if (script != null) {
script = script.data;
if (script.indexOf("document.write") != -1) {
this.handleException("document.write", "This script contains document.write(), which is not compatible with AjaxAnywhere : \n\n" + script);
} else {
eval("var aaInstanceId = \""+this.id+"\"; \n"+script);
}
}
}
var globals = this.getGlobalScriptsDeclarationsList(script);
if (globals != null)
for (var i in globals) {
var objName = globals[i];
try {
window[objName] = eval(objName);
} catch(e) {
}
}
}
} else {
if (this.req.status != 0)
this.handleHttpErrorCode(this.req.status);
}
this.restoreSubstitutedSubmitButtons();
this.onAfterResponseProcessing();
}
}
/**
*  Default sample loading message show function. Overrride it if you like.
*/
AjaxAnywhere.prototype.showLoadingMessage = function() {
var div = document.getElementById("AA_" + this.id + "_loading_div");
if (div == null) {
div = document.createElement("DIV");
document.body.appendChild(div);
div.id = "AA_" + this.id + "_loading_div";
div.innerHTML = "&nbsp;Loading...";
div.style.position = "absolute";
div.style.border = "1 solid black";
div.style.color = "white";
div.style.backgroundColor = "blue";
div.style.width = "100px";
div.style.heigth = "50px";
div.style.fontFamily = "Arial, Helvetica, sans-serif";
div.style.fontWeight = "bold";
div.style.fontSize = "11px";
}
div.style.top = document.body.scrollTop + "px";
div.style.left = (document.body.offsetWidth - 100 - (document.all?20:0)) + "px";
div.style.display = "";
}
/**
*  Default sample loading message hide function. Overrride it if you like.
*/
AjaxAnywhere.prototype.hideLoadingMessage = function() {
var div = document.getElementById("AA_" + this.id + "_loading_div");
if (div != null)
div.style.display = "none";
}
/**
* This function is used to facilitatte AjaxAnywhere integration with existing projects/frameworks.
* It substitutes default Form.sumbit().
* The new implementation calls AjaxAnywhere.isFormSubmitByAjax() function to find out if the form
* should be submitted in traditional way or by AjaxAnywhere.
*/
AjaxAnywhere.prototype.substituteFormSubmitFunction = function() {
if (this.notSupported)
return;
this.bindById();
var form = this.findForm();
form.submit_old = form.submit;
var code = "var ajax = AjaxAnywhere.findInstance(\"" + this.id + "\"); " +
"if (typeof ajax !='object' || ! ajax.isFormSubmitByAjax() ) " +
"ajax.findForm().submit_old();" +
" else " +
"ajax.submitAJAX();"
form.submit = new Function(code);
}
/**
* Substitutes the default behavior of &lt;input type=submit|image&gt; to submit the form via AjaxAnywhere.
*
* @param {boolean} indicates if existing onClick handlers should be preserved.
* If keepExistingOnClickHandler==true,
* Existing handler will be called first if it returns false, or if event.returnValue==false, AjaxAnywhere will not
* continue form submission.
* If keepExistingOnClickHandler==false or undefines, existing onClick event handlers will be replaced.
*
* @param {Array} list of submitButtons and submitImages names. If the parameter is omitted or undefined,
* all elements will be processed
*/
AjaxAnywhere.prototype.substituteSubmitButtonsBehavior = function (keepExistingOnClickHandler, elements) {
if (this.notSupported)
return;
var form = this.findForm();
if (elements == null || typeof elements == "undefined") { // process all elements
elements = new Array();
for (var i = 0; i < form.elements.length; i++) {
elements.push(form.elements[i]);
}
var inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type != null && typeof input.type != "undefined" &&
input.type.toLowerCase() == "image" && input.form == form) {
elements.push(input);
}
}
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el.tagName.toLowerCase() == "input" && (el.type.toLowerCase() == "submit"
|| el.type.toLowerCase() == "image")) {
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
} else { //process only specified elements
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el == null)
continue;
if (typeof el != "object")
el = form.elements[el];
if (typeof el != "undefined") {
if (el.tagName.toLowerCase() == "input" && (el.type.toLowerCase() == "submit"
|| el.type.toLowerCase() == "image"))
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
}
}
/**
* Performs a single element behavior substitution
*
* @private
*/
AjaxAnywhere.prototype.substituteSubmitBehavior = function (el, keepExistingOnClickHandler) {
var inList = false;
for (var i = 0; i < this.substitutedSubmitButtons.length; i++) {
var btnName = this.substitutedSubmitButtons[i];
if (btnName == el.name) {
inList = true;
break;
}
}
if (!inList)
this.substitutedSubmitButtons.push(el.name);
this.substitutedSubmitButtonsInfo[el.name] = keepExistingOnClickHandler;
if (keepExistingOnClickHandler && (typeof el.onclick != "undefined") && ( el.onclick != null) && ( el.onclick != "")) {
el.AA_old_onclick = el.onclick;
}
el.onclick = handleSubmitButtonClick;
el.ajaxAnywhereId = this.id;
}
/**
*
* @private
*/
AjaxAnywhere.prototype.restoreSubstitutedSubmitButtons = function() {
if (this.substitutedSubmitButtons.length == 0)
return;
var form = this.findForm();
for (var i = 0; i < this.substitutedSubmitButtons.length; i++) {
var name = this.substitutedSubmitButtons[i];
var el = form.elements[name];
if (el != null && typeof el != "undefined") {
if (el.onclick != handleSubmitButtonClick) {
var keepExistingOnClickHandler = this.substitutedSubmitButtonsInfo[el.name];
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
} else {
if (name != null && typeof name != "undefined" && name.length != 0) {
var elements = document.getElementsByName(name);
if (elements != null)
for (var j = 0; j < elements.length; j++) {
el = elements[j];
if (el != null && typeof el != "undefined"
&& el.tagName.toLowerCase() == "input"
&& typeof el.type != "undefined" && el.type.toLowerCase() == "image") {
if (el.onclick != handleSubmitButtonClick) {
var keepExistingOnClickHandler = this.substitutedSubmitButtonsInfo[el.name];
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
}
}
}
}
}
/**
* @private
*/
function handleSubmitButtonClick(_event) {
if (typeof this.AA_old_onclick != "undefined") {
if (false == this.AA_old_onclick(_event))
return false;
if (typeof window.event != "undefined")
if (window.event.returnValue == false)
return false;
}
var onsubmit = this.form.onsubmit;
if (typeof onsubmit == "function") {
if (false == onsubmit(_event))
return false;
if (typeof window.event != "undefined")
if (window.event.returnValue == false)
return false;
}
AjaxAnywhere.findInstance(this.ajaxAnywhereId).submitAJAX('', this);
return false;
}
/**
* Override this function if you use AjaxAnywhere.substituteFormSubmitFunction() to
* dynamically inform AjaxAnywhere of the method you want to use for the form submission.
*/
AjaxAnywhere.prototype.isFormSubmitByAjax = function () {
return true;
}
/**
* Some browsers (notably IE) do not load images from thier cache when content is updated using
* innerHTML. As a result, each image is re-requested from the server even though the image exists
* in the cache. To work around this issue, AjaxAnywhere preloads images present in the new content
* and intrduces a brief dely (default of 100 milleseconds) before calling innerHTML.
* See http://support.microsoft.com/default.aspx?scid=kb;en-us;319546 for further details.
* This function can be used to change this behaviour.
* @param (boolean) isDelay
*/
AjaxAnywhere.prototype.setDelayBeforeLoad = function (isDelay) {
this.delayBeforeContentUpdate = isDelay;
}
/**
* Returns the current delay behavior.
*/
AjaxAnywhere.prototype.isDelayBeforeLoad = function () {
return this.delayBeforeContentUpdate;
}
/**
* Sets the delay period in milliseconds. The default delay is 100 milliseconds.
* @param (int) delayMillis
*/
AjaxAnywhere.prototype.setDelayTime = function (delayMillis) {
this.delayInMillis = delayMillis;
}
/**
* Returns the delay period in milliseconds.
*/
AjaxAnywhere.prototype.getDelayTime = function () {
return this.delayInMillis;
}
/**
*   If an exception is throws on the server-side during AJAX request, it will be processed
* by this function. The default implementation is alert(stackTrace);
* Override it if you need.
*/
AjaxAnywhere.prototype.handleException = function(type, details) {
alert(details);
}
/**
*   If an HTTP Error code returned during AJAX request, it will be processed
* by this function. The default implementation is alert(code);
* Override it if you need.
*/
AjaxAnywhere.prototype.handleHttpErrorCode = function(code) {
var details = confirm("AjaxAnywhere default error handler. XMLHttpRequest HTTP Error code:" + code + " \n\n Would you like to view the response content in a new window?");
if (details) {
var win = window.open("", this.id + "_debug_window");
if (win != null) {
win.document.write("<html><body><xmp>" + this.req.responseText);
win.document.close();
win.focus();
} else {
alert("Please, disable your pop-up blocker for this site first.");
}
}
}
/**
* Override it if you need.
*/
AjaxAnywhere.prototype.handlePrevousRequestAborted = function() {
}
/**
*   If the HTML received in responce to AJAX request contains JavaScript that defines new
* functions/variables, they must be propagated to the proper context. Override this method
* to return the Array of function/variable names.
*/
AjaxAnywhere.prototype.getGlobalScriptsDeclarationsList = function(script) {
return null;
}
/**
* This function should be overridden by AjaxAnywhere user to implement client-side
* determination of zones to reload.
*
* If the form is submited with &lt;input type=submit|image&gt;, submitButton is a reference to the DHTML object. Otherwise - undefined.
*
* @Returns a comma separated list of zones to reload, or "document.all" to reload
* the whole page. Returns null if the request must be sent in traditional way
*
*/
AjaxAnywhere.prototype.getZonesToReload = function(url, submitButton) {
return this.getZonesToReaload();
}
/**
* depreceted : wrond spelling : Reaload will be removed in later versions
*/
AjaxAnywhere.prototype.getZonesToReaload = function(url, submitButton) {
return "";
}
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onRequestSent = function () {
};
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onBeforeResponseProcessing = function () {
};
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onAfterResponseProcessing = function () {
};
/**
* Provides a default implementation from graceful degradation for getAJAX()
* calls location.href=url if XMLHttpRequest is unavailable, reloading the entire page .
*/
AjaxAnywhere.prototype.onGetAjaxNotSupported = function (url) {
location.href = url;
return false;
};
/**
* Provides a default implementation from graceful degradation for submitAJAX()
* calls form.submit() if XMLHttpRequest is unavailable, reloading the entire page
*/
AjaxAnywhere.prototype.onSubmitAjaxNotSupported = function (additionalPostData, submitButton) {
var form = this.findForm();
var actionAttrNode = form.attributes["action"];
var url = actionAttrNode == null?null:actionAttrNode.nodeValue;
var url_backup = url;
if (typeof additionalPostData != 'undefined' && additionalPostData != null) {
url += (url.indexOf("?") != -1) ? "&" : "?";
url += additionalPostData;
form.attributes["action"].nodeValue= url;
form.setAttribute("method", "post");
}
this.submitOld(form,submitButton);
form.attributes["action"].nodeValue= url_backup;
return false;
};
/**
* submit the form in tradiditional way :
* @private
*/
AjaxAnywhere.prototype.submitOld = function (form,submitButton){
var submitHolder = null;
if (submitButton!=null && typeof submitButton!="undefined"){
submitHolder = document.createElement("input");
submitHolder.setAttribute("type","hidden");
submitHolder.setAttribute("name",submitButton.name);
submitHolder.setAttribute("value",submitButton.value);
form.appendChild(submitHolder);
}
if (typeof form.submit_old == "undefined")
form.submit();
else
form.submit_old();
if (submitButton!=null ){
form.removeChild(submitHolder);
}
}
ajaxAnywhere = new AjaxAnywhere();
ajaxAnywhere.bindById();;
/*
AJAX-based preferred partners box
rep.js version 2
*/
function getReps(boxType, repsAmount, zipCode) {
if (null == boxType)    boxType="";
if (null == repsAmount) repsAmount="";
if (null == zipCode)    zipCode="";
resultHtml=
"<form method=\"post\" name=\"ajaxrepform\" action=\"/member/rep/rep-widget.jsp\" style=\"padding:0px; margin:0px;\">"
+   "<input type=\"submit\" id=\"submitAjaxReps\" style=\"display:none;\" name=\"submit\" value=\"sbmt_btn\" />"
+   "<input type=\"hidden\" name=\"repsAmountAjaxReps\" value=\"" + repsAmount + "\">"
+   "<input type=\"hidden\" name=\"zipCodeAjaxReps\" value=\"" + zipCode + "\">"
+   "<input type=\"hidden\" name=\"boxTypeAjaxReps\" value=\"" + boxType + "\">"
+ "</form>"
+ "<div id=\"ppLoadIndicator\" align=\"center\" width=\"100%\" valign=\"center\"><span id=\"progressAjaxReps\" class=\"bluetext\"><img src=\"/images/common/indicator.gif\" border=\"0\" alt=\"\"/><br />PREFERRED PARTNERS LOADING...</span></div>"
+ "<div id=\"ppBox\"></div>"
;
var repsBox = document.getElementById("_REPS_BOX");
repsBox.innerHTML = resultHtml;
repBoxAjaxer.init("ppBox", "ppLoadIndicator", "submitAjaxReps");
}
var randomizer = {
randomizerName:  false,
setRandomizer: function(randomizerName){
randomizer.randomizerName = randomizerName;
}
};
function setRandomizer(randomizerName){
randomizer.setRandomizer(randomizerName);
}
function XmlHttpPPConnection() {
var xmlhttp, bComplete = false;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone) {
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET") {
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
} else {
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && !bComplete) {
bComplete = true;
fnDone(xmlhttp);
}
};
xmlhttp.send(sVars);
} catch(err) {
return false;
}
return true;
};
return this;
}
var repBoxAjaxer = {
myConn:   false,
body:     false,
ppBox:    false,
ppBoxId:  false,
loader:   false,
loaderId: false,
init: function(ppBoxId, loaderId, sbmtBtnId) {
if( !document.getElementById ||
!document.getElementsByTagName ||
!document.getElementById( loaderId ) ||
!document.getElementById( sbmtBtnId )  ||
!document.getElementById( ppBoxId ) ) {
return;
}
repBoxAjaxer.myConn = new XmlHttpPPConnection();
if (!repBoxAjaxer.myConn) return;
repBoxAjaxer.body = document.getElementsByTagName('body')[0];
var sbmtBtn = document.getElementById(sbmtBtnId);
sbmtBtn.parentNode.removeChild(sbmtBtn);
repBoxAjaxer.ppBox  = document.getElementById(ppBoxId);
repBoxAjaxer.loader = document.getElementById(loaderId);
repBoxAjaxer.ppBoxId = ppBoxId;
repBoxAjaxer.loaderId = loaderId;
repsAmount = document.ajaxrepform.repsAmountAjaxReps.value;
zipCode    = document.ajaxrepform.zipCodeAjaxReps.value;
boxType    = document.ajaxrepform.boxTypeAjaxReps.value;
randomizerName = randomizer.randomizerName;
repBoxAjaxer.getReps(repsAmount, zipCode, boxType, randomizerName);
},
getReps: function(repsAmount, zipCode, boxFormat, randomizerName) {
repBoxAjaxer.buildLoader();
var fnWhenDone = function(oXML) {
repBoxAjaxer.killLoader();
repBoxAjaxer.ppBox.innerHTML = oXML.responseText;
};
repBoxAjaxer.myConn.connect("/rep/widget.do", "POST", "ppBoxSize="+repsAmount+"&ppBoxType="+boxFormat+"&ppZipStateCode="+zipCode+"&ppRandomizer="+randomizerName,  fnWhenDone);
},
buildLoader: function() {
repBoxAjaxer.loader.style.width      = '100%';
repBoxAjaxer.loader.style.textAlign  = 'center';
repBoxAjaxer.loader.style.border     = '0px solid #000000';
repBoxAjaxer.loader.style.display = '';
repBoxAjaxer.ppBox.style.display = 'none';
},
killLoader:  function() {
repBoxAjaxer.ppBox.style.display = '';
repBoxAjaxer.loader.style.display = 'none';
},
addEvent: function( obj, type, fn ) {
if (obj.addEventListener) {
obj.addEventListener( type, fn, false );
} else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj[type+fn] = function() {
obj["e"+type+fn]( window.event );
};
obj.attachEvent( "on"+type, obj[type+fn] );
} else {
alert("Add event error: " + type);
}
}
};;
function AC_AddExtension(src, ext)
{
if (src.indexOf('?') != -1)
return src.replace(/\?/, ext+'?');
else
return src + ext;
}
function AC_Generateobj(objAttrs, params, embedAttrs)
{
var str = '<object ';
for (var i in objAttrs)
str += i + '="' + objAttrs[i] + '" ';
str += '>';
for (var i in params)
str += '<param name="' + i + '" value="' + params[i] + '" />';
str += '<embed ';
for (var i in embedAttrs)
str += i + '="' + embedAttrs[i] + '" ';
str += '/></object>';
document.write(str);
}
function AC_FL_RunContent(){
var ret =
AC_GetArgs
(  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
, "application/x-shockwave-flash"
);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_SW_RunContent(){
var ret =
AC_GetArgs
(  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
, null
);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
var ret = new Object();
ret.embedAttrs = new Object();
ret.params = new Object();
ret.objAttrs = new Object();
for (var i=0; i < args.length; i=i+2){
var currArg = args[i].toLowerCase();
switch (currArg){
case "classid":
break;
case "pluginspage":
ret.embedAttrs[args[i]] = args[i+1];
break;
case "src":
case "movie":
args[i+1] = AC_AddExtension(args[i+1], ext);
ret.embedAttrs["src"] = args[i+1];
ret.params[srcParamName] = args[i+1];
break;
case "wmode":
ret.embedAttrs["wmode"] = args[i+1];
ret.params["wmode"] = args[i+1];
break;
case "onafterupdate":
case "onbeforeupdate":
case "onblur":
case "oncellchange":
case "onclick":
case "ondblClick":
case "ondrag":
case "ondragend":
case "ondragenter":
case "ondragleave":
case "ondragover":
case "ondrop":
case "onfinish":
case "onfocus":
case "onhelp":
case "onmousedown":
case "onmouseup":
case "onmouseover":
case "onmousemove":
case "onmouseout":
case "onkeypress":
case "onkeydown":
case "onkeyup":
case "onload":
case "onlosecapture":
case "onpropertychange":
case "onreadystatechange":
case "onrowsdelete":
case "onrowenter":
case "onrowexit":
case "onrowsinserted":
case "onstart":
case "onscroll":
case "onbeforeeditfocus":
case "onactivate":
case "onbeforedeactivate":
case "ondeactivate":
case "type":
case "codebase":
ret.objAttrs[args[i]] = args[i+1];
break;
case "width":
case "height":
case "align":
case "vspace":
case "hspace":
case "class":
case "title":
case "accesskey":
case "name":
case "id":
case "tabindex":
ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
break;
default:
ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
}
}
ret.objAttrs["classid"] = classid;
if (mimeType) ret.embedAttrs["type"] = mimeType;
return ret;
}
;
function AJAXInteraction(url, callback, value) {
var req = init();
req.onreadystatechange = processRequest;
function init() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
} else {
alert('ajaxinteraction failed');
}
}
function processRequest () {
if (req.readyState == 4) {
if (req.status == 200) {
if (callback) callback(req.responseXML, value);
}
}
}
this.doGet = function() {
req.open("GET", url, true);
req.send(null);
}
}
;
function niGmapGetLatLngByIDandAddress(id,address,panoResultCB) {
niGmapGsPano(document.getElementById(id));
niGmapPanoResultCB(panoResultCB);
geocoder = niGmapGetGeocoder();
geocoder.getLocations(address, niGmapCBAddressToLatLng);
}
function niGmapPanoResultCB(cb) {
niGmapPanoResultCB.cb = cb;
}
function niGmapGsPano(element) {
if( element ) niGmapGsPano.gsPano = new GStreetviewPanorama(element);
return niGmapGsPano.gsPano;
}
function niGmapGetGsPanoClient() {
if( ! niGmapGetGsPanoClient.gsPanoClient) niGmapGetGsPanoClient.gsPanoClient = new GStreetviewClient();
return niGmapGetGsPanoClient.gsPanoClient;
}
function niGmapGetGeocoder() {
if( ! niGmapGetGeocoder.geocoder) niGmapGetGeocoder.geocoder = new GClientGeocoder();
return niGmapGetGeocoder.geocoder;
}
function niGmapTargetLatLng(latlng) {
if( latlng ) niGmapTargetLatLng.latlng = latlng;
else return niGmapTargetLatLng.latlng;
}
function niGmapInsertGStreetByLatLng(latlng) {
gsPanoClient = niGmapGetGsPanoClient();
niGmapTargetLatLng(latlng);
gsPanoClient.getNearestPanorama(latlng, niGmapCBPanoLatLng);
}
function niGmapCBPanoLatLng(response) {
if(response && response.location)  {
latlng = response.location.latlng;
gsPano = niGmapGsPano();
targetLatLng = niGmapTargetLatLng();
var angle = niGmapGetAngle(latlng,targetLatLng);
var pov = {yaw:angle,pitch:-10};
if(gsPano) gsPano.setLocationAndPOV(latlng, pov);
if(typeof(eval(niGmapPanoResultCB.cb)) != "undefined") {
niGmapPanoResultCB.cb(true);
}
} else {
if(typeof(eval(niGmapPanoResultCB.cb)) != "undefined") {
niGmapPanoResultCB.cb(false);
}
}
}
function niGmapGetAngle(target,source) {
return 180 / Math.PI * Math.atan2((source.lng() - target.lng()) * Math.cos(source.lat() * Math.PI / 180),source.lat() - target.lat());
}
function niGmapCBAddressToLatLng(response) {
if (response || response.Status.code == 200) {
try {
place = response.Placemark[0];
latlng =  new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
niGmapInsertGStreetByLatLng(latlng);
} catch(err) {
if(typeof(eval(niGmapPanoResultCB.cb)) != "undefined") {
niGmapPanoResultCB.cb(false);
}
}
}
}
;
function modifySubmitButton() {
}
function createSearchResultsPagination() {
var numOfPages = document.results.numOfPages.value;
for (i=1; i <= numOfPages; i++) {
x = document.getElementById("listings-page-" + i);
x.style.visibility = "hidden";
x.style.display = "none";
}
showlayer("listings-page-1");
manipulateListingStyle();
updatePagination(1);
addJumpToOptions();
document.getElementById("jump-to-area").style.visibility = "visible";
}
function addJumpToOptions() {
var numOfPages = document.results.numOfPages.value;
for (i=2; i <= numOfPages; i++) {
var y = document.createElement("option");
y.value = "" + i;
y.text = "" + i;
try {
document.getElementById("jump-to").add(y, null);
} catch (ex) {
document.getElementById("jump-to").add(y);
}
}
document.getElementById("jump-to").selectedIndex = 0;
}
function goToPage(page) {
var numOfPages = document.results.numOfPages.value;
for (i=1; i <= numOfPages; i++) {
x = document.getElementById("listings-page-" + i);
x.style.visibility = "hidden";
x.style.display = "none";
}
showlayer("listings-page-" + page);
updatePagination(page);
updateJumpTo(page);
updateListingStyle(page);
}
function checkGoToPage() {
var x = document.getElementById("jump-to");
var page = parseInt(x.options[x.selectedIndex].value);
goToPage(page);
}
function updatePagination(currentPage) {
var pagingMaxSize = 10;
var numOfPages = document.results.numOfPages.value;
var paginationHtml = "";
if (currentPage > 1) {
paginationHtml += "<a href='javascript:goToPage(" + (currentPage - 1) + ")'>prev</a>&#160;<a class='no-underline' href='javascript:goToPage(" + (currentPage - 1) + ")'><img src='/img/previous.gif' width='17' height='14' alt='prev'/></a><span class='paging-separator'>&#160;</span>";
}
var start = 1;
if (numOfPages > pagingMaxSize) {
if (currentPage > (pagingMaxSize/2)) {
start = currentPage - (pagingMaxSize/2);
}
if (numOfPages - start < pagingMaxSize) {
start = numOfPages - (pagingMaxSize - 1);
}
}
var count = 0;
for (i=start; i <= numOfPages && count < pagingMaxSize; i++) {
count += 1;
paginationHtml += "<a href='javascript:goToPage(" + i + ")' class='paging";
if (currentPage == i) { paginationHtml += " highlighted"; }
paginationHtml += "'>" + i + "</a>";
paginationHtml += "<span class='paging-separator'>&#160;</span>";
}
if (currentPage < numOfPages) {
paginationHtml += "<span class='paging-separator'>&#160;</span><a class='no-underline' href='javascript:goToPage(" + (currentPage + 1) + ")'><img src='/img/next.gif' width='17' height='14' alt='next'/></a>&#160;<a href='javascript:goToPage(" + (currentPage + 1) + ")'>next</a>";
}
document.getElementById("pagination-area").innerHTML = paginationHtml;
}
function updateJumpTo(page) {
var x = document.getElementById("jump-to");
for (i=0; i < x.length; i++) {
if (x[i].value == page) {
x.selectedIndex = i;
}
}
}
function manipulateListingStyle() {
var numOfPages = document.results.numOfPages.value;
for (i=1; i <= numOfPages; i++) {
x = document.getElementById("listings-page-" + i);
var y = x.getElementsByTagName("tr");
for (j=0; j < y.length; j++) {
if (j % 2 == 1) {
y[j].className = "sr-row-even";
} else {
y[j].className = "sr-row-odd";
}
}
}
}
function updateListingStyle(page) {
var currentStyle = document.results.currentStyle.value;
var x = document.getElementById("listings-page-" + page);
var y = x.getElementsByTagName("tr");
for (j=0; j < y.length; j++) {
if (j % 2 == 1) {
if (currentStyle == "0") {
y[j].className = "sr-row-odd";
} else {
y[j].className = "sr-row-even";
}
} else {
if (currentStyle == "0") {
y[j].className = "sr-row-even";
} else {
y[j].className = "sr-row-odd";
}
}
}
if (currentStyle == "0") {
document.results.currentStyle.value = "1";
} else {
document.results.currentStyle.value = "0";
}
}
function ValidateUFWelcome() {
if (document.welcome.custzip != null && document.welcome.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.welcome.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
if (document.welcome.usefn != null && document.welcome.usefn.value != null) {
if (document.welcome.custfname.value == "") {
document.welcome.custfname.focus();
alert("Please provide a first name.");
return false;
}
}
if (! (document.welcome.optionalemail != null && document.welcome.optionalemail.value == "true") ||
(document.welcome.custemail.value.length >= 1 && document.welcome.custemail.value != "optional")) {
document.welcome.custemail.value = trimCustomerEmail(document.welcome.custemail.value);
if (document.welcome.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.welcome.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.welcome.custemail.value.indexOf("www.") == 0) {
document.welcome.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
}
return true;
}
function ValidateUFEOPForm() {
if (document.welcome.custzip != null && document.welcome.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.welcome.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
if (document.welcome.usefn != null && document.welcome.usefn.value != null) {
if (document.welcome.custfname.value == "") {
document.welcome.custfname.focus();
alert("Please provide a first name.");
return false;
}
}
if (! (document.welcome.optionalemail != null && document.welcome.optionalemail.value == "true") ||
(document.welcome.custemail.value.length >= 1 && document.welcome.custemail.value != "optional")) {
document.welcome.custemail.value = trimCustomerEmail(document.welcome.custemail.value);
if (document.welcome.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.welcome.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.welcome.custemail.value.indexOf("www.") == 0) {
document.welcome.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
}
if (document.welcome.usephone != null && document.welcome.usephone.value != null) {
var phone = document.welcome.custphone.value;
if (phone.indexOf("-") > 0 || phone.indexOf(" ") > 0 || phone.indexOf("(") > 0 || phone.indexOf(")") > 0) {
phone = phone.replace(/-/g, "").replace(/ /g, "").replace(/\(/g, "").replace(/\)/g, "");
}
if (phone == "") {
document.welcome.custphone.focus();
alert("Please enter a telephone number.");
return false;
} else if (phone.search(/^\d{10}$/) == -1) {
document.welcome.custphone.focus();
alert("Please enter a full 10-digit telephone number, including the area code.");
return false;
} else {
document.welcome.custphone.value = phone.substring(0,3) + "-" + phone.substring(3,6) + "-" + phone.substring(6,10);
if (phone.length >= 3 && checkValidPhoneAreaCode(phone.substring(0,3)) == false) {
document.welcome.custphone.focus();
return false;
} else if (phone.length >= 6 && checkValidPhoneMiddleNumber(phone.substring(3,6)) == false) {
document.welcome.custphone.focus();
return false;
}
}
}
return true;
}
function openPropertyDetails(url) {
var sound = document.getElementById("sound")
if (sound) {
sound.src = "/images/click.wav";
}
var w = 800;
var h = 580;
if (window.screen) {
w = window.screen.availWidth * 95 / 100;
h = window.screen.availHeight * 90 / 100;
}
newWin = window.open(url,'_blank','scrollbars=yes,toolbar=no,resizable=yes,width='+w+',height='+h).focus();
}
function showPropertyDetailsDiv(url) {
document.getElementById("bglayer").style.display = "inline";
document.getElementById("bglayer").style.height = document.body.clientHeight + "px";
document.getElementById("propertyDetailsDiv").style.left = Math.round((document.body.clientWidth/2)-(990/2)) + "px";
document.getElementById("propertyDetailsDiv").style.top = (getScrollTop() + 50) + "px";
document.getElementById("propertyDetailsFrame").src = "";
var ifrm = document.getElementById("propertyDetailsFrame");
ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write("<html><body><div align='center' style='margin-top:160px;'><img src='/images/common/loading.gif' alt=''/></div></body></html>");
ifrm.document.close();
document.getElementById("propertyDetailsFrame").src = url;
}
function processInterstitialConfirmation() {
document.getElementById("interstitial-form").submit();
}
function ValidateCustomerFields() {
document.register.custemail.value = trimCustomerEmail(document.register.custemail.value);
if (document.register.custfname.value == "") {
document.register.custfname.focus();
alert("Please provide first name.");
return false;
}
else if (document.register.custlname.value == "") {
document.register.custlname.focus();
alert("Please provide last name.");
return false;
}
else if (document.register.phone1.value.search(/^\d{3}$/) == -1 ||
document.register.phone2.value.search(/^\d{3}$/) == -1 ||
document.register.phone3.value.search(/^\d{4}$/) == -1) {
document.register.phone1.focus();
alert("Please provide a valid phone number.");
return false;
}
else if (document.register.custemail.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
document.register.custemail.focus();
alert("Please provide a valid email address.");
return false;
} else if (document.register.custemail.value.indexOf("www.") == 0) {
document.register.custemail.focus();
alert("Please provide a valid email address by removing the 'www.' in front.");
return false;
}
else if (document.register.custaddress.value == "") {
document.register.custaddress.focus();
alert("Please provide a street address.");
return false;
}
else if (document.register.custzip.value.search(/^\d{5}(-?\d{4})?$/) == -1) {
document.register.custzip.focus();
alert("Please provide a valid zip code.");
return false;
}
return true;
}
function displayRegistrationAttributes() {
var promo1Top    = document.getElementById("promo1Top");
var promo1Bottom = document.getElementById("promo1Bottom");
var termsTop      = document.getElementById("termsTop");
var termsBottom   = document.getElementById("termsBottom");
var disclaimer    = document.getElementById("disclaimer");
if (promo1Top.innerHTML != '') { showlayer("promo1Top"); }
if (promo1Top.innerHTML == '') { hidelayer("promo1Top"); }
if (promo1Bottom.innerHTML != '') { showlayer("promo1Bottom"); }
if (promo1Bottom.innerHTML == '') { hidelayer("promo1Bottom"); }
if (termsTop.innerHTML != '') { document.getElementById(["termsTop"]).style.visibility = "visible"; }
if (termsTop.innerHTML == '') { document.getElementById(["termsTop"]).style.visibility = "hidden"; }
if (termsBottom.innerHTML != '') { showlayer("termsBottom"); }
if (termsBottom.innerHTML == '') { hidelayer("termsBottom"); }
if (disclaimer.innerHTML != '') { showlayer("disclaimer"); }
if (disclaimer.innerHTML == '') { hidelayer("disclaimer"); }
}
function getUpSellRegistration(productId,regProductId, transactionId, prodCampaignId, uType, formId, formName) {
var strURL = '/upsell-register.do';
xmlHttp = getXmlHttpObject();
var newURL = strURL + '?uspid=' + productId + '&transactionid=' + transactionId + '&prodcampaignid=' + prodCampaignId;
newURL += '&spid=' + regProductId + '&utype=' + uType + '&formId=' + formId + '&formName=' + formName;
xmlHttp.onreadystatechange= setProcessUpSellRegistration;
xmlHttp.open("GET",newURL,true);
xmlHttp.send(null);
}
function GoogleAnalyticsSetup() {
var gaJsHost = "http://www.";
document.write(unescape("%3Cscript src='http://www.google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
}
AC_FL_RunContent = 0;
DetectFlashVer = 0;
var requiredMajorVersion = 9;
var requiredMinorVersion = 0;
var requiredRevision = 0;
function addCarousel() {
if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
alert("This page requires AC_RunActiveContent.js.");
} else {
var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
if (hasRightVersion) {
document.getElementById("alternateCarouselContent").style.display = "none";
AC_FL_RunContent(
'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab',
'width','400',
'height','390',
'id','carousel',
'align','middle',
'src','carousel',
'quality','high',
'scale','showall',
'wmode','transparent',
'bgcolor','white',
'name','testimonials',
'allowscriptaccess', 'sameDomain',
'allowfullscreen', 'false',
'pluginspage','http://www.macromedia.com/go/getflashplayer',
'movie','/carousel',
'FlashVars','trialURL=/property-details.html?from=carousel&trialTarget=_self&searchURL=/search.html?from=carousel&searchTarget=_self');
}
}
}