﻿function articleEdit(domInx, classId) {//get the DOM reference and open the editor IF there is authentication
    document.getElementById('ctl00_ContentPlaceHolder2_articleType').value = 'BLOG'
    if (document.getElementById('articleId' + domInx).value == 0) {// add first article
        articleClose('newArticle');
    }
    var articleH1 = '<h1>' + document.getElementById('h1' + domInx).innerHTML + '</h1>';
    var articleH2 = '<h2>' + document.getElementById('h2' + domInx).innerHTML + '</h2>';
    var articleH3 = '<h3>' + document.getElementById('h3' + domInx).innerHTML + '</h3>';
    var articlespan = document.getElementById('span' + domInx).innerHTML;
    document.getElementById('articleNum').value = domInx;
    var ASPxEditor = document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1');
    var ASPxEditorTabs = window['ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_TC'];

    var tabInx = ASPxEditorTabs.activeTabIndex;
    if (tabInx != 0) {//set html tab active to capture data
        ASPxEditorTabs.tabs[tabInx].tabControl.ChangeActiveTab(1);
    }

    document.getElementById('ctl00_ContentPlaceHolder2_articleId').value = document.getElementById('articleId' + domInx).value;
    document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value = '<div class="' + classId + '">';
    document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value += articleH1 + '<br />' + articleH2 + '<br />' + articleH3 + '<br />' + articlespan;
    document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value += '</div>';

    ASPxEditorTabs.tabs[tabInx].tabControl.ChangeActiveTab(0); //set tab back to incoming display
    document.getElementById('articleEditorDiv').style.visibility = "visible"; //display the editor

}

