﻿//
//  CLASS RandomAuthors
//
function RandomAuthors (container, options) {
    //  handle
    var me = this;
    //
    //  properties
    //
    me.authors = [];
    me.pages = [];
    me.pageCount = 0;
    me.currentPage = 1;
    me.el = {};
    me.opt = {
        'titleText': 'Random Authors',
        'xml': '/author/top_author_xml2.aspx',
        'imagePath': '',
        'linkPrefix': '',
        'perPage':3,
        'speed': 400,
        'easing': 'easeOutQuint'
    };
    //
    //  methods
    //
    me.renderAuthors = function (scrollArea) {
        for (var i = 0; i < me.authors.length; ++i) {
            me.authors[i].render(scrollArea);
        }
    };
    me.renderPagination = function () {
        me.el.pagination.html('');
        me.pageCount = Math.ceil(me.authors.length / me.opt['perPage']);
        for (var i = 1; i <= me.pageCount; i++) {
            var status = '';
            if (me.currentPage == i)
                status = ' class="active"';
            $('<span' + status + '>' + i + '</span>')
                .appendTo(me.el.pagination);
        }
        $("span", me.el.pagination).each(function(){
             var btn = new PageButton(me, $(this), $(this).text());
             me.pages.push(btn);
        });
    };
    me.render = function () {
        me.renderAuthors($(me.el.scrollArea));
        me.renderPagination();
    };
    me.loadAuthors = function () {
        $.ajax({
            url: (me.opt['xml']),
            cache: false,
            contentType: 'text/xml',
            success: function(xml) {
              
                
                 xml = text2xml(xml); // ie fix
              
                $("filedby", xml).each(function(i){
                    var author = this;
                    var pk = $("creatorId", author).text();
                    var fullName = $("creatorFullName", author).text();
                    var image = $("creatorImage", author).text();
                    var url = $("url", author).text();
                    var claimDate = $("creatorClaimDate", author).text();
                    var workFullTitle = '';
                    var workURL = '';
                    var workId = '';
                    $("filedby1", xml).each(function(i){
                        var work = this;
                        if ($("creatorId", work).text() == pk) {
                            workFullTitle = $("workFullTitle", work).text();
                            workId = $("creatorWorkId", work).text();
                            workURL = $("workURL",work).text();
                        }
                    });
                
                    me.authors[me.authors.length] = new Author(me, pk, fullName, image, url, claimDate,workURL, workFullTitle, workId);
                });
                me.randomize();
                me.render();
                
            }
        });
    };
    
    
    me.randomize = function (){me.authors.sort(function() {return (Math.round(Math.random())-0.5)});}
        
    
    me.scroll = function (amount) {
        //debugger;
        $.scrollTo.defaults.axis = 'x';
        me.el.scrollContainer.scrollTo(amount, me.opt['speed'], {easing:me.opt['easing']});
    }
    me.goToPage = function (target) {
       // debugger;
        if (target == me.currentPage)
            return false;
        var elTarget = me.authors[(target - 1) * me.opt['perPage']].el;
        me.scroll(elTarget);
        me.currentPage = target;
        $("span", me.el.pagination).each(function(){
            var btn = $(this);
            if (btn.text() != me.currentPage) {
                btn.removeClass('active');
            } else {
                btn.addClass('active');
            }
        });
        return true;
    };
    me.goNext = function () {
        //debugger;
        var target = parseInt(me.currentPage) + 1;
        if (target <= me.pageCount)
            me.goToPage(target);

    };
    me.goPrevious = function () {
           // debugger;
        var target = me.currentPage - 1;
        if (target > 0)
            me.goToPage(target);
    };
    me.init = function (){
        for (var index in me.opt) {
            if (typeof options[index] != "undefined")
                me.opt[index] = options[index];
        }
        me.el.container = $(container);
        var content = '';
                content += '<div class="leftButton button"></div>';
        content += '<div class="rightButton button"></div>';
        content += '<div class="scrollContainer">';
        content += '<div class="scrollArea"></div>';
        content += '</div>';
        content += '<div class="pagination"></div>';

        $(content).appendTo(container);
        me.loadAuthors();
        me.el = {
            scrollContainer: $(".scrollContainer", container),
            scrollArea: $(".scrollArea", container),
            pagination: $(".pagination", container),
            leftButton: $(".leftButton", container),
            rightButton: $(".rightButton", container)
        };
        me.el.leftButton.click(me.goPrevious);
        me.el.rightButton.click(me.goNext);
    };
    me.init();
};

//
//  CLASS Author
//
function Author (parent, pk, fullName, image, url, claimDate, workURL, workFullTitle, workId) {
    //  handle
    var me = this;
    //
    //  properties
    //
    me.el = {};
    me.pk = pk;
    me.fullName = fullName;
    me.image = image;
    me.url = parent.opt['linkPrefix'] + url;
    me.claimDate = claimDate;
    me.workURL = workURL;
    me.workFullTitle = workFullTitle;
    me.workId = workId;
    //
    //  methods
    //
    me.render = function (scrollArea) {
        var o = '';
        o += '<div class="author">';
        o += '<a href="/author/' + me.url +'/'+ me.pk+ '"><img width=100 src="'+ me.image + '" alt="' + me.fullName + '"></img></a><br />';
        o += '<h3><a href="/author/' + me.url +'/'+ me.pk+ '">' + me.fullName + '</a></h3>';
        o += '<p><a href="'+ me.workURL + '">' + me.workFullTitle + '</a><p>';
        o += '</div>';
        me.el = $(o).appendTo(scrollArea);

    }
};

//
//  CLASS PageButton
//
function PageButton (parent, element, pageNum) {
    //  handle
    var me = this;
    //
    //  properties
    //
    me.element = element;
    me.pageNum = pageNum;
    //
    //  methods
    //
    me.go = function() {
        parent.goToPage(me.pageNum);
    };
    me.init = function() {
        $(me.element).bind('click', me.go);
        return 0;
    };
    me.init();
    
};




var text2xml = function(s) { 
 var x, ie = /msie/i.test(navigator.userAgent); 
 try{ 
  var p = ie? new ActiveXObject("Microsoft.XMLDOM") : new DOMParser(); 
  p.async = false; 
 }catch(e){ throw new Error("XML Parser could not be instantiated") }; 
 try{ 
  if(ie) x = p.loadXML(s)? p : false; 
  else x = p.parseFromString(s, "text/xml"); 
 }catch(e){ throw new Error("Error parsing XML string") }; 
 return x; 
}; 

