﻿/** RESOURCE SEARCH **/

var dropDownOpen = 0;
var checkedBoxes = [];
var timer;

var listOpen = [0,0,0,0,0,0];
var listMinHeight = [];
var listMaxHeight = [];

var advSearchToggle = 0;
var stoafToggle = 0;

// function to create a timer
function timeCheck() {
    return function( fun, time ) {
        clearTimeout( timer );
        timer = setTimeout( fun, time );
    };
}

// gets value by key
function getQuerystring(key, default_)
{
  if (default_==null) default_="";
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_;
  else
    return qs[1];
}

// Used to decide if a search is contains advanced search filters or not.
// Required to keep Advanced Search area toggled open.
function isAdvancedSearch() {
    var i;
    var isAdvanced = false;
    var keys = new Array();
    keys[0] = "locations";
    keys[1] = "Prices";
    keys[2] = "daysofweek";
    keys[3] = "starttimes";
    keys[4] = "lengthofcourses"; 
    for (i in keys) {
        if(getQuerystring(keys[i]).length > 0) {
            isAdvanced = true;
        }
    }
    return isAdvanced;
}

function bindDD(e){
    if (dropDownOpen == 0) {
            clickedID = ($(e).parent().attr("id"));
            storeCheckboxValues(clickedID);
            $("#" + clickedID + " span.searchOptions").show("slow");
            dropDownOpen = 1;
     }
}

function openCloseSliders() {

    // alert("openclose fired");
    // alert("stoafToggle = " + stoafToggle + " AND advSearchToggle = " + advSearchToggle);
    
    if (stoafToggle == 1) { $('.left_col_holder_bot .formSurround').css("display", "block"); }
    if (advSearchToggle == 1) {
        $('ol#advancedSearch').css("display", "block");
        $('li#stdGo').css("display", "none");
    }
}

// function to bind all the click events
function bindClickEvents() {
    
    //$('#advancedSearchPanel .labelWrapper').bind("click", bindDD());
    // Only close slider if this a basic search
    if(!isAdvancedSearch()) {
        openCloseSlider();
    }

    $('#advancedSearchPanel .searchOptions .cancel').bind("click", function(event) {
        clickedID = ($(this).parent().parent().parent().attr("id"));
        resetCheckboxes(clickedID);
        closeBox(clickedID);
        event.preventDefault();
    });


    $('#advancedSearchPanel .searchOptions .undoChanges').bind("click", function(event) {
        clickedID = ($(this).parent().parent().parent().parent().attr("id"));
        resetCheckboxes(clickedID);
        event.preventDefault();
    });

    $('#advancedSearchPanel .searchOptions .chooseAll').bind("click", function(event) {
        clickedID = ($(this).parent().parent().parent().parent().attr("id"));
        selectAll(clickedID);
        event.preventDefault();
    });

    $('li#keywords input').bind("keyup", function(event) {

        if ((event.keyCode == 8) ||
            (event.keyCode == 9) ||
            (event.keyCode == 10) ||
            (event.keyCode == 11) ||
            (event.keyCode == 12) ||
            (event.keyCode == 13) ||
            (event.keyCode == 14) ||
            (event.keyCode == 15) ||
            (event.keyCode == 127)) {
            // do nothing
        } else {
            $("#advancedSearchPanel .loading").parent().css("display", "block");
            var typeTimer = timeCheck();
            typeTimer(doKeywordPostback, 2000);
        }
    });
    
    //alert('clicksBound');
    
    $('#advancedSearchPanel a.viewAll').bind("click", function (event) {

        clickedID = ($(this).parent().attr("id"));
        clickedPos = ($(this).parent().attr("rel"));
        
        if (listOpen[clickedPos] == 0) {
            minHeight = listMinHeight[clickedPos];
            $("li#" + clickedID + " .selectedList").css({height: listMinHeight[clickedPos]}).animate({ height: listMaxHeight[clickedPos] }, 500); 
            $("li#" + clickedID + " a.viewAll span").text("Hide");
            $("li#" + clickedID + " a.viewAll").addClass("closed");
            listOpen[clickedPos] = 1;
        }
        
        else {
            $("li#" + clickedID + " .selectedList").css({height: listMaxHeight[clickedPos]}).animate({ height: listMinHeight[clickedPos] }, 500); 
            $("li#" + clickedID + " a.viewAll span").text("View all");
            $("li#" + clickedID + " a.viewAll").removeClass("closed");
            listOpen[clickedPos] = 0;
        }
        
        event.preventDefault();
    });
    
}

// function that is called when the apply selections button is clicked
function applySelection(button) {
    clickedID = ($(button).parent().parent().parent().attr("id"));
    storeCheckboxValues(clickedID);
    allChecked(clickedID);
    closeBox(clickedID);       
}

