/*
* jQuery JavaScript Library v1.3.2
* http://jquery.com/
*
* Copyright (c) 2009 John Resig
* Dual licensed under the MIT and GPL licenses.
* http://docs.jquery.com/License
*
* Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
* Revision: 6246
*/
(function() {
    var l = this, g, y = l.jQuery, p = l.$, o = l.jQuery = l.$ = function(E, F) { return new o.fn.init(E, F) }, D = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, f = /^.[^:#\[\.,]*$/; o.fn = o.prototype = { init: function(E, H) { E = E || document; if (E.nodeType) { this[0] = E; this.length = 1; this.context = E; return this } if (typeof E === "string") { var G = D.exec(E); if (G && (G[1] || !H)) { if (G[1]) { E = o.clean([G[1]], H) } else { var I = document.getElementById(G[3]); if (I && I.id != G[3]) { return o().find(E) } var F = o(I || []); F.context = document; F.selector = E; return F } } else { return o(H).find(E) } } else { if (o.isFunction(E)) { return o(document).ready(E) } } if (E.selector && E.context) { this.selector = E.selector; this.context = E.context } return this.setArray(o.isArray(E) ? E : o.makeArray(E)) }, selector: "", jquery: "1.3.2", size: function() { return this.length }, get: function(E) { return E === g ? Array.prototype.slice.call(this) : this[E] }, pushStack: function(F, H, E) { var G = o(F); G.prevObject = this; G.context = this.context; if (H === "find") { G.selector = this.selector + (this.selector ? " " : "") + E } else { if (H) { G.selector = this.selector + "." + H + "(" + E + ")" } } return G }, setArray: function(E) { this.length = 0; Array.prototype.push.apply(this, E); return this }, each: function(F, E) { return o.each(this, F, E) }, index: function(E) { return o.inArray(E && E.jquery ? E[0] : E, this) }, attr: function(F, H, G) { var E = F; if (typeof F === "string") { if (H === g) { return this[0] && o[G || "attr"](this[0], F) } else { E = {}; E[F] = H } } return this.each(function(I) { for (F in E) { o.attr(G ? this.style : this, F, o.prop(this, E[F], G, I, F)) } }) }, css: function(E, F) { if ((E == "width" || E == "height") && parseFloat(F) < 0) { F = g } return this.attr(E, F, "curCSS") }, text: function(F) { if (typeof F !== "object" && F != null) { return this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(F)) } var E = ""; o.each(F || this, function() { o.each(this.childNodes, function() { if (this.nodeType != 8) { E += this.nodeType != 1 ? this.nodeValue : o.fn.text([this]) } }) }); return E }, wrapAll: function(E) { if (this[0]) { var F = o(E, this[0].ownerDocument).clone(); if (this[0].parentNode) { F.insertBefore(this[0]) } F.map(function() { var G = this; while (G.firstChild) { G = G.firstChild } return G }).append(this) } return this }, wrapInner: function(E) { return this.each(function() { o(this).contents().wrapAll(E) }) }, wrap: function(E) { return this.each(function() { o(this).wrapAll(E) }) }, append: function() { return this.domManip(arguments, true, function(E) { if (this.nodeType == 1) { this.appendChild(E) } }) }, prepend: function() { return this.domManip(arguments, true, function(E) { if (this.nodeType == 1) { this.insertBefore(E, this.firstChild) } }) }, before: function() { return this.domManip(arguments, false, function(E) { this.parentNode.insertBefore(E, this) }) }, after: function() { return this.domManip(arguments, false, function(E) { this.parentNode.insertBefore(E, this.nextSibling) }) }, end: function() { return this.prevObject || o([]) }, push: [].push, sort: [].sort, splice: [].splice, find: function(E) { if (this.length === 1) { var F = this.pushStack([], "find", E); F.length = 0; o.find(E, this[0], F); return F } else { return this.pushStack(o.unique(o.map(this, function(G) { return o.find(E, G) })), "find", E) } }, clone: function(G) { var E = this.map(function() { if (!o.support.noCloneEvent && !o.isXMLDoc(this)) { var I = this.outerHTML; if (!I) { var J = this.ownerDocument.createElement("div"); J.appendChild(this.cloneNode(true)); I = J.innerHTML } return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0] } else { return this.cloneNode(true) } }); if (G === true) { var H = this.find("*").andSelf(), F = 0; E.find("*").andSelf().each(function() { if (this.nodeName !== H[F].nodeName) { return } var I = o.data(H[F], "events"); for (var K in I) { for (var J in I[K]) { o.event.add(this, K, I[K][J], I[K][J].data) } } F++ }) } return E }, filter: function(E) { return this.pushStack(o.isFunction(E) && o.grep(this, function(G, F) { return E.call(G, F) }) || o.multiFilter(E, o.grep(this, function(F) { return F.nodeType === 1 })), "filter", E) }, closest: function(E) { var G = o.expr.match.POS.test(E) ? o(E) : null, F = 0; return this.map(function() { var H = this; while (H && H.ownerDocument) { if (G ? G.index(H) > -1 : o(H).is(E)) { o.data(H, "closest", F); return H } H = H.parentNode; F++ } }) }, not: function(E) { if (typeof E === "string") { if (f.test(E)) { return this.pushStack(o.multiFilter(E, this, true), "not", E) } else { E = o.multiFilter(E, this) } } var F = E.length && E[E.length - 1] !== g && !E.nodeType; return this.filter(function() { return F ? o.inArray(this, E) < 0 : this != E }) }, add: function(E) { return this.pushStack(o.unique(o.merge(this.get(), typeof E === "string" ? o(E) : o.makeArray(E)))) }, is: function(E) { return !!E && o.multiFilter(E, this).length > 0 }, hasClass: function(E) { return !!E && this.is("." + E) }, val: function(K) { if (K === g) { var E = this[0]; if (E) { if (o.nodeName(E, "option")) { return (E.attributes.value || {}).specified ? E.value : E.text } if (o.nodeName(E, "select")) { var I = E.selectedIndex, L = [], M = E.options, H = E.type == "select-one"; if (I < 0) { return null } for (var F = H ? I : 0, J = H ? I + 1 : M.length; F < J; F++) { var G = M[F]; if (G.selected) { K = o(G).val(); if (H) { return K } L.push(K) } } return L } return (E.value || "").replace(/\r/g, "") } return g } if (typeof K === "number") { K += "" } return this.each(function() { if (this.nodeType != 1) { return } if (o.isArray(K) && /radio|checkbox/.test(this.type)) { this.checked = (o.inArray(this.value, K) >= 0 || o.inArray(this.name, K) >= 0) } else { if (o.nodeName(this, "select")) { var N = o.makeArray(K); o("option", this).each(function() { this.selected = (o.inArray(this.value, N) >= 0 || o.inArray(this.text, N) >= 0) }); if (!N.length) { this.selectedIndex = -1 } } else { this.value = K } } }) }, html: function(E) { return E === g ? (this[0] ? this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : null) : this.empty().append(E) }, replaceWith: function(E) { return this.after(E).remove() }, eq: function(E) { return this.slice(E, +E + 1) }, slice: function() { return this.pushStack(Array.prototype.slice.apply(this, arguments), "slice", Array.prototype.slice.call(arguments).join(",")) }, map: function(E) { return this.pushStack(o.map(this, function(G, F) { return E.call(G, F, G) })) }, andSelf: function() { return this.add(this.prevObject) }, domManip: function(J, M, L) { if (this[0]) { var I = (this[0].ownerDocument || this[0]).createDocumentFragment(), F = o.clean(J, (this[0].ownerDocument || this[0]), I), H = I.firstChild; if (H) { for (var G = 0, E = this.length; G < E; G++) { L.call(K(this[G], H), this.length > 1 || G > 0 ? I.cloneNode(true) : I) } } if (F) { o.each(F, z) } } return this; function K(N, O) { return M && o.nodeName(N, "table") && o.nodeName(O, "tr") ? (N.getElementsByTagName("tbody")[0] || N.appendChild(N.ownerDocument.createElement("tbody"))) : N } } }; o.fn.init.prototype = o.fn; function z(E, F) { if (F.src) { o.ajax({ url: F.src, async: false, dataType: "script" }) } else { o.globalEval(F.text || F.textContent || F.innerHTML || "") } if (F.parentNode) { F.parentNode.removeChild(F) } } function e() { return +new Date } o.extend = o.fn.extend = function() { var J = arguments[0] || {}, H = 1, I = arguments.length, E = false, G; if (typeof J === "boolean") { E = J; J = arguments[1] || {}; H = 2 } if (typeof J !== "object" && !o.isFunction(J)) { J = {} } if (I == H) { J = this; --H } for (; H < I; H++) { if ((G = arguments[H]) != null) { for (var F in G) { var K = J[F], L = G[F]; if (J === L) { continue } if (E && L && typeof L === "object" && !L.nodeType) { J[F] = o.extend(E, K || (L.length != null ? [] : {}), L) } else { if (L !== g) { J[F] = L } } } } } return J }; var b = /z-?index|font-?weight|opacity|zoom|line-?height/i, q = document.defaultView || {}, s = Object.prototype.toString; o.extend({ noConflict: function(E) { l.$ = p; if (E) { l.jQuery = y } return o }, isFunction: function(E) { return s.call(E) === "[object Function]" }, isArray: function(E) { return s.call(E) === "[object Array]" }, isXMLDoc: function(E) { return E.nodeType === 9 && E.documentElement.nodeName !== "HTML" || !!E.ownerDocument && o.isXMLDoc(E.ownerDocument) }, globalEval: function(G) { if (G && /\S/.test(G)) { var F = document.getElementsByTagName("head")[0] || document.documentElement, E = document.createElement("script"); E.type = "text/javascript"; if (o.support.scriptEval) { E.appendChild(document.createTextNode(G)) } else { E.text = G } F.insertBefore(E, F.firstChild); F.removeChild(E) } }, nodeName: function(F, E) { return F.nodeName && F.nodeName.toUpperCase() == E.toUpperCase() }, each: function(G, K, F) { var E, H = 0, I = G.length; if (F) { if (I === g) { for (E in G) { if (K.apply(G[E], F) === false) { break } } } else { for (; H < I; ) { if (K.apply(G[H++], F) === false) { break } } } } else { if (I === g) { for (E in G) { if (K.call(G[E], E, G[E]) === false) { break } } } else { for (var J = G[0]; H < I && K.call(J, H, J) !== false; J = G[++H]) { } } } return G }, prop: function(H, I, G, F, E) { if (o.isFunction(I)) { I = I.call(H, F) } return typeof I === "number" && G == "curCSS" && !b.test(E) ? I + "px" : I }, className: { add: function(E, F) { o.each((F || "").split(/\s+/), function(G, H) { if (E.nodeType == 1 && !o.className.has(E.className, H)) { E.className += (E.className ? " " : "") + H } }) }, remove: function(E, F) { if (E.nodeType == 1) { E.className = F !== g ? o.grep(E.className.split(/\s+/), function(G) { return !o.className.has(F, G) }).join(" ") : "" } }, has: function(F, E) { return F && o.inArray(E, (F.className || F).toString().split(/\s+/)) > -1 } }, swap: function(H, G, I) { var E = {}; for (var F in G) { E[F] = H.style[F]; H.style[F] = G[F] } I.call(H); for (var F in G) { H.style[F] = E[F] } }, css: function(H, F, J, E) { if (F == "width" || F == "height") { var L, G = { position: "absolute", visibility: "hidden", display: "block" }, K = F == "width" ? ["Left", "Right"] : ["Top", "Bottom"]; function I() { L = F == "width" ? H.offsetWidth : H.offsetHeight; if (E === "border") { return } o.each(K, function() { if (!E) { L -= parseFloat(o.curCSS(H, "padding" + this, true)) || 0 } if (E === "margin") { L += parseFloat(o.curCSS(H, "margin" + this, true)) || 0 } else { L -= parseFloat(o.curCSS(H, "border" + this + "Width", true)) || 0 } }) } if (H.offsetWidth !== 0) { I() } else { o.swap(H, G, I) } return Math.max(0, Math.round(L)) } return o.curCSS(H, F, J) }, curCSS: function(I, F, G) { var L, E = I.style; if (F == "opacity" && !o.support.opacity) { L = o.attr(E, "opacity"); return L == "" ? "1" : L } if (F.match(/float/i)) { F = w } if (!G && E && E[F]) { L = E[F] } else { if (q.getComputedStyle) { if (F.match(/float/i)) { F = "float" } F = F.replace(/([A-Z])/g, "-$1").toLowerCase(); var M = q.getComputedStyle(I, null); if (M) { L = M.getPropertyValue(F) } if (F == "opacity" && L == "") { L = "1" } } else { if (I.currentStyle) { var J = F.replace(/\-(\w)/g, function(N, O) { return O.toUpperCase() }); L = I.currentStyle[F] || I.currentStyle[J]; if (!/^\d+(px)?$/i.test(L) && /^\d/.test(L)) { var H = E.left, K = I.runtimeStyle.left; I.runtimeStyle.left = I.currentStyle.left; E.left = L || 0; L = E.pixelLeft + "px"; E.left = H; I.runtimeStyle.left = K } } } } return L }, clean: function(F, K, I) { K = K || document; if (typeof K.createElement === "undefined") { K = K.ownerDocument || K[0] && K[0].ownerDocument || document } if (!I && F.length === 1 && typeof F[0] === "string") { var H = /^<(\w+)\s*\/?>$/.exec(F[0]); if (H) { return [K.createElement(H[1])] } } var G = [], E = [], L = K.createElement("div"); o.each(F, function(P, S) { if (typeof S === "number") { S += "" } if (!S) { return } if (typeof S === "string") { S = S.replace(/(<(\w+)[^>]*?)\/>/g, function(U, V, T) { return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? U : V + "></" + T + ">" }); var O = S.replace(/^\s+/, "").substring(0, 10).toLowerCase(); var Q = !O.indexOf("<opt") && [1, "<select multiple='multiple'>", "</select>"] || !O.indexOf("<leg") && [1, "<fieldset>", "</fieldset>"] || O.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1, "<table>", "</table>"] || !O.indexOf("<tr") && [2, "<table><tbody>", "</tbody></table>"] || (!O.indexOf("<td") || !O.indexOf("<th")) && [3, "<table><tbody><tr>", "</tr></tbody></table>"] || !O.indexOf("<col") && [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] || !o.support.htmlSerialize && [1, "div<div>", "</div>"] || [0, "", ""]; L.innerHTML = Q[1] + S + Q[2]; while (Q[0]--) { L = L.lastChild } if (!o.support.tbody) { var R = /<tbody/i.test(S), N = !O.indexOf("<table") && !R ? L.firstChild && L.firstChild.childNodes : Q[1] == "<table>" && !R ? L.childNodes : []; for (var M = N.length - 1; M >= 0; --M) { if (o.nodeName(N[M], "tbody") && !N[M].childNodes.length) { N[M].parentNode.removeChild(N[M]) } } } if (!o.support.leadingWhitespace && /^\s/.test(S)) { L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]), L.firstChild) } S = o.makeArray(L.childNodes) } if (S.nodeType) { G.push(S) } else { G = o.merge(G, S) } }); if (I) { for (var J = 0; G[J]; J++) { if (o.nodeName(G[J], "script") && (!G[J].type || G[J].type.toLowerCase() === "text/javascript")) { E.push(G[J].parentNode ? G[J].parentNode.removeChild(G[J]) : G[J]) } else { if (G[J].nodeType === 1) { G.splice.apply(G, [J + 1, 0].concat(o.makeArray(G[J].getElementsByTagName("script")))) } I.appendChild(G[J]) } } return E } return G }, attr: function(J, G, K) { if (!J || J.nodeType == 3 || J.nodeType == 8) { return g } var H = !o.isXMLDoc(J), L = K !== g; G = H && o.props[G] || G; if (J.tagName) { var F = /href|src|style/.test(G); if (G == "selected" && J.parentNode) { J.parentNode.selectedIndex } if (G in J && H && !F) { if (L) { if (G == "type" && o.nodeName(J, "input") && J.parentNode) { throw "type property can't be changed" } J[G] = K } if (o.nodeName(J, "form") && J.getAttributeNode(G)) { return J.getAttributeNode(G).nodeValue } if (G == "tabIndex") { var I = J.getAttributeNode("tabIndex"); return I && I.specified ? I.value : J.nodeName.match(/(button|input|object|select|textarea)/i) ? 0 : J.nodeName.match(/^(a|area)$/i) && J.href ? 0 : g } return J[G] } if (!o.support.style && H && G == "style") { return o.attr(J.style, "cssText", K) } if (L) { J.setAttribute(G, "" + K) } var E = !o.support.hrefNormalized && H && F ? J.getAttribute(G, 2) : J.getAttribute(G); return E === null ? g : E } if (!o.support.opacity && G == "opacity") { if (L) { J.zoom = 1; J.filter = (J.filter || "").replace(/alpha\([^)]*\)/, "") + (parseInt(K) + "" == "NaN" ? "" : "alpha(opacity=" + K * 100 + ")") } return J.filter && J.filter.indexOf("opacity=") >= 0 ? (parseFloat(J.filter.match(/opacity=([^)]*)/)[1]) / 100) + "" : "" } G = G.replace(/-([a-z])/ig, function(M, N) { return N.toUpperCase() }); if (L) { J[G] = K } return J[G] }, trim: function(E) { return (E || "").replace(/^\s+|\s+$/g, "") }, makeArray: function(G) { var E = []; if (G != null) { var F = G.length; if (F == null || typeof G === "string" || o.isFunction(G) || G.setInterval) { E[0] = G } else { while (F) { E[--F] = G[F] } } } return E }, inArray: function(G, H) { for (var E = 0, F = H.length; E < F; E++) { if (H[E] === G) { return E } } return -1 }, merge: function(H, E) { var F = 0, G, I = H.length; if (!o.support.getAll) { while ((G = E[F++]) != null) { if (G.nodeType != 8) { H[I++] = G } } } else { while ((G = E[F++]) != null) { H[I++] = G } } return H }, unique: function(K) { var F = [], E = {}; try { for (var G = 0, H = K.length; G < H; G++) { var J = o.data(K[G]); if (!E[J]) { E[J] = true; F.push(K[G]) } } } catch (I) { F = K } return F }, grep: function(F, J, E) { var G = []; for (var H = 0, I = F.length; H < I; H++) { if (!E != !J(F[H], H)) { G.push(F[H]) } } return G }, map: function(E, J) { var F = []; for (var G = 0, H = E.length; G < H; G++) { var I = J(E[G], G); if (I != null) { F[F.length] = I } } return F.concat.apply([], F) } }); var C = navigator.userAgent.toLowerCase(); o.browser = { version: (C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [0, "0"])[1], safari: /webkit/.test(C), opera: /opera/.test(C), msie: /msie/.test(C) && !/opera/.test(C), mozilla: /mozilla/.test(C) && !/(compatible|webkit)/.test(C) }; o.each({ parent: function(E) { return E.parentNode }, parents: function(E) { return o.dir(E, "parentNode") }, next: function(E) { return o.nth(E, 2, "nextSibling") }, prev: function(E) { return o.nth(E, 2, "previousSibling") }, nextAll: function(E) { return o.dir(E, "nextSibling") }, prevAll: function(E) { return o.dir(E, "previousSibling") }, siblings: function(E) { return o.sibling(E.parentNode.firstChild, E) }, children: function(E) { return o.sibling(E.firstChild) }, contents: function(E) { return o.nodeName(E, "iframe") ? E.contentDocument || E.contentWindow.document : o.makeArray(E.childNodes) } }, function(E, F) { o.fn[E] = function(G) { var H = o.map(this, F); if (G && typeof G == "string") { H = o.multiFilter(G, H) } return this.pushStack(o.unique(H), E, G) } }); o.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function(E, F) { o.fn[E] = function(G) { var J = [], L = o(G); for (var K = 0, H = L.length; K < H; K++) { var I = (K > 0 ? this.clone(true) : this).get(); o.fn[F].apply(o(L[K]), I); J = J.concat(I) } return this.pushStack(J, E, G) } }); o.each({ removeAttr: function(E) { o.attr(this, E, ""); if (this.nodeType == 1) { this.removeAttribute(E) } }, addClass: function(E) { o.className.add(this, E) }, removeClass: function(E) { o.className.remove(this, E) }, toggleClass: function(F, E) { if (typeof E !== "boolean") { E = !o.className.has(this, F) } o.className[E ? "add" : "remove"](this, F) }, remove: function(E) { if (!E || o.filter(E, [this]).length) { o("*", this).add([this]).each(function() { o.event.remove(this); o.removeData(this) }); if (this.parentNode) { this.parentNode.removeChild(this) } } }, empty: function() { o(this).children().remove(); while (this.firstChild) { this.removeChild(this.firstChild) } } }, function(E, F) { o.fn[E] = function() { return this.each(F, arguments) } }); function j(E, F) { return E[0] && parseInt(o.curCSS(E[0], F, true), 10) || 0 } var h = "jQuery" + e(), v = 0, A = {}; o.extend({ cache: {}, data: function(F, E, G) { F = F == l ? A : F; var H = F[h]; if (!H) { H = F[h] = ++v } if (E && !o.cache[H]) { o.cache[H] = {} } if (G !== g) { o.cache[H][E] = G } return E ? o.cache[H][E] : H }, removeData: function(F, E) { F = F == l ? A : F; var H = F[h]; if (E) { if (o.cache[H]) { delete o.cache[H][E]; E = ""; for (E in o.cache[H]) { break } if (!E) { o.removeData(F) } } } else { try { delete F[h] } catch (G) { if (F.removeAttribute) { F.removeAttribute(h) } } delete o.cache[H] } }, queue: function(F, E, H) { if (F) { E = (E || "fx") + "queue"; var G = o.data(F, E); if (!G || o.isArray(H)) { G = o.data(F, E, o.makeArray(H)) } else { if (H) { G.push(H) } } } return G }, dequeue: function(H, G) { var E = o.queue(H, G), F = E.shift(); if (!G || G === "fx") { F = E[0] } if (F !== g) { F.call(H) } } }); o.fn.extend({ data: function(E, G) { var H = E.split("."); H[1] = H[1] ? "." + H[1] : ""; if (G === g) { var F = this.triggerHandler("getData" + H[1] + "!", [H[0]]); if (F === g && this.length) { F = o.data(this[0], E) } return F === g && H[1] ? this.data(H[0]) : F } else { return this.trigger("setData" + H[1] + "!", [H[0], G]).each(function() { o.data(this, E, G) }) } }, removeData: function(E) { return this.each(function() { o.removeData(this, E) }) }, queue: function(E, F) { if (typeof E !== "string") { F = E; E = "fx" } if (F === g) { return o.queue(this[0], E) } return this.each(function() { var G = o.queue(this, E, F); if (E == "fx" && G.length == 1) { G[0].call(this) } }) }, dequeue: function(E) { return this.each(function() { o.dequeue(this, E) }) } });
    /*
    * Sizzle CSS Selector Engine - v0.9.3
    *  Copyright 2009, The Dojo Foundation
    *  Released under the MIT, BSD, and GPL Licenses.
    *  More information: http://sizzlejs.com/
    */
    (function() { var R = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, L = 0, H = Object.prototype.toString; var F = function(Y, U, ab, ac) { ab = ab || []; U = U || document; if (U.nodeType !== 1 && U.nodeType !== 9) { return [] } if (!Y || typeof Y !== "string") { return ab } var Z = [], W, af, ai, T, ad, V, X = true; R.lastIndex = 0; while ((W = R.exec(Y)) !== null) { Z.push(W[1]); if (W[2]) { V = RegExp.rightContext; break } } if (Z.length > 1 && M.exec(Y)) { if (Z.length === 2 && I.relative[Z[0]]) { af = J(Z[0] + Z[1], U) } else { af = I.relative[Z[0]] ? [U] : F(Z.shift(), U); while (Z.length) { Y = Z.shift(); if (I.relative[Y]) { Y += Z.shift() } af = J(Y, af) } } } else { var ae = ac ? { expr: Z.pop(), set: E(ac)} : F.find(Z.pop(), Z.length === 1 && U.parentNode ? U.parentNode : U, Q(U)); af = F.filter(ae.expr, ae.set); if (Z.length > 0) { ai = E(af) } else { X = false } while (Z.length) { var ah = Z.pop(), ag = ah; if (!I.relative[ah]) { ah = "" } else { ag = Z.pop() } if (ag == null) { ag = U } I.relative[ah](ai, ag, Q(U)) } } if (!ai) { ai = af } if (!ai) { throw "Syntax error, unrecognized expression: " + (ah || Y) } if (H.call(ai) === "[object Array]") { if (!X) { ab.push.apply(ab, ai) } else { if (U.nodeType === 1) { for (var aa = 0; ai[aa] != null; aa++) { if (ai[aa] && (ai[aa] === true || ai[aa].nodeType === 1 && K(U, ai[aa]))) { ab.push(af[aa]) } } } else { for (var aa = 0; ai[aa] != null; aa++) { if (ai[aa] && ai[aa].nodeType === 1) { ab.push(af[aa]) } } } } } else { E(ai, ab) } if (V) { F(V, U, ab, ac); if (G) { hasDuplicate = false; ab.sort(G); if (hasDuplicate) { for (var aa = 1; aa < ab.length; aa++) { if (ab[aa] === ab[aa - 1]) { ab.splice(aa--, 1) } } } } } return ab }; F.matches = function(T, U) { return F(T, null, null, U) }; F.find = function(aa, T, ab) { var Z, X; if (!aa) { return [] } for (var W = 0, V = I.order.length; W < V; W++) { var Y = I.order[W], X; if ((X = I.match[Y].exec(aa))) { var U = RegExp.leftContext; if (U.substr(U.length - 1) !== "\\") { X[1] = (X[1] || "").replace(/\\/g, ""); Z = I.find[Y](X, T, ab); if (Z != null) { aa = aa.replace(I.match[Y], ""); break } } } } if (!Z) { Z = T.getElementsByTagName("*") } return { set: Z, expr: aa} }; F.filter = function(ad, ac, ag, W) { var V = ad, ai = [], aa = ac, Y, T, Z = ac && ac[0] && Q(ac[0]); while (ad && ac.length) { for (var ab in I.filter) { if ((Y = I.match[ab].exec(ad)) != null) { var U = I.filter[ab], ah, af; T = false; if (aa == ai) { ai = [] } if (I.preFilter[ab]) { Y = I.preFilter[ab](Y, aa, ag, ai, W, Z); if (!Y) { T = ah = true } else { if (Y === true) { continue } } } if (Y) { for (var X = 0; (af = aa[X]) != null; X++) { if (af) { ah = U(af, Y, X, aa); var ae = W ^ !!ah; if (ag && ah != null) { if (ae) { T = true } else { aa[X] = false } } else { if (ae) { ai.push(af); T = true } } } } } if (ah !== g) { if (!ag) { aa = ai } ad = ad.replace(I.match[ab], ""); if (!T) { return [] } break } } } if (ad == V) { if (T == null) { throw "Syntax error, unrecognized expression: " + ad } else { break } } V = ad } return aa }; var I = F.selectors = { order: ["ID", "NAME", "TAG"], match: { ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ }, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function(T) { return T.getAttribute("href") } }, relative: { "+": function(aa, T, Z) { var X = typeof T === "string", ab = X && !/\W/.test(T), Y = X && !ab; if (ab && !Z) { T = T.toUpperCase() } for (var W = 0, V = aa.length, U; W < V; W++) { if ((U = aa[W])) { while ((U = U.previousSibling) && U.nodeType !== 1) { } aa[W] = Y || U && U.nodeName === T ? U || false : U === T } } if (Y) { F.filter(T, aa, true) } }, ">": function(Z, U, aa) { var X = typeof U === "string"; if (X && !/\W/.test(U)) { U = aa ? U : U.toUpperCase(); for (var V = 0, T = Z.length; V < T; V++) { var Y = Z[V]; if (Y) { var W = Y.parentNode; Z[V] = W.nodeName === U ? W : false } } } else { for (var V = 0, T = Z.length; V < T; V++) { var Y = Z[V]; if (Y) { Z[V] = X ? Y.parentNode : Y.parentNode === U } } if (X) { F.filter(U, Z, true) } } }, "": function(W, U, Y) { var V = L++, T = S; if (!U.match(/\W/)) { var X = U = Y ? U : U.toUpperCase(); T = P } T("parentNode", U, V, W, X, Y) }, "~": function(W, U, Y) { var V = L++, T = S; if (typeof U === "string" && !U.match(/\W/)) { var X = U = Y ? U : U.toUpperCase(); T = P } T("previousSibling", U, V, W, X, Y) } }, find: { ID: function(U, V, W) { if (typeof V.getElementById !== "undefined" && !W) { var T = V.getElementById(U[1]); return T ? [T] : [] } }, NAME: function(V, Y, Z) { if (typeof Y.getElementsByName !== "undefined") { var U = [], X = Y.getElementsByName(V[1]); for (var W = 0, T = X.length; W < T; W++) { if (X[W].getAttribute("name") === V[1]) { U.push(X[W]) } } return U.length === 0 ? null : U } }, TAG: function(T, U) { return U.getElementsByTagName(T[1]) } }, preFilter: { CLASS: function(W, U, V, T, Z, aa) { W = " " + W[1].replace(/\\/g, "") + " "; if (aa) { return W } for (var X = 0, Y; (Y = U[X]) != null; X++) { if (Y) { if (Z ^ (Y.className && (" " + Y.className + " ").indexOf(W) >= 0)) { if (!V) { T.push(Y) } } else { if (V) { U[X] = false } } } } return false }, ID: function(T) { return T[1].replace(/\\/g, "") }, TAG: function(U, T) { for (var V = 0; T[V] === false; V++) { } return T[V] && Q(T[V]) ? U[1] : U[1].toUpperCase() }, CHILD: function(T) { if (T[1] == "nth") { var U = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2] == "even" && "2n" || T[2] == "odd" && "2n+1" || !/\D/.test(T[2]) && "0n+" + T[2] || T[2]); T[2] = (U[1] + (U[2] || 1)) - 0; T[3] = U[3] - 0 } T[0] = L++; return T }, ATTR: function(X, U, V, T, Y, Z) { var W = X[1].replace(/\\/g, ""); if (!Z && I.attrMap[W]) { X[1] = I.attrMap[W] } if (X[2] === "~=") { X[4] = " " + X[4] + " " } return X }, PSEUDO: function(X, U, V, T, Y) { if (X[1] === "not") { if (X[3].match(R).length > 1 || /^\w/.test(X[3])) { X[3] = F(X[3], null, null, U) } else { var W = F.filter(X[3], U, V, true ^ Y); if (!V) { T.push.apply(T, W) } return false } } else { if (I.match.POS.test(X[0]) || I.match.CHILD.test(X[0])) { return true } } return X }, POS: function(T) { T.unshift(true); return T } }, filters: { enabled: function(T) { return T.disabled === false && T.type !== "hidden" }, disabled: function(T) { return T.disabled === true }, checked: function(T) { return T.checked === true }, selected: function(T) { T.parentNode.selectedIndex; return T.selected === true }, parent: function(T) { return !!T.firstChild }, empty: function(T) { return !T.firstChild }, has: function(V, U, T) { return !!F(T[3], V).length }, header: function(T) { return /h\d/i.test(T.nodeName) }, text: function(T) { return "text" === T.type }, radio: function(T) { return "radio" === T.type }, checkbox: function(T) { return "checkbox" === T.type }, file: function(T) { return "file" === T.type }, password: function(T) { return "password" === T.type }, submit: function(T) { return "submit" === T.type }, image: function(T) { return "image" === T.type }, reset: function(T) { return "reset" === T.type }, button: function(T) { return "button" === T.type || T.nodeName.toUpperCase() === "BUTTON" }, input: function(T) { return /input|select|textarea|button/i.test(T.nodeName) } }, setFilters: { first: function(U, T) { return T === 0 }, last: function(V, U, T, W) { return U === W.length - 1 }, even: function(U, T) { return T % 2 === 0 }, odd: function(U, T) { return T % 2 === 1 }, lt: function(V, U, T) { return U < T[3] - 0 }, gt: function(V, U, T) { return U > T[3] - 0 }, nth: function(V, U, T) { return T[3] - 0 == U }, eq: function(V, U, T) { return T[3] - 0 == U } }, filter: { PSEUDO: function(Z, V, W, aa) { var U = V[1], X = I.filters[U]; if (X) { return X(Z, W, V, aa) } else { if (U === "contains") { return (Z.textContent || Z.innerText || "").indexOf(V[3]) >= 0 } else { if (U === "not") { var Y = V[3]; for (var W = 0, T = Y.length; W < T; W++) { if (Y[W] === Z) { return false } } return true } } } }, CHILD: function(T, W) { var Z = W[1], U = T; switch (Z) { case "only": case "first": while (U = U.previousSibling) { if (U.nodeType === 1) { return false } } if (Z == "first") { return true } U = T; case "last": while (U = U.nextSibling) { if (U.nodeType === 1) { return false } } return true; case "nth": var V = W[2], ac = W[3]; if (V == 1 && ac == 0) { return true } var Y = W[0], ab = T.parentNode; if (ab && (ab.sizcache !== Y || !T.nodeIndex)) { var X = 0; for (U = ab.firstChild; U; U = U.nextSibling) { if (U.nodeType === 1) { U.nodeIndex = ++X } } ab.sizcache = Y } var aa = T.nodeIndex - ac; if (V == 0) { return aa == 0 } else { return (aa % V == 0 && aa / V >= 0) } } }, ID: function(U, T) { return U.nodeType === 1 && U.getAttribute("id") === T }, TAG: function(U, T) { return (T === "*" && U.nodeType === 1) || U.nodeName === T }, CLASS: function(U, T) { return (" " + (U.className || U.getAttribute("class")) + " ").indexOf(T) > -1 }, ATTR: function(Y, W) { var V = W[1], T = I.attrHandle[V] ? I.attrHandle[V](Y) : Y[V] != null ? Y[V] : Y.getAttribute(V), Z = T + "", X = W[2], U = W[4]; return T == null ? X === "!=" : X === "=" ? Z === U : X === "*=" ? Z.indexOf(U) >= 0 : X === "~=" ? (" " + Z + " ").indexOf(U) >= 0 : !U ? Z && T !== false : X === "!=" ? Z != U : X === "^=" ? Z.indexOf(U) === 0 : X === "$=" ? Z.substr(Z.length - U.length) === U : X === "|=" ? Z === U || Z.substr(0, U.length + 1) === U + "-" : false }, POS: function(X, U, V, Y) { var T = U[2], W = I.setFilters[T]; if (W) { return W(X, V, U, Y) } } } }; var M = I.match.POS; for (var O in I.match) { I.match[O] = RegExp(I.match[O].source + /(?![^\[]*\])(?![^\(]*\))/.source) } var E = function(U, T) { U = Array.prototype.slice.call(U); if (T) { T.push.apply(T, U); return T } return U }; try { Array.prototype.slice.call(document.documentElement.childNodes) } catch (N) { E = function(X, W) { var U = W || []; if (H.call(X) === "[object Array]") { Array.prototype.push.apply(U, X) } else { if (typeof X.length === "number") { for (var V = 0, T = X.length; V < T; V++) { U.push(X[V]) } } else { for (var V = 0; X[V]; V++) { U.push(X[V]) } } } return U } } var G; if (document.documentElement.compareDocumentPosition) { G = function(U, T) { var V = U.compareDocumentPosition(T) & 4 ? -1 : U === T ? 0 : 1; if (V === 0) { hasDuplicate = true } return V } } else { if ("sourceIndex" in document.documentElement) { G = function(U, T) { var V = U.sourceIndex - T.sourceIndex; if (V === 0) { hasDuplicate = true } return V } } else { if (document.createRange) { G = function(W, U) { var V = W.ownerDocument.createRange(), T = U.ownerDocument.createRange(); V.selectNode(W); V.collapse(true); T.selectNode(U); T.collapse(true); var X = V.compareBoundaryPoints(Range.START_TO_END, T); if (X === 0) { hasDuplicate = true } return X } } } } (function() { var U = document.createElement("form"), V = "script" + (new Date).getTime(); U.innerHTML = "<input name='" + V + "'/>"; var T = document.documentElement; T.insertBefore(U, T.firstChild); if (!!document.getElementById(V)) { I.find.ID = function(X, Y, Z) { if (typeof Y.getElementById !== "undefined" && !Z) { var W = Y.getElementById(X[1]); return W ? W.id === X[1] || typeof W.getAttributeNode !== "undefined" && W.getAttributeNode("id").nodeValue === X[1] ? [W] : g : [] } }; I.filter.ID = function(Y, W) { var X = typeof Y.getAttributeNode !== "undefined" && Y.getAttributeNode("id"); return Y.nodeType === 1 && X && X.nodeValue === W } } T.removeChild(U) })(); (function() { var T = document.createElement("div"); T.appendChild(document.createComment("")); if (T.getElementsByTagName("*").length > 0) { I.find.TAG = function(U, Y) { var X = Y.getElementsByTagName(U[1]); if (U[1] === "*") { var W = []; for (var V = 0; X[V]; V++) { if (X[V].nodeType === 1) { W.push(X[V]) } } X = W } return X } } T.innerHTML = "<a href='#'></a>"; if (T.firstChild && typeof T.firstChild.getAttribute !== "undefined" && T.firstChild.getAttribute("href") !== "#") { I.attrHandle.href = function(U) { return U.getAttribute("href", 2) } } })(); if (document.querySelectorAll) { (function() { var T = F, U = document.createElement("div"); U.innerHTML = "<p class='TEST'></p>"; if (U.querySelectorAll && U.querySelectorAll(".TEST").length === 0) { return } F = function(Y, X, V, W) { X = X || document; if (!W && X.nodeType === 9 && !Q(X)) { try { return E(X.querySelectorAll(Y), V) } catch (Z) { } } return T(Y, X, V, W) }; F.find = T.find; F.filter = T.filter; F.selectors = T.selectors; F.matches = T.matches })() } if (document.getElementsByClassName && document.documentElement.getElementsByClassName) { (function() { var T = document.createElement("div"); T.innerHTML = "<div class='test e'></div><div class='test'></div>"; if (T.getElementsByClassName("e").length === 0) { return } T.lastChild.className = "e"; if (T.getElementsByClassName("e").length === 1) { return } I.order.splice(1, 0, "CLASS"); I.find.CLASS = function(U, V, W) { if (typeof V.getElementsByClassName !== "undefined" && !W) { return V.getElementsByClassName(U[1]) } } })() } function P(U, Z, Y, ad, aa, ac) { var ab = U == "previousSibling" && !ac; for (var W = 0, V = ad.length; W < V; W++) { var T = ad[W]; if (T) { if (ab && T.nodeType === 1) { T.sizcache = Y; T.sizset = W } T = T[U]; var X = false; while (T) { if (T.sizcache === Y) { X = ad[T.sizset]; break } if (T.nodeType === 1 && !ac) { T.sizcache = Y; T.sizset = W } if (T.nodeName === Z) { X = T; break } T = T[U] } ad[W] = X } } } function S(U, Z, Y, ad, aa, ac) { var ab = U == "previousSibling" && !ac; for (var W = 0, V = ad.length; W < V; W++) { var T = ad[W]; if (T) { if (ab && T.nodeType === 1) { T.sizcache = Y; T.sizset = W } T = T[U]; var X = false; while (T) { if (T.sizcache === Y) { X = ad[T.sizset]; break } if (T.nodeType === 1) { if (!ac) { T.sizcache = Y; T.sizset = W } if (typeof Z !== "string") { if (T === Z) { X = true; break } } else { if (F.filter(Z, [T]).length > 0) { X = T; break } } } T = T[U] } ad[W] = X } } } var K = document.compareDocumentPosition ? function(U, T) { return U.compareDocumentPosition(T) & 16 } : function(U, T) { return U !== T && (U.contains ? U.contains(T) : true) }; var Q = function(T) { return T.nodeType === 9 && T.documentElement.nodeName !== "HTML" || !!T.ownerDocument && Q(T.ownerDocument) }; var J = function(T, aa) { var W = [], X = "", Y, V = aa.nodeType ? [aa] : aa; while ((Y = I.match.PSEUDO.exec(T))) { X += Y[0]; T = T.replace(I.match.PSEUDO, "") } T = I.relative[T] ? T + "*" : T; for (var Z = 0, U = V.length; Z < U; Z++) { F(T, V[Z], W) } return F.filter(X, W) }; o.find = F; o.filter = F.filter; o.expr = F.selectors; o.expr[":"] = o.expr.filters; F.selectors.filters.hidden = function(T) { return T.offsetWidth === 0 || T.offsetHeight === 0 }; F.selectors.filters.visible = function(T) { return T.offsetWidth > 0 || T.offsetHeight > 0 }; F.selectors.filters.animated = function(T) { return o.grep(o.timers, function(U) { return T === U.elem }).length }; o.multiFilter = function(V, T, U) { if (U) { V = ":not(" + V + ")" } return F.matches(V, T) }; o.dir = function(V, U) { var T = [], W = V[U]; while (W && W != document) { if (W.nodeType == 1) { T.push(W) } W = W[U] } return T }; o.nth = function(X, T, V, W) { T = T || 1; var U = 0; for (; X; X = X[V]) { if (X.nodeType == 1 && ++U == T) { break } } return X }; o.sibling = function(V, U) { var T = []; for (; V; V = V.nextSibling) { if (V.nodeType == 1 && V != U) { T.push(V) } } return T }; return; l.Sizzle = F })(); o.event = { add: function(I, F, H, K) { if (I.nodeType == 3 || I.nodeType == 8) { return } if (I.setInterval && I != l) { I = l } if (!H.guid) { H.guid = this.guid++ } if (K !== g) { var G = H; H = this.proxy(G); H.data = K } var E = o.data(I, "events") || o.data(I, "events", {}), J = o.data(I, "handle") || o.data(I, "handle", function() { return typeof o !== "undefined" && !o.event.triggered ? o.event.handle.apply(arguments.callee.elem, arguments) : g }); J.elem = I; o.each(F.split(/\s+/), function(M, N) { var O = N.split("."); N = O.shift(); H.type = O.slice().sort().join("."); var L = E[N]; if (o.event.specialAll[N]) { o.event.specialAll[N].setup.call(I, K, O) } if (!L) { L = E[N] = {}; if (!o.event.special[N] || o.event.special[N].setup.call(I, K, O) === false) { if (I.addEventListener) { I.addEventListener(N, J, false) } else { if (I.attachEvent) { I.attachEvent("on" + N, J) } } } } L[H.guid] = H; o.event.global[N] = true }); I = null }, guid: 1, global: {}, remove: function(K, H, J) { if (K.nodeType == 3 || K.nodeType == 8) { return } var G = o.data(K, "events"), F, E; if (G) { if (H === g || (typeof H === "string" && H.charAt(0) == ".")) { for (var I in G) { this.remove(K, I + (H || "")) } } else { if (H.type) { J = H.handler; H = H.type } o.each(H.split(/\s+/), function(M, O) { var Q = O.split("."); O = Q.shift(); var N = RegExp("(^|\\.)" + Q.slice().sort().join(".*\\.") + "(\\.|$)"); if (G[O]) { if (J) { delete G[O][J.guid] } else { for (var P in G[O]) { if (N.test(G[O][P].type)) { delete G[O][P] } } } if (o.event.specialAll[O]) { o.event.specialAll[O].teardown.call(K, Q) } for (F in G[O]) { break } if (!F) { if (!o.event.special[O] || o.event.special[O].teardown.call(K, Q) === false) { if (K.removeEventListener) { K.removeEventListener(O, o.data(K, "handle"), false) } else { if (K.detachEvent) { K.detachEvent("on" + O, o.data(K, "handle")) } } } F = null; delete G[O] } } }) } for (F in G) { break } if (!F) { var L = o.data(K, "handle"); if (L) { L.elem = null } o.removeData(K, "events"); o.removeData(K, "handle") } } }, trigger: function(I, K, H, E) { var G = I.type || I; if (!E) { I = typeof I === "object" ? I[h] ? I : o.extend(o.Event(G), I) : o.Event(G); if (G.indexOf("!") >= 0) { I.type = G = G.slice(0, -1); I.exclusive = true } if (!H) { I.stopPropagation(); if (this.global[G]) { o.each(o.cache, function() { if (this.events && this.events[G]) { o.event.trigger(I, K, this.handle.elem) } }) } } if (!H || H.nodeType == 3 || H.nodeType == 8) { return g } I.result = g; I.target = H; K = o.makeArray(K); K.unshift(I) } I.currentTarget = H; var J = o.data(H, "handle"); if (J) { J.apply(H, K) } if ((!H[G] || (o.nodeName(H, "a") && G == "click")) && H["on" + G] && H["on" + G].apply(H, K) === false) { I.result = false } if (!E && H[G] && !I.isDefaultPrevented() && !(o.nodeName(H, "a") && G == "click")) { this.triggered = true; try { H[G]() } catch (L) { } } this.triggered = false; if (!I.isPropagationStopped()) { var F = H.parentNode || H.ownerDocument; if (F) { o.event.trigger(I, K, F, true) } } }, handle: function(K) { var J, E; K = arguments[0] = o.event.fix(K || l.event); K.currentTarget = this; var L = K.type.split("."); K.type = L.shift(); J = !L.length && !K.exclusive; var I = RegExp("(^|\\.)" + L.slice().sort().join(".*\\.") + "(\\.|$)"); E = (o.data(this, "events") || {})[K.type]; for (var G in E) { var H = E[G]; if (J || I.test(H.type)) { K.handler = H; K.data = H.data; var F = H.apply(this, arguments); if (F !== g) { K.result = F; if (F === false) { K.preventDefault(); K.stopPropagation() } } if (K.isImmediatePropagationStopped()) { break } } } }, props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), fix: function(H) { if (H[h]) { return H } var F = H; H = o.Event(F); for (var G = this.props.length, J; G; ) { J = this.props[--G]; H[J] = F[J] } if (!H.target) { H.target = H.srcElement || document } if (H.target.nodeType == 3) { H.target = H.target.parentNode } if (!H.relatedTarget && H.fromElement) { H.relatedTarget = H.fromElement == H.target ? H.toElement : H.fromElement } if (H.pageX == null && H.clientX != null) { var I = document.documentElement, E = document.body; H.pageX = H.clientX + (I && I.scrollLeft || E && E.scrollLeft || 0) - (I.clientLeft || 0); H.pageY = H.clientY + (I && I.scrollTop || E && E.scrollTop || 0) - (I.clientTop || 0) } if (!H.which && ((H.charCode || H.charCode === 0) ? H.charCode : H.keyCode)) { H.which = H.charCode || H.keyCode } if (!H.metaKey && H.ctrlKey) { H.metaKey = H.ctrlKey } if (!H.which && H.button) { H.which = (H.button & 1 ? 1 : (H.button & 2 ? 3 : (H.button & 4 ? 2 : 0))) } return H }, proxy: function(F, E) { E = E || function() { return F.apply(this, arguments) }; E.guid = F.guid = F.guid || E.guid || this.guid++; return E }, special: { ready: { setup: B, teardown: function() { } } }, specialAll: { live: { setup: function(E, F) { o.event.add(this, F[0], c) }, teardown: function(G) { if (G.length) { var E = 0, F = RegExp("(^|\\.)" + G[0] + "(\\.|$)"); o.each((o.data(this, "events").live || {}), function() { if (F.test(this.type)) { E++ } }); if (E < 1) { o.event.remove(this, G[0], c) } } } }} }; o.Event = function(E) { if (!this.preventDefault) { return new o.Event(E) } if (E && E.type) { this.originalEvent = E; this.type = E.type } else { this.type = E } this.timeStamp = e(); this[h] = true }; function k() { return false } function u() { return true } o.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = u; var E = this.originalEvent; if (!E) { return } if (E.preventDefault) { E.preventDefault() } E.returnValue = false }, stopPropagation: function() { this.isPropagationStopped = u; var E = this.originalEvent; if (!E) { return } if (E.stopPropagation) { E.stopPropagation() } E.cancelBubble = true }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = u; this.stopPropagation() }, isDefaultPrevented: k, isPropagationStopped: k, isImmediatePropagationStopped: k }; var a = function(F) { var E = F.relatedTarget; while (E && E != this) { try { E = E.parentNode } catch (G) { E = this } } if (E != this) { F.type = F.data; o.event.handle.apply(this, arguments) } }; o.each({ mouseover: "mouseenter", mouseout: "mouseleave" }, function(F, E) { o.event.special[E] = { setup: function() { o.event.add(this, F, a, E) }, teardown: function() { o.event.remove(this, F, a) } } }); o.fn.extend({ bind: function(F, G, E) { return F == "unload" ? this.one(F, G, E) : this.each(function() { o.event.add(this, F, E || G, E && G) }) }, one: function(G, H, F) { var E = o.event.proxy(F || H, function(I) { o(this).unbind(I, E); return (F || H).apply(this, arguments) }); return this.each(function() { o.event.add(this, G, E, F && H) }) }, unbind: function(F, E) { return this.each(function() { o.event.remove(this, F, E) }) }, trigger: function(E, F) { return this.each(function() { o.event.trigger(E, F, this) }) }, triggerHandler: function(E, G) { if (this[0]) { var F = o.Event(E); F.preventDefault(); F.stopPropagation(); o.event.trigger(F, G, this[0]); return F.result } }, toggle: function(G) { var E = arguments, F = 1; while (F < E.length) { o.event.proxy(G, E[F++]) } return this.click(o.event.proxy(G, function(H) { this.lastToggle = (this.lastToggle || 0) % F; H.preventDefault(); return E[this.lastToggle++].apply(this, arguments) || false })) }, hover: function(E, F) { return this.mouseenter(E).mouseleave(F) }, ready: function(E) { B(); if (o.isReady) { E.call(document, o) } else { o.readyList.push(E) } return this }, live: function(G, F) { var E = o.event.proxy(F); E.guid += this.selector + G; o(document).bind(i(G, this.selector), this.selector, E); return this }, die: function(F, E) { o(document).unbind(i(F, this.selector), E ? { guid: E.guid + this.selector + F} : null); return this } }); function c(H) { var E = RegExp("(^|\\.)" + H.type + "(\\.|$)"), G = true, F = []; o.each(o.data(this, "events").live || [], function(I, J) { if (E.test(J.type)) { var K = o(H.target).closest(J.data)[0]; if (K) { F.push({ elem: K, fn: J }) } } }); F.sort(function(J, I) { return o.data(J.elem, "closest") - o.data(I.elem, "closest") }); o.each(F, function() { if (this.fn.call(this.elem, H, this.fn.data) === false) { return (G = false) } }); return G } function i(F, E) { return ["live", F, E.replace(/\./g, "`").replace(/ /g, "|")].join(".") } o.extend({ isReady: false, readyList: [], ready: function() { if (!o.isReady) { o.isReady = true; if (o.readyList) { o.each(o.readyList, function() { this.call(document, o) }); o.readyList = null } o(document).triggerHandler("ready") } } }); var x = false; function B() { if (x) { return } x = true; if (document.addEventListener) { document.addEventListener("DOMContentLoaded", function() { document.removeEventListener("DOMContentLoaded", arguments.callee, false); o.ready() }, false) } else { if (document.attachEvent) { document.attachEvent("onreadystatechange", function() { if (document.readyState === "complete") { document.detachEvent("onreadystatechange", arguments.callee); o.ready() } }); if (document.documentElement.doScroll && l == l.top) { (function() { if (o.isReady) { return } try { document.documentElement.doScroll("left") } catch (E) { setTimeout(arguments.callee, 0); return } o.ready() })() } } } o.event.add(l, "load", o.ready) } o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","), function(F, E) { o.fn[E] = function(G) { return G ? this.bind(E, G) : this.trigger(E) } }); o(l).bind("unload", function() { for (var E in o.cache) { if (E != 1 && o.cache[E].handle) { o.event.remove(o.cache[E].handle.elem) } } }); (function() { o.support = {}; var F = document.documentElement, G = document.createElement("script"), K = document.createElement("div"), J = "script" + (new Date).getTime(); K.style.display = "none"; K.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>'; var H = K.getElementsByTagName("*"), E = K.getElementsByTagName("a")[0]; if (!H || !H.length || !E) { return } o.support = { leadingWhitespace: K.firstChild.nodeType == 3, tbody: !K.getElementsByTagName("tbody").length, objectAll: !!K.getElementsByTagName("object")[0].getElementsByTagName("*").length, htmlSerialize: !!K.getElementsByTagName("link").length, style: /red/.test(E.getAttribute("style")), hrefNormalized: E.getAttribute("href") === "/a", opacity: E.style.opacity === "0.5", cssFloat: !!E.style.cssFloat, scriptEval: false, noCloneEvent: true, boxModel: null }; G.type = "text/javascript"; try { G.appendChild(document.createTextNode("window." + J + "=1;")) } catch (I) { } F.insertBefore(G, F.firstChild); if (l[J]) { o.support.scriptEval = true; delete l[J] } F.removeChild(G); if (K.attachEvent && K.fireEvent) { K.attachEvent("onclick", function() { o.support.noCloneEvent = false; K.detachEvent("onclick", arguments.callee) }); K.cloneNode(true).fireEvent("onclick") } o(function() { var L = document.createElement("div"); L.style.width = L.style.paddingLeft = "1px"; document.body.appendChild(L); o.boxModel = o.support.boxModel = L.offsetWidth === 2; document.body.removeChild(L).style.display = "none" }) })(); var w = o.support.cssFloat ? "cssFloat" : "styleFloat"; o.props = { "for": "htmlFor", "class": "className", "float": w, cssFloat: w, styleFloat: w, readonly: "readOnly", maxlength: "maxLength", cellspacing: "cellSpacing", rowspan: "rowSpan", tabindex: "tabIndex" }; o.fn.extend({ _load: o.fn.load, load: function(G, J, K) { if (typeof G !== "string") { return this._load(G) } var I = G.indexOf(" "); if (I >= 0) { var E = G.slice(I, G.length); G = G.slice(0, I) } var H = "GET"; if (J) { if (o.isFunction(J)) { K = J; J = null } else { if (typeof J === "object") { J = o.param(J); H = "POST" } } } var F = this; o.ajax({ url: G, type: H, dataType: "html", data: J, complete: function(M, L) { if (L == "success" || L == "notmodified") { F.html(E ? o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g, "")).find(E) : M.responseText) } if (K) { F.each(K, [M.responseText, L, M]) } } }); return this }, serialize: function() { return o.param(this.serializeArray()) }, serializeArray: function() { return this.map(function() { return this.elements ? o.makeArray(this.elements) : this }).filter(function() { return this.name && !this.disabled && (this.checked || /select|textarea/i.test(this.nodeName) || /text|hidden|password|search/i.test(this.type)) }).map(function(E, F) { var G = o(this).val(); return G == null ? null : o.isArray(G) ? o.map(G, function(I, H) { return { name: F.name, value: I} }) : { name: F.name, value: G} }).get() } }); o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(E, F) { o.fn[F] = function(G) { return this.bind(F, G) } }); var r = e(); o.extend({ get: function(E, G, H, F) { if (o.isFunction(G)) { H = G; G = null } return o.ajax({ type: "GET", url: E, data: G, success: H, dataType: F }) }, getScript: function(E, F) { return o.get(E, null, F, "script") }, getJSON: function(E, F, G) { return o.get(E, F, G, "json") }, post: function(E, G, H, F) { if (o.isFunction(G)) { H = G; G = {} } return o.ajax({ type: "POST", url: E, data: G, success: H, dataType: F }) }, ajaxSetup: function(E) { o.extend(o.ajaxSettings, E) }, ajaxSettings: { url: location.href, global: true, type: "GET", contentType: "application/x-www-form-urlencoded", processData: true, async: true, xhr: function() { return l.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest() }, accepts: { xml: "application/xml, text/xml", html: "text/html", script: "text/javascript, application/javascript", json: "application/json, text/javascript", text: "text/plain", _default: "*/*"} }, lastModified: {}, ajax: function(M) { M = o.extend(true, M, o.extend(true, {}, o.ajaxSettings, M)); var W, F = /=\?(&|$)/g, R, V, G = M.type.toUpperCase(); if (M.data && M.processData && typeof M.data !== "string") { M.data = o.param(M.data) } if (M.dataType == "jsonp") { if (G == "GET") { if (!M.url.match(F)) { M.url += (M.url.match(/\?/) ? "&" : "?") + (M.jsonp || "callback") + "=?" } } else { if (!M.data || !M.data.match(F)) { M.data = (M.data ? M.data + "&" : "") + (M.jsonp || "callback") + "=?" } } M.dataType = "json" } if (M.dataType == "json" && (M.data && M.data.match(F) || M.url.match(F))) { W = "jsonp" + r++; if (M.data) { M.data = (M.data + "").replace(F, "=" + W + "$1") } M.url = M.url.replace(F, "=" + W + "$1"); M.dataType = "script"; l[W] = function(X) { V = X; I(); L(); l[W] = g; try { delete l[W] } catch (Y) { } if (H) { H.removeChild(T) } } } if (M.dataType == "script" && M.cache == null) { M.cache = false } if (M.cache === false && G == "GET") { var E = e(); var U = M.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + E + "$2"); M.url = U + ((U == M.url) ? (M.url.match(/\?/) ? "&" : "?") + "_=" + E : "") } if (M.data && G == "GET") { M.url += (M.url.match(/\?/) ? "&" : "?") + M.data; M.data = null } if (M.global && !o.active++) { o.event.trigger("ajaxStart") } var Q = /^(\w+:)?\/\/([^\/?#]+)/.exec(M.url); if (M.dataType == "script" && G == "GET" && Q && (Q[1] && Q[1] != location.protocol || Q[2] != location.host)) { var H = document.getElementsByTagName("head")[0]; var T = document.createElement("script"); T.src = M.url; if (M.scriptCharset) { T.charset = M.scriptCharset } if (!W) { var O = false; T.onload = T.onreadystatechange = function() { if (!O && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) { O = true; I(); L(); T.onload = T.onreadystatechange = null; H.removeChild(T) } } } H.appendChild(T); return g } var K = false; var J = M.xhr(); if (M.username) { J.open(G, M.url, M.async, M.username, M.password) } else { J.open(G, M.url, M.async) } try { if (M.data) { J.setRequestHeader("Content-Type", M.contentType) } if (M.ifModified) { J.setRequestHeader("If-Modified-Since", o.lastModified[M.url] || "Thu, 01 Jan 1970 00:00:00 GMT") } J.setRequestHeader("X-Requested-With", "XMLHttpRequest"); J.setRequestHeader("Accept", M.dataType && M.accepts[M.dataType] ? M.accepts[M.dataType] + ", */*" : M.accepts._default) } catch (S) { } if (M.beforeSend && M.beforeSend(J, M) === false) { if (M.global && ! --o.active) { o.event.trigger("ajaxStop") } J.abort(); return false } if (M.global) { o.event.trigger("ajaxSend", [J, M]) } var N = function(X) { if (J.readyState == 0) { if (P) { clearInterval(P); P = null; if (M.global && ! --o.active) { o.event.trigger("ajaxStop") } } } else { if (!K && J && (J.readyState == 4 || X == "timeout")) { K = true; if (P) { clearInterval(P); P = null } R = X == "timeout" ? "timeout" : !o.httpSuccess(J) ? "error" : M.ifModified && o.httpNotModified(J, M.url) ? "notmodified" : "success"; if (R == "success") { try { V = o.httpData(J, M.dataType, M) } catch (Z) { R = "parsererror" } } if (R == "success") { var Y; try { Y = J.getResponseHeader("Last-Modified") } catch (Z) { } if (M.ifModified && Y) { o.lastModified[M.url] = Y } if (!W) { I() } } else { o.handleError(M, J, R) } L(); if (X) { J.abort() } if (M.async) { J = null } } } }; if (M.async) { var P = setInterval(N, 13); if (M.timeout > 0) { setTimeout(function() { if (J && !K) { N("timeout") } }, M.timeout) } } try { J.send(M.data) } catch (S) { o.handleError(M, J, null, S) } if (!M.async) { N() } function I() { if (M.success) { M.success(V, R) } if (M.global) { o.event.trigger("ajaxSuccess", [J, M]) } } function L() { if (M.complete) { M.complete(J, R) } if (M.global) { o.event.trigger("ajaxComplete", [J, M]) } if (M.global && ! --o.active) { o.event.trigger("ajaxStop") } } return J }, handleError: function(F, H, E, G) { if (F.error) { F.error(H, E, G) } if (F.global) { o.event.trigger("ajaxError", [H, F, G]) } }, active: 0, httpSuccess: function(F) { try { return !F.status && location.protocol == "file:" || (F.status >= 200 && F.status < 300) || F.status == 304 || F.status == 1223 } catch (E) { } return false }, httpNotModified: function(G, E) { try { var H = G.getResponseHeader("Last-Modified"); return G.status == 304 || H == o.lastModified[E] } catch (F) { } return false }, httpData: function(J, H, G) { var F = J.getResponseHeader("content-type"), E = H == "xml" || !H && F && F.indexOf("xml") >= 0, I = E ? J.responseXML : J.responseText; if (E && I.documentElement.tagName == "parsererror") { throw "parsererror" } if (G && G.dataFilter) { I = G.dataFilter(I, H) } if (typeof I === "string") { if (H == "script") { o.globalEval(I) } if (H == "json") { I = l["eval"]("(" + I + ")") } } return I }, param: function(E) { var G = []; function H(I, J) { G[G.length] = encodeURIComponent(I) + "=" + encodeURIComponent(J) } if (o.isArray(E) || E.jquery) { o.each(E, function() { H(this.name, this.value) }) } else { for (var F in E) { if (o.isArray(E[F])) { o.each(E[F], function() { H(F, this) }) } else { H(F, o.isFunction(E[F]) ? E[F]() : E[F]) } } } return G.join("&").replace(/%20/g, "+") } }); var m = {}, n, d = [["height", "marginTop", "marginBottom", "paddingTop", "paddingBottom"], ["width", "marginLeft", "marginRight", "paddingLeft", "paddingRight"], ["opacity"]]; function t(F, E) { var G = {}; o.each(d.concat.apply([], d.slice(0, E)), function() { G[this] = F }); return G } o.fn.extend({ show: function(J, L) { if (J) { return this.animate(t("show", 3), J, L) } else { for (var H = 0, F = this.length; H < F; H++) { var E = o.data(this[H], "olddisplay"); this[H].style.display = E || ""; if (o.css(this[H], "display") === "none") { var G = this[H].tagName, K; if (m[G]) { K = m[G] } else { var I = o("<" + G + " />").appendTo("body"); K = I.css("display"); if (K === "none") { K = "block" } I.remove(); m[G] = K } o.data(this[H], "olddisplay", K) } } for (var H = 0, F = this.length; H < F; H++) { this[H].style.display = o.data(this[H], "olddisplay") || "" } return this } }, hide: function(H, I) { if (H) { return this.animate(t("hide", 3), H, I) } else { for (var G = 0, F = this.length; G < F; G++) { var E = o.data(this[G], "olddisplay"); if (!E && E !== "none") { o.data(this[G], "olddisplay", o.css(this[G], "display")) } } for (var G = 0, F = this.length; G < F; G++) { this[G].style.display = "none" } return this } }, _toggle: o.fn.toggle, toggle: function(G, F) { var E = typeof G === "boolean"; return o.isFunction(G) && o.isFunction(F) ? this._toggle.apply(this, arguments) : G == null || E ? this.each(function() { var H = E ? G : o(this).is(":hidden"); o(this)[H ? "show" : "hide"]() }) : this.animate(t("toggle", 3), G, F) }, fadeTo: function(E, G, F) { return this.animate({ opacity: G }, E, F) }, animate: function(I, F, H, G) { var E = o.speed(F, H, G); return this[E.queue === false ? "each" : "queue"](function() { var K = o.extend({}, E), M, L = this.nodeType == 1 && o(this).is(":hidden"), J = this; for (M in I) { if (I[M] == "hide" && L || I[M] == "show" && !L) { return K.complete.call(this) } if ((M == "height" || M == "width") && this.style) { K.display = o.css(this, "display"); K.overflow = this.style.overflow } } if (K.overflow != null) { this.style.overflow = "hidden" } K.curAnim = o.extend({}, I); o.each(I, function(O, S) { var R = new o.fx(J, K, O); if (/toggle|show|hide/.test(S)) { R[S == "toggle" ? L ? "show" : "hide" : S](I) } else { var Q = S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), T = R.cur(true) || 0; if (Q) { var N = parseFloat(Q[2]), P = Q[3] || "px"; if (P != "px") { J.style[O] = (N || 1) + P; T = ((N || 1) / R.cur(true)) * T; J.style[O] = T + P } if (Q[1]) { N = ((Q[1] == "-=" ? -1 : 1) * N) + T } R.custom(T, N, P) } else { R.custom(T, S, "") } } }); return true }) }, stop: function(F, E) { var G = o.timers; if (F) { this.queue([]) } this.each(function() { for (var H = G.length - 1; H >= 0; H--) { if (G[H].elem == this) { if (E) { G[H](true) } G.splice(H, 1) } } }); if (!E) { this.dequeue() } return this } }); o.each({ slideDown: t("show", 1), slideUp: t("hide", 1), slideToggle: t("toggle", 1), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide"} }, function(E, F) { o.fn[E] = function(G, H) { return this.animate(F, G, H) } }); o.extend({ speed: function(G, H, F) { var E = typeof G === "object" ? G : { complete: F || !F && H || o.isFunction(G) && G, duration: G, easing: F && H || H && !o.isFunction(H) && H }; E.duration = o.fx.off ? 0 : typeof E.duration === "number" ? E.duration : o.fx.speeds[E.duration] || o.fx.speeds._default; E.old = E.complete; E.complete = function() { if (E.queue !== false) { o(this).dequeue() } if (o.isFunction(E.old)) { E.old.call(this) } }; return E }, easing: { linear: function(G, H, E, F) { return E + F * G }, swing: function(G, H, E, F) { return ((-Math.cos(G * Math.PI) / 2) + 0.5) * F + E } }, timers: [], fx: function(F, E, G) { this.options = E; this.elem = F; this.prop = G; if (!E.orig) { E.orig = {} } } }); o.fx.prototype = { update: function() { if (this.options.step) { this.options.step.call(this.elem, this.now, this) } (o.fx.step[this.prop] || o.fx.step._default)(this); if ((this.prop == "height" || this.prop == "width") && this.elem.style) { this.elem.style.display = "block" } }, cur: function(F) { if (this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null)) { return this.elem[this.prop] } var E = parseFloat(o.css(this.elem, this.prop, F)); return E && E > -10000 ? E : parseFloat(o.curCSS(this.elem, this.prop)) || 0 }, custom: function(I, H, G) { this.startTime = e(); this.start = I; this.end = H; this.unit = G || this.unit || "px"; this.now = this.start; this.pos = this.state = 0; var E = this; function F(J) { return E.step(J) } F.elem = this.elem; if (F() && o.timers.push(F) && !n) { n = setInterval(function() { var K = o.timers; for (var J = 0; J < K.length; J++) { if (!K[J]()) { K.splice(J--, 1) } } if (!K.length) { clearInterval(n); n = g } }, 13) } }, show: function() { this.options.orig[this.prop] = o.attr(this.elem.style, this.prop); this.options.show = true; this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur()); o(this.elem).show() }, hide: function() { this.options.orig[this.prop] = o.attr(this.elem.style, this.prop); this.options.hide = true; this.custom(this.cur(), 0) }, step: function(H) { var G = e(); if (H || G >= this.options.duration + this.startTime) { this.now = this.end; this.pos = this.state = 1; this.update(); this.options.curAnim[this.prop] = true; var E = true; for (var F in this.options.curAnim) { if (this.options.curAnim[F] !== true) { E = false } } if (E) { if (this.options.display != null) { this.elem.style.overflow = this.options.overflow; this.elem.style.display = this.options.display; if (o.css(this.elem, "display") == "none") { this.elem.style.display = "block" } } if (this.options.hide) { o(this.elem).hide() } if (this.options.hide || this.options.show) { for (var I in this.options.curAnim) { o.attr(this.elem.style, I, this.options.orig[I]) } } this.options.complete.call(this.elem) } return false } else { var J = G - this.startTime; this.state = J / this.options.duration; this.pos = o.easing[this.options.easing || (o.easing.swing ? "swing" : "linear")](this.state, J, 0, 1, this.options.duration); this.now = this.start + ((this.end - this.start) * this.pos); this.update() } return true } }; o.extend(o.fx, { speeds: { slow: 600, fast: 200, _default: 400 }, step: { opacity: function(E) { o.attr(E.elem.style, "opacity", E.now) }, _default: function(E) { if (E.elem.style && E.elem.style[E.prop] != null) { E.elem.style[E.prop] = E.now + E.unit } else { E.elem[E.prop] = E.now } } } }); if (document.documentElement.getBoundingClientRect) { o.fn.offset = function() { if (!this[0]) { return { top: 0, left: 0} } if (this[0] === this[0].ownerDocument.body) { return o.offset.bodyOffset(this[0]) } var G = this[0].getBoundingClientRect(), J = this[0].ownerDocument, F = J.body, E = J.documentElement, L = E.clientTop || F.clientTop || 0, K = E.clientLeft || F.clientLeft || 0, I = G.top + (self.pageYOffset || o.boxModel && E.scrollTop || F.scrollTop) - L, H = G.left + (self.pageXOffset || o.boxModel && E.scrollLeft || F.scrollLeft) - K; return { top: I, left: H} } } else { o.fn.offset = function() { if (!this[0]) { return { top: 0, left: 0} } if (this[0] === this[0].ownerDocument.body) { return o.offset.bodyOffset(this[0]) } o.offset.initialized || o.offset.initialize(); var J = this[0], G = J.offsetParent, F = J, O = J.ownerDocument, M, H = O.documentElement, K = O.body, L = O.defaultView, E = L.getComputedStyle(J, null), N = J.offsetTop, I = J.offsetLeft; while ((J = J.parentNode) && J !== K && J !== H) { M = L.getComputedStyle(J, null); N -= J.scrollTop, I -= J.scrollLeft; if (J === G) { N += J.offsetTop, I += J.offsetLeft; if (o.offset.doesNotAddBorder && !(o.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(J.tagName))) { N += parseInt(M.borderTopWidth, 10) || 0, I += parseInt(M.borderLeftWidth, 10) || 0 } F = G, G = J.offsetParent } if (o.offset.subtractsBorderForOverflowNotVisible && M.overflow !== "visible") { N += parseInt(M.borderTopWidth, 10) || 0, I += parseInt(M.borderLeftWidth, 10) || 0 } E = M } if (E.position === "relative" || E.position === "static") { N += K.offsetTop, I += K.offsetLeft } if (E.position === "fixed") { N += Math.max(H.scrollTop, K.scrollTop), I += Math.max(H.scrollLeft, K.scrollLeft) } return { top: N, left: I} } } o.offset = { initialize: function() { if (this.initialized) { return } var L = document.body, F = document.createElement("div"), H, G, N, I, M, E, J = L.style.marginTop, K = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>'; M = { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" }; for (E in M) { F.style[E] = M[E] } F.innerHTML = K; L.insertBefore(F, L.firstChild); H = F.firstChild, G = H.firstChild, I = H.nextSibling.firstChild.firstChild; this.doesNotAddBorder = (G.offsetTop !== 5); this.doesAddBorderForTableAndCells = (I.offsetTop === 5); H.style.overflow = "hidden", H.style.position = "relative"; this.subtractsBorderForOverflowNotVisible = (G.offsetTop === -5); L.style.marginTop = "1px"; this.doesNotIncludeMarginInBodyOffset = (L.offsetTop === 0); L.style.marginTop = J; L.removeChild(F); this.initialized = true }, bodyOffset: function(E) { o.offset.initialized || o.offset.initialize(); var G = E.offsetTop, F = E.offsetLeft; if (o.offset.doesNotIncludeMarginInBodyOffset) { G += parseInt(o.curCSS(E, "marginTop", true), 10) || 0, F += parseInt(o.curCSS(E, "marginLeft", true), 10) || 0 } return { top: G, left: F} } }; o.fn.extend({ position: function() { var I = 0, H = 0, F; if (this[0]) { var G = this.offsetParent(), J = this.offset(), E = /^body|html$/i.test(G[0].tagName) ? { top: 0, left: 0} : G.offset(); J.top -= j(this, "marginTop"); J.left -= j(this, "marginLeft"); E.top += j(G, "borderTopWidth"); E.left += j(G, "borderLeftWidth"); F = { top: J.top - E.top, left: J.left - E.left} } return F }, offsetParent: function() { var E = this[0].offsetParent || document.body; while (E && (!/^body|html$/i.test(E.tagName) && o.css(E, "position") == "static")) { E = E.offsetParent } return o(E) } }); o.each(["Left", "Top"], function(F, E) { var G = "scroll" + E; o.fn[G] = function(H) { if (!this[0]) { return null } return H !== g ? this.each(function() { this == l || this == document ? l.scrollTo(!F ? H : o(l).scrollLeft(), F ? H : o(l).scrollTop()) : this[G] = H }) : this[0] == l || this[0] == document ? self[F ? "pageYOffset" : "pageXOffset"] || o.boxModel && document.documentElement[G] || document.body[G] : this[0][G] } }); o.each(["Height", "Width"], function(I, G) { var E = I ? "Left" : "Top", H = I ? "Right" : "Bottom", F = G.toLowerCase(); o.fn["inner" + G] = function() { return this[0] ? o.css(this[0], F, false, "padding") : null }; o.fn["outer" + G] = function(K) { return this[0] ? o.css(this[0], F, false, K ? "margin" : "border") : null }; var J = G.toLowerCase(); o.fn[J] = function(K) { return this[0] == l ? document.compatMode == "CSS1Compat" && document.documentElement["client" + G] || document.body["client" + G] : this[0] == document ? Math.max(document.documentElement["client" + G], document.body["scroll" + G], document.documentElement["scroll" + G], document.body["offset" + G], document.documentElement["offset" + G]) : K === g ? (this.length ? o.css(this[0], J) : null) : this.css(J, typeof K === "string" ? K : K + "px") } })
})();/*
 * Modified to use '@' character as template marker. [Freddie]
 */ 

$(function() {
    /*
    * jBind 1.5.3
    *
    * Copyright (c) 2009 Arash Karimzadeh (arashkarimzadeh.com)
    * Licensed under the MIT (MIT-LICENSE.txt)
    * http://www.opensource.org/licenses/mit-license.php
    *
    * Date: Jan 30 2009
    */
    $.fn.bindTo = function(data, options) {
        var defaults = {
            appendTo: null,
            root: 'data',
            onBind: null,
            onBound: null,
            fill: false
        };

        var options = $.extend(defaults, options);

        if ($.isFunction(options.onBind))
            options.onBind();
        var template = '<!--bind.template-->' + ((options.fill) ? this.html() : this.parent().html()) + '<!--bind.template-->';
        var repeaters = this.bindTo.findRepeaters(template);
        var fixedData = {};
        fixedData[options.root] = data;
        var content = this.bindTo.traverse(
									  'bind.template',
									  fixedData,
									  repeaters['<!--bind.template-->'].template,
									  repeaters,
									  'bind.template'
									 );
        if (options.fill)
            this.html(content);
        if (options.appendTo != null)
            content = $(content).appendTo($(options.appendTo));
        if ($.isFunction(options.onBound))
            options.onBound(content, data);
        return content;
    }
    $.extend($.fn.bindTo,
	{
	    templates: {},
	    traverse: function(key, data, template, repeaters, parent) {
	        if (typeof data == 'string' || typeof data == 'number') {
	            //var regExpString = "(?:%7B)" + key + "(?:%7D)\{" + key + "\}";
	            //return template.replace(new RegExp(regExpString), data);
	            return template.replace(new RegExp("\@" + key + "\@", "ig"), data);
	        } else if (typeof data == 'object') {
	            if (typeof data.length == 'undefined') {
	                if (repeaters['<!--' + parent + '-->'].action)
	                    template = $.fn.bindTo[repeaters['<!--' + parent + '-->'].action](template, data) || template;
	                for (var item in data) {
	                    if (typeof data[item] == 'object') {
	                        if (typeof repeaters['<!--' + item + '-->'] != 'undefined') {//Skip not defined templates for child in aggregate object
	                            var temp = $.fn.bindTo.traverse(item, data[item], repeaters['<!--' + item + '-->'].template, repeaters, item);
	                            template = template.replace('<!--' + item + '-->', temp);
	                        }
	                    } else {
	                        var temp = $.fn.bindTo.traverse(item, data[item], template, repeaters);
	                        template = temp;
	                    }
	                }
	                return template;
	            } else {
	                var listTemplate = '';
	                for (var item in data) {
	                    listTemplate += $.fn.bindTo.traverse(item, data[item], repeaters['<!--' + key + '-->'].template, repeaters, key);
	                }
	                return listTemplate;
	            }
	        }
	        return ''; //(handle extjs) this will return '' for function in case you extned array or object
	    },
	    findRepeaters: function(template) {
	        $this = this;
	        var templates = {};
	        var reg = new RegExp('<!--[.a-zA-Z1-9]*-->', 'g');
	        var regAction = new RegExp('<!--action:[$.a-zA-Z1-9]*-->', 'g');
	        var matches = (template.match(reg));
	        $.each(matches,
				   function() {
				       if (templates[this] != undefined)/*template is already added because end tag and start tags are the same*/
				           return true;
				       templates[this] = {};
				       var temp = template.substring(template.indexOf(this) + this.length, template.lastIndexOf(this));
				       var innerMatches = (temp.match(reg)) || [];
				       $.each(innerMatches,
							   function() {
							       if (temp.indexOf(this) > -1) {
							           var innerRepeater = temp.substring(temp.indexOf(this), temp.lastIndexOf(this) + this.length);
							           temp = temp.replace(innerRepeater, this);
							       }
							   }
						)
				       var actions = (temp.match(regAction)) || [];
				       var key = this;
				       $.each(actions,
							   function() {
							       var action = this.substring(11, this.length - 3);
							       templates[key].action = action;
							       temp = temp.replace(actions, '');
							   }
						)
				       templates[this].template = temp;
				   }
			)
	        return templates;
	    }
	}
);
    //
});
/*********/
/* TIMER */
/*********/

jQuery.fn.extend({
    everyTime: function(interval, label, fn, times, belay) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times, belay);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },
    stopTime: function(label, fn) {
        return this.each(function() {
            jQuery.timer.remove(this, label, fn);
        });
    }
});

