/* Tabber! */
/* Copyright (c) 2006 Patrick Fitzgerald */

function tabberObj(argsObj)
{var arg;this.div=null;this.classMain="tabber";this.classMainLive="tabberlive";this.classTab="tabbertab";this.classTabDefault="tabbertabdefault";this.classNav="tabbernav";this.classTabHide="tabbertabhide";this.classNavActive="tabberactive";this.titleElements=['h2','h3','h4','h5','h6'];this.titleElementsStripHTML=true;this.removeTitle=true;this.addLinkId=false;this.linkIdFormat='<tabberid>nav<tabnumberone>';for(arg in argsObj){this[arg]=argsObj[arg];}
this.REclassMain=new RegExp('\\b'+this.classMain+'\\b','gi');this.REclassMainLive=new RegExp('\\b'+this.classMainLive+'\\b','gi');this.REclassTab=new RegExp('\\b'+this.classTab+'\\b','gi');this.REclassTabDefault=new RegExp('\\b'+this.classTabDefault+'\\b','gi');this.REclassTabHide=new RegExp('\\b'+this.classTabHide+'\\b','gi');this.tabs=new Array();if(this.div){this.init(this.div);this.div=null;}}
tabberObj.prototype.init=function(e)
{var
childNodes,i,i2,t,defaultTab=0,DOM_ul,DOM_li,DOM_a,aId,headingElement;if(!document.getElementsByTagName){return false;}
if(e.id){this.id=e.id;}
this.tabs.length=0;childNodes=e.childNodes;for(i=0;i<childNodes.length;i++){if(childNodes[i].className&&childNodes[i].className.match(this.REclassTab)){t=new Object();t.div=childNodes[i];this.tabs[this.tabs.length]=t;if(childNodes[i].className.match(this.REclassTabDefault)){defaultTab=this.tabs.length-1;}}}
DOM_ul=document.createElement("ul");DOM_ul.className=this.classNav;for(i=0;i<this.tabs.length;i++){t=this.tabs[i];t.headingText=t.div.title;if(this.removeTitle){t.div.title='';}
if(!t.headingText){for(i2=0;i2<this.titleElements.length;i2++){headingElement=t.div.getElementsByTagName(this.titleElements[i2])[0];if(headingElement){t.headingText=headingElement.innerHTML;if(this.titleElementsStripHTML){t.headingText.replace(/<br>/gi," ");t.headingText=t.headingText.replace(/<[^>]+>/g,"");}
break;}}}
if(!t.headingText){t.headingText=i+1;}
DOM_li=document.createElement("li");t.li=DOM_li;DOM_a=document.createElement("a");DOM_a.appendChild(document.createTextNode(t.headingText));DOM_a.href="javascript:void(null);";DOM_a.title=t.headingText;DOM_a.onclick=this.navClick;DOM_a.tabber=this;DOM_a.tabberIndex=i;if(this.addLinkId&&this.linkIdFormat){aId=this.linkIdFormat;aId=aId.replace(/<tabberid>/gi,this.id);aId=aId.replace(/<tabnumberzero>/gi,i);aId=aId.replace(/<tabnumberone>/gi,i+1);aId=aId.replace(/<tabtitle>/gi,t.headingText.replace(/[^a-zA-Z0-9\-]/gi,''));DOM_a.id=aId;}
DOM_li.appendChild(DOM_a);DOM_ul.appendChild(DOM_li);}
e.insertBefore(DOM_ul,e.firstChild);e.className=e.className.replace(this.REclassMain,this.classMainLive);this.tabShow(defaultTab);if(typeof this.onLoad=='function'){this.onLoad({tabber:this});}
return this;};tabberObj.prototype.navClick=function(event)
{var
rVal,a,self,tabberIndex,onClickArgs;a=this;if(!a.tabber){return false;}
self=a.tabber;tabberIndex=a.tabberIndex;a.blur();if(typeof self.onClick=='function'){onClickArgs={'tabber':self,'index':tabberIndex,'event':event};if(!event){onClickArgs.event=window.event;}
rVal=self.onClick(onClickArgs);if(rVal===false){return false;}}
self.tabShow(tabberIndex);return false;};tabberObj.prototype.tabHideAll=function()
{var i;for(i=0;i<this.tabs.length;i++){this.tabHide(i);}};tabberObj.prototype.tabHide=function(tabberIndex)
{var div;if(!this.tabs[tabberIndex]){return false;}
div=this.tabs[tabberIndex].div;if(!div.className.match(this.REclassTabHide)){div.className+=' '+this.classTabHide;}
this.navClearActive(tabberIndex);return this;};tabberObj.prototype.tabShow=function(tabberIndex)
{var div;if(!this.tabs[tabberIndex]){return false;}
this.tabHideAll();div=this.tabs[tabberIndex].div;div.className=div.className.replace(this.REclassTabHide,'');this.navSetActive(tabberIndex);if(typeof this.onTabDisplay=='function'){this.onTabDisplay({'tabber':this,'index':tabberIndex});}
return this;};tabberObj.prototype.navSetActive=function(tabberIndex)
{this.tabs[tabberIndex].li.className=this.classNavActive;return this;};tabberObj.prototype.navClearActive=function(tabberIndex)
{this.tabs[tabberIndex].li.className='';return this;};function tabberAutomatic(tabberArgs)
{var
tempObj,divs,i;if(!tabberArgs){tabberArgs={};}
tempObj=new tabberObj(tabberArgs);divs=document.getElementsByTagName("div");for(i=0;i<divs.length;i++){if(divs[i].className&&divs[i].className.match(tempObj.REclassMain)){tabberArgs.div=divs[i];divs[i].tabber=new tabberObj(tabberArgs);}}
return this;}
function tabberAutomaticOnLoad(tabberArgs)
{var oldOnLoad;if(!tabberArgs){tabberArgs={};}
oldOnLoad=window.onload;if(typeof window.onload!='function'){window.onload=function(){tabberAutomatic(tabberArgs);};}else{window.onload=function(){oldOnLoad();tabberAutomatic(tabberArgs);};}}
if(typeof tabberOptions=='undefined'){tabberAutomaticOnLoad();}else{if(!tabberOptions['manualStartup']){tabberAutomaticOnLoad(tabberOptions);}}



