var Drawer = {};
var Navbar = {};

Drawer.Model = (function(){
    var tabs = [];
    var last_known_height = null;
    var $ = jQuery;

    return {    
        drawer: "#drawer",
        drawerAdspace: "#drawerAdspace",
        mainTabs: "#main_tabs li",
        tabPanels: "div.ui-tabs-panel",
        tabWrapper: "#tab_wrapper", 
        controls: "#drawer_controls",
        openStandardLinks: "#drawer a.drawerOpen-standard",
        collapseStandardLinks: "#drawer a.drawerCollapse-standard",
        openFullLinks: "#drawer a.drawerOpen-full",
        collapseFullLinks: "#drawer a.drawerCollapse-full",
        busy: "#busy",        
      
        init: function(){},
        
        getTabList: function(){
            return $("#drawer_tabs-1");
        },

        getTab: function(tabId){
            if(typeof tabs[tabId] == 'undefined'){
              tabs[tabId] = $("#" + tabId);
            }
            return tabs[tabId];
        },
             
        setLastKnownHeight: function(){
            last_known_height = $(window).height();
        },
        
        getLastKnownHeight: function(){
            return last_known_height;
        },
        
        getMoreArchives: function(){
            var archives = $("#archives");
            var href = $(this).attr("href");
            DataSwitch.get({ 
                url: href,
                success: function(html){
                    Scroller.destroyAll();
                    $("#archives").html(html);
                    setTimeout(function(){
                        ViewHelper.makeScrollable();
                        Drawer.View.load_archives(true);
                    },500);
                }
            });
            return false;
        }
    }
})();