jQuery.extend({
    timer: {
        guid: 1,
        global: {},
        regex: /^([0-9]+)\s*(.*s)?$/,
        powers: {
            // Yeah this is major overkill...
            'ms': 1,
            'cs': 10,
            'ds': 100,
            's': 1000,
            'das': 10000,
            'hs': 100000,
            'ks': 1000000
        },
        timeParse: function(value) {
            if (value == undefined || value == null)
                return null;
            var result = this.regex.exec(jQuery.trim(value.toString()));
            if (result[2]) {
                var num = parseInt(result[1], 10);
                var mult = this.powers[result[2]] || 1;
                return num * mult;
            } else {
                return value;
            }
        },
        add: function(element, interval, label, fn, times, belay) {
            var counter = 0;

            if (jQuery.isFunction(label)) {
                if (!times)
                    times = fn;
                fn = label;
                label = interval;
            }

            interval = jQuery.timer.timeParse(interval);

            if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
                return;

            if (times && times.constructor != Number) {
                belay = !!times;
                times = 0;
            }

            times = times || 0;
            belay = belay || false;

            if (!element.$timers)
                element.$timers = {};

            if (!element.$timers[label])
                element.$timers[label] = {};

            fn.$timerID = fn.$timerID || this.guid++;

            var handler = function() {
                if (belay && this.inProgress)
                    return;
                this.inProgress = true;
                if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
                    jQuery.timer.remove(element, label, fn);
                this.inProgress = false;
            };

            handler.$timerID = fn.$timerID;

            if (!element.$timers[label][fn.$timerID])
                element.$timers[label][fn.$timerID] = window.setInterval(handler, interval);

            if (!this.global[label])
                this.global[label] = [];
            this.global[label].push(element);

        },
        remove: function(element, label, fn) {
            var timers = element.$timers, ret;

            if (timers) {

                if (!label) {
                    for (label in timers)
                        this.remove(element, label, fn);
                } else if (timers[label]) {
                    if (fn) {
                        if (fn.$timerID) {
                            window.clearInterval(timers[label][fn.$timerID]);
                            delete timers[label][fn.$timerID];
                        }
                    } else {
                        for (var fn in timers[label]) {
                            window.clearInterval(timers[label][fn]);
                            delete timers[label][fn];
                        }
                    }

                    for (ret in timers[label]) break;
                    if (!ret) {
                        ret = null;
                        delete timers[label];
                    }
                }

                for (ret in timers) break;
                if (!ret)
                    element.$timers = null;
            }
        }
    }
});