var currentPopup;


if (document.forms['searchForm']) {
    document.forms['searchForm'].elements['lookfor'].focus();
}

function toggleClass(elem,cssClass) {
    if (elem.className == cssClass) {
        elem.className = '';
    }
    else {
        elem.className = cssClass;
    }
}

function switchMenu(obj) {
	var el = getElem(obj);
	if ( el.style.display != 'none' ) {
		collapse(obj);
	}
	else {
		expand(obj);
	}
}

function collapse(obj) {
	var el = getElem(obj);
	var elPar = getElem(obj + 'Img');
	el.style.display = 'none';
	elPar.src = "../images/plustop.gif";
}

function expand(obj) {
	var el = getElem(obj);
	var elPar = getElem(obj + 'Img');
	el.style.display = '';
	elPar.src = "../images/minustop.gif";
}

function collapseAll(objs) {
	var i;
	for (i=0;i<objs.length;i++ ) {
		if (getElem(objs[i])) {
			collapse(objs[i]);
		}
	}
}

function expandAll(objs) {
	var i;
	for (i=0;i<objs.length;i++ ) {
		if (getElem(objs[i])) {
			expand(objs[i]);
		}
	}
}

function getElem(id)
{
    return (document.getElementById) ? document.getElementById(id) : document.all[id];
}

function popupMenu(elemId)
{
    var messagebox = document.getElementById(elemId);
    var lightbox = document.getElementById('lightbox');

    if (messagebox) {
        if (messagebox.style.display == 'block') {
            messagebox.style.display='none';
            currentPopup = null;
        } else {
            if (currentPopup) {
                hideLightbox();
            }
            //hideSelects('hidden');
            currentPopup = elemId;

            lightbox.style.top=document.body.scrollTop;
            lightbox.style.display='block';

            messagebox.style.top=document.body.scrollTop+300;
            messagebox.style.display='block';
        }
    }
}

function hideLightbox()
{
    hideSelects('visible');
    document.getElementById('lightbox').style.display='none';
    document.getElementById(currentPopup).style.display='none';
}

function hideSelects(visibility){
	selects = document.getElementsByTagName('select');
	for(i = 0; i < selects.length; i++) {
		selects[i].style.visibility = visibility;
	}
}

function showTagForm()
{
    if (document.getElementById('tagForm').style.display == 'block') {
        document.getElementById('tagForm').style.display='none';
    } else {
        document.getElementById('tagForm').style.display='block';
        document.forms['tagForm'].elements['tag'].focus();
    }
}

function fadeoutThis(id)
{
	new Effect.Fade(id,{ duration: 3 });
}

function highlightThis(id)
{
	new Effect.Highlight(id,{ startcolor:'#ffffff',endcolor:'#c8ffc7', delay: 0.1, duration: 0.75});
}

function showDisclaimer(start, end)
{
	new Effect.Highlight('disclaimer',{ startcolor:start,endcolor:end, delay: 0.1, duration: 0.75});
}

function toggleFields (showId, hideId)
{
	document.getElementById(hideId).style.display = 'none';
	document.getElementById(showId).style.display = 'inline';
}


function toggleCoverLabel ( id )
{
  var label = document.getElementById ( id );
  if ( label.style.visibility == 'visible' )
  {
    label.style.visibility = 'hidden';
  }
  else
  {
    label.style.visibility = 'visible';
  }
}

function imposeMaxLength(obj, maxlen)
{
  return (obj.value.length <= maxlen);
}

function getTimestamp ()
{
  return new Date().getTime();
}



var extdata_bibmap = new Object ();


