testability-driver 0.9.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +1 -1
  2. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +11 -7
  3. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +8 -0
  4. data/lib/tdriver/base/behaviour/factory.rb +229 -209
  5. data/lib/tdriver/base/errors.rb +3 -0
  6. data/lib/tdriver/base/state_object.rb +11 -20
  7. data/lib/tdriver/base/sut/controller.rb +4 -4
  8. data/lib/tdriver/base/sut/factory.rb +205 -170
  9. data/lib/tdriver/base/sut/generic/behaviours/application.rb +256 -174
  10. data/lib/tdriver/base/sut/generic/behaviours/find.rb +17 -11
  11. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +57 -66
  12. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +578 -497
  13. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +41 -15
  14. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +48 -19
  15. data/lib/tdriver/base/sut/generic/commands/fixture.rb +47 -0
  16. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +25 -13
  17. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +16 -10
  18. data/lib/tdriver/base/sut/generic/plugin.rb +9 -3
  19. data/lib/tdriver/base/sut/sut.rb +41 -33
  20. data/lib/tdriver/base/test_object/abstract.rb +26 -3
  21. data/lib/tdriver/base/test_object/adapter.rb +399 -0
  22. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +56 -14
  23. data/lib/tdriver/base/test_object/behaviours/test_object.rb +663 -197
  24. data/lib/tdriver/base/test_object/cache.rb +132 -0
  25. data/lib/tdriver/base/test_object/factory.rb +677 -426
  26. data/lib/tdriver/base/test_object/factory_new.rb +202 -0
  27. data/lib/tdriver/base/test_object/identificator.rb +24 -17
  28. data/lib/tdriver/base/test_object/loader.rb +9 -3
  29. data/lib/tdriver/base/test_object/verification.rb +181 -0
  30. data/lib/tdriver/loader.rb +1 -1
  31. data/lib/tdriver/report/report.rb +2 -0
  32. data/lib/tdriver/report/report_api.rb +4 -4
  33. data/lib/tdriver/report/report_creator.rb +29 -3
  34. data/lib/tdriver/report/report_data_presentation.rb +7 -3
  35. data/lib/tdriver/report/report_execution_statistics.rb +80 -21
  36. data/lib/tdriver/report/report_javascript.rb +192 -0
  37. data/lib/tdriver/report/report_test_case_run.rb +22 -0
  38. data/lib/tdriver/report/report_test_run.rb +62 -55
  39. data/lib/tdriver/report/report_writer.rb +57 -56
  40. data/lib/tdriver/tdriver.rb +14 -41
  41. data/lib/tdriver/util/common/error.rb +1 -0
  42. data/lib/tdriver/util/common/exceptions.rb +12 -0
  43. data/lib/tdriver/util/common/file.rb +12 -6
  44. data/lib/tdriver/util/common/gem.rb +2 -1
  45. data/lib/tdriver/util/common/hash.rb +152 -0
  46. data/lib/tdriver/util/common/kernel.rb +49 -34
  47. data/lib/tdriver/util/common/loader.rb +21 -17
  48. data/lib/tdriver/util/common/numeric.rb +39 -0
  49. data/lib/tdriver/util/common/object.rb +115 -0
  50. data/lib/tdriver/util/common/string.rb +55 -2
  51. data/lib/tdriver/util/dbaccess/dbaccess.rb +194 -161
  52. data/lib/tdriver/util/dynamic_attribute_filter.rb +6 -0
  53. data/lib/tdriver/util/hooking.rb +2 -2
  54. data/lib/tdriver/util/loader.rb +2 -2
  55. data/lib/tdriver/util/localisation/localisation.rb +277 -18
  56. data/lib/tdriver/util/logger.rb +142 -13
  57. data/lib/tdriver/util/parameter/parameter_hash.rb +8 -5
  58. data/lib/tdriver/util/parameter/parameter_xml.rb +18 -2
  59. data/lib/tdriver/util/recorder.rb +17 -12
  60. data/lib/tdriver/util/user_data/user_data.rb +3 -2
  61. data/lib/tdriver/util/{video_rec.rb → video_utils.rb} +136 -16
  62. data/lib/tdriver/util/xml/abstraction.rb +7 -0
  63. data/lib/tdriver/util/xml/attribute.rb +32 -0
  64. data/lib/tdriver/util/xml/loader.rb +8 -2
  65. data/lib/tdriver/util/xml/nil_node.rb +95 -0
  66. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +46 -7
  67. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +19 -9
  68. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +1 -1
  69. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +13 -1
  70. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +6 -0
  71. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +27 -15
  72. data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +57 -0
  73. data/lib/tdriver/util/xml/text.rb +32 -0
  74. data/lib/tdriver/util/xml/xml.rb +35 -22
  75. data/lib/tdriver/version.rb +1 -1
  76. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +41 -34
  77. data/lib/tdriver-devtools/doc/generate.rb +31 -6
  78. data/lib/tdriver-devtools/doc/xslt/template.xsl +46 -25
  79. data/lib/tdriver-devtools/tests/feature_tests/example/behaviour_example.rb +100 -0
  80. data/lib/tdriver-devtools/tests/feature_tests/update +1 -1
  81. data/lib/tdriver.rb +0 -3
  82. data/xml/behaviours/generic.xml +1 -1
  83. data/xml/defaults/generic.xml +4 -90
  84. data/xml/templates/generic.xml +33 -25
  85. metadata +21 -29
  86. data/lib/tdriver-devtools/behaviour/xml_generator/example/flick-example.rb +0 -245
  87. data/lib/tdriver-devtools/behaviour/xml_generator/example/sut.rb +0 -964
  88. data/lib/tdriver-devtools/behaviour/xml_generator/generate.rb +0 -68
  89. data/lib/tdriver-devtools/behaviour/xml_generator/lib/custom_rdoc_generator.rb +0 -1865
  90. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.default.template +0 -1
  91. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.template +0 -3
  92. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument_type.template +0 -4
  93. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.exception.template +0 -4
  94. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.arguments.template +0 -4
  95. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.deprecated.template +0 -3
  96. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.exceptions.template +0 -3
  97. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.info.template +0 -1
  98. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.returns.template +0 -3
  99. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.tables.template +0 -3
  100. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.template +0 -12
  101. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.returns.template +0 -5
  102. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.item.template +0 -1
  103. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.row.template +0 -2
  104. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.template +0 -7
  105. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.template +0 -14
  106. data/lib/tdriver-devtools/behaviour/xml_generator/update +0 -3
  107. data/lib/tdriver-devtools/tests/feature_tests/example/flick-example.rb +0 -233
  108. data/lib/tdriver-devtools/tests/feature_tests/example/impl.rb +0 -194