if (jQuery.browser.msie)
    jQuery(window).one("unload", function() {
        var global = jQuery.timer.global;
        for (var label in global) {
            var els = global[label], i = els.length;
            while (--i)
                jQuery.timer.remove(els[i], label);
        }
    });
/// <reference path="jquery-1.3.2-vsdoc2.js" />

if (!window['Silobreaker']) {
    window['Silobreaker'] = {};

    /// <summary>The base url to the Silobreaker API.</summary>
    Silobreaker.apiBaseUrl = 'http://api.silobreaker.com/';

    /// <summary>The api key to use when calling the Silobreaker API.</summary>
    Silobreaker.apiKey = '';

    /// <summary>A global counter.</summary>
    Silobreaker.globalCounter = 2759;

    Silobreaker.getUniqueInteger = function() {
        /// <summary>Returns a unique int.</summary>
        Silobreaker.globalCounter++;
        return Silobreaker.globalCounter;
    };

    /// <summary>Click handler, if set, will be used when an item is clicked in any widget.</summary>
    Silobreaker.clickHandler = null;

    Silobreaker.injectWidget = function(element, widget) {
        /// <summary>Injects widget html template code within a DOM element and invokes the widget's initialization code.</summary>
        /// <param name="element" mayBeNull="false">An id of the DOM element OR the DOM element itself OR the JQuery object of the element.</param>
        /// <param name="widget" mayBeNull="false">The widget that will be initalized with the new template.</param>

        Silobreaker.injectWidgetTemplateFromHtml(element, widget, widget.htmlTemplate, widget.defaultCss);
    };

    Silobreaker.injectWidgetTemplateFromUrl = function(element, widget, templateUrl) {
        /// <summary>Injects widget html template code within a DOM element and invokes the widget's initialization code.</summary>
        /// <param name="element" mayBeNull="false">An id of the DOM element OR the DOM element itself OR the JQuery object of the element.</param>
        /// <param name="templateUrl" mayBeNull="false">The url from where to get the html template.</param>

        var templateHtml = $.ajax({
            url: templateUrl,
            async: false
        }).responseText;

        Silobreaker.injectWidgetTemplateFromHtml(element, widget, templateHtml);
    };

    Silobreaker.injectWidgetTemplateFromHtml = function(element, widget, htmlTemplate, defaultCss) {
        /// <summary>Injects widget html template code within a DOM element and invokes the widget's initialization code.</summary>
        /// <param name="element" mayBeNull="false">An id of the DOM element OR the DOM element itself OR the JQuery object of the element.</param>
        /// <param name="widget" mayBeNull="false">The widget that will be initalized with the new template.</param>
        /// <param name="htmlTemplate" mayBeNull="false">The html template that will be injected.</param>

        if (!widget.id)
            throw "InvalidOperationException: widget has no id.";

        var jqElements = Silobreaker.getJQueryFromElement(element);

        if (jqElements.length != 1)
            throw "No unique element found " + element;

        jqElements.html(htmlTemplate);

        // Append default style sheet to header if not added before
        if (Silobreaker.defaultCss && $('style[id=' + 'Silobreaker.defaultCss' + ']').length == 0)
            $('head').append('<style type="text/css" id="' + 'Silobreaker.defaultCss' + '">' + Silobreaker.defaultCss + '</style>');

        // Append widget style sheet to header if not added before
        if (defaultCss && $('style[id=' + widget.id + ']').length == 0)
            $('head').append('<style type="text/css" id="' + widget.id + '">' + defaultCss + '</style>');

        if (widget.initialize)
            widget.initialize(jqElements[0]);
    };


    Silobreaker.invokeApi = function(url, callback) {
        /// <summary>Invokes the Silobreaker rest API and sends the data back to a callback function.</summary>
        /// <param name="url">A relative Url to the rest api, i.e. "documents/United Nations".</param>
        /// <param name="callback">A callback function to pass the result data to.</param>

        var invokeUrl = Silobreaker.apiBaseUrl;

        if (!invokeUrl.endsWith('/'))
            invokeUrl += '/';

        invokeUrl += url;

        var separator = "?";
        if (invokeUrl.indexOf("?") != -1)
            separator = "&";
        invokeUrl += separator + "apikey=" + Silobreaker.apiKey + "&type=jsonp&callback=?";

        $.getJSON(invokeUrl, callback);
    };


    Silobreaker.getJQueryFromElement = function(element) {
        /// <summary>
        ///     Gets a jquery object from an element, an element id or a jquery object iteself
        /// </summary>
        /// <param name="element" mayBeNull="true">An id of the DOM element OR the DOM element itself OR the JQuery object of the element.</param>
        var jqElements = null;

        if (typeof element == "string")
            jqElements = $("#" + element);
        else if (element instanceof jQuery)
            jqElements = element;
        else
            jqElements = $(element);

        return jqElements;
    };

    Silobreaker.groupByItemType = function(data) {
        /// <summary>
        ///     Groups an item set on format returned from the Silobreaker API to the following format:
        ///     [{ Type: "Organization", Items: [ { Description: "United Nations", ... }, {...} ] }]
        /// </summary>
        /// <param name="data">An item set returned from the Silobreaker API. E.g.: [{Description: "United Nations", Type: "Organization" }, {...} ]</param>

        if (!data)
            throw "ArgumentNullException: data is undefined.";

        if (!$.isArray(data))
            throw "ArgumentException: data is not an array.";

        var groupedByType = {};
        for (var i = 0; i < data.length; i++) {

            var item = data[i];

            if (!groupedByType[item.Type]) {
                groupedByType[item.Type] = {};
                groupedByType[item.Type].Items = [];
                groupedByType[item.Type].Type = item.Type;
            }

            groupedByType[item.Type].Items.push(item);
        }

        var groupedData = [];
        for (property in groupedByType) {
            var item = groupedByType[property];
            groupedData.push(item);
        }

        return groupedData;
    };

    Silobreaker.decorateItemLinks = function(links, items, target) {
        /// <summary>
        ///     Decorates a set of links with href attributes pointing to correct page in Silobreaker.
        ///     Note, that this function assumes that the link contains an itemref attribute.
        /// </summary>
        /// <param name="links">
        ///     A jQuery object containing all selected links to decorate.
        /// </param>
        /// <param name="items">
        ///     Array of item data. Each item data will be attached to matching element.
        /// </param>
        /// <param name="target">
        ///     The target to assign to the anchor element. Default is "_blank".
        /// </param>

        if (!(links instanceof jQuery))
            throw "links must be a jQuery array.";

        var linkTarget = "_blank";
        if (target) {
            linkTarget = target;
        }


        // Attach item data to each link element
        Silobreaker.attachItemDataToElements(links, items);

        links.each(function() {
            var link = $(this);
            var entityId = link.attr("itemref");
            if (!entityId) {
                return;
            }
            var url = Silobreaker.getUrlForItem(entityId);
            link.attr("href", url);
            link.attr("target", linkTarget);
        });
    };

    Silobreaker.attachItemDataToElements = function(elements, items) {
        /// <summary>
        ///     Given a set of elements (having an itemref attribute)
        ///     attach corresponding item data found in the items dictionary.
        /// </summary>
        /// <param name="elements">
        ///     A jquery object containing a list of elements with itemref attributes
        ///     that should have item data attached.
        /// </param>
        /// <param name="items">
        ///     A dictionary of itemref -> itemdata
        /// </param>

        elements.each(function() {
            var element = $(this);
            var itemref = element.attr("itemref");

            var entity;
            for (index in items) {
                if (items[index].Id == itemref) {
                    entity = items[index];
                    break;
                }
            }
            if (typeof (entity) != 'undefined') {
                element.data("entity", entity)
            }
        });

    };

    Silobreaker.getUrlForItem = function(id) {
        /// <summary>
        ///     Creates an url pointing to a Silobreaker page for an item.
        /// </summary>
        /// <param name="id">The id of the item create an url for.</param>

        if (typeof (id) != "string")
            throw "Parameter id must be a string";

        if (id.beginsWith("11_") || id.beginsWith("7_")) {
            return "http://www.silobreaker.com/View360.aspx?Item=" + id;
        }
        else if (id.beginsWith("5_")) {
            return "http://www.silobreaker.com/DocumentReader.aspx?Item=" + id;
        }
        else if (id.beginsWith("16_")) {
            return "http://www.silobreaker.com/DocumentClusterReader.aspx?Item=" + id;
        }

        throw "Unknown item id.";
    };



    Silobreaker.WireUpItems = function(links, items, popupHandler, clickHandler) {
        /// <summary>
        ///     Registers hover and click events for item elements.
        /// </summary>
        /// <param name="links">
        ///     Arrray of jQuery elements to apply popup functionality to.
        /// </param>
        /// <param name="items">
        ///     [Optional] Array of item data. Each item data will be attached to matching element.
        /// </param>
        /// <param name="popupHandler">
        ///     [Optional] Popup handler that handles hover of items.
        /// </param>
        /// <param name="clickHandler">
        ///     [Optional] Click handler that handles click of items.
        /// </param>

        // Wire up the behavior when entities are clicked
        if (clickHandler) {
            clickHandler.wireUpClickBehavior(links, items);
        } else if (Silobreaker.clickHandler) {
            Silobreaker.clickHandler.wireUpClickBehavior(links, items);
        }
        else {
            Silobreaker.decorateItemLinks(links, items);
        }

        // Wire up hover popups
        if (popupHandler) {
            popupHandler.clickHandler = clickHandler;
            popupHandler.wireUpHoverBehavior(links);
        }
    };

    Silobreaker.AddBranding = function(widget, infoText, helpText) {
        /// <summary>
        ///     Surrounds a widget with Silobreaker branding.
        /// </summary>
        /// <param name="widget">
        ///     The widget to brand (as a jQuery object).
        /// </param>
        /// <param name="infoText">
        ///     Text to show in the footer of the widget.
        /// </param>
        /// <param name="helpText">
        ///     Text to show when hovering the help icon.
        /// </param>

        widget.append("<div class='footer'><a href='http://www.silobreaker.com'><img height='23' src='" + Silobreaker.apiBaseUrl + "Content/Silobreaker_logo_159px.png'/></a></div>");
        widget.prepend("<div class='header'><img src='http://www.silobreaker.com/Images/Help.gif' title='Show Help'/><div class='helptext' style='display:none;'><div class='title'>About " + infoText + "</div>" + helpText + "<div class='close'>close</div></div><div class='infotext'>" + infoText + "</div></div>");

        var popup = $(".header .helptext");
        var img = $(".header img", widget);



        img.click(function() {
            var imgPos = $(this).position();
            popup.css("top", imgPos.top + 20);
            popup.css("left", imgPos.left - popup.width() + 10);            
            popup.show();
        });

        $(".close", popup).click(function() {
            popup.hide();
        });
    };
    

    Silobreaker.UpdateInfoText = function(widget, text) {
        /// <summary>
        ///     Updated the footer text in the widget.
        /// </summary>
        /// <param name="text">
        ///     The text to show.
        /// </param>

        $(".header .infotext", widget).text(text);
    };

    /****** Helper functions for strings *****/
    String.prototype.beginsWith = function(t, i) {
        var reg = new RegExp("^" + t);
        return reg.test(this);
    };

    String.prototype.endsWith = function(t, i) {
        var reg = new RegExp(t + "$");
        return reg.test(this);
    };

    /****** Helper functions for date *****/
    Date.prototype.setIsoDate = function(string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));

        var offset = 0;
        var date = new Date(d[1], 0, 1);

        if (d[3]) { date.setMonth(d[3] - 1); }
        if (d[5]) { date.setDate(d[5]); }
        if (d[7]) { date.setHours(d[7]); }
        if (d[8]) { date.setMinutes(d[8]); }
        if (d[10]) { date.setSeconds(d[10]); }
        if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }

        offset -= date.getTimezoneOffset();
        time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };

    Date.prototype.prettyString = function() {
        var diff = (((new Date()).getTime() - this.getTime()) / 1000);
        var day_diff = Math.floor(diff / 86400);

        if (isNaN(day_diff) || day_diff < 0)
            return "";

        return day_diff == 0 && (
			diff < 60 && "just now" ||
			diff < 120 && "1 minute ago" ||
			diff < 3600 && Math.floor(diff / 60) + " minutes ago" ||
			diff < 7200 && "1 hour ago" ||
			diff < 86400 && Math.floor(diff / 3600) + " hours ago") ||
		    day_diff == 1 && "Yesterday" ||
		    day_diff < 7 && day_diff + " days ago" ||
		    this.toDateString();

    }    
};/********************************/
/****** Popup functionality *****/
/********************************/
Silobreaker.PopupUrlResolver = function() {
    this.createUrl = function(itemId, context) {
        /// <summary>
        ///     Returns Silobreaker urls to popup pages.
        /// </summary>
        var popupUrl = "";
        if (itemId.beginsWith("11_"))
            popupUrl = "/TermPopup.aspx?itemRef=" + itemId;
        else if (itemId.beginsWith("5_"))
            popupUrl = "/DocumentPopup.aspx?itemRef=" + itemId;

        if (context)
            popupUrl += "&FreetextSearchStrings=" + context;

        return "http://www.silobreaker.com" + popupUrl;
    };
};