function articleClose(closeAction) {//get the DOM reference and open the editor IF there is authentication
    // TODO handle save, cancel, add delete
    var ASPxEditorTabs = window['ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_TC'];
    var tabInx = ASPxEditorTabs.activeTabIndex;
    ASPxEditorTabs.tabs[tabInx].tabControl.ChangeActiveTab(1);

    if (closeAction == 'cancelArticle') {//
        document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value = '';
        document.getElementById('articleEditorDiv').style.visibility = "hidden";
        return;
    }



    inxDom = document.getElementById('articleNum').value;
    var articleIdNum = parseInt(document.getElementById('ctl00_ContentPlaceHolder2_articleId').value);

    switch (closeAction) {//cascading close features - no breaks
        case 'newArticle':
            articleIdNum = 0;
            var dateNum = new Date();
            var textMonth = formatMonth(dateNum.getMonth() + 1);
            //var pubToday = dateNum.toString('MMM d,YYYY');--does not work for javascript asp only
            var pubToday = textMonth + ' ' + dateNum.getDate() + ', ' + dateNum.getFullYear();
            var newTemplate = '';
            document.getElementById('articleNum').value = 0;

            newTemplate = "<div class='classBlog'>";
            newTemplate += "<h1>Primary Title</h1><br />";
            newTemplate += "<h2>Subtitle</h2><br />&nbsp;<br />";
            newTemplate += "<h3>Published on " + pubToday + "</h3><br />";
            //newTemplate += "<span><img src='/images/default.gif'>Text of this blog</span>";
            newTemplate += "<p><img src='/images/default.gif'></p><p>Text of this blog";
            newTemplate += "</p></div>";
            document.getElementById('ctl00_ContentPlaceHolder2_articleId').value = articleIdNum;
            document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value = newTemplate;

            ASPxEditorTabs.tabs[tabInx].tabControl.ChangeActiveTab(0); // design view
            document.getElementById('articleEditorDiv').style.visibility = "visible";
            break;
        case 'saveArticle':
            var inxH1 = -1;
            var inxH2 = -1;
            var inxH3 = -1;
            var inxSpan = -1;
            var inxTag = -1;
            var textH1 = '';
            var textH2 = '';
            var textH3 = '';
            var textSpan = '';
            var inputText = '';
            inputText = document.getElementById('ctl00_ContentPlaceHolder2_ASPxHtmlEditor1_HtmlViewEdit_I').value;
            if (tabInx != 1) {//set html tab active - get data from synchronized value if not already in html view
                if (__aspxControlCollection.elements.ctl00_ContentPlaceHolder2_ASPxHtmlEditor1.syncronizedHtml.length > 0)
                    inputText = __aspxControlCollection.elements.ctl00_ContentPlaceHolder2_ASPxHtmlEditor1.syncronizedHtml;
            }

            inxTag = findTag(inputText, 'h1', 'Primary Heading');
            if (inxTag > -1) {//found H1
                inxH1 = inxTag;
                inxH1E = inputText.toLowerCase().indexOf('</h1');

                inxTag = findTag(inputText, 'h2', 'Topic Heading');
                if (inxTag > inxH1E) {// found H2 after </H1>
                    inxH2 = inxTag;
                    inxH2E = inputText.toLowerCase().indexOf('</h2');
                } else {// H2 embed error
                    alert('<h2>Topic Heading </h2> must come after <h1>Primary Heading</h1>');
                    inxTag = -1;
                }
            }
            if (inxTag > -1) {
                inxTag = findTag(inputText, 'h3', 'Publish Date');

                if (inxTag > inxH2E) {// found H3 after H2 
                    inxH3 = inxTag;
                    inxH3E = inputText.toLowerCase().indexOf('</h3');
                } else {// H3 embed error
                    alert('<h3>Publish Date</h3> must come after <h2>Topic Heading</h2>');
                    inxTag = -1;
                }

            }

            if (inxTag > -1) {
                inxSpan = inxH3E + 5;
                textSpan = inputText.substring(inxSpan);
                var skipSpan = textSpan.toLowerCase().indexOf('<br');

                if (skipSpan == 0) {// by pass new line
                    inxSpan += textSpan.toLowerCase().indexOf('>') + 1;
                    textSpan = inputText.substring(inxSpan);
                }
                inxTag = findTag(textSpan, 'div', '');

                if (inxTag == -1) {// if there are no imbedded div's remove last end div
                    inxSpanE = textSpan.toLowerCase().lastIndexOf('</div>');
                } else {// remove first </div>
                    inxSpanE = textSpan.toLowerCase().indexOf('</div>');
                }

                if (inxSpanE > -1) {//
                    textSpan = textSpan.substring(0, inxSpanE);
                }

                if ((textSpan.length + 6) < inputText.substring(inxSpan).length) {//get the rest of the data

                    textSpan += inputText.substring(inxSpan + inxSpanE + 6);
                }

                textSpan = stripHttp(textSpan, 'images');

                if (textSpan.length == 0) {// article data required
                    alert('Article must contain text');
                    return;
                }
                //alert('Beginning final result' + textSpan.substring(0));
                //alert('Ending final result' + textSpan.substring(textSpan.length - 100));


                textH1 = inputText.substring(inxH1, inxH1E);
                textH1 = stripEmbeddedHtml(textH1);
                if (!checkLen(textH1, 'Heading <H1>', 64)) return;
                textH2 = inputText.substring(inxH2, inxH2E);
                textH2 = stripEmbeddedHtml(textH2);
                if (!checkLen(textH2, 'Heading <H2>', 64)) return;

                textH3 = inputText.substring(inxH3, inxH3E);
                textH3 = stripEmbeddedHtml(textH3); 
                pubDate = checkDate(textH3);

                if (pubDate.length == 0) return;

                document.getElementById('ctl00_ContentPlaceHolder2_articleId').value = articleIdNum;
                document.getElementById('ctl00_ContentPlaceHolder2_articleTitle').value = textH1;
                document.getElementById('ctl00_ContentPlaceHolder2_articleSubtitle').value = textH2;
                document.getElementById('ctl00_ContentPlaceHolder2_articlePublishDate').value = pubDate;
                document.getElementById('ctl00_ContentPlaceHolder2_articleText').value = textSpan;

                //alert('articleText length:' + document.getElementById('ctl00_ContentPlaceHolder2_articleText').value.length + ' input text length:' + textSpan.length);
                document.getElementById('ctl00_ContentPlaceHolder2_btnArticleUpdate').click();

            } else {//quit editing
                return
            }
            //copy data to form and click submit
            break;
        case 'deleteArticle':

            //TODO  CONFIRM DELETE WITH ALERT
            var confirmDelete = confirm("Do you REALLY want to delete article #" + articleIdNum + "?");
            if (confirmDelete != true) return;

            articleIdNum = articleIdNum * -1;
            document.getElementById('ctl00_ContentPlaceHolder2_articleId').value = articleIdNum;
            document.getElementById('ctl00_ContentPlaceHolder2_btnArticleUpdate').click();

    }


}

function findTag(inputHtml, tagHtml, tagName) {//vailidate Heading still exists and alert if in error
    var inxBegin = 0;

    var inxTag = inputHtml.toLowerCase().indexOf('<' + tagHtml); //look for beginning tag
    var inxTagE = -1;

    if (inxTag > -1) {//look for ending tag marker <tag>
        inxTagE = inputHtml.substring(inxTag).indexOf('>');
        if (inxTagE > -1) {//look for ending tag
            inxTag += inxTagE;
            inxBegin = inxTag + 1;
            inxTag += inputHtml.substring(inxTag).toLowerCase().indexOf('</' + tagHtml);
        } else {//
            inxTag = inxTagE;
        }
    }
    if (inxTag > -1) {//look for ending tag
        inxTagE = inputHtml.substring(inxTag).toLowerCase().indexOf('>');
        if (inxTagE > -1) {//
            inxTag += inxTagE;
        } else
            inxTag = inxTagE;
    }

    if (inxTag <= -1) {
        if (tagName != '') {// don't show error if tagName not given
            alert(tagName + ' is missing or not enclosed.  All blog entries require a: <' + tagHtml + '> ' + tagName + ' text </' + tagHtml + '>');
        }
    } else {//     return the index of the string
        inxTag = inxBegin;
    }
    return inxTag;
}
function stripEmbeddedHtml(textHeading) {//remove any HTML in headings to keep a consistent blog look and elminate editor manipulation
    var newHeading = textHeading;
    var tagB = newHeading.indexOf('<')
    var tagE = -1;
    loopInx = 0;

    while (tagB > -1) {//find end of opening tag
        tagE = newHeading.indexOf('>');
        if (tagE > -1) {//strip out beginning     
            if (tagB > 0) {//leave first part of 
                //alert('old:'+newHeading);
                newHeading = newHeading.substring(0, tagB) + newHeading.substring(tagE + 1);
                //alert('new:'+newHeading);

            } else {//start string after end
                newHeading = newHeading.substring(tagE + 1);
                //alert('new:'+newHeading);
            }
            tagB = newHeading.indexOf('<')
        } else {//end the scan
            tagB = -1;
        }
        loopInx++;
        if (loopInx > 5) tagB = -1;
    }
    //alert('old:'+textHeading+' \nnew:'+newHeading);
    return newHeading;
}

