Trac is being migrated to new services! Issues can be found in our new YouTrack instance and WIKI pages can be found on our website.

LocalTracChanges: ticketdeleteplugin_0.11_working.patch

File ticketdeleteplugin_0.11_working.patch, 62.1 KB (added by datallah, 15 years ago)

Patch to bring TicketDeletePlugin? up to date with Trac 0.11

  • ticketdelete/web_ui.py

     
    11# Ticket deleting plugins
    22
    3 from trac import __version__ as TRAC_VERSION
     3from genshi.builder import tag
     4from genshi.filters import Transformer
     5from genshi.filters.transform import StreamBuffer
     6
    47from trac import ticket
    58from trac.admin.api import IAdminPanelProvider
    69from trac.core import *
    710from trac.ticket.model import Ticket
    8 from trac.web.api import IRequestFilter
     11from trac.web.api import ITemplateStreamFilter
    912from trac.web.chrome import ITemplateProvider, add_script, add_stylesheet
    1013from trac.util import sorted
    1114from trac.util.datefmt import to_datetime, utc, to_timestamp
     
    2124class TicketDeletePlugin(Component):
    2225    """A small ticket deletion plugin."""
    2326   
    24     implements(ITemplateProvider, IAdminPanelProvider, IRequestFilter)
     27    implements(ITemplateProvider, IAdminPanelProvider, ITemplateStreamFilter)
    2528
    26     # IRequestFilter methods
    27     def pre_process_request(self, req, handler):
    28         return handler
     29    # ITemplateStreamFilter methods     
     30    def filter_stream(self, req, method, filename, stream, data):
     31        if filename == 'ticket.html' and req.authname != 'anonymous':
     32            ticket = data.get('ticket')
     33            if 'TICKET_ADMIN' in req.perm(ticket.resource):
     34                self.log.debug("TicketDeletePlugin adding 'Delete' links for ticket %s" % ticket.id)
     35                add_stylesheet(req, 'ticketdelete/ticketdelete.css')
     36                buffer = StreamBuffer()
     37               
     38                def insert_delete_link():
     39                    try:
     40                        cnum = list(buffer)[0][1][1][0][1]
     41                        if cnum == "description":
     42                            return tag.a("Delete", href=("../admin/ticket/delete/%s" % ticket.id))
     43                        else:
     44                            return tag.a("Delete", href=("../admin/ticket/comments/%s?cnum=%s" % (ticket.id, cnum)))
     45                    except:
     46                        return ""
    2947
    30     def post_process_request(self, req, template, content_type):
    31         if template == 'ticket.html' and 'TICKET_ADMIN' in req.perm:
    32             add_script(req, 'ticketdelete/ticketdelete.js')
    33             add_stylesheet(req, 'ticketdelete/ticketdelete.css')
    34         return template, content_type
    35  
     48                filter = Transformer("//div[@class='inlinebuttons']/input[@name='replyto']/@value")
     49                return stream | filter.copy(buffer).end() \
     50                              .select("//div[@class='inlinebuttons']") \
     51                              .append(insert_delete_link)
     52        return stream
     53
     54
    3655    # IAdminPanelProvider methods
    3756    def get_admin_panels(self, req):
    3857        if 'TICKET_ADMIN' in req.perm:
     
    4463       
    4564        data = {}
    4665
    47         data['href'] = req.href('admin', cat, page)
     66        data['href'] = req.args.has_key('referrer') and req.args['referrer'] or req.get_header('Referer') or req.href('admin', cat, page)
    4867        data['page'] = page
    4968        data['redir'] = 1
    5069        data['changes'] = {}
    5170        data['id'] = 0
     71       
     72        deleted = False
    5273
    5374        if req.method == 'POST':
    5475            if page == 'delete':
    5576                if 'ticketid' in req.args and 'ticketid2' in req.args:
    5677                    if req.args.get('ticketid') == req.args.get('ticketid2'):
    57                         t = self._validate(req, req.args.get('ticketid'))
     78                        t = self._validate(req, req.args.get('ticketid'), data)
    5879                        if t:
    5980                            self._delete_ticket(t.id)
    6081                            data['message'] = "Ticket #%s has been deleted." % t.id
     82                            deleted = True
    6183                           
    6284                    else:
    6385                        data['message'] = "The two IDs did not match. Please try again."
     
    6587                if 'ticketid' in req.args:
    6688                    req.redirect(req.href.admin(cat, page, req.args.get('ticketid')))
    6789                else:
    68                     t = self._validate(req, path_info)
     90                    t = self._validate(req, path_info, data)
    6991                    if t:
    70                         data['href'] = req.href('admin', cat, page, path_info)
     92                        data['href'] = req.args.has_key('referrer') and req.args['referrer'] or req.href('admin', cat, page, path_info)
    7193                       
    7294                        deletions = None
    7395                        if "multidelete" in req.args:
     
    86108                                    data['redir'] = 0
    87109                   
    88110               
    89         if path_info:
    90             t = self._validate(req, path_info)
     111        if path_info and not deleted:
     112            t = self._validate(req, path_info, data)
    91113            if t:
    92114                if page == 'comments':
    93115                    try:
    94                         selected = int(req.args.get('cnum')) - 1
     116                        selected = int(req.args.get('cnum'))
    95117                    except (TypeError, ValueError):
    96118                        selected = None
    97119
    98120                    ticket_data = {}
    99121                    for time, author, field, oldvalue, newvalue, perm in t.get_changelog():
    100                         c_data = ticket_data.setdefault(to_timestamp(time), {})
     122                        ts = to_timestamp(time)
     123                        c_data = ticket_data.setdefault(ts, {})
    101124                        c_data.setdefault('fields', {})[field] = {'old': oldvalue, 'new': newvalue}
    102125                        c_data['author'] = author
    103126                        # FIXME: The datetime handling is not working - enable
    104127                        # for traceback
    105128                        c_data['prettytime'] = strftime('%a, %d %b %Y %H:%M:%S',time.timetuple())
     129                        c_data['ts'] = ts
    106130                   
    107131                    # Check the boxes next to change number `selected`
    108132                    time_list = list(sorted(ticket_data.iterkeys()))
    109                     if selected is not None and selected < len(time_list):
    110                         ticket_data[time_list[selected]]['checked'] = True
    111                     data['changes'] = ticket_data
     133                    #selected isn't necessarily the same as the index because of temporary changes
     134                    changes = [ticket_data[time_list[i]] for i in range(0, len(time_list))]
     135                    if selected is not None:
     136                        for change in changes:
     137                            if change['fields'].has_key('comment') and change['fields']['comment']['old'] == str(selected):
     138                                change['checked'] = True
     139                                break
     140                   
     141                    data['changes'] = changes
    112142                elif page == 'delete':
    113143                    data['id'] = t.id
    114144 
     
    139169        return [('ticketdelete', resource_filename(__name__, 'htdocs'))]
    140170
    141171    # Internal methods
    142     def _get_trac_version(self):
    143         md = re.match('(\d+)\.(\d+)',TRAC_VERSION)
    144         if md:
    145             return (int(md.group(1)),int(md.group(2)))
    146         else:
    147             return (0,0)
    148172
    149     def _validate(self, req, arg):
     173    def _validate(self, req, arg, data):
    150174        """Validate that arg is a string containing a valid ticket ID."""
    151175        try:
    152176            id = int(arg)
     
    161185   
    162186    def _delete_ticket(self, id):
    163187        """Delete the given ticket ID."""
    164         major, minor = self._get_trac_version()
    165         if major > 0 or minor >= 10:
    166             ticket = Ticket(self.env,id)
    167             ticket.delete()
    168         else:
    169             db = self.env.get_db_cnx()
    170             cursor = db.cursor()
    171             cursor.execute("DELETE FROM ticket WHERE id=%s", (id,))
    172             cursor.execute("DELETE FROM ticket_change WHERE ticket=%s", (id,))
    173             cursor.execute("DELETE FROM attachment WHERE type='ticket' and id=%s", (id,))
    174             cursor.execute("DELETE FROM ticket_custom WHERE ticket=%s", (id,))
    175             db.commit()
     188        ticket = Ticket(self.env,id)
     189        ticket.delete()
    176190           
    177191    def _delete_change(self, id, ts, field=None):
    178192        """Delete the change on the given ticket at the given timestamp."""
     
    196210                self._delete_change(id, ts, field)
    197211           
    198212        db.commit()
     213
  • ticketdelete/htdocs/ticketdelete.js

     
    1 $(document).ready(function() {
    2     var ticket = /\/ticket\/(\d+)/.exec(document.location)[1];
    3     var delete_link = '<a href="../admin/ticket/delete/'+ticket+'">Delete</a>';
    4     var ticket_buttons = $('#ticket .inlinebuttons')[0];
    5     if (ticket_buttons) {
    6         $(ticket_buttons).append(delete_link);
    7     } else {
    8         $('#ticket table.properties').after('<div class="description"><h3><span class="inlinebuttons">'+delete_link+'</span>&nbsp;</h3></div>');
    9     }
    10     $('#changelog h3').each(function() {
    11         var comment = $('input[@name=replyto]', this)[0];
    12         if (comment) {
    13             comment = comment.value;
    14             $('.inlinebuttons', this).append('<a href="../admin/ticket/comments/'+ticket+'?cnum='+comment+'">Delete</a>');
    15         }
    16     });
    17 });
  • ticketdelete/htdocs/jquery.js

     
    1 /*
    2  * jQuery - New Wave Javascript
    3  *
    4  * Copyright (c) 2006 John Resig (jquery.com)
    5  * Dual licensed under the MIT (MIT-LICENSE.txt)
    6  * and GPL (GPL-LICENSE.txt) licenses.
    7  *
    8  * $Date: 2006-08-31 13:26:31 -0400 (Thu, 31 Aug 2006) $
    9  * $Rev: 249 $
    10  */
    11 
    12 // Global undefined variable
    13 window.undefined = window.undefined;
    14 function jQuery(a,c) {
    15 
    16         // Shortcut for document ready (because $(document).each() is silly)
    17         if ( a && a.constructor == Function && jQuery.fn.ready )
    18                 return jQuery(document).ready(a);
    19 
    20         // Make sure that a selection was provided
    21         a = a || jQuery.context || document;
    22 
    23         // Watch for when a jQuery object is passed as the selector
    24         if ( a.jquery )
    25                 return $( jQuery.merge( a, [] ) );
    26 
    27         // Watch for when a jQuery object is passed at the context
    28         if ( c && c.jquery )
    29                 return $( c ).find(a);
    30        
    31         // If the context is global, return a new object
    32         if ( window == this )
    33                 return new jQuery(a,c);
    34 
    35         // Handle HTML strings
    36         var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
    37         if ( m ) a = jQuery.clean( [ m[1] ] );
    38 
    39         // Watch for when an array is passed in
    40         this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
    41                 // Assume that it is an array of DOM Elements
    42                 jQuery.merge( a, [] ) :
    43 
    44                 // Find the matching elements and save them for later
    45                 jQuery.find( a, c ) );
    46 
    47   // See if an extra function was provided
    48         var fn = arguments[ arguments.length - 1 ];
    49        
    50         // If so, execute it in context
    51         if ( fn && fn.constructor == Function )
    52                 this.each(fn);
    53 }
    54 
    55 // Map over the $ in case of overwrite
    56 if ( typeof $ != "undefined" )
    57         jQuery._$ = $;
    58 
    59 // Map the jQuery namespace to the '$' one
    60 var $ = jQuery;
    61 
    62 jQuery.fn = jQuery.prototype = {
    63         jquery: "$Rev: 249 $",
    64 
    65         size: function() {
    66                 return this.length;
    67         },
    68 
    69         get: function( num ) {
    70                 // Watch for when an array (of elements) is passed in
    71                 if ( num && num.constructor == Array ) {
    72 
    73                         // Use a tricky hack to make the jQuery object
    74                         // look and feel like an array
    75                         this.length = 0;
    76                         [].push.apply( this, num );
    77                        
    78                         return this;
    79                 } else
    80                         return num == undefined ?
    81 
    82                                 // Return a 'clean' array
    83                                 jQuery.map( this, function(a){ return a } ) :
    84 
    85                                 // Return just the object
    86                                 this[num];
    87         },
    88         each: function( fn, args ) {
    89                 return jQuery.each( this, fn, args );
    90         },
    91 
    92         index: function( obj ) {
    93                 var pos = -1;
    94                 this.each(function(i){
    95                         if ( this == obj ) pos = i;
    96                 });
    97                 return pos;
    98         },
    99 
    100         attr: function( key, value, type ) {
    101                 // Check to see if we're setting style values
    102                 return key.constructor != String || value != undefined ?
    103                         this.each(function(){
    104                                 // See if we're setting a hash of styles
    105                                 if ( value == undefined )
    106                                         // Set all the styles
    107                                         for ( var prop in key )
    108                                                 jQuery.attr(
    109                                                         type ? this.style : this,
    110                                                         prop, key[prop]
    111                                                 );
    112                                
    113                                 // See if we're setting a single key/value style
    114                                 else
    115                                         jQuery.attr(
    116                                                 type ? this.style : this,
    117                                                 key, value
    118                                         );
    119                         }) :
    120                        
    121                         // Look for the case where we're accessing a style value
    122                         jQuery[ type || "attr" ]( this[0], key );
    123         },
    124 
    125         css: function( key, value ) {
    126                 return this.attr( key, value, "curCSS" );
    127         },
    128         text: function(e) {
    129                 e = e || this;
    130                 var t = "";
    131                 for ( var j = 0; j < e.length; j++ ) {
    132                         var r = e[j].childNodes;
    133                         for ( var i = 0; i < r.length; i++ )
    134                                 if ( r[i].nodeType != 8 )
    135                                         t += r[i].nodeType != 1 ?
    136                                                 r[i].nodeValue : jQuery.fn.text([ r[i] ]);
    137                 }
    138                 return t;
    139         },
    140         wrap: function() {
    141                 // The elements to wrap the target around
    142                 var a = jQuery.clean(arguments);
    143                
    144                 // Wrap each of the matched elements individually
    145                 return this.each(function(){
    146                         // Clone the structure that we're using to wrap
    147                         var b = a[0].cloneNode(true);
    148                        
    149                         // Insert it before the element to be wrapped
    150                         this.parentNode.insertBefore( b, this );
    151                        
    152                         // Find he deepest point in the wrap structure
    153                         while ( b.firstChild )
    154                                 b = b.firstChild;
    155                        
    156                         // Move the matched element to within the wrap structure
    157                         b.appendChild( this );
    158                 });
    159         },
    160         append: function() {
    161                 return this.domManip(arguments, true, 1, function(a){
    162                         this.appendChild( a );
    163                 });
    164         },
    165         prepend: function() {
    166                 return this.domManip(arguments, true, -1, function(a){
    167                         this.insertBefore( a, this.firstChild );
    168                 });
    169         },
    170         before: function() {
    171                 return this.domManip(arguments, false, 1, function(a){
    172                         this.parentNode.insertBefore( a, this );
    173                 });
    174         },
    175         after: function() {
    176                 return this.domManip(arguments, false, -1, function(a){
    177                         this.parentNode.insertBefore( a, this.nextSibling );
    178                 });
    179         },
    180         end: function() {
    181                 return this.get( this.stack.pop() );
    182         },
    183         find: function(t) {
    184                 return this.pushStack( jQuery.map( this, function(a){
    185                         return jQuery.find(t,a);
    186                 }), arguments );
    187         },
    188 
    189         clone: function(deep) {
    190                 return this.pushStack( jQuery.map( this, function(a){
    191                         return a.cloneNode( deep != undefined ? deep : true );
    192                 }), arguments );
    193         },
    194 
    195         filter: function(t) {
    196                 return this.pushStack(
    197                         t.constructor == Array &&
    198                         jQuery.map(this,function(a){
    199                                 for ( var i = 0; i < t.length; i++ )
    200                                         if ( jQuery.filter(t[i],[a]).r.length )
    201                                                 return a;
    202                         }) ||
    203 
    204                         t.constructor == Boolean &&
    205                         ( t ? this.get() : [] ) ||
    206 
    207                         t.constructor == Function &&
    208                         jQuery.grep( this, t ) ||
    209 
    210                         jQuery.filter(t,this).r, arguments );
    211         },
    212 
    213         not: function(t) {
    214                 return this.pushStack( t.constructor == String ?
    215                         jQuery.filter(t,this,false).r :
    216                         jQuery.grep(this,function(a){ return a != t; }), arguments );
    217         },
    218 
    219         add: function(t) {
    220                 return this.pushStack( jQuery.merge( this, t.constructor == String ?
    221                         jQuery.find(t) : t.constructor == Array ? t : [t] ), arguments );
    222         },
    223         is: function(expr) {
    224                 return expr ? jQuery.filter(expr,this).r.length > 0 : this.length > 0;
    225         },
    226         domManip: function(args, table, dir, fn){
    227                 var clone = this.size() > 1;
    228                 var a = jQuery.clean(args);
    229                
    230                 return this.each(function(){
    231                         var obj = this;
    232                        
    233                         if ( table && this.nodeName == "TABLE" && a[0].nodeName != "THEAD" ) {
    234                                 var tbody = this.getElementsByTagName("tbody");
    235 
    236                                 if ( !tbody.length ) {
    237                                         obj = document.createElement("tbody");
    238                                         this.appendChild( obj );
    239                                 } else
    240                                         obj = tbody[0];
    241                         }
    242 
    243                         for ( var i = ( dir < 0 ? a.length - 1 : 0 );
    244                                 i != ( dir < 0 ? dir : a.length ); i += dir ) {
    245                                         fn.apply( obj, [ clone ? a[i].cloneNode(true) : a[i] ] );
    246                         }
    247                 });
    248         },
    249         pushStack: function(a,args) {
    250                 var fn = args && args[args.length-1];
    251 
    252                 if ( !fn || fn.constructor != Function ) {
    253                         if ( !this.stack ) this.stack = [];
    254                         this.stack.push( this.get() );
    255                         this.get( a );
    256                 } else {
    257                         var old = this.get();
    258                         this.get( a );
    259                         if ( fn.constructor == Function )
    260                                 return this.each( fn );
    261                         this.get( old );
    262                 }
    263 
    264                 return this;
    265         }
    266 };
    267 
    268 jQuery.extend = jQuery.fn.extend = function(obj,prop) {
    269         if ( !prop ) { prop = obj; obj = this; }
    270         for ( var i in prop ) obj[i] = prop[i];
    271         return obj;
    272 };
    273 
    274 jQuery.extend({
    275         init: function(){
    276                 jQuery.initDone = true;
    277                
    278                 jQuery.each( jQuery.macros.axis, function(i,n){
    279                         jQuery.fn[ i ] = function(a) {
    280                                 var ret = jQuery.map(this,n);
    281                                 if ( a && a.constructor == String )
    282                                         ret = jQuery.filter(a,ret).r;
    283                                 return this.pushStack( ret, arguments );
    284                         };
    285                 });
    286                
    287                 jQuery.each( jQuery.macros.to, function(i,n){
    288                         jQuery.fn[ i ] = function(){
    289                                 var a = arguments;
    290                                 return this.each(function(){
    291                                         for ( var j = 0; j < a.length; j++ )
    292                                                 $(a[j])[n]( this );
    293                                 });
    294                         };
    295                 });
    296                
    297                 jQuery.each( jQuery.macros.each, function(i,n){
    298                         jQuery.fn[ i ] = function() {
    299                                 return this.each( n, arguments );
    300                         };
    301                 });
    302 
    303                 jQuery.each( jQuery.macros.filter, function(i,n){
    304                         jQuery.fn[ n ] = function(num,fn) {
    305                                 return this.filter( ":" + n + "(" + num + ")", fn );
    306                         };
    307                 });
    308                
    309                 jQuery.each( jQuery.macros.attr, function(i,n){
    310                         n = n || i;
    311                         jQuery.fn[ i ] = function(h) {
    312                                 return h == undefined ?
    313                                         this.length ? this[0][n] : null :
    314                                         this.attr( n, h );
    315                         };
    316                 });
    317        
    318                 jQuery.each( jQuery.macros.css, function(i,n){
    319                         jQuery.fn[ n ] = function(h) {
    320                                 return h == undefined ?
    321                                         ( this.length ? jQuery.css( this[0], n ) : null ) :
    322                                         this.css( n, h );
    323                         };
    324                 });
    325        
    326         },
    327         each: function( obj, fn, args ) {
    328                 if ( obj.length == undefined )
    329                         for ( var i in obj )
    330                                 fn.apply( obj[i], args || [i, obj[i]] );
    331                 else
    332                         for ( var i = 0; i < obj.length; i++ )
    333                                 fn.apply( obj[i], args || [i, obj[i]] );
    334                 return obj;
    335         },
    336        
    337         className: {
    338                 add: function(o,c){
    339                         if (jQuery.className.has(o,c)) return;
    340                         o.className += ( o.className ? " " : "" ) + c;
    341                 },
    342                 remove: function(o,c){
    343                         o.className = !c ? "" :
    344                                 o.className.replace(
    345                                         new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");
    346                 },
    347                 has: function(e,a) {
    348                         if ( e.className != undefined )
    349                                 e = e.className;
    350                         return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e);
    351                 }
    352         },
    353         swap: function(e,o,f) {
    354                 for ( var i in o ) {
    355                         e.style["old"+i] = e.style[i];
    356                         e.style[i] = o[i];
    357                 }
    358                 f.apply( e, [] );
    359                 for ( var i in o )
    360                         e.style[i] = e.style["old"+i];
    361         },
    362        
    363         css: function(e,p) {
    364                 if ( p == "height" || p == "width" ) {
    365                         var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
    366        
    367                         for ( var i in d ) {
    368                                 old["padding" + d[i]] = 0;
    369                                 old["border" + d[i] + "Width"] = 0;
    370                         }
    371        
    372                         jQuery.swap( e, old, function() {
    373                                 if (jQuery.css(e,"display") != "none") {
    374                                         oHeight = e.offsetHeight;
    375                                         oWidth = e.offsetWidth;
    376                                 } else {
    377                                         e = $(e.cloneNode(true)).css({
    378                                                 visibility: "hidden", position: "absolute", display: "block"
    379                                         }).prependTo("body")[0];
    380 
    381                                         oHeight = e.clientHeight;
    382                                         oWidth = e.clientWidth;
    383                                        
    384                                         e.parentNode.removeChild(e);
    385                                 }
    386                         });
    387        
    388                         return p == "height" ? oHeight : oWidth;
    389                 } else if ( p == "opacity" && jQuery.browser.msie )
    390                         return parseFloat( jQuery.curCSS(e,"filter").replace(/[^0-9.]/,"") ) || 1;
    391 
    392                 return jQuery.curCSS( e, p );
    393         },
    394 
    395         curCSS: function(elem, prop, force) {
    396                 var ret;
    397        
    398                 if (!force && elem.style[prop]) {
    399 
    400                         ret = elem.style[prop];
    401 
    402                 } else if (elem.currentStyle) {
    403 
    404                         var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase()});
    405                         ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
    406 
    407                 } else if (document.defaultView && document.defaultView.getComputedStyle) {
    408 
    409                         prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
    410                         var cur = document.defaultView.getComputedStyle(elem, null);
    411 
    412                         if ( cur )
    413                                 ret = cur.getPropertyValue(prop);
    414                         else if ( prop == 'display' )
    415                                 ret = 'none';
    416                         else
    417                                 jQuery.swap(elem, { display: 'block' }, function() {
    418                                         ret = document.defaultView.getComputedStyle(this,null).getPropertyValue(prop);
    419                                 });
    420 
    421                 }
    422                
    423                 return ret;
    424         },
    425        
    426         clean: function(a) {
    427                 var r = [];
    428                 for ( var i = 0; i < a.length; i++ ) {
    429                         if ( a[i].constructor == String ) {
    430 
    431                                 var table = "";
    432        
    433                                 if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
    434                                         table = "thead";
    435                                         a[i] = "<table>" + a[i] + "</table>";
    436                                 } else if ( !a[i].indexOf("<tr") ) {
    437                                         table = "tr";
    438                                         a[i] = "<table>" + a[i] + "</table>";
    439                                 } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
    440                                         table = "td";
    441                                         a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
    442                                 }
    443        
    444                                 var div = document.createElement("div");
    445                                 div.innerHTML = a[i];
    446        
    447                                 if ( table ) {
    448                                         div = div.firstChild;
    449                                         if ( table != "thead" ) div = div.firstChild;
    450                                         if ( table == "td" ) div = div.firstChild;
    451                                 }
    452        
    453                                 for ( var j = 0; j < div.childNodes.length; j++ )
    454                                         r.push( div.childNodes[j] );
    455                                 } else if ( a[i].jquery || a[i].length && !a[i].nodeType )
    456                                         for ( var k = 0; k < a[i].length; k++ )
    457                                                 r.push( a[i][k] );
    458                                 else if ( a[i] !== null )
    459                                         r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
    460                 }
    461                 return r;
    462         },
    463        
    464         expr: {
    465                 "": "m[2]== '*'||a.nodeName.toUpperCase()==m[2].toUpperCase()",
    466                 "#": "a.getAttribute('id')&&a.getAttribute('id')==m[2]",
    467                 ":": {
    468                         // Position Checks
    469                         lt: "i<m[3]-0",
    470                         gt: "i>m[3]-0",
    471                         nth: "m[3]-0==i",
    472                         eq: "m[3]-0==i",
    473                         first: "i==0",
    474                         last: "i==r.length-1",
    475                         even: "i%2==0",
    476                         odd: "i%2",
    477                        
    478                         // Child Checks
    479                         "nth-child": "jQuery.sibling(a,m[3]).cur",
    480                         "first-child": "jQuery.sibling(a,0).cur",
    481                         "last-child": "jQuery.sibling(a,0).last",
    482                         "only-child": "jQuery.sibling(a).length==1",
    483                        
    484                         // Parent Checks
    485                         parent: "a.childNodes.length",
    486                         empty: "!a.childNodes.length",
    487                        
    488                         // Text Check
    489                         contains: "(a.innerText||a.innerHTML).indexOf(m[3])>=0",
    490                        
    491                         // Visibility
    492                         visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
    493                         hidden: "a.type=='hidden'||jQuery.css(a,'display')=='none'||jQuery.css(a,'visibility')=='hidden'",
    494                        
    495                         // Form elements
    496                         enabled: "!a.disabled",
    497                         disabled: "a.disabled",
    498                         checked: "a.checked",
    499                         selected: "a.selected"
    500                 },
    501                 ".": "jQuery.className.has(a,m[2])",
    502                 "@": {
    503                         "=": "z==m[4]",
    504                         "!=": "z!=m[4]",
    505                         "^=": "!z.indexOf(m[4])",
    506                         "$=": "z.substr(z.length - m[4].length,m[4].length)==m[4]",
    507                         "*=": "z.indexOf(m[4])>=0",
    508                         "": "z"
    509                 },
    510                 "[": "jQuery.find(m[2],a).length"
    511         },
    512        
    513         token: [
    514                 "\\.\\.|/\\.\\.", "a.parentNode",
    515                 ">|/", "jQuery.sibling(a.firstChild)",
    516                 "\\+", "jQuery.sibling(a).next",
    517                 "~", function(a){
    518                         var r = [];
    519                         var s = jQuery.sibling(a);
    520                         if ( s.n > 0 )
    521                                 for ( var i = s.n; i < s.length; i++ )
    522                                         r.push( s[i] );
    523                         return r;
    524                 }
    525         ],
    526         find: function( t, context ) {
    527                 // Make sure that the context is a DOM Element
    528                 if ( context && context.nodeType == undefined )
    529                         context = null;
    530        
    531                 // Set the correct context (if none is provided)
    532                 context = context || jQuery.context || document;
    533        
    534                 if ( t.constructor != String ) return [t];
    535        
    536                 if ( !t.indexOf("//") ) {
    537                         context = context.documentElement;
    538                         t = t.substr(2,t.length);
    539                 } else if ( !t.indexOf("/") ) {
    540                         context = context.documentElement;
    541                         t = t.substr(1,t.length);
    542                         // FIX Assume the root element is right :(
    543                         if ( t.indexOf("/") >= 1 )
    544                                 t = t.substr(t.indexOf("/"),t.length);
    545                 }
    546        
    547                 var ret = [context];
    548                 var done = [];
    549                 var last = null;
    550        
    551                 while ( t.length > 0 && last != t ) {
    552                         var r = [];
    553                         last = t;
    554        
    555                         t = jQuery.trim(t).replace( /^\/\//i, "" );
    556                        
    557                         var foundToken = false;
    558                        
    559                         for ( var i = 0; i < jQuery.token.length; i += 2 ) {
    560                                 if ( foundToken ) continue;
    561 
    562                                 var re = new RegExp("^(" + jQuery.token[i] + ")");
    563                                 var m = re.exec(t);
    564                                
    565                                 if ( m ) {
    566                                         r = ret = jQuery.map( ret, jQuery.token[i+1] );
    567                                         t = jQuery.trim( t.replace( re, "" ) );
    568                                         foundToken = true;
    569                                 }
    570                         }
    571                        
    572                         if ( !foundToken ) {
    573                                 if ( !t.indexOf(",") || !t.indexOf("|") ) {
    574                                         if ( ret[0] == context ) ret.shift();
    575                                         done = jQuery.merge( done, ret );
    576                                         r = ret = [context];
    577                                         t = " " + t.substr(1,t.length);
    578                                 } else {
    579                                         var re2 = /^([#.]?)([a-z0-9\\*_-]*)/i;
    580                                         var m = re2.exec(t);
    581                
    582                                         if ( m[1] == "#" ) {
    583                                                 // Ummm, should make this work in all XML docs
    584                                                 var oid = document.getElementById(m[2]);
    585                                                 r = ret = oid ? [oid] : [];
    586                                                 t = t.replace( re2, "" );
    587                                         } else {
    588                                                 if ( !m[2] || m[1] == "." ) m[2] = "*";
    589                
    590                                                 for ( var i = 0; i < ret.length; i++ )
    591                                                         r = jQuery.merge( r,
    592                                                                 m[2] == "*" ?
    593                                                                         jQuery.getAll(ret[i]) :
    594                                                                         ret[i].getElementsByTagName(m[2])
    595                                                         );
    596                                         }
    597                                 }
    598        
    599                         }
    600 
    601                         if ( t ) {
    602                                 var val = jQuery.filter(t,r);
    603                                 ret = r = val.r;
    604                                 t = jQuery.trim(val.t);
    605                         }
    606                 }
    607        
    608                 if ( ret && ret[0] == context ) ret.shift();
    609                 done = jQuery.merge( done, ret );
    610        
    611                 return done;
    612         },
    613        
    614         getAll: function(o,r) {
    615                 r = r || [];
    616                 var s = o.childNodes;
    617                 for ( var i = 0; i < s.length; i++ )
    618                         if ( s[i].nodeType == 1 ) {
    619                                 r.push( s[i] );
    620                                 jQuery.getAll( s[i], r );
    621                         }
    622                 return r;
    623         },
    624        
    625         attr: function(elem, name, value){
    626                 var fix = {
    627                         "for": "htmlFor",
    628                         "class": "className",
    629                         "float": "cssFloat",
    630                         innerHTML: "innerHTML",
    631                         className: "className",
    632                         value: "value",
    633                         disabled: "disabled"
    634                 };
    635 
    636                 if ( fix[name] ) {
    637                         if ( value != undefined ) elem[fix[name]] = value;
    638                         return elem[fix[name]];
    639                 } else if ( elem.getAttribute ) {
    640                         if ( value != undefined ) elem.setAttribute( name, value );
    641                         return elem.getAttribute( name, 2 );
    642                 } else {
    643                         name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
    644                         if ( value != undefined ) elem[name] = value;
    645                         return elem[name];
    646                 }
    647         },
    648 
    649         // The regular expressions that power the parsing engine
    650         parse: [
    651                 // Match: [@value='test'], [@foo]
    652                 [ "\\[ *(@)S *([!*$^=]*) *Q\\]", 1 ],
    653 
    654                 // Match: [div], [div p]
    655                 [ "(\\[)Q\\]", 0 ],
    656 
    657                 // Match: :contains('foo')
    658                 [ "(:)S\\(Q\\)", 0 ],
    659 
    660                 // Match: :even, :last-chlid
    661                 [ "([:.#]*)S", 0 ]
    662         ],
    663        
    664         filter: function(t,r,not) {
    665                 // Figure out if we're doing regular, or inverse, filtering
    666                 var g = not !== false ? jQuery.grep :
    667                         function(a,f) {return jQuery.grep(a,f,true);};
    668                
    669                 while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
    670 
    671                         var p = jQuery.parse;
    672 
    673                         for ( var i = 0; i < p.length; i++ ) {
    674                                 var re = new RegExp( "^" + p[i][0]
    675 
    676                                         // Look for a string-like sequence
    677                                         .replace( 'S', "([a-z*_-][a-z0-9_-]*)" )
    678 
    679                                         // Look for something (optionally) enclosed with quotes
    680                                         .replace( 'Q', " *'?\"?([^'\"]*?)'?\"? *" ), "i" );
    681 
    682                                 var m = re.exec( t );
    683 
    684                                 if ( m ) {
    685                                         // Re-organize the match
    686                                         if ( p[i][1] )
    687                                                 m = ["", m[1], m[3], m[2], m[4]];
    688 
    689                                         // Remove what we just matched
    690                                         t = t.replace( re, "" );
    691 
    692                                         break;
    693                                 }
    694                         }
    695        
    696                         // :not() is a special case that can be optomized by
    697                         // keeping it out of the expression list
    698                         if ( m[1] == ":" && m[2] == "not" )
    699                                 r = jQuery.filter(m[3],r,false).r;
    700                        
    701                         // Otherwise, find the expression to execute
    702                         else {
    703                                 var f = jQuery.expr[m[1]];
    704                                 if ( f.constructor != String )
    705                                         f = jQuery.expr[m[1]][m[2]];
    706                                        
    707                                 // Build a custom macro to enclose it
    708                                 eval("f = function(a,i){" +
    709                                         ( m[1] == "@" ? "z=jQuery.attr(a,m[3]);" : "" ) +
    710                                         "return " + f + "}");
    711                                
    712                                 // Execute it against the current filter
    713                                 r = g( r, f );
    714                         }
    715                 }
    716        
    717                 // Return an array of filtered elements (r)
    718                 // and the modified expression string (t)
    719                 return { r: r, t: t };
    720         },
    721         trim: function(t){
    722                 return t.replace(/^\s+|\s+$/g, "");
    723         },
    724         parents: function( elem ){
    725                 var matched = [];
    726                 var cur = elem.parentNode;
    727                 while ( cur && cur != document ) {
    728                         matched.push( cur );
    729                         cur = cur.parentNode;
    730                 }
    731                 return matched;
    732         },
    733         sibling: function(elem, pos, not) {
    734                 var elems = [];
    735 
    736                 var siblings = elem.parentNode.childNodes;
    737                 for ( var i = 0; i < siblings.length; i++ ) {
    738                         if ( not === true && siblings[i] == elem ) continue;
    739 
    740                         if ( siblings[i].nodeType == 1 )
    741                                 elems.push( siblings[i] );
    742                         if ( siblings[i] == elem )
    743                                 elems.n = elems.length - 1;
    744                 }
    745 
    746                 return jQuery.extend( elems, {
    747                         last: elems.n == elems.length - 1,
    748                         cur: pos == "even" && elems.n % 2 == 0 || pos == "odd" && elems.n % 2 || elems[pos] == elem,
    749                         prev: elems[elems.n - 1],
    750                         next: elems[elems.n + 1]
    751                 });
    752         },
    753         merge: function(first, second) {
    754                 var result = [];
    755                
    756                 // Move b over to the new array (this helps to avoid
    757                 // StaticNodeList instances)
    758                 for ( var k = 0; k < first.length; k++ )
    759                         result[k] = first[k];
    760        
    761                 // Now check for duplicates between a and b and only
    762                 // add the unique items
    763                 for ( var i = 0; i < second.length; i++ ) {
    764                         var noCollision = true;
    765                        
    766                         // The collision-checking process
    767                         for ( var j = 0; j < first.length; j++ )
    768                                 if ( second[i] == first[j] )
    769                                         noCollision = false;
    770                                
    771                         // If the item is unique, add it
    772                         if ( noCollision )
    773                                 result.push( second[i] );
    774                 }
    775        
    776                 return result;
    777         },
    778         grep: function(elems, fn, inv) {
    779                 // If a string is passed in for the function, make a function
    780                 // for it (a handy shortcut)
    781                 if ( fn.constructor == String )
    782                         fn = new Function("a","i","return " + fn);
    783                        
    784                 var result = [];
    785                
    786                 // Go through the array, only saving the items
    787                 // that pass the validator function
    788                 for ( var i = 0; i < elems.length; i++ )
    789                         if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
    790                                 result.push( elems[i] );
    791                
    792                 return result;
    793         },
    794         map: function(elems, fn) {
    795                 // If a string is passed in for the function, make a function
    796                 // for it (a handy shortcut)
    797                 if ( fn.constructor == String )
    798                         fn = new Function("a","return " + fn);
    799                
    800                 var result = [];
    801                
    802                 // Go through the array, translating each of the items to their
    803                 // new value (or values).
    804                 for ( var i = 0; i < elems.length; i++ ) {
    805                         var val = fn(elems[i],i);
    806 
    807                         if ( val !== null && val != undefined ) {
    808                                 if ( val.constructor != Array ) val = [val];
    809                                 result = jQuery.merge( result, val );
    810                         }
    811                 }
    812 
    813                 return result;
    814         },
    815        
    816         /*
    817          * A number of helper functions used for managing events.
    818          * Many of the ideas behind this code orignated from Dean Edwards' addEvent library.
    819          */
    820         event: {
    821        
    822                 // Bind an event to an element
    823                 // Original by Dean Edwards
    824                 add: function(element, type, handler) {
    825                         // For whatever reason, IE has trouble passing the window object
    826                         // around, causing it to be cloned in the process
    827                         if ( jQuery.browser.msie && element.setInterval != undefined )
    828                                 element = window;
    829                
    830                         // Make sure that the function being executed has a unique ID
    831                         if ( !handler.guid )
    832                                 handler.guid = this.guid++;
    833                                
    834                         // Init the element's event structure
    835                         if (!element.events)
    836                                 element.events = {};
    837                        
    838                         // Get the current list of functions bound to this event
    839                         var handlers = element.events[type];
    840                        
    841                         // If it hasn't been initialized yet
    842                         if (!handlers) {
    843                                 // Init the event handler queue
    844                                 handlers = element.events[type] = {};
    845                                
    846                                 // Remember an existing handler, if it's already there
    847                                 if (element["on" + type])
    848                                         handlers[0] = element["on" + type];
    849                         }
    850 
    851                         // Add the function to the element's handler list
    852                         handlers[handler.guid] = handler;
    853                        
    854                         // And bind the global event handler to the element
    855                         element["on" + type] = this.handle;
    856        
    857                         // Remember the function in a global list (for triggering)
    858                         if (!this.global[type])
    859                                 this.global[type] = [];
    860                         this.global[type].push( element );
    861                 },
    862                
    863                 guid: 1,
    864                 global: {},
    865                
    866                 // Detach an event or set of events from an element
    867                 remove: function(element, type, handler) {
    868                         if (element.events)
    869                                 if (type && element.events[type])
    870                                         if ( handler )
    871                                                 delete element.events[type][handler.guid];
    872                                         else
    873                                                 for ( var i in element.events[type] )
    874                                                         delete element.events[type][i];
    875                                 else
    876                                         for ( var j in element.events )
    877                                                 this.remove( element, j );
    878                 },
    879                
    880                 trigger: function(type,data,element) {
    881                         // Touch up the incoming data
    882                         data = data || [];
    883        
    884                         // Handle a global trigger
    885                         if ( !element ) {
    886                                 var g = this.global[type];
    887                                 if ( g )
    888                                         for ( var i = 0; i < g.length; i++ )
    889                                                 this.trigger( type, data, g[i] );
    890        
    891                         // Handle triggering a single element
    892                         } else if ( element["on" + type] ) {
    893                                 // Pass along a fake event
    894                                 data.unshift( this.fix({ type: type, target: element }) );
    895        
    896                                 // Trigger the event
    897                                 element["on" + type].apply( element, data );
    898                         }
    899                 },
    900                
    901                 handle: function(event) {
    902                         if ( typeof jQuery == "undefined" ) return;
    903 
    904                         event = event || jQuery.event.fix( window.event );
    905        
    906                         // If no correct event was found, fail
    907                         if ( !event ) return;
    908                
    909                         var returnValue = true;
    910 
    911                         var c = this.events[event.type];
    912                
    913                         for ( var j in c ) {
    914                                 if ( c[j].apply( this, [event] ) === false ) {
    915                                         event.preventDefault();
    916                                         event.stopPropagation();
    917                                         returnValue = false;
    918                                 }
    919                         }
    920                        
    921                         return returnValue;
    922                 },
    923                
    924                 fix: function(event) {
    925                         if ( event ) {
    926                                 event.preventDefault = function() {
    927                                         this.returnValue = false;
    928                                 };
    929                        
    930                                 event.stopPropagation = function() {
    931                                         this.cancelBubble = true;
    932                                 };
    933                         }
    934                        
    935                         return event;
    936                 }
    937        
    938         }
    939 });
    940 
    941 new function() {
    942         var b = navigator.userAgent.toLowerCase();
    943 
    944         // Figure out what browser is being used
    945         jQuery.browser = {
    946                 safari: /webkit/.test(b),
    947                 opera: /opera/.test(b),
    948                 msie: /msie/.test(b) && !/opera/.test(b),
    949                 mozilla: /mozilla/.test(b) && !/compatible/.test(b)
    950         };
    951 
    952         // Check to see if the W3C box model is being used
    953         jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
    954 };
    955 
    956 jQuery.macros = {
    957         to: {
    958                 appendTo: "append",
    959                 prependTo: "prepend",
    960                 insertBefore: "before",
    961                 insertAfter: "after"
    962         },
    963 
    964        
    965         css: "width,height,top,left,position,float,overflow,color,background".split(","),
    966 
    967         filter: [ "eq", "lt", "gt", "contains" ],
    968 
    969         attr: {
    970 
    971                 val: "value",
    972 
    973                 html: "innerHTML",
    974 
    975                 id: null,
    976 
    977                 title: null,
    978 
    979                 name: null,
    980 
    981                 href: null,
    982 
    983                 src: null,
    984 
    985                 rel: null
    986         },
    987        
    988         axis: {
    989 
    990                 parent: "a.parentNode",
    991 
    992                 ancestors: jQuery.parents,
    993 
    994                 parents: jQuery.parents,
    995 
    996                 next: "jQuery.sibling(a).next",
    997 
    998                 prev: "jQuery.sibling(a).prev",
    999 
    1000                 siblings: jQuery.sibling,
    1001 
    1002                 children: "jQuery.sibling(a.firstChild)"
    1003         },
    1004 
    1005         each: {
    1006 
    1007                 removeAttr: function( key ) {
    1008                         this.removeAttribute( key );
    1009                 },
    1010                 show: function(){
    1011                         this.style.display = this.oldblock ? this.oldblock : "";
    1012                         if ( jQuery.css(this,"display") == "none" )
    1013                                 this.style.display = "block";
    1014                 },
    1015                 hide: function(){
    1016                         this.oldblock = this.oldblock || jQuery.css(this,"display");
    1017                         if ( this.oldblock == "none" )
    1018                                 this.oldblock = "block";
    1019                         this.style.display = "none";
    1020                 },
    1021                 toggle: function(){
    1022                         $(this)[ $(this).is(":hidden") ? "show" : "hide" ].apply( $(this), arguments );
    1023                 },
    1024                 addClass: function(c){
    1025                         jQuery.className.add(this,c);
    1026                 },
    1027                 removeClass: function(c){
    1028                         jQuery.className.remove(this,c);
    1029                 },
    1030                 toggleClass: function( c ){
    1031                         jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this,c);
    1032                 },
    1033 
    1034                 remove: function(a){
    1035                         if ( !a || jQuery.filter( a, [this] ).r )
    1036                                 this.parentNode.removeChild( this );
    1037                 },
    1038                 empty: function(){
    1039                         while ( this.firstChild )
    1040                                 this.removeChild( this.firstChild );
    1041                 },
    1042                 bind: function( type, fn ) {
    1043                         if ( fn.constructor == String )
    1044                                 fn = new Function("e", ( !fn.indexOf(".") ? "$(this)" : "return " ) + fn);
    1045                         jQuery.event.add( this, type, fn );
    1046                 },
    1047 
    1048                 unbind: function( type, fn ) {
    1049                         jQuery.event.remove( this, type, fn );
    1050                 },
    1051                 trigger: function( type, data ) {
    1052                         jQuery.event.trigger( type, data, this );
    1053                 }
    1054         }
    1055 };
    1056 
    1057 jQuery.init();
    1058 jQuery.fn.extend({
    1059 
    1060         // We're overriding the old toggle function, so
    1061         // remember it for later
    1062         _toggle: jQuery.fn.toggle,
    1063         toggle: function(a,b) {
    1064                 // If two functions are passed in, we're
    1065                 // toggling on a click
    1066                 return a && b && a.constructor == Function && b.constructor == Function ? this.click(function(e){
    1067                         // Figure out which function to execute
    1068                         this.last = this.last == a ? b : a;
    1069                        
    1070                         // Make sure that clicks stop
    1071                         e.preventDefault();
    1072                        
    1073                         // and execute the function
    1074                         return this.last.apply( this, [e] ) || false;
    1075                 }) :
    1076                
    1077                 // Otherwise, execute the old toggle function
    1078                 this._toggle.apply( this, arguments );
    1079         },
    1080 
    1081         hover: function(f,g) {
    1082                
    1083                 // A private function for haandling mouse 'hovering'
    1084                 function handleHover(e) {
    1085                         // Check if mouse(over|out) are still within the same parent element
    1086                         var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
    1087        
    1088                         // Traverse up the tree
    1089                         while ( p && p != this ) p = p.parentNode;
    1090                        
    1091                         // If we actually just moused on to a sub-element, ignore it
    1092                         if ( p == this ) return false;
    1093                        
    1094                         // Execute the right function
    1095                         return (e.type == "mouseover" ? f : g).apply(this, [e]);
    1096                 }
    1097                
    1098                 // Bind the function to the two event listeners
    1099                 return this.mouseover(handleHover).mouseout(handleHover);
    1100         },
    1101         ready: function(f) {
    1102                 // If the DOM is already ready
    1103                 if ( jQuery.isReady )
    1104                         // Execute the function immediately
    1105                         f.apply( document );
    1106                        
    1107                 // Otherwise, remember the function for later
    1108                 else {
    1109                         // Add the function to the wait list
    1110                         jQuery.readyList.push( f );
    1111                 }
    1112        
    1113                 return this;
    1114         }
    1115 });
    1116 
    1117 jQuery.extend({
    1118         /*
    1119          * All the code that makes DOM Ready work nicely.
    1120          */
    1121         isReady: false,
    1122         readyList: [],
    1123        
    1124         // Handle when the DOM is ready
    1125         ready: function() {
    1126                 // Make sure that the DOM is not already loaded
    1127                 if ( !jQuery.isReady ) {
    1128                         // Remember that the DOM is ready
    1129                         jQuery.isReady = true;
    1130                        
    1131                         // If there are functions bound, to execute
    1132                         if ( jQuery.readyList ) {
    1133                                 // Execute all of them
    1134                                 for ( var i = 0; i < jQuery.readyList.length; i++ )
    1135                                         jQuery.readyList[i].apply( document );
    1136                                
    1137                                 // Reset the list of functions
    1138                                 jQuery.readyList = null;
    1139                         }
    1140                 }
    1141         }
    1142 });
    1143 
    1144 new function(){
    1145 
    1146         var e = ("blur,focus,load,resize,scroll,unload,click,dblclick," +
    1147                 "mousedown,mouseup,mousemove,mouseover,mouseout,change,reset,select," +
    1148                 "submit,keydown,keypress,keyup,error").split(",");
    1149 
    1150         // Go through all the event names, but make sure that
    1151         // it is enclosed properly
    1152         for ( var i = 0; i < e.length; i++ ) new function(){
    1153                        
    1154                 var o = e[i];
    1155                
    1156                 // Handle event binding
    1157                 jQuery.fn[o] = function(f){
    1158                         return f ? this.bind(o, f) : this.trigger(o);
    1159                 };
    1160                
    1161                 // Handle event unbinding
    1162                 jQuery.fn["un"+o] = function(f){ return this.unbind(o, f); };
    1163                
    1164                 // Finally, handle events that only fire once
    1165                 jQuery.fn["one"+o] = function(f){
    1166                         // Attach the event listener
    1167                         return this.each(function(){
    1168 
    1169                                 var count = 0;
    1170 
    1171                                 // Add the event
    1172                                 jQuery.event.add( this, o, function(e){
    1173                                         // If this function has already been executed, stop
    1174                                         if ( count++ ) return;
    1175                                
    1176                                         // And execute the bound function
    1177                                         return f.apply(this, [e]);
    1178                                 });
    1179                         });
    1180                 };
    1181                        
    1182         };
    1183        
    1184         // If Mozilla is used
    1185         if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
    1186                 // Use the handy event callback
    1187                 document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
    1188        
    1189         // If IE is used, use the excellent hack by Matthias Miller
    1190         // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
    1191         } else if ( jQuery.browser.msie ) {
    1192        
    1193                 // Only works if you document.write() it
    1194                 document.write("<scr" + "ipt id=__ie_init defer=true " +
    1195                         "src=//:><\/script>");
    1196        
    1197                 // Use the defer script hack
    1198                 var script = document.getElementById("__ie_init");
    1199                 script.onreadystatechange = function() {
    1200                         if ( this.readyState != "complete" ) return;
    1201                         this.parentNode.removeChild( this );
    1202                         jQuery.ready();
    1203                 };
    1204        
    1205                 // Clear from memory
    1206                 script = null;
    1207        
    1208         // If Safari  is used
    1209         } else if ( jQuery.browser.safari ) {
    1210                 // Continually check to see if the document.readyState is valid
    1211                 jQuery.safariTimer = setInterval(function(){
    1212                         // loaded and complete are both valid states
    1213                         if ( document.readyState == "loaded" ||
    1214                                 document.readyState == "complete" ) {
    1215        
    1216                                 // If either one are found, remove the timer
    1217                                 clearInterval( jQuery.safariTimer );
    1218                                 jQuery.safariTimer = null;
    1219        
    1220                                 // and execute any waiting functions
    1221                                 jQuery.ready();
    1222                         }
    1223                 }, 10);
    1224         }
    1225 
    1226         // A fallback to window.onload, that will always work
    1227         jQuery.event.add( window, "load", jQuery.ready );
    1228        
    1229 };
    1230 jQuery.fn.extend({
    1231 
    1232         // overwrite the old show method
    1233         _show: jQuery.fn.show,
    1234 
    1235         show: function(speed,callback){
    1236                 return speed ? this.animate({
    1237                         height: "show", width: "show", opacity: "show"
    1238                 }, speed, callback) : this._show();
    1239         },
    1240        
    1241         // Overwrite the old hide method
    1242         _hide: jQuery.fn.hide,
    1243 
    1244         hide: function(speed,callback){
    1245                 return speed ? this.animate({
    1246                         height: "hide", width: "hide", opacity: "hide"
    1247                 }, speed, callback) : this._hide();
    1248         },
    1249 
    1250         slideDown: function(speed,callback){
    1251                 return this.animate({height: "show"}, speed, callback);
    1252         },
    1253 
    1254         slideUp: function(speed,callback){
    1255                 return this.animate({height: "hide"}, speed, callback);
    1256         },
    1257 
    1258         slideToggle: function(speed,callback){
    1259                 return this.each(function(){
    1260                         var state = $(this).is(":hidden") ? "show" : "hide";
    1261                         $(this).animate({height: state}, speed, callback);
    1262                 });
    1263         },
    1264 
    1265         fadeIn: function(speed,callback){
    1266                 return this.animate({opacity: "show"}, speed, callback);
    1267         },
    1268 
    1269         fadeOut: function(speed,callback){
    1270                 return this.animate({opacity: "hide"}, speed, callback);
    1271         },
    1272 
    1273         fadeTo: function(speed,to,callback){
    1274                 return this.animate({opacity: to}, speed, callback);
    1275         },
    1276         animate: function(prop,speed,callback) {
    1277                 return this.queue(function(){
    1278                
    1279                         this.curAnim = prop;
    1280                        
    1281                         for ( var p in prop ) {
    1282                                 var e = new jQuery.fx( this, jQuery.speed(speed,callback), p );
    1283                                 if ( prop[p].constructor == Number )
    1284                                         e.custom( e.cur(), prop[p] );
    1285                                 else
    1286                                         e[ prop[p] ]( prop );
    1287                         }
    1288                        
    1289                 });
    1290         },
    1291         queue: function(type,fn){
    1292                 if ( !fn ) {
    1293                         fn = type;
    1294                         type = "fx";
    1295                 }
    1296        
    1297                 return this.each(function(){
    1298                         if ( !this.queue )
    1299                                 this.queue = {};
    1300        
    1301                         if ( !this.queue[type] )
    1302                                 this.queue[type] = [];
    1303        
    1304                         this.queue[type].push( fn );
    1305                
    1306                         if ( this.queue[type].length == 1 )
    1307                                 fn.apply(this);
    1308                 });
    1309         }
    1310 
    1311 });
    1312 
    1313 jQuery.extend({
    1314 
    1315         setAuto: function(e,p) {
    1316                 if ( e.notAuto ) return;
    1317 
    1318                 if ( p == "height" && e.scrollHeight != parseInt(jQuery.curCSS(e,p)) ) return;
    1319                 if ( p == "width" && e.scrollWidth != parseInt(jQuery.curCSS(e,p)) ) return;
    1320 
    1321                 // Remember the original height
    1322                 var a = e.style[p];
    1323 
    1324                 // Figure out the size of the height right now
    1325                 var o = jQuery.curCSS(e,p,1);
    1326 
    1327                 if ( p == "height" && e.scrollHeight != o ||
    1328                         p == "width" && e.scrollWidth != o ) return;
    1329 
    1330                 // Set the height to auto
    1331                 e.style[p] = e.currentStyle ? "" : "auto";
    1332 
    1333                 // See what the size of "auto" is
    1334                 var n = jQuery.curCSS(e,p,1);
    1335 
    1336                 // Revert back to the original size
    1337                 if ( o != n && n != "auto" ) {
    1338                         e.style[p] = a;
    1339                         e.notAuto = true;
    1340                 }
    1341         },
    1342        
    1343         speed: function(s,o) {
    1344                 o = o || {};
    1345                
    1346                 if ( o.constructor == Function )
    1347                         o = { complete: o };
    1348                
    1349                 var ss = { slow: 600, fast: 200 };
    1350                 o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
    1351        
    1352                 // Queueing
    1353                 o.oldComplete = o.complete;
    1354                 o.complete = function(){
    1355                         jQuery.dequeue(this, "fx");
    1356                         if ( o.oldComplete && o.oldComplete.constructor == Function )
    1357                                 o.oldComplete.apply( this );
    1358                 };
    1359        
    1360                 return o;
    1361         },
    1362        
    1363         queue: {},
    1364        
    1365         dequeue: function(elem,type){
    1366                 type = type || "fx";
    1367        
    1368                 if ( elem.queue && elem.queue[type] ) {
    1369                         // Remove self
    1370                         elem.queue[type].shift();
    1371        
    1372                         // Get next function
    1373                         var f = elem.queue[type][0];
    1374                
    1375                         if ( f ) f.apply( elem );
    1376                 }
    1377         },
    1378 
    1379         /*
    1380          * I originally wrote fx() as a clone of moo.fx and in the process
    1381          * of making it small in size the code became illegible to sane
    1382          * people. You've been warned.
    1383          */
    1384        
    1385         fx: function( elem, options, prop ){
    1386        
    1387                 var z = this;
    1388        
    1389                 // The users options
    1390                 z.o = {
    1391                         duration: options.duration || 400,
    1392                         complete: options.complete,
    1393                         step: options.step
    1394                 };
    1395        
    1396                 // The element
    1397                 z.el = elem;
    1398        
    1399                 // The styles
    1400                 var y = z.el.style;
    1401        
    1402                 // Simple function for setting a style value
    1403                 z.a = function(){
    1404                         if ( options.step )
    1405                                 options.step.apply( elem, [ z.now ] );
    1406 
    1407                         if ( prop == "opacity" ) {
    1408                                 if (jQuery.browser.mozilla && z.now == 1) z.now = 0.9999;
    1409                                 if (window.ActiveXObject)
    1410                                         y.filter = "alpha(opacity=" + z.now*100 + ")";
    1411                                 else
    1412                                         y.opacity = z.now;
    1413 
    1414                         // My hate for IE will never die
    1415                         } else if ( parseInt(z.now) )
    1416                                 y[prop] = parseInt(z.now) + "px";
    1417                                
    1418                         y.display = "block";
    1419                 };
    1420        
    1421                 // Figure out the maximum number to run to
    1422                 z.max = function(){
    1423                         return parseFloat( jQuery.css(z.el,prop) );
    1424                 };
    1425        
    1426                 // Get the current size
    1427                 z.cur = function(){
    1428                         var r = parseFloat( jQuery.curCSS(z.el, prop) );
    1429                         return r && r > -10000 ? r : z.max();
    1430                 };
    1431        
    1432                 // Start an animation from one number to another
    1433                 z.custom = function(from,to){
    1434                         z.startTime = (new Date()).getTime();
    1435                         z.now = from;
    1436                         z.a();
    1437        
    1438                         z.timer = setInterval(function(){
    1439                                 z.step(from, to);
    1440                         }, 13);
    1441                 };
    1442        
    1443                 // Simple 'show' function
    1444                 z.show = function( p ){
    1445                         if ( !z.el.orig ) z.el.orig = {};
    1446 
    1447                         // Remember where we started, so that we can go back to it later
    1448                         z.el.orig[prop] = this.cur();
    1449 
    1450                         z.custom( 0, z.el.orig[prop] );
    1451 
    1452                         // Stupid IE, look what you made me do
    1453                         if ( prop != "opacity" )
    1454                                 y[prop] = "1px";
    1455                 };
    1456        
    1457                 // Simple 'hide' function
    1458                 z.hide = function(){
    1459                         if ( !z.el.orig ) z.el.orig = {};
    1460 
    1461                         // Remember where we started, so that we can go back to it later
    1462                         z.el.orig[prop] = this.cur();
    1463 
    1464                         z.o.hide = true;
    1465 
    1466                         // Begin the animation
    1467                         z.custom(z.el.orig[prop], 0);
    1468                 };
    1469        
    1470                 // IE has trouble with opacity if it does not have layout
    1471                 if ( jQuery.browser.msie && !z.el.currentStyle.hasLayout )
    1472                         y.zoom = "1";
    1473        
    1474                 // Remember  the overflow of the element
    1475                 if ( !z.el.oldOverlay )
    1476                         z.el.oldOverflow = jQuery.css( z.el, "overflow" );
    1477        
    1478                 // Make sure that nothing sneaks out
    1479                 y.overflow = "hidden";
    1480        
    1481                 // Each step of an animation
    1482                 z.step = function(firstNum, lastNum){
    1483                         var t = (new Date()).getTime();
    1484        
    1485                         if (t > z.o.duration + z.startTime) {
    1486                                 // Stop the timer
    1487                                 clearInterval(z.timer);
    1488                                 z.timer = null;
    1489 
    1490                                 z.now = lastNum;
    1491                                 z.a();
    1492 
    1493                                 z.el.curAnim[ prop ] = true;
    1494                                
    1495                                 var done = true;
    1496                                 for ( var i in z.el.curAnim )
    1497                                         if ( z.el.curAnim[i] !== true )
    1498                                                 done = false;
    1499                                                
    1500                                 if ( done ) {
    1501                                         // Reset the overflow
    1502                                         y.overflow = z.el.oldOverflow;
    1503                                
    1504                                         // Hide the element if the "hide" operation was done
    1505                                         if ( z.o.hide )
    1506                                                 y.display = 'none';
    1507                                        
    1508                                         // Reset the property, if the item has been hidden
    1509                                         if ( z.o.hide ) {
    1510                                                 for ( var p in z.el.curAnim ) {
    1511                                                         y[ p ] = z.el.orig[p] + ( p == "opacity" ? "" : "px" );
    1512        
    1513                                                         // set its height and/or width to auto
    1514                                                         if ( p == 'height' || p == 'width' )
    1515                                                                 jQuery.setAuto( z.el, p );
    1516                                                 }
    1517                                         }
    1518                                 }
    1519 
    1520                                 // If a callback was provided, execute it
    1521                                 if( done && z.o.complete && z.o.complete.constructor == Function )
    1522                                         // Execute the complete function
    1523                                         z.o.complete.apply( z.el );
    1524                         } else {
    1525                                 // Figure out where in the animation we are and set the number
    1526                                 var p = (t - this.startTime) / z.o.duration;
    1527                                 z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
    1528        
    1529                                 // Perform the next step of the animation
    1530                                 z.a();
    1531                         }
    1532                 };
    1533        
    1534         }
    1535 
    1536 });
    1537 // AJAX Plugin
    1538 // Docs Here:
    1539 // http://jquery.com/docs/ajax/
    1540 jQuery.fn.loadIfModified = function( url, params, callback ) {
    1541         this.load( url, params, callback, 1 );
    1542 };
    1543 
    1544 jQuery.fn.load = function( url, params, callback, ifModified ) {
    1545         if ( url.constructor == Function )
    1546                 return this.bind("load", url);
    1547 
    1548         callback = callback || function(){};
    1549 
    1550         // Default to a GET request
    1551         var type = "GET";
    1552 
    1553         // If the second parameter was provided
    1554         if ( params ) {
    1555                 // If it's a function
    1556                 if ( params.constructor == Function ) {
    1557                         // We assume that it's the callback
    1558                         callback = params;
    1559                         params = null;
    1560                        
    1561                 // Otherwise, build a param string
    1562                 } else {
    1563                         params = jQuery.param( params );
    1564                         type = "POST";
    1565                 }
    1566         }
    1567        
    1568         var self = this;
    1569        
    1570         // Request the remote document
    1571         jQuery.ajax( type, url, params,function(res, status){
    1572                
    1573                 if ( status == "success" || !ifModified && status == "notmodified" ) {
    1574                         // Inject the HTML into all the matched elements
    1575                         self.html(res.responseText).each( callback, [res.responseText, status] );
    1576                        
    1577                         // Execute all the scripts inside of the newly-injected HTML
    1578                         $("script", self).each(function(){
    1579                                 if ( this.src )
    1580                                         $.getScript( this.src );
    1581                                 else
    1582                                         eval.call( window, this.text || this.textContent || this.innerHTML || "" );
    1583                         });
    1584                 } else
    1585                         callback.apply( self, [res.responseText, status] );
    1586 
    1587         }, ifModified);
    1588        
    1589         return this;
    1590 };
    1591 
    1592 // If IE is used, create a wrapper for the XMLHttpRequest object
    1593 if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" )
    1594         XMLHttpRequest = function(){
    1595                 return new ActiveXObject(
    1596                         navigator.userAgent.indexOf("MSIE 5") >= 0 ?
    1597                         "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
    1598                 );
    1599         };
    1600 
    1601 // Attach a bunch of functions for handling common AJAX events
    1602 new function(){
    1603         var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(',');
    1604        
    1605         for ( var i = 0; i < e.length; i++ ) new function(){
    1606                 var o = e[i];
    1607                 jQuery.fn[o] = function(f){
    1608                         return this.bind(o, f);
    1609                 };
    1610         };
    1611 };
    1612 
    1613 jQuery.extend({
    1614         get: function( url, data, callback, type, ifModified ) {
    1615                 if ( data.constructor == Function ) {
    1616                         type = callback;
    1617                         callback = data;
    1618                         data = null;
    1619                 }
    1620                
    1621                 if ( data ) url += "?" + jQuery.param(data);
    1622                
    1623                 // Build and start the HTTP Request
    1624                 jQuery.ajax( "GET", url, null, function(r, status) {
    1625                         if ( callback ) callback( jQuery.httpData(r,type), status );
    1626                 }, ifModified);
    1627         },
    1628 
    1629         getIfModified: function( url, data, callback, type ) {
    1630                 jQuery.get(url, data, callback, type, 1);
    1631         },
    1632 
    1633         getScript: function( url, data, callback ) {
    1634                 jQuery.get(url, data, callback, "script");
    1635         },
    1636         post: function( url, data, callback, type ) {
    1637                 // Build and start the HTTP Request
    1638                 jQuery.ajax( "POST", url, jQuery.param(data), function(r, status) {
    1639                         if ( callback ) callback( jQuery.httpData(r,type), status );
    1640                 });
    1641         },
    1642        
    1643         // timeout (ms)
    1644         timeout: 0,
    1645 
    1646         ajaxTimeout: function(timeout) {
    1647                 jQuery.timeout = timeout;
    1648         },
    1649 
    1650         // Last-Modified header cache for next request
    1651         lastModified: {},
    1652         ajax: function( type, url, data, ret, ifModified ) {
    1653                 // If only a single argument was passed in,
    1654                 // assume that it is a object of key/value pairs
    1655                 if ( !url ) {
    1656                         ret = type.complete;
    1657                         var success = type.success;
    1658                         var error = type.error;
    1659                         data = type.data;
    1660                         url = type.url;
    1661                         type = type.type;
    1662                 }
    1663                
    1664                 // Watch for a new set of requests
    1665                 if ( ! jQuery.active++ )
    1666                         jQuery.event.trigger( "ajaxStart" );
    1667 
    1668                 var requestDone = false;
    1669        
    1670                 // Create the request object
    1671                 var xml = new XMLHttpRequest();
    1672        
    1673                 // Open the socket
    1674                 xml.open(type || "GET", url, true);
    1675                
    1676                 // Set the correct header, if data is being sent
    1677                 if ( data )
    1678                         xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    1679                
    1680                 // Set the If-Modified-Since header, if ifModified mode.
    1681                 if ( ifModified )
    1682                         xml.setRequestHeader("If-Modified-Since",
    1683                                 jQuery.lastModified[url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
    1684                
    1685                 // Set header so calling script knows that it's an XMLHttpRequest
    1686                 xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    1687        
    1688                 // Make sure the browser sends the right content length
    1689                 if ( xml.overrideMimeType )
    1690                         xml.setRequestHeader("Connection", "close");
    1691                
    1692                 // Wait for a response to come back
    1693                 var onreadystatechange = function(istimeout){
    1694                         // The transfer is complete and the data is available, or the request timed out
    1695                         if ( xml && (xml.readyState == 4 || istimeout == "timeout") ) {
    1696                                 requestDone = true;
    1697 
    1698                                 var status = jQuery.httpSuccess( xml ) && istimeout != "timeout" ?
    1699                                         ifModified && jQuery.httpNotModified( xml, url ) ? "notmodified" : "success" : "error";
    1700                                
    1701                                 // Make sure that the request was successful or notmodified
    1702                                 if ( status != "error" ) {
    1703                                         // Cache Last-Modified header, if ifModified mode.
    1704                                         var modRes = xml.getResponseHeader("Last-Modified");
    1705                                         if ( ifModified && modRes ) jQuery.lastModified[url] = modRes;
    1706                                        
    1707                                         // If a local callback was specified, fire it
    1708                                         if ( success ) success( xml, status );
    1709                                        
    1710                                         // Fire the global callback
    1711                                         jQuery.event.trigger( "ajaxSuccess" );
    1712                                
    1713                                 // Otherwise, the request was not successful
    1714                                 } else {
    1715                                         // If a local callback was specified, fire it
    1716                                         if ( error ) error( xml, status );
    1717                                        
    1718                                         // Fire the global callback
    1719                                         jQuery.event.trigger( "ajaxError" );
    1720                                 }
    1721                                
    1722                                 // The request was completed
    1723                                 jQuery.event.trigger( "ajaxComplete" );
    1724                                
    1725                                 // Handle the global AJAX counter
    1726                                 if ( ! --jQuery.active )
    1727                                         jQuery.event.trigger( "ajaxStop" );
    1728        
    1729                                 // Process result
    1730                                 if ( ret ) ret(xml, status);
    1731                                
    1732                                 // Stop memory leaks
    1733                                 xml.onreadystatechange = function(){};
    1734                                 xml = null;
    1735                                
    1736                         }
    1737                 };
    1738                 xml.onreadystatechange = onreadystatechange;
    1739                
    1740                 // Timeout checker
    1741                 if(jQuery.timeout > 0)
    1742                         setTimeout(function(){
    1743                                 // Check to see if the request is still happening
    1744                                 if (xml) {
    1745                                         // Cancel the request
    1746                                         xml.abort();
    1747 
    1748                                         if ( !requestDone ) onreadystatechange( "timeout" );
    1749 
    1750                                         // Clear from memory
    1751                                         xml = null;
    1752                                 }
    1753                         }, jQuery.timeout);
    1754                
    1755                 // Send the data
    1756                 xml.send(data);
    1757         },
    1758        
    1759         // Counter for holding the number of active queries
    1760         active: 0,
    1761        
    1762         // Determines if an XMLHttpRequest was successful or not
    1763         httpSuccess: function(r) {
    1764                 try {
    1765                         return !r.status && location.protocol == "file:" ||
    1766                                 ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
    1767                                 jQuery.browser.safari && r.status == undefined;
    1768                 } catch(e){}
    1769 
    1770                 return false;
    1771         },
    1772 
    1773         // Determines if an XMLHttpRequest returns NotModified
    1774         httpNotModified: function(xml, url) {
    1775                 try {
    1776                         var xmlRes = xml.getResponseHeader("Last-Modified");
    1777 
    1778                         // Firefox always returns 200. check Last-Modified date
    1779                         return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
    1780                                 jQuery.browser.safari && xml.status == undefined;
    1781                 } catch(e){}
    1782 
    1783                 return false;
    1784         },
    1785        
    1786         // Get the data out of an XMLHttpRequest.
    1787         // Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
    1788         // otherwise return plain text.
    1789         httpData: function(r,type) {
    1790                 var ct = r.getResponseHeader("content-type");
    1791                 var data = !type && ct && ct.indexOf("xml") >= 0;
    1792                 data = type == "xml" || data ? r.responseXML : r.responseText;
    1793 
    1794                 // If the type is "script", eval it
    1795                 if ( type == "script" ) eval.call( window, data );
    1796 
    1797                 // Get the JavaScript object, if JSON is used.
    1798                 if ( type == "json" ) eval( "data = " + data );
    1799 
    1800                 return data;
    1801         },
    1802        
    1803         // Serialize an array of form elements or a set of
    1804         // key/values into a query string
    1805         param: function(a) {
    1806                 var s = [];
    1807                
    1808                 // If an array was passed in, assume that it is an array
    1809                 // of form elements
    1810                 if ( a.constructor == Array ) {
    1811                         // Serialize the form elements
    1812                         for ( var i = 0; i < a.length; i++ )
    1813                                 s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
    1814                        
    1815                 // Otherwise, assume that it's an object of key/value pairs
    1816                 } else {
    1817                         // Serialize the key/values
    1818                         for ( var j in a )
    1819                                 s.push( j + "=" + encodeURIComponent( a[j] ) );
    1820                 }
    1821                
    1822                 // Return the resulting serialization
    1823                 return s.join("&");
    1824         }
    1825 
    1826 });
  • ticketdelete/htdocs/ticketdelete.css

     
    11.inlinebuttons a {
    2  font-size: 87%;
     2 font-size: 75%;
     3 vertical-align: middle;
    34 border-width: 1px;
    45 border-style: dotted;
    56 border-color: #ccc;
    67 margin: 0;
    78 padding: 0.1em;
    89 background: none;
    9  color: #000;
     10 color: #222;
    1011}
    1112
    1213.inlinebuttons a:hover {
  • ticketdelete/templates/ticketdelete_admin.html

     
    3131        Ticket ID: <input type="text" name="ticketid" value="${ticketdelete.id}"/><br />
    3232        Again: <input type="text" name="ticketid2" value="${ticketdelete.id}"/><br />
    3333          <input type="submit" value="Delete" />
     34          <py:if test="req.args['referrer'] or req.get_header('Referer')">
     35           <input type="hidden" name="referrer" value="${req.args['referrer'] or req.get_header('Referer')}"/>
     36          </py:if>
    3437      </form>
    3538    </py:when>
    3639    <py:when test="ticketdelete.page == 'comments'">
     
    4144          </p>
    4245          <p>Please select a change to delete</p>
    4346       
    44           <p><form method="post"><table class="listing">
     47          <p><form method="post">
     48            <py:if test="req.args['referrer'] or req.get_header('Referer')">
     49             <input type="hidden" name="referrer" value="${req.args['referrer'] or req.get_header('Referer')}"/>
     50            </py:if>
     51            <table class="listing">
    4552            <thead><tr><th class="sel" /><th>Field</th><th>Old Value</th><th>New Value</th><th /></tr></thead>
    4653            <tbody>
    4754              <py:for each="change in ticketdelete.changes">
    4855                <tr>
    49                   <td><input type="checkbox" name="dontcare" value="dontcare" id="checkbox_${change}" checked="${change.checked or None}" /></td>
    50                   <td colspan="3"><b>Change at ${ticketdelete.changes[change].prettytime} by ${ticketdelete.changes[change].author}</b></td>
    51                   <td><input type="submit" name="delete_${change}" value="Delete change" /></td>
     56                  <td><input type="checkbox" name="dontcare" value="dontcare" id="checkbox_${change.ts}" checked="${change.checked or None}" /></td>
     57                  <td colspan="3"><b>Change at ${change.prettytime} by ${change.author}</b></td>
     58                  <td><input type="submit" name="delete_${change.ts}" value="Delete change" /></td>
     59                </tr>
     60                <py:for each="field in change.fields">
    5261                  <tr>
    53                     <py:for each="field in ticketdelete.changes[change].fields">
    54                       <tr>
    55                         <td><input type="checkbox" id="checkbox${field}_${change}" name="mdelete" value="${field}_${change}" checked="${ticketdelete.changes[change].checked or None}" /></td>
    56                         <td>${field}</td>
    57                         <td>${ticketdelete.changes[change].fields[field].old}</td>
    58                         <td>${ticketdelete.changes[change].fields[field].new}</td>
    59                         <td><input type="submit" name="delete${field}_${change}" value="Delete field" /></td>
    60                       </tr>
    61                     </py:for>
    62                   </tr>
    63                 </tr>
     62                    <td><input type="checkbox" id="checkbox${field}_${change.ts}" name="mdelete" value="${field}_${change.ts}" checked="${change.checked or None}" /></td>
     63                    <td>${field}</td>
     64                      <py:choose>
     65                        <py:when test="field == 'comment'">
     66                          <td colspan="2">${change.fields[field].new}</td>
     67                        </py:when>
     68                        <py:otherwise>
     69                           <td>${change.fields[field].old}</td>
     70                           <td>${change.fields[field].new}</td>
     71                        </py:otherwise>
     72                      </py:choose>
     73                      <td><input type="submit" name="delete${field}_${change.ts}" value="Delete field" /></td>
     74                    </tr>
     75                 </py:for>
    6476              </py:for>
    6577            </tbody>
    6678        </table><br /><input type="submit" name="multidelete" value="Delete Checked" /></form></p>
    6779       
    6880        <script type="text/javascript">
    69         <!--
    7081            function toggleboxen(me, boxen)
    7182            {
    7283                status = document.getElementById("checkbox_" + me).checked;
     
    7889            }
    7990           
    8091            <py:for each="change in ticketdelete.changes">
    81             addEvent(document.getElementById("checkbox_${change}"), "change", function() {
    82                 var boxen = Array(${py:for each="field in change.fields"${field}",</py:for>"");
    83                 toggleboxen("${change}", boxen); //Array(<py:for each="field in change.fields">"${field}",</py:for>));
     92            addEvent(document.getElementById("checkbox_${change.ts}"), "change", function() {
     93                var boxen = Array(<py:for each="field in change.fields">"${field}",</py:for>"");
     94                toggleboxen("${change.ts}", boxen); //Array(<py:for each="field in change.fields">"${field}",</py:for>));
    8495            });
    8596            <py:for each="field in change.fields">
    86               addEvent(document.getElementById("checkbox${field}_${change}"),"change", function() {
    87                   if(!document.getElementById("checkbox${field}_${change}").checked) {
    88                   document.getElementById("checkbox${change}").checked = 0;
     97              addEvent(document.getElementById("checkbox${field}_${change.ts}"),"change", function() {
     98                if(!document.getElementById("checkbox${field}_${change.ts}").checked) {
     99                  document.getElementById("checkbox_${change.ts}").checked = 0;
    89100                }
    90101            });
    91102            </py:for>
    92103            </py:for>
    93 
    94 
    95         //-->
    96104        </script>
    97105
    98106
All information, including names and email addresses, entered onto this website or sent to mailing lists affiliated with this website will be public. Do not post confidential information, especially passwords!