Silobreaker.IFramePopup = function() {
    /// <summary>
    ///     A widget instanciator that creates a popup showing an iframe.
    /// </summary>
    this.popupUrlResolver = new Silobreaker.PopupUrlResolver();

    this.createPopup = function(itemData, context) {
        var url = this.popupUrlResolver.createUrl(itemData.Id, context);
        var popup = $("<iframe style='display:none; position:absolute; padding:0px; height:100%; width:400px;' scrolling='no' frameborder='0'></iframe>");
        popup.attr("src", url);
        return popup;
    };
};

Silobreaker.WidgetPopup = function(widgetName) {
    /// <summary>
    ///     A widget instanciator that creates a popup showing a widget.
    /// </summary>  
    /// <param name="widgetName">
    ///     Name of the widget. Used for logging.
    /// </param>

    var _widgetName = widgetName;

    this.popupUrlResolver = new Silobreaker.PopupUrlResolver();

    this.createPopup = function(itemData, context, clickHandler) {

        var popup = $("<div style='display:none; position:absolute; padding:0px; background-color:white;'> </div>");

        var popupWidget = null;

        if (itemData.Id.beginsWith('11_')) {
            popupWidget = new Silobreaker.EntitySummary({ context: context, entity: itemData.EntityReference, widgetName: _widgetName, operation: "Popup" });
        }

        if (popupWidget) {
            Silobreaker.injectWidget(popup, popupWidget);
            popupWidget.showPopups = false;
            popupWidget.clickHandler = clickHandler;
        }

        return popup;
    };
};

