@@ -0,0 +1,200 | |||||
|
1 | /* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ | |||
|
2 | * --------------------------------------------------------------------------- | |||
|
3 | * | |||
|
4 | * The DHTML Calendar | |||
|
5 | * | |||
|
6 | * Details and latest version at: | |||
|
7 | * http://dynarch.com/mishoo/calendar.epl | |||
|
8 | * | |||
|
9 | * This script is distributed under the GNU Lesser General Public License. | |||
|
10 | * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html | |||
|
11 | * | |||
|
12 | * This file defines helper functions for setting up the calendar. They are | |||
|
13 | * intended to help non-programmers get a working calendar on their site | |||
|
14 | * quickly. This script should not be seen as part of the calendar. It just | |||
|
15 | * shows you what one can do with the calendar, while in the same time | |||
|
16 | * providing a quick and simple method for setting it up. If you need | |||
|
17 | * exhaustive customization of the calendar creation process feel free to | |||
|
18 | * modify this code to suit your needs (this is recommended and much better | |||
|
19 | * than modifying calendar.js itself). | |||
|
20 | */ | |||
|
21 | ||||
|
22 | // $Id: calendar-setup.js,v 1.25 2005/03/07 09:51:33 mishoo Exp $ | |||
|
23 | ||||
|
24 | /** | |||
|
25 | * This function "patches" an input field (or other element) to use a calendar | |||
|
26 | * widget for date selection. | |||
|
27 | * | |||
|
28 | * The "params" is a single object that can have the following properties: | |||
|
29 | * | |||
|
30 | * prop. name | description | |||
|
31 | * ------------------------------------------------------------------------------------------------- | |||
|
32 | * inputField | the ID of an input field to store the date | |||
|
33 | * displayArea | the ID of a DIV or other element to show the date | |||
|
34 | * button | ID of a button or other element that will trigger the calendar | |||
|
35 | * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") | |||
|
36 | * ifFormat | date format that will be stored in the input field | |||
|
37 | * daFormat | the date format that will be used to display the date in displayArea | |||
|
38 | * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) | |||
|
39 | * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. | |||
|
40 | * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation | |||
|
41 | * range | array with 2 elements. Default: [1900, 2999] -- the range of years available | |||
|
42 | * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers | |||
|
43 | * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID | |||
|
44 | * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) | |||
|
45 | * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar | |||
|
46 | * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) | |||
|
47 | * onClose | function that gets called when the calendar is closed. [default] | |||
|
48 | * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. | |||
|
49 | * date | the date that the calendar will be initially displayed to | |||
|
50 | * showsTime | default: false; if true the calendar will include a time selector | |||
|
51 | * timeFormat | the time format; can be "12" or "24", default is "12" | |||
|
52 | * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close | |||
|
53 | * step | configures the step of the years in drop-down boxes; default: 2 | |||
|
54 | * position | configures the calendar absolute position; default: null | |||
|
55 | * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible | |||
|
56 | * showOthers | if "true" (but default: "false") it will show days from other months too | |||
|
57 | * | |||
|
58 | * None of them is required, they all have default values. However, if you | |||
|
59 | * pass none of "inputField", "displayArea" or "button" you'll get a warning | |||
|
60 | * saying "nothing to setup". | |||
|
61 | */ | |||
|
62 | Calendar.setup = function (params) { | |||
|
63 | function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; | |||
|
64 | ||||
|
65 | param_default("inputField", null); | |||
|
66 | param_default("displayArea", null); | |||
|
67 | param_default("button", null); | |||
|
68 | param_default("eventName", "click"); | |||
|
69 | param_default("ifFormat", "%Y/%m/%d"); | |||
|
70 | param_default("daFormat", "%Y/%m/%d"); | |||
|
71 | param_default("singleClick", true); | |||
|
72 | param_default("disableFunc", null); | |||
|
73 | param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined | |||
|
74 | param_default("dateText", null); | |||
|
75 | param_default("firstDay", null); | |||
|
76 | param_default("align", "Br"); | |||
|
77 | param_default("range", [1900, 2999]); | |||
|
78 | param_default("weekNumbers", true); | |||
|
79 | param_default("flat", null); | |||
|
80 | param_default("flatCallback", null); | |||
|
81 | param_default("onSelect", null); | |||
|
82 | param_default("onClose", null); | |||
|
83 | param_default("onUpdate", null); | |||
|
84 | param_default("date", null); | |||
|
85 | param_default("showsTime", false); | |||
|
86 | param_default("timeFormat", "24"); | |||
|
87 | param_default("electric", true); | |||
|
88 | param_default("step", 2); | |||
|
89 | param_default("position", null); | |||
|
90 | param_default("cache", false); | |||
|
91 | param_default("showOthers", false); | |||
|
92 | param_default("multiple", null); | |||
|
93 | ||||
|
94 | var tmp = ["inputField", "displayArea", "button"]; | |||
|
95 | for (var i in tmp) { | |||
|
96 | if (typeof params[tmp[i]] == "string") { | |||
|
97 | params[tmp[i]] = document.getElementById(params[tmp[i]]); | |||
|
98 | } | |||
|
99 | } | |||
|
100 | if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { | |||
|
101 | alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); | |||
|
102 | return false; | |||
|
103 | } | |||
|
104 | ||||
|
105 | function onSelect(cal) { | |||
|
106 | var p = cal.params; | |||
|
107 | var update = (cal.dateClicked || p.electric); | |||
|
108 | if (update && p.inputField) { | |||
|
109 | p.inputField.value = cal.date.print(p.ifFormat); | |||
|
110 | if (typeof p.inputField.onchange == "function") | |||
|
111 | p.inputField.onchange(); | |||
|
112 | } | |||
|
113 | if (update && p.displayArea) | |||
|
114 | p.displayArea.innerHTML = cal.date.print(p.daFormat); | |||
|
115 | if (update && typeof p.onUpdate == "function") | |||
|
116 | p.onUpdate(cal); | |||
|
117 | if (update && p.flat) { | |||
|
118 | if (typeof p.flatCallback == "function") | |||
|
119 | p.flatCallback(cal); | |||
|
120 | } | |||
|
121 | if (update && p.singleClick && cal.dateClicked) | |||
|
122 | cal.callCloseHandler(); | |||
|
123 | }; | |||
|
124 | ||||
|
125 | if (params.flat != null) { | |||
|
126 | if (typeof params.flat == "string") | |||
|
127 | params.flat = document.getElementById(params.flat); | |||
|
128 | if (!params.flat) { | |||
|
129 | alert("Calendar.setup:\n Flat specified but can't find parent."); | |||
|
130 | return false; | |||
|
131 | } | |||
|
132 | var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); | |||
|
133 | cal.showsOtherMonths = params.showOthers; | |||
|
134 | cal.showsTime = params.showsTime; | |||
|
135 | cal.time24 = (params.timeFormat == "24"); | |||
|
136 | cal.params = params; | |||
|
137 | cal.weekNumbers = params.weekNumbers; | |||
|
138 | cal.setRange(params.range[0], params.range[1]); | |||
|
139 | cal.setDateStatusHandler(params.dateStatusFunc); | |||
|
140 | cal.getDateText = params.dateText; | |||
|
141 | if (params.ifFormat) { | |||
|
142 | cal.setDateFormat(params.ifFormat); | |||
|
143 | } | |||
|
144 | if (params.inputField && typeof params.inputField.value == "string") { | |||
|
145 | cal.parseDate(params.inputField.value); | |||
|
146 | } | |||
|
147 | cal.create(params.flat); | |||
|
148 | cal.show(); | |||
|
149 | return false; | |||
|
150 | } | |||
|
151 | ||||
|
152 | var triggerEl = params.button || params.displayArea || params.inputField; | |||
|
153 | triggerEl["on" + params.eventName] = function() { | |||
|
154 | var dateEl = params.inputField || params.displayArea; | |||
|
155 | var dateFmt = params.inputField ? params.ifFormat : params.daFormat; | |||
|
156 | var mustCreate = false; | |||
|
157 | var cal = window.calendar; | |||
|
158 | if (dateEl) | |||
|
159 | params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); | |||
|
160 | if (!(cal && params.cache)) { | |||
|
161 | window.calendar = cal = new Calendar(params.firstDay, | |||
|
162 | params.date, | |||
|
163 | params.onSelect || onSelect, | |||
|
164 | params.onClose || function(cal) { cal.hide(); }); | |||
|
165 | cal.showsTime = params.showsTime; | |||
|
166 | cal.time24 = (params.timeFormat == "24"); | |||
|
167 | cal.weekNumbers = params.weekNumbers; | |||
|
168 | mustCreate = true; | |||
|
169 | } else { | |||
|
170 | if (params.date) | |||
|
171 | cal.setDate(params.date); | |||
|
172 | cal.hide(); | |||
|
173 | } | |||
|
174 | if (params.multiple) { | |||
|
175 | cal.multiple = {}; | |||
|
176 | for (var i = params.multiple.length; --i >= 0;) { | |||
|
177 | var d = params.multiple[i]; | |||
|
178 | var ds = d.print("%Y%m%d"); | |||
|
179 | cal.multiple[ds] = d; | |||
|
180 | } | |||
|
181 | } | |||
|
182 | cal.showsOtherMonths = params.showOthers; | |||
|
183 | cal.yearStep = params.step; | |||
|
184 | cal.setRange(params.range[0], params.range[1]); | |||
|
185 | cal.params = params; | |||
|
186 | cal.setDateStatusHandler(params.dateStatusFunc); | |||
|
187 | cal.getDateText = params.dateText; | |||
|
188 | cal.setDateFormat(dateFmt); | |||
|
189 | if (mustCreate) | |||
|
190 | cal.create(); | |||
|
191 | cal.refresh(); | |||
|
192 | if (!params.position) | |||
|
193 | cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); | |||
|
194 | else | |||
|
195 | cal.showAt(params.position[0], params.position[1]); | |||
|
196 | return false; | |||
|
197 | }; | |||
|
198 | ||||
|
199 | return cal; | |||
|
200 | }; |
This diff has been collapsed as it changes many lines, (1806 lines changed) Show them Hide them | |||||
@@ -0,0 +1,1806 | |||||
|
1 | /* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo | |||
|
2 | * ----------------------------------------------------------- | |||
|
3 | * | |||
|
4 | * The DHTML Calendar, version 1.0 "It is happening again" | |||
|
5 | * | |||
|
6 | * Details and latest version at: | |||
|
7 | * www.dynarch.com/projects/calendar | |||
|
8 | * | |||
|
9 | * This script is developed by Dynarch.com. Visit us at www.dynarch.com. | |||
|
10 | * | |||
|
11 | * This script is distributed under the GNU Lesser General Public License. | |||
|
12 | * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html | |||
|
13 | */ | |||
|
14 | ||||
|
15 | // $Id: calendar.js,v 1.51 2005/03/07 16:44:31 mishoo Exp $ | |||
|
16 | ||||
|
17 | /** The Calendar object constructor. */ | |||
|
18 | Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { | |||
|
19 | // member variables | |||
|
20 | this.activeDiv = null; | |||
|
21 | this.currentDateEl = null; | |||
|
22 | this.getDateStatus = null; | |||
|
23 | this.getDateToolTip = null; | |||
|
24 | this.getDateText = null; | |||
|
25 | this.timeout = null; | |||
|
26 | this.onSelected = onSelected || null; | |||
|
27 | this.onClose = onClose || null; | |||
|
28 | this.dragging = false; | |||
|
29 | this.hidden = false; | |||
|
30 | this.minYear = 1970; | |||
|
31 | this.maxYear = 2050; | |||
|
32 | this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; | |||
|
33 | this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; | |||
|
34 | this.isPopup = true; | |||
|
35 | this.weekNumbers = true; | |||
|
36 | this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc. | |||
|
37 | this.showsOtherMonths = false; | |||
|
38 | this.dateStr = dateStr; | |||
|
39 | this.ar_days = null; | |||
|
40 | this.showsTime = false; | |||
|
41 | this.time24 = true; | |||
|
42 | this.yearStep = 2; | |||
|
43 | this.hiliteToday = true; | |||
|
44 | this.multiple = null; | |||
|
45 | // HTML elements | |||
|
46 | this.table = null; | |||
|
47 | this.element = null; | |||
|
48 | this.tbody = null; | |||
|
49 | this.firstdayname = null; | |||
|
50 | // Combo boxes | |||
|
51 | this.monthsCombo = null; | |||
|
52 | this.yearsCombo = null; | |||
|
53 | this.hilitedMonth = null; | |||
|
54 | this.activeMonth = null; | |||
|
55 | this.hilitedYear = null; | |||
|
56 | this.activeYear = null; | |||
|
57 | // Information | |||
|
58 | this.dateClicked = false; | |||
|
59 | ||||
|
60 | // one-time initializations | |||
|
61 | if (typeof Calendar._SDN == "undefined") { | |||
|
62 | // table of short day names | |||
|
63 | if (typeof Calendar._SDN_len == "undefined") | |||
|
64 | Calendar._SDN_len = 3; | |||
|
65 | var ar = new Array(); | |||
|
66 | for (var i = 8; i > 0;) { | |||
|
67 | ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); | |||
|
68 | } | |||
|
69 | Calendar._SDN = ar; | |||
|
70 | // table of short month names | |||
|
71 | if (typeof Calendar._SMN_len == "undefined") | |||
|
72 | Calendar._SMN_len = 3; | |||
|
73 | ar = new Array(); | |||
|
74 | for (var i = 12; i > 0;) { | |||
|
75 | ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); | |||
|
76 | } | |||
|
77 | Calendar._SMN = ar; | |||
|
78 | } | |||
|
79 | }; | |||
|
80 | ||||
|
81 | // ** constants | |||
|
82 | ||||
|
83 | /// "static", needed for event handlers. | |||
|
84 | Calendar._C = null; | |||
|
85 | ||||
|
86 | /// detect a special case of "web browser" | |||
|
87 | Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && | |||
|
88 | !/opera/i.test(navigator.userAgent) ); | |||
|
89 | ||||
|
90 | Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) ); | |||
|
91 | ||||
|
92 | /// detect Opera browser | |||
|
93 | Calendar.is_opera = /opera/i.test(navigator.userAgent); | |||
|
94 | ||||
|
95 | /// detect KHTML-based browsers | |||
|
96 | Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); | |||
|
97 | ||||
|
98 | // BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate | |||
|
99 | // library, at some point. | |||
|
100 | ||||
|
101 | Calendar.getAbsolutePos = function(el) { | |||
|
102 | var SL = 0, ST = 0; | |||
|
103 | var is_div = /^div$/i.test(el.tagName); | |||
|
104 | if (is_div && el.scrollLeft) | |||
|
105 | SL = el.scrollLeft; | |||
|
106 | if (is_div && el.scrollTop) | |||
|
107 | ST = el.scrollTop; | |||
|
108 | var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; | |||
|
109 | if (el.offsetParent) { | |||
|
110 | var tmp = this.getAbsolutePos(el.offsetParent); | |||
|
111 | r.x += tmp.x; | |||
|
112 | r.y += tmp.y; | |||
|
113 | } | |||
|
114 | return r; | |||
|
115 | }; | |||
|
116 | ||||
|
117 | Calendar.isRelated = function (el, evt) { | |||
|
118 | var related = evt.relatedTarget; | |||
|
119 | if (!related) { | |||
|
120 | var type = evt.type; | |||
|
121 | if (type == "mouseover") { | |||
|
122 | related = evt.fromElement; | |||
|
123 | } else if (type == "mouseout") { | |||
|
124 | related = evt.toElement; | |||
|
125 | } | |||
|
126 | } | |||
|
127 | while (related) { | |||
|
128 | if (related == el) { | |||
|
129 | return true; | |||
|
130 | } | |||
|
131 | related = related.parentNode; | |||
|
132 | } | |||
|
133 | return false; | |||
|
134 | }; | |||
|
135 | ||||
|
136 | Calendar.removeClass = function(el, className) { | |||
|
137 | if (!(el && el.className)) { | |||
|
138 | return; | |||
|
139 | } | |||
|
140 | var cls = el.className.split(" "); | |||
|
141 | var ar = new Array(); | |||
|
142 | for (var i = cls.length; i > 0;) { | |||
|
143 | if (cls[--i] != className) { | |||
|
144 | ar[ar.length] = cls[i]; | |||
|
145 | } | |||
|
146 | } | |||
|
147 | el.className = ar.join(" "); | |||
|
148 | }; | |||
|
149 | ||||
|
150 | Calendar.addClass = function(el, className) { | |||
|
151 | Calendar.removeClass(el, className); | |||
|
152 | el.className += " " + className; | |||
|
153 | }; | |||
|
154 | ||||
|
155 | // FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. | |||
|
156 | Calendar.getElement = function(ev) { | |||
|
157 | var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; | |||
|
158 | while (f.nodeType != 1 || /^div$/i.test(f.tagName)) | |||
|
159 | f = f.parentNode; | |||
|
160 | return f; | |||
|
161 | }; | |||
|
162 | ||||
|
163 | Calendar.getTargetElement = function(ev) { | |||
|
164 | var f = Calendar.is_ie ? window.event.srcElement : ev.target; | |||
|
165 | while (f.nodeType != 1) | |||
|
166 | f = f.parentNode; | |||
|
167 | return f; | |||
|
168 | }; | |||
|
169 | ||||
|
170 | Calendar.stopEvent = function(ev) { | |||
|
171 | ev || (ev = window.event); | |||
|
172 | if (Calendar.is_ie) { | |||
|
173 | ev.cancelBubble = true; | |||
|
174 | ev.returnValue = false; | |||
|
175 | } else { | |||
|
176 | ev.preventDefault(); | |||
|
177 | ev.stopPropagation(); | |||
|
178 | } | |||
|
179 | return false; | |||
|
180 | }; | |||
|
181 | ||||
|
182 | Calendar.addEvent = function(el, evname, func) { | |||
|
183 | if (el.attachEvent) { // IE | |||
|
184 | el.attachEvent("on" + evname, func); | |||
|
185 | } else if (el.addEventListener) { // Gecko / W3C | |||
|
186 | el.addEventListener(evname, func, true); | |||
|
187 | } else { | |||
|
188 | el["on" + evname] = func; | |||
|
189 | } | |||
|
190 | }; | |||
|
191 | ||||
|
192 | Calendar.removeEvent = function(el, evname, func) { | |||
|
193 | if (el.detachEvent) { // IE | |||
|
194 | el.detachEvent("on" + evname, func); | |||
|
195 | } else if (el.removeEventListener) { // Gecko / W3C | |||
|
196 | el.removeEventListener(evname, func, true); | |||
|
197 | } else { | |||
|
198 | el["on" + evname] = null; | |||
|
199 | } | |||
|
200 | }; | |||
|
201 | ||||
|
202 | Calendar.createElement = function(type, parent) { | |||
|
203 | var el = null; | |||
|
204 | if (document.createElementNS) { | |||
|
205 | // use the XHTML namespace; IE won't normally get here unless | |||
|
206 | // _they_ "fix" the DOM2 implementation. | |||
|
207 | el = document.createElementNS("http://www.w3.org/1999/xhtml", type); | |||
|
208 | } else { | |||
|
209 | el = document.createElement(type); | |||
|
210 | } | |||
|
211 | if (typeof parent != "undefined") { | |||
|
212 | parent.appendChild(el); | |||
|
213 | } | |||
|
214 | return el; | |||
|
215 | }; | |||
|
216 | ||||
|
217 | // END: UTILITY FUNCTIONS | |||
|
218 | ||||
|
219 | // BEGIN: CALENDAR STATIC FUNCTIONS | |||
|
220 | ||||
|
221 | /** Internal -- adds a set of events to make some element behave like a button. */ | |||
|
222 | Calendar._add_evs = function(el) { | |||
|
223 | with (Calendar) { | |||
|
224 | addEvent(el, "mouseover", dayMouseOver); | |||
|
225 | addEvent(el, "mousedown", dayMouseDown); | |||
|
226 | addEvent(el, "mouseout", dayMouseOut); | |||
|
227 | if (is_ie) { | |||
|
228 | addEvent(el, "dblclick", dayMouseDblClick); | |||
|
229 | el.setAttribute("unselectable", true); | |||
|
230 | } | |||
|
231 | } | |||
|
232 | }; | |||
|
233 | ||||
|
234 | Calendar.findMonth = function(el) { | |||
|
235 | if (typeof el.month != "undefined") { | |||
|
236 | return el; | |||
|
237 | } else if (typeof el.parentNode.month != "undefined") { | |||
|
238 | return el.parentNode; | |||
|
239 | } | |||
|
240 | return null; | |||
|
241 | }; | |||
|
242 | ||||
|
243 | Calendar.findYear = function(el) { | |||
|
244 | if (typeof el.year != "undefined") { | |||
|
245 | return el; | |||
|
246 | } else if (typeof el.parentNode.year != "undefined") { | |||
|
247 | return el.parentNode; | |||
|
248 | } | |||
|
249 | return null; | |||
|
250 | }; | |||
|
251 | ||||
|
252 | Calendar.showMonthsCombo = function () { | |||
|
253 | var cal = Calendar._C; | |||
|
254 | if (!cal) { | |||
|
255 | return false; | |||
|
256 | } | |||
|
257 | var cal = cal; | |||
|
258 | var cd = cal.activeDiv; | |||
|
259 | var mc = cal.monthsCombo; | |||
|
260 | if (cal.hilitedMonth) { | |||
|
261 | Calendar.removeClass(cal.hilitedMonth, "hilite"); | |||
|
262 | } | |||
|
263 | if (cal.activeMonth) { | |||
|
264 | Calendar.removeClass(cal.activeMonth, "active"); | |||
|
265 | } | |||
|
266 | var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; | |||
|
267 | Calendar.addClass(mon, "active"); | |||
|
268 | cal.activeMonth = mon; | |||
|
269 | var s = mc.style; | |||
|
270 | s.display = "block"; | |||
|
271 | if (cd.navtype < 0) | |||
|
272 | s.left = cd.offsetLeft + "px"; | |||
|
273 | else { | |||
|
274 | var mcw = mc.offsetWidth; | |||
|
275 | if (typeof mcw == "undefined") | |||
|
276 | // Konqueror brain-dead techniques | |||
|
277 | mcw = 50; | |||
|
278 | s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; | |||
|
279 | } | |||
|
280 | s.top = (cd.offsetTop + cd.offsetHeight) + "px"; | |||
|
281 | }; | |||
|
282 | ||||
|
283 | Calendar.showYearsCombo = function (fwd) { | |||
|
284 | var cal = Calendar._C; | |||
|
285 | if (!cal) { | |||
|
286 | return false; | |||
|
287 | } | |||
|
288 | var cal = cal; | |||
|
289 | var cd = cal.activeDiv; | |||
|
290 | var yc = cal.yearsCombo; | |||
|
291 | if (cal.hilitedYear) { | |||
|
292 | Calendar.removeClass(cal.hilitedYear, "hilite"); | |||
|
293 | } | |||
|
294 | if (cal.activeYear) { | |||
|
295 | Calendar.removeClass(cal.activeYear, "active"); | |||
|
296 | } | |||
|
297 | cal.activeYear = null; | |||
|
298 | var Y = cal.date.getFullYear() + (fwd ? 1 : -1); | |||
|
299 | var yr = yc.firstChild; | |||
|
300 | var show = false; | |||
|
301 | for (var i = 12; i > 0; --i) { | |||
|
302 | if (Y >= cal.minYear && Y <= cal.maxYear) { | |||
|
303 | yr.innerHTML = Y; | |||
|
304 | yr.year = Y; | |||
|
305 | yr.style.display = "block"; | |||
|
306 | show = true; | |||
|
307 | } else { | |||
|
308 | yr.style.display = "none"; | |||
|
309 | } | |||
|
310 | yr = yr.nextSibling; | |||
|
311 | Y += fwd ? cal.yearStep : -cal.yearStep; | |||
|
312 | } | |||
|
313 | if (show) { | |||
|
314 | var s = yc.style; | |||
|
315 | s.display = "block"; | |||
|
316 | if (cd.navtype < 0) | |||
|
317 | s.left = cd.offsetLeft + "px"; | |||
|
318 | else { | |||
|
319 | var ycw = yc.offsetWidth; | |||
|
320 | if (typeof ycw == "undefined") | |||
|
321 | // Konqueror brain-dead techniques | |||
|
322 | ycw = 50; | |||
|
323 | s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; | |||
|
324 | } | |||
|
325 | s.top = (cd.offsetTop + cd.offsetHeight) + "px"; | |||
|
326 | } | |||
|
327 | }; | |||
|
328 | ||||
|
329 | // event handlers | |||
|
330 | ||||
|
331 | Calendar.tableMouseUp = function(ev) { | |||
|
332 | var cal = Calendar._C; | |||
|
333 | if (!cal) { | |||
|
334 | return false; | |||
|
335 | } | |||
|
336 | if (cal.timeout) { | |||
|
337 | clearTimeout(cal.timeout); | |||
|
338 | } | |||
|
339 | var el = cal.activeDiv; | |||
|
340 | if (!el) { | |||
|
341 | return false; | |||
|
342 | } | |||
|
343 | var target = Calendar.getTargetElement(ev); | |||
|
344 | ev || (ev = window.event); | |||
|
345 | Calendar.removeClass(el, "active"); | |||
|
346 | if (target == el || target.parentNode == el) { | |||
|
347 | Calendar.cellClick(el, ev); | |||
|
348 | } | |||
|
349 | var mon = Calendar.findMonth(target); | |||
|
350 | var date = null; | |||
|
351 | if (mon) { | |||
|
352 | date = new Date(cal.date); | |||
|
353 | if (mon.month != date.getMonth()) { | |||
|
354 | date.setMonth(mon.month); | |||
|
355 | cal.setDate(date); | |||
|
356 | cal.dateClicked = false; | |||
|
357 | cal.callHandler(); | |||
|
358 | } | |||
|
359 | } else { | |||
|
360 | var year = Calendar.findYear(target); | |||
|
361 | if (year) { | |||
|
362 | date = new Date(cal.date); | |||
|
363 | if (year.year != date.getFullYear()) { | |||
|
364 | date.setFullYear(year.year); | |||
|
365 | cal.setDate(date); | |||
|
366 | cal.dateClicked = false; | |||
|
367 | cal.callHandler(); | |||
|
368 | } | |||
|
369 | } | |||
|
370 | } | |||
|
371 | with (Calendar) { | |||
|
372 | removeEvent(document, "mouseup", tableMouseUp); | |||
|
373 | removeEvent(document, "mouseover", tableMouseOver); | |||
|
374 | removeEvent(document, "mousemove", tableMouseOver); | |||
|
375 | cal._hideCombos(); | |||
|
376 | _C = null; | |||
|
377 | return stopEvent(ev); | |||
|
378 | } | |||
|
379 | }; | |||
|
380 | ||||
|
381 | Calendar.tableMouseOver = function (ev) { | |||
|
382 | var cal = Calendar._C; | |||
|
383 | if (!cal) { | |||
|
384 | return; | |||
|
385 | } | |||
|
386 | var el = cal.activeDiv; | |||
|
387 | var target = Calendar.getTargetElement(ev); | |||
|
388 | if (target == el || target.parentNode == el) { | |||
|
389 | Calendar.addClass(el, "hilite active"); | |||
|
390 | Calendar.addClass(el.parentNode, "rowhilite"); | |||
|
391 | } else { | |||
|
392 | if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) | |||
|
393 | Calendar.removeClass(el, "active"); | |||
|
394 | Calendar.removeClass(el, "hilite"); | |||
|
395 | Calendar.removeClass(el.parentNode, "rowhilite"); | |||
|
396 | } | |||
|
397 | ev || (ev = window.event); | |||
|
398 | if (el.navtype == 50 && target != el) { | |||
|
399 | var pos = Calendar.getAbsolutePos(el); | |||
|
400 | var w = el.offsetWidth; | |||
|
401 | var x = ev.clientX; | |||
|
402 | var dx; | |||
|
403 | var decrease = true; | |||
|
404 | if (x > pos.x + w) { | |||
|
405 | dx = x - pos.x - w; | |||
|
406 | decrease = false; | |||
|
407 | } else | |||
|
408 | dx = pos.x - x; | |||
|
409 | ||||
|
410 | if (dx < 0) dx = 0; | |||
|
411 | var range = el._range; | |||
|
412 | var current = el._current; | |||
|
413 | var count = Math.floor(dx / 10) % range.length; | |||
|
414 | for (var i = range.length; --i >= 0;) | |||
|
415 | if (range[i] == current) | |||
|
416 | break; | |||
|
417 | while (count-- > 0) | |||
|
418 | if (decrease) { | |||
|
419 | if (--i < 0) | |||
|
420 | i = range.length - 1; | |||
|
421 | } else if ( ++i >= range.length ) | |||
|
422 | i = 0; | |||
|
423 | var newval = range[i]; | |||
|
424 | el.innerHTML = newval; | |||
|
425 | ||||
|
426 | cal.onUpdateTime(); | |||
|
427 | } | |||
|
428 | var mon = Calendar.findMonth(target); | |||
|
429 | if (mon) { | |||
|
430 | if (mon.month != cal.date.getMonth()) { | |||
|
431 | if (cal.hilitedMonth) { | |||
|
432 | Calendar.removeClass(cal.hilitedMonth, "hilite"); | |||
|
433 | } | |||
|
434 | Calendar.addClass(mon, "hilite"); | |||
|
435 | cal.hilitedMonth = mon; | |||
|
436 | } else if (cal.hilitedMonth) { | |||
|
437 | Calendar.removeClass(cal.hilitedMonth, "hilite"); | |||
|
438 | } | |||
|
439 | } else { | |||
|
440 | if (cal.hilitedMonth) { | |||
|
441 | Calendar.removeClass(cal.hilitedMonth, "hilite"); | |||
|
442 | } | |||
|
443 | var year = Calendar.findYear(target); | |||
|
444 | if (year) { | |||
|
445 | if (year.year != cal.date.getFullYear()) { | |||
|
446 | if (cal.hilitedYear) { | |||
|
447 | Calendar.removeClass(cal.hilitedYear, "hilite"); | |||
|
448 | } | |||
|
449 | Calendar.addClass(year, "hilite"); | |||
|
450 | cal.hilitedYear = year; | |||
|
451 | } else if (cal.hilitedYear) { | |||
|
452 | Calendar.removeClass(cal.hilitedYear, "hilite"); | |||
|
453 | } | |||
|
454 | } else if (cal.hilitedYear) { | |||
|
455 | Calendar.removeClass(cal.hilitedYear, "hilite"); | |||
|
456 | } | |||
|
457 | } | |||
|
458 | return Calendar.stopEvent(ev); | |||
|
459 | }; | |||
|
460 | ||||
|
461 | Calendar.tableMouseDown = function (ev) { | |||
|
462 | if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { | |||
|
463 | return Calendar.stopEvent(ev); | |||
|
464 | } | |||
|
465 | }; | |||
|
466 | ||||
|
467 | Calendar.calDragIt = function (ev) { | |||
|
468 | var cal = Calendar._C; | |||
|
469 | if (!(cal && cal.dragging)) { | |||
|
470 | return false; | |||
|
471 | } | |||
|
472 | var posX; | |||
|
473 | var posY; | |||
|
474 | if (Calendar.is_ie) { | |||
|
475 | posY = window.event.clientY + document.body.scrollTop; | |||
|
476 | posX = window.event.clientX + document.body.scrollLeft; | |||
|
477 | } else { | |||
|
478 | posX = ev.pageX; | |||
|
479 | posY = ev.pageY; | |||
|
480 | } | |||
|
481 | cal.hideShowCovered(); | |||
|
482 | var st = cal.element.style; | |||
|
483 | st.left = (posX - cal.xOffs) + "px"; | |||
|
484 | st.top = (posY - cal.yOffs) + "px"; | |||
|
485 | return Calendar.stopEvent(ev); | |||
|
486 | }; | |||
|
487 | ||||
|
488 | Calendar.calDragEnd = function (ev) { | |||
|
489 | var cal = Calendar._C; | |||
|
490 | if (!cal) { | |||
|
491 | return false; | |||
|
492 | } | |||
|
493 | cal.dragging = false; | |||
|
494 | with (Calendar) { | |||
|
495 | removeEvent(document, "mousemove", calDragIt); | |||
|
496 | removeEvent(document, "mouseup", calDragEnd); | |||
|
497 | tableMouseUp(ev); | |||
|
498 | } | |||
|
499 | cal.hideShowCovered(); | |||
|
500 | }; | |||
|
501 | ||||
|
502 | Calendar.dayMouseDown = function(ev) { | |||
|
503 | var el = Calendar.getElement(ev); | |||
|
504 | if (el.disabled) { | |||
|
505 | return false; | |||
|
506 | } | |||
|
507 | var cal = el.calendar; | |||
|
508 | cal.activeDiv = el; | |||
|
509 | Calendar._C = cal; | |||
|
510 | if (el.navtype != 300) with (Calendar) { | |||
|
511 | if (el.navtype == 50) { | |||
|
512 | el._current = el.innerHTML; | |||
|
513 | addEvent(document, "mousemove", tableMouseOver); | |||
|
514 | } else | |||
|
515 | addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); | |||
|
516 | addClass(el, "hilite active"); | |||
|
517 | addEvent(document, "mouseup", tableMouseUp); | |||
|
518 | } else if (cal.isPopup) { | |||
|
519 | cal._dragStart(ev); | |||
|
520 | } | |||
|
521 | if (el.navtype == -1 || el.navtype == 1) { | |||
|
522 | if (cal.timeout) clearTimeout(cal.timeout); | |||
|
523 | cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); | |||
|
524 | } else if (el.navtype == -2 || el.navtype == 2) { | |||
|
525 | if (cal.timeout) clearTimeout(cal.timeout); | |||
|
526 | cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); | |||
|
527 | } else { | |||
|
528 | cal.timeout = null; | |||
|
529 | } | |||
|
530 | return Calendar.stopEvent(ev); | |||
|
531 | }; | |||
|
532 | ||||
|
533 | Calendar.dayMouseDblClick = function(ev) { | |||
|
534 | Calendar.cellClick(Calendar.getElement(ev), ev || window.event); | |||
|
535 | if (Calendar.is_ie) { | |||
|
536 | document.selection.empty(); | |||
|
537 | } | |||
|
538 | }; | |||
|
539 | ||||
|
540 | Calendar.dayMouseOver = function(ev) { | |||
|
541 | var el = Calendar.getElement(ev); | |||
|
542 | if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { | |||
|
543 | return false; | |||
|
544 | } | |||
|
545 | if (el.ttip) { | |||
|
546 | if (el.ttip.substr(0, 1) == "_") { | |||
|
547 | el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); | |||
|
548 | } | |||
|
549 | el.calendar.tooltips.innerHTML = el.ttip; | |||
|
550 | } | |||
|
551 | if (el.navtype != 300) { | |||
|
552 | Calendar.addClass(el, "hilite"); | |||
|
553 | if (el.caldate) { | |||
|
554 | Calendar.addClass(el.parentNode, "rowhilite"); | |||
|
555 | } | |||
|
556 | } | |||
|
557 | return Calendar.stopEvent(ev); | |||
|
558 | }; | |||
|
559 | ||||
|
560 | Calendar.dayMouseOut = function(ev) { | |||
|
561 | with (Calendar) { | |||
|
562 | var el = getElement(ev); | |||
|
563 | if (isRelated(el, ev) || _C || el.disabled) | |||
|
564 | return false; | |||
|
565 | removeClass(el, "hilite"); | |||
|
566 | if (el.caldate) | |||
|
567 | removeClass(el.parentNode, "rowhilite"); | |||
|
568 | if (el.calendar) | |||
|
569 | el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; | |||
|
570 | return stopEvent(ev); | |||
|
571 | } | |||
|
572 | }; | |||
|
573 | ||||
|
574 | /** | |||
|
575 | * A generic "click" handler :) handles all types of buttons defined in this | |||
|
576 | * calendar. | |||
|
577 | */ | |||
|
578 | Calendar.cellClick = function(el, ev) { | |||
|
579 | var cal = el.calendar; | |||
|
580 | var closing = false; | |||
|
581 | var newdate = false; | |||
|
582 | var date = null; | |||
|
583 | if (typeof el.navtype == "undefined") { | |||
|
584 | if (cal.currentDateEl) { | |||
|
585 | Calendar.removeClass(cal.currentDateEl, "selected"); | |||
|
586 | Calendar.addClass(el, "selected"); | |||
|
587 | closing = (cal.currentDateEl == el); | |||
|
588 | if (!closing) { | |||
|
589 | cal.currentDateEl = el; | |||
|
590 | } | |||
|
591 | } | |||
|
592 | cal.date.setDateOnly(el.caldate); | |||
|
593 | date = cal.date; | |||
|
594 | var other_month = !(cal.dateClicked = !el.otherMonth); | |||
|
595 | if (!other_month && !cal.currentDateEl) | |||
|
596 | cal._toggleMultipleDate(new Date(date)); | |||
|
597 | else | |||
|
598 | newdate = !el.disabled; | |||
|
599 | // a date was clicked | |||
|
600 | if (other_month) | |||
|
601 | cal._init(cal.firstDayOfWeek, date); | |||
|
602 | } else { | |||
|
603 | if (el.navtype == 200) { | |||
|
604 | Calendar.removeClass(el, "hilite"); | |||
|
605 | cal.callCloseHandler(); | |||
|
606 | return; | |||
|
607 | } | |||
|
608 | date = new Date(cal.date); | |||
|
609 | if (el.navtype == 0) | |||
|
610 | date.setDateOnly(new Date()); // TODAY | |||
|
611 | // unless "today" was clicked, we assume no date was clicked so | |||
|
612 | // the selected handler will know not to close the calenar when | |||
|
613 | // in single-click mode. | |||
|
614 | // cal.dateClicked = (el.navtype == 0); | |||
|
615 | cal.dateClicked = false; | |||
|
616 | var year = date.getFullYear(); | |||
|
617 | var mon = date.getMonth(); | |||
|
618 | function setMonth(m) { | |||
|
619 | var day = date.getDate(); | |||
|
620 | var max = date.getMonthDays(m); | |||
|
621 | if (day > max) { | |||
|
622 | date.setDate(max); | |||
|
623 | } | |||
|
624 | date.setMonth(m); | |||
|
625 | }; | |||
|
626 | switch (el.navtype) { | |||
|
627 | case 400: | |||
|
628 | Calendar.removeClass(el, "hilite"); | |||
|
629 | var text = Calendar._TT["ABOUT"]; | |||
|
630 | if (typeof text != "undefined") { | |||
|
631 | text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; | |||
|
632 | } else { | |||
|
633 | // FIXME: this should be removed as soon as lang files get updated! | |||
|
634 | text = "Help and about box text is not translated into this language.\n" + | |||
|
635 | "If you know this language and you feel generous please update\n" + | |||
|
636 | "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + | |||
|
637 | "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n" + | |||
|
638 | "Thank you!\n" + | |||
|
639 | "http://dynarch.com/mishoo/calendar.epl\n"; | |||
|
640 | } | |||
|
641 | alert(text); | |||
|
642 | return; | |||
|
643 | case -2: | |||
|
644 | if (year > cal.minYear) { | |||
|
645 | date.setFullYear(year - 1); | |||
|
646 | } | |||
|
647 | break; | |||
|
648 | case -1: | |||
|
649 | if (mon > 0) { | |||
|
650 | setMonth(mon - 1); | |||
|
651 | } else if (year-- > cal.minYear) { | |||
|
652 | date.setFullYear(year); | |||
|
653 | setMonth(11); | |||
|
654 | } | |||
|
655 | break; | |||
|
656 | case 1: | |||
|
657 | if (mon < 11) { | |||
|
658 | setMonth(mon + 1); | |||
|
659 | } else if (year < cal.maxYear) { | |||
|
660 | date.setFullYear(year + 1); | |||
|
661 | setMonth(0); | |||
|
662 | } | |||
|
663 | break; | |||
|
664 | case 2: | |||
|
665 | if (year < cal.maxYear) { | |||
|
666 | date.setFullYear(year + 1); | |||
|
667 | } | |||
|
668 | break; | |||
|
669 | case 100: | |||
|
670 | cal.setFirstDayOfWeek(el.fdow); | |||
|
671 | return; | |||
|
672 | case 50: | |||
|
673 | var range = el._range; | |||
|
674 | var current = el.innerHTML; | |||
|
675 | for (var i = range.length; --i >= 0;) | |||
|
676 | if (range[i] == current) | |||
|
677 | break; | |||
|
678 | if (ev && ev.shiftKey) { | |||
|
679 | if (--i < 0) | |||
|
680 | i = range.length - 1; | |||
|
681 | } else if ( ++i >= range.length ) | |||
|
682 | i = 0; | |||
|
683 | var newval = range[i]; | |||
|
684 | el.innerHTML = newval; | |||
|
685 | cal.onUpdateTime(); | |||
|
686 | return; | |||
|
687 | case 0: | |||
|
688 | // TODAY will bring us here | |||
|
689 | if ((typeof cal.getDateStatus == "function") && | |||
|
690 | cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { | |||
|
691 | return false; | |||
|
692 | } | |||
|
693 | break; | |||
|
694 | } | |||
|
695 | if (!date.equalsTo(cal.date)) { | |||
|
696 | cal.setDate(date); | |||
|
697 | newdate = true; | |||
|
698 | } else if (el.navtype == 0) | |||
|
699 | newdate = closing = true; | |||
|
700 | } | |||
|
701 | if (newdate) { | |||
|
702 | ev && cal.callHandler(); | |||
|
703 | } | |||
|
704 | if (closing) { | |||
|
705 | Calendar.removeClass(el, "hilite"); | |||
|
706 | ev && cal.callCloseHandler(); | |||
|
707 | } | |||
|
708 | }; | |||
|
709 | ||||
|
710 | // END: CALENDAR STATIC FUNCTIONS | |||
|
711 | ||||
|
712 | // BEGIN: CALENDAR OBJECT FUNCTIONS | |||
|
713 | ||||
|
714 | /** | |||
|
715 | * This function creates the calendar inside the given parent. If _par is | |||
|
716 | * null than it creates a popup calendar inside the BODY element. If _par is | |||
|
717 | * an element, be it BODY, then it creates a non-popup calendar (still | |||
|
718 | * hidden). Some properties need to be set before calling this function. | |||
|
719 | */ | |||
|
720 | Calendar.prototype.create = function (_par) { | |||
|
721 | var parent = null; | |||
|
722 | if (! _par) { | |||
|
723 | // default parent is the document body, in which case we create | |||
|
724 | // a popup calendar. | |||
|
725 | parent = document.getElementsByTagName("body")[0]; | |||
|
726 | this.isPopup = true; | |||
|
727 | } else { | |||
|
728 | parent = _par; | |||
|
729 | this.isPopup = false; | |||
|
730 | } | |||
|
731 | this.date = this.dateStr ? new Date(this.dateStr) : new Date(); | |||
|
732 | ||||
|
733 | var table = Calendar.createElement("table"); | |||
|
734 | this.table = table; | |||
|
735 | table.cellSpacing = 0; | |||
|
736 | table.cellPadding = 0; | |||
|
737 | table.calendar = this; | |||
|
738 | Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); | |||
|
739 | ||||
|
740 | var div = Calendar.createElement("div"); | |||
|
741 | this.element = div; | |||
|
742 | div.className = "calendar"; | |||
|
743 | if (this.isPopup) { | |||
|
744 | div.style.position = "absolute"; | |||
|
745 | div.style.display = "none"; | |||
|
746 | } | |||
|
747 | div.appendChild(table); | |||
|
748 | ||||
|
749 | var thead = Calendar.createElement("thead", table); | |||
|
750 | var cell = null; | |||
|
751 | var row = null; | |||
|
752 | ||||
|
753 | var cal = this; | |||
|
754 | var hh = function (text, cs, navtype) { | |||
|
755 | cell = Calendar.createElement("td", row); | |||
|
756 | cell.colSpan = cs; | |||
|
757 | cell.className = "button"; | |||
|
758 | if (navtype != 0 && Math.abs(navtype) <= 2) | |||
|
759 | cell.className += " nav"; | |||
|
760 | Calendar._add_evs(cell); | |||
|
761 | cell.calendar = cal; | |||
|
762 | cell.navtype = navtype; | |||
|
763 | cell.innerHTML = "<div unselectable='on'>" + text + "</div>"; | |||
|
764 | return cell; | |||
|
765 | }; | |||
|
766 | ||||
|
767 | row = Calendar.createElement("tr", thead); | |||
|
768 | var title_length = 6; | |||
|
769 | (this.isPopup) && --title_length; | |||
|
770 | (this.weekNumbers) && ++title_length; | |||
|
771 | ||||
|
772 | hh("?", 1, 400).ttip = Calendar._TT["INFO"]; | |||
|
773 | this.title = hh("", title_length, 300); | |||
|
774 | this.title.className = "title"; | |||
|
775 | if (this.isPopup) { | |||
|
776 | this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; | |||
|
777 | this.title.style.cursor = "move"; | |||
|
778 | hh("×", 1, 200).ttip = Calendar._TT["CLOSE"]; | |||
|
779 | } | |||
|
780 | ||||
|
781 | row = Calendar.createElement("tr", thead); | |||
|
782 | row.className = "headrow"; | |||
|
783 | ||||
|
784 | this._nav_py = hh("«", 1, -2); | |||
|
785 | this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; | |||
|
786 | ||||
|
787 | this._nav_pm = hh("‹", 1, -1); | |||
|
788 | this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; | |||
|
789 | ||||
|
790 | this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); | |||
|
791 | this._nav_now.ttip = Calendar._TT["GO_TODAY"]; | |||
|
792 | ||||
|
793 | this._nav_nm = hh("›", 1, 1); | |||
|
794 | this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; | |||
|
795 | ||||
|
796 | this._nav_ny = hh("»", 1, 2); | |||
|
797 | this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; | |||
|
798 | ||||
|
799 | // day names | |||
|
800 | row = Calendar.createElement("tr", thead); | |||
|
801 | row.className = "daynames"; | |||
|
802 | if (this.weekNumbers) { | |||
|
803 | cell = Calendar.createElement("td", row); | |||
|
804 | cell.className = "name wn"; | |||
|
805 | cell.innerHTML = Calendar._TT["WK"]; | |||
|
806 | } | |||
|
807 | for (var i = 7; i > 0; --i) { | |||
|
808 | cell = Calendar.createElement("td", row); | |||
|
809 | if (!i) { | |||
|
810 | cell.navtype = 100; | |||
|
811 | cell.calendar = this; | |||
|
812 | Calendar._add_evs(cell); | |||
|
813 | } | |||
|
814 | } | |||
|
815 | this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; | |||
|
816 | this._displayWeekdays(); | |||
|
817 | ||||
|
818 | var tbody = Calendar.createElement("tbody", table); | |||
|
819 | this.tbody = tbody; | |||
|
820 | ||||
|
821 | for (i = 6; i > 0; --i) { | |||
|
822 | row = Calendar.createElement("tr", tbody); | |||
|
823 | if (this.weekNumbers) { | |||
|
824 | cell = Calendar.createElement("td", row); | |||
|
825 | } | |||
|
826 | for (var j = 7; j > 0; --j) { | |||
|
827 | cell = Calendar.createElement("td", row); | |||
|
828 | cell.calendar = this; | |||
|
829 | Calendar._add_evs(cell); | |||
|
830 | } | |||
|
831 | } | |||
|
832 | ||||
|
833 | if (this.showsTime) { | |||
|
834 | row = Calendar.createElement("tr", tbody); | |||
|
835 | row.className = "time"; | |||
|
836 | ||||
|
837 | cell = Calendar.createElement("td", row); | |||
|
838 | cell.className = "time"; | |||
|
839 | cell.colSpan = 2; | |||
|
840 | cell.innerHTML = Calendar._TT["TIME"] || " "; | |||
|
841 | ||||
|
842 | cell = Calendar.createElement("td", row); | |||
|
843 | cell.className = "time"; | |||
|
844 | cell.colSpan = this.weekNumbers ? 4 : 3; | |||
|
845 | ||||
|
846 | (function(){ | |||
|
847 | function makeTimePart(className, init, range_start, range_end) { | |||
|
848 | var part = Calendar.createElement("span", cell); | |||
|
849 | part.className = className; | |||
|
850 | part.innerHTML = init; | |||
|
851 | part.calendar = cal; | |||
|
852 | part.ttip = Calendar._TT["TIME_PART"]; | |||
|
853 | part.navtype = 50; | |||
|
854 | part._range = []; | |||
|
855 | if (typeof range_start != "number") | |||
|
856 | part._range = range_start; | |||
|
857 | else { | |||
|
858 | for (var i = range_start; i <= range_end; ++i) { | |||
|
859 | var txt; | |||
|
860 | if (i < 10 && range_end >= 10) txt = '0' + i; | |||
|
861 | else txt = '' + i; | |||
|
862 | part._range[part._range.length] = txt; | |||
|
863 | } | |||
|
864 | } | |||
|
865 | Calendar._add_evs(part); | |||
|
866 | return part; | |||
|
867 | }; | |||
|
868 | var hrs = cal.date.getHours(); | |||
|
869 | var mins = cal.date.getMinutes(); | |||
|
870 | var t12 = !cal.time24; | |||
|
871 | var pm = (hrs > 12); | |||
|
872 | if (t12 && pm) hrs -= 12; | |||
|
873 | var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23); | |||
|
874 | var span = Calendar.createElement("span", cell); | |||
|
875 | span.innerHTML = ":"; | |||
|
876 | span.className = "colon"; | |||
|
877 | var M = makeTimePart("minute", mins, 0, 59); | |||
|
878 | var AP = null; | |||
|
879 | cell = Calendar.createElement("td", row); | |||
|
880 | cell.className = "time"; | |||
|
881 | cell.colSpan = 2; | |||
|
882 | if (t12) | |||
|
883 | AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); | |||
|
884 | else | |||
|
885 | cell.innerHTML = " "; | |||
|
886 | ||||
|
887 | cal.onSetTime = function() { | |||
|
888 | var pm, hrs = this.date.getHours(), | |||
|
889 | mins = this.date.getMinutes(); | |||
|
890 | if (t12) { | |||
|
891 | pm = (hrs >= 12); | |||
|
892 | if (pm) hrs -= 12; | |||
|
893 | if (hrs == 0) hrs = 12; | |||
|
894 | AP.innerHTML = pm ? "pm" : "am"; | |||
|
895 | } | |||
|
896 | H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; | |||
|
897 | M.innerHTML = (mins < 10) ? ("0" + mins) : mins; | |||
|
898 | }; | |||
|
899 | ||||
|
900 | cal.onUpdateTime = function() { | |||
|
901 | var date = this.date; | |||
|
902 | var h = parseInt(H.innerHTML, 10); | |||
|
903 | if (t12) { | |||
|
904 | if (/pm/i.test(AP.innerHTML) && h < 12) | |||
|
905 | h += 12; | |||
|
906 | else if (/am/i.test(AP.innerHTML) && h == 12) | |||
|
907 | h = 0; | |||
|
908 | } | |||
|
909 | var d = date.getDate(); | |||
|
910 | var m = date.getMonth(); | |||
|
911 | var y = date.getFullYear(); | |||
|
912 | date.setHours(h); | |||
|
913 | date.setMinutes(parseInt(M.innerHTML, 10)); | |||
|
914 | date.setFullYear(y); | |||
|
915 | date.setMonth(m); | |||
|
916 | date.setDate(d); | |||
|
917 | this.dateClicked = false; | |||
|
918 | this.callHandler(); | |||
|
919 | }; | |||
|
920 | })(); | |||
|
921 | } else { | |||
|
922 | this.onSetTime = this.onUpdateTime = function() {}; | |||
|
923 | } | |||
|
924 | ||||
|
925 | var tfoot = Calendar.createElement("tfoot", table); | |||
|
926 | ||||
|
927 | row = Calendar.createElement("tr", tfoot); | |||
|
928 | row.className = "footrow"; | |||
|
929 | ||||
|
930 | cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); | |||
|
931 | cell.className = "ttip"; | |||
|
932 | if (this.isPopup) { | |||
|
933 | cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; | |||
|
934 | cell.style.cursor = "move"; | |||
|
935 | } | |||
|
936 | this.tooltips = cell; | |||
|
937 | ||||
|
938 | div = Calendar.createElement("div", this.element); | |||
|
939 | this.monthsCombo = div; | |||
|
940 | div.className = "combo"; | |||
|
941 | for (i = 0; i < Calendar._MN.length; ++i) { | |||
|
942 | var mn = Calendar.createElement("div"); | |||
|
943 | mn.className = Calendar.is_ie ? "label-IEfix" : "label"; | |||
|
944 | mn.month = i; | |||
|
945 | mn.innerHTML = Calendar._SMN[i]; | |||
|
946 | div.appendChild(mn); | |||
|
947 | } | |||
|
948 | ||||
|
949 | div = Calendar.createElement("div", this.element); | |||
|
950 | this.yearsCombo = div; | |||
|
951 | div.className = "combo"; | |||
|
952 | for (i = 12; i > 0; --i) { | |||
|
953 | var yr = Calendar.createElement("div"); | |||
|
954 | yr.className = Calendar.is_ie ? "label-IEfix" : "label"; | |||
|
955 | div.appendChild(yr); | |||
|
956 | } | |||
|
957 | ||||
|
958 | this._init(this.firstDayOfWeek, this.date); | |||
|
959 | parent.appendChild(this.element); | |||
|
960 | }; | |||
|
961 | ||||
|
962 | /** keyboard navigation, only for popup calendars */ | |||
|
963 | Calendar._keyEvent = function(ev) { | |||
|
964 | var cal = window._dynarch_popupCalendar; | |||
|
965 | if (!cal || cal.multiple) | |||
|
966 | return false; | |||
|
967 | (Calendar.is_ie) && (ev = window.event); | |||
|
968 | var act = (Calendar.is_ie || ev.type == "keypress"), | |||
|
969 | K = ev.keyCode; | |||
|
970 | if (ev.ctrlKey) { | |||
|
971 | switch (K) { | |||
|
972 | case 37: // KEY left | |||
|
973 | act && Calendar.cellClick(cal._nav_pm); | |||
|
974 | break; | |||
|
975 | case 38: // KEY up | |||
|
976 | act && Calendar.cellClick(cal._nav_py); | |||
|
977 | break; | |||
|
978 | case 39: // KEY right | |||
|
979 | act && Calendar.cellClick(cal._nav_nm); | |||
|
980 | break; | |||
|
981 | case 40: // KEY down | |||
|
982 | act && Calendar.cellClick(cal._nav_ny); | |||
|
983 | break; | |||
|
984 | default: | |||
|
985 | return false; | |||
|
986 | } | |||
|
987 | } else switch (K) { | |||
|
988 | case 32: // KEY space (now) | |||
|
989 | Calendar.cellClick(cal._nav_now); | |||
|
990 | break; | |||
|
991 | case 27: // KEY esc | |||
|
992 | act && cal.callCloseHandler(); | |||
|
993 | break; | |||
|
994 | case 37: // KEY left | |||
|
995 | case 38: // KEY up | |||
|
996 | case 39: // KEY right | |||
|
997 | case 40: // KEY down | |||
|
998 | if (act) { | |||
|
999 | var prev, x, y, ne, el, step; | |||
|
1000 | prev = K == 37 || K == 38; | |||
|
1001 | step = (K == 37 || K == 39) ? 1 : 7; | |||
|
1002 | function setVars() { | |||
|
1003 | el = cal.currentDateEl; | |||
|
1004 | var p = el.pos; | |||
|
1005 | x = p & 15; | |||
|
1006 | y = p >> 4; | |||
|
1007 | ne = cal.ar_days[y][x]; | |||
|
1008 | };setVars(); | |||
|
1009 | function prevMonth() { | |||
|
1010 | var date = new Date(cal.date); | |||
|
1011 | date.setDate(date.getDate() - step); | |||
|
1012 | cal.setDate(date); | |||
|
1013 | }; | |||
|
1014 | function nextMonth() { | |||
|
1015 | var date = new Date(cal.date); | |||
|
1016 | date.setDate(date.getDate() + step); | |||
|
1017 | cal.setDate(date); | |||
|
1018 | }; | |||
|
1019 | while (1) { | |||
|
1020 | switch (K) { | |||
|
1021 | case 37: // KEY left | |||
|
1022 | if (--x >= 0) | |||
|
1023 | ne = cal.ar_days[y][x]; | |||
|
1024 | else { | |||
|
1025 | x = 6; | |||
|
1026 | K = 38; | |||
|
1027 | continue; | |||
|
1028 | } | |||
|
1029 | break; | |||
|
1030 | case 38: // KEY up | |||
|
1031 | if (--y >= 0) | |||
|
1032 | ne = cal.ar_days[y][x]; | |||
|
1033 | else { | |||
|
1034 | prevMonth(); | |||
|
1035 | setVars(); | |||
|
1036 | } | |||
|
1037 | break; | |||
|
1038 | case 39: // KEY right | |||
|
1039 | if (++x < 7) | |||
|
1040 | ne = cal.ar_days[y][x]; | |||
|
1041 | else { | |||
|
1042 | x = 0; | |||
|
1043 | K = 40; | |||
|
1044 | continue; | |||
|
1045 | } | |||
|
1046 | break; | |||
|
1047 | case 40: // KEY down | |||
|
1048 | if (++y < cal.ar_days.length) | |||
|
1049 | ne = cal.ar_days[y][x]; | |||
|
1050 | else { | |||
|
1051 | nextMonth(); | |||
|
1052 | setVars(); | |||
|
1053 | } | |||
|
1054 | break; | |||
|
1055 | } | |||
|
1056 | break; | |||
|
1057 | } | |||
|
1058 | if (ne) { | |||
|
1059 | if (!ne.disabled) | |||
|
1060 | Calendar.cellClick(ne); | |||
|
1061 | else if (prev) | |||
|
1062 | prevMonth(); | |||
|
1063 | else | |||
|
1064 | nextMonth(); | |||
|
1065 | } | |||
|
1066 | } | |||
|
1067 | break; | |||
|
1068 | case 13: // KEY enter | |||
|
1069 | if (act) | |||
|
1070 | Calendar.cellClick(cal.currentDateEl, ev); | |||
|
1071 | break; | |||
|
1072 | default: | |||
|
1073 | return false; | |||
|
1074 | } | |||
|
1075 | return Calendar.stopEvent(ev); | |||
|
1076 | }; | |||
|
1077 | ||||
|
1078 | /** | |||
|
1079 | * (RE)Initializes the calendar to the given date and firstDayOfWeek | |||
|
1080 | */ | |||
|
1081 | Calendar.prototype._init = function (firstDayOfWeek, date) { | |||
|
1082 | var today = new Date(), | |||
|
1083 | TY = today.getFullYear(), | |||
|
1084 | TM = today.getMonth(), | |||
|
1085 | TD = today.getDate(); | |||
|
1086 | this.table.style.visibility = "hidden"; | |||
|
1087 | var year = date.getFullYear(); | |||
|
1088 | if (year < this.minYear) { | |||
|
1089 | year = this.minYear; | |||
|
1090 | date.setFullYear(year); | |||
|
1091 | } else if (year > this.maxYear) { | |||
|
1092 | year = this.maxYear; | |||
|
1093 | date.setFullYear(year); | |||
|
1094 | } | |||
|
1095 | this.firstDayOfWeek = firstDayOfWeek; | |||
|
1096 | this.date = new Date(date); | |||
|
1097 | var month = date.getMonth(); | |||
|
1098 | var mday = date.getDate(); | |||
|
1099 | var no_days = date.getMonthDays(); | |||
|
1100 | ||||
|
1101 | // calendar voodoo for computing the first day that would actually be | |||
|
1102 | // displayed in the calendar, even if it's from the previous month. | |||
|
1103 | // WARNING: this is magic. ;-) | |||
|
1104 | date.setDate(1); | |||
|
1105 | var day1 = (date.getDay() - this.firstDayOfWeek) % 7; | |||
|
1106 | if (day1 < 0) | |||
|
1107 | day1 += 7; | |||
|
1108 | date.setDate(-day1); | |||
|
1109 | date.setDate(date.getDate() + 1); | |||
|
1110 | ||||
|
1111 | var row = this.tbody.firstChild; | |||
|
1112 | var MN = Calendar._SMN[month]; | |||
|
1113 | var ar_days = this.ar_days = new Array(); | |||
|
1114 | var weekend = Calendar._TT["WEEKEND"]; | |||
|
1115 | var dates = this.multiple ? (this.datesCells = {}) : null; | |||
|
1116 | for (var i = 0; i < 6; ++i, row = row.nextSibling) { | |||
|
1117 | var cell = row.firstChild; | |||
|
1118 | if (this.weekNumbers) { | |||
|
1119 | cell.className = "day wn"; | |||
|
1120 | cell.innerHTML = date.getWeekNumber(); | |||
|
1121 | cell = cell.nextSibling; | |||
|
1122 | } | |||
|
1123 | row.className = "daysrow"; | |||
|
1124 | var hasdays = false, iday, dpos = ar_days[i] = []; | |||
|
1125 | for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { | |||
|
1126 | iday = date.getDate(); | |||
|
1127 | var wday = date.getDay(); | |||
|
1128 | cell.className = "day"; | |||
|
1129 | cell.pos = i << 4 | j; | |||
|
1130 | dpos[j] = cell; | |||
|
1131 | var current_month = (date.getMonth() == month); | |||
|
1132 | if (!current_month) { | |||
|
1133 | if (this.showsOtherMonths) { | |||
|
1134 | cell.className += " othermonth"; | |||
|
1135 | cell.otherMonth = true; | |||
|
1136 | } else { | |||
|
1137 | cell.className = "emptycell"; | |||
|
1138 | cell.innerHTML = " "; | |||
|
1139 | cell.disabled = true; | |||
|
1140 | continue; | |||
|
1141 | } | |||
|
1142 | } else { | |||
|
1143 | cell.otherMonth = false; | |||
|
1144 | hasdays = true; | |||
|
1145 | } | |||
|
1146 | cell.disabled = false; | |||
|
1147 | cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; | |||
|
1148 | if (dates) | |||
|
1149 | dates[date.print("%Y%m%d")] = cell; | |||
|
1150 | if (this.getDateStatus) { | |||
|
1151 | var status = this.getDateStatus(date, year, month, iday); | |||
|
1152 | if (this.getDateToolTip) { | |||
|
1153 | var toolTip = this.getDateToolTip(date, year, month, iday); | |||
|
1154 | if (toolTip) | |||
|
1155 | cell.title = toolTip; | |||
|
1156 | } | |||
|
1157 | if (status === true) { | |||
|
1158 | cell.className += " disabled"; | |||
|
1159 | cell.disabled = true; | |||
|
1160 | } else { | |||
|
1161 | if (/disabled/i.test(status)) | |||
|
1162 | cell.disabled = true; | |||
|
1163 | cell.className += " " + status; | |||
|
1164 | } | |||
|
1165 | } | |||
|
1166 | if (!cell.disabled) { | |||
|
1167 | cell.caldate = new Date(date); | |||
|
1168 | cell.ttip = "_"; | |||
|
1169 | if (!this.multiple && current_month | |||
|
1170 | && iday == mday && this.hiliteToday) { | |||
|
1171 | cell.className += " selected"; | |||
|
1172 | this.currentDateEl = cell; | |||
|
1173 | } | |||
|
1174 | if (date.getFullYear() == TY && | |||
|
1175 | date.getMonth() == TM && | |||
|
1176 | iday == TD) { | |||
|
1177 | cell.className += " today"; | |||
|
1178 | cell.ttip += Calendar._TT["PART_TODAY"]; | |||
|
1179 | } | |||
|
1180 | if (weekend.indexOf(wday.toString()) != -1) | |||
|
1181 | cell.className += cell.otherMonth ? " oweekend" : " weekend"; | |||
|
1182 | } | |||
|
1183 | } | |||
|
1184 | if (!(hasdays || this.showsOtherMonths)) | |||
|
1185 | row.className = "emptyrow"; | |||
|
1186 | } | |||
|
1187 | this.title.innerHTML = Calendar._MN[month] + ", " + year; | |||
|
1188 | this.onSetTime(); | |||
|
1189 | this.table.style.visibility = "visible"; | |||
|
1190 | this._initMultipleDates(); | |||
|
1191 | // PROFILE | |||
|
1192 | // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; | |||
|
1193 | }; | |||
|
1194 | ||||
|
1195 | Calendar.prototype._initMultipleDates = function() { | |||
|
1196 | if (this.multiple) { | |||
|
1197 | for (var i in this.multiple) { | |||
|
1198 | var cell = this.datesCells[i]; | |||
|
1199 | var d = this.multiple[i]; | |||
|
1200 | if (!d) | |||
|
1201 | continue; | |||
|
1202 | if (cell) | |||
|
1203 | cell.className += " selected"; | |||
|
1204 | } | |||
|
1205 | } | |||
|
1206 | }; | |||
|
1207 | ||||
|
1208 | Calendar.prototype._toggleMultipleDate = function(date) { | |||
|
1209 | if (this.multiple) { | |||
|
1210 | var ds = date.print("%Y%m%d"); | |||
|
1211 | var cell = this.datesCells[ds]; | |||
|
1212 | if (cell) { | |||
|
1213 | var d = this.multiple[ds]; | |||
|
1214 | if (!d) { | |||
|
1215 | Calendar.addClass(cell, "selected"); | |||
|
1216 | this.multiple[ds] = date; | |||
|
1217 | } else { | |||
|
1218 | Calendar.removeClass(cell, "selected"); | |||
|
1219 | delete this.multiple[ds]; | |||
|
1220 | } | |||
|
1221 | } | |||
|
1222 | } | |||
|
1223 | }; | |||
|
1224 | ||||
|
1225 | Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { | |||
|
1226 | this.getDateToolTip = unaryFunction; | |||
|
1227 | }; | |||
|
1228 | ||||
|
1229 | /** | |||
|
1230 | * Calls _init function above for going to a certain date (but only if the | |||
|
1231 | * date is different than the currently selected one). | |||
|
1232 | */ | |||
|
1233 | Calendar.prototype.setDate = function (date) { | |||
|
1234 | if (!date.equalsTo(this.date)) { | |||
|
1235 | this._init(this.firstDayOfWeek, date); | |||
|
1236 | } | |||
|
1237 | }; | |||
|
1238 | ||||
|
1239 | /** | |||
|
1240 | * Refreshes the calendar. Useful if the "disabledHandler" function is | |||
|
1241 | * dynamic, meaning that the list of disabled date can change at runtime. | |||
|
1242 | * Just * call this function if you think that the list of disabled dates | |||
|
1243 | * should * change. | |||
|
1244 | */ | |||
|
1245 | Calendar.prototype.refresh = function () { | |||
|
1246 | this._init(this.firstDayOfWeek, this.date); | |||
|
1247 | }; | |||
|
1248 | ||||
|
1249 | /** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ | |||
|
1250 | Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { | |||
|
1251 | this._init(firstDayOfWeek, this.date); | |||
|
1252 | this._displayWeekdays(); | |||
|
1253 | }; | |||
|
1254 | ||||
|
1255 | /** | |||
|
1256 | * Allows customization of what dates are enabled. The "unaryFunction" | |||
|
1257 | * parameter must be a function object that receives the date (as a JS Date | |||
|
1258 | * object) and returns a boolean value. If the returned value is true then | |||
|
1259 | * the passed date will be marked as disabled. | |||
|
1260 | */ | |||
|
1261 | Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { | |||
|
1262 | this.getDateStatus = unaryFunction; | |||
|
1263 | }; | |||
|
1264 | ||||
|
1265 | /** Customization of allowed year range for the calendar. */ | |||
|
1266 | Calendar.prototype.setRange = function (a, z) { | |||
|
1267 | this.minYear = a; | |||
|
1268 | this.maxYear = z; | |||
|
1269 | }; | |||
|
1270 | ||||
|
1271 | /** Calls the first user handler (selectedHandler). */ | |||
|
1272 | Calendar.prototype.callHandler = function () { | |||
|
1273 | if (this.onSelected) { | |||
|
1274 | this.onSelected(this, this.date.print(this.dateFormat)); | |||
|
1275 | } | |||
|
1276 | }; | |||
|
1277 | ||||
|
1278 | /** Calls the second user handler (closeHandler). */ | |||
|
1279 | Calendar.prototype.callCloseHandler = function () { | |||
|
1280 | if (this.onClose) { | |||
|
1281 | this.onClose(this); | |||
|
1282 | } | |||
|
1283 | this.hideShowCovered(); | |||
|
1284 | }; | |||
|
1285 | ||||
|
1286 | /** Removes the calendar object from the DOM tree and destroys it. */ | |||
|
1287 | Calendar.prototype.destroy = function () { | |||
|
1288 | var el = this.element.parentNode; | |||
|
1289 | el.removeChild(this.element); | |||
|
1290 | Calendar._C = null; | |||
|
1291 | window._dynarch_popupCalendar = null; | |||
|
1292 | }; | |||
|
1293 | ||||
|
1294 | /** | |||
|
1295 | * Moves the calendar element to a different section in the DOM tree (changes | |||
|
1296 | * its parent). | |||
|
1297 | */ | |||
|
1298 | Calendar.prototype.reparent = function (new_parent) { | |||
|
1299 | var el = this.element; | |||
|
1300 | el.parentNode.removeChild(el); | |||
|
1301 | new_parent.appendChild(el); | |||
|
1302 | }; | |||
|
1303 | ||||
|
1304 | // This gets called when the user presses a mouse button anywhere in the | |||
|
1305 | // document, if the calendar is shown. If the click was outside the open | |||
|
1306 | // calendar this function closes it. | |||
|
1307 | Calendar._checkCalendar = function(ev) { | |||
|
1308 | var calendar = window._dynarch_popupCalendar; | |||
|
1309 | if (!calendar) { | |||
|
1310 | return false; | |||
|
1311 | } | |||
|
1312 | var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); | |||
|
1313 | for (; el != null && el != calendar.element; el = el.parentNode); | |||
|
1314 | if (el == null) { | |||
|
1315 | // calls closeHandler which should hide the calendar. | |||
|
1316 | window._dynarch_popupCalendar.callCloseHandler(); | |||
|
1317 | return Calendar.stopEvent(ev); | |||
|
1318 | } | |||
|
1319 | }; | |||
|
1320 | ||||
|
1321 | /** Shows the calendar. */ | |||
|
1322 | Calendar.prototype.show = function () { | |||
|
1323 | var rows = this.table.getElementsByTagName("tr"); | |||
|
1324 | for (var i = rows.length; i > 0;) { | |||
|
1325 | var row = rows[--i]; | |||
|
1326 | Calendar.removeClass(row, "rowhilite"); | |||
|
1327 | var cells = row.getElementsByTagName("td"); | |||
|
1328 | for (var j = cells.length; j > 0;) { | |||
|
1329 | var cell = cells[--j]; | |||
|
1330 | Calendar.removeClass(cell, "hilite"); | |||
|
1331 | Calendar.removeClass(cell, "active"); | |||
|
1332 | } | |||
|
1333 | } | |||
|
1334 | this.element.style.display = "block"; | |||
|
1335 | this.hidden = false; | |||
|
1336 | if (this.isPopup) { | |||
|
1337 | window._dynarch_popupCalendar = this; | |||
|
1338 | Calendar.addEvent(document, "keydown", Calendar._keyEvent); | |||
|
1339 | Calendar.addEvent(document, "keypress", Calendar._keyEvent); | |||
|
1340 | Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); | |||
|
1341 | } | |||
|
1342 | this.hideShowCovered(); | |||
|
1343 | }; | |||
|
1344 | ||||
|
1345 | /** | |||
|
1346 | * Hides the calendar. Also removes any "hilite" from the class of any TD | |||
|
1347 | * element. | |||
|
1348 | */ | |||
|
1349 | Calendar.prototype.hide = function () { | |||
|
1350 | if (this.isPopup) { | |||
|
1351 | Calendar.removeEvent(document, "keydown", Calendar._keyEvent); | |||
|
1352 | Calendar.removeEvent(document, "keypress", Calendar._keyEvent); | |||
|
1353 | Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); | |||
|
1354 | } | |||
|
1355 | this.element.style.display = "none"; | |||
|
1356 | this.hidden = true; | |||
|
1357 | this.hideShowCovered(); | |||
|
1358 | }; | |||
|
1359 | ||||
|
1360 | /** | |||
|
1361 | * Shows the calendar at a given absolute position (beware that, depending on | |||
|
1362 | * the calendar element style -- position property -- this might be relative | |||
|
1363 | * to the parent's containing rectangle). | |||
|
1364 | */ | |||
|
1365 | Calendar.prototype.showAt = function (x, y) { | |||
|
1366 | var s = this.element.style; | |||
|
1367 | s.left = x + "px"; | |||
|
1368 | s.top = y + "px"; | |||
|
1369 | this.show(); | |||
|
1370 | }; | |||
|
1371 | ||||
|
1372 | /** Shows the calendar near a given element. */ | |||
|
1373 | Calendar.prototype.showAtElement = function (el, opts) { | |||
|
1374 | var self = this; | |||
|
1375 | var p = Calendar.getAbsolutePos(el); | |||
|
1376 | if (!opts || typeof opts != "string") { | |||
|
1377 | this.showAt(p.x, p.y + el.offsetHeight); | |||
|
1378 | return true; | |||
|
1379 | } | |||
|
1380 | function fixPosition(box) { | |||
|
1381 | if (box.x < 0) | |||
|
1382 | box.x = 0; | |||
|
1383 | if (box.y < 0) | |||
|
1384 | box.y = 0; | |||
|
1385 | var cp = document.createElement("div"); | |||
|
1386 | var s = cp.style; | |||
|
1387 | s.position = "absolute"; | |||
|
1388 | s.right = s.bottom = s.width = s.height = "0px"; | |||
|
1389 | document.body.appendChild(cp); | |||
|
1390 | var br = Calendar.getAbsolutePos(cp); | |||
|
1391 | document.body.removeChild(cp); | |||
|
1392 | if (Calendar.is_ie) { | |||
|
1393 | br.y += document.body.scrollTop; | |||
|
1394 | br.x += document.body.scrollLeft; | |||
|
1395 | } else { | |||
|
1396 | br.y += window.scrollY; | |||
|
1397 | br.x += window.scrollX; | |||
|
1398 | } | |||
|
1399 | var tmp = box.x + box.width - br.x; | |||
|
1400 | if (tmp > 0) box.x -= tmp; | |||
|
1401 | tmp = box.y + box.height - br.y; | |||
|
1402 | if (tmp > 0) box.y -= tmp; | |||
|
1403 | }; | |||
|
1404 | this.element.style.display = "block"; | |||
|
1405 | Calendar.continuation_for_the_fucking_khtml_browser = function() { | |||
|
1406 | var w = self.element.offsetWidth; | |||
|
1407 | var h = self.element.offsetHeight; | |||
|
1408 | self.element.style.display = "none"; | |||
|
1409 | var valign = opts.substr(0, 1); | |||
|
1410 | var halign = "l"; | |||
|
1411 | if (opts.length > 1) { | |||
|
1412 | halign = opts.substr(1, 1); | |||
|
1413 | } | |||
|
1414 | // vertical alignment | |||
|
1415 | switch (valign) { | |||
|
1416 | case "T": p.y -= h; break; | |||
|
1417 | case "B": p.y += el.offsetHeight; break; | |||
|
1418 | case "C": p.y += (el.offsetHeight - h) / 2; break; | |||
|
1419 | case "t": p.y += el.offsetHeight - h; break; | |||
|
1420 | case "b": break; // already there | |||
|
1421 | } | |||
|
1422 | // horizontal alignment | |||
|
1423 | switch (halign) { | |||
|
1424 | case "L": p.x -= w; break; | |||
|
1425 | case "R": p.x += el.offsetWidth; break; | |||
|
1426 | case "C": p.x += (el.offsetWidth - w) / 2; break; | |||
|
1427 | case "l": p.x += el.offsetWidth - w; break; | |||
|
1428 | case "r": break; // already there | |||
|
1429 | } | |||
|
1430 | p.width = w; | |||
|
1431 | p.height = h + 40; | |||
|
1432 | self.monthsCombo.style.display = "none"; | |||
|
1433 | fixPosition(p); | |||
|
1434 | self.showAt(p.x, p.y); | |||
|
1435 | }; | |||
|
1436 | if (Calendar.is_khtml) | |||
|
1437 | setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); | |||
|
1438 | else | |||
|
1439 | Calendar.continuation_for_the_fucking_khtml_browser(); | |||
|
1440 | }; | |||
|
1441 | ||||
|
1442 | /** Customizes the date format. */ | |||
|
1443 | Calendar.prototype.setDateFormat = function (str) { | |||
|
1444 | this.dateFormat = str; | |||
|
1445 | }; | |||
|
1446 | ||||
|
1447 | /** Customizes the tooltip date format. */ | |||
|
1448 | Calendar.prototype.setTtDateFormat = function (str) { | |||
|
1449 | this.ttDateFormat = str; | |||
|
1450 | }; | |||
|
1451 | ||||
|
1452 | /** | |||
|
1453 | * Tries to identify the date represented in a string. If successful it also | |||
|
1454 | * calls this.setDate which moves the calendar to the given date. | |||
|
1455 | */ | |||
|
1456 | Calendar.prototype.parseDate = function(str, fmt) { | |||
|
1457 | if (!fmt) | |||
|
1458 | fmt = this.dateFormat; | |||
|
1459 | this.setDate(Date.parseDate(str, fmt)); | |||
|
1460 | }; | |||
|
1461 | ||||
|
1462 | Calendar.prototype.hideShowCovered = function () { | |||
|
1463 | if (!Calendar.is_ie && !Calendar.is_opera) | |||
|
1464 | return; | |||
|
1465 | function getVisib(obj){ | |||
|
1466 | var value = obj.style.visibility; | |||
|
1467 | if (!value) { | |||
|
1468 | if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C | |||
|
1469 | if (!Calendar.is_khtml) | |||
|
1470 | value = document.defaultView. | |||
|
1471 | getComputedStyle(obj, "").getPropertyValue("visibility"); | |||
|
1472 | else | |||
|
1473 | value = ''; | |||
|
1474 | } else if (obj.currentStyle) { // IE | |||
|
1475 | value = obj.currentStyle.visibility; | |||
|
1476 | } else | |||
|
1477 | value = ''; | |||
|
1478 | } | |||
|
1479 | return value; | |||
|
1480 | }; | |||
|
1481 | ||||
|
1482 | var tags = new Array("applet", "iframe", "select"); | |||
|
1483 | var el = this.element; | |||
|
1484 | ||||
|
1485 | var p = Calendar.getAbsolutePos(el); | |||
|
1486 | var EX1 = p.x; | |||
|
1487 | var EX2 = el.offsetWidth + EX1; | |||
|
1488 | var EY1 = p.y; | |||
|
1489 | var EY2 = el.offsetHeight + EY1; | |||
|
1490 | ||||
|
1491 | for (var k = tags.length; k > 0; ) { | |||
|
1492 | var ar = document.getElementsByTagName(tags[--k]); | |||
|
1493 | var cc = null; | |||
|
1494 | ||||
|
1495 | for (var i = ar.length; i > 0;) { | |||
|
1496 | cc = ar[--i]; | |||
|
1497 | ||||
|
1498 | p = Calendar.getAbsolutePos(cc); | |||
|
1499 | var CX1 = p.x; | |||
|
1500 | var CX2 = cc.offsetWidth + CX1; | |||
|
1501 | var CY1 = p.y; | |||
|
1502 | var CY2 = cc.offsetHeight + CY1; | |||
|
1503 | ||||
|
1504 | if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { | |||
|
1505 | if (!cc.__msh_save_visibility) { | |||
|
1506 | cc.__msh_save_visibility = getVisib(cc); | |||
|
1507 | } | |||
|
1508 | cc.style.visibility = cc.__msh_save_visibility; | |||
|
1509 | } else { | |||
|
1510 | if (!cc.__msh_save_visibility) { | |||
|
1511 | cc.__msh_save_visibility = getVisib(cc); | |||
|
1512 | } | |||
|
1513 | cc.style.visibility = "hidden"; | |||
|
1514 | } | |||
|
1515 | } | |||
|
1516 | } | |||
|
1517 | }; | |||
|
1518 | ||||
|
1519 | /** Internal function; it displays the bar with the names of the weekday. */ | |||
|
1520 | Calendar.prototype._displayWeekdays = function () { | |||
|
1521 | var fdow = this.firstDayOfWeek; | |||
|
1522 | var cell = this.firstdayname; | |||
|
1523 | var weekend = Calendar._TT["WEEKEND"]; | |||
|
1524 | for (var i = 0; i < 7; ++i) { | |||
|
1525 | cell.className = "day name"; | |||
|
1526 | var realday = (i + fdow) % 7; | |||
|
1527 | if (i) { | |||
|
1528 | cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); | |||
|
1529 | cell.navtype = 100; | |||
|
1530 | cell.calendar = this; | |||
|
1531 | cell.fdow = realday; | |||
|
1532 | Calendar._add_evs(cell); | |||
|
1533 | } | |||
|
1534 | if (weekend.indexOf(realday.toString()) != -1) { | |||
|
1535 | Calendar.addClass(cell, "weekend"); | |||
|
1536 | } | |||
|
1537 | cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; | |||
|
1538 | cell = cell.nextSibling; | |||
|
1539 | } | |||
|
1540 | }; | |||
|
1541 | ||||
|
1542 | /** Internal function. Hides all combo boxes that might be displayed. */ | |||
|
1543 | Calendar.prototype._hideCombos = function () { | |||
|
1544 | this.monthsCombo.style.display = "none"; | |||
|
1545 | this.yearsCombo.style.display = "none"; | |||
|
1546 | }; | |||
|
1547 | ||||
|
1548 | /** Internal function. Starts dragging the element. */ | |||
|
1549 | Calendar.prototype._dragStart = function (ev) { | |||
|
1550 | if (this.dragging) { | |||
|
1551 | return; | |||
|
1552 | } | |||
|
1553 | this.dragging = true; | |||
|
1554 | var posX; | |||
|
1555 | var posY; | |||
|
1556 | if (Calendar.is_ie) { | |||
|
1557 | posY = window.event.clientY + document.body.scrollTop; | |||
|
1558 | posX = window.event.clientX + document.body.scrollLeft; | |||
|
1559 | } else { | |||
|
1560 | posY = ev.clientY + window.scrollY; | |||
|
1561 | posX = ev.clientX + window.scrollX; | |||
|
1562 | } | |||
|
1563 | var st = this.element.style; | |||
|
1564 | this.xOffs = posX - parseInt(st.left); | |||
|
1565 | this.yOffs = posY - parseInt(st.top); | |||
|
1566 | with (Calendar) { | |||
|
1567 | addEvent(document, "mousemove", calDragIt); | |||
|
1568 | addEvent(document, "mouseup", calDragEnd); | |||
|
1569 | } | |||
|
1570 | }; | |||
|
1571 | ||||
|
1572 | // BEGIN: DATE OBJECT PATCHES | |||
|
1573 | ||||
|
1574 | /** Adds the number of days array to the Date object. */ | |||
|
1575 | Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); | |||
|
1576 | ||||
|
1577 | /** Constants used for time computations */ | |||
|
1578 | Date.SECOND = 1000 /* milliseconds */; | |||
|
1579 | Date.MINUTE = 60 * Date.SECOND; | |||
|
1580 | Date.HOUR = 60 * Date.MINUTE; | |||
|
1581 | Date.DAY = 24 * Date.HOUR; | |||
|
1582 | Date.WEEK = 7 * Date.DAY; | |||
|
1583 | ||||
|
1584 | Date.parseDate = function(str, fmt) { | |||
|
1585 | var today = new Date(); | |||
|
1586 | var y = 0; | |||
|
1587 | var m = -1; | |||
|
1588 | var d = 0; | |||
|
1589 | var a = str.split(/\W+/); | |||
|
1590 | var b = fmt.match(/%./g); | |||
|
1591 | var i = 0, j = 0; | |||
|
1592 | var hr = 0; | |||
|
1593 | var min = 0; | |||
|
1594 | for (i = 0; i < a.length; ++i) { | |||
|
1595 | if (!a[i]) | |||
|
1596 | continue; | |||
|
1597 | switch (b[i]) { | |||
|
1598 | case "%d": | |||
|
1599 | case "%e": | |||
|
1600 | d = parseInt(a[i], 10); | |||
|
1601 | break; | |||
|
1602 | ||||
|
1603 | case "%m": | |||
|
1604 | m = parseInt(a[i], 10) - 1; | |||
|
1605 | break; | |||
|
1606 | ||||
|
1607 | case "%Y": | |||
|
1608 | case "%y": | |||
|
1609 | y = parseInt(a[i], 10); | |||
|
1610 | (y < 100) && (y += (y > 29) ? 1900 : 2000); | |||
|
1611 | break; | |||
|
1612 | ||||
|
1613 | case "%b": | |||
|
1614 | case "%B": | |||
|
1615 | for (j = 0; j < 12; ++j) { | |||
|
1616 | if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } | |||
|
1617 | } | |||
|
1618 | break; | |||
|
1619 | ||||
|
1620 | case "%H": | |||
|
1621 | case "%I": | |||
|
1622 | case "%k": | |||
|
1623 | case "%l": | |||
|
1624 | hr = parseInt(a[i], 10); | |||
|
1625 | break; | |||
|
1626 | ||||
|
1627 | case "%P": | |||
|
1628 | case "%p": | |||
|
1629 | if (/pm/i.test(a[i]) && hr < 12) | |||
|
1630 | hr += 12; | |||
|
1631 | else if (/am/i.test(a[i]) && hr >= 12) | |||
|
1632 | hr -= 12; | |||
|
1633 | break; | |||
|
1634 | ||||
|
1635 | case "%M": | |||
|
1636 | min = parseInt(a[i], 10); | |||
|
1637 | break; | |||
|
1638 | } | |||
|
1639 | } | |||
|
1640 | if (isNaN(y)) y = today.getFullYear(); | |||
|
1641 | if (isNaN(m)) m = today.getMonth(); | |||
|
1642 | if (isNaN(d)) d = today.getDate(); | |||
|
1643 | if (isNaN(hr)) hr = today.getHours(); | |||
|
1644 | if (isNaN(min)) min = today.getMinutes(); | |||
|
1645 | if (y != 0 && m != -1 && d != 0) | |||
|
1646 | return new Date(y, m, d, hr, min, 0); | |||
|
1647 | y = 0; m = -1; d = 0; | |||
|
1648 | for (i = 0; i < a.length; ++i) { | |||
|
1649 | if (a[i].search(/[a-zA-Z]+/) != -1) { | |||
|
1650 | var t = -1; | |||
|
1651 | for (j = 0; j < 12; ++j) { | |||
|
1652 | if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } | |||
|
1653 | } | |||
|
1654 | if (t != -1) { | |||
|
1655 | if (m != -1) { | |||
|
1656 | d = m+1; | |||
|
1657 | } | |||
|
1658 | m = t; | |||
|
1659 | } | |||
|
1660 | } else if (parseInt(a[i], 10) <= 12 && m == -1) { | |||
|
1661 | m = a[i]-1; | |||
|
1662 | } else if (parseInt(a[i], 10) > 31 && y == 0) { | |||
|
1663 | y = parseInt(a[i], 10); | |||
|
1664 | (y < 100) && (y += (y > 29) ? 1900 : 2000); | |||
|
1665 | } else if (d == 0) { | |||
|
1666 | d = a[i]; | |||
|
1667 | } | |||
|
1668 | } | |||
|
1669 | if (y == 0) | |||
|
1670 | y = today.getFullYear(); | |||
|
1671 | if (m != -1 && d != 0) | |||
|
1672 | return new Date(y, m, d, hr, min, 0); | |||
|
1673 | return today; | |||
|
1674 | }; | |||
|
1675 | ||||
|
1676 | /** Returns the number of days in the current month */ | |||
|
1677 | Date.prototype.getMonthDays = function(month) { | |||
|
1678 | var year = this.getFullYear(); | |||
|
1679 | if (typeof month == "undefined") { | |||
|
1680 | month = this.getMonth(); | |||
|
1681 | } | |||
|
1682 | if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { | |||
|
1683 | return 29; | |||
|
1684 | } else { | |||
|
1685 | return Date._MD[month]; | |||
|
1686 | } | |||
|
1687 | }; | |||
|
1688 | ||||
|
1689 | /** Returns the number of day in the year. */ | |||
|
1690 | Date.prototype.getDayOfYear = function() { | |||
|
1691 | var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); | |||
|
1692 | var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); | |||
|
1693 | var time = now - then; | |||
|
1694 | return Math.floor(time / Date.DAY); | |||
|
1695 | }; | |||
|
1696 | ||||
|
1697 | /** Returns the number of the week in year, as defined in ISO 8601. */ | |||
|
1698 | Date.prototype.getWeekNumber = function() { | |||
|
1699 | var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); | |||
|
1700 | var DoW = d.getDay(); | |||
|
1701 | d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu | |||
|
1702 | var ms = d.valueOf(); // GMT | |||
|
1703 | d.setMonth(0); | |||
|
1704 | d.setDate(4); // Thu in Week 1 | |||
|
1705 | return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; | |||
|
1706 | }; | |||
|
1707 | ||||
|
1708 | /** Checks date and time equality */ | |||
|
1709 | Date.prototype.equalsTo = function(date) { | |||
|
1710 | return ((this.getFullYear() == date.getFullYear()) && | |||
|
1711 | (this.getMonth() == date.getMonth()) && | |||
|
1712 | (this.getDate() == date.getDate()) && | |||
|
1713 | (this.getHours() == date.getHours()) && | |||
|
1714 | (this.getMinutes() == date.getMinutes())); | |||
|
1715 | }; | |||
|
1716 | ||||
|
1717 | /** Set only the year, month, date parts (keep existing time) */ | |||
|
1718 | Date.prototype.setDateOnly = function(date) { | |||
|
1719 | var tmp = new Date(date); | |||
|
1720 | this.setDate(1); | |||
|
1721 | this.setFullYear(tmp.getFullYear()); | |||
|
1722 | this.setMonth(tmp.getMonth()); | |||
|
1723 | this.setDate(tmp.getDate()); | |||
|
1724 | }; | |||
|
1725 | ||||
|
1726 | /** Prints the date in a string according to the given format. */ | |||
|
1727 | Date.prototype.print = function (str) { | |||
|
1728 | var m = this.getMonth(); | |||
|
1729 | var d = this.getDate(); | |||
|
1730 | var y = this.getFullYear(); | |||
|
1731 | var wn = this.getWeekNumber(); | |||
|
1732 | var w = this.getDay(); | |||
|
1733 | var s = {}; | |||
|
1734 | var hr = this.getHours(); | |||
|
1735 | var pm = (hr >= 12); | |||
|
1736 | var ir = (pm) ? (hr - 12) : hr; | |||
|
1737 | var dy = this.getDayOfYear(); | |||
|
1738 | if (ir == 0) | |||
|
1739 | ir = 12; | |||
|
1740 | var min = this.getMinutes(); | |||
|
1741 | var sec = this.getSeconds(); | |||
|
1742 | s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N] | |||
|
1743 | s["%A"] = Calendar._DN[w]; // full weekday name | |||
|
1744 | s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N] | |||
|
1745 | s["%B"] = Calendar._MN[m]; // full month name | |||
|
1746 | // FIXME: %c : preferred date and time representation for the current locale | |||
|
1747 | s["%C"] = 1 + Math.floor(y / 100); // the century number | |||
|
1748 | s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) | |||
|
1749 | s["%e"] = d; // the day of the month (range 1 to 31) | |||
|
1750 | // FIXME: %D : american date style: %m/%d/%y | |||
|
1751 | // FIXME: %E, %F, %G, %g, %h (man strftime) | |||
|
1752 | s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format) | |||
|
1753 | s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format) | |||
|
1754 | s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) | |||
|
1755 | s["%k"] = hr; // hour, range 0 to 23 (24h format) | |||
|
1756 | s["%l"] = ir; // hour, range 1 to 12 (12h format) | |||
|
1757 | s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 | |||
|
1758 | s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 | |||
|
1759 | s["%n"] = "\n"; // a newline character | |||
|
1760 | s["%p"] = pm ? "PM" : "AM"; | |||
|
1761 | s["%P"] = pm ? "pm" : "am"; | |||
|
1762 | // FIXME: %r : the time in am/pm notation %I:%M:%S %p | |||
|
1763 | // FIXME: %R : the time in 24-hour notation %H:%M | |||
|
1764 | s["%s"] = Math.floor(this.getTime() / 1000); | |||
|
1765 | s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 | |||
|
1766 | s["%t"] = "\t"; // a tab character | |||
|
1767 | // FIXME: %T : the time in 24-hour notation (%H:%M:%S) | |||
|
1768 | s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; | |||
|
1769 | s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON) | |||
|
1770 | s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN) | |||
|
1771 | // FIXME: %x : preferred date representation for the current locale without the time | |||
|
1772 | // FIXME: %X : preferred time representation for the current locale without the date | |||
|
1773 | s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) | |||
|
1774 | s["%Y"] = y; // year with the century | |||
|
1775 | s["%%"] = "%"; // a literal '%' character | |||
|
1776 | ||||
|
1777 | var re = /%./g; | |||
|
1778 | if (!Calendar.is_ie5 && !Calendar.is_khtml) | |||
|
1779 | return str.replace(re, function (par) { return s[par] || par; }); | |||
|
1780 | ||||
|
1781 | var a = str.match(re); | |||
|
1782 | for (var i = 0; i < a.length; i++) { | |||
|
1783 | var tmp = s[a[i]]; | |||
|
1784 | if (tmp) { | |||
|
1785 | re = new RegExp(a[i], 'g'); | |||
|
1786 | str = str.replace(re, tmp); | |||
|
1787 | } | |||
|
1788 | } | |||
|
1789 | ||||
|
1790 | return str; | |||
|
1791 | }; | |||
|
1792 | ||||
|
1793 | Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; | |||
|
1794 | Date.prototype.setFullYear = function(y) { | |||
|
1795 | var d = new Date(this); | |||
|
1796 | d.__msh_oldSetFullYear(y); | |||
|
1797 | if (d.getMonth() != this.getMonth()) | |||
|
1798 | this.setDate(28); | |||
|
1799 | this.__msh_oldSetFullYear(y); | |||
|
1800 | }; | |||
|
1801 | ||||
|
1802 | // END: DATE OBJECT PATCHES | |||
|
1803 | ||||
|
1804 | ||||
|
1805 | // global object that remembers the calendar | |||
|
1806 | window._dynarch_popupCalendar = null; |
@@ -0,0 +1,128 | |||||
|
1 | // ** I18N | |||
|
2 | ||||
|
3 | // Calendar DE language | |||
|
4 | // Author: Jack (tR), <jack@jtr.de> | |||
|
5 | // Encoding: any | |||
|
6 | // Distributed under the same terms as the calendar itself. | |||
|
7 | ||||
|
8 | // For translators: please use UTF-8 if possible. We strongly believe that | |||
|
9 | // Unicode is the answer to a real internationalized world. Also please | |||
|
10 | // include your contact information in the header, as can be seen above. | |||
|
11 | ||||
|
12 | // full day names | |||
|
13 | Calendar._DN = new Array | |||
|
14 | ("Sonntag", | |||
|
15 | "Montag", | |||
|
16 | "Dienstag", | |||
|
17 | "Mittwoch", | |||
|
18 | "Donnerstag", | |||
|
19 | "Freitag", | |||
|
20 | "Samstag", | |||
|
21 | "Sonntag"); | |||
|
22 | ||||
|
23 | // Please note that the following array of short day names (and the same goes | |||
|
24 | // for short month names, _SMN) isn't absolutely necessary. We give it here | |||
|
25 | // for exemplification on how one can customize the short day names, but if | |||
|
26 | // they are simply the first N letters of the full name you can simply say: | |||
|
27 | // | |||
|
28 | // Calendar._SDN_len = N; // short day name length | |||
|
29 | // Calendar._SMN_len = N; // short month name length | |||
|
30 | // | |||
|
31 | // If N = 3 then this is not needed either since we assume a value of 3 if not | |||
|
32 | // present, to be compatible with translation files that were written before | |||
|
33 | // this feature. | |||
|
34 | ||||
|
35 | // First day of the week. "0" means display Sunday first, "1" means display | |||
|
36 | // Monday first, etc. | |||
|
37 | Calendar._FD = 1; | |||
|
38 | ||||
|
39 | // short day names | |||
|
40 | Calendar._SDN = new Array | |||
|
41 | ("So", | |||
|
42 | "Mo", | |||
|
43 | "Di", | |||
|
44 | "Mi", | |||
|
45 | "Do", | |||
|
46 | "Fr", | |||
|
47 | "Sa", | |||
|
48 | "So"); | |||
|
49 | ||||
|
50 | // full month names | |||
|
51 | Calendar._MN = new Array | |||
|
52 | ("Januar", | |||
|
53 | "Februar", | |||
|
54 | "M\u00e4rz", | |||
|
55 | "April", | |||
|
56 | "Mai", | |||
|
57 | "Juni", | |||
|
58 | "Juli", | |||
|
59 | "August", | |||
|
60 | "September", | |||
|
61 | "Oktober", | |||
|
62 | "November", | |||
|
63 | "Dezember"); | |||
|
64 | ||||
|
65 | // short month names | |||
|
66 | Calendar._SMN = new Array | |||
|
67 | ("Jan", | |||
|
68 | "Feb", | |||
|
69 | "M\u00e4r", | |||
|
70 | "Apr", | |||
|
71 | "May", | |||
|
72 | "Jun", | |||
|
73 | "Jul", | |||
|
74 | "Aug", | |||
|
75 | "Sep", | |||
|
76 | "Okt", | |||
|
77 | "Nov", | |||
|
78 | "Dez"); | |||
|
79 | ||||
|
80 | // tooltips | |||
|
81 | Calendar._TT = {}; | |||
|
82 | Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul"; | |||
|
83 | ||||
|
84 | Calendar._TT["ABOUT"] = | |||
|
85 | "DHTML Date/Time Selector\n" + | |||
|
86 | "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this ;-) | |||
|
87 | "For latest version visit: http://www.dynarch.com/projects/calendar/\n" + | |||
|
88 | "Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + | |||
|
89 | "\n\n" + | |||
|
90 | "Datum ausw\u00e4hlen:\n" + | |||
|
91 | "- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" + | |||
|
92 | "- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" + | |||
|
93 | "- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest."; | |||
|
94 | Calendar._TT["ABOUT_TIME"] = "\n\n" + | |||
|
95 | "Zeit ausw\u00e4hlen:\n" + | |||
|
96 | "- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" + | |||
|
97 | "- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" + | |||
|
98 | "- oder klicken und festhalten f\u00fcr Schnellauswahl."; | |||
|
99 | ||||
|
100 | Calendar._TT["TOGGLE"] = "Ersten Tag der Woche w\u00e4hlen"; | |||
|
101 | Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Festhalten f\u00fcr Schnellauswahl)"; | |||
|
102 | Calendar._TT["PREV_MONTH"] = "Voriger Monat (Festhalten f\u00fcr Schnellauswahl)"; | |||
|
103 | Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen"; | |||
|
104 | Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Festhalten f\u00fcr Schnellauswahl)"; | |||
|
105 | Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Festhalten f\u00fcr Schnellauswahl)"; | |||
|
106 | Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen"; | |||
|
107 | Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten"; | |||
|
108 | Calendar._TT["PART_TODAY"] = " (Heute)"; | |||
|
109 | ||||
|
110 | // the following is to inform that "%s" is to be the first day of week | |||
|
111 | // %s will be replaced with the day name. | |||
|
112 | Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s "; | |||
|
113 | ||||
|
114 | // This may be locale-dependent. It specifies the week-end days, as an array | |||
|
115 | // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 | |||
|
116 | // means Monday, etc. | |||
|
117 | Calendar._TT["WEEKEND"] = "0,6"; | |||
|
118 | ||||
|
119 | Calendar._TT["CLOSE"] = "Schlie\u00dfen"; | |||
|
120 | Calendar._TT["TODAY"] = "Heute"; | |||
|
121 | Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern"; | |||
|
122 | ||||
|
123 | // date formats | |||
|
124 | Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y"; | |||
|
125 | Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; | |||
|
126 | ||||
|
127 | Calendar._TT["WK"] = "wk"; | |||
|
128 | Calendar._TT["TIME"] = "Zeit:"; |
@@ -0,0 +1,127 | |||||
|
1 | // ** I18N | |||
|
2 | ||||
|
3 | // Calendar EN language | |||
|
4 | // Author: Mihai Bazon, <mihai_bazon@yahoo.com> | |||
|
5 | // Encoding: any | |||
|
6 | // Distributed under the same terms as the calendar itself. | |||
|
7 | ||||
|
8 | // For translators: please use UTF-8 if possible. We strongly believe that | |||
|
9 | // Unicode is the answer to a real internationalized world. Also please | |||
|
10 | // include your contact information in the header, as can be seen above. | |||
|
11 | ||||
|
12 | // full day names | |||
|
13 | Calendar._DN = new Array | |||
|
14 | ("Sunday", | |||
|
15 | "Monday", | |||
|
16 | "Tuesday", | |||
|
17 | "Wednesday", | |||
|
18 | "Thursday", | |||
|
19 | "Friday", | |||
|
20 | "Saturday", | |||
|
21 | "Sunday"); | |||
|
22 | ||||
|
23 | // Please note that the following array of short day names (and the same goes | |||
|
24 | // for short month names, _SMN) isn't absolutely necessary. We give it here | |||
|
25 | // for exemplification on how one can customize the short day names, but if | |||
|
26 | // they are simply the first N letters of the full name you can simply say: | |||
|
27 | // | |||
|
28 | // Calendar._SDN_len = N; // short day name length | |||
|
29 | // Calendar._SMN_len = N; // short month name length | |||
|
30 | // | |||
|
31 | // If N = 3 then this is not needed either since we assume a value of 3 if not | |||
|
32 | // present, to be compatible with translation files that were written before | |||
|
33 | // this feature. | |||
|
34 | ||||
|
35 | // short day names | |||
|
36 | Calendar._SDN = new Array | |||
|
37 | ("Sun", | |||
|
38 | "Mon", | |||
|
39 | "Tue", | |||
|
40 | "Wed", | |||
|
41 | "Thu", | |||
|
42 | "Fri", | |||
|
43 | "Sat", | |||
|
44 | "Sun"); | |||
|
45 | ||||
|
46 | // First day of the week. "0" means display Sunday first, "1" means display | |||
|
47 | // Monday first, etc. | |||
|
48 | Calendar._FD = 0; | |||
|
49 | ||||
|
50 | // full month names | |||
|
51 | Calendar._MN = new Array | |||
|
52 | ("January", | |||
|
53 | "February", | |||
|
54 | "March", | |||
|
55 | "April", | |||
|
56 | "May", | |||
|
57 | "June", | |||
|
58 | "July", | |||
|
59 | "August", | |||
|
60 | "September", | |||
|
61 | "October", | |||
|
62 | "November", | |||
|
63 | "December"); | |||
|
64 | ||||
|
65 | // short month names | |||
|
66 | Calendar._SMN = new Array | |||
|
67 | ("Jan", | |||
|
68 | "Feb", | |||
|
69 | "Mar", | |||
|
70 | "Apr", | |||
|
71 | "May", | |||
|
72 | "Jun", | |||
|
73 | "Jul", | |||
|
74 | "Aug", | |||
|
75 | "Sep", | |||
|
76 | "Oct", | |||
|
77 | "Nov", | |||
|
78 | "Dec"); | |||
|
79 | ||||
|
80 | // tooltips | |||
|
81 | Calendar._TT = {}; | |||
|
82 | Calendar._TT["INFO"] = "About the calendar"; | |||
|
83 | ||||
|
84 | Calendar._TT["ABOUT"] = | |||
|
85 | "DHTML Date/Time Selector\n" + | |||
|
86 | "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) | |||
|
87 | "For latest version visit: http://www.dynarch.com/projects/calendar/\n" + | |||
|
88 | "Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + | |||
|
89 | "\n\n" + | |||
|
90 | "Date selection:\n" + | |||
|
91 | "- Use the \xab, \xbb buttons to select year\n" + | |||
|
92 | "- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + | |||
|
93 | "- Hold mouse button on any of the above buttons for faster selection."; | |||
|
94 | Calendar._TT["ABOUT_TIME"] = "\n\n" + | |||
|
95 | "Time selection:\n" + | |||
|
96 | "- Click on any of the time parts to increase it\n" + | |||
|
97 | "- or Shift-click to decrease it\n" + | |||
|
98 | "- or click and drag for faster selection."; | |||
|
99 | ||||
|
100 | Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; | |||
|
101 | Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; | |||
|
102 | Calendar._TT["GO_TODAY"] = "Go Today"; | |||
|
103 | Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)"; | |||
|
104 | Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)"; | |||
|
105 | Calendar._TT["SEL_DATE"] = "Select date"; | |||
|
106 | Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; | |||
|
107 | Calendar._TT["PART_TODAY"] = " (today)"; | |||
|
108 | ||||
|
109 | // the following is to inform that "%s" is to be the first day of week | |||
|
110 | // %s will be replaced with the day name. | |||
|
111 | Calendar._TT["DAY_FIRST"] = "Display %s first"; | |||
|
112 | ||||
|
113 | // This may be locale-dependent. It specifies the week-end days, as an array | |||
|
114 | // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 | |||
|
115 | // means Monday, etc. | |||
|
116 | Calendar._TT["WEEKEND"] = "0,6"; | |||
|
117 | ||||
|
118 | Calendar._TT["CLOSE"] = "Close"; | |||
|
119 | Calendar._TT["TODAY"] = "Today"; | |||
|
120 | Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value"; | |||
|
121 | ||||
|
122 | // date formats | |||
|
123 | Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; | |||
|
124 | Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; | |||
|
125 | ||||
|
126 | Calendar._TT["WK"] = "wk"; | |||
|
127 | Calendar._TT["TIME"] = "Time:"; |
@@ -0,0 +1,129 | |||||
|
1 | // ** I18N | |||
|
2 | ||||
|
3 | // Calendar ES (spanish) language | |||
|
4 | // Author: Mihai Bazon, <mihai_bazon@yahoo.com> | |||
|
5 | // Updater: Servilio Afre Puentes <servilios@yahoo.com> | |||
|
6 | // Updated: 2004-06-03 | |||
|
7 | // Encoding: utf-8 | |||
|
8 | // Distributed under the same terms as the calendar itself. | |||
|
9 | ||||
|
10 | // For translators: please use UTF-8 if possible. We strongly believe that | |||
|
11 | // Unicode is the answer to a real internationalized world. Also please | |||
|
12 | // include your contact information in the header, as can be seen above. | |||
|
13 | ||||
|
14 | // full day names | |||
|
15 | Calendar._DN = new Array | |||
|
16 | ("Domingo", | |||
|
17 | "Lunes", | |||
|
18 | "Martes", | |||
|
19 | "Miércoles", | |||
|
20 | "Jueves", | |||
|
21 | "Viernes", | |||
|
22 | "Sábado", | |||
|
23 | "Domingo"); | |||
|
24 | ||||
|
25 | // Please note that the following array of short day names (and the same goes | |||
|
26 | // for short month names, _SMN) isn't absolutely necessary. We give it here | |||
|
27 | // for exemplification on how one can customize the short day names, but if | |||
|
28 | // they are simply the first N letters of the full name you can simply say: | |||
|
29 | // | |||
|
30 | // Calendar._SDN_len = N; // short day name length | |||
|
31 | // Calendar._SMN_len = N; // short month name length | |||
|
32 | // | |||
|
33 | // If N = 3 then this is not needed either since we assume a value of 3 if not | |||
|
34 | // present, to be compatible with translation files that were written before | |||
|
35 | // this feature. | |||
|
36 | ||||
|
37 | // short day names | |||
|
38 | Calendar._SDN = new Array | |||
|
39 | ("Dom", | |||
|
40 | "Lun", | |||
|
41 | "Mar", | |||
|
42 | "Mié", | |||
|
43 | "Jue", | |||
|
44 | "Vie", | |||
|
45 | "Sáb", | |||
|
46 | "Dom"); | |||
|
47 | ||||
|
48 | // First day of the week. "0" means display Sunday first, "1" means display | |||
|
49 | // Monday first, etc. | |||
|
50 | Calendar._FD = 1; | |||
|
51 | ||||
|
52 | // full month names | |||
|
53 | Calendar._MN = new Array | |||
|
54 | ("Enero", | |||
|
55 | "Febrero", | |||
|
56 | "Marzo", | |||
|
57 | "Abril", | |||
|
58 | "Mayo", | |||
|
59 | "Junio", | |||
|
60 | "Julio", | |||
|
61 | "Agosto", | |||
|
62 | "Septiembre", | |||
|
63 | "Octubre", | |||
|
64 | "Noviembre", | |||
|
65 | "Diciembre"); | |||
|
66 | ||||
|
67 | // short month names | |||
|
68 | Calendar._SMN = new Array | |||
|
69 | ("Ene", | |||
|
70 | "Feb", | |||
|
71 | "Mar", | |||
|
72 | "Abr", | |||
|
73 | "May", | |||
|
74 | "Jun", | |||
|
75 | "Jul", | |||
|
76 | "Ago", | |||
|
77 | "Sep", | |||
|
78 | "Oct", | |||
|
79 | "Nov", | |||
|
80 | "Dic"); | |||
|
81 | ||||
|
82 | // tooltips | |||
|
83 | Calendar._TT = {}; | |||
|
84 | Calendar._TT["INFO"] = "Acerca del calendario"; | |||
|
85 | ||||
|
86 | Calendar._TT["ABOUT"] = | |||
|
87 | "Selector DHTML de Fecha/Hora\n" + | |||
|
88 | "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) | |||
|
89 | "Para conseguir la última versión visite: http://www.dynarch.com/projects/calendar/\n" + | |||
|
90 | "Distribuido bajo licencia GNU LGPL. Visite http://gnu.org/licenses/lgpl.html para más detalles." + | |||
|
91 | "\n\n" + | |||
|
92 | "Selección de fecha:\n" + | |||
|
93 | "- Use los botones \xab, \xbb para seleccionar el año\n" + | |||
|
94 | "- Use los botones " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" + | |||
|
95 | "- Mantenga pulsado el ratón en cualquiera de estos botones para una selección rápida."; | |||
|
96 | Calendar._TT["ABOUT_TIME"] = "\n\n" + | |||
|
97 | "Selección de hora:\n" + | |||
|
98 | "- Pulse en cualquiera de las partes de la hora para incrementarla\n" + | |||
|
99 | "- o pulse las mayúsculas mientras hace clic para decrementarla\n" + | |||
|
100 | "- o haga clic y arrastre el ratón para una selección más rápida."; | |||
|
101 | ||||
|
102 | Calendar._TT["PREV_YEAR"] = "Año anterior (mantener para menú)"; | |||
|
103 | Calendar._TT["PREV_MONTH"] = "Mes anterior (mantener para menú)"; | |||
|
104 | Calendar._TT["GO_TODAY"] = "Ir a hoy"; | |||
|
105 | Calendar._TT["NEXT_MONTH"] = "Mes siguiente (mantener para menú)"; | |||
|
106 | Calendar._TT["NEXT_YEAR"] = "Año siguiente (mantener para menú)"; | |||
|
107 | Calendar._TT["SEL_DATE"] = "Seleccionar fecha"; | |||
|
108 | Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar para mover"; | |||
|
109 | Calendar._TT["PART_TODAY"] = " (hoy)"; | |||
|
110 | ||||
|
111 | // the following is to inform that "%s" is to be the first day of week | |||
|
112 | // %s will be replaced with the day name. | |||
|
113 | Calendar._TT["DAY_FIRST"] = "Hacer %s primer día de la semana"; | |||
|
114 | ||||
|
115 | // This may be locale-dependent. It specifies the week-end days, as an array | |||
|
116 | // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 | |||
|
117 | // means Monday, etc. | |||
|
118 | Calendar._TT["WEEKEND"] = "0,6"; | |||
|
119 | ||||
|
120 | Calendar._TT["CLOSE"] = "Cerrar"; | |||
|
121 | Calendar._TT["TODAY"] = "Hoy"; | |||
|
122 | Calendar._TT["TIME_PART"] = "(Mayúscula-)Clic o arrastre para cambiar valor"; | |||
|
123 | ||||
|
124 | // date formats | |||
|
125 | Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; | |||
|
126 | Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y"; | |||
|
127 | ||||
|
128 | Calendar._TT["WK"] = "sem"; | |||
|
129 | Calendar._TT["TIME"] = "Hora:"; |
@@ -0,0 +1,129 | |||||
|
1 | // ** I18N | |||
|
2 | ||||
|
3 | // Calendar EN language | |||
|
4 | // Author: Mihai Bazon, <mihai_bazon@yahoo.com> | |||
|
5 | // Encoding: any | |||
|
6 | // Distributed under the same terms as the calendar itself. | |||
|
7 | ||||
|
8 | // For translators: please use UTF-8 if possible. We strongly believe that | |||
|
9 | // Unicode is the answer to a real internationalized world. Also please | |||
|
10 | // include your contact information in the header, as can be seen above. | |||
|
11 | ||||
|
12 | // Translator: David Duret, <pilgrim@mala-template.net> from previous french version | |||
|
13 | ||||
|
14 | // full day names | |||
|
15 | Calendar._DN = new Array | |||
|
16 | ("Dimanche", | |||
|
17 | "Lundi", | |||
|
18 | "Mardi", | |||
|
19 | "Mercredi", | |||
|
20 | "Jeudi", | |||
|
21 | "Vendredi", | |||
|
22 | "Samedi", | |||
|
23 | "Dimanche"); | |||
|
24 | ||||
|
25 | // Please note that the following array of short day names (and the same goes | |||
|
26 | // for short month names, _SMN) isn't absolutely necessary. We give it here | |||
|
27 | // for exemplification on how one can customize the short day names, but if | |||
|
28 | // they are simply the first N letters of the full name you can simply say: | |||
|
29 | // | |||
|
30 | // Calendar._SDN_len = N; // short day name length | |||
|
31 | // Calendar._SMN_len = N; // short month name length | |||
|
32 | // | |||
|
33 | // If N = 3 then this is not needed either since we assume a value of 3 if not | |||
|
34 | // present, to be compatible with translation files that were written before | |||
|
35 | // this feature. | |||
|
36 | ||||
|
37 | // short day names | |||
|
38 | Calendar._SDN = new Array | |||
|
39 | ("Dim", | |||
|
40 | "Lun", | |||
|
41 | "Mar", | |||
|
42 | "Mar", | |||
|
43 | "Jeu", | |||
|
44 | "Ven", | |||
|
45 | "Sam", | |||
|
46 | "Dim"); | |||
|
47 | ||||
|
48 | // First day of the week. "0" means display Sunday first, "1" means display | |||
|
49 | // Monday first, etc. | |||
|
50 | Calendar._FD = 1; | |||
|
51 | ||||
|
52 | // full month names | |||
|
53 | Calendar._MN = new Array | |||
|
54 | ("Janvier", | |||
|
55 | "Février", | |||
|
56 | "Mars", | |||
|
57 | "Avril", | |||
|
58 | "Mai", | |||
|
59 | "Juin", | |||
|
60 | "Juillet", | |||
|
61 | "Août", | |||
|
62 | "Septembre", | |||
|
63 | "Octobre", | |||
|
64 | "Novembre", | |||
|
65 | "Décembre"); | |||
|
66 | ||||
|
67 | // short month names | |||
|
68 | Calendar._SMN = new Array | |||
|
69 | ("Jan", | |||
|
70 | "Fev", | |||
|
71 | "Mar", | |||
|
72 | "Avr", | |||
|
73 | "Mai", | |||
|
74 | "Juin", | |||
|
75 | "Juil", | |||
|
76 | "Aout", | |||
|
77 | "Sep", | |||
|
78 | "Oct", | |||
|
79 | "Nov", | |||
|
80 | "Dec"); | |||
|
81 | ||||
|
82 | // tooltips | |||
|
83 | Calendar._TT = {}; | |||
|
84 | Calendar._TT["INFO"] = "A propos du calendrier"; | |||
|
85 | ||||
|
86 | Calendar._TT["ABOUT"] = | |||
|
87 | "DHTML Date/Heure Selecteur\n" + | |||
|
88 | "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) | |||
|
89 | "Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" + | |||
|
90 | "Distribué par GNU LGPL. Voir http://gnu.org/licenses/lgpl.html pour les details." + | |||
|
91 | "\n\n" + | |||
|
92 | "Selection de la date :\n" + | |||
|
93 | "- Utiliser les bouttons \xab, \xbb pour selectionner l\'annee\n" + | |||
|
94 | "- Utiliser les bouttons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour selectionner les mois\n" + | |||
|
95 | "- Garder la souris sur n'importe quels boutons pour une selection plus rapide"; | |||
|
96 | Calendar._TT["ABOUT_TIME"] = "\n\n" + | |||
|
97 | "Selection de l\'heure :\n" + | |||
|
98 | "- Cliquer sur heures ou minutes pour incrementer\n" + | |||
|
99 | "- ou Maj-clic pour decrementer\n" + | |||
|
100 | "- ou clic et glisser-deplacer pour une selection plus rapide"; | |||
|
101 | ||||
|
102 | Calendar._TT["PREV_YEAR"] = "Année préc. (maintenir pour menu)"; | |||
|
103 | Calendar._TT["PREV_MONTH"] = "Mois préc. (maintenir pour menu)"; | |||
|
104 | Calendar._TT["GO_TODAY"] = "Atteindre la date du jour"; | |||
|
105 | Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour menu)"; | |||
|
106 | Calendar._TT["NEXT_YEAR"] = "Année suiv. (maintenir pour menu)"; | |||
|
107 | Calendar._TT["SEL_DATE"] = "Sélectionner une date"; | |||
|
108 | Calendar._TT["DRAG_TO_MOVE"] = "Déplacer"; | |||
|
109 | Calendar._TT["PART_TODAY"] = " (Aujourd'hui)"; | |||
|
110 | ||||
|
111 | // the following is to inform that "%s" is to be the first day of week | |||
|
112 | // %s will be replaced with the day name. | |||
|
113 | Calendar._TT["DAY_FIRST"] = "Afficher %s en premier"; | |||
|
114 | ||||
|
115 | // This may be locale-dependent. It specifies the week-end days, as an array | |||
|
116 | // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 | |||
|
117 | // means Monday, etc. | |||
|
118 | Calendar._TT["WEEKEND"] = "0,6"; | |||
|
119 | ||||
|
120 | Calendar._TT["CLOSE"] = "Fermer"; | |||
|
121 | Calendar._TT["TODAY"] = "Aujourd'hui"; | |||
|
122 | Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour modifier la valeur"; | |||
|
123 | ||||
|
124 | // date formats | |||
|
125 | Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; | |||
|
126 | Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; | |||
|
127 | ||||
|
128 | Calendar._TT["WK"] = "Sem."; | |||
|
129 | Calendar._TT["TIME"] = "Heure :"; |
@@ -0,0 +1,232 | |||||
|
1 | /* The main calendar widget. DIV containing a table. */ | |||
|
2 | ||||
|
3 | div.calendar { position: relative; } | |||
|
4 | ||||
|
5 | .calendar, .calendar table { | |||
|
6 | border: 1px solid #556; | |||
|
7 | font-size: 11px; | |||
|
8 | color: #000; | |||
|
9 | cursor: default; | |||
|
10 | background: #eef; | |||
|
11 | font-family: tahoma,verdana,sans-serif; | |||
|
12 | } | |||
|
13 | ||||
|
14 | /* Header part -- contains navigation buttons and day names. */ | |||
|
15 | ||||
|
16 | .calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ | |||
|
17 | text-align: center; /* They are the navigation buttons */ | |||
|
18 | padding: 2px; /* Make the buttons seem like they're pressing */ | |||
|
19 | } | |||
|
20 | ||||
|
21 | .calendar .nav { | |||
|
22 | background: #778 url(menuarrow.gif) no-repeat 100% 100%; | |||
|
23 | } | |||
|
24 | ||||
|
25 | .calendar thead .title { /* This holds the current "month, year" */ | |||
|
26 | font-weight: bold; /* Pressing it will take you to the current date */ | |||
|
27 | text-align: center; | |||
|
28 | background: #fff; | |||
|
29 | color: #000; | |||
|
30 | padding: 2px; | |||
|
31 | } | |||
|
32 | ||||
|
33 | .calendar thead .headrow { /* Row <TR> containing navigation buttons */ | |||
|
34 | background: #778; | |||
|
35 | color: #fff; | |||
|
36 | } | |||
|
37 | ||||
|
38 | .calendar thead .daynames { /* Row <TR> containing the day names */ | |||
|
39 | background: #bdf; | |||
|
40 | } | |||
|
41 | ||||
|
42 | .calendar thead .name { /* Cells <TD> containing the day names */ | |||
|
43 | border-bottom: 1px solid #556; | |||
|
44 | padding: 2px; | |||
|
45 | text-align: center; | |||
|
46 | color: #000; | |||
|
47 | } | |||
|
48 | ||||
|
49 | .calendar thead .weekend { /* How a weekend day name shows in header */ | |||
|
50 | color: #a66; | |||
|
51 | } | |||
|
52 | ||||
|
53 | .calendar thead .hilite { /* How do the buttons in header appear when hover */ | |||
|
54 | background-color: #aaf; | |||
|
55 | color: #000; | |||
|
56 | border: 1px solid #04f; | |||
|
57 | padding: 1px; | |||
|
58 | } | |||
|
59 | ||||
|
60 | .calendar thead .active { /* Active (pressed) buttons in header */ | |||
|
61 | background-color: #77c; | |||
|
62 | padding: 2px 0px 0px 2px; | |||
|
63 | } | |||
|
64 | ||||
|
65 | /* The body part -- contains all the days in month. */ | |||
|
66 | ||||
|
67 | .calendar tbody .day { /* Cells <TD> containing month days dates */ | |||
|
68 | width: 2em; | |||
|
69 | color: #456; | |||
|
70 | text-align: right; | |||
|
71 | padding: 2px 4px 2px 2px; | |||
|
72 | } | |||
|
73 | .calendar tbody .day.othermonth { | |||
|
74 | font-size: 80%; | |||
|
75 | color: #bbb; | |||
|
76 | } | |||
|
77 | .calendar tbody .day.othermonth.oweekend { | |||
|
78 | color: #fbb; | |||
|
79 | } | |||
|
80 | ||||
|
81 | .calendar table .wn { | |||
|
82 | padding: 2px 3px 2px 2px; | |||
|
83 | border-right: 1px solid #000; | |||
|
84 | background: #bdf; | |||
|
85 | } | |||
|
86 | ||||
|
87 | .calendar tbody .rowhilite td { | |||
|
88 | background: #def; | |||
|
89 | } | |||
|
90 | ||||
|
91 | .calendar tbody .rowhilite td.wn { | |||
|
92 | background: #eef; | |||
|
93 | } | |||
|
94 | ||||
|
95 | .calendar tbody td.hilite { /* Hovered cells <TD> */ | |||
|
96 | background: #def; | |||
|
97 | padding: 1px 3px 1px 1px; | |||
|
98 | border: 1px solid #bbb; | |||
|
99 | } | |||
|
100 | ||||
|
101 | .calendar tbody td.active { /* Active (pressed) cells <TD> */ | |||
|
102 | background: #cde; | |||
|
103 | padding: 2px 2px 0px 2px; | |||
|
104 | } | |||
|
105 | ||||
|
106 | .calendar tbody td.selected { /* Cell showing today date */ | |||
|
107 | font-weight: bold; | |||
|
108 | border: 1px solid #000; | |||
|
109 | padding: 1px 3px 1px 1px; | |||
|
110 | background: #fff; | |||
|
111 | color: #000; | |||
|
112 | } | |||
|
113 | ||||
|
114 | .calendar tbody td.weekend { /* Cells showing weekend days */ | |||
|
115 | color: #a66; | |||
|
116 | } | |||
|
117 | ||||
|
118 | .calendar tbody td.today { /* Cell showing selected date */ | |||
|
119 | font-weight: bold; | |||
|
120 | color: #f00; | |||
|
121 | } | |||
|
122 | ||||
|
123 | .calendar tbody .disabled { color: #999; } | |||
|
124 | ||||
|
125 | .calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ | |||
|
126 | visibility: hidden; | |||
|
127 | } | |||
|
128 | ||||
|
129 | .calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ | |||
|
130 | display: none; | |||
|
131 | } | |||
|
132 | ||||
|
133 | /* The footer part -- status bar and "Close" button */ | |||
|
134 | ||||
|
135 | .calendar tfoot .footrow { /* The <TR> in footer (only one right now) */ | |||
|
136 | text-align: center; | |||
|
137 | background: #556; | |||
|
138 | color: #fff; | |||
|
139 | } | |||
|
140 | ||||
|
141 | .calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */ | |||
|
142 | background: #fff; | |||
|
143 | color: #445; | |||
|
144 | border-top: 1px solid #556; | |||
|
145 | padding: 1px; | |||
|
146 | } | |||
|
147 | ||||
|
148 | .calendar tfoot .hilite { /* Hover style for buttons in footer */ | |||
|
149 | background: #aaf; | |||
|
150 | border: 1px solid #04f; | |||
|
151 | color: #000; | |||
|
152 | padding: 1px; | |||
|
153 | } | |||
|
154 | ||||
|
155 | .calendar tfoot .active { /* Active (pressed) style for buttons in footer */ | |||
|
156 | background: #77c; | |||
|
157 | padding: 2px 0px 0px 2px; | |||
|
158 | } | |||
|
159 | ||||
|
160 | /* Combo boxes (menus that display months/years for direct selection) */ | |||
|
161 | ||||
|
162 | .calendar .combo { | |||
|
163 | position: absolute; | |||
|
164 | display: none; | |||
|
165 | top: 0px; | |||
|
166 | left: 0px; | |||
|
167 | width: 4em; | |||
|
168 | cursor: default; | |||
|
169 | border: 1px solid #655; | |||
|
170 | background: #def; | |||
|
171 | color: #000; | |||
|
172 | font-size: 90%; | |||
|
173 | z-index: 100; | |||
|
174 | } | |||
|
175 | ||||
|
176 | .calendar .combo .label, | |||
|
177 | .calendar .combo .label-IEfix { | |||
|
178 | text-align: center; | |||
|
179 | padding: 1px; | |||
|
180 | } | |||
|
181 | ||||
|
182 | .calendar .combo .label-IEfix { | |||
|
183 | width: 4em; | |||
|
184 | } | |||
|
185 | ||||
|
186 | .calendar .combo .hilite { | |||
|
187 | background: #acf; | |||
|
188 | } | |||
|
189 | ||||
|
190 | .calendar .combo .active { | |||
|
191 | border-top: 1px solid #46a; | |||
|
192 | border-bottom: 1px solid #46a; | |||
|
193 | background: #eef; | |||
|
194 | font-weight: bold; | |||
|
195 | } | |||
|
196 | ||||
|
197 | .calendar td.time { | |||
|
198 | border-top: 1px solid #000; | |||
|
199 | padding: 1px 0px; | |||
|
200 | text-align: center; | |||
|
201 | background-color: #f4f0e8; | |||
|
202 | } | |||
|
203 | ||||
|
204 | .calendar td.time .hour, | |||
|
205 | .calendar td.time .minute, | |||
|
206 | .calendar td.time .ampm { | |||
|
207 | padding: 0px 3px 0px 4px; | |||
|
208 | border: 1px solid #889; | |||
|
209 | font-weight: bold; | |||
|
210 | background-color: #fff; | |||
|
211 | } | |||
|
212 | ||||
|
213 | .calendar td.time .ampm { | |||
|
214 | text-align: center; | |||
|
215 | } | |||
|
216 | ||||
|
217 | .calendar td.time .colon { | |||
|
218 | padding: 0px 2px 0px 3px; | |||
|
219 | font-weight: bold; | |||
|
220 | } | |||
|
221 | ||||
|
222 | .calendar td.time span.hilite { | |||
|
223 | border-color: #000; | |||
|
224 | background-color: #667; | |||
|
225 | color: #fff; | |||
|
226 | } | |||
|
227 | ||||
|
228 | .calendar td.time span.active { | |||
|
229 | border-color: #f00; | |||
|
230 | background-color: #000; | |||
|
231 | color: #0f0; | |||
|
232 | } |
@@ -1,156 +1,161 | |||||
1 | # redMine - project management software |
|
1 | # redMine - project management software | |
2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
6 | # as published by the Free Software Foundation; either version 2 |
|
6 | # as published by the Free Software Foundation; either version 2 | |
7 | # of the License, or (at your option) any later version. |
|
7 | # of the License, or (at your option) any later version. | |
8 | # |
|
8 | # | |
9 | # This program is distributed in the hope that it will be useful, |
|
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. |
|
12 | # GNU General Public License for more details. | |
13 | # |
|
13 | # | |
14 | # You should have received a copy of the GNU General Public License |
|
14 | # You should have received a copy of the GNU General Public License | |
15 | # along with this program; if not, write to the Free Software |
|
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 |
|
17 | |||
18 | module ApplicationHelper |
|
18 | module ApplicationHelper | |
19 |
|
19 | |||
20 | # Return current logged in user or nil |
|
20 | # Return current logged in user or nil | |
21 | def loggedin? |
|
21 | def loggedin? | |
22 | @logged_in_user |
|
22 | @logged_in_user | |
23 | end |
|
23 | end | |
24 |
|
24 | |||
25 | # Return true if user is logged in and is admin, otherwise false |
|
25 | # Return true if user is logged in and is admin, otherwise false | |
26 | def admin_loggedin? |
|
26 | def admin_loggedin? | |
27 | @logged_in_user and @logged_in_user.admin? |
|
27 | @logged_in_user and @logged_in_user.admin? | |
28 | end |
|
28 | end | |
29 |
|
29 | |||
30 | # Return true if user is authorized for controller/action, otherwise false |
|
30 | # Return true if user is authorized for controller/action, otherwise false | |
31 | def authorize_for(controller, action) |
|
31 | def authorize_for(controller, action) | |
32 | # check if action is allowed on public projects |
|
32 | # check if action is allowed on public projects | |
33 | if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] |
|
33 | if @project.is_public? and Permission.allowed_to_public "%s/%s" % [ controller, action ] | |
34 | return true |
|
34 | return true | |
35 | end |
|
35 | end | |
36 | # check if user is authorized |
|
36 | # check if user is authorized | |
37 | if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) ) |
|
37 | if @logged_in_user and (@logged_in_user.admin? or Permission.allowed_to_role( "%s/%s" % [ controller, action ], @logged_in_user.role_for_project(@project.id) ) ) | |
38 | return true |
|
38 | return true | |
39 | end |
|
39 | end | |
40 | return false |
|
40 | return false | |
41 | end |
|
41 | end | |
42 |
|
42 | |||
43 | # Display a link if user is authorized |
|
43 | # Display a link if user is authorized | |
44 | def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) |
|
44 | def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) | |
45 | link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action]) |
|
45 | link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller], options[:action]) | |
46 | end |
|
46 | end | |
47 |
|
47 | |||
48 | # Display a link to user's account page |
|
48 | # Display a link to user's account page | |
49 | def link_to_user(user) |
|
49 | def link_to_user(user) | |
50 | link_to user.display_name, :controller => 'account', :action => 'show', :id => user |
|
50 | link_to user.display_name, :controller => 'account', :action => 'show', :id => user | |
51 | end |
|
51 | end | |
52 |
|
52 | |||
53 | def format_date(date) |
|
53 | def format_date(date) | |
54 | l_date(date) if date |
|
54 | l_date(date) if date | |
55 | end |
|
55 | end | |
56 |
|
56 | |||
57 | def format_time(time) |
|
57 | def format_time(time) | |
58 | l_datetime(time) if time |
|
58 | l_datetime(time) if time | |
59 | end |
|
59 | end | |
60 |
|
60 | |||
61 | def pagination_links_full(paginator, options={}, html_options={}) |
|
61 | def pagination_links_full(paginator, options={}, html_options={}) | |
62 | html ='' |
|
62 | html ='' | |
63 | html << link_to(('« ' + l(:label_previous) ), { :page => paginator.current.previous }) + ' ' if paginator.current.previous |
|
63 | html << link_to(('« ' + l(:label_previous) ), { :page => paginator.current.previous }) + ' ' if paginator.current.previous | |
64 | html << (pagination_links(paginator, options, html_options) || '') |
|
64 | html << (pagination_links(paginator, options, html_options) || '') | |
65 | html << ' ' + link_to((l(:label_next) + ' »'), { :page => paginator.current.next }) if paginator.current.next |
|
65 | html << ' ' + link_to((l(:label_next) + ' »'), { :page => paginator.current.next }) if paginator.current.next | |
66 | html |
|
66 | html | |
67 | end |
|
67 | end | |
68 |
|
68 | |||
69 | def error_messages_for(object_name, options = {}) |
|
69 | def error_messages_for(object_name, options = {}) | |
70 | options = options.symbolize_keys |
|
70 | options = options.symbolize_keys | |
71 | object = instance_variable_get("@#{object_name}") |
|
71 | object = instance_variable_get("@#{object_name}") | |
72 | if object && !object.errors.empty? |
|
72 | if object && !object.errors.empty? | |
73 | # build full_messages here with controller current language |
|
73 | # build full_messages here with controller current language | |
74 | full_messages = [] |
|
74 | full_messages = [] | |
75 | object.errors.each do |attr, msg| |
|
75 | object.errors.each do |attr, msg| | |
76 | next if msg.nil? |
|
76 | next if msg.nil? | |
77 | if attr == "base" |
|
77 | if attr == "base" | |
78 | full_messages << l(msg) |
|
78 | full_messages << l(msg) | |
79 | else |
|
79 | else | |
80 | full_messages << "« " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " » " + l(msg) unless attr == "custom_values" |
|
80 | full_messages << "« " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " » " + l(msg) unless attr == "custom_values" | |
81 | end |
|
81 | end | |
82 | end |
|
82 | end | |
83 | # retrieve custom values error messages |
|
83 | # retrieve custom values error messages | |
84 | if object.errors[:custom_values] |
|
84 | if object.errors[:custom_values] | |
85 | object.custom_values.each do |v| |
|
85 | object.custom_values.each do |v| | |
86 | v.errors.each do |attr, msg| |
|
86 | v.errors.each do |attr, msg| | |
87 | next if msg.nil? |
|
87 | next if msg.nil? | |
88 | full_messages << "« " + v.custom_field.name + " » " + l(msg) |
|
88 | full_messages << "« " + v.custom_field.name + " » " + l(msg) | |
89 | end |
|
89 | end | |
90 | end |
|
90 | end | |
91 | end |
|
91 | end | |
92 | content_tag("div", |
|
92 | content_tag("div", | |
93 | content_tag( |
|
93 | content_tag( | |
94 | options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :" |
|
94 | options[:header_tag] || "h2", lwr(:gui_validation_error, full_messages.length) + " :" | |
95 | ) + |
|
95 | ) + | |
96 | content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }), |
|
96 | content_tag("ul", full_messages.collect { |msg| content_tag("li", msg) }), | |
97 | "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation" |
|
97 | "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation" | |
98 | ) |
|
98 | ) | |
99 | else |
|
99 | else | |
100 | "" |
|
100 | "" | |
101 | end |
|
101 | end | |
102 | end |
|
102 | end | |
103 |
|
103 | |||
104 | def lang_options_for_select |
|
104 | def lang_options_for_select | |
105 | (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]} |
|
105 | (GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }).collect {|lang| [ l_lang_name(lang.to_s, lang), lang.to_s]} | |
106 | end |
|
106 | end | |
107 |
|
107 | |||
108 | def label_tag_for(name, option_tags = nil, options = {}) |
|
108 | def label_tag_for(name, option_tags = nil, options = {}) | |
109 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") |
|
109 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") | |
110 | content_tag("label", label_text) |
|
110 | content_tag("label", label_text) | |
111 | end |
|
111 | end | |
112 |
|
112 | |||
113 | def labelled_tabular_form_for(name, object, options, &proc) |
|
113 | def labelled_tabular_form_for(name, object, options, &proc) | |
114 | options[:html] ||= {} |
|
114 | options[:html] ||= {} | |
115 | options[:html].store :class, "tabular" |
|
115 | options[:html].store :class, "tabular" | |
116 | form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc) |
|
116 | form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc) | |
117 | end |
|
117 | end | |
118 |
|
118 | |||
119 | def check_all_links(form_name) |
|
119 | def check_all_links(form_name) | |
120 | link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") + |
|
120 | link_to_function(l(:button_check_all), "checkAll('#{form_name}', true)") + | |
121 | " | " + |
|
121 | " | " + | |
122 | link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)") |
|
122 | link_to_function(l(:button_uncheck_all), "checkAll('#{form_name}', false)") | |
123 | end |
|
123 | end | |
|
124 | ||||
|
125 | def calendar_for(field_id) | |||
|
126 | image_tag("calendar.gif", {:id => "#{field_id}_trigger",:class => "calendar-trigger"}) + | |||
|
127 | javascript_tag("Calendar.setup({inputField : '#{field_id}', ifFormat : '%Y-%m-%d', button : '#{field_id}_trigger' });") | |||
|
128 | end | |||
124 | end |
|
129 | end | |
125 |
|
130 | |||
126 | class TabularFormBuilder < ActionView::Helpers::FormBuilder |
|
131 | class TabularFormBuilder < ActionView::Helpers::FormBuilder | |
127 | include GLoc |
|
132 | include GLoc | |
128 |
|
133 | |||
129 | def initialize(object_name, object, template, options, proc) |
|
134 | def initialize(object_name, object, template, options, proc) | |
130 | set_language_if_valid options.delete(:lang) |
|
135 | set_language_if_valid options.delete(:lang) | |
131 | @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc |
|
136 | @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc | |
132 | end |
|
137 | end | |
133 |
|
138 | |||
134 | (field_helpers - %w(radio_button) + %w(date_select)).each do |selector| |
|
139 | (field_helpers - %w(radio_button hidden_field) + %w(date_select)).each do |selector| | |
135 | src = <<-END_SRC |
|
140 | src = <<-END_SRC | |
136 | def #{selector}(field, options = {}) |
|
141 | def #{selector}(field, options = {}) | |
137 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") |
|
142 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") | |
138 | label = @template.content_tag("label", label_text, |
|
143 | label = @template.content_tag("label", label_text, | |
139 | :class => (@object.errors[field] ? "error" : nil), |
|
144 | :class => (@object.errors[field] ? "error" : nil), | |
140 | :for => (@object_name.to_s + "_" + field.to_s)) |
|
145 | :for => (@object_name.to_s + "_" + field.to_s)) | |
141 | label + super |
|
146 | label + super | |
142 | end |
|
147 | end | |
143 | END_SRC |
|
148 | END_SRC | |
144 | class_eval src, __FILE__, __LINE__ |
|
149 | class_eval src, __FILE__, __LINE__ | |
145 | end |
|
150 | end | |
146 |
|
151 | |||
147 | def select(field, choices, options = {}) |
|
152 | def select(field, choices, options = {}) | |
148 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") |
|
153 | label_text = l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) + (options.delete(:required) ? @template.content_tag("span", " *", :class => "required"): "") | |
149 | label = @template.content_tag("label", label_text, |
|
154 | label = @template.content_tag("label", label_text, | |
150 | :class => (@object.errors[field] ? "error" : nil), |
|
155 | :class => (@object.errors[field] ? "error" : nil), | |
151 | :for => (@object_name.to_s + "_" + field.to_s)) |
|
156 | :for => (@object_name.to_s + "_" + field.to_s)) | |
152 | label + super |
|
157 | label + super | |
153 | end |
|
158 | end | |
154 |
|
159 | |||
155 | end |
|
160 | end | |
156 |
|
161 |
@@ -1,65 +1,68 | |||||
1 | # redMine - project management software |
|
1 | # redMine - project management software | |
2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
6 | # as published by the Free Software Foundation; either version 2 |
|
6 | # as published by the Free Software Foundation; either version 2 | |
7 | # of the License, or (at your option) any later version. |
|
7 | # of the License, or (at your option) any later version. | |
8 | # |
|
8 | # | |
9 | # This program is distributed in the hope that it will be useful, |
|
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. |
|
12 | # GNU General Public License for more details. | |
13 | # |
|
13 | # | |
14 | # You should have received a copy of the GNU General Public License |
|
14 | # You should have received a copy of the GNU General Public License | |
15 | # along with this program; if not, write to the Free Software |
|
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 |
|
17 | |||
18 | module CustomFieldsHelper |
|
18 | module CustomFieldsHelper | |
19 |
|
19 | |||
20 | # Return custom field html tag corresponding to its format |
|
20 | # Return custom field html tag corresponding to its format | |
21 | def custom_field_tag(custom_value) |
|
21 | def custom_field_tag(custom_value) | |
22 | custom_field = custom_value.custom_field |
|
22 | custom_field = custom_value.custom_field | |
23 | field_name = "custom_fields[#{custom_field.id}]" |
|
23 | field_name = "custom_fields[#{custom_field.id}]" | |
24 | field_id = "custom_fields_#{custom_field.id}" |
|
24 | field_id = "custom_fields_#{custom_field.id}" | |
25 |
|
25 | |||
26 | case custom_field.field_format |
|
26 | case custom_field.field_format | |
27 |
when "string", "int" |
|
27 | when "string", "int" | |
28 | text_field 'custom_value', 'value', :name => field_name, :id => field_id |
|
28 | text_field 'custom_value', 'value', :name => field_name, :id => field_id | |
|
29 | when "date" | |||
|
30 | text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) + | |||
|
31 | calendar_for(field_id) | |||
29 | when "text" |
|
32 | when "text" | |
30 | text_area 'custom_value', 'value', :name => field_name, :id => field_id, :cols => 60, :rows => 3 |
|
33 | text_area 'custom_value', 'value', :name => field_name, :id => field_id, :cols => 60, :rows => 3 | |
31 | when "bool" |
|
34 | when "bool" | |
32 | check_box 'custom_value', 'value', :name => field_name, :id => field_id |
|
35 | check_box 'custom_value', 'value', :name => field_name, :id => field_id | |
33 | when "list" |
|
36 | when "list" | |
34 | select 'custom_value', 'value', custom_field.possible_values.split('|'), { :include_blank => true }, :name => field_name, :id => field_id |
|
37 | select 'custom_value', 'value', custom_field.possible_values.split('|'), { :include_blank => true }, :name => field_name, :id => field_id | |
35 | end |
|
38 | end | |
36 | end |
|
39 | end | |
37 |
|
40 | |||
38 | # Return custom field label tag |
|
41 | # Return custom field label tag | |
39 | def custom_field_label_tag(custom_value) |
|
42 | def custom_field_label_tag(custom_value) | |
40 | content_tag "label", custom_value.custom_field.name + |
|
43 | content_tag "label", custom_value.custom_field.name + | |
41 | (custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""), |
|
44 | (custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""), | |
42 | :for => "custom_fields_#{custom_value.custom_field.id}", |
|
45 | :for => "custom_fields_#{custom_value.custom_field.id}", | |
43 | :class => (custom_value.errors.empty? ? nil : "error" ) |
|
46 | :class => (custom_value.errors.empty? ? nil : "error" ) | |
44 | end |
|
47 | end | |
45 |
|
48 | |||
46 | # Return custom field tag with its label tag |
|
49 | # Return custom field tag with its label tag | |
47 | def custom_field_tag_with_label(custom_value) |
|
50 | def custom_field_tag_with_label(custom_value) | |
48 | custom_field_label_tag(custom_value) + custom_field_tag(custom_value) |
|
51 | custom_field_label_tag(custom_value) + custom_field_tag(custom_value) | |
49 | end |
|
52 | end | |
50 |
|
53 | |||
51 | # Return a string used to display a custom value |
|
54 | # Return a string used to display a custom value | |
52 | def show_value(custom_value) |
|
55 | def show_value(custom_value) | |
53 | case custom_value.custom_field.field_format |
|
56 | case custom_value.custom_field.field_format | |
54 | when "bool" |
|
57 | when "bool" | |
55 | l_YesNo(custom_value.value == "1") |
|
58 | l_YesNo(custom_value.value == "1") | |
56 | else |
|
59 | else | |
57 | custom_value.value |
|
60 | custom_value.value | |
58 | end |
|
61 | end | |
59 | end |
|
62 | end | |
60 |
|
63 | |||
61 | # Return an array of custom field formats which can be used in select_tag |
|
64 | # Return an array of custom field formats which can be used in select_tag | |
62 | def custom_field_formats_for_select |
|
65 | def custom_field_formats_for_select | |
63 | CustomField::FIELD_FORMATS.keys.collect { |k| [ l(CustomField::FIELD_FORMATS[k]), k ] } |
|
66 | CustomField::FIELD_FORMATS.keys.collect { |k| [ l(CustomField::FIELD_FORMATS[k]), k ] } | |
64 | end |
|
67 | end | |
65 | end |
|
68 | end |
@@ -1,38 +1,38 | |||||
1 | # redMine - project management software |
|
1 | # redMine - project management software | |
2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
6 | # as published by the Free Software Foundation; either version 2 |
|
6 | # as published by the Free Software Foundation; either version 2 | |
7 | # of the License, or (at your option) any later version. |
|
7 | # of the License, or (at your option) any later version. | |
8 | # |
|
8 | # | |
9 | # This program is distributed in the hope that it will be useful, |
|
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. |
|
12 | # GNU General Public License for more details. | |
13 | # |
|
13 | # | |
14 | # You should have received a copy of the GNU General Public License |
|
14 | # You should have received a copy of the GNU General Public License | |
15 | # along with this program; if not, write to the Free Software |
|
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 |
|
17 | |||
18 | class CustomValue < ActiveRecord::Base |
|
18 | class CustomValue < ActiveRecord::Base | |
19 | belongs_to :custom_field |
|
19 | belongs_to :custom_field | |
20 | belongs_to :customized, :polymorphic => true |
|
20 | belongs_to :customized, :polymorphic => true | |
21 |
|
21 | |||
22 | protected |
|
22 | protected | |
23 | def validate |
|
23 | def validate | |
24 | errors.add(:value, :activerecord_error_blank) and return if custom_field.is_required? and value.empty? |
|
24 | errors.add(:value, :activerecord_error_blank) and return if custom_field.is_required? and value.empty? | |
25 | errors.add(:value, :activerecord_error_invalid) unless custom_field.regexp.empty? or value =~ Regexp.new(custom_field.regexp) |
|
25 | errors.add(:value, :activerecord_error_invalid) unless custom_field.regexp.empty? or value =~ Regexp.new(custom_field.regexp) | |
26 | errors.add(:value, :activerecord_error_too_short) if custom_field.min_length > 0 and value.length < custom_field.min_length and value.length > 0 |
|
26 | errors.add(:value, :activerecord_error_too_short) if custom_field.min_length > 0 and value.length < custom_field.min_length and value.length > 0 | |
27 | errors.add(:value, :activerecord_error_too_long) if custom_field.max_length > 0 and value.length > custom_field.max_length |
|
27 | errors.add(:value, :activerecord_error_too_long) if custom_field.max_length > 0 and value.length > custom_field.max_length | |
28 | case custom_field.field_format |
|
28 | case custom_field.field_format | |
29 | when "int" |
|
29 | when "int" | |
30 | errors.add(:value, :activerecord_error_not_a_number) unless value =~ /^[0-9]*$/ |
|
30 | errors.add(:value, :activerecord_error_not_a_number) unless value =~ /^[0-9]*$/ | |
31 | when "date" |
|
31 | when "date" | |
32 |
errors.add(:value, :activerecord_error_ |
|
32 | errors.add(:value, :activerecord_error_not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/ or value.empty? | |
33 | when "list" |
|
33 | when "list" | |
34 | errors.add(:value, :activerecord_error_inclusion) unless custom_field.possible_values.split('|').include? value or value.empty? |
|
34 | errors.add(:value, :activerecord_error_inclusion) unless custom_field.possible_values.split('|').include? value or value.empty? | |
35 | end |
|
35 | end | |
36 | end |
|
36 | end | |
37 | end |
|
37 | end | |
38 |
|
38 |
@@ -1,59 +1,64 | |||||
1 | # redMine - project management software |
|
1 | # redMine - project management software | |
2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
6 | # as published by the Free Software Foundation; either version 2 |
|
6 | # as published by the Free Software Foundation; either version 2 | |
7 | # of the License, or (at your option) any later version. |
|
7 | # of the License, or (at your option) any later version. | |
8 | # |
|
8 | # | |
9 | # This program is distributed in the hope that it will be useful, |
|
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. |
|
12 | # GNU General Public License for more details. | |
13 | # |
|
13 | # | |
14 | # You should have received a copy of the GNU General Public License |
|
14 | # You should have received a copy of the GNU General Public License | |
15 | # along with this program; if not, write to the Free Software |
|
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 |
|
17 | |||
18 | class Issue < ActiveRecord::Base |
|
18 | class Issue < ActiveRecord::Base | |
19 |
|
19 | |||
20 |
|
|
20 | belongs_to :project | |
21 |
|
|
21 | belongs_to :tracker | |
22 |
|
|
22 | belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id' | |
23 |
|
|
23 | belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' | |
24 |
|
|
24 | belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id' | |
25 |
|
|
25 | belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id' | |
26 |
|
|
26 | belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id' | |
27 |
|
|
27 | belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id' | |
28 |
|
28 | |||
29 |
|
|
29 | has_many :histories, :class_name => 'IssueHistory', :dependent => true, :order => "issue_histories.created_on DESC", :include => :status | |
30 |
|
|
30 | has_many :attachments, :as => :container, :dependent => true | |
31 |
|
31 | |||
32 |
|
|
32 | has_many :custom_values, :dependent => true, :as => :customized | |
33 |
|
|
33 | has_many :custom_fields, :through => :custom_values | |
34 |
|
34 | |||
35 | validates_presence_of :subject, :description, :priority, :tracker, :author |
|
35 | validates_presence_of :subject, :description, :priority, :tracker, :author | |
36 | validates_associated :custom_values, :on => :update |
|
36 | validates_associated :custom_values, :on => :update | |
37 |
|
37 | |||
38 |
|
|
38 | # set default status for new issues | |
39 |
|
|
39 | def before_validation | |
40 |
|
|
40 | self.status = IssueStatus.default if new_record? | |
41 |
|
|
41 | end | |
42 |
|
42 | |||
43 | def before_create |
|
43 | def validate | |
44 | build_history |
|
44 | if self.due_date.nil? && !@attributes['due_date'].empty? | |
45 | end |
|
45 | errors.add :due_date, :activerecord_error_not_a_date | |
46 |
|
46 | end | ||
47 | def long_id |
|
47 | end | |
48 | "%05d" % self.id |
|
48 | ||
49 | end |
|
49 | def before_create | |
50 |
|
50 | build_history | ||
|
51 | end | |||
|
52 | ||||
|
53 | def long_id | |||
|
54 | "%05d" % self.id | |||
|
55 | end | |||
|
56 | ||||
51 | private |
|
57 | private | |
52 |
|
|
58 | # Creates an history for the issue | |
53 |
|
|
59 | def build_history | |
54 |
|
|
60 | @history = self.histories.build | |
55 |
|
|
61 | @history.status = self.status | |
56 |
|
|
62 | @history.author = self.author | |
57 |
|
|
63 | end | |
58 |
|
||||
59 | end |
|
64 | end |
@@ -1,31 +1,32 | |||||
1 | # redMine - project management software |
|
1 | # redMine - project management software | |
2 | # Copyright (C) 2006 Jean-Philippe Lang |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
3 | # |
|
3 | # | |
4 | # This program is free software; you can redistribute it and/or |
|
4 | # This program is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU General Public License |
|
5 | # modify it under the terms of the GNU General Public License | |
6 | # as published by the Free Software Foundation; either version 2 |
|
6 | # as published by the Free Software Foundation; either version 2 | |
7 | # of the License, or (at your option) any later version. |
|
7 | # of the License, or (at your option) any later version. | |
8 | # |
|
8 | # | |
9 | # This program is distributed in the hope that it will be useful, |
|
9 | # This program is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | # GNU General Public License for more details. |
|
12 | # GNU General Public License for more details. | |
13 | # |
|
13 | # | |
14 | # You should have received a copy of the GNU General Public License |
|
14 | # You should have received a copy of the GNU General Public License | |
15 | # along with this program; if not, write to the Free Software |
|
15 | # along with this program; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 |
|
17 | |||
18 | class Version < ActiveRecord::Base |
|
18 | class Version < ActiveRecord::Base | |
19 | before_destroy :check_integrity |
|
19 | before_destroy :check_integrity | |
20 | belongs_to :project |
|
20 | belongs_to :project | |
21 | has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' |
|
21 | has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' | |
22 | has_many :attachments, :as => :container, :dependent => true |
|
22 | has_many :attachments, :as => :container, :dependent => true | |
23 |
|
23 | |||
24 | validates_presence_of :name |
|
24 | validates_presence_of :name | |
25 | validates_uniqueness_of :name, :scope => [:project_id] |
|
25 | validates_uniqueness_of :name, :scope => [:project_id] | |
|
26 | validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date | |||
26 |
|
27 | |||
27 | private |
|
28 | private | |
28 | def check_integrity |
|
29 | def check_integrity | |
29 | raise "Can't delete version" if self.fixed_issues.find(:first) |
|
30 | raise "Can't delete version" if self.fixed_issues.find(:first) | |
30 | end |
|
31 | end | |
31 | end |
|
32 | end |
@@ -1,26 +1,26 | |||||
1 | <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2> |
|
1 | <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2> | |
2 |
|
2 | |||
3 | <% labelled_tabular_form_for :issue, @issue, :url => {:action => 'edit'} do |f| %> |
|
3 | <% labelled_tabular_form_for :issue, @issue, :url => {:action => 'edit'} do |f| %> | |
4 | <%= error_messages_for 'issue' %> |
|
4 | <%= error_messages_for 'issue' %> | |
5 | <div class="box"> |
|
5 | <div class="box"> | |
6 | <!--[form:issue]--> |
|
6 | <!--[form:issue]--> | |
7 | <p><label><%=l(:field_status)%></label> <%= @issue.status.name %></p> |
|
7 | <p><label><%=l(:field_status)%></label> <%= @issue.status.name %></p> | |
8 |
|
8 | |||
9 | <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> |
|
9 | <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> | |
10 | <p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> |
|
10 | <p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> | |
11 | <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}) %></p> |
|
11 | <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}) %></p> | |
12 | <p><%= f.text_field :subject, :size => 80, :required => true %></p> |
|
12 | <p><%= f.text_field :subject, :size => 80, :required => true %></p> | |
13 | <p><%= f.text_area :description, :cols => 60, :rows => 10, :required => true %></p> |
|
13 | <p><%= f.text_area :description, :cols => 60, :rows => 10, :required => true %></p> | |
14 | <p><%= f.date_select :due_date, :start_year => Date.today.year, :include_blank => true %></p> |
|
14 | <p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p> | |
15 |
|
15 | |||
16 | <% for @custom_value in @custom_values %> |
|
16 | <% for @custom_value in @custom_values %> | |
17 | <p><%= custom_field_tag_with_label @custom_value %></p> |
|
17 | <p><%= custom_field_tag_with_label @custom_value %></p> | |
18 | <% end %> |
|
18 | <% end %> | |
19 |
|
19 | |||
20 | <p><%= f.select :fixed_version_id, (@project.versions.collect {|v| [v.name, v.id]}), { :include_blank => true } %> |
|
20 | <p><%= f.select :fixed_version_id, (@project.versions.collect {|v| [v.name, v.id]}), { :include_blank => true } %> | |
21 | </select></p> |
|
21 | </select></p> | |
22 | <!--[eoform:issue]--> |
|
22 | <!--[eoform:issue]--> | |
23 | </div> |
|
23 | </div> | |
24 | <%= f.hidden_field :lock_version %> |
|
24 | <%= f.hidden_field :lock_version %> | |
25 | <%= submit_tag l(:button_save) %> |
|
25 | <%= submit_tag l(:button_save) %> | |
26 | <% end %> No newline at end of file |
|
26 | <% end %> |
@@ -1,134 +1,137 | |||||
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
|
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | |
2 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
|
2 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> | |
3 | <head> |
|
3 | <head> | |
4 | <title><%= $RDM_HEADER_TITLE %></title> |
|
4 | <title><%= $RDM_HEADER_TITLE %></title> | |
5 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
|
5 | <meta http-equiv="content-type" content="text/html; charset=utf-8" /> | |
6 | <meta name="description" content="redMine" /> |
|
6 | <meta name="description" content="redMine" /> | |
7 | <meta name="keywords" content="issue,bug,tracker" /> |
|
7 | <meta name="keywords" content="issue,bug,tracker" /> | |
8 | <%= stylesheet_link_tag "application" %> |
|
8 | <%= stylesheet_link_tag "application" %> | |
9 | <%= stylesheet_link_tag "menu" %> |
|
9 | <%= stylesheet_link_tag "menu" %> | |
10 | <%= stylesheet_link_tag "rails" %> |
|
10 | <%= stylesheet_link_tag "rails" %> | |
11 | <%= javascript_include_tag :defaults %> |
|
11 | <%= javascript_include_tag :defaults %> | |
12 | <%= javascript_include_tag 'menu' %> |
|
12 | <%= javascript_include_tag 'menu' %> | |
13 |
|
13 | <%= javascript_include_tag 'calendar/calendar' %> | ||
|
14 | <%= javascript_include_tag "calendar/lang/calendar-#{current_language}.js" %> | |||
|
15 | <%= javascript_include_tag 'calendar/calendar-setup' %> | |||
|
16 | <%= stylesheet_link_tag 'calendar/calendar-blue' %> | |||
14 | <script type='text/javascript'> |
|
17 | <script type='text/javascript'> | |
15 | var menu_contenu=' \ |
|
18 | var menu_contenu=' \ | |
16 | <div id="menuAdmin" class="menu" onmouseover="menuMouseover(event)"> \ |
|
19 | <div id="menuAdmin" class="menu" onmouseover="menuMouseover(event)"> \ | |
17 | <a class="menuItem" href="\/admin\/projects" onmouseover="menuItemMouseover(event,\'menuProjects\');"><span class="menuItemText"><%=l(:label_project_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ |
|
20 | <a class="menuItem" href="\/admin\/projects" onmouseover="menuItemMouseover(event,\'menuProjects\');"><span class="menuItemText"><%=l(:label_project_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ | |
18 | <a class="menuItem" href="\/users" onmouseover="menuItemMouseover(event,\'menuUsers\');"><span class="menuItemText"><%=l(:label_user_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ |
|
21 | <a class="menuItem" href="\/users" onmouseover="menuItemMouseover(event,\'menuUsers\');"><span class="menuItemText"><%=l(:label_user_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ | |
19 | <a class="menuItem" href="\/roles"><%=l(:label_role_and_permissions)%><\/a> \ |
|
22 | <a class="menuItem" href="\/roles"><%=l(:label_role_and_permissions)%><\/a> \ | |
20 | <a class="menuItem" href="\/trackers" onmouseover="menuItemMouseover(event,\'menuTrackers\');"><span class="menuItemText"><%=l(:label_tracker_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ |
|
23 | <a class="menuItem" href="\/trackers" onmouseover="menuItemMouseover(event,\'menuTrackers\');"><span class="menuItemText"><%=l(:label_tracker_plural)%><\/span><span class="menuItemArrow">▶<\/span><\/a> \ | |
21 | <a class="menuItem" href="\/custom_fields"><%=l(:label_custom_field_plural)%><\/a> \ |
|
24 | <a class="menuItem" href="\/custom_fields"><%=l(:label_custom_field_plural)%><\/a> \ | |
22 | <a class="menuItem" href="\/enumerations"><%=l(:label_enumerations)%><\/a> \ |
|
25 | <a class="menuItem" href="\/enumerations"><%=l(:label_enumerations)%><\/a> \ | |
23 | <a class="menuItem" href="\/admin\/mail_options"><%=l(:field_mail_notification)%><\/a> \ |
|
26 | <a class="menuItem" href="\/admin\/mail_options"><%=l(:field_mail_notification)%><\/a> \ | |
24 | <a class="menuItem" href="\/auth_sources"><%=l(:label_authentication)%><\/a> \ |
|
27 | <a class="menuItem" href="\/auth_sources"><%=l(:label_authentication)%><\/a> \ | |
25 | <a class="menuItem" href="\/admin\/info"><%=l(:label_information_plural)%><\/a> \ |
|
28 | <a class="menuItem" href="\/admin\/info"><%=l(:label_information_plural)%><\/a> \ | |
26 | <\/div> \ |
|
29 | <\/div> \ | |
27 | <div id="menuTrackers" class="menu"> \ |
|
30 | <div id="menuTrackers" class="menu"> \ | |
28 | <a class="menuItem" href="\/issue_statuses"><%=l(:label_issue_status_plural)%><\/a> \ |
|
31 | <a class="menuItem" href="\/issue_statuses"><%=l(:label_issue_status_plural)%><\/a> \ | |
29 | <a class="menuItem" href="\/roles\/workflow"><%=l(:label_workflow)%><\/a> \ |
|
32 | <a class="menuItem" href="\/roles\/workflow"><%=l(:label_workflow)%><\/a> \ | |
30 | <\/div> \ |
|
33 | <\/div> \ | |
31 | <div id="menuProjects" class="menu"><a class="menuItem" href="\/projects\/add"><%=l(:label_new)%><\/a><\/div> \ |
|
34 | <div id="menuProjects" class="menu"><a class="menuItem" href="\/projects\/add"><%=l(:label_new)%><\/a><\/div> \ | |
32 | <div id="menuUsers" class="menu"><a class="menuItem" href="\/users\/add"><%=l(:label_new)%><\/a><\/div> \ |
|
35 | <div id="menuUsers" class="menu"><a class="menuItem" href="\/users\/add"><%=l(:label_new)%><\/a><\/div> \ | |
33 | \ |
|
36 | \ | |
34 | <% unless @project.nil? || @project.id.nil? %> \ |
|
37 | <% unless @project.nil? || @project.id.nil? %> \ | |
35 | <div id="menuProject" class="menu" onmouseover="menuMouseover(event)"> \ |
|
38 | <div id="menuProject" class="menu" onmouseover="menuMouseover(event)"> \ | |
36 | <%= link_to l(:label_issue_plural), {:controller => 'projects', :action => 'list_issues', :id => @project }, :class => "menuItem" %> \ |
|
39 | <%= link_to l(:label_issue_plural), {:controller => 'projects', :action => 'list_issues', :id => @project }, :class => "menuItem" %> \ | |
37 | <%= link_to l(:label_report_plural), {:controller => 'reports', :action => 'issue_report', :id => @project }, :class => "menuItem" %> \ |
|
40 | <%= link_to l(:label_report_plural), {:controller => 'reports', :action => 'issue_report', :id => @project }, :class => "menuItem" %> \ | |
38 | <%= link_to l(:label_news_plural), {:controller => 'projects', :action => 'list_news', :id => @project }, :class => "menuItem" %> \ |
|
41 | <%= link_to l(:label_news_plural), {:controller => 'projects', :action => 'list_news', :id => @project }, :class => "menuItem" %> \ | |
39 | <%= link_to l(:label_change_log), {:controller => 'projects', :action => 'changelog', :id => @project }, :class => "menuItem" %> \ |
|
42 | <%= link_to l(:label_change_log), {:controller => 'projects', :action => 'changelog', :id => @project }, :class => "menuItem" %> \ | |
40 | <%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %> \ |
|
43 | <%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %> \ | |
41 | <%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %> \ |
|
44 | <%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %> \ | |
42 | <%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %> \ |
|
45 | <%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %> \ | |
43 | <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project }, :class => "menuItem" %> \ |
|
46 | <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project }, :class => "menuItem" %> \ | |
44 | <\/div> \ |
|
47 | <\/div> \ | |
45 | <% end %> \ |
|
48 | <% end %> \ | |
46 | '; |
|
49 | '; | |
47 | </script> |
|
50 | </script> | |
48 |
|
51 | |||
49 | </head> |
|
52 | </head> | |
50 |
|
53 | |||
51 | <body> |
|
54 | <body> | |
52 | <div id="container" > |
|
55 | <div id="container" > | |
53 |
|
56 | |||
54 | <div id="header"> |
|
57 | <div id="header"> | |
55 | <div style="float: left;"> |
|
58 | <div style="float: left;"> | |
56 | <h1><%= $RDM_HEADER_TITLE %></h1> |
|
59 | <h1><%= $RDM_HEADER_TITLE %></h1> | |
57 | <h2><%= $RDM_HEADER_SUBTITLE %></h2> |
|
60 | <h2><%= $RDM_HEADER_SUBTITLE %></h2> | |
58 | </div> |
|
61 | </div> | |
59 | <div style="float: right; padding-right: 1em; padding-top: 0.2em;"> |
|
62 | <div style="float: right; padding-right: 1em; padding-top: 0.2em;"> | |
60 | <% if loggedin? %><small><%=l(:label_logged_as)%> <b><%= @logged_in_user.login %></b></small><% end %> |
|
63 | <% if loggedin? %><small><%=l(:label_logged_as)%> <b><%= @logged_in_user.login %></b></small><% end %> | |
61 | </div> |
|
64 | </div> | |
62 | </div> |
|
65 | </div> | |
63 |
|
66 | |||
64 | <div id="navigation"> |
|
67 | <div id="navigation"> | |
65 | <ul> |
|
68 | <ul> | |
66 | <li class="selected"><%= link_to l(:label_home), { :controller => '' }, :class => "picHome" %></li> |
|
69 | <li class="selected"><%= link_to l(:label_home), { :controller => '' }, :class => "picHome" %></li> | |
67 | <li><%= link_to l(:label_my_page), { :controller => 'account', :action => 'my_page'}, :class => "picUserPage" %></li> |
|
70 | <li><%= link_to l(:label_my_page), { :controller => 'account', :action => 'my_page'}, :class => "picUserPage" %></li> | |
68 | <li><%= link_to l(:label_project_plural), { :controller => 'projects' }, :class => "picProject" %></li> |
|
71 | <li><%= link_to l(:label_project_plural), { :controller => 'projects' }, :class => "picProject" %></li> | |
69 |
|
72 | |||
70 | <% unless @project.nil? || @project.id.nil? %> |
|
73 | <% unless @project.nil? || @project.id.nil? %> | |
71 | <li><%= link_to @project.name, { :controller => 'projects', :action => 'show', :id => @project }, :class => "picProject", :onmouseover => "buttonMouseover(event, 'menuProject');" %></li> |
|
74 | <li><%= link_to @project.name, { :controller => 'projects', :action => 'show', :id => @project }, :class => "picProject", :onmouseover => "buttonMouseover(event, 'menuProject');" %></li> | |
72 | <% end %> |
|
75 | <% end %> | |
73 |
|
76 | |||
74 | <% if loggedin? %> |
|
77 | <% if loggedin? %> | |
75 | <li><%= link_to l(:label_my_account), { :controller => 'account', :action => 'my_account' }, :class => "picUser" %></li> |
|
78 | <li><%= link_to l(:label_my_account), { :controller => 'account', :action => 'my_account' }, :class => "picUser" %></li> | |
76 | <% end %> |
|
79 | <% end %> | |
77 |
|
80 | |||
78 | <% if admin_loggedin? %> |
|
81 | <% if admin_loggedin? %> | |
79 | <li><%= link_to l(:label_administration), { :controller => 'admin' }, :class => "picAdmin", :onmouseover => "buttonMouseover(event, 'menuAdmin');" %></li> |
|
82 | <li><%= link_to l(:label_administration), { :controller => 'admin' }, :class => "picAdmin", :onmouseover => "buttonMouseover(event, 'menuAdmin');" %></li> | |
80 | <% end %> |
|
83 | <% end %> | |
81 |
|
84 | |||
82 | <li class="right"><%= link_to l(:label_help), { :controller => 'help', :ctrl => @params[:controller], :page => @params[:action] }, :target => "new", :class => "picHelp" %></li> |
|
85 | <li class="right"><%= link_to l(:label_help), { :controller => 'help', :ctrl => @params[:controller], :page => @params[:action] }, :target => "new", :class => "picHelp" %></li> | |
83 |
|
86 | |||
84 | <% if loggedin? %> |
|
87 | <% if loggedin? %> | |
85 | <li class="right"><%= link_to l(:label_logout), { :controller => 'account', :action => 'logout' }, :class => "picUser" %></li> |
|
88 | <li class="right"><%= link_to l(:label_logout), { :controller => 'account', :action => 'logout' }, :class => "picUser" %></li> | |
86 | <% else %> |
|
89 | <% else %> | |
87 | <li class="right"><%= link_to l(:label_login), { :controller => 'account', :action => 'login' }, :class => "picUser" %></li> |
|
90 | <li class="right"><%= link_to l(:label_login), { :controller => 'account', :action => 'login' }, :class => "picUser" %></li> | |
88 | <% end %> |
|
91 | <% end %> | |
89 | </ul> |
|
92 | </ul> | |
90 | </div> |
|
93 | </div> | |
91 | <script type='text/javascript'>if(document.getElementById) {document.write(menu_contenu);}</script> |
|
94 | <script type='text/javascript'>if(document.getElementById) {document.write(menu_contenu);}</script> | |
92 |
|
95 | |||
93 | <div id="subcontent"> |
|
96 | <div id="subcontent"> | |
94 |
|
97 | |||
95 | <% unless @project.nil? || @project.id.nil? %> |
|
98 | <% unless @project.nil? || @project.id.nil? %> | |
96 | <h2><%= @project.name %></h2> |
|
99 | <h2><%= @project.name %></h2> | |
97 | <ul class="menublock"> |
|
100 | <ul class="menublock"> | |
98 | <li><%= link_to l(:label_overview), :controller => 'projects', :action => 'show', :id => @project %></li> |
|
101 | <li><%= link_to l(:label_overview), :controller => 'projects', :action => 'show', :id => @project %></li> | |
99 | <li><%= link_to l(:label_issue_plural), :controller => 'projects', :action => 'list_issues', :id => @project %></li> |
|
102 | <li><%= link_to l(:label_issue_plural), :controller => 'projects', :action => 'list_issues', :id => @project %></li> | |
100 | <li><%= link_to l(:label_report_plural), :controller => 'reports', :action => 'issue_report', :id => @project %></li> |
|
103 | <li><%= link_to l(:label_report_plural), :controller => 'reports', :action => 'issue_report', :id => @project %></li> | |
101 | <li><%= link_to l(:label_news_plural), :controller => 'projects', :action => 'list_news', :id => @project %></li> |
|
104 | <li><%= link_to l(:label_news_plural), :controller => 'projects', :action => 'list_news', :id => @project %></li> | |
102 | <li><%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %></li> |
|
105 | <li><%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %></li> | |
103 | <li><%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %></li> |
|
106 | <li><%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %></li> | |
104 | <li><%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %></li> |
|
107 | <li><%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %></li> | |
105 | <li><%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %></li> |
|
108 | <li><%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %></li> | |
106 | <li><%= link_to_if_authorized l(:label_settings), :controller => 'projects', :action => 'settings', :id => @project %></li> |
|
109 | <li><%= link_to_if_authorized l(:label_settings), :controller => 'projects', :action => 'settings', :id => @project %></li> | |
107 | </ul> |
|
110 | </ul> | |
108 | <% end %> |
|
111 | <% end %> | |
109 |
|
112 | |||
110 | <% if loggedin? and @logged_in_user.memberships.length > 0 %> |
|
113 | <% if loggedin? and @logged_in_user.memberships.length > 0 %> | |
111 | <h2><%=l(:label_my_projects) %></h2> |
|
114 | <h2><%=l(:label_my_projects) %></h2> | |
112 | <ul class="menublock"> |
|
115 | <ul class="menublock"> | |
113 | <% for membership in @logged_in_user.memberships %> |
|
116 | <% for membership in @logged_in_user.memberships %> | |
114 | <li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %></li> |
|
117 | <li><%= link_to membership.project.name, :controller => 'projects', :action => 'show', :id => membership.project %></li> | |
115 | <% end %> |
|
118 | <% end %> | |
116 | </ul> |
|
119 | </ul> | |
117 | <% end %> |
|
120 | <% end %> | |
118 | </div> |
|
121 | </div> | |
119 |
|
122 | |||
120 | <div id="content"> |
|
123 | <div id="content"> | |
121 | <% if flash[:notice] %><p style="color: green"><%= flash[:notice] %></p><% end %> |
|
124 | <% if flash[:notice] %><p style="color: green"><%= flash[:notice] %></p><% end %> | |
122 | <%= @content_for_layout %> |
|
125 | <%= @content_for_layout %> | |
123 | </div> |
|
126 | </div> | |
124 |
|
127 | |||
125 | <div id="footer"> |
|
128 | <div id="footer"> | |
126 | <p> |
|
129 | <p> | |
127 | <%= auto_link $RDM_FOOTER_SIG %> | |
|
130 | <%= auto_link $RDM_FOOTER_SIG %> | | |
128 | <a href="http://redmine.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %> |
|
131 | <a href="http://redmine.org/" target="_new"><%= RDM_APP_NAME %></a> <%= RDM_APP_VERSION %> | |
129 | </p> |
|
132 | </p> | |
130 | </div> |
|
133 | </div> | |
131 |
|
134 | |||
132 | </div> |
|
135 | </div> | |
133 | </body> |
|
136 | </body> | |
134 | </html> No newline at end of file |
|
137 | </html> |
@@ -1,26 +1,26 | |||||
1 | <h2><%=l(:label_issue_new)%>: <%= @tracker.name %></h2> |
|
1 | <h2><%=l(:label_issue_new)%>: <%= @tracker.name %></h2> | |
2 |
|
2 | |||
3 | <% labelled_tabular_form_for :issue, @issue, :url => {:action => 'add_issue'}, :html => {:multipart => true} do |f| %> |
|
3 | <% labelled_tabular_form_for :issue, @issue, :url => {:action => 'add_issue'}, :html => {:multipart => true} do |f| %> | |
4 | <%= error_messages_for 'issue' %> |
|
4 | <%= error_messages_for 'issue' %> | |
5 | <div class="box"> |
|
5 | <div class="box"> | |
6 | <!--[form:issue]--> |
|
6 | <!--[form:issue]--> | |
7 | <%= hidden_field_tag 'tracker_id', @tracker.id %> |
|
7 | <%= hidden_field_tag 'tracker_id', @tracker.id %> | |
8 |
|
8 | |||
9 | <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> |
|
9 | <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> | |
10 | <p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> |
|
10 | <p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> | |
11 | <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}) %></p> |
|
11 | <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}) %></p> | |
12 | <p><%= f.text_field :subject, :size => 80, :required => true %></p> |
|
12 | <p><%= f.text_field :subject, :size => 80, :required => true %></p> | |
13 | <p><%= f.text_area :description, :cols => 60, :rows => 10, :required => true %></p> |
|
13 | <p><%= f.text_area :description, :cols => 60, :rows => 10, :required => true %></p> | |
14 | <p><%= f.date_select :due_date, :start_year => Date.today.year, :include_blank => true %></p> |
|
14 | <p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p> | |
15 |
|
15 | |||
16 | <% for @custom_value in @custom_values %> |
|
16 | <% for @custom_value in @custom_values %> | |
17 | <p><%= custom_field_tag_with_label @custom_value %></p> |
|
17 | <p><%= custom_field_tag_with_label @custom_value %></p> | |
18 | <% end %> |
|
18 | <% end %> | |
19 |
|
19 | |||
20 | <p><label for="attachment_file"><%=l(:label_attachment)%></label> |
|
20 | <p><label for="attachment_file"><%=l(:label_attachment)%></label> | |
21 | <%= file_field 'attachment', 'file' %></p> |
|
21 | <%= file_field 'attachment', 'file' %></p> | |
22 | <!--[eoform:issue]--> |
|
22 | <!--[eoform:issue]--> | |
23 | </div> |
|
23 | </div> | |
24 |
|
24 | |||
25 | <%= submit_tag l(:button_create) %> |
|
25 | <%= submit_tag l(:button_create) %> | |
26 | <% end %> No newline at end of file |
|
26 | <% end %> |
@@ -1,8 +1,9 | |||||
1 | <%= error_messages_for 'version' %> |
|
1 | <%= error_messages_for 'version' %> | |
|
2 | ||||
2 | <div class="box"> |
|
3 | <div class="box"> | |
3 | <!--[form:version]--> |
|
4 | <!--[form:version]--> | |
4 | <p><%= f.text_field :name, :size => 20, :required => true %></p> |
|
5 | <p><%= f.text_field :name, :size => 20, :required => true %></p> | |
5 | <p><%= f.text_field :description, :size => 60 %></p> |
|
6 | <p><%= f.text_field :description, :size => 60 %></p> | |
6 |
<p><%= f. |
|
7 | <p><%= f.text_field :effective_date, :size => 10, :required => true %><%= calendar_for('version_effective_date') %></p> | |
7 | <!--[eoform:version]--> |
|
8 | <!--[eoform:version]--> | |
8 | </div> No newline at end of file |
|
9 | </div> |
@@ -1,291 +1,292 | |||||
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' |
|
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' | |
2 |
|
2 | |||
3 | actionview_datehelper_select_day_prefix: |
|
3 | actionview_datehelper_select_day_prefix: | |
4 | actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December |
|
4 | actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December | |
5 | actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec |
|
5 | actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec | |
6 | actionview_datehelper_select_month_prefix: |
|
6 | actionview_datehelper_select_month_prefix: | |
7 | actionview_datehelper_select_year_prefix: |
|
7 | actionview_datehelper_select_year_prefix: | |
8 | actionview_datehelper_time_in_words_day: 1 day |
|
8 | actionview_datehelper_time_in_words_day: 1 day | |
9 | actionview_datehelper_time_in_words_day_plural: %d days |
|
9 | actionview_datehelper_time_in_words_day_plural: %d days | |
10 | actionview_datehelper_time_in_words_hour_about: about an hour |
|
10 | actionview_datehelper_time_in_words_hour_about: about an hour | |
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours |
|
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours | |
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour |
|
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour | |
13 | actionview_datehelper_time_in_words_minute: 1 minute |
|
13 | actionview_datehelper_time_in_words_minute: 1 minute | |
14 | actionview_datehelper_time_in_words_minute_half: half a minute |
|
14 | actionview_datehelper_time_in_words_minute_half: half a minute | |
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute |
|
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute | |
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes |
|
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes | |
17 | actionview_datehelper_time_in_words_minute_single: 1 minute |
|
17 | actionview_datehelper_time_in_words_minute_single: 1 minute | |
18 | actionview_datehelper_time_in_words_second_less_than: less than a second |
|
18 | actionview_datehelper_time_in_words_second_less_than: less than a second | |
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds |
|
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds | |
20 | actionview_instancetag_blank_option: Bitte auserwählt |
|
20 | actionview_instancetag_blank_option: Bitte auserwählt | |
21 |
|
21 | |||
22 | activerecord_error_inclusion: ist nicht in der Liste eingeschlossen |
|
22 | activerecord_error_inclusion: ist nicht in der Liste eingeschlossen | |
23 | activerecord_error_exclusion: ist reserviert |
|
23 | activerecord_error_exclusion: ist reserviert | |
24 | activerecord_error_invalid: ist unzulässig |
|
24 | activerecord_error_invalid: ist unzulässig | |
25 | activerecord_error_confirmation: bringt nicht Bestätigung zusammen |
|
25 | activerecord_error_confirmation: bringt nicht Bestätigung zusammen | |
26 | activerecord_error_accepted: muß angenommen werden |
|
26 | activerecord_error_accepted: muß angenommen werden | |
27 | activerecord_error_empty: kann nicht leer sein |
|
27 | activerecord_error_empty: kann nicht leer sein | |
28 | activerecord_error_blank: kann nicht leer sein |
|
28 | activerecord_error_blank: kann nicht leer sein | |
29 | activerecord_error_too_long: ist zu lang |
|
29 | activerecord_error_too_long: ist zu lang | |
30 | activerecord_error_too_short: ist zu kurz |
|
30 | activerecord_error_too_short: ist zu kurz | |
31 | activerecord_error_wrong_length: ist die falsche Länge |
|
31 | activerecord_error_wrong_length: ist die falsche Länge | |
32 | activerecord_error_taken: ist bereits genommen worden |
|
32 | activerecord_error_taken: ist bereits genommen worden | |
33 | activerecord_error_not_a_number: ist nicht eine Zahl |
|
33 | activerecord_error_not_a_number: ist nicht eine Zahl | |
|
34 | #activerecord_error_not_a_date: is not a valid date | |||
34 |
|
35 | |||
35 | general_fmt_age: %d yr |
|
36 | general_fmt_age: %d yr | |
36 | general_fmt_age_plural: %d yrs |
|
37 | general_fmt_age_plural: %d yrs | |
37 | general_fmt_date: %%b %%d, %%Y (%%a) |
|
38 | general_fmt_date: %%b %%d, %%Y (%%a) | |
38 | general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p |
|
39 | general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p | |
39 | general_fmt_datetime_short: %%b %%d, %%I:%%M %%p |
|
40 | general_fmt_datetime_short: %%b %%d, %%I:%%M %%p | |
40 | general_fmt_time: %%I:%%M %%p |
|
41 | general_fmt_time: %%I:%%M %%p | |
41 | general_text_No: 'Nein' |
|
42 | general_text_No: 'Nein' | |
42 | general_text_Yes: 'Ja' |
|
43 | general_text_Yes: 'Ja' | |
43 | general_text_no: 'nein' |
|
44 | general_text_no: 'nein' | |
44 | general_text_yes: 'ja' |
|
45 | general_text_yes: 'ja' | |
45 | general_lang_de: 'Deutsch' |
|
46 | general_lang_de: 'Deutsch' | |
46 |
|
47 | |||
47 | notice_account_updated: Konto wurde erfolgreich aktualisiert. |
|
48 | notice_account_updated: Konto wurde erfolgreich aktualisiert. | |
48 | notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort |
|
49 | notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort | |
49 | notice_account_password_updated: Passwort wurde erfolgreich aktualisiert. |
|
50 | notice_account_password_updated: Passwort wurde erfolgreich aktualisiert. | |
50 | notice_account_wrong_password: Falsches Passwort |
|
51 | notice_account_wrong_password: Falsches Passwort | |
51 | notice_account_register_done: Konto wurde erfolgreich verursacht. |
|
52 | notice_account_register_done: Konto wurde erfolgreich verursacht. | |
52 | notice_account_unknown_email: Unbekannter Benutzer. |
|
53 | notice_account_unknown_email: Unbekannter Benutzer. | |
53 | notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern. |
|
54 | notice_can_t_change_password: Dieses Konto verwendet eine externe Authentisierung Quelle. Unmöglich, das Kennwort zu ändern. | |
54 | notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden. |
|
55 | notice_account_lost_email_sent: Ein email mit Anweisungen, ein neues Kennwort zu wählen ist dir geschickt worden. | |
55 | notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen. |
|
56 | notice_account_activated: Dein Konto ist aktiviert worden. Du kannst jetzt einloggen. | |
56 | notice_successful_create: Erfolgreiche Kreation. |
|
57 | notice_successful_create: Erfolgreiche Kreation. | |
57 | notice_successful_update: Erfolgreiches Update. |
|
58 | notice_successful_update: Erfolgreiches Update. | |
58 | notice_successful_delete: Erfolgreiche Auslassung. |
|
59 | notice_successful_delete: Erfolgreiche Auslassung. | |
59 | notice_successful_connection: Erfolgreicher Anschluß. |
|
60 | notice_successful_connection: Erfolgreicher Anschluß. | |
60 | notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden. |
|
61 | notice_file_not_found: Erbetene Akte besteht nicht oder ist gelöscht worden. | |
61 | notice_locking_conflict: Data have been updated by another user. |
|
62 | notice_locking_conflict: Data have been updated by another user. | |
62 |
|
63 | |||
63 | gui_validation_error: 1 Störung |
|
64 | gui_validation_error: 1 Störung | |
64 | gui_validation_error_plural: %d Störungen |
|
65 | gui_validation_error_plural: %d Störungen | |
65 |
|
66 | |||
66 | field_name: Name |
|
67 | field_name: Name | |
67 | field_description: Beschreibung |
|
68 | field_description: Beschreibung | |
68 | field_summary: Zusammenfassung |
|
69 | field_summary: Zusammenfassung | |
69 | field_is_required: Erforderlich |
|
70 | field_is_required: Erforderlich | |
70 | field_firstname: Vorname |
|
71 | field_firstname: Vorname | |
71 | field_lastname: Nachname |
|
72 | field_lastname: Nachname | |
72 | field_mail: Email |
|
73 | field_mail: Email | |
73 | field_filename: Datei |
|
74 | field_filename: Datei | |
74 | field_filesize: Grootte |
|
75 | field_filesize: Grootte | |
75 | field_downloads: Downloads |
|
76 | field_downloads: Downloads | |
76 | field_author: Autor |
|
77 | field_author: Autor | |
77 | field_created_on: Angelegt |
|
78 | field_created_on: Angelegt | |
78 | field_updated_on: aktualisiert |
|
79 | field_updated_on: aktualisiert | |
79 | field_field_format: Format |
|
80 | field_field_format: Format | |
80 | field_is_for_all: Für alle Projekte |
|
81 | field_is_for_all: Für alle Projekte | |
81 | field_possible_values: Mögliche Werte |
|
82 | field_possible_values: Mögliche Werte | |
82 | field_regexp: Regulärer Ausdruck |
|
83 | field_regexp: Regulärer Ausdruck | |
83 | field_min_length: Minimale Länge |
|
84 | field_min_length: Minimale Länge | |
84 | field_max_length: Maximale Länge |
|
85 | field_max_length: Maximale Länge | |
85 | field_value: Wert |
|
86 | field_value: Wert | |
86 | field_category: Kategorie |
|
87 | field_category: Kategorie | |
87 | field_title: Títel |
|
88 | field_title: Títel | |
88 | field_project: Projekt |
|
89 | field_project: Projekt | |
89 | #field_issue: Issue |
|
90 | #field_issue: Issue | |
90 | field_status: Status |
|
91 | field_status: Status | |
91 | field_notes: Anmerkungen |
|
92 | field_notes: Anmerkungen | |
92 | field_is_closed: Problem erledigt |
|
93 | field_is_closed: Problem erledigt | |
93 | #field_is_default: Default status |
|
94 | #field_is_default: Default status | |
94 | field_html_color: Farbe |
|
95 | field_html_color: Farbe | |
95 | field_tracker: Tracker |
|
96 | field_tracker: Tracker | |
96 | field_subject: Thema |
|
97 | field_subject: Thema | |
97 | #field_due_date: Due date |
|
98 | #field_due_date: Due date | |
98 | field_assigned_to: Zugewiesen an |
|
99 | field_assigned_to: Zugewiesen an | |
99 | field_priority: Priorität |
|
100 | field_priority: Priorität | |
100 | field_fixed_version: Erledigt in Version |
|
101 | field_fixed_version: Erledigt in Version | |
101 | field_user: Benutzer |
|
102 | field_user: Benutzer | |
102 | field_role: Rolle |
|
103 | field_role: Rolle | |
103 | field_homepage: Startseite |
|
104 | field_homepage: Startseite | |
104 | field_is_public: Öffentlich |
|
105 | field_is_public: Öffentlich | |
105 | #field_parent: Subprojekt von |
|
106 | #field_parent: Subprojekt von | |
106 | field_is_in_chlog: Ansicht der Issues in der Historie |
|
107 | field_is_in_chlog: Ansicht der Issues in der Historie | |
107 | field_login: Mitgliedsname |
|
108 | field_login: Mitgliedsname | |
108 | field_mail_notification: Mailbenachrichtigung |
|
109 | field_mail_notification: Mailbenachrichtigung | |
109 | #field_admin: Administrator |
|
110 | #field_admin: Administrator | |
110 | field_locked: Gesperrt |
|
111 | field_locked: Gesperrt | |
111 | field_last_login_on: Letzte Anmeldung |
|
112 | field_last_login_on: Letzte Anmeldung | |
112 | field_language: Sprache |
|
113 | field_language: Sprache | |
113 | field_effective_date: Datum |
|
114 | field_effective_date: Datum | |
114 | field_password: Passwort |
|
115 | field_password: Passwort | |
115 | field_new_password: Neues Passwort |
|
116 | field_new_password: Neues Passwort | |
116 | field_password_confirmation: Bestätigung |
|
117 | field_password_confirmation: Bestätigung | |
117 | field_version: Version |
|
118 | field_version: Version | |
118 | field_type: Typ |
|
119 | field_type: Typ | |
119 | field_host: Host |
|
120 | field_host: Host | |
120 | #field_port: Port |
|
121 | #field_port: Port | |
121 | #field_account: Account |
|
122 | #field_account: Account | |
122 | #field_base_dn: Base DN |
|
123 | #field_base_dn: Base DN | |
123 | #field_attr_login: Login attribute |
|
124 | #field_attr_login: Login attribute | |
124 | #field_attr_firstname: Firstname attribute |
|
125 | #field_attr_firstname: Firstname attribute | |
125 | #field_attr_lastname: Lastname attribute |
|
126 | #field_attr_lastname: Lastname attribute | |
126 | #field_attr_mail: Email attribute |
|
127 | #field_attr_mail: Email attribute | |
127 | #field_onthefly: On-the-fly user creation |
|
128 | #field_onthefly: On-the-fly user creation | |
128 |
|
129 | |||
129 | label_user: Benutzer |
|
130 | label_user: Benutzer | |
130 | label_user_plural: Benutzer |
|
131 | label_user_plural: Benutzer | |
131 | label_user_new: Neuer Benutzer |
|
132 | label_user_new: Neuer Benutzer | |
132 | label_project: Projekt |
|
133 | label_project: Projekt | |
133 | label_project_new: Neues Projekt |
|
134 | label_project_new: Neues Projekt | |
134 | label_project_plural: Projekte |
|
135 | label_project_plural: Projekte | |
135 | #label_project_latest: Latest projects |
|
136 | #label_project_latest: Latest projects | |
136 | #label_issue: Issue |
|
137 | #label_issue: Issue | |
137 | #label_issue_new: New issue |
|
138 | #label_issue_new: New issue | |
138 | #label_issue_plural: Issues |
|
139 | #label_issue_plural: Issues | |
139 | #label_issue_view_all: View all issues |
|
140 | #label_issue_view_all: View all issues | |
140 | label_document: Dokument |
|
141 | label_document: Dokument | |
141 | label_document_new: Neues Dokument |
|
142 | label_document_new: Neues Dokument | |
142 | label_document_plural: Dokumente |
|
143 | label_document_plural: Dokumente | |
143 | label_role: Rolle |
|
144 | label_role: Rolle | |
144 | label_role_plural: Rollen |
|
145 | label_role_plural: Rollen | |
145 | label_role_new: Neue Rolle |
|
146 | label_role_new: Neue Rolle | |
146 | label_role_and_permissions: Rollen und Rechte |
|
147 | label_role_and_permissions: Rollen und Rechte | |
147 | label_member: Mitglied |
|
148 | label_member: Mitglied | |
148 | label_member_new: Neues Mitglied |
|
149 | label_member_new: Neues Mitglied | |
149 | label_member_plural: Mitglieder |
|
150 | label_member_plural: Mitglieder | |
150 | label_tracker: Tracker |
|
151 | label_tracker: Tracker | |
151 | label_tracker_plural: Tracker |
|
152 | label_tracker_plural: Tracker | |
152 | label_tracker_new: Neuer Tracker |
|
153 | label_tracker_new: Neuer Tracker | |
153 | label_workflow: Workflow |
|
154 | label_workflow: Workflow | |
154 | label_issue_status: Problem Status |
|
155 | label_issue_status: Problem Status | |
155 | label_issue_status_plural: Problem Stati |
|
156 | label_issue_status_plural: Problem Stati | |
156 | label_issue_status_new: Neuer Status |
|
157 | label_issue_status_new: Neuer Status | |
157 | label_issue_category: Problem Kategorie |
|
158 | label_issue_category: Problem Kategorie | |
158 | label_issue_category_plural: Problem Kategorien |
|
159 | label_issue_category_plural: Problem Kategorien | |
159 | label_issue_category_new: Neue Kategorie |
|
160 | label_issue_category_new: Neue Kategorie | |
160 | label_custom_field: Benutzerdefiniertes Feld |
|
161 | label_custom_field: Benutzerdefiniertes Feld | |
161 | label_custom_field_plural: Benutzerdefinierte Felder |
|
162 | label_custom_field_plural: Benutzerdefinierte Felder | |
162 | label_custom_field_new: Neues Feld |
|
163 | label_custom_field_new: Neues Feld | |
163 | label_enumerations: Enumerationen |
|
164 | label_enumerations: Enumerationen | |
164 | label_enumeration_new: Neuer Wert |
|
165 | label_enumeration_new: Neuer Wert | |
165 | label_information: Information |
|
166 | label_information: Information | |
166 | label_information_plural: Informationen |
|
167 | label_information_plural: Informationen | |
167 | #label_please_login: Please login |
|
168 | #label_please_login: Please login | |
168 | label_register: Anmelden |
|
169 | label_register: Anmelden | |
169 | label_password_lost: Passwort vergessen |
|
170 | label_password_lost: Passwort vergessen | |
170 | label_home: Hauptseite |
|
171 | label_home: Hauptseite | |
171 | label_my_page: Meine Seite |
|
172 | label_my_page: Meine Seite | |
172 | label_my_account: Mein Konto |
|
173 | label_my_account: Mein Konto | |
173 | label_my_projects: Meine Projekte |
|
174 | label_my_projects: Meine Projekte | |
174 | label_administration: Administration |
|
175 | label_administration: Administration | |
175 | label_login: Einloggen |
|
176 | label_login: Einloggen | |
176 | label_logout: Abmelden |
|
177 | label_logout: Abmelden | |
177 | label_help: Hilfe |
|
178 | label_help: Hilfe | |
178 | label_reported_issues: Gemeldete Issues |
|
179 | label_reported_issues: Gemeldete Issues | |
179 | label_assigned_to_me_issues: Mir zugewiesen |
|
180 | label_assigned_to_me_issues: Mir zugewiesen | |
180 | label_last_login: Letzte Anmeldung |
|
181 | label_last_login: Letzte Anmeldung | |
181 | #label_last_updates: Last updated |
|
182 | #label_last_updates: Last updated | |
182 | #label_last_updates_plural: %d last updated |
|
183 | #label_last_updates_plural: %d last updated | |
183 | label_registered_on: Angemeldet am |
|
184 | label_registered_on: Angemeldet am | |
184 | label_activity: Aktivität |
|
185 | label_activity: Aktivität | |
185 | label_new: Neue |
|
186 | label_new: Neue | |
186 | label_logged_as: Angemeldet als |
|
187 | label_logged_as: Angemeldet als | |
187 | #label_environment: Environment |
|
188 | #label_environment: Environment | |
188 | label_authentication: Authentisierung |
|
189 | label_authentication: Authentisierung | |
189 | #label_auth_source: Authentification mode |
|
190 | #label_auth_source: Authentification mode | |
190 | #label_auth_source_new: New authentication mode |
|
191 | #label_auth_source_new: New authentication mode | |
191 | #label_auth_source_plural: Authentification modes |
|
192 | #label_auth_source_plural: Authentification modes | |
192 | #label_subproject: Subproject |
|
193 | #label_subproject: Subproject | |
193 | #label_subproject_plural: Subprojects |
|
194 | #label_subproject_plural: Subprojects | |
194 | label_min_max_length: Min - Max Länge |
|
195 | label_min_max_length: Min - Max Länge | |
195 | label_list: Liste |
|
196 | label_list: Liste | |
196 | label_date: Date |
|
197 | label_date: Date | |
197 | label_integer: Zahl |
|
198 | label_integer: Zahl | |
198 | label_boolean: Boolesch |
|
199 | label_boolean: Boolesch | |
199 | #label_string: String |
|
200 | #label_string: String | |
200 | label_text: Text |
|
201 | label_text: Text | |
201 | label_attribute: Attribut |
|
202 | label_attribute: Attribut | |
202 | label_attribute_plural: Attribute |
|
203 | label_attribute_plural: Attribute | |
203 | #label_download: %d Download |
|
204 | #label_download: %d Download | |
204 | #label_download_plural: %d Downloads |
|
205 | #label_download_plural: %d Downloads | |
205 | label_no_data: Nichts anzuzeigen |
|
206 | label_no_data: Nichts anzuzeigen | |
206 | label_change_status: Statuswechsel |
|
207 | label_change_status: Statuswechsel | |
207 | label_history: Historie |
|
208 | label_history: Historie | |
208 | label_attachment: Datei |
|
209 | label_attachment: Datei | |
209 | label_attachment_new: Neue Datei |
|
210 | label_attachment_new: Neue Datei | |
210 | #label_attachment_delete: Delete file |
|
211 | #label_attachment_delete: Delete file | |
211 | label_attachment_plural: Dateien |
|
212 | label_attachment_plural: Dateien | |
212 | label_report: Bericht |
|
213 | label_report: Bericht | |
213 | label_report_plural: Berichte |
|
214 | label_report_plural: Berichte | |
214 | #label_news: Neuigkeiten |
|
215 | #label_news: Neuigkeiten | |
215 | #label_news_new: Add news |
|
216 | #label_news_new: Add news | |
216 | #label_news_plural: Neuigkeiten |
|
217 | #label_news_plural: Neuigkeiten | |
217 | label_news_latest: Letzte Neuigkeiten |
|
218 | label_news_latest: Letzte Neuigkeiten | |
218 | label_news_view_all: Alle Neuigkeiten anzeigen |
|
219 | label_news_view_all: Alle Neuigkeiten anzeigen | |
219 | label_change_log: Change log |
|
220 | label_change_log: Change log | |
220 | label_settings: Konfiguration |
|
221 | label_settings: Konfiguration | |
221 | label_overview: Übersicht |
|
222 | label_overview: Übersicht | |
222 | label_version: Version |
|
223 | label_version: Version | |
223 | label_version_new: Neue Version |
|
224 | label_version_new: Neue Version | |
224 | label_version_plural: Versionen |
|
225 | label_version_plural: Versionen | |
225 | label_confirmation: Bestätigung |
|
226 | label_confirmation: Bestätigung | |
226 | #label_export_csv: Export to CSV |
|
227 | #label_export_csv: Export to CSV | |
227 | label_read: Lesen... |
|
228 | label_read: Lesen... | |
228 | label_public_projects: Öffentliche Projekte |
|
229 | label_public_projects: Öffentliche Projekte | |
229 | #label_open_issues: Open |
|
230 | #label_open_issues: Open | |
230 | #label_open_issues_plural: Open |
|
231 | #label_open_issues_plural: Open | |
231 | #label_closed_issues: Closed |
|
232 | #label_closed_issues: Closed | |
232 | #label_closed_issues_plural: Closed |
|
233 | #label_closed_issues_plural: Closed | |
233 | label_total: Gesamtzahl |
|
234 | label_total: Gesamtzahl | |
234 | label_permissions: Berechtigungen |
|
235 | label_permissions: Berechtigungen | |
235 | label_current_status: Gegenwärtiger Status |
|
236 | label_current_status: Gegenwärtiger Status | |
236 | label_new_statuses_allowed: Neue Status gewährten |
|
237 | label_new_statuses_allowed: Neue Status gewährten | |
237 | label_all: Alle |
|
238 | label_all: Alle | |
238 | label_none: Kein |
|
239 | label_none: Kein | |
239 | label_next: Weiter |
|
240 | label_next: Weiter | |
240 | label_previous: Zurück |
|
241 | label_previous: Zurück | |
241 | label_used_by: Benutzt von |
|
242 | label_used_by: Benutzt von | |
242 |
|
243 | |||
243 | button_login: Einloggen |
|
244 | button_login: Einloggen | |
244 | button_submit: Einreichen |
|
245 | button_submit: Einreichen | |
245 | button_save: Speichern |
|
246 | button_save: Speichern | |
246 | button_check_all: Alles auswählen |
|
247 | button_check_all: Alles auswählen | |
247 | button_uncheck_all: Alles abwählen |
|
248 | button_uncheck_all: Alles abwählen | |
248 | button_delete: Löschen |
|
249 | button_delete: Löschen | |
249 | button_create: Anlegen |
|
250 | button_create: Anlegen | |
250 | button_test: Testen |
|
251 | button_test: Testen | |
251 | button_edit: Bearbeiten |
|
252 | button_edit: Bearbeiten | |
252 | button_add: Hinzufügen |
|
253 | button_add: Hinzufügen | |
253 | button_change: Wechseln |
|
254 | button_change: Wechseln | |
254 | button_apply: Anwenden |
|
255 | button_apply: Anwenden | |
255 | button_clear: Zurücksetzen |
|
256 | button_clear: Zurücksetzen | |
256 | button_lock: Verriegeln |
|
257 | button_lock: Verriegeln | |
257 | button_unlock: Entriegeln |
|
258 | button_unlock: Entriegeln | |
258 | button_download: Fernzuladen |
|
259 | button_download: Fernzuladen | |
259 | button_list: Aufzulisten |
|
260 | button_list: Aufzulisten | |
260 | button_view: Siehe |
|
261 | button_view: Siehe | |
261 |
|
262 | |||
262 | text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll. |
|
263 | text_select_mail_notifications: Aktionen für die Mailbenachrichtigung aktiviert werden soll. | |
263 | text_regexp_info: eg. ^[A-Z0-9]+$ |
|
264 | text_regexp_info: eg. ^[A-Z0-9]+$ | |
264 | text_min_max_length_info: 0 heisst keine Beschränkung |
|
265 | text_min_max_length_info: 0 heisst keine Beschränkung | |
265 | #text_possible_values_info: values separated with | |
|
266 | #text_possible_values_info: values separated with | | |
266 | text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ? |
|
267 | text_project_destroy_confirmation: Sind sie sicher, daß sie das Projekt löschen wollen ? | |
267 | text_workflow_edit: Auswahl Workflow zum Bearbeiten |
|
268 | text_workflow_edit: Auswahl Workflow zum Bearbeiten | |
268 | text_are_you_sure: Sind sie sicher ? |
|
269 | text_are_you_sure: Sind sie sicher ? | |
269 |
|
270 | |||
270 | default_role_manager: Manager |
|
271 | default_role_manager: Manager | |
271 | default_role_developper: Developer |
|
272 | default_role_developper: Developer | |
272 | default_role_reporter: Reporter |
|
273 | default_role_reporter: Reporter | |
273 | default_tracker_bug: Fehler |
|
274 | default_tracker_bug: Fehler | |
274 | default_tracker_feature: Feature |
|
275 | default_tracker_feature: Feature | |
275 | default_tracker_support: Support |
|
276 | default_tracker_support: Support | |
276 | default_issue_status_new: Neu |
|
277 | default_issue_status_new: Neu | |
277 | default_issue_status_assigned: Zugewiesen |
|
278 | default_issue_status_assigned: Zugewiesen | |
278 | default_issue_status_resolved: Gelöst |
|
279 | default_issue_status_resolved: Gelöst | |
279 | default_issue_status_feedback: Feedback |
|
280 | default_issue_status_feedback: Feedback | |
280 | default_issue_status_closed: Erledigt |
|
281 | default_issue_status_closed: Erledigt | |
281 | default_issue_status_rejected: Abgewiesen |
|
282 | default_issue_status_rejected: Abgewiesen | |
282 | default_doc_category_user: Benutzerdokumentation |
|
283 | default_doc_category_user: Benutzerdokumentation | |
283 | default_doc_category_tech: Technische Dokumentation |
|
284 | default_doc_category_tech: Technische Dokumentation | |
284 | default_priority_low: Niedrig |
|
285 | default_priority_low: Niedrig | |
285 | default_priority_normal: Normal |
|
286 | default_priority_normal: Normal | |
286 | default_priority_high: Hoch |
|
287 | default_priority_high: Hoch | |
287 | default_priority_urgent: Dringend |
|
288 | default_priority_urgent: Dringend | |
288 | default_priority_immediate: Sofort |
|
289 | default_priority_immediate: Sofort | |
289 |
|
290 | |||
290 | enumeration_issue_priorities: Issue-Prioritäten |
|
291 | enumeration_issue_priorities: Issue-Prioritäten | |
291 | enumeration_doc_categories: Dokumentenkategorien |
|
292 | enumeration_doc_categories: Dokumentenkategorien |
@@ -1,291 +1,292 | |||||
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' |
|
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' | |
2 |
|
2 | |||
3 | actionview_datehelper_select_day_prefix: |
|
3 | actionview_datehelper_select_day_prefix: | |
4 | actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December |
|
4 | actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December | |
5 | actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec |
|
5 | actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec | |
6 | actionview_datehelper_select_month_prefix: |
|
6 | actionview_datehelper_select_month_prefix: | |
7 | actionview_datehelper_select_year_prefix: |
|
7 | actionview_datehelper_select_year_prefix: | |
8 | actionview_datehelper_time_in_words_day: 1 day |
|
8 | actionview_datehelper_time_in_words_day: 1 day | |
9 | actionview_datehelper_time_in_words_day_plural: %d days |
|
9 | actionview_datehelper_time_in_words_day_plural: %d days | |
10 | actionview_datehelper_time_in_words_hour_about: about an hour |
|
10 | actionview_datehelper_time_in_words_hour_about: about an hour | |
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours |
|
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours | |
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour |
|
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour | |
13 | actionview_datehelper_time_in_words_minute: 1 minute |
|
13 | actionview_datehelper_time_in_words_minute: 1 minute | |
14 | actionview_datehelper_time_in_words_minute_half: half a minute |
|
14 | actionview_datehelper_time_in_words_minute_half: half a minute | |
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute |
|
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute | |
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes |
|
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes | |
17 | actionview_datehelper_time_in_words_minute_single: 1 minute |
|
17 | actionview_datehelper_time_in_words_minute_single: 1 minute | |
18 | actionview_datehelper_time_in_words_second_less_than: less than a second |
|
18 | actionview_datehelper_time_in_words_second_less_than: less than a second | |
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds |
|
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds | |
20 | actionview_instancetag_blank_option: Please select |
|
20 | actionview_instancetag_blank_option: Please select | |
21 |
|
21 | |||
22 | activerecord_error_inclusion: is not included in the list |
|
22 | activerecord_error_inclusion: is not included in the list | |
23 | activerecord_error_exclusion: is reserved |
|
23 | activerecord_error_exclusion: is reserved | |
24 | activerecord_error_invalid: is invalid |
|
24 | activerecord_error_invalid: is invalid | |
25 | activerecord_error_confirmation: doesn't match confirmation |
|
25 | activerecord_error_confirmation: doesn't match confirmation | |
26 | activerecord_error_accepted: must be accepted |
|
26 | activerecord_error_accepted: must be accepted | |
27 | activerecord_error_empty: can't be empty |
|
27 | activerecord_error_empty: can't be empty | |
28 | activerecord_error_blank: can't be blank |
|
28 | activerecord_error_blank: can't be blank | |
29 | activerecord_error_too_long: is too long |
|
29 | activerecord_error_too_long: is too long | |
30 | activerecord_error_too_short: is too short |
|
30 | activerecord_error_too_short: is too short | |
31 | activerecord_error_wrong_length: is the wrong length |
|
31 | activerecord_error_wrong_length: is the wrong length | |
32 | activerecord_error_taken: has already been taken |
|
32 | activerecord_error_taken: has already been taken | |
33 | activerecord_error_not_a_number: is not a number |
|
33 | activerecord_error_not_a_number: is not a number | |
|
34 | activerecord_error_not_a_date: is not a valid date | |||
34 |
|
35 | |||
35 | general_fmt_age: %d yr |
|
36 | general_fmt_age: %d yr | |
36 | general_fmt_age_plural: %d yrs |
|
37 | general_fmt_age_plural: %d yrs | |
37 | general_fmt_date: %%b %%d, %%Y (%%a) |
|
38 | general_fmt_date: %%b %%d, %%Y (%%a) | |
38 | general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p |
|
39 | general_fmt_datetime: %%b %%d, %%Y (%%a), %%I:%%M %%p | |
39 | general_fmt_datetime_short: %%b %%d, %%I:%%M %%p |
|
40 | general_fmt_datetime_short: %%b %%d, %%I:%%M %%p | |
40 | general_fmt_time: %%I:%%M %%p |
|
41 | general_fmt_time: %%I:%%M %%p | |
41 | general_text_No: 'No' |
|
42 | general_text_No: 'No' | |
42 | general_text_Yes: 'Yes' |
|
43 | general_text_Yes: 'Yes' | |
43 | general_text_no: 'no' |
|
44 | general_text_no: 'no' | |
44 | general_text_yes: 'yes' |
|
45 | general_text_yes: 'yes' | |
45 | general_lang_en: 'English' |
|
46 | general_lang_en: 'English' | |
46 |
|
47 | |||
47 | notice_account_updated: Account was successfully updated. |
|
48 | notice_account_updated: Account was successfully updated. | |
48 | notice_account_invalid_creditentials: Invalid user or password |
|
49 | notice_account_invalid_creditentials: Invalid user or password | |
49 | notice_account_password_updated: Password was successfully updated. |
|
50 | notice_account_password_updated: Password was successfully updated. | |
50 | notice_account_wrong_password: Wrong password |
|
51 | notice_account_wrong_password: Wrong password | |
51 | notice_account_register_done: Account was successfully created. |
|
52 | notice_account_register_done: Account was successfully created. | |
52 | notice_account_unknown_email: Unknown user. |
|
53 | notice_account_unknown_email: Unknown user. | |
53 | notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. |
|
54 | notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. | |
54 | notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. |
|
55 | notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. | |
55 | notice_account_activated: Your account has been activated. You can now log in. |
|
56 | notice_account_activated: Your account has been activated. You can now log in. | |
56 | notice_successful_create: Successful creation. |
|
57 | notice_successful_create: Successful creation. | |
57 | notice_successful_update: Successful update. |
|
58 | notice_successful_update: Successful update. | |
58 | notice_successful_delete: Successful deletion. |
|
59 | notice_successful_delete: Successful deletion. | |
59 | notice_successful_connection: Successful connection. |
|
60 | notice_successful_connection: Successful connection. | |
60 | notice_file_not_found: Requested file doesn't exist or has been deleted. |
|
61 | notice_file_not_found: Requested file doesn't exist or has been deleted. | |
61 | notice_locking_conflict: Data have been updated by another user. |
|
62 | notice_locking_conflict: Data have been updated by another user. | |
62 |
|
63 | |||
63 | gui_validation_error: 1 error |
|
64 | gui_validation_error: 1 error | |
64 | gui_validation_error_plural: %d errors |
|
65 | gui_validation_error_plural: %d errors | |
65 |
|
66 | |||
66 | field_name: Name |
|
67 | field_name: Name | |
67 | field_description: Description |
|
68 | field_description: Description | |
68 | field_summary: Summary |
|
69 | field_summary: Summary | |
69 | field_is_required: Required |
|
70 | field_is_required: Required | |
70 | field_firstname: Firstname |
|
71 | field_firstname: Firstname | |
71 | field_lastname: Lastname |
|
72 | field_lastname: Lastname | |
72 | field_mail: Email |
|
73 | field_mail: Email | |
73 | field_filename: File |
|
74 | field_filename: File | |
74 | field_filesize: Size |
|
75 | field_filesize: Size | |
75 | field_downloads: Downloads |
|
76 | field_downloads: Downloads | |
76 | field_author: Author |
|
77 | field_author: Author | |
77 | field_created_on: Created |
|
78 | field_created_on: Created | |
78 | field_updated_on: Updated |
|
79 | field_updated_on: Updated | |
79 | field_field_format: Format |
|
80 | field_field_format: Format | |
80 | field_is_for_all: For all projects |
|
81 | field_is_for_all: For all projects | |
81 | field_possible_values: Possible values |
|
82 | field_possible_values: Possible values | |
82 | field_regexp: Regular expression |
|
83 | field_regexp: Regular expression | |
83 | field_min_length: Minimum length |
|
84 | field_min_length: Minimum length | |
84 | field_max_length: Maximum length |
|
85 | field_max_length: Maximum length | |
85 | field_value: Value |
|
86 | field_value: Value | |
86 | field_category: Catogory |
|
87 | field_category: Catogory | |
87 | field_title: Title |
|
88 | field_title: Title | |
88 | field_project: Project |
|
89 | field_project: Project | |
89 | field_issue: Issue |
|
90 | field_issue: Issue | |
90 | field_status: Status |
|
91 | field_status: Status | |
91 | field_notes: Notes |
|
92 | field_notes: Notes | |
92 | field_is_closed: Issue closed |
|
93 | field_is_closed: Issue closed | |
93 | field_is_default: Default status |
|
94 | field_is_default: Default status | |
94 | field_html_color: Color |
|
95 | field_html_color: Color | |
95 | field_tracker: Tracker |
|
96 | field_tracker: Tracker | |
96 | field_subject: Subject |
|
97 | field_subject: Subject | |
97 | field_due_date: Due date |
|
98 | field_due_date: Due date | |
98 | field_assigned_to: Assigned to |
|
99 | field_assigned_to: Assigned to | |
99 | field_priority: Priority |
|
100 | field_priority: Priority | |
100 | field_fixed_version: Fixed version |
|
101 | field_fixed_version: Fixed version | |
101 | field_user: User |
|
102 | field_user: User | |
102 | field_role: Role |
|
103 | field_role: Role | |
103 | field_homepage: Homepage |
|
104 | field_homepage: Homepage | |
104 | field_is_public: Public |
|
105 | field_is_public: Public | |
105 | field_parent: Subproject of |
|
106 | field_parent: Subproject of | |
106 | field_is_in_chlog: Issues displayed in changelog |
|
107 | field_is_in_chlog: Issues displayed in changelog | |
107 | field_login: Login |
|
108 | field_login: Login | |
108 | field_mail_notification: Mail notifications |
|
109 | field_mail_notification: Mail notifications | |
109 | field_admin: Administrator |
|
110 | field_admin: Administrator | |
110 | field_locked: Locked |
|
111 | field_locked: Locked | |
111 | field_last_login_on: Last connection |
|
112 | field_last_login_on: Last connection | |
112 | field_language: Language |
|
113 | field_language: Language | |
113 | field_effective_date: Date |
|
114 | field_effective_date: Date | |
114 | field_password: Password |
|
115 | field_password: Password | |
115 | field_new_password: New password |
|
116 | field_new_password: New password | |
116 | field_password_confirmation: Confirmation |
|
117 | field_password_confirmation: Confirmation | |
117 | field_version: Version |
|
118 | field_version: Version | |
118 | field_type: Type |
|
119 | field_type: Type | |
119 | field_host: Host |
|
120 | field_host: Host | |
120 | field_port: Port |
|
121 | field_port: Port | |
121 | field_account: Account |
|
122 | field_account: Account | |
122 | field_base_dn: Base DN |
|
123 | field_base_dn: Base DN | |
123 | field_attr_login: Login attribute |
|
124 | field_attr_login: Login attribute | |
124 | field_attr_firstname: Firstname attribute |
|
125 | field_attr_firstname: Firstname attribute | |
125 | field_attr_lastname: Lastname attribute |
|
126 | field_attr_lastname: Lastname attribute | |
126 | field_attr_mail: Email attribute |
|
127 | field_attr_mail: Email attribute | |
127 | field_onthefly: On-the-fly user creation |
|
128 | field_onthefly: On-the-fly user creation | |
128 |
|
129 | |||
129 | label_user: User |
|
130 | label_user: User | |
130 | label_user_plural: Users |
|
131 | label_user_plural: Users | |
131 | label_user_new: New user |
|
132 | label_user_new: New user | |
132 | label_project: Project |
|
133 | label_project: Project | |
133 | label_project_new: New project |
|
134 | label_project_new: New project | |
134 | label_project_plural: Projects |
|
135 | label_project_plural: Projects | |
135 | label_project_latest: Latest projects |
|
136 | label_project_latest: Latest projects | |
136 | label_issue: Issue |
|
137 | label_issue: Issue | |
137 | label_issue_new: New issue |
|
138 | label_issue_new: New issue | |
138 | label_issue_plural: Issues |
|
139 | label_issue_plural: Issues | |
139 | label_issue_view_all: View all issues |
|
140 | label_issue_view_all: View all issues | |
140 | label_document: Document |
|
141 | label_document: Document | |
141 | label_document_new: New document |
|
142 | label_document_new: New document | |
142 | label_document_plural: Documents |
|
143 | label_document_plural: Documents | |
143 | label_role: Role |
|
144 | label_role: Role | |
144 | label_role_plural: Roles |
|
145 | label_role_plural: Roles | |
145 | label_role_new: New role |
|
146 | label_role_new: New role | |
146 | label_role_and_permissions: Roles and permissions |
|
147 | label_role_and_permissions: Roles and permissions | |
147 | label_member: Member |
|
148 | label_member: Member | |
148 | label_member_new: New member |
|
149 | label_member_new: New member | |
149 | label_member_plural: Members |
|
150 | label_member_plural: Members | |
150 | label_tracker: Tracker |
|
151 | label_tracker: Tracker | |
151 | label_tracker_plural: Trackers |
|
152 | label_tracker_plural: Trackers | |
152 | label_tracker_new: New tracker |
|
153 | label_tracker_new: New tracker | |
153 | label_workflow: Workflow |
|
154 | label_workflow: Workflow | |
154 | label_issue_status: Issue status |
|
155 | label_issue_status: Issue status | |
155 | label_issue_status_plural: Issue statuses |
|
156 | label_issue_status_plural: Issue statuses | |
156 | label_issue_status_new: New status |
|
157 | label_issue_status_new: New status | |
157 | label_issue_category: Issue category |
|
158 | label_issue_category: Issue category | |
158 | label_issue_category_plural: Issue categories |
|
159 | label_issue_category_plural: Issue categories | |
159 | label_issue_category_new: New category |
|
160 | label_issue_category_new: New category | |
160 | label_custom_field: Custom field |
|
161 | label_custom_field: Custom field | |
161 | label_custom_field_plural: Custom fields |
|
162 | label_custom_field_plural: Custom fields | |
162 | label_custom_field_new: New custom field |
|
163 | label_custom_field_new: New custom field | |
163 | label_enumerations: Enumerations |
|
164 | label_enumerations: Enumerations | |
164 | label_enumeration_new: New value |
|
165 | label_enumeration_new: New value | |
165 | label_information: Information |
|
166 | label_information: Information | |
166 | label_information_plural: Information |
|
167 | label_information_plural: Information | |
167 | label_please_login: Please login |
|
168 | label_please_login: Please login | |
168 | label_register: Register |
|
169 | label_register: Register | |
169 | label_password_lost: Lost password |
|
170 | label_password_lost: Lost password | |
170 | label_home: Home |
|
171 | label_home: Home | |
171 | label_my_page: My page |
|
172 | label_my_page: My page | |
172 | label_my_account: My account |
|
173 | label_my_account: My account | |
173 | label_my_projects: My projects |
|
174 | label_my_projects: My projects | |
174 | label_administration: Administration |
|
175 | label_administration: Administration | |
175 | label_login: Login |
|
176 | label_login: Login | |
176 | label_logout: Logout |
|
177 | label_logout: Logout | |
177 | label_help: Help |
|
178 | label_help: Help | |
178 | label_reported_issues: Reported issues |
|
179 | label_reported_issues: Reported issues | |
179 | label_assigned_to_me_issues: Issues assigned to me |
|
180 | label_assigned_to_me_issues: Issues assigned to me | |
180 | label_last_login: Last connection |
|
181 | label_last_login: Last connection | |
181 | label_last_updates: Last updated |
|
182 | label_last_updates: Last updated | |
182 | label_last_updates_plural: %d last updated |
|
183 | label_last_updates_plural: %d last updated | |
183 | label_registered_on: Registered on |
|
184 | label_registered_on: Registered on | |
184 | label_activity: Activity |
|
185 | label_activity: Activity | |
185 | label_new: New |
|
186 | label_new: New | |
186 | label_logged_as: Logged as |
|
187 | label_logged_as: Logged as | |
187 | label_environment: Environment |
|
188 | label_environment: Environment | |
188 | label_authentication: Authentication |
|
189 | label_authentication: Authentication | |
189 | label_auth_source: Authentification mode |
|
190 | label_auth_source: Authentification mode | |
190 | label_auth_source_new: New authentication mode |
|
191 | label_auth_source_new: New authentication mode | |
191 | label_auth_source_plural: Authentification modes |
|
192 | label_auth_source_plural: Authentification modes | |
192 | label_subproject: Subproject |
|
193 | label_subproject: Subproject | |
193 | label_subproject_plural: Subprojects |
|
194 | label_subproject_plural: Subprojects | |
194 | label_min_max_length: Min - Max length |
|
195 | label_min_max_length: Min - Max length | |
195 | label_list: List |
|
196 | label_list: List | |
196 | label_date: Date |
|
197 | label_date: Date | |
197 | label_integer: Integer |
|
198 | label_integer: Integer | |
198 | label_boolean: Boolean |
|
199 | label_boolean: Boolean | |
199 | label_string: String |
|
200 | label_string: String | |
200 | label_text: Text |
|
201 | label_text: Text | |
201 | label_attribute: Attribute |
|
202 | label_attribute: Attribute | |
202 | label_attribute_plural: Attributes |
|
203 | label_attribute_plural: Attributes | |
203 | label_download: %d Download |
|
204 | label_download: %d Download | |
204 | label_download_plural: %d Downloads |
|
205 | label_download_plural: %d Downloads | |
205 | label_no_data: No data to display |
|
206 | label_no_data: No data to display | |
206 | label_change_status: Change status |
|
207 | label_change_status: Change status | |
207 | label_history: History |
|
208 | label_history: History | |
208 | label_attachment: File |
|
209 | label_attachment: File | |
209 | label_attachment_new: New file |
|
210 | label_attachment_new: New file | |
210 | label_attachment_delete: Delete file |
|
211 | label_attachment_delete: Delete file | |
211 | label_attachment_plural: Files |
|
212 | label_attachment_plural: Files | |
212 | label_report: Report |
|
213 | label_report: Report | |
213 | label_report_plural: Reports |
|
214 | label_report_plural: Reports | |
214 | label_news: News |
|
215 | label_news: News | |
215 | label_news_new: Add news |
|
216 | label_news_new: Add news | |
216 | label_news_plural: News |
|
217 | label_news_plural: News | |
217 | label_news_latest: Latest news |
|
218 | label_news_latest: Latest news | |
218 | label_news_view_all: View all news |
|
219 | label_news_view_all: View all news | |
219 | label_change_log: Change log |
|
220 | label_change_log: Change log | |
220 | label_settings: Settings |
|
221 | label_settings: Settings | |
221 | label_overview: Overview |
|
222 | label_overview: Overview | |
222 | label_version: Version |
|
223 | label_version: Version | |
223 | label_version_new: New version |
|
224 | label_version_new: New version | |
224 | label_version_plural: Versions |
|
225 | label_version_plural: Versions | |
225 | label_confirmation: Confirmation |
|
226 | label_confirmation: Confirmation | |
226 | label_export_csv: Export to CSV |
|
227 | label_export_csv: Export to CSV | |
227 | label_read: Read... |
|
228 | label_read: Read... | |
228 | label_public_projects: Public projects |
|
229 | label_public_projects: Public projects | |
229 | label_open_issues: Open |
|
230 | label_open_issues: Open | |
230 | label_open_issues_plural: Open |
|
231 | label_open_issues_plural: Open | |
231 | label_closed_issues: Closed |
|
232 | label_closed_issues: Closed | |
232 | label_closed_issues_plural: Closed |
|
233 | label_closed_issues_plural: Closed | |
233 | label_total: Total |
|
234 | label_total: Total | |
234 | label_permissions: Permissions |
|
235 | label_permissions: Permissions | |
235 | label_current_status: Current status |
|
236 | label_current_status: Current status | |
236 | label_new_statuses_allowed: New statuses allowed |
|
237 | label_new_statuses_allowed: New statuses allowed | |
237 | label_all: All |
|
238 | label_all: All | |
238 | label_none: None |
|
239 | label_none: None | |
239 | label_next: Next |
|
240 | label_next: Next | |
240 | label_previous: Previous |
|
241 | label_previous: Previous | |
241 | label_used_by: Used by |
|
242 | label_used_by: Used by | |
242 |
|
243 | |||
243 | button_login: Login |
|
244 | button_login: Login | |
244 | button_submit: Submit |
|
245 | button_submit: Submit | |
245 | button_save: Save |
|
246 | button_save: Save | |
246 | button_check_all: Check all |
|
247 | button_check_all: Check all | |
247 | button_uncheck_all: Uncheck all |
|
248 | button_uncheck_all: Uncheck all | |
248 | button_delete: Delete |
|
249 | button_delete: Delete | |
249 | button_create: Create |
|
250 | button_create: Create | |
250 | button_test: Test |
|
251 | button_test: Test | |
251 | button_edit: Edit |
|
252 | button_edit: Edit | |
252 | button_add: Add |
|
253 | button_add: Add | |
253 | button_change: Change |
|
254 | button_change: Change | |
254 | button_apply: Apply |
|
255 | button_apply: Apply | |
255 | button_clear: Clear |
|
256 | button_clear: Clear | |
256 | button_lock: Lock |
|
257 | button_lock: Lock | |
257 | button_unlock: Unlock |
|
258 | button_unlock: Unlock | |
258 | button_download: Download |
|
259 | button_download: Download | |
259 | button_list: List |
|
260 | button_list: List | |
260 | button_view: View |
|
261 | button_view: View | |
261 |
|
262 | |||
262 | text_select_mail_notifications: Select actions for which mail notifications should be sent. |
|
263 | text_select_mail_notifications: Select actions for which mail notifications should be sent. | |
263 | text_regexp_info: eg. ^[A-Z0-9]+$ |
|
264 | text_regexp_info: eg. ^[A-Z0-9]+$ | |
264 | text_min_max_length_info: 0 means no restriction |
|
265 | text_min_max_length_info: 0 means no restriction | |
265 | text_possible_values_info: values separated with | |
|
266 | text_possible_values_info: values separated with | | |
266 | text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ? |
|
267 | text_project_destroy_confirmation: Are you sure you want to delete this project and all related data ? | |
267 | text_workflow_edit: Select a role and a tracker to edit the workflow |
|
268 | text_workflow_edit: Select a role and a tracker to edit the workflow | |
268 | text_are_you_sure: Are you sure ? |
|
269 | text_are_you_sure: Are you sure ? | |
269 |
|
270 | |||
270 | default_role_manager: Manager |
|
271 | default_role_manager: Manager | |
271 | default_role_developper: Developer |
|
272 | default_role_developper: Developer | |
272 | default_role_reporter: Reporter |
|
273 | default_role_reporter: Reporter | |
273 | default_tracker_bug: Bug |
|
274 | default_tracker_bug: Bug | |
274 | default_tracker_feature: Feature |
|
275 | default_tracker_feature: Feature | |
275 | default_tracker_support: Support |
|
276 | default_tracker_support: Support | |
276 | default_issue_status_new: New |
|
277 | default_issue_status_new: New | |
277 | default_issue_status_assigned: Assigned |
|
278 | default_issue_status_assigned: Assigned | |
278 | default_issue_status_resolved: Resolved |
|
279 | default_issue_status_resolved: Resolved | |
279 | default_issue_status_feedback: Feedback |
|
280 | default_issue_status_feedback: Feedback | |
280 | default_issue_status_closed: Closed |
|
281 | default_issue_status_closed: Closed | |
281 | default_issue_status_rejected: Rejected |
|
282 | default_issue_status_rejected: Rejected | |
282 | default_doc_category_user: User documentation |
|
283 | default_doc_category_user: User documentation | |
283 | default_doc_category_tech: Technical documentation |
|
284 | default_doc_category_tech: Technical documentation | |
284 | default_priority_low: Low |
|
285 | default_priority_low: Low | |
285 | default_priority_normal: Normal |
|
286 | default_priority_normal: Normal | |
286 | default_priority_high: High |
|
287 | default_priority_high: High | |
287 | default_priority_urgent: Urgent |
|
288 | default_priority_urgent: Urgent | |
288 | default_priority_immediate: Immediate |
|
289 | default_priority_immediate: Immediate | |
289 |
|
290 | |||
290 | enumeration_issue_priorities: Issue priorities |
|
291 | enumeration_issue_priorities: Issue priorities | |
291 | enumeration_doc_categories: Document categories |
|
292 | enumeration_doc_categories: Document categories |
@@ -1,291 +1,292 | |||||
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' |
|
1 | _gloc_rule_default: '|n| n==1 ? "" : "_plural" ' | |
2 |
|
2 | |||
3 | actionview_datehelper_select_day_prefix: |
|
3 | actionview_datehelper_select_day_prefix: | |
4 | actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre |
|
4 | actionview_datehelper_select_month_names: Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre | |
5 | actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic |
|
5 | actionview_datehelper_select_month_names_abbr: Ene,Feb,Mar,Abr,Mayo,Jun,Jul,Ago,Sep,Oct,Nov,Dic | |
6 | actionview_datehelper_select_month_prefix: |
|
6 | actionview_datehelper_select_month_prefix: | |
7 | actionview_datehelper_select_year_prefix: |
|
7 | actionview_datehelper_select_year_prefix: | |
8 | actionview_datehelper_time_in_words_day: 1 day |
|
8 | actionview_datehelper_time_in_words_day: 1 day | |
9 | actionview_datehelper_time_in_words_day_plural: %d days |
|
9 | actionview_datehelper_time_in_words_day_plural: %d days | |
10 | actionview_datehelper_time_in_words_hour_about: about an hour |
|
10 | actionview_datehelper_time_in_words_hour_about: about an hour | |
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours |
|
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours | |
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour |
|
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour | |
13 | actionview_datehelper_time_in_words_minute: 1 minute |
|
13 | actionview_datehelper_time_in_words_minute: 1 minute | |
14 | actionview_datehelper_time_in_words_minute_half: half a minute |
|
14 | actionview_datehelper_time_in_words_minute_half: half a minute | |
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute |
|
15 | actionview_datehelper_time_in_words_minute_less_than: less than a minute | |
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes |
|
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes | |
17 | actionview_datehelper_time_in_words_minute_single: 1 minute |
|
17 | actionview_datehelper_time_in_words_minute_single: 1 minute | |
18 | actionview_datehelper_time_in_words_second_less_than: less than a second |
|
18 | actionview_datehelper_time_in_words_second_less_than: less than a second | |
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds |
|
19 | actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds | |
20 | actionview_instancetag_blank_option: Please select |
|
20 | actionview_instancetag_blank_option: Please select | |
21 |
|
21 | |||
22 | activerecord_error_inclusion: is not included in the list |
|
22 | activerecord_error_inclusion: is not included in the list | |
23 | activerecord_error_exclusion: is reserved |
|
23 | activerecord_error_exclusion: is reserved | |
24 | activerecord_error_invalid: is invalid |
|
24 | activerecord_error_invalid: is invalid | |
25 | activerecord_error_confirmation: doesn't match confirmation |
|
25 | activerecord_error_confirmation: doesn't match confirmation | |
26 | activerecord_error_accepted: must be accepted |
|
26 | activerecord_error_accepted: must be accepted | |
27 | activerecord_error_empty: can't be empty |
|
27 | activerecord_error_empty: can't be empty | |
28 | activerecord_error_blank: can't be blank |
|
28 | activerecord_error_blank: can't be blank | |
29 | activerecord_error_too_long: is too long |
|
29 | activerecord_error_too_long: is too long | |
30 | activerecord_error_too_short: is too short |
|
30 | activerecord_error_too_short: is too short | |
31 | activerecord_error_wrong_length: is the wrong length |
|
31 | activerecord_error_wrong_length: is the wrong length | |
32 | activerecord_error_taken: has already been taken |
|
32 | activerecord_error_taken: has already been taken | |
33 | activerecord_error_not_a_number: is not a number |
|
33 | activerecord_error_not_a_number: is not a number | |
|
34 | #activerecord_error_not_a_date: is not a valid date | |||
34 |
|
35 | |||
35 | general_fmt_age: %d año |
|
36 | general_fmt_age: %d año | |
36 | general_fmt_age_plural: %d años |
|
37 | general_fmt_age_plural: %d años | |
37 | general_fmt_date: %%d/%%m/%%Y |
|
38 | general_fmt_date: %%d/%%m/%%Y | |
38 | general_fmt_datetime: %%d/%%m/%%Y %%H:%%M |
|
39 | general_fmt_datetime: %%d/%%m/%%Y %%H:%%M | |
39 | general_fmt_datetime_short: %%d/%%m %%H:%%M |
|
40 | general_fmt_datetime_short: %%d/%%m %%H:%%M | |
40 | general_fmt_time: %%H:%%M |
|
41 | general_fmt_time: %%H:%%M | |
41 | general_text_No: 'No' |
|
42 | general_text_No: 'No' | |
42 | general_text_Yes: 'Sí' |
|
43 | general_text_Yes: 'Sí' | |
43 | general_text_no: 'no' |
|
44 | general_text_no: 'no' | |
44 | general_text_yes: 'sí' |
|
45 | general_text_yes: 'sí' | |
45 | general_lang_es: 'Español' |
|
46 | general_lang_es: 'Español' | |
46 |
|
47 | |||
47 | notice_account_updated: Account was successfully updated. |
|
48 | notice_account_updated: Account was successfully updated. | |
48 | notice_account_invalid_creditentials: Invalid user or password |
|
49 | notice_account_invalid_creditentials: Invalid user or password | |
49 | notice_account_password_updated: Password was successfully updated. |
|
50 | notice_account_password_updated: Password was successfully updated. | |
50 | notice_account_wrong_password: Wrong password |
|
51 | notice_account_wrong_password: Wrong password | |
51 | notice_account_register_done: Account was successfully created. |
|
52 | notice_account_register_done: Account was successfully created. | |
52 | notice_account_unknown_email: Unknown user. |
|
53 | notice_account_unknown_email: Unknown user. | |
53 | notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. |
|
54 | notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. | |
54 | notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. |
|
55 | notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. | |
55 | notice_account_activated: Your account has been activated. You can now log in. |
|
56 | notice_account_activated: Your account has been activated. You can now log in. | |
56 | notice_successful_create: Successful creation. |
|
57 | notice_successful_create: Successful creation. | |
57 | notice_successful_update: Successful update. |
|
58 | notice_successful_update: Successful update. | |
58 | notice_successful_delete: Successful deletion. |
|
59 | notice_successful_delete: Successful deletion. | |
59 | notice_successful_connection: Successful connection. |
|
60 | notice_successful_connection: Successful connection. | |
60 | notice_file_not_found: Requested file doesn't exist or has been deleted. |
|
61 | notice_file_not_found: Requested file doesn't exist or has been deleted. | |
61 | notice_locking_conflict: Data have been updated by another user. |
|
62 | notice_locking_conflict: Data have been updated by another user. | |
62 |
|
63 | |||
63 | gui_validation_error: 1 error |
|
64 | gui_validation_error: 1 error | |
64 | gui_validation_error_plural: %d errores |
|
65 | gui_validation_error_plural: %d errores | |
65 |
|
66 | |||
66 | field_name: Nombre |
|
67 | field_name: Nombre | |
67 | field_description: Descripción |
|
68 | field_description: Descripción | |
68 | field_summary: Resumen |
|
69 | field_summary: Resumen | |
69 | field_is_required: Obligatorio |
|
70 | field_is_required: Obligatorio | |
70 | field_firstname: Nombre |
|
71 | field_firstname: Nombre | |
71 | field_lastname: Apellido |
|
72 | field_lastname: Apellido | |
72 | field_mail: Email |
|
73 | field_mail: Email | |
73 | field_filename: Fichero |
|
74 | field_filename: Fichero | |
74 | field_filesize: Tamaño |
|
75 | field_filesize: Tamaño | |
75 | field_downloads: Telecargas |
|
76 | field_downloads: Telecargas | |
76 | field_author: Autor |
|
77 | field_author: Autor | |
77 | field_created_on: Creado |
|
78 | field_created_on: Creado | |
78 | field_updated_on: Actualizado |
|
79 | field_updated_on: Actualizado | |
79 | field_field_format: Formato |
|
80 | field_field_format: Formato | |
80 | field_is_for_all: Para todos los proyectos |
|
81 | field_is_for_all: Para todos los proyectos | |
81 | field_possible_values: Valores posibles |
|
82 | field_possible_values: Valores posibles | |
82 | field_regexp: Expresión regular |
|
83 | field_regexp: Expresión regular | |
83 | #field_min_length: Minimum length |
|
84 | #field_min_length: Minimum length | |
84 | #field_max_length: Maximum length |
|
85 | #field_max_length: Maximum length | |
85 | field_value: Valor |
|
86 | field_value: Valor | |
86 | field_category: Categoría |
|
87 | field_category: Categoría | |
87 | field_title: Título |
|
88 | field_title: Título | |
88 | field_project: Proyecto |
|
89 | field_project: Proyecto | |
89 | field_issue: Petición |
|
90 | field_issue: Petición | |
90 | field_status: Estatuto |
|
91 | field_status: Estatuto | |
91 | field_notes: Notas |
|
92 | field_notes: Notas | |
92 | field_is_closed: Petición resuelta |
|
93 | field_is_closed: Petición resuelta | |
93 | field_is_default: Estatuto por defecto |
|
94 | field_is_default: Estatuto por defecto | |
94 | field_html_color: Color |
|
95 | field_html_color: Color | |
95 | field_tracker: Tracker |
|
96 | field_tracker: Tracker | |
96 | field_subject: Tema |
|
97 | field_subject: Tema | |
97 | #field_due_date: Due date |
|
98 | #field_due_date: Due date | |
98 | field_assigned_to: Asignado a |
|
99 | field_assigned_to: Asignado a | |
99 | field_priority: Prioridad |
|
100 | field_priority: Prioridad | |
100 | field_fixed_version: Versión corregida |
|
101 | field_fixed_version: Versión corregida | |
101 | field_user: Usuario |
|
102 | field_user: Usuario | |
102 | field_role: Papel |
|
103 | field_role: Papel | |
103 | field_homepage: Sitio web |
|
104 | field_homepage: Sitio web | |
104 | field_is_public: Público |
|
105 | field_is_public: Público | |
105 | #field_parent: Subproject de |
|
106 | #field_parent: Subproject de | |
106 | field_is_in_chlog: Consultar las peticiones en el histórico |
|
107 | field_is_in_chlog: Consultar las peticiones en el histórico | |
107 | field_login: Identificador |
|
108 | field_login: Identificador | |
108 | field_mail_notification: Notificación por mail |
|
109 | field_mail_notification: Notificación por mail | |
109 | field_admin: Administrador |
|
110 | field_admin: Administrador | |
110 | field_locked: Cerrado |
|
111 | field_locked: Cerrado | |
111 | field_last_login_on: Última conexión |
|
112 | field_last_login_on: Última conexión | |
112 | field_language: Lengua |
|
113 | field_language: Lengua | |
113 | field_effective_date: Fecha |
|
114 | field_effective_date: Fecha | |
114 | field_password: Contraseña |
|
115 | field_password: Contraseña | |
115 | field_new_password: Nueva contraseña |
|
116 | field_new_password: Nueva contraseña | |
116 | field_password_confirmation: Confirmación |
|
117 | field_password_confirmation: Confirmación | |
117 | field_version: Versión |
|
118 | field_version: Versión | |
118 | field_type: Tipo |
|
119 | field_type: Tipo | |
119 | #field_host: Host |
|
120 | #field_host: Host | |
120 | #field_port: Port |
|
121 | #field_port: Port | |
121 | #field_account: Account |
|
122 | #field_account: Account | |
122 | #field_base_dn: Base DN |
|
123 | #field_base_dn: Base DN | |
123 | #field_attr_login: Login attribute |
|
124 | #field_attr_login: Login attribute | |
124 | #field_attr_firstname: Firstname attribute |
|
125 | #field_attr_firstname: Firstname attribute | |
125 | #field_attr_lastname: Lastname attribute |
|
126 | #field_attr_lastname: Lastname attribute | |
126 | #field_attr_mail: Email attribute |
|
127 | #field_attr_mail: Email attribute | |
127 | #field_onthefly: On-the-fly user creation |
|
128 | #field_onthefly: On-the-fly user creation | |
128 |
|
129 | |||
129 | label_user: Usuario |
|
130 | label_user: Usuario | |
130 | label_user_plural: Usuarios |
|
131 | label_user_plural: Usuarios | |
131 | label_user_new: Nuevo usuario |
|
132 | label_user_new: Nuevo usuario | |
132 | label_project: Proyecto |
|
133 | label_project: Proyecto | |
133 | label_project_new: Nuevo proyecto |
|
134 | label_project_new: Nuevo proyecto | |
134 | label_project_plural: Proyectos |
|
135 | label_project_plural: Proyectos | |
135 | #label_project_latest: Latest projects |
|
136 | #label_project_latest: Latest projects | |
136 | label_issue: Petición |
|
137 | label_issue: Petición | |
137 | label_issue_new: Nueva petición |
|
138 | label_issue_new: Nueva petición | |
138 | label_issue_plural: Peticiones |
|
139 | label_issue_plural: Peticiones | |
139 | label_issue_view_all: Ver todas las peticiones |
|
140 | label_issue_view_all: Ver todas las peticiones | |
140 | label_document: Documento |
|
141 | label_document: Documento | |
141 | label_document_new: Nuevo documento |
|
142 | label_document_new: Nuevo documento | |
142 | label_document_plural: Documentos |
|
143 | label_document_plural: Documentos | |
143 | label_role: Papel |
|
144 | label_role: Papel | |
144 | label_role_plural: Papeles |
|
145 | label_role_plural: Papeles | |
145 | label_role_new: Nuevo papel |
|
146 | label_role_new: Nuevo papel | |
146 | label_role_and_permissions: Papeles y permisos |
|
147 | label_role_and_permissions: Papeles y permisos | |
147 | label_member: Miembro |
|
148 | label_member: Miembro | |
148 | label_member_new: Nuevo miembro |
|
149 | label_member_new: Nuevo miembro | |
149 | label_member_plural: Miembros |
|
150 | label_member_plural: Miembros | |
150 | label_tracker: Tracker |
|
151 | label_tracker: Tracker | |
151 | label_tracker_plural: Trackers |
|
152 | label_tracker_plural: Trackers | |
152 | label_tracker_new: Nuevo tracker |
|
153 | label_tracker_new: Nuevo tracker | |
153 | label_workflow: Workflow |
|
154 | label_workflow: Workflow | |
154 | label_issue_status: Estatuto de petición |
|
155 | label_issue_status: Estatuto de petición | |
155 | label_issue_status_plural: Estatutos de las peticiones |
|
156 | label_issue_status_plural: Estatutos de las peticiones | |
156 | label_issue_status_new: Nuevo estatuto |
|
157 | label_issue_status_new: Nuevo estatuto | |
157 | label_issue_category: Categoría de las peticiones |
|
158 | label_issue_category: Categoría de las peticiones | |
158 | label_issue_category_plural: Categorías de las peticiones |
|
159 | label_issue_category_plural: Categorías de las peticiones | |
159 | label_issue_category_new: Nueva categoría |
|
160 | label_issue_category_new: Nueva categoría | |
160 | label_custom_field: Campo personalizado |
|
161 | label_custom_field: Campo personalizado | |
161 | label_custom_field_plural: Campos personalizados |
|
162 | label_custom_field_plural: Campos personalizados | |
162 | label_custom_field_new: Nuevo campo personalizado |
|
163 | label_custom_field_new: Nuevo campo personalizado | |
163 | label_enumerations: Listas de valores |
|
164 | label_enumerations: Listas de valores | |
164 | label_enumeration_new: Nuevo valor |
|
165 | label_enumeration_new: Nuevo valor | |
165 | label_information: Informacion |
|
166 | label_information: Informacion | |
166 | label_information_plural: Informaciones |
|
167 | label_information_plural: Informaciones | |
167 | label_please_login: Conexión |
|
168 | label_please_login: Conexión | |
168 | #label_register: Register |
|
169 | #label_register: Register | |
169 | label_password_lost: ¿Olvidaste la contraseña? |
|
170 | label_password_lost: ¿Olvidaste la contraseña? | |
170 | label_home: Acogida |
|
171 | label_home: Acogida | |
171 | label_my_page: Mi página |
|
172 | label_my_page: Mi página | |
172 | label_my_account: Mi cuenta |
|
173 | label_my_account: Mi cuenta | |
173 | label_my_projects: Mis proyectos |
|
174 | label_my_projects: Mis proyectos | |
174 | label_administration: Administración |
|
175 | label_administration: Administración | |
175 | label_login: Conexión |
|
176 | label_login: Conexión | |
176 | label_logout: Desconexión |
|
177 | label_logout: Desconexión | |
177 | label_help: Ayuda |
|
178 | label_help: Ayuda | |
178 | label_reported_issues: Peticiones registradas |
|
179 | label_reported_issues: Peticiones registradas | |
179 | label_assigned_to_me_issues: Peticiones que me están asignadas |
|
180 | label_assigned_to_me_issues: Peticiones que me están asignadas | |
180 | label_last_login: Última conexión |
|
181 | label_last_login: Última conexión | |
181 | label_last_updates: Actualizado |
|
182 | label_last_updates: Actualizado | |
182 | label_last_updates_plural: %d Actualizados |
|
183 | label_last_updates_plural: %d Actualizados | |
183 | label_registered_on: Inscrito el |
|
184 | label_registered_on: Inscrito el | |
184 | label_activity: Actividad |
|
185 | label_activity: Actividad | |
185 | label_new: Nuevo |
|
186 | label_new: Nuevo | |
186 | label_logged_as: Conectado como |
|
187 | label_logged_as: Conectado como | |
187 | #label_environment: Environment |
|
188 | #label_environment: Environment | |
188 | #label_authentication: Authentication |
|
189 | #label_authentication: Authentication | |
189 | #label_auth_source: Authentification mode |
|
190 | #label_auth_source: Authentification mode | |
190 | #label_auth_source_new: New authentication mode |
|
191 | #label_auth_source_new: New authentication mode | |
191 | #label_auth_source_plural: Authentification modes |
|
192 | #label_auth_source_plural: Authentification modes | |
192 | #label_subproject: Subproject |
|
193 | #label_subproject: Subproject | |
193 | #label_subproject_plural: Subprojects |
|
194 | #label_subproject_plural: Subprojects | |
194 | #label_min_max_length: Min - Max length |
|
195 | #label_min_max_length: Min - Max length | |
195 | #label_list: List |
|
196 | #label_list: List | |
196 | label_date: Fecha |
|
197 | label_date: Fecha | |
197 | #label_integer: Integer |
|
198 | #label_integer: Integer | |
198 | #label_boolean: Boolean |
|
199 | #label_boolean: Boolean | |
199 | #label_string: String |
|
200 | #label_string: String | |
200 | #label_text: Text |
|
201 | #label_text: Text | |
201 | #label_attribute: Attribute |
|
202 | #label_attribute: Attribute | |
202 | #label_attribute_plural: Attributes |
|
203 | #label_attribute_plural: Attributes | |
203 | label_download: %d Telecarga |
|
204 | label_download: %d Telecarga | |
204 | label_download_plural: %d Telecargas |
|
205 | label_download_plural: %d Telecargas | |
205 | #label_no_data: No data to display |
|
206 | #label_no_data: No data to display | |
206 | label_change_status: Cambiar el estatuto |
|
207 | label_change_status: Cambiar el estatuto | |
207 | label_history: Histórico |
|
208 | label_history: Histórico | |
208 | label_attachment: Fichero |
|
209 | label_attachment: Fichero | |
209 | label_attachment_new: Nuevo fichero |
|
210 | label_attachment_new: Nuevo fichero | |
210 | #label_attachment_delete: Delete file |
|
211 | #label_attachment_delete: Delete file | |
211 | label_attachment_plural: Ficheros |
|
212 | label_attachment_plural: Ficheros | |
212 | #label_report: Report |
|
213 | #label_report: Report | |
213 | #label_report_plural: Reports |
|
214 | #label_report_plural: Reports | |
214 | label_news: Noticia |
|
215 | label_news: Noticia | |
215 | label_news_new: Nueva noticia |
|
216 | label_news_new: Nueva noticia | |
216 | label_news_plural: Noticias |
|
217 | label_news_plural: Noticias | |
217 | label_news_latest: Últimas noticias |
|
218 | label_news_latest: Últimas noticias | |
218 | label_news_view_all: Ver todas las noticias |
|
219 | label_news_view_all: Ver todas las noticias | |
219 | label_change_log: Cambios |
|
220 | label_change_log: Cambios | |
220 | label_settings: Configuración |
|
221 | label_settings: Configuración | |
221 | label_overview: Vistazo |
|
222 | label_overview: Vistazo | |
222 | label_version: Versión |
|
223 | label_version: Versión | |
223 | label_version_new: Nueva versión |
|
224 | label_version_new: Nueva versión | |
224 | label_version_plural: Versiónes |
|
225 | label_version_plural: Versiónes | |
225 | label_confirmation: Confirmación |
|
226 | label_confirmation: Confirmación | |
226 | label_export_csv: Exportar a CSV |
|
227 | label_export_csv: Exportar a CSV | |
227 | label_read: Leer... |
|
228 | label_read: Leer... | |
228 | label_public_projects: Proyectos publicos |
|
229 | label_public_projects: Proyectos publicos | |
229 | label_open_issues: Abierta |
|
230 | label_open_issues: Abierta | |
230 | label_open_issues_plural: Abiertas |
|
231 | label_open_issues_plural: Abiertas | |
231 | label_closed_issues: Cerrada |
|
232 | label_closed_issues: Cerrada | |
232 | label_closed_issues_plural: Cerradas |
|
233 | label_closed_issues_plural: Cerradas | |
233 | label_total: Total |
|
234 | label_total: Total | |
234 | label_permissions: Permisos |
|
235 | label_permissions: Permisos | |
235 | #label_current_status: Current status |
|
236 | #label_current_status: Current status | |
236 | label_new_statuses_allowed: Nuevos estatutos autorizados |
|
237 | label_new_statuses_allowed: Nuevos estatutos autorizados | |
237 | label_all: Todos |
|
238 | label_all: Todos | |
238 | label_none: Ninguno |
|
239 | label_none: Ninguno | |
239 | label_next: Próximo |
|
240 | label_next: Próximo | |
240 | label_previous: Precedente |
|
241 | label_previous: Precedente | |
241 | label_used_by: Utilizado por |
|
242 | label_used_by: Utilizado por | |
242 |
|
243 | |||
243 | button_login: Conexión |
|
244 | button_login: Conexión | |
244 | button_submit: Someter |
|
245 | button_submit: Someter | |
245 | button_save: Validar |
|
246 | button_save: Validar | |
246 | button_check_all: Seleccionar todo |
|
247 | button_check_all: Seleccionar todo | |
247 | button_uncheck_all: No seleccionar nada |
|
248 | button_uncheck_all: No seleccionar nada | |
248 | button_delete: Suprimir |
|
249 | button_delete: Suprimir | |
249 | button_create: Crear |
|
250 | button_create: Crear | |
250 | button_test: Testar |
|
251 | button_test: Testar | |
251 | button_edit: Modificar |
|
252 | button_edit: Modificar | |
252 | button_add: Añadir |
|
253 | button_add: Añadir | |
253 | button_change: Cambiar |
|
254 | button_change: Cambiar | |
254 | button_apply: Aplicar |
|
255 | button_apply: Aplicar | |
255 | button_clear: Anular |
|
256 | button_clear: Anular | |
256 | button_lock: Bloquear |
|
257 | button_lock: Bloquear | |
257 | button_unlock: Desbloquear |
|
258 | button_unlock: Desbloquear | |
258 | button_download: Telecargar |
|
259 | button_download: Telecargar | |
259 | button_list: Listar |
|
260 | button_list: Listar | |
260 | button_view: Ver |
|
261 | button_view: Ver | |
261 |
|
262 | |||
262 | text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail. |
|
263 | text_select_mail_notifications: Seleccionar las actividades que necesitan la activación de la notificación por mail. | |
263 | text_regexp_info: eg. ^[A-Z0-9]+$ |
|
264 | text_regexp_info: eg. ^[A-Z0-9]+$ | |
264 | text_min_max_length_info: 0 para ninguna restricción |
|
265 | text_min_max_length_info: 0 para ninguna restricción | |
265 | #text_possible_values_info: values separated with | |
|
266 | #text_possible_values_info: values separated with | | |
266 | text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ? |
|
267 | text_project_destroy_confirmation: ¿ Estás seguro de querer eliminar el proyecto ? | |
267 | text_workflow_edit: Seleccionar un workflow para actualizar |
|
268 | text_workflow_edit: Seleccionar un workflow para actualizar | |
268 | text_are_you_sure: ¿ Estás seguro ? |
|
269 | text_are_you_sure: ¿ Estás seguro ? | |
269 |
|
270 | |||
270 | default_role_manager: Manager |
|
271 | default_role_manager: Manager | |
271 | default_role_developper: Desarrollador |
|
272 | default_role_developper: Desarrollador | |
272 | default_role_reporter: Informador |
|
273 | default_role_reporter: Informador | |
273 | default_tracker_bug: Anomalía |
|
274 | default_tracker_bug: Anomalía | |
274 | default_tracker_feature: Evolución |
|
275 | default_tracker_feature: Evolución | |
275 | default_tracker_support: Asistencia |
|
276 | default_tracker_support: Asistencia | |
276 | default_issue_status_new: Nuevo |
|
277 | default_issue_status_new: Nuevo | |
277 | default_issue_status_assigned: Asignada |
|
278 | default_issue_status_assigned: Asignada | |
278 | default_issue_status_resolved: Resuelta |
|
279 | default_issue_status_resolved: Resuelta | |
279 | default_issue_status_feedback: Comentario |
|
280 | default_issue_status_feedback: Comentario | |
280 | default_issue_status_closed: Cerrada |
|
281 | default_issue_status_closed: Cerrada | |
281 | default_issue_status_rejected: Rechazada |
|
282 | default_issue_status_rejected: Rechazada | |
282 | default_doc_category_user: Documentación del usuario |
|
283 | default_doc_category_user: Documentación del usuario | |
283 | default_doc_category_tech: Documentación tecnica |
|
284 | default_doc_category_tech: Documentación tecnica | |
284 | default_priority_low: Bajo |
|
285 | default_priority_low: Bajo | |
285 | default_priority_normal: Normal |
|
286 | default_priority_normal: Normal | |
286 | default_priority_high: Alto |
|
287 | default_priority_high: Alto | |
287 | default_priority_urgent: Urgente |
|
288 | default_priority_urgent: Urgente | |
288 | default_priority_immediate: Ahora |
|
289 | default_priority_immediate: Ahora | |
289 |
|
290 | |||
290 | enumeration_issue_priorities: Prioridad de las peticiones |
|
291 | enumeration_issue_priorities: Prioridad de las peticiones | |
291 | enumeration_doc_categories: Categorías del documento |
|
292 | enumeration_doc_categories: Categorías del documento |
@@ -1,291 +1,292 | |||||
1 | _gloc_rule_default: '|n| n<=1 ? "" : "_plural" ' |
|
1 | _gloc_rule_default: '|n| n<=1 ? "" : "_plural" ' | |
2 |
|
2 | |||
3 | actionview_datehelper_select_day_prefix: |
|
3 | actionview_datehelper_select_day_prefix: | |
4 | actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre |
|
4 | actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre | |
5 | actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc |
|
5 | actionview_datehelper_select_month_names_abbr: Jan,Fév,Mars,Avril,Mai,Juin,Juil,Août,Sept,Oct,Nov,Déc | |
6 | actionview_datehelper_select_month_prefix: |
|
6 | actionview_datehelper_select_month_prefix: | |
7 | actionview_datehelper_select_year_prefix: |
|
7 | actionview_datehelper_select_year_prefix: | |
8 | actionview_datehelper_time_in_words_day: 1 jour |
|
8 | actionview_datehelper_time_in_words_day: 1 jour | |
9 | actionview_datehelper_time_in_words_day_plural: %d jours |
|
9 | actionview_datehelper_time_in_words_day_plural: %d jours | |
10 | actionview_datehelper_time_in_words_hour_about: about an hour |
|
10 | actionview_datehelper_time_in_words_hour_about: about an hour | |
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours |
|
11 | actionview_datehelper_time_in_words_hour_about_plural: about %d hours | |
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour |
|
12 | actionview_datehelper_time_in_words_hour_about_single: about an hour | |
13 | actionview_datehelper_time_in_words_minute: 1 minute |
|
13 | actionview_datehelper_time_in_words_minute: 1 minute | |
14 | actionview_datehelper_time_in_words_minute_half: 30 secondes |
|
14 | actionview_datehelper_time_in_words_minute_half: 30 secondes | |
15 | actionview_datehelper_time_in_words_minute_less_than: moins d'une minute |
|
15 | actionview_datehelper_time_in_words_minute_less_than: moins d'une minute | |
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes |
|
16 | actionview_datehelper_time_in_words_minute_plural: %d minutes | |
17 | actionview_datehelper_time_in_words_minute_single: 1 minute |
|
17 | actionview_datehelper_time_in_words_minute_single: 1 minute | |
18 | actionview_datehelper_time_in_words_second_less_than: moins d'une seconde |
|
18 | actionview_datehelper_time_in_words_second_less_than: moins d'une seconde | |
19 | actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes |
|
19 | actionview_datehelper_time_in_words_second_less_than_plural: moins de %d secondes | |
20 | actionview_instancetag_blank_option: Choisir |
|
20 | actionview_instancetag_blank_option: Choisir | |
21 |
|
21 | |||
22 | activerecord_error_inclusion: n'est pas inclus dans la liste |
|
22 | activerecord_error_inclusion: n'est pas inclus dans la liste | |
23 | activerecord_error_exclusion: est reservé |
|
23 | activerecord_error_exclusion: est reservé | |
24 | activerecord_error_invalid: est invalide |
|
24 | activerecord_error_invalid: est invalide | |
25 | activerecord_error_confirmation: ne correspond pas à la confirmation |
|
25 | activerecord_error_confirmation: ne correspond pas à la confirmation | |
26 | activerecord_error_accepted: doit être accepté |
|
26 | activerecord_error_accepted: doit être accepté | |
27 | activerecord_error_empty: doit être renseigné |
|
27 | activerecord_error_empty: doit être renseigné | |
28 | activerecord_error_blank: doit être renseigné |
|
28 | activerecord_error_blank: doit être renseigné | |
29 | activerecord_error_too_long: est trop long |
|
29 | activerecord_error_too_long: est trop long | |
30 | activerecord_error_too_short: est trop court |
|
30 | activerecord_error_too_short: est trop court | |
31 | activerecord_error_wrong_length: n'est pas de la bonne longueur |
|
31 | activerecord_error_wrong_length: n'est pas de la bonne longueur | |
32 | activerecord_error_taken: est déjà utilisé |
|
32 | activerecord_error_taken: est déjà utilisé | |
33 | activerecord_error_not_a_number: n'est pas un nombre |
|
33 | activerecord_error_not_a_number: n'est pas un nombre | |
|
34 | activerecord_error_not_a_date: n'est pas une date valide | |||
34 |
|
35 | |||
35 | general_fmt_age: %d an |
|
36 | general_fmt_age: %d an | |
36 | general_fmt_age_plural: %d ans |
|
37 | general_fmt_age_plural: %d ans | |
37 | general_fmt_date: %%d/%%m/%%Y |
|
38 | general_fmt_date: %%d/%%m/%%Y | |
38 | general_fmt_datetime: %%d/%%m/%%Y %%H:%%M |
|
39 | general_fmt_datetime: %%d/%%m/%%Y %%H:%%M | |
39 | general_fmt_datetime_short: %%d/%%m %%H:%%M |
|
40 | general_fmt_datetime_short: %%d/%%m %%H:%%M | |
40 | general_fmt_time: %%H:%%M |
|
41 | general_fmt_time: %%H:%%M | |
41 | general_text_No: 'Non' |
|
42 | general_text_No: 'Non' | |
42 | general_text_Yes: 'Oui' |
|
43 | general_text_Yes: 'Oui' | |
43 | general_text_no: 'non' |
|
44 | general_text_no: 'non' | |
44 | general_text_yes: 'oui' |
|
45 | general_text_yes: 'oui' | |
45 | general_lang_fr: 'Français' |
|
46 | general_lang_fr: 'Français' | |
46 |
|
47 | |||
47 | notice_account_updated: Le compte a été mis à jour avec succès. |
|
48 | notice_account_updated: Le compte a été mis à jour avec succès. | |
48 | notice_account_invalid_creditentials: Identifiant ou mot de passe invalide. |
|
49 | notice_account_invalid_creditentials: Identifiant ou mot de passe invalide. | |
49 | notice_account_password_updated: Mot de passe mis à jour avec succès. |
|
50 | notice_account_password_updated: Mot de passe mis à jour avec succès. | |
50 | notice_account_wrong_password: Mot de passe incorrect |
|
51 | notice_account_wrong_password: Mot de passe incorrect | |
51 | notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé. |
|
52 | notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé. | |
52 | notice_account_unknown_email: Aucun compte ne correspond à cette adresse. |
|
53 | notice_account_unknown_email: Aucun compte ne correspond à cette adresse. | |
53 | notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe. |
|
54 | notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe. | |
54 | notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé. |
|
55 | notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé. | |
55 | notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter. |
|
56 | notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter. | |
56 | notice_successful_create: Création effectuée avec succès. |
|
57 | notice_successful_create: Création effectuée avec succès. | |
57 | notice_successful_update: Mise à jour effectuée avec succès. |
|
58 | notice_successful_update: Mise à jour effectuée avec succès. | |
58 | notice_successful_delete: Suppression effectuée avec succès. |
|
59 | notice_successful_delete: Suppression effectuée avec succès. | |
59 | notice_successful_connection: Connection réussie. |
|
60 | notice_successful_connection: Connection réussie. | |
60 | notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé. |
|
61 | notice_file_not_found: Le fichier demandé n'existe pas ou a été supprimé. | |
61 | notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible. |
|
62 | notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible. | |
62 |
|
63 | |||
63 | gui_validation_error: 1 erreur |
|
64 | gui_validation_error: 1 erreur | |
64 | gui_validation_error_plural: %d erreurs |
|
65 | gui_validation_error_plural: %d erreurs | |
65 |
|
66 | |||
66 | field_name: Nom |
|
67 | field_name: Nom | |
67 | field_description: Description |
|
68 | field_description: Description | |
68 | field_summary: Résumé |
|
69 | field_summary: Résumé | |
69 | field_is_required: Obligatoire |
|
70 | field_is_required: Obligatoire | |
70 | field_firstname: Prénom |
|
71 | field_firstname: Prénom | |
71 | field_lastname: Nom |
|
72 | field_lastname: Nom | |
72 | field_mail: Email |
|
73 | field_mail: Email | |
73 | field_filename: Fichier |
|
74 | field_filename: Fichier | |
74 | field_filesize: Taille |
|
75 | field_filesize: Taille | |
75 | field_downloads: Téléchargements |
|
76 | field_downloads: Téléchargements | |
76 | field_author: Auteur |
|
77 | field_author: Auteur | |
77 | field_created_on: Créé |
|
78 | field_created_on: Créé | |
78 | field_updated_on: Mis à jour |
|
79 | field_updated_on: Mis à jour | |
79 | field_field_format: Format |
|
80 | field_field_format: Format | |
80 | field_is_for_all: Pour tous les projets |
|
81 | field_is_for_all: Pour tous les projets | |
81 | field_possible_values: Valeurs possibles |
|
82 | field_possible_values: Valeurs possibles | |
82 | field_regexp: Expression régulière |
|
83 | field_regexp: Expression régulière | |
83 | field_min_length: Longueur minimum |
|
84 | field_min_length: Longueur minimum | |
84 | field_max_length: Longueur maximum |
|
85 | field_max_length: Longueur maximum | |
85 | field_value: Valeur |
|
86 | field_value: Valeur | |
86 | field_category: Catégorie |
|
87 | field_category: Catégorie | |
87 | field_title: Titre |
|
88 | field_title: Titre | |
88 | field_project: Projet |
|
89 | field_project: Projet | |
89 | field_issue: Demande |
|
90 | field_issue: Demande | |
90 | field_status: Statut |
|
91 | field_status: Statut | |
91 | field_notes: Notes |
|
92 | field_notes: Notes | |
92 | field_is_closed: Demande fermée |
|
93 | field_is_closed: Demande fermée | |
93 | field_is_default: Statut par défaut |
|
94 | field_is_default: Statut par défaut | |
94 | field_html_color: Couleur |
|
95 | field_html_color: Couleur | |
95 | field_tracker: Tracker |
|
96 | field_tracker: Tracker | |
96 | field_subject: Sujet |
|
97 | field_subject: Sujet | |
97 | field_due_date: Date d'échéance |
|
98 | field_due_date: Date d'échéance | |
98 | field_assigned_to: Assigné à |
|
99 | field_assigned_to: Assigné à | |
99 | field_priority: Priorité |
|
100 | field_priority: Priorité | |
100 | field_fixed_version: Version corrigée |
|
101 | field_fixed_version: Version corrigée | |
101 | field_user: Utilisateur |
|
102 | field_user: Utilisateur | |
102 | field_role: Rôle |
|
103 | field_role: Rôle | |
103 | field_homepage: Site web |
|
104 | field_homepage: Site web | |
104 | field_is_public: Public |
|
105 | field_is_public: Public | |
105 | field_parent: Sous-projet de |
|
106 | field_parent: Sous-projet de | |
106 | field_is_in_chlog: Demandes affichées dans l'historique |
|
107 | field_is_in_chlog: Demandes affichées dans l'historique | |
107 | field_login: Identifiant |
|
108 | field_login: Identifiant | |
108 | field_mail_notification: Notifications par mail |
|
109 | field_mail_notification: Notifications par mail | |
109 | field_admin: Administrateur |
|
110 | field_admin: Administrateur | |
110 | field_locked: Verrouillé |
|
111 | field_locked: Verrouillé | |
111 | field_last_login_on: Dernière connexion |
|
112 | field_last_login_on: Dernière connexion | |
112 | field_language: Langue |
|
113 | field_language: Langue | |
113 | field_effective_date: Date |
|
114 | field_effective_date: Date | |
114 | field_password: Mot de passe |
|
115 | field_password: Mot de passe | |
115 | field_new_password: Nouveau mot de passe |
|
116 | field_new_password: Nouveau mot de passe | |
116 | field_password_confirmation: Confirmation |
|
117 | field_password_confirmation: Confirmation | |
117 | field_version: Version |
|
118 | field_version: Version | |
118 | field_type: Type |
|
119 | field_type: Type | |
119 | field_host: Hôte |
|
120 | field_host: Hôte | |
120 | field_port: Port |
|
121 | field_port: Port | |
121 | field_account: Compte |
|
122 | field_account: Compte | |
122 | field_base_dn: Base DN |
|
123 | field_base_dn: Base DN | |
123 | field_attr_login: Attribut Identifiant |
|
124 | field_attr_login: Attribut Identifiant | |
124 | field_attr_firstname: Attribut Prénom |
|
125 | field_attr_firstname: Attribut Prénom | |
125 | field_attr_lastname: Attribut Nom |
|
126 | field_attr_lastname: Attribut Nom | |
126 | field_attr_mail: Attribut Email |
|
127 | field_attr_mail: Attribut Email | |
127 | field_onthefly: Création des utilisateurs à la volée |
|
128 | field_onthefly: Création des utilisateurs à la volée | |
128 |
|
129 | |||
129 | label_user: Utilisateur |
|
130 | label_user: Utilisateur | |
130 | label_user_plural: Utilisateurs |
|
131 | label_user_plural: Utilisateurs | |
131 | label_user_new: Nouvel utilisateur |
|
132 | label_user_new: Nouvel utilisateur | |
132 | label_project: Projet |
|
133 | label_project: Projet | |
133 | label_project_new: Nouveau projet |
|
134 | label_project_new: Nouveau projet | |
134 | label_project_plural: Projets |
|
135 | label_project_plural: Projets | |
135 | label_project_latest: Derniers projets |
|
136 | label_project_latest: Derniers projets | |
136 | label_issue: Demande |
|
137 | label_issue: Demande | |
137 | label_issue_new: Nouvelle demande |
|
138 | label_issue_new: Nouvelle demande | |
138 | label_issue_plural: Demandes |
|
139 | label_issue_plural: Demandes | |
139 | label_issue_view_all: Voir toutes les demandes |
|
140 | label_issue_view_all: Voir toutes les demandes | |
140 | label_document: Document |
|
141 | label_document: Document | |
141 | label_document_new: Nouveau document |
|
142 | label_document_new: Nouveau document | |
142 | label_document_plural: Documents |
|
143 | label_document_plural: Documents | |
143 | label_role: Rôle |
|
144 | label_role: Rôle | |
144 | label_role_plural: Rôles |
|
145 | label_role_plural: Rôles | |
145 | label_role_new: Nouveau rôle |
|
146 | label_role_new: Nouveau rôle | |
146 | label_role_and_permissions: Rôles et permissions |
|
147 | label_role_and_permissions: Rôles et permissions | |
147 | label_member: Membre |
|
148 | label_member: Membre | |
148 | label_member_new: Nouveau membre |
|
149 | label_member_new: Nouveau membre | |
149 | label_member_plural: Membres |
|
150 | label_member_plural: Membres | |
150 | label_tracker: Tracker |
|
151 | label_tracker: Tracker | |
151 | label_tracker_plural: Trackers |
|
152 | label_tracker_plural: Trackers | |
152 | label_tracker_new: Nouveau tracker |
|
153 | label_tracker_new: Nouveau tracker | |
153 | label_workflow: Workflow |
|
154 | label_workflow: Workflow | |
154 | label_issue_status: Statut de demandes |
|
155 | label_issue_status: Statut de demandes | |
155 | label_issue_status_plural: Statuts de demandes |
|
156 | label_issue_status_plural: Statuts de demandes | |
156 | label_issue_status_new: Nouveau statut |
|
157 | label_issue_status_new: Nouveau statut | |
157 | label_issue_category: Catégorie de demandes |
|
158 | label_issue_category: Catégorie de demandes | |
158 | label_issue_category_plural: Catégories de demandes |
|
159 | label_issue_category_plural: Catégories de demandes | |
159 | label_issue_category_new: Nouvelle catégorie |
|
160 | label_issue_category_new: Nouvelle catégorie | |
160 | label_custom_field: Champ personnalisé |
|
161 | label_custom_field: Champ personnalisé | |
161 | label_custom_field_plural: Champs personnalisés |
|
162 | label_custom_field_plural: Champs personnalisés | |
162 | label_custom_field_new: Nouveau champ personnalisé |
|
163 | label_custom_field_new: Nouveau champ personnalisé | |
163 | label_enumerations: Listes de valeurs |
|
164 | label_enumerations: Listes de valeurs | |
164 | label_enumeration_new: Nouvelle valeur |
|
165 | label_enumeration_new: Nouvelle valeur | |
165 | label_information: Information |
|
166 | label_information: Information | |
166 | label_information_plural: Informations |
|
167 | label_information_plural: Informations | |
167 | label_please_login: Identification |
|
168 | label_please_login: Identification | |
168 | label_register: S'enregistrer |
|
169 | label_register: S'enregistrer | |
169 | label_password_lost: Mot de passe perdu |
|
170 | label_password_lost: Mot de passe perdu | |
170 | label_home: Accueil |
|
171 | label_home: Accueil | |
171 | label_my_page: Ma page |
|
172 | label_my_page: Ma page | |
172 | label_my_account: Mon compte |
|
173 | label_my_account: Mon compte | |
173 | label_my_projects: Mes projets |
|
174 | label_my_projects: Mes projets | |
174 | label_administration: Administration |
|
175 | label_administration: Administration | |
175 | label_login: Connexion |
|
176 | label_login: Connexion | |
176 | label_logout: Déconnexion |
|
177 | label_logout: Déconnexion | |
177 | label_help: Aide |
|
178 | label_help: Aide | |
178 | label_reported_issues: Demandes soumises |
|
179 | label_reported_issues: Demandes soumises | |
179 | label_assigned_to_me_issues: Demandes qui me sont assignées |
|
180 | label_assigned_to_me_issues: Demandes qui me sont assignées | |
180 | label_last_login: Dernière connexion |
|
181 | label_last_login: Dernière connexion | |
181 | label_last_updates: Dernière mise à jour |
|
182 | label_last_updates: Dernière mise à jour | |
182 | label_last_updates_plural: %d dernières mises à jour |
|
183 | label_last_updates_plural: %d dernières mises à jour | |
183 | label_registered_on: Inscrit le |
|
184 | label_registered_on: Inscrit le | |
184 | label_activity: Activité |
|
185 | label_activity: Activité | |
185 | label_new: Nouveau |
|
186 | label_new: Nouveau | |
186 | label_logged_as: Connecté en tant que |
|
187 | label_logged_as: Connecté en tant que | |
187 | label_environment: Environnement |
|
188 | label_environment: Environnement | |
188 | label_authentication: Authentification |
|
189 | label_authentication: Authentification | |
189 | label_auth_source: Mode d'authentification |
|
190 | label_auth_source: Mode d'authentification | |
190 | label_auth_source_new: Nouveau mode d'authentification |
|
191 | label_auth_source_new: Nouveau mode d'authentification | |
191 | label_auth_source_plural: Modes d'authentification |
|
192 | label_auth_source_plural: Modes d'authentification | |
192 | label_subproject: Sous-projet |
|
193 | label_subproject: Sous-projet | |
193 | label_subproject_plural: Sous-projets |
|
194 | label_subproject_plural: Sous-projets | |
194 | label_min_max_length: Longueurs mini - maxi |
|
195 | label_min_max_length: Longueurs mini - maxi | |
195 | label_list: Liste |
|
196 | label_list: Liste | |
196 | label_date: Date |
|
197 | label_date: Date | |
197 | label_integer: Entier |
|
198 | label_integer: Entier | |
198 | label_boolean: Booléen |
|
199 | label_boolean: Booléen | |
199 | label_string: Chaîne |
|
200 | label_string: Chaîne | |
200 | label_text: Texte |
|
201 | label_text: Texte | |
201 | label_attribute: Attribut |
|
202 | label_attribute: Attribut | |
202 | label_attribute_plural: Attributs |
|
203 | label_attribute_plural: Attributs | |
203 | label_download: %d Téléchargement |
|
204 | label_download: %d Téléchargement | |
204 | label_download_plural: %d Téléchargements |
|
205 | label_download_plural: %d Téléchargements | |
205 | label_no_data: Aucune donnée à afficher |
|
206 | label_no_data: Aucune donnée à afficher | |
206 | label_change_status: Changer le statut |
|
207 | label_change_status: Changer le statut | |
207 | label_history: Historique |
|
208 | label_history: Historique | |
208 | label_attachment: Fichier |
|
209 | label_attachment: Fichier | |
209 | label_attachment_new: Nouveau fichier |
|
210 | label_attachment_new: Nouveau fichier | |
210 | label_attachment_delete: Supprimer le fichier |
|
211 | label_attachment_delete: Supprimer le fichier | |
211 | label_attachment_plural: Fichiers |
|
212 | label_attachment_plural: Fichiers | |
212 | label_report: Rapport |
|
213 | label_report: Rapport | |
213 | label_report_plural: Rapports |
|
214 | label_report_plural: Rapports | |
214 | label_news: Annonce |
|
215 | label_news: Annonce | |
215 | label_news_new: Nouvelle annonce |
|
216 | label_news_new: Nouvelle annonce | |
216 | label_news_plural: Annonces |
|
217 | label_news_plural: Annonces | |
217 | label_news_latest: Dernières annonces |
|
218 | label_news_latest: Dernières annonces | |
218 | label_news_view_all: Voir toutes les annonces |
|
219 | label_news_view_all: Voir toutes les annonces | |
219 | label_change_log: Historique |
|
220 | label_change_log: Historique | |
220 | label_settings: Configuration |
|
221 | label_settings: Configuration | |
221 | label_overview: Aperçu |
|
222 | label_overview: Aperçu | |
222 | label_version: Version |
|
223 | label_version: Version | |
223 | label_version_new: Nouvelle version |
|
224 | label_version_new: Nouvelle version | |
224 | label_version_plural: Versions |
|
225 | label_version_plural: Versions | |
225 | label_confirmation: Confirmation |
|
226 | label_confirmation: Confirmation | |
226 | label_export_csv: Exporter en CSV |
|
227 | label_export_csv: Exporter en CSV | |
227 | label_read: Lire... |
|
228 | label_read: Lire... | |
228 | label_public_projects: Projets publics |
|
229 | label_public_projects: Projets publics | |
229 | label_open_issues: Ouverte |
|
230 | label_open_issues: Ouverte | |
230 | label_open_issues_plural: Ouvertes |
|
231 | label_open_issues_plural: Ouvertes | |
231 | label_closed_issues: Fermée |
|
232 | label_closed_issues: Fermée | |
232 | label_closed_issues_plural: Fermées |
|
233 | label_closed_issues_plural: Fermées | |
233 | label_total: Total |
|
234 | label_total: Total | |
234 | label_permissions: Permissions |
|
235 | label_permissions: Permissions | |
235 | label_current_status: Statut actuel |
|
236 | label_current_status: Statut actuel | |
236 | label_new_statuses_allowed: Nouveaux statuts autorisés |
|
237 | label_new_statuses_allowed: Nouveaux statuts autorisés | |
237 | label_all: Tous |
|
238 | label_all: Tous | |
238 | label_none: Aucun |
|
239 | label_none: Aucun | |
239 | label_next: Suivant |
|
240 | label_next: Suivant | |
240 | label_previous: Précédent |
|
241 | label_previous: Précédent | |
241 | label_used_by: Utilisé par |
|
242 | label_used_by: Utilisé par | |
242 |
|
243 | |||
243 | button_login: Connexion |
|
244 | button_login: Connexion | |
244 | button_submit: Soumettre |
|
245 | button_submit: Soumettre | |
245 | button_save: Valider |
|
246 | button_save: Valider | |
246 | button_check_all: Tout cocher |
|
247 | button_check_all: Tout cocher | |
247 | button_uncheck_all: Tout décocher |
|
248 | button_uncheck_all: Tout décocher | |
248 | button_delete: Supprimer |
|
249 | button_delete: Supprimer | |
249 | button_create: Créer |
|
250 | button_create: Créer | |
250 | button_test: Tester |
|
251 | button_test: Tester | |
251 | button_edit: Modifier |
|
252 | button_edit: Modifier | |
252 | button_add: Ajouter |
|
253 | button_add: Ajouter | |
253 | button_change: Changer |
|
254 | button_change: Changer | |
254 | button_apply: Appliquer |
|
255 | button_apply: Appliquer | |
255 | button_clear: Effacer |
|
256 | button_clear: Effacer | |
256 | button_lock: Verrouiller |
|
257 | button_lock: Verrouiller | |
257 | button_unlock: Déverrouiller |
|
258 | button_unlock: Déverrouiller | |
258 | button_download: Télécharger |
|
259 | button_download: Télécharger | |
259 | button_list: Lister |
|
260 | button_list: Lister | |
260 | button_view: Voir |
|
261 | button_view: Voir | |
261 |
|
262 | |||
262 | text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée. |
|
263 | text_select_mail_notifications: Sélectionner les actions pour lesquelles la notification par mail doit être activée. | |
263 | text_regexp_info: ex. ^[A-Z0-9]+$ |
|
264 | text_regexp_info: ex. ^[A-Z0-9]+$ | |
264 | text_min_max_length_info: 0 pour aucune restriction |
|
265 | text_min_max_length_info: 0 pour aucune restriction | |
265 | text_possible_values_info: valeurs séparées par | |
|
266 | text_possible_values_info: valeurs séparées par | | |
266 | text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ? |
|
267 | text_project_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce projet et tout ce qui lui est rattaché ? | |
267 | text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow |
|
268 | text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow | |
268 | text_are_you_sure: Etes-vous sûr ? |
|
269 | text_are_you_sure: Etes-vous sûr ? | |
269 |
|
270 | |||
270 | default_role_manager: Manager |
|
271 | default_role_manager: Manager | |
271 | default_role_developper: Développeur |
|
272 | default_role_developper: Développeur | |
272 | default_role_reporter: Rapporteur |
|
273 | default_role_reporter: Rapporteur | |
273 | default_tracker_bug: Anomalie |
|
274 | default_tracker_bug: Anomalie | |
274 | default_tracker_feature: Evolution |
|
275 | default_tracker_feature: Evolution | |
275 | default_tracker_support: Assistance |
|
276 | default_tracker_support: Assistance | |
276 | default_issue_status_new: Nouveau |
|
277 | default_issue_status_new: Nouveau | |
277 | default_issue_status_assigned: Assigné |
|
278 | default_issue_status_assigned: Assigné | |
278 | default_issue_status_resolved: Résolu |
|
279 | default_issue_status_resolved: Résolu | |
279 | default_issue_status_feedback: Commentaire |
|
280 | default_issue_status_feedback: Commentaire | |
280 | default_issue_status_closed: Fermé |
|
281 | default_issue_status_closed: Fermé | |
281 | default_issue_status_rejected: Rejeté |
|
282 | default_issue_status_rejected: Rejeté | |
282 | default_doc_category_user: Documentation utilisateur |
|
283 | default_doc_category_user: Documentation utilisateur | |
283 | default_doc_category_tech: Documentation technique |
|
284 | default_doc_category_tech: Documentation technique | |
284 | default_priority_low: Bas |
|
285 | default_priority_low: Bas | |
285 | default_priority_normal: Normal |
|
286 | default_priority_normal: Normal | |
286 | default_priority_high: Haut |
|
287 | default_priority_high: Haut | |
287 | default_priority_urgent: Urgent |
|
288 | default_priority_urgent: Urgent | |
288 | default_priority_immediate: Immédiat |
|
289 | default_priority_immediate: Immédiat | |
289 |
|
290 | |||
290 | enumeration_issue_priorities: Priorités des demandes |
|
291 | enumeration_issue_priorities: Priorités des demandes | |
291 | enumeration_doc_categories: Catégories des documents |
|
292 | enumeration_doc_categories: Catégories des documents |
@@ -1,393 +1,399 | |||||
1 | /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */ |
|
1 | /* andreas08 - an open source xhtml/css website layout by Andreas Viklund - http://andreasviklund.com . Free to use in any way and for any purpose as long as the proper credits are given to the original designer. Version: 1.0, November 28, 2005 */ | |
2 | /* Edited by Jean-Philippe Lang *> |
|
2 | /* Edited by Jean-Philippe Lang *> | |
3 | /**************** Body and tag styles ****************/ |
|
3 | /**************** Body and tag styles ****************/ | |
4 |
|
4 | |||
5 |
|
5 | |||
6 | #header * {margin:0; padding:0;} |
|
6 | #header * {margin:0; padding:0;} | |
7 | p, ul, ol, li {margin:0; padding:0;} |
|
7 | p, ul, ol, li {margin:0; padding:0;} | |
8 |
|
8 | |||
9 |
|
9 | |||
10 | body{ |
|
10 | body{ | |
11 | font:76% Verdana,Tahoma,Arial,sans-serif; |
|
11 | font:76% Verdana,Tahoma,Arial,sans-serif; | |
12 | line-height:1.4em; |
|
12 | line-height:1.4em; | |
13 | text-align:center; |
|
13 | text-align:center; | |
14 | color:#303030; |
|
14 | color:#303030; | |
15 | background:#e8eaec; |
|
15 | background:#e8eaec; | |
16 | margin:0; |
|
16 | margin:0; | |
17 | } |
|
17 | } | |
18 |
|
18 | |||
19 |
|
19 | |||
20 | a{ |
|
20 | a{ | |
21 | color:#467aa7; |
|
21 | color:#467aa7; | |
22 | font-weight:bold; |
|
22 | font-weight:bold; | |
23 | text-decoration:none; |
|
23 | text-decoration:none; | |
24 | background-color:inherit; |
|
24 | background-color:inherit; | |
25 | } |
|
25 | } | |
26 |
|
26 | |||
27 | a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;} |
|
27 | a:hover{color:#2a5a8a; text-decoration:none; background-color:inherit;} | |
28 | a img{border:none;} |
|
28 | a img{border:none;} | |
29 |
|
29 | |||
30 | p{padding:0 0 1em 0;} |
|
30 | p{padding:0 0 1em 0;} | |
31 | p form{margin-top:0; margin-bottom:20px;} |
|
31 | p form{margin-top:0; margin-bottom:20px;} | |
32 |
|
32 | |||
33 | img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;} |
|
33 | img.left,img.center,img.right{padding:4px; border:1px solid #a0a0a0;} | |
34 | img.left{float:left; margin:0 12px 5px 0;} |
|
34 | img.left{float:left; margin:0 12px 5px 0;} | |
35 | img.center{display:block; margin:0 auto 5px auto;} |
|
35 | img.center{display:block; margin:0 auto 5px auto;} | |
36 | img.right{float:right; margin:0 0 5px 12px;} |
|
36 | img.right{float:right; margin:0 0 5px 12px;} | |
37 |
|
37 | |||
38 | /**************** Header and navigation styles ****************/ |
|
38 | /**************** Header and navigation styles ****************/ | |
39 |
|
39 | |||
40 | #container{ |
|
40 | #container{ | |
41 | width:100%; |
|
41 | width:100%; | |
42 | min-width: 800px; |
|
42 | min-width: 800px; | |
43 | margin:0; |
|
43 | margin:0; | |
44 | padding:0; |
|
44 | padding:0; | |
45 | text-align:left; |
|
45 | text-align:left; | |
46 | background:#ffffff; |
|
46 | background:#ffffff; | |
47 | color:#303030; |
|
47 | color:#303030; | |
48 | } |
|
48 | } | |
49 |
|
49 | |||
50 | #header{ |
|
50 | #header{ | |
51 | height:4.5em; |
|
51 | height:4.5em; | |
52 | /*width:758px;*/ |
|
52 | /*width:758px;*/ | |
53 | margin:0; |
|
53 | margin:0; | |
54 | background:#467aa7; |
|
54 | background:#467aa7; | |
55 | color:#ffffff; |
|
55 | color:#ffffff; | |
56 | margin-bottom:1px; |
|
56 | margin-bottom:1px; | |
57 | } |
|
57 | } | |
58 |
|
58 | |||
59 | #header h1{ |
|
59 | #header h1{ | |
60 | padding:10px 0 0 20px; |
|
60 | padding:10px 0 0 20px; | |
61 | font-size:1.8em; |
|
61 | font-size:1.8em; | |
62 | background-color:inherit; |
|
62 | background-color:inherit; | |
63 | color:#fff; /*rgb(152, 26, 33);*/ |
|
63 | color:#fff; /*rgb(152, 26, 33);*/ | |
64 | letter-spacing:-2px; |
|
64 | letter-spacing:-2px; | |
65 | font-weight:normal; |
|
65 | font-weight:normal; | |
66 | } |
|
66 | } | |
67 |
|
67 | |||
68 | #header h2{ |
|
68 | #header h2{ | |
69 | margin:3px 0 0 40px; |
|
69 | margin:3px 0 0 40px; | |
70 | font-size:1.4em; |
|
70 | font-size:1.4em; | |
71 | background-color:inherit; |
|
71 | background-color:inherit; | |
72 | color:#f0f2f4; |
|
72 | color:#f0f2f4; | |
73 | letter-spacing:-1px; |
|
73 | letter-spacing:-1px; | |
74 | font-weight:normal; |
|
74 | font-weight:normal; | |
75 | } |
|
75 | } | |
76 |
|
76 | |||
77 | #navigation{ |
|
77 | #navigation{ | |
78 | height:2.2em; |
|
78 | height:2.2em; | |
79 | line-height:2.2em; |
|
79 | line-height:2.2em; | |
80 | /*width:758px;*/ |
|
80 | /*width:758px;*/ | |
81 | margin:0; |
|
81 | margin:0; | |
82 | background:#578bb8; |
|
82 | background:#578bb8; | |
83 | color:#ffffff; |
|
83 | color:#ffffff; | |
84 | } |
|
84 | } | |
85 |
|
85 | |||
86 | #navigation li{ |
|
86 | #navigation li{ | |
87 | float:left; |
|
87 | float:left; | |
88 | list-style-type:none; |
|
88 | list-style-type:none; | |
89 | border-right:1px solid #ffffff; |
|
89 | border-right:1px solid #ffffff; | |
90 | white-space:nowrap; |
|
90 | white-space:nowrap; | |
91 | } |
|
91 | } | |
92 |
|
92 | |||
93 | #navigation li.right { |
|
93 | #navigation li.right { | |
94 | float:right; |
|
94 | float:right; | |
95 | list-style-type:none; |
|
95 | list-style-type:none; | |
96 | border-right:0; |
|
96 | border-right:0; | |
97 | border-left:1px solid #ffffff; |
|
97 | border-left:1px solid #ffffff; | |
98 | white-space:nowrap; |
|
98 | white-space:nowrap; | |
99 | } |
|
99 | } | |
100 |
|
100 | |||
101 | #navigation li a{ |
|
101 | #navigation li a{ | |
102 | display:block; |
|
102 | display:block; | |
103 | padding:0px 10px 0px 22px; |
|
103 | padding:0px 10px 0px 22px; | |
104 | font-size:0.8em; |
|
104 | font-size:0.8em; | |
105 | font-weight:normal; |
|
105 | font-weight:normal; | |
106 | /*text-transform:uppercase;*/ |
|
106 | /*text-transform:uppercase;*/ | |
107 | text-decoration:none; |
|
107 | text-decoration:none; | |
108 | background-color:inherit; |
|
108 | background-color:inherit; | |
109 | color: #ffffff; |
|
109 | color: #ffffff; | |
110 | } |
|
110 | } | |
111 |
|
111 | |||
112 | * html #navigation a {width:1%;} |
|
112 | * html #navigation a {width:1%;} | |
113 |
|
113 | |||
114 | #navigation .selected,#navigation a:hover{ |
|
114 | #navigation .selected,#navigation a:hover{ | |
115 | color:#ffffff; |
|
115 | color:#ffffff; | |
116 | text-decoration:none; |
|
116 | text-decoration:none; | |
117 | background-color: #80b0da; |
|
117 | background-color: #80b0da; | |
118 | } |
|
118 | } | |
119 |
|
119 | |||
120 | /**************** Icons links *******************/ |
|
120 | /**************** Icons links *******************/ | |
121 | .picHome { background: url(../images/home.png) no-repeat 4px 50%; } |
|
121 | .picHome { background: url(../images/home.png) no-repeat 4px 50%; } | |
122 | .picUser { background: url(../images/user.png) no-repeat 4px 50%; } |
|
122 | .picUser { background: url(../images/user.png) no-repeat 4px 50%; } | |
123 | .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; } |
|
123 | .picUserPage { background: url(../images/user_page.png) no-repeat 4px 50%; } | |
124 | .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; } |
|
124 | .picAdmin { background: url(../images/admin.png) no-repeat 4px 50%; } | |
125 | .picProject { background: url(../images/projects.png) no-repeat 4px 50%; } |
|
125 | .picProject { background: url(../images/projects.png) no-repeat 4px 50%; } | |
126 | .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; } |
|
126 | .picLogout { background: url(../images/logout.png) no-repeat 4px 50%; } | |
127 | .picHelp { background: url(../images/help.png) no-repeat 4px 50%; } |
|
127 | .picHelp { background: url(../images/help.png) no-repeat 4px 50%; } | |
128 |
|
128 | |||
129 | /**************** Content styles ****************/ |
|
129 | /**************** Content styles ****************/ | |
130 |
|
130 | |||
131 | html>body #content { |
|
131 | html>body #content { | |
132 | height: auto; |
|
132 | height: auto; | |
133 | min-height: 300px; |
|
133 | min-height: 300px; | |
134 | } |
|
134 | } | |
135 |
|
135 | |||
136 | #content{ |
|
136 | #content{ | |
137 | /*float:right;*/ |
|
137 | /*float:right;*/ | |
138 | /*width:530px;*/ |
|
138 | /*width:530px;*/ | |
139 | width: auto; |
|
139 | width: auto; | |
140 | height:300px; |
|
140 | height:300px; | |
141 | font-size:0.9em; |
|
141 | font-size:0.9em; | |
142 | padding:20px 10px 10px 20px; |
|
142 | padding:20px 10px 10px 20px; | |
143 | /*position: absolute;*/ |
|
143 | /*position: absolute;*/ | |
144 | margin-left: 120px; |
|
144 | margin-left: 120px; | |
145 | border-left: 1px dashed #c0c0c0; |
|
145 | border-left: 1px dashed #c0c0c0; | |
146 |
|
146 | |||
147 | } |
|
147 | } | |
148 |
|
148 | |||
149 | #content h2{ |
|
149 | #content h2{ | |
150 | display:block; |
|
150 | display:block; | |
151 | margin:0 0 16px 0; |
|
151 | margin:0 0 16px 0; | |
152 | font-size:1.7em; |
|
152 | font-size:1.7em; | |
153 | font-weight:normal; |
|
153 | font-weight:normal; | |
154 | letter-spacing:-1px; |
|
154 | letter-spacing:-1px; | |
155 | color:#505050; |
|
155 | color:#505050; | |
156 | background-color:inherit; |
|
156 | background-color:inherit; | |
157 | } |
|
157 | } | |
158 |
|
158 | |||
159 | #content h2 a{font-weight:normal;} |
|
159 | #content h2 a{font-weight:normal;} | |
160 | #content h3{margin:0 0 12px 0; font-size:1.4em; letter-spacing:-1px;} |
|
160 | #content h3{margin:0 0 12px 0; font-size:1.4em; letter-spacing:-1px;} | |
161 | #content a:hover,#subcontent a:hover{text-decoration:underline;} |
|
161 | #content a:hover,#subcontent a:hover{text-decoration:underline;} | |
162 | #content ul,#content ol{margin:0 5px 16px 35px;} |
|
162 | #content ul,#content ol{margin:0 5px 16px 35px;} | |
163 | #content dl{margin:0 5px 10px 25px;} |
|
163 | #content dl{margin:0 5px 10px 25px;} | |
164 | #content dt{font-weight:bold; margin-bottom:5px;} |
|
164 | #content dt{font-weight:bold; margin-bottom:5px;} | |
165 | #content dd{margin:0 0 10px 15px;} |
|
165 | #content dd{margin:0 0 10px 15px;} | |
166 |
|
166 | |||
167 |
|
167 | |||
168 | /***********************************************/ |
|
168 | /***********************************************/ | |
169 |
|
169 | |||
170 | /* |
|
170 | /* | |
171 | form{ |
|
171 | form{ | |
172 | padding:15px; |
|
172 | padding:15px; | |
173 | margin:0 0 20px 0; |
|
173 | margin:0 0 20px 0; | |
174 | border:1px solid #c0c0c0; |
|
174 | border:1px solid #c0c0c0; | |
175 | background-color:#CEE1ED; |
|
175 | background-color:#CEE1ED; | |
176 | width:600px; |
|
176 | width:600px; | |
177 | } |
|
177 | } | |
178 | */ |
|
178 | */ | |
179 |
|
179 | |||
180 | form { |
|
180 | form { | |
181 | display: inline; |
|
181 | display: inline; | |
182 | } |
|
182 | } | |
183 |
|
183 | |||
184 | .noborder { |
|
184 | .noborder { | |
185 | border:0px; |
|
185 | border:0px; | |
186 | Exception exceptions.AssertionError: <exceptions.AssertionError instance at 0xb7c0b20c> in <bound |
|
186 | Exception exceptions.AssertionError: <exceptions.AssertionError instance at 0xb7c0b20c> in <bound | |
187 | method SubversionRepository.__del__ of <vclib.svn.SubversionRepository instance at 0xb7c1252c>> |
|
187 | method SubversionRepository.__del__ of <vclib.svn.SubversionRepository instance at 0xb7c1252c>> | |
188 | ignored |
|
188 | ignored | |
189 |
|
189 | |||
190 | background-color:#fff; |
|
190 | background-color:#fff; | |
191 | width:100%; |
|
191 | width:100%; | |
192 | } |
|
192 | } | |
193 |
|
193 | |||
194 | textarea { |
|
194 | textarea { | |
195 | padding:0; |
|
195 | padding:0; | |
196 | margin:0; |
|
196 | margin:0; | |
197 | } |
|
197 | } | |
198 |
|
198 | |||
199 | input { |
|
199 | input { | |
200 | vertical-align: middle; |
|
200 | vertical-align: middle; | |
201 | } |
|
201 | } | |
202 |
|
202 | |||
203 | input.button-small |
|
203 | input.button-small | |
204 | { |
|
204 | { | |
205 | font-size: 0.8em; |
|
205 | font-size: 0.8em; | |
206 | } |
|
206 | } | |
207 |
|
207 | |||
208 | select.select-small |
|
208 | select.select-small | |
209 | { |
|
209 | { | |
210 | border: 1px solid #7F9DB9; |
|
210 | border: 1px solid #7F9DB9; | |
211 | padding: 1px; |
|
211 | padding: 1px; | |
212 | font-size: 0.8em; |
|
212 | font-size: 0.8em; | |
213 | } |
|
213 | } | |
214 |
|
214 | |||
215 | .active-filter |
|
215 | .active-filter | |
216 | { |
|
216 | { | |
217 | background-color: #F9FA9E; |
|
217 | background-color: #F9FA9E; | |
218 |
|
218 | |||
219 | } |
|
219 | } | |
220 |
|
220 | |||
221 | label { |
|
221 | label { | |
222 | font-weight: bold; |
|
222 | font-weight: bold; | |
223 | font-size: 1em; |
|
223 | font-size: 1em; | |
224 | } |
|
224 | } | |
225 |
|
225 | |||
226 | fieldset { |
|
226 | fieldset { | |
227 | border:1px solid #7F9DB9; |
|
227 | border:1px solid #7F9DB9; | |
228 | padding: 6px; |
|
228 | padding: 6px; | |
229 | } |
|
229 | } | |
230 |
|
230 | |||
231 | legend { |
|
231 | legend { | |
232 | color: #505050; |
|
232 | color: #505050; | |
233 |
|
233 | |||
234 | } |
|
234 | } | |
235 |
|
235 | |||
236 | .required { |
|
236 | .required { | |
237 | color: #bb0000; |
|
237 | color: #bb0000; | |
238 | } |
|
238 | } | |
239 |
|
239 | |||
240 | table.listTableContent { |
|
240 | table.listTableContent { | |
241 | border:1px solid #578bb8; |
|
241 | border:1px solid #578bb8; | |
242 | width:99%; |
|
242 | width:99%; | |
243 | border-collapse: collapse; |
|
243 | border-collapse: collapse; | |
244 | } |
|
244 | } | |
245 |
|
245 | |||
246 | table.listTableContent td { |
|
246 | table.listTableContent td { | |
247 | padding:4px; |
|
247 | padding:4px; | |
248 | } |
|
248 | } | |
249 |
|
249 | |||
250 | tr.ListHead { |
|
250 | tr.ListHead { | |
251 | background-color:#467aa7; |
|
251 | background-color:#467aa7; | |
252 | color:#FFFFFF; |
|
252 | color:#FFFFFF; | |
253 | text-align:center; |
|
253 | text-align:center; | |
254 | } |
|
254 | } | |
255 |
|
255 | |||
256 | tr.ListHead a { |
|
256 | tr.ListHead a { | |
257 | color:#FFFFFF; |
|
257 | color:#FFFFFF; | |
258 | text-decoration:underline; |
|
258 | text-decoration:underline; | |
259 | } |
|
259 | } | |
260 |
|
260 | |||
261 | tr.odd { |
|
261 | tr.odd { | |
262 | background-color:#f0f1f2; |
|
262 | background-color:#f0f1f2; | |
263 | } |
|
263 | } | |
264 | tr.even { |
|
264 | tr.even { | |
265 | background-color: #fff; |
|
265 | background-color: #fff; | |
266 | } |
|
266 | } | |
267 |
|
267 | |||
268 | hr { border:none; border-bottom: dotted 2px #c0c0c0; } |
|
268 | hr { border:none; border-bottom: dotted 2px #c0c0c0; } | |
269 |
|
269 | |||
270 |
|
270 | |||
271 | /**************** Sidebar styles ****************/ |
|
271 | /**************** Sidebar styles ****************/ | |
272 |
|
272 | |||
273 | #subcontent{ |
|
273 | #subcontent{ | |
274 | float:left; |
|
274 | float:left; | |
275 | clear:both; |
|
275 | clear:both; | |
276 | width:110px; |
|
276 | width:110px; | |
277 | padding:20px 20px 10px 5px; |
|
277 | padding:20px 20px 10px 5px; | |
278 | } |
|
278 | } | |
279 |
|
279 | |||
280 | #subcontent h2{ |
|
280 | #subcontent h2{ | |
281 | display:block; |
|
281 | display:block; | |
282 | margin:0 0 5px 0; |
|
282 | margin:0 0 5px 0; | |
283 | font-size:1.0em; |
|
283 | font-size:1.0em; | |
284 | font-weight:bold; |
|
284 | font-weight:bold; | |
285 | text-align:left; |
|
285 | text-align:left; | |
286 | letter-spacing:-1px; |
|
286 | letter-spacing:-1px; | |
287 | color:#606060; |
|
287 | color:#606060; | |
288 | background-color:inherit; |
|
288 | background-color:inherit; | |
289 | } |
|
289 | } | |
290 |
|
290 | |||
291 | #subcontent p{margin:0 0 16px 0; font-size:0.9em;} |
|
291 | #subcontent p{margin:0 0 16px 0; font-size:0.9em;} | |
292 |
|
292 | |||
293 | /**************** Menublock styles ****************/ |
|
293 | /**************** Menublock styles ****************/ | |
294 |
|
294 | |||
295 | .menublock{margin:0 0 20px 8px; font-size:0.8em;} |
|
295 | .menublock{margin:0 0 20px 8px; font-size:0.8em;} | |
296 | .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;} |
|
296 | .menublock li{list-style:none; display:block; padding:1px; margin-bottom:0px;} | |
297 | .menublock li a{font-weight:bold; text-decoration:none;} |
|
297 | .menublock li a{font-weight:bold; text-decoration:none;} | |
298 | .menublock li a:hover{text-decoration:none;} |
|
298 | .menublock li a:hover{text-decoration:none;} | |
299 | .menublock li ul{margin:0; font-size:1em; font-weight:normal;} |
|
299 | .menublock li ul{margin:0; font-size:1em; font-weight:normal;} | |
300 | .menublock li ul li{margin-bottom:0;} |
|
300 | .menublock li ul li{margin-bottom:0;} | |
301 | .menublock li ul a{font-weight:normal;} |
|
301 | .menublock li ul a{font-weight:normal;} | |
302 |
|
302 | |||
303 | /**************** Searchbar styles ****************/ |
|
303 | /**************** Searchbar styles ****************/ | |
304 |
|
304 | |||
305 | #searchbar{margin:0 0 20px 0;} |
|
305 | #searchbar{margin:0 0 20px 0;} | |
306 | #searchbar form fieldset{margin-left:10px; border:0 solid;} |
|
306 | #searchbar form fieldset{margin-left:10px; border:0 solid;} | |
307 |
|
307 | |||
308 | #searchbar #s{ |
|
308 | #searchbar #s{ | |
309 | height:1.2em; |
|
309 | height:1.2em; | |
310 | width:110px; |
|
310 | width:110px; | |
311 | margin:0 5px 0 0; |
|
311 | margin:0 5px 0 0; | |
312 | border:1px solid #a0a0a0; |
|
312 | border:1px solid #a0a0a0; | |
313 | } |
|
313 | } | |
314 |
|
314 | |||
315 | #searchbar #searchbutton{ |
|
315 | #searchbar #searchbutton{ | |
316 | width:auto; |
|
316 | width:auto; | |
317 | padding:0 1px; |
|
317 | padding:0 1px; | |
318 | border:1px solid #808080; |
|
318 | border:1px solid #808080; | |
319 | font-size:0.9em; |
|
319 | font-size:0.9em; | |
320 | text-align:center; |
|
320 | text-align:center; | |
321 | } |
|
321 | } | |
322 |
|
322 | |||
323 | /**************** Footer styles ****************/ |
|
323 | /**************** Footer styles ****************/ | |
324 |
|
324 | |||
325 | #footer{ |
|
325 | #footer{ | |
326 | clear:both; |
|
326 | clear:both; | |
327 | /*width:758px;*/ |
|
327 | /*width:758px;*/ | |
328 | padding:5px 0; |
|
328 | padding:5px 0; | |
329 | margin:0; |
|
329 | margin:0; | |
330 | font-size:0.9em; |
|
330 | font-size:0.9em; | |
331 | color:#f0f0f0; |
|
331 | color:#f0f0f0; | |
332 | background:#467aa7; |
|
332 | background:#467aa7; | |
333 | } |
|
333 | } | |
334 |
|
334 | |||
335 | #footer p{padding:0; margin:0; text-align:center;} |
|
335 | #footer p{padding:0; margin:0; text-align:center;} | |
336 | #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;} |
|
336 | #footer a{color:#f0f0f0; background-color:inherit; font-weight:bold;} | |
337 | #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;} |
|
337 | #footer a:hover{color:#ffffff; background-color:inherit; text-decoration: underline;} | |
338 |
|
338 | |||
339 | /**************** Misc classes and styles ****************/ |
|
339 | /**************** Misc classes and styles ****************/ | |
340 |
|
340 | |||
341 | .splitcontentleft{float:left; width:49%;} |
|
341 | .splitcontentleft{float:left; width:49%;} | |
342 | .splitcontentright{float:right; width:49%;} |
|
342 | .splitcontentright{float:right; width:49%;} | |
343 | .clear{clear:both;} |
|
343 | .clear{clear:both;} | |
344 | .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;} |
|
344 | .small{font-size:0.8em;line-height:1.4em;padding:0 0 0 0;} | |
345 | .hide{display:none;} |
|
345 | .hide{display:none;} | |
346 | .textcenter{text-align:center;} |
|
346 | .textcenter{text-align:center;} | |
347 | .textright{text-align:right;} |
|
347 | .textright{text-align:right;} | |
348 | .important{color:#f02025; background-color:inherit; font-weight:bold;} |
|
348 | .important{color:#f02025; background-color:inherit; font-weight:bold;} | |
349 |
|
349 | |||
350 | .box{ |
|
350 | .box{ | |
351 | margin:0 0 20px 0; |
|
351 | margin:0 0 20px 0; | |
352 | padding:10px; |
|
352 | padding:10px; | |
353 | border:1px solid #c0c0c0; |
|
353 | border:1px solid #c0c0c0; | |
354 | background-color:#fafbfc; |
|
354 | background-color:#fafbfc; | |
355 | color:#505050; |
|
355 | color:#505050; | |
356 | line-height:1.5em; |
|
356 | line-height:1.5em; | |
357 | } |
|
357 | } | |
358 |
|
358 | |||
359 | .login { |
|
359 | .login { | |
360 | width: 50%; |
|
360 | width: 50%; | |
361 | text-align: left; |
|
361 | text-align: left; | |
362 | } |
|
362 | } | |
363 |
|
363 | |||
|
364 | img.calendar-trigger { | |||
|
365 | cursor: pointer; | |||
|
366 | vertical-align: middle; | |||
|
367 | margin-left: 4px; | |||
|
368 | } | |||
|
369 | ||||
364 |
|
370 | |||
365 | /***** CSS FORM ******/ |
|
371 | /***** CSS FORM ******/ | |
366 | .tabular p{ |
|
372 | .tabular p{ | |
367 | margin: 0; |
|
373 | margin: 0; | |
368 | padding: 5px 0 8px 0; |
|
374 | padding: 5px 0 8px 0; | |
369 | padding-left: 180px; /*width of left column containing the label elements*/ |
|
375 | padding-left: 180px; /*width of left column containing the label elements*/ | |
370 | height: 1%; |
|
376 | height: 1%; | |
371 | } |
|
377 | } | |
372 |
|
378 | |||
373 | .tabular label{ |
|
379 | .tabular label{ | |
374 | font-weight: bold; |
|
380 | font-weight: bold; | |
375 | float: left; |
|
381 | float: left; | |
376 | margin-left: -180px; /*width of left column*/ |
|
382 | margin-left: -180px; /*width of left column*/ | |
377 | width: 175px; /*width of labels. Should be smaller than left column to create some right |
|
383 | width: 175px; /*width of labels. Should be smaller than left column to create some right | |
378 | margin*/ |
|
384 | margin*/ | |
379 | } |
|
385 | } | |
380 |
|
386 | |||
381 | .error { |
|
387 | .error { | |
382 | color: #cc0000; |
|
388 | color: #cc0000; | |
383 | } |
|
389 | } | |
384 |
|
390 | |||
385 |
|
391 | |||
386 | /*.threepxfix class below: |
|
392 | /*.threepxfix class below: | |
387 | Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents. |
|
393 | Targets IE6- ONLY. Adds 3 pixel indent for multi-line form contents. | |
388 | to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html |
|
394 | to account for 3 pixel bug: http://www.positioniseverything.net/explorer/threepxtest.html | |
389 | */ |
|
395 | */ | |
390 |
|
396 | |||
391 | * html .threepxfix{ |
|
397 | * html .threepxfix{ | |
392 | margin-left: 3px; |
|
398 | margin-left: 3px; | |
393 | } No newline at end of file |
|
399 | } |
General Comments 0
You need to be logged in to leave comments.
Login now