%k25u25%fgd5n!?%k25u25%fgd5n!%k25u25%fgd5n!?%k25u25%fgd5n!PKd\ainc/date_gestion.phpnuW+APKd\5-C9 9 inc/importer_csv.phpnuW+A$heading) { $row[$heading]=(isset($data[$key])) ? $data[$key] : ''; } $return[]=$row; } else { $return[]=$data; } } fclose($handle); } return $return; } PKd\V-inc/config.phpnuW+APKd\H] inc/exporter_csv.phpnuW+APKd\+;ppinc/core21_filtres.phpnuW+A non clicable lorsque l'item est selectionne * * @param string $url * @param string $libelle * @param bool $on * @param string $class * @param string $title * @return string */ function lien_ou_expose($url,$libelle,$on=false,$class="",$title="",$rel=""){ return ($on ?"": "" ) . $libelle . ($on ? "":""); } } if (!function_exists('filtre_balise_img_dist')){ /** * une fonction pour generer une balise img a partir d'un nom de fichier * * @param string $img * @param string $alt * @param string $class * @return string */ function filtre_balise_img_dist($img,$alt="",$class=""){ $taille = taille_image($img); list($hauteur,$largeur) = $taille; if (!$hauteur OR !$largeur) return ""; return "".attribut_html($alt)."'; } } if (!function_exists('singulier_ou_pluriel')){ /** * Afficher un message "un truc"/"N trucs" * * @param int $nb * @return string */ function singulier_ou_pluriel($nb,$chaine_un,$chaine_plusieurs,$var='nb'){ if (!$nb=intval($nb)) return ""; if ($nb>1) return _T($chaine_plusieurs, array($var => $nb)); else return _T($chaine_un); } } if (!function_exists('filtre_icone_dist')){ /** * un filtre icone mappe sur icone_inline, qui cree une icone a gauche par defaut * le code de icone_inline est grandement reproduit ici car les liens ajax portent simplement une class ajax * lorsque les interfaces sont en squelette, alors que l'implementation d'ajax de des scripts php * est plus complexe * * @param string $lien * @param string $texte * @param string $fond * @param string $align * @param string $fonction * @return string */ function filtre_icone_dist($lien, $texte, $fond, $align="", $fonction="", $class="",$javascript=""){ $align = $align?$align:$GLOBALS['spip_lang_left']; global $spip_display; if ($fonction == "supprimer.gif") { $style = 'icone36 danger'; } else { $style = 'icone36'; if (strlen($fonction) < 3) $fonction = "rien.gif"; } $style .= " " . substr(basename($fond),0,-4); if ($spip_display == 1){ $hauteur = 20; $largeur = 100; $title = $alt = ""; } else if ($spip_display == 3){ $hauteur = 30; $largeur = 30; $title = "\ntitle=\"$texte\""; $alt = $texte; } else { $hauteur = 70; $largeur = 100; $title = ''; $alt = $texte; } $size = 24; if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i",$fond,$match)) $size = $match[1]; if ($spip_display != 1 AND $spip_display != 4){ if ($fonction != "rien.gif"){ $icone = http_img_pack($fonction, $alt, "$title width='$size' height='$size'\n" . http_style_background($fond, "no-repeat center center")); } else { $icone = http_img_pack($fond, $alt, "$title width='$size' height='$size'"); } } else $icone = ''; // cas d'ajax_action_auteur: faut defaire le boulot // (il faudrait fusionner avec le cas $javascript) if (preg_match(",^]*)>(.*)$,i",$lien,$r)) list($x,$lien,$atts,$texte)= $r; else $atts = ''; if ($align && $align!='center') $align = "float: $align; "; $icone = "" . $icone . (($spip_display == 3) ? '' : "$texte") . "\n"; if ($align <> 'center') return $icone; $style = " style='text-align:center;'"; return "$icone"; } } if (!function_exists('filtre_explode_dist')){ /** * filtre explode pour les squelettes permettant d'ecrire * #GET{truc}|explode{-} * * @param strong $a * @param string $b * @return array */ function filtre_explode_dist($a,$b){return explode($b,$a);} } if (!function_exists('filtre_implode_dist')){ /** * filtre implode pour les squelettes permettant d'ecrire * #GET{truc}|implode{-} * * @param array $a * @param string $b * @return string */ function filtre_implode_dist($a,$b){return implode($b,$a);} } if (!function_exists('bando_images_background') AND !defined('_DIR_PLUGIN_BANDO')){ function bando_images_background(){ return ''; } } if (!function_exists('bando_style_prive_theme') AND !defined('_DIR_PLUGIN_BANDO')){ function bando_style_prive_theme() { return ''; } } ?>PKd\!formulaires/recherche_ecrire.htmlnuW+A
[(#ENV{action}|form_hidden)] [] [(#ENV{recherche}|oui)[(#CHEMIN{img_pack/annuler-recherche.png}|tag_img|inserer_attribut{alt,<:spip_bonux:annuler_recherche:>})]]
PKd\ l l %formulaires/selecteur/navigateur.htmlnuW+A [(#SET{titre_branche,[(#TITRE)]})] [(#SET{rubriques_branche,#ARRAY})]#SET{rubriques_branche,#GET{rubriques_branche}|push{#ID_RUBRIQUE}}
[(#ENV{limite_branche}|non)<:info_racine_site:>] [(#ENV{limite_branche}|et{#COMPTEUR_BOUCLE|=={1}}|?{'', > })]#TITRE[(#ENV{limite_branche}|=={#ID_RUBRIQUE}|?{'', > })]#TITRE
#SET{n,0} [(#REM) afficher la racine si la profondeur le permet] [(#ENV{limite_branche}|non)[(#GRAND_TOTAL|<{#TOTAL_BOUCLE}|oui)

[]<:info_racine_site:>

[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=0}{env})]]
] #SET{n,0}
[(#ENV{limite_branche}|non|ou{#ID_RUBRIQUE|in_array{#GET{rubriques_branche,#ARRAY}}}|oui)]

[(#ID_RUBRIQUE|=={#ENV{limite_branche}}|?{#TITRE,#TITRE})]

[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=#ID_RUBRIQUE}{env})] [(#ENV{articles,0}|oui) [(#INCLURE{fond=formulaires/selecteur/inc-nav-articles}{id_rubrique=#ID_RUBRIQUE}{id_article}{env})] ]
[(#GET{titre_branche,<:info_racine_site:>})]

[(#GET{titre_branche,<:info_racine_site:>})]

[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=#ENV{limite_branche,0}}{env})]
PKd\&;  formulaires/selecteur/picker.cssnuW+A.item_picker .chemin {border-bottom:1px solid #eee;margin:0.5em 0 0.25em;} .item_picker .frame {border:1px solid #999;width:180px;height:400px;float:left;overflow:auto;} .item_picker .frame h2 {margin:0;padding:5px;background:#999;} .item_picker .frame ul {list-style:none;margin:0;padding:0;} .item_picker .frame ul li {list-style:none;margin:0;padding:2px;padding-left:26px;} .item_picker .frame ul li.rubrique {background:url(prive/images/rubrique-24.gif) no-repeat top left;} .item_picker .frame ul li.article {background:url(prive/images/article-24.gif) no-repeat top left;} .item_picker .frame ul li:hover {background-color:#999;} .browser .choix_rapide {font-size:0.9em;} .browser #picker_id {padding:0;margin:0 5px;border:1px solid;}PKd\pSS$formulaires/selecteur/rubriques.htmlnuW+A [(#REM) afficher la selection dans un ul class item_picked ---------------------------------------- select=1 => le selecteur se comporte comme un select, avec un seul choix possible ]
#SET{id_rubrique,#ENV{id_rubrique}} #SET{id_rubrique,#ID_RUBRIQUE} [(#REM) le container item_picker est ici pour etre voisin de item_picked ------]
[(#ENV{sortable,'non'}|=={oui}|oui) [(#SPIP_VERSION|>={2.1.0}|oui) ] [(#SPIP_VERSION|>={2.1.0}|non) ] ] PKd\/WY= = &formulaires/selecteur/jquery.picker.jsnuW+A/** item_picked et picker doivent seulement etre voisins
    ..
... ...
..
... **/ jQuery(document).ready(function(){ var picked = jQuery('ul.item_picked'); if (picked.length) { picked.find('>li').removeClass('last').find('li:last').addClass('last'); } }); jQuery.fn.picker_toggle = function(){ var browser = jQuery(this).parents('.item_picker').find('.browser'); if (browser.is(':visible')){ if (jQuery.browser.msie) browser.hide(); else browser.slideUp(); jQuery('a.close',this).hide(); jQuery('a.edit',this).show(); } else { browser.show(); jQuery('a.close',this).show(); jQuery('a.edit',this).hide(); } } // stop animation du bloc cible pour faire patienter jQuery.fn.stopAnimeajax = function(end) { this.children().css('opacity', 1.0); this.find('.image_loading').html(''); return this; // don't break the chain } jQuery.fn.item_pick = function(id_item,name,title,type){ var picker = this.parents('.item_picker'); var picked = picker.siblings('ul.item_picked'); if (!picked.length) { picker.before("
    "); picked = picker.siblings('ul.item_picked'); } var select = picked.is('.select'); if (select) picked.html(''); else jQuery('li.on',picked).removeClass('on'); var sel=jQuery('input[value="'+id_item+'"]',picked); if (sel.length==0){ picked.addClass('changing').animeajax(); // simulons de la latence pour l'oeil de l'utilisateur setTimeout(function(){ jQuery('li:last',picked).removeClass('last'); picked.append('
  • ' +'' + title +(select?"":" " +"" ) +',
  • ').removeClass('changing').stopAnimeajax(); // masquer le selecteur apres un pick picker.find('.picker_bouton').picker_toggle(); },300); } else sel.parent().addClass('on'); return this; // don't break the chain } jQuery.fn.item_unpick = function(){ var picked = this.parents('ul.item_picked'); var me = this.parent(); jQuery(me).fadeOut('fast'); setTimeout(function(){ me.remove(); picked.find('>li').removeClass('last').find('li:last').addClass('last'); },400); }PKd\F^7##&formulaires/selecteur/picker-ajax.htmlnuW+A#SET{bouton_modif,#ENV{select,''}|?{bouton_modifier,bouton_ajouter}|_T} [(#REM) Afficher un bouton ajax Modifier a la premiere fois ---------------------------------------- ][(#ENV{picker,''}|non) ] [(#REM) Afficher un bouton Fermer/Modifier ensuite ---------------------------------------- ][(#ENV{picker,''}|oui) [(#REM) et enfin le navigateur ------]
    #GET{bouton_modif}
    ]PKd\hOO#formulaires/selecteur/articles.htmlnuW+A [(#REM) afficher la selection dans un ul class item_picked ---------------------------------------- select=1 => le selecteur se comporte comme un select, avec un seul choix possible ]
      [(#ENV{rubriques,0}|oui)]
    #SET{id_rubrique,#ENV{id_rubrique}} #SET{id_rubrique,#ID_RUBRIQUE} [(#REM) le container item_picker est ici pour etre voisin de item_picked ------]
    PKd\Hw>L0L0-formulaires/selecteur/jquery-ui-1.6.custom.jsnuW+A/* * jQuery UI 1.6 * * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI */ ;(function($) { var _remove = $.fn.remove, isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9); //Helper functions and ui object $.ui = { version: "1.6", // $.ui.plugin is deprecated. Use the proxy pattern instead. plugin: { add: function(module, option, set) { var proto = $.ui[module].prototype; for(var i in set) { proto.plugins[i] = proto.plugins[i] || []; proto.plugins[i].push([option, set[i]]); } }, call: function(instance, name, args) { var set = instance.plugins[name]; if(!set) { return; } for (var i = 0; i < set.length; i++) { if (instance.options[set[i][0]]) { set[i][1].apply(instance.element, args); } } } }, contains: function(a, b) { var safari2 = $.browser.safari && $.browser.version < 522; if (a.contains && !safari2) { return a.contains(b); } if (a.compareDocumentPosition) return !!(a.compareDocumentPosition(b) & 16); while (b = b.parentNode) if (b == a) return true; return false; }, cssCache: {}, css: function(name) { if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; } var tmp = $('
    ').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body'); //if (!$.browser.safari) //tmp.appendTo('body'); //Opera and Safari set width and height to 0px instead of auto //Safari returns rgba(0,0,0,0) when bgcolor is not set $.ui.cssCache[name] = !!( (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))) ); try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){} return $.ui.cssCache[name]; }, hasScroll: function(el, a) { //If overflow is hidden, the element might have extra content, but the user wants to hide it if ($(el).css('overflow') == 'hidden') { return false; } var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', has = false; if (el[scroll] > 0) { return true; } // TODO: determine which cases actually cause this to happen // if the element doesn't have the scroll set, see if it's possible to // set the scroll el[scroll] = 1; has = (el[scroll] > 0); el[scroll] = 0; return has; }, isOverAxis: function(x, reference, size) { //Determines when x coordinate is over "b" element axis return (x > reference) && (x < (reference + size)); }, isOver: function(y, x, top, left, height, width) { //Determines when x, y coordinates is over "b" element return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); }, keyCode: { BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT: 45, LEFT: 37, NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38 } }; // WAI-ARIA normalization if (isFF2) { var attr = $.attr, removeAttr = $.fn.removeAttr, ariaNS = "http://www.w3.org/2005/07/aaa", ariaState = /^aria-/, ariaRole = /^wairole:/; $.attr = function(elem, name, value) { var set = value !== undefined; return (name == 'role' ? (set ? attr.call(this, elem, name, "wairole:" + value) : (attr.apply(this, arguments) || "").replace(ariaRole, "")) : (ariaState.test(name) ? (set ? elem.setAttributeNS(ariaNS, name.replace(ariaState, "aaa:"), value) : attr.call(this, elem, name.replace(ariaState, "aaa:"))) : attr.apply(this, arguments))); }; $.fn.removeAttr = function(name) { return (ariaState.test(name) ? this.each(function() { this.removeAttributeNS(ariaNS, name.replace(ariaState, "")); }) : removeAttr.call(this, name)); }; } //jQuery plugins $.fn.extend({ remove: function() { // Safari has a native remove event which actually removes DOM elements, // so we have to use triggerHandler instead of trigger (#3037). $("*", this).add(this).each(function() { $(this).triggerHandler("remove"); }); return _remove.apply(this, arguments ); }, enableSelection: function() { return this .attr('unselectable', 'off') .css('MozUserSelect', '') .unbind('selectstart.ui'); }, disableSelection: function() { return this .attr('unselectable', 'on') .css('MozUserSelect', 'none') .bind('selectstart.ui', function() { return false; }); }, scrollParent: function() { var scrollParent; if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { scrollParent = this.parents().filter(function() { return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); }).eq(0); } else { scrollParent = this.parents().filter(function() { return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); }).eq(0); } return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; } }); //Additional selectors $.extend($.expr[':'], { data: function(a, i, m) { return $.data(a, m[3]); }, // TODO: add support for object, area tabbable: function(a, i, m) { var nodeName = a.nodeName.toLowerCase(); function isVisible(element) { return !($(element).is(':hidden') || $(element).parents(':hidden').length); } return ( // in tab order a.tabIndex >= 0 && ( // filter node types that participate in the tab order // anchor tag ('a' == nodeName && a.href) || // enabled form element (/input|select|textarea|button/.test(nodeName) && 'hidden' != a.type && !a.disabled) ) && // visible on page isVisible(a) ); } }); // $.widget is a factory to create jQuery plugins // taking some boilerplate code out of the plugin code function getter(namespace, plugin, method, args) { function getMethods(type) { var methods = $[namespace][plugin][type] || []; return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods); } var methods = getMethods('getter'); if (args.length == 1 && typeof args[0] == 'string') { methods = methods.concat(getMethods('getterSetter')); } return ($.inArray(method, methods) != -1); } $.widget = function(name, prototype) { var namespace = name.split(".")[0]; name = name.split(".")[1]; // create plugin method $.fn[name] = function(options) { var isMethodCall = (typeof options == 'string'), args = Array.prototype.slice.call(arguments, 1); // prevent calls to internal methods if (isMethodCall && options.substring(0, 1) == '_') { return this; } // handle getter methods if (isMethodCall && getter(namespace, name, options, args)) { var instance = $.data(this[0], name); return (instance ? instance[options].apply(instance, args) : undefined); } // handle initialization and non-getter methods return this.each(function() { var instance = $.data(this, name); // constructor (!instance && !isMethodCall && $.data(this, name, new $[namespace][name](this, options))); // method call (instance && isMethodCall && $.isFunction(instance[options]) && instance[options].apply(instance, args)); }); }; // create widget constructor $[namespace] = $[namespace] || {}; $[namespace][name] = function(element, options) { var self = this; this.widgetName = name; this.widgetEventPrefix = $[namespace][name].eventPrefix || name; this.widgetBaseClass = namespace + '-' + name; this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, $.metadata && $.metadata.get(element)[name], options); this.element = $(element) .bind('setData.' + name, function(event, key, value) { return self._setData(key, value); }) .bind('getData.' + name, function(event, key) { return self._getData(key); }) .bind('remove', function() { return self.destroy(); }); this._init(); }; // add widget prototype $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); // TODO: merge getter and getterSetter properties from widget prototype // and plugin prototype $[namespace][name].getterSetter = 'option'; }; $.widget.prototype = { _init: function() {}, destroy: function() { this.element.removeData(this.widgetName); }, option: function(key, value) { var options = key, self = this; if (typeof key == "string") { if (value === undefined) { return this._getData(key); } options = {}; options[key] = value; } $.each(options, function(key, value) { self._setData(key, value); }); }, _getData: function(key) { return this.options[key]; }, _setData: function(key, value) { this.options[key] = value; if (key == 'disabled') { this.element[value ? 'addClass' : 'removeClass']( this.widgetBaseClass + '-disabled'); } }, enable: function() { this._setData('disabled', false); }, disable: function() { this._setData('disabled', true); }, _trigger: function(type, event, data) { var eventName = (type == this.widgetEventPrefix ? type : this.widgetEventPrefix + type); event = event || $.event.fix({ type: eventName, target: this.element[0] }); return this.element.triggerHandler(eventName, [event, data], this.options[type]); } }; $.widget.defaults = { disabled: false }; /** Mouse Interaction Plugin **/ $.ui.mouse = { _mouseInit: function() { var self = this; this.element .bind('mousedown.'+this.widgetName, function(event) { return self._mouseDown(event); }) .bind('click.'+this.widgetName, function(event) { if(self._preventClickEvent) { self._preventClickEvent = false; return false; } }); // Prevent text selection in IE if ($.browser.msie) { this._mouseUnselectable = this.element.attr('unselectable'); this.element.attr('unselectable', 'on'); } this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.unbind('.'+this.widgetName); // Restore text selection in IE ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable)); }, _mouseDown: function(event) { // we may have missed mouseup (out of window) (this._mouseStarted && this._mouseUp(event)); this._mouseDownEvent = event; var self = this, btnIsLeft = (event.which == 1), elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { return true; } this.mouseDelayMet = !this.options.delay; if (!this.mouseDelayMet) { this._mouseDelayTimer = setTimeout(function() { self.mouseDelayMet = true; }, this.options.delay); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(event) !== false); if (!this._mouseStarted) { event.preventDefault(); return true; } } // these delegates are required to keep context this._mouseMoveDelegate = function(event) { return self._mouseMove(event); }; this._mouseUpDelegate = function(event) { return self._mouseUp(event); }; $(document) .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); // preventDefault() is used to prevent the selection of text here - // however, in Safari, this causes select boxes not to be selectable // anymore, so this fix is needed if(!$.browser.safari) event.preventDefault(); return true; }, _mouseMove: function(event) { // IE mouseup check - mouseup happened when mouse was out of window if ($.browser.msie && !event.button) { return this._mouseUp(event); } if (this._mouseStarted) { this._mouseDrag(event); return event.preventDefault(); } if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); } return !this._mouseStarted; }, _mouseUp: function(event) { $(document) .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); if (this._mouseStarted) { this._mouseStarted = false; this._preventClickEvent = true; this._mouseStop(event); } return false; }, _mouseDistanceMet: function(event) { return (Math.max( Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance ); }, _mouseDelayMet: function(event) { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function(event) {}, _mouseDrag: function(event) {}, _mouseStop: function(event) {}, _mouseCapture: function(event) { return true; } }; $.ui.mouse.defaults = { cancel: null, distance: 1, delay: 0 }; })(jQuery); /* * jQuery UI Draggable 1.6 * * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Draggables * * Depends: * ui.core.js */ (function($) { $.widget("ui.draggable", $.extend({}, $.ui.mouse, { _init: function() { if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position"))) this.element[0].style.position = 'relative'; (this.options.cssNamespace && this.element.addClass(this.options.cssNamespace+"-draggable")); (this.options.disabled && this.element.addClass('ui-draggable-disabled')); this._mouseInit(); }, destroy: function() { if(!this.element.data('draggable')) return; this.element.removeData("draggable").unbind(".draggable").removeClass('ui-draggable ui-draggable-dragging ui-draggable-disabled'); this._mouseDestroy(); }, _mouseCapture: function(event) { var o = this.options; if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle')) return false; //Quit if we're not on a valid handle this.handle = this._getHandle(event); if (!this.handle) return false; return true; }, _mouseStart: function(event) { var o = this.options; //Create and append the visible helper this.helper = this._createHelper(event); //Cache the helper size this._cacheHelperProportions(); //If ddmanager is used for droppables, set the global draggable if($.ui.ddmanager) $.ui.ddmanager.current = this; /* * - Position generation - * This block generates everything position related - it's the core of draggables. */ //Cache the margins of the original element this._cacheMargins(); //Store the helper's css position this.cssPosition = this.helper.css("position"); this.scrollParent = this.helper.scrollParent(); //The element's absolute position on the page minus margins this.offset = this.element.offset(); this.offset = { top: this.offset.top - this.margins.top, left: this.offset.left - this.margins.left }; $.extend(this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, top: event.pageY - this.offset.top }, parent: this._getParentOffset(), relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper }); //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied if(o.cursorAt) this._adjustOffsetFromHelper(o.cursorAt); //Generate the original position this.originalPosition = this._generatePosition(event); //Set a containment if given in the options if(o.containment) this._setContainment(); //Call plugins and callbacks this._propagate("start", event); //Recache the helper size this._cacheHelperProportions(); //Prepare the droppable offsets if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, event); this.helper.addClass("ui-draggable-dragging"); this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position return true; }, _mouseDrag: function(event, noPropagation) { //Compute the helpers position this.position = this._generatePosition(event); this.positionAbs = this._convertPositionTo("absolute"); //Call plugins and callbacks and use the resulting position if something is returned if(!noPropagation) this.position = this._propagate("drag", event) || this.position; if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); return false; }, _mouseStop: function(event) { //If we are using droppables, inform the manager about the drop var dropped = false; if ($.ui.ddmanager && !this.options.dropBehaviour) var dropped = $.ui.ddmanager.drop(this, event); if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { var self = this; $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { self._propagate("stop", event); self._clear(); }); } else { this._propagate("stop", event); this._clear(); } return false; }, _getHandle: function(event) { var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; $(this.options.handle, this.element) .find("*") .andSelf() .each(function() { if(this == event.target) handle = true; }); return handle; }, _createHelper: function(event) { var o = this.options; var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element); if(!helper.parents('body').length) helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) helper.css("position", "absolute"); return helper; }, _adjustOffsetFromHelper: function(obj) { if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left; if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top; if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; }, _getParentOffset: function() { this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); //Get the offsetParent and cache its position if((this.offsetParent[0] == document.body && $.browser.mozilla) //Ugly FF3 fix || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix po = { top: 0, left: 0 }; return { top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) }; }, _getRelativeOffset: function() { if(this.cssPosition == "relative") { var p = this.element.position(); return { top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() }; } else { return { top: 0, left: 0 }; } }, _cacheMargins: function() { this.margins = { left: (parseInt(this.element.css("marginLeft"),10) || 0), top: (parseInt(this.element.css("marginTop"),10) || 0) }; }, _cacheHelperProportions: function() { this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; }, _setContainment: function() { var o = this.options; if(o.containment == 'parent') o.containment = this.helper[0].parentNode; if(o.containment == 'document' || o.containment == 'window') this.containment = [ 0 - this.offset.relative.left - this.offset.parent.left, 0 - this.offset.relative.top - this.offset.parent.top, $(o.containment == 'document' ? document : window).width() - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0), ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0) ]; if(!(/^(document|window|parent)$/).test(o.containment)) { var ce = $(o.containment)[0]; var co = $(o.containment).offset(); var over = ($(ce).css("overflow") != 'hidden'); this.containment = [ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.margins.left, co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.margins.top, co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left, co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top ]; } }, _convertPositionTo: function(d, pos) { if(!pos) pos = this.position; var mod = d == "absolute" ? 1 : -1; var scroll = this[(this.cssPosition == 'absolute' ? 'offset' : 'scroll')+'Parent'], scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); return { top: ( pos.top // the calculated relative position + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) ), left: ( pos.left // the calculated relative position + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : ( scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) * mod + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) ) }; }, _generatePosition: function(event) { var o = this.options, scroll = this[(this.cssPosition == 'absolute' ? 'offset' : 'scroll')+'Parent'], scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); var position = { top: ( event.pageY // The absolute mouse position - this.offset.click.top // Click offset (relative to the element) - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) ), left: ( event.pageX // The absolute mouse position - this.offset.click.left // Click offset (relative to the element) - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) }; if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options /* * - Position constraining - * Constrain the position to a mix of grid, containment. */ if(this.containment) { if(position.left < this.containment[0]) position.left = this.containment[0]; if(position.top < this.containment[1]) position.top = this.containment[1]; if(position.left > this.containment[2]) position.left = this.containment[2]; if(position.top > this.containment[3]) position.top = this.containment[3]; } if(o.grid) { var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; } return position; }, _clear: function() { this.helper.removeClass("ui-draggable-dragging"); if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove(); //if($.ui.ddmanager) $.ui.ddmanager.current = null; this.helper = null; this.cancelHelperRemoval = false; }, // From now on bulk stuff - mainly helpers _propagate: function(n, event) { $.ui.plugin.call(this, n, [event, this._uiHash()]); if(n == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins return this.element.triggerHandler(n == "drag" ? n : "drag"+n, [event, this._uiHash()], this.options[n]); }, plugins: {}, _uiHash: function(event) { return { helper: this.helper, position: this.position, absolutePosition: this.positionAbs, options: this.options }; } })); $.extend($.ui.draggable, { version: "1.6", defaults: { appendTo: "parent", axis: false, cancel: ":input", connectToSortable: false, containment: false, cssNamespace: "ui", cursor: "default", cursorAt: null, delay: 0, distance: 1, grid: false, handle: false, helper: "original", iframeFix: false, opacity: 1, refreshPositions: false, revert: false, revertDuration: 500, scope: "default", scroll: true, scrollSensitivity: 20, scrollSpeed: 20, snap: false, snapMode: "both", snapTolerance: 20, stack: false, zIndex: null } }); $.ui.plugin.add("draggable", "connectToSortable", { start: function(event, ui) { var inst = $(this).data("draggable"); inst.sortables = []; $(ui.options.connectToSortable).each(function() { // 'this' points to a string, and should therefore resolved as query, but instead, if the string is assigned to a variable, it loops through the strings properties, // so we have to append '' to make it anonymous again $(this+'').each(function() { if($.data(this, 'sortable')) { var sortable = $.data(this, 'sortable'); inst.sortables.push({ instance: sortable, shouldRevert: sortable.options.revert }); sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache sortable._propagate("activate", event, inst); } }); }); }, stop: function(event, ui) { //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper var inst = $(this).data("draggable"); $.each(inst.sortables, function() { if(this.instance.isOver) { this.instance.isOver = 0; inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) if(this.shouldRevert) this.instance.options.revert = true; //revert here this.instance._mouseStop(event); //Also propagate receive event, since the sortable is actually receiving a element this.instance.element.triggerHandler("sortreceive", [event, $.extend(this.instance._ui(), { sender: inst.element })], this.instance.options["receive"]); this.instance.options.helper = this.instance.options._helper; if(inst.options.helper == 'original') { this.instance.currentItem.css({ top: 'auto', left: 'auto' }); } } else { this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance this.instance._propagate("deactivate", event, inst); } }); }, drag: function(event, ui) { var inst = $(this).data("draggable"), self = this; var checkPos = function(o) { var dyClick = this.offset.click.top, dxClick = this.offset.click.left; var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left; var itemHeight = o.height, itemWidth = o.width; var itemTop = o.top, itemLeft = o.left; return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth); }; $.each(inst.sortables, function(i) { if(checkPos.call(inst, this.instance.containerCache)) { //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once if(!this.instance.isOver) { this.instance.isOver = 1; //Now we fake the start of dragging for the sortable instance, //by cloning the list group item, appending it to the sortable and using it as inst.currentItem //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it this.instance.options.helper = function() { return ui.helper[0]; }; event.target = this.instance.currentItem[0]; this.instance._mouseCapture(event, true); this.instance._mouseStart(event, true, true); //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes this.instance.offset.click.top = inst.offset.click.top; this.instance.offset.click.left = inst.offset.click.left; this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; inst._propagate("toSortable", event); } //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable if(this.instance.currentItem) this.instance._mouseDrag(event); } else { //If it doesn't intersect with the sortable, and it intersected before, //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval if(this.instance.isOver) { this.instance.isOver = 0; this.instance.cancelHelperRemoval = true; this.instance.options.revert = false; //No revert here this.instance._mouseStop(event, true); this.instance.options.helper = this.instance.options._helper; //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size this.instance.currentItem.remove(); if(this.instance.placeholder) this.instance.placeholder.remove(); inst._propagate("fromSortable", event); } }; }); } }); $.ui.plugin.add("draggable", "cursor", { start: function(event, ui) { var t = $('body'); if (t.css("cursor")) ui.options._cursor = t.css("cursor"); t.css("cursor", ui.options.cursor); }, stop: function(event, ui) { if (ui.options._cursor) $('body').css("cursor", ui.options._cursor); } }); $.ui.plugin.add("draggable", "iframeFix", { start: function(event, ui) { $(ui.options.iframeFix === true ? "iframe" : ui.options.iframeFix).each(function() { $('
    ') .css({ width: this.offsetWidth+"px", height: this.offsetHeight+"px", position: "absolute", opacity: "0.001", zIndex: 1000 }) .css($(this).offset()) .appendTo("body"); }); }, stop: function(event, ui) { $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers } }); $.ui.plugin.add("draggable", "opacity", { start: function(event, ui) { var t = $(ui.helper); if(t.css("opacity")) ui.options._opacity = t.css("opacity"); t.css('opacity', ui.options.opacity); }, stop: function(event, ui) { if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity); } }); $.ui.plugin.add("draggable", "scroll", { start: function(event, ui) { var o = ui.options; var i = $(this).data("draggable"); if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); }, drag: function(event, ui) { var o = ui.options, scrolled = false; var i = $(this).data("draggable"); if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; } else { if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); } if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(i, event); // This is a special case where we need to modify a offset calculated on start, since the following happened: // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag if(scrolled !== false && i.cssPosition == 'absolute' && i.scrollParent[0] != document && $.ui.contains(i.scrollParent[0], i.offsetParent[0])) { i.offset.parent = i._getParentOffset(); } // This is another very weird special case that only happens for relative elements: // 1. If the css position is relative // 2. and the scroll parent is the document or similar to the offset parent // we have to refresh the relative offset during the scroll so there are no jumps if(scrolled !== false && i.cssPosition == 'relative' && !(i.scrollParent[0] != document && i.scrollParent[0] != i.offsetParent[0])) { i.offset.relative = i._getRelativeOffset(); } } }); $.ui.plugin.add("draggable", "snap", { start: function(event, ui) { var inst = $(this).data("draggable"); inst.snapElements = []; $(ui.options.snap.constructor != String ? ( ui.options.snap.items || ':data(draggable)' ) : ui.options.snap).each(function() { var $t = $(this); var $o = $t.offset(); if(this != inst.element[0]) inst.snapElements.push({ item: this, width: $t.outerWidth(), height: $t.outerHeight(), top: $o.top, left: $o.left }); }); }, drag: function(event, ui) { var inst = $(this).data("draggable"); var d = ui.options.snapTolerance; var x1 = ui.absolutePosition.left, x2 = x1 + inst.helperProportions.width, y1 = ui.absolutePosition.top, y2 = y1 + inst.helperProportions.height; for (var i = inst.snapElements.length - 1; i >= 0; i--){ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; //Yes, I know, this is insane ;) if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) { if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); inst.snapElements[i].snapping = false; continue; } if(ui.options.snapMode != 'inner') { var ts = Math.abs(t - y2) <= d; var bs = Math.abs(b - y1) <= d; var ls = Math.abs(l - x2) <= d; var rs = Math.abs(r - x1) <= d; if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top; if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top; if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left; if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left; } var first = (ts || bs || ls || rs); if(ui.options.snapMode != 'outer') { var ts = Math.abs(t - y1) <= d; var bs = Math.abs(b - y2) <= d; var ls = Math.abs(l - x1) <= d; var rs = Math.abs(r - x2) <= d; if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top; if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top; if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left; if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left; } if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); inst.snapElements[i].snapping = (ts || bs || ls || rs || first); }; } }); $.ui.plugin.add("draggable", "stack", { start: function(event, ui) { var group = $.makeArray($(ui.options.stack.group)).sort(function(a,b) { return (parseInt($(a).css("zIndex"),10) || ui.options.stack.min) - (parseInt($(b).css("zIndex"),10) || ui.options.stack.min); }); $(group).each(function(i) { this.style.zIndex = ui.options.stack.min + i; }); this[0].style.zIndex = ui.options.stack.min + group.length; } }); $.ui.plugin.add("draggable", "zIndex", { start: function(event, ui) { var t = $(ui.helper); if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex"); t.css('zIndex', ui.options.zIndex); }, stop: function(event, ui) { if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex); } }); })(jQuery); /* * jQuery UI Sortable 1.6 * * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Sortables * * Depends: * ui.core.js */ (function($) { $.widget("ui.sortable", $.extend({}, $.ui.mouse, { _init: function() { var o = this.options; this.containerCache = {}; this.element.addClass("ui-sortable"); //Get the items this.refresh(); //Let's determine if the items are floating this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false; //Let's determine the parent's offset this.offset = this.element.offset(); //Initialize mouse events for interaction this._mouseInit(); }, destroy: function() { this.element .removeClass("ui-sortable ui-sortable-disabled") .removeData("sortable") .unbind(".sortable"); this._mouseDestroy(); for ( var i = this.items.length - 1; i >= 0; i-- ) this.items[i].item.removeData("sortable-item"); }, _mouseCapture: function(event, overrideHandle) { if (this.reverting) { return false; } if(this.options.disabled || this.options.type == 'static') return false; //We have to refresh the items data once first this._refreshItems(event); //Find out if the clicked node (or one of its parents) is a actual item in this.items var currentItem = null, self = this, nodes = $(event.target).parents().each(function() { if($.data(this, 'sortable-item') == self) { currentItem = $(this); return false; } }); if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target); if(!currentItem) return false; if(this.options.handle && !overrideHandle) { var validHandle = false; $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; }); if(!validHandle) return false; } this.currentItem = currentItem; this._removeCurrentsFromItems(); return true; }, _mouseStart: function(event, overrideHandle, noActivation) { var o = this.options; this.currentContainer = this; //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture this.refreshPositions(); //Create and append the visible helper this.helper = this._createHelper(event); //Cache the helper size this._cacheHelperProportions(); /* * - Position generation - * This block generates everything position related - it's the core of draggables. */ //Cache the margins of the original element this._cacheMargins(); //Get the next scrolling parent this.scrollParent = this.helper.scrollParent(); //The element's absolute position on the page minus margins this.offset = this.currentItem.offset(); this.offset = { top: this.offset.top - this.margins.top, left: this.offset.left - this.margins.left }; // Only after we got the offset, we can change the helper's position to absolute // TODO: Still need to figure out a way to make relative sorting possible this.helper.css("position", "absolute"); this.cssPosition = this.helper.css("position"); $.extend(this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, top: event.pageY - this.offset.top }, parent: this._getParentOffset(), relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper }); //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied if(o.cursorAt) this._adjustOffsetFromHelper(o.cursorAt); //Generate the original position this.originalPosition = this._generatePosition(event); //Cache the former DOM position this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way if(this.helper[0] != this.currentItem[0]) { this.currentItem.hide(); } //Create the placeholder this._createPlaceholder(); //Set a containment if given in the options if(o.containment) this._setContainment(); //Call plugins and callbacks this._propagate("start", event); //Recache the helper size if(!this._preserveHelperProportions) this._cacheHelperProportions(); //Post 'activate' events to possible containers if(!noActivation) { for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._propagate("activate", event, this); } } //Prepare possible droppables if($.ui.ddmanager) $.ui.ddmanager.current = this; if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, event); this.dragging = true; this.helper.addClass('ui-sortable-helper'); this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position return true; }, _mouseDrag: function(event) { //Compute the helpers position this.position = this._generatePosition(event); this.positionAbs = this._convertPositionTo("absolute"); if (!this.lastPositionAbs) { this.lastPositionAbs = this.positionAbs; } //Call the internal plugins $.ui.plugin.call(this, "sort", [event, this._ui()]); //Regenerate the absolute position used for position checks this.positionAbs = this._convertPositionTo("absolute"); //Set the helper position if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; //Rearrange for (var i = this.items.length - 1; i >= 0; i--) { //Cache variables and intersection, continue if no intersection var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item); if (!intersection) continue; if(itemElement != this.currentItem[0] //cannot intersect with itself && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true) ) { this.direction = intersection == 1 ? "down" : "up"; if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) { this.options.sortIndicator.call(this, event, item); } else { break; } this._propagate("change", event); //Call plugins and callbacks break; } } //Post events to containers this._contactContainers(event); //Interconnect with droppables if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); //Call callbacks this._trigger('sort', event, this._ui()); this.lastPositionAbs = this.positionAbs; return false; }, _mouseStop: function(event, noPropagation) { if(!event) return; //If we are using droppables, inform the manager about the drop if ($.ui.ddmanager && !this.options.dropBehaviour) $.ui.ddmanager.drop(this, event); if(this.options.revert) { var self = this; var cur = self.placeholder.offset(); self.reverting = true; $(this.helper).animate({ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) }, parseInt(this.options.revert, 10) || 500, function() { self._clear(event); }); } else { this._clear(event, noPropagation); } return false; }, cancel: function() { if(this.dragging) { this._mouseUp(); if(this.options.helper == "original") this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); else this.currentItem.show(); //Post deactivating events to containers for (var i = this.containers.length - 1; i >= 0; i--){ this.containers[i]._propagate("deactivate", null, this); if(this.containers[i].containerCache.over) { this.containers[i]._propagate("out", null, this); this.containers[i].containerCache.over = 0; } } } //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]); if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove(); $.extend(this, { helper: null, dragging: false, reverting: false, _noFinalSort: null }); if(this.domPosition.prev) { $(this.domPosition.prev).after(this.currentItem); } else { $(this.domPosition.parent).prepend(this.currentItem); } return true; }, serialize: function(o) { var items = this._getItemsAsjQuery(o && o.connected); var str = []; o = o || {}; $(items).each(function() { var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2])); }); return str.join('&'); }, toArray: function(o) { var items = this._getItemsAsjQuery(o && o.connected); var ret = []; o = o || {}; items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); }); return ret; }, /* Be careful with the following core functions */ _intersectsWith: function(item) { var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; var l = item.left, r = l + item.width, t = item.top, b = t + item.height; var dyClick = this.offset.click.top, dxClick = this.offset.click.left; var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r; if( this.options.tolerance == "pointer" || this.options.forcePointerForContainers || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height']) ) { return isOverElement; } else { return (l < x1 + (this.helperProportions.width / 2) // Right Half && x2 - (this.helperProportions.width / 2) < r // Left Half && t < y1 + (this.helperProportions.height / 2) // Bottom Half && y2 - (this.helperProportions.height / 2) < b ); // Top Half } }, _intersectsWithPointer: function(item) { var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), isOverElement = isOverElementHeight && isOverElementWidth, verticalDirection = this._getDragVerticalDirection(), horizontalDirection = this._getDragHorizontalDirection(); if (!isOverElement) return false; return this.floating ? ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 ) : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) ); }, _intersectsWithSides: function(item) { var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), verticalDirection = this._getDragVerticalDirection(), horizontalDirection = this._getDragHorizontalDirection(); if (this.floating && horizontalDirection) { return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf)); } else { return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf)); } }, _getDragVerticalDirection: function() { var delta = this.positionAbs.top - this.lastPositionAbs.top; return delta != 0 && (delta > 0 ? "down" : "up"); }, _getDragHorizontalDirection: function() { var delta = this.positionAbs.left - this.lastPositionAbs.left; return delta != 0 && (delta > 0 ? "right" : "left"); }, refresh: function(event) { this._refreshItems(event); this.refreshPositions(); }, _getItemsAsjQuery: function(connected) { var self = this; var items = []; var queries = []; if(this.options.connectWith && connected) { for (var i = this.options.connectWith.length - 1; i >= 0; i--){ var cur = $(this.options.connectWith[i]); for (var j = cur.length - 1; j >= 0; j--){ var inst = $.data(cur[j], 'sortable'); if(inst && inst != this && !inst.options.disabled) { queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper"), inst]); } }; }; } queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper"), this]); for (var i = queries.length - 1; i >= 0; i--){ queries[i][0].each(function() { items.push(this); }); }; return $(items); }, _removeCurrentsFromItems: function() { var list = this.currentItem.find(":data(sortable-item)"); for (var i=0; i < this.items.length; i++) { for (var j=0; j < list.length; j++) { if(list[j] == this.items[i].item[0]) this.items.splice(i,1); }; }; }, _refreshItems: function(event) { this.items = []; this.containers = [this]; var items = this.items; var self = this; var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; if(this.options.connectWith) { for (var i = this.options.connectWith.length - 1; i >= 0; i--){ var cur = $(this.options.connectWith[i]); for (var j = cur.length - 1; j >= 0; j--){ var inst = $.data(cur[j], 'sortable'); if(inst && inst != this && !inst.options.disabled) { queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); this.containers.push(inst); } }; }; } for (var i = queries.length - 1; i >= 0; i--) { var targetData = queries[i][1]; var _queries = queries[i][0]; for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) { var item = $(_queries[j]); item.data('sortable-item', targetData); // Data for target checking (mouse manager) items.push({ item: item, instance: targetData, width: 0, height: 0, left: 0, top: 0 }); }; }; }, refreshPositions: function(fast) { //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change if(this.offsetParent && this.helper) { this.offset.parent = this._getParentOffset(); } for (var i = this.items.length - 1; i >= 0; i--){ var item = this.items[i]; //We ignore calculating positions of all connected containers when we're not over them if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0]) continue; var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; if (!fast) { if (this.options.accurateIntersection) { item.width = t.outerWidth(); item.height = t.outerHeight(); } else { item.width = t[0].offsetWidth; item.height = t[0].offsetHeight; } } var p = t.offset(); item.left = p.left; item.top = p.top; }; if(this.options.custom && this.options.custom.refreshContainers) { this.options.custom.refreshContainers.call(this); } else { for (var i = this.containers.length - 1; i >= 0; i--){ var p = this.containers[i].element.offset(); this.containers[i].containerCache.left = p.left; this.containers[i].containerCache.top = p.top; this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); }; } }, _createPlaceholder: function(that) { var self = that || this, o = self.options; if(!o.placeholder || o.placeholder.constructor == String) { var className = o.placeholder; o.placeholder = { element: function() { var el = $(document.createElement(self.currentItem[0].nodeName)) .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") .removeClass('ui-sortable-helper')[0]; if(!className) { el.style.visibility = "hidden"; document.body.appendChild(el); // Name attributes are removed, otherwice causes elements to be unchecked // Expando attributes also have to be removed because of stupid IE (no condition, doesn't hurt in other browsers) el.innerHTML = self.currentItem[0].innerHTML.replace(/name\=\"[^\"\']+\"/g, '').replace(/jQuery[0-9]+\=\"[^\"\']+\"/g, ''); document.body.removeChild(el); }; return el; }, update: function(container, p) { if(className && !o.forcePlaceholderSize) return; if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; } }; } //Create the placeholder self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); //Append it after the actual current item self.currentItem.after(self.placeholder); //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) o.placeholder.update(self, self.placeholder); }, _contactContainers: function(event) { for (var i = this.containers.length - 1; i >= 0; i--){ if(this._intersectsWith(this.containers[i].containerCache)) { if(!this.containers[i].containerCache.over) { if(this.currentContainer != this.containers[i]) { //When entering a new container, we will find the item with the least distance and append our item near it var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top']; for (var j = this.items.length - 1; j >= 0; j--) { if(!$.ui.contains(this.containers[i].element[0], this.items[j].item[0])) continue; var cur = this.items[j][this.containers[i].floating ? 'left' : 'top']; if(Math.abs(cur - base) < dist) { dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; } } if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled continue; this.currentContainer = this.containers[i]; itemWithLeastDistance ? this.options.sortIndicator.call(this, event, itemWithLeastDistance, null, true) : this.options.sortIndicator.call(this, event, null, this.containers[i].element, true); this._propagate("change", event); //Call plugins and callbacks this.containers[i]._propagate("change", event, this); //Call plugins and callbacks //Update the placeholder this.options.placeholder.update(this.currentContainer, this.placeholder); } this.containers[i]._propagate("over", event, this); this.containers[i].containerCache.over = 1; } } else { if(this.containers[i].containerCache.over) { this.containers[i]._propagate("out", event, this); this.containers[i].containerCache.over = 0; } } }; }, _createHelper: function(event) { var o = this.options; var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem); if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); if(helper[0] == this.currentItem[0]) this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width()); if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height()); return helper; }, _adjustOffsetFromHelper: function(obj) { if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left; if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top; if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; }, _getParentOffset: function() { //Get the offsetParent and cache its position this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); if((this.offsetParent[0] == document.body && $.browser.mozilla) //Ugly FF3 fix || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix po = { top: 0, left: 0 }; return { top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) }; }, _getRelativeOffset: function() { if(this.cssPosition == "relative") { var p = this.currentItem.position(); return { top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() }; } else { return { top: 0, left: 0 }; } }, _cacheMargins: function() { this.margins = { left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), top: (parseInt(this.currentItem.css("marginTop"),10) || 0) }; }, _cacheHelperProportions: function() { this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; }, _setContainment: function() { var o = this.options; if(o.containment == 'parent') o.containment = this.helper[0].parentNode; if(o.containment == 'document' || o.containment == 'window') this.containment = [ 0 - this.offset.relative.left - this.offset.parent.left, 0 - this.offset.relative.top - this.offset.parent.top, $(o.containment == 'document' ? document : window).width() - this.offset.relative.left - this.offset.parent.left - this.margins.left - (parseInt(this.currentItem.css("marginRight"),10) || 0), ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.relative.top - this.offset.parent.top - this.margins.top - (parseInt(this.currentItem.css("marginBottom"),10) || 0) ]; if(!(/^(document|window|parent)$/).test(o.containment)) { var ce = $(o.containment)[0]; var co = $(o.containment).offset(); var over = ($(ce).css("overflow") != 'hidden'); this.containment = [ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.margins.left, co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.margins.top, co.left + (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.margins.left, co.top + (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.margins.top ]; } }, _convertPositionTo: function(d, pos) { if(!pos) pos = this.position; var mod = d == "absolute" ? 1 : -1; var scroll = this[(this.cssPosition == 'absolute' ? 'offset' : 'scroll')+'Parent'], scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); return { top: ( pos.top // the calculated relative position + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods) ), left: ( pos.left // the calculated relative position + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : ( scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) * mod + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods) ) }; }, _generatePosition: function(event) { var o = this.options, scroll = this[(this.cssPosition == 'absolute' ? 'offset' : 'scroll')+'Parent'], scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); var position = { top: ( event.pageY // The absolute mouse position - this.offset.click.top // Click offset (relative to the element) - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) ), left: ( event.pageX // The absolute mouse position - this.offset.click.left // Click offset (relative to the element) - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : ( scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) ) }; if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options /* * - Position constraining - * Constrain the position to a mix of grid, containment. */ if(this.containment) { if(position.left < this.containment[0]) position.left = this.containment[0]; if(position.top < this.containment[1]) position.top = this.containment[1]; if(position.left + this.helperProportions.width > this.containment[2]) position.left = this.containment[2] - this.helperProportions.width; if(position.top + this.helperProportions.height > this.containment[3]) position.top = this.containment[3] - this.helperProportions.height; } if(o.grid) { var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1]; position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0]; position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; } return position; }, _rearrange: function(event, i, a, hardRefresh) { a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); //Various things done here to improve the performance: // 1. we create a setTimeout, that calls refreshPositions // 2. on the instance, we have a counter variable, that get's higher after every append // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same // 4. this lets only the last addition to the timeout stack through this.counter = this.counter ? ++this.counter : 1; var self = this, counter = this.counter; window.setTimeout(function() { if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove },0); }, _clear: function(event, noPropagation) { this.reverting = false; //We first have to update the dom position of the actual currentItem if(!this._noFinalSort) this.placeholder.before(this.currentItem); this._noFinalSort = null; if(this.helper[0] == this.currentItem[0]) { for(var i in this._storedCSS) { if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = ''; } this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); } else { this.currentItem.show(); } if(this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) this._propagate("update", event, null, noPropagation); //Trigger update callback if the DOM position has changed if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element this._propagate("remove", event, null, noPropagation); for (var i = this.containers.length - 1; i >= 0; i--){ if($.ui.contains(this.containers[i].element[0], this.currentItem[0])) { this.containers[i]._propagate("update", event, this, noPropagation); this.containers[i]._propagate("receive", event, this, noPropagation); } }; }; //Post events to containers for (var i = this.containers.length - 1; i >= 0; i--){ this.containers[i]._propagate("deactivate", event, this, noPropagation); if(this.containers[i].containerCache.over) { this.containers[i]._propagate("out", event, this); this.containers[i].containerCache.over = 0; } } this.dragging = false; if(this.cancelHelperRemoval) { this._propagate("beforeStop", event, null, noPropagation); this._propagate("stop", event, null, noPropagation); return false; } this._propagate("beforeStop", event, null, noPropagation); //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! this.placeholder[0].parentNode.removeChild(this.placeholder[0]); if(this.options.helper != "original") this.helper.remove(); this.helper = null; this._propagate("stop", event, null, noPropagation); return true; }, _propagate: function(n, event, inst, noPropagation) { $.ui.plugin.call(this, n, [event, this._ui(inst)]); var dontCancel = !noPropagation ? this.element.triggerHandler(n == "sort" ? n : "sort"+n, [event, this._ui(inst)], this.options[n]) : true; if(dontCancel === false) this.cancel(); }, plugins: {}, _ui: function(inst) { var self = inst || this; return { helper: self.helper, placeholder: self.placeholder || $([]), position: self.position, absolutePosition: self.positionAbs, item: self.currentItem, sender: inst ? inst.element : null }; } })); $.extend($.ui.sortable, { getter: "serialize toArray", version: "1.6", defaults: { accurateIntersection: true, appendTo: "parent", cancel: ":input", delay: 0, distance: 1, dropOnEmpty: true, forcePlaceholderSize: false, forceHelperSize: false, helper: "original", items: '> *', scope: "default", scroll: true, scrollSensitivity: 20, scrollSpeed: 20, sortIndicator: $.ui.sortable.prototype._rearrange, tolerance: "default", zIndex: 1000 } }); /* * Sortable Extensions */ $.ui.plugin.add("sortable", "cursor", { start: function(event, ui) { var t = $('body'), i = $(this).data('sortable'); if (t.css("cursor")) i.options._cursor = t.css("cursor"); t.css("cursor", i.options.cursor); }, beforeStop: function(event, ui) { var i = $(this).data('sortable'); if (i.options._cursor) $('body').css("cursor", i.options._cursor); } }); $.ui.plugin.add("sortable", "opacity", { start: function(event, ui) { var t = ui.helper, i = $(this).data('sortable'); if(t.css("opacity")) i.options._opacity = t.css("opacity"); t.css('opacity', i.options.opacity); }, beforeStop: function(event, ui) { var i = $(this).data('sortable'); if(i.options._opacity) $(ui.helper).css('opacity', i.options._opacity); } }); $.ui.plugin.add("sortable", "scroll", { start: function(event, ui) { var i = $(this).data("sortable"), o = i.options; if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); }, sort: function(event, ui) { var i = $(this).data("sortable"), o = i.options, scrolled = false; if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; } else { if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); } if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(i, event); //This is a special case where we need to modify a offset calculated on start, since the following happened: // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag if(scrolled !== false && i.cssPosition == 'absolute' && i.scrollParent[0] != document && $.ui.contains(i.scrollParent[0], i.offsetParent[0])) { i.offset.parent = i._getParentOffset(); } // This is another very weird special case that only happens for relative elements: // 1. If the css position is relative // 2. and the scroll parent is the document or similar to the offset parent // we have to refresh the relative offset during the scroll so there are no jumps if(scrolled !== false && i.cssPosition == 'relative' && !(i.scrollParent[0] != document && i.scrollParent[0] != i.offsetParent[0])) { i.offset.relative = i._getRelativeOffset(); } } }); $.ui.plugin.add("sortable", "zIndex", { start: function(event, ui) { var t = ui.helper, i = $(this).data('sortable'); if(t.css("zIndex")) i.options._zIndex = t.css("zIndex"); t.css('zIndex', i.options.zIndex); }, beforeStop: function(event, ui) { var i = $(this).data('sortable'); if(i.options._zIndex) $(ui.helper).css('zIndex', i.options._zIndex == 'auto' ? '' : i.options._zIndex); } }); })(jQuery); PKd\KvAA,formulaires/selecteur/inc-sel-rubriques.htmlnuW+A
  • [(#ENV{afficher_langue,0}|oui)[[(#LANG)]] ]#TITRE[(#ENV{select,''}|non) ],
  • [ (#VALEUR|=={0}|oui)
  • <:info_racine_site:>[(#ENV{select,''}|non) ],
  • ] PKd\)::/formulaires/selecteur/jquery-ui-1.8.5.custom.jsnuW+A/*! * jQuery UI 1.8.5 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI */ (function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, "position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, "border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this, h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); ;/* * jQuery UI Sortable 1.8.5 * * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * http://docs.jquery.com/UI/Sortables * * Depends: * jquery.ui.core.js * jquery.ui.mouse.js * jquery.ui.widget.js */ (function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, {click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| "id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")}, _getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h= 0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])? g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= 0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e [

    (#PAGINATION)

    ] PKd\n+formulaires/selecteur/inc-sel-articles.htmlnuW+A
  • [(#ENV{afficher_langue,0}|oui)[[(#LANG)]] ]#TITRE[(#ENV{select,''}|non) ],
  • PKd\,formulaires/selecteur/inc-nav-rubriques.htmlnuW+A#SET{p,pr_#ID_RUBRIQUE} [

    (#PAGINATION)

    ]
    PKd\p#uhKK!formulaires/dateur/datePicker.cssnuW+Atable.jCalendar { background: #c0cad4; border-collapse: separate; border-spacing: 2px; } table.jCalendar th { background: #c0cad4; color: #333; font-weight: bold; padding: 3px 5px; text-transform: uppercase; } table.jCalendar td { background: #fff; color: #000; padding: 3px 5px; text-align: center; } table.jCalendar td.other-month { color: #aaa; } table.jCalendar td.today { background: #666; color: #fff; } table.jCalendar td.selected { background: #f66; color: #fff; } table.jCalendar td.selected:hover { background: #f33; color: #fff; } table.jCalendar td:hover, table.jCalendar td.dp-hover { background: #eee; color: #000; } table.jCalendar td.disabled, table.jCalendar td.disabled:hover { background: #e0e5ea; color: #888; } /* For the popup */ /* NOTE - you will probably want to style a.dp-choose-date - see how I did it in demo.css */ div.dp-popup { position: relative; background: #e0e5ea; border: 1px solid #85909a; font-size: 10px; font-family: arial, sans-serif; padding: 2px; line-height: 1.2em; } div#dp-popup { position: absolute; z-index: 99999; } div.dp-popup h2 { font-size: 12px; text-align: center; margin: 2px 0; padding: 0; color: #555; } a#dp-close { font-size: 11px; padding: 4px 0; text-align: center; display: block; } a#dp-close:hover { text-decoration: underline; } div.dp-popup a { color: #000; text-decoration: none; padding: 3px 2px 0; } div.dp-popup div.dp-nav-prev { position: absolute; top: 2px; left: 4px; width: 100px; } div.dp-popup div.dp-nav-prev a { float: left; } /* Opera needs the rules to be this specific otherwise it doesn't change the cursor back to pointer after you have disabled and re-enabled a link */ div.dp-popup div.dp-nav-prev a, div.dp-popup div.dp-nav-next a { cursor: pointer; } div.dp-popup div.dp-nav-prev a.disabled, div.dp-popup div.dp-nav-next a.disabled { cursor: default; } div.dp-popup div.dp-nav-next { position: absolute; top: 2px; right: 4px; width: 100px; } div.dp-popup div.dp-nav-next a { float: right; } div.dp-popup a.disabled { cursor: default; color: #aaa; } div.dp-popup td { cursor: pointer; } div.dp-popup td.disabled { cursor: default; }PKd\d'formulaires/dateur/jquery.datePicker.jsnuW+A/** * Copyright (c) 2007 Kelvin Luck (http://www.kelvinluck.com/) * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * * $Id: jquery.datePicker.js 3739 2007-10-25 13:55:30Z kelvin.luck $ **/ (function($){ $.fn.extend({ /** * Render a calendar table into any matched elements. * * @param Object s (optional) Customize your calendars. * @option Number month The month to render (NOTE that months are zero based). Default is today's month. * @option Number year The year to render. Default is today's year. * @option Function renderCallback A reference to a function that is called as each cell is rendered and which can add classes and event listeners to the created nodes. Default is no callback. * @option Number showHeader Whether or not to show the header row, possible values are: $.dpConst.SHOW_HEADER_NONE (no header), $.dpConst.SHOW_HEADER_SHORT (first letter of each day) and $.dpConst.SHOW_HEADER_LONG (full name of each day). Default is $.dpConst.SHOW_HEADER_SHORT. * @option String hoverClass The class to attach to each cell when you hover over it (to allow you to use hover effects in IE6 which doesn't support the :hover pseudo-class on elements other than links). Default is dp-hover. Pass false if you don't want a hover class. * @type jQuery * @name renderCalendar * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('#calendar-me').renderCalendar({month:0, year:2007}); * @desc Renders a calendar displaying January 2007 into the element with an id of calendar-me. * * @example * var testCallback = function($td, thisDate, month, year) * { * if ($td.is('.current-month') && thisDate.getDay() == 4) { * var d = thisDate.getDate(); * $td.bind( * 'click', * function() * { * alert('You clicked on ' + d + '/' + (Number(month)+1) + '/' + year); * } * ).addClass('thursday'); * } else if (thisDate.getDay() == 5) { * $td.html('Friday the ' + $td.html() + 'th'); * } * } * $('#calendar-me').renderCalendar({month:0, year:2007, renderCallback:testCallback}); * * @desc Renders a calendar displaying January 2007 into the element with an id of calendar-me. Every Thursday in the current month has a class of "thursday" applied to it, is clickable and shows an alert when clicked. Every Friday on the calendar has the number inside replaced with text. **/ renderCalendar : function(s) { var dc = function(a) { return document.createElement(a); }; s = $.extend( { month : null, year : null, renderCallback : null, showHeader : $.dpConst.SHOW_HEADER_SHORT, dpController : null, hoverClass : 'dp-hover' } , s ); if (s.showHeader != $.dpConst.SHOW_HEADER_NONE) { var headRow = $(dc('tr')); for (var i=Date.firstDayOfWeek; i 1) firstDayOffset -= 7; var weeksToDraw = Math.ceil(( (-1*firstDayOffset+1) + currentDate.getDaysInMonth() ) /7); currentDate.addDays(firstDayOffset-1); var doHover = function() { if (s.hoverClass) { $(this).addClass(s.hoverClass); } }; var unHover = function() { if (s.hoverClass) { $(this).removeClass(s.hoverClass); } }; var w = 0; while (w++' + $.dpText.TEXT_CHOOSE_DATE + '') .bind( 'click', function() { $this.dpDisplay(this); this.blur(); return false; } ); $this.after(controller.button); } if (!alreadyExists && $this.is(':text')) { $this .bind( 'dateSelected', function(e, selectedDate, $td) { this.value = selectedDate.asString(); } ).bind( 'change', function() { var d = Date.fromString(this.value); if (d) { controller.setSelected(d, true, true); } } ); if (s.clickInput) { $this.bind( 'click', function() { $this.dpDisplay(); } ); } var d = Date.fromString(this.value); if (this.value != '' && d) { controller.setSelected(d, true, true); } } $this.addClass('dp-applied'); } ) }, /** * Disables or enables this date picker * * @param Boolean s Whether to disable (true) or enable (false) this datePicker * @type jQuery * @name dpSetDisabled * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * $('.date-picker').dpSetDisabled(true); * @desc Prevents this date picker from displaying and adds a class of dp-disabled to it (and it's associated button if it has one) for styling purposes. If the matched element is an input field then it will also set the disabled attribute to stop people directly editing the field. **/ dpSetDisabled : function(s) { return _w.call(this, 'setDisabled', s); }, /** * Updates the first selectable date for any date pickers on any matched elements. * * @param String d A string representing the first selectable date (formatted according to Date.format). * @type jQuery * @name dpSetStartDate * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * $('.date-picker').dpSetStartDate('01/01/2000'); * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the first selectable date for each of these to the first day of the millenium. **/ dpSetStartDate : function(d) { return _w.call(this, 'setStartDate', d); }, /** * Updates the last selectable date for any date pickers on any matched elements. * * @param String d A string representing the last selectable date (formatted according to Date.format). * @type jQuery * @name dpSetEndDate * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * $('.date-picker').dpSetEndDate('01/01/2010'); * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the last selectable date for each of these to the first Janurary 2010. **/ dpSetEndDate : function(d) { return _w.call(this, 'setEndDate', d); }, /** * Gets a list of Dates currently selected by this datePicker. This will be an empty array if no dates are currently selected or NULL if there is no datePicker associated with the matched element. * * @type Array * @name dpGetSelected * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * alert($('.date-picker').dpGetSelected()); * @desc Will alert an empty array (as nothing is selected yet) **/ dpGetSelected : function() { var c = _getController(this[0]); if (c) { return c.getSelected(); } return null; }, /** * Selects or deselects a date on any matched element's date pickers. Deselcting is only useful on date pickers where selectMultiple==true. Selecting will only work if the passed date is within the startDate and endDate boundries for a given date picker. * * @param String d A string representing the date you want to select (formatted according to Date.format). * @param Boolean v Whether you want to select (true) or deselect (false) this date. Optional - default = true. * @param Boolean m Whether you want the date picker to open up on the month of this date when it is next opened. Optional - default = true. * @type jQuery * @name dpSetSelected * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * $('.date-picker').dpSetSelected('01/01/2010'); * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the selected date on these date pickers to the first Janurary 2010. When the date picker is next opened it will display Janurary 2010. **/ dpSetSelected : function(d, v, m) { if (v == undefined) v=true; if (m == undefined) m=true; return _w.call(this, 'setSelected', Date.fromString(d), v, m); }, /** * Sets the month that will be displayed when the date picker is next opened. If the passed month is before startDate then the month containing startDate will be displayed instead. If the passed month is after endDate then the month containing the endDate will be displayed instead. * * @param Number m The month you want the date picker to display. Optional - defaults to the currently displayed month. * @param Number y The year you want the date picker to display. Optional - defaults to the currently displayed year. * @type jQuery * @name dpSetDisplayedMonth * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-picker').datePicker(); * $('.date-picker').dpSetDisplayedMonth(10, 2008); * @desc Creates a date picker associated with all elements with a class of "date-picker" then sets the selected date on these date pickers to the first Janurary 2010. When the date picker is next opened it will display Janurary 2010. **/ dpSetDisplayedMonth : function(m, y) { return _w.call(this, 'setDisplayedMonth', Number(m), Number(y)); }, /** * Displays the date picker associated with the matched elements. Since only one date picker can be displayed at once then the date picker associated with the last matched element will be the one that is displayed. * * @param HTMLElement e An element that you want the date picker to pop up relative in position to. Optional - default behaviour is to pop up next to the element associated with this date picker. * @type jQuery * @name dpDisplay * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('#date-picker').datePicker(); * $('#date-picker').dpDisplay(); * @desc Creates a date picker associated with the element with an id of date-picker and then causes it to pop up. **/ dpDisplay : function(e) { return _w.call(this, 'display', e); }, /** * Sets a function or array of functions that is called when each TD of the date picker popup is rendered to the page * * @param (Function|Array) a A function or an array of functions that are called when each td is rendered. Each function will receive four arguments; a jquery object wrapping the created TD, a Date object containing the date this TD represents, a number giving the currently rendered month and a number giving the currently rendered year. * @type jQuery * @name dpSetRenderCallback * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('#date-picker').datePicker(); * $('#date-picker').dpSetRenderCallback(function($td, thisDate, month, year) * { * // do stuff as each td is rendered dependant on the date in the td and the displayed month and year * }); * @desc Creates a date picker associated with the element with an id of date-picker and then creates a function which is called as each td is rendered when this date picker is displayed. **/ dpSetRenderCallback : function(a) { return _w.call(this, 'setRenderCallback', a); }, /** * Sets the position that the datePicker will pop up (relative to it's associated element) * * @param Number v The vertical alignment of the created date picker to it's associated element. Possible values are $.dpConst.POS_TOP and $.dpConst.POS_BOTTOM * @param Number h The horizontal alignment of the created date picker to it's associated element. Possible values are $.dpConst.POS_LEFT and $.dpConst.POS_RIGHT * @type jQuery * @name dpSetPosition * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('#date-picker').datePicker(); * $('#date-picker').dpSetPosition($.dpConst.POS_BOTTOM, $.dpConst.POS_RIGHT); * @desc Creates a date picker associated with the element with an id of date-picker and makes it so that when this date picker pops up it will be bottom and right aligned to the #date-picker element. **/ dpSetPosition : function(v, h) { return _w.call(this, 'setPosition', v, h); }, /** * Sets the offset that the popped up date picker will have from it's default position relative to it's associated element (as set by dpSetPosition) * * @param Number v The vertical offset of the created date picker. * @param Number h The horizontal offset of the created date picker. * @type jQuery * @name dpSetOffset * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('#date-picker').datePicker(); * $('#date-picker').dpSetOffset(-20, 200); * @desc Creates a date picker associated with the element with an id of date-picker and makes it so that when this date picker pops up it will be 20 pixels above and 200 pixels to the right of it's default position. **/ dpSetOffset : function(v, h) { return _w.call(this, 'setOffset', v, h); }, /** * Closes the open date picker associated with this element. * * @type jQuery * @name dpClose * @cat plugins/datePicker * @author Kelvin Luck (http://www.kelvinluck.com/) * * @example $('.date-pick') * .datePicker() * .bind( * 'focus', * function() * { * $(this).dpDisplay(); * } * ).bind( * 'blur', * function() * { * $(this).dpClose(); * } * ); * @desc Creates a date picker and makes it appear when the relevant element is focused and disappear when it is blurred. **/ dpClose : function() { return _w.call(this, '_closeCalendar', false, this[0]); }, // private function called on unload to clean up any expandos etc and prevent memory links... _dpDestroy : function() { // TODO - implement this? } }); // private internal function to cut down on the amount of code needed where we forward // dp* methods on the jQuery object on to the relevant DatePicker controllers... var _w = function(f, a1, a2, a3) { return this.each( function() { var c = _getController(this); if (c) { c[f](a1, a2, a3); } } ); }; function DatePicker(ele) { this.ele = ele; // initial values... this.displayedMonth = null; this.displayedYear = null; this.startDate = null; this.endDate = null; this.showYearNavigation = null; this.closeOnSelect = null; this.displayClose = null; this.selectMultiple = null; this.verticalPosition = null; this.horizontalPosition = null; this.verticalOffset = null; this.horizontalOffset = null; this.button = null; this.renderCallback = []; this.selectedDates = {}; this.inline = null; this.context = '#dp-popup'; }; $.extend( DatePicker.prototype, { init : function(s) { this.setStartDate(s.startDate); this.setEndDate(s.endDate); this.setDisplayedMonth(Number(s.month), Number(s.year)); this.setRenderCallback(s.renderCallback); this.showYearNavigation = s.showYearNavigation; this.closeOnSelect = s.closeOnSelect; this.displayClose = s.displayClose; this.selectMultiple = s.selectMultiple; this.verticalPosition = s.verticalPosition; this.horizontalPosition = s.horizontalPosition; this.hoverClass = s.hoverClass; this.setOffset(s.verticalOffset, s.horizontalOffset); this.inline = s.inline; if (this.inline) { this.context = this.ele; this.display(); } }, setStartDate : function(d) { if (d) { this.startDate = Date.fromString(d); } if (!this.startDate) { this.startDate = (new Date()).zeroTime(); } this.setDisplayedMonth(this.displayedMonth, this.displayedYear); }, setEndDate : function(d) { if (d) { this.endDate = Date.fromString(d); } if (!this.endDate) { this.endDate = (new Date('12/31/2999')); // using the JS Date.parse function which expects mm/dd/yyyy } if (this.endDate.getTime() < this.startDate.getTime()) { this.endDate = this.startDate; } this.setDisplayedMonth(this.displayedMonth, this.displayedYear); }, setPosition : function(v, h) { this.verticalPosition = v; this.horizontalPosition = h; }, setOffset : function(v, h) { this.verticalOffset = parseInt(v) || 0; this.horizontalOffset = parseInt(h) || 0; }, setDisabled : function(s) { $e = $(this.ele); $e[s ? 'addClass' : 'removeClass']('dp-disabled'); if (this.button) { $but = $(this.button); $but[s ? 'addClass' : 'removeClass']('dp-disabled'); $but.attr('title', s ? '' : $.dpText.TEXT_CHOOSE_DATE); } if ($e.is(':text')) { $e.attr('disabled', s ? 'disabled' : ''); } }, setDisplayedMonth : function(m, y) { if (this.startDate == undefined || this.endDate == undefined) { return; } var s = new Date(this.startDate.getTime()); s.setDate(1); var e = new Date(this.endDate.getTime()); e.setDate(1); var t; if ((!m && !y) || (isNaN(m) && isNaN(y))) { // no month or year passed - default to current month t = new Date().zeroTime(); t.setDate(1); } else if (isNaN(m)) { // just year passed in - presume we want the displayedMonth t = new Date(y, this.displayedMonth, 1); } else if (isNaN(y)) { // just month passed in - presume we want the displayedYear t = new Date(this.displayedYear, m, 1); } else { // year and month passed in - that's the date we want! t = new Date(y, m, 1) } // check if the desired date is within the range of our defined startDate and endDate if (t.getTime() < s.getTime()) { t = s; } else if (t.getTime() > e.getTime()) { t = e; } this.displayedMonth = t.getMonth(); this.displayedYear = t.getFullYear(); /* Patch Cedric Morin 2008-09-13 pour les controleurs inline */ if (this.inline){ this._clearCalendar(); this._renderCalendar(); } }, setSelected : function(d, v, moveToMonth) { if (this.selectMultiple == false) { this.selectedDates = {}; $('td.selected', this.context).removeClass('selected'); } if (moveToMonth) { this.setDisplayedMonth(d.getMonth(), d.getFullYear()); } this.selectedDates[d.toString()] = v; }, isSelected : function(d) { return this.selectedDates[d.toString()]; }, getSelected : function() { var r = []; for(s in this.selectedDates) { if (this.selectedDates[s] == true) { r.push(Date.parse(s)); } } return r; }, display : function(eleAlignTo) { if ($(this.ele).is('.dp-disabled')) return; eleAlignTo = eleAlignTo || this.ele; var c = this; var $ele = $(eleAlignTo); var eleOffset = $ele.offset(); var $createIn; var attrs; var attrsCalendarHolder; var cssRules; if (c.inline) { $createIn = $(this.ele); attrs = { 'id' : 'calendar-' + this.ele._dpId, 'className' : 'dp-popup dp-popup-inline' }; cssRules = { }; } else { $createIn = $('body'); attrs = { 'id' : 'dp-popup', 'className' : 'dp-popup' }; cssRules = { 'top' : eleOffset.top + c.verticalOffset, 'left' : eleOffset.left + c.horizontalOffset }; var _checkMouse = function(e) { var el = e.target; var cal = $('#dp-popup')[0]; while (true){ if (el == cal) { return true; } else if (el == document) { c._closeCalendar(); return false; } else { el = $(el).parent()[0]; } } }; this._checkMouse = _checkMouse; this._closeCalendar(true); } $createIn .append( $('
    ') .attr(attrs) .css(cssRules) .append( $('

    '), $('
    ') .append( $('<<') .bind( 'click', function() { return c._displayNewMonth.call(c, this, 0, -1); } ), $('<') .bind( 'click', function() { return c._displayNewMonth.call(c, this, -1, 0); } ) ), $('
    ') .append( $('>>') .bind( 'click', function() { return c._displayNewMonth.call(c, this, 0, 1); } ), $('>') .bind( 'click', function() { return c._displayNewMonth.call(c, this, 1, 0); } ) ), $('
    ') .attr('className', 'dp-calendar') ) .bgIframe() ); var $pop = this.inline ? $('.dp-popup', this.context) : $('#dp-popup'); if (this.showYearNavigation == false) { $('.dp-nav-prev-year, .dp-nav-next-year', c.context).css('display', 'none'); } if (this.displayClose) { $pop.append( $('' + $.dpText.TEXT_CLOSE + '') .bind( 'click', function() { c._closeCalendar(); return false; } ) ); } c._renderCalendar(); $(this.ele).trigger('dpDisplayed', $pop); if (!c.inline) { if (this.verticalPosition == $.dpConst.POS_BOTTOM) { $pop.css('top', eleOffset.top + $ele.height() - $pop.height() + c.verticalOffset); } if (this.horizontalPosition == $.dpConst.POS_RIGHT) { $pop.css('left', eleOffset.left + $ele.width() - $pop.width() + c.horizontalOffset); } $(document).bind('mousedown', this._checkMouse); } }, setRenderCallback : function(a) { if (a && typeof(a) == 'function') { a = [a]; } this.renderCallback = this.renderCallback.concat(a); }, cellRender : function ($td, thisDate, month, year) { var c = this.dpController; var d = new Date(thisDate.getTime()); // add our click handlers to deal with it when the days are clicked... $td.bind( 'click', function() { var $this = $(this); if (!$this.is('.disabled')) { c.setSelected(d, !$this.is('.selected') || !c.selectMultiple); var s = c.isSelected(d); $(c.ele).trigger('dateSelected', [d, $td, s]); $(c.ele).trigger('change'); if (c.closeOnSelect) { c._closeCalendar(); } else { $this[s ? 'addClass' : 'removeClass']('selected'); } } } ); if (c.isSelected(d)) { $td.addClass('selected'); } // call any extra renderCallbacks that were passed in for (var i=0; i 20) { $this.addClass('disabled'); } } ); var d = this.startDate.getDate(); $('.dp-calendar td.current-month', this.context).each( function() { var $this = $(this); if (Number($this.text()) < d) { $this.addClass('disabled'); } } ); } else { $('.dp-nav-prev-year', this.context).removeClass('disabled'); $('.dp-nav-prev-month', this.context).removeClass('disabled'); var d = this.startDate.getDate(); if (d > 20) { // check if the startDate is last month as we might need to add some disabled classes... var sd = new Date(this.startDate.getTime()); sd.addMonths(1); if (this.displayedYear == sd.getFullYear() && this.displayedMonth == sd.getMonth()) { $('dp-calendar td.other-month', this.context).each( function() { var $this = $(this); if (Number($this.text()) < d) { $this.addClass('disabled'); } } ); } } } if (this.displayedYear == this.endDate.getFullYear() && this.displayedMonth == this.endDate.getMonth()) { $('.dp-nav-next-year', this.context).addClass('disabled'); $('.dp-nav-next-month', this.context).addClass('disabled'); $('.dp-calendar td.other-month', this.context).each( function() { var $this = $(this); if (Number($this.text()) < 14) { $this.addClass('disabled'); } } ); var d = this.endDate.getDate(); $('.dp-calendar td.current-month', this.context).each( function() { var $this = $(this); if (Number($this.text()) > d) { $this.addClass('disabled'); } } ); } else { $('.dp-nav-next-year', this.context).removeClass('disabled'); $('.dp-nav-next-month', this.context).removeClass('disabled'); var d = this.endDate.getDate(); if (d < 13) { // check if the endDate is next month as we might need to add some disabled classes... var ed = new Date(this.endDate.getTime()); ed.addMonths(-1); if (this.displayedYear == ed.getFullYear() && this.displayedMonth == ed.getMonth()) { $('.dp-calendar td.other-month', this.context).each( function() { var $this = $(this); if (Number($this.text()) > d) { $this.addClass('disabled'); } } ); } } } }, _closeCalendar : function(programatic, ele) { if (!ele || ele == this.ele) { $(document).unbind('mousedown', this._checkMouse); this._clearCalendar(); $('#dp-popup a').unbind(); $('#dp-popup').empty().remove(); if (!programatic) { $(this.ele).trigger('dpClosed', [this.getSelected()]); } } }, // empties the current dp-calendar div and makes sure that all events are unbound // and expandos removed to avoid memory leaks... _clearCalendar : function() { // TODO. $('.dp-calendar td', this.context).unbind(); $('.dp-calendar', this.context).empty(); } } ); // static constants $.dpConst = { SHOW_HEADER_NONE : 0, SHOW_HEADER_SHORT : 1, SHOW_HEADER_LONG : 2, POS_TOP : 0, POS_BOTTOM : 1, POS_LEFT : 0, POS_RIGHT : 1 }; // localisable text $.dpText = { TEXT_PREV_YEAR : 'Previous year', TEXT_PREV_MONTH : 'Previous month', TEXT_NEXT_YEAR : 'Next year', TEXT_NEXT_MONTH : 'Next month', TEXT_CLOSE : 'Close', TEXT_CHOOSE_DATE : 'Choose date' }; // version $.dpVersion = '$Id: jquery.datePicker.js 3739 2007-10-25 13:55:30Z kelvin.luck $'; function _getController(ele) { if (ele._dpId) return $.event._dpCache[ele._dpId]; return false; }; // make it so that no error is thrown if bgIframe plugin isn't included (allows you to use conditional // comments to only include bgIframe where it is needed in IE without breaking this plugin). if ($.fn.bgIframe == undefined) { $.fn.bgIframe = function() {return this; }; }; // clean-up $(window) .bind('unload', function() { var els = $.event._dpCache || []; for (var i in els) { $(els[i].ele)._dpDestroy(); } }); })(jQuery);PKd\Vz"϶!formulaires/dateur/timePicker.cssnuW+Adiv.time-picker { position: absolute; height: 200px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #000; z-index: 99998; } div.time-picker-12hours { width:6em; /* needed for IE */ } div.time-picker ul { list-style-type: none; margin: 0; padding: 0; } div.time-picker li { padding: 1px; cursor: pointer; } div.time-picker li.selected { background: #316AC5; color: #fff; }PKd\'['formulaires/dateur/jquery.timePicker.jsnuW+A/* * Copyright (c) 2006 Sam Collett (http://www.texotela.co.uk) * Licensed under the MIT License: * http://www.opensource.org/licenses/mit-license.php */ /* * A time picker for jQuery * Based on original timePicker by Sam Collet (http://www.texotela.co.uk) * @name timePicker * @version 0.1 * @author Anders Fajerson (http://perifer.se) * @example $("#mytime").timePicker(); * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"}); */ (function($){ $.fn.timePicker = function(options) { // Build main options before element iteration var settings = $.extend({}, $.fn.timePicker.defaults, options); return this.each(function() { $.timePicker(this, settings); }); }; $.timePicker = function (elm, settings) { var elm = $(elm)[0]; return elm.timePicker || (elm.timePicker = new jQuery._timePicker(elm, settings)); }; $._timePicker = function(elm, settings) { var tpOver = false; var startTime = normaliseTime(settings.startTime); var endTime = normaliseTime(settings.endTime); $(elm).attr('autocomplete', 'OFF'); // Disable browser autocomplete var times = []; var time = new Date(startTime); // Create a new date object. while(time <= endTime) { times[times.length] = formatTime(time, settings); time = new Date(time.setMinutes(time.getMinutes() + settings.step)); } var $tpDiv = $('
    '); var $tpList = $('
      '); // Build the list. for(var i = 0; i < times.length; i++) { $tpList.append("
    • " + times[i] + "
    • "); } $tpDiv.append($tpList); // Store element offset. var elmOffset = $(elm).offset(); // Append the timPicker to the body and position it. $tpDiv.appendTo('body').css({'top':elmOffset.top, 'left':elmOffset.left}).hide(); $("li", $tpList).unbind().mouseover(function() { $("li.selected", $tpDiv).removeClass("selected"); // TODO: only needs to run once. $(this).addClass("selected"); }).mousedown(function() { tpOver = true; }).click(function() { setTimeVal(elm, this, $tpDiv, settings); tpOver = false; }); // Store ananymous function in variable since it's used twice. var showPicker = function() { var elmOffset = $(elm).offset(); $tpDiv.css({'top':elmOffset.top, 'left':elmOffset.left}).show(); // Show picker. $tpDiv.mouseover(function() { // Have to use mouseover instead of mousedown because of Opera tpOver = true; }).mouseout(function() { tpOver = false; }); $("li", $tpDiv).removeClass("selected"); // Try to find a time in the list that matches the entered time. var time = this.value ? timeStringToDate(this.value, settings) : startTime; var startMin = startTime.getHours() * 60 + startTime.getMinutes(); var min = (time.getHours() * 60 + time.getMinutes()) - startMin; var steps = Math.round(min / settings.step); var roundTime = normaliseTime(new Date(2001, 0, 0, 0, (steps * settings.step + (startMin)), 0)); roundTime = (startTime < roundTime && roundTime < endTime) ? roundTime : startTime; var $matchedTime = $("li:contains(" + formatTime(roundTime, settings) + ")", $tpDiv); if ($matchedTime.length) { $matchedTime.addClass("selected"); // Scroll to matched time. $tpDiv[0].scrollTop = $matchedTime[0].offsetTop; } }; $(elm).unbind().focus(showPicker).click(showPicker) // Hide timepicker on blur .blur(function() { if (!tpOver && $tpDiv[0].parentNode) { // Don't remove when timePicker is clicked or when already removed $tpDiv.hide(); } }) // Key support .keypress(function(e) { switch (e.keyCode) { case 38: // Up arrow. case 63232: // Safari up arrow. var $selected = $("li.selected", $tpList); var prev = $selected.prev().addClass("selected")[0]; if (prev) { $selected.removeClass("selected"); $tpDiv[0].scrollTop = prev.offsetTop; } return false; break; case 40: // Down arrow. case 63233: // Safari down arrow. var $selected = $("li.selected", $tpList); var next = $selected.length ? $selected.next().addClass("selected")[0] : $("li:first").addClass("selected")[0]; if (next) { $selected.removeClass("selected"); $tpDiv[0].scrollTop = next.offsetTop; } return false; break; case 13: // Enter if (!$tpDiv.is(":hidden")) { var sel = $("li.selected", $tpList)[0]; setTimeVal(elm, sel, $tpDiv, settings); return false; } break; } }); // Helper function to get an inputs current time as Date object. // Returns a Date object. this.getTime = function() { return timeStringToDate(elm.value, settings); }; // Helper function to set a time input. // Takes a Date object. this.setTime = function(time) { elm.value = formatTime(normaliseTime(time), settings); // Trigger element's change events. $(elm).change(); }; }; // End fn; // Plugin defaults. $.fn.timePicker.defaults = { step:30, startTime: new Date(0, 0, 0, 0, 0, 0), endTime: new Date(0, 0, 0, 23, 30, 0), separator: ':', show24Hours: true }; // Private functions. function setTimeVal(elm, sel, $tpDiv, settings) { // Update input field elm.value = $(sel).text(); // Trigger element's change events. $(elm).change(); // Keep focus for all but IE (which doesn't like it) if (!$.browser.msie) { elm.focus(); } // Hide picker $tpDiv.hide(); } function formatTime(time, settings) { var h = time.getHours(); var hours = settings.show24Hours ? h : (((h + 11) % 12) + 1); var minutes = time.getMinutes(); return formatNumber(hours) + settings.separator + formatNumber(minutes) + (settings.show24Hours ? '' : ((h < 12) ? ' AM' : ' PM')); } function formatNumber(value) { return (value < 10 ? '0' : '') + value; } function timeStringToDate(input, settings) { if (input) { var array = input.split(settings.separator); var hours = parseFloat(array[0]); var minutes = parseFloat(array[1]); var time = new Date(0, 0, 0, hours, minutes, 0); return normaliseTime(time); } return null; } /* Normalise time object to a common date. */ function normaliseTime(time) { time.setFullYear(2001); time.setMonth(0); time.setDate(0); return time; } })(jQuery); PKd\,,formulaires/dateur/dates.jsnuW+A/* * Date prototype extensions. Doesn't depend on any * other code. Doens't overwrite existing methods. * * Adds dayNames, abbrDayNames, monthNames and abbrMonthNames static properties and isLeapYear, * isWeekend, isWeekDay, getDaysInMonth, getDayName, getMonthName, getDayOfYear, getWeekOfYear, * setDayOfYear, addYears, addMonths, addDays, addHours, addMinutes, addSeconds methods * * Copyright (c) 2006 J̦rn Zaefferer and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net) * * Additional methods and properties added by Kelvin Luck: firstDayOfWeek, dateFormat, zeroTime, asString, fromString - * I've added my name to these methods so you know who to blame if they are broken! * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ /** * An Array of day names starting with Sunday. * * @example dayNames[0] * @result 'Sunday' * * @name dayNames * @type Array * @cat Plugins/Methods/Date */ Date.dayNames = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; /** * An Array of abbreviated day names starting with Sun. * * @example abbrDayNames[0] * @result 'Sun' * * @name abbrDayNames * @type Array * @cat Plugins/Methods/Date */ Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; /** * An Array of month names starting with Janurary. * * @example monthNames[0] * @result 'January' * * @name monthNames * @type Array * @cat Plugins/Methods/Date */ Date.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; /** * An Array of abbreviated month names starting with Jan. * * @example abbrMonthNames[0] * @result 'Jan' * * @name monthNames * @type Array * @cat Plugins/Methods/Date */ Date.abbrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; /** * The first day of the week for this locale. * * @name firstDayOfWeek * @type Number * @cat Plugins/Methods/Date * @author Kelvin Luck */ Date.firstDayOfWeek = 1; /** * The format that string dates should be represented as (e.g. 'dd/mm/yyyy' for UK, 'mm/dd/yyyy' for US, 'yyyy-mm-dd' for Unicode etc). * * @name format * @type String * @cat Plugins/Methods/Date * @author Kelvin Luck */ Date.format = 'dd/mm/yyyy'; //Date.format = 'mm/dd/yyyy'; //Date.format = 'yyyy-mm-dd'; //Date.format = 'dd mmm yy'; /** * The first two numbers in the century to be used when decoding a two digit year. Since a two digit year is ambiguous (and date.setYear * only works with numbers < 99 and so doesn't allow you to set years after 2000) we need to use this to disambiguate the two digit year codes. * * @name format * @type String * @cat Plugins/Methods/Date * @author Kelvin Luck */ Date.fullYearStart = '20'; (function() { /** * Adds a given method under the given name * to the Date prototype if it doesn't * currently exist. * * @private */ function add(name, method) { if( !Date.prototype[name] ) { Date.prototype[name] = method; } }; /** * Checks if the year is a leap year. * * @example var dtm = new Date("01/12/2008"); * dtm.isLeapYear(); * @result true * * @name isLeapYear * @type Boolean * @cat Plugins/Methods/Date */ add("isLeapYear", function() { var y = this.getFullYear(); return (y%4==0 && y%100!=0) || y%400==0; }); /** * Checks if the day is a weekend day (Sat or Sun). * * @example var dtm = new Date("01/12/2008"); * dtm.isWeekend(); * @result false * * @name isWeekend * @type Boolean * @cat Plugins/Methods/Date */ add("isWeekend", function() { return this.getDay()==0 || this.getDay()==6; }); /** * Check if the day is a day of the week (Mon-Fri) * * @example var dtm = new Date("01/12/2008"); * dtm.isWeekDay(); * @result false * * @name isWeekDay * @type Boolean * @cat Plugins/Methods/Date */ add("isWeekDay", function() { return !this.isWeekend(); }); /** * Gets the number of days in the month. * * @example var dtm = new Date("01/12/2008"); * dtm.getDaysInMonth(); * @result 31 * * @name getDaysInMonth * @type Number * @cat Plugins/Methods/Date */ add("getDaysInMonth", function() { return [31,(this.isLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()]; }); /** * Gets the name of the day. * * @example var dtm = new Date("01/12/2008"); * dtm.getDayName(); * @result 'Saturday' * * @example var dtm = new Date("01/12/2008"); * dtm.getDayName(true); * @result 'Sat' * * @param abbreviated Boolean When set to true the name will be abbreviated. * @name getDayName * @type String * @cat Plugins/Methods/Date */ add("getDayName", function(abbreviated) { return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()]; }); /** * Gets the name of the month. * * @example var dtm = new Date("01/12/2008"); * dtm.getMonthName(); * @result 'Janurary' * * @example var dtm = new Date("01/12/2008"); * dtm.getMonthName(true); * @result 'Jan' * * @param abbreviated Boolean When set to true the name will be abbreviated. * @name getDayName * @type String * @cat Plugins/Methods/Date */ add("getMonthName", function(abbreviated) { return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()]; }); /** * Get the number of the day of the year. * * @example var dtm = new Date("01/12/2008"); * dtm.getDayOfYear(); * @result 11 * * @name getDayOfYear * @type Number * @cat Plugins/Methods/Date */ add("getDayOfYear", function() { var tmpdtm = new Date("1/1/" + this.getFullYear()); return Math.floor((this.getTime() - tmpdtm.getTime()) / 86400000); }); /** * Get the number of the week of the year. * * @example var dtm = new Date("01/12/2008"); * dtm.getWeekOfYear(); * @result 2 * * @name getWeekOfYear * @type Number * @cat Plugins/Methods/Date */ add("getWeekOfYear", function() { return Math.ceil(this.getDayOfYear() / 7); }); /** * Set the day of the year. * * @example var dtm = new Date("01/12/2008"); * dtm.setDayOfYear(1); * dtm.toString(); * @result 'Tue Jan 01 2008 00:00:00' * * @name setDayOfYear * @type Date * @cat Plugins/Methods/Date */ add("setDayOfYear", function(day) { this.setMonth(0); this.setDate(day); return this; }); /** * Add a number of years to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addYears(1); * dtm.toString(); * @result 'Mon Jan 12 2009 00:00:00' * * @name addYears * @type Date * @cat Plugins/Methods/Date */ add("addYears", function(num) { this.setFullYear(this.getFullYear() + num); return this; }); /** * Add a number of months to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addMonths(1); * dtm.toString(); * @result 'Tue Feb 12 2008 00:00:00' * * @name addMonths * @type Date * @cat Plugins/Methods/Date */ add("addMonths", function(num) { var tmpdtm = this.getDate(); this.setMonth(this.getMonth() + num); if (tmpdtm > this.getDate()) this.addDays(-this.getDate()); return this; }); /** * Add a number of days to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addDays(1); * dtm.toString(); * @result 'Sun Jan 13 2008 00:00:00' * * @name addDays * @type Date * @cat Plugins/Methods/Date */ add("addDays", function(num) { this.setDate(this.getDate() + num); return this; }); /** * Add a number of hours to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addHours(24); * dtm.toString(); * @result 'Sun Jan 13 2008 00:00:00' * * @name addHours * @type Date * @cat Plugins/Methods/Date */ add("addHours", function(num) { this.setHours(this.getHours() + num); return this; }); /** * Add a number of minutes to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addMinutes(60); * dtm.toString(); * @result 'Sat Jan 12 2008 01:00:00' * * @name addMinutes * @type Date * @cat Plugins/Methods/Date */ add("addMinutes", function(num) { this.setMinutes(this.getMinutes() + num); return this; }); /** * Add a number of seconds to the date object. * * @example var dtm = new Date("01/12/2008"); * dtm.addSeconds(60); * dtm.toString(); * @result 'Sat Jan 12 2008 00:01:00' * * @name addSeconds * @type Date * @cat Plugins/Methods/Date */ add("addSeconds", function(num) { this.setSeconds(this.getSeconds() + num); return this; }); /** * Sets the time component of this Date to zero for cleaner, easier comparison of dates where time is not relevant. * * @example var dtm = new Date(); * dtm.zeroTime(); * dtm.toString(); * @result 'Sat Jan 12 2008 00:01:00' * * @name zeroTime * @type Date * @cat Plugins/Methods/Date * @author Kelvin Luck */ add("zeroTime", function() { this.setMilliseconds(0); this.setSeconds(0); this.setMinutes(0); this.setHours(0); return this; }); /** * Returns a string representation of the date object according to Date.format. * (Date.toString may be used in other places so I purposefully didn't overwrite it) * * @example var dtm = new Date("01/12/2008"); * dtm.asString(); * @result '12/01/2008' // (where Date.format == 'dd/mm/yyyy' * * @name asString * @type Date * @cat Plugins/Methods/Date * @author Kelvin Luck */ add("asString", function() { var r = Date.format; return r .split('yyyy').join(this.getFullYear()) .split('yy').join((this.getFullYear() + '').substring(2)) .split('mmm').join(this.getMonthName(true)) .split('mm').join(_zeroPad(this.getMonth()+1)) .split('dd').join(_zeroPad(this.getDate())); }); /** * Returns a new date object created from the passed String according to Date.format or false if the attempt to do this results in an invalid date object * (We can't simple use Date.parse as it's not aware of locale and I chose not to overwrite it incase it's functionality is being relied on elsewhere) * * @example var dtm = Date.fromString("12/01/2008"); * dtm.toString(); * @result 'Sat Jan 12 2008 00:00:00' // (where Date.format == 'dd/mm/yyyy' * * @name fromString * @type Date * @cat Plugins/Methods/Date * @author Kelvin Luck */ Date.fromString = function(s) { var f = Date.format; var d = new Date('01/01/1977'); var iY = f.indexOf('yyyy'); if (iY > -1) { d.setFullYear(Number(s.substr(iY, 4))); } else { // TODO - this doesn't work very well - are there any rules for what is meant by a two digit year? d.setFullYear(Number(Date.fullYearStart + s.substr(f.indexOf('yy'), 2))); } var iM = f.indexOf('mmm'); if (iM > -1) { var mStr = s.substr(iM, 3); for (var i=0; i]hYʮzUkwm<(;PKd\G$  "formulaires/dateur/inc-dateur.htmlnuW+A PKd\0?z formulaires/recherche_ecrire.phpnuW+A ($lien ? $lien : generer_url_ecrire('recherche')), # action specifique, ne passe pas par Verifier, ni Traiter 'recherche' => _request('recherche'), 'lang' => $lang ); } ?> PKd\/I%lang/spip_bonux_it.phpnuW+A 'Mostra il calendario', 'annee_precedente' => 'Anno precedente', 'annee_suivante' => 'Anno successivo', 'annuler_recherche' => 'Annulla la ricerca', 'bouton_fermer' => "Chiudi", 'erreur_date' => 'Questa data non è corretta', 'erreur_date_corrigee' => 'La data è stata corretta', 'erreur_heure' => 'Quest\'ora non è corretto', 'erreur_heure_corrigee' => 'L\'ora è stata corretta', 'mois_precedent' => 'Mese precedente', 'mois_suivant' => 'Mese successivo', 'id_rapide' => 'Inserimento rapido', 'pages' => 'Pagine', ); ?>PKd\d-#Ѱlang/spip_bonux_en.phpnuW+A 'Show the calendar', 'annee_precedente' => 'Previous year', 'annee_suivante' => 'Next year', 'annuler_recherche' => 'Cancel the search', 'bouton_fermer' => "Close", 'erreur_date' => 'This date is incorrect', 'erreur_date_corrigee' => 'The date has been corrected', 'erreur_heure' => 'This hour is incorrect', 'erreur_heure_corrigee' => 'The hour has been corrected', 'mois_precedent' => 'Previous month', 'mois_suivant' => 'Next month', 'id_rapide' => 'Quick add', 'pages' => 'Pages', ); ?>PKd\.lang/spip_bonux_ar.phpnuW+A 'عرض الروزنامة', 'annee_precedente' => 'السنة السابقة', 'annee_suivante' => 'السنة التالية', 'annuler_recherche' => 'إلغاء البحث', 'bouton_fermer' => "إغلاق", 'erreur_date' => 'هذا التاريخ غير صحيح', 'erreur_date_corrigee' => 'تم تصحيح التاريخ', 'erreur_heure' => 'هذه الساعة غير صحيحة', 'erreur_heure_corrigee' => 'تم تصحيح الساعة', 'mois_precedent' => 'الشهر السابق', 'mois_suivant' => 'الشهر التالي', 'id_rapide' => 'إضافة سريعة', 'pages' => 'الصفحات', ); ?>PKd\Mlang/spip_bonux_fr.phpnuW+A 'Afficher le calendrier', 'annee_precedente' => 'Anée précédente', 'annee_suivante' => 'Année suivante', 'annuler_recherche' => 'Annuler la recherche', 'bouton_fermer' => "Fermer", 'erreur_date' => 'Cette date est incorrecte', 'erreur_date_corrigee' => 'La date a été corrigée', 'erreur_heure' => 'Cette heure est incorrecte', 'erreur_heure_corrigee' => 'L\'heure a été corrigée', 'mois_precedent' => 'Mois précédent', 'mois_suivant' => 'Mois suivant', 'id_rapide' => 'Ajout rapide', 'pages' => 'Pages', ); ?>PKd\Vdemo/noeud.htmlnuW+A[(#REM) Squelette (c) xxx Distribue sous licence GPL ] #CACHE{0}
    • #ID_RUBRIQUE

    • #ID_RUBRIQUE
    • PKd\S3622demo/boucle_et_saut.htmlnuW+A[(#REM) Squelette (c) 2009 xxx Distribue sous licence GPL ] #TOTAL_BOUCLE:#COMPTEUR_BOUCLE:#ID_ARTICLE
      #TOTAL_BOUCLE:#COMPTEUR_BOUCLE:#ID_ARTICLE [(#SAUTER{1})] PKd\Whwwdemo/boucles_iterations.htmlnuW+A #CLE/#VALEUR
      #TOTAL_BOUCLE
      #CLE/#VALEUR
      #TOTAL_BOUCLE
      #CLE/#VALEUR
      #TOTAL_BOUCLE

      #PAGINATION

      #CLE/#VALEUR
      [#TOTAL_BOUCLE/#GRAND_TOTAL]

      #VALEUR
      PKd\8W[Y Y demo/boucles_tableaux.htmlnuW+A[(#REM) Attention #ENV est un tableau serialize, et echappe, donc inutilisable Preferer #ENV* ] #TOTAL_BOUCLE items dans l'env
      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      #PAGINATION

      • #CLE=>#VALEUR

      #CLE=>[(#VALEUR|var_export{1})]

      #CLE=>[(#VALEUR|var_export{1})]

      #CLE=>[(#VALEUR|var_export{1})]

      a}> #CLE=>[(#VALEUR|var_export{1})]

      • #CLE=>
        • #CLE=>
        #VALEUR

      Tableau GET

      #SET{test,#ARRAY{1,2,5,6,3,4}} #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      Par cle

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      !Par cle

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      Par valeur

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      !Par valeur

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR

      Pagination #SET{test,#ARRAY{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}}

      #PAGINATION

      #COMPTEUR_BOUCLE) #CLE=>#VALEUR
      [#TOTAL_BOUCLE/#GRAND_TOTAL]
      PKd\![[demo/boucles_si.htmlnuW+A vrai_avant vrai vrai_apres faux
      vrai_avant vrai vrai_apres faux
      {5}}> vrai faux
      PKd\J^&&configurer/pipelines.phpnuW+A"; } } return $flux; } /** * Proposer un traitement par defaut pour les #FORMULAIRE_CONFIGURER_XXX * * @param array $flux * @return array */ function spip_bonux_formulaire_traiter($flux){ if ($form = $flux['args']['form'] AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction charger() ) { // charger les valeurs // ce qui permet de prendre en charge une fonction charger() existante // qui prend alors la main sur l'auto detection if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true)) $valeurs = call_user_func_array($charger_valeurs,$flux['args']['args']); $valeurs = pipeline( 'formulaire_charger', array( 'args'=>array('form'=>$form,'args'=>$flux['args']['args'],'je_suis_poste'=>false), 'data'=>$valeurs) ); // ne pas stocker editable ! unset($valeurs['editable']); // recuperer les valeurs postees $store = array(); foreach($valeurs as $k=>$v){ if (substr($k,0,1)!=='_') $store[$k] = _request($k); } $trace = spip_bonux_configurer_stocker($form,$valeurs,$store); $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true); } return $flux; } /** * Retrouver les champs d'un formulaire en parcourant son squelette * et en extrayant les balises input, textarea, select * * @param string $form * @return array */ function spip_bonux_formulaires_configurer_recense($form){ $valeurs = array(); // traiter d'abord le cas fichier yaml de description // TODO // sinon cas analyse du squelette if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') AND lire_fichier($f, $contenu)) { for ($i=0;$i<2;$i++) { // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees // permet de trouver aussi les name="#GET{truc}" if ($i==1) $contenu = recuperer_fond("formulaires/$form",array_merge($valeurs,array('editable'=>' '))); $balises = array_merge(extraire_balises($contenu,'input'), extraire_balises($contenu,'textarea'), extraire_balises($contenu,'select')); foreach($balises as $b) { if ($n = extraire_attribut($b, 'name') AND preg_match(",^([\w\-]+)(\[\w*\])*$,",$n,$r) AND !in_array($n,array('formulaire_action','formulaire_action_args')) AND extraire_attribut($b,'type')!=='submit') { $valeurs[$r[1]] = ''; // recuperer les valeurs _meta_xx qui peuvent etre fournies // en input hidden dans le squelette if (strncmp($r[1],'_meta_',6)==0) $valeurs[$r[1]] = extraire_attribut($b,'value'); } } } } spip_bonux_configurer_lire_meta($form,$valeurs); return $valeurs; } /** * Definir la regle de conteneur, en fonction de la presence * des * _meta_table : nom de la table meta ou stocker (par defaut 'meta') * _meta_casier : nom du casier dans lequel serializer (par defaut xx de formulaire_configurer_xx) * _meta_prefixe : prefixer les meta (alternative au casier) dans la table des meta (par defaur rien) * * @param string $form * @param array $valeurs */ function spip_bonux_definir_configurer_conteneur($form,$valeurs) { // stocker en base // par defaut, dans un casier serialize dans spip_meta (idem CFG) $casier = substr($form,11); $table = 'meta'; $prefixe = ''; // si on indique juste une table, il faut vider les autres proprietes // car par defaut on utilise ni casier ni prefixe dans ce cas if (isset($valeurs['_meta_table'])) { $table = $valeurs['_meta_table']; $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:''); $prefixe = (isset($valeurs['_meta_prefixe'])?$valeurs['_meta_prefixe']:''); } else { if(isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier']; if(isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe']; } return array($table,$casier,$prefixe); } /** * Stocker les metas * @param $form * @param $valeurs * @param $store */ function spip_bonux_configurer_stocker($form,$valeurs,$store) { $trace = ''; list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs); // stocker en base // par defaut, dans un casier serialize dans spip_meta (idem CFG) if (!isset($GLOBALS[$table])) lire_metas($table); // le casier peut etre de la forme casierprincipal/sous/casier // on ecrit donc au bon endroit sans perdre les autres sous casier freres if ($casier) { $c = explode('/',$casier); $casier_principal = array_shift($c); $st = isset($GLOBALS[$table][$casier_principal])?$GLOBALS[$table][$casier_principal]:array(); if (is_string($st) AND (count($c) OR is_array($store))) { $st = unserialize($st); if ($st===false) $st=array(); } $sc = &$st; while (count($c) AND $cc=reset($c)) { // creer l'entree si elle n'existe pas if (!isset($sc[$cc])) $sc[$cc] = array(); $sc = &$sc[$cc]; array_shift($c); } if (is_array($sc) AND count($sc)) $sc = array_merge($sc,$store); else $sc = $store; $store = array($casier_principal => serialize($st)); } $prefixe = ($prefixe?$prefixe.'_':''); foreach($store as $k=>$v){ ecrire_meta($prefixe.$k, $v, true, $table); if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ $trace .= "
      table $table : ".$prefixe.$k." = $v;"; } } return $trace; } function spip_bonux_configurer_lire_meta($form,&$valeurs) { list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs); $prefixe = ($prefixe?$prefixe.'_':''); if ($casier) { $meta = spip_bonux_lire_config("/$table/$prefixe$casier"); $prefixe = ''; } else { $meta = spip_bonux_lire_config("/$table"); } foreach($valeurs as $k=>$v){ if (substr($k,0,1)!=='_') $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:''); } } /** * Lecture de la configuration * * lire_config() permet de recuperer une config depuis le php
      * memes arguments que la balise (forcement)
      * $cfg: la config, lire_config('montruc') est un tableau
      * lire_config('/table/champ') lit le valeur de champ dans la table des meta 'table'
      * lire_config('montruc/sub') est l'element "sub" de cette config equivalent a lire_config('/meta/montruc/sub')
      * * $unserialize est mis par l'histoire * * @param string $cfg la config * @param mixed $def un défaut optionnel * @param boolean $unserialize n'affecte que le dépôt 'meta' * @return string */ function spip_bonux_lire_config($cfg='', $def=null, $unserialize=true) { // lire le stockage sous la forme /table/valeur // ou valeur qui est en fait implicitement /meta/valeur // ou casier/valeur qui est en fait implicitement /meta/casier/valeur if ($cfg AND strpos($cfg,'/')===false){ return isset($GLOBALS['meta'][$cfg])? ((!$unserialize OR ($t=unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t) :$def; } // par defaut, sur la table des meta $table = 'meta'; $cfg = explode('/',$cfg); // si le premier argument est vide, c'est une syntaxe /table/ ou un appel vide '' if (!reset($cfg) AND count($cfg)>1) { array_shift($cfg); if (count($cfg)) $table = array_shift($cfg); if (!isset($GLOBALS[$table])) lire_metas($table); if (!isset($GLOBALS[$table])) return $def; } $r = $GLOBALS[$table]; // si on a demande #CONFIG{/meta,'',0} if (!count($cfg)) return $unserialize ? $r : serialize($r); $deserialize = false; // on ne deserialise qu'une seule fois... while($casier = array_shift($cfg)) { $r = isset($r[$casier])?$r[$casier]:null; // deserializer tant que c'est necessaire if (!$deserialize AND $r AND is_string($r) AND (count($cfg) OR $unserialize)) { $deserialize = true; $r = unserialize($r); } } if (is_null($r)) return $def; return $r; } if (!function_exists('balise_CONFIG')) { /** * #CONFIG retourne lire_config() * * Le 3eme argument permet de controler la serialisation du resultat * (mais ne sert que pour le depot 'meta') qui doit parfois deserialiser * * ex: |in_array{#CONFIG{toto,#ARRAY,1}}. * * Ceci n'affecte pas d'autres depots et |in_array{#CONFIG{toto/,#ARRAY}} sera equivalent * #CONFIG{/tablemeta/champ,defaut} lit la valeur de 'champ' dans la table des meta 'tablemeta' * * @param Object $p Arbre syntaxique du compilo * @return Object */ function balise_CONFIG($p) { if (!$arg = interprete_argument_balise(1,$p)) { $arg = "''"; } $sinon = interprete_argument_balise(2,$p); $unserialize = sinon(interprete_argument_balise(3,$p),"false"); $p->code = 'spip_bonux_lire_config(' . $arg . ',' . ($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')'; return $p; } } include_spip('inc/config'); ?> PKd\HI>ffimg_pack/message_ok-24.pngnuW+APNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڴV[lTEgl{.hu[`|^KDb| LQ1HB[J =vw9m42ɗ3s,R\=bm%8Np5K MBCJR=$=exLB\htm-^-N)k/1dE!]^x~un"Rc+x_npPֆ=Gƺm:yVK%?HeSwwzdK@gf֋6 ] )=j/H Gr B70On]iTLUwi[B;N|Q6r}x:7kcήPXCэͮiͦt?Eo As=-OsTEi<+h1w"e0aYP`(Bz~PG!h]毸ν=WӾkǮLzAS RT6s% J<7кs_:4Cz>pUOP,y : z0 +WpCsOU8ρრ ;IFc_# B&FD7!srb;%V q1;CN*|@Wɍi$gu?o\(T c( zzQpbko&d: 8ZĖsC.Ld7ULҀY|n3 /K1Jsļ<e7.&C9+(\\6?~B1'qJR(6_p$":A2nz>3Y^/{ei]z3aD.[;㩾+WCV5,[tUV:8UZ5OnmK58VxIENDB`PKd\E(img_pack/tri_desc-12.pngnuW+APNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<pIDATxڔJA^L2I& 74.D=(x%g_%{Q/xP (4$$L/gbCSEWuU7 YzI:;5]QF]{mo ) D"1 >ΐvxozQ3JDLB O#en*xi|\J 4(,|[P䨍>l KC~e.,Rh3c-^!8-9 88n$Rx+Yg~b8jt\,WC#5(V;鞳/Ue[OgfK>Jw߯-叽b IENDB`PKd\ )img_pack/tri_asc-12.pngnuW+APNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<~IDATxڔRJA}=$3Ѡ"*!q' "WE?D<'xP/!( dIzk E׫W^7 9媝7-h_@Fpwսu ZkUeDlKdʚɛn.307>*!§[Gz}]I(,dG!}T\sM!|xy#,@ } Nf+-+1)N#MRT&IMrwE4(_@aaB{0{am@2^M]i/qǴ 0DNF"\b[CD&y:0X`#Kq%EFcj&w5 HIENDB`PKd\Q[;;img_pack/item-add.gifnuW+AGIF89axXj"o`aX{ޱք|8ߛfϩ{ޫ]X١Rj*`\m*֣n%nt._Sp)l$漘kgedgQ֞rd|_Nŗb^]ԁ׍X⭰ՄQ׎ہ@]n֢{:[cwPȕx3^Ԃ{6ޭi"ת_at׊ҫe"j#ܩ؋јRi!l#]!x,xxv.uF*B3PI2n ]AGgmR=eE! #0oqH&OMV;4 7_Kh<[ 5+"$> ^LJ`t'W1a/T (,slZCk-Xbd%86)N?\@:cwij9 "@3p9E"J<;PKd\EMimg_pack/item-remove.pngnuW+APNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<jIDATxb\ a¢˗%L  +O̿?83aJDD3S"Ab@,&I& S&%0 㗕5cdaQaۂ[Wbgaɓ9 /vmſ1.f)I:ӵ@ǎrh&3<e?=0020022FkOӲg~߷~trb{}%P#&fVYcN4~jڵ+Wn=z$&kd T(.C{T220//a'#8YX9A&1 %)u]1IENDB`PKd\ img_pack/deplier-droite.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxē=kPOb !Hfա\:=?%c;BB;7cIR?wys¬V+8fp~nJe,B4bH8u dYrx.H D"UU+lϱHbP(R Ɛ1Zc'rF8NWO&e˲.Z6j*@aof2t:Pׯ߷V`6<-@ xLg!vb%l:Bu: Un{z "zF"VA;!3R~au;b+;H5Msl6o&IxT3prD ؾido`: IENDB`PKd\ܟimg_pack/frame-close.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe<]IDATxSK@}lD/&9Aq?\ x/!&Y^E'IOWC$3Ƃ"U^_ 1:ΛmM,ECt:L&_2zQ$p8nǣ(xqs{8yv ~cPUF`AlvMg\.sPt:0h~/`XZ n%+t] ^J%& GViv)S8k6T*p]rY), z͆jIyڿX À"Vx<iLZ!4|`bTb IENDB`PKd\ܑNimg_pack/tri_asc.pngnuW+APNG  IHDR Vu\tEXtSoftwareAdobe ImageReadyqe<IDATxڔRKJAgbD%(_D"JP7x\yBqčј`4?Q3Ӿ HoU59;L9@޽f*c 73ea8\v?L#7O-XC5ѰFE$Gc\"…w\qSZ[+T||n a[ ɥp})D\3Y$+l-RQ";5G("u\I  ]]l6Qowpzy CAM A#rHCZZXB@C7hS k؎kG$'N3[W,d (ިן g'Z:8nrZPjg^R}(h~o!ȅIENDB`PKd\D??img_pack/deplier-droite.gifnuW+AGIF89a.ѬںҠͮשŒۼܙ鹹任ؘɕ!.,\@pH,GHi2@ RW Ce0LPV KA9Vl! kE )TL Y&LYGA;PKd\gPOTTimg_pack/message_notice-24.pngnuW+APNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڴVk\Uνy3INTCh \tX\ t&ip+",i6-4dfޏ{yeL&郏yͽ|=RkS#5|=_LT|@lTṰA8Nś /?G'8M~7* &~u6l/H#BN.ȼ_!]W! QI _D$\<,*o/EE1GXBЉrHgB%%Gj/.⋟J]>PjB%&SCS: WO:1,!0.p|hu ?"N$?TtS % \G>H߆` hp7X$@OUIb{|шf &m){GEqbFM̤~Q(œ0EfKsq(iBGVFdZ9jll:d>(Bu1=a< Vo9CYikJX0HA-z|xgZ7 2bBߨB۵:H%Hdl)2>%&)d=[\n}q3{FeAXř^!_1lܨ:ߑov̨`+A1_SL],93&78].F dkEn6,| "rH3I4PNՒT*Ew:LZ0\WZ!Z-d2tXBsG,E"=1LX,EVݮ~<iM5go T.I^W$ l6otXMٌN'<t:l6Ԇak{map;m"dA.yZ3D|>O'Q+OcC`@ @ N$v>Ec7߂P($ -wB_&#u~H='m (H&>7 wWh2^A!ɼgpp/&--q]WuIENDB`PKd\k$kkimg_pack/article-12.pngnuW+APNG  IHDR agAMA7tEXtSoftwareAdobe ImageReadyqe<PLTEhhh}}}rrryyyzzzttr..,TTUXZNۼgepiAC4]]]蕕"1beZ򪩲ccckkkv}N _bO''&^aONPDDG*sssljwghhWWUE츸_j8CCĆSVNnmmߔvvvYWtRNSc5IDATx,E@Gpw)9t+5"G~N9( eB AkK'!o>>em3ZnM3?i^fbcP5PQ4Rغ*iYgTXiN"91(Y IKD P?K6NBG+ѡq]r3rƷ|qƫY$ 4$;cXt ssϥz'JhH!) ڱrb-~A췐FYe,<.W#VaԴȒ •OJҲĮh>Ͳ-Kk)t|uY'AD/羁bJ,1s9_y E6%,Thc'b} Ο&ECLSuHpnAcB%/T*hnFs--'F$U7 a WpL5G-Vx-ax-nt& ??:HE5Ƞ.Rqau1z!_N#[9cq'MGiq q`(KbV@cE jUu8億qK`/yM('֜!$OXVT' UJj&)C7Ѽ_)qxDgqFhju{@|BGHQ!ҺD>9^[˜{DƳ):r1qbCm)aet8hU]!KCCyWo2Xp h!jSgX])nF[ +y#w Yt)z9—m8?Il PVUjD^Τh6B?,̞O.]D5]\*xp {PĞȿ*Sl$ N3)FT#U.ވAvLT=xxy\`sERo7b?َN \5 Ol=XU5> /# 5VO%M :p)=Jro6<ހ䅟!v@\[ڝEVlU,}rWkTeGSC؉VKu[i-!g}O %?f)?S-!D 8>᧴rZSj77nT߮tLw0- F%p #(o0OӶn*fr| H)iv.ǐh"$7ه7;TUtwoL Gnx}7߹Wge og!TCigdeGgp)M!#-d aV|$uJ Rk2ȸ>:2 ' hE&MwХi (CG+7~~= H-s1yH79*l1Mkf_ 9x.P#c?(o׷~QdqxN2yxQC܈D^aai2o>Rd"&lH݅f`b}균ßUL^tbךFScޏ?b8PWԇOˣ?"1h Qv|wZ*eor 'SB {!HID2b"|!l@6~P/`OSa"jhHDzH p7 `{nտPrYМO$a]x`#|jh:+ j`/7J ijo|{,x-TN.&qL;S|fvX ށ_pGJ7FI!f+l+h8ʴ(sX"+F3oeTOĴ5-2WkyHzY0k?Aj/ 'I<_= b~'5'Kn!Yr'h_Fsx|>͉Wq09e愉Ҡ|f+TqX8HèB48**BO Jp ͤLME^:Ghx8?btQVC+ Ph~3n3{ߓx7W'}嵼7cP0j7^7Xj\nE7FV| mO#N&Y!oOH`n(&lXf ?iFz_kUy ?AG5@ON/"[뒱A S$1U> ,4Co=E\!RsC?^3I|t)| G,![,* fJҼSG5qUu jM (P}&F wpJN R:=m3/ cq ,5e5RMmJ WpG}4cդwdBKY-0{D=HmP,DڋD]Ѐ $kC8PzsufuPa𧆢~ }C{[_9+y[_isS%ġ1.tKJFzSxieu||Rdz!ƚ6zhd8B'?mCXH#Pq Ch6I2ĖH0ED(Xls} AKE9CCDK*YF}!" J`$V4Z 8&-l~ Ķ%o?lmVE:tߛ7U Ae8ʑ97vύ| pKaG:::v&M,C-bH P"U[P㮃5+;}$$)7TZ7@p`5Xg~,.T*uF-O~9tۏ^ K"kd0ҎĐS>!A5Q (!]JQ*T#TE sb N}_\F6z{a?=QLMA DwOrx촂\O˕=Oz85,T]YŽCTu2H/ުUz'NV`NX" ի5?]CդQwi#<ⷾA3bg p;Ԥq$Y$LE|()J鵠$KSۂh'6P&E?$5PC!pâ|?~7|ϰc~I%jN]j3|~ý3.>97j ')U2sUƞAJBgJ*ԃ zϖjvCn7ET"J*:!=t\)zX$flkV85l.  "ED~2 F@*-jB )$z,VV EpF*#R"EȂAH).E2ov$6,tFkŖ?=@T@޳OT/1{`oN.DUDT&4 QDHe6l8V#1 4$nI#La ;*>RM$@٫,bKo&)ow S6S-:h7Jk ,9 *e$&0۸{wQ`fS֪2M^[۴dbsY)h)rFʊP2Rq]pUA3Ď9J6paYy)҆)H?DX$"呄A WkR JTCu5$_$I[X?1RB22㒋H5'77R ONߩN~c媎g <!cOt8K)v⏏xFH5a!)M#Z|}0L&46fTJ/_&1_i'Ɇ 4}hCbL_&_ l;N<_⯰g FYƌ\yub8PiKm$1ad[aVi2M|cǻfEU+d2 VD/Hl( Eh -2#(IUM1Ma I=*pϼ3MGW-|䳏bn,D)02ܴl@)'MPj,{tX׫;0R,t&2R-׃jm-W<`jW|l& äF`tQh/{GLJ[f=x0֍ z >rutҧ%8ńK; <^qbe\Vptv3~e)ա]%WuҪ1bU#C/vm3StAk]:eL8WПMCxf&F<ۆ;:\(NSoqk)Mǭ#}IoG6N3azc57u{BYn%%-qщ}> kxJsGAcg@ BުNf_|^P^a4i$[n,8 *qI(7i?3D#TZqOmJj &Pà9˙D:2[H#"Q,ÿ3|[uzrK3} n`Ps8OG)-(4r9YP*#V?b w]/꠬m~{ Gl- sd FWaTZyFuNKV{R(&_]U:j-Osj@99kE% )9x%3^%C;1ЋV\9,$y򪮮s=~ сa2:Ιzkq4V(.^+ Ӭh& 29)7]p Ur5[DSKS.%2dN%|=-nh-S[Dzx&l6_ .C<鿅P 6r]֛0tjP9Ɏ͉iG᱂1(꙯cS%uDEFNV8ݞ69R2AS,)G" /)| ٜtbh&*2krDg P Q\<5Q`)뼨z\(KZ dJuB6f;qV{Ci1QbT~+^qpxA_\W=-Up0s o].]?o[6c@Y֌iDPexç ' 'pBiف 2Id"lcGq}]F#374B'@F1d%#ߕ0Gm8*_D͸RD z Z*Yazeץ`Aed_L PQ*kQ]aXQQAwq^x<0ՇLUxΜ|{%2B.D)hä݊ AbYbBKi=[:oލq< 7Ћ $؅PJ o4)e\6,n:0.#I6;͜;E֋0]@#? %>\B1P[KD>Hl{"t$T%q[%޸M^/QRsMI+a Bj$7ψ2P2,E^V:d4ɪ59>2@~+b +߼y((eTdzJpV5+E4-F1A WB_4թҽIQ(B3(zɚq&9IB+&+@E;,9yԱx#)0XWfbz:&e "\S]%J̜-Q֎n3·B-#E &#P,%v'DQt(edjC&\UTx&uUZ #>F~)]8#Up`Qm*H%`ZsWmqm7G0.ZFu|w1vNDHo6 x<V ,b_.:2e]4pG^nV~kS+{ fW#V`iX[VU1E=`6lIe-CedA>+,FDk4F~2 Vk(Ouk:Rj#D%;,y}%S)T[8(vQc0W+I&#@q">=Et’]'CD-'-D\R%Zd%[)-U|;g*+$p2DXװoC-y4̡a!gr|>gr: (ٸZ¥硷-aD&2o]%zxv2,"/{1.Ed)NSO1uO)@ԋU=y _-T,E4b?k,4+'P=9FIE=7ușȀCsk>P^d+]V5+T1O'ZbO R>%{ @46=E]n[JG^[%1:ћ:qEE(Hro,F"fiI0kb. ȕ2:/LLRwЛ؊*<2\l.?$똸GWXdqϱ <ScAkkduZP`$dS^(Rô۾I"bUj%lch +<0@(M].+ElHEzN$i@LTR&*)n`XdTa(ydjD=/d ;O{4gjFz|Ly1s AU ߵa-Mug,nQrgz~,wrMi\&E1:1 #m: k0ޱc^qTT Wmr!3Oonh[xL/wТ!DI2ЮN7o.>& G(4* bMSe}ҕh +6.*#(qG"I*5/9eC7qjF>'֛ 0'Us^aX320Ox݀ZTbEUF[vчS[j D0!3"d@'9if΂c'w߄ǵ=x GgژÚboY^߁M ³ oR|q+`-d+gk(}̙%?emMO`D'z:rL V5WEX+ǖp`b2+J2x[*0hɾ+R89?˹,>!5քS3z,A+e 'fTC<5 SӔ?2Sd]' 0nކ߁j{.NPDH"-ka`'޵艙0 ,׳%[yvL0q#+aX S <톒|{:EHdI9T#[RN4aR", Z&LOcѐ?8D`%#QxFfL†k}QϓTqXB6BtQMrw"'7&#rCnd-^M.Z<"q $!IM)mSC|@ '):+8aɽA_ל2T˶CDNMe)1e0b(!Kd d:}ؚѰ3-O*RER™f]7&G.CֲC2q&S5RiuyEJ\҈žws`{Qf"r%(W4\ݍ8j4TrҫccZT; Í㸈Q@2zU G>ڞ"O)oN*&pXː#X.:Sq}[gp!@;q1 Y-b_W]/ny+峍z^xr^1ǹ2xVBq%ֻM!6Q6AeA$A"տ0_Wυ\P2;8eb[cQa #9}MBD[k_@WLTP;W8]5Dt(׽*&N&*::ϾGl;V:L654ͣ| _h(+&va-,z?)禾^3y+SaC07/+-YLz`+5G69Y.^[26^vpzq7z,\v ¢%!LK03v)u#09nYwQ} r-7<3 fXLQ*E0[k Yo]o.\)X-[A};VeĤFzU2keZoO@%Xƅfc4OST̶vVӋjB (A-PG/-=-Op6]#q ёv 7!sLD _l!KYBZ~!nv({Ҫ C,H-ԵTfC%]AyAL,Y*W2x7#ҴMs5xdMA^8CX2Mʬ,o=eH:[ z1UNv(JP"-&Qms6i\V/VB7lhe.k( ttQ[}pܚjoqQZ d8yJάѳ]K _Xe82YC|2VI pèAr={>daE4ڒUƼ)w9i۽{qxc7f+3aaYj+>=MoPJ`޹$Z"X^;ce({j}KGpBB괸ɶ=5n+rJIR$뢭 E=67nL2X)QcF(bXGYtI$tD@grdˈ_,2/jH֑y}&@P-ʔ2J|_,Ϋ:Er17.)H󑕊ʚ$4isܗi9$F-tj6bϣ!L9y|猆} נE4XL-|@(;b `_+4g+ڡ.n-}tDiLR?{E % tk+gIosH6֞ 8Vr *Vm_8secs4n,-!tE,C7r *ɸ Rq s3ccn1(P$ce)/يu#su,"Zc=ж s864FRgv\ |}kC@V0 _% k[=4g3HGF1rDp}.=N//a3Su5ɞ- q/߷ώ/.^*ԼDaKgFSlx}a<ؔ~U(ZQgcFt@/ws #Ydw}B/wl% B/v':wX=#1tQZH2a*qC r.k56%h_ch{29aDs"O ^/}9YZY%nDJً\jޱn[dl.xEݓ_ :8@={^;/|Esj ϫ1ʅ #/(™ j彋HP{ MH֙X) 3KsiLWlT$؀;iu=BWDDT?X 1sߤ-79}X͙k+Ѥ; ͹qCUj@u27Й3߀>yo}~ϐ5<ߧAf;q15}uLyP|5Qѫ^ [5jZhK [mzS_H8_هeGl& {Cu8>V(7FF~MJh1P0좤_{Tɡ-zy.v5lhjQS 5b`M`_װ)2\^LWWS$6'}~鄍]XF2x&=L&߀6Ԍ*+䖖aDCr 7o݈ g#6sa{?gswZY6ڽP  щ%el,_Dc<@w WҘh)(sbpu[ \\܌E i/F-ܲ+[FcTbOm9IFT/Q5`xKݔ+:ulNtFeJjÇKFn/6w"s^>Y+֎ B @2)3mx$Q3_?\}gF #ϩ'i[5ZA 0<#’hsb+*+K`XѰ6mJWt@Üǖ:g1q D3Ko#Z0ЗǶ4v&!uNɋW:&qce) Ykc*y2}.^Z3p.rשҧɀ@[3Me"+@kŤ*bvn=ߴ;,wq,bلX:Sz|`QMϞہ:hGt@[<?N똷J@m j>E#~ĩɀqtM( {.J%W|8AYz{'|sâ-* lb'nwOؿ$ hb2>#<%4mQ@&`2:h׹8ʵ6}'o7ldU(<n_;™XV 7Vݺ \@.NRZqyy#[ҸV{u_RPBGqG|ĉ|G5 $2e')(5jij{r_]wQ{+9ՀRWKh2V:"`+Y5륽*^l^ yBs|Z2<&nf73 Nb҆'O4MC[EH6ȥ\/~!u'kuvVĩ >K8`hR(cF`j!+EE(rW Bܾ``)o"d_dZ+ 29~ /^E"<[w\=8dbç :bM`\Nt`h#`U+b1WZAi ;bK m)Y<ȳr^> *4̙": ҙZz #x p6&άV󐏛*[H݊͟$G[qػׅOSן.V<|t#*]،uX *>>e,@(I]lD157>YS\jQ0yKTP:T!DakYtJ= WGds'B}~PN%p9RhD ,sDD "R]BiH*3<*j 8RUᣳd4ۃeBl'&A66dqp_;)sdqeА5W[NEx5T-A&F *^tգςפ@Aըb2.K$4 qG,mBcSX. Xu)*b1pYz덒ll(8t`X*qME;luԳr^Z1 X$ WEwR0D}x͐_݂-<=oGͣvm$6Qd؋&&?" dGIUn4 JC&&(CdQ0Q 0YMܷƓ7r "JO{-}PQS,)U yPnvCVz.WoJ`PUzV'#expbǗeE]&nǐ8uц55αA&*ҭ*X|f!{  ϓW|_S/i: .q"& Er/L%%R7Zv;-S3jbhQG%&%DXb{X("#e`^̼zZc@@L=gVRBiJFAZjIX8UEM"azK ,P 5$qO)moJ#z{ǻI"Nʡ״{-Kx鈎zaoY;l^$!cMcDɃ¿2ia:̦\ZaVv7-=q&FyzW6h R H`.:{R8]B~4+*<:P@u~K:ԓЄgs$Fir"(V RD0\QܡB.B L|bw5 gdSL-a4okz J cO5L gYYXF]P# V*OX(/Č518 UC"BVfϐLccoI ?Q]US8sFz$v0\H;O!9䱦;۽]qũ(Ȏ_l$=9w_,?ϳz@)I$X,T-(d 9])M0qYQ+ݙ0ڗK-l=RSp.$Sڤ )1 + f L)1AGr;LB0zASFTEjOxAtY􍼯 fˣhbr2ݏ5nؑK)]ШxhGw ]Ty!XAj֙P3xR܄]ܴK4PFE},i S}߇x<')cͽOI2" ӫ5Z VCF'Ë'+EO@7ʐgdS0wGm4yU!rLEBD%N\i}X$Yu3 a4O4L'sFqh,ݬ E8;V#|;jq]'E,+-ayB^%PZ›)^;ZOVװ8UY 8ΠIbz!Ŋ"s(m"Tm7E *C2^'̿?` I毄mîTD1h0[E&u ]]:޴H[e\-fM%3S8#A &$.2 LZf#Mr:cH[9ڀ\5@:.DMUI6XPqDs@7on;@Mֳ |S_=3K[q{VA4r.{,o3(ӻ-ёݵ46;B#ۯpD @ م.$q6i)"r0-&lYIX 2s>cv7k,-'~\*>QRep" *^T@.feR!' |D#rB$suT7bQ!c=I;{ܭ(z 8Fw6 thҥ0VIyҐ#X x6s>1CT gs 6tȜȂO* }7]$PL]nT;h_V߉Ah*ٹpI. bCx1t=oN7WC& B?gg2SF7AQkOMTt zN&RCҺ$X,ä~ւV U[h_`OcI!>\IhUMcfQaJj_>ግ,HO!Cwr{2 NȈXPIOrUnC&-%PH9V r ҤaI~X t2yxDyDĸ1_$!)'S: c3I#7"k* =g`JK|%v^>0N?-|pLq?u{,XjAƚL-0i^إ60l@~۰ցM(4\^D,<"QIM5Kidt, q:I#G yq" mjje M.ZB֙؊˂[E,uI{Ti+NpyzkppڂZiA7Q%eW@##ܧwnE J"'Qo:fyZqZ# BNG^pUɌ"UVr?Lzdj,r!yrR*x!O8yg~\J3!d:k:"nKKI3p]GH} {PE7pi? +٤{z|#Zi"Xʷ'5j$JHR'=a#t(ۭnz&-t'+DH"v?cVK&0%yn${hVٸ@a i&5a 5FD %26W`#jT^cZ ~ONǦCc%n.rVP16H҆m6XFu7|A4K/{3Ut7iÖ@蹐.nGȊ, <`-ȆA#ӵ:rqIB%لάE+{0}Jb{Cٰf_B&rVI-!Ihp$Pɇhb|aHkA@= !b(`okB.MaHFC'D|Yf}y܎bc} nY;<"%!+v" }Nud=̟y~U'Aw֐]cH;-sΑYNxD]!vrpYGӰfHw!|Y?|-OA ꣑-?,Y\B__1]0vws L37HP 5kLgAkO .@V &3/))B_|*';IJ̿c_AB]r8(R+u'GiwlH{{2Q;BtƹhU_'+  v#_̃oy%8Ck~ ^C:Ŀu7WB>fM3(\>4^?!O@^r. c<8 #-; 8}Y:<i^L ]SD܈|WLה# 32h=   OHK1%$!RiEsH,%pWiAPQn {nߥ=z.6_K%$ʓ(N3Mnx^x KdBoFl7/F:%i~WC[v<#璏 _~[ՠv.mwXGBKJ7@`!-@zpTgEMn3i>xo8%eJ|&Op)BcI+XM3 5Dq dK ='S~wnBΧ{O7ekWwظv8} "i>݋5f CRɳWI3z/ۯ@§ 0)4vox =S0'aD_[_zQqk` A?|9:vϐBv X%cND4yVC!ۏO_VS)>pzBZး@x7hҁTxLK۪dAcܤ):zLH}:sa|d [ʥQ UCz)P_ ~dT /v=woZdN3ǞwށAć!bȧ. |r+><׭GCG&ݭテϼ vi= LGj릑9tT(SD 냲p,g?k->>a e}k,jGB6Iz(1>ˇhJai:RaIӂ9d;}uWX{2ѷE&d5kə!$OϗMtl9|=FC62) L-$e`۷ath+^JX& ǐ-"|l+P?|)_?߉R oBDͩ*zՐ[/^="h#,[w8U]Ə_~נ@z ??92$LerԌ.w=+aƻ![IVA{̮@n2Z׵'PgT(ϫD棠5}ä0H /S r饗>KY٪Wހ'j *d2R+G? a8~%NM q"'PI R9-rܗT< Fx7$6:bV$uCʙ']1 7G`ºx&j5!u䍖aW?  Fw==@gO$As'!,ɐ_s )zvX ?VF~Ge? /@xv itSQ͈$+"- 9OԵXu~y%H1:.:Hv&D{1zI~7la7Sa( A98k?<7Wm?A [ qp*:CdT\BHH0%t{ i9py* P]}58I0lRݩ'h2Geٛ፬PVt;p/ f3q$Ɵdrr^"ݬBo–((yx e#nތ-\0>#2c9 s6f"3C.y9f.wG_]Wyþg@!3Fs2i׮ȹg!ј#T;K^1#tdmv:Ia oa$)HwZ 3vZ(~~s/2k0b_4\.r(P"X aY-aqt8o@a@+ssNSڵjQpE4 +hFܼg`::>a*x#/job£!IO<|PO[AdjHo{Z*r:i{ٓǎ7rm|/ןM@ڿ[0{IPY89|܏$PB# ?sڱDsCWDB=9. O7#:| :? z/ՇanB# rG$_[Z,V6vEPNx܂ۊ .UFg[')i3!B ONX7] :I vx%2K_//ؿ| C Q`~jwq ݉Үu2 ?6@pgWs4 XFw^%IIbj4+M.=)Xvg8E xjtJ }?5:"ӟDk({-!yJ AxhoAcj8PD /6 WðN{֠WUi+Hu89;# 4Plt'}M=)Zy |JW^Σ/| ;1[$ d7s^ B%H=t |LZ7dDC+jxugèCG~3>OI@μ (UQ/W+Gq9>wVRƊsɱ1 $ˆ_x;ț&ԱPx&(bmCh(UD}dRCYe.T*5t@pĤm$VA_0|7:iEKasAJDǢNpީ[vKPnŷѽی 4܆)Œ!Ҙ汄}^Mͦ_|;/Sc$z)C%g#Ŕ=M-<?b!f&a_ ŒA)̲>HFJs+ai7()]:4#7Ā k'1B_:KN6' 8 c=<4:#3C^aN#!{C(jJ M5E@P)t)@Ry`3߄_!=ՄsPE8w=Tݙ8 FĦ[3"W'h0Oho7ql-0Rir4:Z&3p*mf\H !0F|5BCʮ~Kat7;TQEDM"?{y)t1]_η̡1;s1Hm&]4wnE*XK*w!25N-M Gݱp1 D9R 㤑$Rjرs Ð( .FQH"$ b1k?r!kEt2hmwjd~z/S ۍL E߆8ȧP{d##ҁqӲhp`޶;d$kEH\mHZX ^Yp3 b/7B'=$J_:.G\+oObGދ 90\@"@vmO6=91RI>yCah3+#醍2{% yHaAj* H}/E`gXv0pWݰyzfĩXǿi|v(Əy3 NmF`f%Uۀ[c0caG8;EѲ# }"/1I` ;x#>cq_t:t&whG}I"ǔHu란q7i uo *4}#_u*"LmTʣ?{cH 40<5,{ ~:t"PKlhL"XT5d:N ,.ãPn_bs0O9@'Sڟҗ1+N^݅NSAgꓟ֛oCފ?4rvgD_CtΝX #?F}7wnK>a2O;"7`W1KPƑitO7)BgSܼB!W(E/,(z{jDN-$PGUgcmλ> ߂cUQ?p}w?gnu& -w܂׽ |o+l?7^r ǿWdž?"B-,jw!wO-gzPJnYWBu=eޢ1uÑ*x4lȪ()a/QL=$̦ c&?|kD:$5sSr^8)-R WIkM)^<'wa?V!WRɌ"H1!KD&I C\~\@BqkM'?f&@@o'iTxAWr;aא Dw===/}vԝ+(]H?Qx }!wC◰W%ûrk^IVp!lq?-=5* ʞ 9%"A/Bl) j3uu 9 /Џ+mO!ɯ{.&'PD4RUhyPn>{1={ nnFȌvdtd<٢Xnнӧl72c OE0JHx?y߂橷`/Z_'7]̍7Gi]2%|.U~(Z{C*7Э_ ! vW7ݯ!3ѭks74z{wK0oCHتz͐a:\1)o* B1']QZCUzt:SA^~Ni3(#6|80%y<+vmL%nSTNK-T*R);i{* v d29Kf+qJݦKh]\CO[ Qo;[ρp'6QGonTMt՟C=l4?)-SPk Q×bt9ՐN] V{up7U}[aF_ {{29!~=?t[<믣Aؒ4mi$0'ZYUGO"X$AY&@9aPJrzF=P#i47\[iٚtw ֮1|9GJ vL E۳|VDj,nZGZ{Oa[ +v^/؍i8U>򙋡EXjy@6MI4rpHK З+B|Π> +5Da[_4{'4>y"I@:4, ir_В(ݽ̺;on^#tCk&3ng*5%2*!g/#4Y &cN"0gM0S,z}PKoɳZ)ml VO۪`,B.S9 $# 5]J!řN:흁vwxj':6ܹ؞=9LMd!tEEgL JݐLdeBdǭTp> ɯ!t|t7vnFWZ$M6Љ7zVz¿pn ZDIus<ʦS[y2Z ^J&3Gf2$*2R{RLJ?3BIg*L&2IJ+lVFt6T Ń0&XP]-<␶&mUf%(7>:`'U,II zwT/]$K`Urb8) QtNѱq 58?0wsI^ڊ2"ɬxdn;,Mt4):3eM<_HyԏFizU\zԫo\:بZ>J}c-w0E&^CfT˄쩤d WS1%k`B7$5}eHF8Hӑ!{na@EÁf1".m'ѷ|JQ(_TnC3L]6ye&4a5)4i1:`i @0`9wp S%sqNh\)"g=pa[ЂJ́}հQd8@Q^} w^ D~Ck_:4i- \N=$.,){}g G'E& A"1'6I`&%+~hܠcdEΰ%s&1MJPP1MwPR49|` d n俹dY~ J^t!뻓UILxp0;i|#g8yn=i_M L Bg`)) p̧Յ߃t)nL/51]HR?NkbIc};dFI3~^4%N2;Xd,,3"҂,s:^kpޫ/95,33}i5dl13V\^mRϾ"O0m>O={[8|3OHdHH$PM4!R^'qڜ؋e?C%GcpT,+Ÿ"RḌE># Ceɴ 8Ç-G&NBT*uPy 16ֹ?%ɵ\;2it9_⠱rڧ]#<*JHfGΐUtJk]}rBbzn}ӕ݆ZVc]bInb4j0 I`f7E4iIaUlJ UBJaIi&Ρiڜtiy;ӽ㤃Kf]p .q[4[!<53Npi,UC D54M'f/. \sDzaOULhaq+^G#|Nf.(UVxwi2 M \=%+aɚn;$+Y1IyxB<*:!CZs25 r@\N}4ua L#0Ձ3^ZU63x1MHΩ =3 T=5m6)8=(`"At:d^}]RJD=x3i~KM&k͢}cQRtL9<姞|5 >d+qCOFCZUl\N#q)ڠ8&%BގPtD3Mt\K9ž̸6{QwTUXsh* 3UtUZӽ L͈~U 6xӢgƐldiPzy52P*)O1:bCWS?8-zVBFSErIؓYj8-Ɋ`0H"'\Cq(AKHF. r2e33U^d{E˶4-s;Jj{Z-fIW\}&#IQAb/&9$$`aLs>RR9!amLIIElJ{)Md H 3t8ۜ N7, e9hnT:`aa^Iouh{yCX~Z MMӕFLU`E/ڶ`Jd}@$ӭJOBP:#15 Bq l5;u#!!O ;SyI&1,7 |t? mMZUm sfp#3[۩!]5YCt h7e*C/R<k2(C. K眒⸂!lCܨ݈q͆Y/E/ū/j1rFz:GXnuH {/ jѺf7b5Ui$`MhV SZF/Wk!Mmpo$V6sa17^g2 T-D!J; y'4kZDN!~Z_NzZD*wMtPAa2Epf%-$jOkPzYm6@H3[}Mf9 X pLiST򛒢pŒ0-ih:crٟ&%6v/[g<2\Z*h<*-rٙ::K t4!4z >#//<<|/PRhyC`:#NHIEf/:Tt0ymj&ݑbȢelTEbd)+Z pN"L(&|H$4!b!'#u0B}vIa<9!95GA$hF&7AgY\z :W\@wz^$U͐ 6k(H3[ZpAX01\Bo>`Q9zFeUqBQDHz<ބC?@IC7 g;b %e$UXq1銚d{*8b"!\ *`F%vgH-D=͐[HwݨZh'ۖsXlpg֡8>r݃Hu$M+F1LN O?$:oi[f+^ #qV-"%qDՍXp1\T ELh'+qI+(fmfm\sTt1RMA|yT%1,;jeɴp:s3\ȒdΨHC &Քǎ;9+6aXP"W-܌q+^ `etT%4]6YQ^)o율:"qR0;1$ *rOS\Є\5Ap2 NӦ ^LOiCBx8LI~GhvaThHYpX ghvVSߗ;I6KRXlfP dT^:O~QJ܆L=BkΦ5=WOxAkI{WffD% rB7&K$vA)WDJI,;h#D͊(F69q4@^[wʂ2MR0.6MH槻n1y%DIJfP:MT EI'tD1TVXIQၬ#D3D3/ 2֢AršT5S1.b-8*Uc= @{ EPS!u:$->✙\ѨD gΜΞol'\& 4ƀzoTJKrY!~Ș'Ui7 a/6o͹}1NcOk+ Ogɿ,OxHAmz XW6WT V7`% YU qzڞMu7EcsJ-JZ.F~1}oXtc$a.N3(vmpvxx^: 2<2=_rp\Mʶ33˗IL\ &t"3 HW~! 7~nEaȲˆvWix˃@67!C>}XVACrH D4^>0=0 eb(D,@+Wp~>~'9 n>?Ƈ)O $]SPmT{Hnbr$hWXtUNr \&(O9UPwyMi oC [Pb j Kk)[!ᾏyEg'>ɑ zϧĊ( -QCÛ_q(z4MK?}s^x#n@L( I<{Ƭ29N |Pdh bZ=Ph3{!vUhI7ԓd UUS .xܐX4>o1 Ka"7;PI ]*d=cзhD RtۃXn}2[l`ޡrToM ?L@7Y9!X,Rpтlʖ~cWFOR0˂2 =P LzTDGQ+d,l02F^H _ %ғ֠'cfxN0O =p9p-L*,Ϲ$oX>L#Mfv9ۻ#D'I-EtLr߾ܔ2xi؝S-FvN L< |S f '+͋bOlL'J]Ф̳U&=gNS=B`IENDB`PKd\8img_pack/logo-bonux.gifnuW+AGIF89aBͮ5..'%_n[W.LϲMFH)\ݭa#)c6.Aog_4ɶuAHȼBETvnsxxrEnV2Eg.-KON^7hϻi3/27,@3L$Xs@22[ U aLxޱ:+XRk  : "^pltԡ$@"ŤXD% LiDԸzЃl'o.8XdC@fЁl lQ ,X,?PD/RV24@[P! ^8}SR5F3څ[BtH2`"(c}'Br# bP<9RP:a lCռzxk!ϲx(8 ;"S|vR"-Fm0 Pr )@{6|h=PQ cZBkyB4OVn ~dɱ(irD t6`: p' 8XE0R!b-PV$'' 2@O30 RS PU"aX`tr#31FW* p`Z }0feV)`~*06 Sk3h p(SQ-N9~Uo `o]EARCr &*gGvxGWz݇)@ p?^`222p.@  2s9f:=&]Uc6&T_-`+p&. 8Hr~IM%_@9pG7 &Rzc71HAayձ_7"sp Ix8 [x)Kl  ) H` ^#06Pd!`O3V0d$@!2X!cE=s$NeJWfv|476^u;4x: Z8͚%ي%.:-0\(qqiiK1;;@Lh+ٻ8P<~ [ʝft9զ(K㲖 {[k|+T2pc0?;ϴN'}Cċ.. Ss`m)'PIq%DɹYA;p[0`2`(}0 z)_ &0-69o ]~##OȰfA?^mo i=W ЮAPV*q.ST8g΍$8H (0Ls'_΍fM߷ pe\ "M%pS]γHw=piT fh(B`6itzb+T Ax+K`MdFfM@Q~H[ ;PKd\vuggimg_pack/tri_desc-16.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe< IDATxڤSMkQ=ot&mM]BL16P?/7.% TDFl 6!561ޙ؊dysODQQ=}SNM?] RB2x^RQ܋f*"ۂ 3mQ?? PR\LXo< ⏯* CHmۖ|8xZcc`t. 4pf=cr~ճ3ӈUf?6 ) #&=_b2Շ:[]0{b2TorCLq8 ~!#>WJ*WD[b7|mpX RίC -'3L+РݾTAbS),*h7;/||kvw5='[, hNka{Ǚ{ 6kĮ-ӳb+'rPA/rQg;9w*7+!Ou11خz|Ƒ 07 IENDB`PKd\:Ɠimg_pack/item-add.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe<0IDATxSkA]r1;ϯ FQ")QQAR5 jP*H^&ϹY,-Syy#qc3BIa.Wёϕu|;^4۟<{ݲ߅B/}#VM^.' ӌDF:V嵟(U@ܶw&/DR&h]3ٺh]OqQVطU~s;ϡV9?74;C3 ?Ae5@iEL (`*dm(>q6`0= CBW<\g<{s #r8>PA'Vi O8^Cb/Mx}n!Σ\ڋ[gW`6B(L孥lR7ټ3L>`Ű&]Y?pwB~4V.,0U{E '*@v]w1\Ə HH̄%t4{i$s<<I'Q[^y8g^*=J7bcOvQqF+Iq6@IENDB`PKd\.ajax_item_pick.htmlnuW+A[(#REM) Squelette (c) xxx Distribue sous licence GPL ][(#HTTP_HEADER{Content-type: text/javascript[; charset=(#CHARSET)]}) ]#CACHE{3600}[(#ENV{ref}|picker_identifie_id_rapide{#ENV{rubriques,0},#ENV{articles,0}})]PKd\wPPspip21/inc/couleurs.phpnuW+A array ( "couleur_foncee" => "#999966", "couleur_claire" => "#CCCC99", "couleur_lien" => "#666633", "couleur_lien_off" => "#999966" ), // Rose vieux 2 => array ( "couleur_foncee" => "#EB68B3", "couleur_claire" => "#E4A7C5", "couleur_lien" => "#8F004D", "couleur_lien_off" => "#BE6B97" ), // Orange /* 3 => array ( "couleur_foncee" => "#fa9a00", "couleur_claire" => "#ffc000", "couleur_lien" => "#FF5B00", "couleur_lien_off" => "#B49280" ), // Bleu truquoise 4 => array ( "couleur_foncee" => "#5da7c5", "couleur_claire" => "#97d2e1", "couleur_lien" => "#116587", "couleur_lien_off" => "#81B7CD" ),*/ // Violet 5 => array ( "couleur_foncee" => "#8F8FBD", "couleur_claire" => "#C4C4DD", "couleur_lien" => "#6071A5", "couleur_lien_off" => "#5C5C8C" ), // Gris 6 => array ( "couleur_foncee" => "#909090", "couleur_claire" => "#D3D3D3", "couleur_lien" => "#808080", "couleur_lien_off" => "#909090" ), ) ,true); ?>PKd\4՞spip21/style_prive.htmlnuW+A[(#REM) Ce squelette definit les styles de l'espace prive Note: l'entete "Vary:" sert a repousser l'entete par defaut "Vary: Cookie,Accept-Encoding", qui est (un peu) genant en cas de "rotation du cookie de session" apres un changement d'IP (effet de clignotement). ATTENTION: il faut absolument le charset sinon Firefox croit que c'est du text/html !