const articlesCtrl = new function() {
    const articlesAjaxFile = $("#hdnRootFldr").val() + "ajax/articlesCtrl.php";
    const holder = "#divArticlesFilter";

    // ------------------------if Choose News or Projects or Articles cat from listing ---------------------------//
    this.loadArticles = function(page, args) {
        let goToTop = false;
        if ($('.sub-banner').length > 0) {
            goToTop = true;
        }

        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;

        const keywords = $(holder + " #txtFilterKeywords").val();
        let catId = getValue(holder + " #cmbCategories");
        if (catId === "") {
            catId = getValue(holder + " #hdnCategoryId");
        } //in case we don't have a sub categories then we load news directly from the parent category savec in the
          // hidden input

        const m = getValue(holder + " #cmbFilterMonth");
        const y = getValue(holder + " #cmbFilterYear");

        const dataToPost = {
            "action" : "RenderArticles",
            "page" : page,
            "catId" : catId,
            "year" : y,
            "month" : m,
            "keywords" : keywords
        };

        $("#divArticles").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) {
                $("#divArticles").html(data.html);
                $("#lblPageTitle").html(data.pageTitle);
                $("#lblSubCatName").html(data.subCatName);

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }

                if (goToTop && enablePushState) {
                    scrollToElement(".sub-banner");
                }

            }
        });
    };

    // --------------------- Search Button -------------------- //
    this.searchOnEnter = function(event) {
        event = event || window.event;
        const code = event.keyCode || event.which;
        if (code === 13) {
            articlesCtrl.searchArticles();
            return false;
        }
        return true;
    };

    // ---------------- Load Albums ---------------- //
    this.loadAlbums = function(page, args) {
        let goToTop = false;
        if ($('.sub-banner').length > 0) {
            goToTop = true;
        }

        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;
        const dataToPost = {
            "action" : "LoadAlbums",
            "page" : page,
            "keywords" : $("#txtKeywords").val()
        };

        $("#divAlbums").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) {
                $("#divAlbums").html(data.html);

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }

                if (goToTop && enablePushState) {
                    scrollToElement(".sub-banner");
                }

            }
        });

    };

    // ---------------- Load Album Photos---------------- //
    /*   this.loadAlbumPhotos = function(page, args){

    var enablePushState = (args !== undefined) ? args.pushState : false ;
    var articleId = getValue(holder + " #hdnArticleId") ;

    var dataToPost = {"action": "LoadAlbumPhotos", "articleId": articleId, "page":page} ;
    console.log(dataToPost) ;
    $("#divAlbumPhotos").append("<div class='loader'></div>") ;

    $.ajax({
    type: "POST",
    dataType: "json",
    url: articlesAjaxFile,
    data:  dataToPost,
    success: function(data) {
    console.log(data) ;
    $("#divAlbumPhotos").html(data.html) ;

    animateLoadingImgs() ;

    if (window.history && window.history.pushState && enablePushState) {
    args.page = page ;
    history.pushState(args, null, data.url) ;
    }
    }
    });
    };*/

    // ---------------- Load Videos ---------------- //
    this.loadVideos = function(page, args) {

        let goToTop = false;
        if ($('.sub-banner').length > 0) {
            goToTop = true;
        }

        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;
        const dataToPost = {
            "action" : "LoadVideos",
            "page" : page,
        };

        // console.log(dataToPost) ;

        $("#divVideos").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) {

                // console.log(data) ;

                $("#divVideos").html(data.html);

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }

                if (goToTop && enablePushState) {
                    scrollToElement(".sub-banner");
                }
            }
        });

    };

    // -------------------------- Load Committees ----------------------------- //
    this.loadTeamMembersByCategory = function(catId, page, pushState) {
        if (page === undefined) {
            page = 0;
        }

        const enablePushState = (
                                    pushState !== undefined
                                ) ? pushState : false;
        // console.log(enablePushState);

        $("#divArticlesFilter #hdnCategoryId").val(catId);
        const args = {"page" : page, "pushState" : enablePushState, "catId" : catId};
        this.loadTeamMembers(page, args);

        const firstTimeLoaded = $('#hdnFirstTimeLoad').val();
        if (firstTimeLoaded) {
            $('#hdnFirstTimeLoad').val('0');
        } else {
            scrollToElement('.main-column');
        }
    };

    this.loadTeamMembers = function(page, args) {
        const catId = $("#divArticlesFilter #hdnCategoryId").val();
        const pcatId = $("#divArticlesFilter #hdnParentCategoryId").val();
        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;
        const dataToPost = {
            "action" : "LoadTeamMembers",
            "catId" : catId,
            "pcatId" : pcatId,
            "page" : page
        };

        $("#divListingTeam").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) { //data => array("html", "hasMore", "url")
                // console.log(data) ;

                $("#divListingTeam").html(data.html);

                $("#lstCategories li a").removeClass("selected");
                $("#lstCategories a[data-id='" + catId + "']").addClass("selected");

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }
            }
        });

    };

    // -------------------------- Load FAQ ----------------------------- //
    this.loadFAQ = function(page, args) {
        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;
        const catId = $("#divArticlesFilter #hdnCategoryId").val();
        const dataToPost = {
            "action" : "LoadFAQ",
            "catId" : catId,
            "page" : page
        };

        // console.log(dataToPost) ;

        $("#divListingFAQ").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) { //data => array("html", "hasMore", "url")
                // console.log(data) ;
                $("#divListingFAQ").html(data.html);

                /* FaQ */ // once clicked on title the content will show
                $('.listing.faq .title').on('click', function() {
                    $(this).toggleClass('selected');
                    $(this).next('.content').stop().slideToggle()
                });

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }
            }
        });

    };

    // -------------------------- Load Services Articles Menu ----------------------------- //
    /*    this.loadServices = function(catId){

    var dataToPost = {
    "action"	: "LoadServices",
    "catId"	: catId
    } ;

    $("#divArticlesMenu").append("<div class='loader'></div>") ;

    $.ajax({
    type: "POST",
    dataType: "json",
    url: articlesAjaxFile,
    data:  dataToPost,
    success: function(data) { //data => array("html", "hasMore", "url")

    $("#divArticlesMenu").html(data.html) ;
    // $("#divArticlesMenu '"+ catId+"' ").html(data.html) ;

    $("#lstCategories li a").removeClass("selected") ;
    $("#lstCategories a[data-id='"+ catId+"']").addClass("selected") ;
    }
    });

    };*/

    // -------------------------- Load Committees ----------------------------- //
    this.loadArticleContent = function(articleId, catId, pushState) {
        const enablePushState = (
                                    pushState !== undefined
                                ) ? pushState : true;
        const dataToPost = {
            "action" : "LoadArticleContent",
            "articleId" : articleId,
            "catId" : catId
        };

        const args = {"articleId" : dataToPost.articleId, "catId" : dataToPost.catId};

        $("#divArticleContent").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) { //data => array("html", "hasMore", "url")
                $("#divArticleContent").html(data.html);

                $('.flexslider').flexslider({
                    start : function(slider) {
                        $(slider).addClass('loaded');
                    }
                });

                animateLoadingImgs();

                $("#lstHeadCats li a").removeClass("selected");
                $("#lstHeadCats a[data-id='" + catId + "']").addClass("selected");

                $("#lstCategories li a").removeClass("selected");
                $("#lstCategories a[data-id='" + catId + "']").addClass("selected");

                $("#lstCategories a[data-id='" + articleId + "']").addClass("selected");

                $("#lstArticles li a").removeClass("selected");
                $("#lstCategories li a[data-id='" + catId + "']").addClass("selected");

                // console.log("catId " + catId);

                $('#lstCategories a[data-id="' + catId + '"] li a').first().trigger('click');

                if (window.history && window.history.pushState && enablePushState) {
                    //args.page = page ;
                    history.pushState(args, null, data.url);
                }
            }
        });
    };

    // ------------- About --------------- //
    this.loadAboutArticles = function(catId, pushState) {
        const dataToPost = {"action" : "LoadAboutArticles", "catId" : catId};

        $("#divAbout").append("<div class='loader'></div>");

        const args = {"catId" : catId};

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) { //data => array("html", "hasMore", "url")
                // console.log(data) ;
                // console.log("html : " + data.html) ;

                $("#lstCategories li a").removeClass("selected");
                $("#lstCategories a[data-id='" + catId + "']").addClass("selected");

                $("#lstHeadCats li a").removeClass("selected");
                $("#lstHeadCats a[data-id='" + catId + "']").addClass("selected");

                $("#divAbout").html(data.html);

                if (data.ret) {
                    resizePlaxCircles();
                    /* $('.plax').plaxify();
                    $.plax.enable();*/
                }
                animateLoadingImgs();

                $('.flexslider').flexslider({
                    start : function(slider) {
                        $(slider).addClass('loaded');
                    }
                });

                const enablePushState = pushState !== undefined ? pushState : true; //check pushHistory Status

                if (enablePushState) {
                    // console.log("pushHistory");
                    window.history.pushState(args, null, data.url);
                }
            }
        });
    };

    this.loadTestimonialsArticles = function(page, args) {
        let goToTop = true;
        const enablePushState = (
                                    args !== undefined
                                ) ? args.pushState : false;
        const catId = $("#divForumFilter #hdnForumCategoryId").val();

        const dataToPost = {"action" : "LoadTestimonialsArticles", "catId" : catId, "page" : page};
        $("#divForumArticles").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            contentType : "application/x-www-form-urlencoded;charset=UTF-8",
            //contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
            success : function(data) {
                // console.log("html : " + data.html) ;
                const html = utf8Decode(data.html);
                $("#divForumArticles").html(html);

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }

                if (goToTop && enablePushState) {
                    scrollToElement("#nav");
                }

            },
            error : function(xhr, ajaxOptions, thrownError) {
                //console.log(xhr.status);
                //console.log(thrownError);
            }
        });
    };

    //*************************************** FORUM SECTION ************************************** //
    /** Load forum listing article by url --> search bar is used from page other than listing page **/
    this.loadForumArticlesByUrl = function() {

        const catId = $("#cmbSearchSection").val(); // level 2
        const subCatId = $("#cmbSearchCategory").val(); // level 3
        const keywords = $("#txtSearchKeyword").val();
        const expert = $("#cmbSearchExpert").val();

        const dataToPost = {
            "action" : "LoadForumArticlesByUrl",
            "catId" : catId,
            "subCatId" : subCatId,
            "keywords" : keywords,
            "expert" : expert
        };

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) {
                if (!data.ret) { //if by ajax
                    window.location.replace(data.url);
                }
            }
        });
    }

    /** function used in paging and search bar from the listing page**/
    this.loadForumArticles = function(page, args) {
        let goToTop = false;
        if ($('.nav').length > 0) {
            goToTop = true;
        }

        const enablePushState = (args !== undefined) ? args.pushState : false;


        let catId = $("#cmbSearchSection").val(); // level 2
        if (!catId) {
            catId = $("#divForumFilter #hdnForumCategoryId").val();
        }
        let subCatId = $("#cmbSearchCategory").val(); // level 3
        if (subCatId == null) {
            subCatId = $("#hdnForumSubCategoryId").val();
        }
        const keywords = $("#txtSearchKeyword").val();
        const expert = $("#cmbSearchExpert").val();

        const dataToPost = {
            "action" : "LoadForumArticles",
            "catId" : catId,
            "subCatId" : subCatId,
            "page" : page,
            "keywords" : keywords,
            "expert" : expert
        };
        $("#divForumArticles").append("<div class='loader'></div>");

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            contentType : "application/x-www-form-urlencoded;charset=UTF-8",
            //contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
            success : function(data) {
                const html = utf8Decode(data.html);
                $("#divForumArticles").html(html);

                animateLoadingImgs();

                if (window.history && window.history.pushState && enablePushState) {
                    args.page = page;
                    history.pushState(args, null, data.url);
                }

                if (goToTop && enablePushState) {
                    scrollToElement("#nav");
                }

            },
            error : function(xhr, ajaxOptions, thrownError) {
                console.log(xhr.status);
                console.log(thrownError);
            }
        });
    };

    /** in search bar when changing section (catId) --> update the category DDL (subcategories) **/
    this.updateListSubCats = function() {
        const catId = $("#cmbSearchSection").val();
        const subCatId = $("#hdnForumSubCategoryId").val();

        const dataToPost = {"action" : "UpdateListSubCats", "catId" : catId, "subCatId" : subCatId};

        $.ajax({
            type : "POST",
            dataType : "json",
            url : articlesAjaxFile,
            data : dataToPost,
            success : function(data) {

                $("#cmbSearchCategory").html(data.html);

            }
        });
    }

};

/**
 * Decodes utf-8 encoded string back into multi-byte Unicode characters.
 *
 * Can be achieved JavaScript by decodeURIComponent(escape(str)),
 * but this approach may be useful in other languages.
 *
 * @param   {string} utf8String - UTF-8 string to be decoded back to Unicode.
 * @returns {string} Decoded Unicode string.
 */
function utf8Decode(utf8String) {
    if (typeof utf8String != 'string') {
        throw new TypeError('parameter ‘utf8String’ is not a string');
    }
    // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
    return utf8String.replace(
        /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
        function(c) {  // (note parentheses for precedence)
            const cc = (
                           (
                               c.charCodeAt(0) & 0x0f
                           ) << 12
                       ) | (
                           (
                               c.charCodeAt(1) & 0x3f
                           ) << 6
                       ) | (
                           c.charCodeAt(2) & 0x3f
                       );
            return String.fromCharCode(cc);
        }
    ).replace(
        /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
        function(c) {  // (note parentheses for precedence)
            const cc = (
                           c.charCodeAt(0) & 0x1f
                       ) << 6 | c.charCodeAt(1) & 0x3f;
            return String.fromCharCode(cc);
        }
    );
}
