String.prototype.trim = function () {
    var regexp = /^\s*|\s*$/g;
    return this.replace(regexp, "");
}

function PtmListFormatter () {

    var COUNTRYINFO = 'countryTable';
    var FACTSHEET = 'factSheetTableId';
    var PRICELIST = 'priceTable';
    var SERVICELIST = 'serviceTable';
    var SUPPLEMENTLIST = 'supplementTable';
    var CONDITIONLIST  = 'conditionTable';

    PtmListFormatter.prototype.transform = function (table) {

        // Intervals
        intervals = new Array;
        intervals.push("A-C");
        intervals.push("D-E");
        intervals.push("F-O");
        intervals.push("P-Ö");


        var ac_i = 0;
        var de_i = 0;
        var fo_i = 0;
        var po_i = 0;
        var tmp_i = 0;
        var lastHeader = "";
        var intervalHeadersInTable = true;

        // Get table
        tableElement = document.getElementById(table);

        // Get rows in table
        var rows = tableElement.getElementsByTagName("tr");

        if (table == SERVICELIST || table == SUPPLEMENTLIST) {
            intervalHeadersInTable = false;
        }

        // Create interval headers
        if (intervalHeadersInTable) {
            createHeader (table,intervals);
        }

        // Remove tr-tags containing non-td tags (th)
        rows = removeAllNonTD(rows);

        for (var i = 0; i < rows.length; i++) {
            var cells = rows[i].getElementsByTagName("td");

            // Get text in first cell of row
            var header = cells[0].innerHTML;
            header = removeTagsFromInput(header);

            // Get current interval
            current_interval = getIntervalToUse(header);
            if (intervalHeadersInTable) {
                if (current_interval > 'o') {
                    interval = 3;
                    po_i = rowCount (header, lastHeader, po_i);
                    tmp_i = po_i;
                } else if (current_interval > 'e') {
                    interval = 2;
                    fo_i = rowCount (header, lastHeader, fo_i);
                    tmp_i = fo_i;
                } else if (current_interval > 'c') {
                    interval = 1;
                    de_i = rowCount (header, lastHeader, de_i);
                    tmp_i = de_i;
                } else {
                    interval = 0;
                    ac_i = rowCount (header, lastHeader, ac_i);
                    tmp_i = ac_i;
                }
                // If current header is the same as last header then header should not be printed
               if (header != lastHeader) {
                    lastHeader = header;
                } else {
                    header = "";
                }
            } else {
                // No interval headers
                tmp_i++;
            }

            // Create new TR
            newRow = createRow (cells,tmp_i,header);

            // Remove old row
            rows[i].parentNode.removeChild(rows[i]);

            if (document.getElementById("listRow" + (interval + 1))) {
                refNode = document.getElementById("listRow" + (interval + 1));
                // Add new row in correct interval
                refNode.parentNode.insertBefore(newRow,refNode);
            } else {
               // Add new row at end of table
                var tbodys = tableElement.getElementsByTagName("tbody");
                if (tbodys[0].nextSibling && tbodys[0].nextSibling.tagName == 'COLGROUP') {
                    tbodys[1].appendChild(newRow);
                } else {
                    tbodys[0].appendChild(newRow);
                }
            }
        }

        // Add margin-tr
        if (intervalHeadersInTable) {
            finishIntervals(intervals);
        }
    }


    /**
       Count rows in current interval
    */
    function rowCount (header, lastHeader, counter) {
        //alert("rowCount(" + header + ", " + lastHeader + ", " + counter);
        if (header != lastHeader) {
            counter++;
        }
        return counter;
    }

    /**
        Add margin tr-row at end of interval
    */
    function finishIntervals (intervals) {

        var headerRow = document.getElementById("listRow0");
        var numData = headerRow.getElementsByTagName("th").length;

        for (var j = 1; j < intervals.length; j++) {
            newRow = document.createElement("tr");
            newData = document.createElement("td")
            newData.setAttribute("colspan",numData);
            newData.className = "ptmListSpacer";
            newRow.appendChild(newData);
            refNode = document.getElementById("listRow" +  j);
            refNode.parentNode.insertBefore(newRow,refNode);
        }
    }

    /**
        Create table header
    */
    function createHeader(table,intervals) {

        for (var i = 0; i < intervals.length; i++) {
            row = document.getElementById(table).insertRow(i);
            row.setAttribute("id","listRow" + i);
            cleanedInterval = intervals[i].replace("-","");
            cleanedInterval = cleanedInterval.replace("Ö","O");

            if (table == COUNTRYINFO) {
                createCountryInfoHeader (table,row,intervals[i],i);
            } else if (table == FACTSHEET) {
                createFactSheetHeader (table,row,intervals[i],i);
            } else if (table == PRICELIST) {
                createPriceListHeader (table,row,intervals[i],i);
            } else if (table == CONDITIONLIST) {
                createConditionListHeader (table,row,intervals[i],i);
            }
        }
    }

    /**
        Create header for pricelist
    */
    function createPriceListHeader (table,row,interval,pos) {
        serviceNode = document.createElement("th");
        serviceNode.innerHTML = "Tjänst <a name=\"" + table + cleanedInterval + "\">" + interval + "</a>";
        serviceNode.className = "firstcol";
        descriptionNode = document.createElement("th");
        descriptionNode.innerHTML = "Beskrivning";
        currentNode = document.createElement("th");
        currentNode.innerHTML = "Gällande";
        commingNode = document.createElement("th");
        commingNode.innerHTML = "Kommande";
        commingNode.className = "lastcol";

        row.appendChild(serviceNode);
        row.appendChild(descriptionNode);
        row.appendChild(currentNode);
        row.appendChild(commingNode);
        return row;
    }

    /**
        Create header for conditionlist
    */
    function createConditionListHeader (table,row,interval,pos) {
        serviceNode = document.createElement("th");
        serviceNode.innerHTML = "Tjänst <a name=\"" + table + cleanedInterval + "\">" + interval + "</a>";
        serviceNode.className = "firstcol";
        descriptionNode = document.createElement("th");
        descriptionNode.innerHTML = "Beskrivning";
        currentNode = document.createElement("th");
        currentNode.innerHTML = "Gällande";
        commingNode = document.createElement("th");
        commingNode.innerHTML = "Kommande";
        commingNode.className = "lastcol";

        row.appendChild(serviceNode);
        row.appendChild(descriptionNode);
        row.appendChild(currentNode);
        row.appendChild(commingNode);
        return row;
    }
    /**
        Create header for factsheet-list
    */
    function createFactSheetHeader (table,row,interval,pos) {
        serviceNode = document.createElement("th");
        serviceNode.innerHTML = "Tjänst <a name=\"" + table + cleanedInterval + "\">" + interval + "</a>";
        serviceNode.className = "firstcol";
        descriptionNode = document.createElement("th");
        descriptionNode.innerHTML = "Beskrivning";
        currentNode = document.createElement("th");
        currentNode.innerHTML = "Gällande";
        commingNode = document.createElement("th");
        commingNode.innerHTML = "Kommande";
        commingNode.className = "lastcol";

        row.appendChild(serviceNode);
        row.appendChild(descriptionNode);
        row.appendChild(currentNode);
        row.appendChild(commingNode);
        return row;
    }

   /**
       Create header for country-list
   */
   function createCountryInfoHeader (table,row,interval,pos) {
        countryNode = document.createElement("th");
        countryNode.innerHTML = "Land <a name=\"" + table + cleanedInterval + "\">" + interval + "</a>";
        countryNode.className = "firstcol";
        isoNode = document.createElement("th");
        isoNode.className = "lastcol";
        isoNode.innerHTML = "ISO-kod";

        row.appendChild(countryNode);
        row.appendChild(isoNode);
        return row;
    }

    /**
        Set class on row
    */
    function setRowClass(row,i) {
        //alert("i: " + i);
        if (i % 2 == 0) {
            row.className = "odd";
        } else {
            row.className = "even";
        }
        return row;
    }

    /**
      Remove all non TD-tags from rows (filter out TH)
    */
    function removeAllNonTD (rows) {
        var tmpRows = new Array;

        // Remove all non td-tags (th) from rows array
        for (var i = 0; i < rows.length; i++) {
            var tds = rows[i].getElementsByTagName("td");
            if (tds.length > 0) {
                tmpRows.push(rows[i]);
            }
        }
        return tmpRows;
    }

    /**
        Remove tags from input
    */
    function removeTagsFromInput (param) {
       return param.replace(/<\/?[^>]+(>|$)/g, "").trim();
    }

    function getIntervalToUse (param) {
        interval = param.substring(0,1);
        return interval.toLowerCase();
    }

    /**
        Add data (td-cells) to created row
    */
    function addDataToRow (row,cells,data) {
        for (var j = 0; j < cells.length; j++) {
            node = document.createElement("td");
            if (j == 0 && data == '') {
                node.innerHTML = '';
            } else {
                node.innerHTML = cells[j].innerHTML;
            }
            node.className = cells[j].className;
            row.appendChild(node);
        }
    }

    /**
        Create tr
    */
    function createRow (cells,pos,data) {
        row = document.createElement("tr");
        row = setRowClass(row,pos);

        addDataToRow (row,cells,data);
        return row;
    }
}

