﻿/// <reference path="/Custom/Ui/Common/js/jquery-1.4.4-vsdoc.js" />


var valtech = valtech || {};

valtech.list = (function () {

    // Used to ensure, that we only display one spinner
    var isLoading = false;

    function handlePageNumberClick(event) {
        var wrapper = $(this).parents('.mylist-wrapper')[0];
        wrapper.data.searchdata.startIndex = $(this).data().start;
        search.performSearch(wrapper);
    }

    function initPaging(wrapper) {
        var data = wrapper.data;
        $('.listpagenumbers', wrapper).delegate("li", "click", handlePageNumberClick);
        $('.prev', wrapper).bind("click", function prev(event) {
            wrapper.data.searchdata.startIndex = data.searchdata.startIndex - data.config.resultstodisplay;
            search.performSearch(wrapper);
        });
        $('.next', wrapper).bind("click", function next(event) {
            wrapper.data.searchdata.startIndex = data.searchdata.endIndex + 1;
            search.performSearch(wrapper);
        });
    }

    var init = function () {
        var st = helpers.getParameterByName('st');
        if (st && st.length > 0)
            $('#searchcriteria').find('.sitesearch-field').val(st);

        $(window).bind('hashchange', function (e) {
            st = helpers.getParameterByName('st');

            if (st && st.length > 0) {
                $('#searchcriteria').find('.sitesearch-field').val(st);
            }

            $('.mylist-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.config')[0].innerHTML)[0];
                search.performSearch(this);                
                initPaging(this);
            });

            $('.didyoumean-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.dymconfig')[0].innerHTML)[0];
                search.getSearchTermSuggestions(this);
            });

            $('.tweetlist-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.config')[0].innerHTML)[0];
                tweets.updateTweets(this);
            });

            $('.tag-cloud-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.config')[0].innerHTML)[0];
                search.GetTagCloud(this);
            });

            $('.archive-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.config')[0].innerHTML)[0];
                search.GetArchive(this);
            });

            $('.related-pages-wrapper').each(function (index) {
                this.data = JSON2.parse($(this).find('script.config')[0].innerHTML)[0];
                search.GetRelatedPages(this);
            });

        });

        // Since the event is only triggered when the hash changes, we need to trigger
        // the event now, to handle the hash the page may have loaded with.
        $(window).trigger('hashchange');
    };

    var tweets = {
        updateTweets: function (wrapper) {
            var list = $(wrapper).find('.tweetlist');
            data = wrapper.data;

            var tweetSpinner = new valtech.spinnerOverlay(list);

            $.getJSON('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=' + data.config.username + '&count=' + data.config.numberoftweets + '&callback=?', function (resp) {
                $.get('/Custom/Ui/Common/templates/tweetlist.tmpl.txt', function (template) {
                    tweetSpinner.hide();
                    list.empty();
                    $.tmpl(template, resp).appendTo(list);
                });
            });

            // Since we aren't informed when the cross-domain call to the Twitter service fails,
            // we remove the spinner after 10 seconds
            setTimeout(function () {
                tweetSpinner.hide();
            }, 10000);
        }
    };

    var helpers = {
        getParameterByName: function (name) {
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\#&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(window.location.href);
            if (results == null)
                return "";
            else
                return decodeURIComponent(results[1].replace(/\+/g, " "));
        },
        getSerializedDate: function (value) {
            return dateDeserialize(value).toLocaleDateString();
        },
        dateDeserialize: function (dateStr) {
            return eval('new' + dateStr.replace(/\//g, ' '));
        },
        pretty_date: function (date_str) {
            var cleanedDate = new Date(date_str.replace(/^\w+ (\w+) (\d+) ([\d:]+) \+0000 (\d+)$/, "$1 $2 $4 $3 UTC"));
            var seconds = (new Date - cleanedDate) / 1000;
            var token = 'ago', list_choice = 1;
            if (seconds < 0) {
                seconds = Math.abs(seconds);
                token = 'from now';
                list_choice = 2;
            }
            var i = 0, format;
            while (format = time_formats[i++]) if (seconds < format[0]) {
                if (typeof format[2] == 'string')
                    return format[list_choice];
                else
                    return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
            }
            return date_str;
        }
    };

    var time_formats = [
          [60, 'just now', 1], // 60
          [120, '1 minute ago', '1 minute from now'], // 60*2
          [3600, 'minutes', 60], // 60*60, 60
          [7200, '1 hour ago', '1 hour from now'], // 60*60*2
          [86400, 'hours', 3600], // 60*60*24, 60*60
          [172800, 'yesterday', 'tomorrow'], // 60*60*24*2
          [604800, 'days', 86400], // 60*60*24*7, 60*60*24
          [1209600, 'last week', 'next week'], // 60*60*24*7*4*2
          [2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7
          [4838400, 'last month', 'next month'], // 60*60*24*7*4*2
          [29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4
          [58060800, 'last year', 'next year'], // 60*60*24*7*4*12*2
          [2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12
          [5806080000, 'last century', 'next century'], // 60*60*24*7*4*12*100*2
          [58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100
        ];

    var search = {
        result: {
            resultItems: 0,
            totalResults: 0
        },
        searchRequest: {},
        performSearch: function (wrapper) {
            var list = $(wrapper).find('.mylist'),
		    data = wrapper.data;
            data.searchdata.endIndex = parseInt(data.searchdata.startIndex) + parseInt(data.config.resultstodisplay) - 1;
            var sitesearchFieldValue = $('#searchcriteria').find('.sitesearch-field').val();

            if (sitesearchFieldValue && sitesearchFieldValue.length > 0) {
                data.searchdata.searchTerm = sitesearchFieldValue;
                data.searchdata.highlightSearchTerms = 'true';
            }

            var categories = helpers.getParameterByName('cats');
            if (categories && categories.length > 0)
                data.searchdata.categories = categories;

            var fromdate = helpers.getParameterByName('fromdate');
            if (fromdate && fromdate.length > 0) {
                data.searchdata.fromdate = fromdate;
            }

            var todate = helpers.getParameterByName('todate');
            if (todate && todate.length > 0) {
                data.searchdata.todate = todate;
            }

            var author = helpers.getParameterByName('author');
            if (author && author.length > 0) {
                data.searchdata.author = author;
            }

            search.searchRequest.searchRequest = data.searchdata;
            search.searchRequest.searchRequest.exclude = data.config.exclude;
            search.searchRequest.searchRequest.pageId = data.config.pageId;

            if (!isLoading || $(list).length === 0) {
                var searchSpinner = new valtech.spinnerOverlay(list);
                isLoading = true;
            }

            $('#load-wrapper').hide();

            $.ajax({
                url: '/Custom/ContentFunctions/Search/Search.svc/ExecuteSearch',
                data: JSON2.stringify(search.searchRequest),
                dataType: 'json',
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                success: function (resp) {
                    $.get('/Custom/Ui/Common/templates/list/' + data.config.listtemplate + '.tmpl.txt', function (template) {
                        search.result.resultItems = resp.d.ResultSet;
                        search.result.totalResults = resp.d.TotalResults;

                        if (searchSpinner) {
                            searchSpinner.hide();
                            isLoading = false;
                        }

                        list.empty();

                        $.tmpl(template, resp).appendTo(list);

                        FB.XFBML.parse();

                        if (data.config.listtemplate === "thumbnails") {
                            search.setupThumbnailList(wrapper, data);
                        }

                        search.setupPaging(wrapper, data, resp.d.TotalResults);
                        $('#load-wrapper').show();
                    });
                }
            });
        },
        setupThumbnailList: function (wrapper, data) {
            var totalImages = $(".thumbslider .thumbs > li").length,
            imageWidth = $(".thumbslider .thumbs > li:first").outerWidth(true),
            totalWidth = imageWidth * totalImages;
            $(".thumbslider .thumbs").width(totalWidth);
        },
        setupPaging: function (wrapper, data, totalResults) {
            var resultsPerPage = Number(data.config.resultstodisplay)
            var numberOfPages = totalResults / resultsPerPage;
            if (data.config.displaypaging == 'true' && numberOfPages > 1) {
                $('.paging', wrapper).show();
                var pageNumbers = $('.listpagenumbers', wrapper).empty();
                for (var i = 0; i < numberOfPages; i++) {
                    pageNumbers.append($('<li class="listpagenumber" style="cursor: pointer;">' + (i + 1) + '</li>').data('start', i * resultsPerPage + 1));
                }
                if (data.searchdata.startIndex <= 1)
                    $(".prev", wrapper).hide();
                else {
                    $(".prev", wrapper).show();
                }
                if (data.searchdata.startIndex + resultsPerPage > parseInt(totalResults))
                    $(".next", wrapper).hide();
                else {
                    $(".next", wrapper).show();
                }
            }
            else
                $(wrapper).find('.paging').hide();
        },
        GetTagCloud: function (wrapper) {
            var list = $(wrapper).find('.tag-cloud'),
		        data = wrapper.data;

            data.searchdata.endIndex = parseInt(data.searchdata.startIndex) + parseInt(data.config.resultstodisplay) - 1;

            var sitesearchFieldValue = $('.searchcriteria').find('#sitesearch-field').val();
            var st = helpers.getParameterByName('st');

            if ((sitesearchFieldValue && sitesearchFieldValue.length > 0) || (st && st.length > 0)) {
                data.searchdata.searchTerm = sitesearchFieldValue;
                if (!data.searchdata.searchTerm || data.searchdata.searchTerm.length == 0)
                    data.searchdata.searchTerm = st;
                data.searchdata.highlightSearchTerms = 'true';
            }

            var searchRequest = {};
            searchRequest.searchRequest = data.searchdata;

            if (!isLoading || $(".tagcloudlist").length === 0) {
                var tagSpinner = new valtech.spinnerOverlay(list);
                isLoading = true;
            }

            $.ajax({
                url: '/Custom/ContentFunctions/Search/Search.svc/TagCloud',
                data: JSON2.stringify(searchRequest),
                dataType: 'json',
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                success: function (json) {
                    json.d.resultpageurl = data.config.resultpageurl;
                    $.get('/Custom/Ui/Common/templates/tagcloud.tmpl.txt', function (template) {
                        if (tagSpinner) {
                            tagSpinner.hide();
                            isLoading = false;
                        }
                        list.empty();
                        $.tmpl(template, json).appendTo(list);
                    });
                },
                error: function () {
                    if (tagSpinner) {
                        tagSpinner.hide();
                        isLoading = false;
                    }
                    $("<div style='height: 80px;'></div>");
                    return "Error creating tag cloud";
                }
            });
        },

        GetArchive: function (wrapper) {
            var list = $(wrapper).find('.archive'),
		        data = wrapper.data;

            data.searchdata.endIndex = parseInt(data.searchdata.startIndex) + parseInt(data.config.resultstodisplay) - 1;

            var sitesearchFieldValue = $('.searchcriteria').find('#sitesearch-field').val();
            var st = helpers.getParameterByName('st');

            if ((sitesearchFieldValue && sitesearchFieldValue.length > 0) || (st && st.length > 0)) {
                data.searchdata.searchTerm = sitesearchFieldValue;
                if (!data.searchdata.searchTerm || data.searchdata.searchTerm.length == 0)
                    data.searchdata.searchTerm = st;
                data.searchdata.highlightSearchTerms = 'true';
            }

            var sb = helpers.getParameterByName('sb');
            if (sb && sb.length > 0) {
                data.searchdata.sortBy = "EC" + sb;
            }

            var sd = helpers.getParameterByName('sd');
            if (sd && sd.length > 0) {
                data.searchdata.sortAscending = (sd == '1');
            }

            var searchRequest = {};
            searchRequest.searchRequest = data.searchdata;

            if (!isLoading || $(list).height() === 0) {
                var archiveSpinner = new valtech.spinnerOverlay(list);
                isLoading = true;
            }

            $.ajax({
                url: '/Custom/ContentFunctions/Search/Search.svc/Archive',
                data: JSON2.stringify(searchRequest),
                dataType: 'json',
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                success: function (json) {
                    json.d.resultpageurl = data.config.resultpageurl;
                    json.d.todateparameter = data.config.todateparameter;
                    $.get('/Custom/Ui/Common/templates/archive.tmpl.txt', function (template) {
                        if (archiveSpinner) {
                            archiveSpinner.hide();
                            isLoading = false;
                        }
                        list.empty();
                        $.tmpl(template, json).appendTo(list);
                    });
                },
                error: function () {
                    if (archiveSpinner) {
                        archiveSpinner.hide();
                        isLoading = false;
                    }
                    return "Error creating archive";
                }
            });
        },
        GetRelatedPages: function (wrapper) {
            var list = $(wrapper).find('.related-pages'),
		        data = wrapper.data;
            data.searchdata.endIndex = parseInt(data.searchdata.startIndex) + parseInt(data.config.resultstodisplay) - 1;

            var sitesearchFieldValue = $('.searchcriteria').find('#sitesearch-field').val();
            var st = helpers.getParameterByName('st');

            if ((sitesearchFieldValue && sitesearchFieldValue.length > 0) || (st && st.length > 0)) {
                data.searchdata.searchTerm = sitesearchFieldValue;
                if (!data.searchdata.searchTerm || data.searchdata.searchTerm.length == 0)
                    data.searchdata.searchTerm = st;
                data.searchdata.highlightSearchTerms = 'true';
            }

            var searchRequest = {};
            searchRequest.searchRequest = data.searchdata;
            searchRequest.searchRequest.exclude = data.config.exclude;
            searchRequest.searchRequest.pageId = data.config.pageId;

            if (!isLoading || $(list).height() === 0) {
                var relatedSpinner = new valtech.spinnerOverlay(list);
                isLoading = true;
            }
            //var relatedSpinner = new valtech.spinnerOverlay(list);

            $.ajax({
                url: '/Custom/ContentFunctions/Search/Search.svc/ExecuteSearch',
                data: JSON2.stringify(searchRequest),
                dataType: 'json',
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                success: function (json) {
                    if (json.d.ResultSet.length === 0) {
                        $(".related-pages-wrapper").hide();
                        if (relatedSpinner) {
                            relatedSpinner.hide();
                            isLoading = false;
                        }
                        return;
                    }

                    $.get('/Custom/Ui/Common/templates/relatedpages.tmpl.txt', function (template) {
                        if (relatedSpinner) {
                            relatedSpinner.hide();
                            isLoading = false;
                        }
                        list.empty();
                        $.tmpl(template, json).appendTo(list);
                    });

                },
                error: function () {
                    if (relatedSpinner) {
                        relatedSpinner.hide();
                        isLoading = false;
                    }
                    return "Error creating related pages";
                }
            });
        },
        getSearchTermSuggestions: function (wrapper) {
            var list = $(wrapper).find('.didyoumean'),
		    data = wrapper.data;

            var sitesearchFieldValue = $('#searchcriteria').find('.sitesearch-field').val();
            if (sitesearchFieldValue && sitesearchFieldValue.length > 0) {
                data.searchTerm = sitesearchFieldValue;
            }

            if (!isLoading || $(list).height() === 0) {
                var searchSpinner = new valtech.spinnerOverlay(list);
                isLoading = true;
            }

            $.ajax({
                url: '/Custom/ContentFunctions/Search/Search.svc/DidYouMean',
                data: JSON2.stringify(data),
                dataType: 'json',
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                success: function (json) {
                    if (searchSpinner) {
                        searchSpinner.hide();
                        isLoading = false;
                    }
                    list.empty();
                    $('#DidYouMeanTemplate').tmpl(json).appendTo(list);
                },
                error: function () {
                    if (searchSpinner) {
                        searchSpinner.hide();
                        isLoading = false;
                    }
                    return "Error generating paging";
                }
            });
        }
    };

    return {
        init: init,
        helpers: helpers
    }
})();

function getNumberOfComments(id) {
    $.get('/Custom/ContentFunctions/Comment/CommentService.svc/GetNumberOfComments/?id=' + id, function (numberOfComments) {
        $('#comment' + id).text(numberOfComments);
    });
    return "&nbsp;";
}

function DateDeserialize(dateStr) {
    return eval('new' + dateStr.replace(/\//g, ' '));
}

function getDate(dateStr) {
    var theDate = DateDeserialize(dateStr).getDate();
    if (theDate < 10) {
        theDate = "0" + theDate;
    }
    return theDate;
}

function getYear(dateStr) {
    return DateDeserialize(dateStr).getFullYear();
}

function stripTags(inputString) {
    return inputString.replace(/<\/?[^>]+>/gi, '');
};

$(document).ready(function () {
    $(valtech.list.init);
});
