From 2ddde1587516f5d14aa9e41721708274fda64c6a Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 27 May 2010 21:40:44 +0200 Subject: [PATCH 001/193] Moved Jonathan's JS over to jQuery --- openlp/plugins/remotes/html/index.html | 116 +++++++++++++++++++---- openlp/plugins/remotes/html/jquery.js | 19 ++++ openlp/plugins/remotes/lib/httpserver.py | 60 ++++++------ 3 files changed, 145 insertions(+), 50 deletions(-) create mode 100755 openlp/plugins/remotes/html/jquery.js diff --git a/openlp/plugins/remotes/html/index.html b/openlp/plugins/remotes/html/index.html index 25b08fd43..bb2030039 100644 --- a/openlp/plugins/remotes/html/index.html +++ b/openlp/plugins/remotes/html/index.html @@ -1,10 +1,14 @@ - - -OpenLP Controller - + - + + +

OpenLP Controller

- - -
- - -
- - -
- - +

Service Manager

+
+

(Click service item to go live.)

+
+ Controls +
+ +
+
+ + +
+

- - (Click service item to go live.) -
+

Slide Controller

+
+

(Click verse to display.)

+
+ Controls +
+ +
+
+ + +
+

- - (Click verse to display.) -
+

Miscellaneous

+
+ + +
+
+ + + +