// function that is called whne Undo changes is clicked
function resetCheckboxes(clickedID) {
    var i = 0;
    $("#" + clickedID + " .searchOptions .checkboxes input").each(
        function() {
            if (checkedBoxes[i] == 1) {
                $(this).attr('checked',true);
                i++;
            } else {
                $(this).attr('checked',false);
                i++;
            }
        }
    );
}        

// function used when the user closes the box
function closeBox(clickedID) { 
    $("#" + clickedID + " span.searchOptions").hide("slow");
    dropDownOpen = 0;
}

// selects all checkboxes
function selectAll(clickedID) {
    $("#" + clickedID + " .searchOptions .checkboxes input").each(
        function() {
            $(this).attr('checked',true);
        }
    );
}

// checks if all tickboxes are checked, if they are unticks them all
function allChecked(clickedID) {
    var i = 0;
    var allChecked = 1;
    // alert(clickedID);
    $("#" + clickedID + " .searchOptions .checkboxes input").each(
        function() {
            if (checkedBoxes[i] == 1) {
                // alert(i + " = " + checkedBoxes[i]);
                i++;
            } else {
                i++;
                allChecked = 0;
            }
        }
    );
    
    // alert("All Checked = " + allChecked);
    
    if (allChecked == 1) {
        $("#" + clickedID + " .searchOptions .checkboxes input").each(
            function() {
                $(this).attr('checked',false);
            }
        );
        storeCheckboxValues(clickedID);
    }
}        

// function to store current checdkbox values into an array
function storeCheckboxValues(clickedID) {
    var i = 0;
    // alert('storeCheckboxValues called');
    // for each checkbox within the li
    $("#" + clickedID + " .searchOptions .checkboxes input").each(
        
        function() {
            var checkbox = this;
            
            // find out if its checked
            boxTicked = $(checkbox).attr('checked');
            
            if (boxTicked == true) {
                checkedBoxes[i] = 1;
                i++;
            } else {
                checkedBoxes[i] = 0;
                // alert(boxTicked + " has been stored in " + i + " as: " + checkedBoxes[i])
                i++;
            }
        }
    );    
}


function minimiseList() {
    $("li ul.selectedList").each(
        function() {
            clickedID = ($(this).parent().attr("id"));
            clickedPos = ($(this).parent().attr("rel"));
            
            liCount = $(this).children('li').size(); 
            
            listMaxHeight[clickedPos] = $(this).height();
            
            liHeight = 0;
            
            //alert("Pos = " + clickedPos + ", ul height = " + $(this).height())
            //alert("Pos = " + clickedPos + ", li count = " + liCount);
            
            if (liCount > 3) {
                var counter = 0;
                            
                $("li#"+clickedID+" ul.selectedList li").each(
                    function() {
                        if (counter < 3) {
                            //alert("this li has a height of " + $(this).height());
                            liHeight = liHeight + $(this).height();
                        }
                        counter = counter + 1
                    }
                );            
            liHeight = liHeight + 10;                
            
            //alert("Pos = " + clickedPos + ", li height = " + liHeight);
            
            listMinHeight[clickedPos] = liHeight;
            
            $("li#" +clickedID+ " ul.selectedList").css("height",liHeight);
            $("li#" +clickedID+ " a.viewAll").css("display","block");
            }
        }
    );
}

$(document).ready(function() {
    minimiseList();
    bindClickEvents();
});

function EndRequestHandler(sender, args) {
    if (args.get_error() == undefined) {
        // Rebind here
        dropDownOpen = 0;
        bindClickEvents();
        openCloseSliders();
        minimiseList();
    }
    else {
        var errorMessage;
        if (args.get_response().get_statusCode() == '200') {
            errorMessage = args.get_error().message;
        }
        else {
            // Error occurred somewhere other than the server page.
            errorMessage = 'An unspecified error occurred. ';
        }
        alert(errorMessage);
        args.set_errorHandled(true);
    }
}

function toggleAnimate(divId, anchor) {
    //-- simple function that toggles a div's animate, and alters its anchor
    //-- based on the class name of either "hidedetails" or "expanddetails"
    switch (anchor.className.toLowerCase()) {
        case "expanddetailson":
            $('#' + divId).animate({ height: 'hide', opacity: 'toggle' }, 700);
            anchor.className = "expanddetails";
            break;
        case "expanddetails":
            $('#' + divId).animate({ height: 'show', opacity: 'toggle' }, 700);
            anchor.className = "expanddetailsOn";
            break;
        default:
            alert("unknown class name " + anchor.className.toLowerCase());
    }
}