@@ -21,7 +21,7 @@
21
21
  require 'singleton'
22
22
  require 'set'
23
23
 
24
- # load native extensions is available
24
+ # load native extensions if available
25
25
  begin; require File.expand_path( File.join( File.dirname( __FILE__ ), 'native_extensions' ) ); rescue LoadError; end
26
26
 
27
27
  # generic utility modules
@@ -22,6 +22,7 @@ require File.expand_path( File.join( File.dirname( __FILE__ ), 'error_recovery/t
22
22
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'error_recovery/tdriver_custom_error_recovery' ) )
23
23
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_file_capture' ) )
24
24
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_crash_file_capture' ) )
25
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_javascript' ) )
25
26
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_writer' ) )
26
27
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_combine' ) )
27
28
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_data_table' ) )
@@ -39,6 +40,7 @@ require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_grouping'
39
40
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_execution_statistics' ) )
40
41
  require File.expand_path( File.join( File.dirname( __FILE__ ), 'report_data_presentation' ) )
41
42
 
43
+
42
44
  if MobyUtil::Parameter[ :custom_error_recovery_module, nil ]!=nil
43
45
  require MobyUtil::Parameter[ :custom_error_recovery_module ]
44
46
  end
@@ -21,7 +21,7 @@
21
21
  module TDriverReportAPI
22
22
 
23
23
  def tdriver_log_data(data)
24
- Kernel::raise ArgumentError.new("Argument to method cannot be nil.") if data.nil?
24
+ Kernel::raise TypeError.new("Argument to method cannot be nil.") if data.nil?
25
25
  if $tdriver_reporter!=nil
26
26
  $tdriver_reporter.set_user_data(data)
27
27
  end
@@ -34,21 +34,21 @@ module TDriverReportAPI
34
34
  end
35
35
 
36
36
  def tdriver_log_data_in_total_run_table(column_name,value)
37
- Kernel::raise ArgumentError.new("Argument to method cannot be nil.") if column_name.nil? || value.nil?
37
+ Kernel::raise TypeError.new("Argument to method cannot be nil.") if column_name.nil? || value.nil?
38
38
  if $tdriver_reporter!=nil