- OpenLP website + OpenLP website diff --git a/openlp/plugins/remotes/html/jquery.js b/openlp/plugins/remotes/html/jquery.js index b1ae21d8b..7c2430802 100755 --- a/openlp/plugins/remotes/html/jquery.js +++ b/openlp/plugins/remotes/html/jquery.js @@ -1,19 +1,154 @@ -/* - * jQuery JavaScript Library v1.3.2 +/*! + * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 */ -(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=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;G1||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-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+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!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;E0?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":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=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 UT[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=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";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="";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="

";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="
";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;W0){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;Z0||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=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("
").append(M.responseText.replace(//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").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=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=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='
';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")}})})(); \ No newline at end of file +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/openlp/plugins/remotes/html/openlp.js b/openlp/plugins/remotes/html/openlp.js index 8172177d7..24c7cec2e 100644 --- a/openlp/plugins/remotes/html/openlp.js +++ b/openlp/plugins/remotes/html/openlp.js @@ -63,33 +63,42 @@ OpenLP.Namespace.create("OpenLP.Events", { // Local variables onload_functions: Array(), // Functions - load: function (func) { + bindLoad: function (func) { this.onload_functions.append(func); }, - click: function (selector, func) { + bindClick: function (selector, func) { $(selector).bind("click", func); }, - change: function (selector, func) { + bindChange: function (selector, func) { $(selector).bind("change", func); }, - submit: function (selector, func) { + bindSubmit: function (selector, func) { $(selector).bind("submit", func); }, - blur: function (selector, func) { + bindBlur: function (selector, func) { $(selector).bind("blur", func); }, - paste: function (selector, func) { + bindPaste: function (selector, func) { $(selector).bind("paste", func); }, - keyup: function (selector, func) { + bindKeyUp: function (selector, func) { $(selector).bind("keyup", func); }, - keydown: function (selector, func) { + bindKeyDown: function (selector, func) { $(selector).bind("keydown", func); }, - keypress: function (selector, func) { + bindKeyPress: function (selector, func) { $(selector).bind("keypress", func); }, + bindMouseEnter: function (selector, func) { + $(selector).bind("mouseenter", func); + }, + bindMouseLeave: function (selector, func) { + $(selector).bind("mouseleave", func); + }, + liveClick: function (selector, func) { + $(selector).live("click", func); + }, getElement: function(event) { var targ; if (!event) { @@ -116,8 +125,115 @@ OpenLP.Namespace.create("OpenLP.Events", { }); OpenLP.Namespace.create("OpenLP.Remote", { - sendEvent: function (event_name, event_data) + sendEvent: function (eventName, eventData) { + var url = "/"; + if (eventName.substr(-8) == "_request") + { + url += "request"; + } + else + { + url += "send"; + } + url += "/" + eventName; + var args = {}; + if (eventData != null && eventData != "") + { + args.q = $.parseJSON(eventData); + } + $.ajax({ + url: url, + dataType: "json", + data: args, + success: function (data) + { + OpenLP.Remote.handleEvent(eventName, data); + }, + error: function (xhr, textStatus, errorThrown) + { + if (eventName == "remotes_poll_request") + { + OpenLP.Remote.handleEvent("remotes_poll_request"); + } + } + }); + }, + handleEvent: function (eventName, eventData) + { + switch (eventName) + { + case "servicemanager_list_request": + var table = $(""); + $.each(eventData, function (row, item) { + var trow = $("") + .attr("value", parseInt(row)) + .click(OpenLP.Remote.sendSetItem); + if (item["selected"]) + { + trow.addClass("selected"); + } + trow.append($("
").text(parseInt(row) + 1)); + trow.append($("").text(item["title"])); + trow.append($("").text(item["plugin"])); + trow.append($("").text("Notes: " + item["notes"])); + table.append(trow); + }); + $("#service").html(table); + break; + case "slidecontroller_live_text_request": + var table = $(""); + $.each(eventData, function (row, item) { + var trow = $("") + .attr("value", parseInt(row)) + .click(OpenLP.Remote.sendLiveSet); + if (item["selected"]) + { + trow.addClass("selected"); + } + trow.append($("
").text(item["tag"])); + trow.append($("").text(item["text"] ? item["text"].replace(/\\n/g, '
') : "")); + table.append(trow); + }); + $("#current-item").html(table); + break; + case "remotes_poll_request": + OpenLP.Remote.sendEvent("remotes_poll_request"); + OpenLP.Remote.sendEvent("servicemanager_list_request"); + OpenLP.Remote.sendEvent("slidecontroller_live_text_request"); + break; + } + }, + sendLiveSet: function (e) + { + var id = OpenLP.Events.getElement(e).parent().attr("value"); + OpenLP.Remote.sendEvent("slidecontroller_live_set", id); + return false; + }, + sendSetItem: function (e) + { + var id = OpenLP.Events.getElement(e).parent().attr("value"); + OpenLP.Remote.sendEvent("servicemanager_set_item", id); + return false; + }, + sendAlert: function (e) + { + var alert_text = $("#alert-text").val(); + OpenLP.Remote.sendEvent("alerts_text", alert_text); + return false; + }, + buttonClick: function (e) + { + var id = OpenLP.Events.getElement(e).attr("id"); + OpenLP.Remote.sendEvent(id); return false; } -}); \ No newline at end of file +}); + +OpenLP.Events.bindLoad(function () { + OpenLP.Events.bindClick("input[type=button][id!=alert-send]", OpenLP.Remote.buttonClick); + OpenLP.Events.bindClick("#alert-send", OpenLP.Remote.sendAlert); + OpenLP.Remote.sendEvent("servicemanager_list_request"); + OpenLP.Remote.sendEvent("slidecontroller_live_text_request"); + OpenLP.Remote.sendEvent("remotes_poll_request"); +}); diff --git a/openlp/plugins/remotes/html/style.css b/openlp/plugins/remotes/html/style.css new file mode 100644 index 000000000..8ccad1c9a --- /dev/null +++ b/openlp/plugins/remotes/html/style.css @@ -0,0 +1,26 @@ +body +{ + font-family: Lucida Grande, Lucida Sans, Arial, Helvetica, sans-serif; + font-size: 80%; +} + +fieldset +{ + border: 1px solid #ccc; +} + +td +{ + cursor: pointer; +} + +tr:hover +{ + background-color: #7397dd; +} + +.selected +{ + background-color: #4f7ed9; + font-weight: bold; +} diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 2c12eac76..c7dd2e5d5 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -245,7 +245,7 @@ class HttpConnection(object): Receiver.send_message(event, params) else: Receiver.send_message(event) - return u'OK' + return json.dumps([u'OK']) def process_request(self, event, params): """ From 07d402ee59a0bba39443b28c4f757c488ad29b5d Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 31 May 2010 22:07:27 +0200 Subject: [PATCH 004/193] Fix the alerts not being sent. --- openlp/plugins/remotes/html/openlp.js | 2 +- openlp/plugins/remotes/lib/httpserver.py | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/remotes/html/openlp.js b/openlp/plugins/remotes/html/openlp.js index 24c7cec2e..5ace417b1 100644 --- a/openlp/plugins/remotes/html/openlp.js +++ b/openlp/plugins/remotes/html/openlp.js @@ -140,7 +140,7 @@ OpenLP.Namespace.create("OpenLP.Remote", { var args = {}; if (eventData != null && eventData != "") { - args.q = $.parseJSON(eventData); + args.q = escape(eventData); } $.ajax({ url: url, diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index c7dd2e5d5..7836bda8a 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -250,13 +250,19 @@ class HttpConnection(object): def process_request(self, event, params): """ Client has requested data. Send the signal and parameters for openlp - to handle, then listen out for a corresponding _request signal + to handle, then listen out for a corresponding ``_request`` signal which will have the data to return. - For most event timeout after 10 seconds (i.e. incase the signal - recipient isn't listening) - remotes_poll_request is a special case, this is a ajax long poll which - is just waiting for slide change/song change activity. This can wait - longer (one minute) + + For most events, timeout after 10 seconds (i.e. in case the signal + recipient isn't listening). ``remotes_poll_request`` is a special case + however, this is a ajax long poll which is just waiting for slide + change/song change activity. This can wait longer (one minute). + + ``event`` + The event from the web page. + + ``params`` + Parameters sent with the event. """ log.debug(u'Processing request %s' % event) if not event.endswith(u'_request'): From 9d77444ddf9c380017c1ac7c846d6a1056253653 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 9 Jul 2010 21:27:18 +0100 Subject: [PATCH 005/193] Revert Changes --- openlp/core/ui/amendthemedialog.py | 21 +++++++-------------- openlp/core/ui/amendthemeform.py | 14 +------------- openlp/core/ui/thememanager.py | 2 +- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index e8b9c64e3..a5cd69610 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -646,20 +646,13 @@ class Ui_AmendThemeDialog(object): QtGui.QDialogButtonBox.Ok) self.ThemeButtonBox.setObjectName(u'ThemeButtonBox') self.AmendThemeLayout.addWidget(self.ThemeButtonBox) - self.SaveAsButton = QtGui.QPushButton( - translate('AmendThemeForm','Save &as')) - self.SaveAsButton.setCheckable(True) - self.SaveAsButton.setAutoDefault(False) - self.ThemeButtonBox.addButton(self.SaveAsButton, - QtGui.QDialogButtonBox.ActionRole) + self.retranslateUi(AmendThemeDialog) self.ThemeTabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'accepted()'), AmendThemeDialog.accept) QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'rejected()'), AmendThemeDialog.reject) - QtCore.QObject.connect(self.SaveAsButton, - QtCore.SIGNAL(u'clicked()'), AmendThemeDialog.saveAs) QtCore.QMetaObject.connectSlotsByName(AmendThemeDialog) AmendThemeDialog.setTabOrder(self.ThemeButtonBox, self.ThemeNameEdit) AmendThemeDialog.setTabOrder(self.ThemeNameEdit, self.ThemeTabWidget) @@ -855,19 +848,19 @@ class Ui_AmendThemeDialog(object): translate('AmendThemeForm', 'Alignment')) self.HorizontalLabel.setText( translate('AmendThemeForm', 'Horizontal align:')) - self.HorizontalComboBox.setItemText(0, + self.HorizontalComboBox.setItemText(0, translate('AmendThemeForm', 'Left')) - self.HorizontalComboBox.setItemText(1, + self.HorizontalComboBox.setItemText(1, translate('AmendThemeForm', 'Right')) - self.HorizontalComboBox.setItemText(2, + self.HorizontalComboBox.setItemText(2, translate('AmendThemeForm', 'Center')) self.VerticalLabel.setText( translate('AmendThemeForm', 'Vertical align:')) - self.VerticalComboBox.setItemText(0, + self.VerticalComboBox.setItemText(0, translate('AmendThemeForm', 'Top')) - self.VerticalComboBox.setItemText(1, + self.VerticalComboBox.setItemText(1, translate('AmendThemeForm', 'Middle')) - self.VerticalComboBox.setItemText(2, + self.VerticalComboBox.setItemText(2, translate('AmendThemeForm', 'Bottom')) self.TransitionGroupBox.setTitle( translate('AmendThemeForm', 'Slide Transition')) diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index f827b1639..1c2658dc3 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -137,12 +137,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): QtCore.SIGNAL(u'stateChanged(int)'), self.onSlideTransitionCheckBoxChanged) - def saveAs(self): - self.ThemeNameEdit.setEnabled(True) - self.SaveAsButton.setEnabled(False) - self.ThemeNameEdit.setText(u'') - self.ThemeNameEdit.setFocus() - def accept(self): new_theme = ThemeXML() theme_name = unicode(self.ThemeNameEdit.text()) @@ -206,7 +200,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): save_from, save_to) is not False: return QtGui.QDialog.accept(self) - def loadTheme(self, theme, newTheme=False): + def loadTheme(self, theme): log.debug(u'LoadTheme %s', theme) self.theme = theme # Stop the initial screen setup generating 1 preview per field! @@ -214,12 +208,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.paintUi(self.theme) self.allowPreview = True self.previewTheme() - self.ThemeNameEdit.setEnabled(True) - self.SaveAsButton.setEnabled(False) - if not newTheme: - self.ThemeNameEdit.setEnabled(False) - self.SaveAsButton.setEnabled(True) - def onImageToolButtonClicked(self): images_filter = get_images_filter() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 43f214690..46b4d0c50 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -173,7 +173,7 @@ class ThemeManager(QtGui.QWidget): editing form for the user to make their customisations. """ theme = self.createThemeFromXml(self.baseTheme(), self.path) - self.amendThemeForm.loadTheme(theme, True) + self.amendThemeForm.loadTheme(theme) self.saveThemeName = u'' self.amendThemeForm.exec_() From 0bd6d297c75e221bce437153c1e8fdb018a18f9b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 06:40:56 +0100 Subject: [PATCH 006/193] Add new renderer code --- openlp/core/lib/__init__.py | 5 ++ openlp/core/lib/renderer.py | 35 ++++++++++++ openlp/core/ui/maindisplay.py | 34 ++++++------ resources/Fedora/191/OpenLP.spec | 91 ++++++++++++++++++++++++++++++++ 4 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 resources/Fedora/191/OpenLP.spec diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 4718e289e..f3c9c4494 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -178,6 +178,11 @@ def resize_image(image, width, height): QtCore.Qt.SmoothTransformation) realw = preview.width() realh = preview.height() + #Only resize if different size + print realw, realh, width, height + if realw == width and realh == height: + return image + print "different" # and move it to the centre of the preview space new_image = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 04c854afa..ece02031a 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -145,6 +145,41 @@ class Renderer(object): for line in lines: text.append(line) split_text = self.pre_render_text(text) + + doc = QtGui.QTextDocument() + doc.setPageSize(QtCore.QSizeF(self._rect.width(), self._rect.height())) + df = doc.defaultFont() + df.setPixelSize(self._theme.font_main_proportion) + df.setFamily(self._theme.font_main_name) + main_weight = 50 + if self._theme.font_main_weight == u'Bold': + main_weight = 75 + df.setWeight(main_weight) + doc.setDefaultFont(df) + myCursor = QtGui.QTextCursor(doc) + layout = doc.documentLayout() + formatted = [] + if self._theme.display_horizontalAlign == 2: + shell = "

%s

" + elif self._theme.display_horizontalAlign == 1: + shell = "

%s

" + else: + shell = "

%s

" + temp_text = u'' + old_html_text = u'' + for line in text: + #do we need a
here? + temp_text = temp_text + line + html_text = shell % temp_text + doc.setHtml(html_text) + if layout.pageCount() != 1: + formatted.append(old_html_text) + temp_text = line + old_html_text = temp_text + formatted.append(old_html_text) + for f in formatted: + print "f", f + print "st", split_text log.debug(u'format_slide - End') return split_text diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index b0ef8eaf4..575038f77 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -79,10 +79,28 @@ class DisplayManager(QtGui.QWidget): QtCore.SIGNAL(u'videodisplay_start'), self.onStartVideo) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'videodisplay_stop'), self.onStopVideo) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'config_updated'), self.setup) def setup(self): + log.debug(u'mainDisplay - setup') self.videoDisplay.setup() self.mainDisplay.setup() + #Build the initial frame. + self.initialFrame = QtGui.QImage( + self.screens.current[u'size'].width(), + self.screens.current[u'size'].height(), + QtGui.QImage.Format_ARGB32_Premultiplied) + print self.screens.current + splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png') + painter_image = QtGui.QPainter() + painter_image.begin(self.initialFrame) + painter_image.fillRect(self.initialFrame.rect(), QtCore.Qt.white) + painter_image.drawImage( + (self.screens.current[u'size'].width() - splash_image.width()) / 2, + (self.screens.current[u'size'].height() - splash_image.height()) / 2, + splash_image) + self.mainDisplay.displayImage(self.initialFrame) def hideDisplay(self, message): """ @@ -252,19 +270,6 @@ class MainDisplay(DisplayWidget): self.webView.setGeometry(0, 0, self.size().width(), self.size().height()) #Build a custom splash screen - self.initialFrame = QtGui.QImage( - self.screen[u'size'].width(), - self.screen[u'size'].height(), - QtGui.QImage.Format_ARGB32_Premultiplied) - splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png') - painter_image = QtGui.QPainter() - painter_image.begin(self.initialFrame) - painter_image.fillRect(self.initialFrame.rect(), QtCore.Qt.white) - painter_image.drawImage( - (self.screen[u'size'].width() - splash_image.width()) / 2, - (self.screen[u'size'].height() - splash_image.height()) / 2, - splash_image) - self.displayImage(self.initialFrame) self.repaint() #Build a Black screen painter = QtGui.QPainter() @@ -498,8 +503,7 @@ class VideoDisplay(Phonon.VideoWidget): QtCore.SIGNAL(u'videodisplay_pause'), self.onMediaPause) # QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.SIGNAL(u'videodisplay_background'), self.onMediaBackground) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_updated'), self.setup) + QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'finished()'), self.onMediaStop) self.setVisible(False) diff --git a/resources/Fedora/191/OpenLP.spec b/resources/Fedora/191/OpenLP.spec new file mode 100644 index 000000000..7e9ccc1cc --- /dev/null +++ b/resources/Fedora/191/OpenLP.spec @@ -0,0 +1,91 @@ +%{!?python_sitelib:%global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} + +Summary: Open source Church presentation and lyrics projection application +Name: OpenLP +Version: 1.9.1.1 +Release: 1%{?dist} +Source0: http://downloads.sourceforge.net/openlp/openlp/%{version}/%{name}-%{version}.tar.gz +License: GPLv2 +Group: Applications/Multimedia +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +URL: http://openlp.org/ + +BuildRequires: desktop-file-utils +BuildRequires: python2-devel +BuildRequires: python-setuptools + +Requires: PyQt4 +Requires: phonon +Requires: python-BeautifulSoup +Requires: python-chardet +Requires: python-lxml +Requires: python-sqlalchemy +Requires: hicolor-icon-theme + +%description +OpenLP is a church presentation software, for lyrics projection software, +used to display slides of Songs, Bible verses, videos, images, and +presentations (if OpenOffice.org is installed) using a computer and projector. + +%prep +%setup -q + +%build +python setup.py build + +%install +rm -rf %{buildroot} +python setup.py install --skip-build -O1 --root %{buildroot} + +install -m644 -p -D resources/images/openlp-logo-16x16.png \ + %{buildroot}%{_datadir}/icons/hicolor/16x16/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo-32x32.png \ + %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo-48x48.png \ + %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo.svg \ + %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/openlp.svg + +desktop-file-install \ + --dir %{buildroot}/%{_datadir}/applications \ + resources/openlp.desktop + +mv %{buildroot}%{_bindir}/bible-1to2-converter.py \ + %{buildroot}%{_bindir}/bible-1to2-converter +mv %{buildroot}%{_bindir}/openlp-1to2-converter.py \ + %{buildroot}%{_bindir}/openlp-1to2-converter +mv %{buildroot}%{_bindir}/openlp-remoteclient.py \ + %{buildroot}%{_bindir}/openlp-remoteclient +mv %{buildroot}%{_bindir}/openlp.pyw %{buildroot}%{_bindir}/openlp + + +%post +touch --no-create %{_datadir}/icons/hicolor ||: +gtk-update-icon-cache -q %{_datadir}/icons/hicolor 2> /dev/null ||: + +%postun +touch --no-create %{_datadir}/icons/hicolor ||: +gtk-update-icon-cache -q %{_datadir}/icons/hicolor 2> /dev/null ||: + + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc copyright.txt LICENSE +%{_bindir}/bible-1to2-converter +%{_bindir}/openlp-1to2-converter +%{_bindir}/openlp-remoteclient +%{_bindir}/openlp +%{_datadir}/applications/openlp.desktop +%{_datadir}/icons/hicolor/*/apps/openlp.* +%{python_sitelib}/openlp/ +%{python_sitelib}/OpenLP-%{version}*.egg-info +%doc documentation/*.txt + +%changelog +* Sun Mar 28 2010 Tim Bentley 1.9.1.1 +- Initial build version - Alpha 1 Release From 02c0fe9e896838600c9352b0a4844bb829a7b036 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 08:45:49 +0100 Subject: [PATCH 007/193] Renderer replacement started --- openlp/core/lib/__init__.py | 44 +- openlp/core/lib/renderer.py | 18 +- openlp/core/ui/__init__.py | 2 - openlp/core/ui/maindisplay.py | 1028 +++++++++++++++++++-------------- 4 files changed, 637 insertions(+), 455 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index f3c9c4494..088ac6e7a 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -165,12 +165,51 @@ def context_menu_separator(base): action.setSeparator(True) return action -def resize_image(image, width, height): +def resize_image_for_web(image, width, height, background=QtCore.Qt.black): + """ + Resize an image to fit on the current screen for the web and retuns + it as a byte stream. + + ``image`` + The image to resize. + ``width`` + The new image width. + ``height`` + The new image height. + ``background `` + The background colour defaults to black. + """ + new_image = resize_image(image, width, height, background) + return image_to_byte(image) + +def image_to_byte(image): + """ + Resize an image to fit on the current screen for the web and retuns + it as a byte stream. + + ``image`` + The image to converted. + """ + byte_array = QtCore.QByteArray() + buffer = QtCore.QBuffer(byte_array) #// use buffer to store pixmap into byteArray + buffer.open(QtCore.QIODevice.WriteOnly) + pixmap = QtGui.QPixmap(image) + pixmap.save(buffer, "PNG") + #convert to base64 encoding so does not get missed! + return byte_array + +def resize_image(image, width, height, background=QtCore.Qt.black): """ Resize an image to fit on the current screen. ``image`` The image to resize. + ``width`` + The new image width. + ``height`` + The new image height. + ``background `` + The background colour defaults to black. """ preview = QtGui.QImage(image) if not preview.isNull(): @@ -186,7 +225,7 @@ def resize_image(image, width, height): # and move it to the centre of the preview space new_image = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) - new_image.fill(QtCore.Qt.black) + new_image.fill(background) painter = QtGui.QPainter(new_image) painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) return new_image @@ -215,6 +254,7 @@ from settingstab import SettingsTab from serviceitem import ServiceItem from serviceitem import ServiceItemType from serviceitem import ItemCapabilities +from htmlbuilder import build_html from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget from theme import ThemeLevel, ThemeXML diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index ece02031a..ab4ce3d74 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -167,21 +167,25 @@ class Renderer(object): shell = "

