[323933] WCAG 2.0/JIS support
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/VisualizeEngine.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/VisualizeEngine.java
index b6ccc5a..688eca0 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/VisualizeEngine.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/engines/blind/html/VisualizeEngine.java
@@ -258,6 +258,7 @@
 							case IBlindProblem.WRONG_ALT_INPUT:
 							case IBlindProblem.SEPARATE_DBCS_ALT_IMG:
 							case IBlindProblem.SEPARATE_DBCS_ALT_INPUT:
+							case IBlindProblem.WRONG_NBSP_ALT_IMG:
 								wrong++;
 								errorCount++;
 							case IBlindProblem.NO_ALT_AREA: // TODO
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/ImgChecker.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/ImgChecker.java
index 47fe030..c6d50ce 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/ImgChecker.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/ImgChecker.java
@@ -108,6 +108,7 @@
 			if (info != null) {
 				isVisible = !info.isInvisible();
 			}
+			img.removeAttribute("id");
 
 			if (imgText.length() > 0 && isVisible) {
 				spanEl.appendChild(doc.createTextNode(imgText));
@@ -125,7 +126,9 @@
 					Element areaE = (Element) areaNL.item(i);
 					BlindProblem prob = null;
 					Integer idObj = null;
-
+					
+					areaEl.setAttribute("id", areaE.getAttribute("id")+"-span");
+					
 					if (!areaE.hasAttribute(ALT)) {
 						if (areaE.hasAttribute("href")) {
 							prob = new BlindProblem(IBlindProblem.NO_ALT_AREA,
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
index ba375ce..0c5f828 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
@@ -643,10 +643,6 @@
     </checkitem>
     <checkitem type="warning" id="L_2">
         <guideline>
-            <gItem id="7.1.4.3" name="JIS"/>
-            <gItem id="7.1.4.4" name="JIS"/>
-            <gItem id="1.4.3" name="WCAG 2.0"/>
-            <gItem id="1.4.4" name="WCAG 2.0"/>
         </guideline>
         <metrics>
             <mItem score="2" name="Perceivable"/>
@@ -709,8 +705,10 @@
     </checkitem>
     <checkitem type="user" id="L_10">
         <guideline>
+            <gItem techniques="F3" id="7.1.1.1" name="JIS"/>
             <gItem techniques="F83, G18, G145" id="7.1.4.3" name="JIS"/>
             <gItem techniques="F83, G17, G18" id="7.1.4.6" name="JIS"/>
+            <gItem techniques="F3" id="7.1.1.1" name="WCAG 2.0"/>
             <gItem techniques="F83, G18, G145" id="1.4.3" name="WCAG 2.0"/>
             <gItem techniques="F83, G17, G18" id="1.4.6" name="WCAG 2.0"/>
         </guideline>
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/description.properties b/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
index 579f353..fd1e49f 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
@@ -59,4 +59,4 @@
 L_4 = Do not use fixed-size font.
 L_5 = This text is too small.
 L_6 = This text is too small and its font size is fixed.  
-L_10 = This area has background image. Please confirm the contrast between text and background.{0}
\ No newline at end of file
+L_10 = This area has background image. Please confirm the contrast between text and background, and confirm important information is not provided only by background image. .{0}
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties b/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
index c46c589..d162c01 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
@@ -10,7 +10,7 @@
 ###############################################################################
 B_0 = \u753b\u50cf\u306balt\u5c5e\u6027\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4ee3\u66ff\u30c6\u30ad\u30b9\u30c8\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002(\u3082\u3057\u652f\u63f4\u6280\u8853\u304c\u3053\u306e\u753b\u50cf\u3092\u7121\u8996\u3059\u308b\u3079\u304d\u5834\u5408\u306f\u3001 alt="" \u3068\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044)\uff1a src="{0}"
 B_1 = \u753b\u50cf\u30dc\u30bf\u30f3\u306balt\u5c5e\u6027\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4ee3\u66ff\u30c6\u30ad\u30b9\u30c8\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-B_2 = area\u8981\u7d20\u306balt\u5c5e\u6027\u304c\u6709\u308a\u307e\u305b\u3093\uff1a {0}\u3002\u4ee3\u66ff\u30c6\u30ad\u30b9\u30c8\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+B_2 = area\u8981\u7d20\u306balt\u5c5e\u6027\u304c\u3042\u308a\u307e\u305b\u3093\uff1a {0}\u3002\u4ee3\u66ff\u30c6\u30ad\u30b9\u30c8\u3092\u63d0\u4f9b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
 B_4 = "{0}"\u306f\u753b\u50cf\u306ealt\u5c5e\u6027\u3068\u3057\u3066\u4e0d\u9069\u5207\u3067\u3059
 B_5 = "{0}"\u306f\u753b\u50cf\u30dc\u30bf\u30f3\u306ealt\u5c5e\u6027\u3068\u3057\u3066\u4e0d\u9069\u5207\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059
 B_6 = "{0}"\u306farea\u8981\u7d20\u306ealt\u5c5e\u6027\u3068\u3057\u3066\u4e0d\u9069\u5207\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059
@@ -20,12 +20,12 @@
 B_12 = \u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u3082\u3057\u304f\u306f\u898b\u51fa\u3057\uff08h1\u3001h2\u2026\uff09\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3000(\u52b9\u679c\u7684\u306a\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u30fb\u898b\u51fa\u3057\u304c\u7121\u3044\u305f\u3081\u3001\u5230\u7740\u306b2\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059)
 B_14 = \u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af "{0}"\u3000\u306f\u3001\u8aad\u307f\u4e0a\u3052\u53ef\u80fd\u306a\u30c6\u30ad\u30b9\u30c8\u3092\u6301\u305f\u306a\u3044\u305f\u3081\u3001\u97f3\u58f0\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093
 B_15 = "{0}"\u3000\u306f\u6587\u5b57\u9593\u306b\u7a7a\u767d\u3092\u542b\u3093\u3067\u3044\u308b\u305f\u3081\u3001\u97f3\u58f0\u3067\u6b63\u78ba\u306b\u8aad\u307f\u4e0a\u3052\u308b\u3053\u3068\u304c\u51fa\u6765\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059
-B_16 = input\u306bid\u5c5e\u6027\u304c\u6709\u308a\u307e\u305b\u3093
+B_16 = input\u306bid\u5c5e\u6027\u304c\u3042\u308a\u307e\u305b\u3093
 B_17 = "\u672c\u6587\u3078\u79fb\u52d5"\u306a\u3069\u306e\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u3078\u306e\u5230\u9054\u306b{0}\u79d2\u3082\u304b\u304b\u308a\u307e\u3059\u3000(\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306e\u633f\u5165\u4f4d\u7f6e\u3092\u898b\u76f4\u3057\u3066\u304f\u3060\u3055\u3044)
 B_18 = \u3053\u306e\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306f\u30b8\u30e3\u30f3\u30d7\u5148\u306e\u30a2\u30f3\u30ab\u30fc"{0}"\u304c\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u5229\u7528\u3067\u304d\u307e\u305b\u3093
 B_19 = \u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306f"\u672c\u6587\u3078\u79fb\u52d5"\u3001"\u672c\u6587\u3078\u306e\u30ea\u30f3\u30af"\u7b49\u3001\u306a\u308b\u3079\u304f\u7c21\u6613\u306a\u30c6\u30ad\u30b9\u30c8\u3092\u7528\u3044\u3066\u4e0b\u3055\u3044\u3000"{0}"\u3000\u306f\u5c11\u3057\u5197\u9577\u3067\u3059
 B_20 = "\u672c\u6587\u3078\u79fb\u52d5"\u306a\u3069\u306e\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306e\u63d0\u4f9b\u3092\u691c\u8a0e\u3057\u3066\u4e0b\u3055\u3044
-B_21 = \u3053\u306e\u30da\u30fc\u30b8\u306b\u306f"\u672c\u6587\u3078\u79fb\u52d5"\u306a\u3069\u306e\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306f\u6709\u308a\u307e\u305b\u3093\u304c\u3001\u5404\u30b3\u30f3\u30c6\u30f3\u30c4\u3078\u306e\u5230\u9054\u6642\u9593\u306f\u6700\u5927\u3067\u3082{0}\u79d2\u3067\u3059\u3000(\u5fc5\u8981\u304c\u3042\u308c\u3070\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306e\u63d0\u4f9b\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044)
+B_21 = \u3053\u306e\u30da\u30fc\u30b8\u306b\u306f"\u672c\u6587\u3078\u79fb\u52d5"\u306a\u3069\u306e\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306f\u3042\u308a\u307e\u305b\u3093\u304c\u3001\u5404\u30b3\u30f3\u30c6\u30f3\u30c4\u3078\u306e\u5230\u9054\u6642\u9593\u306f\u6700\u5927\u3067\u3082{0}\u79d2\u3067\u3059\u3000(\u5fc5\u8981\u304c\u3042\u308c\u3070\u30b9\u30ad\u30c3\u30d7\u30ea\u30f3\u30af\u306e\u63d0\u4f9b\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044)
 B_22 = \u3088\u308a\u591a\u304f\u306e\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u306e\u63d0\u4f9b\u3084\u3001\u898b\u51fa\u3057\u306e\u5229\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3000(\u65e2\u306b\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u304c\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u5230\u9054\u306b2\u5206\u4ee5\u4e0a\u5fc5\u8981\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059)
 B_23 = \u3088\u308a\u591a\u304f\u306e\u898b\u51fa\u3057\u3092\u63d0\u4f9b\u3059\u308b\u304b\u3001\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u306e\u5229\u7528\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3000(\u3053\u306e\u30da\u30fc\u30b8\u306b\u306f\u898b\u51fa\u3057\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u5230\u9054\u306b2\u5206\u4ee5\u4e0a\u5fc5\u8981\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059)
 B_24 = \u3088\u308a\u591a\u304f\u306e\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u30fb\u898b\u51fa\u3057\u306e\u5229\u7528\u3092\u8003\u616e\u3057\u3066\u304f\u3060\u3055\u3044\u3000(\u65e2\u306b\u30da\u30fc\u30b8\u5185\u30ea\u30f3\u30af\u30fb\u898b\u51fa\u3057\u304c\u7528\u3044\u3089\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u5230\u9054\u306b2\u5206\u4ee5\u4e0a\u5fc5\u8981\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u5b58\u5728\u3057\u3066\u3044\u307e\u3059)
@@ -59,4 +59,4 @@
 L_4 = \u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u306f\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002
 L_5 = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002
 L_6 = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002\u3055\u3089\u306b\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u307e\u3059\u3002
-L_10 = \u30b9\u30bf\u30a4\u30eb\u30b7\u30fc\u30c8\u3067\u80cc\u666f\u753b\u50cf\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u9593\u306e\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6bd4\u304c\u5341\u5206\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002{0}
\ No newline at end of file
+L_10 = \u30b9\u30bf\u30a4\u30eb\u30b7\u30fc\u30c8\u3067\u80cc\u666f\u753b\u50cf\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u9593\u306e\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6bd4\u304c\u5341\u5206\u304b\u3001\u80cc\u666f\u753b\u50cf\u306e\u307f\u306b\u3088\u3063\u3066\u91cd\u8981\u306a\u60c5\u5831\u3092\u4f1d\u3048\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002{0}
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/EvaluationUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/EvaluationUtil.java
index 048868f..df74293 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/EvaluationUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/EvaluationUtil.java
@@ -31,8 +31,8 @@
 	 */
 	public static boolean isOriginalDOM() {
 		return IPreferenceConstants.CHECKER_ORG_DOM.equals(EvaluationPlugin
-				.getDefault().getPluginPreferences().getString(
-						IPreferenceConstants.CHECKER_TARGET));
+				.getDefault().getPreferenceStore()
+				.getString(IPreferenceConstants.CHECKER_TARGET));
 	}
 
 	/**
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/ITechniquesItem.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/ITechniquesItem.java
index cd0de87..d16f6ac 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/ITechniquesItem.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/ITechniquesItem.java
@@ -14,14 +14,13 @@
 /**
  * Interface to hold Techniques item information
  */
-public interface ITechniquesItem {
+public interface ITechniquesItem extends Comparable<ITechniquesItem> {
 
 	/**
 	 * @return name of guideline
 	 */
 	public abstract String getGuidelineName();
 
-	
 	/**
 	 * @return ID of Techniques item (e.g., H1, G1, etc.)
 	 */
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/guideline/GuidelineHolder.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/guideline/GuidelineHolder.java
index 85a9ba1..5f44703 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/guideline/GuidelineHolder.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/guideline/GuidelineHolder.java
@@ -14,20 +14,30 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
+import org.eclipse.actf.util.FileUtils;
 import org.eclipse.actf.util.logging.DebugPrintUtil;
 import org.eclipse.actf.visualization.eval.ICheckerInfoProvider;
 import org.eclipse.actf.visualization.eval.IEvaluationItem;
 import org.eclipse.actf.visualization.eval.IGuidelineItem;
+import org.eclipse.actf.visualization.eval.ITechniquesItem;
 import org.eclipse.actf.visualization.eval.preferences.ICheckerPreferenceConstants;
+import org.eclipse.actf.visualization.eval.problem.IProblemItem;
+import org.eclipse.actf.visualization.eval.problem.ProblemItemImpl;
+import org.eclipse.actf.visualization.eval.problem.ReportUtil;
 import org.eclipse.actf.visualization.internal.eval.CheckerExtension;
 import org.eclipse.actf.visualization.internal.eval.EvaluationItemImpl;
 import org.eclipse.actf.visualization.internal.eval.EvaluationPlugin;
@@ -84,7 +94,7 @@
 	private Map<String, IEvaluationItem> checkitemMap = new HashMap<String, IEvaluationItem>();
 
 	private String[] metricsNames = new String[0];
-	
+
 	private String[] localizedMetricsNames = new String[0];
 
 	private boolean[][] correspondingMetricsOfLeafGuideline;
@@ -105,6 +115,15 @@
 
 	private String currentMimeType = "text/html"; //$NON-NLS-1$
 
+	/**
+	 * for debug/print use. Set of TechniquesItems
+	 */
+	private SortedSet<ITechniquesItem> techniquesItemSet;
+	/**
+	 * for debug/print use. Map from a techniques ID to a Set of ProblemItems
+	 */
+	private Map<String, Set<IProblemItem>> techniquesProblemMap;
+
 	// TODO guideline base -> check item base On/Off
 
 	@SuppressWarnings("unchecked")
@@ -198,19 +217,23 @@
 				localizedMetricsNames = new String[metricsNameSet.size()];
 				metricsNameSet.toArray(metricsNames);
 				metricsNameSet.toArray(localizedMetricsNames);
-				
-				for(int i=0; i<localizedMetricsNames.length;i++){
-					if(localizedMetricsNames[i].equalsIgnoreCase("perceivable")){
+
+				for (int i = 0; i < localizedMetricsNames.length; i++) {
+					if (localizedMetricsNames[i]
+							.equalsIgnoreCase("perceivable")) {
 						localizedMetricsNames[i] = Messages.Perceivable;
-					}else if(localizedMetricsNames[i].equalsIgnoreCase("operable")){
+					} else if (localizedMetricsNames[i]
+							.equalsIgnoreCase("operable")) {
 						localizedMetricsNames[i] = Messages.Operable;
-					}else if(localizedMetricsNames[i].equalsIgnoreCase("understandable")){
+					} else if (localizedMetricsNames[i]
+							.equalsIgnoreCase("understandable")) {
 						localizedMetricsNames[i] = Messages.Understandable;
-					}else if(localizedMetricsNames[i].equalsIgnoreCase("robust")){
+					} else if (localizedMetricsNames[i]
+							.equalsIgnoreCase("robust")) {
 						localizedMetricsNames[i] = Messages.Robust;
 					}
 				}
-				
+
 				enabledMetrics = new boolean[metricsNameSet.size()];
 				Arrays.fill(enabledMetrics, true);
 			} else {
@@ -221,7 +244,7 @@
 		}
 
 		for (IEvaluationItem tmpItem : checkitemMap.values()) {
-			if(tmpItem instanceof EvaluationItemImpl){
+			if (tmpItem instanceof EvaluationItemImpl) {
 				((EvaluationItemImpl) tmpItem).initMetrics(metricsNames);
 			}
 			addGuidelineSelectionChangedListener(tmpItem);
@@ -480,7 +503,6 @@
 		return localizedMetricsNames;
 	}
 
-	
 	private void initGuidelineNameLevel2checkItem() {
 		for (GuidelineData data : guidelineMaps.values()) {
 			data.setEvaluationItems(checkitemMap.values(), metricsNames);
@@ -762,4 +784,159 @@
 		return guidelineNames;
 	}
 
+	private class ItemType {
+		boolean error = false;
+		boolean warning = false;
+		boolean user = false;
+		boolean info = false;
+
+		public ItemType(int severity) {
+			setSeverity(severity);
+		}
+
+		public void setSeverity(int severity) {
+			switch (severity) {
+			case IProblemItem.SEV_ERROR:
+				error = true;
+				break;
+			case IProblemItem.SEV_WARNING:
+				warning = true;
+				break;
+			case IProblemItem.SEV_USER:
+				user = true;
+				break;
+			case IProblemItem.SEV_INFO:
+				info = true;
+				break;
+			}
+		}
+
+		@Override
+		public String toString() {
+			StringBuffer tmpSB = new StringBuffer();
+			if (error) {
+				tmpSB.append(Messages.ProblemConst_Essential_2 + " / ");
+			}
+			if (warning) {
+				tmpSB.append(Messages.ProblemConst_Warning + " / ");
+			}
+			if (user) {
+				tmpSB.append(Messages.ProblemConst_User_Check_5 + " / ");
+			}
+			if (info) {
+				tmpSB.append(Messages.ProblemConst_Info + " / ");
+			}
+			if (tmpSB.length() > 3) {
+				tmpSB.setLength(tmpSB.length() - 3);
+			}
+			return tmpSB.toString();
+		}
+	}
+
+	@Override
+	public String toString() {
+		Set<IEvaluationItem> eSet = getMatchedCheckitemSet();
+		ArrayList<IProblemItem> ar = new ArrayList<IProblemItem>();
+		for (IEvaluationItem i : eSet) {
+			ar.add(new ProblemItemImpl(i.getId()));
+		}
+		Map<String, ItemType> itemMap = new HashMap<String, ItemType>();
+		ReportUtil ru = new ReportUtil();
+		ru.setMode(ReportUtil.TAB);
+		StringBuffer tmpSB = new StringBuffer();
+		tmpSB.append("ACTF id\t" + ru.getFirstLine() + FileUtils.LINE_SEP);
+		for (IProblemItem i : ar) {
+			tmpSB.append(i.getId() + "\t" + ru.toString(i) + FileUtils.LINE_SEP);
+			String[] techS = i.getEvaluationItem().getTableDataTechniques()
+					.split(",");
+			for (String s : techS) {
+				String tech = s.trim();
+				ItemType itemType = itemMap.get(tech);
+				if (itemType == null) {
+					itemType = new ItemType(i.getSeverity());
+					itemMap.put(tech, itemType);
+				} else {
+					itemType.setSeverity(i.getSeverity());
+				}
+			}
+		}
+		tmpSB.append(FileUtils.LINE_SEP);
+
+		Set<String> keys = new TreeSet<String>(new Comparator<String>() {
+			public int compare(String o1, String o2) {
+
+				Pattern TECH_ID = Pattern.compile("(\\p{Alpha}+)(\\d+)");
+				Matcher m1 = TECH_ID.matcher(o1);
+				m1.matches();
+				String prefix1 = m1.group(1);
+				int number1 = Integer.parseInt(m1.group(2));
+				Matcher m2 = TECH_ID.matcher(o2);
+				m2.matches();
+				String prefix2 = m2.group(1);
+				int number2 = Integer.parseInt(m2.group(2));
+
+				int flag = prefix1.compareTo(prefix2);
+				if (flag == 0) {
+					flag = new Integer(number1).compareTo(new Integer(number2));
+				}
+				return flag;
+			}
+		});
+
+		keys.addAll(itemMap.keySet());
+
+		for (String key : keys) {
+			tmpSB.append(key + "\t" + itemMap.get(key) + FileUtils.LINE_SEP);
+		}
+
+		return tmpSB.toString();
+	}
+
+	public SortedSet<ITechniquesItem> getTechniquesItemSet() {
+		if (techniquesItemSet == null)
+			createTechSet();
+		return techniquesItemSet;
+	}
+
+	private void createTechSet() {
+		techniquesItemSet = new TreeSet<ITechniquesItem>();
+
+		for (IEvaluationItem i : matchedCheckitemSet) {
+			ProblemItemImpl pitem = new ProblemItemImpl(i.getId());
+			ITechniquesItem[][] techs = pitem.getEvaluationItem()
+					.getTechniques();
+			for (int j = 0; j < techs.length; j++) {
+				for (int j2 = 0; j2 < techs[j].length; j2++) {
+					techniquesItemSet.add(techs[j][j2]);
+				}
+			}
+		}
+	}
+
+	public Map<String, Set<IProblemItem>> getTechProbMap() {
+		if (techniquesProblemMap == null)
+			createTechProbMap();
+		return techniquesProblemMap;
+	}
+
+	private void createTechProbMap() {
+		techniquesProblemMap = new HashMap<String, Set<IProblemItem>>();
+
+		for (IEvaluationItem i : matchedCheckitemSet) {
+			ProblemItemImpl pitem = new ProblemItemImpl(i.getId());
+			ITechniquesItem[][] techs = pitem.getEvaluationItem()
+					.getTechniques();
+			for (int j = 0; j < techs.length; j++) {
+				for (int j2 = 0; j2 < techs[j].length; j2++) {
+					ITechniquesItem tech = techs[j][j2];
+					techniquesItemSet.add(tech);
+					if (!techniquesProblemMap.containsKey(tech.getId())) {
+						techniquesProblemMap.put(tech.getId(),
+								new HashSet<IProblemItem>());
+					}
+					techniquesProblemMap.get(tech.getId()).add(pitem);
+				}
+			}
+		}
+	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
index 49395c6..fad0191 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
@@ -28,6 +28,7 @@
 import org.eclipse.actf.visualization.eval.html.statistics.HeadingsData;
 import org.eclipse.actf.visualization.eval.html.statistics.ImageStatData;
 import org.eclipse.actf.visualization.eval.html.statistics.PageData;
+import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -171,6 +172,7 @@
 	private List<Element> accessKeyList;
 	private List<Element> styleList;
 	private List<Element> styleElementList;
+	private List<Element> idElementList;
 
 	/**
 	 * Constructor of the class.
@@ -779,6 +781,19 @@
 	}
 
 	/**
+	 * Get all elements that has id attribute.
+	 * 
+	 * @return
+	 */
+	public List<Element> getElementsWithId() {
+		if (idElementList == null) {
+			idElementList = getElementsListByXPath(target, "//*[@id]");
+		}
+		return idElementList;
+	}
+	
+	
+	/**
 	 * Get all style elements.
 	 * 
 	 * @return
@@ -1308,4 +1323,54 @@
 	public void setLiveFile(File liveFile) {
 		this.liveFile = liveFile;
 	}
+
+	/**
+	 * Append an error icon to an element in the blind view. If it is already
+	 * appended or it failed to append, returns false.
+	 * 
+	 * @param pitem
+	 * @param original
+	 * @return
+	 */
+	public boolean appendErrorIcon(IProblemItem pitem, Element original) {
+		try {
+			String id = document2IdMap.get(original).toString();
+			Element tmpE = resultDoc.getElementById("id" + id);
+			if (tmpE != null && "area".equalsIgnoreCase(tmpE.getTagName())) {
+				tmpE = resultDoc.getElementById("id" + id + "-span");
+			}
+			if (tmpE != null
+					&& tmpE.getElementsByTagName("img").getLength() == 0) {
+				Element errorImg = resultDoc.createElement("img");
+				errorImg.setAttribute(ATTR_ALT, "error icon");
+				errorImg.setAttribute(ATTR_SRC, "img/exclawhite21.gif");
+				errorImg.setAttribute(ATTR_TITLE, pitem.getDescription());
+
+				String comment = pitem.getDescription();
+				StringBuffer comment_sb = new StringBuffer();
+				// if (871 == curInfo.getId()) {
+				for (int x = 0; x < comment.length(); x++) {
+					if (comment.charAt(x) == '\"') {
+						comment_sb.append("\\");
+					}
+					if (comment.charAt(x) == '\'') {
+						comment_sb.append('\\');
+					}
+					comment_sb.append(comment.charAt(x));
+				}
+
+				String tmpS = comment_sb.toString().replaceAll("\n", "")
+						.replaceAll("\r", "");
+
+				errorImg.setAttribute("onmouseover", "updateBaloon2(\"id" + id
+						+ "\",\"" + tmpS + "\");");
+				tmpE.appendChild(errorImg);
+				return true;
+			} else {
+				return false;
+			}
+		} catch (Exception e) {
+			return false;
+		}
+	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
index ee9b10d..9799c13 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
@@ -243,4 +243,22 @@
 		}
 		return result;
 	}
+
+	public static boolean isTextControl(Element ctrl) {
+		String tagName = ctrl.getTagName().toLowerCase();
+		return (tagName.equals("textarea") || (tagName.equals("input") && ctrl
+				.getAttribute("type").toLowerCase().matches("|text|password")));
+	}
+
+	public static boolean isButtonControl(Element ctrl) {
+		String tagName = ctrl.getTagName().toLowerCase();
+		return ((tagName.equals("button") && ctrl.getAttribute("type")
+				.toLowerCase().matches("submit|reset|button")) || (tagName
+				.equals("input") && ctrl.getAttribute("type").toLowerCase()
+				.matches("submit|reset|button|image")));
+	}
+
+	public static boolean isBlankString(String str) {
+		return str.matches("[\\p{Space}\u3000\u00A0]*");
+	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
index a26a7e3..f547804 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
@@ -15,8 +15,6 @@
 import java.util.Vector;
 
 import org.eclipse.actf.util.FileUtils;
-import org.eclipse.actf.util.xpath.XPathService;
-import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.eval.html.HtmlTagUtil;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.eclipse.actf.visualization.eval.problem.ProblemItemImpl;
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ReportUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ReportUtil.java
index fc59fdc..71159bc 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ReportUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ReportUtil.java
@@ -25,8 +25,12 @@
 
 public class ReportUtil implements IProblemItemVisitor {
 
+	public static final int CSV = 0;
+	public static final int TAB = 1;
+
 	public static final String LINE_SEP = FileUtils.LINE_SEP;
 	private static final String COMMA = ",";
+	private static final String TAB_STRING = "\t";
 	private static final String DOUBLEQUATE = "\"";
 
 	private PrintWriter reportPW;
@@ -43,6 +47,16 @@
 
 	private HashMap<IEvaluationItem, String> cacheMap = new HashMap<IEvaluationItem, String>();
 
+	private int mode = CSV;
+
+	public int getMode() {
+		return mode;
+	}
+
+	private boolean isCSV = true;
+
+	private String separator = COMMA;
+
 	public ReportUtil() {
 		enabledMetrics = gh.getEnabledMetrics();
 
@@ -52,31 +66,46 @@
 		}
 	}
 
+	public void setMode(int mode) {
+		switch (mode) {
+		case CSV:
+			isCSV = true;
+			this.mode = mode;
+			separator = COMMA;
+			break;
+		case TAB:
+			isCSV = false;
+			this.mode = mode;
+			separator = TAB_STRING;
+			break;
+		}
+	}
+
 	public String getFirstLine() {
 		StringBuffer tmpSB = new StringBuffer();
 
-		tmpSB.append(prep(IProblemConst.TITLE_TYPE) + COMMA);
+		tmpSB.append(prep(IProblemConst.TITLE_TYPE) + separator);
 		for (int i = 0; i < metricsNames.length; i++) {
 			if (enabledMetrics[i]) {
-				tmpSB.append(prep(metricsNames[i]) + COMMA);
+				tmpSB.append(prep(metricsNames[i]) + separator);
 			}
 		}
 		for (int i = 0; i < guidelineNames.length; i++) {
 			if (enabledGuidelines[i]) {
-				tmpSB.append(prep(guidelineNames[i]) + COMMA);
+				tmpSB.append(prep(guidelineNames[i]) + separator);
 			}
 		}
 
 		tmpSB.append(prep(IProblemConst.TITLE_GUIDELINE + "("
 				+ IProblemConst.TITLE_HELP + ")")
-				+ COMMA
+				+ separator
 				+ prep(IProblemConst.TITLE_TECHNIQUS)
-				+ COMMA
+				+ separator
 				+ prep(IProblemConst.TITLE_TECHNIQUS + "("
 						+ IProblemConst.TITLE_HELP + ")")
-				+ COMMA
+				+ separator
 				+ prep(IProblemConst.TITLE_LINE)
-				+ COMMA
+				+ separator
 				+ prep(IProblemConst.TITLE_DESCRIPTION));
 
 		return (tmpSB.toString());
@@ -93,11 +122,15 @@
 	}
 
 	private String prep(String target) {
-		return (DOUBLEQUATE
-				+ target.replaceAll(DOUBLEQUATE, DOUBLEQUATE + DOUBLEQUATE) + DOUBLEQUATE);
+		if (isCSV) {
+			return (DOUBLEQUATE
+					+ target.replaceAll(DOUBLEQUATE, DOUBLEQUATE + DOUBLEQUATE) + DOUBLEQUATE);
+		}else{
+			return(target.replaceAll(TAB_STRING, "    "));
+		}
 	}
 
-	public String getCSV(IProblemItem item) {
+	public String toString(IProblemItem item) {
 		if (item == null) {
 			return "";
 		}
@@ -106,18 +139,18 @@
 		String csvStr = cacheMap.get(evalItem);
 		if (csvStr == null) {
 			StringBuffer tmpSB = new StringBuffer();
-			tmpSB.append(prep(item.getSeverityStr()) + COMMA);
+			tmpSB.append(prep(item.getSeverityStr()) + separator);
 			int[] metricsValues = evalItem.getMetricsScores();
 			for (int i = 0; i < metricsValues.length; i++) {
 				if (enabledMetrics[i]) {
 					tmpSB.append(prep(Integer.toString(-metricsValues[i]))
-							+ COMMA);
+							+ separator);
 				}
 			}
 			String[] guidelineValues = evalItem.getTableDataGuideline();
 			for (int i = 0; i < guidelineValues.length; i++) {
 				if (enabledGuidelines[i]) {
-					tmpSB.append(prep(guidelineValues[i]) + COMMA);
+					tmpSB.append(prep(guidelineValues[i]) + separator);
 				}
 			}
 			StringBuffer urlSB = new StringBuffer();
@@ -140,41 +173,41 @@
 			for (int i = 0; i < guidelines.length; i++) {
 				IGuidelineItem gItem = guidelines[i];
 				if (gItem.isEnabled()) {
-					urlSB.append(gItem.getUrl() + COMMA + " ");
+					urlSB.append(gItem.getUrl() + separator + " ");
 					for (ITechniquesItem tech : techniques[i]) {
 						techSet.add(tech);
 					}
 				}
 			}
 			for (ITechniquesItem i : techSet) {
-				techUrlSB.append(i.getUrl() + COMMA + " ");
+				techUrlSB.append(i.getUrl() + separator + " ");
 			}
 
 			String tmpS = urlSB.toString();
 			if (tmpS.length() > 2) {
 				tmpS = tmpS.substring(0, tmpS.length() - 2);
 			}
-			tmpSB.append(prep(tmpS) + COMMA);
+			tmpSB.append(prep(tmpS) + separator);
 
 			tmpSB.append(prep(item.getEvaluationItem().getTableDataTechniques())
-					+ COMMA);
+					+ separator);
 
 			tmpS = techUrlSB.toString();
 			if (tmpS.length() > 2) {
 				tmpS = tmpS.substring(0, tmpS.length() - 2);
 			}
-			tmpSB.append(prep(tmpS) + COMMA);
+			tmpSB.append(prep(tmpS) + separator);
 
 			csvStr = tmpSB.toString();
 			cacheMap.put(evalItem, csvStr);
 		}
-		return (csvStr + prep(item.getLineStrMulti()) + COMMA + prep(item
+		return (csvStr + prep(item.getLineStrMulti()) + separator + prep(item
 				.getDescription()));
 	}
 
 	public void visit(IProblemItem item) {
 		if (item != null)
-			reportPW.println(getCSV(item));
+			reportPW.println(toString(item));
 	}
 
 }
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/TechniquesItemImpl.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/TechniquesItemImpl.java
index e323cf2..56e038e 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/TechniquesItemImpl.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/internal/eval/TechniquesItemImpl.java
@@ -10,14 +10,27 @@
  *******************************************************************************/
 package org.eclipse.actf.visualization.internal.eval;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.eclipse.actf.visualization.eval.ITechniquesItem;
 
 public class TechniquesItemImpl implements ITechniquesItem {
 
+	/**
+	 * parse ID such as "SCR24"
+	 */
+	private static final Pattern TECH_ID = Pattern
+			.compile("(\\p{Alpha}+)(\\d+)");
+
+	private static final List<String> prefixArray = Arrays.asList("G", "H",
+			"C", "SCR", "SVR", "SM", "T", "ARIA", "FLASH", "F");
 	private String guideline = "";
 	private String id = "";
 	private String url = "";
-	
+
 	public String getGuidelineName() {
 		return guideline;
 	}
@@ -30,10 +43,10 @@
 		return url;
 	}
 
-	public void setGuidelineName(String guideline){
+	public void setGuidelineName(String guideline) {
 		this.guideline = guideline;
 	}
-	
+
 	public void setId(String id) {
 		this.id = id;
 	}
@@ -42,5 +55,30 @@
 		this.url = url;
 	}
 
+	public int compareTo(ITechniquesItem o) {
+		Matcher m1 = TECH_ID.matcher(this.getId());
+		m1.matches();
+		String prefix1 = m1.group(1);
+		int number1 = Integer.parseInt(m1.group(2));
+		int i1 = prefixArray.indexOf(prefix1);
+		if (i1 < 0) {
+			System.err.println("Unknown techniques prefix: " + prefix1);
+			i1 = 999;
+		}
+		Matcher m2 = TECH_ID.matcher(o.getId());
+		m2.matches();
+		String prefix2 = m2.group(1);
+		int number2 = Integer.parseInt(m2.group(2));
+		int i2 = prefixArray.indexOf(prefix2);
+		if (i2 < 0) {
+			System.err.println("Unknown techniques prefix: " + prefix2);
+			i2 = 999;
+		}
 
+		int flag = new Integer(i1).compareTo(new Integer(i2));
+		if (flag == 0) {
+			flag = new Integer(number1).compareTo(new Integer(number2));
+		}
+		return flag;
+	}
 }