Adding readme files
authoramit
Wed, 27 Oct 2010 13:59:11 +0530
changeset 3 de4a2ed2f34b
parent 2 f5e18f8ed036
child 4 e6e33366df0f
Adding readme files
README
hsbook_back.js
simplecomment.py
sphinx_django/settings.py
sphinx_django/settings.pyc
sphinx_django/settings.py~
sphinx_django/sphinxcomment/views.py
sphinx_django/sphinxcomment/views.pyc
sphinx_django/sphinxcomment/views.py~
sphinx_django/static/#comments.js#
sphinx_django/static/basic.css
sphinx_django/static/comments.js
sphinx_django/static/default.css
sphinx_django/static/doctools.js
sphinx_django/static/file.png
sphinx_django/static/jquery.form.js
sphinx_django/static/jquery.js
sphinx_django/static/minus.png
sphinx_django/static/plus.png
sphinx_django/static/pygments.css
sphinx_django/static/searchtools.js
sphinx_django/static/simplecomment.js
sphinx_django/static/simplecomment.js~
sphinx_django/templates/comment.html~
sphinx_django/templates/comment2.html
sphinx_django/test.db
sphinx_django/urls.py
sphinx_django/urls.pyc
sphinx_django/urls.py~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,25 @@
+.. -*- restructuredtext -*-
+
+=================
+README for sphinx-simplecomment
+=================
+
+The Project
+===========
+
+The project is inspired by django book and hg book. It allows us 
+to comment on sphinx documentation. 
+
+Installing
+==========
+
+Add the html files of SPHINX PROJECT in setting at the variable SPHINX_PROJECT
+
+do
+
+python manage.py syncdb
+python manage runserver
+
+
+
+
--- a/hsbook_back.js	Fri Oct 15 15:59:28 2010 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-function qid(id) {
-  return id.replace(/([.:])/g, "\\$1");
-}
-
-function beforeComment(formData, jqForm, options) {
-  var form=jqForm[0];
-
-  if (form.comment.textLength.toString()=='0') {
-    $("span.comment_error").empty().append(
-      "<span class=\"comment_error\">  Your comment is empty</span>");
-    return false;
-  }
-  if (form.name.textLength.toString()=='0') {
-    $("span.comment_error").empty().append(
-      "<span class=\"comment_error\">   Please provide a name</span>");
-    return false;
-  }
-  $(options.target + " span.comment_error").empty().after(
-    "<img src=\"/support/icons/throbber.gif\" style=\"vertical-align: middle\"/>");
-  $("input[@name=submit]").attr("disabled", true);
-}
-
-function ajaxifyForm(id) {
-
-//  $('#form_func_1').replaceWith('something');
-
-  var substring=id.substr(9);
-  $('#form_'+substring).ajaxForm({beforeSubmit: beforeComment,
-			      success: function(){ loadComments(id);}
-
-			     });}
-
-
-function toggleComment(id) {
-  $("#toggle_" + qid(id)).nextAll().toggle();
-  return false;
-}
-
-
-function loadComments(id)
-{
-
-  var substring=id.substr(9);
-  $('#comments_'+substring).load("http://127.0.0.1:8000/single/"+ substring +'/',function() { ajaxifyForm(id);}
-				);
-
-}
-
-
-
-
-function loadAllComments() {
-  $("a.commenttoggle").each(function() {
-    var id = $(this).attr("pid");
-    if (id) {
-      loadComments(id);
-    }
-  });
-}
-
-
-
-$(document).ready(function() {
-  function loading(id) {
-    return " <span id=\"comments_" + id + "\" class=\"comment\">" +
-      "<span pid=\"" + id + "\" class=\"commenttoggle\"><p>Loading...." +
-      "</span>";
-  }
-
-$("p[@id]").each(function() {
-    $(this).append(loading($(this).attr("id")));
-		   });
-
-
-var url_string=window.location.pathname;
-var temp = new Array();
-temp = url_string.split('/');
-var chap_name=temp[temp.length-1].split('.')[0];
-
-jQuery.getJSON("http://127.0.0.1:8000/count/"+chap_name, function(data) {
-
-		 $("span.comment").each(function(data_val) {
-		 var id = $(this).attr("id");
-		var substring=id.substr(9);
-
-		$(this).replaceWith("<span class='comment'" +  ' id='+ id+ " <a   +  href=javascript:loadComments('"+id+"');>" + data.count[substring] +' comments'+ "</a>");
-
-					});
-
-
-	       });
-
-		  });
-
-
-
-
-
-
-
-
-
-
-
-
-
--- a/simplecomment.py	Fri Oct 15 15:59:28 2010 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    sphinx.builders.webapp
-    ~~~~~~~~~~~~~~~~~~~~~~
-
-    A web application builder.
-
-    :copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-"""
-
-import os
-import sys
-import codecs
-import shutil
-import cPickle
-from os import path
-from hashlib import md5
-from types import ListType, TupleType
-import re
-
-
-import jinja2 as j2
-
-#from mercurial import commands, ui
-#from mercurial.hg import repository
-
-from sphinx.builders.html import StandaloneHTMLBuilder
-from sphinx.errors import SphinxError
-from sphinx.web.dbutils import PidDb
-from sphinx.web.webconfig import WebConfig
-from sphinx.writers.html import HTMLTranslator
-
-
-
-
-
-
-class SimpleCommentHTMLBuilder(StandaloneHTMLBuilder):
-    """ Static html pages with paragraph ids. 
-    """
-    def init(self):
-        self.app.add_javascript('simplecomment.js')
-        self.id_file_loc=os.path.join(self.outdir,'paragraph_id.py')
-        self.id_file=open(self.id_file_loc,'w')
-        self.beginning="p_list= "
-        self.id_dictionary={}
-
-        StandaloneHTMLBuilder.init(self)
-
-    def get_target_uri(self, docname, typ=None):
-        return docname + self.link_suffix
-
-    def write_doc(self, docname, doctree):
-        StandaloneHTMLBuilder.write_doc(self, docname, doctree)
-
-    def prepare_writing(self, docnames):
-        StandaloneHTMLBuilder.prepare_writing(self, docnames)
-
-    def finish(self):
-        StandaloneHTMLBuilder.finish(self)
-        self.add_pids_to_paragraphs()
-        self.id_file.write(self.beginning+str(self.id_dictionary))
-       
-
-    def add_pids_to_paragraphs(self):
-        all_files=[]
-        for path,dir,filenames in os.walk(self.outdir):
-            for filename in filenames:
-                all_files.append(os.path.join(path, filename))
-
-            for element in all_files :
-                if element.split('.')[1]=='html':
-                    self.id_list=[]
-                    self.taggen(element)
-                    self.id_dictionary[self.chapter.split('/')[-1]]=self.id_list
-                
-                else :
-                    pass
-
-    def retag(self,s):
-        self.biggest_id += 1
-        id_name="%s_%x" % (self.chapter.split('/')[-1],self.biggest_id)   
-        self.id_list.append(id_name) 
-         
-        return '<p id="%s">' %id_name
-
-
-
-
-    def taggen(self,html_file_name):
-        tagged = re.compile('<p id="x_([0-9a-f]+)"[^>]*>', re.M)
-        self.biggest_id=0 
-        self.chapter=html_file_name.split('.')[0]    
-       
-        try:    
-            f = open(html_file_name).read()
-            f1 = re.sub('<p>',self.retag, f )
-            
-           
-            if f1 != f:
-                tmpname = html_file_name+ '.tmp'
-                fp = open(tmpname, 'w')
-                fp.write(f1)
-                fp.close()
-                os.rename(tmpname,html_file_name)
-        
-        except IOError:
-            pass
-            
-
-
--- a/sphinx_django/settings.py	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/settings.py	Wed Oct 27 13:59:11 2010 +0530
@@ -1,4 +1,5 @@
 # Django settings for sphinx_django project.
+import os
 
 DEBUG = True
 TEMPLATE_DEBUG = DEBUG
@@ -66,16 +67,17 @@
 ROOT_URLCONF = 'sphinx_django.urls'
 
 
-
+templates=os.path.join(os.getcwd(),'templates')
 
 TEMPLATE_DIRS = (
-    "/home/amit/review/sphinx_django/templates/"
+   templates
     
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
 )
-
+# Path of your sphinx static files 
+SPHINX_PROJECT = '/home/amit/review/sttp_com/_build/html'
 INSTALLED_APPS = (
     'django.contrib.admin',
     'django.contrib.auth',
Binary file sphinx_django/settings.pyc has changed
--- a/sphinx_django/settings.py~	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/settings.py~	Wed Oct 27 13:59:11 2010 +0530
@@ -1,4 +1,5 @@
 # Django settings for sphinx_django project.
+import os
 
 DEBUG = True
 TEMPLATE_DEBUG = DEBUG
@@ -65,6 +66,9 @@
 
 ROOT_URLCONF = 'sphinx_django.urls'
 
+
+
+
 TEMPLATE_DIRS = (
     "/home/amit/review/sphinx_django/templates/"
     
@@ -72,7 +76,8 @@
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
 )
-
+# Path of your sphinx static files 
+SPHINX_PROJECT = 'SPHINX STATIC FILES'
 INSTALLED_APPS = (
     'django.contrib.admin',
     'django.contrib.auth',
--- a/sphinx_django/sphinxcomment/views.py	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/sphinxcomment/views.py	Wed Oct 27 13:59:11 2010 +0530
@@ -10,10 +10,12 @@
 from django.template import Context
 from django.template.loader import get_template
 from django.utils.simplejson import dumps 
-
+from django.conf import settings
+from os.path import join, splitext
+from BeautifulSoup import BeautifulSoup as bss, Tag
 
-placeholder_string = open('paragraph_id.py').read()
-exec placeholder_string
+#placeholder_string = open('paragraph_id.py').read()
+#exec placeholder_string
 
 def dump_queries():
     # requires settings.DEBUG to be set to True in order to work
@@ -38,46 +40,36 @@
 def comments_by_chapter(chapter):
      objs = {}
 
-     try:
-         para_list=p_list[chapter]
-
-         for paragraph_id in para_list:
-           objs[paragraph_id]=[] 
-
-     except:
-         para_list=[]
-
-     for paragraph_id in para_list:
-         print chapter ,paragraph_id
-         for c in Comment.objects.filter(element__chapter_name=chapter,element__paragraph_id=paragraph_id).order_by('date'):
-
-             objs[paragraph_id].append(c)
+     for c in Comment.objects.filter(element__chapter_name=chapter).order_by('date'):
+         objs.setdefault(c.element.paragraph_id, []).append(c)
+         
 
              
      
      return objs
 
+
      
 
 
 
 
-def chapter(request):
-    template = get_template('comment.html')
-    resp = {}
-    for elt, comments in comments_by_chapter(chapter).iteritems():
-        print elt ,comments
-        form = CommentForm(initial={
-            'paragraph_id': elt,
-            'name': name
-            })
-        resp[elt] = template.render(Context({
-            'paragraph_id': elt,
-            'form': form,
-            'length': len(comments),
-            'query': comments,
-            }))
-    return HttpResponse(dumps(resp), mimetype='application/json')
+# def chapter(request):
+#     template = get_template('comment.html')
+#     resp = {}
+#     for elt, comments in comments_by_chapter(chapter).iteritems():
+#         print elt ,comments
+#         form = CommentForm(initial={
+#             'paragraph_id': elt,
+#             'name': name
+#             })
+#         resp[elt] = template.render(Context({
+#             'paragraph_id': elt,
+#             'form': form,
+#             'length': len(comments),
+#             'query': comments,
+#             }))
+#     return HttpResponse(dumps(resp), mimetype='application/json')
 
 def chapter_count(request,chapter_name):
     print chapter_name
@@ -98,7 +90,7 @@
     if paragraph_id[-1]=='/':
         paragraph_id=paragraph_id[:-1]
     queryset = Comment.objects.filter(element=paragraph_id)
-    print paragraph_id 
+    print len(queryset)
     if form is None:
         form = CommentForm(initial={
             'paragraph_id': paragraph_id,
@@ -163,8 +155,27 @@
     string="<p>test comment</p>"
     return HttpResponse(string,mimetype="text/plain")
     
-       
-
+def page(req, path):
+    if splitext(path)[1] == '.html':
+        soup = bss(open(join(settings.SPHINX_PROJECT, path)).read())
+        head = soup.find('head')
+        first_script = Tag(soup, 'script')
+        first_script['src'] = "../_static/simplecomment.js"
+        first_script['type'] = "text/javascript"
+        second_script = Tag(soup, 'script')
+        second_script['src'] = "../_static/jquery.form.js"
+        second_script['type'] = "text/javascript"
+        head.insert(-1, first_script)
+        head.insert(-1, second_script)
+        counter = 0
+        page_identity = path.split('.')[0].replace('/', '_')
+        for p in soup.findAll('p'):
+            p['id'] = '%s_%s' %(page_identity, counter)
+            counter += 1
+        return HttpResponse(str(soup))
+    else:
+        return HttpResponse(open(join(settings.SPHINX_PROJECT, path)).read())
+    
 #return HttpResponse(dumps(string),mimetype="text/plain")
 #test= csrf_exempt(test)
 
Binary file sphinx_django/sphinxcomment/views.pyc has changed
--- a/sphinx_django/sphinxcomment/views.py~	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/sphinxcomment/views.py~	Wed Oct 27 13:59:11 2010 +0530
@@ -10,10 +10,12 @@
 from django.template import Context
 from django.template.loader import get_template
 from django.utils.simplejson import dumps 
-
+from django.conf import settings
+from os.path import join, splitext
+from BeautifulSoup import BeautifulSoup as bss, Tag
 
-placeholder_string = open('paragraph_id.py').read()
-exec placeholder_string
+#placeholder_string = open('paragraph_id.py').read()
+#exec placeholder_string
 
 def dump_queries():
     # requires settings.DEBUG to be set to True in order to work
@@ -38,44 +40,36 @@
 def comments_by_chapter(chapter):
      objs = {}
 
-     try:
-         para_list=p_list[chapter]
-
-         for paragraph_id in para_list:
-           objs[paragraph_id]=[] 
+     for c in Comment.objects.filter(element__chapter_name=chapter).order_by('date'):
+         objs.setdefault(c.element.paragraph_id, []).append(c)
+         
 
-     except:
-         para_list=[]
+             
+     
+     return objs
 
-     for paragraph_id in para_list:
-         
-         for c in Comment.objects.filter(element__chapter_name=chapter,element__paragraph_id=paragraph_id).order_by('date'):
-
-             objs[paragraph_id].append(c)
-
-     return objs
 
      
 
 
 
 
-def chapter(request):
-    template = get_template('comment.html')
-    resp = {}
-    for elt, comments in comments_by_chapter(chapter).iteritems():
-        print elt ,comments
-        form = CommentForm(initial={
-            'paragraph_id': elt,
-            'name': name
-            })
-        resp[elt] = template.render(Context({
-            'paragraph_id': elt,
-            'form': form,
-            'length': len(comments),
-            'query': comments,
-            }))
-    return HttpResponse(dumps(resp), mimetype='application/json')
+# def chapter(request):
+#     template = get_template('comment.html')
+#     resp = {}
+#     for elt, comments in comments_by_chapter(chapter).iteritems():
+#         print elt ,comments
+#         form = CommentForm(initial={
+#             'paragraph_id': elt,
+#             'name': name
+#             })
+#         resp[elt] = template.render(Context({
+#             'paragraph_id': elt,
+#             'form': form,
+#             'length': len(comments),
+#             'query': comments,
+#             }))
+#     return HttpResponse(dumps(resp), mimetype='application/json')
 
 def chapter_count(request,chapter_name):
     print chapter_name
@@ -93,9 +87,10 @@
     return HttpResponse(dumps(resp), mimetype='application/json')
     
 def single(request,paragraph_id, form=None, newid=None):
-    paragraph_id=paragraph_id[:-1]
+    if paragraph_id[-1]=='/':
+        paragraph_id=paragraph_id[:-1]
     queryset = Comment.objects.filter(element=paragraph_id)
-    print paragraph_id 
+    print len(queryset)
     if form is None:
         form = CommentForm(initial={
             'paragraph_id': paragraph_id,
@@ -119,11 +114,13 @@
 
 
 def submit(request, paragraph_id):
+
     try:
         element = get_object_or_404(Element, paragraph_id=paragraph_id)
     except Http404:
+        #creating chapter name from paragraph_id surely there is a better way using the context but i do not know as yet
         chapter_id='_'.join(paragraph_id.split('_')[0:-1])
-        chapter_name=chapter_id.replace('_','/')
+        chapter_name=chapter_id[-1::-1].replace('_','/',1)[-1::-1]
         element=Element(chapter_name=chapter_name,paragraph_id=paragraph_id)
         element.save()
     print element.chapter_name
@@ -158,8 +155,27 @@
     string="<p>test comment</p>"
     return HttpResponse(string,mimetype="text/plain")
     
-       
-
+def page(req, path):
+    if splitext(path)[1] == '.html':
+        soup = bss(open(join(settings.SPHINX_PROJECT, path)).read())
+        head = soup.find('head')
+        first_script = Tag(soup, 'script')
+        first_script['src'] = "_static/simplecomment.js"
+        first_script['type'] = "text/javascript"
+        second_script = Tag(soup, 'script')
+        second_script['src'] = "_static/jquery.form.js"
+        second_script['type'] = "text/javascript"
+        head.insert(-1, first_script)
+        head.insert(-1, second_script)
+        counter = 0
+        page_identity = path.split('.')[0].replace('/', '_')
+        for p in soup.findAll('p'):
+            p['id'] = '%s_%s' %(page_identity, counter)
+            counter += 1
+        return HttpResponse(str(soup))
+    else:
+        return HttpResponse(open(join(settings.SPHINX_PROJECT, path)).read())
+    
 #return HttpResponse(dumps(string),mimetype="text/plain")
 #test= csrf_exempt(test)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/#comments.js#	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,587 @@
+/*
+ * Java Script/JQuery glue for server-side Python code and the comments/fixes
+ * stuff which is being served along with the documentation.
+ *
+ * :copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ * Below is a short description of the main functions used to make the tool
+ * work. Internal functions are not listed here.
+ *
+ **  
+ *** checking/downloading/printing/adding comments and fixes ****************
+ **
+ *
+ * load_comments(id) -> check if database file with comments for paragraph 'id'
+ *                      exists on the server; if yes, invoke comments_found()
+ *                      function; if not, invoke no_comments() function.
+ *
+ * load_fixes(id) -> check if database file with fixes for paragraph 'id'
+ *                   exists on the server; if yes, invoke fixes_found()
+ *                   function; if not, invoke no_fixes() function.
+ *
+ * no_comments(id) -> insert a link ('No comments') to the post form after
+ *                    the paragraph 'id'.
+ *
+ * no_fixes(id) -> insert a link ('No fixes') to the post form after the
+ *                 'No comments' string.
+ *
+ * comments_found(id) -> download the comments database file for paragraph 'id'
+ *                       and print it under the paragraph.
+ *
+ * fixes_found(id) -> download the fixes database file for paragraph 'id'
+ *                    and print it under the paragraph.
+ *
+ * print_comments(id, data) -> print comments collected in an array 'data'
+ *                             under the paragraph 'id'.
+ *                             'data' is an array of objects; every object
+ *                             has properties like 'name', 'score', 'comment'.
+ *                             This function also prints a link at the end
+ *                             of paragraph with a number of comments hidden
+ *                             (i.e. "3 Comments").
+ *
+ * print_fixes(id, data) -> print fixes collected in an array 'data' under
+ *                          the paragraph 'id'.
+ *                          The description for print_comments() applies.
+ *
+ * add_new_comment(id) -> ajaxify a comment post form for paragraph 'id'
+ *                        and reload comments (with load_comments() function).
+ *                        This function also validates the form and resets
+ *                        it on successful submit.
+ *
+ **
+ *** displaying/hiding areas *************************************************
+ **
+ *
+ * show_hide_comments(id) -> hide fixes area, show comments area and make sure
+ *                           that the main comments/fixes area is shown
+ *
+ * show_hide_fixes(id) -> hide comments area, show fixes area and make sure
+ *                        that the main comments/fixes area is shown
+ *
+ * show_hide_submitFixFields(id) -> show/hide additional fields in the post
+ *                                  form for fixes view (when 'I would like
+ *                                  to submit a patch' checkbox is 'true')
+ *                                  and fill them with data if needed
+ *
+ *
+ **
+ *** rating comments/fixes ***************************************************
+ **
+ *
+ * comments_up_down(id, comment_no, up_down, db)
+ *                   -> send a GET request to the server with three parameters:
+ *                       - id: paragraph id,
+ *                       - comment_no: a number of a comment to score,
+ *                       - up_down: two values possible: 'up' or 'down'
+ *                                  depending on what kind of action should
+ *                                  be taken ('up' means score+=1, and down
+ *                                  means score-=1).
+ *
+ **
+ *** sorting comments/fixes ************************************************ 
+ **
+ * 
+ * sort_comments(id, by, db) -> sort comments for paragraph 'id' by 'by' argument
+ *                          (two values for 'by' are possible at the moment:
+ *                          'score' and 'date'). The sorting order changes
+ *                          automatically from increasing to decreasing with
+ *                          every sort.
+ *
+ *
+ **
+ *** threading ************************************************************
+ **
+ *
+ * new_thread(id) -> make a particular comment a new thread before submitting
+ *                   it
+ *
+ * reply_to(id, comment_no) -> make a comment a reply to comment 'comment_no'
+ *
+ **
+ *** developer's actions ***************************************************
+ **
+ *
+ * delete_comment(db, id, comment_no) -> delete entry from database 'db'
+ *                                       located in 'id' file under
+ *                                       'comment_no' index
+ *
+ * commit_fix(node, id, fix_no) -> commit a fix located in 'id' file under
+ *                                 'fix_no' index to the repository
+ *
+ **
+ *** general-use functions ************************************************
+ **
+ *
+ * empty_comments(id) -> empty the comments area
+ *
+ * empty_fixes(id) -> empty the fixes area
+ *
+ * is_developer() -> returns true when developer rights should be granted
+ *                   and false when the rights should not be granted.
+ *                   At jQuery level it's only about displaying some
+ *                   additional/developer-only-options. Real authorization
+ *                   is going on on webapp (appserver.py) level.
+ */
+
+comments_path = "/comments/";
+fixes_path = "/fixes/";
+_db = undefined;
+
+// *** checking/downloading/printing/adding comments ************************
+
+function load_generic(what, id, error_func, success_func) {
+   // if the div was filled with the comments before, empty it before appending
+   if(_db == 'comments') {
+      empty_comments(id);
+   } else {
+      empty_fixes(id);
+   }
+
+   // 'what' -> 'comments_path' or 'fixes_path' variables;
+   var c_path = location.protocol + "//" + location.host + what + id;
+   $.ajax({ url: c_path,
+            type: 'HEAD',
+            error: function() { error_func(id) },
+            success: function() { success_func(id)}
+         });
+}
+
+function load_comments(id) {
+   return load_generic(comments_path, id, no_comments, comments_found)
+}
+
+function load_fixes(id) {
+   return load_generic(fixes_path, id, no_fixes, fixes_found)
+}
+
+function get_load_cf(db) {
+   if(db == 'comments' || db == comments_path) {
+      return load_comments;
+   }
+   return load_fixes;
+}
+
+//////////////////////
+
+function not_found_generic(what, id) {
+   // 'what' -> 'comment' or 'fix' strings
+   plural = what=='comment'?'comments':'fixes';
+   $("a[name*=" + what + "_" + id + "]").replaceWith(
+         '<a name="' + what + '_' + id + '" href="#' + id + '" '
+          + 'onclick="show_hide_' + plural + '(\'' + id + '\')" '
+          + 'id="' + id + '">No ' + plural + '</a>'
+          + '<a name="' + id + '"></a>');
+}
+
+function no_comments(id) {
+   not_found_generic('comment', id);
+}
+
+function no_fixes(id) {
+   not_found_generic('fix', id);
+}
+
+//////////////////////////////
+
+function found_generic(what, id, print_func) {
+   var c_path = location.protocol + "//" + location.host + what + id + "?id=" + id;
+   $.getJSON(c_path, function(data) {
+      print_func(id, data);
+   });
+}
+
+function comments_found(id) {
+   found_generic(comments_path, id, print_comments);
+}
+
+function fixes_found(id) {
+   found_generic(fixes_path, id, print_fixes);
+}
+
+///////////////////////////////
+
+function print_generic(what, id, data) {
+   var c_flag = (what == 'comments') ? true : false;
+   var singular = (what == 'comments') ? 'comment' : 'fix';
+   var isdev = is_developer();
+   var node = $('div[class=submitFixFields_' + id + ']').attr('value');
+   
+   if(what == 'comments') {
+      empty_comments(id);
+   } else {
+      empty_fixes(id);
+   }
+
+   // A 'factory' function which generates '+' and '-' buttons for every comment.
+   //       'what'  is a kind of database (db for comments or for fixes)
+   //         'id'  is a paragraph id.
+   // 'comment_no'  is a place of a comment in the list of comments for given
+   //               paragraph.
+   //    'up_down'  is passed to POST method. It should be 'up' or 'down'.
+   //       'sign'  is what's displayed on the button, by default it's '+' or '-'.
+   function rate_comment_up_down_button(what, id, comment_no, up_down, sign) {
+      return ' <a href="#' + id + '" onclick="comments_up_down(\'' + id + '\', \'' + comment_no + '\', \'' + up_down + '\', \'' + what + '\')"><b>' + sign + '</b></a> '
+   }
+
+   // in fixes view - show proposed diff
+   function proposed_fix(c_flag, paragraph) {
+      if(!c_flag) {
+         return   '<tr>'
+                +   '<td>'
+                +     'Fix: ' + paragraph
+                +   '</td>'
+                + '</tr>'
+                +  "<tr><td>&nbsp;</td></tr>"
+      }
+      return '';
+   }
+
+   // for every comment/fix generate a 'Reply' button
+   function link_reply_to(id, comment_no) {
+      return 'Comment no.: ' + data[i].comment_no
+             + ' (<a href="#" onclick="reply_to(\'' + id + '\', \'' + comment_no + '\')">reply</a>).'
+   }
+
+   /* <developer's actions> */
+   function delete_comment_button(db, id, comment_no) {
+      return '<a href="#" onclick="delete_comment(\'' + db + '\', \'' + id +  '\', \'' + comment_no + '\')">delete</a>' 
+   } 
+
+   function commit_button(node, id, fix_no) {
+      return '<a href="#" onclick="commit_fix(\'' + node + '\', \'' +  id + '\', \''
+                  + fix_no + '\')">commit</a>'
+   }
+
+   function developers_actions(what, id, data, i) {
+       return  '<tr>'
+             +  '<td>'
+             +    'Admin actions: '
+             +    delete_comment_button(what, id, data[i].comment_no)
+             +    ', '
+             +    commit_button(node, id, data[i].comment_no)
+             +    '.'
+             +  '</td>'
+             + '</tr>' 
+   }
+   /* </developer's actions> */
+
+   // add the comments for paragraph
+   for(i=0; i<data.length; i++) {
+      // 'data[i]['date'] * 1000' to convert from milliseconds to seconds
+      var commentDate = new Date(data[i]['date']*1000);
+
+      $('div[class*=' + what + '_for_' + id + ']').append(
+           "<table name='" + id + "' width='" + data[i].width + "%' align=center "
+         +  "style='background-color: #f1ffc5; border: solid 1px lightblue;'>"
+         +  "<tr>"
+         +    "<td>"
+         +     "Name: <a href='" + data[i].url + "'>" + data[i].name + "</a>. "
+         +     "(" + get_date(commentDate) + ")"
+         +    '</td>'
+         +  '</tr>'
+         +  '<tr>'
+         +    '<td>'
+         +     ' Score: <span class="score"><b>' + data[i].score + '</b></span>'
+         +     rate_comment_up_down_button(what, id, data[i].comment_no, 'up', '+') 
+         +     rate_comment_up_down_button(what, id, data[i].comment_no, 'down', '-')
+         +     '. '
+         +     link_reply_to(id, data[i].comment_no)
+         +    '</td>'
+         +  '</tr>'
+         +  (isdev ? developers_actions(what, id, data, i) : '')
+         +  '<tr><td>&nbsp;</td></tr>'
+         +  proposed_fix(c_flag, data[i].paragraph_diff)
+         +  "<tr>"
+         +    "<td>"
+         +      'Comment: ' + data[i].comment
+         +    "</td>"
+         +  "</tr>"
+         + "</table><br>");
+   }
+
+   // add a button for showing/hiding the comments and post form
+   $("a[name*=" + singular + "_" + id + "]").replaceWith(
+                                   '<a name="' + singular + '_' + id
+                                    + '" href="#' + id + '"' +
+                                    'onclick="show_hide_' + what + '(\'' +
+                                    id + '\')" '
+                                    + 'id="' + id + '">'
+                                    + data.length + ' ' + what + '</a>'
+                                    + '<a name="' + id + '"></a>');
+
+   if(what == 'comments') {
+      hide_fixes(id);
+      show_comments(id);
+   } else {
+      hide_comments(id);
+      show_fixes(id);
+   }
+}
+
+
+function print_comments(id, data) {
+   print_generic('comments', id, data);
+}
+
+function print_fixes(id, data) {
+   print_generic('fixes', id, data);
+}
+
+/////////////////////////////
+
+function add_new_comment(id) {
+   function validate(formData, jqForm, options) {
+      var form = jqForm[0];
+      if(!form.name.value) {
+         alert("Please provide your name");
+         return false;
+      } else if(!form.comment.value) {
+         alert("Please provide your comment");
+         return false;
+      } else if(form.submitFix.checked && !form.licence.checked) {
+         alert("You have to agree to publish your fix on our licence!");
+         return false;
+      }
+
+      if(form.submitFix.checked) {
+         _db = 'fixes';
+      } else {
+         _db = 'comments';
+      }
+   }
+
+   function form_reset() {
+      $('#commentForm_' + id).resetForm()
+      new_thread(id);
+      if(_db == 'comments') {
+         load_comments(id);
+      } else {
+         load_fixes(id);
+      }
+   }
+
+   // bind 'commentForm' and provide a simple callback function 
+   $('#commentForm_' + id).ajaxForm({
+                                       beforeSubmit: validate,
+                                       success: form_reset
+                                    }); 
+}
+
+//////////////////////////////
+
+function hide_main_div(id) {
+   $('div.x' + id).css('display', 'none');  
+}
+
+function show_main_div(id) {
+   $('div.x' + id).css('display', 'block');  
+}
+
+function hide_submitFixFields(id) {
+   $('div.submitFixFields_' + id).css('display', 'none');
+}
+
+function show_submitFixFields(id) {
+   node = $('div[class=submitFixFields_' + id + ']').attr('value');
+   fill_paragraph_from_repo(node, id);
+   $('input[name=submitFix]').attr('checked', true);
+   $('div.submitFixFields_' + id).css('display', 'block'); 
+   _db = 'fixes';
+
+}
+
+function hide_comments(id) {
+   $('input[name=submitFix]').attr('checked', false);
+   $('div.comments_for_' + id).css('display', 'none');
+}
+
+function hide_fixes(id) {
+   $('div.fixes_for_' + id).css('display', 'none');
+   hide_submitFixFields(id);
+}
+
+function show_comments(id) {
+   $('input[name=submitFix]').attr('checked', false);
+   $('div.comments_for_' + id).css('display', 'block');
+   _db = 'comments';
+}
+
+function show_fixes(id) {
+   $('div.fixes_for_' + id).css('display', 'block');
+   show_submitFixFields(id);
+}
+
+function mainDivIsHidden(id) {
+   return $('div.x' + id).is(':hidden');
+}
+
+function show_menu_hide(what, id) {
+   function sort_comments_by_button(what, id, by) {
+      return '<a href="#" onclick="sort_comments(\'' + id + '\', \'' + by + '\', \'' + what + '\')">' + by + '</a>'
+   }
+
+   sort_hide_menu = '<table style="background: #d9fff0; border: #008f57 1px solid;" width="100%"><tr><td>'
+         + '<a name="hide_main_div_'
+         + id
+         + '" href="#" onclick="hide_main_div(\''
+         + id
+         +'\')">Hide</a>'
+         + '</td><td>'
+         +     ' Sort by: '
+         +     sort_comments_by_button(what, id, 'date')
+         +     ', '
+         +     sort_comments_by_button(what, id, 'score')
+         +     ', '
+         +     sort_comments_by_button(what, id, 'thread')
+         +   '.'
+         + '</td></tr></table><br>'
+
+   $('div[class=hide_menu_' + id + ']').replaceWith(sort_hide_menu);
+}
+
+function show_hide_comments(id) {
+   show_menu_hide('comments', id);
+   hide_fixes(id);
+   show_comments(id);
+
+   if(mainDivIsHidden(id)) {
+      show_main_div(id);
+   }
+}
+
+function show_hide_fixes(id) {
+   show_menu_hide('fixes', id);
+   hide_comments(id);
+   show_fixes(id);
+
+   if(mainDivIsHidden(id)) {
+      show_main_div(id);
+   }
+}
+
+function show_hide_submitFixFields(id) {
+   // show or hide more form fields when 'i would like to submit a fix' is true
+   var fixes_area_hidden =  $('div.submitFixFields_'+id).is(':hidden');
+   if(fixes_area_hidden) {
+      show_submitFixFields(id);
+   } else {
+      hide_submitFixFields(id);
+   }
+}
+
+function fill_paragraph_from_repo(node, id) {
+   var p_path = location.protocol + "//" + location.host
+                + "/get_paragraph?node=" + node + "&id=" + id;
+   $.getJSON(p_path, function(data) {
+        $('textarea[name=paragraph_' + id + ']').replaceWith(
+           '<textarea name="paragraph_' + id + '" rows=10 cols=70>' + data + '</textarea>');
+        $('textarea[name=paragraph_orig_' + id + ']').replaceWith(
+           '<textarea name="paragraph_orig_' + id + '" style="display: none;">' + data + '</textarea>');
+
+   });
+   
+}
+
+// *** rating comments ******************************************************
+
+function comments_up_down(id, comment_no, up_down, db) {
+   // request for a 'score' change
+   load_func = get_load_cf(db);
+   var rate_path = location.protocol + "//" + location.host + "/rate_comment";
+   $.ajax({ url: rate_path,
+            type: 'GET',
+            data: "id=" + id + "&comment_no=" + comment_no + "&up_down=" + up_down + "&db=" + db,
+            success: function() { load_func(id)}
+         });
+}
+
+// *** developer actions ****************************************************
+
+function delete_comment(db, id, comment_no) {
+   load_func = get_load_cf(db);
+   var rate_path = location.protocol + "//" + location.host + "/delete_comment";
+   $.ajax({ url: rate_path,
+            type: 'GET',
+            data: "id=" + id + "&cno=" + comment_no + "&db=" + db,
+            success: function() { load_func(id)}
+         });
+}
+
+function commit_fix(node, id, fix_no) {
+   var c_path = location.protocol + "//" + location.host + "/commit_fix";
+   $.ajax({ url: c_path,
+            type: 'GET',
+            data: "node=" + node + "&id=" + id + "&fix_no=" + fix_no,
+            success: function() { load_func(id)}
+         });
+}
+
+// *** sorting comments *****************************************************
+
+function sort_comments(id, by, db) {
+   // request for a sort of comments, display json data structure ('data')
+   var c_path = location.protocol + "//" + location.host
+                + "/sort_comments?id=" + id + "&by=" + by + "&db=" + db;
+   $.getJSON(c_path, function(data) {
+         if(db=='comments') {
+            print_comments(id, data);
+         } else {
+            print_fixes(id, data);
+         }
+   });
+}
+
+// *** general-use functions ***********************************************
+
+function empty_comments(id) {
+   $('div[class=comments_for_' + id + ']').replaceWith('<div class="comments_for_' + id + '" style=\"display: none;\"> </div>');
+}
+
+function empty_fixes(id) {
+   $('div[class=fixes_for_' + id + ']').replaceWith('<div class="fixes_for_' + id + '" style=\"display: none;\"> </div>');
+}
+
+function is_developer() {
+   var isdev_path = location.protocol + "//" + location.host + "/isdeveloper";
+   http = new XMLHttpRequest();
+   http.open('HEAD', isdev_path, false);
+   http.send(null);
+   return http.status!=404;
+}
+
+function get_date(d) {
+   var month=["January", "February", "March", "April",
+              "May", "June", "July", "August",
+              "September", "October", "November", "December"];
+   var t_date = d.getDate();      // Returns the day of the month
+   var t_mon = d.getMonth();      // Returns the month as a digit
+   var t_year = d.getFullYear();  // Returns 4 digit year
+   var t_hour = d.getHours();     // Returns hours
+   var t_min = d.getMinutes();    // Returns minutes
+   var t_sec = d.getSeconds();    // Returns seocnds
+   return t_hour + ':'
+          + (t_min < 10 ? '0' : '') + t_min
+          + ', ' + month[t_mon] + ' ' + t_date + ' ' + t_year
+}
+
+// *** threading **********************************************************
+
+function reply_to(id, comment_no) {
+   $('span[name=replyto_' + id + ']').replaceWith('<span name="replyto_' + id + '">' + comment_no + '</span>');
+   $('textarea[name=replyto_' + id + ']').replaceWith('<textarea name="replyto_' + id + '" style="display: none;">' + comment_no + '</textarea>');
+}
+
+function new_thread(id) {
+   $('span[name=replyto_' + id + ']').replaceWith('<span name="replyto_' + id + '">new thread</span>');
+   $('textarea[name=replyto_' + id + ']').replaceWith('<textarea name="replyto_' + id + '" style="display: none;"></textarea>');
+}
+
+$(document).ready(function() {
+   // load the comments for each paragraph when the DOM is ready
+   $("span[name*=paragraph]").each(function() {
+      var id = $(this).attr('value');
+      load_comments(id);
+      load_fixes(id);
+   });
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/basic.css	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,405 @@
+/**
+ * Sphinx stylesheet -- basic theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+img {
+    border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.refcount {
+    color: #060;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/comments.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,587 @@
+/*
+ * Java Script/JQuery glue for server-side Python code and the comments/fixes
+ * stuff which is being served along with the documentation.
+ *
+ * :copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ * Below is a short description of the main functions used to make the tool
+ * work. Internal functions are not listed here.
+ *
+ **  
+ *** checking/downloading/printing/adding comments and fixes ****************
+ **
+ *
+ * load_comments(id) -> check if database file with comments for paragraph 'id'
+ *                      exists on the server; if yes, invoke comments_found()
+ *                      function; if not, invoke no_comments() function.
+ *
+ * load_fixes(id) -> check if database file with fixes for paragraph 'id'
+ *                   exists on the server; if yes, invoke fixes_found()
+ *                   function; if not, invoke no_fixes() function.
+ *
+ * no_comments(id) -> insert a link ('No comments') to the post form after
+ *                    the paragraph 'id'.
+ *
+ * no_fixes(id) -> insert a link ('No fixes') to the post form after the
+ *                 'No comments' string.
+ *
+ * comments_found(id) -> download the comments database file for paragraph 'id'
+ *                       and print it under the paragraph.
+ *
+ * fixes_found(id) -> download the fixes database file for paragraph 'id'
+ *                    and print it under the paragraph.
+ *
+ * print_comments(id, data) -> print comments collected in an array 'data'
+ *                             under the paragraph 'id'.
+ *                             'data' is an array of objects; every object
+ *                             has properties like 'name', 'score', 'comment'.
+ *                             This function also prints a link at the end
+ *                             of paragraph with a number of comments hidden
+ *                             (i.e. "3 Comments").
+ *
+ * print_fixes(id, data) -> print fixes collected in an array 'data' under
+ *                          the paragraph 'id'.
+ *                          The description for print_comments() applies.
+ *
+ * add_new_comment(id) -> ajaxify a comment post form for paragraph 'id'
+ *                        and reload comments (with load_comments() function).
+ *                        This function also validates the form and resets
+ *                        it on successful submit.
+ *
+ **
+ *** displaying/hiding areas *************************************************
+ **
+ *
+ * show_hide_comments(id) -> hide fixes area, show comments area and make sure
+ *                           that the main comments/fixes area is shown
+ *
+ * show_hide_fixes(id) -> hide comments area, show fixes area and make sure
+ *                        that the main comments/fixes area is shown
+ *
+ * show_hide_submitFixFields(id) -> show/hide additional fields in the post
+ *                                  form for fixes view (when 'I would like
+ *                                  to submit a patch' checkbox is 'true')
+ *                                  and fill them with data if needed
+ *
+ *
+ **
+ *** rating comments/fixes ***************************************************
+ **
+ *
+ * comments_up_down(id, comment_no, up_down, db)
+ *                   -> send a GET request to the server with three parameters:
+ *                       - id: paragraph id,
+ *                       - comment_no: a number of a comment to score,
+ *                       - up_down: two values possible: 'up' or 'down'
+ *                                  depending on what kind of action should
+ *                                  be taken ('up' means score+=1, and down
+ *                                  means score-=1).
+ *
+ **
+ *** sorting comments/fixes ************************************************ 
+ **
+ * 
+ * sort_comments(id, by, db) -> sort comments for paragraph 'id' by 'by' argument
+ *                          (two values for 'by' are possible at the moment:
+ *                          'score' and 'date'). The sorting order changes
+ *                          automatically from increasing to decreasing with
+ *                          every sort.
+ *
+ *
+ **
+ *** threading ************************************************************
+ **
+ *
+ * new_thread(id) -> make a particular comment a new thread before submitting
+ *                   it
+ *
+ * reply_to(id, comment_no) -> make a comment a reply to comment 'comment_no'
+ *
+ **
+ *** developer's actions ***************************************************
+ **
+ *
+ * delete_comment(db, id, comment_no) -> delete entry from database 'db'
+ *                                       located in 'id' file under
+ *                                       'comment_no' index
+ *
+ * commit_fix(node, id, fix_no) -> commit a fix located in 'id' file under
+ *                                 'fix_no' index to the repository
+ *
+ **
+ *** general-use functions ************************************************
+ **
+ *
+ * empty_comments(id) -> empty the comments area
+ *
+ * empty_fixes(id) -> empty the fixes area
+ *
+ * is_developer() -> returns true when developer rights should be granted
+ *                   and false when the rights should not be granted.
+ *                   At jQuery level it's only about displaying some
+ *                   additional/developer-only-options. Real authorization
+ *                   is going on on webapp (appserver.py) level.
+ */
+
+comments_path = "/comments/";
+fixes_path = "/fixes/";
+_db = undefined;
+
+// *** checking/downloading/printing/adding comments ************************
+
+function load_generic(what, id, error_func, success_func) {
+   // if the div was filled with the comments before, empty it before appending
+   if(_db == 'comments') {
+      empty_comments(id);
+   } else {
+      empty_fixes(id);
+   }
+
+   // 'what' -> 'comments_path' or 'fixes_path' variables;
+   var c_path = location.protocol + "//" + location.host + what + id;
+   $.ajax({ url: c_path,
+            type: 'HEAD',
+            error: function() { error_func(id) },
+            success: function() { success_func(id)}
+         });
+}
+
+function load_comments(id) {
+   return load_generic(comments_path, id, no_comments, comments_found)
+}
+
+function load_fixes(id) {
+   return load_generic(fixes_path, id, no_fixes, fixes_found)
+}
+
+function get_load_cf(db) {
+   if(db == 'comments' || db == comments_path) {
+      return load_comments;
+   }
+   return load_fixes;
+}
+
+//////////////////////
+
+function not_found_generic(what, id) {
+   // 'what' -> 'comment' or 'fix' strings
+   plural = what=='comment'?'comments':'fixes';
+   $("a[name*=" + what + "_" + id + "]").replaceWith(
+         '<a name="' + what + '_' + id + '" href="#' + id + '" '
+          + 'onclick="show_hide_' + plural + '(\'' + id + '\')" '
+          + 'id="' + id + '">No ' + plural + '</a>'
+          + '<a name="' + id + '"></a>');
+}
+
+function no_comments(id) {
+   not_found_generic('comment', id);
+}
+
+function no_fixes(id) {
+   not_found_generic('fix', id);
+}
+
+//////////////////////////////
+
+function found_generic(what, id, print_func) {
+   var c_path = location.protocol + "//" + location.host + what + id + "?id=" + id;
+   $.getJSON(c_path, function(data) {
+      print_func(id, data);
+   });
+}
+
+function comments_found(id) {
+   found_generic(comments_path, id, print_comments);
+}
+
+function fixes_found(id) {
+   found_generic(fixes_path, id, print_fixes);
+}
+
+///////////////////////////////
+
+function print_generic(what, id, data) {
+   var c_flag = (what == 'comments') ? true : false;
+   var singular = (what == 'comments') ? 'comment' : 'fix';
+   var isdev = is_developer();
+   var node = $('div[class=submitFixFields_' + id + ']').attr('value');
+   
+   if(what == 'comments') {
+      empty_comments(id);
+   } else {
+      empty_fixes(id);
+   }
+
+   // A 'factory' function which generates '+' and '-' buttons for every comment.
+   //       'what'  is a kind of database (db for comments or for fixes)
+   //         'id'  is a paragraph id.
+   // 'comment_no'  is a place of a comment in the list of comments for given
+   //               paragraph.
+   //    'up_down'  is passed to POST method. It should be 'up' or 'down'.
+   //       'sign'  is what's displayed on the button, by default it's '+' or '-'.
+   function rate_comment_up_down_button(what, id, comment_no, up_down, sign) {
+      return ' <a href="#' + id + '" onclick="comments_up_down(\'' + id + '\', \'' + comment_no + '\', \'' + up_down + '\', \'' + what + '\')"><b>' + sign + '</b></a> '
+   }
+
+   // in fixes view - show proposed diff
+   function proposed_fix(c_flag, paragraph) {
+      if(!c_flag) {
+         return   '<tr>'
+                +   '<td>'
+                +     'Fix: ' + paragraph
+                +   '</td>'
+                + '</tr>'
+                +  "<tr><td>&nbsp;</td></tr>"
+      }
+      return '';
+   }
+
+   // for every comment/fix generate a 'Reply' button
+   function link_reply_to(id, comment_no) {
+      return 'Comment no.: ' + data[i].comment_no
+             + ' (<a href="#" onclick="reply_to(\'' + id + '\', \'' + comment_no + '\')">reply</a>).'
+   }
+
+   /* <developer's actions> */
+   function delete_comment_button(db, id, comment_no) {
+      return '<a href="#" onclick="delete_comment(\'' + db + '\', \'' + id +  '\', \'' + comment_no + '\')">delete</a>' 
+   } 
+
+   function commit_button(node, id, fix_no) {
+      return '<a href="#" onclick="commit_fix(\'' + node + '\', \'' +  id + '\', \''
+                  + fix_no + '\')">commit</a>'
+   }
+
+   function developers_actions(what, id, data, i) {
+       return  '<tr>'
+             +  '<td>'
+             +    'Admin actions: '
+             +    delete_comment_button(what, id, data[i].comment_no)
+             +    ', '
+             +    commit_button(node, id, data[i].comment_no)
+             +    '.'
+             +  '</td>'
+             + '</tr>' 
+   }
+   /* </developer's actions> */
+
+   // add the comments for paragraph
+   for(i=0; i<data.length; i++) {
+      // 'data[i]['date'] * 1000' to convert from milliseconds to seconds
+      var commentDate = new Date(data[i]['date']*1000);
+
+      $('div[class*=' + what + '_for_' + id + ']').append(
+           "<table name='" + id + "' width='" + data[i].width + "%' align=center "
+         +  "style='background-color: #f1ffc5; border: solid 1px lightblue;'>"
+         +  "<tr>"
+         +    "<td>"
+         +     "Name: <a href='" + data[i].url + "'>" + data[i].name + "</a>. "
+         +     "(" + get_date(commentDate) + ")"
+         +    '</td>'
+         +  '</tr>'
+         +  '<tr>'
+         +    '<td>'
+         +     ' Score: <span class="score"><b>' + data[i].score + '</b></span>'
+         +     rate_comment_up_down_button(what, id, data[i].comment_no, 'up', '+') 
+         +     rate_comment_up_down_button(what, id, data[i].comment_no, 'down', '-')
+         +     '. '
+         +     link_reply_to(id, data[i].comment_no)
+         +    '</td>'
+         +  '</tr>'
+         +  (isdev ? developers_actions(what, id, data, i) : '')
+         +  '<tr><td>&nbsp;</td></tr>'
+         +  proposed_fix(c_flag, data[i].paragraph_diff)
+         +  "<tr>"
+         +    "<td>"
+         +      'Comment: ' + data[i].comment
+         +    "</td>"
+         +  "</tr>"
+         + "</table><br>");
+   }
+
+   // add a button for showing/hiding the comments and post form
+   $("a[name*=" + singular + "_" + id + "]").replaceWith(
+                                   '<a name="' + singular + '_' + id
+                                    + '" href="#' + id + '"' +
+                                    'onclick="show_hide_' + what + '(\'' +
+                                    id + '\')" '
+                                    + 'id="' + id + '">'
+                                    + data.length + ' ' + what + '</a>'
+                                    + '<a name="' + id + '"></a>');
+
+   if(what == 'comments') {
+      hide_fixes(id);
+      show_comments(id);
+   } else {
+      hide_comments(id);
+      show_fixes(id);
+   }
+}
+
+
+function print_comments(id, data) {
+   print_generic('comments', id, data);
+}
+
+function print_fixes(id, data) {
+   print_generic('fixes', id, data);
+}
+
+/////////////////////////////
+
+function add_new_comment(id) {
+   function validate(formData, jqForm, options) {
+      var form = jqForm[0];
+      if(!form.name.value) {
+         alert("Please provide your name");
+         return false;
+      } else if(!form.comment.value) {
+         alert("Please provide your comment");
+         return false;
+      } else if(form.submitFix.checked && !form.licence.checked) {
+         alert("You have to agree to publish your fix on our licence!");
+         return false;
+      }
+
+      if(form.submitFix.checked) {
+         _db = 'fixes';
+      } else {
+         _db = 'comments';
+      }
+   }
+
+   function form_reset() {
+      $('#commentForm_' + id).resetForm()
+      new_thread(id);
+      if(_db == 'comments') {
+         load_comments(id);
+      } else {
+         load_fixes(id);
+      }
+   }
+
+   // bind 'commentForm' and provide a simple callback function 
+   $('#commentForm_' + id).ajaxForm({
+                                       beforeSubmit: validate,
+                                       success: form_reset
+                                    }); 
+}
+
+//////////////////////////////
+
+function hide_main_div(id) {
+   $('div.x' + id).css('display', 'none');  
+}
+
+function show_main_div(id) {
+   $('div.x' + id).css('display', 'block');  
+}
+
+function hide_submitFixFields(id) {
+   $('div.submitFixFields_' + id).css('display', 'none');
+}
+
+function show_submitFixFields(id) {
+   node = $('div[class=submitFixFields_' + id + ']').attr('value');
+   fill_paragraph_from_repo(node, id);
+   $('input[name=submitFix]').attr('checked', true);
+   $('div.submitFixFields_' + id).css('display', 'block'); 
+   _db = 'fixes';
+
+}
+
+function hide_comments(id) {
+   $('input[name=submitFix]').attr('checked', false);
+   $('div.comments_for_' + id).css('display', 'none');
+}
+
+function hide_fixes(id) {
+   $('div.fixes_for_' + id).css('display', 'none');
+   hide_submitFixFields(id);
+}
+
+function show_comments(id) {
+   $('input[name=submitFix]').attr('checked', false);
+   $('div.comments_for_' + id).css('display', 'block');
+   _db = 'comments';
+}
+
+function show_fixes(id) {
+   $('div.fixes_for_' + id).css('display', 'block');
+   show_submitFixFields(id);
+}
+
+function mainDivIsHidden(id) {
+   return $('div.x' + id).is(':hidden');
+}
+
+function show_menu_hide(what, id) {
+   function sort_comments_by_button(what, id, by) {
+      return '<a href="#" onclick="sort_comments(\'' + id + '\', \'' + by + '\', \'' + what + '\')">' + by + '</a>'
+   }
+
+   sort_hide_menu = '<table style="background: #d9fff0; border: #008f57 1px solid;" width="100%"><tr><td>'
+         + '<a name="hide_main_div_'
+         + id
+         + '" href="#" onclick="hide_main_div(\''
+         + id
+         +'\')">Hide</a>'
+         + '</td><td>'
+         +     ' Sort by: '
+         +     sort_comments_by_button(what, id, 'date')
+         +     ', '
+         +     sort_comments_by_button(what, id, 'score')
+         +     ', '
+         +     sort_comments_by_button(what, id, 'thread')
+         +   '.'
+         + '</td></tr></table><br>'
+
+   $('div[class=hide_menu_' + id + ']').replaceWith(sort_hide_menu);
+}
+
+function show_hide_comments(id) {
+   show_menu_hide('comments', id);
+   hide_fixes(id);
+   show_comments(id);
+
+   if(mainDivIsHidden(id)) {
+      show_main_div(id);
+   }
+}
+
+function show_hide_fixes(id) {
+   show_menu_hide('fixes', id);
+   hide_comments(id);
+   show_fixes(id);
+
+   if(mainDivIsHidden(id)) {
+      show_main_div(id);
+   }
+}
+
+function show_hide_submitFixFields(id) {
+   // show or hide more form fields when 'i would like to submit a fix' is true
+   var fixes_area_hidden =  $('div.submitFixFields_'+id).is(':hidden');
+   if(fixes_area_hidden) {
+      show_submitFixFields(id);
+   } else {
+      hide_submitFixFields(id);
+   }
+}
+
+function fill_paragraph_from_repo(node, id) {
+   var p_path = location.protocol + "//" + location.host
+                + "/get_paragraph?node=" + node + "&id=" + id;
+   $.getJSON(p_path, function(data) {
+        $('textarea[name=paragraph_' + id + ']').replaceWith(
+           '<textarea name="paragraph_' + id + '" rows=10 cols=70>' + data + '</textarea>');
+        $('textarea[name=paragraph_orig_' + id + ']').replaceWith(
+           '<textarea name="paragraph_orig_' + id + '" style="display: none;">' + data + '</textarea>');
+
+   });
+   
+}
+
+// *** rating comments ******************************************************
+
+function comments_up_down(id, comment_no, up_down, db) {
+   // request for a 'score' change
+   load_func = get_load_cf(db);
+   var rate_path = location.protocol + "//" + location.host + "/rate_comment";
+   $.ajax({ url: rate_path,
+            type: 'GET',
+            data: "id=" + id + "&comment_no=" + comment_no + "&up_down=" + up_down + "&db=" + db,
+            success: function() { load_func(id)}
+         });
+}
+
+// *** developer actions ****************************************************
+
+function delete_comment(db, id, comment_no) {
+   load_func = get_load_cf(db);
+   var rate_path = location.protocol + "//" + location.host + "/delete_comment";
+   $.ajax({ url: rate_path,
+            type: 'GET',
+            data: "id=" + id + "&cno=" + comment_no + "&db=" + db,
+            success: function() { load_func(id)}
+         });
+}
+
+function commit_fix(node, id, fix_no) {
+   var c_path = location.protocol + "//" + location.host + "/commit_fix";
+   $.ajax({ url: c_path,
+            type: 'GET',
+            data: "node=" + node + "&id=" + id + "&fix_no=" + fix_no,
+            success: function() { load_func(id)}
+         });
+}
+
+// *** sorting comments *****************************************************
+
+function sort_comments(id, by, db) {
+   // request for a sort of comments, display json data structure ('data')
+   var c_path = location.protocol + "//" + location.host
+                + "/sort_comments?id=" + id + "&by=" + by + "&db=" + db;
+   $.getJSON(c_path, function(data) {
+         if(db=='comments') {
+            print_comments(id, data);
+         } else {
+            print_fixes(id, data);
+         }
+   });
+}
+
+// *** general-use functions ***********************************************
+
+function empty_comments(id) {
+   $('div[class=comments_for_' + id + ']').replaceWith('<div class="comments_for_' + id + '" style=\"display: none;\"> </div>');
+}
+
+function empty_fixes(id) {
+   $('div[class=fixes_for_' + id + ']').replaceWith('<div class="fixes_for_' + id + '" style=\"display: none;\"> </div>');
+}
+
+function is_developer() {
+   var isdev_path = location.protocol + "//" + location.host + "/isdeveloper";
+   http = new XMLHttpRequest();
+   http.open('HEAD', isdev_path, false);
+   http.send(null);
+   return http.status!=404;
+}
+
+function get_date(d) {
+   var month=["January", "February", "March", "April",
+              "May", "June", "July", "August",
+              "September", "October", "November", "December"];
+   var t_date = d.getDate();      // Returns the day of the month
+   var t_mon = d.getMonth();      // Returns the month as a digit
+   var t_year = d.getFullYear();  // Returns 4 digit year
+   var t_hour = d.getHours();     // Returns hours
+   var t_min = d.getMinutes();    // Returns minutes
+   var t_sec = d.getSeconds();    // Returns seocnds
+   return t_hour + ':'
+          + (t_min < 10 ? '0' : '') + t_min
+          + ', ' + month[t_mon] + ' ' + t_date + ' ' + t_year
+}
+
+// *** threading **********************************************************
+
+function reply_to(id, comment_no) {
+   $('span[name=replyto_' + id + ']').replaceWith('<span name="replyto_' + id + '">' + comment_no + '</span>');
+   $('textarea[name=replyto_' + id + ']').replaceWith('<textarea name="replyto_' + id + '" style="display: none;">' + comment_no + '</textarea>');
+}
+
+function new_thread(id) {
+   $('span[name=replyto_' + id + ']').replaceWith('<span name="replyto_' + id + '">new thread</span>');
+   $('textarea[name=replyto_' + id + ']').replaceWith('<textarea name="replyto_' + id + '" style="display: none;"></textarea>');
+}
+
+$(document).ready(function() {
+   // load the comments for each paragraph when the DOM is ready
+   $("span[name*=paragraph]").each(function() {
+      var id = $(this).attr('value');
+      load_comments(id);
+      load_fixes(id);
+   });
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/default.css	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,219 @@
+/**
+ * Sphinx stylesheet -- default theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:visited {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+th {
+    background-color: #ede;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/doctools.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
Binary file sphinx_django/static/file.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/jquery.form.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,643 @@
+/*
+ * jQuery Form Plugin
+ * version: 2.28 (10-MAY-2009)
+ * @requires jQuery v1.2.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+;(function($) {
+
+/*
+    Usage Note:
+    -----------
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These
+    functions are intended to be exclusive.  Use ajaxSubmit if you want
+    to bind your own submit handler to the form.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').bind('submit', function() {
+            $(this).ajaxSubmit({
+                target: '#output'
+            });
+            return false; // <-- important!
+        });
+    });
+
+    Use ajaxForm when you want the plugin to manage all the event binding
+    for you.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').ajaxForm({
+            target: '#output'
+        });
+    });
+
+    When using ajaxForm, the ajaxSubmit function will be invoked for you
+    at the appropriate time.
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+    if (!this.length) {
+        log('ajaxSubmit: skipping submit process - no element selected');
+        return this;
+    }
+
+    if (typeof options == 'function')
+        options = { success: options };
+
+    var url = $.trim(this.attr('action'));
+    if (url) {
+	    // clean url (don't include hash vaue)
+	    url = (url.match(/^([^#]+)/)||[])[1];
+   	}
+   	url = url || window.location.href || ''
+
+    options = $.extend({
+        url:  url,
+        type: this.attr('method') || 'GET'
+    }, options || {});
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    this.trigger('form-pre-serialize', [this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+        return this;
+    }
+
+    // provide opportunity to alter form data before it is serialized
+    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSerialize callback');
+        return this;
+    }
+
+    var a = this.formToArray(options.semantic);
+    if (options.data) {
+        options.extraData = options.data;
+        for (var n in options.data) {
+          if(options.data[n] instanceof Array) {
+            for (var k in options.data[n])
+              a.push( { name: n, value: options.data[n][k] } );
+          }
+          else
+             a.push( { name: n, value: options.data[n] } );
+        }
+    }
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');
+        return this;
+    }
+
+    // fire vetoable 'validate' event
+    this.trigger('form-submit-validate', [a, this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+        return this;
+    }
+
+    var q = $.param(a);
+
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else
+        options.data = q; // data is the query string for 'post'
+
+    var $form = this, callbacks = [];
+    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
+    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            $(options.target).html(data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success)
+        callbacks.push(options.success);
+
+    options.success = function(data, status) {
+        for (var i=0, max=callbacks.length; i < max; i++)
+            callbacks[i].apply(options, [data, status, $form]);
+    };
+
+    // are there files to upload?
+    var files = $('input:file', this).fieldValue();
+    var found = false;
+    for (var j=0; j < files.length; j++)
+        if (files[j])
+            found = true;
+
+	var multipart = false;
+//	var mp = 'multipart/form-data';
+//	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+    // options.iframe allows user to force iframe mode
+   if (options.iframe || found || multipart) {
+       // hack to fix Safari hang (thanks to Tim Molendijk for this)
+       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+       if (options.closeKeepAlive)
+           $.get(options.closeKeepAlive, fileUpload);
+       else
+           fileUpload();
+       }
+   else
+       $.ajax(options);
+
+    // fire 'notify' event
+    this.trigger('form-submit-notify', [this, options]);
+    return this;
+
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUpload() {
+        var form = $form[0];
+
+        if ($(':input[name=submit]', form).length) {
+            alert('Error: Form elements must not be named "submit".');
+            return;
+        }
+
+        var opts = $.extend({}, $.ajaxSettings, options);
+		var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
+
+        var id = 'jqFormIO' + (new Date().getTime());
+        var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
+        var io = $io[0];
+
+        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+        var xhr = { // mock object
+            aborted: 0,
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {},
+            abort: function() {
+                this.aborted = 1;
+                $io.attr('src','about:blank'); // abort op in progress
+            }
+        };
+
+        var g = opts.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && ! $.active++) $.event.trigger("ajaxStart");
+        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
+
+		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
+			s.global && $.active--;
+			return;
+        }
+        if (xhr.aborted)
+            return;
+
+        var cbInvoked = 0;
+        var timedOut = 0;
+
+        // add submitting element to data if we know it
+        var sub = form.clk;
+        if (sub) {
+            var n = sub.name;
+            if (n && !sub.disabled) {
+                options.extraData = options.extraData || {};
+                options.extraData[n] = sub.value;
+                if (sub.type == "image") {
+                    options.extraData[name+'.x'] = form.clk_x;
+                    options.extraData[name+'.y'] = form.clk_y;
+                }
+            }
+        }
+
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        setTimeout(function() {
+            // make sure form attrs are set
+            var t = $form.attr('target'), a = $form.attr('action');
+
+			// update form attrs in IE friendly way
+			form.setAttribute('target',id);
+			if (form.getAttribute('method') != 'POST')
+				form.setAttribute('method', 'POST');
+			if (form.getAttribute('action') != opts.url)
+				form.setAttribute('action', opts.url);
+
+            // ie borks in some cases when setting encoding
+            if (! options.skipEncodingOverride) {
+                $form.attr({
+                    encoding: 'multipart/form-data',
+                    enctype:  'multipart/form-data'
+                });
+            }
+
+            // support timout
+            if (opts.timeout)
+                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
+
+            // add "extra" data to form if provided in options
+            var extraInputs = [];
+            try {
+                if (options.extraData)
+                    for (var n in options.extraData)
+                        extraInputs.push(
+                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
+                                .appendTo(form)[0]);
+
+                // add iframe to doc and submit the form
+                $io.appendTo('body');
+                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+                form.submit();
+            }
+            finally {
+                // reset attrs and remove "extra" input elements
+				form.setAttribute('action',a);
+                t ? form.setAttribute('target', t) : $form.removeAttr('target');
+                $(extraInputs).remove();
+            }
+        }, 10);
+
+        var nullCheckFlag = 0;
+
+        function cb() {
+            if (cbInvoked++) return;
+
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+            var ok = true;
+            try {
+                if (timedOut) throw 'timeout';
+                // extract the server response from the iframe
+                var data, doc;
+
+                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+
+                if ((doc.body == null || doc.body.innerHTML == '') && !nullCheckFlag) {
+                    // in some browsers (cough, Opera 9.2.x) the iframe DOM is not always traversable when
+                    // the onload callback fires, so we give them a 2nd chance
+                    nullCheckFlag = 1;
+                    cbInvoked--;
+                    setTimeout(cb, 100);
+                    return;
+                }
+
+                xhr.responseText = doc.body ? doc.body.innerHTML : null;
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                xhr.getResponseHeader = function(header){
+                    var headers = {'content-type': opts.dataType};
+                    return headers[header];
+                };
+
+                if (opts.dataType == 'json' || opts.dataType == 'script') {
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    xhr.responseText = ta ? ta.value : xhr.responseText;
+                }
+                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+                    xhr.responseXML = toXml(xhr.responseText);
+                }
+                data = $.httpData(xhr, opts.dataType);
+            }
+            catch(e){
+                ok = false;
+                $.handleError(opts, xhr, 'error', e);
+            }
+
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (ok) {
+                opts.success(data, 'success');
+                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
+            }
+            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
+            if (g && ! --$.active) $.event.trigger("ajaxStop");
+            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
+
+            // clean up
+            setTimeout(function() {
+                $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        };
+
+        function toXml(s, doc) {
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+        };
+    };
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *    is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *    used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
+        $(this).ajaxSubmit(options);
+        return false;
+    }).each(function() {
+        // store options in hash
+        $(":submit,input:image", this).bind('click.form-plugin',function(e) {
+            var form = this.form;
+            form.clk = this;
+            if (this.type == 'image') {
+                if (e.offsetX != undefined) {
+                    form.clk_x = e.offsetX;
+                    form.clk_y = e.offsetY;
+                } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+                    var offset = $(this).offset();
+                    form.clk_x = e.pageX - offset.left;
+                    form.clk_y = e.pageY - offset.top;
+                } else {
+                    form.clk_x = e.pageX - this.offsetLeft;
+                    form.clk_y = e.pageY - this.offsetTop;
+                }
+            }
+            // clear form vars
+            setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
+        });
+    });
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+    this.unbind('submit.form-plugin');
+    return this.each(function() {
+        $(":submit,input:image", this).unbind('click.form-plugin');
+    });
+
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+    var a = [];
+    if (this.length == 0) return a;
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) return a;
+    for(var i=0, max=els.length; i < max; i++) {
+        var el = els[i];
+        var n = el.name;
+        if (!n) continue;
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el) {
+            	a.push({name: n, value: $(el).val()});
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            }
+            continue;
+        }
+
+        var v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            for(var j=0, jmax=v.length; j < jmax; j++)
+                a.push({name: n, value: v[j]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: n, value: v});
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle it here
+        var $input = $(form.clk), input = $input[0], n = input.name;
+        if (n && !input.disabled && input.type == 'image') {
+        	a.push({name: n, value: $input.val()});
+            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) return;
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++)
+                a.push({name: n, value: v[i]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: this.name, value: v});
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *       array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
+            continue;
+        v.constructor == Array ? $.merge(val, v) : val.push(v);
+    }
+    return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (typeof successful == 'undefined') successful = true;
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1))
+            return null;
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) return null;
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+				var v = op.value;
+				if (!v) // extra pain for IE...
+                	v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+                if (one) return v;
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return el.value;
+};
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields();
+    });
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (t == 'text' || t == 'password' || tag == 'textarea')
+            this.value = '';
+        else if (t == 'checkbox' || t == 'radio')
+            this.checked = false;
+        else if (tag == 'select')
+            this.selectedIndex = -1;
+    });
+};
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
+            this.reset();
+    });
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+    if (b == undefined) b = true;
+    return this.each(function() {
+        this.disabled = !b;
+    });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+    if (select == undefined) select = true;
+    return this.each(function() {
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio')
+            this.checked = select;
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').selected(false);
+            }
+            this.selected = select;
+        }
+    });
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
+        window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
+};
+
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/jquery.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
Binary file sphinx_django/static/minus.png has changed
Binary file sphinx_django/static/plus.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/pygments.css	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,61 @@
+.hll { background-color: #ffffcc }
+.c { color: #408090; font-style: italic } /* Comment */
+.err { border: 1px solid #FF0000 } /* Error */
+.k { color: #007020; font-weight: bold } /* Keyword */
+.o { color: #666666 } /* Operator */
+.cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.cp { color: #007020 } /* Comment.Preproc */
+.c1 { color: #408090; font-style: italic } /* Comment.Single */
+.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.gd { color: #A00000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.gi { color: #00A000 } /* Generic.Inserted */
+.go { color: #303030 } /* Generic.Output */
+.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.gs { font-weight: bold } /* Generic.Strong */
+.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.gt { color: #0040D0 } /* Generic.Traceback */
+.kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #007020 } /* Keyword.Pseudo */
+.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #902000 } /* Keyword.Type */
+.m { color: #208050 } /* Literal.Number */
+.s { color: #4070a0 } /* Literal.String */
+.na { color: #4070a0 } /* Name.Attribute */
+.nb { color: #007020 } /* Name.Builtin */
+.nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.no { color: #60add5 } /* Name.Constant */
+.nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.ne { color: #007020 } /* Name.Exception */
+.nf { color: #06287e } /* Name.Function */
+.nl { color: #002070; font-weight: bold } /* Name.Label */
+.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.nt { color: #062873; font-weight: bold } /* Name.Tag */
+.nv { color: #bb60d5 } /* Name.Variable */
+.ow { color: #007020; font-weight: bold } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #208050 } /* Literal.Number.Float */
+.mh { color: #208050 } /* Literal.Number.Hex */
+.mi { color: #208050 } /* Literal.Number.Integer */
+.mo { color: #208050 } /* Literal.Number.Oct */
+.sb { color: #4070a0 } /* Literal.String.Backtick */
+.sc { color: #4070a0 } /* Literal.String.Char */
+.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #4070a0 } /* Literal.String.Double */
+.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.sh { color: #4070a0 } /* Literal.String.Heredoc */
+.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.sx { color: #c65d09 } /* Literal.String.Other */
+.sr { color: #235388 } /* Literal.String.Regex */
+.s1 { color: #4070a0 } /* Literal.String.Single */
+.ss { color: #517918 } /* Literal.String.Symbol */
+.bp { color: #007020 } /* Name.Builtin.Pseudo */
+.vc { color: #bb60d5 } /* Name.Variable.Class */
+.vg { color: #bb60d5 } /* Name.Variable.Global */
+.vi { color: #bb60d5 } /* Name.Variable.Instance */
+.il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/searchtools.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,476 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.deferQuery(query);
+  },
+
+  query : function(query) {
+    var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in',
+                     'if', 'for', 'no', 'there', 'their', 'was', 'is',
+                     'be', 'to', 'that', 'but', 'they', 'not', 'such',
+                     'with', 'by', 'a', 'on', 'these', 'of', 'will',
+                     'this', 'near', 'the', 'or', 'at'];
+
+    // stem the searchterms and add them to the correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      if (stopwords.indexOf(tmp[i]) != -1 || tmp[i].match(/^\d+$/)) {
+        // skip this word
+        continue;
+      }
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          var fullname = (prefix ? prefix + '.' : '') + name;
+          if (fullname.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/simplecomment.js	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,117 @@
+function qid(id) {
+  return id.replace(/([.:])/g, "\\$1");
+}
+
+function beforeComment(formData, jqForm, options) {
+  var form=jqForm[0];
+
+  if (form.comment.textLength.toString()=='0') {
+    $("span.comment_error").empty().append(
+      "<span class=\"comment_error\">  Your comment is empty</span>");
+    return false;
+  }
+  if (form.name.textLength.toString()=='0') {
+    $("span.comment_error").empty().append(
+      "<span class=\"comment_error\">   Please provide a name</span>");
+    return false;
+  }
+  $(options.target + " span.comment_error").empty().after(
+    "<img src=\"/support/icons/throbber.gif\" style=\"vertical-align: middle\"/>");
+  $("input[@name=submit]").attr("disabled", true);
+}
+
+function ajaxifyForm(id) {
+
+// $(' #form_basic_python_func_2').replaceWith('something');
+ 
+   var substring=id.substr(9);
+
+   $('#form_'+substring).ajaxForm({beforeSubmit: beforeComment,
+  			      success: function(){ loadComments(id);}
+
+  			     });}
+
+
+function toggleComment(id) {
+  $("#toggle_" + qid(id)).nextAll().toggle();
+  return false;
+}
+
+
+function loadComments(id)
+{
+
+  var substring=id.substr(9);
+
+  $('#comments_'+substring).load(location.protocol+"//" + location.host+":8000/single/"+ substring +'/',function() { ajaxifyForm(id);}
+				);
+
+}
+
+
+
+
+function loadAllComments() {
+  $("a.commenttoggle").each(function() {
+    var id = $(this).attr("pid");
+    if (id) {
+      loadComments(id);
+    }
+  });
+}
+
+
+
+$(document).ready(function() {
+  function loading(id) {
+    return " <span id=\"comments_" + id + "\" class=\"comment\">" +
+    "<span pid=\"" + id + "\" class=\"commenttoggle\"><p>Loading...." +
+      "</span>";
+  }
+
+$("p[@id]").each(function() {
+    $(this).append(loading($(this).attr("id")));
+
+	});
+
+
+ var url_string=window.location.pathname;
+ var temp = new Array();
+ temp = url_string.split('/pages/');
+ var chap_name=temp[1].split('.')[0];
+
+ jQuery.getJSON(location.protocol+"//" + location.host+":8000/count/"+chap_name, function(data) {
+
+ 		 $("span.comment").each(function(data_val) {
+ 		 var id = $(this).attr("id");
+ 		var substring=id.substr(9);
+
+ 					  if (data.count[substring]){
+
+
+		$(this).replaceWith("<span class='comment'" +  ' id='+ id+ " <a   +  href=javascript:loadComments('"+id+"');>" + data.count[substring] +' comments'+ "</a>");
+					    }
+
+					else {$(this).replaceWith("<span class='comment'" +  ' id='+ id+ " <a   +  href=javascript:loadComments('"+id+"');>" + 'No comments'+ "</a>");
+}
+
+
+					});
+
+
+ 	       });
+
+ 		  });
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/static/simplecomment.js~	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,117 @@
+function qid(id) {
+  return id.replace(/([.:])/g, "\\$1");
+}
+
+function beforeComment(formData, jqForm, options) {
+  var form=jqForm[0];
+
+  if (form.comment.textLength.toString()=='0') {
+    $("span.comment_error").empty().append(
+      "<span class=\"comment_error\">  Your comment is empty</span>");
+    return false;
+  }
+  if (form.name.textLength.toString()=='0') {
+    $("span.comment_error").empty().append(
+      "<span class=\"comment_error\">   Please provide a name</span>");
+    return false;
+  }
+  $(options.target + " span.comment_error").empty().after(
+    "<img src=\"/support/icons/throbber.gif\" style=\"vertical-align: middle\"/>");
+  $("input[@name=submit]").attr("disabled", true);
+}
+
+function ajaxifyForm(id) {
+
+// $(' #form_basic_python_func_2').replaceWith('something');
+  alert("ajaxified");
+   var substring=id.substr(9);
+
+   $('#form_'+substring).ajaxForm({beforeSubmit: beforeComment,
+  			      success: function(){ loadComments(id);}
+
+  			     });}
+
+
+function toggleComment(id) {
+  $("#toggle_" + qid(id)).nextAll().toggle();
+  return false;
+}
+
+
+function loadComments(id)
+{
+
+  var substring=id.substr(9);
+
+  $('#comments_'+substring).load(location.protocol+"//" + location.host+":8000/single/"+ substring +'/',function() { ajaxifyForm(id);}
+				);
+
+}
+
+
+
+
+function loadAllComments() {
+  $("a.commenttoggle").each(function() {
+    var id = $(this).attr("pid");
+    if (id) {
+      loadComments(id);
+    }
+  });
+}
+
+
+
+$(document).ready(function() {
+  function loading(id) {
+    return " <span id=\"comments_" + id + "\" class=\"comment\">" +
+    "<span pid=\"" + id + "\" class=\"commenttoggle\"><p>Loading...." +
+      "</span>";
+  }
+
+$("p[@id]").each(function() {
+    $(this).append(loading($(this).attr("id")));
+
+	});
+
+
+ var url_string=window.location.pathname;
+ var temp = new Array();
+ temp = url_string.split('/pages/');
+ var chap_name=temp[1].split('.')[0];
+
+ jQuery.getJSON(location.protocol+"//" + location.host+":8000/count/"+chap_name, function(data) {
+
+ 		 $("span.comment").each(function(data_val) {
+ 		 var id = $(this).attr("id");
+ 		var substring=id.substr(9);
+
+ 					  if (data.count[substring]){
+
+
+		$(this).replaceWith("<span class='comment'" +  ' id='+ id+ " <a   +  href=javascript:loadComments('"+id+"');>" + data.count[substring] +' comments'+ "</a>");
+					    }
+
+					else {$(this).replaceWith("<span class='comment'" +  ' id='+ id+ " <a   +  href=javascript:loadComments('"+id+"');>" + 'No comments'+ "</a>");
+}
+
+
+					});
+
+
+ 	       });
+
+ 		  });
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/templates/comment.html~	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,48 @@
+{% ifequal length 1 %}
+  <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">One comment</a>
+{% else %}
+  {% if length %}
+    <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">{{ length }} comments</a>
+  {% else %}
+    <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">No comments</a>
+    <div class="comment" {% if not newid %} style="display: none;" {% endif %}>
+      <div class="comment_body">Be the first to comment on this paragraph!</div>
+    </div>
+  {% endif %}
+{% endifequal %}
+{% for c in query %}
+  <div class="{% ifequal c.id newid %}new_{% endifequal %}comment"
+      {% if not newid %} style="display: none;" {% endif %}
+    id="comment{{ c.id }}">
+    <a name="comment{{ c.id }}"/>
+    <div class="comment_header">
+	<span class="comment_id"><a href="/admin/comments/comment/{{ c.id }}/">{{ c.id }}</a></span>
+      
+    </div>
+    <div class="comment_body">{{ c.comment|escape|linebreaks }}</div>
+  </div>
+{% endfor %}
+<form class="comment" id="form_{{ id }}" action="/comments/submit/{{ id }}/"
+    method="post" >
+  {{ form.id }}
+  <table>
+    <tbody>
+      <tr><td align="right" valign="top">Comment<br></td>
+	  <td>{{ form.comment }}</td></tr>
+      <tr><td align="right">Your name</td><td>{{ form.name }}
+	    <span class="comment_help"><b>Required</b> so we can give you credit</a></span></td></tr>
+      <tr><td align="right">Your URL</td><td>{{ form.url }}
+	    <span class="comment_help"><b>Optional</b> link to blog, home page,
+	      <i>etc</i>.</span></td></tr>
+      <tr><td align="right">Remember you?</td><td>{{ form.remember }}</td></tr>
+      <tr><td/><td><input name="submit" type="submit"
+	      value="Submit Comment"/><span class="comment_error">{{ error }}</span></td></tr>
+    </tbody>
+  </table>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sphinx_django/templates/comment2.html	Wed Oct 27 13:59:11 2010 +0530
@@ -0,0 +1,48 @@
+{% ifequal length 1 %}
+  <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">One comment</a>
+{% else %}
+  {% if length %}
+    <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">{{ length }} comments</a>
+  {% else %}
+    <a class="commenttoggle" id="toggle_{{ id }}"
+      onclick="return toggleComment('{{ id }}')"
+      href="comments: show / hide">No comments</a>
+    <span class="comment" {% if not newid %} style="display: none;" {% endif %}>
+      <span class="comment_body">Be the first to comment on this paragraph!</span>
+    </span>
+  {% endif %}
+{% endifequal %}
+{% for c in query %}
+  <span class="{% ifequal c.id newid %}new_{% endifequal %}comment"
+      {% if not newid %} style="display: none;" {% endif %}
+    id="comment{{ c.id }}">
+    <a name="comment{{ c.id }}"/>
+    <span class="comment_header">
+	<span class="comment_id"><a href="/admin/comments/comment/{{ c.id }}/">{{ c.id }}</a></span>
+      
+    </span>
+    <span class="comment_body">{{ c.comment|escape|linebreaks }}</span>
+  </span>
+{% endfor %}
+<form class="comment" id="form_{{ paragraph_id }}" action="{{ paragraph_id }}/"
+    method="post" >
+  {{ form.id }}
+  <table>
+    <tbody>
+      <tr><td align="right" valign="top">Comment<br></td>
+	  <td>{{ form.comment }}</td></tr>
+      <tr><td align="right">Your name</td><td>{{ form.name }}
+	    <span class="comment_help"><b>Required</b> so we can give you credit</a></span></td></tr>
+      <tr><td align="right">Your URL</td><td>{{ form.url }}
+	    <span class="comment_help"><b>Optional</b> link to blog, home page,
+	      <i>etc</i>.</span></td></tr>
+      <tr><td align="right">Remember you?</td><td>{{ form.remember }}</td></tr>
+      <tr><td/><td><input name="submit" type="submit"
+	      value="Submit Comment"/><span class="comment_error">{{ error }}</span></td></tr>
+    </tbody>
+  </table>
+</form>
Binary file sphinx_django/test.db has changed
--- a/sphinx_django/urls.py	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/urls.py	Wed Oct 27 13:59:11 2010 +0530
@@ -1,5 +1,6 @@
 from django.conf.urls.defaults import *
 from django.contrib import admin
+import os
 # Uncomment the next two lines to enable the admin:
 # from django.contrib import admin
 admin.autodiscover()
@@ -13,13 +14,14 @@
     (r'count/(?P<chapter_name>.+)?$', 'sphinxcomment.views.chapter_count'),                  
     (r'single/(?P<paragraph_id>[^/]+)/$', 'sphinxcomment.views.single'),
     (r'submit/(?P<paragraph_id>[^/]+)/$', 'sphinxcomment.views.submit'),
-    (r'^static/(?P<path>.*)$', 'django.views.static.serve',
-     {'document_root': '/home/amit/review/sttp_test/_build/commenthtml'}),
-                       
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
     # to INSTALLED_APPS to enable admin documentation:
     # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
 
     # Uncomment the next line to enable the admin:
      (r'^admin/', include(admin.site.urls)),
+     (r'^pages/_static/(?P<path>.*)$', 'django.views.static.serve',
+     {'document_root': os.path.join(os.getcwd(),'static')}),
+                    
+     (r'^pages/(?P<path>.*)$', 'sphinxcomment.views.page'),
 )
Binary file sphinx_django/urls.pyc has changed
--- a/sphinx_django/urls.py~	Fri Oct 15 15:59:28 2010 +0530
+++ b/sphinx_django/urls.py~	Wed Oct 27 13:59:11 2010 +0530
@@ -14,7 +14,7 @@
     (r'single/(?P<paragraph_id>[^/]+)/$', 'sphinxcomment.views.single'),
     (r'submit/(?P<paragraph_id>[^/]+)/$', 'sphinxcomment.views.submit'),
     (r'^static/(?P<path>.*)$', 'django.views.static.serve',
-     {'document_root': '/home/amit/review/sttp_test/_build/commenthtml/'}),
+     {'document_root': '/home/amit/review/st-scripts/_build/commenthtml'}),
                        
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
     # to INSTALLED_APPS to enable admin documentation:
@@ -22,4 +22,8 @@
 
     # Uncomment the next line to enable the admin:
      (r'^admin/', include(admin.site.urls)),
+     (r'^pages/_static/(?P<path>.*)$', 'django.views.static.serve',
+     {'document_root': '/home/amit/review/st-scripts/_build/commenthtml/_static'}),
+                    
+     (r'^pages/(?P<path>.*)$', 'sphinxcomment.views.page'),
 )