var PIECES_CONTAINER = null;
var POST_LIST = null;
var POST_CONTAINER = null;
var PIECE_AMOUNT = 0;
var LOG = '';
var EXISTING_TAGS = [];

function log(msg) {
	try {
		console.debug(msg)
	} catch(e) {
		LOG += 'msg -- '
	}
}

function displayExistingTags() {
	var displayedTags = []
	document.getElementById('existing-tags-container').style.display = 'block'
	var c = document.getElementById('existing-tags-container')
	var b = document.getElementById('tag-link-blueprint')

	while(c.childNodes.length > 0) {
		c.removeChild(c.firstChild)
	}
		
    log('Existing tags: '+ EXISTING_TAGS);
    
	for(e in EXISTING_TAGS) {
		if(displayedTags.indexOf(EXISTING_TAGS[e]) != -1)
			continue
		var l = b.cloneNode(false)
		l.appendChild( document.createTextNode(EXISTING_TAGS[e]) )
		c.appendChild(l)
		displayedTags.push(EXISTING_TAGS[e])
	}
}

function addTag(event) {
	document.getElementById('kassiTagsText').value += event.target.lastChild.nodeValue + ' '
}

function logout() {
	document.location = 'index.php?logout'
}

function openPost( id ) {
	
	displayExistingTags()
	
	PIECE_AMOUNT = 0
	while( PIECES_CONTAINER.childNodes.length != 0 )
	   PIECES_CONTAINER.removeChild(PIECES_CONTAINER.firstChild)
	
	showRightLoadingAnimation()
    ajaxCall('request_handlers/get_post.php?id='+id, function(response) {
            eval('var arr = '+response)
            hideRightLoadingAnimation()
            POST_CONTAINER.style.visibility = 'visible'
            document.getElementById('kassiPostTitle').value = arr.title
            document.getElementById('kassiPostId').value = id
            //document.getElementById('kassiTagsFormDiv').style.display = 'block'
            document.getElementById('kassiTagsText').value = ''
            document.getElementById('kassiSwapPieceSequence').value = ''
            // tags
            for(tagi in arr.tags) {
            	if(typeof(arr.tags[tagi]) == 'function')
                    continue // bloody prototype extensions...
                document.getElementById('kassiTagsText').value += arr.tags[tagi] + ' '
            }
            // pieces
            var odd_switch = false;
            for(piece in arr.pieces) {
            	var p = arr.pieces[piece]
            	if(typeof(p) == 'function')
                    continue // bloody prototype extensions...
                
                var t = _createPieceTable(p, odd_switch)
                if(odd_switch) odd_switch = false;
                else odd_switch = true;
            	t.name = PIECE_AMOUNT
            	// t.appendChild(document.createTextNode(t.name))
        	    PIECES_CONTAINER.appendChild(t)
                PIECE_AMOUNT += 1
            }
            
            if(PIECE_AMOUNT == 0) {
            	var b = document.createElement('input')
            	b.type = 'button'
            	b.value = 'Delete post'
            	b.addEventListener('click', function(e) {
            		if(confirm('Are you sure you wish to delete this post? The operation can\'t be undone.'))
	            		ajaxCall('request_handlers/delete_post.php?id='+id, 
	            		    function(response) {
	            		        getPosts()
	            		        newPost()
	            		    })
            	}, false)
                PIECES_CONTAINER.appendChild(b)	
            }
            
            try {
            	document.getElementById('add-new-piece-div').style.visibility = 'visible'
	            document.getElementById('edit-post-header').style.visibility = 'visible'
	            //document.getElementById('save-changes-div').style.visibility = 'visible'
	            //document.getElementById('save-preview-div').style.display = 'none'
            } catch(e) {
            	log('Exception in main.js: ' + e)
            }
        });
}


function newPost() {
	displayExistingTags()
	document.getElementById('kassiPostTitle').value = ''
    document.getElementById('kassiTagsText').value = ''
    document.getElementById('kassiSwapPieceSequence').value = ''
	POST_CONTAINER.style.display = 'block'
	PIECE_AMOUNT = 0
    while( PIECES_CONTAINER.childNodes.length != 0 )
       PIECES_CONTAINER.removeChild(PIECES_CONTAINER.firstChild)
    document.getElementById('kassiPostId').value = 'NEW'
    document.getElementById('add-new-piece-div').style.visibility = 'visible'
    document.getElementById('edit-post-header').style.visibility = 'visible'
    // document.getElementById('save-changes-div').style.visibility = 'visible'
}