Silobreaker.EvidencePopup = function(widgetName) {
    if (widgetName && widgetName != null) {
        this.widgetName = widgetName;
    }
    
    this.createPopup = function(context, node1, node2, clickHandler) {
        var popup = $("<div style='display:none; position:absolute; padding:0px;'>EvidencePopup</div>");
        var popupWidget = new Silobreaker.Evidence({ context: context, node1: node1, node2: node2 });
        Silobreaker.injectWidget(popup, popupWidget);
        popupWidget.clickHandler = clickHandler;
        return popup;
    };
};

Silobreaker.PopupHandler = function(widgetName, clickHandler) {
    /// <summary>
    ///     Class holding functionality to show a popup when an element is hovered. 
    /// </summary>
    /// <param name="widgetName">
    ///     Name of the widget. Used for logging.
    /// </param>
    /// <param name="clickHandler">
    ///     Optionally a click handler the popup should use.
    /// </param>

    this.popupInstatiator = new Silobreaker.WidgetPopup(widgetName);
    this.clickHandler = null;

    if (clickHandler) {
        this.clickHandler = clickHandler;
    }

    var _self = this;
    var _popupElement = null;
    var _hoveredElement = null;

    this.wireUpHoverBehavior = function(links) {
        /// <summary>
        ///     Registers popup events for a set of elements.
        /// </summary>
        /// <param name="links">
        ///     Arrray of jQuery elements to apply popup functionality to.
        /// </param>

        $(links).hover(this.beginShowPopup, this.hidePopup);
    };

    this.beginShowPopup = function() {
        /// <summary>
        ///     Starts a timer that calls the showPopup method.
        /// </summary>
        _hoveredElement = $(this);
        _hoveredElement.oneTime(1000, "showpopup", _self.showPopup);
    };

    this.showPopup = function() {
        if (!_hoveredElement) {
            return;
        }

        if (_popupElement) {
            return;
        }

        var itemData = _hoveredElement.data("entity");

        var context = _self.getContext(_hoveredElement);
        _popupElement = _self.popupInstatiator.createPopup(itemData, context, _self.clickHandler);
        _popupElement.mouseleave(_self.hidePopup);

        var position = _hoveredElement.position();
        _popupElement.css("top", position.top + _hoveredElement.height());
        _popupElement.css("left", position.left);


        _popupElement.insertAfter(_hoveredElement);

        _popupElement.show();
    };


    this.hidePopup = function(event) {
        _hoveredElement.stopTime("showpopup");
        if (_popupElement) {

            if ($(event.relatedTarget).parents().index(_popupElement) == -1 && $(event.relatedTarget).parents().index(_hoveredElement) == -1) {
                _popupElement.remove();
                _popupElement = null;
            }
        }
    };

    this.getContext = function(hoveredElement) {
        var context = hoveredElement.parents("[context]");
        if (context.length > 0) {
            return $(context[0]).attr("context"); // TODO: If there are multiple parents with context, concatenate them with AND!
        }
    };
};/// <reference path="Silobreaker.js" />
/// <reference path="jquery-1.3.2-vsdoc2.js" />

