var s = YAHOO.util.Selector;
var dom = YAHOO.util.Dom;
var e = YAHOO.util.Event;

//Create namespace for our functions
YAHOO.namespace("cd");

var count = 0;

YAHOO.cd.setupAdvancedSearch = function() {
    YAHOO.namespace("cd.calendar");
    YAHOO.cd.calendar.init = function() {
        var eLog = dom.get("evtentries");
        function logEvent(msg) {
            var calInput = s.query("#calendarInput")[0];
            calInput.value = msg;
            var cal = dom.get("calContainer");
            hide(cal);
        }

        function dateToLocaleString(dt, cal) {
            var dStr = dt.getDate();
            var mStr = dt.getMonth() + 1;

            var yStr = dt.getFullYear();
            return (yStr + "-" + mStr + "-" + dStr);
        }

        function mySelectHandler(type, args, obj) {
            var selected = args[0];
            var selDate = this.toDate(selected[0]);
            logEvent(dateToLocaleString(selDate, this));
        }
        YAHOO.cd.calendar.cal = new YAHOO.widget.Calendar("cal",
                "calContainer", {
                    title :"Choose a date:",
                    close :true,
                    maxdate: maxDate,
                    mindate: minDate,
                    pagedate: maxDate
                });
        e.addListener("show2up", "click",
                YAHOO.cd.calendar.cal.show, YAHOO.cd.calendar.cal,
                true);
        YAHOO.cd.calendar.cal.selectEvent.subscribe(mySelectHandler,
                YAHOO.cd.calendar.cal, true);
        YAHOO.cd.calendar.cal.render();
        
    };
    
    e.onDOMReady(YAHOO.cd.calendar.init);
    setUpSearchRows();
};

function setUpSearchRows() {
    var fieldset = s.query("#searchRows")[0];
    var rows = s.query("#searchRows div");
    var link = document.createElement("a");
    link.innerHTML="Add Row";
    link.id ="addRow";    
    // We already have some rows.
    count = rows.length;
    e.addListener(link, "click", function(){ addSearchRow(count); });
    dom.insertAfter(link, rows[rows.length - 1]); 
    toggleRowButtons();
}

function removeSearchRow() {
    
    var rows = s.query("#searchRows")[0];
    var row =  this.parentNode;
    if(!rows){
        rows = this.parentElement;
    }
    rows.removeChild(row);
    toggleRowButtons();
}

function addSearchRow(id) {
    count++;
    var rows = s.query("#searchRows div");
    var lastRow = rows[rows.length - 1];
    
    var handleSuccess = function(o) {
     var txt = o.responseText;
     if (txt !== null) {
            dom.insertAfter(textAsDom(txt), lastRow); 
            toggleRowButtons();
     }
    };

    var handleFailure = function() {
        alert("There was a problem processing your request, please try again later");
    };
    
    var l = window.location;
    var url = l.protocol + "//";
    url += l.host;
    url += l.pathname;
    url += "?getSearchRow="+count;
    YAHOO.util.Connect.asyncRequest('GET', url,
                        { success :handleSuccess,
                          failure :handleFailure });  
}

function textAsDom(text){
     var el = document.createElement("div");
     el.innerHTML = text;
     return dom.getFirstChild(el);
}

function toggleRowButtons() {
    /* If there's only one row, hide the remove button*/
    var rows = s.query("#searchRows div");
    if(rows.length == 1){
        var img = s.query("#searchRows div .remove")[0];
        var parent = img.parentNode;
        parent.removeChild(img);
    }else{
        for(var i in rows){
            /*If there's no remove button, add one */
            if(s.query(".remove",rows[i]).length == 0){
                var input = document.createElement("img");
                input.src="images/style/delete.gif";
                input.title="Remove row";
                dom.setStyle(input,"cursor","pointer");
                var rowId = rows[i].id;
                e.addListener(input, "click", removeSearchRow);
                dom.addClass(input,"remove");
                dom.insertAfter(input, rows[i].lastChild);
            }
        }
    }
    var booleanSelect = s.query("#searchRows .booleanSelect")[0];
    if(booleanSelect){
        dom.setStyle(booleanSelect, "visibility", "hidden");
    }
}

YAHOO.cd.setupSearchResults = function() {
    YAHOO.cd.setUpResultsPerPage();
    YAHOO.cd.setUpRefinements();
    YAHOO.cd.setUpCheckall();
    YAHOO.cd.setUpMarkStars();
    YAHOO.cd.setUpEventTracking();
};

