var Json = function(src, callback,opt_args){ 
var callback_func = '_jsoncallback'+Json.prototype.rnd;
Json.prototype.rnd++;
window[callback_func] = function(obj) { 
opt_args = opt_args || {}; 
callback(obj, opt_args);
window[callback_func] = null;
};
if( src.indexOf( '?' ) >= 0 ) {
src = src + "&callback=" + callback_func;
} else {
src = src + "?callback=" + callback_func;
}
var script = document.createElement("SCRIPT"); 
script.setAttribute('charset', 'UTF-8'); 
script.src =  src;
document.body.appendChild(script);	
}
Json.prototype = {
rnd: 10000
}
function nocallback() {
}
(function(){
if ( typeof jQuery != "undefined" )
var _jQuery = jQuery;
var jQuery = window.jQuery = function(selector, context) {
return this instanceof jQuery ?
this.init(selector, context) :
new jQuery(selector, context);
};
if ( typeof $ != "undefined" )
var _$ = $;
window.$ = jQuery;
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
jQuery.fn = jQuery.prototype = {
init: function(selector, context) {
selector = selector || document;
if ( typeof selector  == "string" ) {
var m = quickExpr.exec(selector);
if ( m && (m[1] || !context) ) {
if ( m[1] )
selector = jQuery.clean( [ m[1] ], context );
else {
var tmp = document.getElementById( m[3] );
if ( tmp )
if ( tmp.id != m[3] )
return jQuery().find( selector );
else {
this[0] = tmp;
this.length = 1;
return this;
}
else
selector = [];
}
} else
return new jQuery( context ).find( selector );
} else if ( jQuery.isFunction(selector) )
return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
return this.setArray(
selector.constructor == Array && selector ||
(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
[ selector ] );
},
jquery: "1.2.1",
size: function() {
return this.length;
},
length: 0,
get: function( num ) {
return num == undefined ?
jQuery.makeArray( this ) :
this[num];
},
pushStack: function( a ) {
var ret = jQuery(a);
ret.prevObject = this;
return ret;
},
setArray: function( a ) {
this.length = 0;
Array.prototype.push.apply( this, a );
return this;
},
each: function( fn, args ) {
return jQuery.each( this, fn, args );
},
index: function( obj ) {
var pos = -1;
this.each(function(i){
if ( this == obj ) pos = i;
});
return pos;
},
attr: function( key, value, type ) {
var obj = key;
if ( key.constructor == String )
if ( value == undefined )
return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
else {
obj = {};
obj[ key ] = value;
}
return this.each(function(index){
for ( var prop in obj )
jQuery.attr(
type ? this.style : this,
prop, jQuery.prop(this, obj[prop], type, index, prop)
);
});
},
css: function( key, value ) {
return this.attr( key, value, "curCSS" );
},
text: function(e) {
if ( typeof e != "object" && e != null )
return this.empty().append( document.createTextNode( e ) );
var t = "";
jQuery.each( e || this, function(){
jQuery.each( this.childNodes, function(){
if ( this.nodeType != 8 )
t += this.nodeType != 1 ?
this.nodeValue : jQuery.fn.text([ this ]);
});
});
return t;
},
wrapAll: function(html) {
if ( this[0] )
jQuery(html, this[0].ownerDocument)
.clone()
.insertBefore(this[0])
.map(function(){
var elem = this;
while ( elem.firstChild )
elem = elem.firstChild;
return elem;
})
.append(this);
return this;
},
wrapInner: function(html) {
return this.each(function(){
jQuery(this).contents().wrapAll(html);
});
},
wrap: function(html) {
return this.each(function(){
jQuery(this).wrapAll(html);
});
},
append: function() {
return this.domManip(arguments, true, 1, function(a){
this.appendChild( a );
});
},
prepend: function() {
return this.domManip(arguments, true, -1, function(a){
this.insertBefore( a, this.firstChild );
});
},
before: function() {
return this.domManip(arguments, false, 1, function(a){
this.parentNode.insertBefore( a, this );
});
},
after: function() {
return this.domManip(arguments, false, -1, function(a){
this.parentNode.insertBefore( a, this.nextSibling );
});
},
end: function() {
return this.prevObject || jQuery([]);
},
find: function(t) {
var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
jQuery.unique( data ) : data );
},
clone: function(events) {
var ret = this.map(function(){
return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
});
var clone = ret.find("*").andSelf().each(function(){
if ( this[ expando ] != undefined )
this[ expando ] = null;
});
if (events === true)
this.find("*").andSelf().each(function(i) {
var events = jQuery.data(this, "events");
for ( var type in events )
for ( var handler in events[type] )
jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
});
return ret;
},
filter: function(t) {
return this.pushStack(
jQuery.isFunction( t ) &&
jQuery.grep(this, function(el, index){
return t.apply(el, [index]);
}) ||
jQuery.multiFilter(t,this) );
},
not: function(t) {
return this.pushStack(
t.constructor == String &&
jQuery.multiFilter(t, this, true) ||
jQuery.grep(this, function(a) {
return ( t.constructor == Array || t.jquery )
? jQuery.inArray( a, t ) < 0
: a != t;
})
);
},
add: function(t) {
return this.pushStack( jQuery.merge(
this.get(),
t.constructor == String ?
jQuery(t).get() :
t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
t : [t] )
);
},
is: function(expr) {
return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
},
hasClass: function(expr) {
return this.is("." + expr);
},
val: function( val ) {
if ( val == undefined ) {
if ( this.length ) {
var elem = this[0];
if ( jQuery.nodeName(elem, "select") ) {
var index = elem.selectedIndex,
a = [],
options = elem.options,
one = elem.type == "select-one";
if ( index < 0 )
return null;
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
var option = options[i];
if ( option.selected ) {
var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
if ( one )
return val;
a.push(val);
}
}
return a;
} else
return this[0].value.replace(/\r/g, "");
}
} else
return this.each(function(){
if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
this.checked = (jQuery.inArray(this.value, val) >= 0 ||
jQuery.inArray(this.name, val) >= 0);
else if ( jQuery.nodeName(this, "select") ) {
var tmp = val.constructor == Array ? val : [val];
jQuery("option", this).each(function(){
this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
jQuery.inArray(this.text, tmp) >= 0);
});
if ( !tmp.length )
this.selectedIndex = -1;
} else
this.value = val;
});
},
html: function( val ) {
return val == undefined ?
( this.length ? this[0].innerHTML : null ) :
this.empty().append( val );
},
replaceWith: function( val ) {
return this.after( val ).remove();
},
eq: function(i){
return this.slice(i, i+1);
},
slice: function() {
return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
},
map: function(fn) {
return this.pushStack(jQuery.map( this, function(elem,i){
return fn.call( elem, i, elem );
}));
},
andSelf: function() {
return this.add( this.prevObject );
},
domManip: function(args, table, dir, fn) {
var clone = this.length > 1, a; 
return this.each(function(){
if ( !a ) {
a = jQuery.clean(args, this.ownerDocument);
if ( dir < 0 )
a.reverse();
}
var obj = this;
if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
jQuery.each( a, function(){
var elem = clone ? this.cloneNode(true) : this;
if ( !evalScript(0, elem) )
fn.call( obj, elem );
});
});
}
};
function evalScript(i, elem){
var script = jQuery.nodeName(elem, "script");
if ( script ) {
if ( elem.src )
jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
else
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
if ( elem.parentNode )
elem.parentNode.removeChild(elem);
} else if ( elem.nodeType == 1 )
jQuery("script", elem).each(evalScript);
return script;
}
jQuery.extend = jQuery.fn.extend = function() {
var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
if ( target.constructor == Boolean ) {
deep = target;
target = arguments[1] || {};
}
if ( al == 1 ) {
target = this;
a = 0;
}
var prop;
for ( ; a < al; a++ )
if ( (prop = arguments[a]) != null )
for ( var i in prop ) {
if ( target == prop[i] )
continue;
if ( deep && typeof prop[i] == 'object' && target[i] )
jQuery.extend( target[i], prop[i] );
else if ( prop[i] != undefined )
target[i] = prop[i];
}
return target;
};
var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
jQuery.extend({
noConflict: function(deep) {
window.$ = _$;
if ( deep )
window.jQuery = _jQuery;
return jQuery;
},
isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName && 
fn.constructor != Array && /function/i.test( fn + "" );
},
isXMLDoc: function(elem) {
return elem.documentElement && !elem.body ||
elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
},
globalEval: function( data ) {
data = jQuery.trim( data );
if ( data ) {
if ( window.execScript )
window.execScript( data );
else if ( jQuery.browser.safari )
window.setTimeout( data, 0 );
else
eval.call( window, data );
}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},
cache: {},
data: function( elem, name, data ) {
elem = elem == window ? win : elem;
var id = elem[ expando ];
if ( !id ) 
id = elem[ expando ] = ++uuid;
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
if ( data != undefined )
jQuery.cache[ id ][ name ] = data;
return name ? jQuery.cache[ id ][ name ] : id;
},
removeData: function( elem, name ) {
elem = elem == window ? win : elem;
var id = elem[ expando ];
if ( name ) {
if ( jQuery.cache[ id ] ) {
delete jQuery.cache[ id ][ name ];
name = "";
for ( name in jQuery.cache[ id ] ) break;
if ( !name )
jQuery.removeData( elem );
}
} else {
try {
delete elem[ expando ];
} catch(e){
if ( elem.removeAttribute )
elem.removeAttribute( expando );
}
delete jQuery.cache[ id ];
}
},
each: function( obj, fn, args ) {
if ( args ) {
if ( obj.length == undefined )
for ( var i in obj )
fn.apply( obj[i], args );
else
for ( var i = 0, ol = obj.length; i < ol; i++ )
if ( fn.apply( obj[i], args ) === false ) break;
} else {
if ( obj.length == undefined )
for ( var i in obj )
fn.call( obj[i], i, obj[i] );
else
for ( var i = 0, ol = obj.length, val = obj[0]; 
i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
}
return obj;
},
prop: function(elem, value, type, index, prop){
if ( jQuery.isFunction( value ) )
value = value.call( elem, [index] );
var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
value + "px" :
value;
},
className: {
add: function( elem, c ){
jQuery.each( (c || "").split(/\s+/), function(i, cur){
if ( !jQuery.className.has( elem.className, cur ) )
elem.className += ( elem.className ? " " : "" ) + cur;
});
},
remove: function( elem, c ){
elem.className = c != undefined ?
jQuery.grep( elem.className.split(/\s+/), function(cur){
return !jQuery.className.has( c, cur );	
}).join(" ") : "";
},
has: function( t, c ) {
return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
}
},
swap: function(e,o,f) {
for ( var i in o ) {
e.style["old"+i] = e.style[i];
e.style[i] = o[i];
}
f.apply( e, [] );
for ( var i in o )
e.style[i] = e.style["old"+i];
},
css: function(e,p) {
if ( p == "height" || p == "width" ) {
var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
jQuery.each( d, function(){
old["padding" + this] = 0;
old["border" + this + "Width"] = 0;
});
jQuery.swap( e, old, function() {
if ( jQuery(e).is(':visible') ) {
oHeight = e.offsetHeight;
oWidth = e.offsetWidth;
} else {
e = jQuery(e.cloneNode(true))
.find(":radio").removeAttr("checked").end()
.css({
visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
}).appendTo(e.parentNode)[0];
var parPos = jQuery.css(e.parentNode,"position") || "static";
if ( parPos == "static" )
e.parentNode.style.position = "relative";
oHeight = e.clientHeight;
oWidth = e.clientWidth;
if ( parPos == "static" )
e.parentNode.style.position = "static";
e.parentNode.removeChild(e);
}
});
return p == "height" ? oHeight : oWidth;
}
return jQuery.curCSS( e, p );
},
curCSS: function(elem, prop, force) {
var ret, stack = [], swap = [];
function color(a){
if ( !jQuery.browser.safari )
return false;
var ret = document.defaultView.getComputedStyle(a,null);
return !ret || ret.getPropertyValue("color") == "";
}
if (prop == "opacity" && jQuery.browser.msie) {
ret = jQuery.attr(elem.style, "opacity");
return ret == "" ? "1" : ret;
}
if (prop.match(/float/i))
prop = styleFloat;
if (!force && elem.style[prop])
ret = elem.style[prop];
else if (document.defaultView && document.defaultView.getComputedStyle) {
if (prop.match(/float/i))
prop = "float";
prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
var cur = document.defaultView.getComputedStyle(elem, null);
if ( cur && !color(elem) )
ret = cur.getPropertyValue(prop);
else {
for ( var a = elem; a && color(a); a = a.parentNode )
stack.unshift(a);
for ( a = 0; a < stack.length; a++ )
if ( color(stack[a]) ) {
swap[a] = stack[a].style.display;
stack[a].style.display = "block";
}
ret = prop == "display" && swap[stack.length-1] != null ?
"none" :
document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
for ( a = 0; a < swap.length; a++ )
if ( swap[a] != null )
stack[a].style.display = swap[a];
}
if ( prop == "opacity" && ret == "" )
ret = "1";
} else if (elem.currentStyle) {
var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
var style = elem.style.left;
var runtimeStyle = elem.runtimeStyle.left;
elem.runtimeStyle.left = elem.currentStyle.left;
elem.style.left = ret || 0;
ret = elem.style.pixelLeft + "px";
elem.style.left = style;
elem.runtimeStyle.left = runtimeStyle;
}
}
return ret;
},
clean: function(a, doc) {
var r = [];
doc = doc || document;
jQuery.each( a, function(i,arg){
if ( !arg ) return;
if ( arg.constructor == Number )
arg = arg.toString();
if ( typeof arg == "string" ) {
arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
});
var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
var wrap =
!s.indexOf("<opt") &&
[1, "<select>", "</select>"] ||
!s.indexOf("<leg") &&
[1, "<fieldset>", "</fieldset>"] ||
s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[1, "<table>", "</table>"] ||
!s.indexOf("<tr") &&
[2, "<table><tbody>", "</tbody></table>"] ||
(!s.indexOf("<td") || !s.indexOf("<th")) &&
[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
!s.indexOf("<col") &&
[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
jQuery.browser.msie &&
[1, "div<div>", "</div>"] ||
[0,"",""];
div.innerHTML = wrap[1] + arg + wrap[2];
while ( wrap[0]-- )
div = div.lastChild;
if ( jQuery.browser.msie ) {
if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
tb = div.firstChild && div.firstChild.childNodes;
else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
tb = div.childNodes;
for ( var n = tb.length-1; n >= 0 ; --n )
if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
tb[n].parentNode.removeChild(tb[n]);
if ( /^\s/.test(arg) )	
div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
}
arg = jQuery.makeArray( div.childNodes );
}
if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
return;
if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
r.push( arg );
else
r = jQuery.merge( r, arg );
});
return r;
},
attr: function(elem, name, value){
var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
if ( name == "selected" && jQuery.browser.safari )
elem.parentNode.selectedIndex;
if ( fix[name] ) {
if ( value != undefined ) elem[fix[name]] = value;
return elem[fix[name]];
} else if ( jQuery.browser.msie && name == "style" )
return jQuery.attr( elem.style, "cssText", value );
else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
return elem.getAttributeNode(name).nodeValue;
else if ( elem.tagName ) {
if ( value != undefined ) {
if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
throw "type property can't be changed";
elem.setAttribute( name, value );
}
if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
return elem.getAttribute( name, 2 );
return elem.getAttribute( name );
} else {
if ( name == "opacity" && jQuery.browser.msie ) {
if ( value != undefined ) {
elem.zoom = 1; 
elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
}
return elem.filter ? 
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
}
name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
if ( value != undefined ) elem[name] = value;
return elem[name];
}
},
trim: function(t){
return (t||"").replace(/^\s+|\s+$/g, "");
},
makeArray: function( a ) {
var r = [];
if ( typeof a != "array" )
for ( var i = 0, al = a.length; i < al; i++ )
r.push( a[i] );
else
r = a.slice( 0 );
return r;
},
inArray: function( b, a ) {
for ( var i = 0, al = a.length; i < al; i++ )
if ( a[i] == b )
return i;
return -1;
},
merge: function(first, second) {
if ( jQuery.browser.msie ) {
for ( var i = 0; second[i]; i++ )
if ( second[i].nodeType != 8 )
first.push(second[i]);
} else
for ( var i = 0; second[i]; i++ )
first.push(second[i]);
return first;
},
unique: function(first) {
var r = [], done = {};
try {
for ( var i = 0, fl = first.length; i < fl; i++ ) {
var id = jQuery.data(first[i]);
if ( !done[id] ) {
done[id] = true;
r.push(first[i]);
}
}
} catch(e) {
r = first;
}
return r;
},
grep: function(elems, fn, inv) {
if ( typeof fn == "string" )
fn = eval("false||function(a,i){return " + fn + "}");
var result = [];
for ( var i = 0, el = elems.length; i < el; i++ )
if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
result.push( elems[i] );
return result;
},
map: function(elems, fn) {
if ( typeof fn == "string" )
fn = eval("false||function(a){return " + fn + "}");
var result = [];
for ( var i = 0, el = elems.length; i < el; i++ ) {
var val = fn(elems[i],i);
if ( val !== null && val != undefined ) {
if ( val.constructor != Array ) val = [val];
result = result.concat( val );
}
}
return result;
}
});
var userAgent = navigator.userAgent.toLowerCase();
jQuery.browser = {
version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
safari: /webkit/.test(userAgent),
opera: /opera/.test(userAgent),
msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
};
var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
jQuery.extend({
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
props: {
"for": "htmlFor",
"class": "className",
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
innerHTML: "innerHTML",
className: "className",
value: "value",
disabled: "disabled",
checked: "checked",
readonly: "readOnly",
selected: "selected",
maxlength: "maxLength"
}
});
jQuery.each({
parent: "a.parentNode",
parents: "jQuery.dir(a,'parentNode')",
next: "jQuery.nth(a,2,'nextSibling')",
prev: "jQuery.nth(a,2,'previousSibling')",
nextAll: "jQuery.dir(a,'nextSibling')",
prevAll: "jQuery.dir(a,'previousSibling')",
siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
children: "jQuery.sibling(a.firstChild)",
contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
}, function(i,n){
jQuery.fn[ i ] = function(a) {
var ret = jQuery.map(this,n);
if ( a && typeof a == "string" )
ret = jQuery.multiFilter(a,ret);
return this.pushStack( jQuery.unique(ret) );
};
});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(i,n){
jQuery.fn[ i ] = function(){
var a = arguments;
return this.each(function(){
for ( var j = 0, al = a.length; j < al; j++ )
jQuery(a[j])[n]( this );
});
};
});
jQuery.each( {
removeAttr: function( key ) {
jQuery.attr( this, key, "" );
this.removeAttribute( key );
},
addClass: function(c){
jQuery.className.add(this,c);
},
removeClass: function(c){
jQuery.className.remove(this,c);
},
toggleClass: function( c ){
jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
},
remove: function(a){
if ( !a || jQuery.filter( a, [this] ).r.length ) {
jQuery.removeData( this );
this.parentNode.removeChild( this );
}
},
empty: function() {
jQuery("*", this).each(function(){ jQuery.removeData(this); });
while ( this.firstChild )
this.removeChild( this.firstChild );
}
}, function(i,n){
jQuery.fn[ i ] = function() {
return this.each( n, arguments );
};
});
jQuery.each( [ "Height", "Width" ], function(i,name){
var n = name.toLowerCase();
jQuery.fn[ n ] = function(h) {
return this[0] == window ?
jQuery.browser.safari && self["inner" + name] ||
jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
document.body["client" + name] :
this[0] == document ?
Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
h == undefined ?
( this.length ? jQuery.css( this[0], n ) : null ) :
this.css( n, h.constructor == String ? h : h + "px" );
};
});
var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
"(?:[\\w*_-]|\\\\.)" :
"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
quickChild = new RegExp("^>\\s*(" + chars + "+)"),
quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
quickClass = new RegExp("^([#.]?)(" + chars + "*)");
jQuery.extend({
expr: {
"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
"#": "a.getAttribute('id')==m[2]",
":": {
lt: "i<m[3]-0",
gt: "i>m[3]-0",
nth: "m[3]-0==i",
eq: "m[3]-0==i",
first: "i==0",
last: "i==r.length-1",
even: "i%2==0",
odd: "i%2",
"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
parent: "a.firstChild",
empty: "!a.firstChild",
contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
enabled: "!a.disabled",
disabled: "a.disabled",
checked: "a.checked",
selected: "a.selected||jQuery.attr(a,'selected')",
text: "'text'==a.type",
radio: "'radio'==a.type",
checkbox: "'checkbox'==a.type",
file: "'file'==a.type",
password: "'password'==a.type",
submit: "'submit'==a.type",
image: "'image'==a.type",
reset: "'reset'==a.type",
button: '"button"==a.type||jQuery.nodeName(a,"button")',
input: "/input|select|textarea|button/i.test(a.nodeName)",
has: "jQuery.find(m[3],a).length",
header: "/h\\d/i.test(a.nodeName)",
animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
}
},
parse: [
/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
new RegExp("^([:.#]*)(" + chars + "+)")
],
multiFilter: function( expr, elems, not ) {
var old, cur = [];
while ( expr && expr != old ) {
old = expr;
var f = jQuery.filter( expr, elems, not );
expr = f.t.replace(/^\s*,\s*/, "" );
cur = not ? elems = f.r : jQuery.merge( cur, f.r );
}
return cur;
},
find: function( t, context ) {
if ( typeof t != "string" )
return [ t ];
if ( context && !context.nodeType )
context = null;
context = context || document;
var ret = [context], done = [], last;
while ( t && last != t ) {
var r = [];
last = t;
t = jQuery.trim(t);
var foundToken = false;
var re = quickChild;
var m = re.exec(t);
if ( m ) {
var nodeName = m[1].toUpperCase();
for ( var i = 0; ret[i]; i++ )
for ( var c = ret[i].firstChild; c; c = c.nextSibling )
if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
r.push( c );
ret = r;
t = t.replace( re, "" );
if ( t.indexOf(" ") == 0 ) continue;
foundToken = true;
} else {
re = /^([>+~])\s*(\w*)/i;
if ( (m = re.exec(t)) != null ) {
r = [];
var nodeName = m[2], merge = {};
m = m[1];
for ( var j = 0, rl = ret.length; j < rl; j++ ) {
var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
for ( ; n; n = n.nextSibling )
if ( n.nodeType == 1 ) {
var id = jQuery.data(n);
if ( m == "~" && merge[id] ) break;
if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
if ( m == "~" ) merge[id] = true;
r.push( n );
}
if ( m == "+" ) break;
}
}
ret = r;
t = jQuery.trim( t.replace( re, "" ) );
foundToken = true;
}
}
if ( t && !foundToken ) {
if ( !t.indexOf(",") ) {
if ( context == ret[0] ) ret.shift();
done = jQuery.merge( done, ret );
r = ret = [context];
t = " " + t.substr(1,t.length);
} else {
var re2 = quickID;
var m = re2.exec(t);
if ( m ) {
m = [ 0, m[2], m[3], m[1] ];
} else {
re2 = quickClass;
m = re2.exec(t);
}
m[2] = m[2].replace(/\\/g, "");
var elem = ret[ret.length-1];
if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
var oid = elem.getElementById(m[2]);
if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
} else {
for ( var i = 0; ret[i]; i++ ) {
var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
tag = "param";
r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
}
if ( m[1] == "." )
r = jQuery.classFilter( r, m[2] );
if ( m[1] == "#" ) {
var tmp = [];
for ( var i = 0; r[i]; i++ )
if ( r[i].getAttribute("id") == m[2] ) {
tmp = [ r[i] ];
break;
}
r = tmp;
}
ret = r;
}
t = t.replace( re2, "" );
}
}
if ( t ) {
var val = jQuery.filter(t,r);
ret = r = val.r;
t = jQuery.trim(val.t);
}
}
if ( t )
ret = [];
if ( ret && context == ret[0] )
ret.shift();
done = jQuery.merge( done, ret );
return done;
},
classFilter: function(r,m,not){
m = " " + m + " ";
var tmp = [];
for ( var i = 0; r[i]; i++ ) {
var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
if ( !not && pass || not && !pass )
tmp.push( r[i] );
}
return tmp;
},
filter: function(t,r,not) {
var last;
while ( t  && t != last ) {
last = t;
var p = jQuery.parse, m;
for ( var i = 0; p[i]; i++ ) {
m = p[i].exec( t );
if ( m ) {
t = t.substring( m[0].length );
m[2] = m[2].replace(/\\/g, "");
break;
}
}
if ( !m )
break;
if ( m[1] == ":" && m[2] == "not" )
r = jQuery.filter(m[3], r, true).r;
else if ( m[1] == "." )
r = jQuery.classFilter(r, m[2], not);
else if ( m[1] == "[" ) {
var tmp = [], type = m[3];
for ( var i = 0, rl = r.length; i < rl; i++ ) {
var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
if ( z == null || /href|src|selected/.test(m[2]) )
z = jQuery.attr(a,m[2]) || '';
if ( (type == "" && !!z ||
type == "=" && z == m[5] ||
type == "!=" && z != m[5] ||
type == "^=" && z && !z.indexOf(m[5]) ||
type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
(type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
tmp.push( a );
}
r = tmp;
} else if ( m[1] == ":" && m[2] == "nth-child" ) {
var merge = {}, tmp = [],
test = /(\d*)n\+?(\d*)/.exec(
m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
first = (test[1] || 1) - 0, last = test[2] - 0;
for ( var i = 0, rl = r.length; i < rl; i++ ) {
var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
if ( !merge[id] ) {
var c = 1;
for ( var n = parentNode.firstChild; n; n = n.nextSibling )
if ( n.nodeType == 1 )
n.nodeIndex = c++;
merge[id] = true;
}
var add = false;
if ( first == 1 ) {
if ( last == 0 || node.nodeIndex == last )
add = true;
} else if ( (node.nodeIndex + last) % first == 0 )
add = true;
if ( add ^ not )
tmp.push( node );
}
r = tmp;
} else {
var f = jQuery.expr[m[1]];
if ( typeof f != "string" )
f = jQuery.expr[m[1]][m[2]];
f = eval("false||function(a,i){return " + f + "}");
r = jQuery.grep( r, f, not );
}
}
return { r: r, t: t };
},
dir: function( elem, dir ){
var matched = [];
var cur = elem[dir];
while ( cur && cur != document ) {
if ( cur.nodeType == 1 )
matched.push( cur );
cur = cur[dir];
}
return matched;
},
nth: function(cur,result,dir,elem){
result = result || 1;
var num = 0;
for ( ; cur; cur = cur[dir] )
if ( cur.nodeType == 1 && ++num == result )
break;
return cur;
},
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType == 1 && (!elem || n != elem) )
r.push( n );
}
return r;
}
});
jQuery.event = {
add: function(element, type, handler, data) {
if ( jQuery.browser.msie && element.setInterval != undefined )
element = window;
if ( !handler.guid )
handler.guid = this.guid++;
if( data != undefined ) { 
var fn = handler; 
handler = function() { 
return fn.apply(this, arguments); 
};
handler.data = data;
handler.guid = fn.guid;
}
var parts = type.split(".");
type = parts[0];
handler.type = parts[1];
var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
var handle = jQuery.data(element, "handle", function(){
var val;
if ( typeof jQuery == "undefined" || jQuery.event.triggered )
return val;
val = jQuery.event.handle.apply(element, arguments);
return val;
});
var handlers = events[type];
if (!handlers) {
handlers = events[type] = {};	
if (element.addEventListener)
element.addEventListener(type, handle, false);
else
element.attachEvent("on" + type, handle);
}
handlers[handler.guid] = handler;
this.global[type] = true;
},
guid: 1,
global: {},
remove: function(element, type, handler) {
var events = jQuery.data(element, "events"), ret, index;
if ( typeof type == "string" ) {
var parts = type.split(".");
type = parts[0];
}
if ( events ) {
if ( type && type.type ) {
handler = type.handler;
type = type.type;
}
if ( !type ) {
for ( type in events )
this.remove( element, type );
} else if ( events[type] ) {
if ( handler )
delete events[type][handler.guid];
else
for ( handler in events[type] )
if ( !parts[1] || events[type][handler].type == parts[1] )
delete events[type][handler];
for ( ret in events[type] ) break;
if ( !ret ) {
if (element.removeEventListener)
element.removeEventListener(type, jQuery.data(element, "handle"), false);
else
element.detachEvent("on" + type, jQuery.data(element, "handle"));
ret = null;
delete events[type];
}
}
for ( ret in events ) break;
if ( !ret ) {
jQuery.removeData( element, "events" );
jQuery.removeData( element, "handle" );
}
}
},
trigger: function(type, data, element, donative, extra) {
data = jQuery.makeArray(data || []);
if ( !element ) {
if ( this.global[type] )
jQuery("*").add([window, document]).trigger(type, data);
} else {
var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
evt = !data[0] || !data[0].preventDefault;
if ( evt )
data.unshift( this.fix({ type: type, target: element }) );
data[0].type = type;
if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
val = jQuery.data(element, "handle").apply( element, data );
if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
val = false;
if ( evt )
data.shift();
if ( extra && extra.apply( element, data ) === false )
val = false;
if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
this.triggered = true;
element[ type ]();
}
this.triggered = false;
}
return val;
},
handle: function(event) {
var val;
event = jQuery.event.fix( event || window.event || {} ); 
var parts = event.type.split(".");
event.type = parts[0];
var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
args.unshift( event );
for ( var j in c ) {
args[0].handler = c[j];
args[0].data = c[j].data;
if ( !parts[1] || c[j].type == parts[1] ) {
var tmp = c[j].apply( this, args );
if ( val !== false )
val = tmp;
if ( tmp === false ) {
event.preventDefault();
event.stopPropagation();
}
}
}
if (jQuery.browser.msie)
event.target = event.preventDefault = event.stopPropagation =
event.handler = event.data = null;
return val;
},
fix: function(event) {
var originalEvent = event;
event = jQuery.extend({}, originalEvent);
event.preventDefault = function() {
if (originalEvent.preventDefault)
originalEvent.preventDefault();
originalEvent.returnValue = false;
};
event.stopPropagation = function() {
if (originalEvent.stopPropagation)
originalEvent.stopPropagation();
originalEvent.cancelBubble = true;
};
if ( !event.target && event.srcElement )
event.target = event.srcElement;
if (jQuery.browser.safari && event.target.nodeType == 3)
event.target = originalEvent.target.parentNode;
if ( !event.relatedTarget && event.fromElement )
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
if ( event.pageX == null && event.clientX != null ) {
var e = document.documentElement, b = document.body;
event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
}
if ( !event.which && (event.charCode || event.keyCode) )
event.which = event.charCode || event.keyCode;
if ( !event.metaKey && event.ctrlKey )
event.metaKey = event.ctrlKey;
if ( !event.which && event.button )
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
return event;
}
};
jQuery.fn.extend({
bind: function( type, data, fn ) {
return type == "unload" ? this.one(type, data, fn) : this.each(function(){
jQuery.event.add( this, type, fn || data, fn && data );
});
},
one: function( type, data, fn ) {
return this.each(function(){
jQuery.event.add( this, type, function(event) {
jQuery(this).unbind(event);
return (fn || data).apply( this, arguments);
}, fn && data);
});
},
unbind: function( type, fn ) {
return this.each(function(){
jQuery.event.remove( this, type, fn );
});
},
trigger: function( type, data, fn ) {
return this.each(function(){
jQuery.event.trigger( type, data, this, true, fn );
});
},
triggerHandler: function( type, data, fn ) {
if ( this[0] )
return jQuery.event.trigger( type, data, this[0], false, fn );
},
toggle: function() {
var a = arguments;
return this.click(function(e) {
this.lastToggle = 0 == this.lastToggle ? 1 : 0;
e.preventDefault();
return a[this.lastToggle].apply( this, [e] ) || false;
});
},
hover: function(f,g) {
function handleHover(e) {
var p = e.relatedTarget;
while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
if ( p == this ) return false;
return (e.type == "mouseover" ? f : g).apply(this, [e]);
}
return this.mouseover(handleHover).mouseout(handleHover);
},
ready: function(f) {
bindReady();
if ( jQuery.isReady )
f.apply( document, [jQuery] );
else
jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
return this;
}
});
jQuery.extend({
isReady: false,
readyList: [],
ready: function() {
if ( !jQuery.isReady ) {
jQuery.isReady = true;
if ( jQuery.readyList ) {
jQuery.each( jQuery.readyList, function(){
this.apply( document );
});
jQuery.readyList = null;
}
if ( jQuery.browser.mozilla || jQuery.browser.opera )
document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
if( !window.frames.length ) // don't remove if frames are present (#1187)
jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
}
}
});
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
"submit,keydown,keypress,keyup,error").split(","), function(i,o){
jQuery.fn[o] = function(f){
return f ? this.bind(o, f) : this.trigger(o);
};
});
var readyBound = false;
function bindReady(){
if ( readyBound ) return;
readyBound = true;
if ( jQuery.browser.mozilla || jQuery.browser.opera )
document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
else if ( jQuery.browser.msie ) {
document.write("<scr" + "ipt id=__ie_init defer=true " + 
"src=//:><\/script>");
var script = document.getElementById("__ie_init");
if ( script ) 
script.onreadystatechange = function() {
if ( this.readyState != "complete" ) return;
jQuery.ready();
};
script = null;
} else if ( jQuery.browser.safari )
jQuery.safariTimer = setInterval(function(){
if ( document.readyState == "loaded" || 
document.readyState == "complete" ) {
clearInterval( jQuery.safariTimer );
jQuery.safariTimer = null;
jQuery.ready();
}
}, 10); 
jQuery.event.add( window, "load", jQuery.ready );
}
jQuery.fn.extend({
load: function( url, params, callback ) {
if ( jQuery.isFunction( url ) )
return this.bind("load", url);
var off = url.indexOf(" ");
if ( off >= 0 ) {
var selector = url.slice(off, url.length);
url = url.slice(0, off);
}
callback = callback || function(){};
var type = "GET";
if ( params )
if ( jQuery.isFunction( params ) ) {
callback = params;
params = null;
} else {
params = jQuery.param( params );
type = "POST";
}
var self = this;
jQuery.ajax({
url: url,
type: type,
data: params,
complete: function(res, status){
if ( status == "success" || status == "notmodified" )
self.html( selector ?
jQuery("<div/>")
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
.find(selector) :
res.responseText );
setTimeout(function(){
self.each( callback, [res.responseText, status, res] );
}, 13);
}
});
return this;
},
serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function(){
return jQuery.nodeName(this, "form") ?
jQuery.makeArray(this.elements) : this;
})
.filter(function(){
return this.name && !this.disabled && 
(this.checked || /select|textarea/i.test(this.nodeName) || 
/text|hidden|password/i.test(this.type));
})
.map(function(i, elem){
var val = jQuery(this).val();
return val == null ? null :
val.constructor == Array ?
jQuery.map( val, function(val, i){
return {name: elem.name, value: val};
}) :
{name: elem.name, value: val};
}).get();
}
});
jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
jQuery.fn[o] = function(f){
return this.bind(o, f);
};
});
var jsc = (new Date).getTime();
jQuery.extend({
get: function( url, data, callback, type ) {
if ( jQuery.isFunction( data ) ) {
callback = data;
data = null;
}
return jQuery.ajax({
type: "GET",
url: url,
data: data,
success: callback,
dataType: type
});
},
getScript: function( url, callback ) {
return jQuery.get(url, null, callback, "script");
},
getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, "json");
},
post: function( url, data, callback, type ) {
if ( jQuery.isFunction( data ) ) {
callback = data;
data = {};
}
return jQuery.ajax({
type: "POST",
url: url,
data: data,
success: callback,
dataType: type
});
},
ajaxSetup: function( settings ) {
jQuery.extend( jQuery.ajaxSettings, settings );
},
ajaxSettings: {
global: true,
type: "GET",
timeout: 0,
contentType: "application/x-www-form-urlencoded",
processData: true,
async: true,
data: null
},
lastModified: {},
ajax: function( s ) {
var jsonp, jsre = /=(\?|%3F)/g, status, data;
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
if ( s.data && s.processData && typeof s.data != "string" )
s.data = jQuery.param(s.data);
if ( s.dataType == "jsonp" ) {
if ( s.type.toLowerCase() == "get" ) {
if ( !s.url.match(jsre) )
s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
} else if ( !s.data || !s.data.match(jsre) )
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
s.dataType = "json";
}
if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
jsonp = "jsonp" + jsc++;
if ( s.data )
s.data = s.data.replace(jsre, "=" + jsonp);
s.url = s.url.replace(jsre, "=" + jsonp);
s.dataType = "script";
window[ jsonp ] = function(tmp){
data = tmp;
success();
complete();
window[ jsonp ] = undefined;
try{ delete window[ jsonp ]; } catch(e){}
};
}
if ( s.dataType == "script" && s.cache == null )
s.cache = false;
if ( s.cache === false && s.type.toLowerCase() == "get" )
s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
if ( s.data && s.type.toLowerCase() == "get" ) {
s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
s.data = null;
}
if ( s.global && ! jQuery.active++ )
jQuery.event.trigger( "ajaxStart" );
if ( !s.url.indexOf("http") && s.dataType == "script" ) {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = s.url;
if ( !jsonp && (s.success || s.complete) ) {
var done = false;
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState || 
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();
head.removeChild( script );
}
};
}
head.appendChild(script);
return;
}
var requestDone = false;
var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
xml.open(s.type, s.url, s.async);
if ( s.data )
xml.setRequestHeader("Content-Type", s.contentType);
if ( s.ifModified )
xml.setRequestHeader("If-Modified-Since",
jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
if ( s.beforeSend )
s.beforeSend(xml);
if ( s.global )
jQuery.event.trigger("ajaxSend", [xml, s]);
var onreadystatechange = function(isTimeout){
if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
requestDone = true;
if (ival) {
clearInterval(ival);
ival = null;
}
status = isTimeout == "timeout" && "timeout" ||
!jQuery.httpSuccess( xml ) && "error" ||
s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
"success";
if ( status == "success" ) {
try {
data = jQuery.httpData( xml, s.dataType );
} catch(e) {
status = "parsererror";
}
}
if ( status == "success" ) {
var modRes;
try {
modRes = xml.getResponseHeader("Last-Modified");
} catch(e) {} // swallow exception thrown by FF if header is not available
if ( s.ifModified && modRes )
jQuery.lastModified[s.url] = modRes;
if ( !jsonp )
success();	
} else
jQuery.handleError(s, xml, status);
complete();
if ( s.async )
xml = null;
}
};
if ( s.async ) {
var ival = setInterval(onreadystatechange, 13); 
if ( s.timeout > 0 )
setTimeout(function(){
if ( xml ) {
xml.abort();
if( !requestDone )
onreadystatechange( "timeout" );
}
}, s.timeout);
}
try {
xml.send(s.data);
} catch(e) {
jQuery.handleError(s, xml, null, e);
}
if ( !s.async )
onreadystatechange();
return xml;
function success(){
if ( s.success )
s.success( data, status );
if ( s.global )
jQuery.event.trigger( "ajaxSuccess", [xml, s] );
}
function complete(){
if ( s.complete )
s.complete(xml, status);
if ( s.global )
jQuery.event.trigger( "ajaxComplete", [xml, s] );
if ( s.global && ! --jQuery.active )
jQuery.event.trigger( "ajaxStop" );
}
},
handleError: function( s, xml, status, e ) {
if ( s.error ) s.error( xml, status, e );
if ( s.global )
jQuery.event.trigger( "ajaxError", [xml, s, e] );
},
active: 0,
httpSuccess: function( r ) {
try {
return !r.status && location.protocol == "file:" ||
( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
jQuery.browser.safari && r.status == undefined;
} catch(e){}
return false;
},
httpNotModified: function( xml, url ) {
try {
var xmlRes = xml.getResponseHeader("Last-Modified");
return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
jQuery.browser.safari && xml.status == undefined;
} catch(e){}
return false;
},
httpData: function( r, type ) {
var ct = r.getResponseHeader("content-type");
var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
var data = xml ? r.responseXML : r.responseText;
if ( xml && data.documentElement.tagName == "parsererror" )
throw "parsererror";
if ( type == "script" )
jQuery.globalEval( data );
if ( type == "json" )
data = eval("(" + data + ")");
return data;
},
param: function( a ) {
var s = [];
if ( a.constructor == Array || a.jquery )
jQuery.each( a, function(){
s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
});
else
for ( var j in a )
if ( a[j] && a[j].constructor == Array )
jQuery.each( a[j], function(){
s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
});
else
s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
return s.join("&").replace(/%20/g, "+");
}
});
jQuery.fn.extend({
show: function(speed,callback){
return speed ?
this.animate({
height: "show", width: "show", opacity: "show"
}, speed, callback) :
this.filter(":hidden").each(function(){
this.style.display = this.oldblock ? this.oldblock : "";
if ( jQuery.css(this,"display") == "none" )
this.style.display = "block";
}).end();
},
hide: function(speed,callback){
return speed ?
this.animate({
height: "hide", width: "hide", opacity: "hide"
}, speed, callback) :
this.filter(":visible").each(function(){
this.oldblock = this.oldblock || jQuery.css(this,"display");
if ( this.oldblock == "none" )
this.oldblock = "block";
this.style.display = "none";
}).end();
},
_toggle: jQuery.fn.toggle,
toggle: function( fn, fn2 ){
return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
this._toggle( fn, fn2 ) :
fn ?
this.animate({
height: "toggle", width: "toggle", opacity: "toggle"
}, fn, fn2) :
this.each(function(){
jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
});
},
slideDown: function(speed,callback){
return this.animate({height: "show"}, speed, callback);
},
slideUp: function(speed,callback){
return this.animate({height: "hide"}, speed, callback);
},
slideToggle: function(speed, callback){
return this.animate({height: "toggle"}, speed, callback);
},
fadeIn: function(speed, callback){
return this.animate({opacity: "show"}, speed, callback);
},
fadeOut: function(speed, callback){
return this.animate({opacity: "hide"}, speed, callback);
},
fadeTo: function(speed,to,callback){
return this.animate({opacity: to}, speed, callback);
},
animate: function( prop, speed, easing, callback ) {
var opt = jQuery.speed(speed, easing, callback);
return this[ opt.queue === false ? "each" : "queue" ](function(){
opt = jQuery.extend({}, opt);
var hidden = jQuery(this).is(":hidden"), self = this;
for ( var p in prop ) {
if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
if ( p == "height" || p == "width" ) {
opt.display = jQuery.css(this, "display");
opt.overflow = this.style.overflow;
}
}
if ( opt.overflow != null )
this.style.overflow = "hidden";
opt.curAnim = jQuery.extend({}, prop);
jQuery.each( prop, function(name, val){
var e = new jQuery.fx( self, opt, name );
if ( /toggle|show|hide/.test(val) )
e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
else {
var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
start = e.cur(true) || 0;
if ( parts ) {
var end = parseFloat(parts[2]),
unit = parts[3] || "px";
if ( unit != "px" ) {
self.style[ name ] = (end || 1) + unit;
start = ((end || 1) / e.cur(true)) * start;
self.style[ name ] = start + unit;
}
if ( parts[1] )
end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
e.custom( start, end, unit );
} else
e.custom( start, val, "" );
}
});
return true;
});
},
queue: function(type, fn){
if ( jQuery.isFunction(type) ) {
fn = type;
type = "fx";
}
if ( !type || (typeof type == "string" && !fn) )
return queue( this[0], type );
return this.each(function(){
if ( fn.constructor == Array )
queue(this, type, fn);
else {
queue(this, type).push( fn );
if ( queue(this, type).length == 1 )
fn.apply(this);
}
});
},
stop: function(){
var timers = jQuery.timers;
return this.each(function(){
for ( var i = 0; i < timers.length; i++ )
if ( timers[i].elem == this )
timers.splice(i--, 1);
}).dequeue();
}
});
var queue = function( elem, type, array ) {
if ( !elem )
return;
var q = jQuery.data( elem, type + "queue" );
if ( !q || array )
q = jQuery.data( elem, type + "queue", 
array ? jQuery.makeArray(array) : [] );
return q;
};
jQuery.fn.dequeue = function(type){
type = type || "fx";
return this.each(function(){
var q = queue(this, type);
q.shift();
if ( q.length )
q[0].apply( this );
});
};
jQuery.extend({
speed: function(speed, easing, fn) {
var opt = speed && speed.constructor == Object ? speed : {
complete: fn || !fn && easing || 
jQuery.isFunction( speed ) && speed,
duration: speed,
easing: fn && easing || easing && easing.constructor != Function && easing
};
opt.duration = (opt.duration && opt.duration.constructor == Number ? 
opt.duration : 
{ slow: 600, fast: 200 }[opt.duration]) || 400;
opt.old = opt.complete;
opt.complete = function(){
jQuery(this).dequeue();
if ( jQuery.isFunction( opt.old ) )
opt.old.apply( this );
};
return opt;
},
easing: {
linear: function( p, n, firstNum, diff ) {
return firstNum + diff * p;
},
swing: function( p, n, firstNum, diff ) {
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
}
},
timers: [],
fx: function( elem, options, prop ){
this.options = options;
this.elem = elem;
this.prop = prop;
if ( !options.orig )
options.orig = {};
}
});
jQuery.fx.prototype = {
update: function(){
if ( this.options.step )
this.options.step.apply( this.elem, [ this.now, this ] );
(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
if ( this.prop == "height" || this.prop == "width" )
this.elem.style.display = "block";
},
cur: function(force){
if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
return this.elem[ this.prop ];
var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
},
custom: function(from, to, unit){
this.startTime = (new Date()).getTime();
this.start = from;
this.end = to;
this.unit = unit || this.unit || "px";
this.now = this.start;
this.pos = this.state = 0;
this.update();
var self = this;
function t(){
return self.step();
}
t.elem = this.elem;
jQuery.timers.push(t);
if ( jQuery.timers.length == 1 ) {
var timer = setInterval(function(){
var timers = jQuery.timers;
for ( var i = 0; i < timers.length; i++ )
if ( !timers[i]() )
timers.splice(i--, 1);
if ( !timers.length )
clearInterval( timer );
}, 13);
}
},
show: function(){
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
this.options.show = true;
this.custom(0, this.cur());
if ( this.prop == "width" || this.prop == "height" )
this.elem.style[this.prop] = "1px";
jQuery(this.elem).show();
},
hide: function(){
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
this.options.hide = true;
this.custom(this.cur(), 0);
},
step: function(){
var t = (new Date()).getTime();
if ( t > this.options.duration + this.startTime ) {
this.now = this.end;
this.pos = this.state = 1;
this.update();
this.options.curAnim[ this.prop ] = true;
var done = true;
for ( var i in this.options.curAnim )
if ( this.options.curAnim[i] !== true )
done = false;
if ( done ) {
if ( this.options.display != null ) {
this.elem.style.overflow = this.options.overflow;
this.elem.style.display = this.options.display;
if ( jQuery.css(this.elem, "display") == "none" )
this.elem.style.display = "block";
}
if ( this.options.hide )
this.elem.style.display = "none";
if ( this.options.hide || this.options.show )
for ( var p in this.options.curAnim )
jQuery.attr(this.elem.style, p, this.options.orig[p]);
}
if ( done && jQuery.isFunction( this.options.complete ) )
this.options.complete.apply( this.elem );
return false;
} else {
var n = t - this.startTime;
this.state = n / this.options.duration;
this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
this.now = this.start + ((this.end - this.start) * this.pos);
this.update();
}
return true;
}
};
jQuery.fx.step = {
scrollLeft: function(fx){
fx.elem.scrollLeft = fx.now;
},
scrollTop: function(fx){
fx.elem.scrollTop = fx.now;
},
opacity: function(fx){
jQuery.attr(fx.elem.style, "opacity", fx.now);
},
_default: function(fx){
fx.elem.style[ fx.prop ] = fx.now + fx.unit;
}
};
jQuery.fn.offset = function() {
var left = 0, top = 0, elem = this[0], results;
if ( elem ) with ( jQuery.browser ) {
var	absolute     = jQuery.css(elem, "position") == "absolute", 
parent       = elem.parentNode, 
offsetParent = elem.offsetParent, 
doc          = elem.ownerDocument,
safari2      = safari && parseInt(version) < 522;
if ( elem.getBoundingClientRect ) {
box = elem.getBoundingClientRect();
add(
box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop)
);
if ( msie ) {
var border = jQuery("html").css("borderWidth");
border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
add( -border, -border );
}
} else {
add( elem.offsetLeft, elem.offsetTop );
while ( offsetParent ) {
add( offsetParent.offsetLeft, offsetParent.offsetTop );
if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
border( offsetParent );
if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
absolute = true;
offsetParent = offsetParent.offsetParent;
}
while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
add( -parent.scrollLeft, -parent.scrollTop );
if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
border( parent );
parent = parent.parentNode;
}
if ( safari2 && absolute )
add( -doc.body.offsetLeft, -doc.body.offsetTop );
}
results = { top: top, left: left };
}
return results;
function border(elem) {
add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
}
function add(l, t) {
left += parseInt(l) || 0;
top += parseInt(t) || 0;
}
};
})();
var gadgets = gadgets || {};
gadgets.config = function() {
var components = {};
return {
register: function(component, opt_validators, opt_callback) {
if (components[component]) {
throw new Error('Component "' + component + '" is already registered.');
}
components[component] = {
validators: opt_validators || {},
callback: opt_callback
};
},
get: function(opt_component) {
if (opt_component) {
if (!components[opt_component]) {
throw new Error('Component "' + opt_component + '" not registered.');
}
return configuration[opt_component] || {};
}
return configuration;
},
init: function(config, opt_noValidation) {
configuration = config;
for (var name in components) if (components.hasOwnProperty(name)) {
var component = components[name],
conf = config[name],
validators = component.validators;
if (!opt_noValidation) {
for (var v in validators) if (validators.hasOwnProperty(v)) {
if (!validators[v](conf[v])) {
throw new Error('Invalid config value "' + conf[v] +
'" for parameter "' + v + '" in component "' +
name + '"');
}
}
}
if (component.callback) {
component.callback(config);
}
}
},
EnumValidator: function(list) {
var listItems = [];
if (arguments.length > 1) {
for (var i = 0, arg; arg = arguments[i]; ++i) {
listItems.push(arg);
}
} else {
listItems = list;
}
return function(data) {
for (var i = 0, test; test = listItems[i]; ++i) {
if (data === listItems[i]) {
return true;
}
}
}
return false;
},
RegExValidator: function(re) {
return function(data) {
return re.test(data);
}
},
ExistsValidator: function(data) {
return typeof data !== "undefined";
},
NonEmptyStringValidator: function(data) {
return typeof data === "string" && data.length > 0
},
BooleanValidator: function(data) {
return typeof data === "boolean";
},
LikeValidator : function(test) {
return function(data) {
for (var member in test) if (test.hasOwnProperty(member)) {
var t = test[member];
if (!t(data[member])) {
return false;
}
}
return true;
};
}
};
}();
var gadgets = gadgets || {};
if (window.console == undefined)
{
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i) {
window.console[names[i]] = function() {}
}
}
gadgets.util = function() {
function parseUrlParams() {
var query;
var l = document.location.href;
var queryIdx = l.indexOf("?");
var hashIdx = l.indexOf("#");
if (hashIdx === -1) {
query = l.substr(queryIdx + 1);
} else {
query = [l.substr(queryIdx + 1, hashIdx - queryIdx - 1), "&",
l.substr(hashIdx + 1)].join("");
}
return query.split("&");
}
var parameters = null;
var features = {};
var onLoadHandlers = [];
var escapeCodePoints = {
0 : false,
10 : true,
13 : true,
34 : true,
39 : true,
60 : true,
62 : true,
92 : true,
8232 : true,
8233 : true
};
function unescapeEntity(match, value) {
return String.fromCharCode(value);
}
function init(config) {
features = config["core.util"] || {};
}
if (gadgets.config) {
gadgets.config.register("core.util", null, init);
}
return /** @scope gadgets.util */ {
getUrlParameters : function () {
if (parameters !== null) {
return parameters;
}
parameters = {};
var pairs = parseUrlParams();
var unesc = window.decodeURIComponent ? decodeURIComponent : unescape;
for (var i = 0, j = pairs.length; i < j; ++i) {
var pos = pairs[i].indexOf('=');
if (pos === -1) {
continue;
}
var argName = pairs[i].substring(0, pos);
var value = pairs[i].substring(pos + 1);
value = value.replace(/\+/g, " ");
parameters[argName] = unesc(value);
}
return parameters;
},
makeClosure : function (scope, callback, var_args) {
var baseArgs = [];
for (var i = 2, j = arguments.length; i < j; ++i) {
baseArgs.push(arguments[i]);
}
return function() {
var tmpArgs = baseArgs.slice();
for (var i = 0, j = arguments.length; i < j; ++i) {
tmpArgs.push(arguments[i]);
}
return callback.apply(scope, tmpArgs);
};
},
makeEnum : function (values) {
var obj = {};
for (var i = 0, v; v = values[i]; ++i) {
obj[v] = v;
}
return obj;
},
getFeatureParameters : function (feature) {
return typeof features[feature] === "undefined"
? null : features[feature];
},
hasFeature : function (feature) {
return typeof features[feature] !== "undefined";
},
registerOnLoadHandler : function (callback) {
if( !callback ) {
console.warn( "Invalid callback is being registerred" );
return;
}
onLoadHandlers.push(callback);
},
runOnLoadHandlers : function () {
for (var i = 0, j = onLoadHandlers.length; i < j; ++i) {
onLoadHandlers[i]();
}
},
escape : function(input, opt_escapeObjects) {
if (!input) {
return input;
} else if (typeof input === "string") {
return gadgets.util.escapeString(input);
} else if (typeof input === "array") {
for (var i = 0, j = input.length; i < j; ++i) {
input[i] = gadgets.util.escape(input[i]);
}
} else if (typeof input === "object" && opt_escapeObjects) {
var newObject = {};
for (var field in input) if (input.hasOwnProperty(field)) {
newObject[gadgets.util.escapeString(field)]
= gadgets.util.escape(input[field], true);
}
return newObject;
}
return input;
},
escapeString : function(str) {
var out = [], ch, shouldEscape;
for (var i = 0, j = str.length; i < j; ++i) {
ch = str.charCodeAt(i);
shouldEscape = escapeCodePoints[ch];
if (shouldEscape === true) {
out.push("&#", ch, ";");
} else if (shouldEscape !== false) {
out.push(str.charAt(i));
}
}
return out.join("");
},
unescapeString : function(str) {
return str.replace(/&#([0-9]+);/g, unescapeEntity);
}
};
}();
gadgets.util.getUrlParameters();
var gadgets = gadgets || {};
(function() {
var instance = null;
var prefs = {};
var messages = {};
var language = "en";
var country = "US";
var moduleId = 0;
function parseUrl() {
var params = gadgets.util.getUrlParameters();
for (var i in params) if (params.hasOwnProperty(i)) {
if (i.indexOf("up_") === 0 && i.length > 3) {
prefs[i.substr(3)] = String(params[i]);
} else if (i === "country") {
country = params[i];
} else if (i === "lang") {
language = params[i];
} else if (i === "mid") {
moduleId = params[i];
}
}
};
gadgets.Prefs = function() {
if (!instance) {
parseUrl();
instance = this;
}
return instance;
};
gadgets.Prefs.setInternal_ = function(key, value) {
if (typeof key === "string") {
prefs[key] = value;
} else {
for (var k in key) if (key.hasOwnProperty(k)) {
prefs[k] = key[k];
}
}
};
gadgets.Prefs.setMessages_ = function(msgs) {
messages = msgs;
};
gadgets.Prefs.prototype.getString = function(key) {
return prefs[key] ? gadgets.util.escapeString(prefs[key]) : "";
};
gadgets.Prefs.prototype.getInt = function(key) {
var val = parseInt(prefs[key], 10);
return isNaN(val) ? 0 : val;
};
gadgets.Prefs.prototype.getFloat = function(key) {
var val = parseFloat(prefs[key]);
return isNaN(val) ? 0 : val;
};
gadgets.Prefs.prototype.getBool = function(key) {
var val = prefs[key];
if (val) {
return val === "true" || val === true || !!parseInt(val, 10);
}
return false;
};
gadgets.Prefs.prototype.set = function(key, value) {
throw new Error("setprefs feature required to make this call.");
};
gadgets.Prefs.prototype.getArray = function(key) {
var val = prefs[key];
if (val) {
var arr = val.split("|");
var esc = gadgets.util.escapeString;
for (var i = 0, j = arr.length; i < j; ++i) {
arr[i] = esc(arr[i].replace(/%7C/g, "|"));
}
return arr;
}
return [];
};
gadgets.Prefs.prototype.setArray = function(key, val) {
throw new Error("setprefs feature required to make this call.");
};
gadgets.Prefs.prototype.getMsg = function(key) {
return messages[key] || "";
};
gadgets.Prefs.prototype.getCountry = function() {
return country;
};
gadgets.Prefs.prototype.getLang = function() {
return language;
};
gadgets.Prefs.prototype.getModuleId = function() {
return moduleId;
};
})();
var JSON = gadgets.json;
var _IG_Prefs = gadgets.Prefs;
_IG_Prefs._parseURL = gadgets.Prefs.parseUrl;
function _IG_Fetch_wrapper(callback, obj) {
callback(obj.data);
}
function _IG_FetchContent(url, callback, opt_params) {
var params = opt_params || {};
if (params.refreshInterval) {
params['REFRESH_INTERVAL'] = params.refreshInterval;
} else {
params['REFRESH_INTERVAL'] = 3600;
}
var cb = gadgets.util.makeClosure(null, _IG_Fetch_wrapper, callback);
gadgets.io.makeRequest(url, cb, params);
}
function _IG_FetchXmlContent(url, callback, opt_params) {
var params = opt_params || {};
if (params.refreshInterval) {
params['REFRESH_INTERVAL'] = params.refreshInterval;
} else {
params['REFRESH_INTERVAL'] = 3600;
}
params.CONTENT_TYPE = "DOM";
var cb = gadgets.util.makeClosure(null, _IG_Fetch_wrapper, callback);
gadgets.io.makeRequest(url, cb, params);
}
function _IG_FetchFeedAsJSON(url, callback, numItems, getDescriptions,
opt_params) {
var params = opt_params || {};
params.CONTENT_TYPE = "FEED";
params.NUM_ENTRIES = numItems;
params.GET_SUMMARIES = getDescriptions;
gadgets.io.makeRequest(url, callback, params);
}
function _IG_GetCachedUrl(url) {
return gadgets.io.getProxyUrl(url);
}
function _IG_GetImageUrl(url) {
return gadgets.io.getProxyUrl(url);
}
function _IG_RegisterOnloadHandler(callback) {
gadgets.util.registerOnLoadHandler(callback);
}
function _IG_Callback(handler_func, var_args) {
var orig_args = arguments;
return function() {
var combined_args = Array.prototype.slice.call(arguments);
handler_func.apply(null,
combined_args.concat(Array.prototype.slice.call(orig_args, 1)));
};
}
var _args = gadgets.util.getUrlParameters;
function _gel(el) {
return document.getElementById ? document.getElementById(el) : null;
}
function _gelstn(tag) {
if (tag === "*" && document.all) {
return document.all;
}
return document.getElementsByTagName ?
document.getElementsByTagName(tag) : [];
}
function _gelsbyregex(tagName, regex) {
var matchingTags = _gelstn(tagName);
var matchingRegex = [];
for (var i = 0, j = matchingTags.length; i < j; ++i) {
if (regex.test(matchingTags[i].id)) {
matchingRegex.push(matchingTags[i]);
}
}
return matchingRegex;
}
function _esc(str) {
return window.encodeURIComponent ? encodeURIComponent(str) : escape(str);
}
function _unesc(str) {
return window.decodeURIComponent ? decodeURIComponent(str) : unescape(str);
}
function _hesc(str) {
return gadgets.util.escapeString(str);
}
function _striptags(str) {
return str.replace(/<\/?[^>]+>/g, "");
}
function _trim(str) {
return str.replace(/^\s+|\s+$/g, "");
}
function _toggle(el) {
el = _gel(el);
if (el !== null) {
if (el.style.display.length === 0 || el.style.display === "block") {
el.style.display = "none";
} else if (el.style.display === "none") {
el.style.display = "block";
}
}
}
var _global_legacy_uidCounter = 0;
function _uid() {
return _global_legacy_uidCounter++;
}
function _min(a, b) {
return (a < b ? a : b);
}
function _max(a, b) {
return (a > b ? a : b);
}
function _exportSymbols(name, sym) {
var obj = {};
for (var i = 0, j = sym.length; i < j; i += 2) {
obj[sym[i]] = sym[i + 1];
}
var parts = name.split(".");
var attach = window;
for (var k = 0, l = parts.length - 1; k < l; ++k) {
var tmp = {};
attach[parts[k]] = tmp;
attach = tmp;
}
attach[parts[parts.length - 1]] = obj;
}
var gadgets = gadgets || {};
gadgets.json = function () {
function f(n) {
return n < 10 ? '0' + n : n;
}
Date.prototype.toJSON = function () {
return [this.getUTCFullYear(), '-',
f(this.getUTCMonth() + 1), '-',
f(this.getUTCDate()), 'T',
f(this.getUTCHours()), ':',
f(this.getUTCMinutes()), ':',
f(this.getUTCSeconds()), 'Z'].join("");
};
var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
};
function stringify(value) {
var a,          // The array holding the partial texts.
i,          // The loop counter.
k,          // The member key.
l,          // Length.
r = /["\\\x00-\x1f\x7f-\x9f]/g,
v;          // The member value.
switch (typeof value) {
case 'string':
return r.test(value) ?
'"' + value.replace(r, function (a) {
var c = m[a];
if (c) {
return c;
}
c = a.charCodeAt();
return '\\u00' + Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}) + '"'
: '"' + value + '"';
case 'number':
return isFinite(value) ? String(value) : 'null';
case 'boolean':
case 'null':
return String(value);
case 'object':
if (!value) {
return 'null';
}
a = [];
if (typeof value.length === 'number' &&
!(value.propertyIsEnumerable('length'))) {
l = value.length;
for (i = 0; i < l; i += 1) {
a.push(stringify(value[i]) || 'null');
}
return '[' + a.join(',') + ']';
}
for (k in value) if (value.hasOwnProperty(k)) {
if (typeof k === 'string') {
v = stringify(value[k]);
if (v) {
a.push(stringify(k) + ':' + v);
}
}
}
return '{' + a.join(',') + '}';
}
}
return {
stringify: stringify,
parse: function (text) {
try {
return eval('(' + text + ')');
} catch (e) {
return false;
}
},
parseJson: function (text) {
if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/b-u]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
return eval('(' + text + ')');
}
return false;
}
};
}();
var JSON = gadgets.json;
var gadgets = gadgets || {};
gadgets.io = function() {
var config = {
proxyUrl:'/play/proxy?location=%url%',
jsonProxyUrl:'/play/proxy'
};
function makeXhr() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
var x = new ActiveXObject("Msxml2.XMLHTTP");
if (!x) {
x = new ActiveXObject("Microsoft.XMLHTTP");
}
return x;
}
}
function hadError(xobj, callback) {
if (xobj.readyState !== 4) {
return true;
}
if (xobj.status !== 200) {
callback({errors : ["Error " + xobj.status]});
return true;
}
return false;
}
function processNonProxiedResponse(url, callback, params, xobj) {
if (hadError(xobj, callback)) {
return;
}
callback(transformResponseData(params, xobj.responseText));
}
var UNPARSEABLE_CRUFT = "throw 1; < don't be evil' >";
function processResponse(url, callback, params, xobj) {
if (hadError(xobj, callback)) {
return;
}
var txt = xobj.responseText;
callback(transformResponseData(params, txt));
}
function transformResponseData(params, serverResponse) {
var resp = {
text: serverResponse,
errors: []
};
switch (params.CONTENT_TYPE) {
case "JSON":
case "FEED":
resp.data = gadgets.json.parse(resp.text);
if (!resp.data) {
resp.errors.push("failed to parse JSON");
resp.data = null;
}
break;
case "DOM":
var dom;
if (window.ActiveXObject) {
dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async = false;
dom.validateOnParse = false;
dom.resolveExternals = false;
if (!dom.loadXML(resp.text)) {
resp.errors.push("failed to parse XML");
} else {
resp.data = dom;
}
} else {
var parser = new DOMParser();
dom = parser.parseFromString(resp.text, "text/xml");
if ("parsererror" === dom.documentElement.nodeName) {
resp.errors.push("failed to parse XML");
} else {
resp.data = dom;
}
}
break;
default:
resp.data = resp.text;
break;
}
return resp.data;
}
function makePostRequest(realUrl, proxyUrl, callback, postData, params,
processResponseFunction) {
var xhr = makeXhr();
xhr.open("POST", proxyUrl, true);
if (callback) {
xhr.onreadystatechange = gadgets.util.makeClosure(
null, processResponseFunction, realUrl, callback, params, xhr);
}
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(postData);
}
function respondWithPreload(postData, params, callback) {
if (gadgets.io.preloaded_ && gadgets.io.preloaded_[postData.url]) {
var preload = gadgets.io.preloaded_[postData.url];
if (postData.httpMethod == "GET" && postData.authz == "none") {
delete gadgets.io.preloaded_[postData.url];
if (preload.rc !== 200) {
callback({errors : ["Error " + preload.rc]});
} else {
callback(transformResponseData(params, preload.body));
}
return true;
}
}
return false;
}
function init (configuration) {
}
var requiredConfig = {
};
init();   
return /** @scope gadgets.io */ {
makeRequest : function (url, callback, opt_params) {
var params = opt_params || {};
var auth, st;
if (params.AUTHORIZATION && params.AUTHORIZATION !== "NONE") {
auth = params.AUTHORIZATION.toLowerCase();
st = gadgets.util.getUrlParameters().st;
}
var headers = params.HEADERS || {};
if (params.METHOD === "POST" && !headers["Content-Type"]) {
headers["Content-Type"] = "application/x-www-form-urlencoded";
}
var postData = {
url: url,
httpMethod : params.METHOD || "GET",
headers: gadgets.io.encodeValues(headers, false),
postData : params.POST_DATA || "",
authz : auth || "none",
st : st || "",
charset: params.charset || "",
moduleId: gadgets.Prefs.prototype.getModuleId() || 0
};
if (!respondWithPreload(postData, params, callback, processResponse)) {
makePostRequest(url, config.jsonProxyUrl, callback,
gadgets.io.encodeValues(postData), params, processResponse);
}
},
makeNonProxiedRequest : function (relativeUrl, callback, opt_params) {
var params = opt_params || {};
makePostRequest(relativeUrl, relativeUrl, callback, params.POST_DATA,
params, processNonProxiedResponse);
},
encodeValues : function (fields, opt_noEscaping) {
var escape = !opt_noEscaping;
var buf = [];
var first = false;
for (var i in fields) if (fields.hasOwnProperty(i)) {
if (!first) {
first = true;
} else {
buf.push("&");
}
buf.push(escape ? encodeURIComponent(i) : i);
buf.push("=");
buf.push(escape ? encodeURIComponent(fields[i]) : fields[i]);
}
return buf.join("");
},
getProxyUrl : function (url) {
return config.proxyUrl.replace("%url%", encodeURIComponent(url));
}
};
}();
gadgets.io.RequestParameters = gadgets.util.makeEnum([
"METHOD",
"CONTENT_TYPE",
"POST_DATA",
"HEADERS",
"AUTHORIZATION",
"NUM_ENTRIES",
"GET_SUMMARIES"
]);
gadgets.io.MethodType = gadgets.util.makeEnum([
"GET", "POST", "PUT", "DELETE", "HEAD"
]);
gadgets.io.ContentType = gadgets.util.makeEnum([
"TEXT", "DOM", "JSON", "FEED"
]);
gadgets.io.AuthorizationType = gadgets.util.makeEnum([
"NONE", "SIGNED", "AUTHENTICATED"
]);
var gadgets = gadgets || {};
gadgets.views = function() {
var currentView = null;
var supportedViews = {};
var params = {};
function init(config) {
var supported = config["views"];
for (var s in supported) if (supported.hasOwnProperty(s)) {
var obj = supported[s];
if (!obj) {
continue;
}
supportedViews[s] = new gadgets.views.View(s, obj.isOnlyVisible);
var aliases = obj.aliases || [];
for (var i = 0, alias; alias = aliases[i]; ++i) {
supportedViews[alias] = new gadgets.views.View(s, obj.isOnlyVisible);
}
}
var urlParams = gadgets.util.getUrlParameters();
if (urlParams["view-params"]) {
var tmpParams = gadgets.json.parse(
decodeURIComponent(urlParams["view-params"]));
if (tmpParams) {
params = tmpParams;
for (var p in params) if (params.hasOwnProperty(p)) {
params[p] = gadgets.util.escapeString(params[p]);
}
}
}
currentView = supportedViews[urlParams.view] || supportedViews["default"];
}
gadgets.config.register("views", null, init);
return {
requestNavigateTo : function(view, opt_params) {
gadgets.rpc.call(
null, "requestNavigateTo", null, view.getName(), opt_params);
},
getCurrentView : function() {
return currentView;
},
getSupportedViews : function() {
return supportedViews;
},
getParams : function() {
return params;
}
};
}();
gadgets.views.View = function(name, opt_isOnlyVisible) {
this.name_ = name;
this.isOnlyVisible_ = !!opt_isOnlyVisible;
};
gadgets.views.View.prototype.getName = function() {
return this.name_;
};
gadgets.views.View.prototype.isOnlyVisibleGadget = function() {
return this.isOnlyVisible_;
};
gadgets.views.ViewType = gadgets.util.makeEnum([
"FULL_PAGE", "DASHBOARD", "POPUP"
]);
var gadgets = gadgets || {};
gadgets.rpc = function() {
var services = {};
var iframePool = [];
var relayUrl = {};
var useLegacyProtocol = {};
var authToken = {};
var callId = 0;
var callbacks = {};
var params = gadgets.util.getUrlParameters();
authToken['..'] = params.rpctoken || params.ifpctok || 0;
var relayChannel = typeof document.postMessage === 'function' ? 'dpm' :
typeof window.postMessage === 'function' ? 'wpm' :
'ifpc';
if (relayChannel === 'dpm' || relayChannel === 'wpm') {
document.addEventListener('message', function(packet) {
process(gadgets.json.parse(packet.data));
}, false);
}
services[''] = function() {
throw new Error('Unknown RPC service: ' + this.s);
};
services['__cb'] = function(callbackId, result) {
var callback = callbacks[callbackId];
if (callback) {
delete callbacks[callbackId];
callback(result);
}
};
function encodeLegacyData(args) {
var stringify = gadgets.json.stringify;
var argsEscaped = [];
for(var i = 0, j = args.length; i < j; ++i) {
argsEscaped.push(encodeURIComponent(stringify(args[i])));
}
return argsEscaped.join('&');
}
function process(rpc) {
if (rpc && typeof rpc.s === 'string' && typeof rpc.f === 'string' &&
rpc.a instanceof Array) {
if (authToken[rpc.f]) {
if (authToken[rpc.f] != rpc.t) {
throw new Error("Invalid auth token.");
}
}
if (relayChannel === 'ifpc') {
if (rpc.f === '..') {
try {
var fel = window.frameElement;
if (typeof fel.__g2c_rpc === 'function' &&
typeof fel.__g2c_rpc.__c2g_rpc != 'function') {
fel.__g2c_rpc.__c2g_rpc = function(args) {
process(gadgets.json.parse(args));
};
}
} catch (e) {
}
} else {
var iframe = document.getElementById(rpc.f);
if (iframe && typeof iframe.__g2c_rpc != 'function') {
iframe.__g2c_rpc = function(args) {
process(gadgets.json.parse(args));
};
}
}
}
var result = (services[rpc.s] || services['']).apply(rpc, rpc.a);
if (rpc.c) {
gadgets.rpc.call(rpc.f, '__cb', null, rpc.c, result);
}
}
}
function emitInvisibleIframe(src,name) {
var iframe;
for (var i = iframePool.length - 1; i >=0; --i) {
var ifr = iframePool[i];
try {
if (ifr && (ifr.recyclable || ifr.readyState === 'complete')) {
ifr.parentNode.removeChild(ifr);
if (window.ActiveXObject) {
iframePool[i] = ifr = null;
iframePool.splice(i, 1);
} else {
ifr.recyclable = false;
iframe = ifr;
break;
}
}
} catch (e) {
}
}
if (!iframe) {
iframe = document.createElement('iframe');
iframe.style.border = iframe.style.width = iframe.style.height = '0px';
iframe.style.visibility = 'hidden';
iframe.style.position = 'absolute';
iframe.onload = function() { this.recyclable = true; };
iframePool.push(iframe);
}
iframe.src = src;
if( name != undefined ) {
iframe.name = name;
}
setTimeout(function() { document.body.appendChild(iframe); }, 0);
}
if (gadgets.config) {
function init(config) {
if (config.rpc.parentRelayUrl.substring(0, 7) === 'http://') {
relayUrl['..'] = config.rpc.parentRelayUrl;
} else {
var params = document.location.search.substring(0).split("&");
var parentParam = "";
for (var i = 0, param; param = params[i]; ++i) {
if (param.indexOf("parent=") === 0) {
parentParam = decodeURIComponent(param.substring(7));
break;
}
}
relayUrl['..'] = parentParam + config.rpc.parentRelayUrl;
}
useLegacyProtocol['..'] = !!config.rpc.useLegacyProtocol;
}
var requiredConfig = {
parentRelayUrl : gadgets.config.NonEmptyStringValidator
};
gadgets.config.register("rpc", requiredConfig, init);
}
return /** @scope gadgets.rpc */ {
register: function(serviceName, handler) {
services[serviceName] = handler;
},
unregister: function(serviceName) {
delete services[serviceName];
},
registerDefault: function(handler) {
services[''] = handler;
},
unregisterDefault: function() {
delete services[''];
},
call: function(targetId, serviceName, callback, var_args) {
++callId;
targetId = targetId || '..';
if (callback) {
callbacks[callId] = callback;
}
var from;
if (targetId === '..') {
from = window.name;
} else {
from = '..';
}
var rpcData = gadgets.json.stringify({
s: serviceName,
f: from,
c: callback ? callId : 0,
a: Array.prototype.slice.call(arguments, 3),
t: authToken[targetId]
});
switch (relayChannel) {
case 'dpm': // use document.postMessage
var targetDoc = targetId === '..' ? parent.document :
frames[targetId].document;
targetDoc.postMessage(rpcData);
break;
case 'wpm': // use window.postMessage
var targetWin = targetId === '..' ? parent : frames[targetId];
targetWin.postMessage(rpcData,'*');
break;
default: // use 'ifpc' as a fallback mechanism
try {
if (from === '..') {
var iframe = document.getElementById(targetId);
if (typeof iframe.__g2c_rpc.__c2g_rpc === 'function') {
iframe.__g2c_rpc.__c2g_rpc(rpcData);
return;
}
} else {
if (typeof window.frameElement.__g2c_rpc === 'function') {
window.frameElement.__g2c_rpc(rpcData);
return;
}
}
} catch (e) {
}
var relay = gadgets.rpc.getRelayUrl(targetId);
var src;
if (useLegacyProtocol[targetId]) {
src = [relay, '#', encodeLegacyData([from, callId, 1, 0,
encodeLegacyData([from, serviceName, '', '', from].concat(
Array.prototype.slice.call(arguments, 3)))])].join('');
} else {
src = [relay, '#', targetId, '&', from, '@', callId,
'&1&0&', encodeURIComponent(rpcData)].join('');
}
emitInvisibleIframe(src);
}
},
getRelayUrl: function(targetId) {
return relayUrl[targetId];
},
setRelayUrl: function(targetId, url, opt_useLegacy) {
relayUrl[targetId] = url;
useLegacyProtocol[targetId] = !!opt_useLegacy;
},
setAuthToken: function(targetId, token) {
authToken[targetId] = token;
},
getRelayChannel: function() {
return relayChannel;
},
receive: function(fragment) {
if (fragment.length > 4) {
process(gadgets.json.parse(
decodeURIComponent(fragment[fragment.length - 1])));
}
},
emitInvisibleIframe: function(src,name) {
return emitInvisibleIframe(src,name);
}
};
}();
var gadgets = gadgets || {};
gadgets.window = gadgets.window || {};
(function() {
var oldHeight;
gadgets.window.getViewportDimensions = function() {
var x,y;
if (self.innerHeight) {
x = self.innerWidth;
y = self.innerHeight;
} else if (document.documentElement &&
document.documentElement.clientHeight) {
x = document.documentElement.clientWidth;
y = document.documentElement.clientHeight;
} else if (document.body) {
x = document.body.clientWidth;
y = document.body.clientHeight;
} else {
x = 0;
y = 0;
}
return {width: x, height: y};
};
gadgets.window.adjustHeight = function(opt_height) {
var newHeight = parseInt(opt_height, 10);
if (isNaN(newHeight)) {
var vh = gadgets.window.getViewportDimensions().height;
var body = document.body;
var docEl = document.documentElement;
if (document.compatMode == 'CSS1Compat' && docEl.scrollHeight) {
newHeight = docEl.scrollHeight != vh ?
docEl.scrollHeight : docEl.offsetHeight;
} else {
var sh = docEl.scrollHeight;
var oh = docEl.offsetHeight;
if (docEl.clientHeight != oh) {
sh = body.scrollHeight;
oh = body.offsetHeight;
}
if (sh > vh) {
newHeight = sh > oh ? sh : oh;
} else {
newHeight = sh < oh ? sh : oh;
}
}
}
if (newHeight != oldHeight) {
oldHeight = newHeight;
gadgets.rpc.call(null, "resize_iframe", null, newHeight);
}
};
}());
var _IG_AdjustIFrameHeight = gadgets.window.adjustHeight;
var opensocial = function() {};
opensocial.requestSendMessage = function(recipients, message, opt_callback) {
opensocial.Container.get().requestSendMessage(recipients, message,
opt_callback);
};
opensocial.requestShareApp = function(recipients, reason, opt_callback) {
opensocial.Container.get().requestShareApp(recipients, reason, opt_callback);
};
opensocial.requestCreateActivity = function(activity, priority, opt_callback) {
opensocial.Container.get().requestCreateActivity(activity, priority,
opt_callback);
};
opensocial.CreateActivityPriority = {
HIGH : 'HIGH',
LOW : 'LOW'
};
opensocial.hasPermission = function(permission) {
return opensocial.Container.get().hasPermission(permission);
};
opensocial.requestPermission = function(permissions, reason, opt_callback) {
opensocial.Container.get().requestPermission(permissions, reason,
opt_callback);
};
opensocial.Permission = {
VIEWER : 'viewer'
};
opensocial.getEnvironment = function() {
return opensocial.Container.get().getEnvironment();
};
opensocial.newDataRequest = function() {
return opensocial.Container.get().newDataRequest();
};
opensocial.newActivity = function(params, opt_params) {
return opensocial.Container.get().newActivity(params, opt_params);
};
opensocial.newActivityMediaItem = function(mimeType, url, opt_params) {
return opensocial.Container.get().newActivityMediaItem(mimeType,
url, opt_params);
};
opensocial.newMessage = function(body, opt_params) {
return opensocial.Container.get().newMessage(body, opt_params);
};
Function.prototype.inherits = function(parentCtor) {
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
this.superClass_ = parentCtor.prototype;
this.prototype = new tempCtor();
this.prototype.constructor = this;
};
opensocial.Address = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Address.Field = {
TYPE : 'type',
UNSTRUCTURED_ADDRESS : 'unstructuredAddress',
PO_BOX : 'poBox',
STREET_ADDRESS : 'streetAddress',
EXTENDED_ADDRESS : 'extendedAddress',
REGION : 'region',
LOCALITY : 'locality',
POSTAL_CODE : 'postalCode',
COUNTRY : 'country',
LATITUDE : 'latitude',
LONGITUDE : 'longitude'
};
opensocial.Address.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.BodyType = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.BodyType.Field = {
BUILD : 'build',
HEIGHT : 'height',
WEIGHT : 'weight',
EYE_COLOR : 'eyeColor',
HAIR_COLOR : 'hairColor'
};
opensocial.BodyType.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Email = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Email.Field = {
TYPE : 'type',
ADDRESS : 'address'
};
opensocial.Email.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Enum = function(key, displayValue) {
this.key = key;
this.displayValue = displayValue;
};
opensocial.Enum.prototype.getKey = function() {
return this.key;
};
opensocial.Enum.prototype.getDisplayValue = function() {
return this.displayValue;
};
opensocial.Enum.Smoker = {
NO : 'NO',
YES : 'YES',
SOCIALLY : 'SOCIALLY',
OCCASIONALLY : 'OCCASIONALLY',
REGULARLY : 'REGULARLY',
HEAVILY : 'HEAVILY',
QUITTING : 'QUITTING',
QUIT : 'QUIT'
};
opensocial.Enum.Drinker = {
NO : 'NO',
YES : 'YES',
SOCIALLY : 'SOCIALLY',
OCCASIONALLY : 'OCCASIONALLY',
REGULARLY : 'REGULARLY',
HEAVILY : 'HEAVILY',
QUITTING : 'QUITTING',
QUIT : 'QUIT'
};
opensocial.Enum.Gender = {
MALE : 'MALE',
FEMALE : 'FEMALE'
};
opensocial.Message = function(body, opt_params) {
this.fields_ = opt_params || {};
this.fields_[opensocial.Message.Field.BODY] = body;
};
opensocial.Message.Field = {
TYPE : 'type',
TITLE : 'title',
BODY : 'body'
};
opensocial.Message.Type = {
EMAIL : 'email',
NOTIFICATION : 'notification',
PRIVATE_MESSAGE : 'privateMessage',
PUBLIC_MESSAGE : 'publicMessage'
};
opensocial.Message.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Message.prototype.setField = function(key, data) {
return this.fields_[key] = data;
};
opensocial.Name = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Name.Field = {
FAMILY_NAME : 'familyName',
GIVEN_NAME : 'givenName',
ADDITIONAL_NAME : 'additionalName',
HONORIFIC_PREFIX : 'honorificPrefix',
HONORIFIC_SUFFIX : 'honorificSuffix',
UNSTRUCTURED : 'unstructured'
};
opensocial.Name.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Organization = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Organization.Field = {
NAME : 'name',
TITLE : 'title',
DESCRIPTION : 'description',
FIELD : 'field',
SUB_FIELD : 'subField',
START_DATE : 'startDate',
END_DATE : 'endDate',
SALARY : 'salary',
ADDRESS : 'address',
WEBPAGE : 'webpage'
};
opensocial.Organization.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Phone = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Phone.Field = {
TYPE : 'type',
NUMBER : 'number'
};
opensocial.Phone.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Url = function(opt_params) {
this.fields_ = opt_params || {};
};
opensocial.Url.Field = {
TYPE : 'type',
LINK_TEXT : 'linkText',
ADDRESS : 'address'
};
opensocial.Url.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Activity = function(params, opt_params) {
this.fields_ = params;
if(opt_params && typeof opt_params == 'object'){
for(var i in opt_params){
if(!this.fields_[i]){
this.fields_[i] = opt_params[i];
}
};
}
};
opensocial.Activity.Field = {
TITLE_ID : 'titleId',
TITLE : 'title',
TEMPLATE_PARAMS : 'templateParams',
URL : 'url',
MEDIA_ITEMS : 'mediaItems',
BODY_ID : 'bodyId',
BODY : 'body',
EXTERNAL_ID : 'externalId',
STREAM_TITLE : 'streamTitle',
STREAM_URL : 'streamUrl',
STREAM_SOURCE_URL : 'streamSourceUrl',
STREAM_FAVICON_URL : 'streamFaviconUrl',
PRIORITY : 'priority',
ID : 'id',
USER_ID : 'userId',
APP_ID : 'appId',
POSTED_TIME : 'postedTime'
};
opensocial.Activity.prototype.getId = function() {
return this.getField(opensocial.Activity.Field.ID);
};
opensocial.Activity.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Activity.prototype.setField = function(key, data) {
return this.fields_[key] = data;
};
opensocial.Activity.MediaItem = function(mimeType, url, opt_params) {
this.fields_ = opt_params || {};
this.fields_[opensocial.Activity.MediaItem.Field.MIME_TYPE] = mimeType;
this.fields_[opensocial.Activity.MediaItem.Field.URL] = url;
};
opensocial.Activity.MediaItem.Type = {
IMAGE : 'image',
VIDEO : 'video',
AUDIO : 'audio'
}
opensocial.Activity.MediaItem.Field = {
TYPE : 'type',
MIME_TYPE : 'mimeType',
URL : 'url'
};
opensocial.Activity.MediaItem.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Activity.MediaItem.prototype.setField = function(key, data) {
return this.fields_[key] = data;
};
opensocial.Collection = function(array, opt_offset, opt_totalSize) {
this.array_ = array || [];
this.offset_ = opt_offset || 0;
this.totalSize_ = opt_totalSize || this.array_.length;
};
opensocial.Collection.prototype.getById = function(id) {
for (var i = 0; i < this.size(); i++) {
var item = this.array_[i];
if (item.getId() == id) {
return item;
}
}
return null;
};
opensocial.Collection.prototype.size = function() {
return this.array_.length;
};
opensocial.Collection.prototype.each = function(fn) {
for (var i = 0; i < this.size(); i++) {
fn(this.array_[i]);
}
};
opensocial.Collection.prototype.asArray = function() {
return this.array_;
};
opensocial.Collection.prototype.getTotalSize = function() {
return this.totalSize_;
};
opensocial.Collection.prototype.getOffset = function() {
return this.offset_;
};
opensocial.Container = function() {};
opensocial.Container.container_ = null;
opensocial.Container.setContainer = function(container) {
opensocial.Container.container_ = container;
};
opensocial.Container.get = function() {
return opensocial.Container.container_;
};
opensocial.Container.prototype.getEnvironment = function() {};
opensocial.Container.prototype.requestSendMessage = function(recipients,
message, opt_callback) {};
opensocial.Container.prototype.requestShareApp = function(recipients, reason,
opt_callback) {};
opensocial.Container.prototype.requestCreateActivity = function(activity,
priority, opt_callback) {};
opensocial.Container.prototype.hasPermission = function(permission) {};
opensocial.Container.prototype.requestPermission = function(permissions, reason,
opt_callback) {};
opensocial.Container.prototype.requestData = function(dataRequest, callback) {};
opensocial.Container.prototype.newFetchPersonRequest = function(id,
opt_params) {};
opensocial.Container.prototype.newFetchPeopleRequest = function(idSpec,
opt_params) {};
opensocial.Container.prototype.newFetchPersonAppDataRequest = function(idSpec,
keys) {};
opensocial.Container.prototype.newUpdatePersonAppDataRequest = function(id,
key, value) {};
opensocial.Container.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {};
opensocial.Container.prototype.newCollection = function(array, opt_offset,
opt_totalSize) {
return new opensocial.Collection(array, opt_offset, opt_totalSize);
};
opensocial.Container.prototype.newPerson = function(opt_params, opt_isOwner,
opt_isViewer) {
return new opensocial.Person(opt_params, opt_isOwner, opt_isViewer);
};
opensocial.Container.prototype.newActivity = function(title,
opt_params) {
var activityFields = {};
var prefs = new gadgets.Prefs();
if(!title || typeof title == 'object'){
activityFields = title;
activityFields['appId'] = prefs.getModuleId() || 0
}else if(!title || typeof title == 'string'){
activityFields = {
'appId' : prefs.getModuleId() || 0,
'title' : title
}
}
return new opensocial.Activity(activityFields, opt_params);
};
opensocial.Container.prototype.newActivityMediaItem = function(mimeType, url,
opt_params) {
return new opensocial.Activity.MediaItem(mimeType, url, opt_params);
};
opensocial.Container.prototype.newMessage = function(body, opt_params) {
return new opensocial.Message(body, opt_params);
};
opensocial.Container.prototype.newResponseItem = function(originalDataRequest,
data, opt_errorCode, opt_errorMessage) {
return new opensocial.ResponseItem(originalDataRequest, data, opt_errorCode,
opt_errorMessage);
};
opensocial.Container.prototype.newDataResponse = function(responseItems,
opt_globalError) {
return new opensocial.DataResponse(responseItems, opt_globalError);
};
opensocial.Container.prototype.newDataRequest = function() {
return new opensocial.DataRequest();
};
opensocial.Container.prototype.newEnvironment = function(domain,
supportedFields) {
return new opensocial.Environment(domain, supportedFields);
};
opensocial.Container.isArray = function(val) {
return val instanceof Array;
};
var caja;
var ___;
var html_sanitize;
opensocial.Container.prototype.enableCaja = function() {
___ = window["___"];
caja = window["caja"];
html_sanitize = window["html_sanitize"];
var outers = caja.copy(___.sharedOuters);
var igOnload = window["_IG_RegisterOnloadHandler"];
if (igOnload) {
outers._IG_RegisterOnloadHandler = ___.simpleFunc(igOnload);
}
outers.emitHtml___ = function emitHtml(var_args) {
var html = Array.prototype.slice.call(arguments, 0).join('');
document.write(html);
};
outers.document = function() {};
outers.document.getElementById = function(id) {
var element = document.getElementById("DOM-PREFIX-" + id);
if (element !== null) {
___.useSetHandler(element, 'innerHTML', function(html) {
var temp = html_sanitize(html, null,
function (nmtokens) {
var tokens = nmtokens.split(/\s+/g);
for (var i = 0; i < tokens.length; ++i) {
if (tokens[i]) { tokens[i] = 'DOM-PREFIX-' + tokens[i]; }
}
return tokens.join(' ');
});
return this.innerHTML = temp;
});
}
return element;
};
___.allowCall(outers.document, 'getElementById');
outers.gadgets = gadgets;
outers.opensocial = opensocial;
___.allowCall(outers.opensocial, 'requestSendMessage');
___.allowCall(outers.opensocial, 'requestShareApp');
___.allowCall(outers.opensocial, 'requestCreateActivity');
___.allowCall(outers.opensocial, 'hasPermission');
___.allowCall(outers.opensocial, 'requestPermission');
___.allowCall(outers.opensocial, 'getEnvironment');
___.allowCall(outers.opensocial, 'newDataRequest');
___.allowCall(outers.opensocial, 'newActivity');
___.allowCall(outers.opensocial, 'newActivityMediaItem');
___.allowCall(outers.opensocial, 'newMessage');
___.allowCall(opensocial.Collection.prototype, 'getById');
___.allowCall(opensocial.Collection.prototype, 'size');
___.allowCall(opensocial.Collection.prototype, 'each');
___.allowCall(opensocial.Collection.prototype, 'asArray');
___.allowCall(opensocial.Collection.prototype, 'getTotalSize');
___.allowCall(opensocial.Collection.prototype, 'getOffset');
___.allowCall(Array.prototype, 'push');
___.allowCall(Array.prototype, 'sort');
___.allowCall(opensocial.Person.prototype, 'getId');
___.allowCall(opensocial.Person.prototype, 'getDisplayName');
___.allowCall(opensocial.Person.prototype, 'getField');
___.allowCall(opensocial.Person.prototype, 'isViewer');
___.allowCall(opensocial.Person.prototype, 'isOwner');
___.allowCall(opensocial.Address.prototype, 'getField');
___.allowCall(opensocial.BodyType.prototype, 'getField');
___.allowCall(opensocial.Email.prototype, 'getField');
___.allowCall(opensocial.Name.prototype, 'getField');
___.allowCall(opensocial.Organization.prototype, 'getField');
___.allowCall(opensocial.Phone.prototype, 'getField');
___.allowCall(opensocial.Url.prototype, 'getField');
___.allowCall(opensocial.Activity.prototype, 'getId');
___.allowCall(opensocial.Activity.prototype, 'getField');
___.allowCall(opensocial.Activity.MediaItem.prototype, 'getField');
___.allowCall(opensocial.ResponseItem.prototype, 'hadError');
___.allowCall(opensocial.ResponseItem.prototype, 'getError');
___.allowCall(opensocial.ResponseItem.prototype, 'getOriginalDataRequest');
___.allowCall(opensocial.ResponseItem.prototype, 'getData');
___.allowCall(opensocial.DataResponse.prototype, 'hadError');
___.allowCall(opensocial.DataResponse.prototype, 'get');
___.allowCall(opensocial.DataRequest.prototype, 'getRequestObjects');
___.allowCall(opensocial.DataRequest.prototype, 'add');
___.allowCall(opensocial.DataRequest.prototype, 'send');
___.allowCall(opensocial.DataRequest.prototype, 'newFetchPersonRequest');
___.allowCall(opensocial.DataRequest.prototype, 'newFetchPeopleRequest');
___.allowCall(opensocial.DataRequest.prototype, 'newFetchPersonAppDataRequest');
___.allowCall(opensocial.DataRequest.prototype, 'newUpdatePersonAppDataRequest');
___.allowCall(opensocial.DataRequest.prototype, 'newFetchActivitiesRequest');
___.allowCall(opensocial.Environment.prototype, 'getDomain');
___.allowCall(opensocial.Environment.prototype, 'supportsField');
___.allowCall(opensocial.Enum.prototype, 'getKey');
___.allowCall(opensocial.Enum.prototype, 'getDisplayValue');
___.allowCall(opensocial.Message.prototype, 'getField');
___.allowCall(opensocial.Message.prototype, 'setField');
var moduleHandler = ___.freeze({
getOuters: ___.simpleFunc(function() { return outers; }),
handle: ___.simpleFunc(function(newModule) { newModule(outers); })
});
___.setNewModuleHandler(moduleHandler);
};
function plugin_tamed(obj) { return obj; }
function plugin_dispatchEvent___(thisNode, event, pluginId, handlerName) {
return ___.getOuters(pluginId)[handlerName](plugin_tamed(thisNode),
plugin_tamed(event));
}
opensocial.DataRequest = function() {
this.requestObjects_ = [];
};
opensocial.DataRequest.prototype.requestObjects_ = null;
opensocial.DataRequest.prototype.getRequestObjects = function() {
return this.requestObjects_;
};
opensocial.DataRequest.prototype.add = function(request, opt_key) {
return this.requestObjects_.push({'key': opt_key, 'request': request});
};
opensocial.DataRequest.prototype.send = function(opt_callback) {
var callback = opt_callback || function(){};
opensocial.Container.get().requestData(this, callback);
};
opensocial.DataRequest.PersonId = {
OWNER : 'OWNER',
VIEWER : 'VIEWER'
};
opensocial.DataRequest.Group = {
OWNER_FRIENDS : 'OWNER_FRIENDS',
VIEWER_FRIENDS : 'VIEWER_FRIENDS'
};
opensocial.DataRequest.SortOrder = {
TOP_FRIENDS : 'topFriends',
NAME : 'name'
};
opensocial.DataRequest.FilterType = {
ALL : 'all',
HAS_APP : 'hasApp'
};
opensocial.DataRequest.PeopleRequestFields = {
PROFILE_DETAILS : 'profileDetail',
SORT_ORDER : 'sortOrder',
FILTER : 'filter',
FIRST : 'first',
MAX : 'max'
};
opensocial.DataRequest.prototype.addDefaultParam = function(params, name,
defaultValue) {
params[name] = params[name] || defaultValue;
};
opensocial.DataRequest.prototype.addDefaultProfileFields = function(params) {
var fields = opensocial.DataRequest.PeopleRequestFields;
var profileFields = params[fields.PROFILE_DETAILS] || [];
params[fields.PROFILE_DETAILS] = profileFields.concat(
[opensocial.Person.Field.ID, opensocial.Person.Field.NAME,
opensocial.Person.Field.THUMBNAIL_URL]);
};
opensocial.DataRequest.prototype.asArray = function(keys) {
if (opensocial.Container.isArray(keys)) {
return keys;
} else {
return [keys];
}
};
opensocial.DataRequest.prototype.newFetchPersonRequest = function(id,
opt_params) {
opt_params = opt_params || {};
var fields = opensocial.DataRequest.PeopleRequestFields;
this.addDefaultProfileFields(opt_params);
return opensocial.Container.get().newFetchPersonRequest(id, opt_params);
};
opensocial.DataRequest.prototype.newFetchPeopleRequest = function(idSpec,
opt_params) {
opt_params = opt_params || {};
var fields = opensocial.DataRequest.PeopleRequestFields;
this.addDefaultProfileFields(opt_params);
this.addDefaultParam(opt_params, fields.SORT_ORDER,
opensocial.DataRequest.SortOrder.TOP_FRIENDS);
this.addDefaultParam(opt_params, fields.FILTER,
opensocial.DataRequest.FilterType.ALL);
this.addDefaultParam(opt_params, fields.FIRST, 0);
this.addDefaultParam(opt_params, fields.MAX, 200);
return opensocial.Container.get().newFetchPeopleRequest(idSpec, opt_params);
};
opensocial.DataRequest.prototype.newFetchPersonAppDataRequest = function(idSpec,
keys) {
return opensocial.Container.get().newFetchPersonAppDataRequest(idSpec,
this.asArray(keys));
};
opensocial.DataRequest.prototype.newUpdatePersonAppDataRequest = function(id,
key, value) {
return opensocial.Container.get().newUpdatePersonAppDataRequest(id, key,
value);
};
opensocial.DataRequest.ActivityRequestFields = {
APP_ID : 'appId'
};
opensocial.DataRequest.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
opt_params = opt_params || {};
return opensocial.Container.get().newFetchActivitiesRequest(idSpec,
opt_params);
};
opensocial.DataResponse = function(responseItems, opt_globalError) {
this.responseItems_ = responseItems;
this.globalError_ = opt_globalError;
};
opensocial.DataResponse.prototype.hadError = function() {
return !!this.globalError_;
};
opensocial.DataResponse.prototype.get = function(key) {
return this.responseItems_[key];
};
opensocial.Environment = function(domain, supportedFields) {
this.domain = domain;
this.supportedFields = supportedFields;
};
opensocial.Environment.prototype.getDomain = function() {
return this.domain;
};
opensocial.Environment.ObjectType = {
PERSON : 'person',
ADDRESS : 'address',
BODY_TYPE : 'bodyType',
EMAIL : 'email',
NAME : 'name',
ORGANIZATION : 'organization',
PHONE : 'phone',
URL : 'url',
ACTIVITY : 'activity',
ACTIVITY_MEDIA_ITEM : 'activityMediaItem',
MESSAGE : 'message',
MESSAGE_TYPE : 'messageType',
SORT_ORDER : 'sortOrder',
FILTER_TYPE : 'filterType'
};
opensocial.Environment.prototype.supportsField = function(objectType,
fieldName) {
var supportedObjectFields = this.supportedFields[objectType] || [];
return !!supportedObjectFields[fieldName];
};
opensocial.Person = function(opt_params, opt_isOwner, opt_isViewer) {
this.fields_ = opt_params || {};
this.isOwner_ = opt_isOwner;
this.isViewer_ = opt_isViewer;
};
opensocial.Person.Field = {
ID : 'id',
NAME : 'name',
NICKNAME : 'nickname',
THUMBNAIL_URL : 'thumbnailUrl',
PROFILE_URL : 'profileUrl',
CURRENT_LOCATION : 'currentLocation',
ADDRESSES : 'addresses',
EMAILS : 'emails',
PHONE_NUMBERS : 'phoneNumbers',
ABOUT_ME : 'aboutMe',
STATUS : 'status',
PROFILE_SONG : 'profileSong',
PROFILE_VIDEO : 'profileVideo',
GENDER : 'gender',
SEXUAL_ORIENTATION : 'sexualOrientation',
RELATIONSHIP_STATUS : 'relationshipStatus',
AGE : 'age',
DATE_OF_BIRTH : 'dateOfBirth',
BODY_TYPE : 'bodyType',
ETHNICITY : 'ethnicity',
SMOKER : 'smoker',
DRINKER : 'drinker',
CHILDREN : 'children',
PETS : 'pets',
LIVING_ARRANGEMENT : 'livingArrangement',
TIME_ZONE : 'timeZone',
LANGUAGES_SPOKEN : 'languagesSpoken',
JOBS : 'jobs',
JOB_INTERESTS : 'jobInterests',
SCHOOLS : 'schools',
INTERESTS : 'interests',
URLS : 'urls',
MUSIC : 'music',
MOVIES : 'movies',
TV_SHOWS : 'tvShows',
BOOKS : 'books',
ACTIVITIES : 'activities',
SPORTS : 'sports',
HEROES : 'heroes',
QUOTES : 'quotes',
CARS : 'cars',
FOOD : 'food',
TURN_ONS : 'turnOns',
TURN_OFFS : 'turnOffs',
TAGS : 'tags',
ROMANCE : 'romance',
SCARED_OF : 'scaredOf',
HAPPIEST_WHEN : 'happiestWhen',
FASHION : 'fashion',
HUMOR : 'humor',
LOOKING_FOR : 'lookingFor',
RELIGION : 'religion',
POLITICAL_VIEWS : 'politicalViews'
};
opensocial.Person.prototype.getId = function() {
return this.getField(opensocial.Person.Field.ID);
};
opensocial.Person.prototype.getDisplayName = function() {
return this.getField(opensocial.Person.Field.NAME);
};
opensocial.Person.prototype.getField = function(key) {
return this.fields_[key];
};
opensocial.Person.prototype.isViewer = function() {
return !!this.isViewer_;
};
opensocial.Person.prototype.isOwner = function() {
return !!this.isOwner_;
};
opensocial.ResponseItem = function(originalDataRequest, data,
opt_errorCode, opt_errorMessage) {
this.originalDataRequest_ = originalDataRequest;
this.data_ = data;
this.errorCode_ = opt_errorCode;
this.errorMessage_ = opt_errorMessage;
};
opensocial.ResponseItem.prototype.hadError = function() {
return !!this.errorCode_;
};
opensocial.ResponseItem.Error = {
NOT_IMPLEMENTED : 'notImplemented',
UNAUTHORIZED : 'unauthorized',
FORBIDDEN : 'forbidden',
BAD_REQUEST : 'badRequest',
INTERNAL_ERROR : 'internalError'
};
opensocial.ResponseItem.prototype.getErrorCode = function() {
return this.errorCode_;
};
opensocial.ResponseItem.prototype.getErrorMessage = function() {
return this.errorMessage_;
};
opensocial.ResponseItem.prototype.getOriginalDataRequest = function() {
return this.originalDataRequest_;
};
opensocial.ResponseItem.prototype.getData = function() {
return this.data_;
};
var StateFileParser = function() {};
StateFileParser.STREAM_FIELDS = ['userId', 'streamTitle', 'streamUrl',
'streamFaviconUrl', 'streamSourceUrl'];
StateFileParser.refreshStateByJson = function(snObj, container) {
if (!snObj) {
return;
}
var viewer;
if(snObj.viewer){
viewer = StateFileParser.loadPersonByJson(container, snObj.viewer, false, true);
}
else{
viewer = null;
}
var owner;
if(snObj.owner){
owner = StateFileParser.loadPersonByJson(container, snObj.owner,true, false);
}else{
owner = null;
}
if (owner && viewer && (owner.getId() == viewer.getId())) {
owner.isViewer_ = true;
viewer.isOwner_ = true;
}
var me = this;
var viewerFriends = new Array();
if(snObj.viewerFriends == null) snObj.viewerFriends = {};
for(var i=0; i< snObj.viewerFriends.length; i++){
viewerFriends.push(StateFileParser.loadPersonByJson(container, snObj.viewerFriends[i]));
}
var ownerFriends = new Array();
if(snObj.ownerFriends == null) snObj.ownerFriends = {};
for(var i=0; i< snObj.ownerFriends.length; i++){
ownerFriends.push(StateFileParser.loadPersonByJson(container, snObj.ownerFriends[i]));
}
var globalAppData = {};
var instanceAppData = {};
var personAppData = {};
if(snObj.personAppData){
for(var i=0; i< snObj.personAppData.length; i++){
var personAppItem = snObj.personAppData[i];
var person = personAppItem.person;
if(!personAppData[personAppItem.person]){
personAppData[personAppItem.person] = {};
}
personAppData[personAppItem.person][personAppItem.field]
= personAppItem.value;
}
}
var activities = {};
var appId = snObj.appId ? snObj.appId.text : 0;
container.resetData(viewer, owner,
container.newCollection(viewerFriends),
container.newCollection(ownerFriends), globalAppData,
instanceAppData, personAppData, activities, appId);
var supportedFields = {
'person' : {
'id' : true,
'name' : true,
'aboutMe' : true,
'thumbnailUrl' : true,
'profileUrl' : true,
'gender' : true,
'schools' : true,
'jobs' : true,
'addresses' : true,
'urls' : true,
'interests' : true,
'dateOfBirth' : true
},
'address' : {
'locality' : true
},
'organization' : {
'name':true,
'startDate':true,
'endDate':true,
'webpage':true	
},
'url' : {
'type':true,
'linkText':true,
'address':true
},
'activity' : {
'id' : true,
'externalId' : true,
'userId' : true,
'appId' : true,
'streamTitle' : true,
'streamUrl' : true,
'streamSourceUrl' : true,
'streamFaviconUrl' : true,
'title' : true,
'body' : true,
'url' : true,
'mediaItems' : true,
'postedTime' : true,
'customValues' : false
},
'activityMediaItem' : {
'type' : true,
'mimeType' : true,
'url' : true
}
};
var newEnvironment =  container.newEnvironment('idtail.com', supportedFields);
container.setEnvironment(newEnvironment); 
};
StateFileParser.refreshState = function(stateUrl, gadgetMessageDiv,
container) {
if (!stateUrl) {
gadgetMessageDiv.innerHTML = 'Please enter a container state url. ';
return;
}
gadgetMessageDiv.innerHTML =
'Loading container state from ' + stateUrl + '<br>' +
'If the state does not load make sure your URLs are in the same ' +
'domain as this page.';
var me = this;
$(function() {
$.ajax({type: "GET", url: stateUrl, dataType: "xml", timeout: 5000,
error: function() {
gadgetMessageDiv.innerHTML
= 'Cannot fetch container state from ' + stateUrl;
},
success: function(xmlState) {
StateFileParser.onLoadFoafState(xmlState, stateUrl, gadgetMessageDiv,
container);
}
}); // ajax request
}); // jquery function call
};
StateFileParser.onLoadFoafState = function(xmlState, stateUrl, gadgetMessageDiv,
container) {
var foafRdfNode = $(xmlState).find('RDF')[0];
if (!foafRdfNode) {
gadgetMessageDiv.innerHTML
= 'Invalid container state XML at ' + stateUrl;
return;
}
var personNodes = $(foafRdfNode).find('Person')[0];
if(personNodes){
var personKnows = $(personNodes).find("knows");
$(personNodes).find("knows").remove();
}
var viewer;
if(personNodes){
viewer = StateFileParser.loadPersonByFoaf(container,personNodes, true);
}
var owner;
if(personNodes){
owner = StateFileParser.loadPersonByFoaf(container,personNodes,false,true);
}
if (!owner || (viewer && owner.getId() == viewer.getId())) {
owner = viewer;
owner.isViewer = true;
owner.isOwner = true;
}
var me = this;
var viewerFriends = new Array();
if(personKnows){
$(personKnows).find("Person").each(function() {
viewerFriends.push(StateFileParser.loadPersonByFoaf(container, $(this)));
});
}
var ownerFriends = new Array();
if(personKnows){
$(personKnows).find("Person").each(function() {
ownerFriends.push(StateFileParser.loadPersonByFoaf(container, $(this)));
});
}
var globalAppData = {};
var instanceAppData = {};
var personAppData = {};
var appIdNode = {};
var appId = 'IdtailContainerAppId';
var activities = {};
container.resetData(viewer, owner,
container.newCollection(viewerFriends),
container.newCollection(ownerFriends), globalAppData,
instanceAppData, personAppData, activities, appId);
containerUtil.init(user_gadgets);
};
StateFileParser.onLoadState = function(xmlState, stateUrl, gadgetMessageDiv,
container) {
var containerNode = $(xmlState).find('container')[0];
if (!containerNode) {
gadgetMessageDiv.innerHTML
= 'Invalid container state XML at ' + stateUrl;
return;
}
var viewer;
var viewerNode = $(containerNode).find('viewer')[0];
if (viewerNode) {
viewer = StateFileParser.loadPerson(container,
$(viewerNode).find('person')[0], true);
}
var owner;
var ownerNode = $(containerNode).find('owner')[0];
if (ownerNode) {
owner = StateFileParser.loadPerson(container,
$(ownerNode).find('person')[0], false, true);
}
if (!owner || (viewer && owner.getId() == viewer.getId())) {
owner = viewer;
owner.isViewer = true;
owner.isOwner = true;
}
var me = this;
var viewerFriends = new Array();
var friendsNode = $(containerNode).find('viewerFriends')[0];
$(friendsNode).find('person').each(function() {
viewerFriends.push(StateFileParser.loadPerson(container, $(this)));
});
var ownerFriends = new Array();
friendsNode = $(containerNode).find('ownerFriends')[0];
$(friendsNode).find('person').each(function() {
ownerFriends.push(StateFileParser.loadPerson(container, $(this)));
});
var globalAppData = {};
var globalDataNode = $(containerNode).find('globalAppData')[0];
if (globalDataNode) {
$(globalDataNode).find('data').each(function() {
globalAppData[$(this).attr('field')] = $(this).text();
});
}
var instanceAppData = {};
var instanceDataNode = $(containerNode).find('instanceAppData')[0];
if (instanceDataNode) {
$(instanceDataNode).find('data').each(function() {
instanceAppData[$(this).attr('field')] = $(this).text();
});
}
var personAppData = {};
var personDataNode = $(containerNode).find('personAppData')[0];
if (personDataNode) {
$(personDataNode).find('data').each(function() {
if (personAppData[$(this).attr('person')] == null) {
personAppData[$(this).attr('person')] = {};
}
personAppData[$(this).attr('person')][$(this).attr('field')]
= $(this).text();
});
}
var appIdNode = $(containerNode).find('appId')[0];
var appId = appIdNode ? $(appIdNode).text() : 'sampleContainerAppId';
var activities = {};
var activitiesNode = $(containerNode).find('activities')[0];
$(activitiesNode).find('stream').each(function() {
var userId = $(this).attr('userId');
var streamTitle = $(this).attr('title');
var streamUrl = $(this).attr('url');
var streamSourceUrl = $(this).attr('sourceUrl');
var streamFaviconUrl = $(this).attr('faviconUrl');
activities[userId] = [];
$(this).find('activity').each(function() {
var mediaItems = [];
$(this).find('mediaItem').each(function() {
mediaItems.push(container.newActivityMediaItem(
$(this).attr('mimeType'),
$(this).attr('url'),
{'type' : $(this).attr('type')}));
});
activities[userId].push(container.newActivity(
$(this).attr('title'),
{'id' : $(this).attr('id'),
'externalId' : $(this).attr('externalId'),
'body' : $(this).attr('body'),
'appId' : appId,
'userId' : userId,
'streamTitle' : streamTitle,
'streamUrl' : streamUrl,
'streamSourceUrl' : streamSourceUrl,
'streamFaviconUrl' : streamFaviconUrl,
'url' : $(this).attr('url'),
'postedTime' : $(this).attr('postedTime'),
'mediaItems' : mediaItems}));
});
});
container.resetData(viewer, owner,
container.newCollection(viewerFriends),
container.newCollection(ownerFriends), globalAppData,
instanceAppData, personAppData, activities, appId);
};
StateFileParser.loadPerson = function(container, xmlNode, isViewer, isOwner) {
var fields = {
'id' : $(xmlNode).attr(opensocial.Person.Field.ID),
'name' : $(xmlNode).attr(opensocial.Person.Field.NAME),
'thumbnailUrl' : $(xmlNode).attr(opensocial.Person.Field.THUMBNAIL_URL),
'profileUrl' : $(xmlNode).attr(opensocial.Person.Field.PROFILE_URL)};
return container.newPerson(fields, isViewer, isOwner);
};
StateFileParser.loadPersonByJson = function(container, jsonObj, isViewer, isOwner) {
var addresses = new Array();
if(jsonObj.fields.locality){
$(jsonObj.fields.locality).each(function(){
addresses.push(new opensocial.Address({'locality': this}));
});	
}
var dateofbirth=null;
if(jsonObj.fields.birthyear && jsonObj.fields.birthyear != ''){
dateofbirth=new Date();
var birth_year = parseInt(jsonObj.fields.birthyear) || 0;
var birth_month = parseInt(jsonObj.fields.birthmonth)-1 || 0;
if(birth_month < 0)birth_month = 0;
var birth_day = jsonObj.fields.birthday || 1;
if(birth_day < 1)birth_day = 1;
dateofbirth.setFullYear(birth_year, birth_month, birth_day);
}
var jobs = new Array();
if(jsonObj.fields.career){
$(jsonObj.fields.career).each(function(){
var startDate = this.startdate || '';
var endDate = this.enddate || '';
var webpage = this.workplaceHomepage || null;
jobs.push(new opensocial.Organization(
{	'name': this.name,
'startDate':startDate,
'endDate':endDate,
'webpage': webpage
}
)
);
});	
}
var schools = new Array();
if(jsonObj.fields.school){
var startDate = jsonObj.fields.school.startdate || '';
var endDate = jsonObj.fields.school.enddate || '';
schools.push(new opensocial.Organization(
{	'name': jsonObj.fields.school.name,
'startDate':startDate,
'endDate':endDate
}
)
);
}
var interests = new Array();
if(jsonObj.fields.interest){ 
$(jsonObj.fields.interest).each(function(){
interests.push(this.label);
});	
}
var urls = new Array();
if(jsonObj.fields.homepage){
urls.push(new opensocial.Url({'type': 'homepage', 'linkText' : 'HomePage Url', 'address': jsonObj.fields.homepage}));
}
if(jsonObj.fields.weblog){
urls.push(new opensocial.Url({'type': 'weblog', 'linkText' : 'WebLog Url', 'address': jsonObj.fields.weblog}));
}
var fields = {
'id' : jsonObj.fields.id || null,
'name' : jsonObj.fields.name || null,
'aboutMe' : jsonObj.fields.description || null,
'thumbnailUrl' : jsonObj.fields.img || null,
'profileUrl' : jsonObj.fields.profileUrl || null,
'gender' : jsonObj.fields.gender || null,
'addresses'	: addresses || null,
'interests':interests || null,
'urls': urls || null,
'jobs': jobs || null,
'schools' : schools || null,
'dateOfBirth': dateofbirth || null
}
return container.newPerson(fields, isViewer, isOwner);
};
StateFileParser.loadPersonByFoaf = function(container, xmlNode, isViewer, isOwner) {
var fields = {
'id' : $(xmlNode).attr("rdf:ID"),
'name' : $(xmlNode).find("name").text(),
'thumbnailUrl' : $(xmlNode).find("img").attr('rdf:resource'),
'profileUrl' : $(xmlNode).find("openid").text()};
return container.newPerson(fields, isViewer, isOwner);
};
StateFileParser.dumpState = function(container, stateDiv) {
var xmlText = '<container>\n';
xmlText += '  <viewer>\n';
xmlText += StateFileParser.dumpPerson(container.viewer);
xmlText += '  </viewer>\n';
xmlText += '  <owner>\n';
xmlText += StateFileParser.dumpPerson(container.owner);
xmlText += '  </owner>\n';
xmlText += '  <viewerFriends>\n';
container.viewerFriends.each(function(friend) {
xmlText += StateFileParser.dumpPerson(friend);
});
xmlText += '  </viewerFriends>\n';
xmlText += '  <ownerFriends>\n';
container.ownerFriends.each(function(friend) {
xmlText += StateFileParser.dumpPerson(friend);
});
xmlText += '  </ownerFriends>\n';
xmlText += '  <globalAppData>\n';
for (var field in container.globalAppData) {
xmlText += '    <data field="' + field + '">';
xmlText += container.globalAppData[field];
xmlText += '</data>\n';
}
xmlText += '  </globalAppData>\n';
xmlText += '  <instanceAppData>\n';
for (var field in container.instanceAppData) {
xmlText += '    <data field="' + field + '">';
xmlText += container.instanceAppData[field];
xmlText += '</data>\n';
}
xmlText += '  </instanceAppData>\n';
xmlText += '  <personAppData>\n';
for (var person in container.personAppData) {
for (var field in container.personAppData[person]) {
xmlText += '    <data person="' + person + '" ';
xmlText += 'field="' + field + '">';
xmlText += container.personAppData[person][field];
xmlText += '</data>\n';
}
}
xmlText += '  </personAppData>\n';
xmlText += '  <activities>\n';
var streamWritten = false;
for (var id in container.activities) {
var activity = container.activities[id];
if (!streamWritten) {
var streamTitle = activity.getField('streamTitle');
if (!streamTitle) {
continue;
}
xmlText += '    <stream';
for (var field in StateFileParser.STREAM_FIELDS) {
var value = activity.getField(field);
if (value == null) {
continue;
}
xmlText += ' ' + field + '="' + value + '"';
}
xmlText += '>\n';
streamWritten = true;
}
xmlText += '      <activity';
for (var field in activity.fields_) {
var value = activity.getField(field);
if (value == null || field == 'mediaItems'
|| field in StateFileParser.STREAM_FIELDS) {
continue;
}
xmlText += ' ' + field + '="' + value + '"';
}
xmlText += '>';
var mediaItems = activity.mediaItems;
for (var i = 0; mediaItems && i < mediaItems.length; i++) {
var mediaItem = mediaItem[i];
xmlText += '        <mediaItem ';
if (mediaItem.mimeType) {
xmlText += ' mimeType="' + mediaItem.mimeType + '"';
}
if (mediaItem.url) {
xmlText += ' url="' + mediaItem.url + '"';
}
if (mediaItem.opt_params && mediaItem.opt_params.type) {
xmlText += ' type="' + mediaItem.opt_params.type + '"';
}
xmlText += '/>\n';
}
xmlText += '</activity>\n';
}
if (streamWritten) {
xmlText += '    </stream>\n';
}
xmlText += '  </activities>\n';
xmlText += '</container>';
stateDiv.innerHTML =
'<hr>Current State:<br>' + '<textarea rows="15" cols="120">'
+ xmlText + '</textarea>';
};
StateFileParser.dumpPersonField = function(personObj, name) {
var field = personObj.getField(name);
if (field) {
return ' ' + name + '="' + field + '"';
}
return '';
};
StateFileParser.dumpPerson = function(personObj) {
var xmlText = '    <person';
xmlText += StateFileParser.dumpPersonField(personObj,
opensocial.Person.Field.ID);
xmlText += StateFileParser.dumpPersonField(personObj,
opensocial.Person.Field.NAME);
xmlText += StateFileParser.dumpPersonField(personObj,
opensocial.Person.Field.THUMBNAIL_URL);
xmlText += StateFileParser.dumpPersonField(personObj,
opensocial.Person.Field.PROFILE_URL);
xmlText += '></person>\n';
return xmlText;
};
opensocial.IdtailContainer = function() {
this.opensocial_api_base = 'http://'+document.location.href.split('/')[2].replace('.net','.com').replace('www.','');
opensocial.Container.call(this);
};
opensocial.IdtailContainer.inherits(opensocial.Container);
opensocial.IdtailContainer.prototype.resetData = function(viewer,
opt_owner, opt_viewerFriends, opt_ownerFriends, opt_globalAppData,
opt_instanceAppData, opt_personAppData, opt_activities, opt_appId) {
this.viewer = viewer;
this.owner = opt_owner;
this.viewerFriends = opt_viewerFriends || this.newCollection([]);
this.ownerFriends = opt_ownerFriends || this.newCollection([]);
this.globalAppData = opt_globalAppData || {};
this.instanceAppData = opt_instanceAppData || {};
this.personAppData = opt_personAppData || {};
this.activities = opt_activities || {};
this.appId = opt_appId || 'IdtailContainerAppId';
};
opensocial.IdtailContainer.prototype.setEnvironment = function(environment){
this.environment = environment;
}
opensocial.IdtailContainer.prototype.getEnvironment = function() {
return this.environment;
};
opensocial.IdtailContainer.bind = function(func,obj) {
var args = Array.prototype.slice.call(arguments,2);
return function() { func.apply(obj,args); };
}
opensocial.IdtailContainer.bindAsRequestCallBack = function(func,obj,opt_callback) {
return function(arg) { func.call(obj,arg,opt_callback); };
}
opensocial.IdtailContainer._callbackRequestCreateActivity = function(j,opt_callback) {
if (opt_callback) {
opt_callback(this.newDataResponse({}, false));
}
};
opensocial.IdtailContainer._callbackRequestCreatePersonAppData = function(j,opt_callback) {
if (opt_callback) {
opt_callback(this.newDataResponse({}, false));
}
};
opensocial.IdtailContainer.prototype.requestCreateActivity = function(activity,
priority, opt_callback) {
activity.setField(opensocial.Activity.Field.ID, 'postedActivityId');
var userId = this.viewer.getId();
activity.setField(opensocial.Activity.Field.USER_ID, userId);
this.activities[userId] = this.activities[userId] || [];
this.activities[userId].push(activity);
var title = activity.getField(opensocial.Activity.Field.TITLE);
var app_id = activity.getField(opensocial.Activity.Field.APP_ID);
var viewer = activity.getField(opensocial.Activity.Field.USER_ID);
var mediaItems = activity.getField(opensocial.Activity.Field.MEDIA_ITEMS);
if(mediaItems){
var mediaStr = '';
for(var i=0;i<mediaItems.length;i++){
var mediaItem = mediaItems[i];
if(mediaItem){
mediaStr += "<a href='" + this.viewer.getField(opensocial.Person.Field.PROFILE_URL) + "'>"
+ this.viewer.getDisplayName() + '</a>님이 이 <a href="' + mediaItem.getField('url')  +'">' 
+ mediaItem.getField('mimeType') +'</a>를(을) ' 
+ title;
}
}
var query = '/api/add_notification?app_id=' + app_id + '&viewer='+ viewer +'&title='+encodeURIComponent(mediaStr);
}else{
var query = '/api/add_notification?app_id=' + app_id + '&viewer='+ viewer +'&title='+encodeURIComponent(title);  	
}
new Json( this.opensocial_api_base + query, 
opensocial.IdtailContainer.bindAsRequestCallBack(
opensocial.IdtailContainer._callbackRequestCreateActivity,this,opt_callback) 
);
};
opensocial.IdtailContainer.prototype.hasPermission = function(permission) {
return permission == opensocial.Permission.VIEWER;
};
opensocial.IdtailContainer.prototype.requestPermission = function(permissions,
reason, opt_callback) {
if (opt_callback) {
opt_callback(new opensocial.ResponseItem(
null, null, opensocial.ResponseItem.Error.NOT_IMPLEMENTED, "Not implemented request"));
}
};
opensocial.IdtailContainer.prototype.requestShareApp = function(recipients, reason, opt_callback, opt_params) {
if( typeof recipients == 'string' ) { recipients = [ recipients ]; }
var ids = [];
for( r in recipients ) {
personId = recipients[r];
if (personId == opensocial.DataRequest.PersonId.VIEWER) {
requestedValue = this.viewer;
} else if (personId == opensocial.DataRequest.PersonId.OWNER) {
requestedValue = this.owner;
} else {
requestedValue = this.viewerFriends.getById(personId)
|| this.ownerFriends.getById(personId);
}
if( requestedValue ) {
ids.push( requestedValue.getId());
}
}
if( ids.length == 0 ) {
if (opt_callback) {
opt_callback(new opensocial.ResponseItem(
null, null, opensocial.ResponseItem.Error.BAD_REQUEST, null ));
}
return;
}
gadgets.rpc.call( null, "idtail_shareapp", 
function(result){
if (opt_callback) {
if( result ) {
opt_callback(new opensocial.ResponseItem(
null, null, 0, null ));
} else {
opt_callback(new opensocial.ResponseItem(
null, null, 1, "Failed to share" ));
}
}
}, opt_params['__appid'], ids, reason );
};
opensocial.IdtailContainer.prototype.makeRequest = function(url, callback, opt_params) {
var params = opt_params || {};
var cb = gadgets.util.makeClosure(null, _IG_Fetch_wrapper, callback);
gadgets.io.makeRequest(url, cb, params);
};
opensocial.IdtailContainer.prototype.getIds = function(idSpec) {
var ids = [];
if (idSpec == opensocial.DataRequest.Group.VIEWER_FRIENDS) {
var friends = this.viewerFriends.asArray();
for (var i = 0; i < friends.length; i++) {
ids.push(friends[i].getId());
}
} else if (idSpec == opensocial.DataRequest.Group.OWNER_FRIENDS) {
var friends = this.ownerFriends.asArray();
for (var i = 0; i < friends.length; i++) {
ids.push(friends[i].getId());
}
} else if (idSpec == opensocial.DataRequest.PersonId.VIEWER) {
ids.push(this.viewer.getId());
} else if (idSpec == opensocial.DataRequest.PersonId.OWNER) {
if (this.owner) {
ids.push(this.owner.getId());
}
}
return ids;
};
opensocial.IdtailContainer.prototype.requestData = function(dataRequest,
callback) {
var requestObjects = dataRequest.getRequestObjects();
var dataResponseValues = {};
var globalError = false;
for (var requestNum = 0; requestNum < requestObjects.length; requestNum++) {
var request = requestObjects[requestNum].request;
var requestName = requestObjects[requestNum].key;
var requestedValue;
var errorCode;
var errorMessage;
switch (request.type) {
case 'FETCH_PERSON' :
var personId = request.id;
if (personId == opensocial.DataRequest.PersonId.VIEWER) {
requestedValue = this.viewer;
} else if (personId == opensocial.DataRequest.PersonId.OWNER) {
requestedValue = this.owner;
} else {
requestedValue = this.viewerFriends.getById(personId)
|| this.ownerFriends.getById(personId);
}
break;
case 'FETCH_PEOPLE' :
var idSpec = request.idSpec;
var persons = [];
var params = request.params;
var first = params[opensocial.DataRequest.PeopleRequestFields.FIRST];
if (first < 0) {
errorCode = opensocial.ResponseItem.Error.BAD_REQUEST;
errorMessage = "parameter 'first' must be greater than 0";
break;
}
var max = params[opensocial.DataRequest.PeopleRequestFields.MAX];
if (max <= 0) {
errorCode = opensocial.ResponseItem.Error.BAD_REQUEST;
errorMessage = "parameter 'max' must be greater than 0";
break;
}
if (idSpec == opensocial.DataRequest.Group.VIEWER_FRIENDS) {
persons = this.viewerFriends.asArray().concat();
} else if (idSpec == opensocial.DataRequest.Group.OWNER_FRIENDS) {
persons = this.ownerFriends.asArray().concat();
} else {
if (!opensocial.Container.isArray(idSpec)) {
idSpec = [idSpec];
}
for (var i = 0; i < idSpec.length; i++) {
var person = this.viewerFriends.getById(idSpec[i]);
if (person == null) {
person = this.ownerFriends.getById(idSpec[i]);
}
if (person != null) {
persons.push(person);
}
}
}
if (params[opensocial.DataRequest.PeopleRequestFields.FILTER] ==
opensocial.DataRequest.FilterType.HAS_APP) {
persons = this.filterPeopleWithAppData_(persons);
}
var slicedPersons = persons.slice(first, first + max);
requestedValue = this.newCollection(slicedPersons, first,
persons.length);
break;
case 'FETCH_GLOBAL_APP_DATA' :
var values = {};
var keys =  request.keys;
for (var i = 0; i < keys.length; i++) {
values[keys[i]] = this.globalAppData[keys[i]];
}
requestedValue = values;
break;
case 'FETCH_INSTANCE_APP_DATA' :
var values = {};
var keys =  request.keys;
for (var i = 0; i < keys.length; i++) {
values[keys[i]] = this.instanceAppData[keys[i]];
}
requestedValue = values;
break;
case 'UPDATE_INSTANCE_APP_DATA' :
this.instanceAppData[request.key] = request.value;
break;
case 'FETCH_PERSON_APP_DATA' :
var ids = this.getIds(request.idSpec);
var values = {};
for (var i = 0; i < ids.length; i++) {
var id = ids[i];
if (this.personAppData[id]) {
values[id] = {};
for (var j = 0; j < request.keys.length; j++) {
values[id][request.keys[j]]
= this.personAppData[id][request.keys[j]];
}
}
}
requestedValue = values;
break;
case 'UPDATE_PERSON_APP_DATA' :
var userId = request.id;
if (userId == opensocial.DataRequest.PersonId.VIEWER
|| userId == this.viewer.getId()) {
userId = this.viewer.getId();
this.personAppData[userId] = this.personAppData[userId] || {};
this.personAppData[userId][request.key] = request.value;
window._post_count = window._post_count || 0;
window._post_data = window._post_data || { 'viewer': userId };
window._post_data[window._post_count] = request;
gadgets.rpc.emitInvisibleIframe( '/play/post_data#'+window._post_count );
window._post_count++;
} else {
errorCode = opensocial.ResponseItem.Error.FORBIDDEN;
errorMessage = 'gadgets can only edit viewer app data';
}
break;
case 'FETCH_ACTIVITIES' :
var ids = this.getIds(request.idSpec);
var requestedActivities = [];
for (var i = 0; i < ids.length; i++) {
requestedActivities
= requestedActivities.concat(this.activities[ids]);
}
requestedValue = {
'activities' : this.newCollection(requestedActivities)};
break;
}
dataResponseValues[requestName] = this.newResponseItem(request,
requestedValue, errorCode, errorMessage);
globalError = globalError || dataResponseValues[requestName].hadError();
}
callback(this.newDataResponse(dataResponseValues, globalError));
};
opensocial.IdtailContainer.prototype.filterPeopleWithAppData_ = function(
people) {
var newPeople = [];
for (var i = 0; i < people.length; i++) {
var person = people[i];
if (this.personAppData[person.getId()]) {
newPeople.push(person);
}
}
return newPeople;
}
opensocial.IdtailContainer.prototype.newFetchPersonRequest = function(id,
opt_params) {
return {'type' : 'FETCH_PERSON', 'id' : id};
};
opensocial.IdtailContainer.prototype.newFetchPeopleRequest = function(idSpec,
opt_params) {
return {'type' : 'FETCH_PEOPLE', 'idSpec' : idSpec, 'params': opt_params};
};
opensocial.IdtailContainer.prototype.newFetchGlobalAppDataRequest = function(
keys) {
return {'type' : 'FETCH_GLOBAL_APP_DATA', 'keys' : keys};
};
opensocial.IdtailContainer.prototype.newFetchInstanceAppDataRequest = function(
keys) {
return {'type' : 'FETCH_INSTANCE_APP_DATA', 'keys' : keys};
};
opensocial.IdtailContainer.prototype.newUpdateInstanceAppDataRequest = function(
key, value) {
return {'type' : 'UPDATE_INSTANCE_APP_DATA', 'key' : key, 'value' : value};
};
opensocial.IdtailContainer.prototype.newFetchPersonAppDataRequest = function(
idSpec, keys) {
return {'type' : 'FETCH_PERSON_APP_DATA', 'idSpec' : idSpec, 'keys' : keys};
};
opensocial.IdtailContainer.prototype.newUpdatePersonAppDataRequest = function(
id, key, value) {
return {'type' : 'UPDATE_PERSON_APP_DATA', 'id' : id, 'key' : key,
'value' : value};
};
opensocial.IdtailContainer.prototype.newFetchActivitiesRequest = function(
idSpec, opt_params) {
return {'type' : 'FETCH_ACTIVITIES', 'idSpec' : idSpec};
};
opensocial.IdtailContainer.prototype.newDataResponse = function(responseItems,
opt_globalError) {
return new opensocial.DataResponse(responseItems, opt_globalError);
};
opensocial.ParentContainer = function(container) {
this.wrappedContainer = container;
};
opensocial.ParentContainer.inherits(opensocial.Container);
opensocial.ParentContainer.prototype.getWrappedContainer = function() {
return this.wrappedContainer;
};
opensocial.ParentContainer.prototype.getEnvironment = function() {
return this.wrappedContainer.getEnvironment();
};
opensocial.ParentContainer.prototype.requestCreateActivity = function(activity,
priority, opt_callback) {
this.wrappedContainer.requestCreateActivity(activity, priority,
opt_callback);
};
opensocial.ParentContainer.prototype.hasPermission = function(permission) {
return this.wrappedContainer.hasPermission(permission);
};
opensocial.ParentContainer.prototype.requestPermission = function(permissions,
reason, opt_callback) {
this.wrappedContainer.requestPermission(permissions, reason, opt_callback);
};
opensocial.ParentContainer.prototype.requestShareApp = function(recipients, reason, opt_callback, opt_params) {
this.wrappedContainer.requestShareApp(recipients, reason, opt_callback, opt_params );
};
opensocial.ParentContainer.prototype.makeRequest = function(url, callback,
opt_params) {
this.wrappedContainer.makeRequest(url, callback, opt_params);
};
opensocial.ParentContainer.prototype.requestData = function(dataRequest,
callback) {
this.wrappedContainer.requestData(dataRequest, callback);
};
opensocial.ParentContainer.prototype.newFetchPersonRequest = function(id,
opt_params) {
return this.wrappedContainer.newFetchPersonRequest(id, opt_params);
};
opensocial.ParentContainer.prototype.newFetchPeopleRequest = function(idSpec,
opt_params) {
return this.wrappedContainer.newFetchPeopleRequest(idSpec, opt_params);
};
opensocial.ParentContainer.prototype.newFetchGlobalAppDataRequest = function(
keys) {
return this.wrappedContainer.newFetchGlobalAppDataRequest(keys);
};
opensocial.ParentContainer.prototype.newFetchInstanceAppDataRequest = function(
keys) {
return this.wrappedContainer.newFetchInstanceAppDataRequest(keys);
};
opensocial.ParentContainer.prototype.newUpdateInstanceAppDataRequest =
function(key, value) {
return this.wrappedContainer.newUpdateInstanceAppDataRequest(key, value);
};
opensocial.ParentContainer.prototype.newFetchPersonAppDataRequest = function(
idSpec, keys) {
return this.wrappedContainer.newFetchPersonAppDataRequest(idSpec, keys);
};
opensocial.ParentContainer.prototype.newUpdatePersonAppDataRequest = function(
id, key, value) {
return this.wrappedContainer.newUpdatePersonAppDataRequest(id, key, value);
};
opensocial.ParentContainer.prototype.newFetchActivitiesRequest = function(
idSpec, opt_params) {
return this.wrappedContainer.newFetchActivitiesRequest(idSpec, opt_params);
};
opensocial.ParentContainer.prototype.newCollection = function(array, opt_offset,
opt_totalSize) {
this.wrappedContainer.newCollection(array, opt_offset, opt_totalSize);
};
opensocial.ParentContainer.prototype.newPerson = function(opt_params,
opt_isOwner, opt_isViewer) {
return this.wrappedContainer.newPerson(opt_params, opt_isOwner, opt_isViewer);
};
opensocial.ParentContainer.prototype.newActivity = function(title, opt_params) {
return this.wrappedContainer.newActivity(title, opt_params);
};
opensocial.ParentContainer.prototype.newActivityMediaItem = function(mimeType,
url, opt_params) {
return this.wrappedContainer.newActivityMediaItem(mimeType, url, opt_params);
};
opensocial.ParentContainer.prototype.newResponseItem = function(
originalDataRequest, data, opt_errorCode, opt_errorMessage) {
return this.wrappedContainer.newResponseItem(originalDataRequest, data,
opt_errorCode, opt_errorMessage);
};
opensocial.ParentContainer.prototype.newDataResponse = function(responseItems,
opt_globalError) {
return this.wrappedContainer.newDataResponse(responseItems, opt_globalError);
};
opensocial.ParentContainer.prototype.newDataRequest = function() {
return this.wrappedContainer.newDataRequest();
};
opensocial.ParentContainer.prototype.newEnvironment = function(domain, surface,
supportedSurfaces, supportedFields, opt_params) {
return this.wrappedContainer.newEnvironment(domain, surface,
supportedSurfaces, supportedFields, opt_params);
};
opensocial.ParentContainer.prototype.newSurface = function(name,
opt_isPrimaryContent) {
return this.wrappedContainer.newSurface(name, opt_isPrimaryContent);
};
opensocial.ParentContainer.prototype.enableCaja = function() {
this.wrappedContainer.enableCaja();
};
if ( window.console == undefined )
{
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}
var IdtailContainerUtil = function(enableCaja) {
opensocial.Container.setContainer(new opensocial.ParentContainer(
new opensocial.IdtailContainer()));
this.enableCaja = enableCaja;
if (this.enableCaja) {
opensocial.Container.get().enableCaja();
}
this.messageDiv = document.getElementById("container.message");
};
IdtailContainerUtil.prototype.init = function(gadgets) {
try{
this.refreshState();
}catch(e){
alert("Sorry, We can't display this page by technical problem ");
}		
};
IdtailContainerUtil.prototype.readCookie = function() {
var cookie = goog.net.cookies.get('IdtailContainerCookie');
if (cookie) {
var pairs = cookie.split('&');
for (var i = 0; i < pairs.length; i++) {
var nameValue = pairs[i].split('=');
var name = decodeURIComponent(nameValue[0]);
var value = decodeURIComponent(nameValue[1]);
switch (name) {
case 'stateUrl':
this.stateUrl = value;
break;
}
}
}
if (this.stateUrl) {
this.stateUrlDiv.value = this.stateUrl;
}
};
IdtailContainerUtil.prototype.setCookie = function() {
var cookieValue = 'stateUrl=' + encodeURIComponent(this.stateUrl);
goog.net.cookies.set('IdtailContainerCookie', cookieValue);
};
IdtailContainerUtil.prototype.setState = function(social_data) {
this.sn_data = social_data;
this.refreshState();
};
IdtailContainerUtil.prototype.refreshState = function() {
StateFileParser.refreshStateByJson(this.sn_data, opensocial.Container.get().getWrappedContainer());
};
IdtailContainerUtil.prototype.dumpState = function() {
StateFileParser.dumpState(
opensocial.Container.get().getWrappedContainer(),
document.getElementById('IdtailContainer.currentState'));
};