function onStartSave() {
    log('save start')
}


function onCompleteSave(response) {
    log('save complete: "'+ response +'"')
    var id = parseInt(response); 
    showRightLoadingAnimation()
    setTimeout(function() {
            getPosts( function() {
                openPost(id);
            })
        }, 700); // wait a bit so that the data can actually change (adodb stuff..)
}


function getPosts(doneCallback) {
	showLeftLoadingAnimation()
	EXISTING_TAGS = []
	
	while(POST_LIST.childNodes.length > 0)
	   POST_LIST.removeChild(POST_LIST.firstChild)
	   
    ajaxCall('request_handlers/list_posts.php', function(response) {
            log('done: '+doneCallback);
            var postArray = eval(response)
            hideLeftLoadingAnimation()
            for(c in postArray) {
                var post = postArray[c]
                if(typeof(post) == 'function')
                    continue // bloody prototype extensions...
                    
                // log('found post '+post)
                var d = document.createElement('div')
                d.className = 'post'
                d.postId = post.id
                d.onmouseover = function(event) { event.target.parentNode.className = 'post_mouseover' }
                d.onmouseout = function(event) { event.target.parentNode.className = 'post' }
                d.onclick = function(event) { 
                        var postId = event.target.parentNode.postId
                        openPost(postId)
                    }
                    
                var dateDiv = document.createElement('div')
                var titleDiv = document.createElement('div')
                dateDiv.className = 'post-date'
                titleDiv.className = 'post-title'
                dateDiv.innerHTML = post.time 
                titleDiv.innerHTML = post.title
                EXISTING_TAGS = EXISTING_TAGS.concat(post.tags)
                d.appendChild(dateDiv)
                d.appendChild(titleDiv)
                POST_LIST.appendChild(d)
                d.parentNode.className = 'post'
            }
            
            if(doneCallback) {
                doneCallback();
            }
        })	
}


function _onDeleteClick(e) {
   var pieceId = e.target.parentNode.name
   showRightLoadingAnimation()
   if(confirm('Are you sure you wish to delete this piece? The operation can\'t be undone.'))
	   ajaxCall('request_handlers/delete_piece.php?id='+pieceId, 
	        function(response) {
	        	hideRightLoadingAnimation()
	            var id = document.getElementById('kassiPostId').value
	            openPost(id)
	        })
	else
		hideRightLoadingAnimation()
}


function _onEditClick(e) {
   var pieceId = e.target.parentNode.name
   var oldTable = e.target.parentNode.parentNode.parentNode
   var orderNumber = oldTable.name
   ajaxCall('request_handlers/get_piece_form.php?id='+pieceId, 
        function(response) {
            var t = document.createElement('table')
            t.name = orderNumber
		    t.className = 'piece-edit-table'
		    var tr = document.createElement('tr')
		    var td1 = document.createElement('td')
		    td1.className = 'piece-td'
		    td1.name = pieceId
            
            //var td2 = document.createElement('td')
            var upBtn = document.createElement('input')
		    upBtn.type = 'button'
		    upBtn.value = 'Move up'
		    upBtn.addEventListener('click', _moveUpClick, true)
		    td1.appendChild(upBtn)
		    //var downBtn = document.createElement('input')
		    //downBtn.type = 'button'
		    //downBtn.value = 'Move down'
		    //downBtn.addEventListener('click', _moveDownClick, true)
		    //td2.appendChild(upBtn)
		    //td2.appendChild(downBtn)
		    
            //var orderNumber = _countOrderNumber(oldTable)
            var ee = _createPieceContainer(response, orderNumber)
		    td1.appendChild(ee)
		    tr.appendChild(td1)
		    //tr.appendChild(td2)
		    t.appendChild(tr)
		    
		    PIECES_CONTAINER.replaceChild(t, oldTable)
            //e.target.parentNode.parentNode.parentNode.parentNode.replaceChild(t,oldTable)
        }) 
}


