# rptlib.py - plugin function module
#
# Copyright (C) 1998, 1999 Albert Hopkins (marduk) <marduk@python.net>
# Copyright (C) 2002 Mike Meyer <mwm@mired.org>
# Copyright (C) 2005 Arthur de Jong <arthur@tiefighter.et.tudelft.nl>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

__version__ = '1.0'
__author__ = 'mwm@mired.org'

import sys
import webcheck
import urllib
import string
import os
import debugio
import version

Link = webcheck.Link
linkList = Link.linkList
config = webcheck.config
proxies = config.PROXIES

problem_db = {}

# get the stylesheet for insertion,
# Note that I do it this way for two reasons.  One is that Netscape reportedly
# handles stylesheets better when they are inlined.  Two is that people often
# forget to put webcheck.css in the output directory.
if proxies is None:
    proxies = urllib.getproxies()
opener = urllib.FancyURLopener(proxies)
opener.addheaders = [('User-agent','Webcheck ' + version.webcheck)]
try:
    stylesheet =  opener.open(config.STYLESHEET).read()
except:
    stylesheet = ''

def get_title(url):
    """ returns the title of a url if it is not None, else returns url
    note that this implies linkList[url] """
    link=linkList[url]
    if link.title is None:
        return url
    return link.title

def make_link(url,text):
    """Return an <A>nchor to a url with <text>.  If url is in the Linklist and
    is external, insert "class=external" in the <A> tag."""
    url = str(url) # because sometimes I lazily pass a Link object.
    mystring = '<a href="' + url + '"'
    try:
        external = linkList[url].external
    except KeyError:
        external = 0
    if external:
        mystring = mystring + ' class="external"'
    else:
        mystring = mystring + ' class="internal"'
    mystring = mystring + '>' + text + '</a>'
    return mystring

def add_problem(type,link):
    """ add a problem to the 'problems' database.  Will not add external links"""
    if link.external: return
    global problem_db
    author = link.author
    if problem_db.has_key(author):
        problem_db[author].append((type,link))
    else:
        problem_db[author]=[(type,link)]

def sort_by_age(a,b):
    """ sort helper for url's age.  a and b are urls in linkList """
    aage, bage = linkList[a].age, linkList[b].age
    if aage < bage:
        return -1
    if aage == bage:
        return sort_by_author(a,b)
    return 1

def sort_by_rev_age(a,b):
    aage, bage = linkList[a].age, linkList[b].age
    if aage > bage:
        return -1
    if aage == bage:
        return sort_by_author(a,b)
    return 1

def sort_by_author(a,b):
    aauthor,bauthor = `linkList[a].author`, `linkList[b].author`
    if aauthor < bauthor:
        return -1
    if aauthor == bauthor:
        return 0
    return 1

def sort_by_size(a,b):
    asize, bsize = linkList[a].totalSize, linkList[b].totalSize
    if asize < bsize:
        return 1
    if asize == bsize:
        return 0
    return -1

def main_index():
    tmp = sys.stdout
    fp = open_file(config.MAIN_FILENAME)
    sys.stdout=fp
    
    print '<html>'
    print '<head>'
    print '<title>Webcheck report for "%s"</title>' % get_title(`Link.base`)
    print '<style type="text/css">'
    print '<!-- /* hide from old browsers */'
    print stylesheet
    print ' --> </style>'
    print '</head>'
    print '<frameset COLS="%s,*" border=0 framespacing=0>' \
          % config.NAVBAR_WIDTH
    print '<frame name="navbar" src="%s" marginwidth=0 marginheight=0 frameborder=0>' \
          % config.NAVBAR_FILENAME
    print '<frame name="main" src="%s" frameborder=0>' % (webcheck.plugins[0]+'.html')
    print '</frameset>'
    print '</html>'
    fp.close()
    sys.stdout = tmp


def nav_bar(plugins):
    # navigation bar
    fp=open_file(config.NAVBAR_FILENAME)
    stdout = sys.stdout
    sys.stdout = fp
    print '<html>\n<head>'
    print '\t<title>navbar</title>'
    print '<style type="text/css">'
    print '<!-- /* hide from old browsers */'
    print stylesheet
    print ' --> </style>'
    print '\t<base target="main">'
    print '</head>'
    print '<body class="navbar">'
    print '<div align=center>'
    print '<table cellpadding="%s" cellspacing="%s">' \
          % (config.NAVBAR_PADDING, config.NAVBAR_SPACING)
    # title
    print '<tr><th class="home">',
    print '<a target="_top" href="%s" onMouseOver="window.status=\'Webcheck Home Page\'; return true;">Webcheck %s</a></th></tr>' \
          % (version.home, version.webcheck)

    # labels pointing to each individual page
    for plugin in plugins + ['problems']:
        debugio.write('\t' + plugin,file=stdout)
        filename = plugin + '.html'
        print '<tr><th>',
        report = __import__('plugins.' + plugin, globals(), locals(), [plugin])
        print '<strong><a href="%s" onMouseOver="window.status=\'%s\'; return true">%s</a></strong>' \
              % (filename, report.__doc__, report.title),
        print '</th></tr>'

        # create the file we just pointed to
        tmp = sys.stdout
        fp = open_file(filename)
        sys.stdout = fp
        doTopMain(report)
        report.generate()
        report_version = report.__version__
        doBotMain()
        fp.close()
        sys.stdout = tmp
    
    print
    print '</table>'
    print '</div>'
    print '</body>'
    print '</html>'

    fp.close()
    sys.stdout = stdout

def open_file(filename):
    """ given config.OUTPUT_DIR checks if the directory already exists; if not, it creates it, and then opens         filename for writing and returns the file object """
    if os.path.isdir (config.OUTPUT_DIR) == 0:
        os.mkdir(config.OUTPUT_DIR)

    fname = config.OUTPUT_DIR + filename
    tmp = sys.stdout
    sys.stdout = sys.__stdout__
    if os.path.exists(fname) and not config.OVERWRITE_FILES:
        ow = raw_input('File %s already exists. Overwrite? y[es]/a[ll]/Q[uit] ' % `fname`)
        ow = ow.lower() + " "
        if ow[0] == 'a':
            config.OVERWRITE_FILES = 1
        elif ow[0] != 'y':
            print 'Aborted.'
            sys.exit(0)
    sys.stdout = tmp
    return open(fname,'w')

def doTopMain(report):
    """top part of html files in main frame prints to stdout"""
    print '<html>'
    print '<head><title>%s</title>' % report.title
    print '<style type="text/css">'
    print '<!-- /* hide from old browsers */'
    print stylesheet
    print ' --> </style>'
    print '<meta name="Author" content="Webcheck ' + version.webcheck + '">' 
    print '</head>'
    print '<body class="%s">' % string.split(report.__name__,'.')[1]  
    print '<p class="logo"><a '
    print 'href="%s"><img src="%s" border=0 alt=""></a></p>' % (Link.base, config.LOGO_HREF)
    print '\n<h1 class="basename">'
    print '\t<a href="%s">%s</a>' \
          % (`Link.base`, get_title(`Link.base`))
    print '</h1>'
    print '\n\n<table width="100%" cellpadding=4>'
    print '\t<tr><th class="title">%s</th></tr>\n</table>\n' % report.title

def doBotMain():
    """ bottom part of html files in main frame"""
    print 
    print '<hr>'
    print '<p class="footer">'
    print '<em>Generated %s by <a target="_top" href="%s">Webcheck %s</a></em></p>' \
          % (webcheck.start_time,version.home, version.webcheck)
    print '</body>'
    print '</html>'