Silobreaker.EntitySummary = function(params) {
    /// <summary> 
    ///     Widget showing entity summary.
    /// </summary>

    this.id = "Silobreaker.EntitySummary";
    var _instanciatedIn = null;
    var _self = this;

    this.entity = null;
    this.context = null;
    this.widgetName = null;
    this.operation = null;

    if (params) {
        if (params.entity) {
            this.entity = params.entity;
        }
        if (params.context) {
            this.context = params.context;
        }
        if (params.widgetName) {
            this.widgetName = params.widgetName;
        }
        if (params.operation) {
            this.operation = params.operation;
        }
    }

    this.searchCompleteCallback = null;
    this.clickHandler = null;
    this.popupHandler = null;
    this.dataSource = new Silobreaker.EntitySummary.DataSource();

    var _data = null;
    var _documentWidget = null;

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);
        _documentWidget = new Silobreaker.Documents();
        Silobreaker.injectWidget($(".relatedDocuments", _instanciatedIn), _documentWidget);

        if (this.entity) {
            _self.search();
        }

    };

    this.search = function() {
        var params = { entityReference: this.entity, context: this.context };
        if (this.widgetName != null)
            params.widget = this.widgetName;
        if (this.operation != null)
            params.operation = this.operation;

        this.dataSource.getSummary(this.fillTemplate, params);
    };

    this.fillTemplate = function(data) {
        /// <summary>
        ///     Updates the template with data.
        /// </summary>
        /// <param name="data">
        ///     The data to update the template with.
        /// </param>

        _data = data;
        var items = [];

        // Create a more bindable data object
        var bindableData = {};

        if (data.Extras) {
            if (data.Extras.RelatedDocuments) {
                bindableData.RelatedDocuments = data.Extras.RelatedDocuments.Items;
                $.merge(items, data.Extras.RelatedDocuments.Items);
            }

            if (data.Extras.Metadata) {
                if (data.Extras.Metadata.TextFields) {
                    bindableData.TextFields = data.Extras.Metadata.TextFields;
                }
                if (data.Extras.Metadata.ItemFields) {
                    bindableData.ItemFields = data.Extras.Metadata.ItemFields;
                    for (var i = 0; i < bindableData.ItemFields.length && typeof (bindableData.ItemFields[i]) != 'undefined'; i++) {
                        items.push(bindableData.ItemFields[i].Value);
                    }
                }
            }

            if (data.Extras.Images) {
                bindableData.Images = data.Extras.Images.Items;
                bindableData.Images[0].ImageSrc = 'src="' + bindableData.Images[0].ImageSrc + '"';
            }

            if (data.Extras.Evidence) {
                bindableData.Evidence = data.Extras.Evidence;
                items.push(data.Extras.Evidence.SnippetSource);

                // Add pretty date
                var prettyDate = new Date();
                prettyDate.setIsoDate(bindableData.Evidence.SnippetSource.PublicationDate);
                bindableData.Evidence.SnippetSource.PrettyPublicationDate = prettyDate.prettyString()
            }
        }
        bindableData.Id = data.Id;
        bindableData.Description = data.Description;
        bindableData.Type = data.Type;
        bindableData.EntityReference = data.EntityReference;

        items.push(data);

        // Inject document list
        _documentWidget.clickHandler = _self.clickHandler;
        _documentWidget.popupHandler = _self.popupHandler;
        _documentWidget.fillTemplate(data.Extras.RelatedDocuments);

        // Get the template and fill it with data
        var template = $(".contentTemplate", _instanciatedIn);
        var html = template.bindTo(bindableData);
        $(".content", _instanciatedIn).html(html);

        // Extract all items
        for (var i = 0; i < items.length && typeof (items[i]) != 'undefined'; i++) {
            var entity = items[i];
            _data[entity.Id] = entity;
        }

        var links = $(".content a[itemref]", _instanciatedIn);

        // Wire up the behavior when entities are clicked
        Silobreaker.WireUpItems(links, _data, _self.popupHandler, _self.clickHandler);
    };
};


Silobreaker.EntitySummary.DataSource = function() {
    /// <summary>Data Source class for Entity Summary Widget</summary>

    this.getSummary = function(callback, params) {
        /// <summary>
        ///     Get summary for an entity. 
        /// <param name="params">
        ///     An object containing parameters for the request. Required parameters are params.entity.
        /// </param>

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        if (!params.entityReference)
            throw "ArgumentException: No entity reference specified.";

        var url = "entity/" + params.entityReference + "?Extras=RelatedDocuments,Evidence";

        var parameters = {};

        if (params.context && params.context != null) {
            parameters.context = params.context;
        }

        if (params.widget && params.widget != null) {
            parameters.widget = params.widget;
        }

        if (params.operation && params.operation != null) {
            parameters.operation = params.operation;
        }

        url += "&" + $.param(parameters);

        Silobreaker.invokeApi(url, callback);
    };
};
Silobreaker.Documents = function(params) {
    /// <summary> 
    ///     Widget listing documents given a document query
    /// </summary>

    var _instanciatedIn = null;
    var _self = this;
    var _data = {};

    this.id = "Silobreaker.Documents";
    this.query = null;
    this.count = 10;
    this.types = null;
    this.searchCompleteCallback = null;
    this.dataSource = new Silobreaker.Documents.DataSource();
    this.clickHandler = null;
    this.popupHandler = null;

    if (params) {
        if (params.query)
            this.query = params.query;

        if (params.count)
            this.count = params.count;

        if (params.types)
            this.types = params.types;
    }

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);

        //if (this.query && this.query != "")
        //search();
    };

    this.search = function() {
        /// <summary>
        ///     Executes the search and fills the template with the result.
        /// </summary>
        $(_instanciatedIn).attr("context", this.query);

        var params = { query: this.query, count: this.count, types: this.types };
        if (_self.widgetName) {
            params.widget = _self.widgetName;
            params.operation = "Search";
        }

        this.dataSource.getDocuments(this.fillTemplate, params);
    };

    this.fillTemplate = function(data) {
        /// <summary>
        ///     Fills the template html with data.
        /// </summary>

        for (var i = 0; i < data.Items.length && typeof (data.Items[i]) != 'undefined'; i++) {
            var prettyDate = new Date();
            prettyDate.setIsoDate(data.Items[i].PublicationDate);
            data.Items[i].PrettyPublicationDate = prettyDate.prettyString();
            var document = data.Items[i];
            _data[document.Id] = document;
        }

        // Get the template and fill it with data
        var template = $(".contentTemplate", _instanciatedIn);
        var html = template.bindTo(data);
        $(".content", _instanciatedIn).html(html);
        var links = $(".content a[itemref]", _instanciatedIn);
        Silobreaker.WireUpItems(links, _data, _self.popupHandler, _self.clickHandler);

        if (_self.searchCompleteCallback) {
            _self.searchCompleteCallback(data);
        }
    };
};

Silobreaker.Documents.DataSource = function() {
    /// <summary>Data Source class for Documents Widget</summary>
    
    this.getDocuments = function(callback, params) {
        /// <summary>
        ///     Get documents based on a set of parameters. Supported parameters are:
        ///     query (the query to use, optional),
        ///     count (number of documents to retrieve, optional)
        /// </summary>
        /// <param name="callback">
        ///     The callback function to call when data is retrieved.
        /// </param>
        /// <param name="params">
        ///     An object containing parameters for the request.
        /// </param>

        var url = "documents/";

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        var querySet = params.query && params.query != null && params.query != "";

        if (querySet)
            url += params.query;

        if (params.types && params.types != null && params.types.length > 0) {
            if (!querySet) {
                url += "~";
            }

            url += "/" + params.types.join(",");
        }

        var parameters = {};

        if (params.count)
            parameters.pageSize = params.count;

        if (params.widget)
            parameters.widget = params.widget;

        if (params.operation)
            parameters.operation = params.operation;

        url += "?" + $.param(parameters);

        Silobreaker.invokeApi(url, callback);
    };
};
Silobreaker.Evidence = function(params) {
    /// <summary>
    /// View evidence between 2 items given a context
    /// of the form {name: <display name>, id: <search friendly id>}
    /// </summary>
    /// <param name="context">The context filter. Required.</param>
    ///
    /// <param name="node1">First item to obtain evidence about.
    /// {name: <display name>, id: <search friendly id>}
    /// Required.</param>
    ///
    /// <param name="node2">Second item to obtain evidence about.
    /// {name: <display name>, id: <search friendly id>}
    /// Required. </param>
    ///
    /// <param name="count">Number of evidence documents. Optional.</param>

    var _instanciatedIn = null;
    var _self = this;
    var _documents = null;

    this.id = "Silobreaker.Evidence";
    this.widgetName = null;
    this.operation = null;
    this.searchCompleteCallback = null;
    this.dataSource = null; // Data source for documents instance
    this.context = null;
    this.node1 = null;
    this.node2 = null;
    this.count = null;
    this.popupHandler = null;
    this.clickHandler = null;
    this.dataSource = new Silobreaker.Evidence.DataSource();

    if (!params) {
        throw "ArgumentNullException: No parameters specified.";
    }

    if (params.context) {
        this.context = params.context;
    }
    else {
        throw "ArgumentException: No context specified.";
    }

    if (params.node1) {
        this.node1 = params.node1;
    }
    else {
        throw "ArgumentException: No node1 specified.";
    }

    if (params.node2) {
        this.node2 = params.node2;
    }
    else {
        throw "ArgumentException: No node2 specified.";
    }

    if (params.count) {
        this.count = params.count;
    }

    if (params.count) {
        this.count = params.count;
    }
    if (params.widgetName) {
        this.widgetName = params.widgetName;
    }
    if (params.operation) {
        this.operation = params.operation;
    }    


    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on
        /// </param>

        if (element == null)
            throw "ArgumentNullException: No element specified.";

        _instanciatedIn = $(element);
        _documentWidget = new Silobreaker.Documents();
        Silobreaker.injectWidget($(".evidenceDocuments", _instanciatedIn), _documentWidget);

        if (this.context && this.context != "") {
            _self.search();
        }
    };

    this.search = function() {
        $(_instanciatedIn).attr("context", _self.context);
        var params = { entities: _self.node1.id + "," + _self.node2.id, context: _self.context};
        if (this.widgetName != null)
            params.widget = this.widgetName;
        if (this.operation != null)
            params.operation = this.operation;
            
        this.dataSource.getEvidence(this.fillTemplate, params);
    };

    this.fillTemplate = function(data) {

        var itemData = {};

        // Title
        var contentTemplate = $(".contentTemplate", _instanciatedIn);

        var bindableData = {};
        bindableData.node1 = _self.node1.name;
        bindableData.node2 = _self.node2.name;
        bindableData.context = _self.context;
        if (data.Extras && data.Extras.Evidence) {
            bindableData.Evidence = data.Extras.Evidence;

            // Add pretty date
            var prettyDate = new Date();
            prettyDate.setIsoDate(bindableData.Evidence.SnippetSource.PublicationDate);
            bindableData.Evidence.SnippetSource.PrettyPublicationDate = prettyDate.prettyString()
        }


        titleHtml = contentTemplate.bindTo(bindableData);
        $(".content", _instanciatedIn).html(titleHtml);

        // Search further
        var searchFurther = $(".searchFurtherAnchor", _instanciatedIn);
        var searchFurtherUrl = _self.searchUri(); // TODO: Make this a real url
        searchFurther.attr("href", searchFurtherUrl);

        // Inject document list
        _documentWidget.clickHandler = self.clickHandler;
        _documentWidget.popupHandler = self.popupHandler;
        _documentWidget.fillTemplate(data.Extras.RelatedDocuments);

        // Wire up item links
        if (data.Extras && data.Extras.Evidence) {
            itemData[data.Extras.Evidence.SnippetSource.Id] = data.Extras.Evidence.SnippetSource;
        }
        
        var links = $(".content a[itemref]", _instanciatedIn);
        Silobreaker.WireUpItems(links, itemData, self.popupHandler, self.clickHandler);

    };

    this.searchUri = function() {
        return "http://www.silobreaker.com/Search.aspx?q=itemref:" + _self.node1.id + " and itemref:" + _self.node2.id + " and " + _self.context;
    };
};

Silobreaker.Evidence.DataSource = function() {
    /// <summary>Data Source class for Evidence Widget</summary>

    this.getEvidence = function(callback, params) {
        /// <summary>
        ///     Get evidence for two entities
        /// <param name="params">
        ///     An object containing parameters for the request. Required parameters are params.entities.
        /// </param>

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        if (!params.entities)
            throw "ArgumentException: No entities specified.";

        var url = "evidence/" + params.entities;

        var parameters = {};

        if (params.context && params.context != null) {
            parameters.context = params.context;
        }

        if (params.widget && params.widget != null) {
            parameters.widget = params.widget;
        }

        if (params.operation && params.operation != null) {
            parameters.operation = params.operation;
        }

        url += "?" + $.param(parameters);

        Silobreaker.invokeApi(url, callback);
    };
};
/// <reference path="Silobreaker.js" />
/// <reference path="jquery-1.3.2-vsdoc2.js" />

Silobreaker.InFocus = function(params) {
    /// <summary> 
    ///     Widget listing entities related to a document search query 
    /// </summary>

    this.id = "Silobreaker.InFocus";
    var _instanciatedIn = null;
    var _self = this;
    var _helptext = "The list shows the most related people, companies, organisations, places and keyphrases to the search term in question. By hovering over a name you can see how it fits in.";

    this.query = null;
    this.types = ["Person", "Company", "Organization", "City", "Keyphrase"];
    this.count = 10;
    this.moreCount = this.count * 2;
    this.showPopups = true;
    this.searchCompleteCallback = null;
    this.dataSource = new Silobreaker.InFocus.DataSource();
    this.clickHandler = null;
    this.popupHandler = new Silobreaker.PopupHandler("InFocus");

    if (params) {
        if (params.types && $.isArray(params.types) && params.types.length > 0) {
            this.types = params.types;
        }

        if (params.query) {
            this.query = params.query;
        }

        if (params.count) {
            this.count = params.count;
            this.moreCount = this.count * 2;
        }

        if (params.moreCount) {
            this.moreCount = params.moreCount;
        }

        if (params.showPopups == false) {
            this.showPopups = false;
        }
    }

    var _data = {};
    var _displayCountPerType = {};

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);

        Silobreaker.AddBranding($(".widget", _instanciatedIn), "Silobreaker In Focus Widget", _helptext);

        _self.search();
    };

    this.search = function() {
        /// <summary>
        ///     Executes the search and fills the template with the result.
        /// </summary>
        if (this.query && this.query != null) {
            $(_instanciatedIn).attr("context", this.query);
        }

        // Set the display count for each type        
        for (var i = 0; i < this.types.length; i++) {
            _displayCountPerType[this.types[i]] = this.count;
        }

        // Clean the data object and request the datasource
        _data = {};
        var params = { query: this.query, count: this.count, types: this.types, widget: "InFocus", operation: "Search"};
        this.dataSource.getEntities(updateListWithData, params);
    };

    this.fillTemplate = function() {
        /// <summary>
        ///     Fills the template html with data.
        /// </summary>

        // Group the data into types
        var entities = [];

        for (index in _data) {
            entities.push(_data[index]);
        }
        var groupedData = Silobreaker.groupByItemType(entities);

        // Make sure we display the correct number of entities per each type
        var actualCountPerType = {};

        for (var i = 0; i < groupedData.length && typeof (groupedData[i]) != 'undefined'; i++) {
            var typeName = groupedData[i].Type;
            var count = _displayCountPerType[typeName];
            if (groupedData[i].Items.length > count) {
                groupedData[i].Items.length = count;
            }

            actualCountPerType[typeName] = groupedData[i].Items.length;
        }

        // Get the template and fill it with data
        var template = $(".contentTemplate", _instanciatedIn);
        var html = template.bindTo(groupedData);
        $(".content", _instanciatedIn).html(html);

        // Remove last separator from each list
        $(".separator:last", $(".content .typeList", _instanciatedIn)).remove();

        // Find all item links
        var links = $(".content a[itemref]", _instanciatedIn);

        var popupHandler = null;
        if (_self.showPopups) {
            popupHandler = _self.popupHandler;
        }

        Silobreaker.WireUpItems(links, _data, popupHandler, _self.clickHandler);

        // Wire up Show More click links
        wireUpShowMore(actualCountPerType);

        // Update help text
        if (!_self.query || _self.query == "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Most frequent mentioned entities");
        }
        else if (entities.length == 0) {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "No related entities found to " + _self.query);
        }
        else if (_self.query && _self.query != "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Most related entities to " + _self.query);
        }


        // Fire callback for search complete
        if (_self.searchCompleteCallback)
            _self.searchCompleteCallback();
    };

    this.showMore = function(typeName) {
        /// <summary>Expands the entity list with more entities of a specific type.</summary>
        /// <param name="typeName">The name of the entity type.</param>
        _displayCountPerType[typeName] = this.moreCount;

        var entityCount = 0;

        for (var i = 0; i < _data.length; i++) {
            if (_data[i].Type == typeName)
                entityCount++;
        }

        // If we already have enough entities of this type, just refresh the html
        if (entityCount > this.count) {
            _self.fillTemplate();
            return;
        }

        // Request Api for more entities
        var params = { query: this.query, count: this.moreCount, types: [typeName], widget: "InFocus", operation: "ShowMore" };
        this.dataSource.getEntities(updateListWithData, params);
    };

    this.showLess = function(typeName) {
        /// <summary>Expands the entity list with more entities of a specific type.</summary>
        /// <param name="typeName">The name of the entity type.</param>
        _displayCountPerType[typeName] = this.count;
        _self.fillTemplate();
    };

    var updateListWithData = function(data) {
        /// <summary>
        ///     Updates the list with data.
        /// </summary>
        /// <param name="data">
        ///     The data to update the list with.
        /// </param>

        for (var i = 0; i < data.Items.length && typeof (data.Items[i]) != 'undefined'; i++) {
            var entity = data.Items[i];
            _data[entity.Id] = entity;
        }

        _self.fillTemplate();
    };

    var wireUpShowMore = function(actualCountPerType) {
        /// <summary>Sets up behvior for show more buttons.</summary>
        /// <param name="actualCountPerType">
        ///     Hashtable containing actual number of entities per type.
        /// </param>

        $(".content .showMore", _instanciatedIn).each(function() {

            var link = $(this);
            link.unbind("click"); // unbind any old show more click event

            var typeName = link.attr("data");
            if (_displayCountPerType[typeName] > _self.count) {
                // Show less
                link.html("[less]");

                // Wire up click
                link.one("click", function() {
                    var typeName = $(this)[0].attributes["data"].value;
                    _self.showLess(typeName);
                });
            }
            else if (_displayCountPerType[typeName] == actualCountPerType[typeName]) {
                // Show more
                link.html("[more]");

                // Wire up click
                link.one("click", function() {
                    $(this).html("[Loading...]");
                    var typeName = $(this)[0].attributes["data"].value;
                    _self.showMore(typeName);
                });
            } else {
                link.remove();
            }
        });
    };
};

Silobreaker.InFocus.DataSource = function() {
    /// <summary>Data Source class for InFocus Widget</summary>

    this.getEntities = function(callback, params) {
        /// <summary>
        ///     Get entities based on a set of parameters. Supported parameters are: 
        ///     types (array of type names, required), 
        ///     count (number of entities to retrieve for each type, required), 
        ///     query (the query to use, optional)
        /// </summary>
        /// <param name="callback">
        ///     The callback function to call when data is retrieved.
        /// </param>
        /// <param name="params">
        ///     An object containing parameters for the request. Required parameters are params.types and params.count.
        /// </param>

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        if (!params.types)
            throw "ArgumentException: No entity types specified.";

        if (!params.count)
            throw "ArgumentException: No count specified.";

        var url = "documents/";

        var query = "~";
        if (params.query && params.query != null) {
            query = params.query;
        }

        url += query + "/entities";
        url += "/" + params.types.join(",");

        url += "?entityTypeLimits=";
        var counts = [];
        for (var i = 0; i < params.types.length; i++) {
            counts.push(params.count);
        }
        url += counts.join(",");

        var parameters = {};

        if (params.widget)
            parameters.widget = params.widget;

        if (params.operation)
            parameters.operation = params.operation;

        url += "&" + $.param(parameters);

        Silobreaker.invokeApi(url, callback);
    };
};/// <reference path="Silobreaker.js" />
/// <reference path="jquery-1.3.2-vsdoc2.js" />