39
39
  $tdriver_reporter.set_user_table_data(column_name,value)
40
40
  end
41
41
  end
42
42
 
43
43
  def tdriver_report_log(message)
44
- Kernel::raise ArgumentError.new("Argument message was not a String.") unless message.nil? or message.kind_of?(String)
44
+ Kernel::raise TypeError.new("Argument message was not a String.") unless message.nil? or message.kind_of?(String)
45
45
  if $tdriver_reporter
46
46
  $new_test_case.set_test_case_execution_log(message) if $new_test_case
47
47
  end
48
48
  end
49
49
 
50
50
  def tdriver_report_set_test_case_status(status)
51
- Kernel::raise ArgumentError.new("Argument status was not a String.") unless status.nil? or status.kind_of?(String)
51
+ Kernel::raise TypeError.new("Argument status was not a String.") unless status.nil? or status.kind_of?(String)
52
52
  if $tdriver_reporter!=nil
53
53
  $tdriver_reporter.set_test_case_user_defined_status(status)
54
54
  end
@@ -475,7 +475,10 @@ module TDriverReportCreator
475
475
  status='failed' if MobyUtil::Parameter[:report_fail_test_if_files_found]=='true'
476
476
  end
477
477
  end
478
- if $new_test_case.video_recording?
478
+
479
+ temp_rec = $new_test_case.video_recording?
480
+
481
+ if temp_rec
479
482
  $new_test_case.stop_video_recording
480
483
  end
481
484
  if $tdriver_reporter.test_case_user_defined_status!=nil
@@ -490,8 +493,31 @@ module TDriverReportCreator
490
493
  end
491
494
  end
492
495
  if(status=='passed')
493
- $new_test_case.set_test_case_status($tdriver_reporter.pass_statuses.first)
494
- create_test_case_folder($tdriver_reporter.pass_statuses.first)
496
+
497
+ no_activity_videos = ""
498
+ if MobyUtil::Parameter[:report_check_device_active, 'false']=='true'
499
+ if temp_rec
500
+ no_activity_videos = $new_test_case.target_video_alive
501
+ end
502
+ end
503
+
504
+ if no_activity_videos == ""
505
+ $new_test_case.set_test_case_status($tdriver_reporter.pass_statuses.first)
506
+ create_test_case_folder($tdriver_reporter.pass_statuses.first)
507
+ else
508
+ # switch case to failed status
509
+ status='failed'
510
+ $new_test_case.copy_video_capture
511
+ $new_test_case.update_test_case "The case failed due to video analysis (#{no_activity_videos}) indicating that the target is no longer responding."
512
+
513
+ $new_test_case.set_test_case_status($tdriver_reporter.fail_statuses.first)
514
+ create_test_case_folder($tdriver_reporter.fail_statuses.first)
515
+ if found_crash_files.to_i > 0
516
+ $new_test_case.capture_crash_files()
517
+ end
518
+
519
+ end
520
+
495
521
  end
496
522
  if(status!='passed' && status!='failed')
497
523
  $new_test_case.set_test_case_status($tdriver_reporter.not_run_statuses.first)
@@ -39,9 +39,13 @@ module TDriverReportDataPresentation
39
39
  puts e.inspect
40
40
  end
41
41
  begin
42
- raise ArgumentError, "ERROR create_graph_image: Data argument is either nil or not a Hash" if ( data.nil? or !data.kind_of? Hash )
42
+
43
+ raise TypeError, "ERROR create_graph_image: Data argument is either nil or not a Hash" if ( data.nil? or !data.kind_of? Hash )
44
+
43
45
  raise ArgumentError, "ERROR create_graph_image: Values of the data Hash need to be arrays of minimum length 2" if ( !data.values[0].kind_of? Array or data.values[0].length < 2 )
44
- raise ArgumentError, "ERROR create_graph_image: Filename argument is either missing or not a String" if ( filename.nil? or !filename.kind_of? String )
46
+
47
+ raise TypeError, "ERROR create_graph_image: Filename argument is either missing or not a String" if ( filename.nil? or !filename.kind_of? String )
48
+
45
49
  g = Gruff::Line.new
46
50
  g.title = title unless title.nil?
47
51
  data.each_key do |signal|
@@ -149,4 +153,4 @@ module TDriverReportDataPresentation
149
153
  </style>
150
154
  '
151
155
  end
152
- end
156
+ end
@@ -49,7 +49,11 @@ class ReportingStatistics
49
49
  @total_statistics_arr << ["reboots",0]