%s

" temp_text = u'' old_html_text = u'' + page = [] for line in text: - #do we need a
here? - temp_text = temp_text + line + # mark line ends + temp_text = temp_text + line + u'
' html_text = shell % temp_text doc.setHtml(html_text) + #Text too long so gone to next mage if layout.pageCount() != 1: - formatted.append(old_html_text) + page.append(shell % old_html_text) + formatted.append(page) temp_text = line old_html_text = temp_text - formatted.append(old_html_text) - for f in formatted: - print "f", f + page.append(shell % old_html_text) + formatted.append(page) + print "ft", formatted print "st", split_text log.debug(u'format_slide - End') - return split_text + #return split_text + return formatted def pre_render_text(self, text): metrics = QtGui.QFontMetrics(self.main_font) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index e93108da7..c4955daff 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -40,8 +40,6 @@ from slidecontroller import HideMode from servicenoteform import ServiceNoteForm from serviceitemeditform import ServiceItemEditForm from screen import ScreenList -from maindisplay import MainDisplay -from maindisplay import VideoDisplay from maindisplay import DisplayManager from amendthemeform import AmendThemeForm from slidecontroller import SlideController diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 575038f77..9284b2d49 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -30,7 +30,7 @@ import time from PyQt4 import QtCore, QtGui, QtWebKit from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver, resize_image +from openlp.core.lib import Receiver, resize_image, image_to_byte, build_html from openlp.core.ui import HideMode log = logging.getLogger(__name__) @@ -68,9 +68,9 @@ class DisplayManager(QtGui.QWidget): def __init__(self, screens): QtGui.QWidget.__init__(self) self.screens = screens - self.videoDisplay = VideoDisplay(self, screens) + #self.videoDisplay = VideoDisplay(self, screens) self.audioPlayer = AudioPlayer(self) - self.mainDisplay = MainDisplay(self, screens) + self.mainDisplay = WebViewer(self, screens) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay) QtCore.QObject.connect(Receiver.get_receiver(), @@ -82,9 +82,10 @@ class DisplayManager(QtGui.QWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.setup) + def setup(self): log.debug(u'mainDisplay - setup') - self.videoDisplay.setup() + #self.videoDisplay.setup() self.mainDisplay.setup() #Build the initial frame. self.initialFrame = QtGui.QImage( @@ -100,20 +101,19 @@ class DisplayManager(QtGui.QWidget): (self.screens.current[u'size'].width() - splash_image.width()) / 2, (self.screens.current[u'size'].height() - splash_image.height()) / 2, splash_image) - self.mainDisplay.displayImage(self.initialFrame) + self.mainDisplay.newDisplay(image_to_byte(QtGui.QPixmap.fromImage(self.initialFrame)), None, None) + self.mainDisplay.show() def hideDisplay(self, message): """ Hide the output displays """ - self.videoDisplay.mediaHide(message) self.mainDisplay.hideDisplay(message) def showDisplay(self, message): """ Hide the output displays """ - self.videoDisplay.mediaShow(message) self.mainDisplay.showDisplay(message) def addAlert(self, alertMessage, location): @@ -144,498 +144,638 @@ class DisplayManager(QtGui.QWidget): """ Handles the Starting of a Video and Display Management """ - self.videoDisplay.setVisible(True) self.mainDisplay.setVisible(False) - self.videoDisplay.onMediaQueue(item) def onStopVideo(self): """ Handles the Stopping of a Video and Display Management """ self.mainDisplay.setVisible(True) - self.videoDisplay.setVisible(False) - self.videoDisplay.onMediaStop() def close(self): """ Handles the closure of the displays """ - self.videoDisplay.close() - self.audioPlayer.close() - self.mainDisplay.close() + self.mainDisplay.close() class DisplayWidget(QtGui.QGraphicsView): """ Customised version of QTableWidget which can respond to keyboard events. """ - log.info(u'MainDisplay loaded') + log.info(u'Display Widget loaded') - def __init__(self, parent=None, name=None, primary=False): - QtGui.QWidget.__init__(self, None) + def __init__(self, parent=None, name=None): + QtGui.QGraphicsView.__init__(self) self.parent = parent - self.primary = primary - self.hotkey_map = { - QtCore.Qt.Key_Return: 'servicemanager_next_item', - QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_0: 'servicemanager_next_item', - QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} def keyPressEvent(self, event): - if isinstance(event, QtGui.QKeyEvent): + if type(event) == QtGui.QKeyEvent: #here accept the event and do something - if event.key() == QtCore.Qt.Key_Up: - Receiver.send_message(u'slidecontroller_live_previous') - event.accept() - elif event.key() == QtCore.Qt.Key_Down: - Receiver.send_message(u'slidecontroller_live_next') - event.accept() - elif event.key() == QtCore.Qt.Key_PageUp: - Receiver.send_message(u'slidecontroller_live_first') - event.accept() - elif event.key() == QtCore.Qt.Key_PageDown: - Receiver.send_message(u'slidecontroller_live_last') - event.accept() - elif event.key() in self.hotkey_map: - Receiver.send_message(self.hotkey_map[event.key()]) + if event.key() == QtCore.Qt.Key_Down: + print "down" + self.next() event.accept() elif event.key() == QtCore.Qt.Key_Escape: - self.resetDisplay() + print "esc" + self.close() event.accept() - event.ignore() + elif event.key() == QtCore.Qt.Key_V: + print "v" + self.video() + event.accept() + elif event.key() == QtCore.Qt.Key_I: + print "I" + self.image() + event.accept() + elif event.key() == QtCore.Qt.Key_P: + print "p" + self.preview() + event.accept() + elif event.key() == QtCore.Qt.Key_A: + print "a" + self.alert() + event.accept() + elif event.key() == QtCore.Qt.Key_S: + print "s" + self.shadow() + event.accept() + else: + event.ignore() else: event.ignore() - def resetDisplay(self): - log.debug(u'resetDisplay') - Receiver.send_message(u'slidecontroller_live_stop_loop') - if self.primary: - self.setVisible(False) - else: - self.setVisible(True) - -class MainDisplay(DisplayWidget): - """ - This is the form that is used to display things on the projector. - """ - log.info(u'MainDisplay Loaded') +class WebViewer(DisplayWidget): def __init__(self, parent, screens): - """ - The constructor for the display form. + DisplayWidget.__init__(self, parent=None) + self.screen = screens + self.setupSelf() + self.currimage = False +# self.byteArray = QtCore.QByteArray() +# buffer = QtCore.QBuffer(self.byteArray) #// use buffer to store pixmap into byteArray +# buffer.open(QtCore.QIODevice.WriteOnly) +# pixmap = QtGui.QPixmap("/home/timali/Pictures/IMG_0726.jpg") +# pixmap.save(buffer, "PNG") +# self.byteArray2 = QtCore.QByteArray() +# buffer = QtCore.QBuffer(self.byteArray) #// use buffer to store pixmap into byteArray +# buffer.open(QtCore.QIODevice.WriteOnly) +# pixmap = QtGui.QPixmap("file:///home/timali/Pictures/out.png") +# pixmap.save(buffer, "PNG") + self.setup() +# self.image1 = "file:///home/timali/Pictures/IMG_0726.jpg" +# self.image2 = "file:///home/timali/Pictures/out.png" + self.currvideo = False + self.video1 = "c:\\users\\jonathan\\Desktop\\Wildlife.wmv" + self.video2 = "c:\\users\\jonathan\\Desktop\\movie.ogg" + self.currslide = False + self.slide1 = "[1:1] In the beginning God created the heavens and the earth.