Drawer.View = (function(){
    var m = Drawer.Model;
    var $ = jQuery;
    var speed = 600;
    var current_size = Constants.standardDrawer;
    var drawer_spacer = null;
    
    function enable_resizing(){
        resize_vertically(); 
        var resizeTimer = null; 
        $(window).bind('resize',function(){
            if(resizeTimer) clearTimeout(resizeTimer);
            resizeTimer = setTimeout(resize_vertically,250);
        });
    }
 
    function resize_vertically(){
        var lkh = m.getLastKnownHeight() || 0;
        var wh = $(window).height()
        if(current_size != Constants.closedDrawer && lkh != wh && ((Math.abs(lkh - wh)/wh) > Constants.minHeightDelta)){
            Scroller.destroyAll();
            var size_delta = 0; 
            var options = options || {}; 
            var adspace_h = $(m.drawerAdspace).outerHeight(true) + 5; 
            var drawer_offset = parseInt($(m.drawer).css("top"),10); 
            var drawer_h = ViewHelper.height($(m.tabWrapper)); 
            var tabs_h = $("#main_tabs").outerHeight(true); 
            var starting_footprint = drawer_h + drawer_offset + adspace_h; 
            if(wh < starting_footprint){
                //window is shorter than the starting footprint - make drawer shorter
                var delta = starting_footprint - wh; 
                if((drawer_h - delta) <= tabs_h){
                    //we can't make the drawer shorter than the height of tabs
                    delta = (drawer_h - tabs_h);
                }
                delta = delta * -1;
            }else{
                //window is bigger than starting footprint - make drawer taller
                var delta = wh - starting_footprint; 
            }
            $(m.tabWrapper,$(m.drawer)).each(function(){
                var h = ViewHelper.height($(this)); 
                var nh = h + delta;
                $(this).css("height",nh);
            });
            ViewHelper.makeScrollable();
            m.setLastKnownHeight();
        }
    }
  
    function detect_read_mode(){
        if (PageModel.viewMode == 'read') {
            Drawer.View.adjustWidth(Constants.closedDrawer,0);
        }
    }

    function show_open_tab(){
        if(Drawer.View.open_tab){ 
            $("div.ui-tabs-panel",$(m.drawer)).removeClass('hidden');
        } 
    }
  
    function hide_open_tab(){
        if(Drawer.View.open_tab){ 
            $("div.ui-tabs-panel",$(m.drawer)).addClass('hidden');
        } 
    }
 
    function handle_drawer_resize_start(size){
        $(m.drawer).trigger({
            type:'resize_start',
            size:size
        });
        Drawer.View.resize_in_progress = true;
        hide_open_tab();
        $("#main_tabs, #tab_wrapper .tab_container").css('display','none');
        if(size == Constants.closedDrawer && PageElements.tabs.length > 0){
            $.each(PageElements.tabs,function(i){
                if(typeof PageElements.tabs[this]!="undefined"){
                    PageElements.tabs[this].tabs('select',PageElements.tabs[this].tabs('option','selected'));
                }           
            });
        }
        $(m.controls).css('display','none');
    }
  
    function handle_drawer_resize_stop(that){
          Drawer.View.resize_in_progress = false;
          $(m.tabPanels+",div.ui-slider-scroll-area",m.drawer).width("auto");
          $("#main_tabs, #tab_wrapper .tab_container").css('display','block');
          if(current_size != Constants.closedDrawer){
              show_open_tab();
              if(Drawer.View.open_tab && $(Drawer.View.open_tab.panel).is(":hidden")){
                  setTimeout(function(){
                      Drawer.View.reopenPreviousTab();
                  },250);
              }else{
                  setTimeout(function(){
                      ViewHelper.makeScrollable();
                  },250);
              }
              $("#drawerAdspace").css({position:"",left:'',visibility:"visible"});
              if(PageModel.viewMode!="scan"){
                  PageModel.viewMode='scan';
                  PageView.positionPages('scan');
              } 
          }else{
              $("#drawerAdspace").css({position:"absolute",left:'-1000px',visibility:"hidden"});
              PageModel.viewMode='read';
              PageView.positionPages('read')
          }
          $(m.controls).css('display','block');
          $(m.drawer).trigger({
              type:'resize_stop',
              size:current_size
          });
    }
  
    function handle_tab_select(e,ui){
        var selected_tab = $(ui.tab).attr("href");
        if($(ui.tab).hasClass("fullDrawer") && current_size < Constants.fullDrawer && !Drawer.View.resize_in_progress){
            Drawer.View.adjustWidth(Constants.fullDrawer);
        }else if(current_size == Constants.closedDrawer && !Drawer.View.resize_in_progress){
            Drawer.View.reopenPreviousTab(selected_tab);
            if(!Drawer.View.resize_in_progress){
                Drawer.View.adjustWidth(Constants.standardDrawer);
            }
        }    
    }
    
    function handle_tab_load(e,ui){
        // this next line resets the title of the tab for internationalization purposes
        // this same line is in preload_tabs() as this function is not called for tabs loaded through preload_tabs
        $(ui.tab).attr("title",$(ui.tab).attr("hover_title"));
        if(Drawer.View.resize_in_progress==false){
            tabify_sub_tabs(ui);
            if(typeof Drawer.View["load_"+ui.panel.id]=="function"){ 
                Drawer.View["load_"+ui.panel.id](); 
            } 
        }else{
            var myinterval = setInterval(function(){
                if(Drawer.View.resize_in_progress == false){
                    clearInterval(myinterval);
                    tabify_sub_tabs(ui);
                    if(typeof Drawer.View["load_"+ui.panel.id]=="function"){ 
                        Drawer.View["load_"+ui.panel.id](); 
                    } 
                }
            },100); 
        }
    }
    
    function do_show_tab(e,ui){
        $(ui.panel).removeClass("ui-tabs-hide");
        var subtabs = $("ul.subtabs",$(ui.panel));
        if(subtabs.length==0){
            Drawer.View.open_tab = ui;
            Drawer.View.tabs[ui.panel.id] = ui;
        }else{
            var active_subtab = $("div.ui-tabs-panel:visible",$(ui.panel));
            if(active_subtab.length){
                active_subtab_id = active_subtab.attr("id");
                Drawer.View.open_tab = Drawer.View.tabs[active_subtab_id];
                if(Drawer.View.open_tab && $(Drawer.View.open_tab.tab).hasClass("fullDrawer") && current_size < Constants.fullDrawer && !Drawer.View.resize_in_progress){
                    Drawer.View.adjustWidth(Constants.fullDrawer);
                }
            }
        }
        
        if(typeof Drawer.View["show_"+ui.panel.id]=="function"){ 
            Drawer.View["show_"+ui.panel.id](e,ui); 
        }
    }

    function size_iframe(panel){
    	$("iframe",panel).each(function(){
    		var h = $(panel).parent().height();
    		h -= 60;
    		$(this).attr('height',h);
    	});
    }

    function handle_tab_show(e,ui){ 
        ViewHelper.setupSprite(ui.panel);
        $(m.busy).css('display','none');
        do_show_tab(e,ui);

        size_iframe(ui.panel);

        if(Drawer.View.resize_in_progress==true){
            // we hide the open tab so it does not look funny while resizing 
            hide_open_tab();
            var myinterval = setInterval(function(){
                if(Drawer.View.resize_in_progress == false && $(ui.panel).is(":visible")){
                    clearInterval(myinterval);
                    show_open_tab();
                    ViewHelper.makeScrollable();
                }
            },100);
        }else{
            //in full screen it might take a bit longer to load and properly flow content
            setTimeout(function(){
                ViewHelper.makeScrollable();
            },700);
        }
    }

    /**
     * Preload data into the Drawer so that it will be available when the
     * drawers are opened.
     * 
     * NOTE:  Since this is loaded when we initally build the Webreader
     * UI, we apply the IE subscriber cookie Hack here to ensure that
     * initial calls to the server work from IE.
     * See SECTION E in documentHtmlFooter.ftl for an explanation.
     * 
     * 
     * @param that Calling context
     * @param i Tab index
     * @param x Panel index within a tab
     */
    function preload_tab(that,i,x){
        var href = that.data('load.tabs') || "";
        if(href.indexOf("#")!=0 && typeof $.data(that[0],'cache.tabs') != "boolean"){
            if (DocumentProperties.getSubIdCookieHack() === true) {
                href = DataSwitch.addSubId(href);
            }
            var panel = $(PageElements.tabs[i].data('tabs').panels[x]);
            if(panel.is(":visible")===false){
                $.data(that[0],'cache.tabs',true); 
                panel.html("<img class=\"busy\" src=\"/images/misc/ajax-loader.gif\" border=\"0\" style=\"margin:100px 15px;\" alt=\"loading\" />"); 
                panel.load(href,function(responseText, textStatus, XMLHttpRequest){
                    if(typeof Drawer.View["load_"+that[0].title]=="function"){ 
                        setTimeout(Drawer.View["load_"+that[0].title],1000); 
                    }
                    $(that).attr("title",$(that).attr("hover_title"));

                    if(textStatus!="success"){
                        ViewHelper.dataSwitchError.call(this,{},XMLHttpRequest, textStatus);
                    }
                }); 
            }
        }
    }
   
    function preload_tabs(){
        var preload_queue = [];
        var t_len = PageElements.tabs.length;
        for(var i=(t_len-1);i>=0;i--){
            var x = 0;
            PageElements.tabs[i].data('tabs').anchors.each(function(h,j){ 
                var that = $(this);
                var preload_i = function(that1,i1,x1){
                    return function(){preload_tab(that1,i1,x1);}
                }(that,i,x);
                 
                preload_queue.push(preload_i);
                x = x + 1; 
            });
        }
        ViewHelper.schedule(preload_queue,this,200);
    }
  
    function activate_preferred_tab(){
        var preferred_tab_hover_title = unescape(jQuery.url.param('tab'));
        var preferred_tab = $("a[hover_title='"+preferred_tab_hover_title+"']",$(m.drawer));
        setTimeout(function(){
            preferred_tab.trigger("click");
            setTimeout(function(){
                ViewHelper.makeScrollable($(preferred_tab.attr("href")));
            },1000);
        },1000);
    }

    /**
     * Call the jQuery _tabify plugin to build a tabbed UI structure
     * from an HTML list.
     * This is currently used by the Drawer to build a tabbed UI and
     * sets up the first drawer tab and loads content into the first
     * drawer.  Note that the first drawer is most likely from
     * /templates/tabs/inThisIssue.ftl.
     * 
     * NOTE:  Since this is loaded when we initally build the Webreader
     * UI, we apply the IE subscriber cookie Hack here to ensure that
     * initial calls to the server work from IE.
     * See SECTION E in documentHtmlFooter.ftl for an explanation.
     * 
     * @param dom_object The DOM element to tabify
     * @param parent_tab_index Index value of parent tab
     * @param parent_tab_href URL of parent tab
     */
    function tabify(dom_object,parent_tab_index,parent_tab_href){
        var ajaxData = "";
        if (DocumentProperties.getSubIdCookieHack() === true) {
            ajaxData = {"sub_id" : CookieManager.get("subscriber_id")};
        }
        starting_tab = PageModel.fullScreen || PageModel.viewMode == "read" ? null : 0;
        PageElements.tabs[PageElements.tabs.length] = dom_object.tabs({ 
            selected: starting_tab,
            select: handle_tab_select,
            load: handle_tab_load,
            show: handle_tab_show,
            cache: true,
            spinner: '',
            deselectable: false,
            ajaxOptions: {
              data : ajaxData,
              success:function(){},
              error:ViewHelper.dataSwitchError
            } 
        });

        if(typeof parent_tab_index != "undefined" && PageElements.tabs.length > 1){
            //we create an object that will lead us to a parent set of tabs
            dom_object.data('parent_tab_key',{
                'parent_tabs_object':PageElements.tabs.length-2,
                'parent_tabs_index':parent_tab_index,
                'parent_tabs_href':parent_tab_href
            });
        };

        var preloadInterval = setInterval(function(){
            if(Drawer.View.firstTabLoaded == true){
                clearInterval(preloadInterval);
                setTimeout(preload_tabs,1000);
                if(location.search.indexOf("tab=")!=-1){
                    activate_preferred_tab();
                }
            }
        },300);
    }
    
    function tabify_sub_tabs(ui){
        if(current_size != Constants.closedDrawer){
            Drawer.View.open_tab = ui;
        }
        var subtabs = $("ul.subtabs",ui.panel)
        // NOTE: ui-helper-reset is a class added by jquery ui tab plugin
        var subtabs_already_tabbed = $("ul.ui-helper-reset",ui.panel);
  
        // if there are subtabs that need to be activated...tabify them!
        if(subtabs.length > 0 && subtabs_already_tabbed.length == 0){
          tabify($("div.tab_container",ui.panel),ui.index,$(ui.tab).attr("href"));
        }
    }
  
    function page_thumb_click(e){
      var that = $(e.target);
      while (!$(that).is('#drawerPages')) {
          if(that.is('a')){
              e.preventDefault();
              e.stopPropagation();
              var href = that.attr("href");
              var page = jQuery.url.setUrl(href).param("pg"); 
              if(PageModel.normalPagesPageDivs().filter("[pg="+ page  +"]").length == 0){ 
                  PageController.handleGoToPage(page);
              }
              return;
          }
          that = $(that).parent();
      }
    }

    function toc_click(e){
        var that = $(e.target);
        if(that.is('a')){
            e.preventDefault();
            e.stopPropagation();
            if(that.hasClass('cover_link')){
                if(that.attr('id').indexOf("front") != -1){
//                    var cover_folio = PageController.getPageByFolio(/cover/i);
                    var cover_folio = PageController.getPageByFolio("cover");
                    page = cover_folio !== false ? cover_folio : PageModel.firstPage;
                } else {
                    page = PageModel.lastPage;
                }
            } else {
                var href = that.attr("href");
                var folio = jQuery.url.setUrl(href).param("folio");
                if (!folio) folio = jQuery.url.setUrl(href).param("pg");
                var page = PageController.getPageByFolio(folio);
            }
            if (!isNaN(page)) {
                ArticleViewer.hide();
                PageController.handleGoToPage(page);
            }
        }
        //If 'Article' Icon is Clicked in TOC
        if(that.is('div')){
        	e.preventDefault();
            e.stopPropagation();
            var href = that.parents().find('a.articleDisplayLinks').attr('href');
            var article_id = jQuery.url.setUrl(href).param("article_id");
            if(article_id){
                ArticleViewer.articleFlag = false;
                ArticleViewer.viewArticle(article_id);
            }
        }
    }

    function set_tabs_deselectable(state){
        var deselectable_state = typeof state == "undefined" ? false : state;
        $.each(PageElements.tabs,function(i){
            var current_state = this.tabs('option','deselectable');
            if(current_state != deselectable_state){
               this.tabs('option','deselectable',deselectable_state);
            }
            if(deselectable_state===true){
               this.tabs('select',this.tabs('option','selected'));
            }
        });
    }

    function handle_clippings_success(html) {
        $("#clippings").html(html);
        Drawer.View.load_clippings();
        delete PageElements.dialogs['button_link_clip'];
    }
    
    function handle_clippings_error(XMLHttpRequest, textStatus, errorThrow) {
        // TODO:handle error
    }
    
    function misc_startup_tasks(){
        $(m.drawer).css('visibility','visible');
        Drawer.CustomArchives.init();
        if(Offline.isOffline()){
	        var help_anchor = $("#help_tab a");
	        var url = help_anchor.attr("href");
	        help_anchor.attr("href", url + "?offline=true");
        }
        tabify(m.getTabList());
        Drawer.Controls.init();
        Share.collapsibleIcons.init($(m.drawerAdSpace));
        $(".social_icons_wrapper",$(m.drawerAdSpace)).corner("6px");
        $("#main_tabs,#drawer_controls").css("display","block");
    }

    return {
        open_tab: null,
        resize_in_progress: false,
        firstTabLoaded: false,  
        tabs: {},
    
        init: function(){
            if($(m.drawer).length > 0){
                ViewHelper.schedule([
                    detect_read_mode,
                    misc_startup_tasks,
                    enable_resizing
                ],this);
            }else{
                Constants.closedDrawer = 0;
            }
        },
      
        getCurrentSize: function(){
            return current_size || Constants.closedDrawer;
        },
      
        adjustWidth: function(size,arg){
            if(!Drawer.View.resize_in_progress){
                handle_drawer_resize_start(size);
                var resize_speed = ViewHelper.trueTypeOf(arg)=="number" ? arg : speed;
                var starting_size = current_size
                var delta = size - starting_size;
                var size_delta = "-=" + (delta * -1);
                var resize_elements = "#drawer,#tab_wrapper,#drawerAdspace";
                switch(size){
                    case Constants.fullDrawer:
                        var control_state = (Drawer.View.open_tab && $(Drawer.View.open_tab.tab).is(".fullDrawer")) ? "fullCollapseFull" : "fullCollapseStandard";
                        //set deselectable on a delay to avoid changing the url hash to tab name
                        setTimeout(function(){set_tabs_deselectable(false);},resize_speed-20);
                        ViewHelper.showHide("#drawerFullPages","#drawerStandardPages");
                        Drawer.Controls.setState(control_state);
                        break;
                    case Constants.standardDrawer:
                        //set deselectable on a delay to avoid changing the url hash to tab name
                        setTimeout(function(){set_tabs_deselectable(false);},resize_speed-20);
                        ViewHelper.showHide("#drawerStandardPages","#drawerFullPages");
                        Drawer.Controls.setState("standard");
                        break;
                    case Constants.closedDrawer:
                        set_tabs_deselectable(true);
                        var control_state = (Drawer.View.open_tab && $(Drawer.View.open_tab.tab).is(".fullDrawer")) ? "closedOpenFull" : "closed";
                        Drawer.Controls.setState(control_state);
                        ViewHelper.showHide("#drawerStandardPages","#drawerFullPages");
                        break;
                }
                $(resize_elements).animate(
                    { width: size_delta },
                    resize_speed, 'easeInOutCubic'
                );
                setTimeout(handle_drawer_resize_stop,resize_speed+50);
                current_size = size;
            }
        },
      
        show_inThisIssue: function(){
            if(PageElements.tabs.length < 2){
                var waiting_for_subtabs = setInterval(function(){
                    if(PageElements.tabs.length > 1){
                        clearInterval(waiting_for_subtabs);
                        PageElements.tabs[1].tabs('select',0);
                    }
                },500);
            }else{
                var selected = PageElements.tabs[1].tabs('option','selected');
                if(selected==-1){
                    PageElements.tabs[1].tabs('select',0);
                }
            }
        },
      
        load_inThisIssue: function(){
            Drawer.View.firstTabLoaded = true; 
            ViewHelper.setupSprite("drawer");
        },      
        
        //DT-6088: Initiate TOC link click
        initiate_TOC_Click: function(e) {        	
        	toc_click(e);
        },
        
        load_tableOfContents: function(){
            var tableOfContents = $("#tableOfContents");
            $("#tableOfContents").unbind('click',toc_click).bind('click',toc_click);

            // this logic is to show the page number when TOC is only 1 level
            var first_levels = $("OL:first>LI", tableOfContents);
            var only_first_level = true;
            first_levels.each(function(){
                if($(this).children("OL").length > 0 ) {
                    only_first_level = false;
                    return only_first_level;
                }
            });

            if(only_first_level){
                first_levels.each(function(){
                    $(this).find("span").css("display", "inline-block" ); 
                });
            }
            if(typeof ArticleViewer != "undefined"){
                ArticleViewer.init();
            }
        },
      
        show_tableOfContents: function(){
            var tableOfContents = $("#tableOfContents");
            //move the scroller so that it shows data correstponding to the current page
            if(tableOfContents.hasClass("has_scroller")){ 
                var h = ViewHelper.height(tableOfContents); 
                var that = $("a[href='#page"+PageController.currentPage+"']",tableOfContents);  
                if(that[0]){ 
                    var parent_h = $("#wrapper_tableOfContents div:first",tableOfContents)[0].scrollHeight; 
                    var new_offsetTop = that[0].offsetTop + (h/2); 
                    if(new_offsetTop > (h/2)){
                        var new_pos = Math.ceil((new_offsetTop/parent_h)*1000);
                        $("#scroller_vertical_tableOfContents",tableOfContents).slider("value", 1000-new_pos); 
                    }
                } 
            }
        },
      
        show_drawerPages: function(second_try){
            var drawerPages = $("#drawerPages");                
            function scroll_to_page(element,drawerPages){
                if(element[0]){ 
                    var h = ViewHelper.height(drawerPages); 
                    var wrapper_h = $("#wrapper_drawerPages")[0].scrollTop; 
                    var parent_h = $("#wrapper_drawerPages div:first")[0].scrollHeight; 
                    var new_offsetTop = that[0].offsetTop;
                    new_offsetTop = new_offsetTop > (h/2) ? new_offsetTop + (h/2) : 0;
                    if(new_offsetTop > (h/2) || wrapper_h > (h/2)){
                        var new_pos = (new_offsetTop/parent_h)*1000;
                        $("#scroller_vertical_drawerPages").slider("value", 1000-new_pos); 
                    }
                }
            }
            if($("#drawerStandardPages",drawerPages).length===0){
                //move the scroller so that it shows data correstponding to the current page
                if(drawerPages.hasClass("has_scroller")){ 
                    for(i=0;i<20;i++){
                      var that = $("#thumb_"+PageController.currentPage);
                      if(that.length){
                          scroll_to_page(that,drawerPages);
                          return;
                      }
                    }
                }else if(second_try!==true){
                    setTimeout(function(){Drawer.View.show_drawerPages(true);},250);
                }
            }
        },
      
        load_drawerPages: function(){
            //bind the click event
            var drawerPages = $("#drawerPages");
            if($("#drawerStandardPages",drawerPages).length===0){
                drawerPages.bind('click', page_thumb_click);
            }else{
                if(Drawer.View.getCurrentSize() < Constants.fullDrawer){
                    ViewHelper.showHide("#drawerStandardPages","#drawerFullPages");
                }else{
                    ViewHelper.showHide("#drawerStandardPages","#drawerFullPages");
                }
            }
        },
        
        show_links: function(second_try){
            var links = $("#links");
            Drawer.Controls.setState("fullCollapseFull");
            Drawer.Controls.normalizeControls("#links");
            if(links.hasClass("has_scroller")){
                for(i=0;i<20;i++){
                  var that = $("#link_"+(PageController.currentPage - i),links);
                  if(that.length){
                      scroll_to_link(that,links);
                      return;
                  }
                }
            }else if(second_try!==true){
                setTimeout(function(){Drawer.View.show_links(true);},500);
            }
            
            function scroll_to_link(element,links){
                if(element[0]){ 
                  var h = ViewHelper.height(links); 
                  var wrapper_h = $("#wrapper_links",links)[0].scrollTop || 0; 
                  var parent_h = $("#wrapper_links div:first",links)[0].scrollHeight || 0;
                  var new_offsetTop = element[0].offsetTop;
                  new_offsetTop = new_offsetTop > (h/2) ? new_offsetTop + (h/2) : 0;
                  if(new_offsetTop > (h/2) || wrapper_h > (h/2)){
                      var new_pos = (new_offsetTop/parent_h)*1000;
                      $("#scroller_vertical_links",links).slider("value", 1000-new_pos); 
                  }
                }
            }
            
        },
      
        load_archives: function(reload){
            var archives = $("#archives");
            var tmp_img_obj = ViewHelper.getHiddenImageDimensions(archives);
            
            $("a.more_archives",archives)
                .unbind('click.more_archives',Drawer.Model.getMoreArchives)
                .bind('click.more_archives',Drawer.Model.getMoreArchives);
            
            if(Constants.hasOwnProperty("customArchiveInterval") && Constants.hasOwnProperty("archiveAfterDate")){   
                Drawer.CustomArchives.updatePaginationLinks();
            }else{
                $("a.more_archives",archives).css("visibility","visible");
            }

            test_tmp_interval = window.setInterval(function(){
                if(Constants != "undefined" && typeof Constants[tmp_img_obj] != "undefined" && typeof Constants[tmp_img_obj]["height"] != "undefined"  && Constants[tmp_img_obj]["height"] > 0){
                    $("head").append("<style type=\"text/css\">#archives div.thumb { width: "+(Constants[tmp_img_obj].width+Constants.archiveThumbBuffer.width)+"px; height: "+(Constants[tmp_img_obj].height+Constants.archiveThumbBuffer.height)+"px; } #archives div.thumb a span { width: "+(Constants[tmp_img_obj].width+Constants.archiveThumbBuffer.width)+"px; }</style>");
                    delete Constants[tmp_img_obj];
                    window.clearInterval(test_tmp_interval);
                }
            },250);
        },
        
        load_searchResults: function(){
            if(Offline.isOffline()){
                $("#advanced_options_link").hide();
            }
        },
      
        show_searchResults: function(){
            Search.View.init(); 
            Drawer.Controls.setState("fullCollapseFull");
            Drawer.Controls.normalizeControls("#searchResults"); 
        },
      
        show_help: function(){
            Drawer.Controls.setState("fullCollapseFull");
            Drawer.Controls.normalizeControls("#help"); 
        },
      
        load_help: function(){
            var help = $("#help");
            
            $("a.help_section_link",help).unbind().bind('click',function(e){
                e.stopPropagation(); 
                e.preventDefault();
                var scrollHeight = $("#wrapper_help",help).get(0).scrollHeight;
                var this_href = $(this).attr("href")
                var this_top = $(this).get(0).offsetTop;
                var section_id = this_href.substr(this_href.lastIndexOf("#")+1);
                var section = $("#"+section_id);
                var offsetTop = section.get(0).offsetTop
                $("#scroller_vertical_help",help).slider("value",1000-((offsetTop/scrollHeight)*1000)-(this_top*.65));
                for(i=0;i<2;i++){
                    var background_color = i%2==0 ? "#9F9F9F" : $("#tab_wrapper").css("background-color");
                    section.animate({backgroundColor:background_color},750);
                }
            });
            $("a.help_link_to_top",help).unbind().bind('click',function(e){
                e.stopPropagation(); 
                e.preventDefault();
                $("#scroller_vertical_help",help).slider("value",1000);
            });
            
            setTimeout(function(){
                ViewHelper.makeScrollable();
            },700);
        },

        load_clippings: function(){
                $("#portalLogin .auth").unbind('click').bind('click',function(){
                        var doc_url = DocumentProperties.getDocumentUrl();
                        DataSwitch.get({
                    url: doc_url + "/Clippings.action?email_address=" + document.portalLogin.email_address.value + "&password=" + document.portalLogin.password.value + "&" + this.name + "=1",
                    success: handle_clippings_success, 
                    error: handle_clippings_error 
                });
                        return false;
                });
                $("#clippings .delete").unbind('click').bind('click',function(){
                        Clip.deleteClipping($(this).attr('clippingId'));
                        return false;
                });
                $(".clipping a").unbind('click').bind('click',function(){
                        var href = $(this).attr('href');
                    var document_url = DocumentProperties.getDocumentUrl();
                        if (href.indexOf(document_url) >= 0) {
                                var pg = href.match(/pg=(\d+)/);
                                if (pg) {
                                        PageController.handleGoToPage( pg[1] );
                                        return false;
                                }
                        }
                });
        },
        
        load_article_text : function(){
            Console.log("initializing article viewer");
            ArticleViewer.init();
        },
      
        reopenPreviousTab: function(just_clicked){
            if(Drawer.View.open_tab){
                var previous_tab = $(Drawer.View.open_tab.tab);
                // let's look to see if the previous tab is 
                // contained within another set of tabs
                var parent = $(Drawer.View.open_tab.panel).parent();
                var parent_path = parent.data('parent_tab_key') || null;
                if(typeof just_clicked == "undefined"){
                    if(parent_path){
                        PageElements.tabs[parent_path.parent_tabs_object].tabs('select',parent_path.parent_tabs_index);
                    }
                    previous_tab.trigger('click');
                }else if(parent_path && parent_path.parent_tabs_href == just_clicked){
                    previous_tab.trigger('click');
                }
            }
        }
    }
})();