Silobreaker.Network = function(params) {
    /// <summary> 
    ///     Widget showing related entities in an interactive network.
    /// </summary>
    /// <param name="params">
    ///     Object containing paramters for initializing a network. The following parameters are available:
    ///
    ///     width: Integer declaring the desired width of the network. Can be omitted and will then be set to 900 pixels.
    ///     height: Integer declaring the desired height of the network. Can be omitted and will then be set to 900 pixels.
    ///     showSliders: Boolean declaring if entity type sliders should be visible in the network. Default is true.
    ///     showTrashcan: Boolean declaring if trash can should be visible in the network. Default is true.
    ///     showZoom: Boolean declaring if zoom slider should be visible in the network. Default is true.
    /// </param>

    this.id = "Silobreaker.Network";

    var _instanciatedIn = null;
    var _self = this;
    var _itemData = {};

    // A unique id for this widget instance.
    // Used when assigning a unique id to a div element in the template html,
    // and creating a unique javascript function callback from the flash app.
    var _uniqueId = "Network" + Silobreaker.getUniqueInteger().toString();
    var _uniqueNodePopupName = _uniqueId + "_NodePopup";
    var _uniqueEvidencePopupName = _uniqueId + "_EvidencePopup";

    var _helptext = "The network shows connections found in the news flow. By hovering over a name or the midpoint of any relationship you can see how the name or the connection fits in.";

    var _showSliders = true;
    var _showTrashcan = true;
    var _showZoom = true;
    var _width = 900;
    var _height = 600;

    this.query = "";
    this.totalNodes = 20;
    this.expandEntities = [];
    this.includeEntities = [];
    this.highlightEntities = [];
    this.showPopups = true;
    this.clickHandler = null;
    this.searchCompleteCallback = null;
    this.dataSource = new Silobreaker.Network.DataSource();
    this.popupHandler = null;

    var _popupHandler = null;

    // Set values from params object
    if (params) {
        if (params.width) {
            _width = params.width;
        }

        if (params.height) {
            _height = params.height;
        }

        if (params.showSliders == false) {
            _showSliders = false;
        }

        if (params.showTrashcan == false) {
            _showTrashcan = false;
        }

        if (params.showZoom == false) {
            _showZoom = false;
        }

        if (params.showPopups == false) {
            this.showPopups = false;
        }

        if (params.query) {
            this.query = params.query;
        }

        if (params.totalNodes) {
            this.totalNodes = params.totalNodes;
        }

        if (params.highlightEntities) {
            this.highlightEntities = params.highlightEntities;
        }
    }

    var types = ["Company", "Organization", "Person", "City", "Keyphrase"];
    var typesCount = [];

    var imagesBaseUrl = "http://www.silobreaker.com/Images/";
    var companyImage = imagesBaseUrl + "IcCompany.gif";
    var personImage = imagesBaseUrl + "IcPerson.gif";
    var organizationImage = imagesBaseUrl + "IcOrganization.gif";
    var cityImage = imagesBaseUrl + "IcCity.gif";
    var keyphraseImage = imagesBaseUrl + "IcKeyphrase.gif";

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);

        createGlobalFlashFunction();
        createFlashObject();
        setWidgetSize();
        attachMouseWheelEventListeners();
        if (_self.showPopups) {
            if (_self.popupHandler) {
                _popupHandler = _self.popupHandler;
            }
            else {
                _popupHandler = new Silobreaker.Network.PopupHandler($(".content", _instanciatedIn));
            }
            _popupHandler.clickHandler = _self.clickHandler;
        }

        Silobreaker.AddBranding($(".widget", _instanciatedIn), "Silobreaker Network Widget", _helptext);
    };

    this.search = function() {
        /// <summary>
        ///     Executes a search on the network.
        /// </summary>

        if (this.query && this.query != null) {
            $(_instanciatedIn).attr("context", this.query);
        }

        internalSearch(types, typesCount, this.totalNodes, this.expandEntities, "Search");
    };

    var internalSearch = function(types, typesCount, totalNoNodes, expandEntities, operation) {
        /// <summary>
        ///     Performs the search for a network.
        /// </summary>
        /// <param name="types">
        ///     Array of entity types that should be included in the network.
        /// </param>
        /// <param name="typesCount">
        ///     Array of integers representing the count for each type that should be included in the network.
        /// </param>
        /// <param name="totalNoNodes">
        ///     Integer declaring the number of nodes to be returned for the network.
        /// </param>
        /// <param name="expandEntities">
        ///     Array of entity ids of entities that should be expanded in the network.
        /// </param>
        /// <param name="operation">
        ///     The operation for the network. Typical "Search", "Expand" or "Slider"
        /// </param>

        _self.types = types;

        var exEntities = [];
        if (_self.expandEntities && _self.expandEntities.length > 0) {
            exEntities = _self.expandEntities;
        }
        if (expandEntities && expandEntities.length > 0) {
            for (var i = 0; i < expandEntities.length; i++) {
                if ($.inArray(expandEntities[i], exEntities) == -1) {
                    exEntities.push(expandEntities[i]);
                }
            }
        }

        var incEntities = [];
        if (_self.includeEntities && _self.includeEntities.length > 0) {
            for (var i = 0; i < _self.includeEntities.length; i++) {
                if ($.inArray(_self.includeEntities[i], incEntities) == -1) {
                    incEntities.push(_self.includeEntities[i]);
                }
            }
        }

        var params = { query: _self.query, types: types, typesCount: typesCount, totalNoNodes: totalNoNodes, expandEntities: exEntities, includeEntities: incEntities, widget: "Network", operation: operation };
        _self.dataSource.getGraph(_self.getGraphDone, params);
    };

    var createGlobalFlashFunction = function() {
        /// <summary>
        ///     Creates a global unique function for the flash object to call when it wants to retrieve data.
        /// </summary>
        window[_uniqueId] = function(types, typesCount, totalNoNodes, expandEntities) {
            // Default operation is search
            var operation = "Search";

            // If types are defined, the sliders has been used
            if (typesCount && typesCount.length > 0) {
                operation = "Slider";
            }

            // If expand entites are defined, we have expanded
            if (expandEntities && expandEntities.length > 0) {
                operation = "Expand";
            }

            internalSearch(types, typesCount, totalNoNodes, expandEntities, operation);
        };


        if (_self.showPopups == true) {
            window[_uniqueNodePopupName] = function(x, y, itemId, width, height, context, divId) {
                var item = _itemData[itemId]
                _popupHandler.showNodePopup(x, y, item, width, height, _self.query);
            };

            window[_uniqueEvidencePopupName] = function(x, y, width, height, fromId, fromName, toId, toName) {
                _popupHandler.showEvidencePopup(x, y, width, height, fromId, fromName, toId, toName, _self.query);
            }
        }
    };

    var createFlashObject = function() {
        /// <summary>
        ///     Creates the network flash object and set all parameters on it.
        /// </summary>    
        var flashvars = {
            maxItems: _self.totalNodes.toString(),
            drillDownFilter: _self.query,
            getDataFunctionName: _uniqueId,
            imagePerson: personImage,
            imageCompany: companyImage,
            imageCity: cityImage,
            imageKeyphrase: keyphraseImage,
            imageOrganization: organizationImage,
            highlightItems: _self.includeEntities.concat(_self.highlightEntities).join(","),
            showSliders: _showSliders.toString(),
            trashcanVisibility: _showTrashcan.toString(),
            zoomVisibility: _showZoom.toString()
        };

        if (_self.showPopups == true) {
            flashvars.showNodePopupFunctionName = _uniqueNodePopupName;
            flashvars.showEvidencePopupFunctionName = _uniqueEvidencePopupName;
        }

        var params = {
            wmode: "transparent",
            quality: "autohigh",
            allowscriptaccess: "always"
        };

        $(".networkDiv", _instanciatedIn)[0].id = _uniqueId;

        silobreaker_swfobject.embedSWF(Silobreaker.apiBaseUrl + "Content/Network-v10.swf", _uniqueId, _width.toString(), _height.toString(), "9.0.0", null, flashvars, params, {});

    };

    var attachMouseWheelEventListeners = function() {
        /// <summary>
        ///     Adds event listeners to the mouse scroll wheel.
        /// </summary>

        var contentDOMElement = $(".content", _instanciatedIn)[0];
        if (contentDOMElement.addEventListener) {
            contentDOMElement.addEventListener('DOMMouseScroll', mouseWheelCallback, false);
        }
        else if (contentDOMElement.attachEvent)
            contentDOMElement.attachEvent("onmousewheel", mouseWheelCallback);
    };

    var mouseWheelCallback = function(e) {
        /// <summary>
        ///     The callback used for the mouse scroll wheel. Passes the wheel data to the flash app.
        /// </summary>

        e = e ? e : window.event;
        var scrollDist = e.detail ? e.detail * -1 : e.wheelDelta / 40;

        var flashobj = $("#" + _uniqueId, _instanciatedIn)[0];
        if (flashobj && flashobj.scrollWheel)
            flashobj.scrollWheel(scrollDist);

        if (e.stopPropagation)
            e.stopPropagation();
        if (e.preventDefault)
            e.preventDefault();
        e.cancelBubble = true;
        e.cancel = true;
        e.returnValue = false;
        return false;
    };

    var setWidgetSize = function() {
        /// <summary>
        ///     Sets the size of the widget as a css directive on the widget div.
        /// </summary>
        $(".widget", _instanciatedIn).css("width", _width.toString() + "px");
    };

    this.getGraphDone = function(data) {
        /// <summary>
        ///     Passes the graph data to the flash object.
        /// </summary>
        /// <param name="data">
        ///     Data to send to the flash object.
        /// </param>

        // Iterate over all nodes and store the data internally
        for (var i = 0; i < data.Nodes.length && typeof (data.Nodes[i]) != 'undefined'; i++) {
            _itemData[data.Nodes[i].Id] = data.Nodes[i];
        }

        var networkDOMobject = $("#" + _uniqueId, _instanciatedIn)[0];
        if (networkDOMobject.receiveData) {
            networkDOMobject.receiveData(data);
        }

        // Update help text
        if (!_self.query || _self.query == "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Network on most frequent mentioned entities");
        }
        else if (_itemData.length == 0) {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "No network found for " + _self.query);
        }
        else if (_self.query && _self.query != "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Network around " + _self.query);
        }

        // Fire callback for search complete
        if (_self.searchCompleteCallback)
            _self.searchCompleteCallback();
    };
};


Silobreaker.Network.DataSource = function() {
    /// <summary>Data Source class for Network Widget</summary>

    this.getGraph = function(callback, params) {
        /// <summary>
        /// </summary>
        /// <param name="callback">
        ///     The callback function to call when data is retrieved.
        /// </param>
        /// <param name="params">
        ///     An object containing parameters for the request.
        /// </param>

        var url = this.createApiUrl(params);
        Silobreaker.invokeApi(url, callback);
    };

    this.createApiUrl = function(params) {
        /// <summary>
        /// Creates an url for retrieving graph data from Silobreaker API.
        /// </summary>
        /// <param name="callback">
        ///     The callback function to call when data is retrieved.
        /// </param>
        /// <param name="params">
        ///     An object containing parameters for the request. Required parameters are params.query.
        /// </param>

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        var query = "~";
        if (params.query) {
            query = params.query;
        }

        if (!params.totalNoNodes)
            param.totalNoNodes = 20;

        var url = "entitygraph/" + query;

        url += "/" + params.types.join(",");

        var parameters = {};

        if (params.typesCount && params.typesCount.length > 0) {
            parameters.entityTypeLimits =  params.typesCount.join(",");
        }
        else {
            parameters.noNodes = params.totalNoNodes.toString();
        }

        if (params.includeEntities && params.includeEntities.length > 0) {
            parameters.graphEntities = params.includeEntities.join(",");
        }

        if (params.expandEntities && params.expandEntities.length > 0) {
            parameters.expandEntities = params.expandEntities.join(",");
        }

        if (params.widget && params.widget != null) {
            parameters.widget = params.widget;
        }

        if (params.operation && params.operation != null) {
            parameters.operation = params.operation;
        }

        url += "?" + $.param(parameters);

        return url;
    };
};


Silobreaker.Network.PopupHandler = function(networkElement) {
    /// <summary>
    /// Popup handler specific for the flash network application.
    /// </summary>
    /// <param name="networkElement">
    ///     The DOM element (jQuery object) where the flash network resides.
    /// </param>

    this.nodePopupInstatiator = new Silobreaker.WidgetPopup("Network");
    this.evidencePopupInstantiator = new Silobreaker.EvidencePopup("Network");
    this.clickHandler = null;

    var _self = this;
    var _popupElement = null;
    var _hoveredElement = null;
    var _networkElement = networkElement;

    this.showPopup = function(x, y, popupElement, itemWidth, itemHeight) {
        /// <summary>
        ///     Shows the popup at the specified position.
        /// </summary>
        /// <param name="x">
        ///     Specifies the left corner (relative to the network element) where to place the popup.
        /// </param>
        /// <param name="y">
        ///     Specifies the upper corner (relative to the network element) where to place the popup.
        /// </param>
        /// <param name="popupElement">
        ///     Content of the popup
        /// </param>
        /// <param name="itemWidth">
        ///     Specifies the width of the bounding box where to trigger the popup.
        /// </param>
        /// <param name="itemHeight">
        ///     Specifies the hight of the bounding box where to trigger the popup.
        /// </param>
        /// <param name="context">
        ///     Optionally, the context to use. 
        /// </param>

        var networkPosition = _networkElement.position();

        // Create a dummy div surrounding the hovered element in the flash app
        var dummyDiv = $("<div></div>");
        dummyDiv.css("width", itemWidth);
        dummyDiv.css("height", itemHeight);
        dummyDiv.css("background-color", "red");
        dummyDiv.css("filter", "alpha(opacity=0)");
        dummyDiv.css("-moz-opacity", "0.0");
        dummyDiv.css("-khtml-opacity", "0.0");
        dummyDiv.css("opacity", "0.0");
        dummyDiv.css("position", "absolute");
        dummyDiv.css("top", y + networkPosition.top - itemHeight);
        dummyDiv.css("left", x + networkPosition.left);

        // Insert the dummy div to the network
        dummyDiv.insertAfter(_networkElement);
        dummyDiv.mouseleave(_self.hidePopup);

        // Make the dummy div the "hovered element"
        if (_hoveredElement != null)
            _hoveredElement.remove();
        _hoveredElement = dummyDiv;

        // Create the popup element
        var hoveredElementPosition = _hoveredElement.position();
        if (_popupElement != null) {
            _popupElement.remove();
        }
        _popupElement = popupElement; // _self.popupInstatiator.createPopup(itemId, context, _self.clickHandler);
        _popupElement.mouseleave(_self.hidePopup);
        _popupElement.css("left", x + networkPosition.left);
        _popupElement.css("top", y + networkPosition.top);
        _popupElement.insertAfter(_hoveredElement);
        _popupElement.show();

    };

    this.hidePopup = function(event) {
        /// <summary>
        ///     Hides the popup.
        /// </summary>
        /// <param name="event">
        ///     The event object passed when hover out is fired.
        /// </param>

        //alert("hidepopup");
        if ($(event.relatedTarget).parents().index(_popupElement) == -1 && $(event.relatedTarget).parents().index(_hoveredElement) == -1) {
            if (_hoveredElement) {
                _hoveredElement.remove();
                _hoveredElement = null;
            }

            if (_popupElement) {
                _popupElement.remove();
                _popupElement = null;
            }
        }
    };

    this.showNodePopup = function(x, y, item, itemWidth, itemHeight, context) {
        var popupElement = _self.nodePopupInstatiator.createPopup(item, context, _self.clickHandler);
        _self.showPopup(x, y, popupElement, itemWidth, itemHeight);
    };

    this.showEvidencePopup = function(x, y, itemWidth, itemHeight, fromId, fromName, toId, toName, context) {
        var node1 = { id: fromId, name: fromName };
        var node2 = { id: toId, name: toName };
        var popupElement = _self.evidencePopupInstantiator.createPopup(context, node1, node2, _self.clickHandler);
        _self.showPopup(x, y, popupElement, itemWidth, itemHeight);
    };
};
    /// <reference path="Silobreaker.js" />
/// <reference path="jquery-1.3.2-vsdoc2.js" />


Silobreaker.TopStories = function(params) {
    /// <summary> 
    ///     Widget showing top stories.
    /// </summary>

    this.id = "Silobreaker.TopStories";
    var _helptext = "The list shows the top related stories to the given query. Each story contains a list of most related entities to that story. By hovering over a name you can see how it fits in.";

    var _instanciatedIn = null;
    var _self = this;
    var _data = {};

    this.query = null;
    this.count = 10;
    this.showPopups = true;
    this.showImages = true;
    this.searchCompleteCallback = null;
    this.dataSource = new Silobreaker.TopStories.DataSource();
    this.clickHandler = null;
    this.popupHandler = new Silobreaker.PopupHandler("TopStories");

    // Set parameters from constructor
    if (params) {
        if (params.query) {
            this.query = params.query;
        }

        if (params.count) {
            this.count = params.count;
        }

        if (params.showPopups == false) {
            this.showPopups = false;
        }

        if (params.showImages == false) {
            this.showImages = false;
        }
    }

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);
        Silobreaker.AddBranding($(".widget", _instanciatedIn), "Silobreaker Top Story Widget", _helptext);

        _self.search();
    };

    this.search = function() {
        /// <summary>
        ///     Executes the search and fills the template with the result.
        /// </summary>
        $(_instanciatedIn).attr("context", this.query);

        var params = { query: this.query, count: this.count, widget: "TopStories", operation: "Search", showImages: _self.showImages };
        this.dataSource.getTopStories(this.fillTemplate, params);
    };

    this.fillTemplate = function(data) {
        /// <summary>
        ///     Fills the template html with data.
        /// </summary>

        var bindableData = data.Items;

        for (var i = 0; i < bindableData.length && typeof (bindableData[i]) != 'undefined'; i++) {

            var document = bindableData[i];
            document.StoryGroup = i % 5;

            var prettyDate = new Date();
            var prettyFirstReported = new Date();
            var prettyLastUpdated = new Date();

            prettyDate.setIsoDate(document.PublicationDate);
            prettyFirstReported.setIsoDate(document.FirstReported);
            prettyLastUpdated.setIsoDate(document.LastUpdated);

            // Add new pretty dates to the template data object
            document.PrettyPublicationDate = prettyDate.prettyString();
            document.PrettyFirstReported = prettyFirstReported.prettyString();
            document.PrettyLastUpdated = prettyLastUpdated.prettyString();

            //Fix so that it does not only check latest data
            if (document.Extras.Images) {
                document.Images = document.Extras.Images.Items;
                document.Images[0].ImageSrc = 'src="' + document.Images[0].ImageSrc + '"';
            }

            document.HtmlSnippet = document.Extras.DocumentTeasers.HtmlSnippet;
            document.RelatedEntities = document.Extras.RelatedEntities.Items;

            for (var j = 0; j < document.RelatedEntities.length && typeof (document.RelatedEntities[j]) != 'undefined'; j++) {
                var entity = document.RelatedEntities[j];
                _data[entity.Id] = entity;
            }

            _data[document.Id] = document;
        }

        // Get the template and fill it with data
        var template = $(".contentTemplate", _instanciatedIn);
        var html = template.bindTo(bindableData);
        $(".content", _instanciatedIn).html(html);

        // Insert comma chars between entities
        $(".content .entities a:not(:last-child)", _instanciatedIn).after(",");

        // Wire up item links with popup and click handlers        
        var popupHandler = null;
        if (_self.showPopups) {
            popupHandler = _self.popupHandler;
        }

        var links = $(".content a[itemref]", _instanciatedIn);
        Silobreaker.WireUpItems(links, _data, popupHandler, _self.clickHandler);


        // Update help text
        if (!_self.query || _self.query == "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Top Stories right now.");
        }
        else if (data.Items.length == 0) {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "No stories found for " + _self.query);
        }
        else if (_self.query && _self.query != "") {
            Silobreaker.UpdateInfoText($(".widget", _instanciatedIn), "Top stories for " + _self.query);
        }

        if (_self.searchCompleteCallback) {
            _self.searchCompleteCallback();
        }
    };
};


