#! /usr/bin/env python

import sys, urllib, re, htmllib, formatter, string

searchuri = r'http://www.anu.edu.au/dirs/search.php'
nonefound = r'No ANU Phone Directory Listing has been found to match'
endmatches = r'Is your personal entry correct?'
multiresponse = r'./c5a_search.php?submit'
multireg = r'\<td\ VALIGN.*?\>\<b\>(.*?)&.*c5a_search.php.*?\>(.*?)\<.*?VALIGN.*?\>(.*?)\<\/td\>'

def output_npa (name, phone, address):
   print "%s %s %s" % (name[0:30].ljust(30), \
                       phone.rjust(12), \
                       address[0:45].rjust(45))

class MessyHtmlMatch (htmllib.HTMLParser):
   def __init__(self):
      format = formatter.NullFormatter()
      htmllib.HTMLParser.__init__(self, format)
      self.md = []
      self.nc = -1
      self.dkey = ''
      self.rmset = re.compile ('(Name|Phone|Email|Address):')
      self.stophandling = False

   def handle_data(self, data):
      d = re.sub('\(image\)', '', re.sub('\[.*?\]', '', (data.strip ()).strip ('\xa0')))
       
      if d.find (endmatches) > -1:
         self.stophandling = True

      if self.stophandling: return

      if len (d) == 0: return
      mo = self.rmset.search (d)

      if mo:
         self.dkey = mo.group(1)
         if (self.dkey == 'Name'):
            self.nc += 1
            self.md.append ({})
         return

      if self.nc >= 0:
         s = ''
         try: s = self.md[self.nc][self.dkey]
         except: self.md[self.nc][self.dkey] = ''
         self.md[self.nc][self.dkey] = (s + ' ' + d).strip ()

   def printdict(self):
      for i in range (len (self.md)):
         name, phone, address = map (lambda k: self.md[i][k],['Name', 'Phone', 'Address'])
         output_npa (name, phone, address)

def main ():
   if len (sys.argv) < 2:
      print "Usage: %s name" % (sys.argv[0])
      sys.exit(0)

   name = ' '.join(sys.argv[1:])

   params = urllib.urlencode({'stype': 'Staff Directory', 'button': 'Search', 'querytext': name})

   f = urllib.urlopen(searchuri, params)

   r = f.read()

   if r.find (nonefound) == -1:
      if r.find (multiresponse) > -1:
         lm = re.findall (multireg, r)
         if len (lm) > 0:
            for phone, name, address in lm:
               output_npa (name.strip(), phone.strip(), address.strip())
         else:
            print "Error parsing result, speak to tsg"
      else:
         htp = MessyHtmlMatch ()
         htp.feed (r)
         htp.close ()
         htp.printdict ()
   else:
      print name + " not found"


if __name__ == "__main__":
    main()
