git-browser.cgi: fix handling of latin-1 characters
[git-browser-mirror.git] / by-date.html
blob695e4e7f37e0ead79dbc61fe5a79f22e756e9247
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2 <html>
3 <head>
4 <title>git browser</title>
5 <!--
6 Copyright (C) 2005, Artem Khodush <greenkaa@gmail.com>
8 This file is licensed under the GNU General Public License version 2.
9 -->
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">
17 <!--
19 g_diagram=null;
21 format_popup_date=function( node )
23 var date_str="";
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
34 return date_str;
37 // diagram ui events
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 )
49 if( first ) {
50 release_popups();
51 document.body.style.cursor="move";
52 diagram.begin_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;
73 //tstart=null;
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";
80 release_popups();
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="";
91 // dragging
92 Motion.track_drag( {
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,
97 handler_arg: diagram
98 } );
101 var tstop=(new Date()).getTime();
102 var d=g_diagram.m_container_element;
103 var c=d.firstChild;
104 var cc=c.lastChild;
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;
107 xdp( s );
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();
121 // date column stat
122 var stat={};
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;
131 xdp( s );
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
142 } );
143 g_track_popups.push( node_div );
144 }else {
145 Motion.attach_same_popup( node.popup_id, node_div );
148 // diagram node highlight
149 g_selected_nodes={
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 ) {
163 var prev_color=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 );
174 // splitter
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" );
180 var diff_height=0;
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" );
192 var pin_height=0;
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 );
204 diffhead_height+=8;
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();
221 g_diagram.draw();
224 // diff pane
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="";
242 var data={
243 date: format_popup_date( node ),
244 author: node.author,
245 comment: {
246 _text: node.comment,
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";
272 }else {
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="";
290 do_diff=function()
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];
297 }else {
298 if( left_diff_node.time>right_diff_node.time ) {
299 var t=left_diff_node;
300 left_diff_node=right_diff_node;
301 right_diff_node=t;
304 if( left_diff_node!=null ) {
305 var msg=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;
311 if( msg==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( "," );
323 if( msg!=null ) {
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";
329 }else {
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;
342 on_pin=function()
344 if( this._gitbrowser_diagram_id!=null && this._gitbrowser_node_id!=null ) {
345 var node=g_diagram.m_nodes[this._gitbrowser_node_id];
346 if( node!=null ) {
347 clear_pin_and_diff();
348 update_diff_title( "pin", node );
349 var pn=find_popup_node_div( this );
350 if( pn!=null ) {
351 var popup=pn.parentNode;
352 update_popup( popup );
357 on_diff=function()
359 if( this._gitbrowser_diagram_id!=null && this._gitbrowser_node_id!=null ) {
360 var node=g_diagram.m_nodes[this._gitbrowser_node_id];
361 if( node!=null ) {
362 update_diff_title( "diff", node );
363 do_diff();
368 // popups
369 g_track_popups=[];
370 g_track_enter_leave=[];
371 release_popups=function()
373 var i;
374 for( i=0; i<g_track_popups.length; ++i ) {
375 Motion.detach_popup( g_track_popups[i] );
377 g_track_popups=[];
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;
399 while( pn!=null ) {
400 if( pn.id!=null && pn.id.match( "^node" ) ) {
401 break;
403 pn=pn.parentNode;
405 return pn;
407 remember_button_id=function( btn, tag )
409 var pn=find_popup_node_div( btn );
410 if( pn!=null ) {
411 pn[tag]=btn.id;
414 g_popup_max_width=220;
415 popup_filler=function( popup, arg )
417 var diagram=arg.diagram;
418 var nodes=arg.nodes;
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];
423 var node_data;
424 if( node.author==null ) {
425 node_data={ not_loaded: {} };
426 }else {
427 node_data={
428 buttons: {
429 parents_btn: {
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
434 } );
435 g_track_popups.push( n );
436 remember_button_id( n, "_gitbrowser_popup_parents_button" );
438 _process_arg: node.parents
440 children_btn: {
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
445 } );
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;
455 n.onclick=on_diff;
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;
464 n.onclick=on_pin;
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 }
476 } );
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 );
487 // limit popup width
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;
494 if( table!=null ) {
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="";
514 }else {
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
557 } );
560 g_ui_map={
561 "draw": on_draw,
562 "place": on_place,
563 "node_init": on_node_init
565 onload=function()
567 var diagram_div=document.getElementById( "diagram" );
568 g_diagram=new GitDiagram( {
569 container_element: diagram_div,
570 style: "by-date",
571 ui_handler: GitBrowser.diagram_ui_handler,
572 ui_handler_arg: g_ui_map
573 } );
574 GitBrowser.init( {
575 repos: GitBrowser.repos_decode_location( location ),
576 diagram_div: diagram_div, // diagram_div is a payload
577 diagram: g_diagram,
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 ); }
581 } );
584 // debug output
585 xdp=function( msg )
587 var o=document.getElementById( "output" );
588 o.style.display="";
589 o.appendChild( document.createElement( "DIV" ) ).appendChild( document.createTextNode( msg ) );
592 //-->
593 </script>
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 {
621 padding:0px 8px;
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; }
652 </style>
653 </head>
654 <body>
656 <div id="diagram"></div>
658 <div id="diff">
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>
666 </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 -->
675 <div id="difftitle">
676 <table class="difftitle">
677 <tr>
678 <td><div class="diffnodebullet" id="bullet">&nbsp;</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>
682 </tr>
683 </table>
684 <div class="diffcomment" id="comment"></div>
685 </div>
687 <div id="popuptemplate">
688 <div id="node" class="popupnode">
689 <table id="buttons" cellpadding="0" cellspacing="0">
690 <tr>
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>
695 </tr>
696 </table>
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>
701 </div>
702 </div>
704 </div>
706 </body>
707 </html>