/**
 * File:    SFC.js
 * Author:  RP =)
 */

var SFC = {}; // set namespace

/**
 * SFC class handles all stuff regarding the guestbook.
 */
SFC.Container = (function() {
    var focalStarted = false;
    var nextChange = new Date;
    var currentFocalIndex = 0;
    var selectedPager = false;
    var timeout = 5000;
    var
    selectedMenu,
    selectedSubmenu,
    buttons = [];

    return {
        /**
         * Checks if there is a currently logged in user
         * @return true if there is a logged in user
         */
        hasLoggedInUser: function() {
            var isLoggedIn = false;
            $.ajax({
                url: "lib/util.checklogin.php",
                data: {
                    func: "hasLoggedInUser"
                },
                async: false,
                type: "GET",
                contentType: "application/json",
                success: function(res) {
                    try {
                        isLoggedIn = (JSON.parse(res).hasLoggedInUser == "true");
                    } catch (e) {
                        isLoggedIn = false;
                    }
                }
            });
            return isLoggedIn;
        },

        /**
         * logout the user
         */
        logout: function() {
            $.ajax({
                url: "lib/util.checklogin.php",
                data: {
                    func: "logout"
                },
                async: false,
                type: "GET",
                contentType: "application/json",
                success: function(res) {
                    window.location.href = "home.php";
                }
            });
        },

        /**
         * Retrieves the logged in user
         * @return the logged in user object
         */
        getLoggedInUser: function() {
            var loggedInUser = null;
            $.ajax({
                url: "lib/util.checklogin.php",
                data: {
                    func: "getLoggedInUser"
                },
                async: false,
                type: "GET",
                contentType: "application/json",
                success: function(res) {
                    if (res && $.trim(res) != "") {
                        loggedInUser = JSON.parse(res)[0];
                    }
                }
            });
            return loggedInUser;
        },

        /**
         * Retrieves the logged in user
         * @return the logged in username
         */
        getLoggedInUserName: function() {
            var loggedInUser;
            $.ajax({
                url: "lib/util.checklogin.php",
                data: {
                    func: "getLoggedInUserName"
                },
                async: false,
                type: "GET",
                contentType: "application/json",
                success: function(res) {
                    if (res && $.trim(res) != "") {
                        loggedInUser = JSON.parse(res).username;
                    }
                }
            });
            return loggedInUser;
        },

        isLoggedInUserASysAdmin: function() {
            var sysad = false;
            $.ajax({
                url: "lib/util.checklogin.php",
                data: {
                    func: "isLoggedInUserASysAdmin"
                },
                async: false,
                type: "GET",
                contentType: "application/json",
                success: function(res) {
                    try {
                        sysad = (JSON.parse(res).isSystemAdmin == "true");
                    } catch (e) {
                        sysad = false;
                    }
                }
            });
            return sysad;
        },

        setTitle: function(title) {
            document.title = title + " - Singles For Christ (SFC) San Francisco / Peninsula";
        },

        generatePage: function(main, options) {
            var that = this;     /* {SFC.Container} 'this' reference for inside of inner functions */

            $.extend(that, {
                selectedMenu: "HOME",
                selectedSubmenu: "",
                buttons: [
                    {name: "HOME", id:"homeButton", link:"/home.php"},
                    {name: "MEMBERS", member: "true", link:"/member.php"},
                    {name: "WAZZUP", link:"/wazzup.php", submenus: [
                                            {name: "News & Events", link:"/wazzup.php?page=newsandevents"},
                                            {name: "Features", link:"/wazzup.php?page=features"}
                                        ]},
                    {name: "ABOUT US", link:"/aboutus.php", submenus: [
                                            {name: "Who We Are", link:"/aboutus.php?page=whoweare"},
                                            //{name: "History", link:"/aboutus.php?page=history"},
                                            {name: "Mission & Vision", link:"/aboutus.php?page=missionvision"},
                                            {name: "Core Values", link:"/aboutus.php?page=corevalues"},
                                            //{name: "FAQs", link:"/aboutus.php?page=faqs"},
                                            {name: "Links", link:"/aboutus.php?page=links"}
                                        ]},
                    {name: "JOIN", link:"/join.php"},
                    {name: "GUESTBOOK", link:"/guestbook.php", submenus: [
                                            {name: "Add an Entry", link:"/guestbook.php?page=addentry"},
                                            {name: "View Entries", link:"/guestbook.php?page=viewentries"}
                                        ]},
                    {name: "CONTACT", link:"/contact.php"}
                ],
                footer: [
                    {name: "HOME", link:"/home.php"},
                    {name: "CONTACT US", link:"/contact.php"},
                    {name: "FEEDBACK", link:"/guestbook.php"},
                    {name: "ADMIN", link:"/admin.php"}
                ]
            }, options);

            var sfcContainer = $('<div class="sfc-container"></div>');
            sfcContainer.append($('<div class="bordertop"></div>'));
            sfcContainer.append($('<div class="borderleft"></div>'));
            sfcContainer.append($('<div class="borderright"></div>'));
            sfcContainer.append($('<div class="header"></div>').append(that.generateButtons()));
            sfcContainer.append($('<div class="contentborder"></div>').append('<div class="content"></div>'));
            sfcContainer.append($('<div class="borderbottom"></div>'));

            sfcContainer.find(".content").append(main);
            sfcContainer.find(".borderbottom").append(that.generateFooter());
            sfcContainer.find(".borderbottom").append(that.generateCopyright());

            $("body").html("").append(sfcContainer);

            if ($.browser.msie) {
                $("body").prepend($('<div class="ieBrowserError"><img src="images/warning.png"/>This webpage is best viewed using <a href="http://www.mozilla.com/en-US/firefox/upgrade.html" target="_blank">Mozilla Firefox</a></div>'));
            }

            if (!$.browser.msie) {
                DD_roundies.addRule(".menuButtons", "5px", true);
                DD_roundies.addRule("#homeButton", "5px 0px 0px 5px", true);
            }

            main.show();
        },

        generateSecondaryWazzupPage: function(container, options) {
            options = $.extend({
                pageLink: "wazzup.php",
                selectedItem: "newsandevents",
                sidenavTitle: "Wazzup",
                sidenavItems: [
                    {id: "newsandevents", name:"News & Events", page:"content/wazzup/newsandevents/newsandevents.php", subItems: [
                        {id: "news", name: "News", page:"content/wazzup/newsandevents/news.php"},
                        {id: "events", name: "Events", page:"content/wazzup/newsandevents/events.php"},
                        {id: "announcements", name: "Announcements", page:"content/wazzup/newsandevents/announcements.php"}
                    ]},
                    {id: "features", name:"Features", page:"content/wazzup/features/features.php", subItems: [
                        {id: "faith", name: "Faith Articles", page:"content/wazzup/features/faith.php"},
                        {id: "blogs", name: "Blogs", page:"content/wazzup/features/blogs.php"},
                        {id: "media", name: "Media", page:"content/wazzup/features/media.php"}
                    ]}
                ]
            }, options);
            this.generateSecondaryPage(container, options);
        },

        generateSecondaryAboutUsPage: function(container, options) {
            options = $.extend({
                pageLink: "aboutus.php",
                selectedItem: "whoweare",
                sidenavTitle: "About Us",
                sidenavItems: [
                    {id: "whoweare", name:"Who We Are", page:"content/aboutus/whoweare.php"},
                    //{id: "history", name:"History", page:"content/aboutus/history.php"},
                    {id: "missionvision", name:"Mission & Vision", page:"content/aboutus/missionvision.php"},
                    {id: "corevalues", name:"Core Values", page:"content/aboutus/corevalues.php"},
                    //{id: "faqs", name:"FAQs", page:"content/aboutus/faqs.php"},
                    {id: "links", name:"Links", page:"content/aboutus/links.php"}
                ]
            }, options);
            this.generateSecondaryPage(container, options);
        },

        generateSecondaryGuestbookPage: function(container, options) {
            options = $.extend({
                pageLink: "guestbook.php",
                selectedItem: "addentry",
                sidenavTitle: "Guestbook",
                sidenavItems: [
                    {id: "addentry", name:"Add an Entry", page:"content/guestbook/addentry.php"},
                    {id: "viewentries", name:"View Entries", page:"content/guestbook/viewentries.php"}
                ]
            }, options);
            this.generateSecondaryPage(container, options);
        },

        generateSecondaryAdminPage: function(container, options) {
            options = $.extend({
                pageLink: "admin.php",
                selectedItem: "documents",
                sidenavTitle: "Admin",
                sidenavItems: [
                    {id: "documents", name:"Documents", /* subinfo:"(Blogs, News, etc..)", */page:"content/admin/document/documentlist.php", subItems: [
                        {id: "adddocument", name:"Add Document", display: "false", page:"content/admin/document/adddocument.php"},
                        {id: "editdocument", name:"Edit Document", display: "false", page:"content/admin/document/editdocument.php"},
                        {id: "selectblog", name:"Select Featured Blog", page:"content/admin/document/selectfeatureditem.php?docType="+SFC.Document.Types.BLOG},
                        {id: "selectnews", name:"Select Featured News", page:"content/admin/document/selectfeatureditem.php?docType="+SFC.Document.Types.NEWS}
                    ]},
                    {id: "events", name:"Events", page:"content/admin/event/eventlist.php", subItems: [
                        {id: "addevent", name:"Add Event", display: "false", page:"content/admin/event/addevent.php"},
                        {id: "editevent", name:"Edit Event", display: "false", page:"content/admin/event/editevent.php"}
                    ]},
                    {id: "announcements", name:"Announcements", page:"content/admin/announcement/announcementlist.php", subItems: [
                        {id: "addannouncement", name:"Add Announcement", display: "false", page:"content/admin/announcement/addannouncement.php"},
                        {id: "editannouncement", name:"Edit Announcement", display: "false", page:"content/admin/announcement/editannouncement.php"}
                    ]},
                    {id: "media", name:"Media", page:"content/admin/media/medialist.php", subItems: [
                        {id: "addmedia", name:"Add Media", display: "false", page:"content/admin/media/addmedia.php"},
                        {id: "editmedia", name:"Edit Media", display: "false", page:"content/admin/media/editmedia.php"},
                        {id: "selectmedia", name:"Select Featured Media", page:"content/admin/media/selectfeaturedmedia.php"}
                    ]},
                    {id: "members", name:"Members", page:"content/admin/member/memberlist.php", subItems: [
                        {id: "addmember", name:"Add Member", display: "false", page:"content/admin/member/addmember.php"},
                        {id: "editmember", name:"Edit Member", display: "false", page:"content/admin/member/editmember.php"}
                    ]},
                    {id: "membergroups", name:"Member Groups", page:"content/admin/membergroup/membergrouplist.php", subItems: [
                        {id: "addmembergroup", name:"Add Member Group", display: "false", page:"content/admin/member/addmembergroup.php"},
                        {id: "editmembergroup", name:"Edit Media Group", display: "false", page:"content/admin/member/editmembergroup.php"}
                    ]}
                ]
            }, options);
            this.generateSecondaryPage(container, options);
        },

        generateSecondaryMemberPage: function(container, options) {
            options = $.extend({
                pageLink: "member.php",
                selectedItem: "checkmessages",
                sidenavTitle: "Member's Corner",
                sidenavItems: [
                    {id: "memberhome", name:"Member's Home", page:"content/member/memberhome.php"}
                ]
            }, options);
            this.generateSecondaryPage(container, options);
        },

        generateSecondaryPage: function(container, options) {
            options = $.extend({
                selectedItem: "",
                selectedSubItem: "",
                sidenavTitle: "",
                sidenavItems: [],
                generateSelectedContent: true,
                queryString: ""
            }, options);

            container.prepend(this.generateSideNav(options));
            if (options.generateSelectedContent) {
                container.append(this.generateSecondaryContent(options));
            }
        },

        generateButtons: function() {
            var menuButtons = $('<ul class="menuButtons"></ul>');
            var isMember = this.hasLoggedInUser();
            for (var i=0; i<this.buttons.length; i++) {
                if (isMember || this.buttons[i].member !== "true") {
                    menuButtons.append(this.generateButton(this.buttons[i].name, this.buttons[i].id, this.buttons[i].link, this.buttons[i].submenus));
                }
            }
            menuButtons.append($('<li class="loginArea"></li>').append(this.generateLogin()));
            return menuButtons;
        },

        generateButton: function(title, id, link, submenus) {
            var ddmenuitem = 0;
            var button = $('<li></li>').append($('<a/>').text(title));

            if (submenus && submenus != undefined && submenus.length > 0) {
                var ul = $('<ul></ul>');
                for (var i=0; i < submenus.length; i++) {
                    var li = $('<li></li>').append($('<a href="'+((submenus[i].link == undefined) ? '#' : submenus[i].link)+'"/>')
                                           .text(submenus[i].name));
                    li.click(function() {
                        window.location.href = $(this).find('a').attr("href");
                    });
                    ul.append(li);
                }
                ul.click(function(){return false;});
                button.append(ul);
            }

            button.click(function() {
                window.location.href = ((link == undefined) ? '#' : link);
            });

            button.hover(function() {
                $(this).addClass('menuHover');
                if(ddmenuitem) ddmenuitem.css('visibility', 'hidden');
                ddmenuitem = $(this).find('ul').css('visibility', 'visible');
            }, function() {
                $(this).removeClass('menuHover');
                if(ddmenuitem) ddmenuitem.css('visibility', 'hidden');
            });

            if (id && id != undefined) {
                button.attr("id", id);
            }

            if (this.selectedMenu == title) {
                button.addClass("selected");
            }

            return button;
        },

        generateLogin: function() {
            var that = this;
            var loginArea = $('<div></div>');
            var buttonLink = $('<a/>');
            if (this.hasLoggedInUser()) {
                var username = this.getLoggedInUserName();
                loginArea.text("Hello " + username + " | ");
                var logout = $('<span class="loginLabel">logout</div>');
                logout.bind("click", function (){
                    that.logout();
                });
                loginArea.append(logout);
            } else {
                loginArea.append($('<span class="loginLabel">sign in</div>'));
                loginArea.bind("click", function (){
                    window.location.href = "login.php";
                });
                loginArea.hover(function() {
                    $(this).css("cursor", "pointer");
                }, function() {
                    $(this).css("cursor", "default");
                })
            }
            return loginArea;
        },

        generateFooter: function() {
            var footer = $('<div class="footer"></div>');
            var footerString = "";
            for (var i=0; i<this.footer.length; i++) {
                if (i > 0) {
                    footerString += "&nbsp;&nbsp;|&nbsp;&nbsp;";
                }
                footerString += "<a href='" + this.footer[i].link + "'>" + this.footer[i].name + "</a>";
            }
            footer.html(footerString);
            return footer;
        },

        generateCopyright: function() {
            return $('<div class="copyright">Copyright &copy; 2009 CFC Singles For Christ San Francisco/Peninsula Chapter</div>');
        },

        generateSideNav: function(options) {
            var that = this;
            var sidenav = $('<div class="sidenav"/>');
            var sidenavheader = $('<div/>');
            var sidenavitemsparent = $('<div class="sidenavitems"/>');
            var sidenavitems = $('<ul/>').appendTo(sidenavitemsparent);

            var sidenavHasDisplayableSubItems = function(sidenav) {
                if (sidenav && sidenav.subItems) {
                    for (var j=0; j<sidenav.subItems.length; j++) {
                            if (sidenav.subItems[j].display !== "false") return true;
                    }
                }
                return false;
            };

            sidenavheader.append($('<h1/>').html(options.sidenavTitle));

            for (var i=0; i<options.sidenavItems.length; i++) {
                var item = $('<li></li>').text(options.sidenavItems[i].name);
                if (options.sidenavItems[i].subinfo && options.sidenavItems[i].subinfo != "") {
                     item.append($('<span class="subinfo"></span>').text(options.sidenavItems[i].subinfo));
                }
                that.bindHoverToPointer(item);
                item.attr('ordinal', i);
                if (options.selectedItem == options.sidenavItems[i].id) {
                    item.addClass("selected");
                }
                item.click(function(e){
                    var index = $(this).attr('ordinal');
                    window.location.href = options.pageLink + "?page=" + options.sidenavItems[index].id;
                });
                sidenavitems.append(item);

                if (sidenavHasDisplayableSubItems(options.sidenavItems[i])) {
                    var subitemparent = $('<ul/>');
                    for (var j=0; j<options.sidenavItems[i].subItems.length; j++) {
                        if (options.sidenavItems[i].subItems[j].display === "false") continue;
                        var subitem = $('<li></li>').text(options.sidenavItems[i].subItems[j].name);
                        that.bindHoverToPointer(subitem);
                        subitem.attr('firstordinal', i);
                        subitem.attr('secondordinal', j);
                        if (options.selectedSubItem == options.sidenavItems[i].subItems[j].id) {
                            subitem.addClass("selected");
                        }
                        subitem.click(function(e) {
                            var i = $(this).attr('firstordinal');
                            var j = $(this).attr('secondordinal');
                            window.location.href = options.pageLink + "?page=" + options.sidenavItems[i].id + "&subpage=" + options.sidenavItems[i].subItems[j].id;
                        });
                        subitemparent.append(subitem);
                    }
                    sidenavitems.append($('<li class="noline"/>').append(subitemparent));
                }
            }

            sidenav.append(sidenavheader).append(sidenavitemsparent);

            return sidenav;
        },

        generateSecondaryContent: function(o) {
            if (o.sidenavItems == undefined || o.sidenavItems.length == 0) {
                return "";
            }
            var link = "",
                name = "",
                params = o.queryString;

            var pagecontent = $('<div class="pagecontent"/>');

            o.selectedItem = o.selectedItem || o.sidenavItems[0].id;
            if (o.selectedSubItem && o.selectedSubItem != "") {
                for (var i=0; i<o.sidenavItems.length; i++) {
                    if (o.sidenavItems[i].id == o.selectedItem) {
                        if (o.sidenavItems[i].subItems) {
                            for (var j=0; j<o.sidenavItems[i].subItems.length; j++) {
                                if (o.selectedSubItem == o.sidenavItems[i].subItems[j].id) {
                                    name = o.sidenavItems[i].subItems[j].name;
                                    link = o.sidenavItems[i].subItems[j].page;
                                }
                            }
                        } else {
                            name = o.sidenavItems[i].name;
                            link = o.sidenavItems[i].page;
                            break;
                        }
                        break;
                    }
                }
            } else {
                for (var i=0; i<o.sidenavItems.length; i++) {
                    if (o.sidenavItems[i].id == o.selectedItem) {
                        name = o.sidenavItems[i].name;
                        link = o.sidenavItems[i].page;
                        break;
                    }
                }
            }

            if (link) {
                this.setTitle(name)
                pagecontent.load(link, params);
            }

            return pagecontent;
        },

        /**
         * Disable/Enable all elements in a given form.
         * @param form the form to change
         * @param disable true if we will disable the form, false to enable
         */
        toggleFormElements: function(form, disable) {
            if (disable) {
                form.find(':input').attr("disabled", "disabled");
            } else {
                form.find(':input').removeAttr("disabled");
            }
        },

        /**
         * Changes item cursor on hover
         * @param item
         * @param cursor
         */
        bindHoverToPointer: function(item, cursor) {
            cursor = cursor || 'pointer';
            item.hover(function(){item.css("cursor", cursor);},
                    function(){item.css("cursor", "default");});
        },

        /**
         * Initializes the pager, given the number of records and the current page number
         */
        initPager: function(pagenumber, pagecount, callback) {
            var that = this;

            // add new pager
            var pagerElement = $('<div id="pager"/>');

            if ($("#pager").val() != undefined) {
                $("#pager").replaceWith(pagerElement);
            } else {
                $("#outer_pager").prepend(pagerElement);
            }

            pagerElement.pager({
                pagenumber: pagenumber,
                pagecount: pagecount,
                buttonClickCallback: function(page) {
                    callback(page);
                }
            });
        },

        stripHTML: function (oldString) {
            var newString = "";
            var inTag = false;
            for(var i = 0; i < oldString.length; i++) {
                if(oldString.charAt(i) == '<') inTag = true;
                if(oldString.charAt(i) == '>') {
                    if(oldString.charAt(i+1)=="<")
                    {
                        //dont do anything
                    }
                    else
                    {
                        inTag = false;
                        i++;
                    }
                }

                if(!inTag) newString += oldString.charAt(i);
            }

            return newString;
        }
    };
}());