function stripHttp(textSpan, imageDir) {//remove http header added by editor for local references
    var newSpan = textSpan;

    var imgBInx = newSpan.indexOf('src="');
    var imgEInx = -1;
    var tagInx = 0;
    var tagHttp = -1;

    loopInx = 0;

    while (imgBInx > -1) {//find end of opening tag

        imgBInx += 5;
        imgEInx = newSpan.substring(imgBInx).indexOf('"');
        if (imgEInx > -1) {//found quoted src string

            imgText = newSpan.substring(imgBInx, imgBInx + imgEInx);
            imgDirInx = imgText.toLowerCase().indexOf('/' + imageDir + '/')
            if (imgDirInx > -1) {//remove http from image
                imgText = imgText.substring(imgDirInx);
                //alert('length of incoming Span:'+newSpan.length+ ' using:'+imgText);
                newSpan = newSpan.substring(0, imgBInx) + imgText + newSpan.substring(imgBInx + imgEInx);
                //alert('new length of incoming Span:'+newSpan.length);
                imgBInx += imgText.length;
            } else {
                //alert('did not find directory at src:'+newSpan.substring(imgBInx));
            }
            if (imgBInx < newSpan.length - 5) {
                //alert('finding next src starting at char '+imgBInx);	
                imgNInx = imgBInx;
                imgBInx = newSpan.substring(imgNInx).indexOf('src="');
                if (imgBInx > -1) {
                    imgBInx += imgNInx;
                    //alert('found src at char '+imgBInx+' src:'+newSpan.substring(imgBInx));
                }
            } else {//
                imgBInx = -1;
            }
        } else {// can't deal with open quotes
            imgBInx = -1;
        }
        loopInx++;
        if (loopInx > 10) {//looping
            //alert('loop error');
            imgBInx = -1;
            newSpan = '';
        }
    }
    //alert('final result'+newSpan.substring(3000));
    //newSpan = '';
    return newSpan;
}

function checkLen(headingText, headingName, headingLength) {//validate heading lengths
    var lenDiff = headingText.length - headingLength;
    if (lenDiff > 0) {//send alert and return false
        alert(headingName + ' is ' + lenDiff + ' characters too long.  Max length is ' + headingLength + ' characters');
        return false;
    }
    return true;
}
function formatMonth(monthId) {//return month as text or numeric value depending on input
    var monthText = ['none', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    if (!isNaN(parseFloat(monthId)) && isFinite(monthId)) {//if input is numeric pass back text
        if (monthId == 0) {
            var newDate = new Date();
            monthId = newDate.getMonth() + 1;
        }
        return monthText[monthId];
    }
    for (var moInx = 1; moInx <= 12; moInx++) {//find matching text and return month number
        if (monthId.toString().indexOf(monthText[moInx]) > -1) return moInx;
    }
}
function checkDate(pubDateString) {//vaildate date and send error alert if not valid
    var numMonth = formatMonth(pubDateString);
    var numDay = pubDateString.substring(pubDateString.indexOf(',') - 2, pubDateString.indexOf(','));
    numDay = numDay.replace(/^\s*/, "").replace(/\s*$/, "");
    var numYear = pubDateString.substring(pubDateString.indexOf(',') + 2, pubDateString.indexOf(',') + 6);

    if (numMonth < 1 || numMonth > 12) {//
        alert('Publishing date contains an invalid month: ' + numMonth);
        return '';
    }
    if (!validateDate(numMonth, numDay, numYear)) {//
        alert('Publishing date: ' + numMonth + '-' + numDay + '-' + numYear + ' contains an invalid day or year');
        return '';
    }
    var pubDate = numMonth + '-' + numDay + '-' + numYear;
    return pubDate;
}
function validateDate(mm, dd, yyyy) {
    mm = mm - 1; // javascript month range : 0- 11
    var tempDate = new Date(yyyy, mm, dd);
    if ((yyyy == tempDate.getFullYear()) &&
        (mm == tempDate.getMonth()) &&
        (dd == tempDate.getDate())) return true;

    return false;
}
