tests/run-tests.html: move noscript into body
[git-browser.git] / by-date.html
blob4f8d1e5522543eec285ff7cc037997c2ab8c5cd2
1 <!DOCTYPE html>
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta charset="utf-8" />
5 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6 <title>git browser</title>
7 <!--
8 Copyright (C) 2005, Artem Khodush <greenkaa@gmail.com>
10 This file is licensed under the GNU General Public License version 2.
11 -->
12 <script type="text/javascript" src="js.lib/DomTemplate.js"></script>
13 <script type="text/javascript" src="js.lib/InvisibleRequest.js"></script>
14 <script type="text/javascript" src="js.lib/Motion.js"></script>
15 <script type="text/javascript" src="js.lib/wz_jsgraphics.js"></script>
16 <script type="text/javascript" src="GitConfig.js"></script>
17 <script type="text/javascript" src="GitBrowser.js"></script>
18 <script type="text/javascript" src="GitDiagram.js"></script>
19 <script type="text/javascript">
20 /* <![CDATA[ */
22 g_diagram=null;
23 g_diff_url=cfg_browsercgi_url.replace("git-browser","git-diff");
25 format_popup_date=function( node )
27 var date_str="";
28 if( node.time!=null ) {
29 var dt=new Date( node.time );
30 var date=dt.getDate();
31 var month=GitDiagram._g_month_names[dt.getMonth()];
32 var year=dt.getFullYear();
33 var hour=dt.getHours();
34 var minute=dt.getMinutes();
35 minute= minute<10 ? "0"+minute : minute;
36 date_str=month+" "+date+" "+year+" "+hour+":"+minute
38 return date_str;
41 // diagram ui events
42 on_drag_mouse_down=function( e, diagram )
44 // browsers ignore setting move cursor here
46 on_drag_mouse_up=function( e, diagram, offset )
48 document.body.style.cursor="default";
49 diagram.end_move( offset );
51 on_drag_mouse_move=function( e, diagram, offset, first )
53 if( first ) {
54 release_popups();
55 document.body.style.cursor="move";
56 diagram.begin_move();
58 diagram.track_move( offset );
61 process_date_column_stat=function( date_column, stat )
63 for( var i=0; i<date_column.lines.length; ++i ) {
64 var node=date_column.lines[i];
65 if( stat.min_y==null || stat.min_y>node.absolute_y ) {
66 stat.min_y=node.absolute_y;
68 if( stat.max_y==null || stat.max_y<node.absolute_y ) {
69 stat.max_y=node.absolute_y;
72 if( stat.max_count==null || stat.max_count<date_column.lines.length ) {
73 stat.max_count=date_column.lines.length;
77 //tstart=null;
78 on_draw=function( diagram, phase )
80 if( phase=="begin" ) {
81 // tstart=(new Date()).getTime();
82 GitBrowser.status_show( "drawing..." );
83 document.body.style.cursor="wait";
84 release_popups();
85 Motion.cancel_drag( diagram.m_container_element );
86 }else if( phase=="end" ) {
87 GitBrowser.status_show();
88 if( g_selected_nodes["diff"].highlight_node!=null ) {
89 diagram.select_node( g_selected_nodes["diff"].highlight_node.id, g_selected_nodes["diff"].color );
91 if( g_selected_nodes["pin"].highlight_node!=null ) {
92 diagram.select_node( g_selected_nodes["pin"].highlight_node.id, g_selected_nodes["pin"].color );
94 document.body.style.cursor="";
95 // dragging
96 Motion.track_drag( {
97 node: diagram.m_container_element,
98 down_handler: on_drag_mouse_down,
99 up_handler: on_drag_mouse_up,
100 move_handler: on_drag_mouse_move,
101 handler_arg: diagram
102 } );
105 var tstop=(new Date()).getTime();
106 var d=g_diagram.m_container_element;
107 var c=d.firstChild;
108 var cc=c.lastChild;
109 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;
110 s+=" track_leave bind count: "+Motion._g_enter_leave_binder.m_objects.length;
111 xdp( s );
115 on_place=function( diagram, phase )
117 if( phase=="begin" ) {
118 GitBrowser.status_show( "placing..." );
119 document.body.style.cursor="wait";
120 // tstart=(new Date()).getTime();
121 }else if( phase=="end" ) {
122 document.body.style.cursor="";
123 GitBrowser.status_show();
125 // date column stat
126 var stat={};
127 for( var i=0; i<diagram.m_date_columns.length; ++i ) {
128 process_date_column_stat( diagram.m_date_columns[i], stat );
130 // xdp( "span "+(stat.max_y-stat.min_y)+" max count "+stat.max_count );
133 var tstop=(new Date()).getTime();
134 var s="placing time: "+((tstop-tstart)/1000)+" nodes: "+diagram.m_node_count+" unloaded nodes: "+diagram.m_start_more_ids.length;
135 xdp( s );
139 on_node_init=function( diagram, node, node_div )
141 if( node.popup_id==null ) {
142 var popup_nodes= node.coalesced_nodes==null ? [node] : node.coalesced_nodes;
143 node.popup_id=Motion.attach_popup( { trigger_node: node_div, anchor_offset: 4, side: "right", side_align: "top",
144 popup_filler: popup_filler, filler_arg: { diagram: diagram, nodes: popup_nodes }, on_show: popup_on_show,
145 delay_show_seconds: 0.3//, transparent: true
146 } );
147 g_track_popups.push( node_div );
148 }else {
149 Motion.attach_same_popup( node.popup_id, node_div );
152 // diagram node highlight
153 g_selected_nodes={
154 "popup_track": { node: null, color: "#ffe000", highlight_node: null },
155 "diff" : { node: null, color: "#44f088", highlight_node: null },
156 "pin" : { node: null, color: "#44a0ff", highlight_node: null }
158 select_node=function( select_kind, node, highlight_node )
160 var prev_highlight=g_selected_nodes[select_kind].highlight_node;
161 g_selected_nodes[select_kind].node=node;
162 g_selected_nodes[select_kind].highlight_node=highlight_node;
163 if( highlight_node!=null ) {
164 g_diagram.select_node( highlight_node.id, g_selected_nodes[select_kind].color );
166 if( prev_highlight!=null ) {
167 var prev_color=null;
168 var order=["diff", "pin", "popup_track"];
169 for( var i=0; i<order.length; ++i ) {
170 if( order[i]!=select_kind && g_selected_nodes[order[i]].highlight_node==prev_highlight ) {
171 prev_color=g_selected_nodes[order[i]].color;
174 g_diagram.select_node( prev_highlight.id, prev_color );
178 // splitter
179 g_diff_pane_pos={ x: 0, y: 0 };
180 g_diff_pane_size={ x: 0, y: 0 };
181 update_diffview_height=function()
183 var diffheaddiff=document.getElementById( "diffheaddiff" );
184 var diff_height=0;
185 if( diffheaddiff.style.display!="none" ) {
186 var diff_comment=document.getElementById( diffheaddiff._gitbrowser_comment_id );
187 if( diff_comment!=null ) {
188 diff_comment.style.color="#000";
189 if( diff_comment.scrollHeight>g_max_diff_comment_height ) {
190 diff_comment.style.height=g_max_diff_comment_height+"px";
193 diff_height=diffheaddiff.clientHeight;
195 var diffheadpin=document.getElementById( "diffheadpin" );
196 var pin_height=0;
197 if( diffheadpin.style.dislpay!="none" ) {
198 var pin_comment=document.getElementById( diffheadpin._gitbrowser_comment_id );
199 if( pin_comment!=null ) {
200 pin_comment.style.color="#787878";
201 if( pin_comment.scrollHeight>g_max_diff_comment_height ) {
202 pin_comment.style.height=g_max_diff_comment_height+"px";
205 pin_height=diffheadpin.clientHeight;
207 var diffhead_height=Math.max( diff_height, pin_height );
208 diffhead_height+=8;
209 var diffview=document.getElementById( "diffview" );
210 Motion.set_page_coords( diffview, g_diff_pane_pos.x, g_diff_pane_pos.y+diffhead_height );
211 diffview.style.width=(g_diff_pane_size.x-4)+"px";
212 diffview.style.height=(g_diff_pane_size.y-diffhead_height)+"px";
214 on_splitter_resize=function( arg, title_div )
216 var diagram_div=document.getElementById( "diagram" );
217 var title_height=title_div.clientHeight;
218 Motion.set_page_coords( diagram_div, arg.half1_pos.x, arg.half1_pos.y+title_height );
219 diagram_div.style.width=(arg.half1_wh.x-4)+"px";
220 diagram_div.style.height=(arg.half1_wh.y-title_height)+"px";
222 g_diff_pane_pos=arg.half2_pos;
223 g_diff_pane_size=arg.half2_wh;
224 update_diffview_height();
225 g_diagram.draw();
228 // diff pane
229 clear_pin_and_diff=function()
231 select_node( "pin", null, null );
232 select_node( "diff", null, null );
233 document.getElementById( "diffheaddiff" ).innerHTML="";
234 document.getElementById( "diffheadpin" ).innerHTML="";
235 document.getElementById( "differror" ).style.display="none";
236 document.getElementById( "diffview" ).style.display="none";
237 document.getElementById( "diffview" ).src="";
239 g_max_diff_comment_height=50;
240 update_diff_title=function( which, node )
242 var highlight_node=node.coalesced_to==null ? node : node.coalesced_to;
243 select_node( which, node, highlight_node );
244 var title_dest=document.getElementById( "diffhead"+which );
245 title_dest.innerHTML="";
246 var data={
247 date: format_popup_date( node ),
248 author: node.author,
249 comment: {
250 _text: node.comment,
251 _process: function( n, arg ) {
252 arg.dest._gitbrowser_comment_id=n.id;
254 _process_arg: { dest: title_dest }
256 clear: which=="diff" ? null : { _process: function( n, arg ) { n.onclick=clear_pin_and_diff; } },
257 bullet: which=="diff" ? null : { _process: function( n, arg ) { n.style.border=arg==null ? "" : "2px solid "+arg; }, _process_arg: g_selected_nodes[which].color }
259 DomTemplate.apply( document.getElementById( "difftitle" ), data, title_dest );
260 var other=which=="diff" ? "pin" : "diff";
261 var other_node=g_selected_nodes[other].node;
262 var other_title=document.getElementById( "diffhead"+other );
263 if( other_node==null ) {
264 other_title.style.display="none";
265 title_dest.style.width="100%";
266 title_dest.style.styleFloat="";
267 title_dest.style.cssFloat="";
268 title_dest.style.display="";
269 var comment=document.getElementById( title_dest._gitbrowser_comment_id );
270 if( comment!=null ) {
271 comment.style.color="#000";
272 if( comment.clientHeight>g_max_diff_comment_height ) {
273 comment.style.height=g_max_diff_comment_height+"px";
276 }else {
277 var left_title=title_dest;
278 var right_title=other_title;
279 if( other_node.time<node.time ) {
280 left_title=other_title;
281 right_title=title_dest;
283 left_title.style.width="49%";
284 left_title.style.styleFloat="left";
285 left_title.style.cssFloat="left";
286 right_title.style.width="49%";
287 right_title.style.styleFloat="right";
288 right_title.style.cssFloat="right";
289 left_title.style.display="";
290 right_title.style.display="";
294 do_diff=function()
296 var right_diff_node=g_selected_nodes["diff"].node;
297 var left_diff_node=g_selected_nodes["pin"].node;
298 if( right_diff_node!=null ) {
299 if( left_diff_node==null ) {
300 left_diff_node=right_diff_node.parents[0];
301 }else {
302 if( left_diff_node.time>right_diff_node.time ) {
303 var t=left_diff_node;
304 left_diff_node=right_diff_node;
305 right_diff_node=t;
308 if( left_diff_node!=null ) {
309 var msg=null;
310 if( left_diff_node==right_diff_node ) {
311 msg="can't diff the node with itself";
313 // find repo both nodes belong to
314 var common_repo=null;
315 if( msg==null ) {
316 for( var left_i=0; left_i<left_diff_node.repos.length; ++left_i ) {
317 for( var right_i=0; right_i<right_diff_node.repos.length; ++right_i ) {
318 if( left_diff_node.repos[left_i]==right_diff_node.repos[right_i] ) {
319 common_repo=left_diff_node.repos[left_i];
323 if( common_repo==null ) {
324 msg="can't diff nodes from different repositories: left from "+left_diff_node.repos.join( "," )+"; right from "+right_diff_node.repos.join( "," );
327 if( msg!=null ) {
328 var differror=document.getElementById( "differror" );
329 differror.style.display="";
330 differror.innerHTML="";
331 differror.appendChild( document.createTextNode( msg ) );
332 document.getElementById( "diffview" ).style.display="none";
333 }else {
334 document.getElementById( "differror" ).style.display="none";
335 document.getElementById( "diffview" ).style.display="";
336 document.getElementById( "diffloader" ).src=g_diff_url+"?repo="+encodeURIComponent(common_repo)+"&id1="+encodeURIComponent(left_diff_node.id)+"&id2="+encodeURIComponent(right_diff_node.id);
339 update_diffview_height();
342 diff_iframe_onload=function()
344 document.getElementById( "diffview" ).innerHTML=window.frames.diffloader.document.body.innerHTML;
346 on_pin=function()
348 if( this._gitbrowser_diagram_id!=null && this._gitbrowser_node_id!=null ) {
349 var node=g_diagram.m_nodes[this._gitbrowser_node_id];
350 if( node!=null ) {
351 clear_pin_and_diff();
352 update_diff_title( "pin", node );
353 var pn=find_popup_node_div( this );
354 if( pn!=null ) {
355 var popup=pn.parentNode;
356 update_popup( popup );
361 on_diff=function()
363 if( this._gitbrowser_diagram_id!=null && this._gitbrowser_node_id!=null ) {
364 var node=g_diagram.m_nodes[this._gitbrowser_node_id];
365 if( node!=null ) {
366 update_diff_title( "diff", node );
367 do_diff();
372 // popups
373 g_track_popups=[];
374 g_track_enter_leave=[];
375 release_popups=function()
377 var i;
378 for( i=0; i<g_track_popups.length; ++i ) {
379 Motion.detach_popup( g_track_popups[i] );
381 g_track_popups=[];
382 for( i=0; i<g_track_enter_leave.length; ++i ) {
383 Motion.cancel_enter_leave( g_track_enter_leave[i] );
385 g_track_enter_leave=[];
386 for( i in g_diagram.m_nodes ) {
387 g_diagram.m_nodes[i].popup_id=null;
390 popup_enter=function( popup, arg )
392 var node=arg.diagram.m_nodes[arg.node_id];
393 var highlight_node=node.coalesced_to!=null ? node.coalesced_to : node;
394 select_node( "popup_track", node, highlight_node );
396 popup_leave=function( popup, arg )
398 select_node( "popup_track", null, null );
400 find_popup_node_div=function( btn )
402 var pn=btn.parentNode;
403 while( pn!=null ) {
404 if( pn.id!=null && pn.id.match( "^node" ) ) {
405 break;
407 pn=pn.parentNode;
409 return pn;
411 remember_button_id=function( btn, tag )
413 var pn=find_popup_node_div( btn );
414 if( pn!=null ) {
415 pn[tag]=btn.id;
418 g_popup_max_width=220;
419 popup_filler=function( popup, arg )
421 var diagram=arg.diagram;
422 var nodes=arg.nodes;
423 popup.style.padding="2px";
424 var data={ node: [] };
425 for( var node_i=0; node_i<nodes.length; ++node_i ) {
426 var node=nodes[node_i];
427 var node_data;
428 if( node.author==null ) {
429 node_data={ not_loaded: {} };
430 }else {
431 node_data={
432 buttons: {
433 parents_btn: {
434 _process: function( n, arg ) {
435 Motion.attach_popup( { trigger_node: n, x_anchor_node: popup, y_anchor_node: n, anchor_offset: 1, side: "left", side_align: "top",
436 popup_filler: popup_filler, filler_arg: { diagram: diagram, nodes: arg }, on_show: popup_on_show,
437 delay_show_seconds: 0.3//, transparent: true
438 } );
439 g_track_popups.push( n );
440 remember_button_id( n, "_gitbrowser_popup_parents_button" );
442 _process_arg: node.parents
444 children_btn: {
445 _process: function( n, arg ) {
446 Motion.attach_popup( { trigger_node: n, x_anchor_node: popup,y_anchor_node: n, anchor_offset: 1, side: "right", side_align: "top",
447 popup_filler: popup_filler, filler_arg: { diagram: diagram, nodes: arg }, on_show: popup_on_show,
448 delay_show_seconds: 0.3//, transparent: true
449 } );
450 g_track_popups.push( n );
451 remember_button_id( n, "_gitbrowser_popup_children_button" );
453 _process_arg: node.children
455 diff_btn: node.date==null ? null : {
456 _process: function( n, arg ) {
457 n._gitbrowser_diagram_id=arg.diagram.m_diagram_id;
458 n._gitbrowser_node_id=arg.node.id;
459 n.onclick=on_diff;
460 remember_button_id( n, "_gitbrowser_popup_diff_button" );
462 _process_arg: { diagram: diagram, node: node }
464 pin_btn: node.date==null ? null : {
465 _process: function( n, arg ) {
466 n._gitbrowser_diagram_id=arg.diagram.m_diagram_id;
467 n._gitbrowser_node_id=arg.node.id;
468 n.onclick=on_pin;
469 remember_button_id( n, "_gitbrowser_popup_pin_button" );
471 _process_arg: { diagram: diagram, node: node }
474 date: format_popup_date( node ),
475 author: node.author==null ? "" : node.author,
476 comment: node.comment==null ? "" : node.comment,
477 _process: function( n, arg ) {
478 Motion.track_enter_leave( { node: n,
479 enter_handler: popup_enter, leave_handler: popup_leave, handler_arg: { diagram: arg.diagram, node_id: arg.node.id }
480 } );
481 g_track_enter_leave.push( n );
482 n._gitbrowser_node_is_root=arg.node.parents.length==0;
483 n._gitbrowser_node_is_leaf=arg.node.children.length==0;
485 _process_arg: { diagram: diagram, node: node }
488 data.node.push( node_data );
490 DomTemplate.apply( document.getElementById( "popuptemplate" ), data, popup );
491 // limit popup width
492 if( popup.clientWidth>=g_popup_max_width ) {
493 popup.style.width=g_popup_max_width+"px";
495 // stretch table with buttons to fill all popup width
496 for( var node_div=popup.firstChild; node_div!=null; node_div=node_div.nextSibling ) {
497 var table=node_div.firstChild;
498 if( table!=null ) {
499 table.width=(popup.clientWidth-8)+"px";
503 update_popup_node_div=function( cn, old_state, new_state )
505 if( old_state==null ) { // do initialization for the first time only
506 var children_button=document.getElementById( cn._gitbrowser_popup_children_button );
507 children_button.style.visibility= cn._gitbrowser_node_is_leaf ? "hidden" : "";
508 var parents_button=document.getElementById( cn._gitbrowser_popup_parents_button );
509 parents_button.style.visibility= cn._gitbrowser_node_is_root ? "hidden" : "";
511 var diff_button=document.getElementById( cn._gitbrowser_popup_diff_button );
512 var pin_button=document.getElementById( cn._gitbrowser_popup_pin_button );
513 if( new_state=="normal" ) {
514 diff_button.innerHTML=" diff";
515 diff_button.style.visibility=cn._gitbrowser_node_is_root ? "hidden" : "";
516 pin_button.innerHTML="pin ";
517 pin_button.style.visibility="";
518 }else {
519 diff_button.innerHTML=" diff&#160;to&#160;pin";
520 diff_button.style.visibility= diff_button._gitbrowser_node_id==g_selected_nodes["pin"].node.id ? "hidden" : ""; // avoid diff with itself
521 pin_button.innerHTML="";
522 pin_button.style.visibility="hidden";
525 update_popup=function( popup )
527 var pinned_node=g_selected_nodes["pin"].node;
528 var pinned_id=pinned_node==null ? null : pinned_node.id;
529 var new_state= pinned_node==null ? "normal" : "pinned";
530 var old_state=popup._gitbrowser_popup_state;
531 if( old_state!=new_state || popup._gitbrowser_pinned_id!=pinned_id ) {
532 popup._gitbrowser_popup_state=new_state;
533 popup._gitbrowser_pinned_id!=pinned_id;
534 for( var cn=popup.firstChild; cn!=null; cn=cn.nextSibling ) {
535 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 ) {
536 update_popup_node_div( cn, old_state, new_state );
541 popup_on_show=function( popup )
543 update_popup( popup );
546 // global initialization, diagram loading
547 place_and_draw=function( context, keep_window_offset )
549 context.diagram.place_nodes( keep_window_offset );
550 context.diagram.draw();
551 GitBrowser.title_update( { diagram: context.diagram } );
553 on_title_loaded=function( context )
555 var show_selectother = null;
556 try {
557 show_selectother = window.sessionStorage.getItem("arpa.urn.uuid.c5118906-b736-4785-a3ec-28a0e1f88d66");
558 } catch (e) {}
559 if( !show_selectother ) context.select_other_btn.style.visibility="hidden";
560 Motion.make_splitter( { direction: "h", container: document.body, initial_split: 0.5,
561 contents1: [ context.title_div, context.diagram_div ],
562 contents2: [ document.getElementById( "diff" ) ],
563 resize_handler: on_splitter_resize,
564 resize_handler_arg: context.title_div,
565 move_handler: function( arg, first ) { if( first ) { context.diagram.m_container_element.innerHTML=""; } } // speed up splitter drag start
566 } );
569 g_ui_map={
570 "draw": on_draw,
571 "place": on_place,
572 "node_init": on_node_init
574 onload=function()
576 var diagram_div=document.getElementById( "diagram" );
577 g_diagram=new GitDiagram( {
578 container_element: diagram_div,
579 style: "by-date",
580 ui_handler: GitBrowser.diagram_ui_handler,
581 ui_handler_arg: g_ui_map
582 } );
583 GitBrowser.init( {
584 repos: GitBrowser.repos_decode_location( location ),
585 diagram_div: diagram_div, // diagram_div is a payload
586 diagram: g_diagram,
587 title_loaded_handler: on_title_loaded,
588 commits_first_loaded_handler: function( context ) { place_and_draw( context, false ); },
589 commits_more_loaded_handler: function( context ) { place_and_draw( context, true ); },
590 title: cfg_bydate_title
591 } );
594 // debug output
595 xdp=function( msg )
597 var o=document.getElementById( "output" );
598 o.style.display="";
599 o.appendChild( document.createElement( "DIV" ) ).appendChild( document.createTextNode( msg ) );
602 /* ]]> */
603 </script>
604 <link rel="stylesheet" type="text/css" href="GitBrowser.css"></link>
605 <style type="text/css">
606 /* <![CDATA[ */
607 html { height: 99.8%; }
608 body { height: 99.8%; font: normal normal 12px sans-serif; overflow: hidden; }
610 #diagram { border: 1px solid #090; position: absolute; }
612 .difftitle td { font-size: 12px; padding: 2px; }
613 .difftitledate, .difftitleauthor { font-weight: bold; color: #7878b8; }
614 .diffnodebullet { width: 6px; height: 6px; background-color: #330; font-size: 1px; }
615 .diffcomment { overflow: auto; font-size: 12px; }
616 .differror { font-size: 12px; color: #a82222; }
618 #diffseparator { clear: both; width: 100%; margin: 3px 0 4px 0; border-bottom: 1px solid #a8a8a8; line-height:0; }
620 .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; }
621 .popupdate { margin-top: 3px; }
622 .popupbutton { color: #000; background-color: #f4f4fc; border: 1px solid #a0a0ff; padding: 0; margin: 1px; width: 50px; cursor: pointer; }
623 .popupbutton:hover { border: 1px solid #4040ff; }
624 .popuptrigger { color: #000; background-color: #e4f6e4; border: 1px solid #9e9; padding: 0; margin: 1px; width: 50px; cursor: default; }
625 .popupcomment { margin-top: 2px; padding-top: 4px; border-top: 1px solid #9e9; }
627 #diffview { overflow: auto; }
628 #diffview div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
629 #diffview div.log_body { padding:8px 8px 8px 150px; }
630 #diffview span.age { position:relative; float:left; width:142px; font-style:italic; }
631 #diffview span.cntrl {
632 border: dashed #aaaaaa; border-width: 1px;
633 padding: 0px 2px 0px 2px; margin: 0px 2px 0px 2px;
635 #diffview div.log_link {
636 padding:0px 8px;
637 font-size:10px; font-family:sans-serif; font-style:normal;
638 position:relative; float:left; width:136px;
640 #diffview div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
641 #diffview a.list { border-style: none; text-decoration:none; color:#000000; }
642 #diffview a.list:hover { text-decoration:underline; color:#880000; }
643 #diffview a.text { text-decoration:none; color:#0000cc; }
644 #diffview a.text:visited { text-decoration:none; color:#880000; }
645 #diffview a.text:hover { text-decoration:underline; color:#880000; }
646 #diffview table { padding:8px 4px; border-spacing: 0; }
647 #diffview table.diff_tree { font-family: monospace; }
648 #diffview table.combined.diff_tree th { text-align: center; }
649 #diffview table.combined.diff_tree td { padding-right: 24px; }
650 #diffview table.combined.diff_tree th.link,
651 #diffview table.combined.diff_tree td.link { padding: 0px 2px; }
652 #diffview table.combined.diff_tree td.nochange a { color: #6666ff; }
653 #diffview table.combined.diff_tree td.nochange a:hover,
654 #diffview table.combined.diff_tree td.nochange a:visited { color: #d06666; }
655 #diffview table.diff_tree span.file_status.new { color: #008000; }
656 #diffview table.diff_tree span.file_status.deleted { color: #c00000; }
657 #diffview table.diff_tree span.file_status.moved,
658 #diffview table.diff_tree span.file_status.mode_chnge { color: #777777; }
659 #diffview table.diff_tree span.file_status.copied { color: #70a070; }
660 #diffview th { padding: 2px 5px; font-size: 100%; text-align: left; }
661 #diffview tr.light { background-color: #ffffff; }
662 #diffview tr.dark { background-color: #f6f6f0; }
663 #diffview tr.light:hover,
664 #diffview tr.dark:hover { background-color: #edece6; }
665 #diffview td { padding: 2px 5px; font-size: 100%; vertical-align: top; }
666 #diffview td.link { padding: 2px 5px; font-family: sans-serif; font-size: 70%; }
667 #diffview div.header, #diffview div.patchset { clear: both; }
668 #diffview div.diff { font-family: monospace; font-size: 12px; }
669 #diffview div.diff { white-space: pre; }
670 /*#diffview div.diff { white-space: pre-wrap; word-wrap: break-word; }
671 #diffview div.diff_body {
672 position: relative; overflow: hidden;
673 padding-left: 2.6ex !important; text-indent: -2.6ex;
675 #diffview div.diff_body:before {
676 position: absolute; left: -1ex; white-space: pre; font-size: 90%; vertical-align: 25%;
677 content: " \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa";
678 clip: rect(auto, auto, auto, 1ex);
680 #diffview div.diff.header,
681 #diffview div.diff.extended_header { white-space: normal; }
682 #diffview div.diff.header {
683 font-weight: bold; background-color: #edece6; margin-top: 4px; padding: 4px 0px 2px 0px;
684 border: solid #d9d8d1; border-width: 1px 0px 1px 0px;
686 #diffview div.diff.header a.path { text-decoration: underline; }
687 #diffview div.diff.extended_header,
688 #diffview div.diff.extended_header a.path,
689 #diffview div.diff.extended_header a.hash { color: #777777; }
690 #diffview div.diff.extended_header .info { color: #b0b0b0; }
691 #diffview div.diff.extended_header { background-color: #f6f5ee; padding: 2px 0px 2px 0px; }
692 #diffview div.diff a.list,
693 #diffview div.diff a.path,
694 #diffview div.diff a.hash { text-decoration: none; }
695 #diffview div.diff a.list:hover,
696 #diffview div.diff a.path:hover,
697 #diffview div.diff a.hash:hover { text-decoration: underline; }
698 #diffview div.diff.to_file a.path,
699 #diffview div.diff.to_file { color: #007000; }
700 #diffview div.diff.add { color: #008800; }
701 #diffview div.diff.add span.marked { background-color: #aaffaa; }
702 #diffview div.diff.from_file a.path,
703 #diffview div.diff.from_file { color: #aa0000; }
704 #diffview div.diff.rem { color: #cc0000; }
705 #diffview div.diff.rem span.marked { background-color: #ffaaaa; }
706 #diffview div.diff.chunk_header a,
707 #diffview div.diff.chunk_header { color: #990099; }
708 #diffview div.diff.chunk_header { border: dotted #ffe0ff; border-width: 1px 0px 0px 0px; margin-top: 2px; }
709 #diffview div.diff.chunk_header span.chunk_info { background-color: #ffeeff; }
710 #diffview div.diff.chunk_header span.section { color: #aa22aa; }
711 #diffview div.diff.incomplete { color: #cccccc; }
712 #diffview div.diff.nodifferences { font-weight: bold; color: #600000; }
713 #diffview div.chunk_block { overflow: hidden; }
714 #diffview div.chunk_block div.old { float: left; width: 50%; overflow: hidden; }
715 #diffview div.chunk_block div.new { margin-left: 50%; width: 50%; }
716 #diffview div.chunk_block.rem div.old div.diff.rem { background-color: #fff5f5; }
717 #diffview div.chunk_block.add div.new div.diff.add { background-color: #f8fff8; }
718 #diffview div.chunk_block.chg div div.diff { background-color: #fffff0; }
719 #diffview div.chunk_block.ctx div div.diff.ctx { color: #404040; }
721 /* ]]> */
722 </style>
723 </head>
724 <body>
726 <script type="text/javascript"></script>
727 <noscript>Enable JavaScript to view the graph.</noscript>
729 <div id="diagram"></div>
731 <div id="diff">
733 <div id="diffheaddiff"></div>
734 <div id="diffheadpin"></div>
735 <div id="diffseparator"></div>
736 <div id="differror" class="differror" style="display: none;"></div>
737 <div id="diffview"></div>
739 </div>
741 <div id="output" style="display: none; position: absolute; top: 360px; left: 1ex; right: 1ex; z-index: 100; background-color: #fff; max-height: 300px; overflow: auto"></div> <!-- debug output -->
743 <!-- iframe is invisible, since when visible, its document body is stealing mousemove events from Motion.js (and obscuring popups in Opera)-->
744 <iframe id="diffloader" name="diffloader" style="display: none; width: 1px; height: 1px" onload="diff_iframe_onload();"></iframe>
746 <div style="display: none;"> <!-- templates -->
748 <div id="difftitle">
749 <table class="difftitle">
750 <tr>
751 <td><div class="diffnodebullet" id="bullet">&#160;</div></td>
752 <td><span class="difftitledate" id="date"></span></td>
753 <td><span class="difftitleauthor" id="author"></span></td>
754 <td><a class="button" id="clear" href="#">clear</a></td>
755 </tr>
756 </table>
757 <div class="diffcomment" id="comment"></div>
758 </div>
760 <div id="popuptemplate">
761 <div id="node" class="popupnode">
762 <table id="buttons" cellpadding="0" cellspacing="0">
763 <tr>
764 <td align="left"><div id="parents_btn" class="popuptrigger"> parents</div></td>
765 <td align="center"><div id="diff_btn" class="popupbutton"> diff</div></td>
766 <td align="center"><div id="pin_btn" class="popupbutton">pin </div></td>
767 <td align="right"><div id="children_btn" class="popuptrigger">children </div></td>
768 </tr>
769 </table>
770 <div id="date" class="popupdate"></div>
771 <div id="author"></div>
772 <div id="comment" class="popupcomment"></div>
773 <div id="not_loaded">not loaded yet</div>
774 </div>
775 </div>
777 </div>
779 </body>
780 </html>