Drawer.Controller = (function(){
    var m = Drawer.Model;
    var v = Drawer.View;
    var $ = jQuery;
    
    return {
        init: function(){
            m.init();
            v.init();
        }
    };
})();

Drawer.CustomArchives = {
    
    init : function(){
        if(Constants.hasOwnProperty("customArchiveInterval")){
            var archive_interval = Constants.customArchiveInterval.split(" ");
            Constants.archiveIntervalOffset = archive_interval[0];
            Constants.archiveIntervalType = archive_interval[1];
            var initial_date = new Date();
            var date_range = this.getInitialDateRange(initial_date,Constants.archiveIntervalType, Constants.archiveIntervalOffset);
            this.updateTabHref(date_range);
            return true;
        }
    },

    updateTabHref : function(date_ranges){
        var archive_anchor = $("#backissues_tab a"), archive_href = archive_anchor.attr("href"), archive_action = archive_href.split("?")[0];
        var new_href = archive_action + "?before=" + date_ranges.before + "&after=" + date_ranges.after;
        archive_anchor.attr("href",new_href)
    },

    updatePaginationLinks : function(){
        var archives = $("#archives"), older_archives = $(".older_archives",archives), newer_archives = $(".newer_archives",archives);
        if((Constants.hasOwnProperty('archiveAfterDate') || Constants.hasOwnProperty('archiveBeforeDate')) && (older_archives.length || newer_archives.length)){
            var before = Constants.archiveBeforeDate;
            var after = Constants.archiveAfterDate;        
            var pieces = after.split("-");
            var next_date = new Date();
            next_date.setFullYear(parseInt(pieces[0],10),parseInt(pieces[1],10)-1,parseInt(pieces[2],10)+1);
            var next_range = this.getCustomDateRanges(next_date, Constants.archiveIntervalType, Constants.archiveIntervalOffset);
            var next_html = "&raquo; next ";
            var prev_html = "&laquo; prev ";
            var link_modifier = Constants.archiveIntervalOffset > 1 ? Constants.customArchiveInterval : Constants.archiveIntervalType;
            
            if(older_archives.length){
                older_archives.each(function(){
                    var link_action = $(this).attr("href").split("?")[0];
                    var new_href = link_action + "?before=" + next_range.older.before + "&after=" + next_range.older.after;
                    $(this).attr("href",new_href).html(prev_html + link_modifier.toLowerCase());
                });
            }
            if(newer_archives.length){
                newer_archives.each(function(){
                    var link_action = $(this).attr("href").split("?")[0];
                    var new_href = link_action + "?before=" + next_range.newer.before + "&after=" + next_range.newer.after;
                    $(this).attr("href",new_href).html(next_html + link_modifier.toLowerCase());
                });
            }
            $("a.more_archives",archives).css("visibility","visible");
        }
        return;
    },
    
    getCustomDateRanges : function(date_obj,timeframe_type,timeframe_interval){
        var interval = parseInt(timeframe_interval,10) || 1, newer_interval = interval * 2, date_month = date_obj.getMonth(), adj_date_month = date_month + 1, date_year = date_obj.getFullYear(), date_date = date_obj.getDate(), retval = {}, older_before_year, older_after_year, older_after_day, older_after_month, older_before_month, older_before_day, newer_before_year, newer_after_year, newer_after_day, newer_after_month, newer_before_month, newer_before_day;

        switch(timeframe_type.toLowerCase()){
            case "month":
            case "months":
                older_after_month = adj_date_month <= interval ? ((12+adj_date_month)-interval) : (adj_date_month - interval);
                older_after_year = older_after_month > adj_date_month ? date_year - 1 : date_year;
                older_after_day = date_date - 1;

                older_before_month = adj_date_month;
                older_before_year = older_before_month > adj_date_month ? date_year - 1 : date_year; 
                older_before_day = date_date;
                
                newer_after_month = (adj_date_month + interval > 12) ? ((adj_date_month+interval)-12) : (adj_date_month + interval);
                newer_after_year = newer_after_month < adj_date_month ? date_year + 1 : date_year;
                newer_after_day = new Date(newer_after_year, newer_after_month, date_date - 1).getDate();

                newer_before_month = (adj_date_month + newer_interval > 12) ? ((adj_date_month+newer_interval)-12) : (adj_date_month + newer_interval);
                newer_before_year = newer_before_month < adj_date_month ? date_year + 1 : date_year;        
                newer_before_day = date_date;        
                
                break;
                
            case "year":
            case "years":
                older_after_month = adj_date_month;
                older_after_year = date_year - interval;
                older_after_day = date_date + 1;
                
                older_before_month = adj_date_month;
                older_before_year = date_year;
                older_before_day = date_date;
                
                newer_after_month = adj_date_month;
                newer_after_year = date_year;
                newer_after_day = new Date(newer_after_year, newer_after_month, date_date - 1).getDate();
                
                newer_before_month = adj_date_month;
                newer_before_year = date_year + newer_interval;
                newer_before_day = date_date;
                
        }

        retval = {
            'older' : {
                'before' : older_before_year + '-' + ViewHelper.pad(older_before_month,2) + '-' + ViewHelper.pad(older_before_day,2),
                'after' : older_after_year + '-' + ViewHelper.pad(older_after_month,2) + '-' + ViewHelper.pad(older_after_day,2)
            },
            'newer' : {
                'before' : newer_before_year + '-' + ViewHelper.pad(newer_before_month,2) + '-' + ViewHelper.pad(newer_before_day,2),
                'after' : newer_after_year + '-' + ViewHelper.pad(newer_after_month,2) + '-' + ViewHelper.pad(newer_after_day,2)
            }
        };
        return retval;
    },
    
    getInitialDateRange : function(date_obj,timeframe_type,timeframe_interval){
        var interval = parseInt(timeframe_interval,10) || 1, date_month = date_obj.getMonth(), adj_date_month = date_month + 1, date_year = date_obj.getFullYear(), date_date = date_obj.getDate(), retval = {}, after_day, before_day, after_month, before_month, after_year, before_year;

        switch(timeframe_type.toLowerCase()){
            case "month":
            case "months":
                after_month = adj_date_month <= interval ? ((12+interval)-adj_date_month) : (adj_date_month - interval);
                after_year = after_month == 1 ? date_year - 1 : date_year;
                after_day = new Date(after_year, after_month, date_date - 1).getDate();

                before_month = adj_date_month == 12 ? 1 : adj_date_month;
                before_year = before_month == 1 ? date_year + 1 : date_year;
                before_day = new Date(before_month, before_year, date_date + 1).getDate();
                
                break;
                
            case "year":
            case "years":
                before_month = adj_date_month;
                before_year = date_year;
                before_day = new Date(before_month, before_year, date_date + 1).getDate();
                
                after_month = adj_date_month;
                after_year = before_year - interval;
                after_day = date_date;
                
        }

        retval = {
            'before' : before_year + '-' + ViewHelper.pad(before_month,2) + '-' + ViewHelper.pad(before_day,2),
            'after' : after_year + '-' + ViewHelper.pad(after_month,2) + '-' + ViewHelper.pad(after_day,2)
        };
        return retval;
    }
}