SFC.Code = (function() {
    var eventTypes, docTypes, mediaTypes, contactTypes;

    /**
     * Retrieves the code types (doc, event, media) via ajax
     * @param url
     * @param funcName
     */
    function getCodeTypesViaAjax(url, funcName) {
        var codeTypeJson = {};

        $.ajax({
            url: url,
            data: {
                func: funcName
            },
            async: false,
            type: "GET",
            contentType: "application/json",
            success: function(res) {
                if (res && $.trim(res) != "") {
                    codeTypeJson = JSON.parse(res);
                }
            }
        });

        return codeTypeJson;
    }

    function getCodeTypes(url, func) {
        var returnMap = new Array();
        var jsonCodes = getCodeTypesViaAjax(url, func);
        
        if (jsonCodes) {
            for (var i=0; i<jsonCodes.length; i++) {
                returnMap[jsonCodes[i].ID] = jsonCodes[i].Description;
            }
            return returnMap;
        }
        return {};
    }

    return {
        getEventTypes : function() {
            eventTypes = eventTypes || getCodeTypes("lib/util.event.php", "getEventTypes");
            return eventTypes;
        },

        getDocumentTypes : function() {
            docTypes = docTypes || getCodeTypes("lib/util.document.php", "getDocumentTypes");
            return docTypes;
        },

        getMediaTypes : function() {
            mediaTypes = mediaTypes || getCodeTypes("lib/util.media.php", "getMediaTypes");
            return mediaTypes;
        },

        getContactTypes : function() {
            contactTypes = contactTypes || getCodeTypes("lib/util.member.php", "getContactTypes");
            return contactTypes;
        }
    };
}());

