improvements for header collapse
diff --git a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
index af58541..a2acea1 100644
--- a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
+++ b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/internal/ui/text/folding/JavaScriptCommentFoldingBlockProvider.java
@@ -11,10 +11,17 @@
  *******************************************************************************/
 package org.eclipse.dltk.javascript.internal.ui.text.folding;
 
+import java.util.List;
+
 import org.eclipse.dltk.javascript.internal.ui.text.JSPartitioningProvider;
 import org.eclipse.dltk.javascript.ui.text.IJavaScriptPartitions;
+import org.eclipse.dltk.ui.text.folding.IFoldingBlockKind;
 import org.eclipse.dltk.ui.text.folding.IFoldingContent;
 import org.eclipse.dltk.ui.text.folding.PartitioningFoldingBlockProvider;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
 
 public class JavaScriptCommentFoldingBlockProvider extends
 		PartitioningFoldingBlockProvider {
@@ -38,4 +45,55 @@
 					JavaScriptFoldingBlockKind.JSDOC, isCollapseDocs());
 	}
 
+    @Override
+    protected void reportRegions(Document document, List<IRegion> regions,
+                    IFoldingBlockKind kind, boolean collapse)
+                    throws BadLocationException {
+            if ((kind == JavaScriptFoldingBlockKind.COMMENT || kind == JavaScriptFoldingBlockKind.JSDOC)
+                            && collapse != isCollapseHeaderComment() && !regions.isEmpty()) {
+                    final IRegion first = regions.get(0);
+                    if (first.getOffset() == 0 && isFileHeader(document, first)) {
+                            requestor.acceptBlock(first.getOffset(), first.getOffset()
+                                            + first.getLength(), kind, null /* no element */,
+                                            isCollapseHeaderComment());
+                            super.reportRegions(document,
+                                            regions.subList(1, regions.size()), kind, collapse);
+                            return;
+                    }
+            }
+            super.reportRegions(document, regions, kind, collapse);
+    }
+
+    private boolean isFileHeader(IDocument document, IRegion region)
+                    throws BadLocationException {
+            int endPos = region.getOffset() + region.getLength();
+            String txtAfterComment = document.get(endPos,
+                            Math.min(20, document.getLength() - endPos));
+            int lineDelimiterCount = 0;
+            for (int i = 0; i < txtAfterComment.length(); i++) {
+                    char c = txtAfterComment.charAt(i);
+                    if (c == 'f') {
+                            if (txtAfterComment.substring(i).startsWith("function"))
+                                    return false;
+                    } else if (c == 'v') {
+                            if (txtAfterComment.substring(i).startsWith("var"))
+                                    return false;
+                    } else if (lineDelimiterCount == 1) {
+                            // if after 1 line delimiter still no function
+                            // or var is found then it is a header.
+                            return true;
+                    } else if (c == '\n') {
+                            lineDelimiterCount++;
+                    } else if (c == '\r') {
+                            lineDelimiterCount++;
+                            if (i + 1 < txtAfterComment.length()
+                                            && txtAfterComment.charAt(i + 1) == '\n')
+                                    i++; // skip \r\n
+                    }
+                    if (lineDelimiterCount == 2) {
+                            return true;
+                    }
+            }
+            return false;
+    }
 }
diff --git a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
index d8bc5b4..18b93d3 100644
--- a/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
+++ b/plugins/org.eclipse.dltk.javascript.ui/src/org/eclipse/dltk/javascript/ui/JavascriptPreferenceConstants.java
@@ -78,5 +78,7 @@
 				true);
 		store.setDefault(PreferenceConstants.EDITOR_DOCS_FOLDING_ENABLED, true);
 		store.setDefault(PreferenceConstants.EDITOR_FOLDING_INIT_COMMENTS, true);
+		store.setDefault(
+				PreferenceConstants.EDITOR_FOLDING_INIT_HEADER_COMMENTS, true);
 	}
 }