1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
4 <title>git browser
</title>
6 Copyright (C) 2005, Artem Khodush <greenkaa@gmail.com>
8 This file is licensed under the GNU General Public License version 2.
10 <script type=
"text/javascript" src=
"js.lib/DomTemplate.js"></script>
11 <script type=
"text/javascript" src=
"js.lib/InvisibleRequest.js"></script>
12 <script type=
"text/javascript" src=
"js.lib/Motion.js"></script>
13 <script type=
"text/javascript" src=
"js.lib/wz_jsgraphics.js"></script>
14 <script type=
"text/javascript" src=
"GitBrowser.js"></script>
15 <script type=
"text/javascript" src=
"GitDiagram.js"></script>
16 <script type=
"text/javascript">
21 format_popup_date=function( node
)
24 if( node
.time
!=null ) {
25 var dt
=new Date( node
.time
);
26 var date
=dt
.getDate();
27 var month
=GitDiagram
._g_month_names
[dt
.getMonth()];
28 var year
=dt
.getFullYear();
29 var hour
=dt
.getHours();
30 var minute
=dt
.getMinutes();
31 minute
= minute
<10 ? "0"+minute
: minute
;
32 date_str
=month
+" "+date
+" "+year
+" "+hour
+":"+minute
38 on_drag_mouse_down=function( e
, diagram
)
40 // browsers ignore setting move cursor here
42 on_drag_mouse_up=function( e
, diagram
, offset
)
44 document
.body
.style
.cursor
="default";
45 diagram
.end_move( offset
);
47 on_drag_mouse_move=function( e
, diagram
, offset
, first
)
51 document
.body
.style
.cursor
="move";
54 diagram
.track_move( offset
);
57 process_date_column_stat=function( date_column
, stat
)
59 for( var i
=0; i
<date_column
.lines
.length
; ++i
) {
60 var node
=date_column
.lines
[i
];
61 if( stat
.min_y
==null || stat
.min_y
>node
.absolute_y
) {
62 stat
.min_y
=node
.absolute_y
;
64 if( stat
.max_y
==null || stat
.max_y
<node
.absolute_y
) {
65 stat
.max_y
=node
.absolute_y
;
68 if( stat
.max_count
==null || stat
.max_count
<date_column
.lines
.length
) {
69 stat
.max_count
=date_column
.lines
.length
;
74 on_draw=function( diagram
, phase
)
76 if( phase
=="begin" ) {
77 // tstart=(new Date()).getTime();
78 GitBrowser
.status_show( "drawing..." );
79 document
.body
.style
.cursor
="wait";
81 Motion
.cancel_drag( diagram
.m_container_element
);
82 }else if( phase
=="end" ) {
83 GitBrowser
.status_show();
84 if( g_selected_nodes
["diff"].highlight_node
!=null ) {
85 diagram
.select_node( g_selected_nodes
["diff"].highlight_node
.id
, g_selected_nodes
["diff"].color
);
87 if( g_selected_nodes
["pin"].highlight_node
!=null ) {
88 diagram
.select_node( g_selected_nodes
["pin"].highlight_node
.id
, g_selected_nodes
["pin"].color
);
90 document
.body
.style
.cursor
="";
93 node
: diagram
.m_container_element
,
94 down_handler
: on_drag_mouse_down
,
95 up_handler
: on_drag_mouse_up
,
96 move_handler
: on_drag_mouse_move
,
101 var tstop=(new Date()).getTime();
102 var d=g_diagram.m_container_element;
105 var s="drawing time: "+((tstop-tstart)/1000)+" body children: "+document.body.childNodes.length+" diagram children: "+d.childNodes.length+" canvas children: "+c.childNodes.length+" subcanvas children: "+cc.childNodes.length;
106 s+=" track_leave bind count: "+Motion._g_enter_leave_binder.m_objects.length;
111 on_place=function( diagram
, phase
)
113 if( phase
=="begin" ) {
114 GitBrowser
.status_show( "placing..." );
115 document
.body
.style
.cursor
="wait";
116 // tstart=(new Date()).getTime();
117 }else if( phase
=="end" ) {
118 document
.body
.style
.cursor
="";
119 GitBrowser
.status_show();
123 for( var i
=0; i
<diagram
.m_date_columns
.length
; ++i
) {
124 process_date_column_stat( diagram
.m_date_columns
[i
], stat
);
126 // xdp( "span "+(stat.max_y-stat.min_y)+" max count "+stat.max_count );
129 var tstop=(new Date()).getTime();
130 var s="placing time: "+((tstop-tstart)/1000)+" nodes: "+diagram.m_node_count+" unloaded nodes: "+diagram.m_start_more_ids.length;
135 on_node_init=function( diagram
, node
, node_div
)
137 if( node
.popup_id
==null ) {
138 var popup_nodes
= node
.coalesced_nodes
==null ? [node
] : node
.coalesced_nodes
;
139 node
.popup_id
=Motion
.attach_popup( { trigger_node
: node_div
, anchor_offset
: 4, side
: "right", side_align
: "top",
140 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: popup_nodes
}, on_show
: popup_on_show
,
141 delay_show_seconds
: 0.3//, transparent: true
143 g_track_popups
.push( node_div
);
145 Motion
.attach_same_popup( node
.popup_id
, node_div
);
148 // diagram node highlight
150 "popup_track": { node
: null, color
: "#ffe000", highlight_node
: null },
151 "diff" : { node
: null, color
: "#44f088", highlight_node
: null },
152 "pin" : { node
: null, color
: "#44a0ff", highlight_node
: null }
154 select_node=function( select_kind
, node
, highlight_node
)
156 var prev_highlight
=g_selected_nodes
[select_kind
].highlight_node
;
157 g_selected_nodes
[select_kind
].node
=node
;
158 g_selected_nodes
[select_kind
].highlight_node
=highlight_node
;
159 if( highlight_node
!=null ) {
160 g_diagram
.select_node( highlight_node
.id
, g_selected_nodes
[select_kind
].color
);
162 if( prev_highlight
!=null ) {
164 var order
=["diff", "pin", "popup_track"];
165 for( var i
=0; i
<order
.length
; ++i
) {
166 if( order
[i
]!=select_kind
&& g_selected_nodes
[order
[i
]].highlight_node
==prev_highlight
) {
167 prev_color
=g_selected_nodes
[order
[i
]].color
;
170 g_diagram
.select_node( prev_highlight
.id
, prev_color
);
175 g_diff_pane_pos
={ x
: 0, y
: 0 };
176 g_diff_pane_size
={ x
: 0, y
: 0 };
177 update_diffview_height=function()
179 var diffheaddiff
=document
.getElementById( "diffheaddiff" );
181 if( diffheaddiff
.style
.display
!="none" ) {
182 var diff_comment
=document
.getElementById( diffheaddiff
._gitbrowser_comment_id
);
183 if( diff_comment
!=null ) {
184 diff_comment
.style
.color
="#000";
185 if( diff_comment
.scrollHeight
>g_max_diff_comment_height
) {
186 diff_comment
.style
.height
=g_max_diff_comment_height
+"px";
189 diff_height
=diffheaddiff
.clientHeight
;
191 var diffheadpin
=document
.getElementById( "diffheadpin" );
193 if( diffheadpin
.style
.dislpay
!="none" ) {
194 var pin_comment
=document
.getElementById( diffheadpin
._gitbrowser_comment_id
);
195 if( pin_comment
!=null ) {
196 pin_comment
.style
.color
="#787878";
197 if( pin_comment
.scrollHeight
>g_max_diff_comment_height
) {
198 pin_comment
.style
.height
=g_max_diff_comment_height
+"px";
201 pin_height
=diffheadpin
.clientHeight
;
203 var diffhead_height
=Math
.max( diff_height
, pin_height
);
205 var diffview
=document
.getElementById( "diffview" );
206 Motion
.set_page_coords( diffview
, g_diff_pane_pos
.x
, g_diff_pane_pos
.y
+diffhead_height
);
207 diffview
.style
.width
=(g_diff_pane_size
.x
-4)+"px";
208 diffview
.style
.height
=(g_diff_pane_size
.y
-diffhead_height
)+"px";
210 on_splitter_resize=function( arg
, title_div
)
212 var diagram_div
=document
.getElementById( "diagram" );
213 var title_height
=title_div
.clientHeight
;
214 Motion
.set_page_coords( diagram_div
, arg
.half1_pos
.x
, arg
.half1_pos
.y
+title_height
);
215 diagram_div
.style
.width
=(arg
.half1_wh
.x
-4)+"px";
216 diagram_div
.style
.height
=(arg
.half1_wh
.y
-title_height
)+"px";
218 g_diff_pane_pos
=arg
.half2_pos
;
219 g_diff_pane_size
=arg
.half2_wh
;
220 update_diffview_height();
225 clear_pin_and_diff=function()
227 select_node( "pin", null, null );
228 select_node( "diff", null, null );
229 document
.getElementById( "diffheaddiff" ).innerHTML
="";
230 document
.getElementById( "diffheadpin" ).innerHTML
="";
231 document
.getElementById( "differror" ).style
.display
="none";
232 document
.getElementById( "diffview" ).style
.display
="none";
233 document
.getElementById( "diffview" ).src
="";
235 g_max_diff_comment_height
=50;
236 update_diff_title=function( which
, node
)
238 var highlight_node
=node
.coalesced_to
==null ? node
: node
.coalesced_to
;
239 select_node( which
, node
, highlight_node
);
240 var title_dest
=document
.getElementById( "diffhead"+which
);
241 title_dest
.innerHTML
="";
243 date
: format_popup_date( node
),
247 _process: function( n
, arg
) {
248 arg
.dest
._gitbrowser_comment_id
=n
.id
;
250 _process_arg
: { dest
: title_dest
}
252 clear
: which
=="diff" ? null : { _process: function( n
, arg
) { n
.onclick
=clear_pin_and_diff
; } },
253 bullet
: which
=="diff" ? null : { _process: function( n
, arg
) { n
.style
.border
=arg
==null ? "" : "2px solid "+arg
; }, _process_arg
: g_selected_nodes
[which
].color
}
255 DomTemplate
.apply( document
.getElementById( "difftitle" ), data
, title_dest
);
256 var other
=which
=="diff" ? "pin" : "diff";
257 var other_node
=g_selected_nodes
[other
].node
;
258 var other_title
=document
.getElementById( "diffhead"+other
);
259 if( other_node
==null ) {
260 other_title
.style
.display
="none";
261 title_dest
.style
.width
="100%";
262 title_dest
.style
.styleFloat
="";
263 title_dest
.style
.cssFloat
="";
264 title_dest
.style
.display
="";
265 var comment
=document
.getElementById( title_dest
._gitbrowser_comment_id
);
266 if( comment
!=null ) {
267 comment
.style
.color
="#000";
268 if( comment
.clientHeight
>g_max_diff_comment_height
) {
269 comment
.style
.height
=g_max_diff_comment_height
+"px";
273 var left_title
=title_dest
;
274 var right_title
=other_title
;
275 if( other_node
.time
<node
.time
) {
276 left_title
=other_title
;
277 right_title
=title_dest
;
279 left_title
.style
.width
="49%";
280 left_title
.style
.styleFloat
="left";
281 left_title
.style
.cssFloat
="left";
282 right_title
.style
.width
="49%";
283 right_title
.style
.styleFloat
="right";
284 right_title
.style
.cssFloat
="right";
285 left_title
.style
.display
="";
286 right_title
.style
.display
="";
292 var right_diff_node
=g_selected_nodes
["diff"].node
;
293 var left_diff_node
=g_selected_nodes
["pin"].node
;
294 if( right_diff_node
!=null ) {
295 if( left_diff_node
==null ) {
296 left_diff_node
=right_diff_node
.parents
[0];
298 if( left_diff_node
.time
>right_diff_node
.time
) {
299 var t
=left_diff_node
;
300 left_diff_node
=right_diff_node
;
304 if( left_diff_node
!=null ) {
306 if( left_diff_node
==right_diff_node
) {
307 msg
="can't diff the node with itself";
309 // find repo both nodes belong to
310 var common_repo
=null;
312 for( var left_i
=0; left_i
<left_diff_node
.repos
.length
; ++left_i
) {
313 for( var right_i
=0; right_i
<right_diff_node
.repos
.length
; ++right_i
) {
314 if( left_diff_node
.repos
[left_i
]==right_diff_node
.repos
[right_i
] ) {
315 common_repo
=left_diff_node
.repos
[left_i
];
319 if( common_repo
==null ) {
320 msg
="can't diff nodes from different repositories: left from "+left_diff_node
.repos
.join( "," )+"; right from "+right_diff_node
.repos
.join( "," );
324 var differror
=document
.getElementById( "differror" );
325 differror
.style
.display
="";
326 differror
.innerHTML
="";
327 differror
.appendChild( document
.createTextNode( msg
) );
328 document
.getElementById( "diffview" ).style
.display
="none";
330 document
.getElementById( "differror" ).style
.display
="none";
331 document
.getElementById( "diffview" ).style
.display
="";
332 document
.getElementById( "diffloader" ).src
="git-diff.cgi?repo="+common_repo
+"&id1="+left_diff_node
.id
+"&id2="+right_diff_node
.id
;
335 update_diffview_height();
338 diff_iframe_onload=function()
340 document
.getElementById( "diffview" ).innerHTML
=window
.frames
.diffloader
.document
.body
.innerHTML
;
344 if( this._gitbrowser_diagram_id
!=null && this._gitbrowser_node_id
!=null ) {
345 var node
=g_diagram
.m_nodes
[this._gitbrowser_node_id
];
347 clear_pin_and_diff();
348 update_diff_title( "pin", node
);
349 var pn
=find_popup_node_div( this );
351 var popup
=pn
.parentNode
;
352 update_popup( popup
);
359 if( this._gitbrowser_diagram_id
!=null && this._gitbrowser_node_id
!=null ) {
360 var node
=g_diagram
.m_nodes
[this._gitbrowser_node_id
];
362 update_diff_title( "diff", node
);
370 g_track_enter_leave
=[];
371 release_popups=function()
374 for( i
=0; i
<g_track_popups
.length
; ++i
) {
375 Motion
.detach_popup( g_track_popups
[i
] );
378 for( i
=0; i
<g_track_enter_leave
.length
; ++i
) {
379 Motion
.cancel_enter_leave( g_track_enter_leave
[i
] );
381 g_track_enter_leave
=[];
382 for( i
in g_diagram
.m_nodes
) {
383 g_diagram
.m_nodes
[i
].popup_id
=null;
386 popup_enter=function( popup
, arg
)
388 var node
=arg
.diagram
.m_nodes
[arg
.node_id
];
389 var highlight_node
=node
.coalesced_to
!=null ? node
.coalesced_to
: node
;
390 select_node( "popup_track", node
, highlight_node
);
392 popup_leave=function( popup
, arg
)
394 select_node( "popup_track", null, null );
396 find_popup_node_div=function( btn
)
398 var pn
=btn
.parentNode
;
400 if( pn
.id
!=null && pn
.id
.match( "^node" ) ) {
407 remember_button_id=function( btn
, tag
)
409 var pn
=find_popup_node_div( btn
);
414 g_popup_max_width
=220;
415 popup_filler=function( popup
, arg
)
417 var diagram
=arg
.diagram
;
419 popup
.style
.padding
="2px";
420 var data
={ node
: [] };
421 for( var node_i
=0; node_i
<nodes
.length
; ++node_i
) {
422 var node
=nodes
[node_i
];
424 if( node
.author
==null ) {
425 node_data
={ not_loaded
: {} };
430 _process: function( n
, arg
) {
431 Motion
.attach_popup( { trigger_node
: n
, x_anchor_node
: popup
, y_anchor_node
: n
, anchor_offset
: 1, side
: "left", side_align
: "top",
432 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: arg
}, on_show
: popup_on_show
,
433 delay_show_seconds
: 0.3//, transparent: true
435 g_track_popups
.push( n
);
436 remember_button_id( n
, "_gitbrowser_popup_parents_button" );
438 _process_arg
: node
.parents
441 _process: function( n
, arg
) {
442 Motion
.attach_popup( { trigger_node
: n
, x_anchor_node
: popup
,y_anchor_node
: n
, anchor_offset
: 1, side
: "right", side_align
: "top",
443 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: arg
}, on_show
: popup_on_show
,
444 delay_show_seconds
: 0.3//, transparent: true
446 g_track_popups
.push( n
);
447 remember_button_id( n
, "_gitbrowser_popup_children_button" );
449 _process_arg
: node
.children
451 diff_btn
: node
.date
==null ? null : {
452 _process: function( n
, arg
) {
453 n
._gitbrowser_diagram_id
=arg
.diagram
.m_diagram_id
;
454 n
._gitbrowser_node_id
=arg
.node
.id
;
456 remember_button_id( n
, "_gitbrowser_popup_diff_button" );
458 _process_arg
: { diagram
: diagram
, node
: node
}
460 pin_btn
: node
.date
==null ? null : {
461 _process: function( n
, arg
) {
462 n
._gitbrowser_diagram_id
=arg
.diagram
.m_diagram_id
;
463 n
._gitbrowser_node_id
=arg
.node
.id
;
465 remember_button_id( n
, "_gitbrowser_popup_pin_button" );
467 _process_arg
: { diagram
: diagram
, node
: node
}
470 date
: format_popup_date( node
),
471 author
: node
.author
==null ? "" : node
.author
,
472 comment
: node
.comment
==null ? "" : node
.comment
,
473 _process: function( n
, arg
) {
474 Motion
.track_enter_leave( { node
: n
,
475 enter_handler
: popup_enter
, leave_handler
: popup_leave
, handler_arg
: { diagram
: arg
.diagram
, node_id
: arg
.node
.id
}
477 g_track_enter_leave
.push( n
);
478 n
._gitbrowser_node_is_root
=arg
.node
.parents
.length
==0;
479 n
._gitbrowser_node_is_leaf
=arg
.node
.children
.length
==0;
481 _process_arg
: { diagram
: diagram
, node
: node
}
484 data
.node
.push( node_data
);
486 DomTemplate
.apply( document
.getElementById( "popuptemplate" ), data
, popup
);
488 if( popup
.clientWidth
>=g_popup_max_width
) {
489 popup
.style
.width
=g_popup_max_width
+"px";
491 // stretch table with buttons to fill all popup width
492 for( var node_div
=popup
.firstChild
; node_div
!=null; node_div
=node_div
.nextSibling
) {
493 var table
=node_div
.firstChild
;
495 table
.width
=(popup
.clientWidth
-8)+"px";
499 update_popup_node_div=function( cn
, old_state
, new_state
)
501 if( old_state
==null ) { // do initialization for the first time only
502 var children_button
=document
.getElementById( cn
._gitbrowser_popup_children_button
);
503 children_button
.style
.visibility
= cn
._gitbrowser_node_is_leaf
? "hidden" : "";
504 var parents_button
=document
.getElementById( cn
._gitbrowser_popup_parents_button
);
505 parents_button
.style
.visibility
= cn
._gitbrowser_node_is_root
? "hidden" : "";
507 var diff_button
=document
.getElementById( cn
._gitbrowser_popup_diff_button
);
508 var pin_button
=document
.getElementById( cn
._gitbrowser_popup_pin_button
);
509 if( new_state
=="normal" ) {
510 diff_button
.innerHTML
=" diff";
511 diff_button
.style
.visibility
=cn
._gitbrowser_node_is_root
? "hidden" : "";
512 pin_button
.innerHTML
="pin ";
513 pin_button
.style
.visibility
="";
515 diff_button
.innerHTML
=" diff to pin";
516 diff_button
.style
.visibility
= diff_button
._gitbrowser_node_id
==g_selected_nodes
["pin"].node
.id
? "hidden" : ""; // avoid diff with itself
517 pin_button
.innerHTML
="";
518 pin_button
.style
.visibility
="hidden";
521 update_popup=function( popup
)
523 var pinned_node
=g_selected_nodes
["pin"].node
;
524 var pinned_id
=pinned_node
==null ? null : pinned_node
.id
;
525 var new_state
= pinned_node
==null ? "normal" : "pinned";
526 var old_state
=popup
._gitbrowser_popup_state
;
527 if( old_state
!=new_state
|| popup
._gitbrowser_pinned_id
!=pinned_id
) {
528 popup
._gitbrowser_popup_state
=new_state
;
529 popup
._gitbrowser_pinned_id
!=pinned_id
;
530 for( var cn
=popup
.firstChild
; cn
!=null; cn
=cn
.nextSibling
) {
531 if( cn
._gitbrowser_popup_diff_button
!=null && cn
._gitbrowser_popup_pin_button
!=null && cn
._gitbrowser_popup_children_button
!=null && cn
._gitbrowser_popup_parents_button
!=null ) {
532 update_popup_node_div( cn
, old_state
, new_state
);
537 popup_on_show=function( popup
)
539 update_popup( popup
);
542 // global initialization, diagram loading
543 place_and_draw=function( context
, keep_window_offset
)
545 context
.diagram
.place_nodes( keep_window_offset
);
546 context
.diagram
.draw();
547 GitBrowser
.title_update( { diagram
: context
.diagram
} );
549 on_title_loaded=function( context
)
551 Motion
.make_splitter( { direction
: "h", container
: document
.body
, initial_split
: 0.5,
552 contents1
: [ context
.title_div
, context
.diagram_div
],
553 contents2
: [ document
.getElementById( "diff" ) ],
554 resize_handler
: on_splitter_resize
,
555 resize_handler_arg
: context
.title_div
,
556 move_handler: function( arg
, first
) { if( first
) { context
.diagram
.m_container_element
.innerHTML
=""; } } // speed up splitter drag start
563 "node_init": on_node_init
567 var diagram_div
=document
.getElementById( "diagram" );
568 g_diagram
=new GitDiagram( {
569 container_element
: diagram_div
,
571 ui_handler
: GitBrowser
.diagram_ui_handler
,
572 ui_handler_arg
: g_ui_map
575 repos
: GitBrowser
.repos_decode_location( location
),
576 diagram_div
: diagram_div
, // diagram_div is a payload
578 title_loaded_handler
: on_title_loaded
,
579 commits_first_loaded_handler: function( context
) { place_and_draw( context
, false ); },
580 commits_more_loaded_handler: function( context
) { place_and_draw( context
, true ); }
587 var o
=document
.getElementById( "output" );
589 o
.appendChild( document
.createElement( "DIV" ) ).appendChild( document
.createTextNode( msg
) );
594 <link rel=
"stylesheet" type=
"text/css" href=
"GitBrowser.css"></link>
595 <style type=
"text/css">
596 html
{ height: 99.8%; }
597 body
{ height: 99.8%; font: normal normal
12px sans-serif
; overflow: hidden
; }
599 #diagram { border: 1px solid
#090; position: absolute
; }
601 .difftitle td { font-size: 12px; padding: 2px; }
602 .difftitledate, .difftitleauthor { font-weight: bold
; color: #7878b8; }
603 .diffnodebullet { width: 6px; height: 6px; background-color: #330; font-size: 1px; }
604 .diffcomment { overflow: auto
; font-size: 12px; }
605 .differror { font-size: 12px; color: #a82222; }
607 #diffseparator { clear: both
; width: 100%; margin: 3px 0 4px 0; border-bottom: 1px solid
#a8a8a8; line-height:0; }
609 .popupnode { color: #000; background-color: #f8fff8; border: 1px solid
#7b7; font-family: sans-serif
; font-size: 11px; padding-left: 2px; padding-right: 1px; margin-bottom: 2px; }
610 .popupdate { margin-top: 3px; }
611 .popupbutton { color: #000; background-color: #f4f4fc; border: 1px solid
#a0a0ff; padding: 0; margin: 1px; width: 50px; cursor: pointer
; }
612 .popupbutton:hover { border: 1px solid
#4040ff; }
613 .popuptrigger { color: #000; background-color: #e4f6e4; border: 1px solid
#9e9; padding: 0; margin: 1px; width: 50px; cursor: default
; }
614 .popupcomment { margin-top: 2px; padding-top: 4px; border-top: 1px solid
#9e9; }
616 #diffview { overflow: auto
; }
617 #diffview div
.title_text
{ padding:6px 0px; border: solid
#d9d8d1; border-width:0px 0px 1px; }
618 #diffview div
.log_body
{ padding:8px 8px 8px 150px; }
619 #diffview span
.age
{ position:relative
; float:left
; width:142px; font-style:italic
; }
620 #diffview div
.log_link
{
622 font-size:10px; font-family:sans-serif
; font-style:normal
;
623 position:relative
; float:left
; width:136px;
625 #diffview div
.list_head
{ padding:6px 8px 4px; border:solid
#d9d8d1; border-width:1px 0px 0px; font-style:italic
; }
626 #diffview a
.list
{ text-decoration:none
; color:#000000; }
627 #diffview a
.list:hover
{ text-decoration:underline
; color:#880000; }
628 #diffview a
.text
{ text-decoration:none
; color:#0000cc; }
629 #diffview a
.text:visited
{ text-decoration:none
; color:#880000; }
630 #diffview a
.text:hover
{ text-decoration:underline
; color:#880000; }
631 #diffview table
{ padding:8px 4px; }
632 #diffview th
{ padding:2px 5px; font-size:12px; text-align:left
; }
633 #diffview tr
.light:hover
{ background-color:#edece6; }
634 #diffview tr
.dark
{ background-color:#f6f6f0; }
635 #diffview tr
.dark:hover
{ background-color:#edece6; }
636 #diffview td
{ padding:2px 5px; font-size:12px; vertical-align:top
; }
637 #diffview td
.link
{ padding:2px 5px; font-family:sans-serif
; font-size:10px; }
638 #diffview div
.pre
{ font-family:monospace
; font-size:12px; white-space:pre
; }
639 #diffview div
.diff_info
{ font-family:monospace
; color:#000099; background-color:#edece6; font-style:italic
; }
640 #diffview div
.index_include
{ border:solid
#d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
641 #diffview div
.search
{ margin:4px 8px; position:absolute
; top:56px; right:12px }
642 #diffview a
.linenr
{ color:#999999; text-decoration:none
}
643 #diffview a
.rss_logo
{
644 float:right
; padding:3px 0px; width:35px; line-height:10px;
645 border:1px solid
; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
646 color:#ffffff; background-color:#ff6600;
647 font-weight:bold
; font-family:sans-serif
; font-size:10px;
648 text-align:center
; text-decoration:none
;
650 #diffview a
.rss_logo:hover
{ background-color:#ee5500; }
656 <div id=
"diagram"></div>
660 <div id=
"diffheaddiff"></div>
661 <div id=
"diffheadpin"></div>
662 <div id=
"diffseparator"></div>
663 <div id=
"differror" class=
"differror" style=
"display: none;"></div>
664 <div id=
"diffview"></div>
668 <div id=
"output" style=
"display: none; position:absolute; top: 360px; right: 0; z-index:100; background-color: #fff; width: 900px; max-height: 300px; overflow: auto;"></div> <!-- debug output -->
670 <!-- iframe is invisible, since when visible, its document body is stealing mousemove events from Motion.js (and obscuring popups in Opera)-->
671 <iframe id=
"diffloader" name=
"diffloader" style=
"display: none; width: 1px; height: 1px" onload=
"diff_iframe_onload();"></iframe>
673 <div style=
"display: none;"> <!-- templates -->
676 <table class=
"difftitle">
678 <td><div class=
"diffnodebullet" id=
"bullet"> </div></td>
679 <td><span class=
"difftitledate" id=
"date"></span></td>
680 <td><span class=
"difftitleauthor" id=
"author"></span></td>
681 <td><a class=
"button" id=
"clear" href=
"#">clear
</a></td>
684 <div class=
"diffcomment" id=
"comment"></div>
687 <div id=
"popuptemplate">
688 <div id=
"node" class=
"popupnode">
689 <table id=
"buttons" cellpadding=
"0" cellspacing=
"0">
691 <td align=
"left"><div id=
"parents_btn" class=
"popuptrigger"> parents
</div></td>
692 <td align=
"center"><div id=
"diff_btn" class=
"popupbutton"> diff
</div></td>
693 <td align=
"center"><div id=
"pin_btn" class=
"popupbutton">pin
</div></td>
694 <td align=
"right"><div id=
"children_btn" class=
"popuptrigger">children
</div></td>
697 <div id=
"date" class=
"popupdate"></div>
698 <div id=
"author"></div>
699 <div id=
"comment" class=
"popupcomment"></div>
700 <div id=
"not_loaded">not loaded yet
</div>