Drawer.Controls = (function(){
    var m = Drawer.Model;
    var drawerState = "standard";
    
    function trigger_open_full(e){
       e.preventDefault();
       e.stopPropagation();
       adjust_width(Constants.fullDrawer);
    }
    
    function trigger_collapse_standard(e){
       e.preventDefault();
       e.stopPropagation();
       adjust_width(Constants.standardDrawer);
    }
    
    function trigger_open_standard(e){
       e.preventDefault();
       e.stopPropagation();
       adjust_width(Constants.standardDrawer);
    }
    
    function trigger_collapse_full(e){
       e.preventDefault();
       e.stopPropagation();
       adjust_width(Constants.closedDrawer);
    }
    
    function adjust_width(size){
        if(Drawer.View.getCurrentSize() == Constants.closedDrawer){
          if(Drawer.View.open_tab){
              Drawer.View.reopenPreviousTab();
          }else{
            var initTabsInterval = setInterval(function(){
              if(PageElements.tabs.length > 0){
                clearInterval(initTabsInterval);
                PageElements.tabs[0].tabs('select',0);
              }
            },200);
          }
        }
        Drawer.View.adjustWidth(size);
    }
    
    return {
        init: function(){
            $(m.openFullLinks).click(trigger_open_full);
            $(m.collapseStandardLinks).click(trigger_collapse_standard);
            $(m.openStandardLinks).click(trigger_open_standard);
            $(m.collapseFullLinks).click(trigger_collapse_full);
        },
        normalizeControls: function(href){
            var tab_links = $("ul.ui-tabs-nav a:not([href='"+href+"'])",m.drawer); 
            tab_links.bind("click.normalize_controls",function(){
                if($(this).is(".fullDrawer") || $(this).parents(".fullDrawer").length){
                    return;
                }else{
                    tab_links.unbind("click.normalize_controls");
                    Drawer.Controls.setState("fullCollapseStandard");
                }
            });     
        },
        
        getState: function() {
        	return drawerState;
        },       
        setState: function(state){
            // available links are: openFullLinks, openStandardLinks, collapseStandardLinks,collapseFullLinks:
            drawerState = state;            
            delete Offline.offlineCookie;          
            var isOfflineFlag = Offline.isOffline();
            switch(state){
                
            case "standard":
            	ViewHelper.showHide(
                    [m.openFullLinks,m.collapseFullLinks],
                    [m.openStandardLinks,m.collapseStandardLinks]
                );
                if (isOfflineFlag == false) {
                	ViewHelper.showHide(
                    	[$("#socialBookMarking_standard"),$("#socialBookmarking_left"),$("#socialBookmarking_right")],$("#socialBookMarking_full")
                	);           
              	}
            	break;
            case "closed":
            	ViewHelper.showHide(
                    m.openStandardLinks,
                    [m.collapseFullLinks,m.collapseStandardLinks,m.openFullLinks,m.busy]
                );
                break;
            
            case "closedOpenFull":
            	ViewHelper.showHide(
                    m.openFullLinks,
                    [m.collapseFullLinks,m.collapseStandardLinks,m.openStandardLinks]
                );
                break;
            
            case "fullCollapseFull":
            	ViewHelper.showHide(
                    [m.collapseFullLinks],
                    [m.openStandardLinks,m.collapseStandardLinks,m.openFullLinks]
                );
                if (isOfflineFlag == false) {
                	ViewHelper.showHide(
                    	$("#socialBookMarking_full"),[$("#socialBookMarking_standard"),$("#socialBookmarking_left"),$("#socialBookmarking_right")]
                	);             
               	}
                break;
            
            case "fullCollapseStandard":
            	ViewHelper.showHide(
                    [m.collapseStandardLinks],
                    [m.openStandardLinks,m.openFullLinks,m.collapseFullLinks]
                );
                if (isOfflineFlag == false) {
                	ViewHelper.showHide(
                    	$("#socialBookMarking_full"),[$("#socialBookMarking_standard"),$("#socialBookmarking_left"),$("#socialBookmarking_right")]
                	);             
               	}                
                break;                    
            }       
        }
    }
})();

