
/* prototype.js */
/*  Prototype JavaScript framework, version 1.5.1.1
*  (c) 2005-2007 Sam Stephenson
*
*  Prototype is freely distributable under the terms of an MIT-style license.
*  For details, see the Prototype web site: http://www.prototypejs.org/
*
/*--------------------------------------------------------------------------*/
var Prototype = {
Version: '1.5.1.1',
Browser: {
IE:     !!(window.attachEvent && !window.opera),
Opera:  !!window.opera,
WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
},
BrowserFeatures: {
XPath: !!document.evaluate,
ElementExtensions: !!window.HTMLElement,
SpecificElementExtensions:
(document.createElement('div').__proto__ !==
document.createElement('form').__proto__)
},
ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
emptyFunction: function() { },
K: function(x) { return x }
}
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
var Abstract = new Object();
Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
Object.extend(Object, {
inspect: function(object) {
try {
if (object === undefined) return 'undefined';
if (object === null) return 'null';
return object.inspect ? object.inspect() : object.toString();
} catch (e) {
if (e instanceof RangeError) return '...';
throw e;
}
},
toJSON: function(object) {
var type = typeof object;
switch(type) {
case 'undefined':
case 'function':
case 'unknown': return;
case 'boolean': return object.toString();
}
if (object === null) return 'null';
if (object.toJSON) return object.toJSON();
if (object.ownerDocument === document) return;
var results = [];
for (var property in object) {
var value = Object.toJSON(object[property]);
if (value !== undefined)
results.push(property.toJSON() + ': ' + value);
}
return '{' + results.join(', ') + '}';
},
keys: function(object) {
var keys = [];
for (var property in object)
keys.push(property);
return keys;
},
values: function(object) {
var values = [];
for (var property in object)
values.push(object[property]);
return values;
},
clone: function(object) {
return Object.extend({}, object);
}
});
Function.prototype.bind = function() {
var __method = this, args = $A(arguments), object = args.shift();
return function() {
return __method.apply(object, args.concat($A(arguments)));
}
}
Function.prototype.bindAsEventListener = function(object) {
var __method = this, args = $A(arguments), object = args.shift();
return function(event) {
return __method.apply(object, [event || window.event].concat(args));
}
}
Object.extend(Number.prototype, {
toColorPart: function() {
return this.toPaddedString(2, 16);
},
succ: function() {
return this + 1;
},
times: function(iterator) {
$R(0, this, true).each(iterator);
return this;
},
toPaddedString: function(length, radix) {
var string = this.toString(radix || 10);
return '0'.times(length - string.length) + string;
},
toJSON: function() {
return isFinite(this) ? this.toString() : 'null';
}
});
Date.prototype.toJSON = function() {
return '"' + this.getFullYear() + '-' +
(this.getMonth() + 1).toPaddedString(2) + '-' +
this.getDate().toPaddedString(2) + 'T' +
this.getHours().toPaddedString(2) + ':' +
this.getMinutes().toPaddedString(2) + ':' +
this.getSeconds().toPaddedString(2) + '"';
};
var Try = {
these: function() {
var returnValue;
for (var i = 0, length = arguments.length; i < length; i++) {
var lambda = arguments[i];
try {
returnValue = lambda();
break;
} catch (e) {}
}
return returnValue;
}
}
/*--------------------------------------------------------------------------*/
var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
stop: function() {
if (!this.timer) return;
clearInterval(this.timer);
this.timer = null;
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.callback(this);
} finally {
this.currentlyExecuting = false;
}
}
}
}
Object.extend(String, {
interpret: function(value) {
return value == null ? '' : String(value);
},
specialChar: {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'\\': '\\\\'
}
});
Object.extend(String.prototype, {
gsub: function(pattern, replacement) {
var result = '', source = this, match;
replacement = arguments.callee.prepareReplacement(replacement);
while (source.length > 0) {
if (match = source.match(pattern)) {
result += source.slice(0, match.index);
result += String.interpret(replacement(match));
source  = source.slice(match.index + match[0].length);
} else {
result += source, source = '';
}
}
return result;
},
sub: function(pattern, replacement, count) {
replacement = this.gsub.prepareReplacement(replacement);
count = count === undefined ? 1 : count;
return this.gsub(pattern, function(match) {
if (--count < 0) return match[0];
return replacement(match);
});
},
scan: function(pattern, iterator) {
this.gsub(pattern, iterator);
return this;
},
truncate: function(length, truncation) {
length = length || 30;
truncation = truncation === undefined ? '...' : truncation;
return this.length > length ?
this.slice(0, length - truncation.length) + truncation : this;
},
strip: function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
},
stripTags: function() {
return this.replace(/<\/?[^>]+>/gi, '');
},
stripScripts: function() {
return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
},
extractScripts: function() {
var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
return (this.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
},
evalScripts: function() {
return this.extractScripts().map(function(script) { return eval(script) });
},
escapeHTML: function() {
var self = arguments.callee;
self.text.data = this;
return self.div.innerHTML;
},
unescapeHTML: function() {
var div = document.createElement('div');
div.innerHTML = this.stripTags();
return div.childNodes[0] ? (div.childNodes.length > 1 ?
$A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
div.childNodes[0].nodeValue) : '';
},
toQueryParams: function(separator) {
var match = this.strip().match(/([^?#]*)(#.*)?$/);
if (!match) return {};
return match[1].split(separator || '&').inject({}, function(hash, pair) {
if ((pair = pair.split('='))[0]) {
var key = decodeURIComponent(pair.shift());
var value = pair.length > 1 ? pair.join('=') : pair[0];
if (value != undefined) value = decodeURIComponent(value);
if (key in hash) {
if (hash[key].constructor != Array) hash[key] = [hash[key]];
hash[key].push(value);
}
else hash[key] = value;
}
return hash;
});
},
toArray: function() {
return this.split('');
},
succ: function() {
return this.slice(0, this.length - 1) +
String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
},
times: function(count) {
var result = '';
for (var i = 0; i < count; i++) result += this;
return result;
},
camelize: function() {
var parts = this.split('-'), len = parts.length;
if (len == 1) return parts[0];
var camelized = this.charAt(0) == '-'
? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
: parts[0];
for (var i = 1; i < len; i++)
camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
return camelized;
},
capitalize: function() {
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
},
underscore: function() {
return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
},
dasherize: function() {
return this.gsub(/_/,'-');
},
inspect: function(useDoubleQuotes) {
var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
var character = String.specialChar[match[0]];
return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
});
if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
return "'" + escapedString.replace(/'/g, '\\\'') + "'";
},
toJSON: function() {
return this.inspect(true);
},
unfilterJSON: function(filter) {
return this.sub(filter || Prototype.JSONFilter, '#{1}');
},
isJSON: function() {
var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
},
evalJSON: function(sanitize) {
var json = this.unfilterJSON();
try {
if (!sanitize || json.isJSON()) return eval('(' + json + ')');
} catch (e) { }
throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
},
include: function(pattern) {
return this.indexOf(pattern) > -1;
},
startsWith: function(pattern) {
return this.indexOf(pattern) === 0;
},
endsWith: function(pattern) {
var d = this.length - pattern.length;
return d >= 0 && this.lastIndexOf(pattern) === d;
},
empty: function() {
return this == '';
},
blank: function() {
return /^\s*$/.test(this);
}
});
if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
escapeHTML: function() {
return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
},
unescapeHTML: function() {
return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
}
});
String.prototype.gsub.prepareReplacement = function(replacement) {
if (typeof replacement == 'function') return replacement;
var template = new Template(replacement);
return function(match) { return template.evaluate(match) };
}
String.prototype.parseQuery = String.prototype.toQueryParams;
Object.extend(String.prototype.escapeHTML, {
div:  document.createElement('div'),
text: document.createTextNode('')
});
with (String.prototype.escapeHTML) div.appendChild(text);
var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
initialize: function(template, pattern) {
this.template = template.toString();
this.pattern  = pattern || Template.Pattern;
},
evaluate: function(object) {
return this.template.gsub(this.pattern, function(match) {
var before = match[1];
if (before == '\\') return match[2];
return before + String.interpret(object[match[3]]);
});
}
}
var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead');
var Enumerable = {
each: function(iterator) {
var index = 0;
try {
this._each(function(value) {
iterator(value, index++);
});
} catch (e) {
if (e != $break) throw e;
}
return this;
},
eachSlice: function(number, iterator) {
var index = -number, slices = [], array = this.toArray();
while ((index += number) < array.length)
slices.push(array.slice(index, index+number));
return slices.map(iterator);
},
all: function(iterator) {
var result = true;
this.each(function(value, index) {
result = result && !!(iterator || Prototype.K)(value, index);
if (!result) throw $break;
});
return result;
},
any: function(iterator) {
var result = false;
this.each(function(value, index) {
if (result = !!(iterator || Prototype.K)(value, index))
throw $break;
});
return result;
},
collect: function(iterator) {
var results = [];
this.each(function(value, index) {
results.push((iterator || Prototype.K)(value, index));
});
return results;
},
detect: function(iterator) {
var result;
this.each(function(value, index) {
if (iterator(value, index)) {
result = value;
throw $break;
}
});
return result;
},
findAll: function(iterator) {
var results = [];
this.each(function(value, index) {
if (iterator(value, index))
results.push(value);
});
return results;
},
grep: function(pattern, iterator) {
var results = [];
this.each(function(value, index) {
var stringValue = value.toString();
if (stringValue.match(pattern))
results.push((iterator || Prototype.K)(value, index));
})
return results;
},
include: function(object) {
var found = false;
this.each(function(value) {
if (value == object) {
found = true;
throw $break;
}
});
return found;
},
inGroupsOf: function(number, fillWith) {
fillWith = fillWith === undefined ? null : fillWith;
return this.eachSlice(number, function(slice) {
while(slice.length < number) slice.push(fillWith);
return slice;
});
},
inject: function(memo, iterator) {
this.each(function(value, index) {
memo = iterator(memo, value, index);
});
return memo;
},
invoke: function(method) {
var args = $A(arguments).slice(1);
return this.map(function(value) {
return value[method].apply(value, args);
});
},
max: function(iterator) {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
if (result == undefined || value >= result)
result = value;
});
return result;
},
min: function(iterator) {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
if (result == undefined || value < result)
result = value;
});
return result;
},
partition: function(iterator) {
var trues = [], falses = [];
this.each(function(value, index) {
((iterator || Prototype.K)(value, index) ?
trues : falses).push(value);
});
return [trues, falses];
},
pluck: function(property) {
var results = [];
this.each(function(value, index) {
results.push(value[property]);
});
return results;
},
reject: function(iterator) {
var results = [];
this.each(function(value, index) {
if (!iterator(value, index))
results.push(value);
});
return results;
},
sortBy: function(iterator) {
return this.map(function(value, index) {
return {value: value, criteria: iterator(value, index)};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}).pluck('value');
},
toArray: function() {
return this.map();
},
zip: function() {
var iterator = Prototype.K, args = $A(arguments);
if (typeof args.last() == 'function')
iterator = args.pop();
var collections = [this].concat(args).map($A);
return this.map(function(value, index) {
return iterator(collections.pluck(index));
});
},
size: function() {
return this.toArray().length;
},
inspect: function() {
return '#<Enumerable:' + this.toArray().inspect() + '>';
}
}
Object.extend(Enumerable, {
map:     Enumerable.collect,
find:    Enumerable.detect,
select:  Enumerable.findAll,
member:  Enumerable.include,
entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) {
return iterable.toArray();
} else {
var results = [];
for (var i = 0, length = iterable.length; i < length; i++)
results.push(iterable[i]);
return results;
}
}
if (Prototype.Browser.WebKit) {
$A = Array.from = function(iterable) {
if (!iterable) return [];
if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&
iterable.toArray) {
return iterable.toArray();
} else {
var results = [];
for (var i = 0, length = iterable.length; i < length; i++)
results.push(iterable[i]);
return results;
}
}
}
Object.extend(Array.prototype, Enumerable);
if (!Array.prototype._reverse)
Array.prototype._reverse = Array.prototype.reverse;
Object.extend(Array.prototype, {
_each: function(iterator) {
for (var i = 0, length = this.length; i < length; i++)
iterator(this[i]);
},
clear: function() {
this.length = 0;
return this;
},
first: function() {
return this[0];
},
last: function() {
return this[this.length - 1];
},
compact: function() {
return this.select(function(value) {
return value != null;
});
},
flatten: function() {
return this.inject([], function(array, value) {
return array.concat(value && value.constructor == Array ?
value.flatten() : [value]);
});
},
without: function() {
var values = $A(arguments);
return this.select(function(value) {
return !values.include(value);
});
},
indexOf: function(object) {
for (var i = 0, length = this.length; i < length; i++)
if (this[i] == object) return i;
return -1;
},
reverse: function(inline) {
return (inline !== false ? this : this.toArray())._reverse();
},
reduce: function() {
return this.length > 1 ? this : this[0];
},
uniq: function(sorted) {
return this.inject([], function(array, value, index) {
if (0 == index || (sorted ? array.last() != value : !array.include(value)))
array.push(value);
return array;
});
},
clone: function() {
return [].concat(this);
},
size: function() {
return this.length;
},
inspect: function() {
return '[' + this.map(Object.inspect).join(', ') + ']';
},
toJSON: function() {
var results = [];
this.each(function(object) {
var value = Object.toJSON(object);
if (value !== undefined) results.push(value);
});
return '[' + results.join(', ') + ']';
}
});
Array.prototype.toArray = Array.prototype.clone;
function $w(string) {
string = string.strip();
return string ? string.split(/\s+/) : [];
}
if (Prototype.Browser.Opera){
Array.prototype.concat = function() {
var array = [];
for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
for (var i = 0, length = arguments.length; i < length; i++) {
if (arguments[i].constructor == Array) {
for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
array.push(arguments[i][j]);
} else {
array.push(arguments[i]);
}
}
return array;
}
}
var Hash = function(object) {
if (object instanceof Hash) this.merge(object);
else Object.extend(this, object || {});
};
Object.extend(Hash, {
toQueryString: function(obj) {
var parts = [];
parts.add = arguments.callee.addPair;
this.prototype._each.call(obj, function(pair) {
if (!pair.key) return;
var value = pair.value;
if (value && typeof value == 'object') {
if (value.constructor == Array) value.each(function(value) {
parts.add(pair.key, value);
});
return;
}
parts.add(pair.key, value);
});
return parts.join('&');
},
toJSON: function(object) {
var results = [];
this.prototype._each.call(object, function(pair) {
var value = Object.toJSON(pair.value);
if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);
});
return '{' + results.join(', ') + '}';
}
});
Hash.toQueryString.addPair = function(key, value, prefix) {
key = encodeURIComponent(key);
if (value === undefined) this.push(key);
else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));
}
Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
_each: function(iterator) {
for (var key in this) {
var value = this[key];
if (value && value == Hash.prototype[key]) continue;
var pair = [key, value];
pair.key = key;
pair.value = value;
iterator(pair);
}
},
keys: function() {
return this.pluck('key');
},
values: function() {
return this.pluck('value');
},
merge: function(hash) {
return $H(hash).inject(this, function(mergedHash, pair) {
mergedHash[pair.key] = pair.value;
return mergedHash;
});
},
remove: function() {
var result;
for(var i = 0, length = arguments.length; i < length; i++) {
var value = this[arguments[i]];
if (value !== undefined){
if (result === undefined) result = value;
else {
if (result.constructor != Array) result = [result];
result.push(value)
}
}
delete this[arguments[i]];
}
return result;
},
toQueryString: function() {
return Hash.toQueryString(this);
},
inspect: function() {
return '#<Hash:{' + this.map(function(pair) {
return pair.map(Object.inspect).join(': ');
}).join(', ') + '}>';
},
toJSON: function() {
return Hash.toJSON(this);
}
});
function $H(object) {
if (object instanceof Hash) return object;
return new Hash(object);
};
if (function() {
var i = 0, Test = function(value) { this.key = value };
Test.prototype.key = 'foo';
for (var property in new Test('bar')) i++;
return i > 1;
}()) Hash.prototype._each = function(iterator) {
var cache = [];
for (var key in this) {
var value = this[key];
if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;
cache.push(key);
var pair = [key, value];
pair.key = key;
pair.value = value;
iterator(pair);
}
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
initialize: function(start, end, exclusive) {
this.start = start;
this.end = end;
this.exclusive = exclusive;
},
_each: function(iterator) {
var value = this.start;
while (this.include(value)) {
iterator(value);
value = value.succ();
}
},
include: function(value) {
if (value < this.start)
return false;
if (this.exclusive)
return value < this.end;
return value <= this.end;
}
});
var $R = function(start, end, exclusive) {
return new ObjectRange(start, end, exclusive);
}
var Ajax = {
getTransport: function() {
return Try.these(
function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false;
},
activeRequestCount: 0
}
Ajax.Responders = {
responders: [],
_each: function(iterator) {
this.responders._each(iterator);
},
register: function(responder) {
if (!this.include(responder))
this.responders.push(responder);
},
unregister: function(responder) {
this.responders = this.responders.without(responder);
},
dispatch: function(callback, request, transport, json) {
this.each(function(responder) {
if (typeof responder[callback] == 'function') {
try {
responder[callback].apply(responder, [request, transport, json]);
} catch (e) {}
}
});
}
};
Object.extend(Ajax.Responders, Enumerable);
Ajax.Responders.register({
onCreate: function() {
Ajax.activeRequestCount++;
},
onComplete: function() {
Ajax.activeRequestCount--;
}
});
Ajax.Base = function() {};
Ajax.Base.prototype = {
setOptions: function(options) {
this.options = {
method:       'post',
asynchronous: true,
contentType:  'application/x-www-form-urlencoded',
encoding:     'UTF-8',
parameters:   ''
}
Object.extend(this.options, options || {});
this.options.method = this.options.method.toLowerCase();
if (typeof this.options.parameters == 'string')
this.options.parameters = this.options.parameters.toQueryParams();
}
}
Ajax.Request = Class.create();
Ajax.Request.Events =
['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
_complete: false,
initialize: function(url, options) {
this.transport = Ajax.getTransport();
this.setOptions(options);
this.request(url);
},
request: function(url) {
this.url = url;
this.method = this.options.method;
var params = Object.clone(this.options.parameters);
if (!['get', 'post'].include(this.method)) {
params['_method'] = this.method;
this.method = 'post';
}
this.parameters = params;
if (params = Hash.toQueryString(params)) {
if (this.method == 'get')
this.url += (this.url.include('?') ? '&' : '?') + params;
else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
params += '&_=';
}
try {
if (this.options.onCreate) this.options.onCreate(this.transport);
Ajax.Responders.dispatch('onCreate', this, this.transport);
this.transport.open(this.method.toUpperCase(), this.url,
this.options.asynchronous);
if (this.options.asynchronous)
setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
this.transport.onreadystatechange = this.onStateChange.bind(this);
this.setRequestHeaders();
this.body = this.method == 'post' ? (this.options.postBody || params) : null;
this.transport.send(this.body);
/* 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);
}
var contentType = this.getHeader('Content-type');
if (contentType && contentType.strip().
match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
this.evalResponse();
}
try {
(this.options['on' + state] || Prototype.emptyFunction)(transport, json);
Ajax.Responders.dispatch('on' + state, this, transport, json);
} catch (e) {
this.dispatchException(e);
}
if (state == 'Complete') {
this.transport.onreadystatechange = Prototype.emptyFunction;
}
},
getHeader: function(name) {
try {
return this.transport.getResponseHeader(name);
} catch (e) { return null }
},
evalJSON: function() {
try {
var json = this.getHeader('X-JSON');
return json ? json.evalJSON() : null;
} catch (e) { return null }
},
evalResponse: function() {
try {
return eval((this.transport.responseText || '').unfilterJSON());
} catch (e) {
this.dispatchException(e);
}
},
dispatchException: function(exception) {
(this.options.onException || Prototype.emptyFunction)(this, exception);
Ajax.Responders.dispatch('onException', this, exception);
}
});
Ajax.Updater = Class.create();
Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
initialize: function(container, url, options) {
this.container = {
success: (container.success || container),
failure: (container.failure || (container.success ? null : container))
}
this.transport = Ajax.getTransport();
this.setOptions(options);
var onComplete = this.options.onComplete || Prototype.emptyFunction;
this.options.onComplete = (function(transport, param) {
this.updateContent();
onComplete(transport, param);
}).bind(this);
this.request(url);
},
updateContent: function() {
var receiver = this.container[this.success() ? 'success' : 'failure'];
var response = this.transport.responseText;
if (!this.options.evalScripts) response = response.stripScripts();
if (receiver = $(receiver)) {
if (this.options.insertion)
new this.options.insertion(receiver, response);
else
receiver.update(response);
}
if (this.success()) {
if (this.onComplete)
setTimeout(this.onComplete.bind(this), 10);
}
}
});
Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
initialize: function(container, url, options) {
this.setOptions(options);
this.onComplete = this.options.onComplete;
this.frequency = (this.options.frequency || 2);
this.decay = (this.options.decay || 1);
this.updater = {};
this.container = container;
this.url = url;
this.start();
},
start: function() {
this.options.onComplete = this.updateComplete.bind(this);
this.onTimerEvent();
},
stop: function() {
this.updater.options.onComplete = undefined;
clearTimeout(this.timer);
(this.onComplete || Prototype.emptyFunction).apply(this, arguments);
},
updateComplete: function(request) {
if (this.options.decay) {
this.decay = (request.responseText == this.lastText ?
this.decay * this.options.decay : 1);
this.lastText = request.responseText;
}
this.timer = setTimeout(this.onTimerEvent.bind(this),
this.decay * this.frequency * 1000);
},
onTimerEvent: function() {
this.updater = new Ajax.Updater(this.container, this.url, this.options);
}
});
function $(element) {
if (arguments.length > 1) {
for (var i = 0, elements = [], length = arguments.length; i < length; i++)
elements.push($(arguments[i]));
return elements;
}
if (typeof element == 'string')
element = document.getElementById(element);
return Element.extend(element);
}
if (Prototype.BrowserFeatures.XPath) {
document._getElementsByXPath = function(expression, parentElement) {
var results = [];
var query = document.evaluate(expression, $(parentElement) || document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0, length = query.snapshotLength; i < length; i++)
results.push(query.snapshotItem(i));
return results;
};
document.getElementsByClassName = function(className, parentElement) {
var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
return document._getElementsByXPath(q, parentElement);
}
} else document.getElementsByClassName = function(className, parentElement) {
var children = ($(parentElement) || document.body).getElementsByTagName('*');
var elements = [], child, pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");
for (var i = 0, length = children.length; i < length; i++) {
child = children[i];
var elementClassName = child.className;
if (elementClassName.length == 0) continue;
if (elementClassName == className || elementClassName.match(pattern))
elements.push(Element.extend(child));
}
return elements;
};
/*--------------------------------------------------------------------------*/
if (!window.Element) var Element = {};
Element.extend = function(element) {
var F = Prototype.BrowserFeatures;
if (!element || !element.tagName || element.nodeType == 3 ||
element._extended || F.SpecificElementExtensions || element == window)
return element;
var methods = {}, tagName = element.tagName, cache = Element.extend.cache,
T = Element.Methods.ByTag;
if (!F.ElementExtensions) {
Object.extend(methods, Element.Methods),
Object.extend(methods, Element.Methods.Simulated);
}
if (T[tagName]) Object.extend(methods, T[tagName]);
for (var property in methods) {
var value = methods[property];
if (typeof value == 'function' && !(property in element))
element[property] = cache.findOrStore(value);
}
element._extended = Prototype.emptyFunction;
return element;
};
Element.extend.cache = {
findOrStore: function(value) {
return this[value] = this[value] || function() {
return value.apply(null, [this].concat($A(arguments)));
}
}
};
Element.Methods = {
visible: function(element) {
return $(element).style.display != 'none';
},
toggle: function(element) {
element = $(element);
Element[Element.visible(element) ? 'hide' : 'show'](element);
return element;
},
hide: function(element) {
$(element).style.display = 'none';
return element;
},
show: function(element) {
$(element).style.display = '';
return element;
},
remove: function(element) {
element = $(element);
element.parentNode.removeChild(element);
return element;
},
update: function(element, html) {
html = typeof html == 'undefined' ? '' : html.toString();
$(element).innerHTML = html.stripScripts();
setTimeout(function() {html.evalScripts()}, 10);
return element;
},
replace: function(element, html) {
element = $(element);
html = typeof html == 'undefined' ? '' : html.toString();
if (element.outerHTML) {
element.outerHTML = html.stripScripts();
} else {
var range = element.ownerDocument.createRange();
range.selectNodeContents(element);
element.parentNode.replaceChild(
range.createContextualFragment(html.stripScripts()), element);
}
setTimeout(function() {html.evalScripts()}, 10);
return element;
},
inspect: function(element) {
element = $(element);
var result = '<' + element.tagName.toLowerCase();
$H({'id': 'id', 'className': 'class'}).each(function(pair) {
var property = pair.first(), attribute = pair.last();
var value = (element[property] || '').toString();
if (value) result += ' ' + attribute + '=' + value.inspect(true);
});
return result + '>';
},
recursivelyCollect: function(element, property) {
element = $(element);
var elements = [];
while (element = element[property])
if (element.nodeType == 1)
elements.push(Element.extend(element));
return elements;
},
ancestors: function(element) {
return $(element).recursivelyCollect('parentNode');
},
descendants: function(element) {
return $A($(element).getElementsByTagName('*')).each(Element.extend);
},
firstDescendant: function(element) {
element = $(element).firstChild;
while (element && element.nodeType != 1) element = element.nextSibling;
return $(element);
},
immediateDescendants: function(element) {
if (!(element = $(element).firstChild)) return [];
while (element && element.nodeType != 1) element = element.nextSibling;
if (element) return [element].concat($(element).nextSiblings());
return [];
},
previousSiblings: function(element) {
return $(element).recursivelyCollect('previousSibling');
},
nextSiblings: function(element) {
return $(element).recursivelyCollect('nextSibling');
},
siblings: function(element) {
element = $(element);
return element.previousSiblings().reverse().concat(element.nextSiblings());
},
match: function(element, selector) {
if (typeof selector == 'string')
selector = new Selector(selector);
return selector.match($(element));
},
up: function(element, expression, index) {
element = $(element);
if (arguments.length == 1) return $(element.parentNode);
var ancestors = element.ancestors();
return expression ? Selector.findElement(ancestors, expression, index) :
ancestors[index || 0];
},
down: function(element, expression, index) {
element = $(element);
if (arguments.length == 1) return element.firstDescendant();
var descendants = element.descendants();
return expression ? Selector.findElement(descendants, expression, index) :
descendants[index || 0];
},
previous: function(element, expression, index) {
element = $(element);
if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
var previousSiblings = element.previousSiblings();
return expression ? Selector.findElement(previousSiblings, expression, index) :
previousSiblings[index || 0];
},
next: function(element, expression, index) {
element = $(element);
if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
var nextSiblings = element.nextSiblings();
return expression ? Selector.findElement(nextSiblings, expression, index) :
nextSiblings[index || 0];
},
getElementsBySelector: function() {
var args = $A(arguments), element = $(args.shift());
return Selector.findChildElements(element, args);
},
getElementsByClassName: function(element, className) {
return document.getElementsByClassName(className, element);
},
readAttribute: function(element, name) {
element = $(element);
if (Prototype.Browser.IE) {
if (!element.attributes) return null;
var t = Element._attributeTranslations;
if (t.values[name]) return t.values[name](element, name);
if (t.names[name])  name = t.names[name];
var attribute = element.attributes[name];
return attribute ? attribute.nodeValue : null;
}
return element.getAttribute(name);
},
getHeight: function(element) {
return $(element).getDimensions().height;
},
getWidth: function(element) {
return $(element).getDimensions().width;
},
classNames: function(element) {
return new Element.ClassNames(element);
},
hasClassName: function(element, className) {
if (!(element = $(element))) return;
var elementClassName = element.className;
if (elementClassName.length == 0) return false;
if (elementClassName == className ||
elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
return true;
return false;
},
addClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element).add(className);
return element;
},
removeClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element).remove(className);
return element;
},
toggleClassName: function(element, className) {
if (!(element = $(element))) return;
Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
return element;
},
observe: function() {
Event.observe.apply(Event, arguments);
return $A(arguments).first();
},
stopObserving: function() {
Event.stopObserving.apply(Event, arguments);
return $A(arguments).first();
},
cleanWhitespace: function(element) {
element = $(element);
var node = element.firstChild;
while (node) {
var nextNode = node.nextSibling;
if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
element.removeChild(node);
node = nextNode;
}
return element;
},
empty: function(element) {
return $(element).innerHTML.blank();
},
descendantOf: function(element, ancestor) {
element = $(element), ancestor = $(ancestor);
while (element = element.parentNode)
if (element == ancestor) return true;
return false;
},
scrollTo: function(element) {
element = $(element);
var pos = Position.cumulativeOffset(element);
window.scrollTo(pos[0], pos[1]);
return element;
},
getStyle: function(element, style) {
element = $(element);
style = style == 'float' ? 'cssFloat' : style.camelize();
var value = element.style[style];
if (!value) {
var css = document.defaultView.getComputedStyle(element, null);
value = css ? css[style] : null;
}
if (style == 'opacity') return value ? parseFloat(value) : 1.0;
return value == 'auto' ? null : value;
},
getOpacity: function(element) {
return $(element).getStyle('opacity');
},
setStyle: function(element, styles, camelized) {
element = $(element);
var elementStyle = element.style;
for (var property in styles)
if (property == 'opacity') element.setOpacity(styles[property])
else
elementStyle[(property == 'float' || property == 'cssFloat') ?
(elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
(camelized ? property : property.camelize())] = styles[property];
return element;
},
setOpacity: function(element, value) {
element = $(element);
element.style.opacity = (value == 1 || value === '') ? '' :
(value < 0.00001) ? 0 : value;
return element;
},
getDimensions: function(element) {
element = $(element);
var display = $(element).getStyle('display');
if (display != 'none' && display != null) // Safari bug
return {width: element.offsetWidth, height: element.offsetHeight};
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,
childElements: Element.Methods.immediateDescendants
});
if (Prototype.Browser.Opera) {
Element.Methods._getStyle = Element.Methods.getStyle;
Element.Methods.getStyle = function(element, style) {
switch(style) {
case 'left':
case 'top':
case 'right':
case 'bottom':
if (Element._getStyle(element, 'position') == 'static') return null;
default: return Element._getStyle(element, style);
}
};
}
else if (Prototype.Browser.IE) {
Element.Methods.getStyle = function(element, style) {
element = $(element);
style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
var value = element.style[style];
if (!value && element.currentStyle) value = element.currentStyle[style];
if (style == 'opacity') {
if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
if (value[1]) return parseFloat(value[1]) / 100;
return 1.0;
}
if (value == 'auto') {
if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
return element['offset'+style.capitalize()] + 'px';
return null;
}
return value;
};
Element.Methods.setOpacity = function(element, value) {
element = $(element);
var filter = element.getStyle('filter'), style = element.style;
if (value == 1 || value === '') {
style.filter = filter.replace(/alpha\([^\)]*\)/gi,'');
return element;
} else if (value < 0.00001) value = 0;
style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') +
'alpha(opacity=' + (value * 100) + ')';
return element;
};
Element.Methods.update = function(element, html) {
element = $(element);
html = typeof html == 'undefined' ? '' : html.toString();
var tagName = element.tagName.toUpperCase();
if (['THEAD','TBODY','TR','TD'].include(tagName)) {
var div = document.createElement('div');
switch (tagName) {
case 'THEAD':
case 'TBODY':
div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
depth = 2;
break;
case 'TR':
div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
depth = 3;
break;
case 'TD':
div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
depth = 4;
}
$A(element.childNodes).each(function(node) { element.removeChild(node) });
depth.times(function() { div = div.firstChild });
$A(div.childNodes).each(function(node) { element.appendChild(node) });
} else {
element.innerHTML = html.stripScripts();
}
setTimeout(function() { html.evalScripts() }, 10);
return element;
}
}
else if (Prototype.Browser.Gecko) {
Element.Methods.setOpacity = function(element, value) {
element = $(element);
element.style.opacity = (value == 1) ? 0.999999 :
(value === '') ? '' : (value < 0.00001) ? 0 : value;
return element;
};
}
Element._attributeTranslations = {
names: {
colspan:   "colSpan",
rowspan:   "rowSpan",
valign:    "vAlign",
datetime:  "dateTime",
accesskey: "accessKey",
tabindex:  "tabIndex",
enctype:   "encType",
maxlength: "maxLength",
readonly:  "readOnly",
longdesc:  "longDesc"
},
values: {
_getAttr: function(element, attribute) {
return element.getAttribute(attribute, 2);
},
_flag: function(element, attribute) {
return $(element).hasAttribute(attribute) ? attribute : null;
},
style: function(element) {
return element.style.cssText.toLowerCase();
},
title: function(element) {
var node = element.getAttributeNode('title');
return node.specified ? node.nodeValue : null;
}
}
};
(function() {
Object.extend(this, {
href: this._getAttr,
src:  this._getAttr,
type: this._getAttr,
disabled: this._flag,
checked:  this._flag,
readonly: this._flag,
multiple: this._flag
});
}).call(Element._attributeTranslations.values);
Element.Methods.Simulated = {
hasAttribute: function(element, attribute) {
var t = Element._attributeTranslations, node;
attribute = t.names[attribute] || attribute;
node = $(element).getAttributeNode(attribute);
return node && node.specified;
}
};
Element.Methods.ByTag = {};
Object.extend(Element, Element.Methods);
if (!Prototype.BrowserFeatures.ElementExtensions &&
document.createElement('div').__proto__) {
window.HTMLElement = {};
window.HTMLElement.prototype = document.createElement('div').__proto__;
Prototype.BrowserFeatures.ElementExtensions = true;
}
Element.hasAttribute = function(element, attribute) {
if (element.hasAttribute) return element.hasAttribute(attribute);
return Element.Methods.Simulated.hasAttribute(element, attribute);
};
Element.addMethods = function(methods) {
var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
if (!methods) {
Object.extend(Form, Form.Methods);
Object.extend(Form.Element, Form.Element.Methods);
Object.extend(Element.Methods.ByTag, {
"FORM":     Object.clone(Form.Methods),
"INPUT":    Object.clone(Form.Element.Methods),
"SELECT":   Object.clone(Form.Element.Methods),
"TEXTAREA": Object.clone(Form.Element.Methods)
});
}
if (arguments.length == 2) {
var tagName = methods;
methods = arguments[1];
}
if (!tagName) Object.extend(Element.Methods, methods || {});
else {
if (tagName.constructor == Array) tagName.each(extend);
else extend(tagName);
}
function extend(tagName) {
tagName = tagName.toUpperCase();
if (!Element.Methods.ByTag[tagName])
Element.Methods.ByTag[tagName] = {};
Object.extend(Element.Methods.ByTag[tagName], methods);
}
function copy(methods, destination, onlyIfAbsent) {
onlyIfAbsent = onlyIfAbsent || false;
var cache = Element.extend.cache;
for (var property in methods) {
var value = methods[property];
if (!onlyIfAbsent || !(property in destination))
destination[property] = cache.findOrStore(value);
}
}
function findDOMClass(tagName) {
var klass;
var trans = {
"OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
"FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
"DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
"H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
"INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
"TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
"TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
"TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
"FrameSet", "IFRAME": "IFrame"
};
if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
if (window[klass]) return window[klass];
klass = 'HTML' + tagName + 'Element';
if (window[klass]) return window[klass];
klass = 'HTML' + tagName.capitalize() + 'Element';
if (window[klass]) return window[klass];
window[klass] = {};
window[klass].prototype = document.createElement(tagName).__proto__;
return window[klass];
}
if (F.ElementExtensions) {
copy(Element.Methods, HTMLElement.prototype);
copy(Element.Methods.Simulated, HTMLElement.prototype, true);
}
if (F.SpecificElementExtensions) {
for (var tag in Element.Methods.ByTag) {
var klass = findDOMClass(tag);
if (typeof klass == "undefined") continue;
copy(T[tag], klass.prototype);
}
}
Object.extend(Element, Element.Methods);
delete Element.ByTag;
};
var Toggle = { display: Element.toggle };
/*--------------------------------------------------------------------------*/
Abstract.Insertion = function(adjacency) {
this.adjacency = adjacency;
}
Abstract.Insertion.prototype = {
initialize: function(element, content) {
this.element = $(element);
this.content = content.stripScripts();
if (this.adjacency && this.element.insertAdjacentHTML) {
try {
this.element.insertAdjacentHTML(this.adjacency, this.content);
} catch (e) {
var tagName = this.element.tagName.toUpperCase();
if (['TBODY', 'TR'].include(tagName)) {
this.insertContent(this.contentFromAnonymousTable());
} else {
throw e;
}
}
} else {
this.range = this.element.ownerDocument.createRange();
if (this.initializeRange) this.initializeRange();
this.insertContent([this.range.createContextualFragment(this.content)]);
}
setTimeout(function() {content.evalScripts()}, 10);
},
contentFromAnonymousTable: function() {
var div = document.createElement('div');
div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
return $A(div.childNodes[0].childNodes[0].childNodes);
}
}
var Insertion = new Object();
Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
initializeRange: function() {
this.range.setStartBefore(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.parentNode.insertBefore(fragment, this.element);
}).bind(this));
}
});
Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
initializeRange: function() {
this.range.selectNodeContents(this.element);
this.range.collapse(true);
},
insertContent: function(fragments) {
fragments.reverse(false).each((function(fragment) {
this.element.insertBefore(fragment, this.element.firstChild);
}).bind(this));
}
});
Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
initializeRange: function() {
this.range.selectNodeContents(this.element);
this.range.collapse(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.appendChild(fragment);
}).bind(this));
}
});
Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
initializeRange: function() {
this.range.setStartAfter(this.element);
},
insertContent: function(fragments) {
fragments.each((function(fragment) {
this.element.parentNode.insertBefore(fragment,
this.element.nextSibling);
}).bind(this));
}
});
/*--------------------------------------------------------------------------*/
Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
initialize: function(element) {
this.element = $(element);
},
_each: function(iterator) {
this.element.className.split(/\s+/).select(function(name) {
return name.length > 0;
})._each(iterator);
},
set: function(className) {
this.element.className = className;
},
add: function(classNameToAdd) {
if (this.include(classNameToAdd)) return;
this.set($A(this).concat(classNameToAdd).join(' '));
},
remove: function(classNameToRemove) {
if (!this.include(classNameToRemove)) return;
this.set($A(this).without(classNameToRemove).join(' '));
},
toString: function() {
return $A(this).join(' ');
}
};
Object.extend(Element.ClassNames.prototype, Enumerable);
/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
* part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
* license.  Please see http://www.yui-ext.com/ for more information. */
var Selector = Class.create();
Selector.prototype = {
initialize: function(expression) {
this.expression = expression.strip();
this.compileMatcher();
},
compileMatcher: function() {
if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression))
return this.compileXPathMatcher();
var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
c = Selector.criteria, le, p, m;
if (Selector._cache[e]) {
this.matcher = Selector._cache[e]; return;
}
this.matcher = ["this.matcher = function(root) {",
"var r = root, h = Selector.handlers, c = false, n;"];
while (e && le != e && (/\S/).test(e)) {
le = e;
for (var i in ps) {
p = ps[i];
if (m = e.match(p)) {
this.matcher.push(typeof c[i] == 'function' ? c[i](m) :
new Template(c[i]).evaluate(m));
e = e.replace(m[0], '');
break;
}
}
}
this.matcher.push("return h.unique(n);\n}");
eval(this.matcher.join('\n'));
Selector._cache[this.expression] = this.matcher;
},
compileXPathMatcher: function() {
var e = this.expression, ps = Selector.patterns,
x = Selector.xpath, le,  m;
if (Selector._cache[e]) {
this.xpath = Selector._cache[e]; return;
}
this.matcher = ['.//*'];
while (e && le != e && (/\S/).test(e)) {
le = e;
for (var i in ps) {
if (m = e.match(ps[i])) {
this.matcher.push(typeof x[i] == 'function' ? x[i](m) :
new Template(x[i]).evaluate(m));
e = e.replace(m[0], '');
break;
}
}
}
this.xpath = this.matcher.join('');
Selector._cache[this.expression] = this.xpath;
},
findElements: function(root) {
root = root || document;
if (this.xpath) return document._getElementsByXPath(this.xpath, root);
return this.matcher(root);
},
match: function(element) {
return this.findElements(document).include(element);
},
toString: function() {
return this.expression;
},
inspect: function() {
return "#<Selector:" + this.expression.inspect() + ">";
}
};
Object.extend(Selector, {
_cache: {},
xpath: {
descendant:   "//*",
child:        "/*",
adjacent:     "/following-sibling::*[1]",
laterSibling: '/following-sibling::*',
tagName:      function(m) {
if (m[1] == '*') return '';
return "[local-name()='" + m[1].toLowerCase() +
"' or local-name()='" + m[1].toUpperCase() + "']";
},
className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
id:           "[@id='#{1}']",
attrPresence: "[@#{1}]",
attr: function(m) {
m[3] = m[5] || m[6];
return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
},
pseudo: function(m) {
var h = Selector.xpath.pseudos[m[1]];
if (!h) return '';
if (typeof h === 'function') return h(m);
return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
},
operators: {
'=':  "[@#{1}='#{3}']",
'!=': "[@#{1}!='#{3}']",
'^=': "[starts-with(@#{1}, '#{3}')]",
'$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
'*=': "[contains(@#{1}, '#{3}')]",
'~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
'|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
},
pseudos: {
'first-child': '[not(preceding-sibling::*)]',
'last-child':  '[not(following-sibling::*)]',
'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
'checked':     "[@checked]",
'disabled':    "[@disabled]",
'enabled':     "[not(@disabled)]",
'not': function(m) {
var e = m[6], p = Selector.patterns,
x = Selector.xpath, le, m, v;
var exclusion = [];
while (e && le != e && (/\S/).test(e)) {
le = e;
for (var i in p) {
if (m = e.match(p[i])) {
v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);
exclusion.push("(" + v.substring(1, v.length - 1) + ")");
e = e.replace(m[0], '');
break;
}
}
}
return "[not(" + exclusion.join(" and ") + ")]";
},
'nth-child':      function(m) {
return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
},
'nth-last-child': function(m) {
return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
},
'nth-of-type':    function(m) {
return Selector.xpath.pseudos.nth("position() ", m);
},
'nth-last-of-type': function(m) {
return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
},
'first-of-type':  function(m) {
m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
},
'last-of-type':   function(m) {
m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
},
'only-of-type':   function(m) {
var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
},
nth: function(fragment, m) {
var mm, formula = m[6], predicate;
if (formula == 'even') formula = '2n+0';
if (formula == 'odd')  formula = '2n+1';
if (mm = formula.match(/^(\d+)$/)) // digit only
return '[' + fragment + "= " + mm[1] + ']';
if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
if (mm[1] == "-") mm[1] = -1;
var a = mm[1] ? Number(mm[1]) : 1;
var b = mm[2] ? Number(mm[2]) : 0;
predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
"((#{fragment} - #{b}) div #{a} >= 0)]";
return new Template(predicate).evaluate({
fragment: fragment, a: a, b: b });
}
}
}
},
criteria: {
tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
className:    'n = h.className(n, r, "#{1}", c); c = false;',
id:           'n = h.id(n, r, "#{1}", c);        c = false;',
attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
attr: function(m) {
m[3] = (m[5] || m[6]);
return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
},
pseudo:       function(m) {
if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
},
descendant:   'c = "descendant";',
child:        'c = "child";',
adjacent:     'c = "adjacent";',
laterSibling: 'c = "laterSibling";'
},
patterns: {
laterSibling: /^\s*~\s*/,
child:        /^\s*>\s*/,
adjacent:     /^\s*\+\s*/,
descendant:   /^\s/,
tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
id:           /^#([\w\-\*]+)(\b|$)/,
className:    /^\.([\w\-\*]+)(\b|$)/,
pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/,
attrPresence: /^\[([\w]+)\]/,
attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/
},
handlers: {
concat: function(a, b) {
for (var i = 0, node; node = b[i]; i++)
a.push(node);
return a;
},
mark: function(nodes) {
for (var i = 0, node; node = nodes[i]; i++)
node._counted = true;
return nodes;
},
unmark: function(nodes) {
for (var i = 0, node; node = nodes[i]; i++)
node._counted = undefined;
return nodes;
},
index: function(parentNode, reverse, ofType) {
parentNode._counted = true;
if (reverse) {
for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
node = nodes[i];
if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
}
} else {
for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
}
},
unique: function(nodes) {
if (nodes.length == 0) return nodes;
var results = [], n;
for (var i = 0, l = nodes.length; i < l; i++)
if (!(n = nodes[i])._counted) {
n._counted = true;
results.push(Element.extend(n));
}
return Selector.handlers.unmark(results);
},
descendant: function(nodes) {
var h = Selector.handlers;
for (var i = 0, results = [], node; node = nodes[i]; i++)
h.concat(results, node.getElementsByTagName('*'));
return results;
},
child: function(nodes) {
var h = Selector.handlers;
for (var i = 0, results = [], node; node = nodes[i]; i++) {
for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
if (child.nodeType == 1 && child.tagName != '!') results.push(child);
}
return results;
},
adjacent: function(nodes) {
for (var i = 0, results = [], node; node = nodes[i]; i++) {
var next = this.nextElementSibling(node);
if (next) results.push(next);
}
return results;
},
laterSibling: function(nodes) {
var h = Selector.handlers;
for (var i = 0, results = [], node; node = nodes[i]; i++)
h.concat(results, Element.nextSiblings(node));
return results;
},
nextElementSibling: function(node) {
while (node = node.nextSibling)
if (node.nodeType == 1) return node;
return null;
},
previousElementSibling: function(node) {
while (node = node.previousSibling)
if (node.nodeType == 1) return node;
return null;
},
tagName: function(nodes, root, tagName, combinator) {
tagName = tagName.toUpperCase();
var results = [], h = Selector.handlers;
if (nodes) {
if (combinator) {
if (combinator == "descendant") {
for (var i = 0, node; node = nodes[i]; i++)
h.concat(results, node.getElementsByTagName(tagName));
return results;
} else nodes = this[combinator](nodes);
if (tagName == "*") return nodes;
}
for (var i = 0, node; node = nodes[i]; i++)
if (node.tagName.toUpperCase() == tagName) results.push(node);
return results;
} else return root.getElementsByTagName(tagName);
},
id: function(nodes, root, id, combinator) {
var targetNode = $(id), h = Selector.handlers;
if (!nodes && root == document) return targetNode ? [targetNode] : [];
if (nodes) {
if (combinator) {
if (combinator == 'child') {
for (var i = 0, node; node = nodes[i]; i++)
if (targetNode.parentNode == node) return [targetNode];
} else if (combinator == 'descendant') {
for (var i = 0, node; node = nodes[i]; i++)
if (Element.descendantOf(targetNode, node)) return [targetNode];
} else if (combinator == 'adjacent') {
for (var i = 0, node; node = nodes[i]; i++)
if (Selector.handlers.previousElementSibling(targetNode) == node)
return [targetNode];
} else nodes = h[combinator](nodes);
}
for (var i = 0, node; node = nodes[i]; i++)
if (node == targetNode) return [targetNode];
return [];
}
return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
},
className: function(nodes, root, className, combinator) {
if (nodes && combinator) nodes = this[combinator](nodes);
return Selector.handlers.byClassName(nodes, root, className);
},
byClassName: function(nodes, root, className) {
if (!nodes) nodes = Selector.handlers.descendant([root]);
var needle = ' ' + className + ' ';
for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
nodeClassName = node.className;
if (nodeClassName.length == 0) continue;
if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
results.push(node);
}
return results;
},
attrPresence: function(nodes, root, attr) {
var results = [];
for (var i = 0, node; node = nodes[i]; i++)
if (Element.hasAttribute(node, attr)) results.push(node);
return results;
},
attr: function(nodes, root, attr, value, operator) {
if (!nodes) nodes = root.getElementsByTagName("*");
var handler = Selector.operators[operator], results = [];
for (var i = 0, node; node = nodes[i]; i++) {
var nodeValue = Element.readAttribute(node, attr);
if (nodeValue === null) continue;
if (handler(nodeValue, value)) results.push(node);
}
return results;
},
pseudo: function(nodes, name, value, root, combinator) {
if (nodes && combinator) nodes = this[combinator](nodes);
if (!nodes) nodes = root.getElementsByTagName("*");
return Selector.pseudos[name](nodes, value, root);
}
},
pseudos: {
'first-child': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++) {
if (Selector.handlers.previousElementSibling(node)) continue;
results.push(node);
}
return results;
},
'last-child': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++) {
if (Selector.handlers.nextElementSibling(node)) continue;
results.push(node);
}
return results;
},
'only-child': function(nodes, value, root) {
var h = Selector.handlers;
for (var i = 0, results = [], node; node = nodes[i]; i++)
if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
results.push(node);
return results;
},
'nth-child':        function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, formula, root);
},
'nth-last-child':   function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, formula, root, true);
},
'nth-of-type':      function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, formula, root, false, true);
},
'nth-last-of-type': function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, formula, root, true, true);
},
'first-of-type':    function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, "1", root, false, true);
},
'last-of-type':     function(nodes, formula, root) {
return Selector.pseudos.nth(nodes, "1", root, true, true);
},
'only-of-type':     function(nodes, formula, root) {
var p = Selector.pseudos;
return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
},
getIndices: function(a, b, total) {
if (a == 0) return b > 0 ? [b] : [];
return $R(1, total).inject([], function(memo, i) {
if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
return memo;
});
},
nth: function(nodes, formula, root, reverse, ofType) {
if (nodes.length == 0) return [];
if (formula == 'even') formula = '2n+0';
if (formula == 'odd')  formula = '2n+1';
var h = Selector.handlers, results = [], indexed = [], m;
h.mark(nodes);
for (var i = 0, node; node = nodes[i]; i++) {
if (!node.parentNode._counted) {
h.index(node.parentNode, reverse, ofType);
indexed.push(node.parentNode);
}
}
if (formula.match(/^\d+$/)) { // just a number
formula = Number(formula);
for (var i = 0, node; node = nodes[i]; i++)
if (node.nodeIndex == formula) results.push(node);
} else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
if (m[1] == "-") m[1] = -1;
var a = m[1] ? Number(m[1]) : 1;
var b = m[2] ? Number(m[2]) : 0;
var indices = Selector.pseudos.getIndices(a, b, nodes.length);
for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
for (var j = 0; j < l; j++)
if (node.nodeIndex == indices[j]) results.push(node);
}
}
h.unmark(nodes);
h.unmark(indexed);
return results;
},
'empty': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++) {
if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
results.push(node);
}
return results;
},
'not': function(nodes, selector, root) {
var h = Selector.handlers, selectorType, m;
var exclusions = new Selector(selector).findElements(root);
h.mark(exclusions);
for (var i = 0, results = [], node; node = nodes[i]; i++)
if (!node._counted) results.push(node);
h.unmark(exclusions);
return results;
},
'enabled': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++)
if (!node.disabled) results.push(node);
return results;
},
'disabled': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++)
if (node.disabled) results.push(node);
return results;
},
'checked': function(nodes, value, root) {
for (var i = 0, results = [], node; node = nodes[i]; i++)
if (node.checked) results.push(node);
return results;
}
},
operators: {
'=':  function(nv, v) { return nv == v; },
'!=': function(nv, v) { return nv != v; },
'^=': function(nv, v) { return nv.startsWith(v); },
'$=': function(nv, v) { return nv.endsWith(v); },
'*=': function(nv, v) { return nv.include(v); },
'~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
'|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
},
matchElements: function(elements, expression) {
var matches = new Selector(expression).findElements(), h = Selector.handlers;
h.mark(matches);
for (var i = 0, results = [], element; element = elements[i]; i++)
if (element._counted) results.push(element);
h.unmark(matches);
return results;
},
findElement: function(elements, expression, index) {
if (typeof expression == 'number') {
index = expression; expression = false;
}
return Selector.matchElements(elements, expression || '*')[index || 0];
},
findChildElements: function(element, expressions) {
var exprs = expressions.join(','), expressions = [];
exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
expressions.push(m[1].strip());
});
var results = [], h = Selector.handlers;
for (var i = 0, l = expressions.length, selector; i < l; i++) {
selector = new Selector(expressions[i].strip());
h.concat(results, selector.findElements(element));
}
return (l > 1) ? h.unique(results) : results;
}
});
function $$() {
return Selector.findChildElements(document, $A(arguments));
}
var Form = {
reset: function(form) {
$(form).reset();
return form;
},
serializeElements: function(elements, getHash) {
var data = elements.inject({}, function(result, element) {
if (!element.disabled && element.name) {
var key = element.name, value = $(element).getValue();
if (value != null) {
if (key in result) {
if (result[key].constructor != Array) result[key] = [result[key]];
result[key].push(value);
}
else result[key] = value;
}
}
return result;
});
return getHash ? data : Hash.toQueryString(data);
}
};
Form.Methods = {
serialize: function(form, getHash) {
return Form.serializeElements(Form.getElements(form), getHash);
},
getElements: function(form) {
return $A($(form).getElementsByTagName('*')).inject([],
function(elements, child) {
if (Form.Element.Serializers[child.tagName.toLowerCase()])
elements.push(Element.extend(child));
return elements;
}
);
},
getInputs: function(form, typeName, name) {
form = $(form);
var inputs = form.getElementsByTagName('input');
if (!typeName && !name) return $A(inputs).map(Element.extend);
for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
var input = inputs[i];
if ((typeName && input.type != typeName) || (name && input.name != name))
continue;
matchingInputs.push(Element.extend(input));
}
return matchingInputs;
},
disable: function(form) {
form = $(form);
Form.getElements(form).invoke('disable');
return form;
},
enable: function(form) {
form = $(form);
Form.getElements(form).invoke('enable');
return form;
},
findFirstElement: function(form) {
return $(form).getElements().find(function(element) {
return element.type != 'hidden' && !element.disabled &&
['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
});
},
focusFirstElement: function(form) {
form = $(form);
form.findFirstElement().activate();
return form;
},
request: function(form, options) {
form = $(form), options = Object.clone(options || {});
var params = options.parameters;
options.parameters = form.serialize(true);
if (params) {
if (typeof params == 'string') params = params.toQueryParams();
Object.extend(options.parameters, params);
}
if (form.hasAttribute('method') && !options.method)
options.method = form.method;
return new Ajax.Request(form.readAttribute('action'), options);
}
}
/*--------------------------------------------------------------------------*/
Form.Element = {
focus: function(element) {
$(element).focus();
return element;
},
select: function(element) {
$(element).select();
return element;
}
}
Form.Element.Methods = {
serialize: function(element) {
element = $(element);
if (!element.disabled && element.name) {
var value = element.getValue();
if (value != undefined) {
var pair = {};
pair[element.name] = value;
return Hash.toQueryString(pair);
}
}
return '';
},
getValue: function(element) {
element = $(element);
var method = element.tagName.toLowerCase();
return Form.Element.Serializers[method](element);
},
clear: function(element) {
$(element).value = '';
return element;
},
present: function(element) {
return $(element).value != '';
},
activate: function(element) {
element = $(element);
try {
element.focus();
if (element.select && (element.tagName.toLowerCase() != 'input' ||
!['button', 'reset', 'submit'].include(element.type)))
element.select();
} catch (e) {}
return element;
},
disable: function(element) {
element = $(element);
element.blur();
element.disabled = true;
return element;
},
enable: function(element) {
element = $(element);
element.disabled = false;
return element;
}
}
/*--------------------------------------------------------------------------*/
var Field = Form.Element;
var $F = Form.Element.Methods.getValue;
/*--------------------------------------------------------------------------*/
Form.Element.Serializers = {
input: function(element) {
switch (element.type.toLowerCase()) {
case 'checkbox':
case 'radio':
return Form.Element.Serializers.inputSelector(element);
default:
return Form.Element.Serializers.textarea(element);
}
},
inputSelector: function(element) {
return element.checked ? element.value : null;
},
textarea: function(element) {
return element.value;
},
select: function(element) {
return this[element.type == 'select-one' ?
'selectOne' : 'selectMany'](element);
},
selectOne: function(element) {
var index = element.selectedIndex;
return index >= 0 ? this.optionValue(element.options[index]) : null;
},
selectMany: function(element) {
var values, length = element.length;
if (!length) return null;
for (var i = 0, values = []; i < length; i++) {
var opt = element.options[i];
if (opt.selected) values.push(this.optionValue(opt));
}
return values;
},
optionValue: function(opt) {
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.addEventListener) {
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {
this.observers.push([element, name, observer, useCapture]);
element.attachEvent('on' + name, observer);
}
},
unloadCache: function() {
if (!Event.observers) return;
for (var i = 0, length = Event.observers.length; i < length; i++) {
Event.stopObserving.apply(this, Event.observers[i]);
Event.observers[i][0] = null;
}
Event.observers = false;
},
observe: function(element, name, observer, useCapture) {
element = $(element);
useCapture = useCapture || false;
if (name == 'keypress' &&
(Prototype.Browser.WebKit || element.attachEvent))
name = 'keydown';
Event._observeAndCache(element, name, observer, useCapture);
},
stopObserving: function(element, name, observer, useCapture) {
element = $(element);
useCapture = useCapture || false;
if (name == 'keypress' &&
(Prototype.Browser.WebKit || element.attachEvent))
name = 'keydown';
if (element.removeEventListener) {
element.removeEventListener(name, observer, useCapture);
} else if (element.detachEvent) {
try {
element.detachEvent('on' + name, observer);
} catch (e) {}
}
}
});
/* prevent memory leaks in IE */
if (Prototype.Browser.IE)
Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
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 (Prototype.Browser.WebKit) {
Position.cumulativeOffset = function(element) {
var valueT = 0, valueL = 0;
do {
valueT += element.offsetTop  || 0;
valueL += element.offsetLeft || 0;
if (element.offsetParent == document.body)
if (Element.getStyle(element, 'position') == 'absolute') break;
element = element.offsetParent;
} while (element);
return [valueL, valueT];
}
}
Element.addMethods();
/* domready.js */
/**
* domready.js
*
* Cross browser mozilla's 'onDOMContentLoaded' implementation.
* Executes a function when the dom tree is loaded without waiting for images.
*
* Based on +Element.Events.domready+ from Mootools open source project,
* this tiny javascript library adds the emulated 'DOMContentLoaded' functionality.
*
* Features:
*   - No dependency on external libraries
*   - Compatible with Prototype.js
*
* Tested browsers (Windows):
*   - IE 7 (XP standalone)
*   - IE 6 SP2
*   - Firefox 2.0.0.4
*   - Opera 9.21
*
* Tested browsers (Mac OS X):
*   - Safari 2.0.4
*   - Firefox 2.0.0.4
*   - Mac Opera 9.21
*   - Mac IE 5.2.3
*
* Copyright (c) 2007 Takanori Ishikawa.
* License: MIT-style license.
*
* MooTools Copyright:
* copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
*
*
* See Also:
*
*   mootools
*   http://mootools.net/
*
*   The window.onload Problem - Solved!
*   http://dean.edwards.name/weblog/2005/09/busted/
*
*   [PATCH] Faster onload for Event.onload
*   http://dev.rubyonrails.org/ticket/5414
*   Changeset 6596: Support for "DOMContentLoaded" event handling (prototype.js event branch)
*   http://dev.rubyonrails.org/changeset/6596
*
*/
if (typeof Event == 'undefined') Event = new Object();
/*
* Registers function +fn+ will be executed when the dom
* tree is loaded without waiting for images.
*
* Example:
*
*  Event.domReady.add(function() {
*    ...
*  });
*
*/
Event.domReady = {
add: function(fn) {
if (Event.domReady.loaded) return fn();
var observers = Event.domReady.observers;
if (!observers) observers = Event.domReady.observers = [];
observers[observers.length] = fn;
if (Event.domReady.callback) return;
Event.domReady.callback = function() {
if (Event.domReady.loaded) return;
Event.domReady.loaded = true;
if (Event.domReady.timer) {
clearInterval(Event.domReady.timer);
Event.domReady.timer = null;
}
var observers = Event.domReady.observers;
for (var i = 0, length = observers.length; i < length; i++) {
var fn = observers[i];
observers[i] = null;
fn(); // make 'this' as window
}
Event.domReady.callback = Event.domReady.observers = null;
};
var ie = !!(window.attachEvent && !window.opera);
var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
if (document.readyState && webkit) {
Event.domReady.timer = setInterval(function() {
var state = document.readyState;
if (state == 'loaded' || state == 'complete') {
Event.domReady.callback();
}
}, 50);
} else if (document.readyState && ie) {
var src = (window.location.protocol == 'https:') ? '://0' : 'javascript:void(0)';
document.write(
'<script type="text/javascript" defer="defer" src="' + src + '" ' +
'onreadystatechange="if (this.readyState == \'complete\') Event.domReady.callback();"' +
'><\/script>');
} else {
if (window.addEventListener) {
document.addEventListener("DOMContentLoaded", Event.domReady.callback, false);
window.addEventListener("load", Event.domReady.callback, false);
} else if (window.attachEvent) {
window.attachEvent('onload', Event.domReady.callback);
} else {
var fn = window.onload;
window.onload = function() {
Event.domReady.callback();
if (fn) fn();
}
}
}
}
}
/* swfobject.js */
/**
* SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
*
* SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
/* common.js */
var log = function(){
if(!window.console || Prototype.Browser.IE ) return;
var c = window.console;
if(c)    c.log.apply(c, arguments);
}
logo = function(){
log('ok');
}
logStart = function(){
if(!window.console) return;
var c = window.console;
if(c)    c.group.apply(c, arguments);
}
logEnd = function(){
if(!window.console) return;
var c = window.console;
if(c)    c.groupEnd.apply(c, arguments);
}
logg = function(obj){
logStart();
log(obj);
logEnd();
}
function ao(){
alert('ok');
}
Function.prototype.firstExecute = false;
/* for Older Safari */
if (!Object.hasOwnProperty) {
Object.prototype.hasOwnProperty = function(it) {
return (this[it] && !this.constructor.prototype[it]);
}
}
function mktag(tagName, option, childs){
var tag = document.createElement(tagName);
if(option){
for(a in option){
if(a == 'style' && typeof(option[a]) == 'object'){
var styles = option[a];
for(a in styles){
tag.style[a] = styles[a];
}
}else if(option.hasOwnProperty(a)){
tag[a] = option[a];
}
}
}
switch(typeof childs){
case 'string' : {
tag.appendChild(document.createTextNode(childs));
break;
}
case 'object' : {
if(!childs.length) tag.appendChild(childs);
for (var i=0, l=childs.length; i<l; i++) {
var child = childs[i];
if(typeof child == 'string'){
tag.appendChild(document.createTextNode(child));
}else{
tag.appendChild(child);
}
}
break;
}
}
return tag;
}
$A('div p span a img br table tr th td form label input textarea strong'.split(' ')).each(function(tagName){
var func = function(option, childs){
return mktag(tagName, option, childs);
};
eval('$' + tagName + '= func;' );
});
function setClipboard(id){
var swf = "<embed src='/public/swf/setClipboard.swf' FlashVars='code="+encodeURIComponent($(id).value)+"' width='0' height='0' type='application/x-shockwave-flash'></embed>";
$('clipboard').innerHTML = swf;
}
function getWinSize() {
var width;
var height;
if (document.compatMode == 'CSS1Compat' && (!window.opera || window.opera.version() >= 9.5)) {
width= document.documentElement.clientWidth;
height = document.documentElement.clientHeight;
} else if (navigator.userAgent.indexOf('AppleWebKit') != -1){
width  = window.innerWidth;
height = window.innerHeight;
} else {
width= document.body.clientWidth;
height = document.body.clientHeight;
}
return [width, height];
}
function getPageSize() {
var winSize = getWinSize();
var width  = winSize[0];
var height = winSize[1];
if (document.compatMode == 'CSS1Compat') {
if (document.documentElement.scrollWidth > width) {
width  = document.documentElement.scrollWidth;
}
if (document.documentElement.scrollHeight > height) {
height = document.documentElement.scrollHeight;
}
} else {
if (document.body.scrollWidth > width) {
width  = document.body.scrollWidth;
}
if (document.body.scrollHeight > height) {
height = document.body.scrollHeight;
}
}
return [width, height];
}
var fillin = Class.create();
fillin.prototype = {
initialize: function(input, message, color, form){
this.input = $(input);
this.message = message;
this.color = color;
Event.observe(this.input, 'blur', this.check.bind(this));
Event.observe(this.input, 'focus', function(){
if($F(this.input)==this.message){
this.input.value = '';
}
this.input.style.color = '';
this.input.style.overflowY = 'auto';
}.bind(this));
if(form){
Event.observe(form, 'submit', function(e){
if($F(this.input)=='' || $F(this.input)==this.message)	Event.stop(e);
}.bind(this));
}
if($F(this.input)=='' || $F(this.input)==this.message) this.set();
},
set: function(){
this.input.style.overflowY = 'hidden';
this.input.value = this.message;
this.input.style.color = this.color;
/*
setTimeout(function(){
this.input.style.color = this.color;
}.bind(this), 0);
*/
},
check: function(){
if($F(this.input)==''){
this.set();
}else{
this.input.style.color = '';
}
}
}
var Cookie = {
set: function(name,value,seconds){
if(seconds){
d = new Date();
d.setTime(d.getTime() + (seconds * 1000));
expiry = '; expires=' + d.toGMTString();
}else
expiry = '';
document.cookie = name + "=" + value + expiry + "; path=/";
},
get: function(name){
nameEQ = name + "=";
ca = document.cookie.split(';');
for(i = 0; i < ca.length; i++){
c = ca[i];
while(c.charAt(0) == ' ')
c = c.substring(1,c.length);
if(c.indexOf(nameEQ) == 0)
return c.substring(nameEQ.length,c.length);
}
return null
},
unset: function(name){
Cookie.set(name,'',-1);
}
}
function flash_check(){
var version = deconcept.SWFObjectUtil.getPlayerVersion();
if(version.major <= 7 && !Prototype.Browser.MobileSafari){
var message = (version.major==0) ?  Message.flash.install : Message.flash.update;
if(confirm(message)){
location.href = 'http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash';
}else{
var altHtml = document.getElementsByTagName('noscript')[0].innerHTML;
$('nota').innerHTML = altHtml;
}
}else if(Prototype.Browser.MobileSafari){
$('nota').innerHTML = '';
$('nota').appendChild($img({src: '/snapshot/'+board_id+'_l.jpg'}));
}
}
var langMessage = {
en: {
site_name: 'http://notaland.com', //for Ximers search
copy: 'Copy!',
vote: 'vote submited!',
spam: 'spam reported!',
failure: 'failure!',
movienotfound: 'Sorry, this movie was not available.',
ccbutton: 'Copy this board and create new board. OK?',
checkuser: 'This username has been already tanken. Please choose another.',
checkgroup: 'The group url has been taken. Please choose another.',
validate: 'You can use only alphabet, number, hyphen as a ',
validmail: 'Please enter correct email address.',
validatechar: 'You must start your username with alphabet or number.',
key: 'input keyword',
akey: 'input account name',
top: 'Start typing a friend\'s name',
secret: 'insertmore',
result: 'no result.',
album: {
noalbum: 'no album.',
nophoto: 'no photo.',
error: 'error! Sorry, Please reload & try again.'
},
flash: {
install: 'Please install Flash player.',
update: 'Please update Flash player.'
},
uploadercaution: 'Nota use Java uploader. If pop up caution dialog, Please choose "Trust".',
watchlist: {
add: 'added as Friend.',
remove: 'Are you sure to remove '+((typeof controller != 'undefined')?controller: '')+' from friends ?'
},
fastpaste: {
install: 'Please download & install fastPaste application.',
copy: 'Please copy image files.'
},
notait: {
blank: 'Select an image or Do you want to create a blank page?'
},
share: {
fillin: 'Emails or user names separated by comma.',
unshare: 'Really unshare ?'
},
dashboard: {
featured: 'Click "Set Featured" link  on each thumbnail',
board_delete: 'Are you sure to delete ?'
}
}
}
var Message = langMessage.en;
function wallpaperSet(source){
if(source != null || Cookie.get('bgSource')){
var bgSource = (Cookie.get('bgSource')!=null) ? Cookie.get('bgSource') : source;
var tempImg = $img({src: bgSource, style: {display: 'none'}});
document.body.appendChild(tempImg);
Event.observe(tempImg, 'load', function(){
document.body.style.backgroundImage = 'url("' + bgSource + '")';
document.body.style.backgroundRepeat = 'repeat';
document.body.style.backgroundPosition = 'center';
$('header').style.filter =  'alpha(opacity=85)';
$('header').style.opacity = 0.85;
if($('bml_list')){
$('bml_list').style.filter =  'alpha(opacity=85)';
$('bml_list').style.opacity = 0.85;
}
document.body.removeChild(tempImg);
});
}
Event.observe(document.body, 'dblclick', function(e){
if(e.ctrlKey){
Cookie.unset('bgSource');
document.body.style.backgroundImage = 'none';
$('header').style.filter =  'alpha(opacity=100)';
$('header').style.opacity = 1;
if($('bml_list')){
$('bml_list').style.filter =  'alpha(opacity=100)';
$('bml_list').style.opacity = 1;
}
}
});
}
Array.prototype.shuffle = function() {
var i = this.length;
while(i){
var j = Math.floor(Math.random()*i);
var t = this[--i];
this[i] = this[j];
this[j] = t;
}
return this;
}
function track(url){
try {
pageTracker._trackPageview(url);
}catch(e){}
log(url);
}
function lateFunc(func){
setTimeout(function(){
try{
func()
}catch(e){
setTimeout(arguments.callee, 100);
}
}, 100);
}
/* coogle2.js */
var Coogle = Class.create();
Coogle.prototype = {
initialize: function(opts){
this.Result = $('result');
this.key = $('key');
this.ekey = '';
this.form = $('cform');
this.proxy = '/remix/xml2json.cgi?&var=data&url=';
this.useproxy = false;
this.indicator = '/public/img/parts/indicatior.gif';
this.name = '';
this.restUrl = '';
this.keytext = '';
this.restPrm = {};
this.pagePrm = '';
this.currentPage = 1;
this.listPat = '';
this.showTemp = function(){}
Object.extend(this, opts || {});
Event.observe(this.form, 'submit', this.submitForm.bind(this));
this.addSet()
},
addSet : function(){},
submitForm: function(e){
logo()
Event.stop(e);
this.search();
},
search: function(){
if(!this.skipCheck){
if(this.key.value == '' || this.key.value == Message.key || this.key.value == Message.akey){
return;
}
}
this.ekey = encodeURIComponent(this.key.value);
this.currentPage = 1;
if(this.keyword_temp != this.key.value && !isDefaultKeyword(this.key.value)){
var mode = $('contents_bg') ? 'notait' : 'iam_home';
var track_text = 'keyword/' + mode + '/' + this.key.value + '/' + this.name;
track(track_text);
this.keyword_temp = this.key.value;
log('track!' + track_text);
}
this.exSearch();
},
exSearch: function(pageNation){
this.setLoading();
var param = {};
param[this.keytext] = this.key.value;
var param = $H(param);
param = param.merge(this.restPrm);
if(pageNation){
var page = new Object();
page[this.pagePrm] = this.currentPage;
param = param.merge(page);
}
var url = this.restUrl + param.toQueryString();
if(this.useproxy) url = this.proxy + escape(url) + '&type=' + this.name;
this.setScript(url);
},
nextSearch : function(){
this.currentPage++;
this.exSearch(true, this.currentPage);
},
prevSearch : function(){
this.currentPage--;
if(this.currentPage==0){
this.currentPage = 1;
return;
}
this.exSearch(true, this.currentPage);
},
clear: function(){
this.Result.innerHTML = '';
},
setLoading: function(){
this.clear();
/*
this.Result.appendChild(mktag('img', {src: this.indicator}));
*/
this.Result.className = '';
$$('#'+this.name+' span')[0].style.background = 'url(/public/img/parts/indicatior.gif) no-repeat scroll 0pt';
},
setScript: function(url){
/*
var time = new Date();
var snumber =  '&date=' + time.getMilliseconds() + time.getMinutes();
url += snumber;
*/
var script  = mktag('script', {
type : 'text/javascript',
src : url
});
if(!location.href.match(/^http:\/\/test/)){
script.onload = function() {document.body.removeChild(script)}
}
script.onerror = function(){
this.Result.innerHTML = Message.result;
$$('#'+this.name+' span')[0].style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
$$('#'+this.name+' span')[0].style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
}.bind(this);
document.body.appendChild( script );
},
checkData: function(data){
var flag = false;
var pat = this.listPat.split('.')
log(data)
log(pat)
if(! data) flag = true;
var item = data;
for(var i=1, l=pat.length; i<l; i++){
if(! item.hasOwnProperty(pat[i])){
flag = true;
break;
}else{
item = item[pat[i]];
}
}
if(!flag){
if(item!=eval(this.listPat)) flag = true;
}
log(flag)
return flag;
},
showResult: function(data){
restoreIcon(this.name, this.iconPosition);
if(this.checkData(data)){
this.Result.innerHTML='no result.';
return;
}
eval('var list = '+this.listPat);
this.clear();
for( var i=0, l=list.length; i<l; i++ ) {
this.showTemp(list[i]);
}
}
}
function restoreIcon(name, iconPosition){
$$('#'+name+' span')[0].style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
$$('#'+name+' span')[0].style.backgroundPosition = '0 '+ (-20 * iconPosition) + 'px';
}
function isDefaultKeyword(keyword){
var flag = false;
ex_keywords.each(function(word){
if(word == keyword){
flag = true;
$break;
}
});
return flag;
}
/* setcoogle4.js */
﻿function fadeIn(obj,opacity) {
if (opacity <= 100) {
setOpacity(obj, opacity);
opacity += 10;
window.setTimeout(function(){
fadeIn(obj, opacity);
}, 100);
}
}
function setOpacity(obj, opacity) {
opacity = (opacity == 100)?99.999:opacity;
obj.style.filter = "alpha(opacity:"+opacity+")";
obj.style.opacity = opacity/100;
}
function startUpload(){
$('submit_form').style.display = 'none';
$('waiting_form').style.display = 'inline';
$('file_upload').submit();
}
function stopUpload(visible){
$('submit_form').style.display = 'block';
$('waiting_form').style.display = 'none';
$('file_upload').reset();
}
function filecheck(type){
if(type=='clipart'){
$('search_option').hide();
$('clip_option').show();
$('iclip_option').hide();
$('fb_option').hide();
$('exKeyword').hide();
}else if(type=='iclipart'){
$('search_option').hide();
$('clip_option').hide();
$('iclip_option').show();
$('fb_option').hide();
$('exKeyword').hide();
}else{
$('clip_option').hide();
$('iclip_option').hide();
$('search_option').show();
$('fb_option').hide();
$('exKeyword').show();
}
$('moviePreview').hide();
$('smallMovie').innerHTML = '';
$('result').innerHTML = '';
}
function listcheck(type){
var lists = $A($('select_type').getElementsByTagName('li'))
var alists =  $A($('aselect_type').getElementsByTagName('li'));
lists.each(function(list){
list.className = (list.id==type) ? 'select_tab' : 'tab';
});
alists.each(function(list){
list.className = (list.id==type) ? 'select_tab' : 'tab';
});
var temp_type  =type;
if(type.match(/upload|map/)){
$('insert_tab').hide();
$('font_tab').hide();
$('upload_tab').hide();
$('myphoto_tab').hide();
$('map_tab').hide();
setResult(temp_type, temp_type+'_tab');
}else if(type.match(/flickr|picasa|facebook/)){
$('insert_tab').hide();
$('font_tab').hide();
$('upload_tab').hide();
$('myphoto_tab').hide();
$('map_tab').hide();
setResult(temp_type, 'myphoto_tab');
}else if(type=='font'){
$('insert_tab').hide();
$('font_tab').show();
$('upload_tab').hide();
$('myphoto_tab').hide();
$('map_tab').hide();
}else{
setResult(temp_type, 'insert_tab');
$('font_tab').hide();
$('upload_tab').hide();
$('myphoto_tab').hide();
$('map_tab').hide();
}
var top = Prototype.Browser.IE ? $(type).offsetTop : $(type).offsetTop - $('side').offsetTop;
$('side').scrollTop = top;
}
function setResult(type, tab){
if($(tab).visible() && $(type).next()==$(tab)){
$(tab).hide();
$(type).className = 'tab';
return true;
}else{
$(type).parentNode.insertBefore($(tab), $(type).next());
$(tab).show();
}
}
moreToggle.more = false;
function moreToggle(){
if(!moreToggle.more){
$A($('select_type').getElementsByTagName('li')).each(function(element){
Element.extend(element);
if(!element.visible()){
element.show();
element.less = true;
}
});
$('result').style.height = $('result').offsetHeight - 35 + 'px';
$('select_type').style.height = '90px';
moreToggle.more = true;
}else{
$A($('select_type').getElementsByTagName('li')).each(function(element){
Element.extend(element);
if(element.less){
element.hide();
}
});
$('result').style.height = $('result').offsetHeight + 35 + 'px';
$('select_type').style.height = '58px'
moreToggle.more = false;
}
}
function exSearch(key){
if($('clipart').className == 'select_tab') return;
if($('iclipart').className == 'select_tab') return;
filecheck();
$('key').value = key;
$('insert_search').click();
insert_form.check();
}
function getElementOffsetTop(id){
if(Prototype.Browser.IE){
var parent = $(id).parentNode;
var top = 0;
while(parent.tagName != 'HTML'){
top += parent.offsetTop;
parent = parent.parentNode;
};
}else{
var top = $(id).offsetTop;
}
return top;
}
function previewMovie(video_id){
previewMovie.video_id = video_id;
var side = 229;
var top = getElementOffsetTop('result') - $('side').scrollTop;
if(top < side) top = side;
$('moviePreview').style.top = top + 'px';
$('moviePreview').show();
$('moviePaste').disabled = true;
$('moviePaste').value="wait...";
var so = new SWFObject("http://www.youtube.com/v/"+video_id+"&enablejsapi=1&playerapiid=ytplayer&autoplay=1", "youtube_preview", "100%", "100%", "7", "#FFFFFF");
so.addParam("allowScriptAccess", "always");
so.write('smallMovie');
}
function pasteMovie(video_id){
var src = encodeURIComponent('http://www.youtube.com/v/'+video_id);
var ref = encodeURIComponent('http://www.youtube.com/watch?v='+video_id);
var fname = video_id;
var flashvars ='sdir='+sdir+'&page='+board_id+'&src='+src+'&ref='+ref+'&fname='+fname+'&date='+(new Date).getTime();
log(flashvars);
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
loadingFunc.back();
}
function onYouTubePlayerReady(playerid){
setTimeout(function(){
$('moviePaste').disabled = false;
$('moviePaste').value="Add";
}, 2000);
}
function pastePlugin(type){
var flashvars ='sdir='+sdir+'&page='+board_id+'&plugin=' + type +'&date='+(new Date).getTime();
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
}
function pasteFontArt(text){
var flashvars ='sdir='+sdir+'&page='+board_id+'&plugin=fontart&text='+encodeURIComponent(text)+'&date='+(new Date).getTime();
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
}
function pasteLink(thumb, board_url){
var flashvars ='sdir='+sdir+'&page='+board_id+'&plugin=notalink&src='+thumb+'&ref='+board_url+'&date='+(new Date).getTime();;
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
}
function pasteTemplate(thumb, board_id){
var url = '/board/create?parent='+board_id;
pasteLink(thumb, url);
}
function checkResult(elm){
try {
if(!elm.parentNode.parentNode) return false;
return (
(elm.parentNode.id == 'result' ||
elm.parentNode.parentNode.id =='result' ||
elm.parentNode.parentNode.id =='aresult' ||
elm.parentNode.id =='aresult' ||
elm.parentNode.parentNode.id =='clip_result' ||
elm.parentNode.parentNode.id =='iclip_result')
&& elm.source
);
}catch(e){
}
}
function pasteMap(src, ref){
var paste = $('map_frame').contentWindow.document.getElementById('paste');
log(paste)
paste.className = 'loading';
paste.disabled = true;
var url = '/remix/upload.cgi';
new Ajax.Request(url, {
method: 'post',
parameters: 'action=regist2&page='+board_id+'&url='+encodeURIComponent(src)+'&ref='+encodeURIComponent(ref)+'&license=unknown&author=google',
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess:function(req){
$('complete_upload').innerHTML = req.responseText;
var paste = $('map_frame').contentWindow.document.getElementById('paste');
paste.className = '';
paste.disabled = false;
},
onFailure:function(req){
log(req);
}
});
}
function map(){
if(setResult('map', 'map_tab')) return;
listcheck('map');
$('map_tab').innerHTML = '';
var iframe  = mktag('iframe', {
src : '/map_frame?'+controller,
frameBorder : 0,
scrolling: 'no',
width: (controller=='index') ? 400 : 228,
height: 340,
id: 'map_frame'
});
$('map_tab').appendChild( iframe );
/*
$('map_tab').appendChild(mktag('h4', {
style: {
margin: '1em 0'
}
}, 'Map clipart'));
*/
var pin = $img({
src: '/public/img/map/red-dot.gif',
style: {
marginTop: '3px',
cursor: 'pointer'
}
});
$('map_tab').appendChild($div({}, pin));
Event.observe(pin, 'mousedown', function(){
var elm = pin;
elm.license = 'cc-by';
elm.author = 'nota';
elm.ref = site_url;
elm.source = site_url + '/public/img/map/red-dot.swf';
loadingFunc(elm);
pasteFunc(elm);
});
}
function loadingFunc(elm){
if(loadingFunc.pasting) return;
loadingFunc.pasting = true;
var source = elm.src;
var div = $div({
style:{
display: (Prototype.Browser.IE) ? 'block' : 'table-cell',
width: elm.offsetWidth + 'px',
height: elm.offsetHeight + 'px',
background: 'url('+elm.src+') no-repeat',
textAlign: (Prototype.Browser.IE) ? 'left' : 'center',
verticalAlign: 'middle'
}
},
$img({
src: '/public/img/parts/indicator_big.gif'
})
);
elm.parentNode.replaceChild(div, elm);
loadingFunc.back = function(){
div.parentNode.replaceChild(elm, div);
loadingFunc.pasting = false;
};
}
loadingFunc.pasting = false;
function pasteFunc(elm){
log(elm)
var url = '/remix/upload.cgi';
var option = (elm.license && elm.author)? '&license='+elm.license+'&author='+encodeURIComponent(elm.author) :'';
log(elm.source)
log(elm.ref)
new Ajax.Request(url, {
method: 'post',
parameters: 'action=regist2&page='+board_id+'&url='+encodeURIComponent(elm.source)+'&ref='+encodeURIComponent(elm.ref)+option,
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess:function(req){
$('complete_upload').innerHTML = req.responseText;
try{
loadingFunc.back();
}catch(e){}
},
onFailure:function(req){
log(req);
}
});
}
function setCoogle(){
insert_form = new fillin('key', Message.key, '#999');
$('search_option').observe('dblclick', moreToggle);
/*
$('exClip').observe('mousedown', function(){
var elm = $('exClip');
elm.source = 'http://sharestyle.com/~rakusai/notaclipart/data/icon/fukidasi1.swf';
elm.ref = 'http://sharestyle.com/~rakusai/notaclipart/';
elm.author = 'Yoshio Shingyoji';
elm.license = 'Creative Commons License (cc-by)';
loadingFunc(elm);
pasteFunc(elm);
});
*/
clickFunc = function(elm){
loadingFunc(elm);
if(elm.type=='movie'){
previewMovie(elm.source);
}else if(elm.type=='notalink'){
pasteLink(elm.source, elm.ref);
loadingFunc.back();
}else{
pasteFunc(elm);
}
}
Event.observe(document, 'mousedown', function(e){
var elm = Event.element(e);
if(checkResult(elm)){
if(e.shiftKey & e.ctrlKey & elm.type=='notalink'){
pasteTemplate(elm.source, elm.board_id);
}else if(e.ctrlKey){
document.body.style.backgroundImage = 'url("' + elm.source + '")';
document.body.style.backgroundRepeat = 'repeat';
$('header').style.filter =  'alpha(opacity=85)';
$('header').style.opacity = 0.85;
if($('bml_list')){
$('bml_list').style.filter =  'alpha(opacity=85)';
$('bml_list').style.opacity = 0.85;
}
Cookie.set('bgSource', elm.source);
}else if(e.shiftKey){
window.open(elm.ref);
}else if(e.altKey){
location.href = elm.source;
}else{
clickFunc(elm);
}
}
});
Object.extend(Coogle.prototype, {
addSet : function(){
var icon = $span({className: 'icon'});
var label = (this.name!='iclipart') ? this.name.capitalize() : 'iSummit Clipart';
var list = mktag('li', {id:this.name}, [icon, label]);
icon.style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
icon.style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
list.style.display = (this.visible) ? 'block' : 'none';
$('select_type').appendChild(list);
setTimeout(function(){
Event.observe($(this.name), 'mousedown', function(){
if($(this.name).next().tagName=='LI'){
this.search();
}
listcheck(this.name);
filecheck(this.name);
}.bind(this));
}.bind(this), 1000);
},
submitForm : function(e){
Event.stop(e);
if($(this.name).className=='select_tab'){
this.search();
}
}
});
CoogleSettings = {};
CoogleSettings.photo = {
name: 'photo',
visible: true,
iconPosition: 0,
restUrl : 'http://www.flickr.com/services/rest/?',
keytext : 'text',
restPrm : {
api_key  : '1f3ae593bf8918b4166d49b628da6a6c',
method : 'flickr.photos.search',
per_page : 18,
sort : 'interestingness-desc',
format : 'json',
jsoncallback : 'photo.showResult',
license : '2,4',
extras : 'license, owner_name'
},
pagePrm : 'page',
listPat : 'data.photos.photo',
showTemp : function(thumb){
var temp = $div({className: 'float_div'});
if(thumb.license==2){
var license = 'cc-by-nc';
}else if(thumb.license==4){
var license = 'cc-by';
}else{
var license = 'unknown';
}
var img = $img({
src : 'http://static.flickr.com/'+thumb.server+'/'+thumb.id+'_'+thumb.secret+'_s.jpg',
source : 'http://farm2.static.flickr.com/'+thumb.server+'/'+thumb.id+'_'+thumb.secret+'.jpg',
ref : 'http://www.flickr.com/photos/'+thumb.owner+'/'+thumb.id+'/',
author: thumb.ownername,
license: license,
title : thumb.title,
alt : thumb.title,
width : '75',
height : '75'
});
temp.appendChild(img);
var type;
if(thumb.license==2){
type = 'cc-by-nc75x15.png';
}else if(thumb.license==4){
type = 'cc-by75x15.png';
}
var license = $span({
style : {
display : 'block',
backgroundImage : 'url(/public/img/parts/' + type + ')',
width : '75px',
height :'15px',
fontSize : '12px'
}
}, '')
temp.appendChild(license);
this.Result.appendChild(temp);
},
showResult: function(data){
Coogle.prototype.showResult.bind(this)(data);
if(data.photos.pages == 0) return;
var totalPages = (data.photos.pages == 1) ? 1 : data.photos.pages - 1;
var pview = (this.currentPage==1) ? 'none' : '';
var nview = (this.currentPage==totalPages) ? 'none' : '';
var navi = $div({id: 'pageNation'},[
$span({id: 'prevPage', style:{display: pview}}, '<<back'),
$span({id: 'nextPage', style:{display: nview}}, 'more photos>>'),
$span({}, this.currentPage+'/'+totalPages)
]
);
this.Result.appendChild(navi);
$('nextPage').observe('click', this.nextSearch.bind(this), true);
$('prevPage').observe('click', this.prevSearch.bind(this), true);
}
};
/*
CoogleSettings.feature = {};
Object.extend(CoogleSettings.feature, CoogleSettings.photo);
var featureOverride = {
name: 'feature',
visible: true,
restPrm : {
api_key  : '1f3ae593bf8918b4166d49b628da6a6c',
method : 'flickr.favorites.getPublicList',
user_id : '59549094@N00',
per_page : 18,
sort : 'date-posted-desc',
format : 'json',
jsoncallback : 'feature.showResult',
license : '2,4',
extras : 'license, owner_name'
},
}
Object.extend(CoogleSettings.feature, featureOverride);
*/
CoogleSettings.movie = {
name: 'movie',
visible: true,
iconPosition: 1,
restUrl : 'http://gdata.youtube.com/feeds/videos?',
useproxy : false,
keytext : 'vq',
restPrm : {
alt: 'json-in-script',
callback: 'movie.showResult',
'max-results' : 50
},
listPat : 'data.feed.entry',
exSearch: function(){
Coogle.prototype.exSearch.bind(this)();
$('moviePreview').hide();
},
showTemp : function(m){
var thumb = $img({
src: m['media$group']['media$thumbnail'][0].url,
source: m.id['$t'].split('http://gdata.youtube.com/feeds/videos/')[1],
type: "movie",
title: m.title['$t'],
alt: m.title['$t'],
ref: decodeURIComponent(m.link[0].href),
author: m.author[0].name['$t'],
license: 'unknown',
width: 112,
height: 84
});
var temp = $div({className: 'float_div'}, thumb);
this.Result.appendChild(temp);
}
};
CoogleSettings.clipart = {
name: 'clipart',
visible: true,
iconPosition: 3,
Result : $('clip_result'),
restUrl : 'http://sharestyle.com/~rakusai/notaclipart/?',
keytext : 'q',
skipCheck: true,
restPrm : {
format : 'json',
callback : 'clipart.showResult'
},
listPat : 'data.items.item',
search: function(){
filecheck('clipart');
this.exSearch('note');
},
exSearch: function(key){
if(setResult(key+'_clip', 'clip_result'))return;
var lists = $A($('clip_select').getElementsByTagName('li'));
log(lists)
lists.each(function(list){
list.className = (list.id==key+'_clip') ? 'select_clip' : 'clip';
});
this.setLoading();
/*
var index = $('clip_select').selectedIndex;
var key = $('clip_select')[index].value;
*/
eval('var param = $H({'+this.keytext+' : "'+key+'"})');
param = param.merge(this.restPrm);
var url = this.restUrl + param.toQueryString();
if(this.useproxy) url = this.proxy + escape(url) + '&type=' + this.name;
this.setScript(url);
},
showTemp : function(clip){
var server = 'http://sharestyle.com/~rakusai/notaclipart/';
var type = server + clip.path + '/';
var thumb = type + clip.thumb;
var file = type + clip.file;
var img = $img({
src : thumb,
source : file,
ref : server,
author: clip.author,
license: clip.license
});
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
},
showResult: function(data){
Coogle.prototype.showResult.bind(this)(data);
var sample = data.items;
var link = (sample.web != '') ? '<a href="' + sample.web + '" target="_blank">' + sample.author + '</a>' : sample.author;
var link = (sample.web != '') ? $a({href: sample.web, target: '_blank'}, sample.author) : sample.author;
this.Result.appendChild($p({style:{clear: 'both'}}, ['by ' , link, $br(), 'license : ' + sample.license]));
}
};
/*
Event.observe($('clip_select'), 'change', function(){
clipart.exSearch(this.value);
});
*/
CoogleSettings.iclipart = {
name: 'iclipart',
visible: true,
iconPosition: 3,
Result : $('iclip_result'),
restUrl : 'http://sharestyle.com/~rakusai/notaclipart/?',
keytext : 'q',
skipCheck: true,
restPrm : {
format : 'json',
callback : 'iclipart.showResult'
},
listPat : 'data.items.item',
search: function(){
filecheck('iclipart');
this.exSearch('isummit');
},
exSearch: function(key){
if(setResult(key+'_iclip', 'iclip_result')) return;
var lists = $A($('iclip_select').getElementsByTagName('li'));
log(lists)
lists.each(function(list){
list.className = (list.id==key+'_iclip') ? 'select_clip' : 'clip';
});
this.setLoading();
eval('var param = $H({'+this.keytext+' : "'+key+'"})');
param = param.merge(this.restPrm);
var url = this.restUrl + param.toQueryString();
if(this.useproxy) url = this.proxy + escape(url) + '&type=' + this.name;
this.setScript(url);
},
showTemp : function(clip){
var server = 'http://sharestyle.com/~rakusai/notaclipart/';
var type = server + clip.path + '/';
var thumb = type + clip.thumb;
var file = type + clip.file;
var img = $img({
src : thumb,
source : file,
ref : server,
author: clip.author,
license: clip.license
});
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
},
showResult: function(data){
Coogle.prototype.showResult.bind(this)(data);
var sample = data.items;
var link = (sample.web != '') ? '<a href="' + sample.web + '" target="_blank">' + sample.author + '</a>' : sample.author;
var link = (sample.web != '') ? $a({href: sample.web, target: '_blank'}, sample.author) : sample.author;
this.Result.appendChild($p({style:{clear: 'both'}}, ['by ' , link, $br(), 'license : ' + sample.license]));
}
};
CoogleSettings.notalink = {
name: 'notalink',
visible: true,
iconPosition: 7,
restUrl : '/status/search.json?',
keytext : 'q',
restPrm : {
channel:'',
sort:'create',
count: 200,
callback: 'notalink.showResult'
},
listPat : 'data.boards',
showResult : function(data){
restoreIcon(this.name, this.iconPosition);
if(data.stat != 'ok' || !data.boards.length){
$('result').innerHTML= Message.result;
return;
}
this.clear();
eval('var list = '+this.listPat);
for( var i=0, l=list.length; i<l; i++ ) {
this.showTemp(list[i]);
}
},
showTemp : function(board){
var img = $img({
src : '/snapshot/' + board.board_id +'_n.jpg',
source : '/snapshot/' + board.board_id +'_l.jpg',
ref : '/' + board.author_name + '/' + board.board_id,
author: board.author_name,
license: 'cc-by-sa',
type: 'notalink',
board_id: board.board_id
});
img.style.width = '196px';
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
};
CoogleSettings.amazon = {
name: 'amazon',
visible: false,
iconPosition: 4,
restUrl : 'http://webservices.amazon.com/onca/xml?',
useproxy: true,
keytext : 'Keywords',
restPrm : {
Service:'AWSECommerceService',
SubscriptionId:'1K7MYAE6YV7PVZZK0CR2',
AssociateTag:'ximers-20',
Operation:'ItemSearch',
SearchIndex:'All',
ResponseGroup:'Small,Images',
initialSearch: 1,
Version:'2007-08-30'
},
listPat : 'data.Items.Item',
showTemp : function(m){
if(!m.hasOwnProperty('MediumImage')) return;
var img = $img({
src : (m['SmallImage']) ? m['SmallImage']['URL'] : '',
source : (m['LargeImage']) ? m['LargeImage']['URL'] : (m['MediumImage']) ? m['MediumImage']['URL'] : '',
ref : m['DetailPageURL'],
title: m['ItemAttributes']['Title'],
author: 'unknown',
license: 'unknown',
type: 'amazon'
});
img.style.width = m['SmallImage']['Width'].content;
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
};
CoogleSettings.amazonjp = {};
Object.extend(CoogleSettings.amazonjp, CoogleSettings.amazon);
CoogleSettings.amazonjp.name = 'amazonjp';
CoogleSettings.amazonjp.visible = false;
CoogleSettings.amazonjp.restUrl = 'http://webservices.amazon.co.jp/onca/xml?';
CoogleSettings.amazonjp.restPrm.SearchIndex = 'Blended';
CoogleSettings.news = {
name: 'news',
visible: false,
iconPosition: 5,
restUrl : 'http://news.google.com/news?',
useproxy : true,
keytext : 'q',
restPrm : {
hl : 'us',
ned : 'us',
ie : 'UTF-8',
oe : 'UTF-8',
output : 'rss'
},
showResult : function(data){
restoreIcon(this.name, this.iconPosition);
this.clear();
if(data.channel.item==undefined){
this.Result.innerHTML = Message.result;
return;
}
var items = data.channel.item;
var author = 'unknown';
var license = 'unknown';
if(items.length>1){
var result = this.Result;
items.each(function(item, index){
var temp = $div({'class': 'item', id: 'news' + index});
var ref = 'http://' + decodeURIComponent(item.link.split('http://')[2]);
var button = '<input type="button" value="< Paste" onclick="setText(\'news'+index+'\',\''+ref+'\',\''+author+'\',\''+license+'\');" onmouseover="copySafari()">';
var header = mktag('h5', {},
mktag('strong', {}, item.title.split(/ - /)[0])
);
header.innerHTML += button;
temp.appendChild(header);
temp.innerHTML +=  item.description;
result.appendChild(temp);
});
}
}
};
CoogleSettings.ccmixter = {
name: 'ccmixter',
visible: false,
iconPosition: 8,
restUrl : 'http://ccmixter.org/media/api/search?',
useproxy : true,
keytext : 'query',
restPrm : {
},
listPat : 'data.channel.item',
showTemp : function(clip){
var img = $img({
src : clip['media:thumbnail'].url,
source : clip.enclosure.url,
ref : clip.link,
author: clip['dc:creator'],
license: 'cc-by-sa',
alt: clip.title,
title: clip.title,
style: {
border: 0,
width: '75px',
height: '75px'
}
});
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
};
CoogleSettings.tumblr = {
name: 'tumblr',
visible: false,
iconPosition: 9,
restUrl : 'http://#id.tumblr.com/api/read?',
useproxy : true,
keytext : 'id',
restPrm : {
type : 'photo'
},
listPat : 'data.posts.post',
exSearch: function(){
var url = this.restUrl.replace(/#id/, this.ekey);
this.setLoading();
eval('var param = $H({'+this.keytext+' : "'+this.ekey+'"})');
param = param.merge(this.restPrm);
url = url + param.toQueryString();
if(this.useproxy) url = this.proxy + escape(url) + '&type=' + this.name;
this.setScript(url);
},
showTemp : function(m){
var photo = m['photo-url'];
var img = $img({
src : photo[4].content,
source : photo[0].content,
ref : 'http://'+this.ekey+'.tumblr.com/',
author: 'unknown',
license: 'unknown'
});
img.style.width = '75px';
img.style.height = '75px';
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
};
CoogleSettings.wikipedia = {
name: 'wikipedia',
visible: true,
iconPosition: 2,
restUrl : 'http://en.wikipedia.org/wiki/Special:Export/',
useproxy : true,
keytext : 'id',
restPrm : {
type : 'photo'
},
listPat : 'data.page.revision.text.content;',
exSearch: function(){
var url = this.restUrl+this.ekey;
this.setLoading();
if(this.useproxy) url = this.proxy + escape(url) + '&type=' + this.name;
this.setScript(url);
},
showResult : function(data){
restoreIcon(this.name, this.iconPosition);
if(! data.page) {
this.Result.innerHTML = Message.result;
return;
}
var ref = 'http://en.wikipedia.org/wiki/'+this.ekey;
var author = 'wikipedia';
var license = 'gfdl';
var button = '<input type="button" value="Paste" onclick="setText(\'result\',\''+ref+'\',\''+author+'\',\''+license+'\');" onmouseover="copySafari()">';
var head = this.ekey + ' ';
var link = '<a href="http://en.wikipedia.org/wiki/'+this.ekey+'" target="_blank" style="font-weight:normal;"> from wikipedia</a>';
var keyword = '<h5>' + decodeURIComponent(head) + button + link + '</h5>';
var text =  data.page.revision.text.content;
var redirect = text.match(/^#REDIRECT \[\[(.*?)\]\]/i);
if(redirect){
this.key.value = RegExp.$1;
this.search();
return;
}
var result = $('result');
text = text.stripTags();
text = text.replace(/\[\[(.*?)\]\]/g, function(match, word){
return wikiLink(word);
});
text = text.replace(/==(.*?)==/g, function(match, word){
return '<br><strong>'+word+'</strong>';
});
this.Result.innerHTML = keyword + '<p>' + text.split(/\n+/).join('<br>') + '</p>';
}
};
wikiLink = function(word){
var link = '<a href="javascript:$(\'key\').value=\''+word+'\';wikipedia.search();">'+word+'</a>';
return link;
}
copySafari = function(){
if(window.getSelection)window.setText.copy=window.getSelection() + '';
}
setText = function(area, ref, author, license){
if(window.setText.copy && window.setText.copy != ''){
var tx = window.setText.copy;
}else{
var tx = document.selection ?
document.selection.createRange().text :
window.getSelection ?
window.getSelection() + '' :
window.selection.createRange().text;
}
if(tx){
var text = tx;
}else{
var text = $(area).innerHTML;
}
text = text.replace(/<br>/g, '%br%')
text = text.stripTags();
text = text.replace(/%br%/g, '<br>')
if(text=='')return;
if(!area)var area = 'result';
text = text.substr(0,3000);
var flashvars = 'text='+encodeURIComponent(text)+'&sdir='+sdir+'&page='+board_id+'&ref='+ref+'&date='+(new Date).getTime();
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
}
setMyAlbum()
}
/* my Album */
function alistcheck(type){
listcheck(type);
return;
var lists = $A($('aselect_type').getElementsByTagName('li'));
lists.each(function(list){
list.className = list.id==type ? 'select_tab' : 'tab';
});
}
var Album = Class.create();
Object.extend(Album.prototype, Coogle.prototype);
Object.extend(Album.prototype, {
initialize : function(opts){
this.Result = $('aresult');
this.key = $('akey');
this.form = $('aform');
this.proxy = '/public/cgi/xml2json.cgi?&var=data&url=';
this.useproxy = false;
this.indicator = '/public/img/parts/indicatior.gif';
this.name = '';
this.restUrl = '';
this.keytext = '';
this.restPrm = {};
this.listPat = '';
this.showTemp = function(){}
this.indexName = '';
this.currentPage = 1;
Object.extend(this, opts || {});
Event.observe(this.form, 'submit', this.submitForm.bind(this));
this.addSet()
},
search: function(){
log(this.key.value != Cookie.get(this.name))
if(Cookie.get(this.name)){
if(this.key.value != Message.akey && this.key.value != Cookie.get(this.name)){
Cookie.set(this.name, encodeURIComponent(this.key.value), 315360000)
}else{
this.key.value = decodeURIComponent(Cookie.get(this.name));
album_form.check();
}
}else{
if(this.key.value != Message.akey){
Cookie.set(this.name, encodeURIComponent(this.key.value), 315360000)
}
}
if(this.key.value == '' || this.key.value == Message.key || this.key.value == Message.akey){
return;
}
this.ekey = encodeURIComponent(this.key.value);
this.exSearch();
},
addSet : function(){
var icon = $span({className: 'icon'});
icon.style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
icon.style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
var list = mktag('li', {htmlFor: name, id:this.name}, [icon, this.name.capitalize()]);
list.style.display = (this.visible) ? 'block' : 'none';
$('aselect_type').appendChild(list);
Event.observe($(this.name), 'mousedown', function(){
if($(this.name).className != 'select_tab'){
this.key.value = '';
}
if(setResult(this.name, 'myphoto_tab')){
this.Result.innerHTML = '';
return;
}
alistcheck(this.name);
this.clear();
album_form.check();
this.search();
$('my_option').innerHTML = '';
$('asearch_option').show();
$('facebook_option').hide();
}.bind(this));
},
submitForm : function(e){
Event.stop(e);
if($(this.name).className=='select_tab'){
this.search();
}
}
});
function aexSearch(key){
$('akey').value = key;
$('album_search').click();
album_form.check();
}
var FaceBook = Class.create();
FaceBook.prototype = {
initialize : function(opts){
this.name = 'facebook';
this.window = null;
this.option = $('my_option');
this.Result = $('aresult');
this.indicator = '/public/img/parts/indicatior.gif';
this.iconPosition = 12;
this.auth = false;
this.api = '/lib/facebook_photos.php';
Object.extend(this, opts || {});
var icon = $span({className: 'icon'});
icon.style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
icon.style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
var list = mktag('li', {className:'tab', id:this.name}, [icon, this.name.capitalize()]);
list.style.display = 'block';
$('aselect_type').appendChild(list);
$(this.name).observe('mousedown', function(e){
if(this.auth){
this.setAuth(this.auth);
return;
}
if(location.href.match(/^http:\/\/test/)){
var api_key = '9f037079e86d56628977af686ef059e1';
}else{
var api_key = '596a91d86da6c336d32d3b5c2b6b5f7e';
}
this.window = window.open('http://www.facebook.com/login.php?v=1.0&api_key='+api_key+'&popup&next=%3Flogin%3Dtrue');
}.bind(this), true);
},
setLoading: function(){
this.Result.innerHTML = '';
this.Result.className = '';
$$('#'+this.name+' span')[0].style.background = 'url(/public/img/parts/indicatior.gif) no-repeat scroll 0pt';
},
setAuth: function(auth){
this.auth = auth;
alistcheck(this.name);
filecheck(this.name);
$('asearch_option').hide();
$('facebook_option').show();
this.setLoading();
Coogle.prototype.setScript(this.api + '?method=getAlbums&callback='+this.name+'.showAlbum&auth_token='+auth);
this.window.close();
},
showAlbum: function(data){
if(data.stat=='fail'){
this.Result.innerHTML = Message.album.error;
return;
}
if(!data.albums.length){
this.Result.innerHTML = Message.album.noalbum;
return;
}
this.Result.innerHTML = '';
$('facebook_user').innerHTML = data.author;
var sel = mktag('select', {id: 'facebook_albums'});
data.albums.each(function(album){
var opt = mktag('option',
{
value : album['id'],
name: album['name']
},
album['name']+' ['+album['size']+'photos]'
);
sel.appendChild(opt);
});
Element.extend(sel).observe('change', function(){
this.setPhoto($F(sel));
}.bind(this));
this.option.innerHTML = '';
this.option.appendChild(sel);
filecheck(this.name);
eval(this.name+'.setPhoto(\''+data.albums[0]['id']+'\')');
},
setPhoto: function(id){
if(id=='') return;
this.setLoading();
Coogle.prototype.setScript(this.api + '?method=getPhotos&id='+id+'&callback='+this.name+'.showPhoto');
},
showPhoto: function(data){
restoreIcon(this.name, this.iconPosition);
if(data.stat=='fail'){
this.Result.innerHTML = Message.album.error;
return;
}
if(!data.photos.length){
this.Result.innerHTML = Message.album.nophoto;
return;
}
this.Result.innerHTML = ''
data.photos.each(function(photo){
var img = $img({
src: photo['src_small'],
source: photo['src_big'],
ref : photo['link'],
author: $F('akey'),
license: 'unknown',
title : photo['caption'],
alt : photo['caption']
});
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}.bind(this));
}
}
setMyAlbum.first = true;
function setMyAlbum(){
album_form = new fillin('akey', Message.akey, '#999');
if($('upload')){
$('upload').observe('mousedown', function(){
if(setResult('upload', 'upload_tab')) return;
listcheck('upload');
});
}
if($('font')){
$('font').observe('mousedown', function(){
if(setResult('font', 'font_tab')) return;
listcheck('font');
setTimeout(function(){
$('font_text').focus();
}, 100);
});
}
/*
$('myphoto').observe('mousedown', function(){
toggleOption('myphoto');
if(setMyAlbum.first){
if(Cookie.get('flickr')){
alistcheck('flickr');
flickr.search();
}else if(Cookie.get('picasa')){
alistcheck('picasa');
picasa.search();
}
setMyAlbum.first = false;
}
});
*/
flickr = new Album({
name: 'flickr',
visible: true,
iconPosition: 0,
restUrl : 'http://www.flickr.com/services/rest/?',
keytext : 'user_id',
user : '',
option : $('my_option'),
api_key : '1f3ae593bf8918b4166d49b628da6a6c',
restPrm : {
api_key  : '1f3ae593bf8918b4166d49b628da6a6c',
method : 'flickr.photos.search',
per_page : 100,
sort : 'date-posted-desc',
format : 'json',
jsoncallback : 'flickr.showResult',
extras : 'license, owner_name'
},
listPat : 'data.photos.photo',
IndexName : 'data.photos.pages',
exSearch: function(data){
var param = {
username: this.key.value,
api_key  : this.api_key,
method : 'flickr.people.findByUsername',
format : 'json',
jsoncallback : 'flickr.photoSearch'
};
var url = this.restUrl + $H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
photoSearch: function(data){
if(data.stat=='ok'){
this.user = data.user.id;
this.getTagList();
eval('var param = $H({'+this.keytext+' : "'+this.user+'"})');
param = param.merge(this.restPrm);
var url = this.restUrl + param.toQueryString();
this.setLoading();
this.setScript(url);
}else{
this.Result.innerHTML = data.message;
this.option.innerHTML = '';
restoreIcon(this.name, this.iconPosition);
}
},
getTagList : function(){
var param = {
user_id: this.user,
api_key  : this.api_key,
method : 'flickr.tags.getListUser',
format : 'json',
jsoncallback : 'flickr.setTagList'
};
var url = this.restUrl + $H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
setTagList : function(data){
if(data.stat=='ok'){
var lists = mktag('select', {id: 'tagList'});
Event.observe(lists, 'change', function(){
this.searchTag($F('tagList'));
}.bind(this))
var list = mktag('option', {value: ''});
list.innerHTML = 'select tag';
lists.appendChild(list);
for(var i=0,l=data.who.tags.tag.length;i<l;i++){
var list = mktag('option', {value: data.who.tags.tag[i]._content});
list.innerHTML = data.who.tags.tag[i]._content;
lists.appendChild(list);
}
this.option.innerHTML = '';
this.option.appendChild(lists);
this.getSetsList();
}else{
this.Result.innerHTML = data.message;
}
},
searchTag : function(tag){
var param = {
api_key  : this.api_key,
method : 'flickr.photos.search',
tags:  tag,
user_id: this.user,
per_page : 100,
sort : 'date-posted-desc',
format : 'json',
jsoncallback : 'flickr.showResult',
extras : 'license, owner_name'
}
var url = this.restUrl + $H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
getSetsList : function(){
var param = {
user_id: this.user,
api_key  : this.api_key,
method : 'flickr.photosets.getList',
format : 'json',
jsoncallback : 'flickr.setSetsList'
};
var url = this.restUrl + $H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
setSetsList : function(data){
if(data.stat=='ok'){
var lists = mktag('select', {id: 'setsList'});
var list = mktag('option', {value: ''});
list.innerHTML = 'select set';
lists.appendChild(list);
Event.observe(lists, 'change', function(){
this.searchSets($F('setsList'));
}.bind(this))
for(var i=0,l=data.photosets.photoset.length;i<l;i++){
var list = mktag('option', {value: data.photosets.photoset[i].id});
list.innerHTML = data.photosets.photoset[i].title._content;
lists.appendChild(list);
}
this.option.appendChild(lists);
}else{
this.Result.innerHTML = data.message;
}
},
searchSets : function(set_id){
if(set_id == '')return;
var param = {
api_key  : this.api_key,
method : 'flickr.photosets.getPhotos',
photoset_id:  set_id,
per_page : 100,
sort : 'date-posted-desc',
format : 'json',
jsoncallback : 'flickr.showSetsResult',
extras : 'license, owner_name'
}
var url = this.restUrl + $H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
showSetsResult: function(data){
if(!data.stat=='ok' || !data.photoset.photo){
this.Result.innerHTML= Message.result;
return;
}
var list = data.photoset.photo;
this.clear();
for( var i=0, l=list.length; i<l; i++ ) {
this.showTemp(list[i]);
}
$$('#'+this.name+' span')[0].style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
$$('#'+this.name+' span')[0].style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
},
showTemp : function(thumb){
var temp = $div();
if(thumb.license==2){
var license = 'cc-by-nc';
}else if(thumb.license==4){
var license = 'cc-by';
}else{
var license = 'unknown';
}
var owner = (thumb.owner) ? thumb.owner : this.user;
var img = $img({
src : 'http://static.flickr.com/'+thumb.server+'/'+thumb.id+'_'+thumb.secret+'_s.jpg',
source : 'http://farm2.static.flickr.com/'+thumb.server+'/'+thumb.id+'_'+thumb.secret+'.jpg',
ref : 'http://www.flickr.com/photos/'+owner+'/'+thumb.id+'/',
author: thumb.ownername,
license: license,
title : thumb.title,
alt : thumb.title,
width : '75',
height : '75'
});
img.style.border = '0';
temp.appendChild(img);
temp.appendChild(mktag('br'));
var license = $img();
var type;
if(thumb.license==2){
type = 'cc-by-nc75x15.png';
}else if(thumb.license==4){
type = 'cc-by75x15.png';
}
license.src = '/public/img/parts/' + type;
temp.appendChild(license);
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
});
picasa = new Album({
name: 'picasa',
visible: true,
iconPosition: 11,
restUrl : 'http://picasaweb.google.com/data/feed/api/user/',
keytext : 'kind',
user: '',
restPrm : {
kind:'photo',
alt:'json-in-script',
callback:'picasa.showResult',
thumbsize: 72,
'max-results': 25
},
pagePrm : 'start-index',
listPat : 'data.feed.entry',
IndexName: 'data.feed.openSearch$startIndex.$t',
exSearch: function(pageNation){
var param = {
kind: 'album',
alt: 'json-in-script',
callback: 'picasa.showAlbum'
};
var url = this.restUrl+this.ekey+'?'+$H(param).toQueryString();
this.setLoading();
this.setScript(url);
},
showAlbum: function(data){
var sel = [];
for(var i=0,l=data.feed.entry.length;i<l;i++){
var opt = mktag('option', { value: data.feed.entry[i].gphoto$user.$t+','+data.feed.entry[i].gphoto$id.$t }, data.feed.entry[i].title.$t);
sel.push(opt);
}
this.clear();
var select = mktag('select', {id: 'picasa_albums'}, sel);
Element.extend(select).observe('change', function(){
var opt = $F(select).split(',');
this.photoSearch(opt[0], opt[1]);
}.bind(this));
$('my_option').innerHTML = '';
$('my_option').appendChild(select);
picasa.photoSearch(data.feed.entry[0].gphoto$user.$t, data.feed.entry[0].gphoto$id.$t);
},
photoSearch: function(user, albumId, pageNation){
this.user =  (user != null) ? user : this.user;
this.albumId = (albumId != null) ? albumId : this.albumId;
if(pageNation){
var page = new Object();
page[this.pagePrm] = this.currentPage;
this.restPrm = $H(this.restPrm).merge(page);
}
log(this.restPrm)
log(this.user)
log(this.albumId)
var url = this.restUrl+encodeURIComponent(this.user)+'/albumid/'+this.albumId+'?'+$H(this.restPrm).toQueryString();
log($H(this.restPrm).toQueryString())
this.setLoading();
this.setScript(url);
},
showResult : function(data){
Album.prototype.showResult.bind(this)(data);
var index = eval(this.IndexName);
if(index == 0) return;
var totalPages = data.feed.openSearch$totalResults.$t / this.restPrm['max-results'];
totalPages = Math.ceil(totalPages);
var currentPage = Math.ceil(this.currentPage / this.restPrm['max-results']);
var previous_view = (this.currentPage==1) ? 'none' : '';
var next_view = (currentPage==totalPages) ? 'none' : '';
var navi = $div({id: 'pageNation'},[
$span({id: 'prevPage', style:{display: previous_view}}, '<<back'),
$span({id: 'nextPage', style:{display: next_view}}, 'more photos>>'),
$span({}, currentPage+'/'+totalPages)
]
);
this.Result.appendChild(navi);
$('nextPage').observe('click', this.nextSearch.bind(this), true);
$('prevPage').observe('click', this.prevSearch.bind(this), true);
},
nextSearch : function(){
this.currentPage+=this.restPrm['max-results'];
this.photoSearch(null, null, true);
},
prevSearch : function(){
this.currentPage-=this.restPrm['max-results'];
if(this.currentPage==0){
this.currentPage = 1;
return;
}
this.photoSearch(null, null, true);
},
showTemp : function(thumb){
var img = $img({
src : thumb.media$group.media$thumbnail[0].url,
source : thumb.media$group.media$content[0].url,
ref : thumb.link[1].href,
author: thumb.media$group.media$credit[0].$t,
license: 'unknown',
title : thumb.media$group.media$title.$t,
alt : thumb.media$group.media$title.$t,
width : thumb.media$group.media$thumbnail[0].width,
height : thumb.media$group.media$thumbnail[0].height
});
img.style.border = '0';
var temp = $div({className: 'float_div'}, img);
this.Result.appendChild(temp);
}
});
startCoogle();
for(setting in CoogleSettings){
window[setting] = new Coogle(CoogleSettings[setting]);
}
$('font_form').observe('submit', function(e){
Event.stop(e);
var text = $F('font_text').stripTags().split('\n').join('<br>');
if(text == ''){
$('font_text').focus();
return;
}
var font = Form.serialize($('font_form')).toQueryParams()['font_select'];
text = '<font face="' + font + '">' + text + '</font>';
pasteFontArt(text);
});
$('select_type').appendChild(mktag('li', {'id': 'map'}, [
$span({style:{backgroundPosition: '0 -100px'}}),
'Map'
]));
$('map').observe('mousedown', map);
$('movie').observe('mousedown', function(){
$('moviePaste').observe('click', function(){
$('moviePreview').hide();
$('smallMovie').innerHTML = '';
pasteMovie(previewMovie.video_id)
});
$('movieCancel').observe('click', function(){
$('moviePreview').hide();
$('smallMovie').innerHTML = '';
loadingFunc.back();
});
});
}
var Gadget = Class.create();
Gadget.prototype = {
initialize : function(opts){
this.option = $('my_option');
this.Result = $('aresult');
this.indicator = '/public/img/parts/indicatior.gif';
this.iconPosition = 16;
this.auth = false;
Object.extend(this, opts || {});
var icon = $span({className: 'icon'});
icon.style.background = 'url(/public/img/icon/icons.gif) no-repeat scroll 0pt';
icon.style.backgroundPosition = '0 '+ (-20 * this.iconPosition) + 'px';
var list = mktag('li', {className:'tab', id:this.name}, [icon, this.label]);
list.style.display = 'block';
$('gselect_type').appendChild(list);
$(this.name).observe('mousedown', function(e){
pastePlugin(this.name);
}.bind(this), true);
},
setLoading: function(){
this.Result.innerHTML = '';
this.Result.className = '';
$$('#'+this.name+' span')[0].style.background = 'url(/public/img/parts/indicatior.gif) no-repeat scroll 0pt';
}
};
function startCoogle(){
facebook = new FaceBook();
MessageBoard = new Gadget({
label: 'Message Board',
name: 'bbs'
});
MessageBoard = new Gadget({
label: 'Access Counter',
name: 'counter'
});
MessageBoard = new Gadget({
label: 'Webcam',
name: 'camera'
});
}
/* iam_home.js */
function swftojs(action, parameter){
log(action+':'+parameter);
eval('var param = ' + parameter);
for (prop in  param){
param[prop] = encodeURIComponent(param[prop]);
}
if(action=='changetitle'){
return;
}else if(action=='openurl'){
openurl(param);
}else if(action=='togglescreen'){
togglescreen();
}else if(action=='newWillustrator'){
newWillustrator();
}else if(action=='copyboard'){
copyboard();
}else if(action=='toggleSidebar'){
toggleSidebar();
}else if(action=='showSidebar'){
showSidebar();
}else if(action=='hideSidebar'){
hideSidebar();
}else if(action=='showLogin'){
showDialog('login', '', '_selfwithedit:'+board_id);
}else if(action=='signupLogin'){
showDialog('login', '', '_self');
}else if(action=='moveNextBoard'){
log(param)
moveNextBoard(param.url);
}else if(action=='jump'){
log(param)
jump(param.url);
}else if(action=='getUrl'){
log(param)
getUrl(pram.url);
}else if(action=='pasteInsertSrc'){
logo()
log(param)
pasteInsertSrc();
}
}
function getUrl(url){
location.href = url
}
function isEdit(){
return $('side').visible();
}
function jump(url){
var flashvars = 'url='+url+'&sdir='+sdir+'&page='+board_id;
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
log($('complete_upload').innerHTML);
}
function changetitle(param){
$('board_title').innerHTML = param.title;
}
function openurl(param){
var url = param.url;
var target = param.target;
if(target=='_blank'){
window.open(url);
} else if(target=='_overlay') {
browser.show(url);
}
}
function moveNextBoard(next_board_id){
location.href = '/' + profile_user_name + '/' + next_board_id;
}
function flashCommand(cmd){
var flashvars = 'sdir='+sdir+'&page='+board_id+'&command='+cmd;
$('complete_upload').innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="5" height="5" align=""> <param name="movie" value="/remix/link.swf?ver=216"> <param name="FlashVars" value="'+flashvars+'"> <param name="quality" value="high"> <param name="scale" value="noscale"> <param name="menu" value="true"> <param name="wmode" value=""> <param name="bgcolor" value="#FFFFFF"> <param name="salign" value="LT"> <embed src="/remix/link.swf?ver=216" FlashVars="'+flashvars+'"quality="high" bgcolor="#FFFFFF" wmode="" scale="noscale" salign="LT" menu="false" width="5" height="5" name="link" align="" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed></object>';
}
function swapTitle(){
$('title_area').hide();
$('title_change_form').show();
$('title_change_form').title.focus();
}
function reswapTitle(){
changeTitle();
}
function changeTitle(e){
if(e) Event.stop(e);
if($('title_change_form').title.value == ''){
$('title_change_form').title.value = $('book_title').innerHTML;
$('title_change_form').hide();
$('title_area').show();
return;
}
var url = '/book/changetitle';
new Ajax.Request(url, {
method: 'post',
parameters: Form.serialize('title_change_form'),
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess:function(req){
log(req.responseText);
eval('var data = ' + req.responseText);
if(data.stat == 'ok'){
$('book_title').innerHTML = $('title_change_form').title.value;
$('title_change_form').hide();
$('title_area').show();
}
},
onFailure:function(req){
log(req);
}
});
}
function toggleMembers(){
$('more_members').toggle();
if(!$('more_members').visible()){
$('toggle_members').innerHTML = toggleMembers.view;
}else{
toggleMembers.view = $('toggle_members').innerHTML;
$('toggle_members').innerHTML = 'Hide';
}
setNotaHeight();
}
function leaveBook(){
if(confirm('Are you sure to quit the member of this notebook?')){
var url = '/book/leave';
new Ajax.Request(url, {
method: 'post',
parameters: 'group_id='+group_id,
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess:function(req){
log(req.responseText);
eval('var data = ' + req.responseText);
if(data.stat == 'ok'){
location.href = '/'
}
},
onFailure:function(req){
log(req);
}
});
}
}
function showAddMember(group_id){
$('nota').style.marginLeft = '-3000px';
$('dialog').show();
$('dialog_iframe').src='/member/add?group_id=' + group_id;
}
function hideAddMember(){
$('nota').style.marginLeft = '0px';
$('dialog').hide();
}
function showDialog(type, button, next){
$('nota').style.marginLeft = '-3000px';
$('dialog').show();
$('dialog_iframe').src='/account/login_invite?login_type='+type+'&button='+encodeURIComponent(button)+'&next='+encodeURIComponent(next);
}
function hideDialog(){
$('nota').style.marginLeft = '0px';
$('dialog').hide();
}
function showProfile(username){
$('nota').style.marginLeft = '-3000px';
$('dialog').show();
$('dialog_iframe').src='/' + username + '/';
}
function toggleNota(){
if($('nota').style.visibility==''){
$('nota').style.visibility = 'hidden';
}else{
$('nota').style.visibility = '';
}
}
function copyboard(){
if(confirm(Message.ccbutton))	$('copyboard').submit();
}
function pasteInsertSrc(){
/*
if(insert_src!=''){
$('pzc').url.value = insert_src;
$('pzc').submit();
}
*/
if(insert_src!=''){
var elm = {
source: insert_src,
author: insert_author,
license: insert_license,
ref : insert_ref
}
var url = '/remix/upload.cgi';
var option = (elm.license!='' && elm.author!='')? '&license='+elm.license+'&author='+encodeURIComponent(elm.author) :'';
log('param:'+option)
new Ajax.Request(url, {
method: 'post',
parameters: 'action=regist2&page='+board_id+'&url='+encodeURIComponent(elm.source)+'&ref='+encodeURIComponent(elm.ref)+option,
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess:function(req){
$('complete_upload').innerHTML = req.responseText;
},
onFailure:function(req){
log(req);
}
});
}
}
function toggleSidebar(){
if(Element.visible('sidebar')){
hideSidebar();
}else{
showSidebar();
}
}
function showTab(tabname,e){
selected = 0;
if (tabname == 'archive'){
$('bml_list').show();
$('side').hide();
$('shareit').hide();
}else if (tabname == 'insert'){
$('bml_list').hide();
$('side').show();
$('shareit').hide();
selected = 1;
}else if (tabname == 'share'){
$('bml_list').hide();
$('side').hide();
$('shareit').show();
selected = 2;
}
var lis = document.getElementById('sidetab').getElementsByTagName("span");
for (var i=0;i<lis.length;i++){
if (i == selected){
lis[i].className ="selected";
}else{
lis[i].className = "";
}
}
setNotaSize();
}
function showSidebar(){
edit_mode = true;
showTab('insert');
}
function firstSearch(){
if($('photo')!=null){
if(profile_user_name=='guest'){
/*
$('key').value = default_keyword;
insert_form.check();
exSearch(default_keyword)
*/
listcheck('upload');
filecheck('upload');
}
}else{
setTimeout(firstSearch, 500);
}
}
function hideSidebar(){
edit_mode = false;
showTab('archive');
}
function setNotaSize(){
if(!Prototype.Browser.MobileSafari){
setNotaHeight();
}
setNotaWidth();
}
function setNotaWidth(){
var size = getWinSize();
var limit = 820;
var sidebar_w = $('sidebar').offsetWidth + 18;
var temp_size = size[0] - sidebar_w;
if(temp_size > limit) temp_size = limit;
var contentsWidth =	temp_size + sidebar_w + 'px' ;
$('contents').style.width = contentsWidth;
document.body.style.width = contentsWidth;
$('header').style.width = contentsWidth;
$('nota').style.width = temp_size + 'px';
$('dialog').style.width = temp_size + 'px';
$('dialog_iframe').style.width = temp_size + 'px';
}
function setNotaHeight(){
var size = getWinSize();
var limit = 0;
var other = [
'header'
].inject(0, function(accumulator, value){
var objHeight = ($(value)!=null) ? $(value).offsetHeight : 0;
return accumulator + objHeight;
});
var notah = (size[1]>=limit) ? size[1] -  other - 7   : limit;
if(notah<limit) notah = limit;
$('nota').style.height =  notah + 'px';
$('dialog').style.height =  notah + 'px';
$('dialog_iframe').style.height =  notah + 'px';
var above = [
'header',
'profile',
'sidetab'
].inject(0, function(accumulator, value){
var objHeight = ($(value)!=null) ? $(value).offsetHeight : 0;
return accumulator + objHeight;
});
var sideh = size[1] - above - 27;
$('side').style.height =  sideh + 'px';
$('bml_list').style.height =  sideh + 'px';
$('shareit').style.height =  sideh + 'px';
/*
$('upload_tab').style.height =  sideh - 60 + 25 + 'px';
$('result').style.height =  sideh - 180 + 50 + 'px';
$('aresult').style.height =  sideh - 165 + 'px';
$('clip_option').style.height =  sideh - 65 + 'px';
*/
setTimeout(function(){
$('now_loading').style.top = $('bml_list').offsetTop + 'px';
$('now_loading').style.left = $('bml_list').offsetLeft + 145 + 'px'
}, 1000);
}
/* for full screen mode
Event.observe(window, 'load', function(){
browser = new CcFox;
flash = new CcFlash('CcFlash', 0, 0, function(){
showNota('CcFlash');
});
});
*/
Event.domReady.add(function() {
if(edit_mode){
showSidebar();
}else{
hideSidebar();
}
Event.observe(window, 'resize', function(){
setNotaSize();
})
showNota('nota');
setCoogle();
pasteInsertSrc();
wallpaperSet();
});
var start = 21;
var enable = true;
var requested = '';
var loading;
var root = $('bml_list');
var init = function(){
loading = $('now_loading');
Event.observe($('bml_list'), 'scroll', watch_scroll);
}
var fadeout = function(el,end,f){
var cf = 0;
var calc = f || function(pos){
return (-Math.cos(pos * Math.PI) / 2) + 0.5;
};
(function(){
var self = arguments.callee;
var pos = cf / end;
el.style.MozOpacity = 1 - calc(pos);
if(cf >= end){
el.style.MozOpacity = 0;
el.style.visibility = 'hidden';
}else{
cf++;
setTimeout(self, 50)
}
})();
}
var busy = function(sw){
if(sw){
loading.style.visibility = 'visible';
}else{
loading.style.visibility = 'hidden';
}
}
var Remain = {
valueOf : function(){
var total = root.scrollHeight - root.clientHeight;
var sc = root.scrollY;
return total - sc;
}
};
var watch_scroll = function(){
var self = arguments.callee;
if(enable && Remain < 500){
do_request()
}
setTimeout(self,100);
};
var	getScrollHeight = function(){
return root.scrollHeight;
}
var getInnerHeight = function(){
return root.innerHeight || root.clientHeight;
}
var getScrollY = function(){
return root.scrollTop;
}
var watch_scroll = function(){
var scrollHeight = getScrollHeight();
var innerHeight = getInnerHeight();
var scrollY = getScrollY();
var Remain = scrollHeight - innerHeight - scrollY;
if(enable && Remain < 500){
do_request();
}
}
var do_request = function(){
if(requested == start){
return
};
requested = start;
log(start)
busy(true);
get_url = '/status/book/' + group_id + '.json?start=' + start + '&sort=create';
if(authkey!='') get_url += '&authkey=' + authkey;
new Ajax.Request(get_url, {
method: 'get',
requestHeaders: ['If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT'],
onSuccess: function(detail){
eval('var data = ' + detail.responseText);
log(data);
if(data.stat == 'ok'){
var temp_date = '';
data.boards.each(function(board, idx){
if(idx == 20) throw $break;
if(temp_date != board.lastupdate){
var date = mktag('h4', {className: 'board_lastupdate'}, board.lastupdate);
temp_date = board.lastupdate;
$('archive_boards').appendChild(date);
}
var link = '/' + board.author_name + '/' + board.board_id; // + '?start=' + start;
if(board.authkey != '') link += '&authkey=' + board.authkey;
var thumb = $a({className : 'board_thumb', href: link},
$img({src: '/snapshot/'+board.board_id+'_s.jpg'})
);
var titleLink = $a({className: 'board_title', href: link});
titleLink.innerHTML = board.title;
var title = $strong({},titleLink);
var description = $span({className: 'board_author'}, [
'by ',
$a({href: '/'+board.author_name+'/'}, board.author_name)
]);
var list = $div({className: 'board'}, [thumb, title, description]);
$('archive_boards').appendChild(list);
});
start += 20;
if(data.boards.length == 0)	enable = false
}
busy(false);
},
onFailure:function(detail){
log('false')
log(detail);
}
});
};
init();