Index: xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/classes/DateClass.java =================================================================== --- xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/classes/DateClass.java (revision 3797) +++ xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/classes/DateClass.java (working copy) @@ -1,219 +1,327 @@ -/* - * Copyright 2006, XpertNet SARL, and individual contributors as indicated - * by the contributors.txt. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - * - * @author ludovic - * @author sdumitriu - */ - -package com.xpn.xwiki.objects.classes; - -import com.xpn.xwiki.XWikiContext; -import com.xpn.xwiki.objects.BaseCollection; -import com.xpn.xwiki.objects.BaseProperty; -import com.xpn.xwiki.objects.DateProperty; -import com.xpn.xwiki.objects.meta.PropertyMetaClass; -import com.xpn.xwiki.plugin.query.XWikiQuery; -import com.xpn.xwiki.plugin.query.XWikiCriteria; -import com.xpn.xwiki.web.XWikiMessageTool; -import org.apache.ecs.xhtml.input; -import org.apache.ecs.xhtml.link; -import org.dom4j.Element; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Map; - -public class DateClass extends PropertyClass { - - public DateClass(PropertyMetaClass wclass) { - super("date", "Date", wclass); - setSize(20); - setDateFormat("dd/MM/yyyy HH:mm:ss"); - setEmptyIsToday(1); - setPicker(1); - } - - public DateClass() { - this(null); - } - - public int getPicker() { - return getIntValue("picker"); - } - - public void setPicker(int picker) { - setIntValue("picker", picker); - } - - public int getSize() { - return getIntValue("size"); - } - - public void setSize(int size) { - setIntValue("size", size); - } - - public int getEmptyIsToday() { - return getIntValue("emptyIsToday"); - } - - public void setEmptyIsToday(int emptyIsToday) { - setIntValue("emptyIsToday", emptyIsToday); - } - - public String getDateFormat() { - return getStringValue("dateFormat"); - } - - public void setDateFormat(String dformat) { - setStringValue("dateFormat", dformat); - } - - public BaseProperty fromString(String value) { - BaseProperty property = newProperty(); - - if ((value==null)||(value.equals(""))) { - if (getEmptyIsToday()==1) - property.setValue(new Date()); - return property; - } - - try { - SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat()); - property.setValue(sdf.parse(value)); - } catch (ParseException e) { - return null; - } - return property; - } - - public BaseProperty newProperty() { - BaseProperty property = new DateProperty(); - property.setName(getName()); - return property; - } - - public String toFormString(BaseProperty property) { - if (property.getValue()==null) - return ""; - SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat()); - return sdf.format(property.getValue()); - } - - public BaseProperty newPropertyfromXML(Element ppcel) { - String value = ppcel.getText(); - BaseProperty property = newProperty(); - - if ((value==null)||(value.equals(""))) { - property.setValue(new Date()); - return property; - } - - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); - property.setValue(sdf.parse(value)); - } catch (ParseException e) { - try { - e.printStackTrace(); - SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.US); - property.setValue(sdf.parse(value)); - } catch (ParseException e2) { - e2.printStackTrace(); - property.setValue(new Date()); - } - } - return property; - } - - public void displayView(StringBuffer buffer, String name, String prefix, BaseCollection object, XWikiContext context) { - BaseProperty prop = (BaseProperty) object.safeget(name); - buffer.append(toFormString(prop)); - } - - public void displayEdit(StringBuffer buffer, String name, String prefix, BaseCollection object, XWikiContext context) { - input input = new input(); - - BaseProperty prop = (BaseProperty) object.safeget(name); - if (prop!=null) input.setValue(toFormString(prop)); - - input.setType("text"); - input.setName(prefix + name); - input.setID(prefix + name); - input.setSize(getSize()); - buffer.append(input.toString()); - - link link = new link(); - link.setHref("javascript:void()"); - link.setOnClick(""); - link.setTarget("?"); - buffer.append(link.toString()); - } - - public void displaySearch(StringBuffer buffer, String name, String prefix, XWikiCriteria criteria, XWikiContext context) { - input input1 = new input(); - input1.setType("text"); - input1.setName(prefix + name + "_morethan"); - input1.setID(prefix + name); - input1.setSize(getSize()); - String fieldFullName = getFieldFullName(); - - Date value = (Date) criteria.getParameter(fieldFullName + "_morethan"); - if (value!=null) { - DateProperty dprop = new DateProperty(); - dprop.setValue(value); - input1.setValue(toFormString(dprop)); - } - - input input2 = new input(); - - input2.setType("text"); - input2.setName(prefix + name+ "_lessthan"); - input2.setID(prefix + name); - input2.setSize(getSize()); - value = (Date) criteria.getParameter(fieldFullName + "_lessthan"); - if (value!=null) { - DateProperty dprop = new DateProperty(); - dprop.setValue(value); - input2.setValue(toFormString(dprop)); - } - - XWikiMessageTool msg = context.getMessageTool(); - buffer.append((msg==null) ? "from" : msg.get("from")); - buffer.append(input1.toString()); - buffer.append((msg==null) ? "from" : msg.get("to")); - buffer.append(input2.toString()); - } - - public void fromSearchMap(XWikiQuery query, Map map) { - String[] data = (String[])map.get(""); - if ((data!=null)&&(data.length==1)) - query.setParam(getObject().getName() + "_" + getName(), fromString(data[0]).getValue()); - else { - data = (String[])map.get("lessthan"); - if ((data!=null)&&(data.length==1)) - query.setParam(getObject().getName() + "_" + getName() + "_lessthan", fromString(data[0]).getValue()); - data = (String[])map.get("morethan"); - if ((data!=null)&&(data.length==1)) - query.setParam(getObject().getName() + "_" + getName() + "_morethan", fromString(data[0]).getValue()); - - } - } -} +/* + * Copyright 2006, XpertNet SARL, and individual contributors as indicated + * by the contributors.txt. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + * + * @author ludovic + * @author sdumitriu + */ + +package com.xpn.xwiki.objects.classes; + +import com.xpn.xwiki.XWikiContext; +import com.xpn.xwiki.XWiki; +import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.doc.XWikiDocument; +import com.xpn.xwiki.objects.BaseCollection; +import com.xpn.xwiki.objects.BaseProperty; +import com.xpn.xwiki.objects.DateProperty; +import com.xpn.xwiki.objects.meta.PropertyMetaClass; +import com.xpn.xwiki.plugin.query.XWikiQuery; +import com.xpn.xwiki.plugin.query.XWikiCriteria; +import com.xpn.xwiki.web.XWikiMessageTool; + +import org.apache.ecs.xhtml.img; +import org.apache.ecs.xhtml.input; +import org.dom4j.Element; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; + +public class DateClass extends PropertyClass { + + public DateClass(PropertyMetaClass wclass) { + super("date", "Date", wclass); + setSize(20); + setDateFormat("dd/MM/yyyy HH:mm:ss"); + setEmptyIsToday(1); + setPicker(1); + } + + public DateClass() { + this(null); + } + + public int getPicker() { + return getIntValue("picker"); + } + + public void setPicker(int picker) { + setIntValue("picker", picker); + } + + public int getSize() { + return getIntValue("size"); + } + + public void setSize(int size) { + setIntValue("size", size); + } + + public int getEmptyIsToday() { + return getIntValue("emptyIsToday"); + } + + public void setEmptyIsToday(int emptyIsToday) { + setIntValue("emptyIsToday", emptyIsToday); + } + + public String getDateFormat() { + return getStringValue("dateFormat"); + } + + public void setDateFormat(String dformat) { + setStringValue("dateFormat", dformat); + } + + public int getMinYear() { + return getIntValue("minYear"); + } + + public void setMinYear(int minyear) { + setIntValue("minYear", minyear); + } + + public int getMaxYear() { + return getIntValue("maxYear"); + } + + public void setMaxYear(int maxyear) { + setIntValue("maxYear", maxyear); + } + + public int getOverlapMonths() { + return getIntValue("overlap"); + } + + public void setOverlapMonths(int overlap) { + setIntValue("overlap", overlap); + } + + public String getLanguage() { + return getStringValue("lang"); + } + + public void setLanguage(String lang) { + setStringValue("lang", lang); + } + + public String getDatepickerTheme(XWikiContext context) { + XWiki xwiki = context.getWiki(); + String dptheme =""; + try { + XWikiDocument doc = xwiki.getDocument("XWiki.XWikiPreferences", context); + BaseProperty bprop = (BaseProperty)(doc.getObject("XWiki.XWikiPreferences").get("datepicker_theme")); + dptheme = bprop.toText(); + } catch (XWikiException e) { + // TODO Auto-generated catch block + } + finally{ + return dptheme; + } + } + + public BaseProperty fromString(String value) { + BaseProperty property = newProperty(); + + if ((value==null)||(value.equals(""))) { + if (getEmptyIsToday()==1) + property.setValue(new Date()); + return property; + } + + try { + SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat()); + property.setValue(sdf.parse(value)); + } catch (ParseException e) { + return null; + } + return property; + } + + public BaseProperty newProperty() { + BaseProperty property = new DateProperty(); + property.setName(getName()); + return property; + } + + public String toFormString(BaseProperty property) { + if (property.getValue()==null) + return ""; + SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat()); + return sdf.format(property.getValue()); + } + + public BaseProperty newPropertyfromXML(Element ppcel) { + String value = ppcel.getText(); + BaseProperty property = newProperty(); + + if ((value==null)||(value.equals(""))) { + property.setValue(new Date()); + return property; + } + + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + property.setValue(sdf.parse(value)); + } catch (ParseException e) { + try { + e.printStackTrace(); + SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.US); + property.setValue(sdf.parse(value)); + } catch (ParseException e2) { + e2.printStackTrace(); + property.setValue(new Date()); + } + } + return property; + } + + public void displayView(StringBuffer buffer, String name, String prefix, BaseCollection object, XWikiContext context) { + BaseProperty prop = (BaseProperty) object.safeget(name); + buffer.append(toFormString(prop)); + } + + public void displayEdit(StringBuffer buffer, String name, String prefix, BaseCollection object, XWikiContext context) { + input input = new input(); + + BaseProperty prop = (BaseProperty) object.safeget(name); + if (prop!=null) input.setValue(toFormString(prop)); + + input.setType("text"); + input.setName(prefix + name); + input.setID(prefix + name); + input.setSize(getSize()); + + //the image is used to bring on the datepicker, when clicked + img img = new img(); + XWiki xwiki = context.getWiki(); + String imgpath = xwiki.getSkinFile("calendar/img.gif", context); + img.setSrc(imgpath); + img.setID("dateselector" + prefix + name); + img.setStyle("cursor: pointer;"); + img.setTitle("Date selector"); + img.setAlt("Date selector"); + img.setStyle("display: none;"); // appear only if javascript is enabled + + String dateformat = this.getDateFormat(); + boolean showsTime = false; + int timeFormat = 24; + int startTimeWith = 0; + + if(dateformat.indexOf('h') >= 0 || dateformat.indexOf('K') >= 0 || dateformat.indexOf('H') >= 0 || dateformat.indexOf('k') >= 0 || dateformat.indexOf('m') >= 0 || dateformat.indexOf('s') >= 0 || dateformat.indexOf('S') >= 0) + showsTime = true; + + if(dateformat.indexOf('h') >= 0) { + timeFormat = 12; + startTimeWith = 1; + } + else if(dateformat.indexOf('H') >= 0) { + timeFormat = 24; + startTimeWith = 0; + } + else if(dateformat.indexOf('k') >= 0) { + timeFormat = 24; + startTimeWith = 1; + } + else if(dateformat.indexOf('K') >= 0) { + timeFormat = 12; + startTimeWith = 0; + } + + int minyear = getMinYear(); + int maxyear = getMaxYear(); + + boolean showOtherMonths = false; + showOtherMonths = getOverlapMonths() == 1 ? true : false; + + // the calendar allows more skins, which are taken from Preferences/Skin/Datepicker Theme + String skinfile = this.getDatepickerTheme(context); + if(skinfile == null || skinfile == "") skinfile = "aero"; + + String script = ""; + + buffer.append(input.toString()); + buffer.append(img.toString()); + buffer.append(script); + } + + public void displaySearch(StringBuffer buffer, String name, String prefix, XWikiCriteria criteria, XWikiContext context) { + input input1 = new input(); + input1.setType("text"); + input1.setName(prefix + name + "_morethan"); + input1.setID(prefix + name); + input1.setSize(getSize()); + String fieldFullName = getFieldFullName(); + + Date value = (Date) criteria.getParameter(fieldFullName + "_morethan"); + if (value!=null) { + DateProperty dprop = new DateProperty(); + dprop.setValue(value); + input1.setValue(toFormString(dprop)); + } + + input input2 = new input(); + + input2.setType("text"); + input2.setName(prefix + name+ "_lessthan"); + input2.setID(prefix + name); + input2.setSize(getSize()); + value = (Date) criteria.getParameter(fieldFullName + "_lessthan"); + if (value!=null) { + DateProperty dprop = new DateProperty(); + dprop.setValue(value); + input2.setValue(toFormString(dprop)); + } + + XWikiMessageTool msg = context.getMessageTool(); + buffer.append((msg==null) ? "from" : msg.get("from")); + buffer.append(input1.toString()); + buffer.append((msg==null) ? "from" : msg.get("to")); + buffer.append(input2.toString()); + } + + public void fromSearchMap(XWikiQuery query, Map map) { + String[] data = (String[])map.get(""); + if ((data!=null)&&(data.length==1)) + query.setParam(getObject().getName() + "_" + getName(), fromString(data[0]).getValue()); + else { + data = (String[])map.get("lessthan"); + if ((data!=null)&&(data.length==1)) + query.setParam(getObject().getName() + "_" + getName() + "_lessthan", fromString(data[0]).getValue()); + data = (String[])map.get("morethan"); + if ((data!=null)&&(data.length==1)) + query.setParam(getObject().getName() + "_" + getName() + "_morethan", fromString(data[0]).getValue()); + + } + } +} Index: xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/meta/DateMetaClass.java =================================================================== --- xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/meta/DateMetaClass.java (revision 3797) +++ xwiki-platform-core/src/main/java/com/xpn/xwiki/objects/meta/DateMetaClass.java (working copy) @@ -59,10 +59,33 @@ dateformat_class.setName("dateFormat"); dateformat_class.setPrettyName("Date Format"); dateformat_class.setSize(20); + + //min and max for calendar year display + NumberClass minYear_class = new NumberClass(this); + minYear_class.setName("minYear"); + minYear_class.setPrettyName("Min Year"); + minYear_class.setSize(4); + minYear_class.setNumberType("integer"); + + NumberClass maxYear_class = new NumberClass(this); + maxYear_class.setName("maxYear"); + maxYear_class.setPrettyName("Max Year"); + maxYear_class.setSize(4); + maxYear_class.setNumberType("integer"); + + //overlap months + BooleanClass overlapMonths_class = new BooleanClass(this); + overlapMonths_class.setName("overlap"); + overlapMonths_class.setPrettyName("Show Days in Overlapping Months"); + overlapMonths_class.setDisplayType("yesno"); + safeput("size", size_class); safeput("emptyIsToday", emptyistoday_class); safeput("dateFormat", dateformat_class); + safeput("minYear", minYear_class); + safeput("maxYear", maxYear_class); + safeput("overlap", overlapMonths_class); } public BaseCollection newObject(XWikiContext context) { Index: xwiki-platform-core/src/main/resources/ApplicationResources.properties =================================================================== --- xwiki-platform-core/src/main/resources/ApplicationResources.properties (revision 3797) +++ xwiki-platform-core/src/main/resources/ApplicationResources.properties (working copy) @@ -763,3 +763,30 @@ panels.recentlyVisited.title=Recently Visited panels.recentlyModified.title=Recently Modified panels.recentlyCreated.title=Recently Created + +#datepicker definitions +core.datepicker.dn="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" +core.datepicker.sdn="Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" +core.datepicker.fd=0 +core.datepicker.mn="January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" +core.datepicker.smn="Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +core.datepicker.info=About the datepicker +core.datepicker.about=How to use the datepicker\\n\\nDate selection:\\n- Use the \\xab, \\xbb buttons to select year.\\n- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month.\\n- Hold mouse button on any of the above buttons for faster selection.\\n- To change the input date, double click the selected date in the datepicker. +core.datepicker.about_time=\\n\\nTime selection:\\n- Click on any of the time parts to increase it\\n- or Shift-click to decrease it\\n- or click and drag for faster selection.\\n- To change the input time, modify the hour, minute and/or second and then double click the selected date in the datepicker or press Enter. +core.datepicker.prev_year=Prev. year (hold for menu) +core.datepicker.next_year=Next year (hold for menu) +core.datepicker.prev_month=Prev. month (hold for menu) +core.datepicker.next_month=Next month (hold for menu) +core.datepicker.sel_date=Select a date +core.datepicker.drag=Drag to move +core.datepicker.today=Today +core.datepicker.part_today= (today) +core.datepicker.go_today=Go Today +core.datepicker.day_first=Display %s first +core.datepicker.weekend=0,6 +core.datepicker.close=Close +core.datepicker.time_part=(Shift-)Click or drag to change value +core.datepicker.def_date_format=%dd/%M/%Y +core.datepicker.tt_date_format=%e, %n %d +core.datepicker.wk=wk +core.datepicker.time=Time: \ No newline at end of file Index: xwiki-platform-core/src/main/resources/ApplicationResources_en.properties =================================================================== --- xwiki-platform-core/src/main/resources/ApplicationResources_en.properties (revision 3797) +++ xwiki-platform-core/src/main/resources/ApplicationResources_en.properties (working copy) @@ -658,3 +658,30 @@ userAbout=Description tempdirnotset=Temporary directory not set. Please follow the instructions on xwiki.org on how to fix this. + +#datepicker definitions +core.datepicker.dn="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" +core.datepicker.sdn="Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" +core.datepicker.fd=0 +core.datepicker.mn="January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" +core.datepicker.smn="Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +core.datepicker.info=About the datepicker +core.datepicker.about=How to use the datepicker\\n\\nDate selection:\\n- Use the \\xab, \\xbb buttons to select year.\\n- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month.\\n- Hold mouse button on any of the above buttons for faster selection.\\n- To change the input date, double click the selected date in the datepicker. +core.datepicker.about_time=\\n\\nTime selection:\\n- Click on any of the time parts to increase it\\n- or Shift-click to decrease it\\n- or click and drag for faster selection.\\n- To change the input time, modify the hour, minute and/or second and then double click the selected date in the datepicker or press Enter. +core.datepicker.prev_year=Prev. year (hold for menu) +core.datepicker.next_year=Next year (hold for menu) +core.datepicker.prev_month=Prev. month (hold for menu) +core.datepicker.next_month=Next month (hold for menu) +core.datepicker.sel_date=Select a date +core.datepicker.drag=Drag to move +core.datepicker.today=Today +core.datepicker.part_today= (today) +core.datepicker.go_today=Go Today +core.datepicker.day_first=Display %s first +core.datepicker.weekend=0,6 +core.datepicker.close=Close +core.datepicker.time_part=(Shift-)Click or drag to change value +core.datepicker.def_date_format=%dd/%M/%Y +core.datepicker.tt_date_format=%e, %n %d +core.datepicker.wk=wk +core.datepicker.time=Time: Index: xwiki-platform-core/src/main/resources/ApplicationResources_fr.properties =================================================================== --- xwiki-platform-core/src/main/resources/ApplicationResources_fr.properties (revision 3797) +++ xwiki-platform-core/src/main/resources/ApplicationResources_fr.properties (working copy) @@ -725,3 +725,30 @@ core.delete.backlinksWarning=Les documents suivants contiennent des liens vers la page courante:{0}En supprimant cette page, ces liens pointeront vers une page vide. core.delete.confirm=Il n'est pas possible de r\u00e9cup\u00e9rer un document supprim\u00e9. Etes-vous s\u00fbr de vouloir continuer ? core.delete.confirmWithBacklinks=Par ailleurs, il n'est pas possible de r\u00e9cup\u00e9rer un document supprim\u00e9. Etes-vous s\u00fbr de vouloir continuer ? + +#datepicker definitions +core.datepicker.dn="Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" +core.datepicker.sdn="Dim", "Lun", "Mar", "Mar", "Jeu", "Ven", "Sam", "Dim" +core.datepicker.fd=1 +core.datepicker.mn="Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" +core.datepicker.smn="Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aout", "Sep", "Oct", "Nov", "Dec" +core.datepicker.info=A propos du datepicker +core.datepicker.about=Comment utiliser le datepicker\\n\\nSelection de la date:\\n- Utiliser les bouttons \\xab, \\xbb pour selectionner l\'annee\\n- Utiliser les bouttons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour selectionner les mois\\n- Garder la souris sur n\'importe quels boutons pour une selection plus rapide.\\n- Pour changer la date d\'entrée double cliquer la date choisie dans le datepicker. +core.datepicker.about_time=\\n\\nSelection de l\'heure:\\n- Cliquer sur heures, minutes ou secondes pour incrementer.\\n- ou Maj-clic pour decrementer\\n- ou clic et glisser-deplacer pour une selection plus rapide.\\n- Pour changer le temps, cliquer sur heures, minutes ou secondes and et puis double cliquer la date choisie dans le datepicker ou Enter. +core.datepicker.prev_year=Année préc. (maintenir pour menu) +core.datepicker.next_year=Année suiv. (maintenir pour menu) +core.datepicker.prev_month=Mois préc. (maintenir pour menu) +core.datepicker.next_month=Mois suiv. (maintenir pour menu) +core.datepicker.sel_date=Sélectionner une date +core.datepicker.drag=Déplacer +core.datepicker.today=Aujourd'hui +core.datepicker.part_today=( aujourd'hui) +core.datepicker.go_today=Atteindre la date du jour +core.datepicker.day_first=Afficher %s en premier +core.datepicker.weekend=0,6 +core.datepicker.close=Fermer +core.datepicker.time_part=(Maj-)Clic ou glisser pour modifier la valeur +core.datepicker.def_date_format=%dd/%M/%Y +core.datepicker.tt_date_format=%e, %n %d +core.datepicker.wk=Sem. +core.datepicker.time=Heure: Index: xwiki-platform-core/src/main/resources/ApplicationResources_ro.properties =================================================================== --- xwiki-platform-core/src/main/resources/ApplicationResources_ro.properties (revision 3797) +++ xwiki-platform-core/src/main/resources/ApplicationResources_ro.properties (working copy) @@ -71,4 +71,31 @@ core.delete=\u015etergere core.delete.backlinksWarning=Urm\u0103toarele documente con\u0163in leg\u0103turi ce conduc la acest document:{0}Dup\u0103 \u015ftergere, respectivele leg\u0103turi vor conduce la un document inexistent. core.delete.confirm=\u015etergerea unui document este ireversibil\u0103. Sunte\u0163i sigur(\u0103) c\u0103 dori\u0163i s\u0103 continua\u0163i? -core.delete.confirmWithBacklinks=De asemenea, \u015ftergerea unui document este ireversibil\u0103. Sunte\u0163i sigur(\u0103) c\u0103 dori\u0163i s\u0103 continua\u0163i? \ No newline at end of file +core.delete.confirmWithBacklinks=De asemenea, \u015ftergerea unui document este ireversibil\u0103. Sunte\u0163i sigur(\u0103) c\u0103 dori\u0163i s\u0103 continua\u0163i? + +#datepicker definitions +core.datepicker.dn="Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata", "Duminica" +core.datepicker.sdn="Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sam", "Dum" +core.datepicker.fd=1 +core.datepicker.mn="Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" +core.datepicker.smn="Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec" +core.datepicker.info=Despre datepicker +core.datepicker.about=Cum se foloseste datepicker-ul\\n\\nSelectia datei:\\n- Folositi butoanele \\xab, \\xbb pentru selectarea anului.\\n- Folositi butoanele " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pentru selectarea lunii.\\n- Tineti mouse-ul apasat pe unul din butoanele de mai sus pentru o selectie rapida.\\n- Pentru a schimba data in input, apasati de doua ori data selectata in datepicker. +core.datepicker.about_time=\\n\\nSelectia timpului:\\n- Faceti click pe oricare componenta a timpului pentru a creste valoarea.\\n- sau apasati Shift-click pentru a o descreste\\n- sau faceti click si trageti cu mouse-ul stanga-dreapta pentru o selectie rapida.\\n- Pentru a schimba timpul in input, modificati ora, minutul si/sau secunda si apoi apasati de doua ori data selectata in datepicker sau apasati Enter. +core.datepicker.prev_year=Anul prec. (apasati pentru menu) +core.datepicker.next_year=Anul urm. (apasati pentru menu) +core.datepicker.prev_month=Luna prec. (apasati pentru menu) +core.datepicker.next_month=Luna urm. (apasati pentru menu) +core.datepicker.sel_date=Selectati o data +core.datepicker.drag=Trageti pentru a misca +core.datepicker.today=Astazi +core.datepicker.part_today= (astazi) +core.datepicker.go_today=Data de azi +core.datepicker.day_first=Afiseaza %s prima zi +core.datepicker.weekend=0,6 +core.datepicker.close=Inchide +core.datepicker.time_part=(Shift-)Click sau trageti pentru a schimba valoarea +core.datepicker.def_date_format=%dd/%M/%Y +core.datepicker.tt_date_format=%e, %n %d +core.datepicker.wk=spt +core.datepicker.time=Ora: \ No newline at end of file Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/adminprefs.vm =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/adminprefs.vm (revision 3797) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/adminprefs.vm (working copy) @@ -9,7 +9,7 @@ #set($sectionitemsmap = $xwiki.hashMap) #set($sectionitemsmap.params = ["multilingual", "languages" , "default_language", "authenticate_view", "authenticate_edit", "auth_active_check" ]) ## #set($sectionitemsmap.skin = ["skin", "stylesheet", "stylesheets", "leftPanels", "rightPanels", "showLeftPanels", "showRightPanels", "pageWidth"]) -#set($sectionitemsmap.skin = ["skin", "stylesheet", "leftPanels", "rightPanels", "showLeftPanels", "showRightPanels"]) +#set($sectionitemsmap.skin = ["skin", "stylesheet", "datepicker_theme", "leftPanels", "rightPanels", "showLeftPanels", "showRightPanels"]) #set($sectionitemsmap.presentation = [ "title", "version", "webcopyright", "meta" ]) #set($sectionitemsmap.editing = ["editor", "editbox_width","editbox_height"]) #set($sectionitemsmap.advanced = ["macros_languages", "macros_velocity","macros_groovy", "macros_mapping", "notification_pages", "documentBundles" ]) Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/img.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\img.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js (revision 0) @@ -0,0 +1,437 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ +* Modified by Evelina Slatineanu, 2007 + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + +// $Id: calendar-setup.js,v 1.25 2005/03/07 09:51:33 mishoo Exp $ + +/** + * This function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. + * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) + * onClose | function that gets called when the calendar is closed. [default] + * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. + * date | the date that the calendar will be initially displayed to + * showsTime | default: false; if true the calendar will include a time selector + * timeFormat | the time format; can be "12" or "24", default is "12" + * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close + * step | configures the step of the years in drop-down boxes; default: 2 + * position | configures the calendar absolute position; default: null + * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible + * showOthers | if "true" (but default: "false") it will show days from other months too + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ + + /* Conversion from java SimpleDateFormat to javascript date format (modified) */ + +var numb = "0123456789"; +var lwr = "abcdefghijklmnopqrstuvwxyz"; +var upr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +function isValid(parm,val) { + if (parm == "") return true; + for (i=0; i" + str); + return str; + +} + + +//calendar setup function +Calendar.setup = function (params) { + function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; + + param_default("inputField", null); + param_default("displayArea", null); + param_default("button", null); + param_default("eventName", "click"); + param_default("ifFormat", "dd/%M/%Y %HH:%MM:%ss"); + param_default("daFormat", "dd/%M/%Y %HH:%MM:%ss"); + param_default("singleClick", false); + param_default("disableFunc", null); + param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined + param_default("dateText", null); + param_default("firstDay", null); + param_default("align", "Br"); + param_default("range", [1950, 2100]); + param_default("weekNumbers", true); + param_default("flat", null); + param_default("flatCallback", null); + param_default("onSelect", null); + param_default("onClose", null); + param_default("onUpdate", null); + param_default("date", null); + param_default("showsTime", false); + param_default("timeFormat", "24"); + param_default("startTimeWith", 0); + param_default("electric", true); + param_default("step", 1); + param_default("position", null); + param_default("cache", false); + param_default("showOthers", false); + param_default("multiple", null); + param_default("skin", "aero"); + + //show the image + if(document.all) { + var imgs = document.all.tags("img"); + }else if(document.getElementsByTagName) { + var imgs = document.getElementsByTagName("img"); + } + for(var i = 0; i < imgs.length; i++) + if(imgs[i].id.indexOf("dateselector") >= 0) + imgs[i].style.display = "inline"; + + var tmp = ["inputField", "displayArea", "button"]; + for (var i in tmp) { + if (typeof params[tmp[i]] == "string") { + params[tmp[i]] = document.getElementById(params[tmp[i]]); + } + } + + if(params.range[0] <= 0) params.range[0] = 1950; + if(params.range[1] <= 0) params.range[1] = 2100; + //convert the date format + params.ifFormat = convertJavaFormat(params.javaFormat); + + if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { + alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); + return false; + } + + function onSelect(cal) { + var p = cal.params; + var update = cal.dateDbClicked; + if (update && p.inputField) { + p.inputField.value = cal.date.print(p.ifFormat); + if (typeof p.inputField.onchange == "function") + p.inputField.onchange(); + } + if (update && p.displayArea) + p.displayArea.innerHTML = cal.date.print(p.daFormat); + if (update && typeof p.onUpdate == "function") + p.onUpdate(cal); + if (update && p.flat) { + if (typeof p.flatCallback == "function") + p.flatCallback(cal); + } + if (update && p.singleClick && cal.dateClicked) + cal.callCloseHandler(); + }; + + if (params.flat != null) { + if (typeof params.flat == "string") + params.flat = document.getElementById(params.flat); + if (!params.flat) { + alert("Calendar.setup:\n Flat specified but can't find parent."); + return false; + } + var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); + cal.showsOtherMonths = params.showOthers; + cal.showsTime = params.showsTime; + cal.startTimeWith = params.startTimeWith; + cal.time24 = (params.timeFormat == "24"); + cal.params = params; + cal.weekNumbers = params.weekNumbers; + cal.setRange(params.range[0], params.range[1]); + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.skin = params.skin; + if (params.ifFormat) { + cal.setDateFormat(params.ifFormat); + } + if (params.inputField && typeof params.inputField.value == "string") { + cal.parseDate(params.inputField.value); + } + cal.create(params.flat); + cal.show(); + return false; + } + + var triggerEl = params.button || params.displayArea || params.inputField; + triggerEl["on" + params.eventName] = function() { + var dateEl = params.inputField || params.displayArea; + var dateFmt = params.inputField ? params.ifFormat : params.daFormat; + var mustCreate = false; + var cal = window.calendar; + if (dateEl) + params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); + if (!(cal && params.cache)) { + window.calendar = cal = new Calendar(params.firstDay, + params.date, + params.onSelect || onSelect, + params.onClose || function(cal) { cal.hide(); }); + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.startTimeWith = params.startTimeWith; + cal.weekNumbers = params.weekNumbers; + cal.skin = params.skin; + mustCreate = true; + } else { + if (params.date) + cal.setDate(params.date); + cal.hide(); + } + if (params.multiple) { + cal.multiple = {}; + for (var i = params.multiple.length; --i >= 0;) { + var d = params.multiple[i]; + var ds = d.print("%Y%m%d"); + cal.multiple[ds] = d; + } + } + cal.showsOtherMonths = params.showOthers; + cal.yearStep = params.step; + cal.setRange(params.range[0], params.range[1]); + cal.params = params; + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.setDateFormat(dateFmt); + cal.skin = params.skin; + if (mustCreate) + cal.create(); + cal.refresh(); + if (!params.position) + cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); + else + cal.showAt(params.position[0], params.position[1]); + return false; + }; + + return cal; +}; Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js (revision 0) @@ -0,0 +1,2043 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo +* Modified by Evelina Slatineanu, 2007 +* - fixed Opera dragging bug +* - add conversion from java SimpleDateFormat to javascript format, using calendar format +* - add numerous "utility" functions to remember an approximate choice of user + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + +// $Id: calendar.js,v 1.51 2005/03/07 16:44:31 mishoo Exp $ + +/** The Calendar object constructor. */ +Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { + // member variables + this.activeDiv = null; + this.currentDateEl = null; + this.getDateStatus = null; + this.getDateToolTip = null; + this.getDateText = null; + this.timeout = null; + this.onSelected = onSelected || null; + this.onClose = onClose || null; + this.dragging = false; + this.hidden = false; + this.minYear = 1950; + this.maxYear = 2100; + this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; + this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; + this.isPopup = true; + this.weekNumbers = true; + this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc. + this.showsOtherMonths = false; + this.dateStr = dateStr; + this.ar_days = null; + this.showsTime = false; + this.time24 = true; + this.startTimeWith = 0; + this.yearStep = 1; + this.hiliteToday = true; + this.multiple = null; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + this.dateDbClicked = false; + //skin + this.skin = "aero"; + + // one-time initializations + if (typeof Calendar._SDN == "undefined") { + // table of short day names + if (typeof Calendar._SDN_len == "undefined") + Calendar._SDN_len = 3; + var ar = new Array(); + for (var i = 8; i > 0;) { + ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); + } + Calendar._SDN = ar; + // table of short month names + if (typeof Calendar._SMN_len == "undefined") + Calendar._SMN_len = 3; + ar = new Array(); + for (var i = 12; i > 0;) { + ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); + } + Calendar._SMN = ar; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect Opera browser +Calendar.is_opera = /opera/i.test(navigator.userAgent); + + +/// detect a special case of "web browser" +Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) ); + +Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) ); + + +/// detect KHTML-based browsers +Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +Calendar.getAbsolutePos = function(el) { + var SL = 0, ST = 0; + var is_div = /^div$/i.test(el.tagName); + if (is_div && el.scrollLeft) + SL = el.scrollLeft; + if (is_div && el.scrollTop) + ST = el.scrollTop; + var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; + if (el.offsetParent) { + var tmp = this.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +Calendar.isRelated = function (el, evt) { + var related = evt.relatedTarget; + if (!related) { + var type = evt.type; + if (type == "mouseover") { + related = evt.fromElement; + } else if (type == "mouseout") { + related = evt.toElement; + } + } + while (related) { + if (related == el) { + return true; + } + related = related.parentNode; + } + return false; +}; + +Calendar.removeClass = function(el, className) { + if (!(el && el.className)) { + return; + } + var cls = el.className.split(" "); + var ar = new Array(); + for (var i = cls.length; i > 0;) { + if (cls[--i] != className) { + ar[ar.length] = cls[i]; + } + } + el.className = ar.join(" "); + +}; + +Calendar.addClass = function(el, className) { + Calendar.removeClass(el, className); + el.className += " " + className; +}; + +// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. +Calendar.getElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; + while (f.nodeType != 1 || /^div$/i.test(f.tagName)) + f = f.parentNode; + return f; +}; + +Calendar.getTargetElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.target; + while (f.nodeType != 1) + f = f.parentNode; + return f; +}; + +Calendar.stopEvent = function(ev) { + ev || (ev = window.event); + if (Calendar.is_ie) { + ev.cancelBubble = true; + ev.returnValue = false; + } else { + ev.preventDefault(); + ev.stopPropagation(); + } + return false; +}; + +Calendar.addEvent = function(el, evname, func) { + if (el.attachEvent) { // IE && OPERA + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // FIREFOX + el.addEventListener(evname, func, true); + } else { + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + OPERA + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +Calendar._add_evs = function(el) { + with (Calendar) { + addEvent(el, "mouseover", dayMouseOver); + addEvent(el, "mousedown", dayMouseDown); + addEvent(el, "mouseout", dayMouseOut); + if (is_ie) { + addEvent(el, "dblclick", dayMouseDblClick); + el.setAttribute("unselectable", true); + } + } +}; + +Calendar.findMonth = function(el) { + if (typeof el.month != "undefined") { + return el; + } else if (typeof el.parentNode.month != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.findYear = function(el) { + if (typeof el.year != "undefined") { + return el; + } else if (typeof el.parentNode.year != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.showMonthsCombo = function () { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var mc = cal.monthsCombo; + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + if (cal.activeMonth) { + Calendar.removeClass(cal.activeMonth, "active"); + } + var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; + Calendar.addClass(mon, "active"); + cal.activeMonth = mon; + var s = mc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var mcw = mc.offsetWidth; + if (typeof mcw == "undefined") + // Konqueror brain-dead techniques + mcw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; +}; + +Calendar.showYearsCombo = function (fwd) { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var yc = cal.yearsCombo; + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + if (cal.activeYear) { + Calendar.removeClass(cal.activeYear, "active"); + } + cal.activeYear = null; + var Y = cal.date.getFullYear() + (fwd ? 1 : -1); + var yr = yc.firstChild; + var show = false; + for (var i = 12; i > 0; --i) { + if (Y >= cal.minYear && Y <= cal.maxYear) { + yr.innerHTML = Y; + yr.year = Y; + yr.style.display = "block"; + show = true; + } else { + yr.style.display = "none"; + } + yr = yr.nextSibling; + Y += fwd ? cal.yearStep : -cal.yearStep; + } + if (show) { + var s = yc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var ycw = yc.offsetWidth; + if (typeof ycw == "undefined") + // Konqueror brain-dead techniques + ycw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; + } +}; + +// event handlers + +Calendar.tableMouseUp = function(ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + if (cal.timeout) { + clearTimeout(cal.timeout); + } + var el = cal.activeDiv; + if (!el) { + return false; + } + var target = Calendar.getTargetElement(ev); + ev || (ev = window.event); + Calendar.removeClass(el, "active"); + if (target == el || target.parentNode == el) { + Calendar.cellClick(el, ev); + } + var mon = Calendar.findMonth(target); + var date = null; + if (mon) { + date = new Date(cal.date); + if (mon.month != date.getMonth()) { + date.setMonth(mon.month); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } else { + var year = Calendar.findYear(target); + if (year) { + date = new Date(cal.date); + if (year.year != date.getFullYear()) { + date.setFullYear(year.year); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } + } + with (Calendar) { + removeEvent(document, "mouseup", tableMouseUp); + removeEvent(document, "mouseover", tableMouseOver); + removeEvent(document, "mousemove", tableMouseOver); + cal._hideCombos(); + _C = null; + return stopEvent(ev); + } +}; + +Calendar.tableMouseOver = function (ev) { + var cal = Calendar._C; + if (!cal) { + return; + } + var el = cal.activeDiv; + var target = Calendar.getTargetElement(ev); + if (target == el || target.parentNode == el) { + Calendar.addClass(el, "hilite active"); + Calendar.addClass(el.parentNode, "rowhilite"); + } else { + if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) + Calendar.removeClass(el, "active"); + Calendar.removeClass(el, "hilite"); + Calendar.removeClass(el.parentNode, "rowhilite"); + } + ev || (ev = window.event); + if (el.navtype == 50 && target != el) { + var pos = Calendar.getAbsolutePos(el); + var w = el.offsetWidth; + var x = ev.clientX; + var dx; + var decrease = true; + if (x > pos.x + w) { + dx = x - pos.x - w; + decrease = false; + } else + dx = pos.x - x; + + if (dx < 0) dx = 0; + var range = el._range; + var current = el._current; + var count = Math.floor(dx / 10) % range.length; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + while (count-- > 0) + if (decrease) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + + cal.onUpdateTime(); + } + var mon = Calendar.findMonth(target); + if (mon) { + if (mon.month != cal.date.getMonth()) { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + Calendar.addClass(mon, "hilite"); + cal.hilitedMonth = mon; + } else if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + } else { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + var year = Calendar.findYear(target); + if (year) { + if (year.year != cal.date.getFullYear()) { + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + Calendar.addClass(year, "hilite"); + cal.hilitedYear = year; + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.tableMouseDown = function (ev) { + if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { + return Calendar.stopEvent(ev); + } +}; + +//drag calendar!! +Calendar.calDragIt = function (ev) { + var cal = Calendar._C; + if (!(cal && cal.dragging)) { + return false; + } + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + + } else { //Opera, Firefox + posX = ev.pageX; + posY = ev.pageY; + } + cal.hideShowCovered(); + var st = cal.element.style; + //cal.xOffs are NaN in Opera!!!! + st.left = (posX - cal.xOffs) + "px"; + st.top = (posY - cal.yOffs) + "px"; + + return Calendar.stopEvent(ev); +}; + +Calendar.calDragEnd = function (ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + cal.dragging = false; + with (Calendar) { + removeEvent(document, "mousemove", calDragIt); + removeEvent(document, "mouseup", calDragEnd); + tableMouseUp(ev); + } + cal.hideShowCovered(); +}; + +Calendar.dayMouseDown = function(ev) { + var el = Calendar.getElement(ev); + if (el.disabled) { + return false; + } + var cal = el.calendar; + cal.activeDiv = el; + Calendar._C = cal; + if (el.navtype != 300) with (Calendar) { + if (el.navtype == 50) { + el._current = el.innerHTML; + addEvent(document, "mousemove", tableMouseOver); + } else + addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); + addClass(el, "hilite active"); + addEvent(document, "mouseup", tableMouseUp); + } else if (cal.isPopup) { + cal._dragStart(ev); + } + if (el.navtype == -1 || el.navtype == 1) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); + } else if (el.navtype == -2 || el.navtype == 2) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); + } else { + cal.timeout = null; + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseDblClick = function(ev) { + Calendar.cellClick(Calendar.getElement(ev), ev || window.event); + if (Calendar.is_ie) { + document.selection.empty(); + } +}; + +Calendar.dayMouseOver = function(ev) { + var el = Calendar.getElement(ev); + if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { + return false; + } + if (el.ttip) { + if (el.ttip.substr(0, 1) == "_") { + el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); + } + el.calendar.tooltips.innerHTML = el.ttip; + } + if (el.navtype != 300) { + Calendar.addClass(el, "hilite"); + if (el.caldate) { + Calendar.addClass(el.parentNode, "rowhilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseOut = function(ev) { + with (Calendar) { + var el = getElement(ev); + if (isRelated(el, ev) || _C || el.disabled) + return false; + removeClass(el, "hilite"); + if (el.caldate) + removeClass(el.parentNode, "rowhilite"); + if (el.calendar) + el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; + return stopEvent(ev); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +Calendar.cellClick = function(el, ev) { + var cal = el.calendar; + var closing = false; + var newdate = false; + var date = null; + if (typeof el.navtype == "undefined") { + if (cal.currentDateEl) { + Calendar.removeClass(cal.currentDateEl, "selected"); + Calendar.addClass(el, "selected"); + closing = (cal.currentDateEl == el); + if (!closing) { + cal.currentDateEl = el; + } + else cal.dateDbClicked = true; + } + cal.date.setDateOnly(el.caldate); + date = cal.date; + var other_month = !(cal.dateClicked = !el.otherMonth); + if (!other_month && !cal.currentDateEl) + cal._toggleMultipleDate(new Date(date)); + else + newdate = !el.disabled; + // a date was clicked + if (other_month) + cal._init(cal.firstDayOfWeek, date); + } else { + if (el.navtype == 200) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + return; + } + date = new Date(cal.date); + if (el.navtype == 0) + date.setDateOnly(new Date()); // TODAY + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + // cal.dateClicked = (el.navtype == 0); + cal.dateClicked = false; + var year = date.getFullYear(); + var mon = date.getMonth(); + function setMonth(m) { + var day = date.getDate(); + var max = date.getMonthDays(m); + if (day > max) { + date.setDate(max); + } + date.setMonth(m); + }; + switch (el.navtype) { + case 400: + Calendar.removeClass(el, "hilite"); + var text = Calendar._TT["ABOUT"]; + if (typeof text != "undefined") { + text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; + } else { + // FIXME: this should be removed as soon as lang files get updated! + text = "Help and about box text is not translated into this language.\n"; + } + alert(text); + return; + case -2: + if (year > cal.minYear) { + date.setFullYear(year - 1); + } + break; + case -1: + if (mon > 0) { + setMonth(mon - 1); + } else if (year-- > cal.minYear) { + date.setFullYear(year); + setMonth(11); + } + break; + case 1: + if (mon < 11) { + setMonth(mon + 1); + } else if (year < cal.maxYear) { + date.setFullYear(year + 1); + setMonth(0); + } + break; + case 2: + if (year < cal.maxYear) { + date.setFullYear(year + 1); + } + break; + case 100: + cal.setFirstDayOfWeek(el.fdow); + return; + case 50: + var range = el._range; + var current = el.innerHTML; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + if (ev && ev.shiftKey) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + cal.onUpdateTime(); + return; + case 0: + // TODAY will bring us here + if ((typeof cal.getDateStatus == "function") && + cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { + return false; + } + break; + } + if (!date.equalsTo(cal.date)) { + cal.setDate(date); + newdate = true; + } else if (el.navtype == 0) + newdate = closing = true; + } + if (newdate) { + ev && cal.callHandler(); + } + if (closing) { + Calendar.removeClass(el, "hilite"); + ev && cal.callCloseHandler(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + parent = document.getElementsByTagName("body")[0]; + this.isPopup = true; + } else { + parent = _par; + this.isPopup = false; + } + this.date = this.dateStr ? new Date(this.dateStr) : new Date(); + + var table = Calendar.createElement("table"); + this.table = table; + table.cellSpacing = 0; + table.cellPadding = 0; + table.calendar = this; + Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); + + var div = Calendar.createElement("div"); + this.element = div; + div.className = "calendar_" + this.skin; + + if (this.isPopup) { + div.style.position = "absolute"; + div.style.display = "none"; + } + div.appendChild(table); + + var thead = Calendar.createElement("thead", table); + var cell = null; + var row = null; + + var cal = this; + var hh = function (text, cs, navtype) { + cell = Calendar.createElement("td", row); + cell.colSpan = cs; + cell.className = "button"; + if (navtype != 0 && Math.abs(navtype) <= 2) + cell.className += " nav"; + Calendar._add_evs(cell); + cell.calendar = cal; + cell.navtype = navtype; + cell.innerHTML = "
" + text + "
"; + return cell; + }; + + row = Calendar.createElement("tr", thead); + var title_length = 6; + (this.isPopup) && --title_length; + (this.weekNumbers) && ++title_length; + + hh("?", 1, 400).ttip = Calendar._TT["INFO"]; + this.title = hh("", title_length, 300); + this.title.className = "title"; + if (this.isPopup) { + this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; + this.title.style.cursor = "move"; + hh("x", 1, 200).ttip = Calendar._TT["CLOSE"]; + } + + row = Calendar.createElement("tr", thead); + row.className = "headrow"; + + this._nav_py = hh("«", 1, -2); + this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; + + this._nav_pm = hh("‹", 1, -1); + this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; + + this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); + this._nav_now.ttip = Calendar._TT["GO_TODAY"]; + + this._nav_nm = hh("›", 1, 1); + this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; + + this._nav_ny = hh("»", 1, 2); + this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; + + // day names + row = Calendar.createElement("tr", thead); + row.className = "daynames"; + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.className = "name wn"; + cell.innerHTML = Calendar._TT["WK"]; + } + for (var i = 7; i > 0; --i) { + cell = Calendar.createElement("td", row); + if (!i) { + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + } + this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; + this._displayWeekdays(); + + var tbody = Calendar.createElement("tbody", table); + this.tbody = tbody; + + for (i = 6; i > 0; --i) { + row = Calendar.createElement("tr", tbody); + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + } + for (var j = 7; j > 0; --j) { + cell = Calendar.createElement("td", row); + cell.calendar = this; + Calendar._add_evs(cell); + } + } + + if (this.showsTime) { + row = Calendar.createElement("tr", tbody); + row.className = "time"; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + cell.innerHTML = Calendar._TT["TIME"] || " "; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = this.weekNumbers ? 4 : 3; + + (function(){ + function makeTimePart(className, init, range_start, range_end) { + var part = Calendar.createElement("span", cell); + part.className = className; + part.innerHTML = init; + part.calendar = cal; + part.ttip = Calendar._TT["TIME_PART"]; + part.navtype = 50; + part._range = []; + if (typeof range_start != "number") + part._range = range_start; + else { + for (var i = range_start; i <= range_end; ++i) { + var txt; + if (i < 10 && range_end >= 10) txt = '0' + i; + else txt = '' + i; + part._range[part._range.length] = txt; + } + } + Calendar._add_evs(part); + return part; + }; + var hrs = cal.date.getHours(); //hours + var mins = cal.date.getMinutes(); //minutes + var secs = cal.date.getSeconds(); //seconds + + + var t12 = !cal.time24; //display 12 + var pm = (hrs > 12); // display am/pm + if (t12 && pm) hrs -= 12; + if(cal.startTimeWith == 0) + var H = makeTimePart("hour", hrs, 0, t12 ? 11 : 23); + else + var H = makeTimePart("hour", hrs, 1, t12 ? 12 : 24); + var span = Calendar.createElement("span", cell); + span.innerHTML = ":"; + span.className = "colon"; + var M = makeTimePart("minute", mins, 0, 59); + var span2 = Calendar.createElement("span", cell); + span2.innerHTML = ":"; + span2.className = "colon"; + var S = makeTimePart("second", secs, 0, 59); + var AP = null; + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + if (t12) + AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); + else + cell.innerHTML = " "; + + cal.onSetTime = function() { + var pm, hrs = this.date.getHours(), + mins = this.date.getMinutes(), + secs = this.date.getSeconds(); + if (t12) { + pm = (hrs >= 12); + if (pm) hrs -= 12; + if(hrs == 0 && this.startTimeWith == 1 && !this.time24 ) hrs = 12; + AP.innerHTML = pm ? "pm" : "am"; + } + else if(hrs == 0 && this.startTimeWith == 1 && this.time24) hrs = 24; + H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; + M.innerHTML = (mins < 10) ? ("0" + mins) : mins; + S.innerHTML = (secs < 10) ? ("0" + secs) : secs; + }; + + cal.onUpdateTime = function() { + var date = this.date; + var h = parseInt(H.innerHTML, 10); + if (t12) { + if (/pm/i.test(AP.innerHTML) && h < 12) + h += 12; + } + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + date.setHours(h); + date.setMinutes(parseInt(M.innerHTML, 10)); + date.setSeconds(parseInt(S.innerHTML, 10)); + date.setFullYear(y); + date.setMonth(m); + date.setDate(d); + this.dateClicked = false; + this.dateDbClicked = false; + this.callHandler(); + }; + })(); + } else { + this.onSetTime = this.onUpdateTime = function() {}; + } + + var tfoot = Calendar.createElement("tfoot", table); + + row = Calendar.createElement("tr", tfoot); + row.className = "footrow"; + + cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); + cell.className = "ttip"; + if (this.isPopup) { + cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; + cell.style.cursor = "move"; + } + this.tooltips = cell; + + div = Calendar.createElement("div", this.element); + this.monthsCombo = div; + div.className = "combo"; + for (i = 0; i < Calendar._MN.length; ++i) { + var mn = Calendar.createElement("div"); + mn.className = Calendar.is_ie ? "label-IEfix" : "label"; + mn.month = i; + mn.innerHTML = Calendar._SMN[i]; + div.appendChild(mn); + } + + div = Calendar.createElement("div", this.element); + this.yearsCombo = div; + div.className = "combo"; + for (i = 12; i > 0; --i) { + var yr = Calendar.createElement("div"); + yr.className = Calendar.is_ie ? "label-IEfix" : "label"; + div.appendChild(yr); + } + + this._init(this.firstDayOfWeek, this.date); + parent.appendChild(this.element); +}; + +/** keyboard navigation, only for popup calendars */ +Calendar._keyEvent = function(ev) { + var cal = window._dynarch_popupCalendar; + if (!cal || cal.multiple) + return false; + (Calendar.is_ie) && (ev = window.event); + var act = (Calendar.is_ie || ev.type == "keypress"), + K = ev.keyCode; + if (ev.ctrlKey) { + switch (K) { + case 37: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (K) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.callCloseHandler(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + if (act) { + var prev, x, y, ne, el, step; + prev = K == 37 || K == 38; + step = (K == 37 || K == 39) ? 1 : 7; + function setVars() { + el = cal.currentDateEl; + var p = el.pos; + x = p & 15; + y = p >> 4; + ne = cal.ar_days[y][x]; + };setVars(); + function prevMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() - step); + cal.setDate(date); + }; + function nextMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() + step); + cal.setDate(date); + }; + while (1) { + switch (K) { + case 37: // KEY left + if (--x >= 0) + ne = cal.ar_days[y][x]; + else { + x = 6; + K = 38; + continue; + } + break; + case 38: // KEY up + if (--y >= 0) + ne = cal.ar_days[y][x]; + else { + prevMonth(); + setVars(); + } + break; + case 39: // KEY right + if (++x < 7) + ne = cal.ar_days[y][x]; + else { + x = 0; + K = 40; + continue; + } + break; + case 40: // KEY down + if (++y < cal.ar_days.length) + ne = cal.ar_days[y][x]; + else { + nextMonth(); + setVars(); + } + break; + } + break; + } + if (ne) { + if (!ne.disabled) + Calendar.cellClick(ne); + else if (prev) + prevMonth(); + else + nextMonth(); + } + } + break; + case 13: // KEY enter + if (act) + Calendar.cellClick(cal.currentDateEl, ev); + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and firstDayOfWeek + */ +Calendar.prototype._init = function (firstDayOfWeek, date) { + var today = new Date(), + TY = today.getFullYear(), + TM = today.getMonth(), + TD = today.getDate(); + this.table.style.visibility = "hidden"; + var year = date.getFullYear(); + if (year < this.minYear) { + year = this.minYear; + date.setFullYear(year); + } else if (year > this.maxYear) { + year = this.maxYear; + date.setFullYear(year); + } + this.firstDayOfWeek = firstDayOfWeek; + this.date = new Date(date); + var month = date.getMonth(); + var mday = date.getDate(); + var no_days = date.getMonthDays(); + + // calendar voodoo for computing the first day that would actually be + // displayed in the calendar, even if it's from the previous month. + // WARNING: this is magic. ;-) + date.setDate(1); + var day1 = (date.getDay() - this.firstDayOfWeek) % 7; + if (day1 < 0) + day1 += 7; + date.setDate(-day1); + date.setDate(date.getDate() + 1); + + var row = this.tbody.firstChild; + var MN = Calendar._SMN[month]; + var ar_days = this.ar_days = new Array(); + var weekend = Calendar._TT["WEEKEND"]; + var dates = this.multiple ? (this.datesCells = {}) : null; + for (var i = 0; i < 6; ++i, row = row.nextSibling) { + var cell = row.firstChild; + if (this.weekNumbers) { + cell.className = "day wn"; + cell.innerHTML = date.getWeekNumber(); + cell = cell.nextSibling; + } + row.className = "daysrow"; + var hasdays = false, iday, dpos = ar_days[i] = []; + for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { + iday = date.getDate(); + var wday = date.getDay(); + cell.className = "day"; + cell.pos = i << 4 | j; + dpos[j] = cell; + var current_month = (date.getMonth() == month); + if (!current_month) { + if (this.showsOtherMonths) { + cell.className += " othermonth"; + cell.otherMonth = true; + } else { + cell.className = "emptycell"; + cell.innerHTML = " "; + cell.disabled = true; + continue; + } + } else { + cell.otherMonth = false; + hasdays = true; + } + cell.disabled = false; + cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; + if (dates) + dates[date.print("%Y%m%d")] = cell; + if (this.getDateStatus) { + var status = this.getDateStatus(date, year, month, iday); + if (this.getDateToolTip) { + var toolTip = this.getDateToolTip(date, year, month, iday); + if (toolTip) + cell.title = toolTip; + } + if (status === true) { + cell.className += " disabled"; + cell.disabled = true; + } else { + if (/disabled/i.test(status)) + cell.disabled = true; + cell.className += " " + status; + } + } + if (!cell.disabled) { + cell.caldate = new Date(date); + cell.ttip = "_"; + if (!this.multiple && current_month + && iday == mday && this.hiliteToday) { + cell.className += " selected"; + this.currentDateEl = cell; + } + if (date.getFullYear() == TY && + date.getMonth() == TM && + iday == TD) { + cell.className += " today"; + cell.ttip += Calendar._TT["PART_TODAY"]; + } + if (weekend.indexOf(wday.toString()) != -1) + cell.className += cell.otherMonth ? " oweekend" : " weekend"; + } + } + if (!(hasdays || this.showsOtherMonths)) + row.className = "emptyrow"; + } + this.title.innerHTML = Calendar._MN[month] + ", " + year; + this.onSetTime(); + this.table.style.visibility = "visible"; + this._initMultipleDates(); + // PROFILE + // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; +}; + +Calendar.prototype._initMultipleDates = function() { + if (this.multiple) { + for (var i in this.multiple) { + var cell = this.datesCells[i]; + var d = this.multiple[i]; + if (!d) + continue; + if (cell) + cell.className += " selected"; + } + } +}; + +Calendar.prototype._toggleMultipleDate = function(date) { + if (this.multiple) { + var ds = date.print("%Y%m%d"); + var cell = this.datesCells[ds]; + if (cell) { + var d = this.multiple[ds]; + if (!d) { + Calendar.addClass(cell, "selected"); + this.multiple[ds] = date; + } else { + Calendar.removeClass(cell, "selected"); + delete this.multiple[ds]; + } + } + } +}; + +Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { + this.getDateToolTip = unaryFunction; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.firstDayOfWeek, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.firstDayOfWeek, this.date); +}; + +/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ +Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { + this._init(firstDayOfWeek, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.getDateStatus = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; + window._dynarch_popupCalendar = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +Calendar._checkCalendar = function(ev) { + var calendar = window._dynarch_popupCalendar; + if (!calendar) { + return false; + } + var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); + for (; el != null && el != calendar.element; el = el.parentNode); + if (el == null) { + // calls closeHandler which should hide the calendar. + window._dynarch_popupCalendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +Calendar.prototype.show = function () { + var rows = this.table.getElementsByTagName("tr"); + for (var i = rows.length; i > 0;) { + var row = rows[--i]; + Calendar.removeClass(row, "rowhilite"); + var cells = row.getElementsByTagName("td"); + for (var j = cells.length; j > 0;) { + var cell = cells[--j]; + Calendar.removeClass(cell, "hilite"); + Calendar.removeClass(cell, "active"); + } + } + this.element.style.display = "block"; + this.hidden = false; + if (this.isPopup) { + window._dynarch_popupCalendar = this; + Calendar.addEvent(document, "keydown", Calendar._keyEvent); + Calendar.addEvent(document, "keypress", Calendar._keyEvent); + Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); + } + this.hideShowCovered(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +Calendar.prototype.hide = function () { + if (this.isPopup) { + Calendar.removeEvent(document, "keydown", Calendar._keyEvent); + Calendar.removeEvent(document, "keypress", Calendar._keyEvent); + Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); + } + this.element.style.display = "none"; + this.hidden = true; + this.hideShowCovered(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +Calendar.prototype.showAtElement = function (el, opts) { + var self = this; + var p = Calendar.getAbsolutePos(el); + if (!opts || typeof opts != "string") { + this.showAt(p.x, p.y + el.offsetHeight); + return true; + } + function fixPosition(box) { + if (box.x < 0) + box.x = 0; + if (box.y < 0) + box.y = 0; + var cp = document.createElement("div"); + var s = cp.style; + s.position = "absolute"; + s.right = s.bottom = s.width = s.height = "0px"; + document.body.appendChild(cp); + var br = Calendar.getAbsolutePos(cp); + document.body.removeChild(cp); + if (Calendar.is_ie) { + br.y += document.body.scrollTop; + br.x += document.body.scrollLeft; + } else { + br.y += window.scrollY; + br.x += window.scrollX; + } + var tmp = box.x + box.width - br.x; + if (tmp > 0) box.x -= tmp; + tmp = box.y + box.height - br.y; + if (tmp > 0) box.y -= tmp; + }; + this.element.style.display = "block"; + Calendar.continuation_for_the_fucking_khtml_browser = function() { + var w = self.element.offsetWidth; + var h = self.element.offsetHeight; + self.element.style.display = "none"; + var valign = opts.substr(0, 1); + var halign = "l"; + if (opts.length > 1) { + halign = opts.substr(1, 1); + } + // vertical alignment + switch (valign) { + case "T": p.y -= h; break; + case "B": p.y += el.offsetHeight; break; + case "C": p.y += (el.offsetHeight - h) / 2; break; + case "t": p.y += el.offsetHeight - h; break; + case "b": break; // already there + } + // horizontal alignment + switch (halign) { + case "L": p.x -= w; break; + case "R": p.x += el.offsetWidth; break; + case "C": p.x += (el.offsetWidth - w) / 2; break; + case "l": p.x += el.offsetWidth - w; break; + case "r": break; // already there + } + p.width = w; + p.height = h + 40; + self.monthsCombo.style.display = "none"; + fixPosition(p); + self.showAt(p.x, p.y); + }; + if (Calendar.is_khtml) + setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); + else + Calendar.continuation_for_the_fucking_khtml_browser(); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +Calendar.prototype.parseDate = function(str, fmt) { + if (!fmt) + fmt = this.dateFormat; + this.setDate(Date.parseDate(str, fmt)); +}; + +Calendar.prototype.hideShowCovered = function () { + if (!Calendar.is_ie && !Calendar.is_opera) + return; + function getVisib(obj){ + var value = obj.style.visibility; + if (!value) { + if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C + if (!Calendar.is_khtml) + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue("visibility"); + else + value = ''; + } else if (obj.currentStyle) { // IE + value = obj.currentStyle.visibility; + } else + value = ''; + } + return value; + }; + + var tags = new Array("applet", "iframe", "select"); + var el = this.element; + + var p = Calendar.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + for (var k = tags.length; k > 0; ) { + var ar = document.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + + p = Calendar.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = cc.__msh_save_visibility; + } else { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = "hidden"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +Calendar.prototype._displayWeekdays = function () { + var fdow = this.firstDayOfWeek; + var cell = this.firstdayname; + var weekend = Calendar._TT["WEEKEND"]; + for (var i = 0; i < 7; ++i) { + cell.className = "day name"; + var realday = (i + fdow) % 7; + if (i) { + cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); + cell.navtype = 100; + cell.calendar = this; + cell.fdow = realday; + Calendar._add_evs(cell); + } + if (weekend.indexOf(realday.toString()) != -1) { + Calendar.addClass(cell, "weekend"); + } + cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; + cell = cell.nextSibling; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +Calendar.prototype._dragStart = function (ev) { + if (this.dragging) { + return; + } + this.dragging = true; + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } + //Opera bug fixed + else if(Calendar.is_opera) { + posY = ev.clientY + body.scrollTop; + posX = ev.clientX + body.scrollLeft; + } + else + { + posY = ev.clientY + window.scrollY; + posX = ev.clientX + window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + + with (Calendar) { + addEvent(document, "mousemove", calDragIt); + addEvent(document, "mouseup", calDragEnd); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +Date.MINUTE = 60 * Date.SECOND; +Date.HOUR = 60 * Date.MINUTE; +Date.DAY = 24 * Date.HOUR; +Date.WEEK = 7 * Date.DAY; + +Date.parseDate = function(str, fmt) { + + var today = new Date(); + var wk = 0; + var W = 0; + var D = 0; + var f = 0; + var y = 0; + var m = -1; + var d = 0; + var a = str.split(/\W+/); + var b = fmt.match(/%[a-zA-Z]{3}|%[a-zA-Z]{2}|%[a-zA-Z]{1}/g); + var i = 0, j = 0; + var hr = 0; + var min = 0; + var sec = 0; + var milisec = 0; + + for (i = 0; i < a.length; ++i) { + if (!a[i]) continue; + + switch (b[i]) { + + case "%d": + case "%dd": + case "%ddd": + d = parseInt(a[i], 10); + break; + + case "%M": + case "%m": + m = parseInt(a[i], 10) - 1; + break; + + case "%Y": + case "%y": + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + break; + + case "%n": + case "%N": + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } + } + break; + + case "%F": + case "%FF": + case "%FFF": + f = parseInt(a[i], 10); + break; + + case "%H": + case "%HH": + case "%HHH": + case "%h": + case "%hh": + case "%hhh": + case "%K": + case "%KK": + case "%KKK": + case "%k": + case "%kk": + case "%kkk": + hr = parseInt(a[i], 10); + break; + + case "%a": + if (/pm/i.test(a[i]) && hr < 12) + hr += 12; + else if (/am/i.test(a[i]) && hr >= 12) + hr -= 12; + break; + + case "%o": + case "%oo": + case "%ooo": + min = parseInt(a[i], 10); + break; + + case "%S": + case "%SS": + case "%SSS": + milisec = parseInt(a[i], 10); + break; + + case "%s": + case "%ss": + case "%sss": + sec = parseInt(a[i], 10); + break; + + case "%D": + case "%DD": + case "%DDD": + D = parseInt(a[i], 10); + break; + + case "%w": + case "%ww": + case "%www": + wk = parseInt(a[i], 10); + break; + + case "%W": + case "%WW": + case "%WWW": + W = parseInt(a[i], 10); + break; + + } + } + + if (isNaN(y)) y = today.getFullYear(); + if (isNaN(m)) m = today.getMonth(); + if (isNaN(d)) d = today.getDate(); + if (isNaN(hr)) hr = today.getHours(); + if (isNaN(min)) min = today.getMinutes(); + if (isNaN(sec)) sec = today.getSeconds(); + if (isNaN(milisec)) milisec = today.getMilliseconds(); + if (isNaN(f)) f = today.getDayWeekInMonth(); + + if (y != 0 && m != -1 && d != 0) + return new Date(y, m, d, hr, min, sec, milisec); + + y = 0; m = -1; d = 0; + + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) != -1) { + var t = -1; + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } + } + if (t != -1) { + if (m != -1) { + d = m+1; + } + m = t; + } + } else if (parseInt(a[i], 10) <= 12 && m == -1 && b[i] == "%m") { + m = a[i]-1; + } else if (parseInt(a[i], 10) > 31 && y == 0 && (b[i] == "%y" || b[i] == "%Y")) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } else if (d == 0 && (b[i] == "%d" || b[i] == "%dd" || b[i] == "%ddd")) { + d = a[i]; + } + } + if (y == 0) y = today.getFullYear(); + if (m == -1) m = today.getMonth(); + if (d == 0) d = today.getDate(); + + //day in year + if(D > 0) return today.getDateFromDayNr(D); + + //week in year + if(wk > 0) return today.getDateFromWeekInYear(wk); + + //week in month + if(W > 0) return today.getDateFromWeekInMonth(W); + + //day of week in month + if(f > 0) return today.getDateFromWeekInMonth(f); + + + if (m != -1 && d != 0) + return new Date(y, m, d, hr, min, sec, milisec); + return today; +}; + +//get a date knowing the current year and the number of week in year +Date.prototype.getDateFromWeekInYear = function(wknr) { + alert((wknr - 1) * 7 + this.getFirstWeekDay(Calendar._DN[this.getDay()])); + return this.getDateFromDayNr((wknr - 1) * 7 + this.getFirstWeekDay(Calendar._DN[this.getDay()])); +} + + +//get date from week in month, and current date +Date.prototype.getDateFromWeekInMonth = function(wkm) { + var today = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0); + var fwkm = today.getWeekInMonth(); + var nr = 0; + + while(fwkm < wkm) { + nr++; + fwkm++; + } + + return new Date(this.getFullYear(), this.getMonth(), 1 + nr * 7, 0, 0, 0); + +} + +//the number of days since 01.01.currentYear untile first "day" (e.g Monday or Thuesday...) +Date.prototype.getFirstWeekDay = function(day) { + var fd = new Date(this.getFullYear(), 0, 1, 0, 0, 0); + var d = fd.getDay(); + var nr = 0; + + while(Calendar._DN[d] != day) { + nr++; + d = (d + 1) % 7; + } + + return nr; +} + + + +/** Returns the date given the current year and the number of day in year */ +Date.prototype.getDateFromDayNr = function(nr) { + var thedate = new Date(this.getFullYear(), 0, nr+1, 0, 0, 0); + return thedate; +} + + + +/** Returns the number of days in the current month */ +Date.prototype.getMonthDays = function(month) { + var year = this.getFullYear(); + if (typeof month == "undefined") { + month = this.getMonth(); + } + if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { + return 29; + } else { + return Date._MD[month]; + } +}; + +/** Returns the number of day in the year. */ +Date.prototype.getDayOfYear = function() { + var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); + var time = now - then; + return Math.ceil(time / Date.DAY); +}; + +/** Returns the number of the week in year, as defined in ISO 8601. */ +Date.prototype.getWeekNumber = function() { + var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var DoW = d.getDay(); + d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu + var ms = d.valueOf(); // GMT + d.setMonth(0); + d.setDate(4); // Thu in Week 1 + return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; +}; + +/** Returns the number of week in month */ +Date.prototype.getWeekInMonth = function() { + var currdate = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var currday = currdate.getDate(); + var firstday = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0, 0); + var week = 0; + var d = firstday.getDay(); + + for(var i = 1; i < currday; i++) { + if(d == 6) week++; + d = (d + 1) % 7; + } + return week + 1; +} + + +/** Returns the day of week in month, eg. first monday.. */ +Date.prototype.getDayWeekInMonth = function() { + + var currdow = this.getDay(); // Thursday + var currdate = this.getDate(); // 14 + var nr = 0; + + var firstday = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0, 0); // first day of the month + var fdn = Calendar._DN[firstday.getDay()]; // the name of the first day in the month + + var d = firstday.getDay(); + for(var i = 1; i <= currdate; i++) { + if(fdn == Calendar._DN[currdow]) nr++; + d = (d + 1) % 7; + fdn = Calendar._DN[d]; + } + return nr; +} + + +/** Checks date and time equality */ +Date.prototype.equalsTo = function(date) { + return ((this.getFullYear() == date.getFullYear()) && + (this.getMonth() == date.getMonth()) && + (this.getDate() == date.getDate()) && + (this.getHours() == date.getHours()) && + (this.getMinutes() == date.getMinutes())); +}; + +/** Set only the year, month, date parts (keep existing time) */ +Date.prototype.setDateOnly = function(date) { + var tmp = new Date(date); + this.setDate(1); + this.setFullYear(tmp.getFullYear()); + this.setMonth(tmp.getMonth()); + this.setDate(tmp.getDate()); +}; + +/** Prints the date in a string according to the given format. */ +Date.prototype.print = function (str) { + var m = this.getMonth(); + var d = this.getDate(); + var y = this.getFullYear(); + var wn = this.getWeekNumber(); + var wnm = this.getWeekInMonth(); + var dwm = this.getDayWeekInMonth(); // day week in month + var w = this.getDay(); + var hr = this.getHours(); + var gr = (hr == 0) ? 24 : hr; + var pm = (hr >= 12); + var ir = (pm) ? (hr - 12) : hr; // 1-12 + if (ir == 0) ir = 12; + var jr = (pm) ? (hr - 13) : hr; // 0 -11 + if(jr == -1) jr = 11; + var dy = this.getDayOfYear(); + var min = this.getMinutes(); + var sec = this.getSeconds(); + var milisec = this.getMilliseconds(); + var z = this.getTimezoneOffset(); + + var s = {}; + + s["%e"] = Calendar._SDN[w]; // abbreviated weekday name + s["%E"] = Calendar._DN[w]; // full weekday name + + s["%n"] = Calendar._SMN[m]; // abbreviated month name + s["%N"] = Calendar._MN[m]; // full month name + + s["%d"] = d; // day, 1 - 31 + s["%dd"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) + s["%ddd"] = (d < 100) ? ((d < 10) ? ("00" + d) : ("0" + d)) : d; // day of the month, 001 - 031 + + s["%D"] = dy; //day in year, 1 - 365 + s["%DD"] = (dy < 10) ? ("0" + dy) : dy; // day in year, 01 - 365 + s["%DDD"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) + + s["%F"] = dwm; // day of week in month ; 1 - 5 + s["%FF"] = (dwm < 10) ? ("0" + dwm) : dwm; + s["%FFF"] = (dwm < 100) ? ((dwm < 10) ? ("00" + dwm) : ("0" + dwm)) : dwm; + + s["%w"] = wn; // week number in year + s["%ww"] = (wn < 10) ? ("0" + wn) : wn; + s["%www"] = (wn < 100) ? ((wn < 10) ? ("00" + wn) : ("0" + wn)) : wn; + + s["%W"] = wnm; // week number in month + s["%WW"] = (wnm < 10) ? ("0" + wnm) : wnm; + s["%WWW"] = (wnm < 100) ? ((wnm < 10) ? ("00" + wnm) : ("0" + wnm)) : wnm; + + s["%a"] = pm ? "PM" : "AM"; + + s["%H"] = hr; // hour, range 0 - 23 (24h format) + s["%HH"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 - 23 + s["%HHH"] = (hr < 100) ? ((hr < 10) ? ("00" + hr) : ("0" + hr)) : hr; + + s["%k"] = gr; // hour, range 1 - 24 (24h format) + s["%kk"] = gr < 10 ? ("0" + gr) : gr; //hour, range 01 -24 + s["%kkk"] = "0" + s["%kk"]; + + s["%K"] = jr; // hour, range 0 to 11 (12h format) + s["%KK"] = jr < 10 ? ("0"+ jr) : (jr); // hour, range 00 - 11 + s["%KKK"] = "0" + s["%KK"]; + + s["%h"] = ir; + s["%hh"] = ir < 10 ? ("0"+ir) : ir; //hour, range 01 -12 + s["%hhh"] = "0" + s["%hh"]; + + s["%m"] = m + 1; // month, range 1 -12 + s["%M"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 + + s["%o"] = min; // minute, range 0 - 59 + s["%oo"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 + s["%ooo"] = "0" + s["%oo"]; + + s["%s"] = sec; //seconds, range 0 - 59 + s["%ss"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 + s["%sss"] = (sec < 100) ? ((sec < 10) ? ("00" + sec) : ("0" + sec)) : sec; + + s["%S"] = milisec; //milliseconds, range 0 -999 + s["%SS"] = (milisec < 10) ? ("0" + milisec) : milisec; + s["%SSS"] = (milisec < 100) ? ((milisec < 10) ? ("00" + milisec) : ("0" + milisec)) : milisec; // milliseconds, range 000 -999 + + s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) + s["%Y"] = y; // year with the century + + var htz = z / 60; + var mtz = z % 60; + if(htz < 0) htz = htz < 10 ? ("-0" + (-htz)) : htz; + else htz = htz < 10 ? ("0" + htz) : htz; + if(mtz < 0) mtz = mtz < 10 ? ("-0" + (-mtz)) : mtz; + else mtz = mtz < 10 ? ("0" + mtz) : mtz; + + s["%z"] ="GMT" + htz + ":" + mtz; + s["%Z"] = htz + mtz; + + s["%G"] = y <= 0 ? "BC" : "AD"; + + var re = /%[a-zA-Z]{3}|%[a-zA-Z]{2}|%[a-zA-Z]{1}/g; + + var a = str.match(re); + for (var i = 0; i < a.length; i++) { + var tmp = s[a[i]]; + if (tmp != null) { + re = new RegExp(a[i], 'g'); + str = str.replace(re, tmp); + } + } + return str; +}; + +Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; +Date.prototype.setFullYear = function(y) { + var d = new Date(this); + d.__msh_oldSetFullYear(y); + if (d.getMonth() != this.getMonth()) + this.setDate(28); + this.__msh_oldSetFullYear(y); +}; + +// END: DATE OBJECT PATCHES + + +// global object that remembers the calendar +window._dynarch_popupCalendar = null; Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js (revision 0) @@ -0,0 +1,52 @@ +// full day names +Calendar._DN = new Array($msg.get("core.datepicker.dn")); + +// short day names +Calendar._SDN = new Array($msg.get("core.datepicker.sdn")); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = $msg.get("core.datepicker.fd"); + +// full month names +Calendar._MN = new Array($msg.get("core.datepicker.mn")); + +// short month names +Calendar._SMN = new Array($msg.get("core.datepicker.smn")); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "$msg.get("core.datepicker.info")"; +Calendar._TT["ABOUT"] = "$msg.get("core.datepicker.about")"; +Calendar._TT["ABOUT_TIME"] = "$msg.get("core.datepicker.about_time")"; + +Calendar._TT["PREV_YEAR"] = "$msg.get("core.datepicker.prev_year")"; +Calendar._TT["PREV_MONTH"] = "$msg.get("core.datepicker.prev_month")"; +Calendar._TT["GO_TODAY"] = "$msg.get("core.datepicker.go_today")"; +Calendar._TT["NEXT_MONTH"] = "$msg.get("core.datepicker.next_month")"; +Calendar._TT["NEXT_YEAR"] = "$msg.get("core.datepicker.next_year")"; +Calendar._TT["SEL_DATE"] = "$msg.get("core.datepicker.sel_date")"; +Calendar._TT["DRAG_TO_MOVE"] = "$msg.get("core.datepicker.drag")"; +Calendar._TT["PART_TODAY"] = "$msg.get("core.datepicker.part_today")"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "$msg.get("core.datepicker.day_first")"; + +// It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "$msg.get("core.datepicker.weekend")"; + +Calendar._TT["CLOSE"] = "$msg.get("core.datepicker.close")"; +Calendar._TT["TODAY"] = "$msg.get("core.datepicker.today")"; +Calendar._TT["TIME_PART"] = "$msg.get("core.datepicker.time_part")"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "$msg.get("core.datepicker.def_date_format")"; +Calendar._TT["TT_DATE_FORMAT"] = "$msg.get("core.datepicker.tt_date_format")"; + +Calendar._TT["WK"] = "$msg.get("core.datepicker.wk")"; +Calendar._TT["TIME"] = "$msg.get("core.datepicker.time")"; + + Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar-setup.js (revision 0) @@ -0,0 +1,437 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ +* Modified by Evelina Slatineanu, 2007 + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + +// $Id: calendar-setup.js,v 1.25 2005/03/07 09:51:33 mishoo Exp $ + +/** + * This function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. + * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) + * onClose | function that gets called when the calendar is closed. [default] + * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. + * date | the date that the calendar will be initially displayed to + * showsTime | default: false; if true the calendar will include a time selector + * timeFormat | the time format; can be "12" or "24", default is "12" + * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close + * step | configures the step of the years in drop-down boxes; default: 2 + * position | configures the calendar absolute position; default: null + * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible + * showOthers | if "true" (but default: "false") it will show days from other months too + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ + + /* Conversion from java SimpleDateFormat to javascript date format (modified) */ + +var numb = "0123456789"; +var lwr = "abcdefghijklmnopqrstuvwxyz"; +var upr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +function isValid(parm,val) { + if (parm == "") return true; + for (i=0; i" + str); + return str; + +} + + +//calendar setup function +Calendar.setup = function (params) { + function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; + + param_default("inputField", null); + param_default("displayArea", null); + param_default("button", null); + param_default("eventName", "click"); + param_default("ifFormat", "dd/%M/%Y %HH:%MM:%ss"); + param_default("daFormat", "dd/%M/%Y %HH:%MM:%ss"); + param_default("singleClick", false); + param_default("disableFunc", null); + param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined + param_default("dateText", null); + param_default("firstDay", null); + param_default("align", "Br"); + param_default("range", [1950, 2100]); + param_default("weekNumbers", true); + param_default("flat", null); + param_default("flatCallback", null); + param_default("onSelect", null); + param_default("onClose", null); + param_default("onUpdate", null); + param_default("date", null); + param_default("showsTime", false); + param_default("timeFormat", "24"); + param_default("startTimeWith", 0); + param_default("electric", true); + param_default("step", 1); + param_default("position", null); + param_default("cache", false); + param_default("showOthers", false); + param_default("multiple", null); + param_default("skin", "aero"); + + //show the image + if(document.all) { + var imgs = document.all.tags("img"); + }else if(document.getElementsByTagName) { + var imgs = document.getElementsByTagName("img"); + } + for(var i = 0; i < imgs.length; i++) + if(imgs[i].id.indexOf("dateselector") >= 0) + imgs[i].style.display = "inline"; + + var tmp = ["inputField", "displayArea", "button"]; + for (var i in tmp) { + if (typeof params[tmp[i]] == "string") { + params[tmp[i]] = document.getElementById(params[tmp[i]]); + } + } + + if(params.range[0] <= 0) params.range[0] = 1950; + if(params.range[1] <= 0) params.range[1] = 2100; + //convert the date format + params.ifFormat = convertJavaFormat(params.javaFormat); + + if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { + alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); + return false; + } + + function onSelect(cal) { + var p = cal.params; + var update = cal.dateDbClicked; + if (update && p.inputField) { + p.inputField.value = cal.date.print(p.ifFormat); + if (typeof p.inputField.onchange == "function") + p.inputField.onchange(); + } + if (update && p.displayArea) + p.displayArea.innerHTML = cal.date.print(p.daFormat); + if (update && typeof p.onUpdate == "function") + p.onUpdate(cal); + if (update && p.flat) { + if (typeof p.flatCallback == "function") + p.flatCallback(cal); + } + if (update && p.singleClick && cal.dateClicked) + cal.callCloseHandler(); + }; + + if (params.flat != null) { + if (typeof params.flat == "string") + params.flat = document.getElementById(params.flat); + if (!params.flat) { + alert("Calendar.setup:\n Flat specified but can't find parent."); + return false; + } + var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); + cal.showsOtherMonths = params.showOthers; + cal.showsTime = params.showsTime; + cal.startTimeWith = params.startTimeWith; + cal.time24 = (params.timeFormat == "24"); + cal.params = params; + cal.weekNumbers = params.weekNumbers; + cal.setRange(params.range[0], params.range[1]); + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.skin = params.skin; + if (params.ifFormat) { + cal.setDateFormat(params.ifFormat); + } + if (params.inputField && typeof params.inputField.value == "string") { + cal.parseDate(params.inputField.value); + } + cal.create(params.flat); + cal.show(); + return false; + } + + var triggerEl = params.button || params.displayArea || params.inputField; + triggerEl["on" + params.eventName] = function() { + var dateEl = params.inputField || params.displayArea; + var dateFmt = params.inputField ? params.ifFormat : params.daFormat; + var mustCreate = false; + var cal = window.calendar; + if (dateEl) + params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); + if (!(cal && params.cache)) { + window.calendar = cal = new Calendar(params.firstDay, + params.date, + params.onSelect || onSelect, + params.onClose || function(cal) { cal.hide(); }); + cal.showsTime = params.showsTime; + cal.time24 = (params.timeFormat == "24"); + cal.startTimeWith = params.startTimeWith; + cal.weekNumbers = params.weekNumbers; + cal.skin = params.skin; + mustCreate = true; + } else { + if (params.date) + cal.setDate(params.date); + cal.hide(); + } + if (params.multiple) { + cal.multiple = {}; + for (var i = params.multiple.length; --i >= 0;) { + var d = params.multiple[i]; + var ds = d.print("%Y%m%d"); + cal.multiple[ds] = d; + } + } + cal.showsOtherMonths = params.showOthers; + cal.yearStep = params.step; + cal.setRange(params.range[0], params.range[1]); + cal.params = params; + cal.setDateStatusHandler(params.dateStatusFunc); + cal.getDateText = params.dateText; + cal.setDateFormat(dateFmt); + cal.skin = params.skin; + if (mustCreate) + cal.create(); + cal.refresh(); + if (!params.position) + cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); + else + cal.showAt(params.position[0], params.position[1]); + return false; + }; + + return cal; +}; Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/calendar.js (revision 0) @@ -0,0 +1,2043 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo +* Modified by Evelina Slatineanu, 2007 +* - fixed Opera dragging bug +* - add conversion from java SimpleDateFormat to javascript format, using calendar format +* - add numerous "utility" functions to remember an approximate choice of user + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + +// $Id: calendar.js,v 1.51 2005/03/07 16:44:31 mishoo Exp $ + +/** The Calendar object constructor. */ +Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { + // member variables + this.activeDiv = null; + this.currentDateEl = null; + this.getDateStatus = null; + this.getDateToolTip = null; + this.getDateText = null; + this.timeout = null; + this.onSelected = onSelected || null; + this.onClose = onClose || null; + this.dragging = false; + this.hidden = false; + this.minYear = 1950; + this.maxYear = 2100; + this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; + this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; + this.isPopup = true; + this.weekNumbers = true; + this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc. + this.showsOtherMonths = false; + this.dateStr = dateStr; + this.ar_days = null; + this.showsTime = false; + this.time24 = true; + this.startTimeWith = 0; + this.yearStep = 1; + this.hiliteToday = true; + this.multiple = null; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + this.dateDbClicked = false; + //skin + this.skin = "aero"; + + // one-time initializations + if (typeof Calendar._SDN == "undefined") { + // table of short day names + if (typeof Calendar._SDN_len == "undefined") + Calendar._SDN_len = 3; + var ar = new Array(); + for (var i = 8; i > 0;) { + ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); + } + Calendar._SDN = ar; + // table of short month names + if (typeof Calendar._SMN_len == "undefined") + Calendar._SMN_len = 3; + ar = new Array(); + for (var i = 12; i > 0;) { + ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); + } + Calendar._SMN = ar; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect Opera browser +Calendar.is_opera = /opera/i.test(navigator.userAgent); + + +/// detect a special case of "web browser" +Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) ); + +Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) ); + + +/// detect KHTML-based browsers +Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +Calendar.getAbsolutePos = function(el) { + var SL = 0, ST = 0; + var is_div = /^div$/i.test(el.tagName); + if (is_div && el.scrollLeft) + SL = el.scrollLeft; + if (is_div && el.scrollTop) + ST = el.scrollTop; + var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; + if (el.offsetParent) { + var tmp = this.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +Calendar.isRelated = function (el, evt) { + var related = evt.relatedTarget; + if (!related) { + var type = evt.type; + if (type == "mouseover") { + related = evt.fromElement; + } else if (type == "mouseout") { + related = evt.toElement; + } + } + while (related) { + if (related == el) { + return true; + } + related = related.parentNode; + } + return false; +}; + +Calendar.removeClass = function(el, className) { + if (!(el && el.className)) { + return; + } + var cls = el.className.split(" "); + var ar = new Array(); + for (var i = cls.length; i > 0;) { + if (cls[--i] != className) { + ar[ar.length] = cls[i]; + } + } + el.className = ar.join(" "); + +}; + +Calendar.addClass = function(el, className) { + Calendar.removeClass(el, className); + el.className += " " + className; +}; + +// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. +Calendar.getElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; + while (f.nodeType != 1 || /^div$/i.test(f.tagName)) + f = f.parentNode; + return f; +}; + +Calendar.getTargetElement = function(ev) { + var f = Calendar.is_ie ? window.event.srcElement : ev.target; + while (f.nodeType != 1) + f = f.parentNode; + return f; +}; + +Calendar.stopEvent = function(ev) { + ev || (ev = window.event); + if (Calendar.is_ie) { + ev.cancelBubble = true; + ev.returnValue = false; + } else { + ev.preventDefault(); + ev.stopPropagation(); + } + return false; +}; + +Calendar.addEvent = function(el, evname, func) { + if (el.attachEvent) { // IE && OPERA + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // FIREFOX + el.addEventListener(evname, func, true); + } else { + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + OPERA + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +Calendar._add_evs = function(el) { + with (Calendar) { + addEvent(el, "mouseover", dayMouseOver); + addEvent(el, "mousedown", dayMouseDown); + addEvent(el, "mouseout", dayMouseOut); + if (is_ie) { + addEvent(el, "dblclick", dayMouseDblClick); + el.setAttribute("unselectable", true); + } + } +}; + +Calendar.findMonth = function(el) { + if (typeof el.month != "undefined") { + return el; + } else if (typeof el.parentNode.month != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.findYear = function(el) { + if (typeof el.year != "undefined") { + return el; + } else if (typeof el.parentNode.year != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.showMonthsCombo = function () { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var mc = cal.monthsCombo; + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + if (cal.activeMonth) { + Calendar.removeClass(cal.activeMonth, "active"); + } + var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; + Calendar.addClass(mon, "active"); + cal.activeMonth = mon; + var s = mc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var mcw = mc.offsetWidth; + if (typeof mcw == "undefined") + // Konqueror brain-dead techniques + mcw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; +}; + +Calendar.showYearsCombo = function (fwd) { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var yc = cal.yearsCombo; + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + if (cal.activeYear) { + Calendar.removeClass(cal.activeYear, "active"); + } + cal.activeYear = null; + var Y = cal.date.getFullYear() + (fwd ? 1 : -1); + var yr = yc.firstChild; + var show = false; + for (var i = 12; i > 0; --i) { + if (Y >= cal.minYear && Y <= cal.maxYear) { + yr.innerHTML = Y; + yr.year = Y; + yr.style.display = "block"; + show = true; + } else { + yr.style.display = "none"; + } + yr = yr.nextSibling; + Y += fwd ? cal.yearStep : -cal.yearStep; + } + if (show) { + var s = yc.style; + s.display = "block"; + if (cd.navtype < 0) + s.left = cd.offsetLeft + "px"; + else { + var ycw = yc.offsetWidth; + if (typeof ycw == "undefined") + // Konqueror brain-dead techniques + ycw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; + } +}; + +// event handlers + +Calendar.tableMouseUp = function(ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + if (cal.timeout) { + clearTimeout(cal.timeout); + } + var el = cal.activeDiv; + if (!el) { + return false; + } + var target = Calendar.getTargetElement(ev); + ev || (ev = window.event); + Calendar.removeClass(el, "active"); + if (target == el || target.parentNode == el) { + Calendar.cellClick(el, ev); + } + var mon = Calendar.findMonth(target); + var date = null; + if (mon) { + date = new Date(cal.date); + if (mon.month != date.getMonth()) { + date.setMonth(mon.month); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } else { + var year = Calendar.findYear(target); + if (year) { + date = new Date(cal.date); + if (year.year != date.getFullYear()) { + date.setFullYear(year.year); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } + } + with (Calendar) { + removeEvent(document, "mouseup", tableMouseUp); + removeEvent(document, "mouseover", tableMouseOver); + removeEvent(document, "mousemove", tableMouseOver); + cal._hideCombos(); + _C = null; + return stopEvent(ev); + } +}; + +Calendar.tableMouseOver = function (ev) { + var cal = Calendar._C; + if (!cal) { + return; + } + var el = cal.activeDiv; + var target = Calendar.getTargetElement(ev); + if (target == el || target.parentNode == el) { + Calendar.addClass(el, "hilite active"); + Calendar.addClass(el.parentNode, "rowhilite"); + } else { + if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) + Calendar.removeClass(el, "active"); + Calendar.removeClass(el, "hilite"); + Calendar.removeClass(el.parentNode, "rowhilite"); + } + ev || (ev = window.event); + if (el.navtype == 50 && target != el) { + var pos = Calendar.getAbsolutePos(el); + var w = el.offsetWidth; + var x = ev.clientX; + var dx; + var decrease = true; + if (x > pos.x + w) { + dx = x - pos.x - w; + decrease = false; + } else + dx = pos.x - x; + + if (dx < 0) dx = 0; + var range = el._range; + var current = el._current; + var count = Math.floor(dx / 10) % range.length; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + while (count-- > 0) + if (decrease) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + + cal.onUpdateTime(); + } + var mon = Calendar.findMonth(target); + if (mon) { + if (mon.month != cal.date.getMonth()) { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + Calendar.addClass(mon, "hilite"); + cal.hilitedMonth = mon; + } else if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + } else { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + var year = Calendar.findYear(target); + if (year) { + if (year.year != cal.date.getFullYear()) { + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + Calendar.addClass(year, "hilite"); + cal.hilitedYear = year; + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.tableMouseDown = function (ev) { + if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { + return Calendar.stopEvent(ev); + } +}; + +//drag calendar!! +Calendar.calDragIt = function (ev) { + var cal = Calendar._C; + if (!(cal && cal.dragging)) { + return false; + } + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + + } else { //Opera, Firefox + posX = ev.pageX; + posY = ev.pageY; + } + cal.hideShowCovered(); + var st = cal.element.style; + //cal.xOffs are NaN in Opera!!!! + st.left = (posX - cal.xOffs) + "px"; + st.top = (posY - cal.yOffs) + "px"; + + return Calendar.stopEvent(ev); +}; + +Calendar.calDragEnd = function (ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + cal.dragging = false; + with (Calendar) { + removeEvent(document, "mousemove", calDragIt); + removeEvent(document, "mouseup", calDragEnd); + tableMouseUp(ev); + } + cal.hideShowCovered(); +}; + +Calendar.dayMouseDown = function(ev) { + var el = Calendar.getElement(ev); + if (el.disabled) { + return false; + } + var cal = el.calendar; + cal.activeDiv = el; + Calendar._C = cal; + if (el.navtype != 300) with (Calendar) { + if (el.navtype == 50) { + el._current = el.innerHTML; + addEvent(document, "mousemove", tableMouseOver); + } else + addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); + addClass(el, "hilite active"); + addEvent(document, "mouseup", tableMouseUp); + } else if (cal.isPopup) { + cal._dragStart(ev); + } + if (el.navtype == -1 || el.navtype == 1) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); + } else if (el.navtype == -2 || el.navtype == 2) { + if (cal.timeout) clearTimeout(cal.timeout); + cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); + } else { + cal.timeout = null; + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseDblClick = function(ev) { + Calendar.cellClick(Calendar.getElement(ev), ev || window.event); + if (Calendar.is_ie) { + document.selection.empty(); + } +}; + +Calendar.dayMouseOver = function(ev) { + var el = Calendar.getElement(ev); + if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { + return false; + } + if (el.ttip) { + if (el.ttip.substr(0, 1) == "_") { + el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); + } + el.calendar.tooltips.innerHTML = el.ttip; + } + if (el.navtype != 300) { + Calendar.addClass(el, "hilite"); + if (el.caldate) { + Calendar.addClass(el.parentNode, "rowhilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseOut = function(ev) { + with (Calendar) { + var el = getElement(ev); + if (isRelated(el, ev) || _C || el.disabled) + return false; + removeClass(el, "hilite"); + if (el.caldate) + removeClass(el.parentNode, "rowhilite"); + if (el.calendar) + el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; + return stopEvent(ev); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +Calendar.cellClick = function(el, ev) { + var cal = el.calendar; + var closing = false; + var newdate = false; + var date = null; + if (typeof el.navtype == "undefined") { + if (cal.currentDateEl) { + Calendar.removeClass(cal.currentDateEl, "selected"); + Calendar.addClass(el, "selected"); + closing = (cal.currentDateEl == el); + if (!closing) { + cal.currentDateEl = el; + } + else cal.dateDbClicked = true; + } + cal.date.setDateOnly(el.caldate); + date = cal.date; + var other_month = !(cal.dateClicked = !el.otherMonth); + if (!other_month && !cal.currentDateEl) + cal._toggleMultipleDate(new Date(date)); + else + newdate = !el.disabled; + // a date was clicked + if (other_month) + cal._init(cal.firstDayOfWeek, date); + } else { + if (el.navtype == 200) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + return; + } + date = new Date(cal.date); + if (el.navtype == 0) + date.setDateOnly(new Date()); // TODAY + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + // cal.dateClicked = (el.navtype == 0); + cal.dateClicked = false; + var year = date.getFullYear(); + var mon = date.getMonth(); + function setMonth(m) { + var day = date.getDate(); + var max = date.getMonthDays(m); + if (day > max) { + date.setDate(max); + } + date.setMonth(m); + }; + switch (el.navtype) { + case 400: + Calendar.removeClass(el, "hilite"); + var text = Calendar._TT["ABOUT"]; + if (typeof text != "undefined") { + text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; + } else { + // FIXME: this should be removed as soon as lang files get updated! + text = "Help and about box text is not translated into this language.\n"; + } + alert(text); + return; + case -2: + if (year > cal.minYear) { + date.setFullYear(year - 1); + } + break; + case -1: + if (mon > 0) { + setMonth(mon - 1); + } else if (year-- > cal.minYear) { + date.setFullYear(year); + setMonth(11); + } + break; + case 1: + if (mon < 11) { + setMonth(mon + 1); + } else if (year < cal.maxYear) { + date.setFullYear(year + 1); + setMonth(0); + } + break; + case 2: + if (year < cal.maxYear) { + date.setFullYear(year + 1); + } + break; + case 100: + cal.setFirstDayOfWeek(el.fdow); + return; + case 50: + var range = el._range; + var current = el.innerHTML; + for (var i = range.length; --i >= 0;) + if (range[i] == current) + break; + if (ev && ev.shiftKey) { + if (--i < 0) + i = range.length - 1; + } else if ( ++i >= range.length ) + i = 0; + var newval = range[i]; + el.innerHTML = newval; + cal.onUpdateTime(); + return; + case 0: + // TODAY will bring us here + if ((typeof cal.getDateStatus == "function") && + cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { + return false; + } + break; + } + if (!date.equalsTo(cal.date)) { + cal.setDate(date); + newdate = true; + } else if (el.navtype == 0) + newdate = closing = true; + } + if (newdate) { + ev && cal.callHandler(); + } + if (closing) { + Calendar.removeClass(el, "hilite"); + ev && cal.callCloseHandler(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + parent = document.getElementsByTagName("body")[0]; + this.isPopup = true; + } else { + parent = _par; + this.isPopup = false; + } + this.date = this.dateStr ? new Date(this.dateStr) : new Date(); + + var table = Calendar.createElement("table"); + this.table = table; + table.cellSpacing = 0; + table.cellPadding = 0; + table.calendar = this; + Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); + + var div = Calendar.createElement("div"); + this.element = div; + div.className = "calendar_" + this.skin; + + if (this.isPopup) { + div.style.position = "absolute"; + div.style.display = "none"; + } + div.appendChild(table); + + var thead = Calendar.createElement("thead", table); + var cell = null; + var row = null; + + var cal = this; + var hh = function (text, cs, navtype) { + cell = Calendar.createElement("td", row); + cell.colSpan = cs; + cell.className = "button"; + if (navtype != 0 && Math.abs(navtype) <= 2) + cell.className += " nav"; + Calendar._add_evs(cell); + cell.calendar = cal; + cell.navtype = navtype; + cell.innerHTML = "
" + text + "
"; + return cell; + }; + + row = Calendar.createElement("tr", thead); + var title_length = 6; + (this.isPopup) && --title_length; + (this.weekNumbers) && ++title_length; + + hh("?", 1, 400).ttip = Calendar._TT["INFO"]; + this.title = hh("", title_length, 300); + this.title.className = "title"; + if (this.isPopup) { + this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; + this.title.style.cursor = "move"; + hh("x", 1, 200).ttip = Calendar._TT["CLOSE"]; + } + + row = Calendar.createElement("tr", thead); + row.className = "headrow"; + + this._nav_py = hh("«", 1, -2); + this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; + + this._nav_pm = hh("‹", 1, -1); + this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; + + this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); + this._nav_now.ttip = Calendar._TT["GO_TODAY"]; + + this._nav_nm = hh("›", 1, 1); + this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; + + this._nav_ny = hh("»", 1, 2); + this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; + + // day names + row = Calendar.createElement("tr", thead); + row.className = "daynames"; + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.className = "name wn"; + cell.innerHTML = Calendar._TT["WK"]; + } + for (var i = 7; i > 0; --i) { + cell = Calendar.createElement("td", row); + if (!i) { + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + } + this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; + this._displayWeekdays(); + + var tbody = Calendar.createElement("tbody", table); + this.tbody = tbody; + + for (i = 6; i > 0; --i) { + row = Calendar.createElement("tr", tbody); + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + } + for (var j = 7; j > 0; --j) { + cell = Calendar.createElement("td", row); + cell.calendar = this; + Calendar._add_evs(cell); + } + } + + if (this.showsTime) { + row = Calendar.createElement("tr", tbody); + row.className = "time"; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + cell.innerHTML = Calendar._TT["TIME"] || " "; + + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = this.weekNumbers ? 4 : 3; + + (function(){ + function makeTimePart(className, init, range_start, range_end) { + var part = Calendar.createElement("span", cell); + part.className = className; + part.innerHTML = init; + part.calendar = cal; + part.ttip = Calendar._TT["TIME_PART"]; + part.navtype = 50; + part._range = []; + if (typeof range_start != "number") + part._range = range_start; + else { + for (var i = range_start; i <= range_end; ++i) { + var txt; + if (i < 10 && range_end >= 10) txt = '0' + i; + else txt = '' + i; + part._range[part._range.length] = txt; + } + } + Calendar._add_evs(part); + return part; + }; + var hrs = cal.date.getHours(); //hours + var mins = cal.date.getMinutes(); //minutes + var secs = cal.date.getSeconds(); //seconds + + + var t12 = !cal.time24; //display 12 + var pm = (hrs > 12); // display am/pm + if (t12 && pm) hrs -= 12; + if(cal.startTimeWith == 0) + var H = makeTimePart("hour", hrs, 0, t12 ? 11 : 23); + else + var H = makeTimePart("hour", hrs, 1, t12 ? 12 : 24); + var span = Calendar.createElement("span", cell); + span.innerHTML = ":"; + span.className = "colon"; + var M = makeTimePart("minute", mins, 0, 59); + var span2 = Calendar.createElement("span", cell); + span2.innerHTML = ":"; + span2.className = "colon"; + var S = makeTimePart("second", secs, 0, 59); + var AP = null; + cell = Calendar.createElement("td", row); + cell.className = "time"; + cell.colSpan = 2; + if (t12) + AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); + else + cell.innerHTML = " "; + + cal.onSetTime = function() { + var pm, hrs = this.date.getHours(), + mins = this.date.getMinutes(), + secs = this.date.getSeconds(); + if (t12) { + pm = (hrs >= 12); + if (pm) hrs -= 12; + if(hrs == 0 && this.startTimeWith == 1 && !this.time24 ) hrs = 12; + AP.innerHTML = pm ? "pm" : "am"; + } + else if(hrs == 0 && this.startTimeWith == 1 && this.time24) hrs = 24; + H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; + M.innerHTML = (mins < 10) ? ("0" + mins) : mins; + S.innerHTML = (secs < 10) ? ("0" + secs) : secs; + }; + + cal.onUpdateTime = function() { + var date = this.date; + var h = parseInt(H.innerHTML, 10); + if (t12) { + if (/pm/i.test(AP.innerHTML) && h < 12) + h += 12; + } + var d = date.getDate(); + var m = date.getMonth(); + var y = date.getFullYear(); + date.setHours(h); + date.setMinutes(parseInt(M.innerHTML, 10)); + date.setSeconds(parseInt(S.innerHTML, 10)); + date.setFullYear(y); + date.setMonth(m); + date.setDate(d); + this.dateClicked = false; + this.dateDbClicked = false; + this.callHandler(); + }; + })(); + } else { + this.onSetTime = this.onUpdateTime = function() {}; + } + + var tfoot = Calendar.createElement("tfoot", table); + + row = Calendar.createElement("tr", tfoot); + row.className = "footrow"; + + cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); + cell.className = "ttip"; + if (this.isPopup) { + cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; + cell.style.cursor = "move"; + } + this.tooltips = cell; + + div = Calendar.createElement("div", this.element); + this.monthsCombo = div; + div.className = "combo"; + for (i = 0; i < Calendar._MN.length; ++i) { + var mn = Calendar.createElement("div"); + mn.className = Calendar.is_ie ? "label-IEfix" : "label"; + mn.month = i; + mn.innerHTML = Calendar._SMN[i]; + div.appendChild(mn); + } + + div = Calendar.createElement("div", this.element); + this.yearsCombo = div; + div.className = "combo"; + for (i = 12; i > 0; --i) { + var yr = Calendar.createElement("div"); + yr.className = Calendar.is_ie ? "label-IEfix" : "label"; + div.appendChild(yr); + } + + this._init(this.firstDayOfWeek, this.date); + parent.appendChild(this.element); +}; + +/** keyboard navigation, only for popup calendars */ +Calendar._keyEvent = function(ev) { + var cal = window._dynarch_popupCalendar; + if (!cal || cal.multiple) + return false; + (Calendar.is_ie) && (ev = window.event); + var act = (Calendar.is_ie || ev.type == "keypress"), + K = ev.keyCode; + if (ev.ctrlKey) { + switch (K) { + case 37: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (K) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.callCloseHandler(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + if (act) { + var prev, x, y, ne, el, step; + prev = K == 37 || K == 38; + step = (K == 37 || K == 39) ? 1 : 7; + function setVars() { + el = cal.currentDateEl; + var p = el.pos; + x = p & 15; + y = p >> 4; + ne = cal.ar_days[y][x]; + };setVars(); + function prevMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() - step); + cal.setDate(date); + }; + function nextMonth() { + var date = new Date(cal.date); + date.setDate(date.getDate() + step); + cal.setDate(date); + }; + while (1) { + switch (K) { + case 37: // KEY left + if (--x >= 0) + ne = cal.ar_days[y][x]; + else { + x = 6; + K = 38; + continue; + } + break; + case 38: // KEY up + if (--y >= 0) + ne = cal.ar_days[y][x]; + else { + prevMonth(); + setVars(); + } + break; + case 39: // KEY right + if (++x < 7) + ne = cal.ar_days[y][x]; + else { + x = 0; + K = 40; + continue; + } + break; + case 40: // KEY down + if (++y < cal.ar_days.length) + ne = cal.ar_days[y][x]; + else { + nextMonth(); + setVars(); + } + break; + } + break; + } + if (ne) { + if (!ne.disabled) + Calendar.cellClick(ne); + else if (prev) + prevMonth(); + else + nextMonth(); + } + } + break; + case 13: // KEY enter + if (act) + Calendar.cellClick(cal.currentDateEl, ev); + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and firstDayOfWeek + */ +Calendar.prototype._init = function (firstDayOfWeek, date) { + var today = new Date(), + TY = today.getFullYear(), + TM = today.getMonth(), + TD = today.getDate(); + this.table.style.visibility = "hidden"; + var year = date.getFullYear(); + if (year < this.minYear) { + year = this.minYear; + date.setFullYear(year); + } else if (year > this.maxYear) { + year = this.maxYear; + date.setFullYear(year); + } + this.firstDayOfWeek = firstDayOfWeek; + this.date = new Date(date); + var month = date.getMonth(); + var mday = date.getDate(); + var no_days = date.getMonthDays(); + + // calendar voodoo for computing the first day that would actually be + // displayed in the calendar, even if it's from the previous month. + // WARNING: this is magic. ;-) + date.setDate(1); + var day1 = (date.getDay() - this.firstDayOfWeek) % 7; + if (day1 < 0) + day1 += 7; + date.setDate(-day1); + date.setDate(date.getDate() + 1); + + var row = this.tbody.firstChild; + var MN = Calendar._SMN[month]; + var ar_days = this.ar_days = new Array(); + var weekend = Calendar._TT["WEEKEND"]; + var dates = this.multiple ? (this.datesCells = {}) : null; + for (var i = 0; i < 6; ++i, row = row.nextSibling) { + var cell = row.firstChild; + if (this.weekNumbers) { + cell.className = "day wn"; + cell.innerHTML = date.getWeekNumber(); + cell = cell.nextSibling; + } + row.className = "daysrow"; + var hasdays = false, iday, dpos = ar_days[i] = []; + for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { + iday = date.getDate(); + var wday = date.getDay(); + cell.className = "day"; + cell.pos = i << 4 | j; + dpos[j] = cell; + var current_month = (date.getMonth() == month); + if (!current_month) { + if (this.showsOtherMonths) { + cell.className += " othermonth"; + cell.otherMonth = true; + } else { + cell.className = "emptycell"; + cell.innerHTML = " "; + cell.disabled = true; + continue; + } + } else { + cell.otherMonth = false; + hasdays = true; + } + cell.disabled = false; + cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; + if (dates) + dates[date.print("%Y%m%d")] = cell; + if (this.getDateStatus) { + var status = this.getDateStatus(date, year, month, iday); + if (this.getDateToolTip) { + var toolTip = this.getDateToolTip(date, year, month, iday); + if (toolTip) + cell.title = toolTip; + } + if (status === true) { + cell.className += " disabled"; + cell.disabled = true; + } else { + if (/disabled/i.test(status)) + cell.disabled = true; + cell.className += " " + status; + } + } + if (!cell.disabled) { + cell.caldate = new Date(date); + cell.ttip = "_"; + if (!this.multiple && current_month + && iday == mday && this.hiliteToday) { + cell.className += " selected"; + this.currentDateEl = cell; + } + if (date.getFullYear() == TY && + date.getMonth() == TM && + iday == TD) { + cell.className += " today"; + cell.ttip += Calendar._TT["PART_TODAY"]; + } + if (weekend.indexOf(wday.toString()) != -1) + cell.className += cell.otherMonth ? " oweekend" : " weekend"; + } + } + if (!(hasdays || this.showsOtherMonths)) + row.className = "emptyrow"; + } + this.title.innerHTML = Calendar._MN[month] + ", " + year; + this.onSetTime(); + this.table.style.visibility = "visible"; + this._initMultipleDates(); + // PROFILE + // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; +}; + +Calendar.prototype._initMultipleDates = function() { + if (this.multiple) { + for (var i in this.multiple) { + var cell = this.datesCells[i]; + var d = this.multiple[i]; + if (!d) + continue; + if (cell) + cell.className += " selected"; + } + } +}; + +Calendar.prototype._toggleMultipleDate = function(date) { + if (this.multiple) { + var ds = date.print("%Y%m%d"); + var cell = this.datesCells[ds]; + if (cell) { + var d = this.multiple[ds]; + if (!d) { + Calendar.addClass(cell, "selected"); + this.multiple[ds] = date; + } else { + Calendar.removeClass(cell, "selected"); + delete this.multiple[ds]; + } + } + } +}; + +Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { + this.getDateToolTip = unaryFunction; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.firstDayOfWeek, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.firstDayOfWeek, this.date); +}; + +/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ +Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { + this._init(firstDayOfWeek, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.getDateStatus = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; + window._dynarch_popupCalendar = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +Calendar._checkCalendar = function(ev) { + var calendar = window._dynarch_popupCalendar; + if (!calendar) { + return false; + } + var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); + for (; el != null && el != calendar.element; el = el.parentNode); + if (el == null) { + // calls closeHandler which should hide the calendar. + window._dynarch_popupCalendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +Calendar.prototype.show = function () { + var rows = this.table.getElementsByTagName("tr"); + for (var i = rows.length; i > 0;) { + var row = rows[--i]; + Calendar.removeClass(row, "rowhilite"); + var cells = row.getElementsByTagName("td"); + for (var j = cells.length; j > 0;) { + var cell = cells[--j]; + Calendar.removeClass(cell, "hilite"); + Calendar.removeClass(cell, "active"); + } + } + this.element.style.display = "block"; + this.hidden = false; + if (this.isPopup) { + window._dynarch_popupCalendar = this; + Calendar.addEvent(document, "keydown", Calendar._keyEvent); + Calendar.addEvent(document, "keypress", Calendar._keyEvent); + Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); + } + this.hideShowCovered(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +Calendar.prototype.hide = function () { + if (this.isPopup) { + Calendar.removeEvent(document, "keydown", Calendar._keyEvent); + Calendar.removeEvent(document, "keypress", Calendar._keyEvent); + Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); + } + this.element.style.display = "none"; + this.hidden = true; + this.hideShowCovered(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +Calendar.prototype.showAtElement = function (el, opts) { + var self = this; + var p = Calendar.getAbsolutePos(el); + if (!opts || typeof opts != "string") { + this.showAt(p.x, p.y + el.offsetHeight); + return true; + } + function fixPosition(box) { + if (box.x < 0) + box.x = 0; + if (box.y < 0) + box.y = 0; + var cp = document.createElement("div"); + var s = cp.style; + s.position = "absolute"; + s.right = s.bottom = s.width = s.height = "0px"; + document.body.appendChild(cp); + var br = Calendar.getAbsolutePos(cp); + document.body.removeChild(cp); + if (Calendar.is_ie) { + br.y += document.body.scrollTop; + br.x += document.body.scrollLeft; + } else { + br.y += window.scrollY; + br.x += window.scrollX; + } + var tmp = box.x + box.width - br.x; + if (tmp > 0) box.x -= tmp; + tmp = box.y + box.height - br.y; + if (tmp > 0) box.y -= tmp; + }; + this.element.style.display = "block"; + Calendar.continuation_for_the_fucking_khtml_browser = function() { + var w = self.element.offsetWidth; + var h = self.element.offsetHeight; + self.element.style.display = "none"; + var valign = opts.substr(0, 1); + var halign = "l"; + if (opts.length > 1) { + halign = opts.substr(1, 1); + } + // vertical alignment + switch (valign) { + case "T": p.y -= h; break; + case "B": p.y += el.offsetHeight; break; + case "C": p.y += (el.offsetHeight - h) / 2; break; + case "t": p.y += el.offsetHeight - h; break; + case "b": break; // already there + } + // horizontal alignment + switch (halign) { + case "L": p.x -= w; break; + case "R": p.x += el.offsetWidth; break; + case "C": p.x += (el.offsetWidth - w) / 2; break; + case "l": p.x += el.offsetWidth - w; break; + case "r": break; // already there + } + p.width = w; + p.height = h + 40; + self.monthsCombo.style.display = "none"; + fixPosition(p); + self.showAt(p.x, p.y); + }; + if (Calendar.is_khtml) + setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); + else + Calendar.continuation_for_the_fucking_khtml_browser(); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +Calendar.prototype.parseDate = function(str, fmt) { + if (!fmt) + fmt = this.dateFormat; + this.setDate(Date.parseDate(str, fmt)); +}; + +Calendar.prototype.hideShowCovered = function () { + if (!Calendar.is_ie && !Calendar.is_opera) + return; + function getVisib(obj){ + var value = obj.style.visibility; + if (!value) { + if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C + if (!Calendar.is_khtml) + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue("visibility"); + else + value = ''; + } else if (obj.currentStyle) { // IE + value = obj.currentStyle.visibility; + } else + value = ''; + } + return value; + }; + + var tags = new Array("applet", "iframe", "select"); + var el = this.element; + + var p = Calendar.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + for (var k = tags.length; k > 0; ) { + var ar = document.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + + p = Calendar.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = cc.__msh_save_visibility; + } else { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getVisib(cc); + } + cc.style.visibility = "hidden"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +Calendar.prototype._displayWeekdays = function () { + var fdow = this.firstDayOfWeek; + var cell = this.firstdayname; + var weekend = Calendar._TT["WEEKEND"]; + for (var i = 0; i < 7; ++i) { + cell.className = "day name"; + var realday = (i + fdow) % 7; + if (i) { + cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); + cell.navtype = 100; + cell.calendar = this; + cell.fdow = realday; + Calendar._add_evs(cell); + } + if (weekend.indexOf(realday.toString()) != -1) { + Calendar.addClass(cell, "weekend"); + } + cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; + cell = cell.nextSibling; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +Calendar.prototype._dragStart = function (ev) { + if (this.dragging) { + return; + } + this.dragging = true; + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } + //Opera bug fixed + else if(Calendar.is_opera) { + posY = ev.clientY + body.scrollTop; + posX = ev.clientX + body.scrollLeft; + } + else + { + posY = ev.clientY + window.scrollY; + posX = ev.clientX + window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + + with (Calendar) { + addEvent(document, "mousemove", calDragIt); + addEvent(document, "mouseup", calDragEnd); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +Date.MINUTE = 60 * Date.SECOND; +Date.HOUR = 60 * Date.MINUTE; +Date.DAY = 24 * Date.HOUR; +Date.WEEK = 7 * Date.DAY; + +Date.parseDate = function(str, fmt) { + + var today = new Date(); + var wk = 0; + var W = 0; + var D = 0; + var f = 0; + var y = 0; + var m = -1; + var d = 0; + var a = str.split(/\W+/); + var b = fmt.match(/%[a-zA-Z]{3}|%[a-zA-Z]{2}|%[a-zA-Z]{1}/g); + var i = 0, j = 0; + var hr = 0; + var min = 0; + var sec = 0; + var milisec = 0; + + for (i = 0; i < a.length; ++i) { + if (!a[i]) continue; + + switch (b[i]) { + + case "%d": + case "%dd": + case "%ddd": + d = parseInt(a[i], 10); + break; + + case "%M": + case "%m": + m = parseInt(a[i], 10) - 1; + break; + + case "%Y": + case "%y": + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + break; + + case "%n": + case "%N": + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } + } + break; + + case "%F": + case "%FF": + case "%FFF": + f = parseInt(a[i], 10); + break; + + case "%H": + case "%HH": + case "%HHH": + case "%h": + case "%hh": + case "%hhh": + case "%K": + case "%KK": + case "%KKK": + case "%k": + case "%kk": + case "%kkk": + hr = parseInt(a[i], 10); + break; + + case "%a": + if (/pm/i.test(a[i]) && hr < 12) + hr += 12; + else if (/am/i.test(a[i]) && hr >= 12) + hr -= 12; + break; + + case "%o": + case "%oo": + case "%ooo": + min = parseInt(a[i], 10); + break; + + case "%S": + case "%SS": + case "%SSS": + milisec = parseInt(a[i], 10); + break; + + case "%s": + case "%ss": + case "%sss": + sec = parseInt(a[i], 10); + break; + + case "%D": + case "%DD": + case "%DDD": + D = parseInt(a[i], 10); + break; + + case "%w": + case "%ww": + case "%www": + wk = parseInt(a[i], 10); + break; + + case "%W": + case "%WW": + case "%WWW": + W = parseInt(a[i], 10); + break; + + } + } + + if (isNaN(y)) y = today.getFullYear(); + if (isNaN(m)) m = today.getMonth(); + if (isNaN(d)) d = today.getDate(); + if (isNaN(hr)) hr = today.getHours(); + if (isNaN(min)) min = today.getMinutes(); + if (isNaN(sec)) sec = today.getSeconds(); + if (isNaN(milisec)) milisec = today.getMilliseconds(); + if (isNaN(f)) f = today.getDayWeekInMonth(); + + if (y != 0 && m != -1 && d != 0) + return new Date(y, m, d, hr, min, sec, milisec); + + y = 0; m = -1; d = 0; + + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) != -1) { + var t = -1; + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } + } + if (t != -1) { + if (m != -1) { + d = m+1; + } + m = t; + } + } else if (parseInt(a[i], 10) <= 12 && m == -1 && b[i] == "%m") { + m = a[i]-1; + } else if (parseInt(a[i], 10) > 31 && y == 0 && (b[i] == "%y" || b[i] == "%Y")) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } else if (d == 0 && (b[i] == "%d" || b[i] == "%dd" || b[i] == "%ddd")) { + d = a[i]; + } + } + if (y == 0) y = today.getFullYear(); + if (m == -1) m = today.getMonth(); + if (d == 0) d = today.getDate(); + + //day in year + if(D > 0) return today.getDateFromDayNr(D); + + //week in year + if(wk > 0) return today.getDateFromWeekInYear(wk); + + //week in month + if(W > 0) return today.getDateFromWeekInMonth(W); + + //day of week in month + if(f > 0) return today.getDateFromWeekInMonth(f); + + + if (m != -1 && d != 0) + return new Date(y, m, d, hr, min, sec, milisec); + return today; +}; + +//get a date knowing the current year and the number of week in year +Date.prototype.getDateFromWeekInYear = function(wknr) { + alert((wknr - 1) * 7 + this.getFirstWeekDay(Calendar._DN[this.getDay()])); + return this.getDateFromDayNr((wknr - 1) * 7 + this.getFirstWeekDay(Calendar._DN[this.getDay()])); +} + + +//get date from week in month, and current date +Date.prototype.getDateFromWeekInMonth = function(wkm) { + var today = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0); + var fwkm = today.getWeekInMonth(); + var nr = 0; + + while(fwkm < wkm) { + nr++; + fwkm++; + } + + return new Date(this.getFullYear(), this.getMonth(), 1 + nr * 7, 0, 0, 0); + +} + +//the number of days since 01.01.currentYear untile first "day" (e.g Monday or Thuesday...) +Date.prototype.getFirstWeekDay = function(day) { + var fd = new Date(this.getFullYear(), 0, 1, 0, 0, 0); + var d = fd.getDay(); + var nr = 0; + + while(Calendar._DN[d] != day) { + nr++; + d = (d + 1) % 7; + } + + return nr; +} + + + +/** Returns the date given the current year and the number of day in year */ +Date.prototype.getDateFromDayNr = function(nr) { + var thedate = new Date(this.getFullYear(), 0, nr+1, 0, 0, 0); + return thedate; +} + + + +/** Returns the number of days in the current month */ +Date.prototype.getMonthDays = function(month) { + var year = this.getFullYear(); + if (typeof month == "undefined") { + month = this.getMonth(); + } + if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { + return 29; + } else { + return Date._MD[month]; + } +}; + +/** Returns the number of day in the year. */ +Date.prototype.getDayOfYear = function() { + var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); + var time = now - then; + return Math.ceil(time / Date.DAY); +}; + +/** Returns the number of the week in year, as defined in ISO 8601. */ +Date.prototype.getWeekNumber = function() { + var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var DoW = d.getDay(); + d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu + var ms = d.valueOf(); // GMT + d.setMonth(0); + d.setDate(4); // Thu in Week 1 + return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; +}; + +/** Returns the number of week in month */ +Date.prototype.getWeekInMonth = function() { + var currdate = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var currday = currdate.getDate(); + var firstday = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0, 0); + var week = 0; + var d = firstday.getDay(); + + for(var i = 1; i < currday; i++) { + if(d == 6) week++; + d = (d + 1) % 7; + } + return week + 1; +} + + +/** Returns the day of week in month, eg. first monday.. */ +Date.prototype.getDayWeekInMonth = function() { + + var currdow = this.getDay(); // Thursday + var currdate = this.getDate(); // 14 + var nr = 0; + + var firstday = new Date(this.getFullYear(), this.getMonth(), 1, 0, 0, 0, 0); // first day of the month + var fdn = Calendar._DN[firstday.getDay()]; // the name of the first day in the month + + var d = firstday.getDay(); + for(var i = 1; i <= currdate; i++) { + if(fdn == Calendar._DN[currdow]) nr++; + d = (d + 1) % 7; + fdn = Calendar._DN[d]; + } + return nr; +} + + +/** Checks date and time equality */ +Date.prototype.equalsTo = function(date) { + return ((this.getFullYear() == date.getFullYear()) && + (this.getMonth() == date.getMonth()) && + (this.getDate() == date.getDate()) && + (this.getHours() == date.getHours()) && + (this.getMinutes() == date.getMinutes())); +}; + +/** Set only the year, month, date parts (keep existing time) */ +Date.prototype.setDateOnly = function(date) { + var tmp = new Date(date); + this.setDate(1); + this.setFullYear(tmp.getFullYear()); + this.setMonth(tmp.getMonth()); + this.setDate(tmp.getDate()); +}; + +/** Prints the date in a string according to the given format. */ +Date.prototype.print = function (str) { + var m = this.getMonth(); + var d = this.getDate(); + var y = this.getFullYear(); + var wn = this.getWeekNumber(); + var wnm = this.getWeekInMonth(); + var dwm = this.getDayWeekInMonth(); // day week in month + var w = this.getDay(); + var hr = this.getHours(); + var gr = (hr == 0) ? 24 : hr; + var pm = (hr >= 12); + var ir = (pm) ? (hr - 12) : hr; // 1-12 + if (ir == 0) ir = 12; + var jr = (pm) ? (hr - 13) : hr; // 0 -11 + if(jr == -1) jr = 11; + var dy = this.getDayOfYear(); + var min = this.getMinutes(); + var sec = this.getSeconds(); + var milisec = this.getMilliseconds(); + var z = this.getTimezoneOffset(); + + var s = {}; + + s["%e"] = Calendar._SDN[w]; // abbreviated weekday name + s["%E"] = Calendar._DN[w]; // full weekday name + + s["%n"] = Calendar._SMN[m]; // abbreviated month name + s["%N"] = Calendar._MN[m]; // full month name + + s["%d"] = d; // day, 1 - 31 + s["%dd"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) + s["%ddd"] = (d < 100) ? ((d < 10) ? ("00" + d) : ("0" + d)) : d; // day of the month, 001 - 031 + + s["%D"] = dy; //day in year, 1 - 365 + s["%DD"] = (dy < 10) ? ("0" + dy) : dy; // day in year, 01 - 365 + s["%DDD"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) + + s["%F"] = dwm; // day of week in month ; 1 - 5 + s["%FF"] = (dwm < 10) ? ("0" + dwm) : dwm; + s["%FFF"] = (dwm < 100) ? ((dwm < 10) ? ("00" + dwm) : ("0" + dwm)) : dwm; + + s["%w"] = wn; // week number in year + s["%ww"] = (wn < 10) ? ("0" + wn) : wn; + s["%www"] = (wn < 100) ? ((wn < 10) ? ("00" + wn) : ("0" + wn)) : wn; + + s["%W"] = wnm; // week number in month + s["%WW"] = (wnm < 10) ? ("0" + wnm) : wnm; + s["%WWW"] = (wnm < 100) ? ((wnm < 10) ? ("00" + wnm) : ("0" + wnm)) : wnm; + + s["%a"] = pm ? "PM" : "AM"; + + s["%H"] = hr; // hour, range 0 - 23 (24h format) + s["%HH"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 - 23 + s["%HHH"] = (hr < 100) ? ((hr < 10) ? ("00" + hr) : ("0" + hr)) : hr; + + s["%k"] = gr; // hour, range 1 - 24 (24h format) + s["%kk"] = gr < 10 ? ("0" + gr) : gr; //hour, range 01 -24 + s["%kkk"] = "0" + s["%kk"]; + + s["%K"] = jr; // hour, range 0 to 11 (12h format) + s["%KK"] = jr < 10 ? ("0"+ jr) : (jr); // hour, range 00 - 11 + s["%KKK"] = "0" + s["%KK"]; + + s["%h"] = ir; + s["%hh"] = ir < 10 ? ("0"+ir) : ir; //hour, range 01 -12 + s["%hhh"] = "0" + s["%hh"]; + + s["%m"] = m + 1; // month, range 1 -12 + s["%M"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 + + s["%o"] = min; // minute, range 0 - 59 + s["%oo"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 + s["%ooo"] = "0" + s["%oo"]; + + s["%s"] = sec; //seconds, range 0 - 59 + s["%ss"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 + s["%sss"] = (sec < 100) ? ((sec < 10) ? ("00" + sec) : ("0" + sec)) : sec; + + s["%S"] = milisec; //milliseconds, range 0 -999 + s["%SS"] = (milisec < 10) ? ("0" + milisec) : milisec; + s["%SSS"] = (milisec < 100) ? ((milisec < 10) ? ("00" + milisec) : ("0" + milisec)) : milisec; // milliseconds, range 000 -999 + + s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) + s["%Y"] = y; // year with the century + + var htz = z / 60; + var mtz = z % 60; + if(htz < 0) htz = htz < 10 ? ("-0" + (-htz)) : htz; + else htz = htz < 10 ? ("0" + htz) : htz; + if(mtz < 0) mtz = mtz < 10 ? ("-0" + (-mtz)) : mtz; + else mtz = mtz < 10 ? ("0" + mtz) : mtz; + + s["%z"] ="GMT" + htz + ":" + mtz; + s["%Z"] = htz + mtz; + + s["%G"] = y <= 0 ? "BC" : "AD"; + + var re = /%[a-zA-Z]{3}|%[a-zA-Z]{2}|%[a-zA-Z]{1}/g; + + var a = str.match(re); + for (var i = 0; i < a.length; i++) { + var tmp = s[a[i]]; + if (tmp != null) { + re = new RegExp(a[i], 'g'); + str = str.replace(re, tmp); + } + } + return str; +}; + +Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; +Date.prototype.setFullYear = function(y) { + var d = new Date(this); + d.__msh_oldSetFullYear(y); + if (d.getMonth() != this.getMonth()) + this.setDate(28); + this.__msh_oldSetFullYear(y); +}; + +// END: DATE OBJECT PATCHES + + +// global object that remembers the calendar +window._dynarch_popupCalendar = null; Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/img.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\img.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/lang.js (revision 0) @@ -0,0 +1,52 @@ +// full day names +Calendar._DN = new Array($msg.get("core.datepicker.dn")); + +// short day names +Calendar._SDN = new Array($msg.get("core.datepicker.sdn")); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = $msg.get("core.datepicker.fd"); + +// full month names +Calendar._MN = new Array($msg.get("core.datepicker.mn")); + +// short month names +Calendar._SMN = new Array($msg.get("core.datepicker.smn")); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "$msg.get("core.datepicker.info")"; +Calendar._TT["ABOUT"] = "$msg.get("core.datepicker.about")"; +Calendar._TT["ABOUT_TIME"] = "$msg.get("core.datepicker.about_time")"; + +Calendar._TT["PREV_YEAR"] = "$msg.get("core.datepicker.prev_year")"; +Calendar._TT["PREV_MONTH"] = "$msg.get("core.datepicker.prev_month")"; +Calendar._TT["GO_TODAY"] = "$msg.get("core.datepicker.go_today")"; +Calendar._TT["NEXT_MONTH"] = "$msg.get("core.datepicker.next_month")"; +Calendar._TT["NEXT_YEAR"] = "$msg.get("core.datepicker.next_year")"; +Calendar._TT["SEL_DATE"] = "$msg.get("core.datepicker.sel_date")"; +Calendar._TT["DRAG_TO_MOVE"] = "$msg.get("core.datepicker.drag")"; +Calendar._TT["PART_TODAY"] = "$msg.get("core.datepicker.part_today")"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "$msg.get("core.datepicker.day_first")"; + +// It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "$msg.get("core.datepicker.weekend")"; + +Calendar._TT["CLOSE"] = "$msg.get("core.datepicker.close")"; +Calendar._TT["TODAY"] = "$msg.get("core.datepicker.today")"; +Calendar._TT["TIME_PART"] = "$msg.get("core.datepicker.time_part")"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "$msg.get("core.datepicker.def_date_format")"; +Calendar._TT["TT_DATE_FORMAT"] = "$msg.get("core.datepicker.tt_date_format")"; + +Calendar._TT["WK"] = "$msg.get("core.datepicker.wk")"; +Calendar._TT["TIME"] = "$msg.get("core.datepicker.time")"; + + Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/back.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\back.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/menuarrow.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\menuarrow.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/today.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\today.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/active-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\active-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/day-hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\day-hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/time-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\time-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/hover-buttons-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\hover-buttons-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/time-hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\time-hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css (revision 0) @@ -0,0 +1,254 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar_aero { + position: relative; + background: transparent url("back.png") no-repeat; + width: 270px; + height: 270px; +} + +.calendar_aero, .calendar_aero table { + width: 240px; + height: 240x; + margin: 15px; + font-size: 11px; + color: #000; + cursor: default; + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar_aero { +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar_aero .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + font-weight: bold; + color: #fff; +} + +.calendar_aero .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar_aero .nav div { + background: transparent url("menuarrow.gif") no-repeat 100% 100%; +} + +.calendar_aero thead tr { + color: #fff; +} + +.calendar_aero thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + color: #fff; +} + +.calendar_aero thead .headrow { /* Row containing navigation buttons */ +} + +.calendar_aero thead .name { /* Cells containing the day names */ + padding: 2px; + text-align: center; + color: #4d9bcc; +} + +.calendar_aero thead .weekend { /* How a weekend day name shows in header */ + color: #f3df4e; +} + +.calendar_aero thead .hilite { /* How do the buttons in header appear when hover */ + background: url("hover-buttons-bg.png"); + border: 1px solid #5a83a1; + padding: 1px 1px 0px 1px; + color: #000; +} + +.calendar_aero thead .active { /* Active (pressed) buttons in header */ + background: url("active-bg.png"); + border: 1px solid #5f8ab3; + color: #fff; + padding: 1px 1px 1px 1px; +} + +.calendar_aero thead .daynames { /* Row containing the day names */ + font-weight: bold; +} + +/* The body part -- contains all the days in month. */ + +.calendar_aero tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #fff; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar_aero tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar_aero tbody .day.othermonth.oweekend { + color: #fcffaf; +} + +.calendar_aero table .wn { + color: #4d9bcc; +} + +.calendar_aero tbody .rowhilite td, +.calendar_aero tbody .rowhilite td.wn { + +} + +.calendar_aero tbody td.today { + font-weight: bold; +} + +.calendar_aero tbody td.hilite { /* Hovered cells */ + background: url("day-hover-bg.png") !important; + padding: 1px 3px 1px 1px; + border: 1px solid #ceb70d; + color: #000 !important; + font-weight: bold; +} + +.calendar_aero tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar_aero tbody td.weekend { /* Cells showing weekend days */ + color: #f3df4e; +} + +.calendar_aero tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #d27d00; + padding: 1px 3px 1px 1px; + background: url("today.png"); + color: #fff; +} + +.calendar_aero tbody .disabled { + color: #999; +} + +.calendar_aero tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar_aero tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar_aero tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + color: #fff; +} + +.calendar_aero tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + color: #fff; +} + +.calendar_aero tfoot .hilite { /* Hover style for buttons in footer */ + color: #000; + padding: 1px; +} + +.calendar_aero tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar_aero .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 40px; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #424040; + background: #323232; + color: #fff; + z-index: 100; + font-size: 90%; +} + +.calendar_aero .combo .label, +.calendar_aero .combo .label-IEfix { + text-align: center; + +} + +.calendar_aero .combo .label-IEfix { + width: 40px; +} + +.calendar_aero .combo .hilite { + background: url("hover-bg.png"); + color: #4495c2; +} + +.calendar_aero .combo .active { + background: url("active-bg.png"); + color: #000; + border: 1px solid #02608f; + font-weight: bold; +} + +.calendar_aero td.time { + padding: 1px 0px; + padding-left: 5px; + text-align: center; + color: #fff; + font-weight: bold; +} + +.calendar_aero td.time .hour, +.calendar_aero td.time .minute, +.calendar_aero td.time .second, +.calendar_aero td.time .ampm { + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("time-bg.png"); + border: 1px solid #02608f; + color: #000; +} + +.calendar_aero td.time .hour, +.calendar_aero td.time .minute, +.calendar_aero td.time .second, +.calendar_aero td.time .ampm +{ + font-family: monospace; +} + +.calendar_aero td.time .ampm { + text-align: center; +} + +.calendar_aero td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar_aero td.time span.hilite { + background: url("time-hover-bg.png"); + border: 1px solid #5f8ab3; + color: #000; +} + +.calendar_aero td.time span.active { + background: url("time-bg.png"); + color: #fff; +} Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/active-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\active-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/back.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\back.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/day-hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\day-hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/hover-buttons-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\hover-buttons-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/menuarrow.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\menuarrow.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/theme.css (revision 0) @@ -0,0 +1,254 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar_aero { + position: relative; + background: transparent url("back.png") no-repeat; + width: 270px; + height: 270px; +} + +.calendar_aero, .calendar_aero table { + width: 240px; + height: 240x; + margin: 15px; + font-size: 11px; + color: #000; + cursor: default; + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar_aero { +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar_aero .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + font-weight: bold; + color: #fff; +} + +.calendar_aero .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar_aero .nav div { + background: transparent url("menuarrow.gif") no-repeat 100% 100%; +} + +.calendar_aero thead tr { + color: #fff; +} + +.calendar_aero thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + color: #fff; +} + +.calendar_aero thead .headrow { /* Row containing navigation buttons */ +} + +.calendar_aero thead .name { /* Cells containing the day names */ + padding: 2px; + text-align: center; + color: #4d9bcc; +} + +.calendar_aero thead .weekend { /* How a weekend day name shows in header */ + color: #f3df4e; +} + +.calendar_aero thead .hilite { /* How do the buttons in header appear when hover */ + background: url("hover-buttons-bg.png"); + border: 1px solid #5a83a1; + padding: 1px 1px 0px 1px; + color: #000; +} + +.calendar_aero thead .active { /* Active (pressed) buttons in header */ + background: url("active-bg.png"); + border: 1px solid #5f8ab3; + color: #fff; + padding: 1px 1px 1px 1px; +} + +.calendar_aero thead .daynames { /* Row containing the day names */ + font-weight: bold; +} + +/* The body part -- contains all the days in month. */ + +.calendar_aero tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #fff; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar_aero tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar_aero tbody .day.othermonth.oweekend { + color: #fcffaf; +} + +.calendar_aero table .wn { + color: #4d9bcc; +} + +.calendar_aero tbody .rowhilite td, +.calendar_aero tbody .rowhilite td.wn { + +} + +.calendar_aero tbody td.today { + font-weight: bold; +} + +.calendar_aero tbody td.hilite { /* Hovered cells */ + background: url("day-hover-bg.png") !important; + padding: 1px 3px 1px 1px; + border: 1px solid #ceb70d; + color: #000 !important; + font-weight: bold; +} + +.calendar_aero tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar_aero tbody td.weekend { /* Cells showing weekend days */ + color: #f3df4e; +} + +.calendar_aero tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #d27d00; + padding: 1px 3px 1px 1px; + background: url("today.png"); + color: #fff; +} + +.calendar_aero tbody .disabled { + color: #999; +} + +.calendar_aero tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar_aero tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar_aero tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + color: #fff; +} + +.calendar_aero tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + color: #fff; +} + +.calendar_aero tfoot .hilite { /* Hover style for buttons in footer */ + color: #000; + padding: 1px; +} + +.calendar_aero tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar_aero .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 40px; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #424040; + background: #323232; + color: #fff; + z-index: 100; + font-size: 90%; +} + +.calendar_aero .combo .label, +.calendar_aero .combo .label-IEfix { + text-align: center; + +} + +.calendar_aero .combo .label-IEfix { + width: 40px; +} + +.calendar_aero .combo .hilite { + background: url("hover-bg.png"); + color: #4495c2; +} + +.calendar_aero .combo .active { + background: url("active-bg.png"); + color: #000; + border: 1px solid #02608f; + font-weight: bold; +} + +.calendar_aero td.time { + padding: 1px 0px; + padding-left: 5px; + text-align: center; + color: #fff; + font-weight: bold; +} + +.calendar_aero td.time .hour, +.calendar_aero td.time .minute, +.calendar_aero td.time .second, +.calendar_aero td.time .ampm { + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("time-bg.png"); + border: 1px solid #02608f; + color: #000; +} + +.calendar_aero td.time .hour, +.calendar_aero td.time .minute, +.calendar_aero td.time .second, +.calendar_aero td.time .ampm +{ + font-family: monospace; +} + +.calendar_aero td.time .ampm { + text-align: center; +} + +.calendar_aero td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar_aero td.time span.hilite { + background: url("time-hover-bg.png"); + border: 1px solid #5f8ab3; + color: #000; +} + +.calendar_aero td.time span.active { + background: url("time-bg.png"); + color: #fff; +} Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/time-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\time-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/time-hover-bg.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\time-hover-bg.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aero/today.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aero\today.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/normal-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\normal-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/menuarrow.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\menuarrow.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/active-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\active-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/rowhover-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\rowhover-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/Thumbs.db =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\Thumbs.db ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css (revision 0) @@ -0,0 +1,239 @@ +/* Distributed as part of The Coolest DHTML Calendar + Author: Mihai Bazon, www.bazon.net/mishoo + Copyright Dynarch.com 2005, www.dynarch.com +*/ + +/* The main calendar widget. DIV containing a table. */ + +div.calendar_aqua { position: relative; } + +.calendar_aqua, .calendar_aqua table { + border: 1px solid #bdb2bf; + font-size: 11px; + color: #000; + cursor: default; + background: url("normal-bg.gif"); + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar_aqua { + border-color: #797979; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar_aqua .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + background: url("title-bg.gif") repeat-x 0 100%; color: #000; + font-weight: bold; +} + +.calendar_aqua .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar_aqua .nav div { + background: transparent url("menuarrow.gif") no-repeat 100% 100%; +} + +.calendar_aqua thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; } + +.calendar_aqua thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + background: url("title-bg.gif") repeat-x 0 100%; color: #000; +} + +.calendar_aqua thead .headrow { /* Row containing navigation buttons */ +} + +.calendar_aqua thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #797979; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar_aqua thead .weekend { /* How a weekend day name shows in header */ + color: #c44; +} + +.calendar_aqua thead .hilite { /* How do the buttons in header appear when hover */ + background: url("hover-bg.gif"); + border-bottom: 1px solid #797979; + padding: 2px 2px 1px 2px; +} + +.calendar_aqua thead .active { /* Active (pressed) buttons in header */ + background: url("active-bg.gif"); color: #fff; + padding: 3px 1px 0px 3px; + border-bottom: 1px solid #797979; +} + +.calendar_aqua thead .daynames { /* Row containing the day names */ + background: url("dark-bg.gif"); +} + +/* The body part -- contains all the days in month. */ + +.calendar_aqua tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #000; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar_aqua tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar_aqua tbody .day.othermonth.oweekend { + color: #f99; +} + +.calendar_aqua table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #797979; + background: url("dark-bg.gif"); +} + +.calendar_aqua tbody .rowhilite td, +.calendar_aqua tbody .rowhilite td.wn { + background: url("rowhover-bg.gif"); +} + +.calendar_aqua tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ } + +.calendar_aqua tbody td.hilite { /* Hovered cells */ + background: url("hover-bg.gif"); + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar_aqua tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar_aqua tbody td.weekend { /* Cells showing weekend days */ + color: #c44; +} + +.calendar_aqua tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #797979; + padding: 1px 3px 1px 1px; + background: url("active-bg.gif"); color: #fff; +} + +.calendar_aqua tbody .disabled { color: #999; } + +.calendar_aqua tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar_aqua tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar_aqua tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar_aqua tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: url("status-bg.gif") repeat-x 0 0; color: #000; +} + +.calendar_aqua tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar_aqua tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar_aqua .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #797979; + background: url("normal-bg.gif"); color: #000; + z-index: 100; + font-size: 90%; +} + +.calendar_aqua .combo .label, +.calendar_aqua .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar_aqua .combo .label-IEfix { + width: 4em; +} + +.calendar_aqua .combo .hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar_aqua .combo .active { + background: url("active-bg.gif"); color: #fff; + font-weight: bold; +} + +.calendar_aqua td.time { + border-top: 1px solid #797979; + padding: 1px 0px; + text-align: center; + background: url("dark-bg.gif"); +} + +.calendar_aqua td.time .hour, +.calendar_aqua td.time .minute, +.calendar_aqua td.time .second, +.calendar_aqua td.time .ampm { + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("normal-bg.gif"); color: #000; +} + +.calendar_aqua td.time .hour, +.calendar_aqua td.time .minute, +.calendar_aqua td.time .second + { + font-family: monospace; +} + +.calendar_aqua td.time .ampm { + text-align: center; +} + +.calendar_aqua td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar_aqua td.time span.hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar_aqua td.time span.active { + background: url("active-bg.gif"); color: #fff; +} Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/today-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\today-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/dark-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\dark-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/title-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\title-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/hover-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\hover-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/status-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\status-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/active-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\active-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/dark-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\dark-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/hover-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\hover-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/menuarrow.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\menuarrow.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/normal-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\normal-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/rowhover-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\rowhover-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/status-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\status-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css (revision 0) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/theme.css (revision 0) @@ -0,0 +1,239 @@ +/* Distributed as part of The Coolest DHTML Calendar + Author: Mihai Bazon, www.bazon.net/mishoo + Copyright Dynarch.com 2005, www.dynarch.com +*/ + +/* The main calendar widget. DIV containing a table. */ + +div.calendar_aqua { position: relative; } + +.calendar_aqua, .calendar_aqua table { + border: 1px solid #bdb2bf; + font-size: 11px; + color: #000; + cursor: default; + background: url("normal-bg.gif"); + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar_aqua { + border-color: #797979; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar_aqua .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + background: url("title-bg.gif") repeat-x 0 100%; color: #000; + font-weight: bold; +} + +.calendar_aqua .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar_aqua .nav div { + background: transparent url("menuarrow.gif") no-repeat 100% 100%; +} + +.calendar_aqua thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; } + +.calendar_aqua thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + background: url("title-bg.gif") repeat-x 0 100%; color: #000; +} + +.calendar_aqua thead .headrow { /* Row containing navigation buttons */ +} + +.calendar_aqua thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #797979; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar_aqua thead .weekend { /* How a weekend day name shows in header */ + color: #c44; +} + +.calendar_aqua thead .hilite { /* How do the buttons in header appear when hover */ + background: url("hover-bg.gif"); + border-bottom: 1px solid #797979; + padding: 2px 2px 1px 2px; +} + +.calendar_aqua thead .active { /* Active (pressed) buttons in header */ + background: url("active-bg.gif"); color: #fff; + padding: 3px 1px 0px 3px; + border-bottom: 1px solid #797979; +} + +.calendar_aqua thead .daynames { /* Row containing the day names */ + background: url("dark-bg.gif"); +} + +/* The body part -- contains all the days in month. */ + +.calendar_aqua tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #000; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar_aqua tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar_aqua tbody .day.othermonth.oweekend { + color: #f99; +} + +.calendar_aqua table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #797979; + background: url("dark-bg.gif"); +} + +.calendar_aqua tbody .rowhilite td, +.calendar_aqua tbody .rowhilite td.wn { + background: url("rowhover-bg.gif"); +} + +.calendar_aqua tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ } + +.calendar_aqua tbody td.hilite { /* Hovered cells */ + background: url("hover-bg.gif"); + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar_aqua tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar_aqua tbody td.weekend { /* Cells showing weekend days */ + color: #c44; +} + +.calendar_aqua tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #797979; + padding: 1px 3px 1px 1px; + background: url("active-bg.gif"); color: #fff; +} + +.calendar_aqua tbody .disabled { color: #999; } + +.calendar_aqua tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar_aqua tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar_aqua tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar_aqua tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: url("status-bg.gif") repeat-x 0 0; color: #000; +} + +.calendar_aqua tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar_aqua tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar_aqua .combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #797979; + background: url("normal-bg.gif"); color: #000; + z-index: 100; + font-size: 90%; +} + +.calendar_aqua .combo .label, +.calendar_aqua .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar_aqua .combo .label-IEfix { + width: 4em; +} + +.calendar_aqua .combo .hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar_aqua .combo .active { + background: url("active-bg.gif"); color: #fff; + font-weight: bold; +} + +.calendar_aqua td.time { + border-top: 1px solid #797979; + padding: 1px 0px; + text-align: center; + background: url("dark-bg.gif"); +} + +.calendar_aqua td.time .hour, +.calendar_aqua td.time .minute, +.calendar_aqua td.time .second, +.calendar_aqua td.time .ampm { + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("normal-bg.gif"); color: #000; +} + +.calendar_aqua td.time .hour, +.calendar_aqua td.time .minute, +.calendar_aqua td.time .second + { + font-family: monospace; +} + +.calendar_aqua td.time .ampm { + text-align: center; +} + +.calendar_aqua td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar_aqua td.time span.hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar_aqua td.time span.active { + background: url("active-bg.gif"); color: #fff; +} Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/Thumbs.db =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\Thumbs.db ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/title-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\title-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/calendar/skins/aqua/today-bg.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: xwiki-platform-web\standard\src\main\webapp\skins\albatross\calendar\skins\aqua\today-bg.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Index: xwiki-platform-web/standard/src/main/webapp/skins/albatross/javascript.vm =================================================================== --- xwiki-platform-web/standard/src/main/webapp/skins/albatross/javascript.vm (revision 3797) +++ xwiki-platform-web/standard/src/main/webapp/skins/albatross/javascript.vm (working copy) @@ -6,6 +6,9 @@ + + + #if(($context.action=="inline")||($context.action=="edit") || ($context.action=="admin"))