50
50
  @total_statistics_arr << ["crashes",0]
51
51
  @total_statistics_arr << ["duration",0]
52
- @all_statuses << "reboots" << "crashes" << "duration"
52
+ @total_statistics_arr << ["dump count",0]
53
+ @total_statistics_arr << ["sent bytes",0]
54
+ @total_statistics_arr << ["received bytes",0]
55
+ @total_statistics_arr << ["used mem difference",0]
56
+ @all_statuses << "reboots" << "crashes" << "duration" << "dump count" << "sent bytes" << "received bytes" << "used mem difference"
53
57
  end
54
58
 
55
59
  def generate_statistics_headers()
@@ -66,27 +70,16 @@ class ReportingStatistics
66
70
  status_heads << "<td><b>Reboots</b></td>"
67
71
  status_heads << "<td><b>Crashes</b></td>"
68
72
  status_heads << "<td><b>Duration</b></td>"
73
+ status_heads << "<td><b>Dump count</b></td>"
74
+ status_heads << "<td><b>Sent bytes</b></td>"
75
+ status_heads << "<td><b>Received bytes</b></td>"
76
+ status_heads << "<td><b>Used mem</b></td>"
69
77
  status_heads
70
78
  end
71
79
 
72
- def collect_test_case_statistics()
73
- total_duration = 0.0
74
- @group_test_case_arr.each do |test_case|
75
- tc_status=test_case[7]
76
- tc_name=test_case[0].to_s.gsub('_',' ')
77
- tc_execution=test_case[8].to_i
78
- reboots=test_case[2]
79
- crashes=test_case[3]
80
- tc_link=test_case[11]
81
- current_index=0
82
-
83
- duration=test_case[5].to_f
84
- total_duration = total_duration + duration
85
-
86
- b_test_in_statistics=false
87
-
88
- current_index=0
89
- @total_statistics_arr.each do |total_status|
80
+ def update_total_execution_statistics(tc_status,reboots,crashes,dump_count,sent_bytes,received_bytes,memory_usage)
81
+ current_index=0
82
+ @total_statistics_arr.each do |total_status|
90
83
  if tc_status==total_status[0]
91
84
  @total_statistics_arr[current_index]=[tc_status,total_status[1].to_i+1]
92
85
  end
@@ -102,10 +95,26 @@ class ReportingStatistics
102
95
  if total_status[0]=="duration"
103
96
  @total_statistics_arr[current_index]=["duration",""]
104
97
  end
98
+ if total_status[0]=="dump count"
99
+ @total_statistics_arr[current_index]=["dump count",total_status[1].to_i+dump_count.to_i]
100
+ end
101
+ if total_status[0]=="sent bytes"
102
+ @total_statistics_arr[current_index]=["sent bytes",total_status[1].to_i+sent_bytes.to_i]
103
+ end
104
+ if total_status[0]=="received bytes"
105
+ @total_statistics_arr[current_index]=["received bytes",total_status[1].to_i+received_bytes.to_i]
106
+ end
107
+ if total_status[0]=="used mem difference"
108
+ @total_statistics_arr[current_index]=["used mem difference",""]
109
+ end
105
110
  current_index+=1
106
111
  end
107
- current_index=0
108
- @statistics_arr.each do |total_status|
112
+ end
113
+
114
+ def update_test_case_execution_statistics(tc_name,tc_status,tc_execution,duration,tc_link,reboots,crashes,dump_count,sent_bytes,received_bytes,memory_usage)
115
+ b_test_in_statistics=false
116
+ current_index=0
117
+ @statistics_arr.each do |total_status|
109
118
  if total_status[1]==tc_status && total_status[0]==tc_name
110
119
  b_test_in_statistics=true
111
120
  @statistics_arr[current_index]=[tc_name,tc_status,total_status[2].to_i+1,tc_execution,tc_link]
@@ -126,8 +135,50 @@ class ReportingStatistics
126
135
  b_test_in_statistics=true
127
136
  @statistics_arr[current_index]=[tc_name,"duration",duration,tc_execution,tc_link]
128
137
  end