Navbar.Model = (function(){
    
    var speed = 600;
    var page_list_scroller = {};
    var last_known_width = null;
    var last_known_window_width = null;
    var $ = jQuery;
   
    return {
        navbarWrapper: {},
        navbar: {},
        dialogLinks: {},
        hoverdialogLinks: {},
        popupLinks: {},
        openHelpLinks: {},
        pageTogglers: {},
        clipLinks: {},
        shareLinks: {},
        pageNavImages: {},
        toolsTextSpans: {},
        printLink: {},
        articleLink: {},
        zoomLink: {},
        navbarSearch: {},
        currentPageSelector: {}, 
        texterityBranding: {},
        Speed: speed,
        firstPageButtons: {},
        lastPageButtons: {},
        prevPageButtons: {},
        nextPageButtons: {},
        firstPageDisabledButton : {},
        lastPageDisabledButton : {},
        nextPageDisabledButton : {},
        prevPageDisabledButton : {},
        
        getWidth: function(){
            return ViewHelper.width(this.navbarWrapper);
        }, 
        
        /**
         * Set the width of the navbar to the passed in width value.
         *
         * @param newWidth the width value to set.
         */
        setWidth: function(newWidth){
            ViewHelper.setWidth(this.navbarWrapper, newWidth);
        },

        /**
         * Set the last known width for both the navbar and the window.
         */
        setLastKnownWidth: function(){
            last_known_width = this.getWidth();
            last_known_window_width = $(window).width();
        },
        
        getLastKnownWidth: function(){
            return last_known_width ? last_known_width : this.getWidth();
        },
        
        /**
         * Return the value of the stored window width.
         *
         * @return the last stored window width value
         *     if no value is found, return 0
         */
        getLastKnownWindowWidth: function(){
          return last_known_window_width ? last_known_window_width : 0;
        },

        pageListScroller: function(new_object){
            return new_object || page_list_scroller;
        },
      
        init: function(){
	    
	     $("#drawer_social_icons").scrollable();  
            this.navbarWrapper = $("#navbar_wrapper");
            this.navbar = $("#navbar");
            this.dialogLinks = $("a.dialog",this.navbar);
            this.hoverdialogLinks = $("a.hover_dialog",this.navbar);
            this.popupLinks = $("a.popup",this.navbar);
            this.openHelpLinks = $("a.open_help",this.navbar);
            this.pageTogglers = $("a.toggle_page_mode",this.navbar);
            this.clipLinks = $("#button_link_clip",this.navbar);
            this.shareLinks = $("#button_link_share",this.navbar);
            this.pageNavImages = $("img.page_nav",this.navbar); 
            this.toolsTextSpans = $("span.text",this.navbar);
            this.printLink = $("#button_link_print",this.navbar);            
            this.zoomLink = $("#button_link_zoom",this.navbar);
            this.navbarSearch = $("#navbar_search",this.navbar);
            this.currentPageSelector = $("#current_page_selector_wrapper",this.navbar);
            this.texterityBranding = $("#navbar_texterity",this.navbar);
            this.OfflineLink = $("#button_link_offline",this.navbar);
            this.OnlineLink = $("#button_link_online",this.navbar);
            this.firstPageButtons = $("#firstPage",this.navbar);
            this.lastPageButtons = $("#lastPage",this.navbar);
            this.firstPageDisabledButton = $("#firstPageDisabled",this.navbar);
            this.lastPageDisabledButton = $("#lastPageDisabled",this.navbar);
            this.nextPageDisabledButton = $("#nextPageDisabled",this.navbar);
            this.prevPageDisabledButton = $("#prevPageDisabled",this.navbar);
            this.prevPageButtons = $(".prevPage");
            this.nextPageButtons = $(".nextPage");
            
            // (DT-4380)Initilizing Autoplay 
           $("a.toggle_AutoPlay").click( function($e) { 
					$e.preventDefault; 
					if ($(this).attr("title") == "Start SlideShow") { 
						$(this).attr("title", "Stop SlideShow");	
						$("#autoPlayImage").attr("src", "/images/navbar/autoPlayStop.png");					
						 PageController.startAutoPlay(PageModel.getAutoPlayDuration()); 
					} else { 
						$(this).attr("title", "Start SlideShow");
						$("#autoPlayImage").attr("src", "/images/navbar/autoPlayStart.png");
						 PageController.stopAutoPlay(); 
					} 
					return false;
				} );
				
            if($.browser.msie && $.browser.version == '6.0'){
                $("#navbar_tools a").hover(
                    function(){
                        $(".lbg",$(this)).addClass("lbg_hover");
                        $(".mbg",$(this)).addClass("mbg_hover");
                        $(".rbg",$(this)).addClass("rbg_hover");
                    },
                    function(){
                        $(".lbg",$(this)).removeClass("lbg_hover");
                        $(".mbg",$(this)).removeClass("mbg_hover");
                        $(".rbg",$(this)).removeClass("rbg_hover");
                    }
                );
            }
        }
        
    };
})();

