testability-driver 0.9.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+