[1:2] Now the earth was formless and empty, darkness was over the surface of the deep, and the Spirit of God was hovering over the waters.

[1:3] And God said, \"Let there be light,\" and there was light.

[1:4] God saw that the light was good, and he separated the light from the darkness.

" + self.slide2 = "

This is the chorus
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah" + self.alerttext = "

Red Alert! Raise Shields!

" - ``parent`` - The parent widget. + def next(self): + print "next" + if self.currslide: + print "2" + self.frame.evaluateJavaScript("startfade('" + self.slide2 + "')") + #self.frame.findFirstElement('div#lyrics').setInnerXml(self.slide2) + else: + print "1" + self.frame.evaluateJavaScript("startfade('" + self.slide1 + "')") + #self.frame.findFirstElement('div#lyrics').setInnerXml(self.slide1) + self.currslide = not self.currslide - ``screens`` - The list of screens. - """ - log.debug(u'Initialisation started') - DisplayWidget.__init__(self, parent, primary=True) - self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) - self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - # WA_TranslucentBackground is not available in QT4.4 - try: - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - except AttributeError: - pass - self.screens = screens - self.setupScene() - self.setupVideo() - self.setupImage() - self.setupText() - self.setupAlert() - self.setupBlank() - self.blankFrame = None - self.frame = None - #Hide desktop for now until we know where to put it - #and what size it should be. - self.setVisible(False) + def text(self, slide): + self.frame.findFirstElement('div#lyrics').setInnerXml(self.slides(slide)) + + def alert(self): + self.frame.findFirstElement('div#alert').setInnerXml(self.alerttext) + + def image(self, byteImage): + self.frame.evaluateJavaScript( + "document.getElementById('video').style.visibility = 'hidden'") + self.frame.evaluateJavaScript( + "document.getElementById('image').style.visibility = 'visible'") + if self.currimage: + self.frame.findFirstElement('img').setAttribute( + 'src', unicode('data:image/png;base64,%s' % byteImage.toBase64())) + self.currimage = not self.currimage + + def video(self, videoPath, noSound=False): + if self.currimage: + self.frame.findFirstElement('video').setAttribute('src', videoPath) + self.frame.evaluateJavaScript( + "document.getElementById('video').style.visibility = 'visible'") + self.frame.evaluateJavaScript( + "document.getElementById('image').style.visibility = 'hidden'") + self.frame.evaluateJavaScript("document.getElementById('video').play()") + self.currimage = not self.currimage + + def setupSelf(self): + self.setWindowTitle(u'OpenLP Display') + self.setWindowFlags(QtCore.Qt.FramelessWindowHint | + QtCore.Qt.WindowStaysOnTopHint) + self.setGeometry(1440, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) def setup(self): - """ - Sets up the screen on a particular screen. - """ - log.debug(u'Setup %s for %s ' % ( - self.screens, self.screens.monitor_number)) - self.setVisible(False) - self.screen = self.screens.current - #Sort out screen locations and sizes - self.setGeometry(self.screen[u'size']) - self.scene.setSceneRect(0, 0, self.size().width(), - self.size().height()) - self.webView.setGeometry(0, 0, self.size().width(), - self.size().height()) - #Build a custom splash screen - self.repaint() - #Build a Black screen - painter = QtGui.QPainter() - self.blankFrame = QtGui.QImage( - self.screen[u'size'].width(), - self.screen[u'size'].height(), - QtGui.QImage.Format_ARGB32_Premultiplied) - painter.begin(self.blankFrame) - painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) - #build a blank transparent image - self.transparent = QtGui.QPixmap( - self.screen[u'size'].width(), self.screen[u'size'].height()) - self.transparent.fill(QtCore.Qt.transparent) -# self.displayText.setPixmap(self.transparent) - #self.frameView(self.transparent) - # To display or not to display? - if not self.screen[u'primary']: - self.setVisible(True) - self.primary = False - else: - self.setVisible(False) - self.primary = True - - def setupScene(self): - self.scene = QtGui.QGraphicsScene(self) - self.scene.setSceneRect(0, 0, self.size().width(), self.size().height()) - self.setScene(self.scene) - - def setupVideo(self): - self.webView = QtWebKit.QWebView() + self.webView = QtWebKit.QWebView(self) + self.webView.setGeometry(0, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) self.page = self.webView.page() - self.videoDisplay = self.page.mainFrame() - self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, +# html = build_html(None, self.screen, None, self.byteArray) +# self.webView.setHtml(html) + self.frame = self.page.mainFrame() + self.frame.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) - self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, + self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) - self.proxy = QtGui.QGraphicsProxyWidget() - self.proxy.setWidget(self.webView) - self.proxy.setWindowFlags(QtCore.Qt.Window | - QtCore.Qt.FramelessWindowHint) - self.proxy.setZValue(1) - self.scene.addItem(self.proxy) - def setupImage(self): - self.imageDisplay = QtGui.QGraphicsPixmapItem() - self.imageDisplay.setZValue(2) - self.scene.addItem(self.imageDisplay) + def preview(self): + self.setVisible(False) + preview = QtGui.QImage(QtCore.QSize(640, 480), QtGui.QImage.Format_ARGB32_Premultiplied) + painter = QtGui.QPainter(preview) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + self.frame.render(painter) + painter.end() + preview.save("temp.png", "png") + return preview - def setupText(self): - #self.displayText = QtGui.QGraphicsTextItem() - self.displayText = QtGui.QGraphicsPixmapItem() - #self.displayText.setPos(0,0) - #self.displayText.setTextWidth(self.size().width()) - self.displayText.setZValue(4) - self.scene.addItem(self.displayText) + def newDisplay(self, image, text, video=None): + if not video: + html = build_html(None, self.screen.current, None, image) + self.webView.setHtml(html) - def setupAlert(self): - self.alertText = QtGui.QGraphicsTextItem() - self.alertText.setTextWidth(self.size().width()) - self.alertText.setZValue(8) - self.scene.addItem(self.alertText) - - def setupBlank(self): - self.displayBlank = QtGui.QGraphicsPixmapItem() - self.displayBlank.setZValue(10) - self.scene.addItem(self.displayBlank) - -# def hideDisplayForVideo(self): +#class DisplayWidget(QtGui.QGraphicsView): +# """ +# Customised version of QTableWidget which can respond to keyboard +# events. +# """ +# log.info(u'MainDisplay loaded') +# +# def __init__(self, parent=None, name=None, primary=False): +# QtGui.QWidget.__init__(self, None) +# self.parent = parent +# self.primary = primary +# self.hotkey_map = { +# QtCore.Qt.Key_Return: 'servicemanager_next_item', +# QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', +# QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', +# QtCore.Qt.Key_0: 'servicemanager_next_item', +# QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} +# +# def keyPressEvent(self, event): +# if isinstance(event, QtGui.QKeyEvent): +# #here accept the event and do something +# if event.key() == QtCore.Qt.Key_Up: +# Receiver.send_message(u'slidecontroller_live_previous') +# event.accept() +# elif event.key() == QtCore.Qt.Key_Down: +# Receiver.send_message(u'slidecontroller_live_next') +# event.accept() +# elif event.key() == QtCore.Qt.Key_PageUp: +# Receiver.send_message(u'slidecontroller_live_first') +# event.accept() +# elif event.key() == QtCore.Qt.Key_PageDown: +# Receiver.send_message(u'slidecontroller_live_last') +# event.accept() +# elif event.key() in self.hotkey_map: +# Receiver.send_message(self.hotkey_map[event.key()]) +# event.accept() +# elif event.key() == QtCore.Qt.Key_Escape: +# self.resetDisplay() +# event.accept() +# event.ignore() +# else: +# event.ignore() +# +# def resetDisplay(self): +# log.debug(u'resetDisplay') +# Receiver.send_message(u'slidecontroller_live_stop_loop') +# if self.primary: +# self.setVisible(False) +# else: +# self.setVisible(True) +# +#class MainDisplay(DisplayWidget): +# """ +# This is the form that is used to display things on the projector. +# """ +# log.info(u'MainDisplay Loaded') +# +# def __init__(self, parent, screens): # """ -# Hides the main display if for the video to be played +# The constructor for the display form. +# +# ``parent`` +# The parent widget. +# +# ``screens`` +# The list of screens. # """ -# self.hideDisplay(HideMode.Screen) - - def hideDisplay(self, mode=HideMode.Screen): - """ - Hide the display by making all layers transparent - Store the images so they can be replaced when required - """ - log.debug(u'hideDisplay mode = %d', mode) - #self.displayText.setPixmap(self.transparent) - if mode == HideMode.Screen: - #self.display_image.setPixmap(self.transparent) - self.setVisible(False) - elif mode == HideMode.Blank: - self.displayBlank.setPixmap( - QtGui.QPixmap.fromImage(self.blankFrame)) - else: - if self.parent.renderManager.renderer.bg_frame: - self.displayBlank.setPixmap(QtGui.QPixmap.fromImage( - self.parent.renderManager.renderer.bg_frame)) - else: - self.displayBlank.setPixmap( - QtGui.QPixmap.fromImage(self.blankFrame)) - - def showDisplay(self, message=u''): - """ - Show the stored layers so the screen reappears as it was - originally. - Make the stored images None to release memory. - """ - log.debug(u'showDisplay') - self.displayBlank.setPixmap(self.transparent) - #Trigger actions when display is active again - Receiver.send_message(u'maindisplay_active') - - def addImageWithText(self, frame): - log.debug(u'addImageWithText') - frame = resize_image( - frame, self.screen[u'size'].width(), self.screen[u'size'].height()) - self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) - self.videoDisplay.setHtml(u'') - - def addAlert(self, message, location): - """ - Places the Alert text on the display at the correct location - ``message`` - Text to be displayed - ``location`` - Where on the screen the text should be. From the AlertTab - Combo box. - """ - log.debug(u'addAlertImage') - if location == 0: - self.alertText.setPos(0, 0) - elif location == 1: - self.alertText.setPos(0, self.size().height() / 2) - else: - self.alertText.setPos(0, self.size().height() - 76) - self.alertText.setHtml(message) - - def displayImage(self, frame): - """ - Places the Image passed on the display screen - ``frame`` - The image to be displayed - """ - log.debug(u'adddisplayImage') - if isinstance(frame, QtGui.QImage): - self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) - else: - self.imageDisplay.setPixmap(frame) - self.videoDisplay.setHtml(u'') - - def displayVideo(self, path): - """ - Places the Video passed on the display screen - ``path`` - The path to the image to be displayed - """ - log.debug(u'adddisplayVideo') - self.displayImage(self.transparent) - self.videoDisplay.setHtml(HTMLVIDEO % - (path, self.screen[u'size'].width(), - self.screen[u'size'].height())) - - def frameView(self, frame, transition=False): - """ - Called from a slide controller to display a frame - if the alert is in progress the alert is added on top - ``frame`` - Image frame to be rendered - ``transition`` - Are transitions required. - """ - log.debug(u'frameView') - if transition: - if self.frame is not None: - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(self.frame)) - self.repaint() - Receiver.send_message(u'openlp_process_events') - time.sleep(0.1) - self.frame = None - if frame[u'trans'] is not None: - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(frame[u'trans'])) - self.repaint() - Receiver.send_message(u'openlp_process_events') - time.sleep(0.1) - self.frame = frame[u'trans'] - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(frame[u'main'])) - else: - if isinstance(frame, QtGui.QPixmap): - self.displayText.setPixmap(frame) - else: - self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame)) - if not self.isVisible() and self.screens.display: - self.setVisible(True) - -class VideoDisplay(Phonon.VideoWidget): - """ - This is the form that is used to display videos on the projector. - """ - log.info(u'VideoDisplay Loaded') - - def __init__(self, parent, screens, - aspect=Phonon.VideoWidget.AspectRatioWidget): - """ - The constructor for the display form. - - ``parent`` - The parent widget. - - ``screens`` - The list of screens. - """ - log.debug(u'VideoDisplay Initialisation started') - Phonon.VideoWidget.__init__(self) - self.setWindowTitle(u'OpenLP Video Display') - self.parent = parent - self.screens = screens - self.hidden = False - self.message = None - self.mediaActive = False - self.mediaObject = Phonon.MediaObject() - self.setAspectRatio(aspect) - self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) - Phonon.createPath(self.mediaObject, self) - Phonon.createPath(self.mediaObject, self.audioObject) - flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog -## # WindowsStaysOnBottomHint is not available in QT4.4 +# log.debug(u'Initialisation started') +# DisplayWidget.__init__(self, parent, primary=True) +# self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) +# self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) +# self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) +# # WA_TranslucentBackground is not available in QT4.4 # try: -# flags = flags | QtCore.Qt.WindowStaysOnBottomHint +# self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # except AttributeError: # pass - self.setWindowFlags(flags) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'videodisplay_play'), self.onMediaPlay) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'videodisplay_pause'), self.onMediaPause) -# QtCore.QObject.connect(Receiver.get_receiver(), -# QtCore.SIGNAL(u'videodisplay_background'), self.onMediaBackground) - - QtCore.QObject.connect(self.mediaObject, - QtCore.SIGNAL(u'finished()'), self.onMediaStop) - self.setVisible(False) - - def keyPressEvent(self, event): - if isinstance(event, QtGui.QKeyEvent): - #here accept the event and do something - if event.key() == QtCore.Qt.Key_Escape: - self.onMediaStop() - event.accept() - event.ignore() - else: - event.ignore() - - def setup(self): - """ - Sets up the screen on a particular screen. - """ - log.debug(u'VideoDisplay Setup %s for %s ' % (self.screens, - self.screens.monitor_number)) - self.screen = self.screens.current - #Sort out screen locations and sizes - self.setGeometry(self.screen[u'size']) - # To display or not to display? - if not self.screen[u'primary']: # and self.isVisible(): - #self.showFullScreen() - self.setVisible(False) - self.primary = False - else: - self.setVisible(False) - self.primary = True - - def closeEvent(self, event): - """ - Shutting down so clean up connections - """ - self.onMediaStop() - for path in self.outputPaths(): - path.disconnect() - -# def onMediaBackground(self, message=None): +# self.screens = screens +# self.setupScene() +# self.setupVideo() +# self.setupImage() +# self.setupText() +# self.setupAlert() +# self.setupBlank() +# self.blankFrame = None +# self.frame = None +# #Hide desktop for now until we know where to put it +# #and what size it should be. +# self.setVisible(False) +# +# def setup(self): # """ -# Play a video triggered from the video plugin with the -# file name passed in on the event. -# Also triggered from the Finish event so the video will loop -# if it is triggered from the plugin +# Sets up the screen on a particular screen. +# """ +# log.debug(u'Setup %s for %s ' % ( +# self.screens, self.screens.monitor_number)) +# self.setVisible(False) +# self.screen = self.screens.current +# #Sort out screen locations and sizes +# self.setGeometry(self.screen[u'size']) +# self.scene.setSceneRect(0, 0, self.size().width(), +# self.size().height()) +# self.webView.setGeometry(0, 0, self.size().width(), +# self.size().height()) +# #Build a custom splash screen +# self.repaint() +# #Build a Black screen +# painter = QtGui.QPainter() +# self.blankFrame = QtGui.QImage( +# self.screen[u'size'].width(), +# self.screen[u'size'].height(), +# QtGui.QImage.Format_ARGB32_Premultiplied) +# painter.begin(self.blankFrame) +# painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) +# #build a blank transparent image +# self.transparent = QtGui.QPixmap( +# self.screen[u'size'].width(), self.screen[u'size'].height()) +# self.transparent.fill(QtCore.Qt.transparent) +## self.displayText.setPixmap(self.transparent) +# #self.frameView(self.transparent) +# # To display or not to display? +# if not self.screen[u'primary']: +# self.setVisible(True) +# self.primary = False +# else: +# self.setVisible(False) +# self.primary = True +# +# def setupScene(self): +# self.scene = QtGui.QGraphicsScene(self) +# self.scene.setSceneRect(0, 0, self.size().width(), self.size().height()) +# self.setScene(self.scene) +# +# def setupVideo(self): +# self.webView = QtWebKit.QWebView() +# self.page = self.webView.page() +# self.videoDisplay = self.page.mainFrame() +# self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, +# QtCore.Qt.ScrollBarAlwaysOff) +# self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, +# QtCore.Qt.ScrollBarAlwaysOff) +# self.proxy = QtGui.QGraphicsProxyWidget() +# self.proxy.setWidget(self.webView) +# self.proxy.setWindowFlags(QtCore.Qt.Window | +# QtCore.Qt.FramelessWindowHint) +# self.proxy.setZValue(1) +# self.scene.addItem(self.proxy) +# +# def setupImage(self): +# self.imageDisplay = QtGui.QGraphicsPixmapItem() +# self.imageDisplay.setZValue(2) +# self.scene.addItem(self.imageDisplay) +# +# def setupText(self): +# #self.displayText = QtGui.QGraphicsTextItem() +# self.displayText = QtGui.QGraphicsPixmapItem() +# #self.displayText.setPos(0,0) +# #self.displayText.setTextWidth(self.size().width()) +# self.displayText.setZValue(4) +# self.scene.addItem(self.displayText) +# +# def setupAlert(self): +# self.alertText = QtGui.QGraphicsTextItem() +# self.alertText.setTextWidth(self.size().width()) +# self.alertText.setZValue(8) +# self.scene.addItem(self.alertText) +# +# def setupBlank(self): +# self.displayBlank = QtGui.QGraphicsPixmapItem() +# self.displayBlank.setZValue(10) +# self.scene.addItem(self.displayBlank) +# +## def hideDisplayForVideo(self): +## """ +## Hides the main display if for the video to be played +## """ +## self.hideDisplay(HideMode.Screen) +# +# def hideDisplay(self, mode=HideMode.Screen): +# """ +# Hide the display by making all layers transparent +# Store the images so they can be replaced when required +# """ +# log.debug(u'hideDisplay mode = %d', mode) +# #self.displayText.setPixmap(self.transparent) +# if mode == HideMode.Screen: +# #self.display_image.setPixmap(self.transparent) +# self.setVisible(False) +# elif mode == HideMode.Blank: +# self.displayBlank.setPixmap( +# QtGui.QPixmap.fromImage(self.blankFrame)) +# else: +# if self.parent.renderManager.renderer.bg_frame: +# self.displayBlank.setPixmap(QtGui.QPixmap.fromImage( +# self.parent.renderManager.renderer.bg_frame)) +# else: +# self.displayBlank.setPixmap( +# QtGui.QPixmap.fromImage(self.blankFrame)) +# +# def showDisplay(self, message=u''): +# """ +# Show the stored layers so the screen reappears as it was +# originally. +# Make the stored images None to release memory. +# """ +# log.debug(u'showDisplay') +# self.displayBlank.setPixmap(self.transparent) +# #Trigger actions when display is active again +# Receiver.send_message(u'maindisplay_active') +# +# def addImageWithText(self, frame): +# log.debug(u'addImageWithText') +# frame = resize_image( +# frame, self.screen[u'size'].width(), self.screen[u'size'].height()) +# self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) +# self.videoDisplay.setHtml(u'') +# +# def addAlert(self, message, location): +# """ +# Places the Alert text on the display at the correct location +# ``message`` +# Text to be displayed +# ``location`` +# Where on the screen the text should be. From the AlertTab +# Combo box. +# """ +# log.debug(u'addAlertImage') +# if location == 0: +# self.alertText.setPos(0, 0) +# elif location == 1: +# self.alertText.setPos(0, self.size().height() / 2) +# else: +# self.alertText.setPos(0, self.size().height() - 76) +# self.alertText.setHtml(message) +# +# def displayImage(self, frame): +# """ +# Places the Image passed on the display screen +# ``frame`` +# The image to be displayed +# """ +# log.debug(u'adddisplayImage') +# if isinstance(frame, QtGui.QImage): +# self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) +# else: +# self.imageDisplay.setPixmap(frame) +# self.videoDisplay.setHtml(u'') +# +# def displayVideo(self, path): +# """ +# Places the Video passed on the display screen +# ``path`` +# The path to the image to be displayed +# """ +# log.debug(u'adddisplayVideo') +# self.displayImage(self.transparent) +# self.videoDisplay.setHtml(HTMLVIDEO % +# (path, self.screen[u'size'].width(), +# self.screen[u'size'].height())) +# +# def frameView(self, frame, transition=False): +# """ +# Called from a slide controller to display a frame +# if the alert is in progress the alert is added on top +# ``frame`` +# Image frame to be rendered +# ``transition`` +# Are transitions required. +# """ +# log.debug(u'frameView') +# if transition: +# if self.frame is not None: +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(self.frame)) +# self.repaint() +# Receiver.send_message(u'openlp_process_events') +# time.sleep(0.1) +# self.frame = None +# if frame[u'trans'] is not None: +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(frame[u'trans'])) +# self.repaint() +# Receiver.send_message(u'openlp_process_events') +# time.sleep(0.1) +# self.frame = frame[u'trans'] +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(frame[u'main'])) +# else: +# if isinstance(frame, QtGui.QPixmap): +# self.displayText.setPixmap(frame) +# else: +# self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame)) +# if not self.isVisible() and self.screens.display: +# self.setVisible(True) +# +#class VideoDisplay(Phonon.VideoWidget): +# """ +# This is the form that is used to display videos on the projector. +# """ +# log.info(u'VideoDisplay Loaded') +# +# def __init__(self, parent, screens, +# aspect=Phonon.VideoWidget.AspectRatioWidget): +# """ +# The constructor for the display form. +# +# ``parent`` +# The parent widget. +# +# ``screens`` +# The list of screens. +# """ +# log.debug(u'VideoDisplay Initialisation started') +# Phonon.VideoWidget.__init__(self) +# self.setWindowTitle(u'OpenLP Video Display') +# self.parent = parent +# self.screens = screens +# self.hidden = False +# self.message = None +# self.mediaActive = False +# self.mediaObject = Phonon.MediaObject() +# self.setAspectRatio(aspect) +# self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) +# Phonon.createPath(self.mediaObject, self) +# Phonon.createPath(self.mediaObject, self.audioObject) +# flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog +### # WindowsStaysOnBottomHint is not available in QT4.4 +## try: +## flags = flags | QtCore.Qt.WindowStaysOnBottomHint +## except AttributeError: +## pass +# self.setWindowFlags(flags) +# QtCore.QObject.connect(Receiver.get_receiver(), +# QtCore.SIGNAL(u'videodisplay_play'), self.onMediaPlay) +# QtCore.QObject.connect(Receiver.get_receiver(), +# QtCore.SIGNAL(u'videodisplay_pause'), self.onMediaPause) +## QtCore.QObject.connect(Receiver.get_receiver(), +## QtCore.SIGNAL(u'videodisplay_background'), self.onMediaBackground) +# +# QtCore.QObject.connect(self.mediaObject, +# QtCore.SIGNAL(u'finished()'), self.onMediaStop) +# self.setVisible(False) +# +# def keyPressEvent(self, event): +# if isinstance(event, QtGui.QKeyEvent): +# #here accept the event and do something +# if event.key() == QtCore.Qt.Key_Escape: +# self.onMediaStop() +# event.accept() +# event.ignore() +# else: +# event.ignore() +# +# def setup(self): +# """ +# Sets up the screen on a particular screen. +# """ +# log.debug(u'VideoDisplay Setup %s for %s ' % (self.screens, +# self.screens.monitor_number)) +# self.screen = self.screens.current +# #Sort out screen locations and sizes +# self.setGeometry(self.screen[u'size']) +# # To display or not to display? +# if not self.screen[u'primary']: # and self.isVisible(): +# #self.showFullScreen() +# self.setVisible(False) +# self.primary = False +# else: +# self.setVisible(False) +# self.primary = True +# +# def closeEvent(self, event): +# """ +# Shutting down so clean up connections +# """ +# self.onMediaStop() +# for path in self.outputPaths(): +# path.disconnect() +# +## def onMediaBackground(self, message=None): +## """ +## Play a video triggered from the video plugin with the +## file name passed in on the event. +## Also triggered from the Finish event so the video will loop +## if it is triggered from the plugin +## """ +## log.debug(u'VideoDisplay Queue new media message %s' % message) +## #If not file take the stored one +## if not message: +## message = self.message +## # still no file name then stop as it was a normal video stopping +## if message: +## self.mediaObject.setCurrentSource(Phonon.MediaSource(message)) +## self.message = message +## self._play() +# +# def onMediaQueue(self, message): +# """ +# Set up a video to play from the serviceitem. # """ # log.debug(u'VideoDisplay Queue new media message %s' % message) -# #If not file take the stored one -# if not message: -# message = self.message -# # still no file name then stop as it was a normal video stopping -# if message: -# self.mediaObject.setCurrentSource(Phonon.MediaSource(message)) -# self.message = message +# file = os.path.join(message.get_frame_path(), +# message.get_frame_title()) +# self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) +# self.mediaActive = True +# self._play() +# +# def onMediaPlay(self): +# """ +# Respond to the Play button on the slide controller unless the display +# has been hidden by the slidecontroller +# """ +# if not self.hidden: +# log.debug(u'VideoDisplay Play the new media, Live ') # self._play() - - def onMediaQueue(self, message): - """ - Set up a video to play from the serviceitem. - """ - log.debug(u'VideoDisplay Queue new media message %s' % message) - file = os.path.join(message.get_frame_path(), - message.get_frame_title()) - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.mediaActive = True - self._play() - - def onMediaPlay(self): - """ - Respond to the Play button on the slide controller unless the display - has been hidden by the slidecontroller - """ - if not self.hidden: - log.debug(u'VideoDisplay Play the new media, Live ') - self._play() - - def _play(self): - """ - We want to play the video so start it and display the screen - """ - log.debug(u'VideoDisplay _play called') - self.mediaObject.play() - self.setVisible(True) - - def onMediaPause(self): - """ - Pause the video and refresh the screen - """ - log.debug(u'VideoDisplay Media paused by user') - self.mediaObject.pause() - self.show() - - def onMediaStop(self): - """ - Stop the video and clean up - """ - log.debug(u'VideoDisplay Media stopped by user') - self.message = None - self.mediaActive = False - self.mediaObject.stop() - self.onMediaFinish() - - def onMediaFinish(self): - """ - Clean up the Object queue - """ - log.debug(u'VideoDisplay Reached end of media playlist') - self.mediaObject.clearQueue() - self.setVisible(False) - - def mediaHide(self, message=u''): - """ - Hide the video display - """ - self.mediaObject.pause() - self.hidden = True - self.setVisible(False) - - def mediaShow(self, message=''): - """ - Show the video display if it was already hidden - """ - if self.hidden: - self.hidden = False - if self.mediaActive: - self._play() +# +# def _play(self): +# """ +# We want to play the video so start it and display the screen +# """ +# log.debug(u'VideoDisplay _play called') +# self.mediaObject.play() +# self.setVisible(True) +# +# def onMediaPause(self): +# """ +# Pause the video and refresh the screen +# """ +# log.debug(u'VideoDisplay Media paused by user') +# self.mediaObject.pause() +# self.show() +# +# def onMediaStop(self): +# """ +# Stop the video and clean up +# """ +# log.debug(u'VideoDisplay Media stopped by user') +# self.message = None +# self.mediaActive = False +# self.mediaObject.stop() +# self.onMediaFinish() +# +# def onMediaFinish(self): +# """ +# Clean up the Object queue +# """ +# log.debug(u'VideoDisplay Reached end of media playlist') +# self.mediaObject.clearQueue() +# self.setVisible(False) +# +# def mediaHide(self, message=u''): +# """ +# Hide the video display +# """ +# self.mediaObject.pause() +# self.hidden = True +# self.setVisible(False) +# +# def mediaShow(self, message=''): +# """ +# Show the video display if it was already hidden +# """ +# if self.hidden: +# self.hidden = False +# if self.mediaActive: +# self._play() class AudioPlayer(QtCore.QObject): """ This Class will play audio only allowing components to work with a - soundtrack which does not take over the user interface. + soundtrack independent of the user interface. """ log.info(u'AudioPlayer Loaded') From 44ae86e82bcf1756178e0f6d2c9097e485325eb2 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 11:58:36 +0100 Subject: [PATCH 008/193] Renderer replacement humm --- openlp/core/lib/__init__.py | 24 ++--- openlp/core/lib/htmlbuilder.py | 155 +++++++++++++++++++++++++++++++++ openlp/core/ui/maindisplay.py | 4 +- 3 files changed, 162 insertions(+), 21 deletions(-) create mode 100644 openlp/core/lib/htmlbuilder.py diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 088ac6e7a..fa2161872 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -165,23 +165,6 @@ def context_menu_separator(base): action.setSeparator(True) return action -def resize_image_for_web(image, width, height, background=QtCore.Qt.black): - """ - Resize an image to fit on the current screen for the web and retuns - it as a byte stream. - - ``image`` - The image to resize. - ``width`` - The new image width. - ``height`` - The new image height. - ``background `` - The background colour defaults to black. - """ - new_image = resize_image(image, width, height, background) - return image_to_byte(image) - def image_to_byte(image): """ Resize an image to fit on the current screen for the web and retuns @@ -193,10 +176,13 @@ def image_to_byte(image): byte_array = QtCore.QByteArray() buffer = QtCore.QBuffer(byte_array) #// use buffer to store pixmap into byteArray buffer.open(QtCore.QIODevice.WriteOnly) - pixmap = QtGui.QPixmap(image) + if isinstance(image, QtGui.QImage): + pixmap = QtGui.QPixmap.fromImage(image) + else: + pixmap = QtGui.QPixmap(image) pixmap.save(buffer, "PNG") #convert to base64 encoding so does not get missed! - return byte_array + return byte_array.toBase64() def resize_image(image, width, height, background=QtCore.Qt.black): """ diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py new file mode 100644 index 000000000..2111dbada --- /dev/null +++ b/openlp/core/lib/htmlbuilder.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +from openlp.core.lib import image_to_byte + +HTMLSRC = u""" + + +OpenLP Display + + + + +
+
+
+ +%s + + + """ +def build_html(theme, screen, alert, image): + width = screen[u'size'].width() + height = screen[u'size'].height() + aa = build_image_src(theme, width, height, alert, image) + html = HTMLSRC % (build_video(theme, width, height, alert), + build_image(theme, width, height, alert), + build_lyrics(theme, width, height, alert), + build_alert(theme, width, height, alert), + build_image(theme, width, height, alert)) + #build_image_src(theme, width, height, alert, image)) + print html + return html + +def build_video(theme, width, height, alert): + video = """ + #video { + position: absolute; + left: 0px; + top: 0px; + width: 640px + height: 480px; + z-index:1; + } + """ + return video + +def build_image(theme, width, height, alert): + image = """ + #image { + position: absolute; + left: 0px; + top: 0px; + width: %spx; + height: %spx; + z-index:2; + } + """ + return image % (width, height) + +def build_image_src(theme, width, height, alert, image): + # + image_src = """ + "; + """ + return unicode(image_src % unicode(image_to_byte(image))) + +def build_lyrics(theme, width, height, alert): + lyrics = """ + .lyrics { + position: absolute; + left: 0px; + top: 0px; + width: 640px; + height: 480px; + z-index:3; + text-shadow: 2px 2px 2px green; + font-size: 40px; + } + """ + return lyrics + +def build_alert(theme, width, height, alert): + alert = """ + #alert { + position: absolute; + left: 0px; + top: 70px; + width: %spx; + height: 10px; + z-index:4; + font-size: 50px; + } + #alert p { + background-color: red; + } + """ + return alert % (width) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 9284b2d49..bbe6e43e5 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -30,7 +30,7 @@ import time from PyQt4 import QtCore, QtGui, QtWebKit from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver, resize_image, image_to_byte, build_html +from openlp.core.lib import Receiver, resize_image, build_html from openlp.core.ui import HideMode log = logging.getLogger(__name__) @@ -101,7 +101,7 @@ class DisplayManager(QtGui.QWidget): (self.screens.current[u'size'].width() - splash_image.width()) / 2, (self.screens.current[u'size'].height() - splash_image.height()) / 2, splash_image) - self.mainDisplay.newDisplay(image_to_byte(QtGui.QPixmap.fromImage(self.initialFrame)), None, None) + self.mainDisplay.newDisplay(self.initialFrame, None, None) self.mainDisplay.show() def hideDisplay(self, message): From c46901cb8a3eb4fe2103b21135b8e9eee281d143 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 12:38:09 +0100 Subject: [PATCH 009/193] Renderer replacement- screen fix --- openlp/core/lib/htmlbuilder.py | 3 +-- openlp/core/ui/maindisplay.py | 29 ++++++++++++----------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 2111dbada..5361fe044 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -84,9 +84,8 @@ def build_html(theme, screen, alert, image): build_image(theme, width, height, alert), build_lyrics(theme, width, height, alert), build_alert(theme, width, height, alert), - build_image(theme, width, height, alert)) + build_image(theme, width, height, alert), aa) #build_image_src(theme, width, height, alert, image)) - print html return html def build_video(theme, width, height, alert): diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index bbe6e43e5..017d59280 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -68,7 +68,6 @@ class DisplayManager(QtGui.QWidget): def __init__(self, screens): QtGui.QWidget.__init__(self) self.screens = screens - #self.videoDisplay = VideoDisplay(self, screens) self.audioPlayer = AudioPlayer(self) self.mainDisplay = WebViewer(self, screens) QtCore.QObject.connect(Receiver.get_receiver(), @@ -82,11 +81,8 @@ class DisplayManager(QtGui.QWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.setup) - def setup(self): log.debug(u'mainDisplay - setup') - #self.videoDisplay.setup() - self.mainDisplay.setup() #Build the initial frame. self.initialFrame = QtGui.QImage( self.screens.current[u'size'].width(), @@ -101,6 +97,7 @@ class DisplayManager(QtGui.QWidget): (self.screens.current[u'size'].width() - splash_image.width()) / 2, (self.screens.current[u'size'].height() - splash_image.height()) / 2, splash_image) + self.mainDisplay.setup() self.mainDisplay.newDisplay(self.initialFrame, None, None) self.mainDisplay.show() @@ -210,8 +207,10 @@ class WebViewer(DisplayWidget): def __init__(self, parent, screens): DisplayWidget.__init__(self, parent=None) - self.screen = screens - self.setupSelf() + self.screens = screens + self.setWindowTitle(u'OpenLP Display') + self.setWindowFlags(QtCore.Qt.FramelessWindowHint | + QtCore.Qt.WindowStaysOnTopHint) self.currimage = False # self.byteArray = QtCore.QByteArray() # buffer = QtCore.QBuffer(self.byteArray) #// use buffer to store pixmap into byteArray @@ -223,7 +222,6 @@ class WebViewer(DisplayWidget): # buffer.open(QtCore.QIODevice.WriteOnly) # pixmap = QtGui.QPixmap("file:///home/timali/Pictures/out.png") # pixmap.save(buffer, "PNG") - self.setup() # self.image1 = "file:///home/timali/Pictures/IMG_0726.jpg" # self.image2 = "file:///home/timali/Pictures/out.png" self.currvideo = False @@ -272,18 +270,15 @@ class WebViewer(DisplayWidget): self.frame.evaluateJavaScript("document.getElementById('video').play()") self.currimage = not self.currimage - def setupSelf(self): - self.setWindowTitle(u'OpenLP Display') - self.setWindowFlags(QtCore.Qt.FramelessWindowHint | - QtCore.Qt.WindowStaysOnTopHint) - self.setGeometry(1440, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) - def setup(self): + log.debug(u'Setup %s for %s ' % ( + self.screens, self.screens.monitor_number)) + self.screen = self.screens.current + self.setVisible(False) + self.setGeometry(self.screen[u'size']) self.webView = QtWebKit.QWebView(self) - self.webView.setGeometry(0, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) + self.webView.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height()) self.page = self.webView.page() -# html = build_html(None, self.screen, None, self.byteArray) -# self.webView.setHtml(html) self.frame = self.page.mainFrame() self.frame.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) @@ -302,7 +297,7 @@ class WebViewer(DisplayWidget): def newDisplay(self, image, text, video=None): if not video: - html = build_html(None, self.screen.current, None, image) + html = build_html(None, self.screen, None, image) self.webView.setHtml(html) #class DisplayWidget(QtGui.QGraphicsView): From f3b4a1dae5ebdad214ffc6ef370db91f343257e6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 13:35:41 +0100 Subject: [PATCH 010/193] Renderer replacement- display splash now. --- openlp/core/lib/htmlbuilder.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 5361fe044..0521b0272 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -38,6 +38,7 @@ HTMLSRC = u""" %s %s %s +%s - - -