﻿function generateDescription(passedXMLNode){
    //TYPE CONSTANT
    var TEXT = 'TEXT';
    var LIST = 'LIST';
    var LINK = 'LINK';
    var HEADER = 'HEADER';
    var MAIL = 'MAIL';
    var TABLE = 'TABLE';

    //define div containing desc
    var descDiv = document.createElement('div');
    
    //initialize header and paragraph XML elements
    var header = passedXMLNode[0].getElementsByTagName('HEADER');
    var paragraph = passedXMLNode[0].getElementsByTagName('PARAGRAPH');
    
    //define and append header if a header is requested
    
    if(header[0].childNodes[0].nodeValue != 'null'){
        //create a <b> element and assign header value
        var descHeader = document.createElement('b');
            descHeader.setAttribute('class', 'descriptionHeader');
            descHeader.innerHTML = passedXMLNode[0].getElementsByTagName('HEADER')[0].childNodes[0].nodeValue;
            descDiv.appendChild(descHeader);    //append header to <div>        
    }
    
    //loop through paragraph elements
    for(i=0;i<paragraph.length;i++){

        //if paragraph is type text
        if(paragraph[i].getAttribute('TYPE') == TEXT){
        
            //append paragraph 
            descDiv.appendChild(createParagraph(paragraph[i].childNodes[0].nodeValue)); //append paragraph to <div>
                
        //if paragraph is type header
        } else if(paragraph[i].getAttribute('TYPE') == HEADER){
                
            //append header          
            descDiv.appendChild(createHeader(paragraph[i].childNodes[0].nodeValue)); //append paragraph to <div>
        
        //if paragraph is type list   
        } else if(paragraph[i].getAttribute('TYPE') == LINK){
            
            //append list
            descDiv.appendChild(createLink(paragraph[i]));

            //if paragraph is type list 
        } else if(paragraph[i].getAttribute('TYPE') == MAIL){
            
            //append list
            descDiv.appendChild(createMailLink(paragraph[i]));
            
        //if paragraph is type list 
        } else if(paragraph[i].getAttribute('TYPE') == LIST){
            
            //append list
            descDiv.appendChild(createList(paragraph[i].getElementsByTagName('NODE')));

        } else if (paragraph[i].getAttribute('TYPE') == TABLE){
          
            // append table passing the number of columns as an argument
			descDiv.appendChild(createTable(paragraph[i].getElementsByTagName('ITEM'), paragraph[i].getAttribute('COLNUM')));
		}
    }
    
    //return description div element
    return descDiv;
}

//create a paragraph
function createParagraph(nodeValue, type){

    //create a <p> tag and insert paragraph
    var descParagraph = document.createElement('p');  
        descParagraph.setAttribute('class','descriptionParagraph');      
        if(nodeValue != 'null'){
            descParagraph.innerHTML = nodeValue;
        }
    
    //return newly formed paragraph
    return descParagraph;
}

//create a header
function createHeader(nodeValue){

    //create a <p> tag and insert paragraph
    var descHeader = document.createElement('b');
        descHeader.setAttribute('class','descriptionHeader');
        if(nodeValue != 'null'){
            descHeader.innerHTML = nodeValue;
        }
    
    //return newly formed paragraph
    return descHeader;
}

//create a link
function createLink(linkNode){
    
    var ref = linkNode.getElementsByTagName('REF');
    var text = linkNode.getElementsByTagName('TEXT');
    
    //create a <a> tag and insert link
    var descLink = document.createElement('a');
    descLink.setAttribute('class', 'descriptionLink');
        descLink.setAttribute('href', ref[0].childNodes[0].nodeValue + '?' + getQueryString(document.URL));
        descLink.innerHTML = text[0].childNodes[0].nodeValue;
    
    //return link
    return descLink;
}

//create a link
function createMailLink(linkNode) {

    var ref = linkNode.getElementsByTagName('REF');
    var text = linkNode.getElementsByTagName('TEXT');

    //create a <a> tag and insert link
    var descLink = document.createElement('a');
    descLink.setAttribute('class', 'descriptionLink');
    descLink.setAttribute('href', ref[0].childNodes[0].nodeValue);
    descLink.innerHTML = text[0].childNodes[0].nodeValue;

    //return link
    return descLink;
}


//creates a list
function createList(passedListNode){
    //create a list container
    var descList = document.createElement('ul');
        descList.setAttribute('class','descriptionListContainer');
                    
    //loop through list nodes
    for(u=0;u<passedListNode.length;u++){                            
        /*if element is a sublist...                                 
          unfortunately since JS is such a retarded garbage language recursive calls are impossible at best...
          so hence is present the retard approach to sublists*/
        if(passedListNode[u].getAttribute('TYPE') == 'SUBNODE'){
            
            //create a sublist container
            var descSubList = document.createElement('ul');
                descSubList.setAttribute('class','descriptionListContainer');
            
            //loop until type is no longer == subnode
            while(passedListNode[u].getAttribute('TYPE') == 'SUBNODE'){
                //create a subnode element                
                var descSubListNode = document.createElement('li');
                    descSubListNode.setAttribute('class','descriptionList');
                    descSubListNode.innerHTML =  passedListNode[u].childNodes[0].nodeValue;
                    
                    //append sub list to list
                    descSubList.appendChild(descSubListNode);
                
                //increment U
                u++
            }
           
            //appends sub list to list
            descList.appendChild(descSubList);
            u--;    //single decrementation for U needed
        } else {           
            //create a <li> tag and insert node into list container
            var descListNode = document.createElement('li');
                descListNode.setAttribute('class','descriptionList');
                
            if(passedListNode[u].childNodes.nodeValue != 'null'){
                descListNode.innerHTML = passedListNode[u].childNodes[0].nodeValue;
            }
            
            //append list to container
            descList.appendChild(descListNode);
        }  
    }
    
    return descList;  //return list container to <div>
}

function createTable(itemList, colNumber){
	var destTable = document.createElement('table');
	destTable.setAttribute('class', 'descriptionTable');
	
	var x = 0;
	while (x < itemList.length){
		var row = document.createElement('tr');
		
		// append each item in the row
		while (x < itemList.length && itemList[x].getAttribute('TYPE') != 'ROW'){
			var item;
			
			if (itemList[x].getAttribute('TYPE') == 'COLHEADER'){
				item = document.createElement('th');
				item.setAttribute('class', 'descriptionTableHeader');
			}
			else if (itemList[x].getAttribute('TYPE') == 'LONGHEADER'){
				item = document.createElement('th');
				item.setAttribute('class', 'descriptionTableHeader');
				item.setAttribute('colspan', colNumber);
			}
			else{
				item = document.createElement('td');
				item.setAttribute('class', 'descriptionTableData');
			}
			
			item.innerHTML = itemList[x].childNodes[0].nodeValue;
			row.appendChild(item);
			x++;
		}
		destTable.appendChild(row);
		x++;
	}
	
	return destTable;
}