/* Track result clicks and record-marking along with the result number,
 * this is for relevence tracking so we know if users are clicking the top
 * results or not. */
YAHOO.cd.setUpEventTracking = function(){
    var sortOrder = s.query('#order option[selected]');
    // No sort order in marked records pages.
    // Shouldn't be tracking on marked records pages anyway. return.
    if(!sortOrder){
        return;
    }
    sortOrder = sortOrder[0].value;
    
    var results = s.query('.searchResult');
    
    
    dom.batch(results, function(result){
        var resultNum = s.query('.resultNumber', result, true).innerHTML;
        
        var links = s.query('a.resultLink', result);
        var star = s.query('a.recordSelector', result);
        e.addListener(links, "click", function() {YAHOO.cd.trackResultClick(resultNum, sortOrder);});
        e.addListener(star, "click", function() {YAHOO.cd.trackResultMark(resultNum, result, sortOrder);});
    });
};

YAHOO.cd.trackResultClick = function(resultNum, sortOrder){
    _gaq.push(['_trackEvent', 'SearchResultClicked', sortOrder, resultNum]);
};

YAHOO.cd.trackResultMark = function(resultNum, result, sortOrder){
    //Only track if we're marking, not unmarking
    if(dom.hasClass(result, "inactive")){
        _gaq.push(['_trackEvent', 'SearchResultMarked', sortOrder, resultNum]);
    }
};


YAHOO.cd.setUpResultsPerPage = function(){
    var ro = s.query(".resultOverview form")[0];
    if (!ro) {
        return;
    }
    //Results per page selector
    var submit = s.query("input[type=submit]", ro)[0];
    hide(submit);
    var selects = s.query("select", ro);
    dom.batch(selects, function(select){
        e.addListener(select, "change", function() {
            ro.submit();
        });
    });
};

YAHOO.cd.setUpMarkStars = function(){
    var stars = s.query("#centreColumn .recordSelector");
    e.on(stars, 'click', YAHOO.cd.handleStarClick);
};

YAHOO.cd.handleStarClick = function(ev){    
    e.preventDefault(ev);
    var pa = new QueryString(this.search).get("pa", null);
    
    if(pa == null){
        alert("Error: Unknown record ID, can't add to marked records.");
    }
    
    var resultElement = s.query("#pa"+pa, null, true);
    var toggleUrl = "toggle_marked_record_ajax.html?pa="+pa;
    
    var handleSuccess = function(o) {
        if (o.responseText !== undefined) {
            dom.removeClass(resultElement,"waiting");
            switch(YAHOO.lang.trim(o.responseText)){
                case "ADDED":
                    dom.replaceClass(resultElement,"inactive","active");
                    var star = s.query(".recordSelector", resultElement, true);
                    star.setAttribute("title", "Remove from Marked Records");
                    break;
                case "REMOVED":
                    dom.replaceClass(resultElement,"active","inactive");
                    var star = s.query(".recordSelector", resultElement, true);
                    star.setAttribute("title", "Add to Marked Records");
                    break;
                case "NOT_ADDED":
                    alert("You have marked too many records, please un-mark some records and try again.");
                    break;
                default:
                    alert("Error marking record:" + YAHOO.lang.trim(o.responseText));
            }
        }
    };

    var handleFailure = function() {
        alert("There was a problem marking your record. Please try again later.");
    };

    var callback = {
        success :handleSuccess,
        failure :handleFailure
    };
    
    dom.addClass(resultElement,"waiting");

    YAHOO.util.Connect.asyncRequest('POST', toggleUrl, callback);
};

YAHOO.cd.setUpCheckall = function() {
    var allNoneTop = dom.get("allNoneTop");
    var allNoneBottom = dom.get("allNoneBottom");
    var markup = 'Mark: <a class="selectAll" href="#">All</a> / <a class="selectNone" href="#">None</a>';
    allNoneTop.innerHTML = markup;
    allNoneBottom.innerHTML = markup;
    
    e.on(s.query(".selectAll"), 'click', YAHOO.cd.handleCheckAll);
    e.on(s.query(".selectNone"), 'click', YAHOO.cd.handleUncheckAll);
};