Navbar.View = (function(){
    var m = Navbar.Model;
    var nbw = {};  // associative array to store all nav bar width constants
    var resizeTimer = null;
    var $ = jQuery;


    /**
     * Determine whether or not components of the navigation bar need to be reconfigured
     * depending on available space within the nav bar.  Certain components are hidden/shown
     * depending on the space.  The following list is the order of components that get hidden,
     * ie. #1 is the first component to be hidden.
     *   1.  Texterity Branding Logo
     *   2.  Tools text
     *   3.  Current page dropdown
     *   4.  Search box
     * Once all components are correctly hidden, the page navigation pane (contains the tools
     * to navigate to pages) is centered in the available space between left and right side
     * content.
     * 
     * Note: jQuery (especially with Safari) sometimes returns a width for hidden elements,
     * so we are explicitly setting a width of 0 for hidden elements.  If the element is shown
     * again, set the width to the previously stored width.
     * 
     * @param size The current size of the nav bar
    */
    function reconfigure_navbar_display(size){
    	// Checks to see if branding width value was computed before the branding
    	// image was not completely loaded.  If so, recalculate width constants.
    	if (nbw.branding_width != ViewHelper.width($("#button_link_branding",m.navbar))) {
            set_width_constants(true);
    }
    
    	// hide texterity branding
        if (nbw.texterity_branding_hide_width > size) {
            m.texterityBranding.addClass('hidden'); 
            var nb_tb_width = 0;
        }else{
            m.texterityBranding.removeClass('hidden'); 
            nb_tb_width = nbw.texterity_branding_width;
    }
        // hide tools text
        if (nbw.toolstext_hide_width > size) {
            	m.toolsTextSpans.addClass('hidden');
            var nb_tt_width = nbw.navbar_tools_min_width
        }else{
            m.toolsTextSpans.removeClass('hidden'); 
            var nb_tt_width = nbw.navbar_tools_full_width
        }        
        // hide current page dropdown
        if (nbw.pagedropdown_hide_width > size) {
            m.currentPageSelector.addClass('hidden');
            var nb_cps_width = 0;
        }else{
            m.currentPageSelector.removeClass('hidden');
            var nb_cps_width = nbw.current_page_selector_width;
        }
        // hide search box
        if (nbw.search_hide_width > size) {
            m.navbarSearch.addClass('hidden'); 
            var nb_s_width = 0;
        }else{
            m.navbarSearch.removeClass('hidden'); 
            var nb_s_width = nbw.search_width;
        }
        
        // Center the navigation buttons in the available space
    	var left_side = nbw.branding_width + nb_s_width;
    	var right_side = nb_tb_width + nb_tt_width;
    	var available_space = size - (left_side + right_side);
    	var selector_left = left_side + ((available_space - nbw.page_selector_width) / 2);
      	if (nb_cps_width === 0) {
      		selector_left -= (nbw.current_page_selector_width / 2);
    	}
        $("#navbar_page_selector").css("left", selector_left);
        $("#navbar_pagination").css("left", (selector_left + nbw.current_page_selector_width + 12));
    }
    
    function position_page_dropdown_scroller(){
        var h = 200; 
        var that = $("a[pg='"+$("#current_page_input",m.navbarWrapper).val()+"']",m.navbarWrapper); 
        var wrapper = $("#wrapper_page_list",m.navbarWrapper);
        if(that[0] && wrapper.length){ 
            var wrapper_h = wrapper[0].scrollTop || 0; 
            var parent_h = $("#wrapper_page_list div.ui-slider-scroll-area-inner",m.navbarWrapper)[0].scrollHeight || 0;
            var new_offsetTop = that[0].offsetTop;
            new_offsetTop = new_offsetTop > (h/2) ? new_offsetTop + (h/2) : 0;
            if(new_offsetTop > (h/2) || wrapper_h > (h/2)){
                var new_pos = (new_offsetTop/parent_h)*1000;
                $("#scroller_vertical_page_list",m.navbarWrapper).slider("value", 1000-new_pos); 
            }
        }
    }

    function scroll_page_dropdown(){
      if($("#page_list",m.navbarWrapper).hasClass("has_scroller")===false){
          m.pageListScroller(new Scroller("page_list",{"height":200}));
          setTimeout(function(){position_page_dropdown_scroller();},100);
      }else{
          position_page_dropdown_scroller();
      }
    }
   
    function page_list_dropdown_click(){
        $("#current_page_input",m.navbarWrapper).val($(this).text());
        $("#page_list").css('display','none');
        PageController.handleGoToPage($(this).attr('pg'));
        return false;
    }
  
    function init_page_dropdown(){
        var page_list = $("#page_list",m.navbar);
        $("#total_pages",m.navbar).html("&nbsp;/&nbsp;" + $("li",page_list).length);
        $("#current_page_input",m.navbar).focus(function(){
          $(this).select();
        });
        $("#current_page_img",m.navbar).click(function(){
          if(page_list.css("display")=="block"){
              page_list.hide(1,scroll_page_dropdown);
          }else{
              page_list.show(1,scroll_page_dropdown);
          }
        });
        $("#page_list").delegate('click','a',page_list_dropdown_click);
    }
  
    function init_dialog_links(){
        m.dialogLinks.click(function(){
            ViewHelper.openDialog(this);
            return false;
        });
    }
    
    function init_hover_dialog_links(){
        m.hoverdialogLinks.hover(
            ViewHelper.handleHoverDialogLinkHoverOver,
            ViewHelper.handleHoverDialogLinkHoverOut
        );
    }
  
    function init_popup_links(){
        m.popupLinks.click(function(){
            ViewHelper.openPopup(this);
            return false;
        });
    }
    
    function init_help_links(){
        m.openHelpLinks.click(function(e){
            Navbar.Controller.activateHelpPanel(e);
            return false;
        });
        $("a.help_hotlink").live('click',function(e){
            Navbar.Controller.activateHelpPanel(e);
            return false;
        });
    }
    
    function init_page_mode_links(){
        m.pageTogglers.click(PageController.handleTogglePageMode);     
    }
    
    function init_clip_links(){
        m.clipLinks.unbind("click").click(function(){
            var url = DocumentProperties.getDocumentUrl();
            $(this).attr('href',DataSwitch.addLmParam(url + '/Clip.action?pg=' + PageController.currentPage + '&pm=' + PageModel.pageMode));
            ViewHelper.openDialog(this,function(){
                $("#clipnotes").select().focus();
            });
            return false;
        });
    }
    
    function init_share_links(){
        m.shareLinks.unbind("click").click(function(e){
        e.stopPropagation(); 
        e.preventDefault(); 
        var url = DocumentProperties.getDocumentUrl();
            var pm = PageModel.pageMode;
            var pgs = [];
            $("#normalpages div.page").each(function(){
                pgs.push($(this).attr("pg"));
            });
            $(this).attr('href',DataSwitch.addLmParam(url + '/Share_input.action?pg=' + PageController.currentPage + '&pm=' + pm + '&pgs=' + pgs.join(",")));
            ViewHelper.openDialog(this,Share.init);
            return false;
        });
    }


    function init_pagination_mousover(){
      $(m.pageNavImages).hover(
            function(){
                var src = $(this).attr("src");
                if(src.lastIndexOf("_on")==-1){
                    $(this).attr("src",src.replace(".gif","_on.gif"));
                }
            },
            function(){
                var src = $(this).attr("src");
                if(src.lastIndexOf("_on")!=-1){
                    $(this).attr("src",src.replace("_on.gif",".gif"));
                }
            }
      );
    }

    function init_print_links(){
        m.printLink.unbind("click").click(function(e){
            e.stopPropagation(); 
            e.preventDefault(); 
            var url = DocumentProperties.getDocumentUrl();
            var pm = PageModel.pageMode;
            $(this).attr('href',DataSwitch.addLmParam(url + '/Print_input.action?pm=' + pm));
            ViewHelper.openDialog(this);
            return false;
        });
    }
    
    function init_offline_links(){
        m.OfflineLink.click(function(){
            Offline.goOffline();
            return false;
        });
        m.OnlineLink.click(function(){
            Offline.goBackOnline();
            return false;
        });    
    }
  
    function init_zoom_link(){
        m.zoomLink.unbind("click").click(function(e){
            var url = DocumentProperties.getDocumentUrl();
            $(this).attr('href',DataSwitch.addLmParam(url + '/Zoom.action'));
            ViewHelper.openDialog(this,init_zoom_slider);
            e.stopPropagation(); 
            e.preventDefault(); 
        });
    }

    /**
     * Calculate and store the values to determine whether or not to hide certain
     * components on the nav bar.  Currently 4 components can be hidden, and the
     * values to determine whether or not to hide each is stored in a "_hide_width"
     * variable.
     * In addition, the value for minimum nav bar width is also calculated and stored
     * based on the fewest number of nav bar components.
     * Note: The nav bar width is set arbitrarily high for the initial calculation
     * because IE does not completely populate elements on the nav bar if the
     * width is too small, making the calcuation of component width incorrect.
     * 
     * @param recalc If not set or false, then calculate the width of all components.
     *     If true, then only recalculate the width of image components that have been
     *     identified as potential problems; ie. these images may not have been completely
     *     loaded when this function was first called.  Current components are:
     *     - Branding logo
     */
    function set_width_constants(recalc) {
        // Set nav bar width to a relatively large value for calculation purposes
        m.setWidth(Constants.navbarCalcWidth);

    	recalc = recalc ? recalc : false;
        if (!recalc) {
            // only need to calculate these once at start
            nbw.page_selector_width = ViewHelper.width($("#navbar_page_selector",m.navbar)) || 0;
            nbw.current_page_selector_width = ViewHelper.width($("#current_page_selector_wrapper",m.navbar)) || 0;
            nbw.texterity_branding_width = ViewHelper.width($("#navbar_texterity",m.navbar)) || 0;
            nbw.search_width = ViewHelper.width(m.navbarSearch) || 0;
            nbw.subscribe_width = ViewHelper.width($("#navbar_subscribe",m.navbar)) || 0;
            nbw.navbar_pagination_width = ViewHelper.width($("#navbar_pagination",m.navbar)) || 0;
            nbw.zoom_width = ViewHelper.width($("#zoom_wrapper",m.navbar)) || 0;
            // hide tools text initially to be able to set minimum size
            m.toolsTextSpans.addClass('hidden');
            nbw.navbar_tools_min_width = ViewHelper.width($("#navbar_tools",m.navbar)) || 0;
            m.toolsTextSpans.removeClass('hidden'); 
            nbw.navbar_tools_full_width = ViewHelper.width($("#navbar_tools",m.navbar)) || 0;
    	}
        // potentially need to recalculate these more than once
    	nbw.branding_width = ViewHelper.width($("#button_link_branding",m.navbar)) || 0;

        nbw.navbar_base =
        	nbw.branding_width +
        	nbw.navbar_pagination_width +
        	nbw.zoom_width +
        	nbw.subscribe_width +
            60;

        nbw.min_navbar_width =
        	nbw.navbar_base +
            nbw.navbar_tools_min_width;

        nbw.texterity_branding_hide_width =
        	nbw.navbar_base +
            nbw.navbar_tools_full_width +
            nbw.search_width +
            nbw.current_page_selector_width +
            nbw.texterity_branding_width;

        nbw.toolstext_hide_width =
        	nbw.navbar_base +
        	nbw.navbar_tools_full_width +
        	nbw.search_width +
        	nbw.current_page_selector_width;

        nbw.pagedropdown_hide_width =
        	nbw.navbar_base +
        	nbw.navbar_tools_min_width +
        	nbw.search_width +
        	nbw.current_page_selector_width;

        nbw.search_hide_width =
        	nbw.navbar_base +
        	nbw.navbar_tools_min_width +
        	nbw.search_width;

        // set/reset nav bar width to correct size
        resize_navbar(true);
    }
  
    /**
     * Resize the navbar based on whether or not the window width has changed.  The nav bar
     * should stretch across the window.  When the navbar would be resized to smaller than
     * a pre-determined minimum size, it will be constrained to this size.  Otherwise, it
     * will be allowed to vary according to the window width.
     * m.setWidth(-1) will remove the preset width value from the element.
     * 
     * @param force Force nav bar resize and recalculation
     */
    function resize_navbar(force){
    	force = force ? force : false;
        if((m.getLastKnownWindowWidth() != $(window).width()) || force){
            if ($(window).width() < nbw.min_navbar_width) {
                m.setWidth(nbw.min_navbar_width);
            } else {
                m.setWidth(-1);
            }
            reconfigure_navbar_display(m.getWidth());
            var anchored_dialogs = $('div.ui-dialog:visible').filter(".anchored");
            if(anchored_dialogs.length){
                anchored_dialogs.each(function(){
                    $(this).find('.ui-dialog-content').dialog('close');
                });
            }
        }
        m.setLastKnownWidth();
    }

    /**
     * Previously used to resize window to minimum width.  Currently
     * sets the navbar width to the minimum window width size.
     * 
     * This function is setup to only respond to window resize events
     * every 200 milliseconds.  This avoids the problem (especially with IE)
     * where many resize events are generated per second and we attempt to
     * respond to all of them.
     */
    function window_resize_callback(){
        if (resizeTimer) {
            clearTimeout(resizeTimer);
        }
        resizeTimer = setTimeout(function(){
            resize_navbar();
        },200);    
    }

  return {
      init: function(){ 
          $("#navbar_wrapper").css("display","block");
          //ViewHelper.setupSprite("navbar");         
          Navbar.View.initComponents();                  
          setTimeout(function(){
              resize_navbar();
              $(window).bind('resize',window_resize_callback).trigger('resize');
          },500);                
      },
      initComponents: function(){
          init_page_dropdown();
          init_dialog_links();
          init_hover_dialog_links();
          init_popup_links();
          init_help_links();
          init_page_mode_links();
          init_clip_links();
          init_share_links();
          init_print_links();
          init_pagination_mousover(); 
          init_zoom_link();
          init_offline_links();

          set_width_constants();

          if (PageModel.initPageMode == 1) {
              // hide page mode button for initial one-page mode
              //DT-5192 - JA - commenting next line out...but not sure why it's there in the first place. Seems like we would have put it here for a reason.
              //Navbar.Model.pageTogglers.addClass("hidden");
          }
      },
      pageDropdownBlur: function(event){
          var target = $(event.target);
          if (target.is('#navbar_page_selector') || target.parents('#navbar_page_selector').length) {
              return;
          }
          $("#page_list").css('display','none');
      },     
      pageDropdownSubmit: function(event){
          var folio = $("#current_page_input").val();
          PageController.handleGoToFolio(folio);
          $("#page_list:visible").css('display','none');
      },
      goOffline: function(){
          Scroller.destroyAll();
          $("#navbar_tools a:not(.open_help,.toggle_offline)").hide();
          Navbar.Model.OfflineLink.addClass("hidden");
          Navbar.Model.OnlineLink.removeClass("hidden");
          $("#navbar_subscribe",Navbar.Model.navbar).hide();
          $("#zoom_wrapper",Navbar.Model.navbar).hide();
          $("#subscribeButtonDiv").hide();
          var currentDrawerState = Drawer.Controls.getState();
          if (currentDrawerState == "standard") {
				$("#socialBookMarking_standard").hide();
				$("#socialBookmarking_left").hide();
				$("#socialBookmarking_right").hide();
		  } else if ((currentDrawerState == "fullCollapseFull") || (currentDrawerState == "fullCollapseStandard")) {
				$("#socialBookMarking_full").hide();
		  }
          ViewHelper.setupKeyFunctions();
          var loadArchivesInterval = setInterval(function(){
              if($("#drawer_archives").length){
                  clearInterval(loadArchivesInterval);
                  $("#drawer_archives").html(Offline.loadDocuments());
              }
              $("#backIssuesText").show();
          },500);
          var url = DocumentProperties.getDocumentUrl();    
          $("#help").load(url+"/Help.action?offline=true", Drawer.View.load_help);
          
      },
      goOnline: function(){
          Scroller.destroyAll();
          $("#navbar_tools a:not(.open_help,.toggle_offline)").show();
          Navbar.Model.OfflineLink.removeClass("hidden");
          Navbar.Model.OnlineLink.addClass("hidden");
          $("#navbar_subscribe",Navbar.Model.navbar).show();
          $("#zoom_wrapper",Navbar.Model.navbar).show();
          $("#backIssuesText").hide();
          $("#subscribeButtonDiv").show();
          var currentDrawerState = Drawer.Controls.getState();
          if (currentDrawerState == "standard") {
				$("#socialBookMarking_standard").show();
				$("#socialBookmarking_left").show();
				$("#socialBookmarking_right").show();
		  } else if ((currentDrawerState == "fullCollapseFull") || (currentDrawerState == "fullCollapseStandard")) {
				$("#socialBookMarking_full").show();
		  }
          $("#advanced_options_link").show();
          var url = DocumentProperties.getDocumentUrl();
          $("#archives").load(DataSwitch.addLmParam(url+"/Archive.action?range=before&limit=30"),Drawer.View.load_archives);
          $("#help").load(DataSwitch.addLmParam(url+"/Help.action"), Drawer.View.load_help);
      }
  }
})();