138
+ if total_status[1]=="dump count" && total_status[0]==tc_name
139
+ b_test_in_statistics=true
140
+ @statistics_arr[current_index]=[tc_name,"dump count",total_status[2].to_i+dump_count.to_i,tc_execution,tc_link]
141
+ end
142
+ if total_status[1]=="sent bytes" && total_status[0]==tc_name
143
+ b_test_in_statistics=true
144
+ @statistics_arr[current_index]=[tc_name,"sent bytes",total_status[2].to_i+sent_bytes.to_i,tc_execution,tc_link]
145
+ end
146
+ if total_status[1]=="received bytes" && total_status[0]==tc_name
147
+ b_test_in_statistics=true
148
+ @statistics_arr[current_index]=[tc_name,"received bytes",total_status[2].to_i+received_bytes.to_i,tc_execution,tc_link]
149
+ end
150
+ if total_status[1]=="used mem difference" && total_status[0]==tc_name
151
+ b_test_in_statistics=true
152
+ @statistics_arr[current_index]=[tc_name,"used mem difference",total_status[2].to_i,tc_execution,tc_link]
153
+ end
129
154
  current_index+=1
130
155
  end
156
+ b_test_in_statistics
157
+ end
158
+
159
+ def collect_test_case_statistics()
160
+ total_duration = 0.0
161
+ @group_test_case_arr.each do |test_case|
162
+ tc_status=test_case[7]
163
+ tc_name=test_case[0].to_s.gsub('_',' ')
164
+ tc_execution=test_case[8].to_i
165
+ reboots=test_case[2]
166
+ crashes=test_case[3]
167
+ tc_link=test_case[11]
168
+ dump_count=test_case[13].to_i
169
+ sent_bytes=test_case[14].to_i
170
+ received_bytes=test_case[15].to_i
171
+ memory_usage=test_case[6].to_i
172
+
173
+ duration=test_case[5].to_f
174
+ total_duration = total_duration + duration
175
+ b_test_in_statistics=false
176
+
177
+ #Update total statistics
178
+ update_total_execution_statistics(tc_status,reboots,crashes,dump_count,sent_bytes,received_bytes,memory_usage)
179
+
180
+ #Update current test case total statistics
181
+ b_test_in_statistics=update_test_case_execution_statistics(tc_name,tc_status,tc_execution,duration,tc_link,reboots,crashes,dump_count,sent_bytes,received_bytes,memory_usage)
131
182
 
132
183
  if b_test_in_statistics==false
133
184
  @all_statuses.each do |status|
@@ -141,6 +192,14 @@ class ReportingStatistics
141
192
  @statistics_arr << [tc_name,"total",1,tc_execution,tc_link]
142
193
  elsif status=="duration"
143
194
  @statistics_arr << [tc_name,"duration",duration,tc_execution,tc_link]
195
+ elsif status=="dump count"
196
+ @statistics_arr << [tc_name,"dump count",dump_count,tc_execution,tc_link]
197
+ elsif status=="sent bytes"
198
+ @statistics_arr << [tc_name,"sent bytes",sent_bytes,tc_execution,tc_link]
199
+ elsif status=="received bytes"
200
+ @statistics_arr << [tc_name,"received bytes",received_bytes,tc_execution,tc_link]
201
+ elsif status=="used mem difference"
202
+ @statistics_arr << [tc_name,"used mem difference",memory_usage,tc_execution,tc_link]
144
203
  else
145
204
  @statistics_arr << [tc_name,status,0,tc_execution,tc_link]
146
205
  end