YAHOO.cd.handleCheckAll = function(ev){
    YAHOO.cd.handleCheckOrUncheckAll(ev, ".inactive", "add_marked_records_ajax.html");
};

YAHOO.cd.handleUncheckAll = function(ev){
    YAHOO.cd.handleCheckOrUncheckAll(ev, ".active", "remove_marked_records_ajax.html");
};

YAHOO.cd.handleCheckOrUncheckAll = function(ev, selector, url){
    e.preventDefault(ev);
    var pas = YAHOO.cd.getPagePas(selector);
    if(pas.length == 0){
        return;
    }
    
    var toggleUrl = url+"?pa=" + pas[0];
    for(var i = 1; i < pas.length; i++){
        toggleUrl += "&pa=" + pas[i];
    }
    
    var resultElements = s.query(".selectAllNone");
    
    var handleFailure = function() {
        alert("There was a problem marking your record. Please try again later.");
    };
    
    var handleSuccess = function(o) {
        YAHOO.cd.handleToggleAll(resultElements, o);
    };

    var callback = {
        success :handleSuccess,
        failure :handleFailure
    };
    
    dom.addClass(resultElements,"waiting");

    YAHOO.util.Connect.asyncRequest('POST', toggleUrl, callback);
};

YAHOO.cd.getPagePas = function(preSelector) {
    var stars = s.query(preSelector +" .recordSelector");
    var paPages = new Array();
    dom.batch(stars, function(star){
            var pa = new QueryString(star.search).get("pa", null);
            if(pa != null){
                paPages.push(pa);
            }
    });
    return paPages;
};

YAHOO.cd.handleToggleAll = function(resultElements, o) {
    if (o.responseText !== undefined) {
        dom.removeClass(resultElements,"waiting");
        var resultElements = s.query(".searchResult");
        var starElements = s.query(".recordSelector");
        switch(YAHOO.lang.trim(o.responseText)){
            case "ADDED":
                dom.replaceClass(resultElements,"inactive","active");
                dom.batch(starElements, function(el){el.setAttribute("title", "Remove from Marked Records");});
                break;
            case "REMOVED":
                dom.replaceClass(resultElements,"active","inactive");
                dom.batch(starElements, function(el){el.setAttribute("title", "Add to Marked Records");});
                break;
            case "NOT_ADDED":
                alert("You have marked too many records, please un-mark some records and try again.");
                break;
            default:
                alert("Error marking records: " +YAHOO.lang.trim(o.responseText));
        }
    }
};

YAHOO.cd.setupSearchInput = function() {
    var input = dom.get("search");
    if(!input){ return; }
    
    var box = document.createElement("textarea");
    box.setAttribute("name",input.getAttribute('name'));
    box.setAttribute("id",input.getAttribute('id'));
    box.setAttribute("class",input.getAttribute('class'));
    box.value =  input.defaultValue;
    
    input.parentNode.replaceChild(box, input);
    input = box;
    YAHOO.cd.resizeTextArea(input);
    
    var label = s.query("#searchbox label")[0];
    hide(label);
        
    var form = s.query("#quickSearch")[0];
    
    //if there's no default value, set up the label default text
    if(input.value == null || input.value == ''){
        var def = label.innerHTML;
        input.value = def;
        input.onfocus = function() {
            if (this.value === def) {
                this.value = '';
            }
        };
        input.onblur = function() {
            if (this.value === '') {
                this.value = def;
            }
        };
    }
    
    input.onkeydown = function(e){
        // If enter is pressed... submit form
        var key;
        if(e){
            key = e.which;
        }
        if(typeof event != 'undefined'){
            key = event.keyCode;
        }
        if(key == 13){
            dom.get("quickSearch").submit();
            return false;
        }else{
            return true;
        }
    };
    
    input.onkeyup = function() {YAHOO.cd.resizeTextArea(input); };
    
    form.onsubmit = function() {
        if (input.value === def) {
            input.value = '';
        }
    };
};

YAHOO.cd.resizeTextArea = function(input){
    var height = dom.getStyle(input, 'height'); 
    var newHeight = input.scrollHeight + 'px'; 
    if (height != newHeight) {
        dom.setStyle(input, 'height', newHeight);
    }
};