Navbar.Controller = (function(){
    var m = Navbar.Model;
    var v = Navbar.View;
    var $ = jQuery;
    
    return {
        init: function(){
            m.init();
            v.init();
            Navbar.ZoomControls.init();
        },
        activateHelpPanel: function(e){
            var that = $(e.target);
            var goto1 = that.attr("href");
            ViewHelper.closeAllDialogs();
            PageElements.tabs[0].tabs('select','help');
            if(goto1){
                var myinterval = setInterval(function(){
                    ViewHelper.closeAllDialogs();
                    if(Drawer.View.resize_in_progress == false && $(Drawer.View.open_tab.panel).children(".has_scroller").length){
                        clearInterval(myinterval);
                        $("a[href='"+goto1+"']",$("#helpCategory")).trigger('click');
                    }
                },500);
                
            }
        },
        activateFullScreen: function(){
            var props = {
                width: screen.width,
                height: screen.height,
                left: 0,
                top: 0,
                resizable: "yes",
                scrollbars: "yes",
                toolbar: "no",
                location: "no",
                directories: "no",
                status: "no",
                menubar: "no",
                copyhistory: "no"
            }
            window.open(DocumentProperties.getDocumentUrl()+"?pg="+PageController.currentPage+"&pm="+PageModel.pageMode+"&fs=1","",ViewHelper.printOptions(props));
        }
    }
})();