var extdata = function ()
{
    var populated_hooks = new Array ();
    var info = new Object();
    var sources = new Array ('gbooks', 'shop');
    var populated = false;


    function receive (bookinfo, type)
    {
        info[type] = bookinfo;
        populateThumbnails (false);
    }


    function populateGoogleBooks (seen)
    {
        for (var isbn in info['gbooks']) {
            var bookinfo = info['gbooks'][isbn];
            var bibid = extdata_bibmap[bookinfo.bib_key];

            if (seen.find (function (elt) { return (elt == bibid); })) {
                continue;
            }

            var coverSpan = $("cover-" + bibid);
	
            if (coverSpan && bookinfo.thumbnail_url) {
		var formatSpan = $('gbooks_format_' + bibid);
		if (bookinfo.preview != 'noview' && formatSpan) {
		    formatSpan.style.visibility = 'visible';
		    formatSpan.style.display = 'inline';
		}

                coverSpan.innerHTML = buildCoverFragment (bibid,
                                                          bookinfo.preview_url,
                                                          bookinfo.thumbnail_url,
                                                          "Google books");

                seen.push (bibid);
            }
        }

        return seen;
    }


    function buildCoverFragment (bibid, link, thumbnail, caption)
    {
        return "<div align='center' class='resultsCover'>" +
        "  <a href='" + link + "'>" +
        "    <img  onmouseover='javascript:toggleCoverLabel(\"coverlabel-" + bibid + "\");' " +
        "          onmouseout='javascript:toggleCoverLabel(\"coverlabel-" + bibid + "\");'" +
        "          class='resultsCover' src='" + thumbnail + "' />" +
        "  </a>" +
        "  <span  id='coverlabel-" + bibid + "'  class='coverlabel'>" +
        "    <a href='" + link +  "' style='font-size:7pt;'>" + caption + "</a>" +
        "  </span>" +
        "</div>";
    }


    function populateOnlineShop (seen)
    {
        for (var isbn in info['shop']) {
            var bookinfo = info['shop'][isbn];
            var bibid = extdata_bibmap["ISBN:" + isbn];

            if (seen.find (function (elt) { return (elt == bibid) })) {
                continue;
            }

            var coverSpan = $("cover-" + bibid);

            if (!bookinfo.image.match (/noimage/)) {
                coverSpan.innerHTML = buildCoverFragment (bibid,
                                                          bookinfo.itemLink,
                                                          bookinfo.thumbnail,
                                                          "NLA Online Shop");
           }


            seen.push (bibid);
        }

        return seen;
    }


    function sourcesPending () {
        return sources.find (function (elt) { return !info[elt] });
    }


    function populateThumbnails (force)
    {
        if (populated) {
            return;
        }

        if (!force && sourcesPending ()) {
            return;
        }

        var seen = Array ();
        seen = populateOnlineShop (seen);
        seen = populateGoogleBooks (seen);

        populated_hooks.each (function (hook) {
                hook (info);
            });

        populated = true;
    }

    return {
        'add_hook' : function (fn) {
            populated_hooks.push (fn);
        },
        'receive' : receive
    };
}();



function receiveGoogleBooks (bookinfo)
{
    extdata.receive (bookinfo, 'gbooks');
}


function receiveOnlineShop (bookinfo)
{
    extdata.receive (bookinfo, 'shop');
}

function createRequestObject() {
    // find the correct xmlHTTP, works with IE, FF and Opera
    var xmlhttp;
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
            xmlhttp = null;
        }
    }

    if (!xmlhttp && typeof XMLHttpRequest!="undefined") {
        xmlhttp = new XMLHttpRequest();
    }

    return xmlhttp;
}

function autoBrowse ()
{
    var http = createRequestObject();
    var browse = getElem('browseon').value;
    var from = getElem('browsefor').value;
    var autoBrowseList = getElem('autoBrowseList');
    var responseHTML = '';
    
    if (from.length > 2) {
        http.open("GET", path + "/Browse/AJAX?method=getAutoBrowse&browse=" + browse + "&from=" + from, true);
        http.onreadystatechange = function ()
        {
            if ((http.readyState == 4) && (http.status == 200)) {
                var response = eval ('(' + http.responseText + ')');
                responseHTML += '<ul class="autoBrowse">';
                response.Browse.items.each (function (item) {
                    responseHTML += "<li onMouseOver=\"toggleClass(this,'highlight')\" " +
                        "onMouseOut=\"toggleClass(this,'highlight')\" " + 
                        "onMouseDown=\"getElem('browsefor').value = this.innerHTML;" +
                        "getElem('autoBrowseList').style.visibility='hidden';" +
                        "document.forms['browseForm'].submit();\" >" +
                        item.heading + "</li>";
                });
                responseHTML += '</ul>';
                responseHTML += '<span style="float:right;">' +
                    '<a style="font-size:90%;cursor:pointer" onClick="javascript:getElem(\'autoBrowseList\').style.visibility=\'hidden\'">' +
                    '(close)</a></span>';
                autoBrowseList.innerHTML = responseHTML;
                autoBrowseList.style.visibility = 'visible';
            }
        }        
        
        http.send(null);
    }
    else {
        autoBrowseList.style.visibility = 'hidden';
    }
}


function highlightSearchbox ($state)
{
    var searchbox = document.getElementById('searchbox');
    var lightbox = document.getElementById('lightbox');

    if ($state) {
     searchbox.style.zIndex = 100;
     lightbox.style.display = 'block';
    } else {
	searchbox.style.zIndex = 5;
	lightbox.style.display = 'none';
    }
}