Silobreaker.TopStories.DataSource = function(callback, params) {
    /// <summary>Data Source class for TopStory Widget</summary>
    this.getTopStories = function(callback, params) {
        /// <summary>
        ///     Get top stories based on a set of parameters. Supported parameters are:
        ///     query (the query to use, optional),
        ///     count (number of top stories to retrieve, optional)
        /// </summary>
        /// <param name="callback">
        ///     The callback function to call when data is retrieved.
        /// </param>
        /// <param name="params">
        ///     An object containing parameters for the request.
        /// </param>

        var url = "topstories/";

        if (!params)
            throw "ArgumentNullException: No parameters specified.";

        if (params.query) {
            url += params.query;
        }

        var extras = "Extras=RelatedEntities,DocumentTeasers";

        if (params.showImages && params.showImages == true) {
            extras += ",Images"
        }

        url += "?" + extras;
        
        if (params.query) {
            url += "&Context=" + params.query;
        }

        var parameters = {};

        if (params.count && params.count != null) {
            parameters.noStories = params.count;
        }

        if (params.widget && params.widget != null) {
            parameters.widget = params.widget;
        }

        if (params.operation && params.operation != null) {
            parameters.operation = params.operation;
        }

        url += "&" + $.param(parameters);

        Silobreaker.invokeApi(url, callback);
    };
};
    
/* SWFObject v2.1 <http://code.google.com/p/swfobject/>
Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

/* WARNING: Make sure VS do not beautify this line of code!! It will not work afterwards. A copy that is not beautified is in the commented row below. Copy and paste it if it gets messed up. */

if (!window['silobreaker_swfobject']) {
    window['silobreaker_swfobject']=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in silobreaker_swfobject){silobreaker_swfobject[X]=null}silobreaker_swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
}
//var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();

// END SWFObject


Silobreaker.Tabs = function(params) {
    /// <summary> 
    ///     TODO
    /// </summary>

    var _instanciatedIn = null;
    var _self = this;
    var _tabs = params.tabs;

    this.id = "Silobreaker.Tabs";
    this.selectedTabChangedCallback = null;

    // Fix indata
    for (var i = 0; i < _tabs.length; i++) {
        if (!_tabs[i].cssClass || _tabs[i].cssClass == null)
            _tabs[i].cssClass = "";
    }

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);

        _self.renderTabs();
    };


    this.renderTabs = function() {
        /// <summary>
        ///     TODO
        /// </summary>
        var template = $(".contentTemplate", _instanciatedIn);
        var html = template.bindTo(_tabs);
        $(".content", _instanciatedIn).html(html);
        var tabs = $(".content span", _instanciatedIn);

        tabs.each(function(index, element) {        
            $(element).data("tabData", _tabs[index]);
        });

        tabs.click(_self.tabClicked);
    };
    
    this.tabClicked = function() {
        /// <summary>
        ///     Executes when a tab is clicked.
        /// </summary>
        var tab = $(this);

        $(".tab", tab.parent()).removeClass("selected");

        tab.addClass("selected");

        var tabData = tab.data("tabData");

        if (_self.selectedTabChangedCallback) {
            _self.selectedTabChangedCallback(tabData);
        }
    };
};Silobreaker.TabDocuments = function(params) {
    /// <summary> 
    ///     Widget showing document widget controlled by tabs
    /// </summary>

    var _instanciatedIn = null;
    var _self = this;

    var _tabs = null;
    var _documents = null;
    var _helptext = "The list shows all content related to your search.  Use the tabs to switch between content types and hover with your mouse over a headline to get a quick-view of the article.";

    // public vars
    this.id = "Silobreaker.TabDocuments";
    this.query = null;
    this.clickHandler = null;
    this.popupHandler = null;
    this.count = params.count;
    this.searchCompleteCallback = null;

    if (params.query) {
        this.query = params.query;
    }

    // Transform indata to Tab-control format
    if (!params.tabs || params.tabs == null)
        params.tabs = [];

    _tabs = new Array(params.tabs.length);
    for (var i = 0; i < params.tabs.length; i++) {
        _tabs[i] = new Object();
        if (params.tabs[i].query) {
            _tabs[i].context = params.tabs[i].query;
        }
        if (params.tabs[i].types) {
            _tabs[i].types = params.tabs[i].types;
        }
        if (params.tabs[i].title) {
            _tabs[i].title = params.tabs[i].title;
        }
        _tabs[i].cssClass = "";
        if (params.tabs[i].selected && params.tabs[i].selected == true) {
            _tabs[i].cssClass = "selected";
        }
        if (params.tabs[i].cssClass && params.tabs[i].cssClass != null && params.tabs[i].cssClass != "") {
            if (_tabs[i].cssClass.length > 0)
                _tabs[i].cssClass += " ";
            _tabs[i].cssClass += params.tabs[i].cssClass;
        }
    }

    this.initialize = function(element) {
        /// <summary>
        ///     Initializes the widget.
        /// </summary>
        /// <param name="element">
        ///     DOM element that the widget should operate on.
        /// </param>

        _instanciatedIn = $(element);

        Silobreaker.AddBranding($(".widget.tabDocuments", _instanciatedIn), "Silobreaker documents widget", _helptext);
        _self.render();
    };

    this.render = function() {
        /// <summary>
        ///  Renders the widget
        /// </summary>

        // Create the tab control
        var tabs = new Silobreaker.Tabs({ tabs: _tabs });
        tabs.selectedTabChangedCallback = tabChanged;
        var tabPH = $(".tabsPlaceholder", _instanciatedIn);
        Silobreaker.injectWidget(tabPH, tabs);

        // Create the document widget
        _documents = new Silobreaker.Documents({ count: this.count });
        if (_self.clickHandler && _self.clickHandler != null) {
            _documents.clickHandler = _self.clickHandler;
        }
        if (_self.popupHandler && _self.popupHandler != null) {
            _documents.popupHandler = _self.popupHandler;
        }


        // Set the widget name, is provided when document widget makes api request. Used for logging.
        _documents.widgetName = "TabDocuments";
        _documents.searchCompleteCallback = searchComplete;
        Silobreaker.injectWidget($(".documentsPlaceholder", _instanciatedIn), _documents);

        // Fires the click event on the selected tab
        $("span.selected:first", tabPH).click();
    };

    this.search = function() {
        // Fires the click event on the selected tab
        $("span.selected:first", _instanciatedIn).click();
    };

    var searchComplete = function(data) {
        // Update help text
        if (!_self.query || _self.query == "") {
            Silobreaker.UpdateInfoText($(".widget.tabDocuments", _instanciatedIn), "Latest content");
        }
        else if (data.Items.length == 0) {
            Silobreaker.UpdateInfoText($(".widget.tabDocuments", _instanciatedIn), "No content found for " + _self.query);
        }
        else {
            Silobreaker.UpdateInfoText($(".widget.tabDocuments", _instanciatedIn), "Search results for " + _self.query);
        }
        if (_self.searchCompleteCallback && _self.searchCompleteCallback != null) {
            _self.searchCompleteCallback(data);
        }
    };

    var tabChanged = function(tabData) {
        /// <summary>
        /// Called when the user has clicked a tab and on init when first tab is loaded
        /// </summary>

        var query = "";

        if (_self.query && _self.query != null && _self.query != "") {
            query = _self.query;
        }

        if (tabData.context && tabData.context != null && tabData.context != "") {
            if (query != "") {
                query += " AND ";
            }
            query += tabData.context;
        }

        _documents.query = query;

        if (tabData.types && tabData.types != null && tabData.types.length > 0) {
            _documents.types = tabData.types;
        }
        else {
            _documents.types = null;
        }

        _documents.search();


    };
};

Silobreaker.EntitySummary.prototype.htmlTemplate = '<div class="SB widget entitySummary" style="width:400px;">    <div style="display:none;">        <div class="contentTemplate">        <!--data-->            <div>                                                    <div>                    <table>                        <tr>                            <td rowspan="3">                                <!--Images-->                                <img @ImageSrc@ style="margin:18px 10px 0px 0px; vertical-align:top" width="@Width@" height="@Height@"/ >                                <!--Images-->                                </td>                        </tr>                                                <tr>                           <td>                               <div class="centered"><a itemref="@Id@"><span class="entityName">@Description@</span></a><span class="entityType"> (@Type@)</span></div>                           </td>                        </tr>                        <tr>                            <td>                                <div class="propertyList">                                <!--TextFields-->                                <div><b>@Key@:</b> @Value@</div>                                <!--TextFields-->                                <!--ItemFields-->                                <div><b>@Key@:</b> <!--Value--><a itemref="@Id@">@Description@</a><!--Value--></div>                                <!--ItemFields-->                                                    </div>                            </td>                            </tr>                    </table>                </div>                             <!--Evidence-->                <div class="inContext">                    <div class="heading">In Context</div>                    <div class="evidenceText">@HtmlSnippet@</div>                    <div class="link"><!--SnippetSource--><a itemref="@Id@">@Description@</a> <span class="publication"><nobr>[@Publisher@ - @PrettyPublicationDate@]</nobr></span><!--SnippetSource--></div>                </div>                <!--Evidence-->                   <div style="clear:both;">                    <div class="listHeading">Lastest stories</div>                    <div class="relatedDocuments"></div>                </div>                        </div>        <!--data-->         </div>    </div>    <div class="content"><div class="loading">Loading...</div></div></div>'
Silobreaker.EntitySummary.prototype.defaultCss = '.SB.entitySummary{    background-color: #F8F8FF;	line-height:normal;}.SB.entitySummary img{    padding: 5px 5px 5px 5px;    }.SB.entitySummary .entityName{    font-weight:bold;    font-size:14px;  }.SB.entitySummary .propertyList{    line-height:1.5;    float:left;}.SB.entitySummary .listHeading{        font-size:12px;    border-bottom:solid 1px silver;    margin-top: 12px;}.SB.entitySummary .publication{	text-align: right;    color:Gray;    font-size: .8em;}.SB.entitySummary .header{    text-align:center;    margin-bottom:6px;}/* Set background color of doucment list */.SB.entitySummary .SB.documents{    background-color:#F8F8FF;  }'
Silobreaker.Documents.prototype.htmlTemplate = '<div class="SB widget documents">    <div style="display:none;">        <div class="contentTemplate">            <!--data-->                    <!--Items-->                    <div class="document"><a itemref="@Id@">@Description@</a>                    <span class="publication"><nobr>[@Publisher@ - @PrettyPublicationDate@]</nobr></span></div>                    <!--Items-->            <!--data-->        </div>    </div>    <div class="content"><div class="loading">Loading...</div></div></div>'
Silobreaker.Documents.prototype.defaultCss = '.SB.documents{		border: none;    padding: 0px 5px 5px 5px;}.SB.documents .document{    margin-bottom:6px;    line-height:1;}.SB.documents .publication{	text-align: right;    color:Gray;    font-size: .8em;}'
Silobreaker.Evidence.prototype.htmlTemplate = '<div class="SB widget evidence">    <div style="display:none;">        <div class="contentTemplate">        <!--data-->            <div class="heading">Documents indicating a relationship between @node1@ and @node2@ in context @context@.</div>            <!--Evidence-->            <div class="inContext">                <div class="heading">In Context</div>                <div class="evidenceText">@HtmlSnippet@</div>                <div class="link"><!--SnippetSource--></nobr><a itemref="@Id@">@Description@</a> <span class="publication"><nobr>[@Publisher@ - @PrettyPublicationDate@]</nobr></span><!--SnippetSource--></div>            </div>                            <!--Evidence-->        <!--data-->        </div>    </div>    <div class="content"><div class="loading">Loading...</div></div>     <div class="evidenceDocuments"></div>    <div class="searchFurther"><a class="searchFurtherAnchor">Search further</a></div></div>'
Silobreaker.Evidence.prototype.defaultCss = '.SB.evidence{	background-color: #F8F8FF;	padding: 5px 5px 5px 5px;	width: 400px;	border: solid 1px #707070;}.SB.evidence .searchFurther{	padding-top: 1em;	text-align: right;}.SB.evidence .publication{	text-align: right;    color:Gray;    font-size: .8em;}'
Silobreaker.InFocus.prototype.htmlTemplate = '<div class="SB widget inFocus">    <div style="display:none;">        <div class="contentTemplate">            <!--data-->            <div class="typeList">                <div class="icon @Type@"></div>                <div class="entities">                    <!--Items-->                    <span class="entity"><a itemref="@id@"><nobr>@Description@</nobr></a><span class="separator">,</span></span>                    <!--Items-->                    <a class="showMore" data="@Type@">[more]</a>                </div>            </div>                        <!--data-->        </div>    </div>    <div class="content"><div class="loading">Loading...</div></div></div>'
Silobreaker.InFocus.prototype.defaultCss = '.SB.inFocus{    overflow:auto;}.SB.inFocus .icon{    margin: 3px 3px 3px 3px;}.SB.inFocus .showMore{    color:Gray;    font-size:80%;    cursor:pointer;    }.SB.inFocus .entities{	margin-top:5px;    padding-left: 22px;    line-height: 140%;}'
Silobreaker.Network.prototype.htmlTemplate = '<div class="SB widget network">    <div class="content">        <div class="networkDiv">        </div>    </div></div>'
Silobreaker.Network.prototype.defaultCss = '.SB.widget.network{	    background-color:#f7fafb;}.SB .networkIcon{    background-position:0 -751px;}.SB.network .content{    clear:both;}.SB.network.widget .content{		padding: 0px 0px 0px 0px;}.SB.widget.entitySummary .content{    padding: 5px;}.SB.widget.documents .content, .SB.widget.evidence .content{		border: none;}'
Silobreaker.TopStories.prototype.htmlTemplate = '<div class="SB widget topstories">    <div style="display:none;">        <div class="contentTemplate">            <!--data-->                <div class="story story@StoryGroup@">                    <div class="discreet">First Reported @PrettyFirstReported@ - Updated @PrettyLastUpdated@ - @NoDocuments@ documents</div>                    <div class="floatLeft"><!--Images--><img class="image" @ImageSrc@ /><div class="imageText">@Description@</div><!--Images--></div>                     <div class="headline"><a itemref="@Id@">@Description@</a></div>                    <div class="teaser">@HtmlSnippet@ <span class="publication"><nobr><a itemref="@Id@">[@Publisher@ - @PrettyPublicationDate@]</a></nobr></span>                    </div>                      <div class="entities" context="itemref:@Id@"><span class="discreet">Entities:</span><!--RelatedEntities--> <a itemref="@Id@">@Description@</a><!--RelatedEntities--></div>                </div>                               <!--data-->                    </div>    </div>    <div class="content"><div class="loading">Loading...</div></div></div>'
Silobreaker.TopStories.prototype.defaultCss = '.SB.topstories{    overflow:auto;}.SB.topstories .content{    padding:5px 5px 5px 5px;}.SB.topstories .image{    margin:5px 10px 5px 5px;}.SB.topstories .imageText{    width:80px;    text-align:center;    font-size: 85%;    color: #606060;    padding-right: 5px;}.SB.topstories .headline{	    font-size:1.2em;	font-weight:bold;	color:#303030;	margin-bottom:5px;    margin-top:5px;}.SB.topstories .story{    margin-bottom:18px;}.SB.topstories .teaser{    margin-bottom:6px;}.SB.topstories .story0{    font-size:120%;}.SB.topstories .story1, .SB.topstories .story2, .SB.topstories .story3, .SB.topstories .story4{    width: 45%;        float:left;}.SB.topstories .story2, .SB.topstories .story4{    padding-left:2%;}.SB.topstories .story0, .SB.topstories .story1, .SB.topstories .story3{    clear:left;    }'
Silobreaker.defaultCss = '/* *************************** *//* General CSS for all widgets *//* *************************** */.SB {    font-size: 8.25pt;    font-family: Tahoma;    line-height: normal;        background-color: #ffffff;    color:#333333;}.SB img{    border-style:none;    padding:0px 0px 0px 0px;    margin:0px 0px 0px 0px;}.SB .centered{    text-align:center;}.SB .floatLeft{    float:left;}.SB A{    cursor:pointer;    text-decoration: none;    color: #404080;}.SB A:hover{    color:#E2904E;    text-decoration:underline;}.SB .heading{	font-size:13px;	font-weight:bold;	color:#303030;}.SB.widget{	    padding:0px;    border: solid 1px #A0A0C0;}.SB.widget .content{		padding: 5px 5px 5px 5px;}.SB .header{    color:Gray;    min-height:22px;    border-bottom: solid 1px #A0A0C0;    background: url("http://api.silobreaker.com/Content/bluegradient.png") 0 0;}.SB .header img{    border:0px;    float:right;    margin-top:1px;    margin-right:3px;}.SB .header .infotext{    padding: 4px 0px 5px 10px;}.SB .header .helptext{     position:absolute;      width:250px;      background-color:#ffffff;      padding:5px;      border:solid 1px #ed6934;}.SB .header .helptext .title{    font-size:1.2em;     font-weight:bold;        margin-bottom:10px;}.SB .header .helptext .close{    float:right;    cursor:pointer;    margin-top:5px;    margin-left:5px;}.SB .footer{    height:17px;    clear:both;        border:0px;    padding: 3px 0px 3px 0px;}.SB .footer img{    border:0px;    height:15px;    margin-right:3px;    float:right;}.SB .loading{    color: #A0A0C0;    text-align:center;}.SB .discreet{    color: #606060;    font-size:90%;   }/**************//* In Context *//**************/.SB .inContext{        background-color:white;    border:solid 1px #404040;    margin-left:10%;    margin-right:10%;    margin-top:6px;    clear:both;}.SB .inContext .heading{	font-size:11px;	font-weight:bold;	border-bottom:1px solid #404040;	padding:3px 3px 3px 6px;}.SB .inContext .link{	/*margin-top:2px;*/	text-align:right;	padding:1px 6px 3px 1px;}.SB .inContext .evidenceText {padding:6px;}/**********************//* Small Entity Icons *//**********************/.SB .icon{    background: transparent url("http://www.silobreaker.com/Images/icons_s_2.png") no-repeat scroll 0 0;        width:17px;    height:17px;    float: left;}.SB .Person{    background-position: 0px -852px;}.SB .Company{    background-position: 0px -515px;}.SB .Organization{    background-position: 0px -805px;}.SB .Keyphrase{    background-position: 0px -705px;}.SB .City{    background-position: 0px -468px;}.SB .Country{    background-position: 0px -560px;}'
Silobreaker.Tabs.prototype.htmlTemplate = '<div style="display:none;">    <div class="contentTemplate"><!--data--><span class="tab @cssClass@">@title@</span><!--data--></div></div><div class="tabs content"></div>'
Silobreaker.TabDocuments.prototype.htmlTemplate = '<div class="SB widget tabDocuments">    <div class="tabsPlaceholder"></div>    <div class="documentsPlaceholder"></div></div>'
Silobreaker.TabDocuments.prototype.defaultCss = '.SB.widget.tabDocuments .content{		padding: 0px 0px 0px 0px;		}.tabs .contentTemplate{            border-bottom:1px solid #606060;    margin:0px 0px 10px 0px;    padding: 0px 5px 0px 5px;    background-color:#F0F0F0;  }.SB span.tab{	            margin:5px 3px -1px 0px;    padding:2px 5px 0px 5px;    display: inline-block; 	    cursor:pointer;        border:1px solid #606060;	border-bottom-color:gray;	font-size:120%;					    white-space:nowrap;  	background-image: url("http://www.silobreaker.com/Images/grd_s_1.png");	background-position: 0px -43px;}.SB span.selected {    background-position: 0px -154px;        border-bottom-color: #e5caa3;    }'