Navbar.ZoomControls = (function(){

    var current_zoom_number, fit_custom_radio, fit_radio_buttons, fit_view_radio, fit_width_radio, max_step, slider_controls, decrease_size, zoom_levels, increase_size, zoom_slider, zoom_slider_wrapper, zoom_steps, zoom_wrapper, font_size;
    if(typeof ArticleViewer != "undefined"){
        font_size = (ArticleViewer.Content.default_font_size - ArticleViewer.Content.min_font_size);
    }
    
    function set_fit_width(){
        fit_width_radio.attr("checked","checked");
    }
    
    function set_fit_view(){
        fit_view_radio.attr("checked","checked");
    }
    
    function set_fit_custom(){
        fit_custom_radio.attr("checked","checked");
        if(!PageView.isZoomedIn()){
            PageView.setAutoZoom(false);
        }
    }
    
    function update_fit_width_radio(){
        if(PageModel.fitWidthZoomIndex()==PageModel.fitViewZoomIndex()){
            fit_width_radio.parent().addClass("hidden");
        }else{
            fit_width_radio.parent().removeClass("hidden");
        }
    }
    
    function check_auto_zoom_match(value){
        var fit_view_index = PageModel.fitViewZoomIndex();
        var fit_width_index = PageModel.fitWidthZoomIndex();
        if(fit_view_index==fit_width_index && value==fit_view_index){
            if(PageView.getAutoZoomMode()=="fit_width"){
                set_fit_width();
            }else{
                set_fit_view();
            }
        }else if(value == fit_view_index || value==fit_width_index){
            if(value==fit_width_index){
                set_fit_width();
                PageView.setAutoZoomMode("fit_width");
            }else{
                set_fit_view();
                PageView.setAutoZoomMode("fit_view");
            }
        }else{
            slider_controls.removeClass("disabled");
            set_fit_custom();
        }    
    }
    
    function slider_slide(e,ui){
        if(PageModel.zoomIndex!=ui.value){
            slider_change(e,ui,true);
            check_auto_zoom_match(ui.value);
        }
    }
    
    function slider_change(e,ui,chain_call){
        if(!chain_call){
            check_auto_zoom_match(ui.value);
        }
        if(PageModel.zoomIndex!=ui.value){
            PageView.zoomChange(ui.value);   
            slider_finish(e,ui);
        }
        
        if(ui.value == 0){
            decrease_size.addClass("disabled");
            increase_size.removeClass("disabled");
        }else if (ui.value == max_step){
            increase_size.addClass("disabled");
            decrease_size.removeClass("disabled");            
        }else{
            increase_size.removeClass("disabled");
            decrease_size.removeClass("disabled");
        }
    }
    
    function slider_finish(e,ui){
        if(!PageView.isZoomedIn()){
            PageModel.preferredZoomIndex(ui.value);
        }
    }
    
    function change_text_size(direction){
        var increment = direction == "up" ? 1 : -1;
        font_size = font_size + increment;
        var font_px = ArticleViewer.Content.min_font_size + font_size;
        if(font_px > ArticleViewer.Content.min_font_size && font_px < ArticleViewer.Content.max_font_size){
            ArticleViewer.Content.content_wrapper.css("font-size",font_px+"px");
        }
    }
    
    function increase_page_size(e){
        e.preventDefault();
        var current_value = zoom_slider.slider("value");
        zoom_slider.slider("value",current_value+1);       
    }
    
    function decrease_page_size(e){
        e.preventDefault();
        var current_value = zoom_slider.slider("value");
        zoom_slider.slider("value",current_value-1);        
    }
    
    function slider_hover_over(){
       zoom_slider_wrapper.removeClass("hidden");
       ViewHelper.closeAllDialogs();  
    }
    
    function slider_hover_out(){
        zoom_slider_wrapper.addClass("hidden");
    }
    
    function radio_button_click(){
        var current_index = PageModel.zoomIndex;
        var mode = $(this).attr("value");
        var value = 0;
        switch(mode){
            case "fit_view":
                PageView.setAutoZoomMode("fit_view");
                value = PageModel.fitViewZoomIndex();
                break;
            case "fit_width":
                PageView.setAutoZoomMode("fit_width");
                value = PageModel.fitWidthZoomIndex();
                break;
        }
        if(current_index != value){
            zoom_slider.slider("value",value)
        }
        if(PageView.isZoomedIn()){
            PageView.isZoomedIn(false);
        }
        CookieManager.remove("preference_zoom");
    }
  
    function init_fullscreen_links(){
        $("div.activate_fullscreen").unbind('click').bind('click',function () {            
            Navbar.Controller.activateFullScreen();
        });
    }


    return {
        init: function(){
            zoom_wrapper = $("#zoom_wrapper",Navbar.Model.navbar);
            fit_radio_buttons = $("input",zoom_wrapper);
            fit_custom_radio = $("#fit_custom",zoom_wrapper);
            fit_view_radio = $("#fit_view",zoom_wrapper);
            fit_width_radio = $("#fit_width",zoom_wrapper);
            slider_controls = $(".control",zoom_wrapper);
            increase_size = $(".increase_size",zoom_wrapper);
            decrease_size = $(".decrease_size",zoom_wrapper);
            zoom_slider = $("#zoom_slider",zoom_wrapper);
            zoom_slider_wrapper = $("#zoom_slider_wrapper",zoom_wrapper);
            zoom_levels = PageModel.zoomLevels;
            zoom_steps = zoom_levels.length;
            max_step = zoom_levels.length - 1;
            current_zoom_number = PageModel.zoomIndex;
    
            zoom_slider.slider({
                max: max_step,
                steps: zoom_steps,
                value:current_zoom_number, 
                slide: slider_slide,
                change: slider_change,
                stop: slider_finish
            });

            zoom_wrapper.hover(slider_hover_over,slider_hover_out);
            increase_size.click(increase_page_size);
            decrease_size.click(decrease_page_size);
            fit_radio_buttons.click(radio_button_click);
            
            //update_fit_width_radio();
            switch(current_zoom_number){
                case PageModel.fitViewZoomIndex():
                    set_fit_view();
                    break;
                case PageModel.fitWidthZoomIndex():
                    set_fit_width();
                    break;
                default:
                    set_fit_custom();
            }
           
            // (DT-4380) Display 'SlideShow' buttons based upon URL 
            if (!PageModel.getAutoPlay()) {
	            $("#navbar_bottom").css("display","none");
            } else {
	            $("#navbar_bottom").css("display","block");
            }
            
            
            if (!PageModel.fullScreen) {
                $("#fulscrdiv",zoom_wrapper).css("display","block").bind('click',function(){
                    Navbar.Controller.activateFullScreen();
                });
                init_fullscreen_links();
            }
            
        },
        update: function(){
            zoom_slider.slider('value',PageModel.zoomIndex);
            //update_fit_width_radio();
        }
    }

})();