YAHOO.cd.setUpRefinements = function() {
    var moreLinks = s.query("#refinements dd ul li.moreLink a");
    var toggleListVar = s.query("#refinements  dt.trigger");

    for ( var j = 0; j < toggleListVar.length; j++) {
        YAHOO.cd.setUpToggles(toggleListVar[j]);
    }

    for ( var i = 0; i < moreLinks.length; i++) {
        YAHOO.cd.setUpMoreLink(moreLinks[i]);
    }
};

YAHOO.cd.setUpToggles = function(list) {
    var toggleCookie = YAHOO.util.Cookie.get("toggle");
    var toggleState;
    if(toggleCookie != null){
        var toggleState = YAHOO.util.Cookie.getSub("toggle", list.id);
    }
    var close = true;
    
    //CC is open unless otherwise stated
    if(list.id == 'toggle_subject_facet' 
        && toggleState == null){
        close = false;
    }
    
    if (close && toggleState != "open") {
        var listId = list.id.substring(7);
        hide(s.query("#refinements  dd#" + listId));
        dom.replaceClass(list, "open", "closed");
    }
    
    e.addListener(list, "click", toggleList);
};

YAHOO.cd.setUpMoreLink = function(link) {
    var qs = new QueryString(link.search);
    var theRefinement = qs.get("expand");

    e.addListener(link, "click", function(ev) {
        makeRefinementRequest(link.href, theRefinement);
        e.preventDefault(ev);
    });

};

function toggleList() {
    var id = this.id;
    // Pull out the ID (our id is toggle_{id})
    var listId = id.substring(7);
    var list = s.query("#refinements  dd#" + listId);
    if (dom.getStyle(list, "display") == "block") {
        YAHOO.util.Cookie.setSub("toggle", id, "closed");
        hide(list);
        dom.replaceClass(dom.get(id), "open", "closed");
    } else {
        YAHOO.util.Cookie.setSub("toggle", id, "open");
        showBlock(list);
        dom.replaceClass(dom.get(id), "closed", "open");
    }
}

function makeRefinementRequest(url, refinement) {
    var li = s.query("#refinements dd#" + refinement + " li.moreLink")[0];
    dom.addClass(li, "waiting");
    hide(s.query("#refinements dd#" + refinement + " li.moreLink a")[0]);
    var sUrl = url + encodeURI("&refinement=" + refinement);
    var div = dom.get(refinement);

    var handleSuccess = function(o) {
        if (o.responseText !== undefined) {
            div.innerHTML = o.responseText;
            dom.replaceClass(li, "waiting", "moreSearchLink");
        }
    };

    var handleFailure = function() {
        // Send the user on to the non-ajax version of the page if we fail.
        window.location = encodeURI(url + "&expand=" + refinement);
        dom.replaceClass(li, "waiting", "moreSearchLink");
    };

    var callback = {
        success :handleSuccess,
        failure :handleFailure
    };

    YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
}

function hideForm(formSelector, linkText){
    var formEl = s.query(formSelector);
    if( !formEl || !formEl[0] ){ return; }
    
    formEl = formEl[0];
    var p = document.createElement("p");
    var a = document.createElement("a");
    a.innerHTML=linkText;
    e.addListener(a, "click", 
        function(ev){ 
            e.preventDefault(ev); 
            showBlock(formEl);
            hide(this);
        }
    );
    a.href="#";
    p.appendChild(a);
    dom.insertAfter(p,formEl);
    hide(formEl);
}

YAHOO.cd.hideSamsLogin = function(){
    var sel ="#leftColumn form.loginForm";
    var form = s.query(sel)[0];
    if(!form){return;}
    
    if(document.getElementById('logOutForm')){
        hideForm(sel,"Log into a different account");
    }else{
        hideForm(sel,"Log into CAB Direct");
        var p = document.createElement("p");
        p.innerHTML = "You are not logged into CAB Direct";
        dom.insertBefore(p,form);
    }
};

YAHOO.cd.hideMyCDLogin = function(){
    var form = document.getElementById('myCdLogin');
    if(!form){return;}
    hideForm("#myCdLogin","MyCABDirect");
};

YAHOO.cd.setupToggleSubs = function(){
    var details = document.getElementById('subscriptionUnits');
    if( !details ){ return; }
    
    var a = document.createElement("a");
    if(document.body.id != "homePage"){
        a.innerHTML="Show&nbsp;Details";
    }else{
        a.innerHTML="Hide&nbsp;Details";
    }
    e.addListener(a, "click", 
        function(ev){ 
            e.preventDefault(ev);
            toggle(details);
            if(dom.getStyle(details,'display') != "none"){
                a.innerHTML = "Hide&nbsp;Details";
            }else{
                a.innerHTML="Show&nbsp;Details";
            }
        }
    );
    a.href="#";
    dom.insertBefore(a,details);
    //Don't hide subscription units on the home page
    if(document.body.id != "homePage"){
        hide(details);
    }
};

