diff --git a/.travis.yml b/.travis.yml index ade84bd88..4772bb138 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ python: - "2.6" - "2.7" install: - - easy_install https://www.djangoproject.com/download/1.5b2/tarball/ + - easy_install https://www.djangoproject.com/download/1.5c1/tarball/ - pip install -r requirements.txt --use-mirrors - python extras/scripts/create_local_settings.py script: - coverage run ./manage.py test tests && coverage report -m - - pep8 --max-line-length=150 --exclude="urls.py,motion/" --statistics openslides + - pep8 --max-line-length=150 --exclude="urls.py," --statistics openslides diff --git a/CHANGELOG b/CHANGELOG index 2f86821bf..bf0daaa0e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,18 @@ CHANGELOG of OpenSlides http://openslides.org +Version 1.4 (unreleased) +======================== + + +Version 1.3.1 (2013-01-09) +========================== +[http://dev.openslides.org/milestone/1.3.1] + +- Fixed unwanted automatical language switching on projector view if more than + one browser languages send projector request to OpenSlides (#434) + + Version 1.3 (2012-12-10) ======================== [http://dev.openslides.org/milestone/1.3] diff --git a/INSTALL.txt b/INSTALL.txt index 739431350..4f3c5e6a0 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -18,7 +18,11 @@ I. Installation on GNU/Linux and MacOSX using the Python Package Index (PyPI) 1. Check requirements: Make sure that you have installed Python Programming Language 2 - (>= 2.6) on your system. + (>= 2.6) on your system. You will also need the Python + development headers. + + E. g. for Ubuntu run: + $ sudo apt-get install python-dev 2. Setup a virtual environment with virtualenv (optional): diff --git a/README.txt b/README.txt index 0485a2203..cdbe0880b 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,7 @@ English README file for OpenSlides ================================== -This is OpenSlides, version 1.3.1 (unreleased). +This is OpenSlides, version 1.4.0 (unreleased). What is OpenSlides? diff --git a/THANKS b/THANKS index b4039e3ef..f0ed4bea3 100644 --- a/THANKS +++ b/THANKS @@ -8,9 +8,16 @@ OpenSlides uses parts of the following projects: * jQuery + and some addons: cookie, form, once, templating * jQuery UI + custom ui components: core, widget, mouse, sortable, datepicker, slider + with css theme 'smoothness' + and some addons: slider access, timepicker + +* Twitter Bootstrap + * ReportLab @@ -18,8 +25,5 @@ OpenSlides uses parts of the following projects: * Drupal (tabledrag function) -* Oxygen-Icons - - * Ubuntu TrueType Font diff --git a/extras/benchmark/bench.py b/extras/benchmark/bench.py index 7b9ca4178..31e886d01 100755 --- a/extras/benchmark/bench.py +++ b/extras/benchmark/bench.py @@ -31,12 +31,8 @@ URL_SETS = { "/jsi18n/", "/static/styles/base.css", "/static/javascript/utils.js", - "/static/javascript/jquery.js", - "/static/images/bg-submenu.gif", - "/static/images/bg-header.gif", - "/static/images/logo.png", - "/static/images/icons/dialog-information.png", - "/static/images/icons/cross.png", + "/static/javascript/jquery.min.js", + "/static/img/logo.png", ], "agenda": [ "/agenda/", @@ -44,25 +40,15 @@ URL_SETS = { "/static/styles/tabledrag.css", "/static/javascript/utils.js", "/static/styles/agenda.css", - "/static/javascript/jquery.js", + "/static/javascript/jquery.min.js", "/jsi18n/", - "/static/images/bg-header.gif", - "/static/images/bg-submenu.gif", - "/static/images/logo.png", - "/static/images/icons/application-pdf.png", - "/static/images/icons/cross.png", ], "application": [ "/application/", "/static/styles/base.css", "/static/javascript/utils.js", - "/static/javascript/jquery.js", + "/static/javascript/jquery.min.js", "/jsi18n/", - "/static/images/bg-header.gif", - "/static/images/bg-submenu.gif", - "/static/images/icons/cross.png", - "/static/images/logo.png", - "/static/images/icons/application-pdf.png", ] } diff --git a/openslides/agenda/static/images/icons/summary.png b/openslides/agenda/static/images/icons/summary.png deleted file mode 100644 index 0f8264c78..000000000 Binary files a/openslides/agenda/static/images/icons/summary.png and /dev/null differ diff --git a/openslides/agenda/static/javascript/agenda.js b/openslides/agenda/static/javascript/agenda.js index 93b2db91c..69432803f 100644 --- a/openslides/agenda/static/javascript/agenda.js +++ b/openslides/agenda/static/javascript/agenda.js @@ -20,7 +20,7 @@ function hideClosedSlides(hide) { if (hide) { $('#hidelink').attr('title', 'show'); $('#hidelink').removeClass('hide').addClass('show'); - $('.close_link.closed').parent().parent().each(function() { + $('.close_link .icon-checked-new').parent().parent().parent().each(function() { hideLine($(this)); }); hidden = $('#menu-overview tr:hidden').size(); @@ -35,21 +35,26 @@ function hideClosedSlides(hide) { } $(function() { - $('.close_link a').click(function(event) { + // change participant status (on/off) + $('.close_link').click(function(event) { event.preventDefault(); - slide = $(this); + var link = $(this); $.ajax({ type: 'GET', - url: slide.attr('href'), + url: $(this).attr('href'), dataType: 'json', success: function(data) { if (data.closed) { - newclass = 'closed'; + newclass = 'icon-checked-new'; + link.parent().parent().addClass('offline'); + link.addClass('btn-success'); } else { - newclass = 'open'; + newclass = 'icon-unchecked-new'; + link.parent().parent().removeClass('offline'); + link.removeClass('btn-success'); } - slide.parent().removeClass('closed open').addClass(newclass); - slide.attr('href', data.link); + link.children('i').removeClass('icon-checked-new icon-unchecked-new').addClass(newclass); + link.attr('href', data.link); } }); }); diff --git a/openslides/agenda/static/javascript/ui/jquery-ui-sliderAccess.js b/openslides/agenda/static/javascript/jquery-ui-sliderAccess.js similarity index 100% rename from openslides/agenda/static/javascript/ui/jquery-ui-sliderAccess.js rename to openslides/agenda/static/javascript/jquery-ui-sliderAccess.js diff --git a/openslides/agenda/static/javascript/ui/jquery-ui-timepicker-addon.js b/openslides/agenda/static/javascript/jquery-ui-timepicker-addon.js similarity index 100% rename from openslides/agenda/static/javascript/ui/jquery-ui-timepicker-addon.js rename to openslides/agenda/static/javascript/jquery-ui-timepicker-addon.js diff --git a/openslides/agenda/static/javascript/ui/jquery-ui-1.10.0.min.js b/openslides/agenda/static/javascript/ui/jquery-ui-1.10.0.min.js deleted file mode 100644 index b15bcf647..000000000 --- a/openslides/agenda/static/javascript/ui/jquery-ui-1.10.0.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery UI - v1.10.0 - 2013-01-17 -* http://jqueryui.com -* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ -(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return e.css(this,"visibility")==="hidden"}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.10.0",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(n){return arguments.length?t.call(this,e.camelCase(n)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)}})})(jQuery),function(e,t){var n=0,r=Array.prototype.slice,i=e.cleanData;e.cleanData=function(t){for(var n=0,r;(r=t[n])!=null;n++)try{e(r).triggerHandler("remove")}catch(s){}i(t)},e.widget=function(t,n,r){var i,s,o,u,a={},f=t.split(".")[0];t=t.split(".")[1],i=f+"-"+t,r||(r=n,n=e.Widget),e.expr[":"][i.toLowerCase()]=function(t){return!!e.data(t,i)},e[f]=e[f]||{},s=e[f][t],o=e[f][t]=function(e,t){if(!this._createWidget)return new o(e,t);arguments.length&&this._createWidget(e,t)},e.extend(o,s,{version:r.version,_proto:e.extend({},r),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(r,function(t,r){if(!e.isFunction(r)){a[t]=r;return}a[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},i=function(e){return n.prototype[t].apply(this,e)};return function(){var t=this._super,n=this._superApply,s;return this._super=e,this._superApply=i,s=r.apply(this,arguments),this._super=t,this._superApply=n,s}}()}),o.prototype=e.widget.extend(u,{widgetEventPrefix:s?u.widgetEventPrefix:t},a,{constructor:o,namespace:f,widgetName:t,widgetFullName:i}),s?(e.each(s._childConstructors,function(t,n){var r=n.prototype;e.widget(r.namespace+"."+r.widgetName,o,n._proto)}),delete s._childConstructors):n._childConstructors.push(o),e.widget.bridge(t,o)},e.widget.extend=function(n){var i=r.call(arguments,1),s=0,o=i.length,u,a;for(;s",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n=="string"){i={},s=n.split("."),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})}(jQuery),function(e,t){e.widget("ui.draggable",e.ui.mouse,{version:"1.10.0",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){this.options.helper==="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(t){var n=this.options;return this.helper||n.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(n.iframeFix===!0?"iframe":n.iframeFix).each(function(){e("
").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var n=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,n.cursorAt&&this._adjustOffsetFromHelper(n.cursorAt),n.containment&&this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,n){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute");if(!n){var r=this._uiHash();if(this._trigger("drag",t,r)===!1)return this._mouseUp({}),!1;this.position=r.position}if(!this.options.axis||this.options.axis!=="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!=="x")this.helper[0].style.top=this.position.top+"px";return e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var n,r=this,i=!1,s=!1;e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),n=this.element[0];while(n&&(n=n.parentNode))n===document&&(i=!0);return!i&&this.options.helper==="original"?!1:(this.options.revert==="invalid"&&!s||this.options.revert==="valid"&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){r._trigger("stop",t)!==!1&&r._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1)},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){var n=!this.options.handle||!e(this.options.handle,this.element).length?!0:!1;return e(this.options.handle,this.element).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t])):n.helper==="clone"?this.element.clone().removeAttr("id"):this.element;return r.parents("body").length||r.appendTo(n.appendTo==="parent"?this.element[0].parentNode:n.appendTo),r[0]!==this.element[0]&&!/(fixed|absolute)/.test(r.css("position"))&&r.css("position","absolute"),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition==="absolute"&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()==="html"&&e.ui.ie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition==="relative"){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,n,r,i=this.options;i.containment==="parent"&&(i.containment=this.helper[0].parentNode);if(i.containment==="document"||i.containment==="window")this.containment=[i.containment==="document"?0:e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,i.containment==="document"?0:e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(i.containment==="document"?0:e(window).scrollLeft())+e(i.containment==="document"?document:window).width()-this.helperProportions.width-this.margins.left,(i.containment==="document"?0:e(window).scrollTop())+(e(i.containment==="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(i.containment)&&i.containment.constructor!==Array){n=e(i.containment),r=n[0];if(!r)return;t=e(r).css("overflow")!=="hidden",this.containment=[(parseInt(e(r).css("borderLeftWidth"),10)||0)+(parseInt(e(r).css("paddingLeft"),10)||0),(parseInt(e(r).css("borderTopWidth"),10)||0)+(parseInt(e(r).css("paddingTop"),10)||0),(t?Math.max(r.scrollWidth,r.offsetWidth):r.offsetWidth)-(parseInt(e(r).css("borderLeftWidth"),10)||0)-(parseInt(e(r).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(r.scrollHeight,r.offsetHeight):r.offsetHeight)-(parseInt(e(r).css("borderTopWidth"),10)||0)-(parseInt(e(r).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=n}else i.containment.constructor===Array&&(this.containment=i.containment)},_convertPositionTo:function(t,n){n||(n=this.position);var r=t==="absolute"?1:-1,i=this.cssPosition!=="absolute"||this.scrollParent[0]!==document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,s=/(html|body)/i.test(i[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition==="fixed"?-this.scrollParent.scrollTop():s?0:i.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition==="fixed"?-this.scrollParent.scrollLeft():s?0:i.scrollLeft())*r}},_generatePosition:function(t){var n,r,i,s,o=this.options,u=this.cssPosition!=="absolute"||this.scrollParent[0]!==document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(u[0].tagName),f=t.pageX,l=t.pageY;return this.originalPosition&&(this.containment&&(this.relative_container?(r=this.relative_container.offset(),n=[this.containment[0]+r.left,this.containment[1]+r.top,this.containment[2]+r.left,this.containment[3]+r.top]):n=this.containment,t.pageX-this.offset.click.leftn[2]&&(f=n[2]+this.offset.click.left),t.pageY-this.offset.click.top>n[3]&&(l=n[3]+this.offset.click.top)),o.grid&&(i=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=n?i-this.offset.click.top>=n[1]||i-this.offset.click.top>n[3]?i:i-this.offset.click.top>=n[1]?i-o.grid[1]:i+o.grid[1]:i,s=o.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,f=n?s-this.offset.click.left>=n[0]||s-this.offset.click.left>n[2]?s:s-this.offset.click.left>=n[0]?s-o.grid[0]:s+o.grid[0]:s)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition==="fixed"?-this.scrollParent.scrollTop():a?0:u.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition==="fixed"?-this.scrollParent.scrollLeft():a?0:u.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!==this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(t,n,r){return r=r||this._uiHash(),e.ui.plugin.call(this,t,[n,r]),t==="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,n,r)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,n){var r=e(this).data("ui-draggable"),i=r.options,s=e.extend({},n,{item:r.element});r.sortables=[],e(i.connectToSortable).each(function(){var n=e.data(this,"ui-sortable");n&&!n.options.disabled&&(r.sortables.push({instance:n,shouldRevert:n.options.revert}),n.refreshPositions(),n._trigger("activate",t,s))})},stop:function(t,n){var r=e(this).data("ui-draggable"),i=e.extend({},n,{item:r.element});e.each(r.sortables,function(){this.instance.isOver?(this.instance.isOver=0,r.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,r.options.helper==="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,i))})},drag:function(t,n){var r=e(this).data("ui-draggable"),i=this;e.each(r.sortables,function(){var s=!1,o=this;this.instance.positionAbs=r.positionAbs,this.instance.helperProportions=r.helperProportions,this.instance.offset.click=r.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(s=!0,e.each(r.sortables,function(){return this.instance.positionAbs=r.positionAbs,this.instance.helperProportions=r.helperProportions,this.instance.offset.click=r.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.ui.contains(o.instance.element[0],this.instance.element[0])&&(s=!1),s})),s?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(i).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return n.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=r.offset.click.top,this.instance.offset.click.left=r.offset.click.left,this.instance.offset.parent.left-=r.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=r.offset.parent.top-this.instance.offset.parent.top,r._trigger("toSortable",t),r.dropped=this.instance.element,r.currentItem=r.element,this.instance.fromOutside=r),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),r._trigger("fromSortable",t),r.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(){var t=e("body"),n=e(this).data("ui-draggable").options;t.css("cursor")&&(n._cursor=t.css("cursor")),t.css("cursor",n.cursor)},stop:function(){var t=e(this).data("ui-draggable").options;t._cursor&&e("body").css("cursor",t._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,n){var r=e(n.helper),i=e(this).data("ui-draggable").options;r.css("opacity")&&(i._opacity=r.css("opacity")),r.css("opacity",i.opacity)},stop:function(t,n){var r=e(this).data("ui-draggable").options;r._opacity&&e(n.helper).css("opacity",r._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(){var t=e(this).data("ui-draggable");t.scrollParent[0]!==document&&t.scrollParent[0].tagName!=="HTML"&&(t.overflowOffset=t.scrollParent.offset())},drag:function(t){var n=e(this).data("ui-draggable"),r=n.options,i=!1;if(n.scrollParent[0]!==document&&n.scrollParent[0].tagName!=="HTML"){if(!r.axis||r.axis!=="x")n.overflowOffset.top+n.scrollParent[0].offsetHeight-t.pageY=0;c--){u=p.snapElements[c].left,a=u+p.snapElements[c].width,f=p.snapElements[c].top,l=f+p.snapElements[c].height;if(!(u-vt&&e=h&&a<=p||f>=h&&f<=p||ap)&&(o>=l&&o<=c||u>=l&&u<=c||oc);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,n){var r,i,s=e.ui.ddmanager.droppables[t.options.scope]||[],o=n?n.type:null,u=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(r=0;r").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=u.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor===String){this.handles==="all"&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={};for(n=0;n"),i.css({zIndex:u.zIndex}),"se"===r&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[r]=".ui-resizable-"+r,this.element.append(i)}this._renderAxis=function(t){var n,r,i,s;t=t||this.element;for(n in this.handles){this.handles[n].constructor===String&&(this.handles[n]=e(this.handles[n],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(r=e(this.handles[n],this.element),s=/sw|ne|nw|se|n|s/.test(n)?r.outerHeight():r.outerWidth(),i=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize());if(!e(this.handles[n]).length)continue}},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=i&&i[1]?i[1]:"se")}),u.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){if(u.disabled)return;e(this).removeClass("ui-resizable-autohide"),o._handles.show()}).mouseleave(function(){if(u.disabled)return;o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,n=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(n(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),n(this.originalElement),this},_mouseCapture:function(t){var n,r,i=!1;for(n in this.handles){r=e(this.handles[n])[0];if(r===t.target||e.contains(r,t.target))i=!0}return!this.options.disabled&&i},_mouseStart:function(t){var r,i,s,o=this.options,u=this.element.position(),a=this.element;return this.resizing=!0,/absolute/.test(a.css("position"))?a.css({position:"absolute",top:a.css("top"),left:a.css("left")}):a.is(".ui-draggable")&&a.css({position:"absolute",top:u.top,left:u.left}),this._renderProxy(),r=n(this.helper.css("left")),i=n(this.helper.css("top")),o.containment&&(r+=e(o.containment).scrollLeft()||0,i+=e(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:r,top:i},this.size=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.originalPosition={left:r,top:i},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio=typeof o.aspectRatio=="number"?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor",s==="auto"?this.axis+"-resize":s),a.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var n,r=this.helper,i={},s=this.originalMousePosition,o=this.axis,u=this.position.top,a=this.position.left,f=this.size.width,l=this.size.height,c=t.pageX-s.left||0,h=t.pageY-s.top||0,p=this._change[o];if(!p)return!1;n=p.apply(this,[t,c,h]),this._updateVirtualBoundaries(t.shiftKey);if(this._aspectRatio||t.shiftKey)n=this._updateRatio(n,t);return n=this._respectSize(n,t),this._updateCache(n),this._propagate("resize",t),this.position.top!==u&&(i.top=this.position.top+"px"),this.position.left!==a&&(i.left=this.position.left+"px"),this.size.width!==f&&(i.width=this.size.width+"px"),this.size.height!==l&&(i.height=this.size.height+"px"),r.css(i),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(i)||this._trigger("resize",t,this.ui()),!1},_mouseStop:function(t){this.resizing=!1;var n,r,i,s,o,u,a,f=this.options,l=this;return this._helper&&(n=this._proportionallyResizeElements,r=n.length&&/textarea/i.test(n[0].nodeName),i=r&&e.ui.hasScroll(n[0],"left")?0:l.sizeDiff.height,s=r?0:l.sizeDiff.width,o={width:l.helper.width()-s,height:l.helper.height()-i},u=parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left)||null,a=parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top)||null,f.animate||this.element.css(e.extend(o,{top:a,left:u})),l.helper.height(l.size.height),l.helper.width(l.size.width),this._helper&&!f.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,n,i,s,o,u=this.options;o={minWidth:r(u.minWidth)?u.minWidth:0,maxWidth:r(u.maxWidth)?u.maxWidth:Infinity,minHeight:r(u.minHeight)?u.minHeight:0,maxHeight:r(u.maxHeight)?u.maxHeight:Infinity};if(this._aspectRatio||e)t=o.minHeight*this.aspectRatio,i=o.minWidth/this.aspectRatio,n=o.maxHeight*this.aspectRatio,s=o.maxWidth/this.aspectRatio,t>o.minWidth&&(o.minWidth=t),i>o.minHeight&&(o.minHeight=i),ne.width,u=r(e.height)&&t.minHeight&&t.minHeight>e.height,a=this.originalPosition.left+this.originalSize.width,f=this.position.top+this.size.height,l=/sw|nw|w/.test(n),c=/nw|ne|n/.test(n);return o&&(e.width=t.minWidth),u&&(e.height=t.minHeight),i&&(e.width=t.maxWidth),s&&(e.height=t.maxHeight),o&&l&&(e.left=a-t.minWidth),i&&l&&(e.left=a-t.maxWidth),u&&c&&(e.top=f-t.minHeight),s&&c&&(e.top=f-t.maxHeight),!e.width&&!e.height&&!e.left&&e.top?e.top=null:!e.width&&!e.height&&!e.top&&e.left&&(e.left=null),e},_proportionallyResize:function(){if(!this._proportionallyResizeElements.length)return;var e,t,n,r,i,s=this.helper||this.element;for(e=0;e"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++n.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var n=this.originalSize,r=this.originalPosition;return{left:r.left+t,width:n.width-t}},n:function(e,t,n){var r=this.originalSize,i=this.originalPosition;return{top:i.top+n,height:r.height-n}},s:function(e,t,n){return{height:this.originalSize.height+n}},se:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},sw:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,n,r]))},ne:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},nw:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,n,r]))}},_propagate:function(t,n){e.ui.plugin.call(this,t,[n,this.ui()]),t!=="resize"&&this._trigger(t,n,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var n=e(this).data("ui-resizable"),r=n.options,i=n._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),o=s&&e.ui.hasScroll(i[0],"left")?0:n.sizeDiff.height,u=s?0:n.sizeDiff.width,a={width:n.size.width-u,height:n.size.height-o},f=parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left)||null,l=parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top)||null;n.element.animate(e.extend(a,l&&f?{top:l,left:f}:{}),{duration:r.animateDuration,easing:r.animateEasing,step:function(){var r={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};i&&i.length&&e(i[0]).css({width:r.width,height:r.height}),n._updateCache(r),n._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,r,i,s,o,u,a,f=e(this).data("ui-resizable"),l=f.options,c=f.element,h=l.containment,p=h instanceof e?h.get(0):/parent/.test(h)?c.parent().get(0):h;if(!p)return;f.containerElement=e(p),/document/.test(h)||h===document?(f.containerOffset={left:0,top:0},f.containerPosition={left:0,top:0},f.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(p),r=[],e(["Top","Right","Left","Bottom"]).each(function(e,i){r[e]=n(t.css("padding"+i))}),f.containerOffset=t.offset(),f.containerPosition=t.position(),f.containerSize={height:t.innerHeight()-r[3],width:t.innerWidth()-r[1]},i=f.containerOffset,s=f.containerSize.height,o=f.containerSize.width,u=e.ui.hasScroll(p,"left")?p.scrollWidth:o,a=e.ui.hasScroll(p)?p.scrollHeight:s,f.parentData={element:p,left:i.left,top:i.top,width:u,height:a})},resize:function(t){var n,r,i,s,o=e(this).data("ui-resizable"),u=o.options,a=o.containerOffset,f=o.position,l=o._aspectRatio||t.shiftKey,c={top:0,left:0},h=o.containerElement;h[0]!==document&&/static/.test(h.css("position"))&&(c=a),f.left<(o._helper?a.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-a.left:o.position.left-c.left),l&&(o.size.height=o.size.width/o.aspectRatio),o.position.left=u.helper?a.left:0),f.top<(o._helper?a.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-a.top:o.position.top),l&&(o.size.width=o.size.height*o.aspectRatio),o.position.top=o._helper?a.top:0),o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top,n=Math.abs((o._helper?o.offset.left-c.left:o.offset.left-c.left)+o.sizeDiff.width),r=Math.abs((o._helper?o.offset.top-c.top:o.offset.top-a.top)+o.sizeDiff.height),i=o.containerElement.get(0)===o.element.parent().get(0),s=/relative|absolute/.test(o.containerElement.css("position")),i&&s&&(n-=o.parentData.left),n+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-n,l&&(o.size.height=o.size.width/o.aspectRatio)),r+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-r,l&&(o.size.width=o.size.height*o.aspectRatio))},stop:function(){var t=e(this).data("ui-resizable"),n=t.options,r=t.containerOffset,i=t.containerPosition,s=t.containerElement,o=e(t.helper),u=o.offset(),a=o.outerWidth()-t.sizeDiff.width,f=o.outerHeight()-t.sizeDiff.height;t._helper&&!n.animate&&/relative/.test(s.css("position"))&&e(this).css({left:u.left-i.left-r.left,width:a,height:f}),t._helper&&!n.animate&&/static/.test(s.css("position"))&&e(this).css({left:u.left-i.left-r.left,width:a,height:f})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).data("ui-resizable"),n=t.options,r=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};typeof n.alsoResize=="object"&&!n.alsoResize.parentNode?n.alsoResize.length?(n.alsoResize=n.alsoResize[0],r(n.alsoResize)):e.each(n.alsoResize,function(e){r(e)}):r(n.alsoResize)},resize:function(t,n){var r=e(this).data("ui-resizable"),i=r.options,s=r.originalSize,o=r.originalPosition,u={height:r.size.height-s.height||0,width:r.size.width-s.width||0,top:r.position.top-o.top||0,left:r.position.left-o.left||0},a=function(t,r){e(t).each(function(){var t=e(this),i=e(this).data("ui-resizable-alsoresize"),s={},o=r&&r.length?r:t.parents(n.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var n=(i[t]||0)+(u[t]||0);n&&n>=0&&(s[t]=n||null)}),t.css(s)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?e.each(i.alsoResize,function(e,t){a(e,t)}):a(i.alsoResize)},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).data("ui-resizable"),n=t.options,r=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:r.height,width:r.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof n.ghost=="string"?n.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).data("ui-resizable");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).data("ui-resizable");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).data("ui-resizable"),n=t.options,r=t.size,i=t.originalSize,s=t.originalPosition,o=t.axis,u=typeof n.grid=="number"?[n.grid,n.grid]:n.grid,a=u[0]||1,f=u[1]||1,l=Math.round((r.width-i.width)/a)*a,c=Math.round((r.height-i.height)/f)*f,h=i.width+l,p=i.height+c,d=n.maxWidth&&n.maxWidthh,g=n.minHeight&&n.minHeight>p;n.grid=u,m&&(h+=a),g&&(p+=f),d&&(h-=a),v&&(p-=f),/^(se|s|e)$/.test(o)?(t.size.width=h,t.size.height=p):/^(ne)$/.test(o)?(t.size.width=h,t.size.height=p,t.position.top=s.top-c):/^(sw)$/.test(o)?(t.size.width=h,t.size.height=p,t.position.left=s.left-l):(t.size.width=h,t.size.height=p,t.position.top=s.top-c,t.position.left=s.left-l)}})}(jQuery),function(e,t){e.widget("ui.selectable",e.ui.mouse,{version:"1.10.0",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,n=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(n.options.filter,n.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),n=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:n.left,top:n.top,right:n.left+t.outerWidth(),bottom:n.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("
")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var n=this,r=this.options;this.opos=[t.pageX,t.pageY];if(this.options.disabled)return;this.selectees=e(r.filter,this.element[0]),this._trigger("start",t),e(r.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),r.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var r=e.data(this,"selectable-item");r.startselected=!0,!t.metaKey&&!t.ctrlKey&&(r.$element.removeClass("ui-selected"),r.selected=!1,r.$element.addClass("ui-unselecting"),r.unselecting=!0,n._trigger("unselecting",t,{unselecting:r.element}))}),e(t.target).parents().addBack().each(function(){var r,i=e.data(this,"selectable-item");if(i)return r=!t.metaKey&&!t.ctrlKey||!i.$element.hasClass("ui-selected"),i.$element.removeClass(r?"ui-unselecting":"ui-selected").addClass(r?"ui-selecting":"ui-unselecting"),i.unselecting=!r,i.selecting=r,i.selected=r,r?n._trigger("selecting",t,{selecting:i.element}):n._trigger("unselecting",t,{unselecting:i.element}),!1})},_mouseDrag:function(t){this.dragged=!0;if(this.options.disabled)return;var n,r=this,i=this.options,s=this.opos[0],o=this.opos[1],u=t.pageX,a=t.pageY;return s>u&&(n=u,u=s,s=n),o>a&&(n=a,a=o,o=n),this.helper.css({left:s,top:o,width:u-s,height:a-o}),this.selectees.each(function(){var n=e.data(this,"selectable-item"),f=!1;if(!n||n.element===r.element[0])return;i.tolerance==="touch"?f=!(n.left>u||n.righta||n.bottoms&&n.righto&&n.bottomt&&e *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?e.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_setOption:function(t,n){t==="disabled"?(this.options[t]=n,this.widget().toggleClass("ui-sortable-disabled",!!n)):e.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(t,n){var r=null,i=!1,s=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type==="static")return!1;this._refreshItems(t),e(t.target).parents().each(function(){if(e.data(this,s.widgetName+"-item")===s)return r=e(this),!1}),e.data(t.target,s.widgetName+"-item")===s&&(r=e(t.target));if(!r)return!1;if(this.options.handle&&!n){e(this.options.handle,r).find("*").addBack().each(function(){this===t.target&&(i=!0)});if(!i)return!1}return this.currentItem=r,this._removeCurrentsFromItems(),!0},_mouseStart:function(t,n,r){var i,s=this.options;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,s.cursorAt&&this._adjustOffsetFromHelper(s.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),s.containment&&this._setContainment(),s.cursor&&(e("body").css("cursor")&&(this._storedCursor=e("body").css("cursor")),e("body").css("cursor",s.cursor)),s.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",s.opacity)),s.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",s.zIndex)),this.scrollParent[0]!==document&&this.scrollParent[0].tagName!=="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!r)for(i=this.containers.length-1;i>=0;i--)this.containers[i]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!s.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var n,r,i,s,o=this.options,u=!1;this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&this.scrollParent[0].tagName!=="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY=0;n--){r=this.items[n],i=r.item[0],s=this._intersectsWithPointer(r);if(!s)continue;if(r.instance!==this.currentContainer)continue;if(i!==this.currentItem[0]&&this.placeholder[s===1?"next":"prev"]()[0]!==i&&!e.contains(this.placeholder[0],i)&&(this.options.type==="semi-dynamic"?!e.contains(this.element[0],i):!0)){this.direction=s===1?"down":"up";if(this.options.tolerance!=="pointer"&&!this._intersectsWithSides(r))break;this._rearrange(t,r),this._trigger("change",t,this._uiHash());break}}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,n){if(!t)return;e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t);if(this.options.revert){var r=this,i=this.placeholder.offset();this.reverting=!0,e(this.helper).animate({left:i.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft),top:i.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){r._clear(t)})}else this._clear(t,n);return!1},cancel:function(){if(this.dragging){this._mouseUp({target:null}),this.options.helper==="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!=="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},e(n).each(function(){var n=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);n&&r.push((t.key||n[1]+"[]")+"="+(t.key&&t.expression?n[1]:n[2]))}),!r.length&&t.key&&r.push(t.key+"="),r.join("&")},toArray:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},n.each(function(){r.push(e(t.item||this).attr(t.attribute||"id")||"")}),r},_intersectsWith:function(e){var t=this.positionAbs.left,n=t+this.helperProportions.width,r=this.positionAbs.top,i=r+this.helperProportions.height,s=e.left,o=s+e.width,u=e.top,a=u+e.height,f=this.offset.click.top,l=this.offset.click.left,c=r+f>u&&r+fs&&t+le[this.floating?"width":"height"]?c:s0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return e!==0&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){var n,r,i,s,o=[],u=[],a=this._connectWith();if(a&&t)for(n=a.length-1;n>=0;n--){i=e(a[n]);for(r=i.length-1;r>=0;r--)s=e.data(i[r],this.widgetFullName),s&&s!==this&&!s.options.disabled&&u.push([e.isFunction(s.options.items)?s.options.items.call(s.element):e(s.options.items,s.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),s])}u.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(n=u.length-1;n>=0;n--)u[n][0].each(function(){o.push(this)});return e(o)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var n=0;n=0;n--){i=e(h[n]);for(r=i.length-1;r>=0;r--)s=e.data(i[r],this.widgetFullName),s&&s!==this&&!s.options.disabled&&(c.push([e.isFunction(s.options.items)?s.options.items.call(s.element[0],t,{item:this.currentItem}):e(s.options.items,s.element),s]),this.containers.push(s))}for(n=c.length-1;n>=0;n--){o=c[n][1],u=c[n][0];for(r=0,f=u.length;r=0;n--){r=this.items[n];if(r.instance!==this.currentContainer&&this.currentContainer&&r.item[0]!==this.currentItem[0])continue;i=this.options.toleranceElement?e(this.options.toleranceElement,r.item):r.item,t||(r.width=i.outerWidth(),r.height=i.outerHeight()),s=i.offset(),r.left=s.left,r.top=s.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(n=this.containers.length-1;n>=0;n--)s=this.containers[n].element.offset(),this.containers[n].containerCache.left=s.left,this.containers[n].containerCache.top=s.top,this.containers[n].containerCache.width=this.containers[n].element.outerWidth(),this.containers[n].containerCache.height=this.containers[n].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var n,r=t.options;if(!r.placeholder||r.placeholder.constructor===String)n=r.placeholder,r.placeholder={element:function(){var r=e(document.createElement(t.currentItem[0].nodeName)).addClass(n||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return n||(r.style.visibility="hidden"),r},update:function(e,i){if(n&&!r.forcePlaceholderSize)return;i.height()||i.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),i.width()||i.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10))}};t.placeholder=e(r.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),r.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var n,r,i,s,o,u,a,f,l,c=null,h=null;for(n=this.containers.length-1;n>=0;n--){if(e.contains(this.currentItem[0],this.containers[n].element[0]))continue;if(this._intersectsWith(this.containers[n].containerCache)){if(c&&e.contains(this.containers[n].element[0],c.element[0]))continue;c=this.containers[n],h=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",t,this._uiHash(this)),this.containers[n].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[h]._trigger("over",t,this._uiHash(this)),this.containers[h].containerCache.over=1;else{i=1e4,s=null,o=this.containers[h].floating?"left":"top",u=this.containers[h].floating?"width":"height",a=this.positionAbs[o]+this.offset.click[o];for(r=this.items.length-1;r>=0;r--){if(!e.contains(this.containers[h].element[0],this.items[r].item[0]))continue;if(this.items[r].item[0]===this.currentItem[0])continue;f=this.items[r].item.offset()[o],l=!1,Math.abs(f-a)>Math.abs(f+this.items[r][u]-a)&&(l=!0,f+=this.items[r][u]),Math.abs(f-a)this.containment[2]&&(s=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),i.grid&&(n=this.originalPageY+Math.round((o-this.originalPageY)/i.grid[1])*i.grid[1],o=this.containment?n-this.offset.click.top>=this.containment[1]&&n-this.offset.click.top<=this.containment[3]?n:n-this.offset.click.top>=this.containment[1]?n-i.grid[1]:n+i.grid[1]:n,r=this.originalPageX+Math.round((s-this.originalPageX)/i.grid[0])*i.grid[0],s=this.containment?r-this.offset.click.left>=this.containment[0]&&r-this.offset.click.left<=this.containment[2]?r:r-this.offset.click.left>=this.containment[0]?r-i.grid[0]:r+i.grid[0]:r)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition==="fixed"?-this.scrollParent.scrollTop():a?0:u.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition==="fixed"?-this.scrollParent.scrollLeft():a?0:u.scrollLeft())}},_rearrange:function(e,t,n,r){n?n[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],this.direction==="down"?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var i=this.counter;this._delay(function(){i===this.counter&&this.refreshPositions(!r)})},_clear:function(t,n){this.reverting=!1;var r,i=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]===this.currentItem[0]){for(r in this._storedCSS)if(this._storedCSS[r]==="auto"||this._storedCSS[r]==="static")this._storedCSS[r]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!n&&i.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!==this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!==this.currentItem.parent()[0])&&!n&&i.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(n||(i.push(function(e){this._trigger("remove",e,this._uiHash())}),i.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),i.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer))));for(r=this.containers.length-1;r>=0;r--)n||i.push(function(e){return function(t){e._trigger("deactivate",t,this._uiHash(this))}}.call(this,this.containers[r])),this.containers[r].containerCache.over&&(i.push(function(e){return function(t){e._trigger("out",t,this._uiHash(this))}}.call(this,this.containers[r])),this.containers[r].containerCache.over=0);this._storedCursor&&e("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex==="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!n){this._trigger("beforeStop",t,this._uiHash());for(r=0;re?0:r.max")[0],l,c=e.each;f.style.cssText="background-color:rgba(1,1,1,.5)",a.rgba=f.style.backgroundColor.indexOf("rgba")>-1,c(o,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),s.fn=e.extend(s.prototype,{parse:function(n,r,i,u){if(n===t)return this._rgba=[null,null,null,null],this;if(n.jquery||n.nodeType)n=e(n).css(r),r=t;var a=this,f=e.type(n),d=this._rgba=[];r!==t&&(n=[n,r,i,u],f="array");if(f==="string")return this.parse(p(n)||l._default);if(f==="array")return c(o.rgba.props,function(e,t){d[t.idx]=h(n[t.idx],t)}),this;if(f==="object")return n instanceof s?c(o,function(e,t){n[t.cache]&&(a[t.cache]=n[t.cache].slice())}):c(o,function(t,r){var i=r.cache;c(r.props,function(e,t){if(!a[i]&&r.to){if(e==="alpha"||n[e]==null)return;a[i]=r.to(a._rgba)}a[i][t.idx]=h(n[e],t,!0)}),a[i]&&e.inArray(null,a[i].slice(0,3))<0&&(a[i][3]=1,r.from&&(a._rgba=r.from(a[i])))}),this},is:function(e){var t=s(e),n=!0,r=this;return c(o,function(e,i){var s,o=t[i.cache];return o&&(s=r[i.cache]||i.to&&i.to(r._rgba)||[],c(i.props,function(e,t){if(o[t.idx]!=null)return n=o[t.idx]===s[t.idx],n})),n}),n},_space:function(){var e=[],t=this;return c(o,function(n,r){t[r.cache]&&e.push(n)}),e.pop()},transition:function(e,t){var n=s(e),r=n._space(),i=o[r],a=this.alpha()===0?s("transparent"):this,f=a[i.cache]||i.to(a._rgba),l=f.slice();return n=n[i.cache],c(i.props,function(e,r){var i=r.idx,s=f[i],o=n[i],a=u[r.type]||{};if(o===null)return;s===null?l[i]=o:(a.mod&&(o-s>a.mod/2?s+=a.mod:s-o>a.mod/2&&(s-=a.mod)),l[i]=h((o-s)*t+s,r))}),this[r](l)},blend:function(t){if(this._rgba[3]===1)return this;var n=this._rgba.slice(),r=n.pop(),i=s(t)._rgba;return s(e.map(n,function(e,t){return(1-r)*i[t]+r*e}))},toRgbaString:function(){var t="rgba(",n=e.map(this._rgba,function(e,t){return e==null?t>2?1:0:e});return n[3]===1&&(n.pop(),t="rgb("),t+n.join()+")"},toHslaString:function(){var t="hsla(",n=e.map(this.hsla(),function(e,t){return e==null&&(e=t>2?1:0),t&&t<3&&(e=Math.round(e*100)+"%"),e});return n[3]===1&&(n.pop(),t="hsl("),t+n.join()+")"},toHexString:function(t){var n=this._rgba.slice(),r=n.pop();return t&&n.push(~~(r*255)),"#"+e.map(n,function(e){return e=(e||0).toString(16),e.length===1?"0"+e:e}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}}),s.fn.parse.prototype=s.fn,o.hsla.to=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/255,n=e[1]/255,r=e[2]/255,i=e[3],s=Math.max(t,n,r),o=Math.min(t,n,r),u=s-o,a=s+o,f=a*.5,l,c;return o===s?l=0:t===s?l=60*(n-r)/u+360:n===s?l=60*(r-t)/u+120:l=60*(t-n)/u+240,u===0?c=0:f<=.5?c=u/a:c=u/(2-a),[Math.round(l)%360,c,f,i==null?1:i]},o.hsla.from=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/360,n=e[1],r=e[2],i=e[3],s=r<=.5?r*(1+n):r+n-r*n,o=2*r-s;return[Math.round(d(o,s,t+1/3)*255),Math.round(d(o,s,t)*255),Math.round(d(o,s,t-1/3)*255),i]},c(o,function(n,i){var o=i.props,u=i.cache,a=i.to,f=i.from;s.fn[n]=function(n){a&&!this[u]&&(this[u]=a(this._rgba));if(n===t)return this[u].slice();var r,i=e.type(n),l=i==="array"||i==="object"?n:arguments,p=this[u].slice();return c(o,function(e,t){var n=l[i==="object"?e:t.idx];n==null&&(n=p[t.idx]),p[t.idx]=h(n,t)}),f?(r=s(f(p)),r[u]=p,r):s(p)},c(o,function(t,i){if(s.fn[t])return;s.fn[t]=function(s){var o=e.type(s),u=t==="alpha"?this._hsla?"hsla":"rgba":n,a=this[u](),f=a[i.idx],l;return o==="undefined"?f:(o==="function"&&(s=s.call(this,f),o=e.type(s)),s==null&&i.empty?this:(o==="string"&&(l=r.exec(s),l&&(s=f+parseFloat(l[2])*(l[1]==="+"?1:-1))),a[i.idx]=s,this[u](a)))}})}),s.hook=function(t){var n=t.split(" ");c(n,function(t,n){e.cssHooks[n]={set:function(t,r){var i,o,u="";if(r!=="transparent"&&(e.type(r)!=="string"||(i=p(r)))){r=s(i||r);if(!a.rgba&&r._rgba[3]!==1){o=n==="backgroundColor"?t.parentNode:t;while((u===""||u==="transparent")&&o&&o.style)try{u=e.css(o,"backgroundColor"),o=o.parentNode}catch(f){}r=r.blend(u&&u!=="transparent"?u:"_default")}r=r.toRgbaString()}try{t.style[n]=r}catch(f){}}},e.fx.step[n]=function(t){t.colorInit||(t.start=s(t.elem,n),t.end=s(t.end),t.colorInit=!0),e.cssHooks[n].set(t.elem,t.start.transition(t.end,t.pos))}})},s.hook(n),e.cssHooks.borderColor={expand:function(e){var t={};return c(["Top","Right","Bottom","Left"],function(n,r){t["border"+r+"Color"]=e}),t}},l=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(t){var n,r,i=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,s={};if(i&&i.length&&i[0]&&i[i[0]]){r=i.length;while(r--)n=i[r],typeof i[n]=="string"&&(s[e.camelCase(n)]=i[n])}else for(n in i)typeof i[n]=="string"&&(s[n]=i[n]);return s}function s(t,n){var i={},s,o;for(s in n)o=n[s],t[s]!==o&&!r[s]&&(e.fx.step[s]||!isNaN(parseFloat(o)))&&(i[s]=o);return i}var n=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,n){e.fx.step[n]=function(e){if(e.end!=="none"&&!e.setAttr||e.pos===1&&!e.setAttr)jQuery.style(e.elem,n,e.end),e.setAttr=!0}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(t,r,o,u){var a=e.speed(r,o,u);return this.queue(function(){var r=e(this),o=r.attr("class")||"",u,f=a.children?r.find("*").addBack():r;f=f.map(function(){var t=e(this);return{el:t,start:i(this)}}),u=function(){e.each(n,function(e,n){t[n]&&r[n+"Class"](t[n])})},u(),f=f.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),r.attr("class",o),f=f.map(function(){var t=this,n=e.Deferred(),r=e.extend({},a,{queue:!1,complete:function(){n.resolve(t)}});return this.el.animate(this.diff,r),n.promise()}),e.when.apply(e,f.get()).done(function(){u(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),a.complete.call(r[0])})})},e.fn.extend({_addClass:e.fn.addClass,addClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{add:t},n,r,i):this._addClass(t)},_removeClass:e.fn.removeClass,removeClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{remove:t},n,r,i):this._removeClass(t)},_toggleClass:e.fn.toggleClass,toggleClass:function(n,r,i,s,o){return typeof r=="boolean"||r===t?i?e.effects.animateClass.call(this,r?{add:n}:{remove:n},i,s,o):this._toggleClass(n,r):e.effects.animateClass.call(this,{toggle:n},r,i,s)},switchClass:function(t,n,r,i,s){return e.effects.animateClass.call(this,{add:n,remove:t},r,i,s)}})}(),function(){function r(t,n,r,i){e.isPlainObject(t)&&(n=t,t=t.effect),t={effect:t},n==null&&(n={}),e.isFunction(n)&&(i=n,r=null,n={});if(typeof n=="number"||e.fx.speeds[n])i=r,r=n,n={};return e.isFunction(r)&&(i=r,r=null),n&&e.extend(t,n),r=r||n.duration,t.duration=e.fx.off?0:typeof r=="number"?r:r in e.fx.speeds?e.fx.speeds[r]:e.fx.speeds._default,t.complete=i||n.complete,t}function i(t){return!t||typeof t=="number"||e.fx.speeds[t]?!0:typeof t=="string"&&!e.effects.effect[t]}e.extend(e.effects,{version:"1.10.0",save:function(e,t){for(var r=0;r").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),i={width:t.width(),height:t.height()},s=document.activeElement;try{s.id}catch(o){s=document.body}return t.wrap(r),(t[0]===s||e.contains(t[0],s))&&e(s).focus(),r=t.parent(),t.css("position")==="static"?(r.css({position:"relative"}),t.css({position:"relative"})):(e.extend(n,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,r){n[r]=t.css(r),isNaN(parseInt(n[r],10))&&(n[r]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(i),r.css(n).show()},removeWrapper:function(t){var n=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===n||e.contains(t[0],n))&&e(n).focus()),t},setTransition:function(t,n,r,i){return i=i||{},e.each(n,function(e,n){var s=t.cssUnit(n);s[0]>0&&(i[n]=s[0]*r+s[1])}),i}}),e.fn.extend({effect:function(){function o(n){function u(){e.isFunction(i)&&i.call(r[0]),e.isFunction(n)&&n()}var r=e(this),i=t.complete,o=t.mode;(r.is(":hidden")?o==="hide":o==="show")?u():s.call(r[0],t,u)}var t=r.apply(this,arguments),n=t.mode,i=t.queue,s=e.effects.effect[t.effect];return e.fx.off||!s?n?this[n](t.duration,t.complete):this.each(function(){t.complete&&t.complete.call(this)}):i===!1?this.each(o):this.queue(i||"fx",o)},_show:e.fn.show,show:function(e){if(i(e))return this._show.apply(this,arguments);var t=r.apply(this,arguments);return t.mode="show",this.effect.call(this,t)},_hide:e.fn.hide,hide:function(e){if(i(e))return this._hide.apply(this,arguments);var t=r.apply(this,arguments);return t.mode="hide",this.effect.call(this,t)},__toggle:e.fn.toggle,toggle:function(t){if(i(t)||typeof t=="boolean"||e.isFunction(t))return this.__toggle.apply(this,arguments);var n=r.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)},cssUnit:function(t){var n=this.css(t),r=[];return e.each(["em","px","%","pt"],function(e,t){n.indexOf(t)>0&&(r=[parseFloat(n),t])}),r}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,n){t[n]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),e.each(t,function(t,n){e.easing["easeIn"+t]=n,e.easing["easeOut"+t]=function(e){return 1-n(1-e)},e.easing["easeInOut"+t]=function(e){return e<.5?n(e*2)/2:1-n(e*-2+2)/2}})}()}(jQuery),function(e,t){var n=0,r={},i={};r.height=r.paddingTop=r.paddingBottom=r.borderTopWidth=r.borderBottomWidth="hide",i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="show",e.widget("ui.accordion",{version:"1.10.0",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),!t.collapsible&&(t.active===!1||t.active==null)&&(t.active=0),this._processPanels(),t.active<0&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,content:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),e=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this.options.heightStyle!=="content"&&e.css("height","")},_setOption:function(e,t){if(e==="active"){this._activate(t);return}e==="event"&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),e==="collapsible"&&!t&&this.options.active===!1&&this._activate(0),e==="icons"&&(this._destroyIcons(),t&&this._createIcons()),e==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)},_keydown:function(t){if(t.altKey||t.ctrlKey)return;var n=e.ui.keyCode,r=this.headers.length,i=this.headers.index(t.target),s=!1;switch(t.keyCode){case n.RIGHT:case n.DOWN:s=this.headers[(i+1)%r];break;case n.LEFT:case n.UP:s=this.headers[(i-1+r)%r];break;case n.SPACE:case n.ENTER:this._eventHandler(t);break;case n.HOME:s=this.headers[0];break;case n.END:s=this.headers[r-1]}s&&(e(t.target).attr("tabIndex",-1),e(s).attr("tabIndex",0),s.focus(),t.preventDefault())},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels();if(t.active===!1&&t.collapsible===!0||!this.headers.length)t.active=!1,this.active=e();t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,r=this.options,i=r.heightStyle,s=this.element.parent(),o=this.accordionId="ui-accordion-"+(this.element.attr("id")||++n);this.active=this._findActive(r.active).addClass("ui-accordion-header-active ui-state-active").toggleClass("ui-corner-all ui-corner-top"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(t){var n=e(this),r=n.attr("id"),i=n.next(),s=i.attr("id");r||(r=o+"-header-"+t,n.attr("id",r)),s||(s=o+"-panel-"+t,i.attr("id",s)),n.attr("aria-controls",s),i.attr("aria-labelledby",r)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(r.event),i==="fill"?(t=s.height(),this.element.siblings(":visible").each(function(){var n=e(this),r=n.css("position");if(r==="absolute"||r==="fixed")return;t-=n.outerHeight(!0)}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):i==="auto"&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var n=this._findActive(t)[0];if(n===this.active[0])return;n=n||this.active[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return typeof t=="number"?this.headers.eq(t):e()},_setupEvents:function(t){var n={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,n),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i[0]===r[0],o=s&&n.collapsible,u=o?e():i.next(),a=r.next(),f={oldHeader:r,oldPanel:a,newHeader:o?e():i,newPanel:u};t.preventDefault();if(s&&!n.collapsible||this._trigger("beforeActivate",t,f)===!1)return;n.active=o?!1:this.headers.index(i),this.active=s?e():i,this._toggle(f),r.removeClass("ui-accordion-header-active ui-state-active"),n.icons&&r.children(".ui-accordion-header-icon").removeClass(n.icons.activeHeader).addClass(n.icons.header),s||(i.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),n.icons&&i.children(".ui-accordion-header-icon").removeClass(n.icons.header).addClass(n.icons.activeHeader),i.next().addClass("ui-accordion-content-active"))},_toggle:function(t){var n=t.newPanel,r=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=n,this.prevHide=r,this.options.animate?this._animate(n,r,t):(r.hide(),n.show(),this._toggleComplete(t)),r.attr({"aria-expanded":"false","aria-hidden":"true"}),r.prev().attr("aria-selected","false"),n.length&&r.length?r.prev().attr("tabIndex",-1):n.length&&this.headers.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),n.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(e,t,n){var s,o,u,a=this,f=0,l=e.length&&(!t.length||e.index()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(i){if(this.element.prop("readOnly")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move("previousPage",i);break;case s.PAGE_DOWN:t=!0,this._move("nextPage",i);break;case s.UP:t=!0,this._keyEvent("previous",i);break;case s.DOWN:t=!0,this._keyEvent("next",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move("previousPage",r);break;case i.PAGE_DOWN:this._move("nextPage",r);break;case i.UP:this._keyEvent("previous",r);break;case i.DOWN:this._keyEvent("next",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e("
    ").addClass("ui-autocomplete").appendTo(this._appendTo()).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data("ui-autocomplete-item");!1!==this._trigger("focus",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data("ui-autocomplete-item"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger("select",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e("",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertAfter(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e==="source"&&this._initSource(),e==="appendTo"&&this.menu.element.appendTo(this._appendTo()),e==="disabled"&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_isMultiLine:function(){return this.element.is("textarea")?!0:this.element.is("input")?!1:this.element.prop("isContentEditable")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source=="string"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:"json",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length").append(e("").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(":visible")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),"i");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})}(jQuery),function(e,t){var n,r,i,s,o="ui-button ui-widget ui-state-default ui-corner-all",u="ui-state-hover ui-state-active ",a="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",f=function(){var t=e(this).find(":ui-button");setTimeout(function(){t.button("refresh")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(n=n.replace(/'/g,"\\'"),r?i=e(r).find("[name='"+n+"']"):i=e("[name='"+n+"']",t.ownerDocument).filter(function(){return!this.form})),i};e.widget("ui.button",{version:"1.10.0",defaultElement:"").addClass(this._triggerClass).html(s?e("").attr({src:s,alt:i,title:i}):i)),t[u?"before":"after"](n.trigger),n.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1})},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,n,r,i,s=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){n=0,r=0;for(i=0;in&&(n=e[i].length,r=i);return r},s.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),s.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-s.getDay())),e.input.attr("size",this._formatDate(e,s).length)}},_inlineDatepicker:function(t,r){var i=e(t);if(i.hasClass(this.markerClassName))return;i.addClass(this.markerClassName).append(r.dpDiv),e.data(t,n,r),this._setDate(r,this._getDefaultDate(r),!0),this._updateDatepicker(r),this._updateAlternate(r),r.settings.disabled&&this._disableDatepicker(t),r.dpDiv.css("display","block")},_dialogDatepicker:function(t,r,i,s,o){var a,f,l,c,h,p=this._dialogInst;return p||(this.uuid+=1,a="dp"+this.uuid,this._dialogInput=e(""),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},e.data(this._dialogInput[0],n,p)),u(p.settings,s||{}),r=r&&r.constructor===Date?this._formatDate(p,r):r,this._dialogInput.val(r),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(f=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,h=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[f/2-100+c,l/2-150+h]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=i,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],n,p),this},_destroyDatepicker:function(t){var r,i=e(t),s=e.data(t,n);if(!i.hasClass(this.markerClassName))return;r=t.nodeName.toLowerCase(),e.removeData(t,n),r==="input"?(s.append.remove(),s.trigger.remove(),i.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(r==="div"||r==="span")&&i.removeClass(this.markerClassName).empty()},_enableDatepicker:function(t){var r,i,s=e(t),o=e.data(t,n);if(!s.hasClass(this.markerClassName))return;r=t.nodeName.toLowerCase();if(r==="input")t.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(r==="div"||r==="span")i=s.children("."+this._inlineClass),i.children().removeClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1);this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e})},_disableDatepicker:function(t){var r,i,s=e(t),o=e.data(t,n);if(!s.hasClass(this.markerClassName))return;r=t.nodeName.toLowerCase();if(r==="input")t.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(r==="div"||r==="span")i=s.children("."+this._inlineClass),i.children().addClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0);this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;t-1},_doKeyUp:function(t){var n,r=e.datepicker._getInst(t.target);if(r.input.val()!==r.lastVal)try{n=e.datepicker.parseDate(e.datepicker._get(r,"dateFormat"),r.input?r.input.val():null,e.datepicker._getFormatConfig(r)),n&&(e.datepicker._setDateFromField(r),e.datepicker._updateAlternate(r),e.datepicker._updateDatepicker(r))}catch(i){}return!0},_showDatepicker:function(t){t=t.target||t,t.nodeName.toLowerCase()!=="input"&&(t=e("input",t.parentNode)[0]);if(e.datepicker._isDisabledDatepicker(t)||e.datepicker._lastInput===t)return;var n,r,i,s,o,a,f;n=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==n&&(e.datepicker._curInst.dpDiv.stop(!0,!0),n&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),r=e.datepicker._get(n,"beforeShow"),i=r?r.apply(t,[t,n]):{};if(i===!1)return;u(n.settings,i),n.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(n),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),s=!1,e(t).parents().each(function(){return s|=e(this).css("position")==="fixed",!s}),o={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,n.dpDiv.empty(),n.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(n),o=e.datepicker._checkOffset(n,o,s),n.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":s?"fixed":"absolute",display:"none",left:o.left+"px",top:o.top+"px"}),n.inline||(a=e.datepicker._get(n,"showAnim"),f=e.datepicker._get(n,"duration"),n.dpDiv.zIndex(e(t).zIndex()+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[a]?n.dpDiv.show(a,e.datepicker._get(n,"showOptions"),f):n.dpDiv[a||"show"](a?f:null),n.input.is(":visible")&&!n.input.is(":disabled")&&n.input.focus(),e.datepicker._curInst=n)},_updateDatepicker:function(t){this.maxRows=4,i=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t),t.dpDiv.find("."+this._dayOverClass+" a").mouseover();var n,r=this._getNumberOfMonths(t),s=r[1],o=17;t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),s>1&&t.dpDiv.addClass("ui-datepicker-multi-"+s).css("width",o*s+"em"),t.dpDiv[(r[0]!==1||r[1]!==1?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&t.input[0]!==document.activeElement&&t.input.focus(),t.yearshtml&&(n=t.yearshtml,setTimeout(function(){n===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),n=t.yearshtml=null},0))},_getBorders:function(e){var t=function(e){return{thin:1,medium:2,thick:3}[e]||e};return[parseFloat(t(e.css("border-left-width"))),parseFloat(t(e.css("border-top-width")))]},_checkOffset:function(t,n,r){var i=t.dpDiv.outerWidth(),s=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,u=t.input?t.input.outerHeight():0,a=document.documentElement.clientWidth+(r?0:e(document).scrollLeft()),f=document.documentElement.clientHeight+(r?0:e(document).scrollTop());return n.left-=this._get(t,"isRTL")?i-o:0,n.left-=r&&n.left===t.input.offset().left?e(document).scrollLeft():0,n.top-=r&&n.top===t.input.offset().top+u?e(document).scrollTop():0,n.left-=Math.min(n.left,n.left+i>a&&a>i?Math.abs(n.left+i-a):0),n.top-=Math.min(n.top,n.top+s>f&&f>s?Math.abs(s+u):0),n},_findPos:function(t){var n,r=this._getInst(t),i=this._get(r,"isRTL");while(t&&(t.type==="hidden"||t.nodeType!==1||e.expr.filters.hidden(t)))t=t[i?"previousSibling":"nextSibling"];return n=e(t).offset(),[n.left,n.top]},_hideDatepicker:function(t){var r,i,s,o,u=this._curInst;if(!u||t&&u!==e.data(t,n))return;this._datepickerShowing&&(r=this._get(u,"showAnim"),i=this._get(u,"duration"),s=function(){e.datepicker._tidyDialog(u)},e.effects&&(e.effects.effect[r]||e.effects[r])?u.dpDiv.hide(r,e.datepicker._get(u,"showOptions"),i,s):u.dpDiv[r==="slideDown"?"slideUp":r==="fadeIn"?"fadeOut":"hide"](r?i:null,s),r||s(),this._datepickerShowing=!1,o=this._get(u,"onClose"),o&&o.apply(u.input?u.input[0]:null,[u.input?u.input.val():"",u]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(!e.datepicker._curInst)return;var n=e(t.target),r=e.datepicker._getInst(n[0]);(n[0].id!==e.datepicker._mainDivId&&n.parents("#"+e.datepicker._mainDivId).length===0&&!n.hasClass(e.datepicker.markerClassName)&&!n.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||n.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==r)&&e.datepicker._hideDatepicker()},_adjustDate:function(t,n,r){var i=e(t),s=this._getInst(i[0]);if(this._isDisabledDatepicker(i[0]))return;this._adjustInstDate(s,n+(r==="M"?this._get(s,"showCurrentAtPos"):0),r),this._updateDatepicker(s)},_gotoToday:function(t){var n,r=e(t),i=this._getInst(r[0]);this._get(i,"gotoCurrent")&&i.currentDay?(i.selectedDay=i.currentDay,i.drawMonth=i.selectedMonth=i.currentMonth,i.drawYear=i.selectedYear=i.currentYear):(n=new Date,i.selectedDay=n.getDate(),i.drawMonth=i.selectedMonth=n.getMonth(),i.drawYear=i.selectedYear=n.getFullYear()),this._notifyChange(i),this._adjustDate(r)},_selectMonthYear:function(t,n,r){var i=e(t),s=this._getInst(i[0]);s["selected"+(r==="M"?"Month":"Year")]=s["draw"+(r==="M"?"Month":"Year")]=parseInt(n.options[n.selectedIndex].value,10),this._notifyChange(s),this._adjustDate(i)},_selectDay:function(t,n,r,i){var s,o=e(t);if(e(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0]))return;s=this._getInst(o[0]),s.selectedDay=s.currentDay=e("a",i).html(),s.selectedMonth=s.currentMonth=n,s.selectedYear=s.currentYear=r,this._selectDate(t,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear))},_clearDate:function(t){var n=e(t);this._selectDate(n,"")},_selectDate:function(t,n){var r,i=e(t),s=this._getInst(i[0]);n=n!=null?n:this._formatDate(s),s.input&&s.input.val(n),this._updateAlternate(s),r=this._get(s,"onSelect"),r?r.apply(s.input?s.input[0]:null,[n,s]):s.input&&s.input.trigger("change"),s.inline?this._updateDatepicker(s):(this._hideDatepicker(),this._lastInput=s.input[0],typeof s.input[0]!="object"&&s.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var n,r,i,s=this._get(t,"altField");s&&(n=this._get(t,"altFormat")||this._get(t,"dateFormat"),r=this._getDate(t),i=this.formatDate(n,r,this._getFormatConfig(t)),e(s).each(function(){e(this).val(i)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&t<6,""]},iso8601Week:function(e){var t,n=new Date(e.getTime());return n.setDate(n.getDate()+4-(n.getDay()||7)),t=n.getTime(),n.setMonth(0),n.setDate(1),Math.floor(Math.round((t-n)/864e5)/7)+1},parseDate:function(t,n,r){if(t==null||n==null)throw"Invalid arguments";n=typeof n=="object"?n.toString():n+"";if(n==="")return null;var i,s,o,u=0,a=(r?r.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=typeof a!="string"?a:(new Date).getFullYear()%100+parseInt(a,10),l=(r?r.dayNamesShort:null)||this._defaults.dayNamesShort,c=(r?r.dayNames:null)||this._defaults.dayNames,h=(r?r.monthNamesShort:null)||this._defaults.monthNamesShort,p=(r?r.monthNames:null)||this._defaults.monthNames,d=-1,v=-1,m=-1,g=-1,y=!1,b,w=function(e){var n=i+1-1){v=1,m=g;do{s=this._getDaysInMonth(d,v-1);if(m<=s)break;v++,m-=s}while(!0)}b=this._daylightSavingAdjust(new Date(d,v-1,m));if(b.getFullYear()!==d||b.getMonth()+1!==v||b.getDate()!==m)throw"Invalid date";return b},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(e,t,n){if(!t)return"";var r,i=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,s=(n?n.dayNames:null)||this._defaults.dayNames,o=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,u=(n?n.monthNames:null)||this._defaults.monthNames,a=function(t){var n=r+112?e.getHours()+2:0),e):null},_setDate:function(e,t,n){var r=!t,i=e.selectedMonth,s=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),(i!==e.selectedMonth||s!==e.selectedYear)&&!n&&this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(r?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&e.input.val()===""?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var n=this._get(t,"stepMonths"),i="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){window["DP_jQuery_"+r].datepicker._adjustDate(i,-n,"M")},next:function(){window["DP_jQuery_"+r].datepicker._adjustDate(i,+n,"M")},hide:function(){window["DP_jQuery_"+r].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+r].datepicker._gotoToday(i)},selectDay:function(){return window["DP_jQuery_"+r].datepicker._selectDay(i,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+r].datepicker._selectMonthYear(i,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+r].datepicker._selectMonthYear(i,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,N,C,k,L,A,O,M,_,D,P,H,B,j,F,I,q=new Date,R=this._daylightSavingAdjust(new Date(q.getFullYear(),q.getMonth(),q.getDate())),U=this._get(e,"isRTL"),z=this._get(e,"showButtonPanel"),W=this._get(e,"hideIfNoPrevNext"),X=this._get(e,"navigationAsDateFormat"),V=this._getNumberOfMonths(e),$=this._get(e,"showCurrentAtPos"),J=this._get(e,"stepMonths"),K=V[0]!==1||V[1]!==1,Q=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),G=this._getMinMaxDate(e,"min"),Y=this._getMinMaxDate(e,"max"),Z=e.drawMonth-$,et=e.drawYear;Z<0&&(Z+=12,et--);if(Y){t=this._daylightSavingAdjust(new Date(Y.getFullYear(),Y.getMonth()-V[0]*V[1]+1,Y.getDate())),t=G&&tt)Z--,Z<0&&(Z=11,et--)}e.drawMonth=Z,e.drawYear=et,n=this._get(e,"prevText"),n=X?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z-J,1)),this._getFormatConfig(e)):n,r=this._canAdjustMonth(e,-1,et,Z)?""+n+"":W?"":""+n+"",i=this._get(e,"nextText"),i=X?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z+J,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,1,et,Z)?""+i+"":W?"":""+i+"",o=this._get(e,"currentText"),u=this._get(e,"gotoCurrent")&&e.currentDay?Q:R,o=X?this.formatDate(o,u,this._getFormatConfig(e)):o,a=e.inline?"":"",f=z?"
    "+(U?a:"")+(this._isInRange(e,u)?"":"")+(U?"":a)+"
    ":"",l=parseInt(this._get(e,"firstDay"),10),l=isNaN(l)?0:l,c=this._get(e,"showWeek"),h=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),d=this._get(e,"monthNames"),v=this._get(e,"monthNamesShort"),m=this._get(e,"beforeShowDay"),g=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),w="",E;for(S=0;S1)switch(T){case 0:k+=" ui-datepicker-group-first",C=" ui-corner-"+(U?"right":"left");break;case V[1]-1:k+=" ui-datepicker-group-last",C=" ui-corner-"+(U?"left":"right");break;default:k+=" ui-datepicker-group-middle",C=""}k+="'>"}k+="
    "+(/all|left/.test(C)&&S===0?U?s:r:"")+(/all|right/.test(C)&&S===0?U?r:s:"")+this._generateMonthYearHeader(e,Z,et,G,Y,S>0||T>0,d,v)+"
    "+"",L=c?"":"";for(E=0;E<7;E++)A=(E+l)%7,L+="=5?" class='ui-datepicker-week-end'":"")+">"+""+p[A]+"";k+=L+"",O=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,O)),M=(this._getFirstDayOfMonth(et,Z)-l+7)%7,_=Math.ceil((M+O)/7),D=K?this.maxRows>_?this.maxRows:_:_,this.maxRows=D,P=this._daylightSavingAdjust(new Date(et,Z,1-M));for(H=0;H",B=c?"":"";for(E=0;E<7;E++)j=m?m.apply(e.input?e.input[0]:null,[P]):[!0,""],F=P.getMonth()!==Z,I=F&&!y||!j[0]||G&&PY,B+="",P.setDate(P.getDate()+1),P=this._daylightSavingAdjust(P);k+=B+""}Z++,Z>11&&(Z=0,et++),k+="
    "+this._get(e,"weekHeader")+"
    "+this._get(e,"calculateWeek")(P)+""+(F&&!g?" ":I?""+P.getDate()+"":""+P.getDate()+"")+"
    "+(K?""+(V[0]>0&&T===V[1]-1?"
    ":""):""),x+=k}w+=x}return w+=f,e._keyEvent=!1,w},_generateMonthYearHeader:function(e,t,n,r,i,s,o,u){var a,f,l,c,h,p,d,v,m=this._get(e,"changeMonth"),g=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="
    ",w="";if(s||!m)w+=""+o[t]+"";else{a=r&&r.getFullYear()===n,f=i&&i.getFullYear()===n,w+=""}y||(b+=w+(s||!m||!g?" ":""));if(!e.yearshtml){e.yearshtml="";if(s||!g)b+=""+n+"";else{c=this._get(e,"yearRange").split(":"),h=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?n+parseInt(e.substring(1),10):e.match(/[+\-].*/)?h+parseInt(e,10):parseInt(e,10);return isNaN(t)?h:t},d=p(c[0]),v=Math.max(d,p(c[1]||"")),d=r?Math.max(d,r.getFullYear()):d,v=i?Math.min(v,i.getFullYear()):v,e.yearshtml+="",b+=e.yearshtml,e.yearshtml=null}}return b+=this._get(e,"yearSuffix"),y&&(b+=(s||!m||!g?" ":"")+w),b+="
    ",b},_adjustInstDate:function(e,t,n){var r=e.drawYear+(n==="Y"?t:0),i=e.drawMonth+(n==="M"?t:0),s=Math.min(e.selectedDay,this._getDaysInMonth(r,i))+(n==="D"?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(r,i,s)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),(n==="M"||n==="Y")&&this._notifyChange(e)},_restrictMinMax:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max"),i=n&&tr?r:i},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return t==null?[1,1]:typeof t=="number"?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return(new Date(e,t,1)).getDay()},_canAdjustMonth:function(e,t,n,r){var i=this._getNumberOfMonths(e),s=this._daylightSavingAdjust(new Date(n,r+(t<0?t:i[0]*i[1]),1));return t<0&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(e,s)},_isInRange:function(e,t){var n,r,i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),o=null,u=null,a=this._get(e,"yearRange");return a&&(n=a.split(":"),r=(new Date).getFullYear(),o=parseInt(n[0],10)+r,u=parseInt(n[1],10)+r),(!i||t.getTime()>=i.getTime())&&(!s||t.getTime()<=s.getTime())&&(!o||t.getFullYear()>=o)&&(!u||t.getFullYear()<=u)},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t=typeof t!="string"?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,n,r){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var i=t?typeof t=="object"?t:this._daylightSavingAdjust(new Date(r,n,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),i,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),e("#"+e.datepicker._mainDivId).length===0&&e("body").append(e.datepicker.dpDiv);var n=Array.prototype.slice.call(arguments,1);return typeof t!="string"||t!=="isDisabled"&&t!=="getDate"&&t!=="widget"?t==="option"&&arguments.length===2&&typeof arguments[1]=="string"?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(n)):this.each(function(){typeof t=="string"?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(n)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(n))},e.datepicker=new s,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.10.0",window["DP_jQuery_"+r]=e}(jQuery),function(e,t){var n={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},r={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};e.widget("ui.dialog",{version:"1.10.0",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var n=e(this).css(t).offset().top;n<0&&e(this).css("top",t.top-n)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var n=this;if(!this._isOpen||this._trigger("beforeClose",t)===!1)return;this._isOpen=!1,this._destroyOverlay(),this.opener.filter(":focusable").focus().length||e(this.document[0].activeElement).blur(),this._hide(this.uiDialog,this.options.hide,function(){n._trigger("close",t)})},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,t){var n=!!this.uiDialog.nextAll(":visible").insertBefore(this.uiDialog).length;return n&&!t&&this._trigger("focus",e),n},open:function(){if(this._isOpen){this._moveToTop()&&this._focusTabbable();return}this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show),this._focusTabbable(),this._isOpen=!0,this._trigger("open"),this._trigger("focus")},_focusTabbable:function(){var e=this.element.find("[autofocus]");e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function n(){var t=this.document[0].activeElement,n=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);n||this._focusTabbable()}t.preventDefault(),n.call(this),this._delay(n)},_createWrapper:function(){this.uiDialog=e("
    ").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE){t.preventDefault(),this.close(t);return}if(t.keyCode!==e.ui.keyCode.TAB)return;var n=this.uiDialog.find(":tabbable"),r=n.filter(":first"),i=n.filter(":last");t.target!==i[0]&&t.target!==this.uiDialog[0]||!!t.shiftKey?(t.target===r[0]||t.target===this.uiDialog[0])&&t.shiftKey&&(i.focus(1),t.preventDefault()):(r.focus(1),t.preventDefault())},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("
    ").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html(" "),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("
    ").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,n=this.options.buttons;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty();if(e.isEmptyObject(n)){this.uiDialog.removeClass("ui-dialog-buttons");return}e.each(n,function(n,r){var i,s;r=e.isFunction(r)?{click:r,text:n}:r,r=e.extend({type:"button"},r),i=r.click,r.click=function(){i.apply(t.element[0],arguments)},s={icons:r.icons,text:r.showText},delete r.icons,delete r.showText,e("",r).button(s).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog)},_makeDraggable:function(){function r(e){return{position:e.position,offset:e.offset}}var t=this,n=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(n,i){e(this).addClass("ui-dialog-dragging"),t._trigger("dragStart",n,r(i))},drag:function(e,n){t._trigger("drag",e,r(n))},stop:function(i,s){n.position=[s.position.left-t.document.scrollLeft(),s.position.top-t.document.scrollTop()],e(this).removeClass("ui-dialog-dragging"),t._trigger("dragStop",i,r(s))}})},_makeResizable:function(){function o(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var t=this,n=this.options,r=n.resizable,i=this.uiDialog.css("position"),s=typeof r=="string"?r:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:n.maxWidth,maxHeight:n.maxHeight,minWidth:n.minWidth,minHeight:this._minHeight(),handles:s,start:function(n,r){e(this).addClass("ui-dialog-resizing"),t._trigger("resizeStart",n,o(r))},resize:function(e,n){t._trigger("resize",e,o(n))},stop:function(r,i){n.height=e(this).height(),n.width=e(this).width(),e(this).removeClass("ui-dialog-resizing"),t._trigger("resizeStop",r,o(i))}}).css("position",i)},_minHeight:function(){var e=this.options;return e.height==="auto"?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,o={};e.each(t,function(e,t){i._setOption(e,t),e in n&&(s=!0),e in r&&(o[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",o)},_setOption:function(e,t){var n,r,i=this.uiDialog;e==="dialogClass"&&i.removeClass(this.options.dialogClass).addClass(t);if(e==="disabled")return;this._super(e,t),e==="appendTo"&&this.uiDialog.appendTo(this._appendTo()),e==="buttons"&&this._createButtons(),e==="closeText"&&this.uiDialogTitlebarClose.button({label:""+t}),e==="draggable"&&(n=i.is(":data(ui-draggable)"),n&&!t&&i.draggable("destroy"),!n&&t&&this._makeDraggable()),e==="position"&&this._position(),e==="resizable"&&(r=i.is(":data(ui-resizable)"),r&&!t&&i.resizable("destroy"),r&&typeof t=="string"&&i.resizable("option","handles",t),!r&&t!==!1&&this._makeResizable()),e==="title"&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title"))},_size:function(){var e,t,n,r=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),r.minWidth>r.width&&(r.width=r.minWidth),e=this.uiDialog.css({height:"auto",width:r.width}).outerHeight(),t=Math.max(0,r.minHeight-e),n=typeof r.maxHeight=="number"?Math.max(0,r.maxHeight-e):"none",r.height==="auto"?this.element.css({minHeight:t,maxHeight:n,height:"auto"}):this.element.height(Math.max(0,r.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_createOverlay:function(){if(!this.options.modal)return;e.ui.dialog.overlayInstances||this._delay(function(){e.ui.dialog.overlayInstances&&this._on(this.document,{focusin:function(t){e(t.target).closest(".ui-dialog").length||(t.preventDefault(),e(".ui-dialog:visible:last .ui-dialog-content").data("ui-dialog")._focusTabbable())}})}),this.overlay=e("
    ").addClass("ui-widget-overlay ui-front").appendTo(this.document[0].body),this._on(this.overlay,{mousedown:"_keepFocus"}),e.ui.dialog.overlayInstances++},_destroyOverlay:function(){if(!this.options.modal)return;e.ui.dialog.overlayInstances--,e.ui.dialog.overlayInstances||this._off(this.document,"focusin"),this.overlay.remove()}}),e.ui.dialog.overlayInstances=0,e.uiBackCompat!==!1&&e.widget("ui.dialog",e.ui.dialog,{_position:function(){var t=this.options.position,n=[],r=[0,0],i;if(t){if(typeof t=="string"||typeof t=="object"&&"0"in t)n=t.split?t.split(" "):[t[0],t[1]],n.length===1&&(n[1]=n[0]),e.each(["left","top"],function(e,t){+n[e]===n[e]&&(r[e]=n[e],n[e]=t)}),t={my:n[0]+(r[0]<0?r[0]:"+"+r[0])+" "+n[1]+(r[1]<0?r[1]:"+"+r[1]),at:n.join(" ")};t=e.extend({},e.ui.dialog.prototype.options.position,t)}else t=e.ui.dialog.prototype.options.position;i=this.uiDialog.is(":visible"),i||this.uiDialog.show(),this.uiDialog.position(t),i||this.uiDialog.hide()}})}(jQuery),function(e,t){var n=/up|down|vertical/,r=/up|left|vertical|horizontal/;e.effects.effect.blind=function(t,i){var s=e(this),o=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(s,t.mode||"hide"),a=t.direction||"up",f=n.test(a),l=f?"height":"width",c=f?"top":"left",h=r.test(a),p={},d=u==="show",v,m,g;s.parent().is(".ui-effects-wrapper")?e.effects.save(s.parent(),o):e.effects.save(s,o),s.show(),v=e.effects.createWrapper(s).css({overflow:"hidden"}),m=v[l](),g=parseFloat(v.css(c))||0,p[l]=d?m:0,h||(s.css(f?"bottom":"right",0).css(f?"top":"left","auto").css({position:"absolute"}),p[c]=d?g:m+g),d&&(v.css(l,0),h||v.css(c,g+m)),v.animate(p,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){u==="hide"&&s.hide(),e.effects.restore(s,o),e.effects.removeWrapper(s),i()}})}}(jQuery),function(e,t){e.effects.effect.bounce=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=s==="hide",u=s==="show",a=t.direction||"up",f=t.distance,l=t.times||5,c=l*2+(u||o?1:0),h=t.duration/c,p=t.easing,d=a==="up"||a==="down"?"top":"left",v=a==="up"||a==="left",m,g,y,b=r.queue(),w=b.length;(u||o)&&i.push("opacity"),e.effects.save(r,i),r.show(),e.effects.createWrapper(r),f||(f=r[d==="top"?"outerHeight":"outerWidth"]()/3),u&&(y={opacity:1},y[d]=0,r.css("opacity",0).css(d,v?-f*2:f*2).animate(y,h,p)),o&&(f/=Math.pow(2,l-1)),y={},y[d]=0;for(m=0;m1&&b.splice.apply(b,[1,0].concat(b.splice(w,c+1))),r.dequeue()}}(jQuery),function(e,t){e.effects.effect.clip=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"vertical",a=u==="vertical",f=a?"height":"width",l=a?"top":"left",c={},h,p,d;e.effects.save(r,i),r.show(),h=e.effects.createWrapper(r).css({overflow:"hidden"}),p=r[0].tagName==="IMG"?h:r,d=p[f](),o&&(p.css(f,0),p.css(l,d/2)),c[f]=o?d:0,c[l]=o?0:d/2,p.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o||r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}}(jQuery),function(e,t){e.effects.effect.drop=function(t,n){var r=e(this),i=["position","top","bottom","left","right","opacity","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left"?"pos":"neg",l={opacity:o?1:0},c;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),c=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0)/2,o&&r.css("opacity",0).css(a,f==="pos"?-c:c),l[a]=(o?f==="pos"?"+=":"-=":f==="pos"?"-=":"+=")+c,r.animate(l,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}}(jQuery),function(e,t){e.effects.effect.explode=function(t,n){function y(){c.push(this),c.length===r*i&&b()}function b(){s.css({visibility:"visible"}),e(c).remove(),u||s.hide(),n()}var r=t.pieces?Math.round(Math.sqrt(t.pieces)):3,i=r,s=e(this),o=e.effects.setMode(s,t.mode||"hide"),u=o==="show",a=s.show().css("visibility","hidden").offset(),f=Math.ceil(s.outerWidth()/i),l=Math.ceil(s.outerHeight()/r),c=[],h,p,d,v,m,g;for(h=0;h
    ").css({position:"absolute",visibility:"visible",left:-p*f,top:-h*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:f,height:l,left:d+(u?m*f:0),top:v+(u?g*l:0),opacity:u?0:1}).animate({left:d+(u?0:m*f),top:v+(u?0:g*l),opacity:u?1:0},t.duration||500,t.easing,y)}}}(jQuery),function(e,t){e.effects.effect.fade=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"toggle");r.animate({opacity:i},{queue:!1,duration:t.duration,easing:t.easing,complete:n})}}(jQuery),function(e,t){e.effects.effect.fold=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=s==="hide",a=t.size||15,f=/([0-9]+)%/.exec(a),l=!!t.horizFirst,c=o!==l,h=c?["width","height"]:["height","width"],p=t.duration/2,d,v,m={},g={};e.effects.save(r,i),r.show(),d=e.effects.createWrapper(r).css({overflow:"hidden"}),v=c?[d.width(),d.height()]:[d.height(),d.width()],f&&(a=parseInt(f[1],10)/100*v[u?0:1]),o&&d.css(l?{height:0,width:a}:{height:a,width:0}),m[h[0]]=o?v[0]:a,g[h[1]]=o?v[1]:0,d.animate(m,p,t.easing).animate(g,p,t.easing,function(){u&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()})}}(jQuery),function(e,t){e.effects.effect.highlight=function(t,n){var r=e(this),i=["backgroundImage","backgroundColor","opacity"],s=e.effects.setMode(r,t.mode||"show"),o={backgroundColor:r.css("backgroundColor")};s==="hide"&&(o.opacity=0),e.effects.save(r,i),r.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),n()}})}}(jQuery),function(e,t){e.effects.effect.pulsate=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"show"),s=i==="show",o=i==="hide",u=s||i==="hide",a=(t.times||5)*2+(u?1:0),f=t.duration/a,l=0,c=r.queue(),h=c.length,p;if(s||!r.is(":visible"))r.css("opacity",0).show(),l=1;for(p=1;p1&&c.splice.apply(c,[1,0].concat(c.splice(h,a+1))),r.dequeue()}}(jQuery),function(e,t){e.effects.effect.puff=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"hide"),s=i==="hide",o=parseInt(t.percent,10)||150,u=o/100,a={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:i,complete:n,percent:s?o:100,from:s?a:{height:a.height*u,width:a.width*u,outerHeight:a.outerHeight*u,outerWidth:a.outerWidth*u}}),r.effect(t)},e.effects.effect.scale=function(t,n){var r=e(this),i=e.extend(!0,{},t),s=e.effects.setMode(r,t.mode||"effect"),o=parseInt(t.percent,10)||(parseInt(t.percent,10)===0?0:s==="hide"?0:100),u=t.direction||"both",a=t.origin,f={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},l={y:u!=="horizontal"?o/100:1,x:u!=="vertical"?o/100:1};i.effect="size",i.queue=!1,i.complete=n,s!=="effect"&&(i.origin=a||["middle","center"],i.restore=!0),i.from=t.from||(s==="show"?{height:0,width:0,outerHeight:0,outerWidth:0}:f),i.to={height:f.height*l.y,width:f.width*l.x,outerHeight:f.outerHeight*l.y,outerWidth:f.outerWidth*l.x},i.fade&&(s==="show"&&(i.from.opacity=0,i.to.opacity=1),s==="hide"&&(i.from.opacity=1,i.to.opacity=0)),r.effect(i)},e.effects.effect.size=function(t,n){var r,i,s,o=e(this),u=["position","top","bottom","left","right","width","height","overflow","opacity"],a=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],l=["fontSize"],c=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),d=t.restore||p!=="effect",v=t.scale||"both",m=t.origin||["middle","center"],g=o.css("position"),y=d?u:a,b={height:0,width:0,outerHeight:0,outerWidth:0};p==="show"&&o.show(),r={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},t.mode==="toggle"&&p==="show"?(o.from=t.to||b,o.to=t.from||r):(o.from=t.from||(p==="show"?b:r),o.to=t.to||(p==="hide"?b:r)),s={from:{y:o.from.height/r.height,x:o.from.width/r.width},to:{y:o.to.height/r.height,x:o.to.width/r.width}};if(v==="box"||v==="both")s.from.y!==s.to.y&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,s.from.y,o.from),o.to=e.effects.setTransition(o,c,s.to.y,o.to)),s.from.x!==s.to.x&&(y=y.concat(h),o.from=e.effects.setTransition(o,h,s.from.x,o.from),o.to=e.effects.setTransition(o,h,s.to.x,o.to));(v==="content"||v==="both")&&s.from.y!==s.to.y&&(y=y.concat(l).concat(f),o.from=e.effects.setTransition(o,l,s.from.y,o.from),o.to=e.effects.setTransition(o,l,s.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),m&&(i=e.effects.getBaseline(m,r),o.from.top=(r.outerHeight-o.outerHeight())*i.y,o.from.left=(r.outerWidth-o.outerWidth())*i.x,o.to.top=(r.outerHeight-o.to.outerHeight)*i.y,o.to.left=(r.outerWidth-o.to.outerWidth)*i.x),o.css(o.from);if(v==="content"||v==="both")c=c.concat(["marginTop","marginBottom"]).concat(l),h=h.concat(["marginLeft","marginRight"]),f=u.concat(c).concat(h),o.find("*[width]").each(function(){var n=e(this),r={height:n.height(),width:n.width(),outerHeight:n.outerHeight(),outerWidth:n.outerWidth()};d&&e.effects.save(n,f),n.from={height:r.height*s.from.y,width:r.width*s.from.x,outerHeight:r.outerHeight*s.from.y,outerWidth:r.outerWidth*s.from.x},n.to={height:r.height*s.to.y,width:r.width*s.to.x,outerHeight:r.height*s.to.y,outerWidth:r.width*s.to.x},s.from.y!==s.to.y&&(n.from=e.effects.setTransition(n,c,s.from.y,n.from),n.to=e.effects.setTransition(n,c,s.to.y,n.to)),s.from.x!==s.to.x&&(n.from=e.effects.setTransition(n,h,s.from.x,n.from),n.to=e.effects.setTransition(n,h,s.to.x,n.to)),n.css(n.from),n.animate(n.to,t.duration,t.easing,function(){d&&e.effects.restore(n,f)})});o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o.to.opacity===0&&o.css("opacity",o.from.opacity),p==="hide"&&o.hide(),e.effects.restore(o,y),d||(g==="static"?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,n){var r=parseInt(n,10),i=e?o.to.left:o.to.top;return n==="auto"?i+"px":r+i+"px"})})),e.effects.removeWrapper(o),n()}})}}(jQuery),function(e,t){e.effects.effect.shake=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=t.direction||"left",u=t.distance||20,a=t.times||3,f=a*2+1,l=Math.round(t.duration/f),c=o==="up"||o==="down"?"top":"left",h=o==="up"||o==="left",p={},d={},v={},m,g=r.queue(),y=g.length;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),p[c]=(h?"-=":"+=")+u,d[c]=(h?"+=":"-=")+u*2,v[c]=(h?"-=":"+=")+u*2,r.animate(p,l,t.easing);for(m=1;m1&&g.splice.apply(g,[1,0].concat(g.splice(y,f+1))),r.dequeue()}}(jQuery),function(e,t){e.effects.effect.slide=function(t,n){var r=e(this),i=["position","top","bottom","left","right","width","height"],s=e.effects.setMode(r,t.mode||"show"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left",l,c={};e.effects.save(r,i),r.show(),l=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(r).css({overflow:"hidden"}),o&&r.css(a,f?isNaN(l)?"-"+l:-l:l),c[a]=(o?f?"+=":"-=":f?"-=":"+=")+l,r.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}}(jQuery),function(e,t){e.effects.effect.transfer=function(t,n){var r=e(this),i=e(t.to),s=i.css("position")==="fixed",o=e("body"),u=s?o.scrollTop():0,a=s?o.scrollLeft():0,f=i.offset(),l={top:f.top-u,left:f.left-a,height:i.innerHeight(),width:i.innerWidth()},c=r.offset(),h=e("
    ").appendTo(document.body).addClass(t.className).css({top:c.top-u,left:c.left-a,height:r.innerHeight(),width:r.innerWidth(),position:s?"fixed":"absolute"}).animate(l,t.duration,t.easing,function(){h.remove(),n()})}}(jQuery),function(e,t){e.widget("ui.menu",{version:"1.10.0",defaultElement:"
      ",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,e.proxy(function(e){this.options.disabled&&e.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(e){e.preventDefault()},"click .ui-state-disabled > a":function(e){e.preventDefault()},"click .ui-menu-item:has(a)":function(t){var n=e(t.target).closest(".ui-menu-item");!this.mouseHandled&&n.not(".ui-state-disabled").length&&(this.mouseHandled=!0,this.select(t),n.has(".ui-menu").length?this.expand(t):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&this.active.parents(".ui-menu").length===1&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var n=e(t.currentTarget);n.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(t,n)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this.element.children(".ui-menu-item").eq(0);t||this.focus(e,n)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){e(t.target).closest(".ui-menu").length||this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function a(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var n,r,i,s,o,u=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:u=!1,r=this.previousFilter||"",i=String.fromCharCode(t.keyCode),s=!1,clearTimeout(this.filterTimer),i===r?s=!0:i=r+i,o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())}),n=s&&n.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):n,n.length||(i=String.fromCharCode(t.keyCode),o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())})),n.length?(this.focus(t,n),n.length>1?(this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}u&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(e):this.select(e))},refresh:function(){var t,n=this.options.icons.submenu,r=this.element.find(this.options.menus);r.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),r=t.prev("a"),i=e("").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);r.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",r.attr("id"))}),t=r.add(this.element),t.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),t.children(":not(.ui-menu-item)").each(function(){var t=e(this);/[^\-—–\s]/.test(t.text())||t.addClass("ui-widget-content ui-menu-divider")}),t.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){e==="icons"&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),this._super(e,t)},focus:function(e,t){var n,r;this.blur(e,e&&e.type==="focus"),this._scrollIntoView(t),this.active=t.first(),r=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",r.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),e&&e.type==="keydown"?this._close():this.timer=this._delay(function(){this._close()},this.delay),n=t.children(".ui-menu"),n.length&&/^mouse/.test(e.type)&&this._startOpening(n),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var n,r,i,s,o,u;this._hasScroll()&&(n=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,r=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,i=t.offset().top-this.activeMenu.offset().top-n-r,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),u=t.height(),i<0?this.activeMenu.scrollTop(s+i):i+u>o&&this.activeMenu.scrollTop(s+i-o+u))},blur:function(e,t){t||clearTimeout(this.timer);if(!this.active)return;this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active})},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close(),this._open(e)},this.delay)},_open:function(t){var n=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(n)},collapseAll:function(t,n){clearTimeout(this.timer),this.timer=this._delay(function(){var r=n?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));r.length||(r=this.element),this._close(r),this.blur(t),this.activeMenu=r},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,n){var r;this.active&&(e==="first"||e==="last"?r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").eq(-1):r=this.active[e+"All"](".ui-menu-item").eq(0));if(!r||!r.length||!this.active)r=this.activeMenu.children(".ui-menu-item")[t]();this.focus(n,r)},nextPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isLastItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r-i<0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())},previousPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isFirstItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r+i>0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item").first())},_hasScroll:function(){return this.element.outerHeight()
    "),o=s.children()[0];return e("body").append(s),r=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?"":t.element.css("overflow-x"),r=t.isWindow?"":t.element.css("overflow-y"),i=n==="scroll"||n==="auto"&&t.width0?"right":"center",vertical:u<0?"top":o>0?"bottom":"middle"};lr(i(o),i(u))?h.important="horizontal":h.important="vertical",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,c=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML="",n.removeChild(t)}()}(jQuery),function(e,t){e.widget("ui.progressbar",{version:"1.10.0",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("
    ").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){if(e===t)return this.options.value;this.options.value=this._constrainedValue(e),this._refreshValue()},_constrainedValue:function(e){return e===t&&(e=this.options.value),this.indeterminate=e===!1,typeof e!="number"&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){e==="max"&&(t=Math.max(this.min,t)),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,n=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(n.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("
    ").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}})}(jQuery),function(e,t){var n=5;e.widget("ui.slider",e.ui.mouse,{version:"1.10.0",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){var t,n,r=this.options,i=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),s="",o=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this.range=e([]),r.range&&(r.range===!0&&(r.values?r.values.length&&r.values.length!==2?r.values=[r.values[0],r.values[0]]:e.isArray(r.values)&&(r.values=r.values.slice(0)):r.values=[this._valueMin(),this._valueMin()]),this.range=e("
    ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(r.range==="min"||r.range==="max"?" ui-slider-range-"+r.range:""))),n=r.values&&r.values.length||1;for(t=i.length;tn||i===n&&(t===l._lastChangedValue||l.values(t)===c.min))i=n,s=e(this),o=t}),u=this._start(t,o),u===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,s.addClass("ui-state-active").focus(),a=s.offset(),f=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=f?{left:0,top:0}:{left:t.pageX-a.left-s.width()/2,top:t.pageY-a.top-s.height()/2-(parseInt(s.css("borderTopWidth"),10)||0)-(parseInt(s.css("borderBottomWidth"),10)||0)+(parseInt(s.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,r),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,n),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,n,r,i,s;return this.orientation==="horizontal"?(t=this.elementSize.width,n=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,n=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),r=n/t,r>1&&(r=1),r<0&&(r=0),this.orientation==="vertical"&&(r=1-r),i=this._valueMax()-this._valueMin(),s=this._valueMin()+r*i,this._trimAlignValue(s)},_start:function(e,t){var n={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("start",e,n)},_slide:function(e,t,n){var r,i,s;this.options.values&&this.options.values.length?(r=this.values(t?0:1),this.options.values.length===2&&this.options.range===!0&&(t===0&&n>r||t===1&&n1){this.options.values[t]=this._trimAlignValue(n),this._refreshValue(),this._change(null,t);return}if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();r=this.options.values,i=arguments[0];for(s=0;s=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,n=(e-this._valueMin())%t,r=e-n;return Math.abs(n)*2>=t&&(r+=n>0?t:-t),parseFloat(r.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,n,r,i,s,o=this.options.range,u=this.options,a=this,f=this._animateOff?!1:u.animate,l={};this.options.values&&this.options.values.length?this.handles.each(function(r){n=(a.values(r)-a._valueMin())/(a._valueMax()-a._valueMin())*100,l[a.orientation==="horizontal"?"left":"bottom"]=n+"%",e(this).stop(1,1)[f?"animate":"css"](l,u.animate),a.options.range===!0&&(a.orientation==="horizontal"?(r===0&&a.range.stop(1,1)[f?"animate":"css"]({left:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({width:n-t+"%"},{queue:!1,duration:u.animate})):(r===0&&a.range.stop(1,1)[f?"animate":"css"]({bottom:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({height:n-t+"%"},{queue:!1,duration:u.animate}))),t=n}):(r=this.value(),i=this._valueMin(),s=this._valueMax(),n=s!==i?(r-i)/(s-i)*100:0,l[this.orientation==="horizontal"?"left":"bottom"]=n+"%",this.handle.stop(1,1)[f?"animate":"css"](l,u.animate),o==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[f?"animate":"css"]({width:n+"%"},u.animate),o==="max"&&this.orientation==="horizontal"&&this.range[f?"animate":"css"]({width:100-n+"%"},{queue:!1,duration:u.animate}),o==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[f?"animate":"css"]({height:n+"%"},u.animate),o==="max"&&this.orientation==="vertical"&&this.range[f?"animate":"css"]({height:100-n+"%"},{queue:!1,duration:u.animate}))},_handleEvents:{keydown:function(t){var r,i,s,o,u=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:t.preventDefault();if(!this._keySliding){this._keySliding=!0,e(t.target).addClass("ui-state-active"),r=this._start(t,u);if(r===!1)return}}o=this.options.step,this.options.values&&this.options.values.length?i=s=this.values(u):i=s=this.value();switch(t.keyCode){case e.ui.keyCode.HOME:s=this._valueMin();break;case e.ui.keyCode.END:s=this._valueMax();break;case e.ui.keyCode.PAGE_UP:s=this._trimAlignValue(i+(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.PAGE_DOWN:s=this._trimAlignValue(i-(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(i===this._valueMax())return;s=this._trimAlignValue(i+o);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(i===this._valueMin())return;s=this._trimAlignValue(i-o)}this._slide(t,u,s)},keyup:function(t){var n=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,n),this._change(t,n),e(t.target).removeClass("ui-state-active"))}}})}(jQuery),function(e){function t(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.widget("ui.spinner",{version:"1.10.0",defaultElement:"",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},n=this.element;return e.each(["min","max","step"],function(e,r){var i=n.attr(r);i!==undefined&&i.length&&(t[r]=i)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e)},mousewheel:function(e,t){if(!t)return;if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()},"mousedown .ui-spinner-button":function(t){function r(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),r.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,r.call(this)});if(this._start(t)===!1)return;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(!e(t.currentTarget).hasClass("ui-state-active"))return;if(this._start(t)===!1)return!1;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(e.height()*.5)&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var n=this.options,r=e.ui.keyCode;switch(t.keyCode){case r.UP:return this._repeat(null,1,t),!0;case r.DOWN:return this._repeat(null,-1,t),!0;case r.PAGE_UP:return this._repeat(null,n.page,t),!0;case r.PAGE_DOWN:return this._repeat(null,-n.page,t),!0}return!1},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""+""+""+""+""},_start:function(e){return!this.spinning&&this._trigger("start",e)===!1?!1:(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(e,t,n){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,n)},e),this._spin(t*this.options.step,n)},_spin:function(e,t){var n=this.value()||0;this.counter||(this.counter=1),n=this._adjustValue(n+e*this._increment(this.counter));if(!this.spinning||this._trigger("spin",t,{value:n})!==!1)this._value(n),this.counter++},_increment:function(t){var n=this.options.incremental;return n?e.isFunction(n)?n(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return this.options.min!==null&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=e.toString(),n=t.indexOf(".");return n===-1?0:t.length-n-1},_adjustValue:function(e){var t,n,r=this.options;return t=r.min!==null?r.min:0,n=e-t,n=Math.round(n/r.step)*r.step,e=t+n,e=parseFloat(e.toFixed(this._precision())),r.max!==null&&e>r.max?r.max:r.min!==null&&e1&&decodeURIComponent(e.href.replace(r,""))===decodeURIComponent(location.href.replace(r,""))}var n=0,r=/#.*$/;e.widget("ui.tabs",{version:"1.10.0",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var t=this,n=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",n.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),n.active=this._initialActive(),e.isArray(n.disabled)&&(n.disabled=e.unique(n.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.options.active!==!1&&this.anchors.length?this.active=this._findActive(n.active):this.active=e(),this._refresh(),this.active.length&&this.load(n.active)},_initialActive:function(){var t=this.options.active,n=this.options.collapsible,r=location.hash.substring(1);if(t===null){r&&this.tabs.each(function(n,i){if(e(i).attr("aria-controls")===r)return t=n,!1}),t===null&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active")));if(t===null||t===-1)t=this.tabs.length?0:!1}return t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),t===-1&&(t=n?!1:0)),!n&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var n=e(this.document[0].activeElement).closest("li"),r=this.tabs.index(n),i=!0;if(this._handlePageNav(t))return;switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:r++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:i=!1,r--;break;case e.ui.keyCode.END:r=this.anchors.length-1;break;case e.ui.keyCode.HOME:r=0;break;case e.ui.keyCode.SPACE:t.preventDefault(),clearTimeout(this.activating),this._activate(r);return;case e.ui.keyCode.ENTER:t.preventDefault(),clearTimeout(this.activating),this._activate(r===this.options.active?!1:r);return;default:return}t.preventDefault(),clearTimeout(this.activating),r=this._focusNextTab(r,i),t.ctrlKey||(n.attr("aria-selected","false"),this.tabs.eq(r).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",r)},this.delay))},_panelKeydown:function(t){if(this._handlePageNav(t))return;t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP)return this._activate(this._focusNextTab(this.options.active-1,!1)),!0;if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN)return this._activate(this._focusNextTab(this.options.active+1,!0)),!0},_findNextTab:function(t,n){function i(){return t>r&&(t=0),t<0&&(t=r),t}var r=this.tabs.length-1;while(e.inArray(i(),this.options.disabled)!==-1)t=n?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="disabled"){this._setupDisabled(t);return}this._super(e,t),e==="collapsible"&&(this.element.toggleClass("ui-tabs-collapsible",t),!t&&this.options.active===!1&&this._activate(0)),e==="event"&&this._setupEvents(t),e==="heightStyle"&&this._setupHeightStyle(t)},_tabId:function(e){return e.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,n=this.tablist.children(":has(a[href])");t.disabled=e.map(n.filter(".ui-state-disabled"),function(e){return n.index(e)}),this._processTabs(),t.active===!1||!this.anchors.length?(t.active=!1,this.active=e()):this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(n,r){var i,o,u,a=e(r).uniqueId().attr("id"),f=e(r).closest("li"),l=f.attr("aria-controls");s(r)?(i=r.hash,o=t.element.find(t._sanitizeSelector(i))):(u=t._tabId(f),i="#"+u,o=t.element.find(i),o.length||(o=t._createPanel(u),o.insertAfter(t.panels[n-1]||t.tablist)),o.attr("aria-live","polite")),o.length&&(t.panels=t.panels.add(o)),l&&f.data("ui-tabs-aria-controls",l),f.attr({"aria-controls":i.substring(1),"aria-labelledby":a}),o.attr("aria-labelledby",a)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("
    ").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var n=0,r;r=this.tabs[n];n++)t===!0||e.inArray(n,t)!==-1?e(r).addClass("ui-state-disabled").attr("aria-disabled","true"):e(r).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var n={click:function(e){e.preventDefault()}};t&&e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,n),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var n,r=this.element.parent();t==="fill"?(n=r.height(),n-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),r=t.css("position");if(r==="absolute"||r==="fixed")return;n-=t.outerHeight(!0)}),this.element.children().not(this.panels).each(function(){n-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,n-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):t==="auto"&&(n=0,this.panels.each(function(){n=Math.max(n,e(this).height("").height())}).height(n))},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i.closest("li"),o=s[0]===r[0],u=o&&n.collapsible,a=u?e():this._getPanelForTab(s),f=r.length?this._getPanelForTab(r):e(),l={oldTab:r,oldPanel:f,newTab:u?e():s,newPanel:a};t.preventDefault();if(s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||o&&!n.collapsible||this._trigger("beforeActivate",t,l)===!1)return;n.active=u?!1:this.tabs.index(s),this.active=o?e():s,this.xhr&&this.xhr.abort(),!f.length&&!a.length&&e.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,l)},_toggle:function(t,n){function o(){r.running=!1,r._trigger("activate",t,n)}function u(){n.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),i.length&&r.options.show?r._show(i,r.options.show,o):(i.show(),o())}var r=this,i=n.newPanel,s=n.oldPanel;this.running=!0,s.length&&this.options.hide?this._hide(s,this.options.hide,function(){n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),s.hide(),u()),s.attr({"aria-expanded":"false","aria-hidden":"true"}),n.oldTab.attr("aria-selected","false"),i.length&&s.length?n.oldTab.attr("tabIndex",-1):i.length&&this.tabs.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}),n.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(t){var n,r=this._findActive(t);if(r[0]===this.active[0])return;r.length||(r=this.active),n=r.find(".ui-tabs-anchor")[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return typeof e=="string"&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),n=t.data("ui-tabs-aria-controls");n?t.attr("aria-controls",n).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),this.options.heightStyle!=="content"&&this.panels.css("height","")},enable:function(n){var r=this.options.disabled;if(r===!1)return;n===t?r=!1:(n=this._getIndex(n),e.isArray(r)?r=e.map(r,function(e){return e!==n?e:null}):r=e.map(this.tabs,function(e,t){return t!==n?t:null})),this._setupDisabled(r)},disable:function(n){var r=this.options.disabled;if(r===!0)return;if(n===t)r=!0;else{n=this._getIndex(n);if(e.inArray(n,r)!==-1)return;e.isArray(r)?r=e.merge([n],r).sort():r=[n]}this._setupDisabled(r)},load:function(t,n){t=this._getIndex(t);var r=this,i=this.tabs.eq(t),o=i.find(".ui-tabs-anchor"),u=this._getPanelForTab(i),a={tab:i,panel:u};if(s(o[0]))return;this.xhr=e.ajax(this._ajaxSettings(o,n,a)),this.xhr&&this.xhr.statusText!=="canceled"&&(i.addClass("ui-tabs-loading"),u.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){u.html(e),r._trigger("load",n,a)},1)}).complete(function(e,t){setTimeout(function(){t==="abort"&&r.panels.stop(!1,!0),i.removeClass("ui-tabs-loading"),u.removeAttr("aria-busy"),e===r.xhr&&delete r.xhr},1)}))},_ajaxSettings:function(t,n,r){var i=this;return{url:t.attr("href"),beforeSend:function(t,s){return i._trigger("beforeLoad",n,e.extend({jqXHR:t,ajaxSettings:s},r))}}},_getPanelForTab:function(t){var n=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+n))}})}(jQuery),function(e){function n(t,n){var r=(t.attr("aria-describedby")||"").split(/\s+/);r.push(n),t.data("ui-tooltip-id",n).attr("aria-describedby",e.trim(r.join(" ")))}function r(t){var n=t.data("ui-tooltip-id"),r=(t.attr("aria-describedby")||"").split(/\s+/),i=e.inArray(n,r);i!==-1&&r.splice(i,1),t.removeData("ui-tooltip-id"),r=e.trim(r.join(" ")),r?t.attr("aria-describedby",r):t.removeAttr("aria-describedby")}var t=0;e.widget("ui.tooltip",{version:"1.10.0",options:{content:function(){var t=e(this).attr("title")||"";return e("").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(t,n){var r=this;if(t==="disabled"){this[n?"_disable":"_enable"](),this.options[t]=n;return}this._super(t,n),t==="content"&&e.each(this.tooltips,function(e,t){r._updateContent(t)})},_disable:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var n=this,r=e(t?t.target:this.element).closest(this.options.items);if(!r.length||r.data("ui-tooltip-id"))return;r.attr("title")&&r.data("ui-tooltip-title",r.attr("title")),r.data("ui-tooltip-open",!0),t&&t.type==="mouseover"&&r.parents().each(function(){var t=e(this),r;t.data("ui-tooltip-open")&&(r=e.Event("blur"),r.target=r.currentTarget=this,n.close(r,!0)),t.attr("title")&&(t.uniqueId(),n.parents[this.id]={element:this,title:t.attr("title")},t.attr("title",""))}),this._updateContent(r,t)},_updateContent:function(e,t){var n,r=this.options.content,i=this,s=t?t.type:null;if(typeof r=="string")return this._open(t,e,r);n=r.call(e[0],function(n){if(!e.data("ui-tooltip-open"))return;i._delay(function(){t&&(t.type=s),this._open(t,e,n)})}),n&&this._open(t,e,n)},_open:function(t,r,i){function f(e){a.of=e;if(s.is(":hidden"))return;s.position(a)}var s,o,u,a=e.extend({},this.options.position);if(!i)return;s=this._find(r);if(s.length){s.find(".ui-tooltip-content").html(i);return}r.is("[title]")&&(t&&t.type==="mouseover"?r.attr("title",""):r.removeAttr("title")),s=this._tooltip(r),n(r,s.attr("id")),s.find(".ui-tooltip-content").html(i),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:f}),f(t)):s.position(e.extend({of:r},this.options.position)),s.hide(),this._show(s,this.options.show),this.options.show&&this.options.show.delay&&(u=this.delayedShow=setInterval(function(){s.is(":visible")&&(f(a.of),clearInterval(u))},e.fx.interval)),this._trigger("open",t,{tooltip:s}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var n=e.Event(t);n.currentTarget=r[0],this.close(n,!0)}},remove:function(){this._removeTooltip(s)}};if(!t||t.type==="mouseover")o.mouseleave="close";if(!t||t.type==="focusin")o.focusout="close";this._on(!0,r,o)},close:function(t){var n=this,i=e(t?t.currentTarget:this.element),s=this._find(i);if(this.closing)return;clearInterval(this.delayedShow),i.data("ui-tooltip-title")&&i.attr("title",i.data("ui-tooltip-title")),r(i),s.stop(!0),this._hide(s,this.options.hide,function(){n._removeTooltip(e(this))}),i.removeData("ui-tooltip-open"),this._off(i,"mouseleave focusout keyup"),i[0]!==this.element[0]&&this._off(i,"remove"),this._off(this.document,"mousemove"),t&&t.type==="mouseleave"&&e.each(this.parents,function(t,r){e(r.element).attr("title",r.title),delete n.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:s}),this.closing=!1},_tooltip:function(n){var r="ui-tooltip-"+t++,i=e("
    ").attr({id:r,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return e("
    ").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[r]=n,i},_find:function(t){var n=t.data("ui-tooltip-id");return n?e("#"+n):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0),e("#"+n).remove(),r.data("ui-tooltip-title")&&(r.attr("title",r.data("ui-tooltip-title")),r.removeData("ui-tooltip-title"))})}})}(jQuery); \ No newline at end of file diff --git a/openslides/agenda/static/styles/agenda.css b/openslides/agenda/static/styles/agenda.css index 3a656f47c..2979007c9 100644 --- a/openslides/agenda/static/styles/agenda.css +++ b/openslides/agenda/static/styles/agenda.css @@ -5,30 +5,20 @@ * :license: GNU GPL, see LICENSE for more details. */ -/* agenda item open/closed */ -.close_link span { - background-image: url(../images/icons/close-grey.png); - background-repeat: no-repeat; - background-position: center; - width: 16px; - height: 16px; - display: inline-block; +tr.topline td { + border-bottom: 1px solid #333333; + background-color: #CDCDCD; } -.close_link.closed span { - background-image: url(../images/icons/close.png); -} - -table#menu-overview { - white-space: nowrap; -} table#agendatime { float: right; - width: 25%; + width: auto; margin-bottom: 1em; + font-size: 12px; } table#agendatime td { - padding: 5px; + padding: 3px; + white-space: nowrap; } diff --git a/openslides/agenda/templates/agenda/base_agenda.html b/openslides/agenda/templates/agenda/base_agenda.html deleted file mode 100644 index be70f6f40..000000000 --- a/openslides/agenda/templates/agenda/base_agenda.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'item_overview' as url_itemoverview %} - {% url 'item_new' as url_itemnew %} -

    {% trans "Agenda" %}

    -
    - - {# second submenu #} - {% if item %} -
    -

    {{ item.title }}

    - - {% endif %} -{% endblock %} - diff --git a/openslides/agenda/templates/agenda/config.html b/openslides/agenda/templates/agenda/config.html index bb273a70f..369ab8d83 100644 --- a/openslides/agenda/templates/agenda/config.html +++ b/openslides/agenda/templates/agenda/config.html @@ -6,11 +6,14 @@ {% load staticfiles %} {% block header %} - + - - - +{% endblock %} + +{% block javascript %} + + + {% if perms.agenda.can_manage_agenda %} - -{% endblock %} - -{% block submenu %} - {% url 'assignment_overview' as url_assignment_overview %} -

    {% trans "Elections" %}

    - - - {# second submenu #} - {% if assignment %} -
    -

    {{assignment}}

    - - {% endif %} -{% endblock %} diff --git a/openslides/assignment/templates/assignment/config.html b/openslides/assignment/templates/assignment/config.html index 52ba0598d..2de60af06 100644 --- a/openslides/assignment/templates/assignment/config.html +++ b/openslides/assignment/templates/assignment/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Election settings" %}{% endblock %} {% block content %} -

    {% trans "Election settings" %}

    +

    + {% trans "Configuration" %} + {% trans "Elections" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

    {% csrf_token %} - {{ form.as_p }} -

    - - - - -

    + {% include "form.html" %} +

    + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

    + * {% trans "required" %}
    {% endblock %} diff --git a/openslides/assignment/templates/assignment/edit.html b/openslides/assignment/templates/assignment/edit.html index 1d3b1c0a7..e5f56e87f 100644 --- a/openslides/assignment/templates/assignment/edit.html +++ b/openslides/assignment/templates/assignment/edit.html @@ -1,4 +1,4 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} @@ -11,27 +11,24 @@ {% endif %} {% endblock %} - {% block content %} - {% if assignment %} -

    {% trans "Edit election" %}

    - {% else %} -

    {% trans "New election" %}

    - {% endif %} +

    + {% if assignment %} + {% trans "Edit election" %} + {% else %} + {% trans "New election" %} + {% endif %} + + {% trans "Back to overview" %} + +

    {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

    - - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %}

    * {% trans "required" %} diff --git a/openslides/assignment/templates/assignment/overview.html b/openslides/assignment/templates/assignment/overview.html index c385be57e..afd499d48 100644 --- a/openslides/assignment/templates/assignment/overview.html +++ b/openslides/assignment/templates/assignment/overview.html @@ -1,35 +1,44 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} -{% load staticfiles %} {% block title %}{{ block.super }} – {% trans "Elections" %}{% endblock %} -{% block content %} -

    {% trans "Elections" %}

    -

    +{% block content %} +

    {% trans "Elections" %} + + {% if perms.assignment.can_manage_assignment %} + {% trans "New" %} + {% endif %} + {% if perms.assignment.can_see_assignment %} + PDF + {% endif %} + +

    + + {% trans "Filter" %}: - -
    -

    - {{ assignments|length }} - {% blocktrans count counter=assignments|length %}election{% plural %}elections{% endblocktrans %} - + + + {{ assignments|length }} + {% blocktrans count counter=assignments|length %}election{% plural %}elections{% endblocktrans %} + +
    - - + + {% for assignment in assignments %} - + - + diff --git a/openslides/assignment/templates/assignment/poll_view.html b/openslides/assignment/templates/assignment/poll_view.html index 7b41a247d..3a43b6f32 100644 --- a/openslides/assignment/templates/assignment/poll_view.html +++ b/openslides/assignment/templates/assignment/poll_view.html @@ -1,19 +1,35 @@ -{% extends 'assignment/base_assignment.html' %} +{% extends 'base.html' %} {% load i18n %} {% block title %}{{ block.super }} – {% trans "Election" %} "{{ assignment }}" – {{ ballotnumber }}. {% trans "ballot" %}{% endblock %} {% block content %} -

    {{ assignment }} – {{ ballotnumber }}. {% trans "ballot" %}

    - {% if assignment.polldescription %} -

    {% trans "Short description (for ballot paper)" %}: {{ assignment.polldescription }}

    +

    + {{ assignment }} + + {{ ballotnumber }}. {% trans "ballot" %} + + + {% trans "Back to election" %} + + {% if perms.projector.can_manage_projector %} + + + {% endif %} - {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} + +

    - {% csrf_token %} +{% if assignment.polldescription %} +

    {% trans "Short description (for ballot paper)" %}: {{ assignment.polldescription }}

    +{% endif %} -
    {% trans "Election" %} {% trans "Candidates" %}{% trans "Status" %}{% trans "Actions" %}{% trans "Status" %}{% trans "Actions" %}
    {{ assignment }} {% blocktrans with posts=assignment.posts context "Number of searched candidates for an election"%}posts: {{ posts }}{% endblocktrans %} @@ -38,19 +47,25 @@ {% endif %} | {% blocktrans with elected=assignment.elected|length %}elected: {{ elected }}{% endblocktrans %} {{ assignment.get_status_display }}{{ assignment.get_status_display }} {% if perms.projector.can_manage_projector %} - - + + {% endif %} {% if perms.assignment.can_manage_assignment %} - - + + + + + + {% endif %} - + + +
    +

    +{% trans "Special values" %}: -1 = {% trans 'majority' %} | -2 = {% trans 'undocumented' %} +

    +{% csrf_token %} +
    {% for value in poll.get_vote_values %} @@ -31,7 +47,7 @@ {% endfor %} {% endfor %} - + {% for value in poll.get_vote_values %} {% if forloop.first %} @@ -41,7 +57,7 @@ {% endif %} {% endfor %} - + {% for value in poll.get_vote_values %} {% if forloop.first %} @@ -54,26 +70,21 @@
    {% trans "Candidates" %}
    {% trans "Invalid votes" %}
    {% trans "Votes cast" %}

    - - + + {% trans 'Ballot paper as PDF' %}

    - -

    - - - - - -

    - - + +
    + + + + {% trans 'Cancel' %} + +
    + {% endblock %} diff --git a/openslides/assignment/templates/assignment/view.html b/openslides/assignment/templates/assignment/view.html index c04bc8c86..b62eb98e5 100644 --- a/openslides/assignment/templates/assignment/view.html +++ b/openslides/assignment/templates/assignment/view.html @@ -1,96 +1,121 @@ -{% extends "assignment/base_assignment.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} {% block title %}{{ block.super }} – {% trans "Election" %} "{{ assignment }}"{% endblock %} +{% block header %} + +{% endblock %} + +{% block javascript %} + +{% endblock %} + {% block content %} - - -
    -

    {{ assignment }}

    -

    {{ assignment.description|linebreaks }}

    +
    + + {% trans 'More actions' %} + + + +
    +
    + +
    +
    + +

    {% trans "Description" %}

    + {% if assignment.description %} + {{ assignment.description|linebreaks }} + {% else %} + – + {% endif %} +
    + {% if assignment.status != "fin" %} -

    {% trans "Candidates" %}

    +

    {% trans "Candidates" %}

      {% for person in assignment.get_participants %}
    1. {{ person }} {% if perms.assignment.can_manage_assignment %} {% if assignment.status == "sea" or assignment.status == "vot" %} - + {% endif %} {% endif %} {% if person in assignment.elected %} | {% trans "elected" %} {% if perms.assignment.can_manage_assignment %} {% if assignment.status == "sea" or assignment.status == "vot" %} - + + + {% endif %} {% endif %} {% endif %}
    2. {% empty %} -
    3. {% trans "No candidates available." %}
    4. +
    5. {% trans "No candidates available." %}
    6. {% endfor %}
    - {% if assignment.status == "sea" or perms.assignment.can_manage_assignment and assignment.status == "vot" %} {% if perms.assignment.can_nominate_self or perms.assignment.can_nominate_other %}
    {% csrf_token %} {% if perms.assignment.can_nominate_self %}

    {% if user_is_candidate %} - - - {% trans 'Withdraw self candidature' %} - + + {% trans 'Withdraw self candidature' %} {% else %} - - - {% trans 'Self candidature' %} - + + {% trans 'Self candidature' %} {% endif %}

    {% endif %} {% if perms.assignment.can_nominate_other %} {% for field in form %} - - {{ field }} - {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} - - {% endif %} - + +
    + {{ field }} + + {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} + + {% endif %} +
    {% endfor %}

    -

    {% endif %}
    @@ -99,11 +124,14 @@ {% endif %} {% if perms.assignment.can_manage_assignments and blocked_candidates and assignment.status != "fin" %} -

    {% trans "Blocked Candidates" %}

    +

    {% trans "Blocked Candidates" %}

      {% for person in blocked_candidates %}
    • - {{ person }} + {{ person }} + + +
    • {% empty %}
    • {% trans "No blocked candidates available." %}
    • @@ -111,120 +139,160 @@
    {% endif %} + + {% if assignment.status != "sea" or polls.exists %} -

    {% trans "Election results" %}

    - +

    {% trans "Election results" %}

    {% if polls.exists %} - - - - {% for poll in polls %} - + + + {% for poll in polls %} + {% if poll.published or perms.assignment.can_manage_assignment %} + + {% endif %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + + {% endif %} + +
    {% trans "Candidates" %} - {{ poll.get_ballot }}. {% trans 'ballot' %} - {% if perms.assignment.can_manage_assignment %} -
    - - - - - - {% endif %} + + + + {% with ballotnumber=polls.count %} + - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - - {% for candidate, poll_list in vote_results.items %} - - + + + {% for poll in polls %} + + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} - {{ candidate }} - - {% for vote in poll_list %} - + {% for candidate, poll_list in vote_results.items %} + + - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - {% endfor %} - - - {% for poll in polls %} - {% if poll.published or perms.assignment.can_manage_assignment %} + {% for vote in poll_list %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} + {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - - - - {% for poll in polls %} - {% if poll.published or perms.assignment.can_manage_assignment %} - + + + {% for poll in polls %} + {% if poll.published or perms.assignment.can_manage_assignment %} + + {% endif %} + {% endfor %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} + {% endif %} - {% endfor %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} - - {% endif %} - -
    + {% trans "ballot" %} - - - {% trans 'New ballot' %} - - -
    - {% if candidate in assignment.elected %} - {% if perms.assignment.can_manage_assignment %} - - {% else %} - - + {% endwith %} +
    {% trans "Candidates" %} + {{ poll.get_ballot }}. {% trans 'ballot' %} + {% if perms.assignment.can_manage_assignment %} +
    + + {% if poll.published %} + + {% else %} + + {% endif %} + + + + {% endif %} +
    + + {% trans 'New ballot' %} - {% endif %} - {% else %} - {% if perms.assignment.can_manage_assignment %} - - {% endif %} + - {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} - {{ vote.Yes }}
    - {{ vote.No }}
    - {{ vote.Abstain }}
    - {% elif 'Votes' in vote %} - {{ vote.Votes }} - {% elif vote == None %} - {% trans 'was not a
    candidate'%} +
    + {% if candidate in assignment.elected %} + {% if perms.assignment.can_manage_assignment %} + + {% else %} + + + + {% endif %} {% else %} -   + {% if perms.assignment.can_manage_assignment %} + + {% endif %} {% endif %} + {{ candidate }}
    {% trans 'Invalid votes' %} - {% if poll.has_votes %} - - {{ poll.print_votesinvalid }} + {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} + {{ vote.Yes }}
    + {{ vote.No }}
    + {{ vote.Abstain }}
    + {% elif 'Votes' in vote %} + {{ vote.Votes }} + {% elif vote == None %} + {% trans 'was not a
    candidate'%} + {% else %} +   {% endif %}
    {% trans 'Votes cast' %} - {% if poll.has_votes %} - - {{ poll.print_votescast }} - {% endif %} -
    {% trans 'Invalid votes' %} + {% if poll.has_votes %} + + {{ poll.print_votesinvalid }} + {% endif %} +
    +
    {% trans 'Votes cast' %} + {% if poll.has_votes %} + + {{ poll.print_votescast }} + {% endif %} +
    {% else %} - {% trans "No results available." %} - {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} -

    - - {% trans 'New ballot' %} - -

    - {% endif %} + {% trans "No ballots available." %} + {% if assignment.candidates and perms.assignment.can_manage_assignment and assignment.status == "vot" %} +

    + + {% trans 'New ballot' %} + +

    + {% endif %} {% endif %} {% endif %} -
    +
    + +
    +
    + +
    {% trans "Status" %}:
    + {% trans assignment.get_status_display %} + +
    {% trans "Number of available posts" %}:
    + {{ assignment.posts }} +
    + + {% if perms.assignment.can_manage_assignment %} +
    +

    {% trans "Change status" %}:

    + + + +
    + {% endif %} +
    +
    {% endblock %} diff --git a/openslides/assignment/templates/assignment/widget.html b/openslides/assignment/templates/assignment/widget.html index 985db4e20..d7a885b1d 100644 --- a/openslides/assignment/templates/assignment/widget.html +++ b/openslides/assignment/templates/assignment/widget.html @@ -1,21 +1,17 @@ -{% load staticfiles %} {% load i18n %} {% load tags %}
      {% for assignment in assignments %}
    • - -
      +
      + +   + + - - - - - - - - + + {{ assignment }}
    • diff --git a/openslides/assignment/templates/projector/Assignment.html b/openslides/assignment/templates/projector/Assignment.html index 35c10f64b..761e70bf1 100644 --- a/openslides/assignment/templates/projector/Assignment.html +++ b/openslides/assignment/templates/projector/Assignment.html @@ -66,7 +66,7 @@ {% if candidate in assignment.elected %} - + {% endif %} {{ candidate }} @@ -75,11 +75,11 @@ {% if not assignment_publish_winner_results_only or candidate in assignment.elected %} {% if 'Yes' in vote and 'No' in vote and 'Abstain' in vote %} - {{ vote.Yes }}
      - {{ vote.No }}
      - {{ vote.Abstain }}
      + {{ vote.Yes }}
      + {{ vote.No }}
      + {{ vote.Abstain }}
      {% elif 'Votes' in vote %} - {{ vote.Votes }} + {{ vote.Votes }} {% elif vote == None %} {% trans 'was not a
      candidate'%} {% else %} @@ -97,7 +97,7 @@ {% for poll in polls %} {% if poll.has_votes %} - + {{ poll.print_votesinvalid }} {% endif %} @@ -112,7 +112,7 @@ {% if poll.has_votes %} - + {{ poll.print_votescast }} {% endif %} diff --git a/openslides/assignment/urls.py b/openslides/assignment/urls.py index 5540b8a06..42e55b638 100644 --- a/openslides/assignment/urls.py +++ b/openslides/assignment/urls.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns from openslides.assignment.views import (ViewPoll, AssignmentPDF, AssignmentPollPDF, AssignmentPollDelete, CreateAgendaItem) diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index f5e244732..c60f0f8d7 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -145,8 +145,9 @@ def edit(request, assignment_id=None): def delete(request, assignment_id): assignment = Assignment.objects.get(pk=assignment_id) if request.method == 'POST': - assignment.delete() - messages.success(request, _('Election %s was successfully deleted.') % assignment) + if 'submit' in request.POST: + assignment.delete() + messages.success(request, _('Election %s was successfully deleted.') % assignment) else: del_confirm_form(request, assignment) return redirect(reverse('assignment_overview')) @@ -204,16 +205,17 @@ def delother(request, assignment_id, user_id): is_blocked = assignment.is_blocked(person) if request.method == 'POST': - try: - assignment.delrun(person, blocked=False) - except Exception, e: - messages.error(request, e) - else: - if not is_blocked: - message = _("Candidate %s was withdrawn successfully.") % person + if 'submit' in request.POST: + try: + assignment.delrun(person, blocked=False) + except Exception, e: + messages.error(request, e) else: - message = _("%s was unblocked successfully.") % person - messages.success(request, message) + if not is_blocked: + message = _("Candidate %s was withdrawn successfully.") % person + else: + message = _("%s was unblocked successfully.") % person + messages.success(request, message) else: if not is_blocked: message = _("Do you really want to withdraw %s from the election?") % person @@ -318,7 +320,7 @@ class AssignmentPollDelete(DeleteView): return reverse('assignment_view', args=[self.assignment.id]) def get_success_message(self): - return _('Ballot was successfully deleted.') % self.object + return _('Ballot was successfully deleted.') % self.object class AssignmentPDF(PDFView): @@ -533,7 +535,7 @@ class AssignmentPollPDF(PDFView): pdf_document.build(story) def append_to_pdf(self, story): - imgpath = os.path.join(settings.SITE_ROOT, 'static/images/circle.png') + imgpath = os.path.join(settings.SITE_ROOT, 'static/img/circle.png') circle = "  " % imgpath cell = [] cell.append(Spacer(0, 0.8 * cm)) @@ -635,6 +637,7 @@ class Config(FormView): permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'assignment/config.html' + success_url_name = 'config_assignment' def get_initial(self): return { @@ -673,6 +676,7 @@ def register_tab(request): selected = request.path.startswith('/assignment/') return Tab( title=_('Elections'), + app='assignment', url=reverse('assignment_overview'), permission=( request.user.has_perm('assignment.can_see_assignment') or @@ -684,10 +688,9 @@ def register_tab(request): def get_widgets(request): - return [ - Widget( - name='assignments', - display_name=_('Elections'), - template='assignment/widget.html', - context={'assignments': Assignment.objects.all()}, - permission_required='projector.can_manage_projector')] + return [Widget( + name='assignments', + display_name=_('Elections'), + template='assignment/widget.html', + context={'assignments': Assignment.objects.all()}, + permission_required='projector.can_manage_projector')] diff --git a/openslides/config/templates/config/base_config.html b/openslides/config/templates/config/base_config.html index 78880323e..a1f99418e 100644 --- a/openslides/config/templates/config/base_config.html +++ b/openslides/config/templates/config/base_config.html @@ -1,13 +1,15 @@ {% extends "base.html" %} -{% load tags %} {% load i18n %} -{% block submenu %} -

      {% trans "Configuration" %}

      - +{% block config_submenu %} + +
      +
      + {% for menu_link in menu_links %} + {{ menu_link.1 }} + {% endfor %} +
      +
      +
      {% endblock %} diff --git a/openslides/config/templates/config/general.html b/openslides/config/templates/config/general.html index cf8ad7f41..f5ef585d8 100644 --- a/openslides/config/templates/config/general.html +++ b/openslides/config/templates/config/general.html @@ -5,19 +5,26 @@ {% block title %}{{ block.super }} – {% trans "General settings" %}{% endblock %} {% block content %} -

      {% trans "General settings" %}

      +

      + {% trans "Configuration" %} + {% trans "General" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

      {% csrf_token %}
      {% trans "Event" %} {% for field in form %} {% if "id_event" in field.label_tag %} -

      - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

      +
      + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
      {% endif %} {% endfor %}
      @@ -26,13 +33,16 @@ {% trans "Welcome Widget" %} {% for field in form %} {% if "id_welcome" in field.label_tag %} -

      - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

      +
      + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
      {% endif %} {% endfor %} @@ -41,25 +51,25 @@ {% trans "System" %} {% for field in form %} {% if "id_system" in field.label_tag %} -

      - {{ field.errors }} - {{ field.required }} - {{ field.label_tag }} - {{ field }} - {{ field.help_text }} -

      +
      + + {{ field }} + {% if field.errors %} + {{ field.errors }} + {% endif %} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} +
      {% endif %} {% endfor %}

      - - - + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %}

      + * {% trans "required" %}
      {% endblock %} diff --git a/openslides/config/templates/config/version.html b/openslides/config/templates/config/version.html index 0df6c49f3..a846675ad 100644 --- a/openslides/config/templates/config/version.html +++ b/openslides/config/templates/config/version.html @@ -5,7 +5,9 @@ {% block title %}{{ block.super }} – {% trans "Version" %}{% endblock %} {% block content %} -

      {% trans "Version" %}

      +

      {% trans "Version" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

      {% for version in versions %}

      {{ version.0 }} {% trans "Version" %}: {{ version.1 }}

      diff --git a/openslides/config/urls.py b/openslides/config/urls.py index 14659f5a8..84c1e93e9 100644 --- a/openslides/config/urls.py +++ b/openslides/config/urls.py @@ -11,7 +11,7 @@ """ from django.conf import settings -from django.conf.urls.defaults import patterns, url +from django.conf.urls import patterns, url from django.utils.importlib import import_module from openslides.config.views import GeneralConfig, VersionConfig diff --git a/openslides/config/views.py b/openslides/config/views.py index 448b3d758..997527384 100644 --- a/openslides/config/views.py +++ b/openslides/config/views.py @@ -33,6 +33,7 @@ class GeneralConfig(FormView): permission_required = 'config.can_manage_config' form_class = GeneralConfigForm template_name = 'config/general.html' + success_url_name = 'config_general' def get_initial(self): return { @@ -108,6 +109,7 @@ def register_tab(request): selected = request.path.startswith('/config/') return Tab( title=_('Configuration'), + app='config', url=reverse('config_general'), permission=request.user.has_perm('config.can_manage_config'), selected=selected, diff --git a/openslides/global_settings.py b/openslides/global_settings.py index 94f900059..a02ef47e2 100644 --- a/openslides/global_settings.py +++ b/openslides/global_settings.py @@ -26,9 +26,12 @@ LOGIN_REDIRECT_URL = '/' SESSION_COOKIE_NAME = 'OpenSlidesSessionID' - ugettext = lambda s: s +MOTION_WORKFLOW = ( + ('default', ugettext('default'), 'openslides.motion.workflow.default_workflow'), +) + LANGUAGES = ( ('de', ugettext('German')), ('en', ugettext('English')), diff --git a/openslides/locale/de/LC_MESSAGES/django.mo b/openslides/locale/de/LC_MESSAGES/django.mo index c0bba8a10..37edec9d4 100644 Binary files a/openslides/locale/de/LC_MESSAGES/django.mo and b/openslides/locale/de/LC_MESSAGES/django.mo differ diff --git a/openslides/locale/de/LC_MESSAGES/django.po b/openslides/locale/de/LC_MESSAGES/django.po index 19a408410..7519c4249 100644 --- a/openslides/locale/de/LC_MESSAGES/django.po +++ b/openslides/locale/de/LC_MESSAGES/django.po @@ -1,5 +1,5 @@ # German translations for OpenSlides package. -# Copyright (C) 2011, 2012 by OpenSlides team, see AUTHORS. +# Copyright (C) 2011-2013 by OpenSlides team, see AUTHORS. # This file is distributed under the same license as the OpenSlides package. # Oskar Hahn , 2012. # @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides 1.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-05 14:24+0100\n" +"POT-Creation-Date: 2013-02-11 22:34+0100\n" "PO-Revision-Date: 2012-07-28 11:07+0200\n" "Last-Translator: Emanuel Schuetze \n" "Language-Team: support@openslides.de\n" @@ -17,15 +17,19 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: global_settings.py:33 +#: global_settings.py:32 +msgid "default" +msgstr "" + +#: global_settings.py:36 msgid "German" msgstr "Deutsch" -#: global_settings.py:34 +#: global_settings.py:37 msgid "English" msgstr "Englisch" -#: global_settings.py:35 +#: global_settings.py:38 msgid "French" msgstr "Französisch" @@ -33,15 +37,15 @@ msgstr "Französisch" msgid "Parent item" msgstr "Elternelement" -#: agenda/forms.py:34 +#: agenda/forms.py:33 msgid "Invalid format. Hours from 0 to 99 and minutes from 00 to 59" -msgstr "" +msgstr "Ungültiges Format. Stunden von 0 bis 99 und Minuten von 00 bis 59" -#: agenda/forms.py:37 agenda/models.py:52 +#: agenda/forms.py:36 agenda/models.py:52 msgid "Duration (hh:mm)" msgstr "Dauer (hh:mm)" -#: agenda/forms.py:71 +#: agenda/forms.py:70 msgid "Begin of event" msgstr "Beginn der Veranstaltung" @@ -53,21 +57,20 @@ msgstr "Tagesordnungseintrag" msgid "Organizational item" msgstr "Organisatorischer Eintrag" -#: agenda/models.py:42 config/forms.py:59 motion/forms.py:22 -#: motion/models.py:539 motion/templates/motion/view.html:246 -#: projector/models.py:29 +#: agenda/models.py:42 config/forms.py:59 motion/forms.py:31 +#: motion/models.py:466 projector/models.py:29 msgid "Title" msgstr "Titel" -#: agenda/models.py:43 motion/forms.py:23 motion/models.py:540 -#: motion/templates/motion/view.html:247 projector/models.py:30 +#: agenda/models.py:43 motion/forms.py:34 motion/models.py:469 +#: projector/models.py:30 msgid "Text" msgstr "Text" -#: agenda/models.py:44 agenda/templates/agenda/overview.html:79 -#: agenda/templates/agenda/view.html:13 participant/models.py:60 -#: participant/templates/participant/overview.html:72 -#: participant/templates/participant/user_detail.html:45 +#: agenda/models.py:44 agenda/templates/agenda/overview.html:90 +#: agenda/templates/agenda/view.html:37 participant/models.py:60 +#: participant/templates/participant/overview.html:106 +#: participant/templates/participant/user_detail.html:49 msgid "Comment" msgstr "Kommentar" @@ -75,15 +78,15 @@ msgstr "Kommentar" msgid "Closed" msgstr "Abgeschlossen" -#: agenda/models.py:46 agenda/templates/agenda/overview.html:88 +#: agenda/models.py:46 agenda/templates/agenda/overview.html:99 #: projector/models.py:31 msgid "Weight" msgstr "Gewichtung" -#: agenda/models.py:50 participant/views.py:247 -#: participant/templates/participant/overview.html:37 +#: agenda/models.py:50 participant/views.py:245 #: participant/templates/participant/overview.html:69 -#: participant/templates/participant/user_detail.html:29 +#: participant/templates/participant/overview.html:103 +#: participant/templates/participant/user_detail.html:33 msgid "Type" msgstr "Typ" @@ -99,12 +102,12 @@ msgstr "Darf die Tagesordung verwalten" msgid "Can see orga items and time scheduling of agenda" msgstr "Darf Organisationspunkte und Tagesordnung-Zeitplan sehen" -#: agenda/models.py:195 agenda/slides.py:20 agenda/views.py:227 -#: agenda/views.py:228 agenda/views.py:265 agenda/views.py:279 -#: agenda/templates/agenda/base_agenda.html:10 +#: agenda/models.py:195 agenda/slides.py:20 agenda/views.py:210 +#: agenda/views.py:211 agenda/views.py:248 agenda/views.py:262 +#: agenda/templates/agenda/config.html:68 #: agenda/templates/agenda/overview.html:8 -#: agenda/templates/agenda/overview.html:52 -#: agenda/templates/agenda/overview.html:94 +#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:105 #: agenda/templates/projector/AgendaSummary.html:6 #: agenda/templates/projector/AgendaSummary.html:10 msgid "Agenda" @@ -118,66 +121,24 @@ msgstr "Sie sind nicht berechtigt die Tagesordnung zu ändern." msgid "Errors when reordering of the agenda" msgstr "Fehler beim Neusortieren der Tagesordnung" -#: agenda/views.py:167 -#, python-format -msgid "Item %s was successfully modified." -msgstr "Eintrag %s wurde erfolgreich bearbeitet." - #: agenda/views.py:188 -#, python-format -msgid "Item %s was successfully created." -msgstr "Eintrag %s wurde erfolgreich angelegt." - -#: agenda/views.py:205 msgid "Yes, with all child items." msgstr "Ja, mit allen Kindelementen." -#: agenda/views.py:213 +#: agenda/views.py:196 #, python-format msgid "Item %s and his children were successfully deleted." msgstr "Eintrag %s und seine Kindelemente wurde erfolgreich gelöscht." -#: agenda/views.py:218 +#: agenda/views.py:201 #, python-format msgid "Item %s was successfully deleted." msgstr "Eintrag %s wurde erfolgreich gelöscht." -#: agenda/views.py:256 +#: agenda/views.py:239 msgid "Agenda settings successfully saved." msgstr "Tagesordnung Einstellungen erfolgreich gespeichert." -#: agenda/templates/agenda/base_agenda.html:12 -msgid "All items" -msgstr "Alle Einträge" - -#: agenda/templates/agenda/base_agenda.html:14 -#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:18 -msgid "New item" -msgstr "Neuer Eintrag" - -#: agenda/templates/agenda/base_agenda.html:16 -msgid "Agenda as PDF" -msgstr "Tagesordnung als PDF" - -#: agenda/templates/agenda/base_agenda.html:26 -msgid "View item" -msgstr "Eintrag anzeigen" - -#: agenda/templates/agenda/base_agenda.html:31 -#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:16 -#: agenda/templates/agenda/item_row.html:47 -msgid "Edit item" -msgstr "Eintrag bearbeiten" - -#: agenda/templates/agenda/base_agenda.html:33 -#: agenda/templates/agenda/item_row.html:48 -msgid "Delete item" -msgstr "Eintrag löschen" - -#: agenda/templates/agenda/base_agenda.html:38 -msgid "Show item" -msgstr "Eintrag projizieren" - #: agenda/templates/agenda/config.html:20 msgid "January" msgstr "Januar" @@ -335,7 +296,6 @@ msgid "Sa" msgstr "Sa" #: agenda/templates/agenda/config.html:52 -#: motion/templates/motion/view.html:245 msgid "Time" msgstr "Zeit" @@ -356,199 +316,228 @@ msgid "close" msgstr "Schließen" #: agenda/templates/agenda/config.html:63 -#: agenda/templates/agenda/config.html:68 msgid "Agenda settings" msgstr "Tagesordnungs-Einstellungen" -#: agenda/templates/agenda/config.html:74 agenda/templates/agenda/edit.html:24 -#: assignment/templates/assignment/config.html:13 -#: assignment/templates/assignment/edit.html:26 -#: assignment/templates/assignment/poll_view.html:66 -#: config/templates/config/general.html:56 -#: motion/templates/motion/config.html:13 motion/templates/motion/edit.html:26 -#: motion/templates/motion/poll_view.html:52 -#: participant/templates/participant/config.html:13 -#: participant/templates/participant/edit.html:31 -#: participant/templates/participant/group_edit.html:25 -#: participant/templates/participant/password_change.html:22 -#: participant/templates/participant/settings.html:22 -#: projector/templates/projector/new.html:13 -#: projector/templates/projector/select_widgets.html:22 +#: agenda/templates/agenda/config.html:68 +#: assignment/templates/assignment/config.html:9 config/views.py:111 +#: config/templates/config/general.html:9 +#: motion/templates/motion/config.html:9 +#: participant/templates/participant/config.html:9 +msgid "Configuration" +msgstr "Konfiguration" + +#: agenda/templates/agenda/config.html:75 +#: assignment/templates/assignment/poll_view.html:80 +#: motion/templates/motion/motion_form.html:14 +#: motion/templates/motion/poll_form.html:38 +#: projector/templates/projector/select_widgets.html:28 +#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 msgid "Save" msgstr "Speichern" -#: agenda/templates/agenda/config.html:78 agenda/templates/agenda/edit.html:31 -#: assignment/templates/assignment/config.html:17 -#: assignment/templates/assignment/edit.html:33 -#: assignment/templates/assignment/poll_view.html:73 -#: config/templates/config/general.html:60 -#: motion/templates/motion/config.html:17 motion/templates/motion/edit.html:33 -#: motion/templates/motion/import.html:30 -#: motion/templates/motion/poll_view.html:59 -#: participant/templates/participant/config.html:17 -#: participant/templates/participant/edit.html:38 -#: participant/templates/participant/group_edit.html:32 -#: participant/templates/participant/import.html:28 -#: participant/templates/participant/password_change.html:26 -#: participant/templates/participant/settings.html:26 -#: projector/templates/projector/new.html:20 +#: agenda/templates/agenda/config.html:79 agenda/templates/agenda/edit.html:30 +#: assignment/templates/assignment/config.html:18 +#: assignment/templates/assignment/edit.html:31 +#: assignment/templates/assignment/poll_view.html:86 +#: config/templates/config/general.html:70 +#: motion/templates/motion/config.html:18 +#: motion/templates/motion/motion_form.html:21 +#: motion/templates/motion/poll_form.html:44 +#: participant/templates/participant/config.html:18 +#: participant/templates/participant/edit.html:36 +#: participant/templates/participant/group_edit.html:31 +#: participant/templates/participant/import.html:33 msgid "Cancel" msgstr "Abbrechen" -#: agenda/templates/agenda/edit.html:27 -#: assignment/templates/assignment/edit.html:29 -#: assignment/templates/assignment/poll_view.html:69 -#: assignment/templates/assignment/view.html:92 -#: motion/templates/motion/edit.html:29 -#: motion/templates/motion/poll_view.html:55 -#: participant/templates/participant/edit.html:34 -#: participant/templates/participant/group_edit.html:28 -#: projector/templates/projector/control_overlay_message.html:8 -#: projector/templates/projector/new.html:16 -msgid "Apply" -msgstr "Übernehmen" +#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:17 +#: agenda/templates/agenda/view.html:20 +msgid "Edit item" +msgstr "Eintrag bearbeiten" -#: agenda/templates/agenda/edit.html:35 -#: assignment/templates/assignment/edit.html:37 -#: motion/templates/motion/edit.html:37 motion/templates/motion/import.html:34 -#: participant/templates/participant/edit.html:42 -#: participant/templates/participant/group_edit.html:36 -#: participant/templates/participant/import.html:32 +#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:19 +#: agenda/templates/agenda/overview.html:72 +msgid "New item" +msgstr "Neuer Eintrag" + +#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:12 +#: assignment/templates/assignment/edit.html:22 +#: assignment/templates/assignment/view.html:20 +#: participant/templates/participant/edit.html:22 +#: participant/templates/participant/group_detail.html:12 +#: participant/templates/participant/group_edit.html:22 +#: participant/templates/participant/import.html:11 +#: participant/templates/participant/user_detail.html:12 +#: projector/templates/projector/new.html:11 +#: projector/templates/projector/select_widgets.html:10 +msgid "Back to overview" +msgstr "Zurück zur Übersicht" + +#: agenda/templates/agenda/edit.html:33 +#: assignment/templates/assignment/config.html:21 +#: assignment/templates/assignment/edit.html:34 +#: config/templates/config/general.html:73 +#: motion/templates/motion/config.html:21 +#: motion/templates/motion/motion_form.html:24 +#: participant/templates/participant/config.html:21 +#: participant/templates/participant/edit.html:39 +#: participant/templates/participant/group_edit.html:34 +#: participant/templates/participant/import.html:36 +#: projector/templates/projector/new.html:19 msgid "required" msgstr "erforderlich" -#: agenda/templates/agenda/item_row.html:8 -msgid "Mark item as done" -msgstr "Eintrag als erledigt markieren" - -#: agenda/templates/agenda/item_row.html:12 -msgid "Item closed" -msgstr "Eintrag erledigt" +#: agenda/templates/agenda/item_row.html:7 +msgid "Change status (open/closed)" +msgstr "Status ändern (offen/abgeschlossen)" #: agenda/templates/agenda/item_row.html:32 msgid "End" msgstr "Ende" #: agenda/templates/agenda/item_row.html:42 -#: agenda/templates/agenda/overview.html:106 -msgid "Activate item" -msgstr "Eintrag projizieren" +#: agenda/templates/agenda/overview.html:117 +#: agenda/templates/agenda/view.html:26 agenda/templates/agenda/widget.html:6 +#: agenda/templates/agenda/widget.html:19 +#: assignment/templates/assignment/overview.html:54 +#: assignment/templates/assignment/widget.html:7 +#: motion/templates/motion/widget.html:7 +#: participant/templates/participant/group_overview.html:29 +#: participant/templates/participant/group_widget.html:8 +#: participant/templates/participant/overview.html:128 +#: participant/templates/participant/user_widget.html:7 +#: projector/templates/projector/custom_slide_widget.html:6 +#: projector/templates/projector/custom_slide_widget.html:19 +msgid "Show" +msgstr "Anzeigen" -#: agenda/templates/agenda/item_row.html:51 -#: agenda/templates/agenda/widget.html:35 -msgid "Activate summary for this item" -msgstr "Zusammenfassung für diesen Eintrag projizieren" +#: agenda/templates/agenda/item_row.html:47 +#: agenda/templates/agenda/widget.html:22 +#: assignment/templates/assignment/overview.html:59 +#: assignment/templates/assignment/view.html:172 +#: assignment/templates/assignment/widget.html:10 +#: motion/templates/motion/widget.html:10 +#: participant/templates/participant/group_overview.html:33 +#: participant/templates/participant/group_widget.html:11 +#: participant/templates/participant/overview.html:132 +#: participant/templates/participant/user_widget.html:10 +#: projector/templates/projector/custom_slide_widget.html:26 +msgid "Edit" +msgstr "Bearbeiten" -#: agenda/templates/agenda/overview.html:45 +#: agenda/templates/agenda/item_row.html:50 +#: assignment/templates/assignment/overview.html:62 +#: assignment/templates/assignment/view.html:173 +#: participant/templates/participant/group_overview.html:37 +#: participant/templates/participant/overview.html:136 +#: projector/templates/projector/custom_slide_widget.html:23 +msgid "Delete" +msgstr "Löschen" + +#: agenda/templates/agenda/item_row.html:54 +#: agenda/templates/agenda/widget.html:29 +msgid "Show summary for this item" +msgstr "Zusammenfassung für diesen Eintrag anzeigen" + +#: agenda/templates/agenda/overview.html:47 msgid "Do you want to save the changed order of agenda items?" msgstr "Möchten Sie die geänderte Reihenfolge der Einträge speichern?" -#: agenda/templates/agenda/overview.html:46 assignment/models.py:291 -#: assignment/views.py:587 assignment/templates/assignment/view.html:168 -#: assignment/templates/assignment/view.html:172 +#: agenda/templates/agenda/overview.html:49 assignment/models.py:291 +#: assignment/views.py:589 assignment/templates/assignment/view.html:206 +#: assignment/templates/assignment/view.html:210 #: assignment/templates/projector/Assignment.html:78 -#: assignment/templates/projector/Assignment.html:82 motion/models.py:574 -#: motion/views.py:824 motion/views.py:875 -#: motion/templates/motion/view.html:79 +#: assignment/templates/projector/Assignment.html:82 motion/models.py:617 +#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:66 #: motion/templates/projector/Motion.html:37 utils/utils.py:45 -#: utils/views.py:104 +#: utils/views.py:146 msgid "Yes" msgstr "Ja" -#: agenda/templates/agenda/overview.html:47 assignment/models.py:291 -#: assignment/views.py:588 assignment/templates/assignment/view.html:169 -#: assignment/templates/projector/Assignment.html:79 motion/models.py:574 -#: motion/views.py:824 motion/views.py:876 -#: motion/templates/motion/view.html:80 +#: agenda/templates/agenda/overview.html:50 assignment/models.py:291 +#: assignment/views.py:590 assignment/templates/assignment/view.html:207 +#: assignment/templates/projector/Assignment.html:79 motion/models.py:617 +#: motion/pdf.py:134 motion/templates/motion/motion_detail.html:67 #: motion/templates/projector/Motion.html:38 utils/utils.py:45 -#: utils/views.py:104 +#: utils/views.py:146 msgid "No" msgstr "Nein" -#: agenda/templates/agenda/overview.html:57 +#: agenda/templates/agenda/overview.html:60 msgid "Start of event" msgstr "Beginn der Veranstaltung" -#: agenda/templates/agenda/overview.html:61 +#: agenda/templates/agenda/overview.html:64 msgid "Estimated end" msgstr "Voraussichtliches Ende" -#: agenda/templates/agenda/overview.html:69 +#: agenda/templates/agenda/overview.html:72 #: assignment/templates/assignment/overview.html:12 -#: motion/templates/motion/overview.html:12 -#: participant/templates/participant/overview.html:22 -msgid "Filter" -msgstr "Filter" +#: participant/templates/participant/group_overview.html:11 +#: participant/templates/participant/overview.html:20 +#: projector/templates/projector/custom_slide_widget.html:39 +msgid "New" +msgstr "Neu" -#: agenda/templates/agenda/overview.html:70 +#: agenda/templates/agenda/overview.html:74 +msgid "Print agenda as PDF" +msgstr "Tagesordnung als PDF drucken" + +#: agenda/templates/agenda/overview.html:79 msgid "Hide closed items" msgstr "Verstecke abgeschlossene Einträge" -#: agenda/templates/agenda/overview.html:73 +#: agenda/templates/agenda/overview.html:83 msgid "item" msgid_plural "items" msgstr[0] "Eintrag" msgstr[1] "Einträge" -#: agenda/templates/agenda/overview.html:76 -msgid "Done" -msgstr "Erledigt" - -#: agenda/templates/agenda/overview.html:77 +#: agenda/templates/agenda/overview.html:88 msgid "Item" msgstr "Eintrag" -#: agenda/templates/agenda/overview.html:82 +#: agenda/templates/agenda/overview.html:93 +#, fuzzy msgid "Duration" -msgstr "Dauer" +msgstr "Dauer (hh:mm)" -#: agenda/templates/agenda/overview.html:85 -#: assignment/templates/assignment/overview.html:28 -#: motion/templates/motion/overview.html:43 -#: participant/templates/participant/group_overview.html:14 -#: participant/templates/participant/overview.html:74 +#: agenda/templates/agenda/overview.html:96 +#: assignment/templates/assignment/overview.html:38 +#: participant/templates/participant/group_overview.html:19 +#: participant/templates/participant/overview.html:108 msgid "Actions" msgstr "Aktionen" -#: agenda/templates/agenda/overview.html:122 -#: agenda/templates/agenda/widget.html:46 -#: projector/templates/projector/custom_slide_widget.html:36 +#: agenda/templates/agenda/overview.html:133 +#: agenda/templates/agenda/widget.html:40 +#: projector/templates/projector/custom_slide_widget.html:34 msgid "No items available." msgstr "Keine Einträge vorhanden." -#: agenda/templates/agenda/widget.html:10 -#: agenda/templates/agenda/widget.html:29 -#: assignment/templates/assignment/widget.html:17 -#: motion/templates/motion/widget.html:17 -#: participant/templates/participant/group_widget.html:17 -#: participant/templates/participant/user_widget.html:16 -#: projector/templates/projector/custom_slide_widget.html:11 -#: projector/templates/projector/custom_slide_widget.html:30 +#: agenda/templates/agenda/view.html:15 +#: assignment/templates/assignment/view.html:29 +msgid "More actions" +msgstr "Mehr Aktionen" + +#: agenda/templates/agenda/view.html:21 +msgid "Delete item" +msgstr "Eintrag löschen" + +#: agenda/templates/agenda/widget.html:9 +#: agenda/templates/agenda/widget.html:25 +#: assignment/templates/assignment/widget.html:13 +#: motion/templates/motion/widget.html:13 +#: participant/templates/participant/group_widget.html:14 +#: participant/templates/participant/user_widget.html:13 +#: projector/templates/projector/custom_slide_widget.html:9 +#: projector/templates/projector/custom_slide_widget.html:29 msgid "Preview" msgstr "Vorschau" -#: agenda/templates/agenda/widget.html:23 -#: assignment/templates/assignment/view.html:132 -#: assignment/templates/assignment/widget.html:11 -#: motion/templates/motion/widget.html:11 -#: participant/templates/participant/group_widget.html:11 -#: participant/templates/participant/user_widget.html:10 -#: projector/templates/projector/custom_slide_widget.html:24 -msgid "Delete" -msgstr "Löschen" - -#: agenda/templates/agenda/widget.html:26 -#: assignment/templates/assignment/view.html:131 -#: assignment/templates/assignment/widget.html:14 -#: motion/templates/motion/widget.html:14 -#: participant/templates/participant/group_widget.html:14 -#: participant/templates/participant/user_widget.html:13 -#: projector/templates/projector/custom_slide_widget.html:27 -msgid "Edit" -msgstr "Bearbeiten" - -#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:381 -#: assignment/templates/assignment/view.html:13 +#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:383 +#: assignment/templates/assignment/view.html:275 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" msgstr "Anzahl der zur Wahl stehenden Posten" @@ -562,23 +551,23 @@ msgid "Only publish voting results for selected winners (Projector view only)" msgstr "" "Wahlergebnisse der nicht gewählten Kandidaten auf dem Projektor verbergen" -#: assignment/forms.py:46 motion/forms.py:77 +#: assignment/forms.py:46 motion/forms.py:110 msgid "Number of ballot papers (selection)" msgstr "Anzahl der Stimmzettel (Vorauswahl)" -#: assignment/forms.py:48 motion/forms.py:79 +#: assignment/forms.py:48 motion/forms.py:112 msgid "Number of all delegates" msgstr "Anzahl aller Delegierten" -#: assignment/forms.py:49 motion/forms.py:80 +#: assignment/forms.py:49 motion/forms.py:113 msgid "Number of all participants" msgstr "Anzahl aller Teilnehmer/innen" -#: assignment/forms.py:50 motion/forms.py:81 +#: assignment/forms.py:50 motion/forms.py:114 msgid "Use the following custom number" msgstr "Verwende die folgende benutzerdefinierte Anzahl" -#: assignment/forms.py:55 motion/forms.py:88 +#: assignment/forms.py:55 motion/forms.py:121 msgid "Custom number of ballot papers" msgstr "Benutzerdefinierte Anzahl von Stimmzetteln" @@ -606,18 +595,18 @@ msgstr "Eine Stimme pro Kandidat/in." msgid "Always Yes-No-Abstain per candidate." msgstr "Ja, Nein, Enthaltung pro Kandidat/in." -#: assignment/models.py:44 assignment/templates/assignment/overview.html:15 -#: assignment/templates/assignment/view.html:23 +#: assignment/models.py:44 assignment/templates/assignment/overview.html:24 +#: assignment/templates/assignment/view.html:284 msgid "Searching for candidates" msgstr "Auf Kandidatensuche" -#: assignment/models.py:45 assignment/templates/assignment/overview.html:16 -#: assignment/templates/assignment/view.html:25 +#: assignment/models.py:45 assignment/templates/assignment/overview.html:25 +#: assignment/templates/assignment/view.html:288 msgid "Voting" msgstr "Im Wahlvorgang" -#: assignment/models.py:46 assignment/templates/assignment/overview.html:17 -#: assignment/templates/assignment/view.html:27 +#: assignment/models.py:46 assignment/templates/assignment/overview.html:26 +#: assignment/templates/assignment/view.html:292 msgid "Finished" msgstr "Abgeschlossen" @@ -625,7 +614,8 @@ msgstr "Abgeschlossen" msgid "Name" msgstr "Name" -#: assignment/models.py:50 participant/models.py:144 +#: assignment/models.py:50 assignment/templates/assignment/view.html:57 +#: participant/models.py:144 msgid "Description" msgstr "Beschreibung" @@ -633,7 +623,7 @@ msgstr "Beschreibung" msgid "Comment on the ballot paper" msgstr "Kommentar für den Stimmzettel" -#: assignment/models.py:64 motion/models.py:332 +#: assignment/models.py:64 #, python-format msgid "%s is not a valid status." msgstr "%s ist kein gültiger Status." @@ -648,7 +638,7 @@ msgstr "Der Wahlstatus ist bereits %s." msgid "%s is already a candidate." msgstr "%s ist bereits ein/e Kandidat/in." -#: assignment/models.py:82 assignment/views.py:195 +#: assignment/models.py:82 assignment/views.py:196 msgid "The candidate list is already closed." msgstr "Die Kandidatenliste ist bereits geschlossen." @@ -678,23 +668,22 @@ msgstr "Darf selbst für Wahlen kandidieren" msgid "Can manage assignment" msgstr "Darf Wahlen verwalten" -#: assignment/models.py:291 motion/models.py:574 +#: assignment/models.py:291 motion/models.py:617 msgid "Abstain" msgstr "Enthaltung" -#: assignment/models.py:293 motion/templates/motion/poll_view.html:22 +#: assignment/models.py:293 motion/templates/motion/poll_form.html:16 msgid "Votes" msgstr "Stimmen" -#: assignment/models.py:310 +#: assignment/models.py:310 motion/models.py:631 #, python-format msgid "Ballot %d" msgstr "Wahlgang %d" -#: assignment/models.py:319 assignment/views.py:336 assignment/views.py:675 -#: assignment/views.py:690 -#: assignment/templates/assignment/base_assignment.html:14 -#: assignment/templates/assignment/overview.html:6 +#: assignment/models.py:319 assignment/views.py:338 assignment/views.py:678 +#: assignment/views.py:693 assignment/templates/assignment/config.html:10 +#: assignment/templates/assignment/overview.html:5 #: assignment/templates/assignment/overview.html:9 msgid "Elections" msgstr "Wahlen" @@ -712,27 +701,26 @@ msgstr "Neue Wahl wurde erfolgreich angelegt." msgid "Election was successfully modified." msgstr "Wahl wurde erfolgreich geändert." -#: assignment/views.py:130 motion/views.py:239 motion/views.py:683 -#: participant/views.py:504 participant/views.py:528 utils/views.py:218 -#: utils/views.py:236 utils/views.py:260 +#: assignment/views.py:130 participant/views.py:501 participant/views.py:525 +#: utils/views.py:259 utils/views.py:281 utils/views.py:291 msgid "Please check the form for errors." msgstr "Bitte kontrollieren Sie das Formular nach Fehlern." -#: assignment/views.py:149 +#: assignment/views.py:150 #, python-format msgid "Election %s was successfully deleted." msgstr "Wahl %s wurde erfolgreich gelöscht." -#: assignment/views.py:162 +#: assignment/views.py:163 #, python-format msgid "Election status was set to: %s." msgstr "Wahlstatus wurde gesetzt auf: %s." -#: assignment/views.py:175 +#: assignment/views.py:176 msgid "You have set your candidature successfully." msgstr "Sie haben Ihre Kandidatur erfolgreich gesetzt." -#: assignment/views.py:192 +#: assignment/views.py:193 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -740,99 +728,98 @@ msgstr "" "Sie haben Ihre Kandidatur erfolgreich zurückgezogen. Sie können nun von " "anderen Teilnehmer/innen nicht mehr vorgeschlagen werden." -#: assignment/views.py:213 +#: assignment/views.py:215 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Die Kandidatur von %s wurde erfolgreich zurückgezogen." -#: assignment/views.py:215 +#: assignment/views.py:217 #, python-format msgid "%s was unblocked successfully." msgstr "%s wurde erfolgreich freigegeben." -#: assignment/views.py:219 +#: assignment/views.py:221 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Soll %s wirklich von der Wahl zurückgezogen werden?" -#: assignment/views.py:221 +#: assignment/views.py:223 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "Soll %s wirklich für die Wahl freigegeben werden?" -#: assignment/views.py:236 +#: assignment/views.py:238 msgid "New ballot was successfully created." msgstr "Neuer Wahlgang erfolgreich angelegt." -#: assignment/views.py:268 +#: assignment/views.py:270 #, python-format msgid "Ballot ID %d does not exist." msgstr "Wahlgang-ID %d existiert nicht." -#: assignment/views.py:275 +#: assignment/views.py:277 msgid "Ballot successfully published." msgstr "Wahlgang wurde erfolgreich veröffentlicht." -#: assignment/views.py:277 +#: assignment/views.py:279 msgid "Ballot successfully unpublished." msgstr "Wahlgang wurde erfolgreich unveröffentlicht." -#: assignment/views.py:290 +#: assignment/views.py:292 msgid "not elected" msgstr "nicht gewählt" -#: assignment/views.py:293 assignment/views.py:482 -#: assignment/templates/assignment/view.html:48 +#: assignment/views.py:295 assignment/views.py:484 +#: assignment/templates/assignment/view.html:77 msgid "elected" msgstr "gewählt" -#: assignment/views.py:321 +#: assignment/views.py:323 msgid "Ballot was successfully deleted." msgstr "Abstimmung wurde erfolgreich gelöscht." -#: assignment/views.py:333 +#: assignment/views.py:335 msgid "Assignment" msgstr "Wahl" -#: assignment/views.py:356 assignment/templates/assignment/overview.html:59 -#: assignment/templates/assignment/widget.html:23 +#: assignment/views.py:358 assignment/templates/assignment/overview.html:74 +#: assignment/templates/assignment/widget.html:19 msgid "No assignments available." msgstr "Keine Wahlen vorhanden." -#: assignment/views.py:375 +#: assignment/views.py:377 #, python-format msgid "Election: %s" msgstr "Wahlen: %s" -#: assignment/views.py:388 assignment/views.py:424 -#: assignment/templates/assignment/overview.html:26 -#: assignment/templates/assignment/poll_view.html:18 -#: assignment/templates/assignment/view.html:37 -#: assignment/templates/assignment/view.html:120 +#: assignment/views.py:390 assignment/views.py:426 +#: assignment/templates/assignment/overview.html:36 +#: assignment/templates/assignment/poll_view.html:34 +#: assignment/templates/assignment/view.html:66 +#: assignment/templates/assignment/view.html:157 #: assignment/templates/projector/Assignment.html:38 #: assignment/templates/projector/Assignment.html:56 msgid "Candidates" msgstr "Kandidaten/innen" -#: assignment/views.py:413 motion/views.py:817 -#: motion/templates/motion/view.html:44 +#: assignment/views.py:415 motion/pdf.py:120 +#: motion/templates/motion/motion_detail.html:46 msgid "Vote results" msgstr "Abstimmungsergebnis" -#: assignment/views.py:417 -#: assignment/templates/assignment/base_assignment.html:71 -#: assignment/templates/assignment/poll_view.html:5 -#: assignment/templates/assignment/poll_view.html:8 -#: assignment/templates/assignment/view.html:123 +#: assignment/views.py:419 assignment/templates/assignment/poll_view.html:5 +#: assignment/templates/assignment/poll_view.html:11 +#: assignment/templates/assignment/view.html:152 +#: assignment/templates/assignment/view.html:160 #: assignment/templates/projector/Assignment.html:59 msgid "ballot" msgstr "Wahlgang" -#: assignment/views.py:420 +#: assignment/views.py:422 msgid "ballots" msgstr "Wahlgänge" -#: assignment/views.py:445 +#: assignment/views.py:447 #, python-format msgid "" "Y: %(YES)s\n" @@ -843,246 +830,248 @@ msgstr "" "N: %(NO)s\n" "E: %(ABSTAIN)s" -#: assignment/views.py:456 assignment/templates/assignment/poll_view.html:35 -#: assignment/templates/assignment/view.html:186 +#: assignment/views.py:458 assignment/templates/assignment/poll_view.html:51 +#: assignment/templates/assignment/view.html:224 #: assignment/templates/projector/Assignment.html:96 -#: motion/templates/motion/poll_view.html:31 +#: motion/templates/motion/poll_form.html:25 msgid "Invalid votes" msgstr "Ungültige Stimmen" -#: assignment/views.py:463 assignment/templates/assignment/poll_view.html:45 -#: assignment/templates/assignment/view.html:202 -#: assignment/templates/assignment/view.html:207 +#: assignment/views.py:465 assignment/templates/assignment/poll_view.html:61 +#: assignment/templates/assignment/view.html:240 +#: assignment/templates/assignment/view.html:245 #: assignment/templates/projector/Assignment.html:109 -#: assignment/templates/projector/Assignment.html:115 motion/views.py:824 -#: motion/templates/motion/poll_view.html:35 -#: motion/templates/motion/view.html:84 +#: assignment/templates/projector/Assignment.html:115 motion/pdf.py:135 +#: motion/templates/motion/motion_detail.html:71 +#: motion/templates/motion/poll_form.html:29 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Abgegebene Stimmen" -#: assignment/views.py:523 assignment/views.py:541 -#: assignment/templates/assignment/overview.html:25 +#: assignment/views.py:525 assignment/views.py:543 +#: assignment/templates/assignment/overview.html:35 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 #: assignment/templates/projector/Assignment.html:27 msgid "Election" msgstr "Wahl" -#: assignment/views.py:548 +#: assignment/views.py:550 #, python-format msgid "%d. ballot" msgstr "%d. Wahlgang" -#: assignment/views.py:550 +#: assignment/views.py:552 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d Kandidat/in" msgstr[1] "%d Kandidaten/innen" -#: assignment/views.py:552 +#: assignment/views.py:554 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d verfügbare Posten" msgstr[1] "%d verfügbare Posten" -#: assignment/views.py:588 assignment/templates/assignment/view.html:170 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:824 -#: motion/views.py:877 motion/templates/motion/view.html:81 +#: assignment/views.py:590 assignment/templates/assignment/view.html:208 +#: assignment/templates/projector/Assignment.html:80 motion/pdf.py:134 +#: motion/templates/motion/motion_detail.html:68 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Enthaltung" -#: assignment/views.py:668 +#: assignment/views.py:671 msgid "Election settings successfully saved." msgstr "Wahl-Einstellungen wurden erfolgreich gespeichert." -#: assignment/templates/assignment/base_assignment.html:16 -msgid "All elections" -msgstr "Alle Wahlen" - -#: assignment/templates/assignment/base_assignment.html:18 -#: assignment/templates/assignment/edit.html:10 -#: assignment/templates/assignment/edit.html:19 -msgid "New election" -msgstr "Neue Wahl" - -#: assignment/templates/assignment/base_assignment.html:20 -msgid "All elections as PDF" -msgstr "Alle Wahlen als PDF" - -#: assignment/templates/assignment/base_assignment.html:31 -msgid "View election" -msgstr "Wahl anzeigen" - -#: assignment/templates/assignment/base_assignment.html:39 -#: assignment/templates/assignment/edit.html:8 -#: assignment/templates/assignment/edit.html:17 -#: assignment/templates/assignment/overview.html:50 -msgid "Edit election" -msgstr "Wahl bearbeiten" - -#: assignment/templates/assignment/base_assignment.html:44 -#: assignment/templates/assignment/overview.html:51 -msgid "Delete election" -msgstr "Wahl löschen" - -#: assignment/templates/assignment/base_assignment.html:50 -#: assignment/templates/assignment/overview.html:53 -msgid "Election as PDF" -msgstr "Wahl als PDF" - -#: assignment/templates/assignment/base_assignment.html:56 -msgid "Show election" -msgstr "Wahl projizieren" - -#: assignment/templates/assignment/base_assignment.html:63 -#: motion/templates/motion/base_motion.html:61 -msgid "New agenda item" -msgstr "Neuer Tagesordnungseintrag" - #: assignment/templates/assignment/config.html:5 -#: assignment/templates/assignment/config.html:8 msgid "Election settings" msgstr "Wahl-Einstellungen" -#: assignment/templates/assignment/overview.html:14 -#: assignment/templates/assignment/overview.html:27 -#: assignment/templates/assignment/view.html:11 -#: assignment/templates/projector/Assignment.html:18 motion/views.py:795 -#: motion/templates/motion/overview.html:20 -#: motion/templates/motion/overview.html:40 -#: motion/templates/motion/view.html:34 +#: assignment/templates/assignment/edit.html:8 +#: assignment/templates/assignment/edit.html:17 +#: assignment/templates/assignment/view.html:34 +msgid "Edit election" +msgstr "Wahl bearbeiten" + +#: assignment/templates/assignment/edit.html:10 +#: assignment/templates/assignment/edit.html:19 +#: assignment/templates/assignment/overview.html:12 +msgid "New election" +msgstr "Neue Wahl" + +#: assignment/templates/assignment/overview.html:15 +msgid "Print all elections as PDF" +msgstr "Alle Wahlen als PDF drucken" + +#: assignment/templates/assignment/overview.html:21 +#: participant/templates/participant/overview.html:53 +msgid "Filter" +msgstr "Filter" + +#: assignment/templates/assignment/overview.html:23 +#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/view.html:272 +#: assignment/templates/projector/Assignment.html:18 #: motion/templates/projector/Motion.html:11 -#: participant/templates/participant/overview.html:52 +#: participant/templates/participant/overview.html:84 msgid "Status" msgstr "Status" -#: assignment/templates/assignment/overview.html:22 +#: assignment/templates/assignment/overview.html:31 msgid "election" msgid_plural "elections" msgstr[0] "Wahl" msgstr[1] "Wahlen" -#: assignment/templates/assignment/overview.html:35 +#: assignment/templates/assignment/overview.html:44 #, python-format msgctxt "Number of searched candidates for an election" msgid "posts: %(posts)s" msgstr "Posten: %(posts)s" -#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/overview.html:46 #, python-format msgid "candidates: %(candidates)s" msgstr "Kandidaten/innen: %(candidates)s" -#: assignment/templates/assignment/overview.html:39 +#: assignment/templates/assignment/overview.html:48 #, python-format msgid "elected: %(elected)s" msgstr "Gewählt: %(elected)s" -#: assignment/templates/assignment/overview.html:45 -msgid "Activate election" -msgstr "Wahl projizieren" +#: assignment/templates/assignment/overview.html:66 +msgid "Print election as PDF" +msgstr "Wahle als PDF drucken" -#: assignment/templates/assignment/poll_view.html:10 +#: assignment/templates/assignment/poll_view.html:14 +msgid "Back to election" +msgstr "Zurück zur Wahl" + +#: assignment/templates/assignment/poll_view.html:17 +#: assignment/templates/assignment/view.html:23 +msgid "Show election" +msgstr "Wahl anzeigen" + +#: assignment/templates/assignment/poll_view.html:25 msgid "Short description (for ballot paper)" msgstr "Kurzbeschreibung (für Stimmzettel)" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 msgid "Special values" msgstr "Spezielle Werte" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:234 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 poll/models.py:234 msgid "majority" msgstr "Mehrheit" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:236 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_form.html:9 poll/models.py:236 #: poll/models.py:238 msgid "undocumented" msgstr "nicht erfasst" -#: assignment/templates/assignment/poll_view.html:59 -#: motion/templates/motion/poll_view.html:45 +#: assignment/templates/assignment/poll_view.html:74 msgid "Ballot paper as PDF" msgstr "Stimmzettel als PDF" -#: assignment/templates/assignment/view.html:21 -msgid "Change status" -msgstr "Status ändern" +#: assignment/templates/assignment/poll_view.html:83 +#: assignment/templates/assignment/view.html:112 +#: motion/templates/motion/motion_form.html:17 +#: motion/templates/motion/poll_form.html:41 +#: projector/templates/projector/control_overlay_message.html:7 +#: templates/formbuttons_saveapply.html:7 +msgid "Apply" +msgstr "Übernehmen" -#: assignment/templates/assignment/view.html:44 -#: assignment/templates/assignment/view.html:106 +#: assignment/templates/assignment/view.html:36 +msgid "Delete election" +msgstr "Wahl löschen" + +#: assignment/templates/assignment/view.html:40 +msgid "Ballot" +msgstr "Wahlgang" + +#: assignment/templates/assignment/view.html:46 +msgid "New agenda item" +msgstr "Neuer Tagesordnungseintrag" + +#: assignment/templates/assignment/view.html:73 +#: assignment/templates/assignment/view.html:132 msgid "Remove candidate" msgstr "Kandidate/in entfernen" -#: assignment/templates/assignment/view.html:51 +#: assignment/templates/assignment/view.html:80 msgid "Mark candidate as not elected" msgstr "Kandidat/in als nicht gewählt markieren" -#: assignment/templates/assignment/view.html:57 +#: assignment/templates/assignment/view.html:88 #: assignment/templates/projector/Assignment.html:44 msgid "No candidates available." msgstr "Keine Kandidaten/innen vorhanden." -#: assignment/templates/assignment/view.html:69 +#: assignment/templates/assignment/view.html:98 msgid "Withdraw self candidature" msgstr "Eigene Kandidatur zurückziehen" -#: assignment/templates/assignment/view.html:75 +#: assignment/templates/assignment/view.html:102 msgid "Self candidature" msgstr "Selbst kandidieren" -#: assignment/templates/assignment/view.html:86 +#: assignment/templates/assignment/view.html:114 msgid "Add new participant" msgstr "Neue/n Teilnehmer/in hinzufügen" -#: assignment/templates/assignment/view.html:102 +#: assignment/templates/assignment/view.html:127 msgid "Blocked Candidates" msgstr "Blockierte Kandidaten/innen" -#: assignment/templates/assignment/view.html:109 +#: assignment/templates/assignment/view.html:137 msgid "No blocked candidates available." msgstr "Keine blockierten Kandidaten/innen vorhanden." -#: assignment/templates/assignment/view.html:115 +#: assignment/templates/assignment/view.html:145 #: assignment/templates/projector/Assignment.html:52 msgid "Election results" msgstr "Wahlergebnisse" -#: assignment/templates/assignment/view.html:128 +#: assignment/templates/assignment/view.html:165 msgid "Publish/unpublish results" msgstr "Ergebnisse veröffentlichen/unveröffentlichen" -#: assignment/templates/assignment/view.html:140 -#: assignment/templates/assignment/view.html:223 +#: assignment/templates/assignment/view.html:180 +#: assignment/templates/assignment/view.html:261 msgid "New ballot" msgstr "Neuer Wahlgang" -#: assignment/templates/assignment/view.html:155 +#: assignment/templates/assignment/view.html:193 #: assignment/templates/projector/Assignment.html:69 msgid "Candidate is elected" msgstr "Kandidat/in ist gewählt" -#: assignment/templates/assignment/view.html:174 +#: assignment/templates/assignment/view.html:212 #: assignment/templates/projector/Assignment.html:84 msgid "was not a
      candidate" msgstr "war kein Kandidat" -#: assignment/templates/assignment/view.html:191 -#: assignment/templates/projector/Assignment.html:100 motion/views.py:824 -#: motion/templates/motion/view.html:82 +#: assignment/templates/assignment/view.html:229 +#: assignment/templates/projector/Assignment.html:100 motion/pdf.py:134 +#: motion/templates/motion/motion_detail.html:69 #: motion/templates/projector/Motion.html:40 msgid "Invalid" msgstr "Ungültig" -#: assignment/templates/assignment/view.html:219 -msgid "No results available." -msgstr "Keine Ergebnisse vorhanden." +#: assignment/templates/assignment/view.html:257 +msgid "No ballots available." +msgstr "Keine Wahlgänge vorhanden." + +#: assignment/templates/assignment/view.html:281 +msgid "Change status" +msgstr "Status ändern" #: config/forms.py:22 msgid "Event name" @@ -1128,818 +1117,352 @@ msgstr "Willkommen bei OpenSlides" msgid "[Place for your welcome text.]" msgstr "[Platz für Ihren Begrüßungstext.]" -#: config/models.py:102 +#: config/models.py:102 config/templates/config/general.html:10 msgid "General" msgstr "Allgemein" #: config/models.py:126 config/templates/config/version.html:5 #: config/templates/config/version.html:8 -#: config/templates/config/version.html:11 motion/views.py:809 -#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 +#: config/templates/config/version.html:13 motion/pdf.py:104 msgid "Version" msgstr "Version" -#: config/views.py:69 +#: config/views.py:70 msgid "General settings successfully saved." msgstr "Allgemeine Einstellungen erfolgreich gespeichert." -#: config/views.py:110 config/templates/config/base_config.html:7 -msgid "Configuration" -msgstr "Konfiguration" - #: config/templates/config/general.html:5 -#: config/templates/config/general.html:8 msgid "General settings" msgstr "Allgemeine Einstellungen" -#: config/templates/config/general.html:11 +#: config/templates/config/general.html:15 msgid "Event" msgstr "Veranstaltung" -#: config/templates/config/general.html:26 +#: config/templates/config/general.html:33 msgid "Welcome Widget" msgstr "Willkommens-Widget" -#: config/templates/config/general.html:41 +#: config/templates/config/general.html:51 msgid "System" msgstr "System" -#: motion/forms.py:25 motion/models.py:541 motion/views.py:843 -#: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 +#: motion/forms.py:38 motion/models.py:472 #: motion/templates/projector/Motion.html:77 msgid "Reason" msgstr "Begründung" -#: motion/forms.py:30 -msgid "Trivial change" -msgstr "Triviale Änderung" - -#: motion/forms.py:31 -msgid "Trivial changes don't create a new version." -msgstr "Triviale Änderungen erzeugen keine neue Version." - -#: motion/forms.py:35 motion/models.py:63 motion/views.py:762 -#: motion/templates/motion/overview.html:41 -#: motion/templates/motion/view.html:18 +#: motion/forms.py:59 motion/pdf.py:42 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Antragsteller/in" -#: motion/forms.py:44 motion/views.py:782 motion/templates/motion/view.html:22 +#: motion/forms.py:73 motion/pdf.py:66 msgid "Supporters" msgstr "Unterstützer/innen" -#: motion/forms.py:50 participant/forms.py:114 -msgid "CSV File" -msgstr "CSV-Datei" +#: motion/forms.py:88 +msgid "Create new version" +msgstr "" -#: motion/forms.py:54 -msgid "Import motions with status \"authorized\"" -msgstr "Anträge als \"Zugelassen\" importieren" +#: motion/forms.py:89 +msgid "Trivial changes don't create a new version." +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/forms.py:55 -msgid "Set the initial status for each motion to \"authorized\"" -msgstr "Setzt den initialen Status für jeden Antrag auf \"zugelassen\"" - -#: motion/forms.py:63 +#: motion/forms.py:98 msgid "Number of (minimum) required supporters for a motion" msgstr "Mindestanzahl erforderlicher Unterstützer/innen für einen Antrag" -#: motion/forms.py:67 +#: motion/forms.py:100 msgid "Choose 0 to disable the supporting system" -msgstr "Wähle 0 um das Unterstützersystem zu deaktivieren" +msgstr "Zum Deaktivieren des Unterstützersystems '0' eingeben" -#: motion/forms.py:72 +#: motion/forms.py:105 msgid "Motion preamble" msgstr "Antragseinleitung" -#: motion/forms.py:93 +#: motion/forms.py:126 msgid "Title for PDF document (all motions)" msgstr "Titel für PDF-Dokument (alle Anträge)" -#: motion/forms.py:98 +#: motion/forms.py:131 msgid "Preamble text for PDF document (all motions)" msgstr "Einleitungstext für PDF-Dokument (alle Wahlen) " -#: motion/forms.py:102 -msgid "Allow trivial changes" -msgstr "Triviale Änderungen erlauben" - -#: motion/forms.py:103 -msgid "Warning: Trivial changes undermine the motions autorisation system." +#: motion/forms.py:136 +msgid "Create new versions" msgstr "" -"Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von Anträgen." -#: motion/models.py:42 -msgid "Published" -msgstr "Veröffentlicht" - -#: motion/models.py:43 -msgid "Permitted" -msgstr "Zugelassen" - -#: motion/models.py:44 motion/templates/motion/overview.html:24 -#: motion/templates/motion/view.html:167 -msgid "Accepted" -msgstr "Angenommen" - -#: motion/models.py:45 motion/templates/motion/overview.html:25 -#: motion/templates/motion/view.html:172 -msgid "Rejected" -msgstr "Abgelehnt" - -#: motion/models.py:46 -msgid "Withdrawed" -msgstr "Zurückgezogen" - -#: motion/models.py:47 motion/templates/motion/view.html:180 -msgid "Adjourned" -msgstr "Vertagt" - -# please check! -#: motion/models.py:48 motion/templates/motion/view.html:183 -msgid "Not Concerned" -msgstr "Nicht befasst" - -# please check! -#: motion/models.py:49 motion/templates/motion/view.html:186 -msgid "Commited a bill" -msgstr "Verwiesen (in Ausschuss)" - -#: motion/models.py:50 -msgid "Rejected (not authorized)" -msgstr "Verworfen (nicht zulässig)" - -#: motion/models.py:51 motion/templates/motion/overview.html:27 -msgid "Needs Review" -msgstr "Benötigt Review" - -#: motion/models.py:100 -#, python-format -msgid "Version %d authorized" -msgstr "Version %d zugelassen" - -#: motion/models.py:107 -#, python-format -msgctxt "Rejected means not authorized" -msgid "Version %d rejected" -msgstr "Version %d verworfen" - -#: motion/models.py:136 -msgid "Searching for supporters." -msgstr "Auf Unterstützersuche." - -#: motion/models.py:138 -msgid "Not yet authorized." -msgstr "Noch nicht zugelassen." - -#: motion/models.py:140 -msgid "Not yet authorized changes." -msgstr "Noch nicht zugelassene Änderungen." - -#: motion/models.py:223 -#, python-format -msgid "" -"Trivial changes to version %(version)d; changed fields: %(changed_fields)s" +#: motion/forms.py:139 +msgid "create allways a new versions" msgstr "" -"Triviale Änderung an Version %(version)d; Geänderte Felder: " -"%(changed_fields)s" -#: motion/models.py:235 -#, python-format -msgid "Version %s created" -msgstr "Version %s erstellt" +#: motion/forms.py:140 +#, fuzzy +msgid "create never a new version" +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/models.py:244 -msgid "Supporters removed" -msgstr "Unterstützer/innen gelöscht" +#: motion/forms.py:141 +#, fuzzy +msgid "Let the user choose if he wants to create a new version" +msgstr "Triviale Änderungen erzeugen keine neue Version." -#: motion/models.py:253 -#, python-format -msgid "Status reseted to: %s" -msgstr "Status zurückgesetzt auf: %s" +#: motion/forms.py:146 +msgid "Workflow for the motions" +msgstr "" -#: motion/models.py:265 +#: motion/models.py:75 +msgid "Can see motions" +msgstr "Darf Anträge sehen" + +#: motion/models.py:76 +msgid "Can create motions" +msgstr "Darf Anträge erstellen" + +#: motion/models.py:77 +msgid "Can support motions" +msgstr "Darf Anträge unterstützen" + +#: motion/models.py:78 +msgid "Can manage motions" +msgstr "Darf Anträge verwalten" + +#: motion/models.py:489 +#, fuzzy +msgid "new" +msgstr "Neu" + +#: motion/pdf.py:35 motion/views.py:459 +#, fuzzy, python-format +msgid "Motion: %s" +msgstr "Anträge" + +#: motion/pdf.py:55 +msgid "Signature" +msgstr "Unterschrift" + +#: motion/pdf.py:95 +#, fuzzy +msgid "State" +msgstr "Status" + +#: motion/pdf.py:130 motion/templates/motion/motion_detail.html:53 +#: motion/templates/motion/motion_detail.html:61 +#: motion/templates/projector/Motion.html:33 +msgid "Vote" +msgstr "Abstimmung" + +#: motion/pdf.py:151 +#, fuzzy +msgid "Reason:" +msgstr "Begründung" + +#: motion/pdf.py:167 +msgid "No motions available." +msgstr "Keine Anträge vorhanden." + +#: motion/signals.py:24 +msgid "The assembly may decide," +msgstr "Die Versammlung möge beschließen," + +#: motion/signals.py:27 motion/views.py:457 motion/views.py:509 +#: motion/views.py:524 motion/templates/motion/config.html:10 +#: motion/templates/motion/motion_list.html:7 +#: motion/templates/motion/motion_list.html:10 +msgid "Motions" +msgstr "Anträge" + +#: motion/views.py:141 +#, fuzzy +msgid "Motion created" +msgstr "Antragseinleitung" + +#: motion/views.py:158 +#, fuzzy +msgid "Motion updated" +msgstr "Antragstext" + +#: motion/views.py:194 +#, fuzzy, python-format +msgid "Are you sure you want permit Version %s?" +msgstr "Soll Version %s wirklich zurückgewiesen werden?" + +#: motion/views.py:220 +#, fuzzy, python-format +msgid "Are you sure you want reject Version %s?" +msgstr "Soll Version %s wirklich zurückgewiesen werden?" + +#: motion/views.py:252 +msgid "You can not support this motion." +msgstr "Sie dürfen diesen Antrag nicht unterstützen." + +#: motion/views.py:255 +msgid "You can not unsupport this motion." +msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." + +#: motion/views.py:263 +msgid "Do you really want to support this motion?" +msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" + +#: motion/views.py:265 +msgid "Do you really want to unsupport this motion?" +msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" + +#: motion/views.py:277 #, python-format msgid "Supporter: +%s" msgstr "Unterstützer/in: +%s" -#: motion/models.py:278 +#: motion/views.py:280 #, python-format msgid "Supporter: -%s" msgstr "Unterstützer/in: -%s" -#: motion/models.py:294 -#, python-format -msgid "Number set: %s" -msgstr "Nummer gesetzt: %s" +#: motion/views.py:285 +msgid "You have supported this motion successfully." +msgstr "Sie haben den Antrag erfolgreich unterstützt." -#: motion/models.py:307 -#, python-format -msgid "Version %s authorized" -msgstr "Version %s zugelassen" +#: motion/views.py:287 +msgid "You have unsupported this motion successfully." +msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." -#: motion/models.py:319 -#, python-format -msgid "Version %s not authorized" -msgstr "Version %s nicht zugelassen" +#: motion/views.py:310 +msgid "Poll created" +msgstr "Abstimmung erstellt" -#: motion/models.py:335 -#, python-format -msgid "The motion status is already '%s.'" -msgstr "Der Antragsstatus ist bereits '%s'." +#: motion/views.py:311 +msgid "New vote was successfully created." +msgstr "Neue Abstimmung erfolgreich angelegt." -#: motion/models.py:343 -#, python-format -msgid "" -"The motion status is: '%(currentstatus)s'. You can not set the status to " -"'%(newstatus)s'." +#: motion/views.py:361 +#, fuzzy +msgid "Poll updated" +msgstr "Abstimmung wurde aktualisiert" + +#: motion/views.py:374 +msgid "Poll deleted" +msgstr "Abstimmung gelöscht" + +#: motion/views.py:404 +#, fuzzy, python-format +msgid "Changed state to %s" +msgstr "Status ändern" + +#: motion/views.py:406 +#, fuzzy, python-format +msgid "Motion status was set to: %s." +msgstr "Antragsstatus wurde gesetzt auf: %s." + +#: motion/views.py:431 +#, fuzzy +msgid "Created Agenda Item" +msgstr "Tagesordnungseintrag" + +#: motion/views.py:500 +msgid "Motion settings successfully saved." +msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." + +#: motion/workflow.py:128 +msgid "Unknwon state" msgstr "" -"Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht auf " -"'%(newstatus)s' setzen." -#: motion/models.py:351 -msgid "Status modified" -msgstr "Status geändert" +#: motion/workflow.py:131 +msgid "Published" +msgstr "Veröffentlicht" -#: motion/models.py:443 motion/models.py:445 -msgid "by" -msgstr "von" +#: motion/workflow.py:136 +msgid "Permitted" +msgstr "Zugelassen" -#: motion/models.py:453 motion/templates/motion/view.html:210 -#: motion/templates/motion/widget.html:27 +#: motion/workflow.py:137 +msgid "Accepted" +msgstr "Angenommen" + +#: motion/workflow.py:138 +msgid "Rejected" +msgstr "Abgelehnt" + +#: motion/workflow.py:139 +msgid "Withdrawed" +msgstr "Zurückgezogen" + +#: motion/workflow.py:140 +msgid "Adjourned" +msgstr "Vertagt" + +# please check! +#: motion/workflow.py:141 +msgid "Not Concerned" +msgstr "Nicht befasst" + +# please check! +#: motion/workflow.py:142 +msgid "Commited a bill" +msgstr "Verwiesen (in Ausschuss)" + +#: motion/workflow.py:143 +msgid "Needs Review" +msgstr "Benötigt Review" + +#: motion/workflow.py:144 +msgid "Rejected (not authorized)" +msgstr "Verworfen (nicht zulässig)" + +#: motion/templates/motion/config.html:5 +msgid "Motion settings" +msgstr "Antrags Einstellungen" + +#: motion/templates/motion/motion_detail.html:7 +#: motion/templates/projector/Motion.html:7 +#: motion/templates/projector/Motion.html:65 +msgid "Motion" +msgstr "Antrag" + +#: motion/templates/motion/motion_detail.html:54 +msgid "Edit Vote" +msgstr "Abstimmung bearbeiten" + +#: motion/templates/motion/motion_detail.html:57 +msgid "Delete Vote" +msgstr "Abstimmung löschen" + +#: motion/templates/motion/motion_detail.html:77 +#, fuzzy +msgid "Enter result" +msgstr "Abstimmungsergebnis" + +#: motion/templates/motion/motion_detail.html:87 +msgid "New vote" +msgstr "Neue Abstimmung" + +#: motion/templates/motion/motion_form.html:7 +#, fuzzy +msgid "Motion Form" +msgstr "Antrag Nr." + +#: motion/templates/motion/motion_form.html:10 +#, fuzzy +msgid "Motions Forms" +msgstr "Anträge" + +#: motion/templates/motion/poll_form.html:15 +msgid "Option" +msgstr "Wahlmöglichkeit" + +#: motion/templates/motion/widget.html:19 +#: participant/templates/participant/personal_info_widget.html:9 +#: participant/templates/participant/personal_info_widget.html:28 +msgid "motion" +msgstr "Antrag" + +#: motion/templates/motion/widget.html:23 #: motion/templates/projector/Motion.html:65 #: participant/templates/participant/personal_info_widget.html:13 #: participant/templates/participant/personal_info_widget.html:32 msgid "no number" msgstr "ohne Nummer" -#: motion/models.py:454 motion/templates/motion/widget.html:23 -#: participant/templates/participant/personal_info_widget.html:9 -#: participant/templates/participant/personal_info_widget.html:28 -msgid "motion" -msgstr "Antrag" - -#: motion/models.py:479 -msgid "Poll created" -msgstr "Abstimmung erstellt" - -#: motion/models.py:530 -msgid "Can see motions" -msgstr "Darf Anträge sehen" - -#: motion/models.py:531 -msgid "Can create motions" -msgstr "Darf Anträge erstellen" - -#: motion/models.py:532 -msgid "Can support motions" -msgstr "Darf Anträge unterstützen" - -#: motion/models.py:533 -msgid "Can manage motions" -msgstr "Darf Anträge verwalten" - -#: motion/models.py:600 -msgid "The assembly may decide," -msgstr "Die Versammlung möge beschließen," - -#: motion/models.py:603 motion/views.py:712 motion/views.py:937 -#: motion/views.py:948 motion/templates/motion/base_motion.html:9 -#: motion/templates/motion/overview.html:7 -#: motion/templates/motion/overview.html:10 -msgid "Motions" -msgstr "Anträge" - -#: motion/views.py:167 -msgid "You have not the necessary rights to create or edit motions." -msgstr "" -"Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " -"bearbeiten." - -#: motion/views.py:172 -msgid "You can not edit this motion." -msgstr "Sie dürfen diesen Antrag nicht bearbeiten." - -#: motion/views.py:230 -msgid "New motion was successfully created." -msgstr "Neuer Antrag wurde erfolgreich angelegt." - -#: motion/views.py:232 -msgid "Motion was successfully modified." -msgstr "Antrag wurde erfolgreich geändert." - -#: motion/views.py:246 -msgid "" -"Attention: Do you really want to edit this motion? The supporters will " -"not be removed automatically because you can manage motions. Please " -"check if the supports are valid after your changing!" -msgstr "" -"Achtung: Wollen Sie den Antrag wirklich ändern? Die Unterstützer/innen " -"werden nicht automatisch entfernt, da Sie Anträge verwalten dürfen. " -"Prüfen Sie, ob die Unterstützungen noch gültig sind." - -#: motion/views.py:248 -#, python-format -msgid "" -"Attention: Do you really want to edit this motion? All %s supporters " -"will be removed! Try to convince the supporters again." -msgstr "" -"Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " -"werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." - -#: motion/views.py:280 -msgid "Motion number was successfully set." -msgstr "Antragsnummer wurde erfolgreich gesetzt." - -#: motion/views.py:296 -msgid "Motion was successfully authorized." -msgstr "Antrag wurde erfolgreich zugelassen." - -#: motion/views.py:311 -msgid "Motion was successfully rejected." -msgstr "Antrag wurde erfolgreich verworfen." - -#: motion/views.py:327 -#, python-format -msgid "Motion status was set to: %s." -msgstr "Antragsstatus wurde gesetzt auf: %s." - -#: motion/views.py:343 -msgid "Motion status was reset." -msgstr "Antragsstatus wurde zurückgesetzt." - -#: motion/views.py:370 -msgid "You can not support this motion." -msgstr "Sie dürfen diesen Antrag nicht unterstützen." - -#: motion/views.py:373 -msgid "You can not unsupport this motion." -msgstr "Sie dürfen Ihre Unterstützung für diesen Antrag nicht entziehen." - -#: motion/views.py:384 -msgid "Do you really want to support this motion?" -msgstr "Wollen Sie wirklich diesen Antrag unterstützen?" - -#: motion/views.py:386 -msgid "Do you really want to unsupport this motion?" -msgstr "Wollen Sie wirklich Ihre Unterstützung für diesen Antrag entziehen?" - -#: motion/views.py:397 -msgid "You have supported this motion successfully." -msgstr "Sie haben den Antrag erfolgreich unterstützt." - -#: motion/views.py:399 -msgid "You have unsupported this motion successfully." -msgstr "Sie haben dem Antrag erfolgreich Ihre Unterstützung entzogen." - -#: motion/views.py:413 -msgid "New vote was successfully created." -msgstr "Neue Abstimmung erfolgreich angelegt." - -#: motion/views.py:429 -msgid "Poll deleted" -msgstr "Abstimmung gelöscht" - -#: motion/views.py:430 -msgid "Poll was successfully deleted." -msgstr "Abstimmung wurde erfolgreich gelöscht." - -#: motion/views.py:432 -#, python-format -msgid "the %s. poll" -msgstr "die %s. Abstimmung" - -#: motion/views.py:473 motion/views.py:482 -#, python-format -msgid "You can not delete motion %s." -msgstr "Sie können Antrag %s nicht löschen." - -#: motion/views.py:478 motion/views.py:486 -#, python-format -msgid "Motion %s was successfully deleted." -msgstr "Antrag %s wurde erfolgreich gelöscht." - -#: motion/views.py:488 -msgid "Invalid request" -msgstr "Ungültige Anfrage" - -#: motion/views.py:512 -msgid "Poll was updated" -msgstr "Abstimmung wurde aktualisiert" - -#: motion/views.py:529 -#, python-format -msgid "Version %s accepted." -msgstr "Version %s akzeptiert." - -#: motion/views.py:531 -#, python-format -msgid "Do you really want to authorize version %s?" -msgstr "Soll Version %s wirklich zugelassen werden?" - -#: motion/views.py:541 -#, python-format -msgid "Version %s rejected." -msgstr "Version %s zurückgewiesen." - -#: motion/views.py:543 -msgid "ERROR by rejecting the version." -msgstr "FEHLER beim Zurückweisen der Version." - -#: motion/views.py:545 -#, python-format -msgid "Do you really want to reject version %s?" -msgstr "Soll Version %s wirklich zurückgewiesen werden?" - -#: motion/views.py:581 motion/views.py:585 motion/views.py:591 -#: motion/views.py:594 participant/api.py:78 -#, python-format -msgid "Ignoring malformed line %d in import file." -msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." - -#: motion/views.py:602 -#, python-format -msgid "Ignoring line %d because the assigned group may not act as a person." -msgstr "" -"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete Gruppe " -"nicht als Person auftreten darf." - -#: motion/views.py:611 -msgid "Created by motion import." -msgstr "Erstellt durch Antragsimport." - -#: motion/views.py:625 -#, python-format -msgid "" -"Ignoring line %d because it contains an incomplete first / last name pair." -msgstr "" -"Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. Nachname " -"Leerstrings enthalten." - -#: motion/views.py:663 -#, python-format -msgid "%d motion was successfully imported." -msgid_plural "%d motions were successfully imported." -msgstr[0] "%d Antrag wurde erfolgreich importiert." -msgstr[1] "%d Anträge wurden erfolgreich importiert." - -#: motion/views.py:666 -#, python-format -msgid "%d motion was successfully modified." -msgid_plural "%d motions were successfully modified." -msgstr[0] "%d Antrag wurde erfolgreich geändert." -msgstr[1] "%d Anträge wurden erfolgreich geändert." - -#: motion/views.py:669 -#, python-format -msgid "%d new user was added." -msgid_plural "%d new users were added." -msgstr[0] "%d neuer Nutzer wurde erstellt." -msgstr[1] "%d neue Nutzer wurden erstellt." - -#: motion/views.py:672 -#, python-format -msgid "%d new group was added." -msgid_plural "%d new groups were added." -msgstr[0] "%d neue Gruppe wurde erstellt." -msgstr[1] "%d neue Gruppen wurden erstellt." - -#: motion/views.py:675 -#, python-format -msgid "%d group assigned to motions." -msgid_plural "%d groups assigned to motions." -msgstr[0] "%d Gruppe wurde zugewiesen." -msgstr[1] "%d Gruppen wurden zugewiesen." - -#: motion/views.py:679 participant/api.py:94 -msgid "Import aborted because of severe errors in the input file." -msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." - -#: motion/views.py:681 participant/api.py:96 -msgid "Import file has wrong character encoding, only UTF-8 is supported!" -msgstr "" -"Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " -"wird unterstützt!" - -#: motion/views.py:685 -msgid "" -"Attention: Existing motions will be modified if you import new motions with " -"the same number." -msgstr "" -"Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " -"identischer Nummer importieren." - -#: motion/views.py:686 -msgid "" -"Attention: Importing an motions without a number multiple times will create " -"duplicates." -msgstr "" -"Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " -"entstehen." - -#: motion/views.py:719 motion/views.py:857 -#: motion/templates/motion/poll_view.html:7 -#: motion/templates/motion/poll_view.html:12 -#: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 -#: motion/templates/motion/view.html:225 -#: motion/templates/projector/Motion.html:7 -#: motion/templates/projector/Motion.html:65 -msgid "Motion" -msgstr "Antrag" - -#: motion/views.py:733 motion/templates/motion/overview.html:84 -msgid "No motions available." -msgstr "Keine Anträge vorhanden." - -#: motion/views.py:738 motion/views.py:740 motion/views.py:755 -#: motion/views.py:757 motion/templates/motion/base_motion.html:24 -#: motion/templates/projector/Motion.html:63 -msgid "Motion No." -msgstr "Antrag Nr." - -#: motion/views.py:772 -msgid "Signature" -msgstr "Unterschrift" - -#: motion/views.py:823 motion/templates/motion/base_motion.html:55 -#: motion/templates/motion/poll_view.html:8 -#: motion/templates/motion/poll_view.html:13 -#: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 -#: motion/templates/projector/Motion.html:33 -msgid "Vote" -msgstr "Abstimmung" - -#: motion/views.py:857 -msgid "Poll" -msgstr "Abstimmung" - -#: motion/views.py:871 -#, python-format -msgid "Motion No. %s" -msgstr "Antrag Nr. %s" - -#: motion/views.py:873 -#, python-format -msgid "%d. Vote" -msgstr "%d. Abstimmung" - -#: motion/views.py:930 -msgid "Motion settings successfully saved." -msgstr "Antrags-Einstellungen wurden erfolgreich gespeichert." - -#: motion/templates/motion/base_motion.html:11 -msgid "All motions" -msgstr "Alle Anträge" - -#: motion/templates/motion/base_motion.html:13 -#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:18 -msgid "New motion" -msgstr "Neuer Antrag" - -#: motion/templates/motion/base_motion.html:16 -#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 -msgid "Import motions" -msgstr "Anträge importieren" - -#: motion/templates/motion/base_motion.html:18 -msgid "All motions as PDF" -msgstr "Alle Anträge als PDF" - -#: motion/templates/motion/base_motion.html:34 -msgid "View motion" -msgstr "Antrag anzeigen" - -#: motion/templates/motion/base_motion.html:38 -#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:16 -#: motion/templates/motion/overview.html:72 -msgid "Edit motion" -msgstr "Antrag bearbeiten" - -#: motion/templates/motion/base_motion.html:42 -#: motion/templates/motion/overview.html:74 -msgid "Delete motion" -msgstr "Antrag löschen" - -#: motion/templates/motion/base_motion.html:45 -#: motion/templates/motion/overview.html:77 -msgid "Motion as PDF" -msgstr "Antrag als PDF" - -#: motion/templates/motion/base_motion.html:49 -msgid "Show Motion" -msgstr "Antrag projizieren" - -#: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 -msgid "Motion settings" -msgstr "Antrags Einstellungen" - -#: motion/templates/motion/import.html:9 -msgid "Select a CSV file to import motions!" -msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" - -#: motion/templates/motion/import.html:11 -#: participant/templates/participant/import.html:11 -msgid "Required comma separated values" -msgstr "Erforderliche kommaseparierte Werte" - -#: motion/templates/motion/import.html:12 -msgid "number, title, text, reason, first_name, last_name, is_group" -msgstr "Nummer, Titel, Text, Begründung, Vorname, Nachname, Gruppenantrag" - -#: motion/templates/motion/import.html:14 -msgid "" -"number, reason and is_group are " -"optional and may be empty" -msgstr "" -"Nummer, Begründung und Gruppenantrag " -"sind optional und können auch leer sein" - -#: motion/templates/motion/import.html:16 -#: participant/templates/participant/import.html:14 -msgid "Required CSV file encoding: UTF-8 (Unicode)." -msgstr "Erforderliches CSV-Datei-Encoding: UTF-8 (Unicode)." - -#: motion/templates/motion/import.html:19 -#: participant/templates/participant/import.html:17 -msgid "A CSV example file is available in OpenSlides Wiki." -msgstr "Eine CSV-Beispiel-Datei gibt es im OpenSlides Wiki." - -#: motion/templates/motion/import.html:26 -#: participant/templates/participant/import.html:24 -msgid "Import" -msgstr "Importieren" - -#: motion/templates/motion/overview.html:15 -msgid "Need supporters" -msgstr "Benötigt Unterstützer/innen" - -#: motion/templates/motion/overview.html:18 -msgid "Without number" -msgstr "Ohne Nummer" - -#: motion/templates/motion/overview.html:22 -msgid "Not yet authorized" -msgstr "Noch nicht zugelassen" - -#: motion/templates/motion/overview.html:23 -msgid "Authorized" -msgstr "Zugelassen" - -#: motion/templates/motion/overview.html:26 -msgid "Withdrawen (by submitter)" -msgstr "Zurückgezogen (durch Antragsteller/in)" - -#: motion/templates/motion/overview.html:32 -msgctxt "number of motions" -msgid "motion" -msgid_plural "motions" -msgstr[0] "Antrag" -msgstr[1] "Anträge" - -#: motion/templates/motion/overview.html:35 -msgid "Number" -msgstr "Nummer" - -#: motion/templates/motion/overview.html:36 -msgid "Motion title" -msgstr "Antragstitel" - -#: motion/templates/motion/overview.html:38 -msgid "Number of supporters" -msgstr "Anzahl der Unterstützer/innen" - -#: motion/templates/motion/overview.html:42 -#: motion/templates/motion/view.html:109 -msgid "Creation Time" -msgstr "Erstellungszeit" - -#: motion/templates/motion/overview.html:67 -msgid "Activate motion" -msgstr "Antrag projizieren" - -#: motion/templates/motion/poll_view.html:21 -msgid "Option" -msgstr "Wahlmöglichkeit" - -#: motion/templates/motion/view.html:51 motion/templates/motion/view.html:91 -msgid "New vote" -msgstr "Neue Abstimmung" - -#: motion/templates/motion/view.html:67 -msgid "Edit Vote" -msgstr "Abstimmung bearbeiten" - -#: motion/templates/motion/view.html:70 -msgid "Delete Vote" -msgstr "Abstimmung löschen" - -#: motion/templates/motion/view.html:99 -msgid "Enter result" -msgstr "Ergebnis eingeben" - -#: motion/templates/motion/view.html:116 -msgid "Withdraw" -msgstr "Zurückziehen" - -#: motion/templates/motion/view.html:124 -msgid "Unsupport" -msgstr "Nicht unterstützen" - -#: motion/templates/motion/view.html:130 -msgid "Support" -msgstr "Unterstützen" - -#: motion/templates/motion/view.html:136 -msgid "minimum required supporters" -msgstr "minimal erforderliche Unterstützer/innen" - -#: motion/templates/motion/view.html:143 -msgid "Manage motion" -msgstr "Antrag Verwalten" - -#: motion/templates/motion/view.html:146 -msgid "Formal validation" -msgstr "Formale Gültigkeitsprüfung" - -#: motion/templates/motion/view.html:148 -msgid "Publish" -msgstr "Veröffentlichen" - -#: motion/templates/motion/view.html:151 -msgid "Permit" -msgstr "Zulassen" - -#: motion/templates/motion/view.html:154 -msgid "Not permit (reject)" -msgstr "Nicht zulassen (verwerfen)" - -#: motion/templates/motion/view.html:157 -msgid "Set number" -msgstr "Setze Nummer" - -#: motion/templates/motion/view.html:164 -msgid "Result after vote" -msgstr "Ergebnis nach der Abstimmung" - -#: motion/templates/motion/view.html:178 -msgid "Result after debate" -msgstr "Ergebnis nach der Debatte" - -#: motion/templates/motion/view.html:189 -msgid "Withdrawed by submitter" -msgstr "Zurückgezogen durch Antragsteller/in" - -#: motion/templates/motion/view.html:194 -msgid "For Administration only:" -msgstr "Nur zur Administration:" - -#: motion/templates/motion/view.html:196 -msgid "Reset" -msgstr "Zurücksetzen" - -#: motion/templates/motion/view.html:219 -msgid "This is not the newest version." -msgstr "Dies ist nicht die neuste Version." - -#: motion/templates/motion/view.html:219 motion/templates/motion/view.html:221 -msgid "Go to version" -msgstr "Gehe zu Version" - -#: motion/templates/motion/view.html:221 -msgid "This is not the authorized version." -msgstr "Dies ist nicht die zugelassene Version." - -#: motion/templates/motion/view.html:239 -msgid "Version History" -msgstr "Versionshistorie" - -#: motion/templates/motion/view.html:256 -msgid "Version authorized" -msgstr "Version %d zugelassen" - -#: motion/templates/motion/view.html:259 -msgid "Permit Version" -msgstr "Version zulassen" - -#: motion/templates/motion/view.html:262 -msgid "Reject Version" -msgstr "Version verwerfen" - -#: motion/templates/motion/view.html:266 -msgid "Version rejected" -msgstr "Version verworfen" - -#: motion/templates/motion/view.html:276 motion/templates/motion/view.html:283 -#: motion/templates/motion/view.html:290 -msgid "unchanged" -msgstr "unverändert" - -#: motion/templates/motion/view.html:299 -msgid "Log" -msgstr "Log" - -#: motion/templates/motion/widget.html:31 +#: motion/templates/motion/widget.html:27 msgid "No motion available." msgstr "Keine Antrag vorhanden." @@ -1951,14 +1474,34 @@ msgstr "Abstimmungsergebnis" msgid "No poll results available." msgstr "Keine Abstimmungsergebnisse vorhanden." +#: motion/templates/projector/Motion.html:63 +msgid "Motion No." +msgstr "Antrag Nr." + #: participant/__init__.py:3 msgid "Participant" msgstr "Teilnehmer" -#: participant/forms.py:28 participant/views.py:604 -#: participant/templates/participant/group_overview.html:7 -#: participant/templates/participant/group_overview.html:10 -#: participant/templates/participant/user_detail.html:14 +#: participant/api.py:78 +#, python-format +msgid "Ignoring malformed line %d in import file." +msgstr "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert." + +#: participant/api.py:94 +msgid "Import aborted because of severe errors in the input file." +msgstr "Import auf Grund von schweren Fehlern in der Quelldatei abgebrochen." + +#: participant/api.py:96 +msgid "Import file has wrong character encoding, only UTF-8 is supported!" +msgstr "" +"Die Quelldatei benutzt eine ungültige Zeichenkodierung, es wird nur UTF-8 " +"wird unterstützt!" + +#: participant/forms.py:28 participant/views.py:602 +#: participant/templates/participant/group_overview.html:6 +#: participant/templates/participant/group_overview.html:9 +#: participant/templates/participant/overview.html:21 +#: participant/templates/participant/user_detail.html:18 msgid "Groups" msgstr "Gruppen" @@ -1966,11 +1509,11 @@ msgstr "Gruppen" msgid "Permissions" msgstr "Rechte" -#: participant/forms.py:56 participant/views.py:543 participant/views.py:590 -#: participant/templates/participant/base_participant.html:12 +#: participant/forms.py:56 participant/views.py:540 participant/views.py:588 +#: participant/templates/participant/config.html:10 #: participant/templates/participant/overview.html:7 -#: participant/templates/participant/overview.html:18 -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:16 +#: participant/templates/participant/overview.html:95 msgid "Participants" msgstr "Teilnehmer/innen" @@ -1983,6 +1526,10 @@ msgstr "Sie dürfen den Namen dieser Gruppe nicht bearbeiten." msgid "Group name \"%s\" is reserved for internal use." msgstr "Der Gruppenname \"%s\" ist für interne Verwendung reserviert." +#: participant/forms.py:114 +msgid "CSV File" +msgstr "CSV-Datei" + #: participant/forms.py:121 msgid "System URL" msgstr "System URL" @@ -1999,32 +1546,32 @@ msgstr "Teilnehmer/innen nach Vornamen sortieren" msgid "Disable for sorting by last name" msgstr "Deaktivieren für Sortierung nach Nachnamen" -#: participant/models.py:33 participant/templates/participant/overview.html:25 +#: participant/models.py:33 participant/templates/participant/overview.html:57 msgid "Male" msgstr "Männlich" -#: participant/models.py:34 participant/templates/participant/overview.html:26 +#: participant/models.py:34 participant/templates/participant/overview.html:58 msgid "Female" msgstr "Weiblich" -#: participant/models.py:37 participant/templates/participant/overview.html:38 +#: participant/models.py:37 participant/templates/participant/overview.html:70 msgid "Delegate" msgstr "Delegierter" -#: participant/models.py:38 participant/templates/participant/overview.html:39 +#: participant/models.py:38 participant/templates/participant/overview.html:71 msgid "Observer" msgstr "Beobachter" -#: participant/models.py:39 participant/templates/participant/overview.html:40 +#: participant/models.py:39 participant/templates/participant/overview.html:72 msgid "Staff" msgstr "Mitarbeiter" -#: participant/models.py:40 participant/templates/participant/overview.html:41 +#: participant/models.py:40 participant/templates/participant/overview.html:73 msgid "Guest" msgstr "Gast" -#: participant/models.py:45 participant/templates/participant/overview.html:30 -#: participant/templates/participant/overview.html:68 +#: participant/models.py:45 participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:102 msgid "Structure level" msgstr "Gliederungsebene" @@ -2032,8 +1579,8 @@ msgstr "Gliederungsebene" msgid "Will be shown after the name." msgstr "Wird nach dem Namen angezeigt." -#: participant/models.py:49 participant/templates/participant/overview.html:24 -#: participant/templates/participant/user_detail.html:24 +#: participant/models.py:49 participant/templates/participant/overview.html:56 +#: participant/templates/participant/user_detail.html:28 msgid "Gender" msgstr "Geschlecht" @@ -2045,15 +1592,15 @@ msgstr "Nur zum Filtern der Teilnehmerliste." msgid "Typ" msgstr "Typ" -#: participant/models.py:54 participant/views.py:248 -#: participant/templates/participant/overview.html:45 -#: participant/templates/participant/overview.html:70 -#: participant/templates/participant/user_detail.html:34 +#: participant/models.py:54 participant/views.py:246 +#: participant/templates/participant/overview.html:77 +#: participant/templates/participant/overview.html:104 +#: participant/templates/participant/user_detail.html:38 msgid "Committee" msgstr "Amt" #: participant/models.py:57 -#: participant/templates/participant/user_detail.html:39 +#: participant/templates/participant/user_detail.html:43 msgid "About me" msgstr "Über mich" @@ -2089,90 +1636,92 @@ msgstr "Zum Beispiel als Antragsteller." msgid "Welcome to OpenSlides!" msgstr "Willkommen bei OpenSlides!" -#: participant/views.py:200 +#: participant/views.py:198 msgid "You can not delete yourself." msgstr "Sie dürfen sich nicht selbst löschen." -#: participant/views.py:221 +#: participant/views.py:219 msgid "You can not deactivate yourself." msgstr "Sie dürfen sich nicht selbst deaktivieren." -#: participant/views.py:224 +#: participant/views.py:222 msgid "You can not deactivate the administrator." msgstr "Sie dürfen den Administrator nicht deaktivieren." -#: participant/views.py:243 +#: participant/views.py:241 msgid "Participant-list" msgstr "Teilnehmerliste" -#: participant/views.py:244 +#: participant/views.py:242 msgid "List of Participants" msgstr "Teilnehmerliste" -#: participant/views.py:247 participant/templates/participant/overview.html:67 +#: participant/views.py:245 +#: participant/templates/participant/overview.html:101 msgid "Last Name" msgstr "Nachname" -#: participant/views.py:247 participant/templates/participant/overview.html:66 +#: participant/views.py:245 +#: participant/templates/participant/overview.html:100 msgid "First Name" msgstr "Vorname" -#: participant/views.py:247 -#: participant/templates/participant/group_overview.html:13 +#: participant/views.py:245 +#: participant/templates/participant/group_overview.html:18 msgid "Group" msgstr "Gruppe" -#: participant/views.py:279 +#: participant/views.py:277 msgid "Participant-passwords" msgstr "Teilnehmer-Passwoerter" -#: participant/views.py:301 +#: participant/views.py:299 msgid "Account for OpenSlides" msgstr "Zugang für OpenSlides" -#: participant/views.py:303 +#: participant/views.py:301 #, python-format msgid "for %s" msgstr "für %s" -#: participant/views.py:306 +#: participant/views.py:304 #, python-format msgid "User: %s" msgstr "Nutzername: %s" -#: participant/views.py:310 +#: participant/views.py:308 #, python-format msgid "Password: %s" msgstr "Passwort: %s" -#: participant/views.py:315 +#: participant/views.py:313 #, python-format msgid "URL: %s" msgstr "URL: %s" -#: participant/views.py:357 +#: participant/views.py:355 #, python-format msgid "%d new participants were successfully imported." msgstr "%d neue Teilnehmer/innen wurden erfolgreich importiert." -#: participant/views.py:368 +#: participant/views.py:366 msgid "Do you really want to reset the password?" msgstr "Soll das Passwort wirklich zurückgesetzt werden?" -#: participant/views.py:381 +#: participant/views.py:379 #, python-format msgid "The Password for %s was successfully reset." msgstr "Das Passwort für %s wurde erfolgreich zurückgesetzt." -#: participant/views.py:438 +#: participant/views.py:434 msgid "You can not delete this Group." msgstr "Sie dürfen diese Gruppe nicht löschen." -#: participant/views.py:466 +#: participant/views.py:463 msgid "Participants settings successfully saved." msgstr "Teilnehmer/innen-Einstellungen wurden erfolgreich gespeichert." -#: participant/views.py:476 +#: participant/views.py:473 #, python-format msgid "" "Installation was successfully! Use %(user)s (password: %(password)s) for " @@ -2185,197 +1734,177 @@ msgstr "" "Sie das Passwort nach der ersten Anmeldung! Anderenfalls erscheint diese " "Meldung weiterhin für alle und ist ein Sicherheitsrisiko." -#: participant/views.py:502 +#: participant/views.py:499 msgid "User settings successfully saved." msgstr "Nutzereinstellungen wurden erfolgreich gespeichert." -#: participant/views.py:525 +#: participant/views.py:522 msgid "Password successfully changed." msgstr "Passwort wurde erfolgreich geändert." -#: participant/views.py:576 -msgid "My motions and elections" -msgstr "Meine Anträge und Wahlen" - -#: participant/templates/participant/base_participant.html:15 -msgid "All participants" -msgstr "Alle Teilnehmer/innen" - -#: participant/templates/participant/base_participant.html:18 -#: participant/templates/participant/edit.html:10 -#: participant/templates/participant/edit.html:19 -msgid "New participant" -msgstr "Neue/r Teilnehmer/in" - -#: participant/templates/participant/base_participant.html:19 -msgid "All groups" -msgstr "Alle Gruppen" - -#: participant/templates/participant/base_participant.html:20 -#: participant/templates/participant/group_edit.html:10 -#: participant/templates/participant/group_edit.html:18 -msgid "New group" -msgstr "Neue Gruppe" - -#: participant/templates/participant/base_participant.html:21 -#: participant/templates/participant/import.html:5 -#: participant/templates/participant/import.html:8 -msgid "Import participants" -msgstr "Teilnehmer/innen importieren" - -#: participant/templates/participant/base_participant.html:24 -msgid "List of participants as PDF" -msgstr "Teilnehmerliste als PDF" - -#: participant/templates/participant/base_participant.html:27 -msgid "First time passwords as PDF" -msgstr "Erst-Passwörter als PDF" - -#: participant/templates/participant/base_participant.html:38 -msgid "View participant" -msgstr "Teilnehmer/in anzeigen" - -#: participant/templates/participant/base_participant.html:45 -#: participant/templates/participant/edit.html:8 -#: participant/templates/participant/edit.html:17 -#: participant/templates/participant/overview.html:94 -msgid "Edit participant" -msgstr "Teilnehmer/in bearbeiten" - -#: participant/templates/participant/base_participant.html:50 -#: participant/templates/participant/overview.html:98 -msgid "Delete participant" -msgstr "Teilnehmer/in löschen" - -#: participant/templates/participant/base_participant.html:60 -msgid "View group" -msgstr "Gruppen anzeigen" - -#: participant/templates/participant/base_participant.html:65 -#: participant/templates/participant/group_edit.html:8 -#: participant/templates/participant/group_edit.html:16 -#: participant/templates/participant/group_overview.html:19 -msgid "Edit group" -msgstr "Gruppe bearbeiten" - -#: participant/templates/participant/base_participant.html:71 -#: participant/templates/participant/group_overview.html:21 -msgid "Delete group" -msgstr "Gruppe löschen" - #: participant/templates/participant/config.html:5 -#: participant/templates/participant/config.html:8 msgid "Participant settings" msgstr "Teilnehmer/innen-Einstellungen" -#: participant/templates/participant/edit.html:26 +#: participant/templates/participant/edit.html:8 +#: participant/templates/participant/edit.html:17 +msgid "Edit participant" +msgstr "Teilnehmer/in bearbeiten" + +#: participant/templates/participant/edit.html:10 +#: participant/templates/participant/edit.html:19 +#: participant/templates/participant/overview.html:20 +msgid "New participant" +msgstr "Neue/r Teilnehmer/in" + +#: participant/templates/participant/edit.html:30 msgid "Reset to First Password" msgstr "Auf Erst-Passwort zurücksetzen" -#: participant/templates/participant/group_detail.html:14 +#: participant/templates/participant/group_detail.html:18 msgid "Members" msgstr "Mitglieder" -#: participant/templates/participant/group_detail.html:19 +#: participant/templates/participant/group_detail.html:24 msgid "No members available." msgstr "Keine Mitglieder vorhanden." -#: participant/templates/participant/group_overview.html:27 -#: participant/templates/participant/group_widget.html:24 +#: participant/templates/participant/group_edit.html:8 +#: participant/templates/participant/group_edit.html:17 +msgid "Edit group" +msgstr "Gruppe bearbeiten" + +#: participant/templates/participant/group_edit.html:10 +#: participant/templates/participant/group_edit.html:19 +#: participant/templates/participant/group_overview.html:11 +msgid "New group" +msgstr "Neue Gruppe" + +#: participant/templates/participant/group_overview.html:12 +msgid "Back to participants overview" +msgstr "Zurück zur Teilnehmer/innen-Übersicht" + +#: participant/templates/participant/group_widget.html:21 msgid "No groups available." msgstr "Keine Gruppen vorhanden." +#: participant/templates/participant/import.html:5 #: participant/templates/participant/import.html:9 +#: participant/templates/participant/overview.html:22 +msgid "Import participants" +msgstr "Teilnehmer/innen importieren" + +#: participant/templates/participant/import.html:15 msgid "Select a CSV file to import participants!" msgstr "Wählen Sie eine CSV-Datei zum Importieren von Teilnehmer/innen aus!" -#: participant/templates/participant/import.html:12 +#: participant/templates/participant/import.html:17 +msgid "Required comma separated values" +msgstr "Erforderliche kommaseparierte Werte" + +#: participant/templates/participant/import.html:18 msgid "" "first_name, last_name, gender, structure level, type, committee, comment" msgstr "Vorname, Nachname, Geschlecht, Gliederungsebene, Typ, Amt, Kommentar" -#: participant/templates/participant/login.html:8 -#: participant/templates/participant/login.html:16 -#: participant/templates/participant/login.html:58 templates/base.html:32 -msgid "Login" -msgstr "Anmelden" +#: participant/templates/participant/import.html:20 +msgid "Required CSV file encoding: UTF-8 (Unicode)." +msgstr "Erforderliches CSV-Datei-Encoding: UTF-8 (Unicode)." -#: participant/templates/participant/login.html:21 -#: participant/templates/participant/login.html:34 templates/base.html:57 -#: templates/base.html.py:64 -msgid "Close this notification" -msgstr "Meldung ausblenden" +#: participant/templates/participant/import.html:23 +msgid "A CSV example file is available in OpenSlides Wiki." +msgstr "Eine CSV-Beispiel-Datei gibt es im OpenSlides Wiki." -#: participant/templates/participant/login.html:27 +#: participant/templates/participant/import.html:30 +#: participant/templates/participant/overview.html:22 +msgid "Import" +msgstr "Importieren" + +#: participant/templates/participant/login.html:19 msgid "Your username and password were not accepted. Please try again." msgstr "" "Benutzername und Passwort wurden nicht akzeptiert. Bitte versuchen Sie es " "erneut." -#: participant/templates/participant/login.html:62 +#: participant/templates/participant/login.html:38 +msgid "Username" +msgstr "Benutzername" + +#: participant/templates/participant/login.html:42 +msgid "Password" +msgstr "Passwort" + +#: participant/templates/participant/login.html:47 +#: participant/templates/participant/overview.html:37 templates/base.html:46 +msgid "Login" +msgstr "Anmelden" + +#: participant/templates/participant/login.html:51 msgid "Continue as guest" msgstr "Weiter als Gast" -#: participant/templates/participant/overview.html:27 +#: participant/templates/participant/overview.html:21 +msgid "All groups" +msgstr "Alle Gruppen" + +#: participant/templates/participant/overview.html:33 +msgid "List of participants" +msgstr "Teilnehmerliste" + +#: participant/templates/participant/overview.html:34 +msgid "First time passwords" +msgstr "Erst-Passwörter" + #: participant/templates/participant/overview.html:42 +msgid "Print list of participants as PDF" +msgstr "Teilnehmerliste als PDF drucken" + +#: participant/templates/participant/overview.html:45 +msgid "Print first time passwords as PDF" +msgstr "Erst-Passwörter als PDF drucken" + +#: participant/templates/participant/overview.html:59 +#: participant/templates/participant/overview.html:74 msgid "Not specified" msgstr "Nicht angegeben" -#: participant/templates/participant/overview.html:53 projector/models.py:63 +#: participant/templates/participant/overview.html:85 projector/models.py:65 msgid "Active" msgstr "Aktiv" -#: participant/templates/participant/overview.html:54 +#: participant/templates/participant/overview.html:86 msgid "Inactive" msgstr "Inaktiv" -#: participant/templates/participant/overview.html:60 +#: participant/templates/participant/overview.html:93 msgid "participant" msgid_plural "participants" msgstr[0] "Teilnehmer/in" msgstr[1] "Teilnehmer/innen" -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:95 msgid "of" msgstr "von" -#: participant/templates/participant/overview.html:73 -#: participant/templates/participant/user_detail.html:49 +#: participant/templates/participant/overview.html:107 +#: participant/templates/participant/user_detail.html:53 msgid "Last Login" msgstr "Letzer Login" -#: participant/templates/participant/overview.html:102 -msgid "Change status to inactive" -msgstr "Status ändern auf inaktiv" +#: participant/templates/participant/overview.html:143 +msgid "Change status (active/inactive)" +msgstr "Status ändern (aktiv/inaktiv)" -#: participant/templates/participant/overview.html:105 -msgid "Change status to active" -msgstr "Status ändern auf aktiv" - -#: participant/templates/participant/overview.html:115 -#: participant/templates/participant/user_widget.html:22 +#: participant/templates/participant/overview.html:153 +#: participant/templates/participant/user_widget.html:19 msgid "No participants available." msgstr "Keine Teilnehmer/innen vorhanden." #: participant/templates/participant/password_change.html:5 -#: participant/templates/participant/password_change.html:11 -#: participant/templates/participant/password_change.html:16 -#: participant/templates/participant/settings.html:11 +#: participant/templates/participant/password_change.html:8 msgid "Password Settings" msgstr "Passwort-Einstellungen" -#: participant/templates/participant/password_change.html:8 -#: participant/templates/participant/settings.html:8 templates/base.html:29 -msgid "User Settings" -msgstr "Benutzereinstellungen" - -#: participant/templates/participant/password_change.html:10 -#: participant/templates/participant/settings.html:5 -#: participant/templates/participant/settings.html:10 -#: participant/templates/participant/settings.html:16 -msgid "Personal Settings" -msgstr "Persönliche Einstellungen" - #: participant/templates/participant/personal_info_widget.html:5 msgid "I submitted the following motions:" msgstr "Ich habe folgende Anträge gestellt:" @@ -2394,11 +1923,16 @@ msgstr "Ich unterstütze folgende Anträge:" msgid "I am candidate for the following elections:" msgstr "Ich bin Kandidat/in bei folgenden Wahlen:" -#: participant/templates/participant/user_detail.html:19 +#: participant/templates/participant/settings.html:5 +#: participant/templates/participant/settings.html:8 templates/base.html:40 +msgid "Edit profile" +msgstr "Profil bearbeiten" + +#: participant/templates/participant/user_detail.html:23 msgid "The participant is not member of any group." msgstr "Teilnehmer/in ist kein Mitglied einer Gruppe." -#: participant/templates/participant/user_detail.html:53 +#: participant/templates/participant/user_detail.html:57 msgid "The participant has not logged in yet." msgstr "Teilnehmer/in hat sich noch nicht angemeldet." @@ -2414,15 +1948,15 @@ msgstr "Ungültige Stimmen" msgid "votes" msgstr "Stimmen" -#: projector/models.py:50 +#: projector/models.py:52 msgid "Can manage the projector" msgstr "Darf den Projektor steuern" -#: projector/models.py:51 +#: projector/models.py:53 msgid "Can see the projector" msgstr "Darf den Projektor sehen" -#: projector/models.py:52 +#: projector/models.py:54 msgid "Can see the dashboard" msgstr "Darf das Dashboard sehen" @@ -2430,89 +1964,76 @@ msgstr "Darf das Dashboard sehen" msgid "Errors in the form" msgstr "Fehler im Formular" -#: projector/views.py:375 projector/templates/projector/base_projector.html:7 -#: projector/templates/projector/base_projector.html:12 -#: projector/templates/projector/dashboard.html:17 +#: projector/views.py:373 projector/templates/projector/dashboard.html:18 msgid "Dashboard" msgstr "Dashboard" -#: projector/views.py:402 +#: projector/views.py:401 msgid "Projector live view" msgstr "Projektor-Live-Ansicht" -#: projector/views.py:428 +#: projector/views.py:427 msgid "Overlays" msgstr "Einblendungen" -#: projector/views.py:440 +#: projector/views.py:439 msgid "Custom Slides" msgstr "Benutzerdefinierte Folien" -#: projector/templates/projector/base_projector.html:15 -msgid "Overview" -msgstr "Übersicht" - -#: projector/templates/projector/base_projector.html:18 -#: projector/templates/projector/select_widgets.html:5 -#: projector/templates/projector/select_widgets.html:8 -msgid "Select widgets" -msgstr "Widgets auswählen" - -#: projector/templates/projector/base_projector.html:22 -msgid "Projector view" -msgstr "Projektor-Ansicht" - -#: projector/templates/projector/control_countdown.html:6 +#: projector/templates/projector/control_countdown.html:7 msgctxt "seconds" msgid "s" msgstr "s" -#: projector/templates/projector/control_countdown.html:7 -msgid "Save as default" -msgstr "Als Voreinstellung speichern" +#: projector/templates/projector/control_countdown.html:9 +msgid "Save time as default" +msgstr "Zeit als Voreinstellung speichern" -#: projector/templates/projector/control_countdown.html:10 -#: projector/templates/projector/control_countdown.html:11 +#: projector/templates/projector/control_countdown.html:12 msgid "Reset countdown" msgstr "Countdown zurücksetzen" -#: projector/templates/projector/control_countdown.html:13 +#: projector/templates/projector/control_countdown.html:15 msgid "Start countdown" msgstr "Countdown starten" -#: projector/templates/projector/control_countdown.html:16 +#: projector/templates/projector/control_countdown.html:18 msgid "Stop countdown" msgstr "Countdown stoppen" -#: projector/templates/projector/control_overlay_message.html:11 +#: projector/templates/projector/control_overlay_message.html:10 msgid "Clean message" msgstr "Message leeren" -#: projector/templates/projector/custom_slide_widget.html:14 +#: projector/templates/projector/custom_slide_widget.html:12 msgid "Welcome Page" msgstr "Willkommensseite" -#: projector/templates/projector/custom_slide_widget.html:41 -msgid "New slide" -msgstr "Neue Folie" +#: projector/templates/projector/dashboard.html:20 +msgid "Manage widgets" +msgstr "Widgets verwalten" -#: projector/templates/projector/live_view_widget.html:10 +#: projector/templates/projector/dashboard.html:20 +msgid "Widgets" +msgstr "Widgets" + +#: projector/templates/projector/live_view_widget.html:8 msgid "Zoom in" msgstr "Vergrößern" -#: projector/templates/projector/live_view_widget.html:13 +#: projector/templates/projector/live_view_widget.html:11 msgid "Zoom out" msgstr "Verkleinern" -#: projector/templates/projector/live_view_widget.html:18 +#: projector/templates/projector/live_view_widget.html:16 msgid "Scroll text up" msgstr "Text nach oben scrollen" -#: projector/templates/projector/live_view_widget.html:21 +#: projector/templates/projector/live_view_widget.html:19 msgid "Scroll text down" msgstr "Text nach unten scrollen" -#: projector/templates/projector/live_view_widget.html:26 +#: projector/templates/projector/live_view_widget.html:24 msgid "Reset projector view" msgstr "Projektor-Ansicht zurücksetzen" @@ -2521,7 +2042,20 @@ msgstr "Projektor-Ansicht zurücksetzen" msgid "Custom slide" msgstr "Benutzerdefinierte Folie" -#: projector/templates/projector/select_widgets.html:17 +#: projector/templates/projector/overlay_widget.html:22 +msgid "Countdown for speaking time" +msgstr "Countdown zur Redezeitbegrenzung" + +#: projector/templates/projector/overlay_widget.html:26 +msgid "Message" +msgstr "Mitteilung" + +#: projector/templates/projector/select_widgets.html:5 +#: projector/templates/projector/select_widgets.html:8 +msgid "Select widgets" +msgstr "Widgets auswählen" + +#: projector/templates/projector/select_widgets.html:23 msgid "No widgets available" msgstr "Keine Widgets vorhanden." @@ -2533,19 +2067,19 @@ msgstr "Seite nicht gefunden." msgid "Server Error" msgstr "Serverfehler" -#: templates/base.html:21 +#: templates/base.html:29 msgid "Home" msgstr "Startseite" -#: templates/base.html:27 +#: templates/base.html:41 +msgid "Change password" +msgstr "Passwort ändern" + +#: templates/base.html:43 msgid "Logout" msgstr "Abmelden" -#: templates/base.html:30 -msgid "Welcome" -msgstr "Willkommen" - -#: templates/base.html:79 +#: templates/base.html:100 msgid "" "Get professional " "support for OpenSlides." @@ -2563,7 +2097,7 @@ msgstr "Stand: %s" msgid "Page %s" msgstr "Seite %s" -#: utils/utils.py:59 utils/views.py:283 +#: utils/utils.py:59 utils/views.py:313 #, python-format msgid "Do you really want to delete %s?" msgstr "Soll %s wirklich gelöscht werden?" @@ -2572,33 +2106,412 @@ msgstr "Soll %s wirklich gelöscht werden?" msgid "Sorry, you have no rights to see this page." msgstr "Bedaure, Sie haben keine Berechtigung diese Seite zu sehen." -#: utils/views.py:102 +#: utils/views.py:144 msgid "Are you sure?" msgstr "Sind Sie sicher?" -#: utils/views.py:103 +#: utils/views.py:145 msgid "Thank you for your answer" msgstr "Danke für Ihre Antwort" -#: utils/views.py:240 +#: utils/views.py:285 #, python-format msgid "%s was successfully modified." msgstr "%s wurde erfolgreich bearbeitet." -#: utils/views.py:271 +#: utils/views.py:295 #, python-format msgid "%s was successfully created." msgstr "%s wurde erfolgreich angelegt." -#: utils/views.py:289 +#: utils/views.py:319 #, python-format msgid "%s was successfully deleted." msgstr "%s wurde erfolgreich gelöscht." -#: utils/views.py:304 +#: utils/views.py:329 msgid "undefined-filename" msgstr "undefinierter-dateiname" #: utils/jsonfield/fields.py:22 msgid "Enter valid JSON" msgstr "Gebe valides JSON ein" + +#~ msgid "Item %s was successfully modified." +#~ msgstr "Eintrag %s wurde erfolgreich bearbeitet." + +#~ msgid "Item %s was successfully created." +#~ msgstr "Eintrag %s wurde erfolgreich angelegt." + +#~ msgid "All items" +#~ msgstr "Alle Einträge" + +#~ msgid "Agenda as PDF" +#~ msgstr "Tagesordnung als PDF" + +#~ msgid "View item" +#~ msgstr "Eintrag anzeigen" + +#~ msgid "Show item" +#~ msgstr "Eintrag projizieren" + +#~ msgid "Activate item" +#~ msgstr "Eintrag projizieren" + +#~ msgid "Trivial change" +#~ msgstr "Triviale Änderung" + +#~ msgid "Import motions with status \"authorized\"" +#~ msgstr "Anträge als \"Zugelassen\" importieren" + +#~ msgid "Set the initial status for each motion to \"authorized\"" +#~ msgstr "Setzt den initialen Status für jeden Antrag auf \"zugelassen\"" + +#~ msgid "Allow trivial changes" +#~ msgstr "Triviale Änderungen erlauben" + +#~ msgid "Warning: Trivial changes undermine the motions autorisation system." +#~ msgstr "" +#~ "Warnung: Triviale Änderungen unterlaufen das Zulassungssystem von " +#~ "Anträgen." + +#~ msgid "Version %d authorized" +#~ msgstr "Version %d zugelassen" + +#~ msgctxt "Rejected means not authorized" +#~ msgid "Version %d rejected" +#~ msgstr "Version %d verworfen" + +#~ msgid "Searching for supporters." +#~ msgstr "Auf Unterstützersuche." + +#~ msgid "Not yet authorized." +#~ msgstr "Noch nicht zugelassen." + +#~ msgid "Not yet authorized changes." +#~ msgstr "Noch nicht zugelassene Änderungen." + +#~ msgid "" +#~ "Trivial changes to version %(version)d; changed fields: %(changed_fields)s" +#~ msgstr "" +#~ "Triviale Änderung an Version %(version)d; Geänderte Felder: " +#~ "%(changed_fields)s" + +#~ msgid "Version %s created" +#~ msgstr "Version %s erstellt" + +#~ msgid "Supporters removed" +#~ msgstr "Unterstützer/innen gelöscht" + +#~ msgid "Status reseted to: %s" +#~ msgstr "Status zurückgesetzt auf: %s" + +#~ msgid "Number set: %s" +#~ msgstr "Nummer gesetzt: %s" + +#~ msgid "Version %s authorized" +#~ msgstr "Version %s zugelassen" + +#~ msgid "Version %s not authorized" +#~ msgstr "Version %s nicht zugelassen" + +#~ msgid "The motion status is already '%s.'" +#~ msgstr "Der Antragsstatus ist bereits '%s'." + +#~ msgid "" +#~ "The motion status is: '%(currentstatus)s'. You can not set the status to " +#~ "'%(newstatus)s'." +#~ msgstr "" +#~ "Der Antragsstatus ist: '%(currentstatus)s'. Sie können den Status nicht " +#~ "auf '%(newstatus)s' setzen." + +#~ msgid "Status modified" +#~ msgstr "Status geändert" + +#~ msgid "by" +#~ msgstr "von" + +#~ msgid "You have not the necessary rights to create or edit motions." +#~ msgstr "" +#~ "Sie haben nicht die nötigen Rechte, um Anträge zu erstellen oder zu " +#~ "bearbeiten." + +#~ msgid "You can not edit this motion." +#~ msgstr "Sie dürfen diesen Antrag nicht bearbeiten." + +#~ msgid "New motion was successfully created." +#~ msgstr "Neuer Antrag wurde erfolgreich angelegt." + +#~ msgid "Motion was successfully modified." +#~ msgstr "Antrag wurde erfolgreich geändert." + +#~ msgid "" +#~ "Attention: Do you really want to edit this motion? The supporters will " +#~ "not be removed automatically because you can manage motions. " +#~ "Please check if the supports are valid after your changing!" +#~ msgstr "" +#~ "Achtung: Wollen Sie den Antrag wirklich ändern? Die Unterstützer/innen " +#~ "werden nicht automatisch entfernt, da Sie Anträge verwalten " +#~ "dürfen. Prüfen Sie, ob die Unterstützungen noch gültig sind." + +#~ msgid "" +#~ "Attention: Do you really want to edit this motion? All %s " +#~ "supporters will be removed! Try to convince the supporters again." +#~ msgstr "" +#~ "Wollen Sie den Antrag wirklich ändern? Alle %s Unterstützer/innen " +#~ "werden dann automatisch entfernt. Versuchen Sie diese erneut zu gewinnen." + +#~ msgid "Motion number was successfully set." +#~ msgstr "Antragsnummer wurde erfolgreich gesetzt." + +#~ msgid "Motion was successfully authorized." +#~ msgstr "Antrag wurde erfolgreich zugelassen." + +#~ msgid "Motion was successfully rejected." +#~ msgstr "Antrag wurde erfolgreich verworfen." + +#~ msgid "Motion status was reset." +#~ msgstr "Antragsstatus wurde zurückgesetzt." + +#~ msgid "Poll was successfully deleted." +#~ msgstr "Abstimmung wurde erfolgreich gelöscht." + +#~ msgid "the %s. poll" +#~ msgstr "die %s. Abstimmung" + +#~ msgid "You can not delete motion %s." +#~ msgstr "Sie können Antrag %s nicht löschen." + +#~ msgid "Motion %s was successfully deleted." +#~ msgstr "Antrag %s wurde erfolgreich gelöscht." + +#~ msgid "Invalid request" +#~ msgstr "Ungültige Anfrage" + +#~ msgid "Version %s accepted." +#~ msgstr "Version %s akzeptiert." + +#~ msgid "Do you really want to authorize version %s?" +#~ msgstr "Soll Version %s wirklich zugelassen werden?" + +#~ msgid "Version %s rejected." +#~ msgstr "Version %s zurückgewiesen." + +#~ msgid "ERROR by rejecting the version." +#~ msgstr "FEHLER beim Zurückweisen der Version." + +#~ msgid "Ignoring line %d because the assigned group may not act as a person." +#~ msgstr "" +#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert da die verwendete " +#~ "Gruppe nicht als Person auftreten darf." + +#~ msgid "Created by motion import." +#~ msgstr "Erstellt durch Antragsimport." + +#~ msgid "" +#~ "Ignoring line %d because it contains an incomplete first / last name pair." +#~ msgstr "" +#~ "Fehlerhafte Zeile %d der Quelldatei wurde ignoriert, da Vor- bzw. " +#~ "Nachname Leerstrings enthalten." + +#~ msgid "%d motion was successfully imported." +#~ msgid_plural "%d motions were successfully imported." +#~ msgstr[0] "%d Antrag wurde erfolgreich importiert." +#~ msgstr[1] "%d Anträge wurden erfolgreich importiert." + +#~ msgid "%d motion was successfully modified." +#~ msgid_plural "%d motions were successfully modified." +#~ msgstr[0] "%d Antrag wurde erfolgreich geändert." +#~ msgstr[1] "%d Anträge wurden erfolgreich geändert." + +#~ msgid "%d new user was added." +#~ msgid_plural "%d new users were added." +#~ msgstr[0] "%d neuer Nutzer wurde erstellt." +#~ msgstr[1] "%d neue Nutzer wurden erstellt." + +#~ msgid "%d new group was added." +#~ msgid_plural "%d new groups were added." +#~ msgstr[0] "%d neue Gruppe wurde erstellt." +#~ msgstr[1] "%d neue Gruppen wurden erstellt." + +#~ msgid "%d group assigned to motions." +#~ msgid_plural "%d groups assigned to motions." +#~ msgstr[0] "%d Gruppe wurde zugewiesen." +#~ msgstr[1] "%d Gruppen wurden zugewiesen." + +#~ msgid "" +#~ "Attention: Existing motions will be modified if you import new motions " +#~ "with the same number." +#~ msgstr "" +#~ "Achtung: Existierende Anträge werden geändert wenn Sie neue Anträge mit " +#~ "identischer Nummer importieren." + +#~ msgid "" +#~ "Attention: Importing an motions without a number multiple times will " +#~ "create duplicates." +#~ msgstr "" +#~ "Achtung: Bei mehrfachem Import eines Antrags ohne Nummer können Duplikate " +#~ "entstehen." + +#~ msgid "Poll" +#~ msgstr "Abstimmung" + +#~ msgid "Motion No. %s" +#~ msgstr "Antrag Nr. %s" + +#~ msgid "%d. Vote" +#~ msgstr "%d. Abstimmung" + +#~ msgid "Edit motion" +#~ msgstr "Antrag bearbeiten" + +#~ msgid "New motion" +#~ msgstr "Neuer Antrag" + +#~ msgid "Import motions" +#~ msgstr "Anträge importieren" + +#~ msgid "Select a CSV file to import motions!" +#~ msgstr "Wählen Sie eine CSV-Datei zum Importieren von Anträgen aus!" + +#~ msgid "number, title, text, reason, first_name, last_name, is_group" +#~ msgstr "Nummer, Titel, Text, Begründung, Vorname, Nachname, Gruppenantrag" + +#~ msgid "" +#~ "number, reason and is_group are " +#~ "optional and may be empty" +#~ msgstr "" +#~ "Nummer, Begründung und Gruppenantrag sind optional und können auch leer sein" + +#~ msgid "Print all motions as PDF" +#~ msgstr "Alle Anträge als PDF drucken" + +#~ msgid "Need supporters" +#~ msgstr "Benötigt Unterstützer/innen" + +#~ msgid "Without number" +#~ msgstr "Ohne Nummer" + +#~ msgid "Not yet authorized" +#~ msgstr "Noch nicht zugelassen" + +#~ msgid "Authorized" +#~ msgstr "Zugelassen" + +#~ msgid "Withdrawen (by submitter)" +#~ msgstr "Zurückgezogen (durch Antragsteller/in)" + +#~ msgctxt "number of motions" +#~ msgid "motion" +#~ msgid_plural "motions" +#~ msgstr[0] "Antrag" +#~ msgstr[1] "Anträge" + +#~ msgid "#" +#~ msgstr "#" + +#~ msgid "Motion title" +#~ msgstr "Antragstitel" + +#~ msgid "Number of supporters" +#~ msgstr "Anzahl der Unterstützer/innen" + +#~ msgid "Creation Time" +#~ msgstr "Erstellungszeit" + +#~ msgid "Print motion as PDF" +#~ msgstr "Antrag als PDF drucken" + +#~ msgid "Back to motion" +#~ msgstr "Zurück zum Antrag" + +#~ msgid "Show motion" +#~ msgstr "Antrag anzeigen" + +#~ msgid "Print this motion as PDF" +#~ msgstr "Diesen Antrag als PDF drucken" + +#~ msgid "Delete motion" +#~ msgstr "Antrag löschen" + +#~ msgid "This is not the newest version." +#~ msgstr "Dies ist nicht die neuste Version." + +#~ msgid "Go to version" +#~ msgstr "Gehe zu Version" + +#~ msgid "This is not the authorized version." +#~ msgstr "Dies ist nicht die zugelassene Version." + +#~ msgid "Version History" +#~ msgstr "Versionshistorie" + +#~ msgid "This version is authorized" +#~ msgstr "Diese Version wurde zugelassen" + +#~ msgid "Permit this version" +#~ msgstr "Diese Version zulassen" + +#~ msgid "Reject this version" +#~ msgstr "Diese Version verwerfen" + +#~ msgid "This version is rejected" +#~ msgstr "Diese Version wurde verworfen" + +#~ msgid "unchanged" +#~ msgstr "unverändert" + +#~ msgid "Show log" +#~ msgstr "Log anzeigen" + +#~ msgid "No results" +#~ msgstr "Keine Ergebnisse" + +#~ msgid "Withdraw motion" +#~ msgstr "Antrag zurückziehen" + +#~ msgid "Unsupport motion" +#~ msgstr "Antrag nicht unterstützen" + +#~ msgid "Support" +#~ msgstr "Unterstützen" + +#~ msgid "minimum required supporters" +#~ msgstr "minimal erforderliche Unterstützer/innen" + +#~ msgid "Manage motion" +#~ msgstr "Antrag verwalten" + +#~ msgid "Formal validation" +#~ msgstr "Formale Gültigkeitsprüfung" + +#~ msgid "Publish" +#~ msgstr "Veröffentlichen" + +#~ msgid "Permit" +#~ msgstr "Zulassen" + +#~ msgid "Not permit" +#~ msgstr "Nicht zulassen" + +#~ msgid "Set number" +#~ msgstr "Setze Nummer" + +#~ msgid "Result after vote" +#~ msgstr "Ergebnis nach der Abstimmung" + +#~ msgid "Withdrawed by Submitter" +#~ msgstr "Zurückgezogen durch Antragsteller/in" + +#~ msgid "For Administration only:" +#~ msgstr "Nur zur Administration:" + +#~ msgid "Reset" +#~ msgstr "Zurücksetzen" + +#~ msgid "My motions and elections" +#~ msgstr "Meine Anträge und Wahlen" + +#~ msgid "Countdown" +#~ msgstr "Countdown" diff --git a/openslides/locale/fr/LC_MESSAGES/django.mo b/openslides/locale/fr/LC_MESSAGES/django.mo index 22787ea37..11e7cf50f 100644 Binary files a/openslides/locale/fr/LC_MESSAGES/django.mo and b/openslides/locale/fr/LC_MESSAGES/django.mo differ diff --git a/openslides/locale/fr/LC_MESSAGES/django.po b/openslides/locale/fr/LC_MESSAGES/django.po index f3a54f26e..eb469e2e7 100644 --- a/openslides/locale/fr/LC_MESSAGES/django.po +++ b/openslides/locale/fr/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: OpenSlides\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-12-09 14:17+0100\n" +"POT-Creation-Date: 2013-02-05 23:06+0100\n" "PO-Revision-Date: 2012-12-09 12:20+0000\n" "Last-Translator: moosline \n" "Language-Team: French (http://www.transifex.com/projects/p/openslides/" @@ -37,20 +37,20 @@ msgid "Parent item" msgstr "Elément parent" #: agenda/models.py:34 config/forms.py:59 motion/forms.py:22 -#: motion/models.py:539 motion/templates/motion/view.html:246 +#: motion/models.py:539 motion/templates/motion/view.html:95 #: projector/models.py:29 msgid "Title" msgstr "Titre" #: agenda/models.py:35 motion/forms.py:23 motion/models.py:540 -#: motion/templates/motion/view.html:247 projector/models.py:30 +#: motion/templates/motion/view.html:96 projector/models.py:30 msgid "Text" msgstr "Texte" -#: agenda/models.py:36 agenda/templates/agenda/overview.html:65 -#: agenda/templates/agenda/view.html:13 participant/models.py:60 -#: participant/templates/participant/overview.html:72 -#: participant/templates/participant/user_detail.html:45 +#: agenda/models.py:36 agenda/templates/agenda/overview.html:76 +#: agenda/templates/agenda/view.html:37 participant/models.py:60 +#: participant/templates/participant/overview.html:106 +#: participant/templates/participant/user_detail.html:49 msgid "Comment" msgstr "Commentaire" @@ -58,7 +58,7 @@ msgstr "Commentaire" msgid "Closed" msgstr "Fermé" -#: agenda/models.py:38 agenda/templates/agenda/overview.html:71 +#: agenda/models.py:38 agenda/templates/agenda/overview.html:82 #: projector/models.py:31 msgid "Weight" msgstr "Pondération" @@ -72,11 +72,11 @@ msgid "Can manage agenda" msgstr "Peut gérer l'ordre du jour" #: agenda/models.py:180 agenda/slides.py:20 agenda/views.py:191 -#: agenda/views.py:192 agenda/views.py:212 agenda/views.py:226 -#: agenda/templates/agenda/base_agenda.html:10 +#: agenda/views.py:192 agenda/views.py:212 agenda/views.py:227 +#: agenda/templates/agenda/config.html:8 #: agenda/templates/agenda/overview.html:8 -#: agenda/templates/agenda/overview.html:52 -#: agenda/templates/agenda/overview.html:77 +#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:88 #: agenda/templates/projector/AgendaSummary.html:6 #: agenda/templates/projector/AgendaSummary.html:10 msgid "Agenda" @@ -114,215 +114,226 @@ msgstr "Elément %s et ses sous-éléments ont été créés avec succès." msgid "Item %s was successfully deleted." msgstr "Elément %s a été supprimé avec succès." -#: agenda/templates/agenda/base_agenda.html:12 -msgid "All items" -msgstr "Tous les éléments" - -#: agenda/templates/agenda/base_agenda.html:14 -#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:18 -msgid "New item" -msgstr "Nouvel élément" - -#: agenda/templates/agenda/base_agenda.html:16 -msgid "Agenda as PDF" -msgstr "Ordre du jour en PDF" - -#: agenda/templates/agenda/base_agenda.html:26 -msgid "View item" -msgstr "Afficher l'élément" - -#: agenda/templates/agenda/base_agenda.html:31 -#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:16 -#: agenda/templates/agenda/item_row.html:40 -msgid "Edit item" -msgstr "Modifier l'élément" - -#: agenda/templates/agenda/base_agenda.html:33 -#: agenda/templates/agenda/item_row.html:41 -msgid "Delete item" -msgstr "Supprimer l'élément" - -#: agenda/templates/agenda/base_agenda.html:38 -msgid "Show item" -msgstr "Afficher l'élément" - -#: agenda/templates/agenda/config.html:5 agenda/templates/agenda/config.html:8 +#: agenda/templates/agenda/config.html:5 msgid "Agenda settings" msgstr "Paramètres de l'ordre du jour" -#: agenda/templates/agenda/config.html:13 agenda/templates/agenda/edit.html:24 -#: assignment/templates/assignment/config.html:13 -#: assignment/templates/assignment/edit.html:26 -#: assignment/templates/assignment/poll_view.html:66 -#: config/templates/config/general.html:56 -#: motion/templates/motion/config.html:13 motion/templates/motion/edit.html:26 -#: motion/templates/motion/poll_view.html:52 -#: participant/templates/participant/config.html:13 -#: participant/templates/participant/edit.html:31 -#: participant/templates/participant/group_edit.html:25 -#: participant/templates/participant/password_change.html:22 -#: participant/templates/participant/settings.html:22 -#: projector/templates/projector/new.html:13 -#: projector/templates/projector/select_widgets.html:22 +#: agenda/templates/agenda/config.html:8 +#: assignment/templates/assignment/config.html:9 config/views.py:110 +#: config/templates/config/general.html:9 +#: motion/templates/motion/config.html:9 +#: participant/templates/participant/config.html:9 +msgid "Configuration" +msgstr "Configuration" + +#: agenda/templates/agenda/config.html:15 +#: assignment/templates/assignment/poll_view.html:80 +#: motion/templates/motion/poll_view.html:65 +#: projector/templates/projector/select_widgets.html:28 +#: templates/formbuttons_save.html:4 templates/formbuttons_saveapply.html:4 msgid "Save" msgstr "Enregistrer" -#: agenda/templates/agenda/config.html:17 agenda/templates/agenda/edit.html:31 -#: assignment/templates/assignment/config.html:17 -#: assignment/templates/assignment/edit.html:33 -#: assignment/templates/assignment/poll_view.html:73 -#: config/templates/config/general.html:60 -#: motion/templates/motion/config.html:17 motion/templates/motion/edit.html:33 -#: motion/templates/motion/import.html:30 -#: motion/templates/motion/poll_view.html:59 -#: participant/templates/participant/config.html:17 -#: participant/templates/participant/edit.html:38 -#: participant/templates/participant/group_edit.html:32 -#: participant/templates/participant/import.html:28 -#: participant/templates/participant/password_change.html:26 -#: participant/templates/participant/settings.html:26 -#: projector/templates/projector/new.html:20 +#: agenda/templates/agenda/config.html:19 agenda/templates/agenda/edit.html:30 +#: assignment/templates/assignment/config.html:18 +#: assignment/templates/assignment/edit.html:31 +#: assignment/templates/assignment/poll_view.html:86 +#: config/templates/config/general.html:70 +#: motion/templates/motion/config.html:18 motion/templates/motion/edit.html:42 +#: motion/templates/motion/import.html:44 +#: motion/templates/motion/poll_view.html:71 +#: participant/templates/participant/config.html:18 +#: participant/templates/participant/edit.html:36 +#: participant/templates/participant/group_edit.html:31 +#: participant/templates/participant/import.html:33 msgid "Cancel" msgstr "Annuler" -#: agenda/templates/agenda/edit.html:27 -#: assignment/templates/assignment/edit.html:29 -#: assignment/templates/assignment/poll_view.html:69 -#: assignment/templates/assignment/view.html:92 -#: motion/templates/motion/edit.html:29 -#: motion/templates/motion/poll_view.html:55 -#: participant/templates/participant/edit.html:34 -#: participant/templates/participant/group_edit.html:28 -#: projector/templates/projector/control_overlay_message.html:8 -#: projector/templates/projector/new.html:16 -msgid "Apply" -msgstr "Appliquer" +#: agenda/templates/agenda/edit.html:8 agenda/templates/agenda/edit.html:17 +#: agenda/templates/agenda/view.html:20 +msgid "Edit item" +msgstr "Modifier l'élément" -#: agenda/templates/agenda/edit.html:35 -#: assignment/templates/assignment/edit.html:37 -#: motion/templates/motion/edit.html:37 motion/templates/motion/import.html:34 -#: participant/templates/participant/edit.html:42 -#: participant/templates/participant/group_edit.html:36 -#: participant/templates/participant/import.html:32 +#: agenda/templates/agenda/edit.html:10 agenda/templates/agenda/edit.html:19 +#: agenda/templates/agenda/overview.html:58 +msgid "New item" +msgstr "Nouvel élément" + +#: agenda/templates/agenda/edit.html:22 agenda/templates/agenda/view.html:12 +#: assignment/templates/assignment/edit.html:22 +#: assignment/templates/assignment/view.html:20 +#: motion/templates/motion/edit.html:22 motion/templates/motion/import.html:10 +#: motion/templates/motion/view.html:30 +#: participant/templates/participant/edit.html:22 +#: participant/templates/participant/group_detail.html:12 +#: participant/templates/participant/group_edit.html:22 +#: participant/templates/participant/import.html:11 +#: participant/templates/participant/user_detail.html:12 +#: projector/templates/projector/new.html:11 +#: projector/templates/projector/select_widgets.html:10 +msgid "Back to overview" +msgstr "" + +#: agenda/templates/agenda/edit.html:33 +#: assignment/templates/assignment/config.html:21 +#: assignment/templates/assignment/edit.html:34 +#: config/templates/config/general.html:73 +#: motion/templates/motion/config.html:21 motion/templates/motion/edit.html:45 +#: motion/templates/motion/import.html:47 +#: participant/templates/participant/config.html:21 +#: participant/templates/participant/edit.html:39 +#: participant/templates/participant/group_edit.html:34 +#: participant/templates/participant/import.html:36 +#: projector/templates/projector/new.html:19 msgid "required" msgstr "requis" -#: agenda/templates/agenda/item_row.html:8 -msgid "Mark item as done" -msgstr "Marquez l'élément comme terminé" - -#: agenda/templates/agenda/item_row.html:12 -msgid "Item closed" -msgstr "Elément fermé" +#: agenda/templates/agenda/item_row.html:7 +#, fuzzy +msgid "Change status (open/closed)" +msgstr "Changer le statut sur inactif" #: agenda/templates/agenda/item_row.html:35 -#: agenda/templates/agenda/overview.html:86 -msgid "Activate item" -msgstr "Activez l'élément" +#: agenda/templates/agenda/overview.html:97 +#: agenda/templates/agenda/view.html:26 agenda/templates/agenda/widget.html:6 +#: agenda/templates/agenda/widget.html:19 +#: assignment/templates/assignment/overview.html:54 +#: assignment/templates/assignment/widget.html:7 +#: motion/templates/motion/overview.html:82 +#: motion/templates/motion/widget.html:7 +#: participant/templates/participant/group_overview.html:29 +#: participant/templates/participant/group_widget.html:8 +#: participant/templates/participant/overview.html:128 +#: participant/templates/participant/user_widget.html:7 +#: projector/templates/projector/custom_slide_widget.html:6 +#: projector/templates/projector/custom_slide_widget.html:19 +#, fuzzy +msgid "Show" +msgstr "Afficher l'élément" -#: agenda/templates/agenda/item_row.html:44 -#: agenda/templates/agenda/widget.html:35 -msgid "Activate summary for this item" +#: agenda/templates/agenda/item_row.html:40 +#: agenda/templates/agenda/widget.html:22 +#: assignment/templates/assignment/overview.html:59 +#: assignment/templates/assignment/view.html:172 +#: assignment/templates/assignment/widget.html:10 +#: motion/templates/motion/overview.html:87 +#: motion/templates/motion/widget.html:10 +#: participant/templates/participant/group_overview.html:33 +#: participant/templates/participant/group_widget.html:11 +#: participant/templates/participant/overview.html:132 +#: participant/templates/participant/user_widget.html:10 +#: projector/templates/projector/custom_slide_widget.html:26 +msgid "Edit" +msgstr "Modifier" + +#: agenda/templates/agenda/item_row.html:43 +#: assignment/templates/assignment/overview.html:62 +#: assignment/templates/assignment/view.html:173 +#: motion/templates/motion/overview.html:91 +#: participant/templates/participant/group_overview.html:37 +#: participant/templates/participant/overview.html:136 +#: projector/templates/projector/custom_slide_widget.html:23 +msgid "Delete" +msgstr "Supprimer" + +#: agenda/templates/agenda/item_row.html:47 +#: agenda/templates/agenda/widget.html:29 +#, fuzzy +msgid "Show summary for this item" msgstr "Activez le résumé pour cet élément" -#: agenda/templates/agenda/overview.html:45 +#: agenda/templates/agenda/overview.html:47 msgid "Do you want to save the changed order of agenda items?" msgstr "Voulez-vous enregistrer les modifications de l'ordre du jour?" -#: agenda/templates/agenda/overview.html:46 assignment/models.py:291 -#: assignment/views.py:587 assignment/templates/assignment/view.html:168 -#: assignment/templates/assignment/view.html:172 +#: agenda/templates/agenda/overview.html:49 assignment/models.py:291 +#: assignment/views.py:589 assignment/templates/assignment/view.html:206 +#: assignment/templates/assignment/view.html:210 #: assignment/templates/projector/Assignment.html:78 #: assignment/templates/projector/Assignment.html:82 motion/models.py:574 -#: motion/views.py:830 motion/views.py:881 -#: motion/templates/motion/view.html:79 -#: motion/templates/projector/Motion.html:37 utils/utils.py:49 -#: utils/views.py:108 +#: motion/views.py:824 motion/views.py:875 +#: motion/templates/motion/view.html:213 +#: motion/templates/projector/Motion.html:37 utils/utils.py:45 +#: utils/views.py:104 msgid "Yes" msgstr "Oui" -#: agenda/templates/agenda/overview.html:47 assignment/models.py:291 -#: assignment/views.py:588 assignment/templates/assignment/view.html:169 +#: agenda/templates/agenda/overview.html:50 assignment/models.py:291 +#: assignment/views.py:590 assignment/templates/assignment/view.html:207 #: assignment/templates/projector/Assignment.html:79 motion/models.py:574 -#: motion/views.py:830 motion/views.py:882 -#: motion/templates/motion/view.html:80 -#: motion/templates/projector/Motion.html:38 utils/utils.py:49 -#: utils/views.py:108 +#: motion/views.py:824 motion/views.py:876 +#: motion/templates/motion/view.html:214 +#: motion/templates/projector/Motion.html:38 utils/utils.py:45 +#: utils/views.py:104 msgid "No" msgstr "Non" -#: agenda/templates/agenda/overview.html:55 +#: agenda/templates/agenda/overview.html:58 #: assignment/templates/assignment/overview.html:12 -#: motion/templates/motion/overview.html:12 -#: participant/templates/participant/overview.html:22 -msgid "Filter" -msgstr "Filtre" +#: motion/templates/motion/overview.html:13 +#: participant/templates/participant/group_overview.html:11 +#: participant/templates/participant/overview.html:20 +#: projector/templates/projector/custom_slide_widget.html:39 +msgid "New" +msgstr "" -#: agenda/templates/agenda/overview.html:56 +#: agenda/templates/agenda/overview.html:60 +#, fuzzy +msgid "Print agenda as PDF" +msgstr "Ordre du jour en PDF" + +#: agenda/templates/agenda/overview.html:65 msgid "Hide closed items" msgstr "Cachez les élément terminés" -#: agenda/templates/agenda/overview.html:59 +#: agenda/templates/agenda/overview.html:69 msgid "item" msgid_plural "items" msgstr[0] "élément" msgstr[1] "éléments" -#: agenda/templates/agenda/overview.html:62 -msgid "Done" -msgstr "Terminé" - -#: agenda/templates/agenda/overview.html:63 +#: agenda/templates/agenda/overview.html:74 msgid "Item" msgstr "Elément" -#: agenda/templates/agenda/overview.html:68 -#: assignment/templates/assignment/overview.html:28 -#: motion/templates/motion/overview.html:43 -#: participant/templates/participant/group_overview.html:14 -#: participant/templates/participant/overview.html:74 +#: agenda/templates/agenda/overview.html:79 +#: assignment/templates/assignment/overview.html:38 +#: motion/templates/motion/overview.html:59 +#: participant/templates/participant/group_overview.html:19 +#: participant/templates/participant/overview.html:108 msgid "Actions" msgstr "Actions" -#: agenda/templates/agenda/overview.html:102 -#: agenda/templates/agenda/widget.html:46 -#: projector/templates/projector/custom_slide_widget.html:36 +#: agenda/templates/agenda/overview.html:113 +#: agenda/templates/agenda/widget.html:40 +#: projector/templates/projector/custom_slide_widget.html:34 msgid "No items available." msgstr "Pas d'éléments disponibles." -#: agenda/templates/agenda/widget.html:10 -#: agenda/templates/agenda/widget.html:29 -#: assignment/templates/assignment/widget.html:17 -#: motion/templates/motion/widget.html:17 -#: participant/templates/participant/group_widget.html:17 -#: participant/templates/participant/user_widget.html:16 -#: projector/templates/projector/custom_slide_widget.html:11 -#: projector/templates/projector/custom_slide_widget.html:30 +#: agenda/templates/agenda/view.html:15 +#: assignment/templates/assignment/view.html:29 +#: motion/templates/motion/view.html:40 motion/templates/motion/view.html:312 +#, fuzzy +msgid "More actions" +msgstr "Motions" + +#: agenda/templates/agenda/view.html:21 +msgid "Delete item" +msgstr "Supprimer l'élément" + +#: agenda/templates/agenda/widget.html:9 +#: agenda/templates/agenda/widget.html:25 +#: assignment/templates/assignment/widget.html:13 +#: motion/templates/motion/widget.html:13 +#: participant/templates/participant/group_widget.html:14 +#: participant/templates/participant/user_widget.html:13 +#: projector/templates/projector/custom_slide_widget.html:9 +#: projector/templates/projector/custom_slide_widget.html:29 msgid "Preview" msgstr "Aperçu" -#: agenda/templates/agenda/widget.html:23 -#: assignment/templates/assignment/view.html:132 -#: assignment/templates/assignment/widget.html:11 -#: motion/templates/motion/widget.html:11 -#: participant/templates/participant/group_widget.html:11 -#: participant/templates/participant/user_widget.html:10 -#: projector/templates/projector/custom_slide_widget.html:24 -msgid "Delete" -msgstr "Supprimer" - -#: agenda/templates/agenda/widget.html:26 -#: assignment/templates/assignment/view.html:131 -#: assignment/templates/assignment/widget.html:14 -#: motion/templates/motion/widget.html:14 -#: participant/templates/participant/group_widget.html:14 -#: participant/templates/participant/user_widget.html:13 -#: projector/templates/projector/custom_slide_widget.html:27 -msgid "Edit" -msgstr "Modifier" - -#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:381 -#: assignment/templates/assignment/view.html:13 +#: assignment/forms.py:24 assignment/models.py:51 assignment/views.py:383 +#: assignment/templates/assignment/view.html:275 #: assignment/templates/projector/Assignment.html:21 msgid "Number of available posts" msgstr "Nombre des postes disponibles" @@ -381,18 +392,18 @@ msgstr "Toujours une option par candidat" msgid "Always Yes-No-Abstain per candidate." msgstr "Toujours Oui-Non-Abstention par candidat." -#: assignment/models.py:44 assignment/templates/assignment/overview.html:15 -#: assignment/templates/assignment/view.html:23 +#: assignment/models.py:44 assignment/templates/assignment/overview.html:24 +#: assignment/templates/assignment/view.html:284 msgid "Searching for candidates" msgstr "Recherche de candidats" -#: assignment/models.py:45 assignment/templates/assignment/overview.html:16 -#: assignment/templates/assignment/view.html:25 +#: assignment/models.py:45 assignment/templates/assignment/overview.html:25 +#: assignment/templates/assignment/view.html:288 msgid "Voting" msgstr "Vote" -#: assignment/models.py:46 assignment/templates/assignment/overview.html:17 -#: assignment/templates/assignment/view.html:27 +#: assignment/models.py:46 assignment/templates/assignment/overview.html:26 +#: assignment/templates/assignment/view.html:292 msgid "Finished" msgstr "Terminé" @@ -400,7 +411,8 @@ msgstr "Terminé" msgid "Name" msgstr "Nom" -#: assignment/models.py:50 participant/models.py:144 +#: assignment/models.py:50 assignment/templates/assignment/view.html:57 +#: participant/models.py:144 msgid "Description" msgstr "Description" @@ -423,7 +435,7 @@ msgstr "Le statut d'assignation est déjà sur %s" msgid "%s is already a candidate." msgstr "%s est déja un candidat." -#: assignment/models.py:82 assignment/views.py:195 +#: assignment/models.py:82 assignment/views.py:196 msgid "The candidate list is already closed." msgstr "La liste des candidats est déjà fermée" @@ -457,7 +469,7 @@ msgstr "Peut gérer l'assignation" msgid "Abstain" msgstr "Abstention" -#: assignment/models.py:293 motion/templates/motion/poll_view.html:22 +#: assignment/models.py:293 motion/templates/motion/poll_view.html:38 msgid "Votes" msgstr "Votes" @@ -466,10 +478,9 @@ msgstr "Votes" msgid "Ballot %d" msgstr "Vote %d" -#: assignment/models.py:319 assignment/views.py:336 assignment/views.py:675 -#: assignment/views.py:690 -#: assignment/templates/assignment/base_assignment.html:14 -#: assignment/templates/assignment/overview.html:6 +#: assignment/models.py:319 assignment/views.py:338 assignment/views.py:677 +#: assignment/views.py:693 assignment/templates/assignment/config.html:10 +#: assignment/templates/assignment/overview.html:5 #: assignment/templates/assignment/overview.html:9 msgid "Elections" msgstr "Elections" @@ -487,27 +498,27 @@ msgstr "La nouvelle élection a été créée avec succès." msgid "Election was successfully modified." msgstr "L'élection a été modifiée avec succès." -#: assignment/views.py:130 motion/views.py:245 motion/views.py:689 -#: participant/views.py:508 participant/views.py:531 utils/views.py:222 -#: utils/views.py:240 utils/views.py:264 +#: assignment/views.py:130 motion/views.py:239 motion/views.py:683 +#: participant/views.py:504 participant/views.py:528 utils/views.py:218 +#: utils/views.py:236 utils/views.py:260 msgid "Please check the form for errors." msgstr "S'il vous plaît, vérifier si il a des erreurs dans le formulaire." -#: assignment/views.py:149 +#: assignment/views.py:150 #, python-format msgid "Election %s was successfully deleted." msgstr "L'election %s a été supprimée avec succès." -#: assignment/views.py:162 +#: assignment/views.py:163 #, python-format msgid "Election status was set to: %s." msgstr "Le statut de l'élection a été changé sur %s." -#: assignment/views.py:175 +#: assignment/views.py:176 msgid "You have set your candidature successfully." msgstr "Vous avez inséré votre candidature avec succès." -#: assignment/views.py:192 +#: assignment/views.py:193 msgid "" "You have withdrawn your candidature successfully. You can not be nominated " "by other participants anymore." @@ -515,101 +526,100 @@ msgstr "" "Vous avez retiré votre candidature avec succès. On ne peut plus vous " "nominer comme candidat" -#: assignment/views.py:213 +#: assignment/views.py:215 #, python-format msgid "Candidate %s was withdrawn successfully." msgstr "Le candidat %s a été rejeté avec succès." -#: assignment/views.py:215 +#: assignment/views.py:217 #, python-format msgid "%s was unblocked successfully." msgstr "Le candidat %s a été nominé avec succès." -#: assignment/views.py:219 +#: assignment/views.py:221 #, python-format msgid "Do you really want to withdraw %s from the election?" msgstr "Voulez-vous vraiment exclure %s de cette élection?" -#: assignment/views.py:221 +#: assignment/views.py:223 #, python-format msgid "Do you really want to unblock %s for the election?" msgstr "" "Voulez-vous vraiment permettre %s de participer à nouveau à cette " "élection?" -#: assignment/views.py:236 +#: assignment/views.py:238 msgid "New ballot was successfully created." msgstr "Le nouveau vote a été créé avec succès" -#: assignment/views.py:268 +#: assignment/views.py:270 #, python-format msgid "Ballot ID %d does not exist." msgstr "L'identifiant %d de vote n'existe pas." -#: assignment/views.py:275 +#: assignment/views.py:277 msgid "Ballot successfully published." msgstr "Le vote a été publié avec succès." -#: assignment/views.py:277 +#: assignment/views.py:279 msgid "Ballot successfully unpublished." msgstr "Le vote a été retiré avec succès." -#: assignment/views.py:290 +#: assignment/views.py:292 msgid "not elected" msgstr "non élu" -#: assignment/views.py:293 assignment/views.py:482 -#: assignment/templates/assignment/view.html:48 +#: assignment/views.py:295 assignment/views.py:484 +#: assignment/templates/assignment/view.html:77 msgid "elected" msgstr "élu" -#: assignment/views.py:321 +#: assignment/views.py:323 msgid "Ballot was successfully deleted." msgstr "Le vote a été supprimé avec succès." -#: assignment/views.py:333 +#: assignment/views.py:335 msgid "Assignment" msgstr "Assignation" -#: assignment/views.py:356 assignment/templates/assignment/overview.html:59 -#: assignment/templates/assignment/widget.html:23 +#: assignment/views.py:358 assignment/templates/assignment/overview.html:74 +#: assignment/templates/assignment/widget.html:19 msgid "No assignments available." msgstr "Aucune assignation disponible." -#: assignment/views.py:375 +#: assignment/views.py:377 #, python-format msgid "Election: %s" msgstr "Election: %s" -#: assignment/views.py:388 assignment/views.py:424 -#: assignment/templates/assignment/overview.html:26 -#: assignment/templates/assignment/poll_view.html:18 -#: assignment/templates/assignment/view.html:37 -#: assignment/templates/assignment/view.html:120 +#: assignment/views.py:390 assignment/views.py:426 +#: assignment/templates/assignment/overview.html:36 +#: assignment/templates/assignment/poll_view.html:34 +#: assignment/templates/assignment/view.html:66 +#: assignment/templates/assignment/view.html:157 #: assignment/templates/projector/Assignment.html:38 #: assignment/templates/projector/Assignment.html:56 msgid "Candidates" msgstr "Candidats" -#: assignment/views.py:413 motion/views.py:823 -#: motion/templates/motion/view.html:44 +#: assignment/views.py:415 motion/views.py:817 +#: motion/templates/motion/view.html:187 msgid "Vote results" msgstr "Résultat du vote" -#: assignment/views.py:417 -#: assignment/templates/assignment/base_assignment.html:71 -#: assignment/templates/assignment/poll_view.html:5 -#: assignment/templates/assignment/poll_view.html:8 -#: assignment/templates/assignment/view.html:123 +#: assignment/views.py:419 assignment/templates/assignment/poll_view.html:5 +#: assignment/templates/assignment/poll_view.html:11 +#: assignment/templates/assignment/view.html:152 +#: assignment/templates/assignment/view.html:160 #: assignment/templates/projector/Assignment.html:59 msgid "ballot" msgstr "vote" -#: assignment/views.py:420 +#: assignment/views.py:422 msgid "ballots" msgstr "votes" -#: assignment/views.py:445 +#: assignment/views.py:447 #, python-format msgid "" "Y: %(YES)s\n" @@ -620,247 +630,258 @@ msgstr "" "N: %(NO)s\n" "A: %(ABSTAIN)s" -#: assignment/views.py:456 assignment/templates/assignment/poll_view.html:35 -#: assignment/templates/assignment/view.html:186 +#: assignment/views.py:458 assignment/templates/assignment/poll_view.html:51 +#: assignment/templates/assignment/view.html:224 #: assignment/templates/projector/Assignment.html:96 -#: motion/templates/motion/poll_view.html:31 +#: motion/templates/motion/poll_view.html:47 msgid "Invalid votes" msgstr "Votes invalides" -#: assignment/views.py:463 assignment/templates/assignment/poll_view.html:45 -#: assignment/templates/assignment/view.html:202 -#: assignment/templates/assignment/view.html:207 +#: assignment/views.py:465 assignment/templates/assignment/poll_view.html:61 +#: assignment/templates/assignment/view.html:240 +#: assignment/templates/assignment/view.html:245 #: assignment/templates/projector/Assignment.html:109 -#: assignment/templates/projector/Assignment.html:115 motion/views.py:830 -#: motion/templates/motion/poll_view.html:35 -#: motion/templates/motion/view.html:84 +#: assignment/templates/projector/Assignment.html:115 motion/views.py:824 +#: motion/templates/motion/poll_view.html:51 +#: motion/templates/motion/view.html:218 #: motion/templates/projector/Motion.html:42 poll/models.py:76 msgid "Votes cast" msgstr "Nombre de votants" -#: assignment/views.py:523 assignment/views.py:541 -#: assignment/templates/assignment/overview.html:25 +#: assignment/views.py:525 assignment/views.py:543 +#: assignment/templates/assignment/overview.html:35 #: assignment/templates/assignment/poll_view.html:5 #: assignment/templates/assignment/view.html:6 #: assignment/templates/projector/Assignment.html:27 msgid "Election" msgstr "Election" -#: assignment/views.py:548 +#: assignment/views.py:550 #, python-format msgid "%d. ballot" msgstr "%d. vote" -#: assignment/views.py:550 +#: assignment/views.py:552 #, python-format msgid "%d candidate" msgid_plural "%d candidates" msgstr[0] "%d candidat" msgstr[1] "%d candidats" -#: assignment/views.py:552 +#: assignment/views.py:554 #, python-format msgid "%d available post" msgid_plural "%d available posts" msgstr[0] "%d poste disponible" msgstr[1] "%d postes disponibles" -#: assignment/views.py:588 assignment/templates/assignment/view.html:170 -#: assignment/templates/projector/Assignment.html:80 motion/views.py:830 -#: motion/views.py:883 motion/templates/motion/view.html:81 +#: assignment/views.py:590 assignment/templates/assignment/view.html:208 +#: assignment/templates/projector/Assignment.html:80 motion/views.py:824 +#: motion/views.py:877 motion/templates/motion/view.html:215 #: motion/templates/projector/Motion.html:39 msgid "Abstention" msgstr "Abstention" -#: assignment/views.py:668 +#: assignment/views.py:670 msgid "Election settings successfully saved." msgstr "Les paramètres de l'élection ont été enregistrés avec succès." -#: assignment/templates/assignment/base_assignment.html:16 -msgid "All elections" -msgstr "Toutes les élections" - -#: assignment/templates/assignment/base_assignment.html:18 -#: assignment/templates/assignment/edit.html:10 -#: assignment/templates/assignment/edit.html:19 -msgid "New election" -msgstr "Nouvelle élection" - -#: assignment/templates/assignment/base_assignment.html:20 -msgid "All elections as PDF" -msgstr "Toutes les élections en PDF" - -#: assignment/templates/assignment/base_assignment.html:31 -msgid "View election" -msgstr "Afficher l'élection" - -#: assignment/templates/assignment/base_assignment.html:39 -#: assignment/templates/assignment/edit.html:8 -#: assignment/templates/assignment/edit.html:17 -#: assignment/templates/assignment/overview.html:50 -msgid "Edit election" -msgstr "Modifier l'élection" - -#: assignment/templates/assignment/base_assignment.html:44 -#: assignment/templates/assignment/overview.html:51 -msgid "Delete election" -msgstr "Supprimer l'élection" - -#: assignment/templates/assignment/base_assignment.html:50 -#: assignment/templates/assignment/overview.html:53 -msgid "Election as PDF" -msgstr "L'élection en PDF" - -#: assignment/templates/assignment/base_assignment.html:56 -msgid "Show election" -msgstr "Projeter l'élection" - -#: assignment/templates/assignment/base_assignment.html:63 -#: motion/templates/motion/base_motion.html:61 -msgid "New agenda item" -msgstr "Nouveau point dans l'ordre du jour" - #: assignment/templates/assignment/config.html:5 -#: assignment/templates/assignment/config.html:8 msgid "Election settings" msgstr "Paramètres de l'élection" -#: assignment/templates/assignment/overview.html:14 -#: assignment/templates/assignment/overview.html:27 -#: assignment/templates/assignment/view.html:11 -#: assignment/templates/projector/Assignment.html:18 motion/views.py:801 -#: motion/templates/motion/overview.html:20 -#: motion/templates/motion/overview.html:40 -#: motion/templates/motion/view.html:34 +#: assignment/templates/assignment/edit.html:8 +#: assignment/templates/assignment/edit.html:17 +#: assignment/templates/assignment/view.html:34 +msgid "Edit election" +msgstr "Modifier l'élection" + +#: assignment/templates/assignment/edit.html:10 +#: assignment/templates/assignment/edit.html:19 +#: assignment/templates/assignment/overview.html:12 +msgid "New election" +msgstr "Nouvelle élection" + +#: assignment/templates/assignment/overview.html:15 +#, fuzzy +msgid "Print all elections as PDF" +msgstr "Toutes les élections en PDF" + +#: assignment/templates/assignment/overview.html:21 +#: participant/templates/participant/overview.html:53 +msgid "Filter" +msgstr "Filtre" + +#: assignment/templates/assignment/overview.html:23 +#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/view.html:272 +#: assignment/templates/projector/Assignment.html:18 motion/views.py:795 +#: motion/templates/motion/overview.html:35 +#: motion/templates/motion/overview.html:56 +#: motion/templates/motion/view.html:177 #: motion/templates/projector/Motion.html:11 -#: participant/templates/participant/overview.html:52 +#: participant/templates/participant/overview.html:84 msgid "Status" msgstr "Statut" -#: assignment/templates/assignment/overview.html:22 +#: assignment/templates/assignment/overview.html:31 msgid "election" msgid_plural "elections" msgstr[0] "élection" msgstr[1] "élections" -#: assignment/templates/assignment/overview.html:35 +#: assignment/templates/assignment/overview.html:44 #, python-format msgctxt "Number of searched candidates for an election" msgid "posts: %(posts)s" msgstr "postes: %(posts)s" -#: assignment/templates/assignment/overview.html:37 +#: assignment/templates/assignment/overview.html:46 #, python-format msgid "candidates: %(candidates)s" msgstr "candidats: %(candidates)s" -#: assignment/templates/assignment/overview.html:39 +#: assignment/templates/assignment/overview.html:48 #, python-format msgid "elected: %(elected)s" msgstr "élus: %(elected)s" -#: assignment/templates/assignment/overview.html:45 -msgid "Activate election" -msgstr "Activer l'élection" +#: assignment/templates/assignment/overview.html:66 +#, fuzzy +msgid "Print election as PDF" +msgstr "Toutes les élections en PDF" -#: assignment/templates/assignment/poll_view.html:10 +#: assignment/templates/assignment/poll_view.html:14 +#, fuzzy +msgid "Back to election" +msgstr "Modifier l'élection" + +#: assignment/templates/assignment/poll_view.html:17 +#: assignment/templates/assignment/view.html:23 +msgid "Show election" +msgstr "Projeter l'élection" + +#: assignment/templates/assignment/poll_view.html:25 msgid "Short description (for ballot paper)" msgstr "Une courte déscription (pour le bulletin de vote)" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 msgid "Special values" msgstr "Valeurs spéciales" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:234 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 poll/models.py:234 msgid "majority" msgstr "majorité" -#: assignment/templates/assignment/poll_view.html:12 -#: motion/templates/motion/poll_view.html:14 poll/models.py:236 +#: assignment/templates/assignment/poll_view.html:29 +#: motion/templates/motion/poll_view.html:30 poll/models.py:236 #: poll/models.py:238 msgid "undocumented" msgstr "non documenté" -#: assignment/templates/assignment/poll_view.html:59 -#: motion/templates/motion/poll_view.html:45 +#: assignment/templates/assignment/poll_view.html:74 +#: motion/templates/motion/poll_view.html:59 msgid "Ballot paper as PDF" msgstr "bulletin de vote en PDF" -#: assignment/templates/assignment/view.html:21 -msgid "Change status" -msgstr "Modifier le statut" +#: assignment/templates/assignment/poll_view.html:83 +#: assignment/templates/assignment/view.html:112 +#: motion/templates/motion/poll_view.html:68 +#: projector/templates/projector/control_overlay_message.html:7 +#: templates/formbuttons_saveapply.html:7 +msgid "Apply" +msgstr "Appliquer" -#: assignment/templates/assignment/view.html:44 -#: assignment/templates/assignment/view.html:106 +#: assignment/templates/assignment/view.html:36 +msgid "Delete election" +msgstr "Supprimer l'élection" + +#: assignment/templates/assignment/view.html:40 +#, fuzzy +msgid "Ballot" +msgstr "vote" + +#: assignment/templates/assignment/view.html:46 +#: motion/templates/motion/view.html:55 +msgid "New agenda item" +msgstr "Nouveau point dans l'ordre du jour" + +#: assignment/templates/assignment/view.html:73 +#: assignment/templates/assignment/view.html:132 msgid "Remove candidate" msgstr "Enlever le candidat" -#: assignment/templates/assignment/view.html:51 +#: assignment/templates/assignment/view.html:80 msgid "Mark candidate as not elected" msgstr "Marquer le candidat comme pas elu." -#: assignment/templates/assignment/view.html:57 +#: assignment/templates/assignment/view.html:88 #: assignment/templates/projector/Assignment.html:44 msgid "No candidates available." msgstr "Aucun candidat n'est disponible" -#: assignment/templates/assignment/view.html:69 +#: assignment/templates/assignment/view.html:98 msgid "Withdraw self candidature" msgstr "Retirer sa propre candidature" -#: assignment/templates/assignment/view.html:75 +#: assignment/templates/assignment/view.html:102 msgid "Self candidature" msgstr "Se proposer comme candidat" -#: assignment/templates/assignment/view.html:86 +#: assignment/templates/assignment/view.html:114 msgid "Add new participant" msgstr "Ajouter un nouveau participant" -#: assignment/templates/assignment/view.html:102 +#: assignment/templates/assignment/view.html:127 msgid "Blocked Candidates" msgstr "Candidats bloqués" -#: assignment/templates/assignment/view.html:109 +#: assignment/templates/assignment/view.html:137 msgid "No blocked candidates available." msgstr "Aucun candidat n'est disponible" -#: assignment/templates/assignment/view.html:115 +#: assignment/templates/assignment/view.html:145 #: assignment/templates/projector/Assignment.html:52 msgid "Election results" msgstr "Résultat des élections" -#: assignment/templates/assignment/view.html:128 +#: assignment/templates/assignment/view.html:165 msgid "Publish/unpublish results" msgstr "Publier/dépublier les résultats" -#: assignment/templates/assignment/view.html:140 -#: assignment/templates/assignment/view.html:223 +#: assignment/templates/assignment/view.html:180 +#: assignment/templates/assignment/view.html:261 msgid "New ballot" msgstr "Nouveau vote" -#: assignment/templates/assignment/view.html:155 +#: assignment/templates/assignment/view.html:193 #: assignment/templates/projector/Assignment.html:69 msgid "Candidate is elected" msgstr "Le candidat est élu" -#: assignment/templates/assignment/view.html:174 +#: assignment/templates/assignment/view.html:212 #: assignment/templates/projector/Assignment.html:84 msgid "was not a
      candidate" msgstr "n'était pas un
      candidat" -#: assignment/templates/assignment/view.html:191 -#: assignment/templates/projector/Assignment.html:100 motion/views.py:830 -#: motion/templates/motion/view.html:82 +#: assignment/templates/assignment/view.html:229 +#: assignment/templates/projector/Assignment.html:100 motion/views.py:824 +#: motion/templates/motion/view.html:216 #: motion/templates/projector/Motion.html:40 msgid "Invalid" msgstr "Invalide" -#: assignment/templates/assignment/view.html:219 -msgid "No results available." +#: assignment/templates/assignment/view.html:257 +#, fuzzy +msgid "No ballots available." msgstr "Aucun resultat n'est disponible" +#: assignment/templates/assignment/view.html:281 +msgid "Change status" +msgstr "Modifier le statut" + #: config/forms.py:22 msgid "Event name" msgstr "Nom de l'événement" @@ -885,7 +906,7 @@ msgstr "Organisateur de l'événement" msgid "Allow access for anonymous guest users" msgstr "Permettre l'accès anomyme" -#: config/forms.py:65 participant/forms.py:123 +#: config/forms.py:65 participant/forms.py:126 msgid "Welcome text" msgstr "Texte de bienvenue" @@ -905,14 +926,14 @@ msgstr "Bienvenue sur OpenSlides!" msgid "[Place for your welcome text.]" msgstr "[Insérer votre texte ici.]" -#: config/models.py:102 +#: config/models.py:102 config/templates/config/general.html:10 msgid "General" msgstr "Général" #: config/models.py:126 config/templates/config/version.html:5 #: config/templates/config/version.html:8 -#: config/templates/config/version.html:11 motion/views.py:815 -#: motion/templates/motion/view.html:214 motion/templates/motion/view.html:244 +#: config/templates/config/version.html:13 motion/views.py:809 +#: motion/templates/motion/view.html:26 motion/templates/motion/view.html:93 msgid "Version" msgstr "Version" @@ -920,29 +941,24 @@ msgstr "Version" msgid "General settings successfully saved." msgstr "Les paramètres généraux ont été enregistrés avec succès." -#: config/views.py:110 config/templates/config/base_config.html:7 -msgid "Configuration" -msgstr "Configuration" - #: config/templates/config/general.html:5 -#: config/templates/config/general.html:8 msgid "General settings" msgstr "Paramètres généraux" -#: config/templates/config/general.html:11 +#: config/templates/config/general.html:15 msgid "Event" msgstr "Evénement" -#: config/templates/config/general.html:26 +#: config/templates/config/general.html:33 msgid "Welcome Widget" msgstr "Widget de bienvenue" -#: config/templates/config/general.html:41 +#: config/templates/config/general.html:51 msgid "System" msgstr "Système" -#: motion/forms.py:25 motion/models.py:541 motion/views.py:849 -#: motion/templates/motion/view.html:229 motion/templates/motion/view.html:249 +#: motion/forms.py:25 motion/models.py:541 motion/views.py:843 +#: motion/templates/motion/view.html:80 motion/templates/motion/view.html:97 #: motion/templates/projector/Motion.html:77 msgid "Reason" msgstr "Motivation" @@ -955,18 +971,19 @@ msgstr "Changement trivial" msgid "Trivial changes don't create a new version." msgstr "Des changement triviaux ne créent pas une nouvelle version." -#: motion/forms.py:35 motion/models.py:63 motion/views.py:768 -#: motion/templates/motion/overview.html:41 -#: motion/templates/motion/view.html:18 +#: motion/forms.py:35 motion/models.py:63 motion/views.py:762 +#: motion/templates/motion/overview.html:57 +#: motion/templates/motion/view.html:161 #: motion/templates/projector/Motion.html:55 msgid "Submitter" msgstr "Requérant" -#: motion/forms.py:44 motion/views.py:788 motion/templates/motion/view.html:22 +#: motion/forms.py:44 motion/views.py:782 +#: motion/templates/motion/view.html:165 msgid "Supporters" msgstr "Partisants" -#: motion/forms.py:50 participant/forms.py:111 +#: motion/forms.py:50 participant/forms.py:114 msgid "CSV File" msgstr "Fichier CSV" @@ -1016,13 +1033,13 @@ msgstr "Publié" msgid "Permitted" msgstr "Permis" -#: motion/models.py:44 motion/templates/motion/overview.html:24 -#: motion/templates/motion/view.html:167 +#: motion/models.py:44 motion/templates/motion/overview.html:40 +#: motion/templates/motion/view.html:298 msgid "Accepted" msgstr "Accepté" -#: motion/models.py:45 motion/templates/motion/overview.html:25 -#: motion/templates/motion/view.html:172 +#: motion/models.py:45 motion/templates/motion/overview.html:41 +#: motion/templates/motion/view.html:303 msgid "Rejected" msgstr "Rejeté" @@ -1030,15 +1047,15 @@ msgstr "Rejeté" msgid "Withdrawed" msgstr "Retiré" -#: motion/models.py:47 motion/templates/motion/view.html:180 +#: motion/models.py:47 motion/templates/motion/view.html:317 msgid "Adjourned" msgstr "Ajourné" -#: motion/models.py:48 motion/templates/motion/view.html:183 +#: motion/models.py:48 motion/templates/motion/view.html:320 msgid "Not Concerned" msgstr "Non concerné" -#: motion/models.py:49 motion/templates/motion/view.html:186 +#: motion/models.py:49 motion/templates/motion/view.html:323 msgid "Commited a bill" msgstr "Transféré à (une commission)" @@ -1046,7 +1063,7 @@ msgstr "Transféré à (une commission)" msgid "Rejected (not authorized)" msgstr "Rejeté (non autorisé)" -#: motion/models.py:51 motion/templates/motion/overview.html:27 +#: motion/models.py:51 motion/templates/motion/overview.html:43 msgid "Needs Review" msgstr "Doit être revu" @@ -1142,15 +1159,15 @@ msgstr "Statut modifié" msgid "by" msgstr "par" -#: motion/models.py:453 motion/templates/motion/view.html:210 -#: motion/templates/motion/widget.html:27 +#: motion/models.py:453 motion/templates/motion/view.html:12 +#: motion/templates/motion/view.html:24 motion/templates/motion/widget.html:23 #: motion/templates/projector/Motion.html:65 #: participant/templates/participant/personal_info_widget.html:13 #: participant/templates/participant/personal_info_widget.html:32 msgid "no number" msgstr "pas de nombre" -#: motion/models.py:454 motion/templates/motion/widget.html:23 +#: motion/models.py:454 motion/templates/motion/widget.html:19 #: participant/templates/participant/personal_info_widget.html:9 #: participant/templates/participant/personal_info_widget.html:28 msgid "motion" @@ -1180,30 +1197,30 @@ msgstr "Peut gérer les motions" msgid "The assembly may decide," msgstr "Je demande a l'Assemblée de décider sur " -#: motion/models.py:603 motion/views.py:718 motion/views.py:943 -#: motion/views.py:954 motion/templates/motion/base_motion.html:9 -#: motion/templates/motion/overview.html:7 +#: motion/models.py:603 motion/views.py:712 motion/views.py:937 +#: motion/views.py:949 motion/templates/motion/config.html:10 +#: motion/templates/motion/overview.html:6 #: motion/templates/motion/overview.html:10 msgid "Motions" msgstr "Motions" -#: motion/views.py:173 +#: motion/views.py:167 msgid "You have not the necessary rights to create or edit motions." msgstr "Vous n'avez pas l'autorisation de créer ou modifier des motions." -#: motion/views.py:178 +#: motion/views.py:172 msgid "You can not edit this motion." msgstr "Vous ne pouvez pas modifier cette motion." -#: motion/views.py:236 +#: motion/views.py:230 msgid "New motion was successfully created." msgstr "La nouvelle motion a été créée avec succès." -#: motion/views.py:238 +#: motion/views.py:232 msgid "Motion was successfully modified." msgstr "La motion a été modifiée avec succès." -#: motion/views.py:252 +#: motion/views.py:246 msgid "" "Attention: Do you really want to edit this motion? The supporters will " "not be removed automatically because you can manage motions. Please " @@ -1214,7 +1231,7 @@ msgstr "" "gérer les motions. S'il vous plait vérifiez si les partisans sont valables " "après votre modification!" -#: motion/views.py:254 +#: motion/views.py:248 #, python-format msgid "" "Attention: Do you really want to edit this motion? All %s supporters " @@ -1223,182 +1240,182 @@ msgstr "" "Attention: Voulez-vous vraiment modifier cette motion? Tout les %s " "partisans seront supprimés! Essayez de convaincre les partisans à nouveau." -#: motion/views.py:286 +#: motion/views.py:280 msgid "Motion number was successfully set." msgstr "Le numéro de la motion a été mis avec succès." -#: motion/views.py:302 +#: motion/views.py:296 msgid "Motion was successfully authorized." msgstr "La motion a été autorisée avec succès." -#: motion/views.py:317 +#: motion/views.py:311 msgid "Motion was successfully rejected." msgstr "La motion a été rejetée avec succès. " -#: motion/views.py:333 +#: motion/views.py:327 #, python-format msgid "Motion status was set to: %s." msgstr "Le statut de la motion a été changé sur: %s" -#: motion/views.py:349 +#: motion/views.py:343 msgid "Motion status was reset." msgstr "Le statut de la motion a été remis à zéro." -#: motion/views.py:376 +#: motion/views.py:370 msgid "You can not support this motion." msgstr "Vous ne pouvez pas soutenir cette motion. " -#: motion/views.py:379 +#: motion/views.py:373 msgid "You can not unsupport this motion." msgstr "Vous ne pouvez pas retirer votre soutien pour cette motion. " -#: motion/views.py:390 +#: motion/views.py:384 msgid "Do you really want to support this motion?" msgstr "Voulez-vous vraiment soutenir cette motion?" -#: motion/views.py:392 +#: motion/views.py:386 msgid "Do you really want to unsupport this motion?" msgstr "Voulez-vous vraiment retirer votre soutien pour cette motion?" -#: motion/views.py:403 +#: motion/views.py:397 msgid "You have supported this motion successfully." msgstr "" "Vous soutenez maintenant cette motion, vous avez été ajouté avec succès." -#: motion/views.py:405 +#: motion/views.py:399 msgid "You have unsupported this motion successfully." msgstr "Vous avez retiré votre soutien pour cette motion avec succès. " -#: motion/views.py:419 +#: motion/views.py:413 msgid "New vote was successfully created." msgstr "Le nouveau vote a été créé avec succès." -#: motion/views.py:435 +#: motion/views.py:429 msgid "Poll deleted" msgstr "Sondage supprimé" -#: motion/views.py:436 +#: motion/views.py:430 msgid "Poll was successfully deleted." msgstr "Le sondage a été supprimé avec succès." -#: motion/views.py:438 +#: motion/views.py:432 #, python-format msgid "the %s. poll" msgstr "le %s. sondage" -#: motion/views.py:479 motion/views.py:488 +#: motion/views.py:473 motion/views.py:482 #, python-format msgid "You can not delete motion %s." msgstr "Vous ne pouvez pas supprimer la motion %s." -#: motion/views.py:484 motion/views.py:492 +#: motion/views.py:478 motion/views.py:486 #, python-format msgid "Motion %s was successfully deleted." msgstr "La motion %s a été supprimée avec succès." -#: motion/views.py:494 +#: motion/views.py:488 msgid "Invalid request" msgstr "Demande invalide" -#: motion/views.py:518 +#: motion/views.py:512 msgid "Poll was updated" msgstr "Le sondage a été actualisé" -#: motion/views.py:535 +#: motion/views.py:529 #, python-format msgid "Version %s accepted." msgstr "Version %s acceptée." -#: motion/views.py:537 +#: motion/views.py:531 #, python-format msgid "Do you really want to authorize version %s?" msgstr "Voulez-vous vraiment autoriser cette version %s" -#: motion/views.py:547 +#: motion/views.py:541 #, python-format msgid "Version %s rejected." msgstr "Version %s rejetée." -#: motion/views.py:549 +#: motion/views.py:543 msgid "ERROR by rejecting the version." msgstr "ERREUR en rejetant la version." -#: motion/views.py:551 +#: motion/views.py:545 #, python-format msgid "Do you really want to reject version %s?" msgstr "Voulez vous vraiment rejeter la version %s?" -#: motion/views.py:587 motion/views.py:591 motion/views.py:597 -#: motion/views.py:600 participant/api.py:81 +#: motion/views.py:581 motion/views.py:585 motion/views.py:591 +#: motion/views.py:594 participant/api.py:78 #, python-format msgid "Ignoring malformed line %d in import file." msgstr "La ligne %d mal formée dans le fichier d'entrée a été ignorée" -#: motion/views.py:608 +#: motion/views.py:602 #, python-format msgid "Ignoring line %d because the assigned group may not act as a person." msgstr "" "La ligne %d a été ignorée car le group assigné ne peut agir en tant que " "personne." -#: motion/views.py:617 +#: motion/views.py:611 msgid "Created by motion import." msgstr "Motion a été créé par l'import" -#: motion/views.py:631 +#: motion/views.py:625 #, python-format msgid "" "Ignoring line %d because it contains an incomplete first / last name pair." msgstr "La ligne %d a été ignorée car le nom ou prénom sont incomplets" -#: motion/views.py:669 +#: motion/views.py:663 #, python-format msgid "%d motion was successfully imported." msgid_plural "%d motions were successfully imported." msgstr[0] "%d la motion a été importée avec succès." msgstr[1] "%d les motions ont été importées avec succès." -#: motion/views.py:672 +#: motion/views.py:666 #, python-format msgid "%d motion was successfully modified." msgid_plural "%d motions were successfully modified." msgstr[0] "%d la motion a été modifiée avec succès." msgstr[1] "%d les motions ont été modifiées avec succès." -#: motion/views.py:675 +#: motion/views.py:669 #, python-format msgid "%d new user was added." msgid_plural "%d new users were added." msgstr[0] "%d nouvel utilisateur a été créé." msgstr[1] "%d nouveaux utilisateurs ont été créés." -#: motion/views.py:678 +#: motion/views.py:672 #, python-format msgid "%d new group was added." msgid_plural "%d new groups were added." msgstr[0] "%d le nouveau groupe a été ajouter" msgstr[1] "%d nouveaux groupes ont été ajouter" -#: motion/views.py:681 +#: motion/views.py:675 #, python-format msgid "%d group assigned to motions." msgid_plural "%d groups assigned to motions." msgstr[0] "%d groupe a été assigné aux motions." msgstr[1] "%d groupes ont été assignés aux motions." -#: motion/views.py:685 participant/api.py:97 +#: motion/views.py:679 participant/api.py:94 msgid "Import aborted because of severe errors in the input file." msgstr "" "l'importation a été interrompue en raison d'erreurs graves dans le fichier " "d'entrée" -#: motion/views.py:687 participant/api.py:99 +#: motion/views.py:681 participant/api.py:96 msgid "Import file has wrong character encoding, only UTF-8 is supported!" msgstr "" "Le fichier d'entrée a un mauvais encodage des caractères, seul UTF-8 est " "pris en charge!" -#: motion/views.py:691 +#: motion/views.py:685 msgid "" "Attention: Existing motions will be modified if you import new motions with " "the same number." @@ -1406,7 +1423,7 @@ msgstr "" "Attention: Les motions existantes seront modifiées si vous importez de " "nouvelles motions avec le même numéro." -#: motion/views.py:692 +#: motion/views.py:686 msgid "" "Attention: Importing an motions without a number multiple times will create " "duplicates." @@ -1414,116 +1431,86 @@ msgstr "" "Attention: L'importation d'une motion sans numéro à plusieurs reprises " "créera des doublons." -#: motion/views.py:725 motion/views.py:863 -#: motion/templates/motion/poll_view.html:7 -#: motion/templates/motion/poll_view.html:12 -#: motion/templates/motion/view.html:7 motion/templates/motion/view.html:206 -#: motion/templates/motion/view.html:225 +#: motion/views.py:719 motion/views.py:857 +#: motion/templates/motion/poll_view.html:6 +#: motion/templates/motion/poll_view.html:14 +#: motion/templates/motion/view.html:8 motion/templates/motion/view.html:22 #: motion/templates/projector/Motion.html:7 #: motion/templates/projector/Motion.html:65 msgid "Motion" msgstr "Motion" -#: motion/views.py:739 motion/templates/motion/overview.html:84 +#: motion/views.py:733 motion/templates/motion/overview.html:105 msgid "No motions available." msgstr "Aucune motion disponible." -#: motion/views.py:744 motion/views.py:746 motion/views.py:761 -#: motion/views.py:763 motion/templates/motion/base_motion.html:24 -#: motion/templates/projector/Motion.html:63 +#: motion/views.py:738 motion/views.py:740 motion/views.py:755 +#: motion/views.py:757 motion/templates/projector/Motion.html:63 msgid "Motion No." msgstr "Motion No." -#: motion/views.py:778 +#: motion/views.py:772 msgid "Signature" msgstr "Signature" -#: motion/views.py:829 motion/templates/motion/base_motion.html:55 -#: motion/templates/motion/poll_view.html:8 -#: motion/templates/motion/poll_view.html:13 -#: motion/templates/motion/view.html:66 motion/templates/motion/view.html:74 +#: motion/views.py:823 motion/templates/motion/poll_view.html:6 +#: motion/templates/motion/poll_view.html:14 +#: motion/templates/motion/view.html:205 #: motion/templates/projector/Motion.html:33 msgid "Vote" msgstr "Vote" -#: motion/views.py:863 +#: motion/views.py:857 msgid "Poll" msgstr "Sondage" -#: motion/views.py:877 +#: motion/views.py:871 #, python-format msgid "Motion No. %s" msgstr "Motion No %s" -#: motion/views.py:879 +#: motion/views.py:873 #, python-format msgid "%d. Vote" msgstr "%d. Vote" -#: motion/views.py:936 +#: motion/views.py:930 msgid "Motion settings successfully saved." msgstr "Les paramètres des motions ont été enregistrés avec succès" -#: motion/templates/motion/base_motion.html:11 -msgid "All motions" -msgstr "Toutes les motions" - -#: motion/templates/motion/base_motion.html:13 -#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:18 -msgid "New motion" -msgstr "Nouvelle motion" - -#: motion/templates/motion/base_motion.html:16 -#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 -msgid "Import motions" -msgstr "Importer des motions" - -#: motion/templates/motion/base_motion.html:18 -msgid "All motions as PDF" -msgstr "Toutes les motions dans un PDF" - -#: motion/templates/motion/base_motion.html:34 -msgid "View motion" -msgstr "Afficher la motion" - -#: motion/templates/motion/base_motion.html:38 -#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:16 -#: motion/templates/motion/overview.html:72 -msgid "Edit motion" -msgstr "Modifier la motion" - -#: motion/templates/motion/base_motion.html:42 -#: motion/templates/motion/overview.html:74 -msgid "Delete motion" -msgstr "Supprimer la motion" - -#: motion/templates/motion/base_motion.html:45 -#: motion/templates/motion/overview.html:77 -msgid "Motion as PDF" -msgstr "Motion dans un PDF" - -#: motion/templates/motion/base_motion.html:49 -msgid "Show Motion" -msgstr "Lancer l'animation" - -#: motion/templates/motion/config.html:5 motion/templates/motion/config.html:8 +#: motion/templates/motion/config.html:5 msgid "Motion settings" msgstr "Paramètres de l'animation" -#: motion/templates/motion/import.html:9 +#: motion/templates/motion/edit.html:8 motion/templates/motion/edit.html:17 +#: motion/templates/motion/view.html:46 +msgid "Edit motion" +msgstr "Modifier la motion" + +#: motion/templates/motion/edit.html:10 motion/templates/motion/edit.html:19 +#: motion/templates/motion/overview.html:13 +msgid "New motion" +msgstr "Nouvelle motion" + +#: motion/templates/motion/import.html:5 motion/templates/motion/import.html:8 +#: motion/templates/motion/overview.html:16 +msgid "Import motions" +msgstr "Importer des motions" + +#: motion/templates/motion/import.html:14 msgid "Select a CSV file to import motions!" msgstr "Sélectionnez un fichier CSV pour importer les motions!" -#: motion/templates/motion/import.html:11 -#: participant/templates/participant/import.html:11 +#: motion/templates/motion/import.html:15 +#: participant/templates/participant/import.html:17 msgid "Required comma separated values" msgstr "Valeurs séparées par des virgules (CSV) nécessaires" -#: motion/templates/motion/import.html:12 +#: motion/templates/motion/import.html:16 msgid "number, title, text, reason, first_name, last_name, is_group" msgstr "numéro, titre, texte, motivation, prénom, nom, groupe" -#: motion/templates/motion/import.html:14 +#: motion/templates/motion/import.html:18 msgid "" "number, reason and is_group are " "optional and may be empty" @@ -1531,195 +1518,234 @@ msgstr "" "numero, motivation et est_groupe sont " "optional et peuvent être laisser vide" -#: motion/templates/motion/import.html:16 -#: participant/templates/participant/import.html:14 +#: motion/templates/motion/import.html:20 +#: participant/templates/participant/import.html:20 msgid "Required CSV file encoding: UTF-8 (Unicode)." msgstr "Le fichier CSV requiert un encodage de caractères UTF-8 (Unicode)" -#: motion/templates/motion/import.html:19 -#: participant/templates/participant/import.html:17 +#: motion/templates/motion/import.html:23 +#: participant/templates/participant/import.html:23 msgid "A CSV example file is available in OpenSlides Wiki." msgstr "Un exemple de fichier CSV est disponible sur le Wiki de Openslides. " -#: motion/templates/motion/import.html:26 -#: participant/templates/participant/import.html:24 +#: motion/templates/motion/import.html:41 +#: motion/templates/motion/overview.html:16 +#: participant/templates/participant/import.html:30 +#: participant/templates/participant/overview.html:22 msgid "Import" msgstr "Importation" -#: motion/templates/motion/overview.html:15 +#: motion/templates/motion/overview.html:18 +#, fuzzy +msgid "Print all motions as PDF" +msgstr "Toutes les motions dans un PDF" + +#: motion/templates/motion/overview.html:26 msgid "Need supporters" msgstr "A besoin de partisans" -#: motion/templates/motion/overview.html:18 +#: motion/templates/motion/overview.html:31 msgid "Without number" msgstr "Sans numéro" -#: motion/templates/motion/overview.html:22 +#: motion/templates/motion/overview.html:38 msgid "Not yet authorized" msgstr "N'est pas encore autorisé" -#: motion/templates/motion/overview.html:23 +#: motion/templates/motion/overview.html:39 msgid "Authorized" msgstr "Autorisé" -#: motion/templates/motion/overview.html:26 +#: motion/templates/motion/overview.html:42 msgid "Withdrawen (by submitter)" msgstr "retiré (par le requérant)" -#: motion/templates/motion/overview.html:32 +#: motion/templates/motion/overview.html:47 msgctxt "number of motions" msgid "motion" msgid_plural "motions" msgstr[0] "motion" msgstr[1] "motions" -#: motion/templates/motion/overview.html:35 -msgid "Number" -msgstr "Numéro" +#: motion/templates/motion/overview.html:51 +msgid "#" +msgstr "" -#: motion/templates/motion/overview.html:36 +#: motion/templates/motion/overview.html:52 msgid "Motion title" msgstr "Titre de la motion" -#: motion/templates/motion/overview.html:38 +#: motion/templates/motion/overview.html:54 msgid "Number of supporters" msgstr "Nombre de partisans" -#: motion/templates/motion/overview.html:42 -#: motion/templates/motion/view.html:109 +#: motion/templates/motion/overview.html:58 +#: motion/templates/motion/view.html:241 msgid "Creation Time" msgstr "Temps de création" -#: motion/templates/motion/overview.html:67 -msgid "Activate motion" -msgstr "Activer la motion" +#: motion/templates/motion/overview.html:96 +#, fuzzy +msgid "Print motion as PDF" +msgstr "Toutes les motions dans un PDF" + +#: motion/templates/motion/poll_view.html:18 +#, fuzzy +msgid "Back to motion" +msgstr "Modifier la motion" #: motion/templates/motion/poll_view.html:21 +#: motion/templates/motion/view.html:34 +#, fuzzy +msgid "Show motion" +msgstr "Lancer l'animation" + +#: motion/templates/motion/poll_view.html:37 msgid "Option" msgstr "Option" -#: motion/templates/motion/view.html:51 motion/templates/motion/view.html:91 -msgid "New vote" -msgstr "Nouveau vote" +#: motion/templates/motion/view.html:31 +#, fuzzy +msgid "Print this motion as PDF" +msgstr "Toutes les motions dans un PDF" -#: motion/templates/motion/view.html:67 -msgid "Edit Vote" -msgstr "Modifier le vote" +#: motion/templates/motion/view.html:50 +msgid "Delete motion" +msgstr "Supprimer la motion" -#: motion/templates/motion/view.html:70 -msgid "Delete Vote" -msgstr "Supprimer le vote" - -#: motion/templates/motion/view.html:99 -msgid "Enter result" -msgstr "Insérer le résultat" - -#: motion/templates/motion/view.html:116 -msgid "Withdraw" -msgstr "Retirer" - -#: motion/templates/motion/view.html:124 -msgid "Unsupport" -msgstr "Ne plus soutenir" - -#: motion/templates/motion/view.html:130 -msgid "Support" -msgstr "Soutenir" - -#: motion/templates/motion/view.html:136 -msgid "minimum required supporters" -msgstr "Nombres minimum de partisans requis" - -#: motion/templates/motion/view.html:143 -msgid "Manage motion" -msgstr "Gérer la motion" - -#: motion/templates/motion/view.html:146 -msgid "Formal validation" -msgstr "Validation formelle" - -#: motion/templates/motion/view.html:148 -msgid "Publish" -msgstr "Publier" - -#: motion/templates/motion/view.html:151 -msgid "Permit" -msgstr "Permettre" - -#: motion/templates/motion/view.html:154 -msgid "Not permit (reject)" -msgstr "Non autorisé (rejeter)" - -#: motion/templates/motion/view.html:157 -msgid "Set number" -msgstr "Insérer un numéro" - -#: motion/templates/motion/view.html:164 -msgid "Result after vote" -msgstr "Résultat après le vote" - -#: motion/templates/motion/view.html:178 -msgid "Result after debate" -msgstr "Résultat après la discussion" - -#: motion/templates/motion/view.html:189 -msgid "Withdrawed by submitter" -msgstr "Retiré par le requérant" - -#: motion/templates/motion/view.html:194 -msgid "For Administration only:" -msgstr "Seulement pour les administrateurs" - -#: motion/templates/motion/view.html:196 -msgid "Reset" -msgstr "Réinitialiser" - -#: motion/templates/motion/view.html:219 +#: motion/templates/motion/view.html:69 msgid "This is not the newest version." msgstr "Ce n'est pas la version la plus récente" -#: motion/templates/motion/view.html:219 motion/templates/motion/view.html:221 +#: motion/templates/motion/view.html:69 motion/templates/motion/view.html:71 msgid "Go to version" msgstr "Aller à la version" -#: motion/templates/motion/view.html:221 +#: motion/templates/motion/view.html:71 msgid "This is not the authorized version." msgstr "Ce n'est pas la version autorisée" -#: motion/templates/motion/view.html:239 +#: motion/templates/motion/view.html:76 +#, fuzzy +msgid "Motion text" +msgstr "Titre de la motion" + +#: motion/templates/motion/view.html:89 msgid "Version History" msgstr "Historique des versions" -#: motion/templates/motion/view.html:245 +#: motion/templates/motion/view.html:94 msgid "Time" msgstr "Temps" -#: motion/templates/motion/view.html:256 -msgid "Version authorized" -msgstr "Version autorisée" +#: motion/templates/motion/view.html:104 +#, fuzzy +msgid "This version is authorized" +msgstr "Version %s autorisée" -#: motion/templates/motion/view.html:259 -msgid "Permit Version" +#: motion/templates/motion/view.html:107 +#, fuzzy +msgid "Permit this version" msgstr "Permettre la version" -#: motion/templates/motion/view.html:262 -msgid "Reject Version" +#: motion/templates/motion/view.html:110 +#, fuzzy +msgid "Reject this version" msgstr "Rejeter la version " -#: motion/templates/motion/view.html:266 -msgid "Version rejected" +#: motion/templates/motion/view.html:114 +#, fuzzy +msgid "This version is rejected" msgstr "Version rejetée" -#: motion/templates/motion/view.html:276 motion/templates/motion/view.html:283 -#: motion/templates/motion/view.html:290 +#: motion/templates/motion/view.html:124 motion/templates/motion/view.html:131 +#: motion/templates/motion/view.html:138 msgid "unchanged" msgstr "non modifié" -#: motion/templates/motion/view.html:299 -msgid "Log" -msgstr "Log" +#: motion/templates/motion/view.html:148 +#, fuzzy +msgid "Show log" +msgstr "Projeter l'élection" -#: motion/templates/motion/widget.html:31 +#: motion/templates/motion/view.html:193 motion/templates/motion/view.html:225 +msgid "New vote" +msgstr "Nouveau vote" + +#: motion/templates/motion/view.html:207 +msgid "Edit Vote" +msgstr "Modifier le vote" + +#: motion/templates/motion/view.html:208 +msgid "Delete Vote" +msgstr "Supprimer le vote" + +#: motion/templates/motion/view.html:232 +#, fuzzy +msgid "No results" +msgstr "Résultat du vote" + +#: motion/templates/motion/view.html:247 +#, fuzzy +msgid "Withdraw motion" +msgstr "Retirer" + +#: motion/templates/motion/view.html:255 +#, fuzzy +msgid "Unsupport motion" +msgstr "Peut soutenir les motions" + +#: motion/templates/motion/view.html:261 +msgid "Support" +msgstr "Soutenir" + +#: motion/templates/motion/view.html:268 +msgid "minimum required supporters" +msgstr "Nombres minimum de partisans requis" + +#: motion/templates/motion/view.html:275 +msgid "Manage motion" +msgstr "Gérer la motion" + +#: motion/templates/motion/view.html:278 +msgid "Formal validation" +msgstr "Validation formelle" + +#: motion/templates/motion/view.html:280 +msgid "Publish" +msgstr "Publier" + +#: motion/templates/motion/view.html:283 +msgid "Permit" +msgstr "Permettre" + +#: motion/templates/motion/view.html:286 +#, fuzzy +msgid "Not permit" +msgstr "Non autorisé (rejeter)" + +#: motion/templates/motion/view.html:289 +msgid "Set number" +msgstr "Insérer un numéro" + +#: motion/templates/motion/view.html:294 +msgid "Result after vote" +msgstr "Résultat après le vote" + +#: motion/templates/motion/view.html:326 +#, fuzzy +msgid "Withdrawed by Submitter" +msgstr "Retiré par le requérant" + +#: motion/templates/motion/view.html:333 +msgid "For Administration only:" +msgstr "Seulement pour les administrateurs" + +#: motion/templates/motion/view.html:335 +msgid "Reset" +msgstr "Réinitialiser" + +#: motion/templates/motion/widget.html:27 msgid "No motion available." msgstr "Aucune motion disponible" @@ -1735,77 +1761,78 @@ msgstr "Aucun résultat de sondage disponible" msgid "Participant" msgstr "Participant" -#: participant/forms.py:27 participant/views.py:607 -#: participant/templates/participant/group_overview.html:7 -#: participant/templates/participant/group_overview.html:10 -#: participant/templates/participant/user_detail.html:14 +#: participant/forms.py:28 participant/views.py:605 +#: participant/templates/participant/group_overview.html:6 +#: participant/templates/participant/group_overview.html:9 +#: participant/templates/participant/overview.html:21 +#: participant/templates/participant/user_detail.html:18 msgid "Groups" msgstr "Groupe" -#: participant/forms.py:52 +#: participant/forms.py:53 msgid "Permissions" msgstr "Permissions" -#: participant/forms.py:55 participant/views.py:546 participant/views.py:593 -#: participant/templates/participant/base_participant.html:12 +#: participant/forms.py:56 participant/views.py:543 participant/views.py:591 +#: participant/templates/participant/config.html:10 #: participant/templates/participant/overview.html:7 -#: participant/templates/participant/overview.html:18 -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:16 +#: participant/templates/participant/overview.html:95 msgid "Participants" msgstr "Participants" -#: participant/forms.py:92 +#: participant/forms.py:93 msgid "You can not edit the name for this group." msgstr "Vous ne pouvez pas modifier le nom de ce groupe." -#: participant/forms.py:96 +#: participant/forms.py:97 #, python-format msgid "Group name \"%s\" is reserved for internal use." msgstr "Ce nom de groupe \"%s\" est réservé pour une utilisation interne." -#: participant/forms.py:118 +#: participant/forms.py:121 msgid "System URL" msgstr "URL du système" -#: participant/forms.py:119 participant/forms.py:124 +#: participant/forms.py:122 participant/forms.py:127 msgid "Printed in PDF of first time passwords only." msgstr "" "Imprimé dans le PDF avec la liste des premiers mots de passe seulement." -#: participant/forms.py:127 +#: participant/forms.py:130 msgid "Sort participants by first name" msgstr "Classer les participants par prénom" -#: participant/forms.py:128 +#: participant/forms.py:131 msgid "Disable for sorting by last name" msgstr "Désactiver le classement par nom" -#: participant/models.py:33 participant/templates/participant/overview.html:25 +#: participant/models.py:33 participant/templates/participant/overview.html:57 msgid "Male" msgstr "Masculin" -#: participant/models.py:34 participant/templates/participant/overview.html:26 +#: participant/models.py:34 participant/templates/participant/overview.html:58 msgid "Female" msgstr "Féminin" -#: participant/models.py:37 participant/templates/participant/overview.html:38 +#: participant/models.py:37 participant/templates/participant/overview.html:70 msgid "Delegate" msgstr "Délégué" -#: participant/models.py:38 participant/templates/participant/overview.html:39 +#: participant/models.py:38 participant/templates/participant/overview.html:71 msgid "Observer" msgstr "Observateur" -#: participant/models.py:39 participant/templates/participant/overview.html:40 +#: participant/models.py:39 participant/templates/participant/overview.html:72 msgid "Staff" msgstr "Personnel" -#: participant/models.py:40 participant/templates/participant/overview.html:41 +#: participant/models.py:40 participant/templates/participant/overview.html:73 msgid "Guest" msgstr "Invité" -#: participant/models.py:45 participant/templates/participant/overview.html:30 -#: participant/templates/participant/overview.html:68 +#: participant/models.py:45 participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:102 msgid "Structure level" msgstr "Niveau de structure" @@ -1813,8 +1840,8 @@ msgstr "Niveau de structure" msgid "Will be shown after the name." msgstr "Apparait après le nom." -#: participant/models.py:49 participant/templates/participant/overview.html:24 -#: participant/templates/participant/user_detail.html:24 +#: participant/models.py:49 participant/templates/participant/overview.html:56 +#: participant/templates/participant/user_detail.html:28 msgid "Gender" msgstr "Sexe" @@ -1826,15 +1853,15 @@ msgstr "Seulement pour filtrer la liste des utilisateurs." msgid "Typ" msgstr "Type" -#: participant/models.py:54 participant/views.py:255 -#: participant/templates/participant/overview.html:45 -#: participant/templates/participant/overview.html:70 -#: participant/templates/participant/user_detail.html:34 +#: participant/models.py:54 participant/views.py:248 +#: participant/templates/participant/overview.html:77 +#: participant/templates/participant/overview.html:104 +#: participant/templates/participant/user_detail.html:38 msgid "Committee" msgstr "Comité" #: participant/models.py:57 -#: participant/templates/participant/user_detail.html:39 +#: participant/templates/participant/user_detail.html:43 msgid "About me" msgstr "A propos de moi" @@ -1870,98 +1897,100 @@ msgstr "Par exemple, comme initiant d'une motion." msgid "Welcome to OpenSlides!" msgstr "Bienvenue sur OpenSlides!" -#: participant/views.py:207 +#: participant/views.py:200 msgid "You can not delete yourself." msgstr "Vous ne pouvez pas vous suprimer vous même." -#: participant/views.py:228 +#: participant/views.py:221 msgid "You can not deactivate yourself." msgstr "Vous ne pouvez pas vous désactiver vous-même" -#: participant/views.py:231 +#: participant/views.py:224 msgid "You can not deactivate the administrator." msgstr "Vous ne pouvez pas désactiver l'administrateur." -#: participant/views.py:250 +#: participant/views.py:243 msgid "Participant-list" msgstr "Liste des participants" -#: participant/views.py:251 +#: participant/views.py:244 msgid "List of Participants" msgstr "La liste des participants" -#: participant/views.py:254 participant/templates/participant/overview.html:67 +#: participant/views.py:247 +#: participant/templates/participant/overview.html:101 msgid "Last Name" msgstr "Nom" -#: participant/views.py:254 participant/templates/participant/overview.html:66 +#: participant/views.py:247 +#: participant/templates/participant/overview.html:100 msgid "First Name" msgstr "Prénom" -#: participant/views.py:254 -#: participant/templates/participant/group_overview.html:13 +#: participant/views.py:247 +#: participant/templates/participant/group_overview.html:18 msgid "Group" msgstr "Groupe" -#: participant/views.py:254 participant/templates/participant/overview.html:37 -#: participant/templates/participant/overview.html:69 -#: participant/templates/participant/user_detail.html:29 +#: participant/views.py:247 participant/templates/participant/overview.html:69 +#: participant/templates/participant/overview.html:103 +#: participant/templates/participant/user_detail.html:33 msgid "Type" msgstr "Type" -#: participant/views.py:286 +#: participant/views.py:279 msgid "Participant-passwords" msgstr "Mot de passe du participant" -#: participant/views.py:308 +#: participant/views.py:301 msgid "Account for OpenSlides" msgstr "Compte pour OpenSlides" -#: participant/views.py:310 +#: participant/views.py:303 #, python-format msgid "for %s" msgstr "pour %s" -#: participant/views.py:313 +#: participant/views.py:306 #, python-format msgid "User: %s" msgstr "Utilisateur: %s" -#: participant/views.py:317 +#: participant/views.py:310 #, python-format msgid "Password: %s" msgstr "Mot de passe: %s" -#: participant/views.py:322 +#: participant/views.py:315 #, python-format msgid "URL: %s" msgstr "URL: %s" -#: participant/views.py:364 +#: participant/views.py:357 #, python-format msgid "%d new participants were successfully imported." msgstr "%d nouveaux participants ont été importés avec succès. " -#: participant/views.py:375 +#: participant/views.py:368 msgid "Do you really want to reset the password?" msgstr "Voulez-vous vraiment reinitialser le mot de passe?" -#: participant/views.py:388 +#: participant/views.py:381 #, python-format msgid "The Password for %s was successfully reset." msgstr "Le mot de passe de %s a été initialisé avec succès" -#: participant/views.py:445 +#: participant/views.py:438 msgid "You can not delete this Group." msgstr "Vous ne pouvez pas suprimer se groupe." -#: participant/views.py:473 +#: participant/views.py:466 msgid "Participants settings successfully saved." msgstr "" "Les modifications des paramètres des participants ont été appliquées avec " "succès" -#: participant/views.py:483 +#: participant/views.py:476 #, python-format msgid "" "Installation was successfully! Use %(user)s (password: %(password)s) for " @@ -1975,197 +2004,172 @@ msgstr "" "ce message apparaîtra toujours pour tout le monde et pourrait représenter un " "risque de sécurité." -#: participant/views.py:506 +#: participant/views.py:502 msgid "User settings successfully saved." msgstr "Les paramètres d'utilisateurs ont été enregistrés avec succès." -#: participant/views.py:528 +#: participant/views.py:525 msgid "Password successfully changed." msgstr "Le mot de passe a été changé avec succès." -#: participant/views.py:579 +#: participant/views.py:577 msgid "My motions and elections" msgstr "Mes motions et élections" -#: participant/templates/participant/base_participant.html:15 -msgid "All participants" -msgstr "Tout les participants" - -#: participant/templates/participant/base_participant.html:18 -#: participant/templates/participant/edit.html:10 -#: participant/templates/participant/edit.html:19 -msgid "New participant" -msgstr "Nouveau participant" - -#: participant/templates/participant/base_participant.html:19 -msgid "All groups" -msgstr "Tout les groupes" - -#: participant/templates/participant/base_participant.html:20 -#: participant/templates/participant/group_edit.html:10 -#: participant/templates/participant/group_edit.html:18 -msgid "New group" -msgstr "Nouveau groupe" - -#: participant/templates/participant/base_participant.html:21 -#: participant/templates/participant/import.html:5 -#: participant/templates/participant/import.html:8 -msgid "Import participants" -msgstr "Importer des participants" - -#: participant/templates/participant/base_participant.html:24 -msgid "List of participants as PDF" -msgstr "La liste des participants en PDF" - -#: participant/templates/participant/base_participant.html:27 -msgid "First time passwords as PDF" -msgstr "La liste des premiers mots de passe en PDF" - -#: participant/templates/participant/base_participant.html:38 -msgid "View participant" -msgstr "Afficher participant" - -#: participant/templates/participant/base_participant.html:45 -#: participant/templates/participant/edit.html:8 -#: participant/templates/participant/edit.html:17 -#: participant/templates/participant/overview.html:94 -msgid "Edit participant" -msgstr "Modifier le participant" - -#: participant/templates/participant/base_participant.html:50 -#: participant/templates/participant/overview.html:98 -msgid "Delete participant" -msgstr "Supprimer le participant" - -#: participant/templates/participant/base_participant.html:60 -msgid "View group" -msgstr "Afficher le groupe" - -#: participant/templates/participant/base_participant.html:65 -#: participant/templates/participant/group_edit.html:8 -#: participant/templates/participant/group_edit.html:16 -#: participant/templates/participant/group_overview.html:19 -msgid "Edit group" -msgstr "Modifier le groupe" - -#: participant/templates/participant/base_participant.html:71 -#: participant/templates/participant/group_overview.html:21 -msgid "Delete group" -msgstr "Supprimer le groupe" - #: participant/templates/participant/config.html:5 -#: participant/templates/participant/config.html:8 msgid "Participant settings" msgstr "Paramètres du participant" -#: participant/templates/participant/edit.html:26 +#: participant/templates/participant/edit.html:8 +#: participant/templates/participant/edit.html:17 +msgid "Edit participant" +msgstr "Modifier le participant" + +#: participant/templates/participant/edit.html:10 +#: participant/templates/participant/edit.html:19 +#: participant/templates/participant/overview.html:20 +msgid "New participant" +msgstr "Nouveau participant" + +#: participant/templates/participant/edit.html:30 msgid "Reset to First Password" msgstr "Initialiser au premier mot de passe" -#: participant/templates/participant/group_detail.html:14 +#: participant/templates/participant/group_detail.html:18 msgid "Members" msgstr "Membres" -#: participant/templates/participant/group_detail.html:19 +#: participant/templates/participant/group_detail.html:24 msgid "No members available." msgstr "Aucun membre n'est disponible" -#: participant/templates/participant/group_overview.html:27 -#: participant/templates/participant/group_widget.html:24 +#: participant/templates/participant/group_edit.html:8 +#: participant/templates/participant/group_edit.html:17 +msgid "Edit group" +msgstr "Modifier le groupe" + +#: participant/templates/participant/group_edit.html:10 +#: participant/templates/participant/group_edit.html:19 +#: participant/templates/participant/group_overview.html:11 +msgid "New group" +msgstr "Nouveau groupe" + +#: participant/templates/participant/group_overview.html:12 +#, fuzzy +msgid "Back to participants overview" +msgstr "Aucun participant disponible" + +#: participant/templates/participant/group_widget.html:21 msgid "No groups available." msgstr "Aucun groupe n'est disponible" +#: participant/templates/participant/import.html:5 #: participant/templates/participant/import.html:9 +#: participant/templates/participant/overview.html:22 +msgid "Import participants" +msgstr "Importer des participants" + +#: participant/templates/participant/import.html:15 msgid "Select a CSV file to import participants!" msgstr "Selectionnez un fichier CSV pour importer des participants" -#: participant/templates/participant/import.html:12 +#: participant/templates/participant/import.html:18 msgid "" "first_name, last_name, gender, structure level, type, committee, comment" msgstr "prénom, nom, sexe, position, type, comité, commentaire" -#: participant/templates/participant/login.html:8 -#: participant/templates/participant/login.html:16 -#: participant/templates/participant/login.html:58 templates/base.html:32 -msgid "Login" -msgstr "Connexion" - -#: participant/templates/participant/login.html:21 -#: participant/templates/participant/login.html:34 templates/base.html:57 -#: templates/base.html.py:64 -msgid "Close this notification" -msgstr "Fermez cette notification" - -#: participant/templates/participant/login.html:27 +#: participant/templates/participant/login.html:19 msgid "Your username and password were not accepted. Please try again." msgstr "" "Votre nom d'utilisateur et votre mot de passe n'ont pas été acceptés. " "Veuillez essayer à nouveau." -#: participant/templates/participant/login.html:62 +#: participant/templates/participant/login.html:38 +msgid "Username" +msgstr "" + +#: participant/templates/participant/login.html:42 +#, fuzzy +msgid "Password" +msgstr "Mot de passe: %s" + +#: participant/templates/participant/login.html:47 +#: participant/templates/participant/overview.html:37 templates/base.html:46 +msgid "Login" +msgstr "Connexion" + +#: participant/templates/participant/login.html:51 msgid "Continue as guest" msgstr "Continuer en tant qu'invité" -#: participant/templates/participant/overview.html:27 +#: participant/templates/participant/overview.html:21 +#, fuzzy +msgid "All groups" +msgstr "Tout les groupes" + +#: participant/templates/participant/overview.html:33 +#, fuzzy +msgid "List of participants" +msgstr "La liste des participants" + +#: participant/templates/participant/overview.html:34 +#, fuzzy +msgid "First time passwords" +msgstr "La liste des premiers mots de passe en PDF" + #: participant/templates/participant/overview.html:42 +#, fuzzy +msgid "Print list of participants as PDF" +msgstr "La liste des participants en PDF" + +#: participant/templates/participant/overview.html:45 +#, fuzzy +msgid "Print first time passwords as PDF" +msgstr "La liste des premiers mots de passe en PDF" + +#: participant/templates/participant/overview.html:59 +#: participant/templates/participant/overview.html:74 msgid "Not specified" msgstr "Non spécifié" -#: participant/templates/participant/overview.html:53 projector/models.py:63 +#: participant/templates/participant/overview.html:85 projector/models.py:63 msgid "Active" msgstr "Actif" -#: participant/templates/participant/overview.html:54 +#: participant/templates/participant/overview.html:86 msgid "Inactive" msgstr "Inactif" -#: participant/templates/participant/overview.html:60 +#: participant/templates/participant/overview.html:93 msgid "participant" msgid_plural "participants" msgstr[0] "participant" msgstr[1] "participants" -#: participant/templates/participant/overview.html:62 +#: participant/templates/participant/overview.html:95 msgid "of" msgstr "de" -#: participant/templates/participant/overview.html:73 -#: participant/templates/participant/user_detail.html:49 +#: participant/templates/participant/overview.html:107 +#: participant/templates/participant/user_detail.html:53 msgid "Last Login" msgstr "Dernière connexion" -#: participant/templates/participant/overview.html:102 -msgid "Change status to inactive" +#: participant/templates/participant/overview.html:143 +#, fuzzy +msgid "Change status (active/inactive)" msgstr "Changer le statut sur inactif" -#: participant/templates/participant/overview.html:105 -msgid "Change status to active" -msgstr "Changer le statut sur actif" - -#: participant/templates/participant/overview.html:115 -#: participant/templates/participant/user_widget.html:22 +#: participant/templates/participant/overview.html:153 +#: participant/templates/participant/user_widget.html:19 msgid "No participants available." msgstr "Aucun participant disponible" #: participant/templates/participant/password_change.html:5 -#: participant/templates/participant/password_change.html:11 -#: participant/templates/participant/password_change.html:16 -#: participant/templates/participant/settings.html:11 +#: participant/templates/participant/password_change.html:8 msgid "Password Settings" msgstr "Paramètres du mot de passe" -#: participant/templates/participant/password_change.html:8 -#: participant/templates/participant/settings.html:8 templates/base.html:29 -msgid "User Settings" -msgstr "Paramètres d'utilisateur" - -#: participant/templates/participant/password_change.html:10 -#: participant/templates/participant/settings.html:5 -#: participant/templates/participant/settings.html:10 -#: participant/templates/participant/settings.html:16 -msgid "Personal Settings" -msgstr "Paramètres personnels" - #: participant/templates/participant/personal_info_widget.html:5 msgid "I submitted the following motions:" msgstr "Je propose les motions suivantes:" @@ -2184,11 +2188,17 @@ msgstr "Je soutien les motions suivantes" msgid "I am candidate for the following elections:" msgstr "Je suis candidat aux élections suivantes" -#: participant/templates/participant/user_detail.html:19 +#: participant/templates/participant/settings.html:5 +#: participant/templates/participant/settings.html:8 templates/base.html:40 +#, fuzzy +msgid "Edit profile" +msgstr "Modifier l'élément" + +#: participant/templates/participant/user_detail.html:23 msgid "The participant is not member of any group." msgstr "Le participant n'est membre d'aucun groupe" -#: participant/templates/participant/user_detail.html:53 +#: participant/templates/participant/user_detail.html:57 msgid "The participant has not logged in yet." msgstr "Le participant ne s'est pas encore authentifié." @@ -2220,89 +2230,78 @@ msgstr "Peut voir la vue d'ensemble" msgid "Errors in the form" msgstr "Erreurs dans le formulaire" -#: projector/views.py:375 projector/templates/projector/base_projector.html:7 -#: projector/templates/projector/base_projector.html:12 -#: projector/templates/projector/dashboard.html:17 +#: projector/views.py:375 projector/templates/projector/dashboard.html:18 msgid "Dashboard" msgstr "Vue d'ensemble" -#: projector/views.py:402 +#: projector/views.py:403 msgid "Projector live view" msgstr "Vue projecteur live" -#: projector/views.py:428 +#: projector/views.py:429 msgid "Overlays" msgstr "Superpositions" -#: projector/views.py:440 +#: projector/views.py:441 msgid "Custom Slides" msgstr "Diapositives personnalisées" -#: projector/templates/projector/base_projector.html:15 -msgid "Overview" -msgstr "Vue d'ensemble" - -#: projector/templates/projector/base_projector.html:18 -#: projector/templates/projector/select_widgets.html:5 -#: projector/templates/projector/select_widgets.html:8 -msgid "Select widgets" -msgstr "Sélectionner les composants" - -#: projector/templates/projector/base_projector.html:22 -msgid "Projector view" -msgstr "Vue projecteur" - -#: projector/templates/projector/control_countdown.html:6 +#: projector/templates/projector/control_countdown.html:7 msgctxt "seconds" msgid "s" msgstr "s" -#: projector/templates/projector/control_countdown.html:7 -msgid "Save as default" +#: projector/templates/projector/control_countdown.html:9 +#, fuzzy +msgid "Save time as default" msgstr "Enregistrer par défault " -#: projector/templates/projector/control_countdown.html:10 -#: projector/templates/projector/control_countdown.html:11 +#: projector/templates/projector/control_countdown.html:12 msgid "Reset countdown" msgstr "Remettre le compte à rebours à zéro" -#: projector/templates/projector/control_countdown.html:13 +#: projector/templates/projector/control_countdown.html:15 msgid "Start countdown" msgstr "Démarrer le compte à rebours" -#: projector/templates/projector/control_countdown.html:16 +#: projector/templates/projector/control_countdown.html:18 msgid "Stop countdown" msgstr "Arrêter le compte à rebours " -#: projector/templates/projector/control_overlay_message.html:11 +#: projector/templates/projector/control_overlay_message.html:10 msgid "Clean message" msgstr "Supprimer le message" -#: projector/templates/projector/custom_slide_widget.html:14 +#: projector/templates/projector/custom_slide_widget.html:12 msgid "Welcome Page" msgstr "Page d'accueil" -#: projector/templates/projector/custom_slide_widget.html:41 -msgid "New slide" -msgstr "nouvelle diapositive" +#: projector/templates/projector/dashboard.html:20 +#, fuzzy +msgid "Manage widgets" +msgstr "Sélectionner les composants" -#: projector/templates/projector/live_view_widget.html:10 +#: projector/templates/projector/dashboard.html:20 +msgid "Widgets" +msgstr "" + +#: projector/templates/projector/live_view_widget.html:8 msgid "Zoom in" msgstr "Zoom avant" -#: projector/templates/projector/live_view_widget.html:13 +#: projector/templates/projector/live_view_widget.html:11 msgid "Zoom out" msgstr "Zoom arrière" -#: projector/templates/projector/live_view_widget.html:18 +#: projector/templates/projector/live_view_widget.html:16 msgid "Scroll text up" msgstr "Faire défiler le texte vers le haut" -#: projector/templates/projector/live_view_widget.html:21 +#: projector/templates/projector/live_view_widget.html:19 msgid "Scroll text down" msgstr "Faire défiler le texte vers le bas" -#: projector/templates/projector/live_view_widget.html:26 +#: projector/templates/projector/live_view_widget.html:24 msgid "Reset projector view" msgstr "Remettre la vue projecteur à zéro" @@ -2311,7 +2310,21 @@ msgstr "Remettre la vue projecteur à zéro" msgid "Custom slide" msgstr "Diapositive personnalisée" -#: projector/templates/projector/select_widgets.html:17 +#: projector/templates/projector/overlay_widget.html:22 +msgid "Countdown for speaking time" +msgstr "" + +#: projector/templates/projector/overlay_widget.html:26 +#, fuzzy +msgid "Message" +msgstr "Supprimer le message" + +#: projector/templates/projector/select_widgets.html:5 +#: projector/templates/projector/select_widgets.html:8 +msgid "Select widgets" +msgstr "Sélectionner les composants" + +#: projector/templates/projector/select_widgets.html:23 msgid "No widgets available" msgstr "Pas d'éléments disponibles." @@ -2323,19 +2336,20 @@ msgstr "N'a pas pu trouver la page." msgid "Server Error" msgstr "Erreur du serveur" -#: templates/base.html:21 +#: templates/base.html:29 msgid "Home" msgstr "Accueil" -#: templates/base.html:27 +#: templates/base.html:41 +#, fuzzy +msgid "Change password" +msgstr "Premier mot de passe" + +#: templates/base.html:43 msgid "Logout" msgstr "Déconnecter" -#: templates/base.html:30 -msgid "Welcome" -msgstr "Bienvenue" - -#: templates/base.html:79 +#: templates/base.html:100 msgid "" "Get professional " "support for OpenSlides." @@ -2343,52 +2357,170 @@ msgstr "" "Obtenir un support " "professionel pour OpenSlides." -#: utils/pdf.py:227 +#: utils/pdf.py:226 #, python-format msgid "As of: %s" msgstr "A partir de: %s" -#: utils/pdf.py:238 utils/pdf.py:247 +#: utils/pdf.py:237 utils/pdf.py:246 #, python-format msgid "Page %s" msgstr "Page %s" -#: utils/utils.py:63 utils/views.py:287 +#: utils/utils.py:59 utils/views.py:283 #, python-format msgid "Do you really want to delete %s?" msgstr "Voulez-vous vraiment supprimer %s?" -#: utils/utils.py:110 +#: utils/utils.py:106 msgid "Sorry, you have no rights to see this page." msgstr "Désolé, vous n'avez pas le droit de voir cette page" -#: utils/views.py:106 +#: utils/views.py:102 msgid "Are you sure?" msgstr "Etes-vous sûr?" -#: utils/views.py:107 +#: utils/views.py:103 msgid "Thank you for your answer" msgstr "Merci pour votre réponse" -#: utils/views.py:244 +#: utils/views.py:240 #, python-format msgid "%s was successfully modified." msgstr "%s a été modifié avec succès." -#: utils/views.py:275 +#: utils/views.py:271 #, python-format msgid "%s was successfully created." msgstr "%s a été créé avec succès." -#: utils/views.py:293 +#: utils/views.py:289 #, python-format msgid "%s was successfully deleted." msgstr "%s a été supprimé avec succès" -#: utils/views.py:308 +#: utils/views.py:304 msgid "undefined-filename" msgstr "nom de fichier indéterminé" #: utils/jsonfield/fields.py:22 msgid "Enter valid JSON" msgstr "Entrez un JSON valide" + +#, fuzzy +#~ msgid "Countdown" +#~ msgstr "Arrêter le compte à rebours " + +#~ msgid "Activate summary for this item" +#~ msgstr "Activez le résumé pour cet élément" + +#, fuzzy +#~ msgid "Show agenda" +#~ msgstr "Nouveau point dans l'ordre du jour" + +#, fuzzy +#~ msgid "Activate agenda" +#~ msgstr "Activez l'élément" + +#~ msgid "Show item" +#~ msgstr "Afficher l'élément" + +#, fuzzy +#~ msgid "User groups" +#~ msgstr "Nouveau groupe" + +#~ msgid "All items" +#~ msgstr "Tous les éléments" + +#~ msgid "View item" +#~ msgstr "Afficher l'élément" + +#~ msgid "Mark item as done" +#~ msgstr "Marquez l'élément comme terminé" + +#~ msgid "Item closed" +#~ msgstr "Elément fermé" + +#~ msgid "Done" +#~ msgstr "Terminé" + +#~ msgid "All elections" +#~ msgstr "Toutes les élections" + +#~ msgid "View election" +#~ msgstr "Afficher l'élection" + +#~ msgid "Election as PDF" +#~ msgstr "L'élection en PDF" + +#~ msgid "Activate election" +#~ msgstr "Activer l'élection" + +#~ msgid "All motions" +#~ msgstr "Toutes les motions" + +#~ msgid "View motion" +#~ msgstr "Afficher la motion" + +#~ msgid "Motion as PDF" +#~ msgstr "Motion dans un PDF" + +#~ msgid "Number" +#~ msgstr "Numéro" + +#~ msgid "Activate motion" +#~ msgstr "Activer la motion" + +#~ msgid "Enter result" +#~ msgstr "Insérer le résultat" + +#~ msgid "Unsupport" +#~ msgstr "Ne plus soutenir" + +#~ msgid "Result after debate" +#~ msgstr "Résultat après la discussion" + +#~ msgid "Version authorized" +#~ msgstr "Version autorisée" + +#~ msgid "Log" +#~ msgstr "Log" + +#~ msgid "All participants" +#~ msgstr "Tout les participants" + +#~ msgid "View participant" +#~ msgstr "Afficher participant" + +#~ msgid "Delete participant" +#~ msgstr "Supprimer le participant" + +#~ msgid "View group" +#~ msgstr "Afficher le groupe" + +#~ msgid "Delete group" +#~ msgstr "Supprimer le groupe" + +#~ msgid "Close this notification" +#~ msgstr "Fermez cette notification" + +#~ msgid "Change status to active" +#~ msgstr "Changer le statut sur actif" + +#~ msgid "User Settings" +#~ msgstr "Paramètres d'utilisateur" + +#~ msgid "Personal Settings" +#~ msgstr "Paramètres personnels" + +#~ msgid "Overview" +#~ msgstr "Vue d'ensemble" + +#~ msgid "Projector view" +#~ msgstr "Vue projecteur" + +#~ msgid "New slide" +#~ msgstr "nouvelle diapositive" + +#~ msgid "Welcome" +#~ msgstr "Bienvenue" diff --git a/openslides/main.py b/openslides/main.py index d25305a4d..b94eebfda 100755 --- a/openslides/main.py +++ b/openslides/main.py @@ -90,6 +90,10 @@ def process_options(argv=None): parser.add_option( "--no-reload", action="store_true", help="Do not reload the development server.") + parser.add_option( + "--no-browser", + action="store_false", dest="start_browser", default=True, + help="Do not automatically start web browser.") parser.add_option( "--version", action="store_true", help="Show version and exit.") @@ -172,7 +176,11 @@ def _main(opts, database_path=None): extra_args = ['--noreload'] else: extra_args = [] - start_openslides(addr, port, start_browser_url=url, extra_args=extra_args) + + if opts.start_browser: + start_browser(url) + + start_openslides(addr, port, extra_args=extra_args) def create_settings(settings_path, database_path=None): diff --git a/openslides/motion/__init__.py b/openslides/motion/__init__.py index e69de29bb..d9b4927bc 100644 --- a/openslides/motion/__init__.py +++ b/openslides/motion/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + openslides.motion + ~~~~~~~~~~~~~~~~~ + + The OpenSlides motion app appends the functionality to OpenSlides, to + manage motions. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +import openslides.motion.signals +import openslides.motion.slides diff --git a/openslides/motion/forms.py b/openslides/motion/forms.py index 6fbfc9cff..ed1b02155 100644 --- a/openslides/motion/forms.py +++ b/openslides/motion/forms.py @@ -2,68 +2,101 @@ # -*- coding: utf-8 -*- """ openslides.motion.forms - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~ - Forms for the motion app. + Defines the DjangoForms for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext as _ from openslides.utils.forms import CssClassMixin from openslides.utils.person import PersonFormField, MultiplePersonFormField -from openslides.motion.models import Motion +from .models import Motion +from .workflow import motion_workflow_choices -class MotionForm(forms.Form, CssClassMixin): +class BaseMotionForm(forms.ModelForm, CssClassMixin): + """Base FormClass for a Motion. + + For it's own, it append the version data es fields. + + The Class can be mixed with the following Mixins to add fields for the + submitter, supporters etc. + """ + title = forms.CharField(widget=forms.TextInput(), label=_("Title")) + """Title of the Motion. Will be saved in a MotionVersion object.""" + text = forms.CharField(widget=forms.Textarea(), label=_("Text")) + """Text of the Motion. Will be saved in a MotionVersion object.""" + reason = forms.CharField( widget=forms.Textarea(), required=False, label=_("Reason")) - - -class MotionFormTrivialChanges(MotionForm): - trivial_change = forms.BooleanField( - required=False, label=_("Trivial change"), - help_text=_("Trivial changes don't create a new version.")) - - -class MotionManagerForm(forms.ModelForm, CssClassMixin): - submitter = PersonFormField(label=_("Submitter")) + """Reason of the Motion. will be saved in a MotionVersion object.""" class Meta: model = Motion - exclude = ('number', 'status', 'permitted', 'log', 'supporter') + fields = () + + def __init__(self, *args, **kwargs): + """Fill the FormFields releated to the version data with initial data.""" + self.motion = kwargs.get('instance', None) + self.initial = kwargs.setdefault('initial', {}) + if self.motion is not None: + self.initial['title'] = self.motion.title + self.initial['text'] = self.motion.text + self.initial['reason'] = self.motion.reason + super(BaseMotionForm, self).__init__(*args, **kwargs) -class MotionManagerFormSupporter(MotionManagerForm): - # TODO: Do not show the submitter in the user-list +class MotionSubmitterMixin(forms.ModelForm): + """Mixin to append the submitter field to a MotionForm.""" + + submitter = MultiplePersonFormField(label=_("Submitter")) + """Submitter of the Motion. Can be one or more persons.""" + + def __init__(self, *args, **kwargs): + """Fill in the submitter of the motion as default value.""" + if self.motion is not None: + submitter = [submitter.person.person_id for submitter in self.motion.submitter.all()] + self.initial['submitter'] = submitter + super(MotionSubmitterMixin, self).__init__(*args, **kwargs) + + +class MotionSupporterMixin(forms.ModelForm): + """Mixin to append the supporter field to a Motionform.""" + supporter = MultiplePersonFormField(required=False, label=_("Supporters")) + """Supporter of the Motion. Can be one or more persons.""" + + def __init__(self, *args, **kwargs): + """Fill in the supporter of the motions as default value.""" + if self.motion is not None: + supporter = [supporter.person.person_id for supporter in self.motion.supporter.all()] + self.initial['supporter'] = supporter + super(MotionSupporterMixin, self).__init__(*args, **kwargs) -class MotionImportForm(forms.Form, CssClassMixin): - csvfile = forms.FileField( - widget=forms.FileInput(attrs={'size': '50'}), - label=_("CSV File"), - ) - import_permitted = forms.BooleanField( - required=False, - label=_("Import motions with status \"authorized\""), - help_text=_('Set the initial status for each motion to ' - '"authorized"'), - ) +class MotionCreateNewVersionMixin(forms.ModelForm): + """Mixin to add the option to the form, to choose, to create a new version.""" + + new_version = forms.BooleanField( + required=False, label=_("Create new version"), initial=True, + help_text=_("Trivial changes don't create a new version.")) + """BooleanField to decide, if a new version will be created, or the + last_version will be used.""" -class ConfigForm(forms.Form, CssClassMixin): +class ConfigForm(CssClassMixin, forms.Form): + """Form for the configuration tab of OpenSlides.""" motion_min_supporters = forms.IntegerField( widget=forms.TextInput(attrs={'class': 'small-input'}), label=_("Number of (minimum) required supporters for a motion"), - initial=4, - min_value=0, - max_value=8, + initial=4, min_value=0, max_value=8, help_text=_("Choose 0 to disable the supporting system"), ) motion_preamble = forms.CharField( @@ -98,9 +131,18 @@ class ConfigForm(forms.Form, CssClassMixin): label=_("Preamble text for PDF document (all motions)") ) - motion_allow_trivial_change = forms.BooleanField( - label=_("Allow trivial changes"), - help_text=_('Warning: Trivial changes undermine the motions ' - 'autorisation system.'), + motion_create_new_version = forms.ChoiceField( + widget=forms.Select(), + label=_("Create new versions"), required=False, + choices=( + ('ALLWASY_CREATE_NEW_VERSION', _('create allways a new versions')), + ('NEVER_CREATE_NEW_VERSION', _('create never a new version')), + ('ASK_USER', _('Let the user choose if he wants to create a new version'))) ) + + motion_workflow = forms.ChoiceField( + widget=forms.Select(), + label=_("Workflow for the motions"), + required=True, + choices=motion_workflow_choices()) diff --git a/openslides/motion/models.py b/openslides/motion/models.py index 7127e521c..adcfcabec 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -2,11 +2,14 @@ # -*- coding: utf-8 -*- """ openslides.motion.models - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~ Models for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + To use a motion object, you only have to import the Motion class. Any + functionality can be reached from a motion object. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ @@ -17,7 +20,7 @@ from django.db import models from django.db.models import Max from django.dispatch import receiver from django.utils.translation import pgettext -from django.utils.translation import ugettext_lazy as _, ugettext_noop, ugettext +from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ from openslides.utils.utils import _propper_unicode from openslides.utils.person import PersonField @@ -30,577 +33,622 @@ from openslides.projector.api import register_slidemodel from openslides.projector.models import SlideMixin from openslides.agenda.models import Item - -class MotionSupporter(models.Model): - motion = models.ForeignKey("Motion") - person = PersonField() +from .workflow import (motion_workflow_choices, get_state, State, WorkflowError, + DUMMY_STATE) -class Motion(models.Model, SlideMixin): +class Motion(SlideMixin, models.Model): + """The Motion Class. + + This class is the main entry point to all other classes related to a motion. + """ + prefix = "motion" - STATUS = ( - ('pub', _('Published')), - ('per', _('Permitted')), - ('acc', _('Accepted')), - ('rej', _('Rejected')), - ('wit', _('Withdrawed')), - ('adj', _('Adjourned')), - ('noc', _('Not Concerned')), - ('com', _('Commited a bill')), - ('nop', _('Rejected (not authorized)')), - ('rev', _('Needs Review')), # Where is this status used? - #additional actions: - # edit - # delete - # setnumber - # support - # unsupport - # createitem - # activateitem - # genpoll - ) + """Prefix for the slide system.""" - submitter = PersonField(verbose_name=_("Submitter")) - number = models.PositiveSmallIntegerField(blank=True, null=True, - unique=True) - status = models.CharField(max_length=3, choices=STATUS, default='pub') - permitted = models.ForeignKey('AVersion', related_name='permitted', - null=True, blank=True) - log = models.TextField(blank=True, null=True) + active_version = models.ForeignKey('MotionVersion', null=True, + related_name="active_version") + """Points to a specific version. + + Used be the permitted-version-system to deside witch version is the active + Version. Could also be used to only choose a specific version as a default + version. Like the Sighted versions on Wikipedia. + """ + + state_id = models.CharField(max_length=3) + """The id of a state object. + + This Attribute is used be motion.state to identify the current state of the + motion. + """ + + identifier = models.CharField(max_length=255, null=True, blank=True, + unique=True) + """A string as human readable identifier for the motion.""" + + # category = models.ForeignKey('Category', null=True, blank=True) + # TODO: proposal + #master = models.ForeignKey('self', null=True, blank=True) + + class Meta: + permissions = ( + ('can_see_motion', ugettext_noop('Can see motions')), + ('can_create_motion', ugettext_noop('Can create motions')), + ('can_support_motion', ugettext_noop('Can support motions')), + ('can_manage_motion', ugettext_noop('Can manage motions')), + ) + # TODO: order per default by category and identifier + # ordering = ('number',) + + def __unicode__(self): + """Return a human readable name of this motion.""" + return self.get_title() + + # TODO: Use transaction + def save(self, *args, **kwargs): + """Save the motion. + + 1. Set the state of a new motion to the default motion. + 2. Save the motion object. + 3. Save the version Data. + 4. Set the active version for the motion. + + A new version will be saved if motion.new_version was called + between the creation of this object and the last call of motion.save() + + or + + If the motion has new version data (title, text, reason) + + and + + the config 'motion_create_new_version' is set to + 'ALLWASY_CREATE_NEW_VERSION'. + """ + if not self.state_id: + self.reset_state() + + super(Motion, self).save(*args, **kwargs) + + # Find out if the version data has changed + for attr in ['title', 'text', 'reason']: + if not self.versions.exists(): + new_data = True + break + if getattr(self, attr) != getattr(self.last_version, attr): + new_data = True + break + else: + new_data = False + + need_new_version = config['motion_create_new_version'] == 'ALLWASY_CREATE_NEW_VERSION' + if hasattr(self, '_new_version') or (new_data and need_new_version): + version = self.new_version + del self._new_version + version.motion = self # Test if this line is realy neccessary. + elif new_data and not need_new_version: + version = self.last_version + else: + # We do not need to save the motion version. + return + + # Save title, text and reason in the version object + for attr in ['title', 'text', 'reason']: + _attr = '_%s' % attr + try: + setattr(version, attr, getattr(self, _attr)) + delattr(self, _attr) + except AttributeError: + if self.versions.exists(): + # If the _attr was not set, use the value from last_version + setattr(version, attr, getattr(self.last_version, attr)) + + # Set version_number of the new Version (if neccessary) and save it into the DB + if version.id is None: + # TODO: auto increment the version_number in the Database + version_number = self.versions.aggregate(Max('version_number'))['version_number__max'] or 0 + version.version_number = version_number + 1 + version.save() + + # Set the active Version of this motion. This has to be done after the + # version is saved to the db + if not self.state.version_permission or self.active_version is None: + self.active_version = version + self.save() + + def get_absolute_url(self, link='detail'): + """Return an URL for this version. + + The keywordargument 'link' can be 'detail', 'view', 'edit' or 'delete'. + """ + if link == 'view' or link == 'detail': + return reverse('motion_detail', args=[str(self.id)]) + if link == 'edit': + return reverse('motion_edit', args=[str(self.id)]) + if link == 'delete': + return reverse('motion_delete', args=[str(self.id)]) + + def get_title(self): + """Get the title of the motion. + + The titel is taken from motion.version. + """ + try: + return self._title + except AttributeError: + return self.version.title + + def set_title(self, title): + """Set the titel of the motion. + + The titel will me saved into the version object, wenn motion.save() is + called. + """ + self._title = title + + title = property(get_title, set_title) + """The title of the motion. + + Is saved in a MotionVersion object. + """ + + def get_text(self): + """Get the text of the motion. + + Simular to get_title(). + """ + try: + return self._text + except AttributeError: + return self.version.text + + def set_text(self, text): + """ Set the text of the motion. + + Simular to set_title(). + """ + self._text = text + + text = property(get_text, set_text) + """The text of a motin. + + Is saved in a MotionVersion object. + """ + + def get_reason(self): + """Get the reason of the motion. + + Simular to get_title(). + """ + try: + return self._reason + except AttributeError: + return self.version.reason + + def set_reason(self, reason): + """Set the reason of the motion. + + Simular to set_title(). + """ + self._reason = reason + + reason = property(get_reason, set_reason) + """The reason for the motion. + + Is saved in a MotionVersion object. + """ + + @property + def new_version(self): + """Return a Version object, not saved in the database. + + On the first call, it creates a new version. On any later call, it + use the existing new version. + + The new_version object will be deleted when it is saved into the db. + """ + try: + return self._new_version + except AttributeError: + self._new_version = MotionVersion(motion=self) + return self._new_version + + def get_version(self): + """Get the 'active' version object. + + This version will be used to get the data for this motion. + """ + try: + return self._version + except AttributeError: + return self.last_version + + def set_version(self, version): + """Set the 'active' version object. + + The keyargument 'version' can be a MotionVersion object or the + version_number of a VersionObject or None. + + If the argument is None, the newest version will be used. + """ + if version is None: + try: + del self._version + except AttributeError: + pass + else: + if type(version) is int: + version = self.versions.get(version_number=version) + elif type(version) is not MotionVersion: + raise ValueError('The argument \'version\' has to be int or ' + 'MotionVersion, not %s' % type(version)) + # TODO: Test, that the version is one of this motion + self._version = version + + version = property(get_version, set_version) + """The active version of this motion.""" @property def last_version(self): - """ - Return last version of the motion. - """ + """Return the newest version of the motion.""" + # TODO: Fix the case, that the motion has no Version try: - return AVersion.objects.filter(motion=self).order_by('id') \ - .reverse()[0] + return self.versions.order_by('-version_number')[0] except IndexError: - return None + return self.new_version - @property - def public_version(self): - """ - Return permitted, if the motion was permitted, else last_version - """ - if self.permitted is not None: - return self.permitted - else: - return self.last_version - - def accept_version(self, version, user=None): - """ - accept a Version - """ - self.permitted = version - self.save(nonewversion=True) - version.rejected = False - version.save() - self.writelog(_("Version %d authorized") % version.aid, user) - - def reject_version(self, version, user=None): - if version.id > self.permitted.id: - version.rejected = True - version.save() - self.writelog(pgettext( - "Rejected means not authorized", "Version %d rejected") - % version.aid, user) - return True - return False - - @property - def versions(self): - """ - Return a list of all versions of the motion. - """ - return AVersion.objects.filter(motion=self) - - @property - def creation_time(self): - """ - Return the time of the creation of the motion. - """ - try: - return self.versions[0].time - except IndexError: - return None - - @property - def notes(self): - """ - Return some information of the motion. - """ - note = [] - if self.status == "pub" and not self.enough_supporters: - note.append(ugettext("Searching for supporters.")) - if self.status == "pub" and self.permitted is None: - note.append(ugettext("Not yet authorized.")) - elif self.unpermitted_changes and self.permitted: - note.append(ugettext("Not yet authorized changes.")) - return note - - @property - def unpermitted_changes(self): - """ - Return True if the motion has unpermitted changes. - - The motion has unpermitted changes, if the permitted-version - is not the lastone and the lastone is not rejected. - TODO: rename the property in unchecked__changes - """ - if (self.last_version != self.permitted and - not self.last_version.rejected): - return True - else: - return False - - @property - def supporters(self): - return sorted([object.person for object in self.motionsupporter_set.all()], - key=lambda person: person.sort_name) + def is_submitter(self, person): + """Return True, if person is a submitter of this motion. Else: False.""" + self.submitter.filter(person=person).exists() def is_supporter(self, person): - try: - return self.motionsupporter_set.filter(person=person).exists() - except AttributeError: - return False - - @property - def enough_supporters(self): - """ - Return True, if the motion has enough supporters - """ - min_supporters = int(config['motion_min_supporters']) - if self.status == "pub": - return self.count_supporters() >= min_supporters - else: - return True - - def count_supporters(self): - return self.motionsupporter_set.count() - - @property - def missing_supporters(self): - """ - Return number of missing supporters - """ - min_supporters = int(config['motion_min_supporters']) - delta = min_supporters - self.count_supporters() - if delta > 0: - return delta - else: - return 0 - - def save(self, user=None, nonewversion=False, trivial_change=False): - """ - Save the Motion, and create a new AVersion if necessary - """ - super(Motion, self).save() - if nonewversion: - return - last_version = self.last_version - fields = ["text", "title", "reason"] - if last_version is not None: - changed_fields = [ - f for f in fields - if getattr(last_version, f) != getattr(self, f)] - if not changed_fields: - return # No changes - try: - if trivial_change and last_version is not None: - last_version.text = self.text - last_version.title = self.title - last_version.reason = self.reason - last_version.save() - - meta = AVersion._meta - field_names = [ - unicode(meta.get_field(f).verbose_name) - for f in changed_fields] - - self.writelog( - _("Trivial changes to version %(version)d; " - "changed fields: %(changed_fields)s") - % dict(version=last_version.aid, - changed_fields=", ".join(field_names))) - return # Done - - version = AVersion( - title=getattr(self, 'title', ''), - text=getattr(self, 'text', ''), - reason=getattr(self, 'reason', ''), - motion=self) - version.save() - self.writelog(_("Version %s created") % version.aid, user) - is_manager = user.has_perm('motion.can_manage_motion') - except AttributeError: - is_manager = False - - supporters = self.motionsupporter_set.all() - if (self.status == "pub" and - supporters and not is_manager): - supporters.delete() - self.writelog(_("Supporters removed"), user) - - def reset(self, user): - """ - Reset the motion. - """ - self.status = "pub" - self.permitted = None - self.save() - self.writelog(_("Status reseted to: %s") % (self.get_status_display()), user) + """Return True, if person is a supporter of this motion. Else: False.""" + return self.supporter.filter(person=person).exists() def support(self, person): - """ - Add a Supporter to the list of supporters of the motion. - """ - if person == self.submitter: - # TODO: Use own Exception - raise NameError('Supporter can not be the submitter of a ' - 'motion.') - if not self.is_supporter(person): - MotionSupporter(motion=self, person=person).save() - self.writelog(_("Supporter: +%s") % (person)) - # TODO: Raise a precise exception for the view in else-clause + """Add 'person' as a supporter of this motion.""" + if self.state.support: + if not self.is_supporter(person): + MotionSupporter(motion=self, person=person).save() + else: + raise WorkflowError("You can not support a motion in state %s" % self.state.name) def unsupport(self, person): + """Remove 'person' as supporter from this motion.""" + if self.state.support: + self.supporter.filter(person=person).delete() + else: + raise WorkflowError("You can not unsupport a motion in state %s" % self.state.name) + + def create_poll(self): + """Create a new poll for this motion. + + Return the new poll object. """ - remove a supporter from the list of supporters of the motion + if self.state.create_poll: + # TODO: auto increment the poll_number in the Database + poll_number = self.polls.aggregate(Max('poll_number'))['poll_number__max'] or 0 + poll = MotionPoll.objects.create(motion=self, poll_number=poll_number + 1) + poll.set_options() + return poll + else: + raise WorkflowError("You can not create a poll in state %s" % self.state.name) + + def get_state(self): + """Return the state of the motion. + + State is a State object. See openslides.motion.workflow for more informations. """ try: - self.motionsupporter_set.get(person=person).delete() - except MotionSupporter.DoesNotExist: - # TODO: Don't do nothing but raise a precise exception for the view - pass + return get_state(self.state_id) + except WorkflowError: + return DUMMY_STATE + + def set_state(self, next_state): + """Set the state of this motion. + + The keyargument 'next_state' has to be a State object or an id of a + State object. + """ + if not isinstance(next_state, State): + next_state = get_state(next_state) + if next_state in self.state.next_states: + self.state_id = next_state.id else: - self.writelog(_("Supporter: -%s") % (person)) + raise WorkflowError('%s is not a valid next_state' % next_state) - def set_number(self, number=None, user=None): - """ - Set a number for ths motion. - """ - if self.number is not None: - # TODO: Use own Exception - raise NameError('This motion has already a number.') - if number is None: - try: - number = Motion.objects.aggregate(Max('number'))['number__max'] + 1 - except TypeError: - number = 1 - self.number = number - self.save() - self.writelog(_("Number set: %s") % (self.number), user) - return self.number + state = property(get_state, set_state) + """The state of the motion as Ste object.""" - def permit(self, user=None): - """ - Change the status of this motion to permit. - """ - self.set_status(user, "per") - aversion = self.last_version - if self.number is None: - self.set_number() - self.permitted = aversion - self.save() - self.writelog(_("Version %s authorized") % (aversion.aid), user) - return self.permitted - - def notpermit(self, user=None): - """ - Change the status of this motion to 'not permitted (rejected)'. - """ - self.set_status(user, "nop") - #TODO: reject last version - if self.number is None: - self.set_number() - self.save() - self.writelog(_("Version %s not authorized") % (self.last_version.aid), user) - - def set_status(self, user, status, force=False): - """ - Set the status of the motion. - """ - error = True - for a, b in Motion.STATUS: - if status == a: - error = False - break - if error: - # TODO: Use the Right Error - raise NameError(_('%s is not a valid status.') % status) - if self.status == status: - # TODO: Use the Right Error - raise NameError(_('The motion status is already \'%s.\'') - % self.status) - - actions = [] - actions = self.get_allowed_actions(user) - if status not in actions and not force: - #TODO: Use the Right Error - raise NameError(_( - 'The motion status is: \'%(currentstatus)s\'. ' - 'You can not set the status to \'%(newstatus)s\'.') % { - 'currentstatus': self.status, - 'newstatus': status}) - - oldstatus = self.get_status_display() - self.status = status - self.save() - self.writelog(_("Status modified") + ": %s -> %s" - % (oldstatus, self.get_status_display()), user) - - def get_allowed_actions(self, user): - """ - Return a list of all the allowed status. - """ - actions = [] - - # check if user allowed to withdraw an motion - if ((self.status == "pub" - and self.number - and user == self.submitter) - or (self.status == "pub" - and self.number - and user.has_perm("motion.can_manage_motion")) - or (self.status == "per" - and user == self.submitter) - or (self.status == "per" - and user.has_perm("motion.can_manage_motion"))): - actions.append("wit") - #Check if the user can review the motion - if (self.status == "rev" - and (self.submitter == user - or user.has_perm("motion.can_manage_motion"))): - actions.append("pub") - - # Check if the user can support and unspoort the motion - if (self.status == "pub" - and user != self.submitter - and not self.is_supporter(user)): - actions.append("support") - - if self.status == "pub" and self.is_supporter(user): - actions.append("unsupport") - - #Check if the user can edit the motion - if (user == self.submitter \ - and (self.status in ('pub', 'per'))) \ - or user.has_perm("motion.can_manage_motion"): - actions.append("edit") - - # Check if the user can delete the motion (admin, manager, owner) - # reworked as requiered in #100 - if (user.has_perm("motion.can_delete_all_motions") or - (user.has_perm("motion.can_manage_motion") and - self.number is None) or - (self.submitter == user and self.number is None)): - actions.append("delete") - - #For the rest, all actions need the manage permission - if not user.has_perm("motion.can_manage_motion"): - return actions - - if self.status == "pub": - actions.append("nop") - actions.append("per") - if self.number == None: - actions.append("setnumber") - - if self.status == "per": - actions.append("acc") - actions.append("rej") - actions.append("adj") - actions.append("noc") - actions.append("com") - actions.append("genpoll") - if self.unpermitted_changes: - actions.append("permitversion") - actions.append("rejectversion") - - return actions - - def delete(self, force=False): - """ - Delete the motion. It is not possible, if the motion has - allready a number - """ - if self.number and not force: - raise NameError('The motion has already a number. ' - 'You can not delete it.') - - for item in Item.objects.filter(related_sid=self.sid): - item.delete() - super(Motion, self).delete() - - def writelog(self, text, user=None): - if not self.log: - self.log = "" - self.log += u"%s | %s" % (datetime.now().strftime("%d.%m.%Y %H:%M:%S"), _propper_unicode(text)) - if user is not None: - if isinstance(user, User): - self.log += u" (%s %s)" % (_("by"), _propper_unicode(user.username)) - else: - self.log += u" (%s %s)" % (_("by"), _propper_unicode(str(user))) - self.log += "\n" - self.save() - - def get_agenda_title(self): - return self.public_version.title - - def get_agenda_title_supplement(self): - number = self.number or '[%s]' % ugettext('no number') - return '(%s %s)' % (ugettext('motion'), number) - - def __getattr__(self, name): - """ - if name is title, text, reason or time, - Return this attribute from the newest version of the motion - """ - if name in ('title', 'text', 'reason', 'time', 'aid'): - try: - if name == 'aid': - return self.last_version.aid - return self.last_version.__dict__[name] - except TypeError: - raise AttributeError(name) - except AttributeError: - raise AttributeError(name) - raise AttributeError(name) - - def gen_poll(self, user=None): - """ - Generates a poll object for the motion - """ - poll = MotionPoll(motion=self) - poll.save() - poll.set_options() - self.writelog(_("Poll created"), user) - return poll - - @property - def polls(self): - return self.motionpoll_set.all() - - @property - def results(self): - return self.get_poll_results() - - def get_poll_results(self): - """ - Return a list of voting results - """ - results = [] - for poll in self.polls: - for option in poll.get_options(): - if option.get_votes().exists(): - results.append(( - option['Yes'], option['No'], - option['Abstain'], poll.print_votesinvalid(), - poll.print_votescast())) - return results + def reset_state(self): + """Set the state to the default state.""" + self.state_id = get_state('default').id def slide(self): - """ - return the slide dict - """ + """Return the slide dict.""" data = super(Motion, self).slide() data['motion'] = self data['title'] = self.title data['template'] = 'projector/Motion.html' return data - def get_absolute_url(self, link='view'): - if link == 'view': - return reverse('motion_view', args=[str(self.id)]) - if link == 'edit': - return reverse('motion_edit', args=[str(self.id)]) - if link == 'delete': - return reverse('motion_delete', args=[str(self.id)]) + def get_agenda_title(self): + """Return a title for the Agenda.""" + return self.last_version.title - def __unicode__(self): - try: - return self.last_version.title - except AttributeError: - return "no title jet" + ## def get_agenda_title_supplement(self): + ## number = self.number or '[%s]' % ugettext('no number') + ## return '(%s %s)' % (ugettext('motion'), number) + + def get_allowed_actions(self, person): + """Return a dictonary with all allowed actions for a specific person. + + The dictonary contains the following actions. + + * edit + * delete + * create_poll + * support + * unsupport + * change_state + * reset_state + """ + actions = { + 'edit': ((self.is_submitter(person) and + self.state.edit_as_submitter) or + person.has_perm('motion.can_manage_motion')), + + 'create_poll': (person.has_perm('motion.can_manage_motion') and + self.state.create_poll), + + 'support': (self.state.support and + config['motion_min_supporters'] > 0 and + not self.is_submitter(person)), + + 'change_state': person.has_perm('motion.can_manage_motion'), + + } + actions['delete'] = actions['edit'] # TODO: Only if the motion has no number + actions['unsupport'] = actions['support'] + actions['reset_state'] = 'change_state' + return actions + + def write_log(self, message, person=None): + """Write a log message. + + Message should be in english and translatable. + + e.G: motion.write_log(ugettext_noob('Message Text')) + """ + MotionLog.objects.create(motion=self, message=message, person=person) + + def activate_version(self, version): + """Set the active state of a version to True. + + 'version' can be a version object, or the version_number of a version. + """ + if type(version) is int: + version = self.versions.get(version_number=version) + self.active_version = version + + if version.rejected: + version.rejected = False + version.save() + + def reject_version(self, version): + """Reject a version of this motion. + + 'version' can be a version object, or the version_number of a version. + """ + if type(version) is int: + version = self.versions.get(version_number=version) + + if version.active: + raise MotionError('The active version can not be rejected') + + version.rejected = True + version.save() + + +class MotionVersion(models.Model): + """ + A MotionVersion object saves some date of the motion.""" + + motion = models.ForeignKey(Motion, related_name='versions') + """The Motion, to witch the version belongs.""" + + version_number = models.PositiveIntegerField(default=1) + """An id for this version in realation to a motion. + + Is unique for each motion. + """ + + title = models.CharField(max_length=255, verbose_name=ugettext_lazy("Title")) + """The Title of a motion.""" + + text = models.TextField(verbose_name=_("Text")) + """The text of a motion.""" + + reason = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Reason")) + """The reason for a motion.""" + + rejected = models.BooleanField(default=False) + """Saves, if the version is rejected.""" + + creation_time = models.DateTimeField(auto_now=True) + """Time, when the version was saved.""" + + #identifier = models.CharField(max_length=255, verbose_name=ugettext_lazy("Version identifier")) + #note = models.TextField(null=True, blank=True) class Meta: - permissions = ( - ('can_see_motion', ugettext_noop("Can see motions")), - ('can_create_motion', ugettext_noop("Can create motions")), - ('can_support_motion', ugettext_noop("Can support motions")), - ('can_manage_motion', ugettext_noop("Can manage motions")), - ) - ordering = ('number',) - - -class AVersion(models.Model): - title = models.CharField(max_length=100, verbose_name=_("Title")) - text = models.TextField(verbose_name=_("Text")) - reason = models.TextField(null=True, blank=True, verbose_name=_("Reason")) - rejected = models.BooleanField() # = Not Permitted - time = models.DateTimeField(auto_now=True) - motion = models.ForeignKey(Motion) + unique_together = ("motion", "version_number") def __unicode__(self): - return "%s %s" % (self.id, self.title) + """Return a string, representing this object.""" + counter = self.version_number or _('new') + return "%s Version %s" % (self.motion, counter) + + def get_absolute_url(self, link='detail'): + """Return the URL of this Version. + + The keyargument link can be 'view' or 'detail'. + """ + if link == 'view' or link == 'detail': + return reverse('motion_version_detail', args=[str(self.motion.id), + str(self.version_number)]) @property - def aid(self): - try: - return self._aid - except AttributeError: - self._aid = AVersion.objects \ - .filter(motion=self.motion) \ - .filter(id__lte=self.id).count() - return self._aid + def active(self): + """Return True, if the version is the active version of a motion. Else: False.""" + return self.active_version.exists() -register_slidemodel(Motion) + +class MotionSubmitter(models.Model): + """Save the submitter of a Motion.""" + + motion = models.ForeignKey('Motion', related_name="submitter") + """The motion to witch the object belongs.""" + + person = PersonField() + """The person, who is the submitter.""" + + def __unicode__(self): + """Return the name of the submitter as string.""" + return unicode(self.person) + + +class MotionSupporter(models.Model): + """Save the submitter of a Motion.""" + + motion = models.ForeignKey('Motion', related_name="supporter") + """The motion to witch the object belongs.""" + + person = PersonField() + """The person, who is the supporter.""" + + def __unicode__(self): + """Return the name of the supporter as string.""" + return unicode(self.person) + + +## class Category(models.Model): + ## name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name")) + ## prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix")) + + ## def __unicode__(self): + ## return self.name + + +## class Comment(models.Model): + ## motion_version = models.ForeignKey(MotionVersion) + ## text = models.TextField() + ## author = PersonField() + ## creation_time = models.DateTimeField(auto_now=True) + + +class MotionLog(models.Model): + """Save a logmessage for a motion.""" + + motion = models.ForeignKey(Motion, related_name='log_messages') + """The motion to witch the object belongs.""" + + message = models.CharField(max_length=255) + """The log message. + + Should be in english. + """ + + person = PersonField(null=True) + """A person object, who created the log message. Optional.""" + + time = models.DateTimeField(auto_now=True) + """The Time, when the loged action was performed.""" + + class Meta: + ordering = ['-time'] + + def __unicode__(self): + """Return a string, representing the log message.""" + # TODO: write time in the local time format. + if self.person is None: + return "%s %s" % (self.time, _(self.message)) + else: + return "%s %s by %s" % (self.time, _(self.message), self.person) + + +class MotionError(Exception): + """Exception raised when errors in the motion accure.""" + pass class MotionVote(BaseVote): + """Saves the votes for a MotionPoll. + + There should allways be three MotionVote objects for each poll, + one for 'yes', 'no', and 'abstain'.""" + option = models.ForeignKey('MotionOption') + """The option object, to witch the vote belongs.""" class MotionOption(BaseOption): + """Links between the MotionPollClass and the MotionVoteClass. + + There should be one MotionOption object for each poll.""" + poll = models.ForeignKey('MotionPoll') + """The poll object, to witch the object belongs.""" + vote_class = MotionVote + """The VoteClass, to witch this Class links.""" -class MotionPoll(BasePoll, CountInvalid, CountVotesCast): +class MotionPoll(CountInvalid, CountVotesCast, BasePoll): + """The Class to saves the poll results for a motion poll.""" + + motion = models.ForeignKey(Motion, related_name='polls') + """The motion to witch the object belongs.""" + option_class = MotionOption + """The option class, witch links between this object the the votes.""" + vote_values = [ ugettext_noop('Yes'), ugettext_noop('No'), ugettext_noop('Abstain')] + """The possible anwers for the poll. 'Yes, 'No' and 'Abstain'.""" - motion = models.ForeignKey(Motion) + poll_number = models.PositiveIntegerField(default=1) + """An id for this poll in realation to a motion. - def get_motion(self): - return self.motion + Is unique for each motion. + """ + + class Meta: + unique_together = ("motion", "poll_number") + + def __unicode__(self): + """Return a string, representing the poll.""" + return _('Ballot %d') % self.poll_number + + def get_absolute_url(self, link='edit'): + """Return an URL for the poll. + + The keyargument 'link' can be 'edit' or 'delete'. + """ + if link == 'edit': + return reverse('motion_poll_edit', args=[str(self.motion.pk), + str(self.poll_number)]) + if link == 'delete': + return reverse('motion_poll_delete', args=[str(self.motion.pk), + str(self.poll_number)]) def set_options(self): + """Create the option class for this poll.""" #TODO: maybe it is possible with .create() to call this without poll=self + # or call this in save() self.get_option_class()(poll=self).save() def append_pollform_fields(self, fields): + """Apend the fields for invalid and votecast to the ModelForm.""" CountInvalid.append_pollform_fields(self, fields) CountVotesCast.append_pollform_fields(self, fields) - - def get_absolute_url(self): - return reverse('motion_poll_view', args=[self.id]) - - def get_ballot(self): - return self.motion.motionpoll_set.filter(id__lte=self.id).count() - - -@receiver(default_config_value, dispatch_uid="motion_default_config") -def default_config(sender, key, **kwargs): - return { - 'motion_min_supporters': 0, - 'motion_preamble': _('The assembly may decide,'), - 'motion_pdf_ballot_papers_selection': 'CUSTOM_NUMBER', - 'motion_pdf_ballot_papers_number': '8', - 'motion_pdf_title': _('Motions'), - 'motion_pdf_preamble': '', - 'motion_allow_trivial_change': False, - }.get(key) diff --git a/openslides/motion/pdf.py b/openslides/motion/pdf.py new file mode 100644 index 000000000..fcee6c2e7 --- /dev/null +++ b/openslides/motion/pdf.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.pdf + ~~~~~~~~~~~~~~~~~~~~~ + + Functions to generate the PDFs for the motion app. +""" + +from reportlab.lib import colors +from reportlab.lib.units import cm +from reportlab.platypus import ( + SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle) +from django.utils.translation import ugettext as _ + +from openslides.config.models import config +from openslides.utils.pdf import stylesheet + +from .models import Motion + + +def motions_to_pdf(pdf): + """Create a PDF with all motions.""" + + motions = Motion.objects.all() + all_motion_cover(pdf, motions) + for motion in motions: + pdf.append(PageBreak()) + motion_to_pdf(pdf, motion) + + +def motion_to_pdf(pdf, motion): + """Create a PDF for one motion.""" + + pdf.append(Paragraph(_("Motion: %s") % motion.title, stylesheet['Heading1'])) + + motion_data = [] + + # submitter + cell1a = [] + cell1a.append(Spacer(0, 0.2 * cm)) + cell1a.append(Paragraph("%s:" % _("Submitter"), + stylesheet['Heading4'])) + cell1b = [] + cell1b.append(Spacer(0, 0.2 * cm)) + cell1b.append(Paragraph(unicode(motion.submitter), stylesheet['Normal'])) + motion_data.append([cell1a, cell1b]) + + # TODO: choose this in workflow + if motion.state.edit_as_submitter: + # Cell for the signature + cell2a = [] + cell2b = [] + cell2a.append(Paragraph("%s:" % + _("Signature"), stylesheet['Heading4'])) + cell2b.append(Paragraph(42 * "_", stylesheet['Signaturefield'])) + cell2b.append(Spacer(0, 0.1 * cm)) + cell2b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell2a, cell2b]) + + # supporters + if config['motion_min_supporters']: + cell3a = [] + cell3b = [] + cell3a.append(Paragraph("%s:" + % _("Supporters"), stylesheet['Heading4'])) + supporters = motion.supporter.all() + for supporter in supporters: + cell3b.append(Paragraph(".  %s" % unicode(supporter), + stylesheet['Signaturefield'])) + if motion.state.support: + for count in range(config['motion_min_supporters'] - supporters.count()): + cell3b.append(Paragraph(". " + 42 * "_", + stylesheet['Signaturefield'])) + cell3b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell3a, cell3b]) + + ## # status + ## cell4a = [] + ## cell4b = [] + ## note = " ".join(motion.notes) + ## cell4a.append(Paragraph("%s:" % _("Status"), stylesheet['Heading4'])) + ## if note != "": + ## if motion.status == "pub": + ## cell4b.append(Paragraph(note, stylesheet['Normal'])) + ## else: + ## cell4b.append(Paragraph("%s | %s" % (motion.get_status_display(), note), stylesheet['Normal'])) + ## else: + ## cell4b.append(Paragraph("%s" % motion.get_status_display(), stylesheet['Normal'])) + ## data.append([cell4a, cell4b]) + + # Motion state + cell4a = [] + cell4b = [] + cell4a.append(Paragraph("%s:" % _("State"), + stylesheet['Heading4'])) + cell4b.append(Paragraph(motion.state.name, stylesheet['Normal'])) + motion_data.append([cell4a, cell4b]) + + # Version number (aid) + if motion.versions.count() > 1: + cell5a = [] + cell5b = [] + cell5a.append(Paragraph("%s:" % _("Version"), + stylesheet['Heading4'])) + cell5b.append(Paragraph("%s" % motion.version.version_number, stylesheet['Normal'])) + motion_data.append([cell5a, cell5b]) + + # voting results + polls = [] + for poll in motion.polls.all(): + if not poll.has_votes(): + continue + polls.append(poll) + + if polls: + cell6a = [] + cell6b = [] + cell6a.append(Paragraph("%s:" % + _("Vote results"), stylesheet['Heading4'])) + ballotcounter = 0 + for poll in polls: + ballotcounter += 1 + option = poll.get_options()[0] + yes, no, abstain, invalid, votecast = ( + option['Yes'], option['No'], option['Abstain'], + poll.print_voteinvalid(), poll.print_votecast()) + + if len(polls) > 1: + cell6b.append(Paragraph("%s. %s" % (ballotcounter, _("Vote")), + stylesheet['Bold'])) + cell6b.append(Paragraph( + "%s: %s
      %s: %s
      %s: %s
      %s: %s
      %s: %s" % + (_("Yes"), yes, _("No"), no, _("Abstention"), abstain, _("Invalid"), + invalid, _("Votes cast"), votecast), stylesheet['Normal'])) + cell6b.append(Spacer(0, 0.2 * cm)) + motion_data.append([cell6a, cell6b]) + + # Creating Table + table = Table(motion_data) + table._argW[0] = 4.5 * cm + table._argW[1] = 11 * cm + table.setStyle(TableStyle([('BOX', (0, 0), (-1, -1), 1, colors.black), + ('VALIGN', (0, 0), (-1, -1), 'TOP')])) + pdf.append(table) + pdf.append(Spacer(0, 1 * cm)) + + pdf.append(Paragraph(motion.title, stylesheet['Heading3'])) + pdf.append(Paragraph(motion.text.replace('\r\n', '
      '), stylesheet['Paragraph'])) + if motion.reason: + pdf.append(Paragraph(_("Reason:"), stylesheet['Heading3'])) + pdf.append(Paragraph(motion.reason.replace('\r\n', '
      '), stylesheet['Paragraph'])) + return pdf + + +def all_motion_cover(pdf, motions): + """Create a coverpage for all motions.""" + pdf.append(Paragraph(config["motion_pdf_title"], stylesheet['Heading1'])) + + preamble = config["motion_pdf_preamble"] + if preamble: + pdf.append(Paragraph("%s" % preamble.replace('\r\n', '
      '), stylesheet['Paragraph'])) + + pdf.append(Spacer(0, 0.75 * cm)) + + if not motions: + pdf.append(Paragraph(_("No motions available."), stylesheet['Heading3'])) + else: + for motion in motions: + pdf.append(Paragraph(motion.title, stylesheet['Heading3'])) diff --git a/openslides/motion/signals.py b/openslides/motion/signals.py new file mode 100644 index 000000000..fb1dffd9a --- /dev/null +++ b/openslides/motion/signals.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.signales + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Signals for the motion app. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from openslides.config.signals import default_config_value + + +@receiver(default_config_value, dispatch_uid="motion_default_config") +def default_config(sender, key, **kwargs): + """Return the default config values for the motion app.""" + return { + 'motion_min_supporters': 0, + 'motion_preamble': _('The assembly may decide,'), + 'motion_pdf_ballot_papers_selection': 'CUSTOM_NUMBER', + 'motion_pdf_ballot_papers_number': '8', + 'motion_pdf_title': _('Motions'), + 'motion_pdf_preamble': '', + 'motion_create_new_version': 'ALLWASY_CREATE_NEW_VERSION', + 'motion_workflow': 'default'}.get(key) diff --git a/openslides/motion/slides.py b/openslides/motion/slides.py new file mode 100644 index 000000000..e269dc243 --- /dev/null +++ b/openslides/motion/slides.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.motion.slides + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Defines the Slides for the motion app. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from openslides.projector.api import register_slidemodel +from .models import Motion + +register_slidemodel(Motion) diff --git a/openslides/motion/templates/motion/base_motion.html b/openslides/motion/templates/motion/base_motion.html deleted file mode 100644 index 0dc5846a6..000000000 --- a/openslides/motion/templates/motion/base_motion.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'motion_overview' as url_motionoverview %} -

      {% trans "Motions" %}

      - - - {# second submenu #} - {% if motion %} -
      -

      {% trans "Motion No." %} - {% if motion.number != None %} - {{ motion.number }} - {% else %} - [-] - {% endif %} -

      - - {% endif %} -{% endblock %} diff --git a/openslides/motion/templates/motion/config.html b/openslides/motion/templates/motion/config.html index 42e064444..b36f60a68 100644 --- a/openslides/motion/templates/motion/config.html +++ b/openslides/motion/templates/motion/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Motion settings" %}{% endblock %} {% block content %} -

      {% trans "Motion settings" %}

      +

      + {% trans "Configuration" %} + {% trans "Motions" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

      {% csrf_token %} - {{ form.as_p }} -

      - - - - -

      + {% include "form.html" %} +

      + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

      + * {% trans "required" %}
      {% endblock %} diff --git a/openslides/motion/templates/motion/edit.html b/openslides/motion/templates/motion/edit.html deleted file mode 100644 index 7c5f09ed4..000000000 --- a/openslides/motion/templates/motion/edit.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load i18n %} - -{% block title %} - {{ block.super }} – - {% if motion %} - {% trans "Edit motion" %} - {% else %} - {% trans "New motion" %} - {% endif %} -{% endblock %} - -{% block content %} - {% if motion %} -

      {% trans "Edit motion" %}

      - {% else %} -

      {% trans "New motion" %}

      - {% endif %} - -
      {% csrf_token %} - {{ form.as_p }} - {{ managerform.as_p }} -

      - - - - - -

      - * {% trans "required" %} -
      - -{% endblock %} diff --git a/openslides/motion/templates/motion/import.html b/openslides/motion/templates/motion/import.html deleted file mode 100644 index 8a0d8eab1..000000000 --- a/openslides/motion/templates/motion/import.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load i18n %} - -{% block title %}{{ block.super }} – {% trans "Import motions" %} {% endblock %} - -{% block content %} -

      {% trans "Import motions" %}

      -

      {% trans 'Select a CSV file to import motions!' %}

      - -

      {% trans 'Required comma separated values' %}: - ({% trans 'number, title, text, reason, first_name, last_name, is_group' %}) -
      - {% trans 'number, reason and is_group are optional and may be empty' %}. -
      - {% trans 'Required CSV file encoding: UTF-8 (Unicode).' %} -

      - -

      {% trans 'A CSV example file is available in OpenSlides Wiki.' %} -

      - -
      {% csrf_token %} - {{ form.as_p }} -

      - - - - -

      - * {% trans "required" %} -
      -{% endblock %} diff --git a/openslides/motion/templates/motion/motion_detail.html b/openslides/motion/templates/motion/motion_detail.html new file mode 100644 index 000000000..dcafd3878 --- /dev/null +++ b/openslides/motion/templates/motion/motion_detail.html @@ -0,0 +1,100 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motion" %} "{{ motion.title }}"{% endblock %} + +{% block content %} +

      Titel: {{ motion.title }}

      +

      Text: {{ motion.text }}

      +

      Reason: {{ motion.reason }}

      +

      Submitter: {% for submitter in motion.submitter.all %}{{ submitter.person }} {% endfor %}

      +

      Supporter: {% for supporter in motion.supporter.all %}{{ supporter.person }} {% endfor %}

      +

      Active Version: {{ motion.active_version }}

      +

      State: {{ motion.state }}

      +

      possible stats:

      + + + +

      Versions

      +
        +{% for motion_version in motion.versions.all %} +
      1. + {% if motion_version.id == motion.version.id %} + {{ motion_version }} + {% else %} + {{ motion_version }} + {% endif %} + {% if motion_version.active %} + (active) + {% endif %} + {% if motion_version.rejected %} + (rejected) + {% endif %} +
      2. +{% endfor %} +
      + + +

      {% trans "Vote results" %}:

      + {% with motion.polls.all as polls %} +
        + {% for poll in polls %} + {% if perms.motion.can_manage_motion or poll.has_votes %} +
      • + {% if perms.motion.can_manage_motion %} + {{ forloop.counter }}. {% trans "Vote" %} + + + + + + + {% elif poll.has_votes %} + {{ forloop.counter }}. {% trans "Vote" %}: + {% endif %} +
        + {% if poll.has_votes %} + {% with poll.get_options.0 as option %} + {{ option.Yes }}
        + {{ option.No }}
        + {{ option.Abstain }}
        + {{ poll.print_votesinvalid }}
        +
        + {{ poll.print_votescast }} +
        + {% endwith %} + {% else %} + {% if perms.motion.can_manage_motion %} + + {% trans 'Enter result' %} + + {% endif %} + {% endif %} +
      • + {% endif %} + {% endfor %} +
      + {% if allowed_actions.create_poll %} + + {% trans 'New vote' %} + + {% endif %} + {% endwith %} + + +

      log

      +
        + {% for message in motion.log_messages.all %} +
      • {{ message }}
      • + {% endfor %} +
      + +{% endblock %} diff --git a/openslides/motion/templates/motion/motion_form.html b/openslides/motion/templates/motion/motion_form.html new file mode 100644 index 000000000..ddffb8254 --- /dev/null +++ b/openslides/motion/templates/motion/motion_form.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motion Form" %}{% endblock %} + +{% block content %} +

      {% trans "Motions Forms" %}

      +
      {% csrf_token %} + {{ form.as_p }} + + + + + + * {% trans "required" %} +
      +{% endblock %} diff --git a/openslides/motion/templates/motion/motion_list.html b/openslides/motion/templates/motion/motion_list.html new file mode 100644 index 000000000..9cb2e5506 --- /dev/null +++ b/openslides/motion/templates/motion/motion_list.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} +{% load staticfiles %} + +{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %} + +{% block content %} +

      {% trans "Motions" %}

      +
        + {% for motion in motion_list %} +
      1. {{ motion }}
      2. + {% endfor %} +
      +{% endblock %} diff --git a/openslides/motion/templates/motion/overview.html b/openslides/motion/templates/motion/overview.html deleted file mode 100644 index e11c6f2b5..000000000 --- a/openslides/motion/templates/motion/overview.html +++ /dev/null @@ -1,88 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %} - -{% block content %} -

      {% trans "Motions" %}

      -

      - {% trans "Filter" %}: - {% if min_supporters > 0 %} - {% trans "Need supporters" %}   - {% endif %} - {% trans "Without number" %}   - {% trans "Status" %}: - -
      -

      - {{ motions|length }} - {% blocktrans count counter=motions|length context "number of motions"%}motion{% plural %}motions{% endblocktrans %} - - - - - {% if min_supporters > 0 %} - - {% endif %} - - - - - - {% for app_info in motions %} - {% with motion=app_info.motion useractions=app_info.actions %} - - - - {% if min_supporters > 0 %} - - {% endif %} - - - - - - {% endwith %} - {% empty %} - - - - {% endfor %} -
      {% trans "Number" %}{% trans "Motion title" %}{% trans "Number of supporters" %}{% trans "Status" %}{% trans "Submitter" %}{% trans "Creation Time" %}{% trans "Actions" %}
      {% if motion.number %}{{ motion.number }}{% else %}-{% endif %}{{ motion.public_version.title }}{{ motion.count_supporters }}{% if motion.status != "pub" %} - {{ motion.get_status_display }}
      - {% endif %} - {% for note in motion.notes %} - {{ note }} - {% if not forloop.last %}
      {%endif%} - {% endfor %} -
      {{ motion.submitter }}{{ motion.creation_time }} - - {% if perms.projector.can_manage_projector %} - - - - {% endif %} - {% if perms.motion.can_manage_motion %} - - {% if "delete" in useractions %} - - {% endif %} - {% endif %} - - -
      {% trans "No motions available." %}
      -{% endblock %} diff --git a/openslides/motion/templates/motion/poll_form.html b/openslides/motion/templates/motion/poll_form.html new file mode 100644 index 000000000..f7cd3635a --- /dev/null +++ b/openslides/motion/templates/motion/poll_form.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% load i18n %} +{% load staticfiles %} +{% load tags %} + +{% block content %} +

      {{ motion }}

      + {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} +
      {% csrf_token %} + {{ pre_form }} + + + + + + + {% for value in forms.0 %} + + + + + {% endfor %} + + + + + + + + +
      {% trans "Option" %}{% trans "Votes" %}
      {{ value.label }}{{ value.errors }}{{ value }}
      {% trans "Invalid votes" %}{{ pollform.votesinvalid.errors }}{{ pollform.votesinvalid }}
      {% trans "Votes cast" %}{{ pollform.votescast.errors }}{{ pollform.votescast }}
      + + {{ post_form }} + +

      + + + + {% trans 'Cancel' %} + +

      +
      +{% endblock %} diff --git a/openslides/motion/templates/motion/poll_view.html b/openslides/motion/templates/motion/poll_view.html deleted file mode 100644 index 9894cd51e..000000000 --- a/openslides/motion/templates/motion/poll_view.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends 'motion/base_motion.html' %} - -{% load i18n %} -{% load staticfiles %} - -{% block title %} - {{ block.super }} – {% trans "Motion" %} "{{ motion.public_version.title }}" - – {{ ballot }}. {% trans "Vote" %} -{% endblock %} - -{% block content %} -

      {{ motion.public_version.title }} ({% trans "Motion" %} - {{ motion.number }}) – {{ ballot }}. {% trans "Vote" %}

      - {% trans "Special values" %}: -1 = {% trans 'majority' %}; -2 = {% trans 'undocumented' %} -
      {% csrf_token %} - {{ pre_form }} - - - - - - - - {% for value in forms.0 %} - - - - - {% endfor %} - - - - - - - - -
      {% trans "Option" %}{% trans "Votes" %}
      {{ value.label }}{{ value.errors }}{{ value }}
      {% trans "Invalid votes" %}{{ pollform.votesinvalid.errors }}{{ pollform.votesinvalid }}
      {% trans "Votes cast" %}{{ pollform.votescast.errors }}{{ pollform.votescast }}
      - - {{ post_form }} - -

      - - - -

      - -

      - - - - - -

      -
      -{% endblock %} diff --git a/openslides/motion/templates/motion/view.html b/openslides/motion/templates/motion/view.html deleted file mode 100644 index 18d61fa3d..000000000 --- a/openslides/motion/templates/motion/view.html +++ /dev/null @@ -1,303 +0,0 @@ -{% extends "motion/base_motion.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super }} – {% trans "Motion" %} "{{ version.title }}"{% endblock %} - - -{% block submenu %} - {{ block.super }} - -{% endblock %} - -{% block content %} - - - -
      -

      - {{ version.title }} - ({% trans "Motion" %} - {% if motion.number != None %} - {{ motion.number }}) - {% else %} - [{% trans "no number" %}]) - {% endif %} -

      - - {% trans "Version" %} {{ version.aid }} - - {% if motion.public_version != motion.last_version %} - ⋅ - {% if version == motion.public_version %} - {% trans "This is not the newest version." %} {% trans "Go to version" %} {{ motion.last_version.aid }}. - {% else %} - {% trans "This is not the authorized version." %} {% trans "Go to version" %} {{ motion.public_version.aid }}. - {% endif %} - {% endif %} - -

      {% trans "Motion" %}:

      - - {{ version.text|linebreaks }} - -

      {% trans "Reason" %}:

      - - {% if version.reason %} - {{ version.reason|linebreaks }} - {% else %} - – - {% endif %} - - - {% if motion.versions|length > 1 %} -

      {% trans "Version History" %}:

      - - - - - - - - - - - - {% for revision in motion.versions %} - - - - - - - - - {% endfor %} -
      {% trans "Version" %}{% trans "Time" %}{% trans "Title" %}{% trans "Text" %}{% trans "Reason" %}
      - {% if motion.status != "pub" %} - {% if revision == motion.permitted %} - - {% else %} - {% if perms.motion.can_manage_motion %} - - {% endif %} - {% if not revision.rejected and revision.id > motion.permitted.id and perms.motion.can_manage_motion %} - - {% endif %} - {% endif %} - {% if revision.rejected %} - - {% endif %} - {% endif %} - {{ revision.aid }}{{ revision.time }} - {% ifchanged %} - {{ revision.title }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} - - {% ifchanged %} - {{ revision.text|linebreaks }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} - - {% ifchanged %} - {{ revision.reason|linebreaks }} - {% else %} - [{% trans "unchanged" %}] - {% endifchanged %} -
      - {% endif %} - - {% if perms.motion.can_manage_motion %} -

      {% trans "Log" %}:

      - {{ motion.log|linebreaks }} - {% endif %} -
      -{% endblock %} diff --git a/openslides/motion/templates/motion/widget.html b/openslides/motion/templates/motion/widget.html index c0796de89..37302db51 100644 --- a/openslides/motion/templates/motion/widget.html +++ b/openslides/motion/templates/motion/widget.html @@ -1,21 +1,17 @@ -{% load staticfiles %} {% load i18n %} {% load tags %}
    @@ -65,7 +65,7 @@ {% trans "Motion" %} [{% trans "no number" %}] {% endif %} - {{ motion.public_version.title }} + {{ motion.title }}
    {% endblock %} diff --git a/openslides/motion/urls.py b/openslides/motion/urls.py index 177a5b04f..8ff7c0d33 100644 --- a/openslides/motion/urls.py +++ b/openslides/motion/urls.py @@ -2,140 +2,104 @@ # -*- coding: utf-8 -*- """ openslides.motion.urls - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~ - URL list for the motion app. + Defines the URL patterns for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns - -from openslides.motion.views import (MotionDelete, ViewPoll, - MotionPDF, MotionPollPDF, CreateAgendaItem, SupportView) +from django.conf.urls import url, patterns urlpatterns = patterns('openslides.motion.views', url(r'^$', - 'overview', - name='motion_overview', + 'motion_list', + name='motion_list', ), - url(r'^(?P\d+)/$', - 'view', - name='motion_view', - ), - - url(r'^(?P\d+)/agenda/$', - CreateAgendaItem.as_view(), - name='motion_create_agenda', - ), - - url(r'^(?P\d+)/newest/$', - 'view', - {'newest': True}, - name='motion_view_newest', - ), - - url(r'^new/$', - 'edit', + url(r'^create/$', + 'motion_create', name='motion_new', ), - url(r'^import/$', - 'motion_import', - name='motion_import', + url(r'^(?P\d+)/$', + 'motion_detail', + name='motion_detail', ), - url(r'^(?P\d+)/edit/$', - 'edit', + url(r'^(?P\d+)/edit/$', + 'motion_edit', name='motion_edit', ), - url(r'^(?P\d+)/del/$', - MotionDelete.as_view(), + url(r'^(?P\d+)/del/$', + 'motion_delete', name='motion_delete', ), - url(r'^del/$', - MotionDelete.as_view(), - { 'motion_id' : None , 'motion_ids' : None }, - name='motion_delete', + url(r'^(?P\d+)/version/(?P\d+)/$', + 'motion_detail', + name='motion_version_detail', ), - url(r'^(?P\d+)/setnumber/$', - 'set_number', - name='motion_set_number', - ), - - url(r'^(?P\d+)/setstatus/(?P[a-z]{3})/$', - 'set_status', - name='motion_set_status', - ), - - url(r'^(?P\d+)/permit/$', - 'permit', - name='motion_permit', - ), - - url(r'^version/(?P\d+)/permit/$', - 'permit_version', + url(r'^(?P\d+)/version/(?P\d+)/permit/$', + 'version_permit', name='motion_version_permit', ), - url(r'^version/(?P\d+)/reject/$', - 'reject_version', + url(r'^(?P\d+)/version/(?P\d+)/reject/$', + 'version_reject', name='motion_version_reject', ), - url(r'^(?P\d+)/notpermit/$', - 'notpermit', - name='motion_notpermit', - ), - - url(r'^(?P\d+)/reset/$', - 'reset', - name='motion_reset', - ), - - url(r'^(?P\d+)/support/$', - SupportView.as_view(support=True), + url(r'^(?P\d+)/support/$', + 'motion_support', name='motion_support', ), - url(r'^(?P\d+)/unsupport/$', - SupportView.as_view(support=False), + url(r'^(?P\d+)/unsupport/$', + 'motion_unsupport', name='motion_unsupport', ), - url(r'^(?P\d+)/gen_poll/$', - 'gen_poll', - name='motion_gen_poll', + url(r'^(?P\d+)/create_poll/$', + 'poll_create', + name='motion_poll_create', ), - url(r'^print/$', - MotionPDF.as_view(), - {'motion_id': None}, - name='print_motions', + url(r'^(?P\d+)/poll/(?P\d+)/edit/$', + 'poll_edit', + name='motion_poll_edit', ), - url(r'^(?P\d+)/print/$', - MotionPDF.as_view(), - name='print_motion', - ), - - url(r'^poll/(?P\d+)/print/$', - MotionPollPDF.as_view(), - name='print_motion_poll', - ), - - url(r'^poll/(?P\d+)/$', - ViewPoll.as_view(), - name='motion_poll_view', - ), - - url(r'^poll/(?P\d+)/del/$', - 'delete_poll', + url(r'^(?P\d+)/poll/(?P\d+)/del/$', + 'poll_delete', name='motion_poll_delete', ), + + url(r'^(?P\d+)/set_state/(?P[a-z]{3})/$', + 'set_state', + name='motion_set_state', + ), + + url(r'^(?P\d+)/reset_state/$', + 'reset_state', + name='motion_reset_state', + ), + + url(r'^(?P\d+)/agenda/$', + 'create_agenda_item', + name='motion_create_agenda', + ), + + url(r'^pdf/$', + 'motion_list_pdf', + name='motion_list_pdf', + ), + + url(r'^(?P\d+)/pdf/$', + 'motion_detail_pdf', + name='motion_detail_pdf', + ), ) diff --git a/openslides/motion/views.py b/openslides/motion/views.py index deff7eaef..9f26faec1 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -2,911 +2,479 @@ # -*- coding: utf-8 -*- """ openslides.motion.views - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~ Views for the motion app. - :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. + Will automaticly imported from openslides.motion.urls.py + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ -import csv -import os - -from urlparse import parse_qs - -from reportlab.lib import colors -from reportlab.lib.units import cm -from reportlab.platypus import ( - SimpleDocTemplate, PageBreak, Paragraph, Spacer, Table, TableStyle) - -from django.conf import settings -from django.contrib import messages -from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse +from django.contrib import messages from django.db import transaction -from django.shortcuts import redirect -from django.utils.translation import ugettext as _, ungettext +from django.db.models import Model +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop +from django.views.generic.detail import SingleObjectMixin +from django.http import Http404 -from openslides.utils import csv_ext from openslides.utils.pdf import stylesheet -from openslides.utils.template import Tab -from openslides.utils.utils import ( - template, permission_required, del_confirm_form, gen_confirm_form) from openslides.utils.views import ( - PDFView, RedirectView, DeleteView, FormView, SingleObjectMixin, - QuestionMixin) -from openslides.utils.person import get_person -from openslides.config.models import config -from openslides.projector.projector import Widget + TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView, + DetailView, ListView, FormView, QuestionMixin, SingleObjectMixin) +from openslides.utils.template import Tab +from openslides.utils.utils import html_strong from openslides.poll.views import PollFormView -from openslides.participant.api import gen_username, gen_password -from openslides.participant.models import User, Group +from openslides.projector.api import get_active_slide +from openslides.projector.projector import Widget, SLIDE +from openslides.config.models import config from openslides.agenda.models import Item -from openslides.motion.models import Motion, AVersion, MotionPoll -from openslides.motion.forms import ( - MotionForm, MotionFormTrivialChanges, MotionManagerForm, - MotionManagerFormSupporter, MotionImportForm, ConfigForm) + +from .models import Motion, MotionSubmitter, MotionSupporter, MotionPoll, MotionVersion +from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin, + MotionCreateNewVersionMixin, ConfigForm) +from .workflow import WorkflowError +from .pdf import motions_to_pdf, motion_to_pdf -@permission_required('motion.can_see_motion') -@template('motion/overview.html') -def overview(request): - """ - View all motions - """ - try: - sortfilter = parse_qs(request.COOKIES['votecollector_sortfilter']) - for value in sortfilter: - sortfilter[value] = sortfilter[value][0] - except KeyError: - sortfilter = {} +class MotionListView(ListView): + """View, to list all motions.""" + permission_required = 'motion.can_see_motion' + model = Motion - for value in [u'sort', u'reverse', u'number', u'status', u'needsup', u'statusvalue']: - if value in request.REQUEST: - if request.REQUEST[value] == '0': - try: - del sortfilter[value] - except KeyError: - pass - else: - sortfilter[value] = request.REQUEST[value] - - query = Motion.objects.all() - if 'number' in sortfilter: - query = query.filter(number=None) - if 'status' in sortfilter: - if 'statusvalue' in sortfilter and 'on' in sortfilter['status']: - query = query.filter(status__iexact=sortfilter['statusvalue']) - - if 'sort' in sortfilter: - if sortfilter['sort'] == 'title': - sort = 'aversion__title' - elif sortfilter['sort'] == 'time': - sort = 'aversion__time' - else: - sort = sortfilter['sort'] - query = query.order_by(sort) - if sort.startswith('aversion_'): - # limit result to last version of an motion - query = query.filter(aversion__id__in=[x.last_version.id for x in Motion.objects.all()]) - - if 'reverse' in sortfilter: - query = query.reverse() - - # todo: rewrite this with a .filter() - if 'needsup' in sortfilter: - motions = [] - for motion in query.all(): - if not motion.enough_supporters: - motions.append(motion) - else: - motions = query - - if type(motions) is not list: - motions = list(query.all()) - - # not the most efficient way to do this but 'get_allowed_actions' - # is not callable from within djangos templates.. - for (i, motion) in enumerate(motions): - try: - motions[i] = { - 'actions': motion.get_allowed_actions(request.user), - 'motion': motion - } - except: - # todo: except what? - motions[i] = { - 'actions': [], - 'motion': motion - } - - return { - 'motions': motions, - 'min_supporters': int(config['motion_min_supporters']), - } +motion_list = MotionListView.as_view() -@permission_required('motion.can_see_motion') -@template('motion/view.html') -def view(request, motion_id, newest=False): - """ - View one motion. - """ - motion = Motion.objects.get(pk=motion_id) - if newest: - version = motion.last_version - else: - version = motion.public_version - revisions = motion.versions - actions = motion.get_allowed_actions(user=request.user) - - return { - 'motion': motion, - 'revisions': revisions, - 'actions': actions, - 'min_supporters': int(config['motion_min_supporters']), - 'version': version, - #'results': motion.results - } - - -@login_required -@template('motion/edit.html') -def edit(request, motion_id=None): - """ - View a form to edit or create a motion. - """ - if request.user.has_perm('motion.can_manage_motion'): - is_manager = True - else: - is_manager = False - - if not is_manager \ - and not request.user.has_perm('motion.can_create_motion'): - messages.error(request, _("You have not the necessary rights to create or edit motions.")) - return redirect(reverse('motion_overview')) - if motion_id is not None: - motion = Motion.objects.get(id=motion_id) - if not 'edit' in motion.get_allowed_actions(request.user): - messages.error(request, _("You can not edit this motion.")) - return redirect(reverse('motion_view', args=[motion.id])) - actions = motion.get_allowed_actions(user=request.user) - else: - motion = None - actions = None - - formclass = MotionFormTrivialChanges \ - if config['motion_allow_trivial_change'] and motion_id \ - else MotionForm - - managerformclass = MotionManagerFormSupporter \ - if config['motion_min_supporters'] \ - else MotionManagerForm - - if request.method == 'POST': - dataform = formclass(request.POST, prefix="data") - valid = dataform.is_valid() - - if is_manager: - managerform = managerformclass(request.POST, - instance=motion, - prefix="manager") - valid = valid and managerform.is_valid() - else: - managerform = None - - if valid: - if is_manager: - motion = managerform.save(commit=False) - elif motion_id is None: - motion = Motion(submitter=request.user) - motion.title = dataform.cleaned_data['title'] - motion.text = dataform.cleaned_data['text'] - motion.reason = dataform.cleaned_data['reason'] +class GetVersionMixin(object): + """Mixin to set a specific version to a motion.""" + def get_object(self): + """Return a Motion object. The id is taken from the url and the version + is set to the version with the 'version_number' from the URL.""" + object = super(GetVersionMixin, self).get_object() + version_number = self.kwargs.get('version_number', None) + if version_number is not None: try: - trivial_change = config['motion_allow_trivial_change'] \ - and dataform.cleaned_data['trivial_change'] - except KeyError: - trivial_change = False - motion.save(request.user, trivial_change=trivial_change) - if is_manager: - try: - new_supporters = set(managerform.cleaned_data['supporter']) - except KeyError: - # The managerform has no field for the supporters - pass - else: - old_supporters = set(motion.supporters) - # add new supporters - for supporter in new_supporters.difference(old_supporters): - motion.support(supporter) - # remove old supporters - for supporter in old_supporters.difference(new_supporters): - motion.unsupport(supporter) - - if motion_id is None: - messages.success(request, _('New motion was successfully created.')) - else: - messages.success(request, _('Motion was successfully modified.')) - - if not 'apply' in request.POST: - return redirect(reverse('motion_view', args=[motion.id])) - if motion_id is None: - return redirect(reverse('motion_edit', args=[motion.id])) - else: - messages.error(request, _('Please check the form for errors.')) - else: - if motion_id is None: - initial = {'text': config['motion_preamble']} - else: - if motion.status == "pub" and motion.supporters: - if request.user.has_perm('motion.can_manage_motion'): - messages.warning(request, _("Attention: Do you really want to edit this motion? The supporters will not be removed automatically because you can manage motions. Please check if the supports are valid after your changing!")) - else: - messages.warning(request, _("Attention: Do you really want to edit this motion? All %s supporters will be removed! Try to convince the supporters again.") % motion.count_supporters() ) - initial = {'title': motion.title, - 'text': motion.text, - 'reason': motion.reason} - - dataform = formclass(initial=initial, prefix="data") - if is_manager: - if motion_id is None: - initial = {'submitter': request.user.person_id} - else: - initial = {'submitter': motion.submitter.person_id, - 'supporter': [supporter.person_id for supporter in motion.supporters]} - managerform = managerformclass(initial=initial, - instance=motion, prefix="manager") - else: - managerform = None - return { - 'form': dataform, - 'managerform': managerform, - 'motion': motion, - 'actions': actions, - } + object.version = int(version_number) + except MotionVersion.DoesNotExist: + raise Http404('Version %s not found' % version_number) + return object -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def set_number(request, motion_id): - """ - set a number for an motion. - """ - try: - Motion.objects.get(pk=motion_id).set_number(user=request.user) - messages.success(request, _("Motion number was successfully set.")) - except Motion.DoesNotExist: - pass - except NameError: - pass - return redirect(reverse('motion_view', args=[motion_id])) +class MotionDetailView(GetVersionMixin, DetailView): + """Show one motion.""" + permission_required = 'motion.can_see_motion' + model = Motion + + def get_context_data(self, **kwargs): + """Return the template context. + + Append the allowed actions for the motion to the context. + """ + context = super(MotionDetailView, self).get_context_data(**kwargs) + context['allowed_actions'] = self.object.get_allowed_actions(self.request.user) + return context + +motion_detail = MotionDetailView.as_view() -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def permit(request, motion_id): - """ - permit an motion. - """ - try: - Motion.objects.get(pk=motion_id).permit(user=request.user) - messages.success(request, _("Motion was successfully authorized.")) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) +class MotionMixin(object): + """Mixin for MotionViewsClasses, to save the version data.""" -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def notpermit(request, motion_id): - """ - reject (not permit) an motion. - """ - try: - Motion.objects.get(pk=motion_id).notpermit(user=request.user) - messages.success(request, _("Motion was successfully rejected.")) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) + def manipulate_object(self, form): + """Save the version data into the motion object before it is saved in + the Database.""" -@template('motion/view.html') -def set_status(request, motion_id=None, status=None): - """ - set a status of an motion. - """ - try: - if status is not None: - motion = Motion.objects.get(pk=motion_id) - motion.set_status(user=request.user, status=status) - messages.success(request, _("Motion status was set to: %s.") % motion.get_status_display()) - except Motion.DoesNotExist: - pass - except NameError, e: - messages.error(request, e) - return redirect(reverse('motion_view', args=[motion_id])) + super(MotionMixin, self).manipulate_object(form) + for attr in ['title', 'text', 'reason']: + setattr(self.object, attr, form.cleaned_data[attr]) + + try: + if form.cleaned_data['new_version']: + self.object.new_version + except KeyError: + pass + + def post_save(self, form): + """Save the submitter an the supporter so the motion.""" + super(MotionMixin, self).post_save(form) + # TODO: only delete and save neccessary submitters and supporter + if 'submitter' in form.cleaned_data: + self.object.submitter.all().delete() + MotionSubmitter.objects.bulk_create( + [MotionSubmitter(motion=self.object, person=person) + for person in form.cleaned_data['submitter']]) + if 'supporter' in form.cleaned_data: + self.object.supporter.all().delete() + MotionSupporter.objects.bulk_create( + [MotionSupporter(motion=self.object, person=person) + for person in form.cleaned_data['supporter']]) + + def get_form_class(self): + """Return the FormClass to Create or Update the Motion. + + forms.BaseMotionForm is the base for the Class, and some FormMixins + will be mixed in dependence of some config values. See motion.forms + for more information on the mixins. + """ + + form_classes = [BaseMotionForm] + if self.request.user.has_perm('motion.can_manage_motion'): + form_classes.append(MotionSubmitterMixin) + if config['motion_min_supporters'] > 0: + form_classes.append(MotionSupporterMixin) + if config['motion_create_new_version'] == 'ASK_USER': + form_classes.append(MotionCreateNewVersionMixin) + return type('MotionForm', tuple(form_classes), {}) -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def reset(request, motion_id): - """ - reset an motion. - """ - try: - Motion.objects.get(pk=motion_id).reset(user=request.user) - messages.success(request, _("Motion status was reset.") ) - except Motion.DoesNotExist: - pass - return redirect(reverse('motion_view', args=[motion_id])) +class MotionCreateView(MotionMixin, CreateView): + """View to create a motion.""" + permission_required = 'motion.can_create_motion' + model = Motion + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(MotionCreateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion created'), self.request.user) + return value + +motion_create = MotionCreateView.as_view() + + +class MotionUpdateView(MotionMixin, UpdateView): + """View to update a motion.""" + model = Motion + + def has_permission(self, request, *args, **kwargs): + """Check, if the request.user has the permission to edit the motion.""" + return self.get_object().get_allowed_actions(request.user)['edit'] + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(MotionUpdateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion updated'), self.request.user) + return value + +motion_edit = MotionUpdateView.as_view() + + +class MotionDeleteView(DeleteView): + """View to delete a motion.""" + model = Motion + success_url_name = 'motion_list' + + def has_permission(self, request, *args, **kwargs): + """Check if the request.user has the permission to delete the motion.""" + return self.get_object().get_allowed_actions(request.user)['delete'] + +motion_delete = MotionDeleteView.as_view() + + +class VersionPermitView(GetVersionMixin, SingleObjectMixin, QuestionMixin, RedirectView): + """View to permit a version of a motion.""" + + model = Motion + question_url_name = 'motion_version_detail' + success_url_name = 'motion_version_detail' + + def get(self, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(VersionPermitView, self).get(*args, **kwargs) + + def get_url_name_args(self): + """Return a list with arguments to create the success- and question_url.""" + return [self.object.pk, self.object.version.version_number] + + def get_question(self): + """Return a string, shown to the user as question to permit the version.""" + return _('Are you sure you want permit Version %s?') % self.object.version.version_number + + def case_yes(self): + """Activate the version, if the user chooses 'yes'.""" + self.object.activate_version(self.object.version) + self.object.save() + +version_permit = VersionPermitView.as_view() + + +class VersionRejectView(GetVersionMixin, SingleObjectMixin, QuestionMixin, RedirectView): + """View to reject a version.""" + model = Motion + question_url_name = 'motion_version_detail' + success_url_name = 'motion_version_detail' + + def get(self, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(VersionRejectView, self).get(*args, **kwargs) + + def get_url_name_args(self): + """Return a list with arguments to create the success- and question_url.""" + return [self.object.pk, self.object.version.version_number] + + def get_question(self): + return _('Are you sure you want reject Version %s?') % self.object.version.version_number + + def case_yes(self): + """Reject the version, if the user chooses 'yes'.""" + self.object.reject_version(self.object.version) + self.object.save() + +version_reject = VersionRejectView.as_view() class SupportView(SingleObjectMixin, QuestionMixin, RedirectView): + """View to support or unsupport a motion. + + If self.support is True, the view will append a request.user to the supporter list. + + If self.support is False, the view will remove a request.user from the supporter list. """ - Classed based view to support or unsupport a motion. Use - support=True or support=False in urls.py - """ + permission_required = 'motion.can_support_motion' model = Motion - pk_url_kwarg = 'motion_id' support = True def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" self.object = self.get_object() return super(SupportView, self).get(request, *args, **kwargs) - def check_allowed_actions(self, request): - """ - Checks whether request.user can support or unsupport the motion. - Returns True or False. - """ + def check_permission(self, request): + """Return True if the user can support or unsupport the motion. Else: False.""" + allowed_actions = self.object.get_allowed_actions(request.user) - if self.support and not 'support' in allowed_actions: + if self.support and not allowed_actions['support']: messages.error(request, _('You can not support this motion.')) return False - elif not self.support and not 'unsupport' in allowed_actions: + elif not self.support and not allowed_actions['unsupport']: messages.error(request, _('You can not unsupport this motion.')) return False else: return True - def pre_redirect(self, request, *args, **kwargs): - if self.check_allowed_actions(request): - super(SupportView, self).pre_redirect(request, *args, **kwargs) - def get_question(self): + """Return the question string.""" if self.support: return _('Do you really want to support this motion?') else: return _('Do you really want to unsupport this motion?') def case_yes(self): - if self.check_allowed_actions(self.request): + """Append or remove the request.user from the motion. + + First the methode checks the permissions, and writes a log message after + appending or removing the user. + """ + if self.check_permission(self.request): + user = self.request.user if self.support: - self.object.support(person=self.request.user) + self.object.support(person=user) + self.object.write_log(ugettext_noop("Supporter: +%s") % user, user) else: - self.object.unsupport(person=self.request.user) + self.object.unsupport(person=user) + self.object.write_log(ugettext_noop("Supporter: -%s") % user, user) def get_success_message(self): + """Return the success message.""" if self.support: return _("You have supported this motion successfully.") else: return _("You have unsupported this motion successfully.") def get_redirect_url(self, **kwargs): - return reverse('motion_view', args=[kwargs[self.pk_url_kwarg]]) + """Return the url, the view should redirect to.""" + return self.object.get_absolute_url() + +motion_support = SupportView.as_view(support=True) +motion_unsupport = SupportView.as_view(support=False) -@permission_required('motion.can_manage_motion') -@template('motion/view.html') -def gen_poll(request, motion_id): - """ - gen a poll for this motion. - """ - try: - poll = Motion.objects.get(pk=motion_id).gen_poll(user=request.user) - messages.success(request, _("New vote was successfully created.") ) - except Motion.DoesNotExist: - pass # TODO: do not call poll after this excaption - return redirect(reverse('motion_poll_view', args=[poll.id])) - - -@permission_required('motion.can_manage_motion') -def delete_poll(request, poll_id): - """ - delete a poll from this motion - """ - poll = MotionPoll.objects.get(pk=poll_id) - motion = poll.motion - count = motion.polls.filter(id__lte=poll_id).count() - if request.method == 'POST': - poll.delete() - motion.writelog(_("Poll deleted"), request.user) - messages.success(request, _('Poll was successfully deleted.')) - else: - del_confirm_form(request, poll, name=_("the %s. poll") % count, delete_link=reverse('motion_poll_delete', args=[poll_id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -class MotionDelete(DeleteView): - """ - Delete one or more Motions. - """ +class PollCreateView(SingleObjectMixin, RedirectView): + """View to create a poll for a motion.""" + permission_required = 'motion.can_manage_motion' model = Motion - url = 'motion_overview' - - def has_permission(self, request, *args, **kwargs): - self.kwargs = kwargs - return self.get_object().get_allowed_actions(request.user) - - def get_object(self): - self.motions = [] - - if self.kwargs.get('motion_id', None): - try: - return Motion.objects.get(id=int(self.kwargs['motion_id'])) - except Motion.DoesNotExist: - return None - - if self.kwargs.get('motion_ids', []): - for appid in self.kwargs['motion_ids']: - try: - self.motions.append(Motion.objects.get(id=int(appid))) - except Motion.DoesNotExist: - pass - - if self.motions: - return self.motions[0] - return None - - def pre_post_redirect(self, request, *args, **kwargs): - self.object = self.get_object() - - if len(self.motions): - for motion in self.motions: - if not 'delete' in motion.get_allowed_actions(user=request.user): - messages.error(request, _("You can not delete motion %s.") % motion) - continue - - title = motion.title - motion.delete(force=True) - messages.success(request, _("Motion %s was successfully deleted.") % title) - - elif self.object: - if not 'delete' in self.object.get_allowed_actions(user=request.user): - messages.error(request, _("You can not delete motion %s.") % self.object) - elif self.get_answer() == 'yes': - title = self.object.title - self.object.delete(force=True) - messages.success(request, _("Motion %s was successfully deleted.") % title) - else: - messages.error(request, _("Invalid request")) - - -class ViewPoll(PollFormView): - permission_required = 'motion.can_manage_motion' - poll_class = MotionPoll - template_name = 'motion/poll_view.html' - - def get_context_data(self, **kwargs): - context = super(ViewPoll, self).get_context_data(**kwargs) - self.motion = self.poll.get_motion() - context['motion'] = self.motion - context['ballot'] = self.poll.get_ballot() - context['actions'] = self.motion.get_allowed_actions(user=self.request.user) - return context - - def get_modelform_class(self): - cls = super(ViewPoll, self).get_modelform_class() - user = self.request.user - - class ViewPollFormClass(cls): - def save(self, commit = True): - instance = super(ViewPollFormClass, self).save(commit) - motion = instance.motion - motion.writelog(_("Poll was updated"), user) - return instance - - return ViewPollFormClass - - def get_success_url(self): - if not 'apply' in self.request.POST: - return reverse('motion_view', args=[self.poll.motion.id]) - return '' - - -@permission_required('motion.can_manage_motion') -def permit_version(request, aversion_id): - aversion = AVersion.objects.get(pk=aversion_id) - motion = aversion.motion - if request.method == 'POST': - motion.accept_version(aversion, user=request.user) - messages.success(request, _("Version %s accepted.") % (aversion.aid)) - else: - gen_confirm_form(request, _('Do you really want to authorize version %s?') % aversion.aid, reverse('motion_version_permit', args=[aversion.id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -@permission_required('motion.can_manage_motion') -def reject_version(request, aversion_id): - aversion = AVersion.objects.get(pk=aversion_id) - motion = aversion.motion - if request.method == 'POST': - if motion.reject_version(aversion, user=request.user): - messages.success(request, _("Version %s rejected.") % (aversion.aid)) - else: - messages.error(request, _("ERROR by rejecting the version.") ) - else: - gen_confirm_form(request, _('Do you really want to reject version %s?') % aversion.aid, reverse('motion_version_reject', args=[aversion.id])) - return redirect(reverse('motion_view', args=[motion.id])) - - -@permission_required('motion.can_manage_motion') -@template('motion/import.html') -def motion_import(request): - if request.method == 'POST': - form = MotionImportForm(request.POST, request.FILES) - if form.is_valid(): - import_permitted = form.cleaned_data['import_permitted'] - try: - # check for valid encoding (will raise UnicodeDecodeError if not) - request.FILES['csvfile'].read().decode('utf-8') - request.FILES['csvfile'].seek(0) - - users_generated = 0 - motions_generated = 0 - motions_modified = 0 - groups_assigned = 0 - groups_generated = 0 - with transaction.commit_on_success(): - dialect = csv.Sniffer().sniff(request.FILES['csvfile'].readline()) - dialect = csv_ext.patchup(dialect) - request.FILES['csvfile'].seek(0) - for (lno, line) in enumerate(csv.reader(request.FILES['csvfile'], dialect=dialect)): - # basic input verification - if lno < 1: - continue - try: - (number, title, text, reason, first_name, last_name, is_group) = line[:7] - if is_group.strip().lower() in ['y', 'j', 't', 'yes', 'ja', 'true', '1', 1]: - is_group = True - else: - is_group = False - except ValueError: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - form = MotionForm({'title': title, 'text': text, 'reason': reason}) - if not form.is_valid(): - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - if number: - try: - number = abs(long(number)) - if number < 1: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - except ValueError: - messages.error(request, _('Ignoring malformed line %d in import file.') % (lno + 1)) - continue - - if is_group: - # fetch existing groups or issue an error message - try: - user = Group.objects.get(name=last_name) - if user.group_as_person == False: - messages.error(request, _('Ignoring line %d because the assigned group may not act as a person.') % (lno + 1)) - continue - else: - user = get_person(user.person_id) - - groups_assigned += 1 - except Group.DoesNotExist: - group = Group() - group.group_as_person = True - group.description = _('Created by motion import.') - group.name = last_name - group.save() - groups_generated += 1 - - user = get_person(group.person_id) - else: - # fetch existing users or create new users as needed - try: - user = User.objects.get(first_name=first_name, last_name=last_name) - except User.DoesNotExist: - user = None - if user is None: - if not first_name or not last_name: - messages.error(request, _('Ignoring line %d because it contains an incomplete first / last name pair.') % (lno + 1)) - continue - - user = User() - user.last_name = last_name - user.first_name = first_name - user.username = gen_username(first_name, last_name) - user.structure_level = '' - user.committee = '' - user.gender = '' - user.type = '' - user.default_password = gen_password() - user.save() - user.reset_password() - users_generated += 1 - # create / modify the motion - motion = None - if number: - try: - motion = Motion.objects.get(number=number) - motions_modified += 1 - except Motion.DoesNotExist: - motion = None - if motion is None: - motion = Motion(submitter=user) - if number: - motion.number = number - motions_generated += 1 - - motion.title = form.cleaned_data['title'] - motion.text = form.cleaned_data['text'] - motion.reason = form.cleaned_data['reason'] - if import_permitted: - motion.status = 'per' - - motion.save(user, trivial_change=True) - - if motions_generated: - messages.success(request, ungettext('%d motion was successfully imported.', - '%d motions were successfully imported.', motions_generated) % motions_generated) - if motions_modified: - messages.success(request, ungettext('%d motion was successfully modified.', - '%d motions were successfully modified.', motions_modified) % motions_modified) - if users_generated: - messages.success(request, ungettext('%d new user was added.', '%d new users were added.', users_generated) % users_generated) - - if groups_generated: - messages.success(request, ungettext('%d new group was added.', '%d new groups were added.', groups_generated) % groups_generated) - - if groups_assigned: - messages.success(request, ungettext('%d group assigned to motions.', '%d groups assigned to motions.', groups_assigned) % groups_assigned) - return redirect(reverse('motion_overview')) - - except csv.Error: - messages.error(request, _('Import aborted because of severe errors in the input file.')) - except UnicodeDecodeError: - messages.error(request, _('Import file has wrong character encoding, only UTF-8 is supported!')) - else: - messages.error(request, _('Please check the form for errors.')) - else: - messages.warning(request, _("Attention: Existing motions will be modified if you import new motions with the same number.")) - messages.warning(request, _("Attention: Importing an motions without a number multiple times will create duplicates.")) - form = MotionImportForm() - return { - 'form': form, - } - - -class CreateAgendaItem(RedirectView): - permission_required = 'agenda.can_manage_agenda' - - def pre_redirect(self, request, *args, **kwargs): - self.motion = Motion.objects.get(pk=kwargs['motion_id']) - self.item = Item(related_sid=self.motion.sid) - self.item.save() - - def get_redirect_url(self, **kwargs): - return reverse('item_overview') - - -class MotionPDF(PDFView): - permission_required = 'motion.can_see_motion' - top_space = 0 - - def get_filename(self): - motion_id = self.kwargs['motion_id'] - if motion_id is None: - filename = _("Motions") - else: - motion = Motion.objects.get(id=motion_id) - if motion.number: - number = motion.number - else: - number = "" - filename = u'%s%s' % (_("Motion"), str(number)) - return filename - - def append_to_pdf(self, story): - motion_id = self.kwargs['motion_id'] - if motion_id is None: #print all motions - title = config["motion_pdf_title"] - story.append(Paragraph(title, stylesheet['Heading1'])) - preamble = config["motion_pdf_preamble"] - if preamble: - story.append(Paragraph("%s" % preamble.replace('\r\n','
    '), stylesheet['Paragraph'])) - story.append(Spacer(0,0.75*cm)) - motions = Motion.objects.all() - if not motions: # No motions existing - story.append(Paragraph(_("No motions available."), stylesheet['Heading3'])) - else: # Print all Motions - # List of motions - for motion in motions: - if motion.number: - story.append(Paragraph(_("Motion No.")+" %s: %s" % (motion.number, motion.title), stylesheet['Heading3'])) - else: - story.append(Paragraph(_("Motion No.")+"   : %s" % (motion.title), stylesheet['Heading3'])) - # Motions details (each motion on single page) - for motion in motions: - story.append(PageBreak()) - story = self.get_motion(motion, story) - else: # print selected motion - motion = Motion.objects.get(id=motion_id) - story = self.get_motion(motion, story) - - def get_motion(self, motion, story): - # Preparing Table - data = [] - - # motion number - if motion.number: - story.append(Paragraph(_("Motion No.")+" %s" % motion.number, stylesheet['Heading1'])) - else: - story.append(Paragraph(_("Motion No."), stylesheet['Heading1'])) - - # submitter - cell1a = [] - cell1a.append(Spacer(0, 0.2 * cm)) - cell1a.append(Paragraph("%s:" % _("Submitter"), stylesheet['Heading4'])) - cell1b = [] - cell1b.append(Spacer(0, 0.2 * cm)) - cell1b.append(Paragraph("%s" % motion.submitter, stylesheet['Normal'])) - data.append([cell1a, cell1b]) - - if motion.status == "pub": - # Cell for the signature - cell2a = [] - cell2b = [] - cell2a.append(Paragraph("%s:" % _("Signature"), stylesheet['Heading4'])) - cell2b.append(Paragraph("__________________________________________", stylesheet['Signaturefield'])) - cell2b.append(Spacer(0, 0.1 * cm)) - cell2b.append(Spacer(0,0.2*cm)) - data.append([cell2a, cell2b]) - - # supporters - if config['motion_min_supporters']: - cell3a = [] - cell3b = [] - cell3a.append(Paragraph("%s:" % _("Supporters"), stylesheet['Heading4'])) - for supporter in motion.supporters: - cell3b.append(Paragraph(".  %s" % supporter, stylesheet['Signaturefield'])) - if motion.status == "pub": - for x in range(motion.missing_supporters): - cell3b.append(Paragraph(".  __________________________________________",stylesheet['Signaturefield'])) - cell3b.append(Spacer(0, 0.2 * cm)) - data.append([cell3a, cell3b]) - - # status - cell4a = [] - cell4b = [] - note = " ".join(motion.notes) - cell4a.append(Paragraph("%s:" % _("Status"), stylesheet['Heading4'])) - if note != "": - if motion.status == "pub": - cell4b.append(Paragraph(note, stylesheet['Normal'])) - else: - cell4b.append(Paragraph("%s | %s" % (motion.get_status_display(), note), stylesheet['Normal'])) - else: - cell4b.append(Paragraph("%s" % motion.get_status_display(), stylesheet['Normal'])) - data.append([cell4a, cell4b]) - - # Version number (aid) - if motion.public_version.aid > 1: - cell5a = [] - cell5b = [] - cell5a.append(Paragraph("%s:" % _("Version"), stylesheet['Heading4'])) - cell5b.append(Paragraph("%s" % motion.public_version.aid, stylesheet['Normal'])) - data.append([cell5a, cell5b]) - - # voting results - poll_results = motion.get_poll_results() - if poll_results: - cell6a = [] - cell6a.append(Paragraph("%s:" % _("Vote results"), stylesheet['Heading4'])) - cell6b = [] - ballotcounter = 0 - for result in poll_results: - ballotcounter += 1 - if len(poll_results) > 1: - cell6b.append(Paragraph("%s. %s" % (ballotcounter, _("Vote")), stylesheet['Bold'])) - cell6b.append(Paragraph("%s: %s
    %s: %s
    %s: %s
    %s: %s
    %s: %s" % (_("Yes"), result[0], _("No"), result[1], _("Abstention"), result[2], _("Invalid"), result[3], _("Votes cast"), result[4]), stylesheet['Normal'])) - cell6b.append(Spacer(0, 0.2*cm)) - data.append([cell6a, cell6b]) - - # Creating Table - t = Table(data) - t._argW[0] = 4.5 * cm - t._argW[1] = 11 * cm - t.setStyle(TableStyle([('BOX', (0, 0), (-1, -1), 1, colors.black), - ('VALIGN', (0,0), (-1,-1), 'TOP')])) - story.append(t) - story.append(Spacer(0, 1 * cm)) - - # title - story.append(Paragraph(motion.public_version.title, stylesheet['Heading3'])) - # text - story.append(Paragraph("%s" % motion.public_version.text.replace('\r\n','
    '), stylesheet['Paragraph'])) - # reason - if motion.public_version.reason: - story.append(Paragraph(_("Reason")+":", stylesheet['Heading3'])) - story.append(Paragraph("%s" % motion.public_version.reason.replace('\r\n','
    '), stylesheet['Paragraph'])) - return story - - -class MotionPollPDF(PDFView): - permission_required = 'motion.can_manage_motion' - top_space = 0 def get(self, request, *args, **kwargs): - self.poll = MotionPoll.objects.get(id=self.kwargs['poll_id']) - return super(MotionPollPDF, self).get(request, *args, **kwargs) + """Set self.object to a motion.""" + self.object = self.get_object() + return super(PollCreateView, self).get(request, *args, **kwargs) + + def pre_redirect(self, request, *args, **kwargs): + """Create the poll for the motion.""" + self.poll = self.object.create_poll() + self.object.write_log(ugettext_noop("Poll created"), request.user) + messages.success(request, _("New vote was successfully created.")) + + def get_redirect_url(self, **kwargs): + """Return the URL to the EditView of the poll.""" + return reverse('motion_poll_edit', args=[self.object.pk, self.poll.poll_number]) + +poll_create = PollCreateView.as_view() + + +class PollMixin(object): + """Mixin for the PollUpdateView and the PollDeleteView.""" + permission_required = 'motion.can_manage_motion' + success_url_name = 'motion_detail' + + def get_object(self): + """Return a MotionPoll object. + + Use the motion id and the poll_number from the url kwargs to get the + object. + """ + return MotionPoll.objects.filter( + motion=self.kwargs['pk'], + poll_number=self.kwargs['poll_number']).get() + + def get_url_name_args(self): + """Return the arguments to create the url to the success_url""" + return [self.object.motion.pk] + + +class PollUpdateView(PollMixin, PollFormView): + """View to update a MotionPoll.""" + + poll_class = MotionPoll + """Poll Class to use for this view.""" + + template_name = 'motion/poll_form.html' + + def get_context_data(self, **kwargs): + """Return the template context. + + Append the motion object to the context. + """ + context = super(PollUpdateView, self).get_context_data(**kwargs) + context.update({ + 'motion': self.poll.motion}) + return context + + def form_valid(self, form): + """Write a log message, if the form is valid.""" + value = super(PollUpdateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Poll updated'), self.request.user) + return value + +poll_edit = PollUpdateView.as_view() + + +class PollDeleteView(PollMixin, DeleteView): + """View to delete a MotionPoll.""" + model = MotionPoll + + def case_yes(self): + """Write a log message, if the form is valid.""" + super(PollDeleteView, self).case_yes() + self.object.write_log(ugettext_noop('Poll deleted'), self.request.user) + +poll_delete = PollDeleteView.as_view() + + +class MotionSetStateView(SingleObjectMixin, RedirectView): + """View to set the state of a motion. + + If self.reset is False, the new state is taken from url. + + If self.reset is True, the default state is taken. + """ + permission_required = 'motion.can_manage_motion' + url_name = 'motion_detail' + model = Motion + reset = False + + def pre_redirect(self, request, *args, **kwargs): + """Save the new state and write a log message.""" + self.object = self.get_object() + try: + if self.reset: + self.object.reset_state() + else: + self.object.state = kwargs['state'] + except WorkflowError, e: + messages.error(request, e) + else: + self.object.save() + # TODO: the state is not translated + self.object.write_log(ugettext_noop('Changed state to %s') % + self.object.state.name, self.request.user) + messages.success(request, _('Motion status was set to: %s.' + % html_strong(self.object.state))) + + def get_url_name_args(self): + """Return the arguments to generate the redirect_url.""" + return [self.object.pk] + +set_state = MotionSetStateView.as_view() +reset_state = MotionSetStateView.as_view(reset=True) + + +class CreateAgendaItemView(SingleObjectMixin, RedirectView): + """View to create and agenda item for a motion.""" + permission_required = 'agenda.can_manage_agenda' + url_name = 'item_overview' + model = Motion + + def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" + self.object = self.get_object() + return super(CreateAgendaItemView, self).get(request, *args, **kwargs) + + def pre_redirect(self, request, *args, **kwargs): + """Create the agenda item.""" + self.item = Item.objects.create(related_sid=self.object.sid) + self.object.write_log(ugettext_noop('Created Agenda Item'), self.request.user) + +create_agenda_item = CreateAgendaItemView.as_view() + + +class MotionPDFView(SingleObjectMixin, PDFView): + """Create the PDF for one, or all motions. + + If self.print_all_motions is True, the view returns a PDF with all motions. + + If self.print_all_motions is False, the view returns a PDF with only one + motion.""" + permission_required = 'motion.can_manage_motion' + model = Motion + top_space = 0 + print_all_motions = False + + def get(self, request, *args, **kwargs): + """Set self.object to a motion.""" + if not self.print_all_motions: + self.object = self.get_object() + return super(MotionPDFView, self).get(request, *args, **kwargs) def get_filename(self): - filename = u'%s%s_%s' % (_("Motion"), str(self.poll.motion.number), _("Poll")) - return filename + """Return the filename for the PDF.""" + if self.print_all_motions: + return _("Motions") + else: + return _("Motion: %s") % unicode(self.object) - def get_template(self, buffer): - return SimpleDocTemplate(buffer, topMargin=-6, bottomMargin=-6, leftMargin=0, rightMargin=0, showBoundary=False) + def append_to_pdf(self, pdf): + """Append PDF objects.""" + if self.print_all_motions: + motions_to_pdf(pdf) + else: + motion_to_pdf(pdf, self.object) - def build_document(self, pdf_document, story): - pdf_document.build(story) - - def append_to_pdf(self, story): - imgpath = os.path.join(settings.SITE_ROOT, 'static/images/circle.png') - circle = "  " % imgpath - cell = [] - cell.append(Spacer(0,0.8*cm)) - cell.append(Paragraph(_("Motion No. %s") % self.poll.motion.number, stylesheet['Ballot_title'])) - cell.append(Paragraph(self.poll.motion.title, stylesheet['Ballot_subtitle'])) - cell.append(Paragraph(_("%d. Vote") % self.poll.get_ballot(), stylesheet['Ballot_description'])) - cell.append(Spacer(0,0.5*cm)) - cell.append(Paragraph(circle + unicode(_("Yes")), stylesheet['Ballot_option'])) - cell.append(Paragraph(circle + unicode(_("No")), stylesheet['Ballot_option'])) - cell.append(Paragraph(circle + unicode(_("Abstention")), stylesheet['Ballot_option'])) - data= [] - # get ballot papers config values - ballot_papers_selection = config["motion_pdf_ballot_papers_selection"] - ballot_papers_number = config["motion_pdf_ballot_papers_number"] - - # set number of ballot papers - if ballot_papers_selection == "NUMBER_OF_DELEGATES": - number = User.objects.filter(type__iexact="delegate").count() - elif ballot_papers_selection == "NUMBER_OF_ALL_PARTICIPANTS": - number = int(User.objects.count()) - else: # ballot_papers_selection == "CUSTOM_NUMBER" - number = int(ballot_papers_number) - number = max(1, number) - - # print ballot papers - if number > 0: - for user in xrange(number / 2): - data.append([cell, cell]) - rest = number % 2 - if rest: - data.append([cell, '']) - t=Table(data, 10.5 * cm, 7.42 * cm) - t.setStyle(TableStyle([('GRID', (0, 0), (-1, -1), 0.25, colors.grey), - ('VALIGN', (0, 0), (-1, -1), 'TOP'), - ])) - story.append(t) +motion_list_pdf = MotionPDFView.as_view(print_all_motions=True) +motion_detail_pdf = MotionPDFView.as_view(print_all_motions=False) class Config(FormView): + """The View for the config tab.""" permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'motion/config.html' + success_url_name = 'config_motion' def get_initial(self): return { @@ -916,7 +484,8 @@ class Config(FormView): 'motion_pdf_ballot_papers_number': config['motion_pdf_ballot_papers_number'], 'motion_pdf_title': config['motion_pdf_title'], 'motion_pdf_preamble': config['motion_pdf_preamble'], - 'motion_allow_trivial_change': config['motion_allow_trivial_change'], + 'motion_create_new_version': config['motion_create_new_version'], + 'motion_workflow': config['motion_workflow'], } def form_valid(self, form): @@ -926,26 +495,33 @@ class Config(FormView): config['motion_pdf_ballot_papers_number'] = form.cleaned_data['motion_pdf_ballot_papers_number'] config['motion_pdf_title'] = form.cleaned_data['motion_pdf_title'] config['motion_pdf_preamble'] = form.cleaned_data['motion_pdf_preamble'] - config['motion_allow_trivial_change'] = form.cleaned_data['motion_allow_trivial_change'] + config['motion_create_new_version'] = form.cleaned_data['motion_create_new_version'] + config['motion_workflow'] = form.cleaned_data['motion_workflow'] messages.success(self.request, _('Motion settings successfully saved.')) return super(Config, self).form_valid(form) def register_tab(request): - selected = True if request.path.startswith('/motion/') else False + """Return the motion tab.""" + # TODO: Find a bether way to set the selected var. + selected = request.path.startswith('/motion/') return Tab( title=_('Motions'), - url=reverse('motion_overview'), - permission=request.user.has_perm('motion.can_see_motion') or request.user.has_perm('motion.can_support_motion') or request.user.has_perm('motion.can_support_motion') or request.user.has_perm('motion.can_manage_motion'), + app='motion', + url=reverse('motion_list'), + permission=request.user.has_perm('motion.can_see_motion'), selected=selected, ) def get_widgets(request): - return [ - Widget( - name='motions', - display_name=_('Motions'), - template='motion/widget.html', - context={'motions': Motion.objects.all()}, - permission_required='projector.can_manage_projector')] + """Return the motion widgets for the dashboard. + + There is only one widget. It shows all motions. + """ + return [Widget( + name='motions', + display_name=_('Motions'), + template='motion/widget.html', + context={'motions': Motion.objects.all()}, + permission_required='projector.can_manage_projector')] diff --git a/openslides/motion/workflow.py b/openslides/motion/workflow.py new file mode 100644 index 000000000..929485fc4 --- /dev/null +++ b/openslides/motion/workflow.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + openslides.utils.workflow + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Defines the States for motions. All States are linked together with there + 'next_state' attributes. Together there are a workflow. + + :copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS. + :license: GNU GPL, see LICENSE for more details. +""" + +from django.conf import settings +from django.core import exceptions +from django.utils.importlib import import_module +from django.utils.translation import ugettext_noop + +from openslides.config.models import config + +_workflow = None + + +class State(object): + """Define a state for a motion.""" + def __init__(self, id, name, next_states=[], create_poll=False, support=False, + edit_as_submitter=False, version_permission=True): + """Set attributes for the state. + + The Arguments are: + - 'id' a unique id for the state. + - 'name' a string representing the state. + - 'next_states' a list with all states, that can be choosen from this state. + + All the other arguments are boolean values. If True, the specific action for + motions in this state. + - 'create_poll': polls can be created in this state. + - 'support': persons can support the motion in this state. + - 'edit_as_submitter': the submitter can edit the motion in this state. + - 'version_permission': new versions are not permitted. + """ + self.id = id + self.name = name + self.next_states = next_states + self.create_poll = create_poll + self.support = support + self.edit_as_submitter = edit_as_submitter + self.version_permission = version_permission + + def __unicode__(self): + """Return the name of the state.""" + return self.name + + +class WorkflowError(Exception): + """Exception raised when errors in a state accure.""" + pass + + +def motion_workflow_choices(): + """Return all possible workflows. + + The possible workflows can be set in the settings with the setting + 'MOTION_WORKFLOW'. + """ + for workflow in settings.MOTION_WORKFLOW: + yield workflow[0], workflow[1] + + +def get_state(state='default'): + """Return a state object. + + The argument 'state' has to be a state_id. + + If the argument 'state' is 'default', the default state is returned. + + The default state is the state object choosen in the config tab. + """ + global _workflow + if _workflow is not None: + try: + return _workflow[state] + except KeyError: + raise WorkflowError('Unknown state: %s' % state) + _workflow = {} + for workflow in settings.MOTION_WORKFLOW: + if workflow[0] == config['motion_workflow']: + try: + wf_module, wf_default_state_name = workflow[2].rsplit('.', 1) + except ValueError: + raise exceptions.ImproperlyConfigured( + '%s isn\'t a workflow module' % workflow[2]) + try: + mod = import_module(wf_module) + except ImportError as e: + raise exceptions.ImproperlyConfigured( + 'Error importing workflow %s: "%s"' % (wf_module, e)) + try: + default_state = getattr(mod, wf_default_state_name) + except AttributeError: + raise exceptions.ImproperlyConfigured( + 'Workflow module "%s" does not define a "%s" State' + % (wf_module, wf_default_state_name)) + _workflow['default'] = default_state + break + else: + raise ImproperlyConfigured('Unknown workflow %s' % conf['motion_workflow']) + + populate_workflow(default_state, _workflow) + return get_state(state) + + +def populate_workflow(state, workflow): + """Append all 'next_states' from state to the workflow. + + The argument state has to be a state object. + + The argument workflow has to be a dictonary. + + Calls this function recrusiv with all next_states from the next_states states. + """ + workflow[state.id] = state + for s in state.next_states: + if s.id not in workflow: + populate_workflow(s, workflow) + + +DUMMY_STATE = State('dummy', ugettext_noop('Unknwon state')) +"""A dummy state object. Returned, if the state_id is not known.""" + +default_workflow = State('pub', ugettext_noop('Published'), support=True, + edit_as_submitter=True, version_permission=False) +"""Default Workflow for OpenSlides.""" + +default_workflow.next_states = [ + State('per', ugettext_noop('Permitted'), create_poll=True, edit_as_submitter=True, next_states=[ + State('acc', ugettext_noop('Accepted')), + State('rej', ugettext_noop('Rejected')), + State('wit', ugettext_noop('Withdrawed')), + State('adj', ugettext_noop('Adjourned')), + State('noc', ugettext_noop('Not Concerned')), + State('com', ugettext_noop('Commited a bill')), + State('rev', ugettext_noop('Needs Review'))]), + State('nop', ugettext_noop('Rejected (not authorized)'))] diff --git a/openslides/participant/static/javascript/participant.js b/openslides/participant/static/javascript/participant.js index bf17d5202..6dff8e739 100644 --- a/openslides/participant/static/javascript/participant.js +++ b/openslides/participant/static/javascript/participant.js @@ -6,22 +6,24 @@ */ $(function() { + // change participant status (on/off) $('.status_link').click(function(event) { event.preventDefault(); - link = $(this); - group = $(this).parent(); + var link = $(this); $.ajax({ type: 'GET', - url: link.attr('href'), + url: $(this).attr('href'), dataType: 'json', success: function(data) { if (data.active) { - group.children('.status_link.deactivate').show(); - group.children('.status_link.activate').hide(); + newclass = 'icon-on'; + link.addClass('btn-success'); } else { - group.children('.status_link.deactivate').hide(); - group.children('.status_link.activate').show(); + newclass = 'icon-off'; + link.removeClass('btn-success'); } + link.children('i').removeClass('icon-off icon-on').addClass(newclass); + link.attr('href', data.link); } }); }); diff --git a/openslides/participant/static/styles/participant.css b/openslides/participant/static/styles/participant.css deleted file mode 100644 index 0d656c9c8..000000000 --- a/openslides/participant/static/styles/participant.css +++ /dev/null @@ -1,22 +0,0 @@ -/** - * OpenSlides participants style - * - * :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. - * :license: GNU GPL, see LICENSE for more details. - */ - -a.status_link span { - background-repeat: no-repeat; - background-position: center; - width: 16px; - height: 16px; - display: inline-block; -} - -a.status_link.deactivate span { - background-image: url(../images/icons/on.png); -} - -a.status_link.activate span { - background-image: url(../images/icons/off.png); -} diff --git a/openslides/participant/templates/participant/base_participant.html b/openslides/participant/templates/participant/base_participant.html deleted file mode 100644 index 53f1d3012..000000000 --- a/openslides/participant/templates/participant/base_participant.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block submenu %} - {% url 'user_overview' as url_users %} - {% url 'user_new' as url_usernew %} - {% url 'user_group_overview' as url_usergroups %} - {% url 'user_import' as url_userimport %} -

    {% trans "Participants" %}

    -
    - - {# second submenu #} - {% if shown_user %} -
    -

    {{ shown_user.clean_name }}

    - - {% elif group %} -
    -

    {{ group.name }}

    - - {% endif %} - -{% endblock %} diff --git a/openslides/participant/templates/participant/config.html b/openslides/participant/templates/participant/config.html index 3c1ed6199..50258fe52 100644 --- a/openslides/participant/templates/participant/config.html +++ b/openslides/participant/templates/participant/config.html @@ -5,18 +5,19 @@ {% block title %}{{ block.super }} – {% trans "Participant settings" %}{% endblock %} {% block content %} -

    {% trans "Participant settings" %}

    +

    + {% trans "Configuration" %} + {% trans "Participants" %} + {% block config_submenu %}{{ block.super }}{% endblock %} +

    {% csrf_token %} - {{ form.as_p }} -

    - - - - -

    + {% include "form.html" %} +

    + {% include "formbuttons_save.html" %} + + {% trans 'Cancel' %} + +

    + * {% trans "required" %}
    {% endblock %} diff --git a/openslides/participant/templates/participant/edit.html b/openslides/participant/templates/participant/edit.html index 6919a4221..d0dfc143a 100644 --- a/openslides/participant/templates/participant/edit.html +++ b/openslides/participant/templates/participant/edit.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} @@ -11,33 +11,30 @@ {% endif %} {% endblock %} - {% block content %} - {% if edit_user %} -

    {% trans "Edit participant" %}

    - {% else %} -

    {% trans "New participant" %}

    - {% endif %} +

    + {% if edit_user %} + {% trans "Edit participant" %} + {% else %} + {% trans "New participant" %} + {% endif %} + + {% trans "Back to overview" %} + +

    {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %} {% if edit_user %} -

    - {% trans 'Reset to First Password' %} +

    + {% trans 'Reset to First Password' %}

    {% endif %}

    - - - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %} +

    * {% trans "required" %}
    diff --git a/openslides/participant/templates/participant/group_detail.html b/openslides/participant/templates/participant/group_detail.html index fb456c31c..ea3f5fab0 100644 --- a/openslides/participant/templates/participant/group_detail.html +++ b/openslides/participant/templates/participant/group_detail.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load tags %} @@ -7,16 +7,22 @@ {% block content %} -

    {{ group }}

    +

    {{ group }} + + {% trans "Back to overview" %} + +

    {{ group.description }}

    -

    {% trans "Members" %}

    +

    {% trans "Members" %}

    +
      {% for member in group.user_set.all %} -

      {{ member }}

      +
    1. {{ member }}
    2. {% empty %}

      {% trans "No members available." %}

      {% endfor %} +
    {% endblock %} diff --git a/openslides/participant/templates/participant/group_edit.html b/openslides/participant/templates/participant/group_edit.html index 7638a360e..8020247d2 100644 --- a/openslides/participant/templates/participant/group_edit.html +++ b/openslides/participant/templates/participant/group_edit.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} @@ -12,25 +12,23 @@ {% endblock %} {% block content %} +

    {% if group %} -

    {% trans "Edit group" %}

    + {% trans "Edit group" %} {% else %} -

    {% trans "New group" %}

    + {% trans "New group" %} {% endif %} + + {% trans "Back to overview" %} + +
    {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

    - - - - + {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %}

    * {% trans "required" %} diff --git a/openslides/participant/templates/participant/group_overview.html b/openslides/participant/templates/participant/group_overview.html index cb91709be..f86c9b5ba 100644 --- a/openslides/participant/templates/participant/group_overview.html +++ b/openslides/participant/templates/participant/group_overview.html @@ -1,30 +1,45 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} -{% load staticfiles %} {% load tags %} {% block title %}{{ block.super }} – {% trans "Groups" %}{% endblock %} {% block content %} -

    {% trans "Groups" %}

    - +

    {% trans "Groups" %} + + {% trans "New" %} + {% trans "Back to participants overview" %} + +

    + +
    - + {% for group in groups %} - - - + + - - {% empty %} - - {% endfor %}
    {% trans "Group" %}{% trans "Actions" %}{% trans "Actions" %}
    {{ group.name }} - {% if group.name|lower != 'anonymous' and group.name|lower != 'registered' %} - - {% endif %} +
    + {{ group.name }} + + + {% if perms.projector.can_manage_projector %} + + + + {% endif %} + + + + {% if group.name|lower != 'anonymous' and group.name|lower != 'registered' %} + + + + {% endif %} +
    {% trans "No groups available." %}
    diff --git a/openslides/participant/templates/participant/group_widget.html b/openslides/participant/templates/participant/group_widget.html index 88a2eb91c..5145bccc2 100644 --- a/openslides/participant/templates/participant/group_widget.html +++ b/openslides/participant/templates/participant/group_widget.html @@ -5,17 +5,14 @@ {% for group in groups %} {% if group.name != 'Anonymous' and group.name != 'Registered' %}
  • - -
    +
    + +   + + - - - - - - - - + + {{ group }}
  • diff --git a/openslides/participant/templates/participant/import.html b/openslides/participant/templates/participant/import.html index 2cd720cfe..e374845b7 100644 --- a/openslides/participant/templates/participant/import.html +++ b/openslides/participant/templates/participant/import.html @@ -1,11 +1,17 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% block title %}{{ block.super }} – {% trans "Import participants" %} {% endblock %} {% block content %} -

    {% trans 'Import participants' %}

    +

    + {% trans 'Import participants' %} + + {% trans "Back to overview" %} + +

    +

    {% trans 'Select a CSV file to import participants!' %}

    {% trans 'Required comma separated values' %}: @@ -18,15 +24,13 @@

    {% csrf_token %} - {{ form.as_p }} + {% include "form.html" %}

    - - - + + {% trans 'Cancel' %}

    * {% trans "required" %} diff --git a/openslides/participant/templates/participant/login.html b/openslides/participant/templates/participant/login.html index cd196cb14..ec7576bae 100644 --- a/openslides/participant/templates/participant/login.html +++ b/openslides/participant/templates/participant/login.html @@ -1,25 +1,17 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} -{% block mainmenu %} - +{% block loginbutton %} {% endblock %} -{% block submenu %} -{% endblock %} - -{% block content %} -

    {% trans "Login" %}

    +{% block body %} +
    +

    {% if form.errors %} -
    - - close - +
    {% for msg in form.non_field_errors %} {{ msg }} {% if not forloop.last %}
    {% endif %} @@ -29,48 +21,37 @@
    {% endif %} {% if first_time_message %} -
    - - close - +
    {{ first_time_message|safe }}
    {% endif %} + - + {% csrf_token %} - - - - - - - - - -
    {{ form.username.label_tag }}{{ form.username }}
    {{ form.password.label_tag }}{{ form.password }}
    +
    + + +
    +
    + + +
    +

    - {% if os_enable_anonymous_login %} - + + {% trans 'Continue as guest' %} + {% endif %}

    - {% if os_enable_anonymous_login %} - - {% endif %} {% endblock %} diff --git a/openslides/participant/templates/participant/overview.html b/openslides/participant/templates/participant/overview.html index 829402e89..fb28d61a9 100644 --- a/openslides/participant/templates/participant/overview.html +++ b/openslides/participant/templates/participant/overview.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load staticfiles %} @@ -6,104 +6,142 @@ {% block title %}{{ block.super }} – {% trans "Participants" %}{% endblock %} -{% block header %} - {% if perms.agenda.can_manage_agenda %} - +{% block javascript %} + {% if perms.participant.can_manage_participant %} {% endif %} {% endblock %} - - + {% block content %} -

    {% trans "Participants" %}

    +

    {% trans "Participants" %} + +
    + {% if perms.participant.can_manage_participant %} + {% trans "New" %} + {% trans "Groups" %} + {% trans 'Import' %} + {% endif %} + {% if perms.participant.can_see_participant and perms.participant.can_manage_participant %} +
    + {% if user.is_authenticated %} + + PDF + + + + {% else %} + {% trans "Login" %} + {% endif %} +
    + {% else %} + {% if perms.participant.can_see_participant %} + PDF + {% endif %} + {% if perms.participant.can_manage_participant %} + PDF + {% endif %} + {% endif %} +
    +
    +

    -

    -

    - {% trans "Filter" %}: - - - - - -
    -

    +
    + {% trans "Filter" %}: +
    + + + + + +
    +
    + {% if users.count == allusers %} {{ users.count }} {% blocktrans count counter=users.count %}participant{% plural %}participants{% endblocktrans %} {% else %} {{ users.count }} {% trans "of" %} {{ allusers }} {% trans "Participants" %} (= {{ percent }} %) {% endif %} - + +
    - - - + + + {% if perms.participant.can_manage_participant %} - - - + + + {% endif %} {% for user in users %} - - - - - - + + + + + + {% if perms.participant.can_manage_participant %} - - + ]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
    ","
    "],thead:[1,"
    {% trans "First Name" %} {% trans "Last Name" %}{% trans "Structure level" %}{% trans "Type" %}{% trans "Committee" %}{% trans "Structure level" %}{% trans "Type" %}{% trans "Committee" %}{% trans "Comment" %}{% trans "Last Login" %}{% trans "Actions" %}{% trans "Comment" %}{% trans "Last Login" %}{% trans "Actions" %}
    {{ user.first_name }}{{ user.last_name }}{{ user.structure_level }}{{ user.get_type_display }}{{ user.committee }}
    {{ user.first_name }}{{ user.last_name }}{{ user.structure_level }}{{ user.get_type_display }}{{ user.committee }}{{ user.comment|first_line }} + {{ user.comment|first_line }} {% if user.last_login > user.date_joined %} {{ user.last_login }} {% endif %} - - + {% if perms.projector.can_manage_projector %} + + + + {% endif %} + + {% if user != request_user %} - - + + {% endif %} {% if user != request_user and not user.is_superuser %} - - + {% endif %} diff --git a/openslides/participant/templates/participant/password_change.html b/openslides/participant/templates/participant/password_change.html index a31b5bb9a..3a845dae5 100644 --- a/openslides/participant/templates/participant/password_change.html +++ b/openslides/participant/templates/participant/password_change.html @@ -4,28 +4,11 @@ {% block title %}{{ block.super }} – {% trans "Password Settings" %}{% endblock %} -{% block submenu %} -

    {% trans "User Settings" %}

    - -{% endblock %} - {% block content %}

    {% trans "Password Settings" %}

    {% csrf_token %} - {{ form.as_p }} - - - - - + {% include "form.html" %} + {% include "formbuttons_save.html" %}
    -

    {% endblock %} diff --git a/openslides/participant/templates/participant/settings.html b/openslides/participant/templates/participant/settings.html index 54bcf94e0..f7dfa77d8 100644 --- a/openslides/participant/templates/participant/settings.html +++ b/openslides/participant/templates/participant/settings.html @@ -2,29 +2,13 @@ {% load i18n %} -{% block title %}{{ block.super }} – {% trans "Personal Settings" %}{% endblock %} - -{% block submenu %} -

    {% trans "User Settings" %}

    - -{% endblock %} +{% block title %}{{ block.super }} – {% trans "Edit profile" %}{% endblock %} {% block content %} -

    {% trans "Personal Settings" %}

    +

    {% trans "Edit profile" %}

    {% csrf_token %} - {{ form_user.as_p }} - - - - - + {% include "form.html" %} + {% include "formbuttons_save.html" %}
    {% endblock %} diff --git a/openslides/participant/templates/participant/user_detail.html b/openslides/participant/templates/participant/user_detail.html index af3b581c3..e31502b29 100644 --- a/openslides/participant/templates/participant/user_detail.html +++ b/openslides/participant/templates/participant/user_detail.html @@ -1,4 +1,4 @@ -{% extends "participant/base_participant.html" %} +{% extends "base.html" %} {% load i18n %} {% load tags %} @@ -7,11 +7,15 @@ {% block content %} -

    {{ shown_user }}

    +

    {{ shown_user }} + + {% trans "Back to overview" %} + +

    {{ shown_user.email }}

    -

    {% trans "Groups" %}

    +

    {% trans "Groups" %}

    {% if shown_user.groups.all %} {{ shown_user.groups.all|join:", " }} @@ -21,32 +25,32 @@

    {% if shown_user.get_gender_display %} -

    {% trans "Gender" %}

    +

    {% trans "Gender" %}

    {{ shown_user.get_gender_display }}

    {% endif %} {% if shown_user.get_type_display %} -

    {% trans "Type" %}

    +

    {% trans "Type" %}

    {{ shown_user.get_type_display }}

    {% endif %} {% if shown_user.committee %} -

    {% trans "Committee" %}

    +

    {% trans "Committee" %}

    {{ shown_user.committee }}

    {% endif %} {% if shown_user.about_me %} -

    {% trans "About me" %}

    +

    {% trans "About me" %}

    {{ shown_user.about_me }}

    {% endif %} {% if perms.participant.can_manage_participant %} {% if shown_user.comment %} -

    {% trans "Comment" %}

    +

    {% trans "Comment" %}

    {{ shown_user.comment }}

    {% endif %} -

    {% trans "Last Login" %}

    +

    {% trans "Last Login" %}

    {% if shown_user.last_login > shown_user.date_joined %}

    {{ shown_user.last_login }}

    {% else %} diff --git a/openslides/participant/templates/participant/user_widget.html b/openslides/participant/templates/participant/user_widget.html index ab762774e..59df7c69f 100644 --- a/openslides/participant/templates/participant/user_widget.html +++ b/openslides/participant/templates/participant/user_widget.html @@ -4,17 +4,14 @@
      {% for user in users %}
    • - -
      +
      + +   + + - - - - - - - - + + {{ user }}
    • diff --git a/openslides/participant/urls.py b/openslides/participant/urls.py index 569f8b85f..8fa6b9ca9 100644 --- a/openslides/participant/urls.py +++ b/openslides/participant/urls.py @@ -10,7 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns from openslides.participant.views import ( UserOverview, UserCreateView, UserDetailView, UserUpdateView, diff --git a/openslides/participant/views.py b/openslides/participant/views.py index bae5f0a69..479f1d00c 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -163,8 +163,7 @@ class UserCreateView(CreateView): model = User context_object_name = 'edit_user' form_class = UserCreateForm - success_url = 'user_overview' - apply_url = 'user_edit' + success_url_name = 'user_overview' def manipulate_object(self, form): self.object.username = gen_username( @@ -183,8 +182,7 @@ class UserUpdateView(UpdateView): model = User context_object_name = 'edit_user' form_class = UserUpdateForm - success_url = 'user_overview' - apply_url = 'participant_edit' + success_url_name = 'user_overview' class UserDeleteView(DeleteView): @@ -193,7 +191,7 @@ class UserDeleteView(DeleteView): """ permission_required = 'participant.can_manage_participant' model = User - url = 'user_overview' + success_url_name = 'user_overview' def pre_redirect(self, request, *args, **kwargs): if self.get_object() == self.request.user: @@ -208,7 +206,7 @@ class SetUserStatusView(RedirectView, SingleObjectMixin): """ permission_required = 'participant.can_manage_participant' allow_ajax = True - url = 'user_overview' + url_name = 'user_overview' model = User def pre_redirect(self, request, *args, **kwargs): @@ -400,8 +398,7 @@ class GroupCreateView(CreateView): context_object_name = 'group' model = Group form_class = GroupForm - success_url = 'user_group_overview' - apply_url = 'user_group_edit' + success_url_name = 'user_group_overview' def get(self, request, *args, **kwargs): delete_default_permissions() @@ -417,8 +414,7 @@ class GroupUpdateView(UpdateView): model = Group context_object_name = 'group' form_class = GroupForm - success_url = 'user_group_overview' - apply_url = 'user_group_edit' + success_url_name = 'user_group_overview' def get(self, request, *args, **kwargs): delete_default_permissions() @@ -431,7 +427,7 @@ class GroupDeleteView(DeleteView): """ permission_required = 'participant.can_manage_participant' model = Group - url = 'user_group_overview' + success_url_name = 'user_group_overview' def pre_redirect(self, request, *args, **kwargs): if self.get_object().name.lower() in ['anonymous', 'registered']: @@ -447,6 +443,7 @@ class Config(FormView): permission_required = 'config.can_manage_config' form_class = ConfigForm template_name = 'participant/config.html' + success_url_name = 'config_participant' def get_initial(self): return { @@ -471,7 +468,7 @@ def login(request): extra_content = {} try: admin = User.objects.get(pk=1) - if admin.check_password(admin.default_password): + if admin.check_password(admin.default_password): extra_content['first_time_message'] = _( "Installation was successfully! Use %(user)s " "(password: %(password)s) for first login.
      " @@ -507,7 +504,7 @@ def user_settings(request): form_user = UsersettingsForm(instance=request.user, initial={'language': language}) return { - 'form_user': form_user, + 'form': form_user, 'edituser': request.user, } @@ -523,7 +520,7 @@ def user_settings_password(request): if form.is_valid(): form.save() messages.success(request, _('Password successfully changed.')) - return redirect(reverse('user_settings')) + return redirect(reverse('dashboard')) else: messages.error(request, _('Please check the form for errors.')) else: @@ -541,6 +538,7 @@ def register_tab(request): selected = request.path.startswith('/participant/') return Tab( title=_('Participants'), + app='participant', url=reverse('user_overview'), permission=( request.user.has_perm('participant.can_see_participant') or @@ -554,30 +552,30 @@ def get_widgets(request): group_widget and a personal_info_widget. """ return [ - get_personal_info_widget(request), + #get_personal_info_widget(request), get_user_widget(request), get_group_widget(request)] -def get_personal_info_widget(request): - """ - Provides a widget for personal info. It shows your submitted motions - and where you are supporter or candidate. - """ - personal_info_context = { - 'submitted_motions': Motion.objects.filter(submitter=request.user), - 'config_motion_min_supporters': config['motion_min_supporters'], - 'supported_motions': Motion.objects.filter(motionsupporter=request.user), - 'assignments': Assignment.objects.filter( - assignmentcandidate__person=request.user, - assignmentcandidate__blocked=False)} - return Widget( - name='personal_info', - display_name=_('My motions and elections'), - template='participant/personal_info_widget.html', - context=personal_info_context, - permission_required=None, - default_column=1) +## def get_personal_info_widget(request): + ## """ + ## Provides a widget for personal info. It shows your submitted motions + ## and where you are supporter or candidate. + ## """ + ## personal_info_context = { + ## 'submitted_motions': Motion.objects.filter(submitter=request.user), + ## 'config_motion_min_supporters': config['motion_min_supporters'], + ## 'supported_motions': Motion.objects.filter(motionsupporter=request.user), + ## 'assignments': Assignment.objects.filter( + ## assignmentcandidate__person=request.user, + ## assignmentcandidate__blocked=False)} + ## return Widget( + ## name='personal_info', + ## display_name=_('My motions and elections'), + ## template='participant/personal_info_widget.html', + ## context=personal_info_context, + ## permission_required=None, + ## default_column=1) def get_user_widget(request): diff --git a/openslides/poll/views.py b/openslides/poll/views.py index 70c48e7cc..2293e8c54 100644 --- a/openslides/poll/views.py +++ b/openslides/poll/views.py @@ -12,42 +12,20 @@ from django.http import HttpResponseRedirect from django.forms.models import modelform_factory +from django.core.exceptions import ImproperlyConfigured -from openslides.utils.views import TemplateView +from openslides.utils.views import TemplateView, UrlMixin -class PollFormView(TemplateView): - template_name = 'poll/poll.html' - poll_argument = 'poll_id' +class PollFormView(UrlMixin, TemplateView): + poll_class = None - def set_poll(self, poll_id): - poll_id = poll_id - self.poll = self.poll_class.objects.get(pk=poll_id) - - def get_context_data(self, **kwargs): - context = super(PollFormView, self).get_context_data(**kwargs) - self.set_poll(self.kwargs['poll_id']) - context['poll'] = self.poll - if 'forms' in kwargs: - context['forms'] = kwargs['forms'] - context['pollform'] = kwargs['pollform'] - else: - context['forms'] = self.poll.get_vote_forms() - FormClass = self.get_modelform_class() - context['pollform'] = FormClass(instance=self.poll, - prefix='pollform') - return context - - def get_success_url(self): - return self.success_url - - def get_modelform_class(self): - fields = [] - self.poll.append_pollform_fields(fields) - return modelform_factory(self.poll.__class__, fields=fields) + def get(self, request, *args, **kwargs): + self.poll = self.object = self.get_object() + return super(PollFormView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): - self.set_poll(self.kwargs['poll_id']) + self.poll = self.object = self.get_object() option_forms = self.poll.get_vote_forms(data=self.request.POST) FormClass = self.get_modelform_class() @@ -76,3 +54,32 @@ class PollFormView(TemplateView): pollform.save() return HttpResponseRedirect(self.get_success_url()) + + def get_poll_class(self): + if self.poll_class is not None: + return self.poll_class + else: + raise ImproperlyConfigured( + "No poll class defined. Either provide a poll_class or define" + " a get_poll_class method.") + + def get_object(self): + return self.get_poll_class().objects.get(pk=self.kwargs['poll_id']) + + def get_context_data(self, **kwargs): + context = super(PollFormView, self).get_context_data(**kwargs) + context['poll'] = self.poll + if 'forms' in kwargs: + context['forms'] = kwargs['forms'] + context['pollform'] = kwargs['pollform'] + else: + context['forms'] = self.poll.get_vote_forms() + FormClass = self.get_modelform_class() + context['pollform'] = FormClass(instance=self.poll, + prefix='pollform') + return context + + def get_modelform_class(self): + fields = [] + self.poll.append_pollform_fields(fields) + return modelform_factory(self.poll.__class__, fields=fields) diff --git a/openslides/projector/models.py b/openslides/projector/models.py index f403b6395..c03c426cf 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -38,7 +38,9 @@ class ProjectorSlide(models.Model, SlideMixin): } @models.permalink - def get_absolute_url(self, link='delete'): + def get_absolute_url(self, link='edit'): + if link == 'edit': + return ('customslide_edit', [str(self.id)]) if link == 'delete': return ('customslide_delete', [str(self.id)]) diff --git a/openslides/projector/static/images/icons/clock.png b/openslides/projector/static/images/icons/clock.png deleted file mode 100644 index a7800ef21..000000000 Binary files a/openslides/projector/static/images/icons/clock.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/document-save.png b/openslides/projector/static/images/icons/document-save.png deleted file mode 100644 index 8072aea32..000000000 Binary files a/openslides/projector/static/images/icons/document-save.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/go-down.png b/openslides/projector/static/images/icons/go-down.png deleted file mode 100644 index 6a2bb793c..000000000 Binary files a/openslides/projector/static/images/icons/go-down.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/go-up.png b/openslides/projector/static/images/icons/go-up.png deleted file mode 100644 index dca17c452..000000000 Binary files a/openslides/projector/static/images/icons/go-up.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/pause.png b/openslides/projector/static/images/icons/pause.png deleted file mode 100644 index a9b3113fb..000000000 Binary files a/openslides/projector/static/images/icons/pause.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/play.png b/openslides/projector/static/images/icons/play.png deleted file mode 100644 index 80ff3a1d5..000000000 Binary files a/openslides/projector/static/images/icons/play.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/skip-backward.png b/openslides/projector/static/images/icons/skip-backward.png deleted file mode 100644 index 1de5dbacf..000000000 Binary files a/openslides/projector/static/images/icons/skip-backward.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/spin-down.png b/openslides/projector/static/images/icons/spin-down.png deleted file mode 100644 index e54993882..000000000 Binary files a/openslides/projector/static/images/icons/spin-down.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/spin-up.png b/openslides/projector/static/images/icons/spin-up.png deleted file mode 100644 index 7830c52a7..000000000 Binary files a/openslides/projector/static/images/icons/spin-up.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/view-reset.png b/openslides/projector/static/images/icons/view-reset.png deleted file mode 100644 index 7726c3546..000000000 Binary files a/openslides/projector/static/images/icons/view-reset.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/zoom-in.png b/openslides/projector/static/images/icons/zoom-in.png deleted file mode 100644 index e96beb2f7..000000000 Binary files a/openslides/projector/static/images/icons/zoom-in.png and /dev/null differ diff --git a/openslides/projector/static/images/icons/zoom-out.png b/openslides/projector/static/images/icons/zoom-out.png deleted file mode 100644 index 75a1837c4..000000000 Binary files a/openslides/projector/static/images/icons/zoom-out.png and /dev/null differ diff --git a/openslides/projector/static/img/glyphicons_054_clock.png b/openslides/projector/static/img/glyphicons_054_clock.png new file mode 100644 index 000000000..46a86c1a9 Binary files /dev/null and b/openslides/projector/static/img/glyphicons_054_clock.png differ diff --git a/openslides/projector/static/images/logo-projector.png b/openslides/projector/static/img/logo-projector.png similarity index 100% rename from openslides/projector/static/images/logo-projector.png rename to openslides/projector/static/img/logo-projector.png diff --git a/openslides/projector/static/images/presentation-header-bg.png b/openslides/projector/static/img/presentation-header-bg.png similarity index 100% rename from openslides/projector/static/images/presentation-header-bg.png rename to openslides/projector/static/img/presentation-header-bg.png diff --git a/openslides/projector/static/javascript/dashboard.js b/openslides/projector/static/javascript/dashboard.js index 95b758c0a..454accbff 100644 --- a/openslides/projector/static/javascript/dashboard.js +++ b/openslides/projector/static/javascript/dashboard.js @@ -5,48 +5,30 @@ * :license: GNU GPL, see LICENSE for more details. */ -// function that writes the portlet list order to a cookie +// function that writes the widget list order to a cookie function saveOrder() { $(".column").each(function(index, value){ var colid = value.id; var cookieName = "cookie-" + colid; // Get the order for this column. var order = $('#' + colid).sortable("toArray"); - // For each portlet in the column - for ( var i = 0, n = order.length; i < n; i++ ) { - // Determine if it is 'opened' or 'closed' - var v = $('#' + order[i] ).find('.portlet-content').is(':visible'); - // Modify the array we're saving to indicate what's open and - // what's not. - order[i] = order[i] + ":" + v; - } $.cookie(cookieName, order, { path: "/", expiry: new Date(2012, 1, 1)}); }); } -// function that restores the portlet list order from a cookie +// function that restores the widget list order from a cookie function restoreOrder() { $(".column").each(function(index, value) { var colid = value.id; - var cookieName = "cookie-" + colid + var cookieName = "cookie-" + colid; var cookie = $.cookie(cookieName); if ( cookie == null ) { return; } var IDs = cookie.split(","); for (var i = 0, n = IDs.length; i < n; i++ ) { - var toks = IDs[i].split(":"); - if ( toks.length != 2 ) { - continue; - } - var portletID = toks[0]; - var visible = toks[1] - var portlet = $(".column") - .find('#' + portletID) + var widgetID = IDs[i]; + var widget = $(".column") + .find('#' + widgetID) .appendTo($('#' + colid)); - if (visible === 'false') { - portlet.find(".ui-icon").toggleClass("ui-icon-minus"); - portlet.find(".ui-icon").toggleClass("ui-icon-plus"); - portlet.find(".portlet-content").hide(); - } } }); } @@ -57,75 +39,7 @@ $(function() { stop: function() { saveOrder(); } }); - $(".portlet") - .addClass("ui-widget ui-widget-content") - .addClass("ui-helper-clearfix ui-corner-all") - .find(".portlet-header") - .addClass("ui-widget-header ui-corner-all") - .prepend('') - .end() - .find(".portlet-content"); - - restoreOrder(); - - $(".portlet-header .ui-icon").click(function() { - $(this).toggleClass("ui-icon-minus"); - $(this).toggleClass("ui-icon-plus"); - $(this).parents(".portlet:first").find(".portlet-content").toggle(); - saveOrder(); // This is important - }); - - if ($.browser.msie) { - if ($.browser.version >= 8.0 && $.browser.version < 9.0) - { - /* scaling bug in IE8.. iframe has to be 4 times bigger */ - $( "#iframe" ).css('width', 1024 * 4); - $( "#iframe" ).css('height', 768 * 4); - } - $( "#iframe" ).css('zoom', '0.25'); - } - - // activate an element to show it on projector - $('.activate_link').click(function(event) { - event.preventDefault(); - var link = $(this); - $.ajax({ - type: 'GET', - url: $(this).attr('href'), - dataType: 'json', - success: function(data) { - $('.activate_link').removeClass('active'); - $('li').removeClass('activeline'); - $('div').removeClass('activeline'); - link.addClass('active'); - link.parent().addClass('activeline'); - }, - error: function () { - alert("Ajax Error"); - } - }); - }); - - $('a.overlay').click(function(event) { - event.preventDefault(); - var link = $(this); - $.ajax({ - type: 'GET', - url: $(this).attr('href'), - dataType: 'json', - success: function(data) { - if (data['active']) { - $('#' + data['def_name'] + '_active').show(); - $('#' + data['def_name'] + '_inactive').hide(); - } else { - $('#' + data['def_name'] + '_active').hide(); - $('#' + data['def_name'] + '_inactive').show(); - } - }, - }); - }); - - // control the projector + // control the projector view $('.projector_edit').click(function(event) { event.preventDefault(); var link = $(this); @@ -143,7 +57,6 @@ $(function() { event.preventDefault(); var link = $(this); var requestData = {}; - if (link.attr('id') == "countdown_set") { requestData = { "countdown_time" : $( "#countdown_time" ).val() }; } @@ -165,7 +78,8 @@ $(function() { }); }); - $('.countdown_visible_link').click(function(event) { + // activate/deactivate overlay + $('.overlay_activate_link').click(function(event) { event.preventDefault(); var link = $(this); $.ajax({ @@ -173,13 +87,13 @@ $(function() { url: link.attr('href'), dataType: 'json', success: function(data) { - if (data.countdown_visible == "True") { - newclass = 'open'; + if (data['active']) { + $('#' + data['def_name'] + '_active').show(); + $('#' + data['def_name'] + '_inactive').hide(); } else { - newclass = 'closed'; + $('#' + data['def_name'] + '_active').hide(); + $('#' + data['def_name'] + '_inactive').show(); } - link.removeClass('closed open').addClass(newclass); - link.attr('href', data.link); } }); }); @@ -190,4 +104,21 @@ $(function() { $('#overlay_message_text').val(data['overlay_message']); } }); + +/* comment out this function because '$.browser' has been removed from jquery 1.9, see: + http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/ + TODO: use jquery migrate to have $.browser support for IE8; + + if ($.browser.msie) { + if ($.browser.version >= 8.0 && $.browser.version < 9.0) + { + // scaling bug in IE8.. iframe has to be 4 times bigger + $( "#iframe" ).css('width', 1024 * 4); + $( "#iframe" ).css('height', 768 * 4); + } + $( "#iframe" ).css('zoom', '0.25'); + } +*/ + + restoreOrder(); }); diff --git a/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js b/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js deleted file mode 100755 index b74654cd9..000000000 --- a/openslides/projector/static/javascript/jquery-ui-1.8.18.custom.min.js +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * jQuery UI 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/* - * jQuery UI Sortable 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Sortables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f= 0 ? '&' : '?') + q; options.data = null; // data is null for 'get' @@ -165,14 +165,18 @@ $.fn.ajaxSubmit = function(options) { } options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg - var context = options.context || options; // jQuery 1.4+ supports scope context + var context = options.context || this ; // jQuery 1.4+ supports scope context for (var i=0, max=callbacks.length; i < max; i++) { callbacks[i].apply(context, [data, status, xhr || $form, $form]); } }; // are there files to upload? - var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113) + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled[value!=""]', this); + var hasFileInputs = fileInputs.length > 0; var mp = 'multipart/form-data'; var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); @@ -181,6 +185,8 @@ $.fn.ajaxSubmit = function(options) { log("fileAPI :" + fileAPI); var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + var jqxhr; + // options.iframe allows user to force iframe mode // 06-NOV-09: now defaulting to iframe mode if file input is detected if (options.iframe !== false && (options.iframe || shouldUseFrame)) { @@ -188,20 +194,22 @@ $.fn.ajaxSubmit = function(options) { // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d if (options.closeKeepAlive) { $.get(options.closeKeepAlive, function() { - fileUploadIframe(a); + jqxhr = fileUploadIframe(a); }); } - else { - fileUploadIframe(a); - } + else { + jqxhr = fileUploadIframe(a); + } } else if ((hasFileInputs || multipart) && fileAPI) { - fileUploadXhr(a); + jqxhr = fileUploadXhr(a); } else { - $.ajax(options); + jqxhr = $.ajax(options); } + $form.removeData('jqxhr').data('jqxhr', jqxhr); + // clear element array for (var k=0; k < elements.length; k++) elements[k] = null; @@ -210,6 +218,22 @@ $.fn.ajaxSubmit = function(options) { this.trigger('form-submit-notify', [this, options]); return this; + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData).split('&'); + var len = serialized.length; + var result = []; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + return result; + } + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) function fileUploadXhr(a) { var formdata = new FormData(); @@ -219,9 +243,10 @@ $.fn.ajaxSubmit = function(options) { } if (options.extraData) { - for (var p in options.extraData) - if (options.extraData.hasOwnProperty(p)) - formdata.append(p, options.extraData[p]); + var serializedData = deepSerialize(options.extraData); + for (i=0; i < serializedData.length; i++) + if (serializedData[i]) + formdata.append(serializedData[i][0], serializedData[i][1]); } options.data = null; @@ -230,9 +255,9 @@ $.fn.ajaxSubmit = function(options) { contentType: false, processData: false, cache: false, - type: 'POST' + type: method || 'POST' }); - + if (options.uploadProgress) { // workaround because jqXHR does not expose upload property s.xhr = function() { @@ -253,27 +278,21 @@ $.fn.ajaxSubmit = function(options) { } s.data = null; - var beforeSend = s.beforeSend; - s.beforeSend = function(xhr, o) { - o.data = formdata; - if(beforeSend) - beforeSend.call(o, xhr, options); + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + o.data = formdata; + if(beforeSend) + beforeSend.call(this, xhr, o); }; - $.ajax(s); + return $.ajax(s); } // private function for handling file uploads (hat tip to YAHOO!) function fileUploadIframe(a) { var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; var useProp = !!$.fn.prop; + var deferred = $.Deferred(); - if ($(':input[name=submit],:input[id=submit]', form).length) { - // if there is an input with a name or id of 'submit' then we won't be - // able to invoke the submit fn on the form (at least not x-browser) - alert('Error: Form elements must not have name or id of "submit".'); - return; - } - if (a) { // ensure that every serialized input is still enabled for (i=0; i < elements.length; i++) { @@ -316,6 +335,14 @@ $.fn.ajaxSubmit = function(options) { var e = (status === 'timeout' ? 'timeout' : 'aborted'); log('aborting upload... ' + e); this.aborted = 1; + + try { // #214, #257 + if (io.contentWindow.document.execCommand) { + io.contentWindow.document.execCommand('Stop'); + } + } + catch(ignore) {} + $io.attr('src', s.iframeSrc); // abort op in progress xhr.error = e; if (s.error) @@ -340,10 +367,12 @@ $.fn.ajaxSubmit = function(options) { if (s.global) { $.active--; } - return; + deferred.reject(); + return deferred; } if (xhr.aborted) { - return; + deferred.reject(); + return deferred; } // add submitting element to data if we know it @@ -359,7 +388,7 @@ $.fn.ajaxSubmit = function(options) { } } } - + var CLIENT_TIMEOUT_ABORT = 1; var SERVER_ABORT = 2; @@ -367,7 +396,7 @@ $.fn.ajaxSubmit = function(options) { var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document; return doc; } - + // Rails CSRF hack (thanks to Yvan Barthelemy) var csrf_token = $('meta[name=csrf-token]').attr('content'); var csrf_param = $('meta[name=csrf-param]').attr('content'); @@ -402,7 +431,7 @@ $.fn.ajaxSubmit = function(options) { if (s.timeout) { timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout); } - + // look for server aborts function checkState() { try { @@ -426,9 +455,16 @@ $.fn.ajaxSubmit = function(options) { if (s.extraData) { for (var n in s.extraData) { if (s.extraData.hasOwnProperty(n)) { - extraInputs.push( - $('').attr('value',s.extraData[n]) - .appendTo(form)[0]); + // if using the $.param format that allows for multiple values with the same name + if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) { + extraInputs.push( + $('').val(s.extraData[n].value) + .appendTo(form)[0]); + } else { + extraInputs.push( + $('').val(s.extraData[n]) + .appendTo(form)[0]); + } } } } @@ -442,7 +478,9 @@ $.fn.ajaxSubmit = function(options) { io.addEventListener('load', cb, false); } setTimeout(checkState,15); - form.submit(); + // just in case form has element with name/id of 'submit' + var submitFn = document.createElement('form').submit; + submitFn.apply(form); } finally { // reset attrs and remove "extra" input elements @@ -478,10 +516,12 @@ $.fn.ajaxSubmit = function(options) { } if (e === CLIENT_TIMEOUT_ABORT && xhr) { xhr.abort('timeout'); + deferred.reject(xhr, 'timeout'); return; } else if (e == SERVER_ABORT && xhr) { xhr.abort('server abort'); + deferred.reject(xhr, 'error', 'server abort'); return; } @@ -492,7 +532,7 @@ $.fn.ajaxSubmit = function(options) { } if (io.detachEvent) io.detachEvent('onload', cb); - else + else io.removeEventListener('load', cb, false); var status = 'success', errMsg; @@ -586,6 +626,7 @@ $.fn.ajaxSubmit = function(options) { if (status === 'success') { if (s.success) s.success.call(s.context, data, 'success', xhr); + deferred.resolve(xhr.responseText, 'success', xhr); if (g) $.event.trigger("ajaxSuccess", [xhr, s]); } @@ -594,6 +635,7 @@ $.fn.ajaxSubmit = function(options) { errMsg = xhr.statusText; if (s.error) s.error.call(s.context, xhr, status, errMsg); + deferred.reject(xhr, 'error', errMsg); if (g) $.event.trigger("ajaxError", [xhr, s, errMsg]); } @@ -658,6 +700,8 @@ $.fn.ajaxSubmit = function(options) { } return data; }; + + return deferred; } }; @@ -679,7 +723,7 @@ $.fn.ajaxSubmit = function(options) { $.fn.ajaxForm = function(options) { options = options || {}; options.delegation = options.delegation && $.isFunction($.fn.on); - + // in jQuery 1.3+ we can fix mistakes with the ready state if (!options.delegation && this.length === 0) { var o = { s: this.selector, c: this.context }; @@ -709,7 +753,7 @@ $.fn.ajaxForm = function(options) { .bind('click.form-plugin', options, captureSubmittingElement); }; -// private event handlers +// private event handlers function doAjaxSubmit(e) { /*jshint validthis:true */ var options = e.data; @@ -718,14 +762,14 @@ function doAjaxSubmit(e) { $(this).ajaxSubmit(options); } } - + function captureSubmittingElement(e) { /*jshint validthis:true */ var target = e.target; var $el = $(target); - if (!($el.is(":submit,input:image"))) { + if (!($el.is("[type=submit],[type=image]"))) { // is this a child element of the submit el? (ex: a span within a button) - var t = $el.closest(':submit'); + var t = $el.closest('[type=submit]'); if (t.length === 0) { return; } @@ -798,14 +842,14 @@ $.fn.formToArray = function(semantic, elements) { v = $.fieldValue(el, true); if (v && v.constructor == Array) { - if (elements) + if (elements) elements.push(el); for(j=0, jmax=v.length; j < jmax; j++) { a.push({name: n, value: v[j]}); } } else if (feature.fileapi && el.type == 'file' && !el.disabled) { - if (elements) + if (elements) elements.push(el); var files = el.files; if (files.length) { @@ -819,7 +863,7 @@ $.fn.formToArray = function(semantic, elements) { } } else if (v !== null && typeof v != 'undefined') { - if (elements) + if (elements) elements.push(el); a.push({name: n, value: v, type: el.type, required: el.required}); } @@ -883,19 +927,19 @@ $.fn.fieldSerialize = function(successful) { * * * - * var v = $(':text').fieldValue(); + * var v = $('input[type=text]').fieldValue(); * // if no values are entered into the text inputs * v == ['',''] * // if values entered into the text inputs are 'foo' and 'bar' * v == ['foo','bar'] * - * var v = $(':checkbox').fieldValue(); + * var v = $('input[type=checkbox]').fieldValue(); * // if neither checkbox is checked * v === undefined * // if both checkboxes are checked * v == ['B1', 'B2'] * - * var v = $(':radio').fieldValue(); + * var v = $('input[type=radio]').fieldValue(); * // if neither radio is checked * v === undefined * // if first radio is checked @@ -996,8 +1040,15 @@ $.fn.clearFields = $.fn.clearInputs = function(includeHidden) { else if (tag == 'select') { this.selectedIndex = -1; } + else if (t == "file") { + if (/MSIE/.test(navigator.userAgent)) { + $(this).replaceWith($(this).clone()); + } else { + $(this).val(''); + } + } else if (includeHidden) { - // includeHidden can be the valud true, or it can be a selector string + // includeHidden can be the value true, or it can be a selector string // indicating a special test; for example: // $('#myForm').clearForm('.special:hidden') // the above would clean hidden inputs that have the class of 'special' @@ -1062,7 +1113,7 @@ $.fn.ajaxSubmit.debug = false; // helper fn for console logging function log() { - if (!$.fn.ajaxSubmit.debug) + if (!$.fn.ajaxSubmit.debug) return; var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,''); if (window.console && window.console.log) { diff --git a/openslides/projector/static/styles/dashboard.css b/openslides/projector/static/styles/dashboard.css index 1ff1b62ed..fd5134bdb 100644 --- a/openslides/projector/static/styles/dashboard.css +++ b/openslides/projector/static/styles/dashboard.css @@ -5,32 +5,71 @@ * :license: GNU GPL, see LICENSE for more details. */ -/* Portlet */ +/** Widgets **/ .column { width: 50%; float: left; padding-bottom: 100px; } -.portlet { +.widget { margin: 0 10px 10px 0; } -.portlet-header { - margin: 0.3em; - padding-bottom: 4px; - padding-left: 0.2em; +.widget-header { + height: 30px; + background: #E9E9E9; + background:-moz-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); /* FF3.6+ */ + background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#FAFAFA), color-stop(100%,#E9E9E9)); /* Chrome,Safari4+ */ + background:-webkit-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Chrome10+,Safari5.1+ */ + background:-o-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Opera11.10+ */ + background:-ms-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* IE10+ */ + background:linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9'); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9')"; + border: 1px solid #D5D5D5; + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + } -.portlet-header .ui-icon { - float: right; +.widget-header h3 { + padding-left: 7px; + margin: 7px 0; + display: inline-block; + font-size: 14px; + color: #555; + line-height: 18px; } -.portlet-content { - padding: 0.4em; - overflow: hidden; + +.widget-header [class^="icon-"], .widget-header [class*=" icon-"] { + display: inline-block; + margin: -2px 0 0 13px; + color: #555; + vertical-align: middle; } -.portlet-content li{ +.widget-content { + padding: 20px 15px 15px 13px; + background: #FFF; + border: 1px solid #D5D5D5; + border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; +} +.widget-content li { padding: 4px 0; } +.widget-content .overlay_list li { + padding-bottom: 10px; +} +.widget-content ul { + list-style: none inside none; + margin: 0; +} +.widget-content hr { + margin: 5px 0; +} + .ui-sortable-placeholder { - border: 1px dotted black; + border: 2px dashed #555555; visibility: visible !important; height: 50px !important; } @@ -38,11 +77,12 @@ visibility: hidden; } -/*.projector_countdown_spinval {*/ +.overlay_list .form-inline { + margin: 5px 0 0 31px; +} #countdown_time { width: 40px; - height: 16px; } /* iframe */ @@ -53,18 +93,16 @@ -moz-transform: scale(0.25); -webkit-transform: scale(0.25); -o-transform: scale(0.25); - width: 1024px; height: 768px; } - #iframewrapper { width: 256px;/*100%;*/ height: 192px;/*230px;*/ position: relative; overflow: hidden; + border: 1px solid #D5D5D5; } - #iframeoverlay { width: 256px; height: 192px; @@ -74,38 +112,3 @@ display: block; z-index: 1; } - -/* activate link */ -a.activate_link div { - background-image: url(../images/icons/accept-grey.png); - background-repeat: no-repeat; - float: left; - width: 16px; - height: 16px; - padding-right: 12px; - position: relative; - top: 4px; - left: 4px; -} -a.activate_link.active div { - background-image: url(../images/icons/accept.png); -} - -a.overlay div { - background-image: url(../images/icons/accept-grey.png); - background-repeat: no-repeat; - float: left; - width: 16px; - height: 16px; - padding-right: 16px; - position: relative; - top: 4px; - left: 4px; -} - -a.overlay.active div { - background-image: url(../images/icons/accept.png); -} - - - diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png deleted file mode 100644 index 688c2f3e8..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png deleted file mode 100644 index 1936896d8..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_25_cb842e_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png b/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png deleted file mode 100644 index 779ef0d0e..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_glass_70_ede4d4_1x400.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png deleted file mode 100644 index 8766f0018..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png deleted file mode 100644 index 52d3a3418..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png deleted file mode 100644 index af01f1208..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png b/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png deleted file mode 100644 index 894bf7510..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png deleted file mode 100644 index 69f2f553d..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_c47a23_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png deleted file mode 100644 index b75ecdabd..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_cb672b_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png deleted file mode 100644 index f0a003fad..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_f08000_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png deleted file mode 100644 index 1105d2a24..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_f35f07_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png deleted file mode 100644 index 544517142..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_ff7519_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png b/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index 42f8f992c..000000000 Binary files a/openslides/projector/static/styles/humanity/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css b/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css deleted file mode 100644 index 3bc67982d..000000000 --- a/openslides/projector/static/styles/humanity/jquery-ui-1.8.18.custom.css +++ /dev/null @@ -1,286 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } -.ui-helper-clearfix:after { clear: both; } -.ui-helper-clearfix { zoom: 1; } -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?tr=ffDefault=Helvetica,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cb842e&bgTextureHeader=02_glass.png&bgImgOpacityHeader=25&borderColorHeader=d49768&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=f4f0ec&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=100&borderColorContent=e0cfc2&fcContent=1e1b1d&iconColorContent=c47a23&bgColorDefault=ede4d4&bgTextureDefault=02_glass.png&bgImgOpacityDefault=70&borderColorDefault=cdc3b7&fcDefault=3f3731&iconColorDefault=f08000&bgColorHover=f5f0e5&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=f5ad66&fcHover=a46313&iconColorHover=f08000&bgColorActive=f4f0ec&bgTextureActive=04_highlight_hard.png&bgImgOpacityActive=100&borderColorActive=e0cfc2&fcActive=b85700&iconColorActive=f35f07&bgColorHighlight=f5f5b5&bgTextureHighlight=04_highlight_hard.png&bgImgOpacityHighlight=75&borderColorHighlight=d9bb73&fcHighlight=060200&iconColorHighlight=cb672b&bgColorError=fee4bd&bgTextureError=04_highlight_hard.png&bgImgOpacityError=65&borderColorError=f8893f&fcError=592003&iconColorError=ff7519&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=75&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-size: 1em; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-size: 1em; } -.ui-widget-content { border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_inset-soft_100_f4f0ec_1x100.png) 50% bottom repeat-x; color: #1e1b1d; } -.ui-widget-header { border: 1px solid #d49768; background: #cb842e url(images/ui-bg_glass_25_cb842e_1x400.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } -.ui-widget-header a { color: #ffffff; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cdc3b7; background: #ede4d4 url(images/ui-bg_glass_70_ede4d4_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #3f3731; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #3f3731; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #f5ad66; background: #f5f0e5 url(images/ui-bg_glass_100_f5f0e5_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #a46313; } -.ui-state-hover a, .ui-state-hover a:hover { color: #a46313; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #e0cfc2; background: #f4f0ec url(images/ui-bg_highlight-hard_100_f4f0ec_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #b85700; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #b85700; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #d9bb73; background: #f5f5b5 url(images/ui-bg_highlight-hard_75_f5f5b5_1x100.png) 50% top repeat-x; color: #060200; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #060200; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #f8893f; background: #fee4bd url(images/ui-bg_highlight-hard_65_fee4bd_1x100.png) 50% top repeat-x; color: #592003; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #592003; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #592003; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_c47a23_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_c47a23_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_f08000_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_f08000_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_f35f07_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_cb672b_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ff7519_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file diff --git a/openslides/projector/static/styles/projector.css b/openslides/projector/static/styles/projector.css index 423c8039d..2f22b4550 100644 --- a/openslides/projector/static/styles/projector.css +++ b/openslides/projector/static/styles/projector.css @@ -18,7 +18,7 @@ body{ /*** HEADER ***/ #header { position:relative; - background:url("../images/presentation-header-bg.png") repeat-x scroll center top #3D3020; + background:url("../img/presentation-header-bg.png") repeat-x scroll center top #3D3020; height:100px; } #logo { @@ -58,7 +58,7 @@ body{ top:110px; right:40px; padding-left:30px; - background: url(../images/icons/clock.png) no-repeat scroll 0px 4px; + background: url(../img/glyphicons_054_clock.png) no-repeat scroll 0px 4px; } #currentTime.ajax_error { diff --git a/openslides/projector/templates/base-projector.html b/openslides/projector/templates/base-projector.html index a7a5ac98b..af2845b92 100644 --- a/openslides/projector/templates/base-projector.html +++ b/openslides/projector/templates/base-projector.html @@ -8,7 +8,7 @@ - + {% block title %} {% get_config 'event_name' %} {% endblock %} {% block header %} @@ -21,7 +21,7 @@
      diff --git a/openslides/projector/templates/projector/base_projector.html b/openslides/projector/templates/projector/base_projector.html deleted file mode 100644 index 93418c2cb..000000000 --- a/openslides/projector/templates/projector/base_projector.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} - -{% load tags %} -{% load i18n %} -{% load staticfiles %} - -{% block title %}{{ block.super}} – {% trans 'Dashboard' %} {% endblock %} - -{% block submenu %} - {% url 'dashboard' as url_dashboard %} - {% url 'projector_select_widgets' as url_select_widget %} -

      {% trans "Dashboard" %}

      - -{% endblock %} diff --git a/openslides/projector/templates/projector/control_countdown.html b/openslides/projector/templates/projector/control_countdown.html index 1109596ad..837666093 100644 --- a/openslides/projector/templates/projector/control_countdown.html +++ b/openslides/projector/templates/projector/control_countdown.html @@ -1,19 +1,21 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} - - {% trans "s" context "seconds" %} - - {% url 'countdown_set_default' %} + diff --git a/openslides/projector/templates/projector/control_overlay_message.html b/openslides/projector/templates/projector/control_overlay_message.html index 2d7c631f7..ee10ace99 100644 --- a/openslides/projector/templates/projector/control_overlay_message.html +++ b/openslides/projector/templates/projector/control_overlay_message.html @@ -1,15 +1,14 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} -
      {% csrf_token %} - - - +
      - diff --git a/openslides/projector/templates/projector/custom_slide_widget.html b/openslides/projector/templates/projector/custom_slide_widget.html index a188a42a8..f4c805047 100644 --- a/openslides/projector/templates/projector/custom_slide_widget.html +++ b/openslides/projector/templates/projector/custom_slide_widget.html @@ -1,15 +1,13 @@ -{% load staticfiles %} {% load i18n %} {% load tags %} -
    ","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/openslides/static/javascript/jquery.min.js b/openslides/static/javascript/jquery.min.js new file mode 100644 index 000000000..006e95310 --- /dev/null +++ b/openslides/static/javascript/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
    ",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("