#!/usr/bin/python2.4

class Part:
    def __repr__(self):
        return str(self.revs)

    def __init__(self, rev, user, letter):
        self.revs = [[rev, user, letter, False]]

    def add(self, rev, user, letter):
        self.revs.append([rev, user, letter, False])

    def undo(self, rev):
        for i in self.revs:
            if i[0] == rev:
                i[3] = True

    def get(self, rev):
        if self.revs[0][0] > rev or self.revs[0][3]:
            return (0, 0, '', True) # Part doenst exist!

        near = self.revs[0]
        for i in self.revs:
            if i[0] > near[0] and i[0] <= rev and not i[3]:
                near = i
        return near
        
class Text:
    rev = 0
    lines = {}
    def insert_word(self, user, line, pos,  word):
        print HTMLview(user, 'User %i schreibt "%s" in %i:%i <br />' % (user, word , line, pos)) + '<br />'
        n = 0
        for i in word:
            self.insert_letter(user,line,pos+n,i)
            n +=1

    def insert_letter(self, user, line, pos, letter):
        p = Part(self.rev, user, letter)
        if line in self.lines:
           self.lines[line].insert(self._pos(line, pos), p)
        else:
            # new line
            self.lines[line] = [ p ]
    
    def delete(self, user, line, pos):
        print  HTMLview(user, 'User %i loescht an %i:%i <br />' % (user, line, pos)) + '<br />'
        target = self.lines[line][ self._pos(line,pos) ]
        self.edit(user, line, pos, '', False)
    
    def edit(self, user, line, pos, letter, view=True):
        if view:
            print HTMLview(user, 'User %i editiert %i:%i zu %s' % (user, line, pos, letter)) + '<br />'
        target = self.lines[line][ self._pos(line,pos) ]
        target.add(self.rev, user, letter)
    
    def undo(self, user):
        print HTMLview(user, 'Undo! User %i <br />'% user) + '<br />'
        # get revsion for undo
        doRev = 0
        for i in self.lines:
            for j in self.lines[i]:
                this = j.get(self.rev)
                if not this[3] and this[1] == user and this[0] > doRev:
                    doRev = this[0]
        # undo!
        for i in self.lines:
            for j in self.lines[i]:
                if j.get(self.rev)[1] == user:
                    j.undo(doRev)
                    

    def render(self, rev = None):
        print 'Text: <br /><div style="border: 1px solid #000000; background-color: #dddddd;">'
        if not rev:
            rev = self.rev

        output = ''
        for i in self.lines:
            for j in self.lines[i]:
                this = j.get(rev)
                output += HTMLview(this[1], this[2])
            output += '<br />'
        print output + '</div><br />'


    def _pos(self, line, pos, rev=None):
        if not rev:
            rev = self.rev
        internalPos = visiblePos = 0
        for i in self.lines[line]:
            if visiblePos == pos:
                return internalPos

            this = i.get(rev)
            if not this[3]:
                visiblePos += 1
            internalPos += 1
        return internalPos

import livehelp
livehelp.livehelp()

# html output
def HTMLview(user, text):
    color = {0: '#fafafa',
             1: '#ffcccc',
             2: '#ccffcc',
             3: '#ccccff'}
    return '<div style="background-color: '+ color[user] +'; float:left">' \
                +text+'</div>'

print '''
<html>
<head>
<title></title>
</head>

<body>
'''
print HTMLview(1, 'User 1') + '<br />'
print HTMLview(2, 'User 2') + '<br />'
print HTMLview(3, 'User 3') + '<br />' *2

# -- go --
text = Text()

# User 1 insert "abc", line 1
text.rev += 1
text.insert_word(1,0,0, 'abc')

text.render()

text.rev += 1
text.delete(1,0,0)

text.rev += 1
text.delete(2,0,1)

text.rev += 1
text.delete(3,0,2)

text.render()

text.undo(2)
text.undo(1)
text.undo(3)
# print text.lines
text.render()

text.undo(1)

print text.render()

# print text.lines
# text.undo(2)
# print text.lines

print '''
</body>
</html>
'''