function showBlock(e) {
    dom.setStyle(e, "display", "block");
}

function showInline(e) {
    dom.setStyle(e, "display", "inline");
}

function hide(e) {
    dom.setStyle(e, "display", "none");
}

function toggle(e){
    if(dom.getStyle(e,'display') != "none"){
        hide(e);
    }else{
        showBlock(e);
    }
}

/*
 * Client-side access to querystring name=value pairs Version 1.3 28 May 2008
 * 
 * License (Simplified BSD): http://adamv.com/dev/javascript/qslicense.txt
 */
/* NOTE: This class only handles single-valued parameters. */
function QueryString(qs) { // optionally pass a querystring to parse
    this.params = {};

    if (qs === null) {
        qs = location.search.substring(1, location.search.length);
    }
    if (qs.length === 0) {
        return;
    }

    // Turn <plus> back to <space>
    // See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
    qs = qs.replace(/\+/g, ' ');
    
    //Remove leading question mark if exists
    qs = qs.replace(/^\?/,'');
    
    var args = qs.split('&'); // parse out name/value pairs separated via &

    // split out each name=value pair
    for ( var i = 0; i < args.length; i++) {
        var pair = args[i].split('=');
        var name = decodeURIComponent(pair[0]);
        var value = (pair.length === 2) ? decodeURIComponent(pair[1]) : name;
        this.params[name] = value;
    }
}

QueryString.prototype.get = function(key, default_) {
    var value = this.params[key];
    return (value !== null) ? value : default_;
};

QueryString.prototype.contains = function(key) {
    var value = this.params[key];
    return (value !== null);
};

YAHOO.cd.performLoadEvents = function() {
    // Every page needs the search box setting up
    YAHOO.cd.setupSearchInput();
    YAHOO.cd.hideSamsLogin();
    YAHOO.cd.hideMyCDLogin();
    YAHOO.cd.setupToggleSubs();
    switch (document.body.id) {
        case "searchResults":
            YAHOO.cd.setupSearchResults();
            break;
        case "advancedSearch":
            YAHOO.cd.setupAdvancedSearch();
            break;
        case "print":
        	window.print();
        	break;
    
        case "allbookmarks":
            YAHOO.cd.setupAllBookmarks();
            break;
    }
};

YAHOO.cd.setupAllBookmarks = function(){
    var savedSearches = s.query("#secondColumn .mySavedSearches", null, true);
    var allNone = document.createElement("p");
    dom.addClass(allNone, "rightLink");
    dom.addClass(allNone, "selectAllNone");
    allNone.innerHTML = 'Select: <a href="#" class="selectAll">All</a> / <a href="#" class="selectNone">None</a>';
    dom.insertBefore(allNone, savedSearches);
    
    var allNoneBottom = document.createElement("p");
    dom.addClass(allNoneBottom, "rightLink");
    dom.addClass(allNoneBottom, "selectAllNone");
    allNoneBottom.innerHTML = allNone.innerHTML;
    
    dom.insertAfter(allNoneBottom, savedSearches);
    e.on(s.query(".selectAll"), "click", function(ev){YAHOO.cd.checkPaBoxes(ev, true);});
    e.on(s.query(".selectNone"), "click", function(ev){YAHOO.cd.checkPaBoxes(ev, false);});
    
    e.on(s.query("#secondColumn form"), "submit", YAHOO.cd.paBoxesChecked);
};

YAHOO.cd.checkPaBoxes = function(ev, check){
    e.preventDefault(ev);
    var boxes = s.query("input[name=pa]");
    dom.batch(boxes, 
            function(box){ 
                box.checked = check; 
            }
    );
};

YAHOO.cd.paBoxesChecked = function(ev){
    var boxes = s.query("input[name=pa]:checked");
    if(boxes == null || boxes.length == 0){
        e.preventDefault(ev);
        alert("Please select some bookmarks first.");
    }
};


e.onDOMReady(YAHOO.cd.performLoadEvents);