@@ -0,0 +1,192 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+ module TDriverReportJavascript
22
+
23
+ def get_expand_collapse_java_script()
24
+ java_script='<script type="text/javascript">'<<
25
+ '/* Only set closed if JS-enabled */'<<
26
+ "document.getElementsByTagName('html')[0].className = 'isJS';"<<
27
+ 'function tog(dt)'<<
28
+ '{'<<
29
+ 'var display, dd=dt;'<<
30
+ '/* get dd */'<<
31
+ "do{ dd = dd.nextSibling } while(dd.tagName!='DD');"<<
32
+ 'toOpen =!dd.style.display;'<<
33
+ "dd.style.display = toOpen? 'block':'';"<<
34
+ "dt.getElementsByTagName('span')[0].innerHTML"<<
35
+ "= toOpen? '<input id=\"Button1\" type=\"button\" value=\"Close\" class=\"btn\" style=\"background-color: #FFFFFF\" />':'<input id=\"Button1\" type=\"button\" value=\"Open\" class=\"btn\" />' ;"<<
36
+ '}'<<
37
+ '</script>'
38
+ java_script
39
+ end
40
+
41
+ def get_table_sorting_java_script()
42
+ java_script="
43
+ function TSorter(){
44
+ var table = Object;
45
+ var trs = Array;
46
+ var ths = Array;
47
+ var curSortCol = Object;
48
+ var prevSortCol = '3';
49
+ var sortType = Object;
50
+
51
+ function get(){}
52
+
53
+ function getCell(index){
54
+ return trs[index].cells[curSortCol]
55
+ }
56
+
57
+
58
+ this.init = function(tableName)
59
+ {
60
+ table = document.getElementById(tableName);
61
+ ths = table.getElementsByTagName(\"th\");
62
+ for(var i = 0; i < ths.length ; i++)
63
+ {
64
+ ths[i].onclick = function()
65
+ {
66
+ sort(this);
67
+ }
68
+ }
69
+ return true;
70
+ };
71
+
72
+
73
+ function sort(oTH)
74
+ {
75
+ curSortCol = oTH.cellIndex;
76
+ sortType = oTH.abbr;
77
+ trs = table.tBodies[0].getElementsByTagName(\"tr\");
78
+
79
+
80
+ setGet(sortType)
81
+
82
+
83
+ for(var j=0; j<trs.length; j++)
84
+ {
85
+ if(trs[j].className == 'detail_row')
86
+ {
87
+ closeDetails(j+2);
88
+ }
89
+ }
90
+
91
+ // if already sorted just reverse
92
+ if(prevSortCol == curSortCol)
93
+ {
94
+ oTH.className = (oTH.className != 'ascend' ? 'ascend' : 'descend' );
95
+ reverseTable();
96
+ }
97
+ // not sorted - call quicksort
98
+ else
99
+ {
100
+ oTH.className = 'ascend';
101
+ if(ths[prevSortCol].className != 'exc_cell'){ths[prevSortCol].className = '';}
102
+ quicksort(0, trs.length);
103
+ }
104
+ prevSortCol = curSortCol;
105
+ }
106
+
107
+
108
+ function setGet(sortType)
109
+ {
110
+ switch(sortType)
111
+ {
112
+ case \"link_column\":
113
+ get = function(index){
114
+ return getCell(index).firstChild.firstChild.nodeValue;
115
+ };
116
+ break;
117
+ default:
118
+ get = function(index){ return getCell(index).firstChild.nodeValue;};
119
+ break;
120
+ };
121
+ }
122
+
123
+
124
+ function exchange(i, j)
125
+ {
126
+ if(i == j+1) {
127
+ table.tBodies[0].insertBefore(trs[i], trs[j]);
128
+ } else if(j == i+1) {
129
+ table.tBodies[0].insertBefore(trs[j], trs[i]);
130
+ } else {
131
+ var tmpNode = table.tBodies[0].replaceChild(trs[i], trs[j]);
132
+ if(typeof(trs[i]) == \"undefined\") {
133
+ table.appendChild(tmpNode);
134
+ } else {
135
+ table.tBodies[0].insertBefore(tmpNode, trs[i]);
136
+ }
137
+ }
138
+ }
139
+
140
+
141
+ function reverseTable()
142
+ {
143
+ for(var i = 1; i<trs.length; i++)
144
+ {
145
+ table.tBodies[0].insertBefore(trs[i], trs[0]);
146
+ }
147
+ }
148
+
149
+ function quicksort(lo, hi)
150
+ {
151
+ if(hi <= lo+1) return;
152
+
153
+ if((hi - lo) == 2) {
154
+ if(get(hi-1) > get(lo)) exchange(hi-1, lo);
155
+ return;
156
+ }
157
+
158
+ var i = lo + 1;
159
+ var j = hi - 1;
160
+
161
+ if(get(lo) > get(i)) exchange(i, lo);
162
+ if(get(j) > get(lo)) exchange(lo, j);
163
+ if(get(lo) > get(i)) exchange(i, lo);
164
+
165
+ var pivot = get(lo);
166
+
167
+ while(true) {
168
+ j--;
169
+ while(pivot > get(j)) j--;
170
+ i++;
171
+ while(get(i) > pivot) i++;
172
+ if(j <= i) break;
173
+ exchange(i, j);
174
+ }
175
+ exchange(lo, j);
176
+
177
+ if((j-lo) < (hi-j)) {
178
+ quicksort(lo, j);
179
+ quicksort(j+1, hi);
180
+ } else {
181
+ quicksort(j+1, hi);
182
+ quicksort(lo, j);
183
+ }
184
+ }
185
+ }"
186
+ java_script
187
+ end
188
+
189
+
190
+ end
191
+
192
+