isSysAdmin = function () {
    return SFC.Container.isLoggedInUserASysAdmin();
};

setupCheckboxToggles = function(cbName, cbAllId) {
    $("input[name='"+cbName+"']").click(function() {
        $("#"+cbAllId).attr("checked", "checked");
        if ($("input[name='"+cbName+"']").size() != $("input[name='"+cbName+"']:checked").size()) {
            $("#"+cbAllId).attr("checked", "");
        }
    });
    $("#"+cbAllId).click(function() {
        var checked_status = this.checked;
        $("input[name='"+cbName+"']").each(function(){
            this.checked = checked_status;
        });
    });
    $("#"+cbAllId).attr("checked", ($("input[name='"+cbName+"']").size() != $("input[name='"+cbName+"']:checked").size()) ? "" : "checked");
};

calcTime = function(d, offset) {
    // convert to msec
    // add local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    return new Date(utc + (3600000*offset));
};

format_mysqldate = function(mysqldate) {
    // example mysql date: 2008-01-27 20:41:25
    // we need to replace the dashes with slashes
    var date = String(mysqldate).replace(/\-/g, '/');
    return format_date(date);
};

format_date = function(date) {
    // date can be in msec or in a format recognized by Date.parse()
    var d = new Date(date);
    d.addHours(-7);

    var hour = d.getHours();
    var minute = d.getMinutes();
    var am_pm = 'am';

    if(hour == 0) {
        hour = 12;
    } else if (hour == 12) {
        am_pm = 'pm';
    } else if (hour > 12) {
        hour -= 12;
        am_pm = 'pm';
    }
    if(minute < 10) { minute = '0'+minute; }

    return d.getDayName(true) + ' ' + d.asString('mmm d yyyy') + ' ' + hour + ':' + minute + am_pm;
};

getDisplayDate = function(mysqldate) {
    if (mysqldate && mysqldate != "") {
        var d = new Date(String(mysqldate).replace(/\-/g, '/'));

        return d.asString('mm/dd/yyyy');
    }
    return "";
};

getDisplayDateTime = function(mysqldate) {
    if (mysqldate && mysqldate != "") {
        var d = new Date(String(mysqldate).replace(/\-/g, '/'));

        // make sure to handle UTC
        d.addHours(-7);

        var hour = d.getHours();
        var minute = d.getMinutes();
        var seconds = d.getSeconds();
        if(hour < 10) { hour = '0'+hour; }
        if(minute < 10) { minute = '0'+minute; }
        if(seconds < 10) { seconds = '0'+seconds; }

        return d.asString('mm/dd/yyyy') + ' ' + hour + ':' + minute + ':' + seconds;
    }
    return "";
};

error = function(msg) {
    alert(msg);
}