function _moveUpClick(e) {
   //          button  - td       - tr       - table
   var table = e.target.parentNode.parentNode.parentNode
   var pieceId = e.target.parentNode.name
   var orderNumber = parseInt(table.name)
   if(orderNumber === 0)
       return false
       
   var upperTable = table.previousSibling
   //                   table   - tr       - td
   var upperPieceId = upperTable.firstChild.firstChild.name
   PIECES_CONTAINER.removeChild(table)
   PIECES_CONTAINER.insertBefore(table, upperTable)
   table.name = orderNumber - 1
   upperTable.name = orderNumber
   document.getElementById('kassiSwapPieceSequence').value += pieceId+'-'+(orderNumber-1)+'#'+upperPieceId+'-'+orderNumber+'#'
   
}


function _moveDownClick(e) {
	
}

function _createPieceTable(piece, odd_counter) {
	var t = document.createElement('table')
	//t.name = piece.id
	t.className = 'piece-table'
    var tr = document.createElement('tr')
    var td1 = document.createElement('td')
    if( odd_counter ) {
    	td1.className = 'piece-td'
	} else {
		td1.className = 'piece-td-odd'
	}
	
    td1.name = piece.id
    var td2 = document.createElement('td')
    td2.className = 'piece-btns-td'
    td2.name = piece.id
    var editBtn = document.createElement('input')
    editBtn.type = 'button'
    editBtn.value = 'edit'
    editBtn.className = 'kassi-edit-btn'
    editBtn.addEventListener('click', _onEditClick, true)
    var delBtn = document.createElement('input')
    delBtn.type = 'button'
    delBtn.value = 'delete'
    delBtn.className = 'kassi-delete-btn'
    delBtn.addEventListener('click', _onDeleteClick, true)
    
    td2.appendChild(editBtn)
    td2.appendChild(delBtn)
    td1.innerHTML = piece.content
    tr.appendChild(td1); tr.appendChild(td2)
    t.appendChild(tr)
    return t
}


function _createPieceContainer(response, orderNumber) {
    if(orderNumber === null) orderNumber = PIECE_AMOUNT
    
    ne = document.createElement('div')
    ne.innerHTML = String(response)
    
    function _recursiveRename(e) {
        for(i in e.childNodes) {
            var ee  = e.childNodes[i]
            if( ee.name ) {
                var old = ee.name
                ee.name = ee.name + '-' + orderNumber
            }
            _recursiveRename(ee)
        }
    }
    _recursiveRename(ne)
    return ne
}


function main() {
	//var w = parseInt( document.getElementById('kassiMainElementWidth').value )
    //var h = parseInt( document.getElementById('kassiMainElementHeight').value )
    //var mainElement = document.getElementById( document.getElementById('kassiMainElement').value )
    //kassiShowMainElement(mainElement, w, h)
    
    showGlobalLoadingAnimation()
    POST_LIST = document.getElementById('previous-posts-div')
    if(!POST_LIST)
        return false
        
    PIECES_CONTAINER = document.getElementById('edit-post-div')
    POST_CONTAINER = document.getElementById('edit-post-header')
    
    getPosts()
    
    // get the available piece types
    ajaxCall('request_handlers/get_piece_types.php', function(response) {
        eval('var piecesArray = '+response)
        var se = document.getElementById('add-new-piece-select')
        for(pieceI in piecesArray) {
            var piece = piecesArray[pieceI]
            var o = document.createElement('option')
            o.type = piece.type
            o.addEventListener('click', function(e) {
                var type = e.target.type
                ajaxCall('request_handlers/get_piece_form.php?type='+type, 
                    function(response) {
                        // FIXME: should combine this somehow with _onEditClick
                        var ne = _createPieceContainer(response, null)
                        ne.className = 'piece-edit-table'
                        ne.name = PIECE_AMOUNT
                        PIECES_CONTAINER.appendChild(ne)
                        PIECE_AMOUNT += 1
                    })
            }, true)
            o.appendChild( document.createTextNode(piece.name) )
            se.appendChild(o)
        }
    })  
}

function testNewUserForm() {
	if( document.getElementById('kassiNewPasswd').value != document.getElementById('kassiNewPasswd2').value) {
        alert("The passwords don't match!")
        document.getElementById('kassiNewPasswd').focus()
	} else if(document.getElementById('kassiNewPasswd').value == '' || document.getElementById('kassiNewUsername').value == '') {
        alert("Please fill in all the fields")
        document.getElementById('kassiNewUsername').focus()    
	} 
	else {
	    document.getElementById('kassiNewUserForm').submit()
    }
}
