 var classesPerPage=10;
 var page=1;
 var numerOfPages=0;
 var scrollpos=0;
 var classes = [];
 var selectors = { price: [], status: [], level: [], technique: [], instructor: [], series: [] };
 function searchInit()
 {
    initRadios();
    restoreState();
 }

 function reset()
 {
    for (var ii=0; ii<document.filter.elements.length; ii++)
    {
        var elem = document.filter.elements[ii];
        if (elem.type == 'radio')
        {
            elem.checked = (elem.value == "any");
        }
        else if (elem.type == 'select-one' && elem.name != 'perpage')
        {
            elem.selectedIndex = 0;
        }
    }
    page=1;
    saveState();
 }
 function clickFilter()
 {
    page=1;
    saveState();
 }
 function clickPage(pageval)
 {
    page=pageval;
    saveState();
 }
 function saveState()
 {
    var stateVector = initStateVector();
    stateVector.classesPerPage = document.pageset.perpage.value,
    stateVector.classesPerPageIdx = document.pageset.perpage.selectedIndex,
    stateVector.page = page
    stateVector.scrollpos = document.body.scrollTop;
    for (var ii=0; ii<document.filter.elements.length; ii++)
    {
        var elem = document.filter.elements[ii];
        if (elem.type == 'select-one')
        {
            stateVector.controls[elem.name].idx = elem.selectedIndex;
            stateVector.controls[elem.name].value = elem.value;
        }
        else if (elem.type == 'radio' && elem.checked)
        {
            stateVector.controls[elem.name].value = elem.value;
        }
    }
    var jsonStateVector = JSON.stringify(stateVector);
    
    Set_Cookie( 'classsearch', jsonStateVector, 0, '/');
    displaySelection(stateVector);
 }

 function initStateVector()
 {
        return {
            "classesPerPage": 10,
            "classesPerPageIdx": 1,
            "page": 1,
            "scrollpos": 0,
            "controls": {
                "status": { },
                "level": { },
                "technique": { },
                "instructor": { },
                "price": { },
                "series": { }
            }
        };
 }

 function restoreState()
 {
    var stateCookie = Get_Cookie('classsearch');
    var stateVector = null;
    if (stateCookie)
    {
        stateVector = JSON.parse(stateCookie);
        setRadios(stateVector);
        displaySelection(stateVector);
    }
    else
    {
        saveState();
    }
 }

 function displaySelection(stateVector)
 {
    var displayedClasses = [];
    for (var idx = 0; idx < classes.length; idx++)
    {
        var cls = classes[idx];
        if (   itContains( stateVector.controls.status.value, cls.status, 0 )
            && itContains( stateVector.controls.level.value, cls.level , 0)
            && itContains( stateVector.controls.technique.value, cls.technique , 0)
            && itContains( stateVector.controls.price.value, cls.price , 0)
            && itContains( stateVector.controls.instructor.value, cls.instructor , 0)
            && itContains( stateVector.controls.series.value, cls.series , 0)
            )
        {
            displayedClasses[displayedClasses.length]=cls;
        }
    }
    numberOfPages = 1 + Math.floor(displayedClasses.length / stateVector.classesPerPage);
    if (displayedClasses.length % stateVector.classesPerPage == 0)
    {
        numberOfPages --;
    }
    
    var outHtml = '<h2>Sorry, there were no matches for your selection. Try selecting "Any" as a filtering option to broaden your selection.</h2>';
    var pageSelector = '';
    if (displayedClasses.length != 0)
    {
        // We've got something to show, so clear the error message and get ready for the 
        // result set.
        outHtml = '';
        
        pageSelector = getPageSelector(numberOfPages, stateVector.page);

        document.getElementById("page_selector_top").innerHTML=pageSelector;
        document.getElementById("page_selector_bottom").innerHTML=pageSelector;
        
        outHtml = '<table class="classlist" border="0" cellspacing="0" cellpadding="0" width="575">'
        		+ '<tr>' + '<td BGCOLOR="#797A12">'
                + '<table class="classlist" border="0" cellspacing="3" cellpadding="5" width="100%">'
		;
	    var side = "left";
	    var lowerLimit = (stateVector.page - 1) * stateVector.classesPerPage;
	    var upperLimit = stateVector.page * stateVector.classesPerPage;
        for (var ii=lowerLimit; ii<displayedClasses.length && ii < upperLimit; ii++)
        {
            // Build each row.  The IF statement here makes sure 
            // the particular row is on the current "page"
            if (ii >= lowerLimit && ii < upperLimit) 
            {
                // Just for convenience, we'll build a couple of local variables
                // to hold stuff that takes a lot to construct.
                var cid   = displayedClasses[ii].id;
                var ttl   = displayedClasses[ii].title;
                if ( ttl.indexOf('Coming Soon!') == 0 )
                {
                    ttl = ttl.substring(12);
                }
                var context = {
                    'classname': ttl,
                    'classurl': 'http://www.beaducation.com/classes/?p=detail&amp;id=' + cid,
                    'classlevel': displayedClasses[ii].level,
                    'classtechnique': displayedClasses[ii].technique,
                    'classseries': displayedClasses[ii].series,
                    'classinstructor': displayedClasses[ii].instructor,
                    'instructorurl': 'http://www.beaducation.com/classes/?p=faculty#instructor-' + displayedClasses[ii].instructor_id,
                    'imgurl': 'http://www.beaducation.com/djmedia/event/size/' + cid + '_250.jpg'
                };

                var midHtml = '<br/>' + ttl;
                midHtml = classDetailCell(context);

                if ( side == "left" )
                {
                    outHtml += '<tr class="listtext">' + midHtml;
                    side = "right";
                }
                else
                {
                    outHtml += midHtml + '</tr>';
                    side = "left";
                }
            }
        }
	    if (side == "right")
        {
            outHtml += '<td width="250">&nbsp;</td></tr>';
        }
        outHtml += '</table>' +'</td>' + '</tr>' + '</table>';
    }
    // write the newly constructed result set into the "list_of_classes" div
    document.getElementById('list_of_classes').innerHTML=buildSelectionText(stateVector) + outHtml;
    document.body.scrollTop = stateVector.scrollpos;
 }

 function classDetailCell(data)
 {
		var cellHtml = '<td width="50%" align="center"><table border="0" cellpadding="0" cellspacing="0"><tr><td class="title">Name:</td><td><b><a href="'
			+ data.classurl + '" onclick="saveState();">' + data.classname + '</a></b></td></tr>'
			+ '<tr><td class="title">Level:</td><td>' + data.classlevel + '</td></tr>'
			+ '<tr><td class="title">Technique:&nbsp;&nbsp;</td><td>' + data.classtechnique + '</td></tr>'
			+ '<tr><td class="title">Series:&nbsp;&nbsp;</td><td>' + data.classseries + '</td></tr>'
			+ '<tr><td class="title">Instructor:</td><td><a href="' + data.instructorurl + '" onclick="saveState();">'
			+ data.classinstructor + '</a></td></tr>'
			+ '<tr><td colspan="2"><a href="' + data.classurl + '" onclick="saveState();"><img src="' + data.imgurl
				+ '" alt="' + data.classname  
				+ '" title="' + data.classname  
				+ '" border="0" class="imgborder"/></a></td></tr></table><br></td>';
        return cellHtml;
 }

 function buildSelectionText(stateVector)
 {
    comma = '';
    var selectionText = '<div class="selection_text">';
    for (var item in stateVector.controls)
    {
        selectionText += comma + '<b>' + item + ':</b> ' + stateVector.controls[item].value;
        comma = ',&nbsp;';
    }
    selectionText += '</div>';
    return selectionText;
 }
 function getPageSelector(numberOfPages, currentPage)
 {
    var pageSelector = '';
    // Write out the "page selector".  
    if (numberOfPages > 1)
    {
        for (var ii=1; ii<=numberOfPages; ii++)
        {
            if (ii == currentPage)
            {
                pageSelector += '<span class="selected">' + ii + '</span>';
            }
            else
            {
                pageSelector += '<a href="#" onclick="clickPage(' + ii + ');">' + '<span class="linked">' + ii + '</span>' + '</a>';
            }
        }
    }
    return pageSelector;
 }

 function itContains(filterValue, theVal, isDebug)
 {
    if (filterValue == 'any' || filterValue == theVal)
    {
        return true;
    }
    return false;
 }

 function radioselect(title, radioname, selector_arr, extra, omit)
 {
   var output = '<br/><b>' + title + '</b>';
   if (extra) 
   {
     output += "&nbsp;" + extra;
   }
   output += '<br/><input type="radio" name="' + radioname + '" value="any" onclick="clickFilter();" checked>&nbsp;Any<br/>';
   var vn;
   for (var ii=0; ii<selector_arr.length ; ii++)
   {
     vn = selector_arr[ii].name;
     if (!(omit && omit[vn]))
     {
     output +='<input type="radio" name="' + radioname + '" value="' + vn + '" onclick="clickFilter();">&nbsp;' + vn + "<br/>\n"; 
     }
   }
   return output;
 }
 function comboselect(title, radioname, selector_arr, extra, omit)
 {
   var output = '<br/><b>' + title + '</b>';
   if (extra) 
   {
     output += "&nbsp;" + extra;
   }
   output += '<br/><select name="' + radioname + '" onchange="clickFilter();" class="filtercombo">';
   output += '<option value="any" selected>Any</option>';
   var vn;
   for (var ii=0; ii<selector_arr.length ; ii++)
   {
     vn = selector_arr[ii].name;
     if (!(omit && omit[vn]))
     {
       output += '<option value="' + vn + '">' + vn + '</option>';
     }
   }
   output += "</select><br/>\n";
   return output;
 }

 function setRadios(data)
 {
    
    page = data.page;
    var selbox = document.forms['filter'].technique;
    selbox.selectedIndex = data.controls.technique.idx;
    selbox = document.forms['filter'].level;
    selbox.selectedIndex = data.controls.level.idx;
    selbox = document.forms['filter'].instructor;
    selbox.selectedIndex = data.controls.instructor.idx;
    selbox = document.forms['filter'].status;
    selbox.selectedIndex = data.controls.status.idx;
    document.pageset.perpage.selectedIndex = data.classesPerPageIdx;
    setCheckedValue(document.filter.elements['series'], data.controls.series.value);
    setCheckedValue(document.filter.elements['price'], data.controls.price.value);
 }

 function initRadios()
 {
   var radiobuttons = 
      comboselect("By&nbsp;Technique", 'technique', selectors.technique, null, null )
    + comboselect("By&nbsp;Skill&nbsp;Level", 'level', selectors.level , '(<A HREF="#" onclick="levelPopup();">info</A>)', null)
    + comboselect("By&nbsp;Instructor", 'instructor', selectors.instructor, null, null )
    + comboselect("By&nbsp;Status", 'status', selectors.status, null, { Active: 1 } )
    + radioselect("By&nbsp;Series", 'series', selectors.series, null, { Active: 1 } )
    + radioselect("By&nbsp;Price", 'price', selectors.price, null, null, {Active: 1 } )
    ;
    var dest = document.getElementById("filterset");
    dest.innerHTML=radiobuttons;
 }

 function levelPopup()
 {
    window.open("http://www.beaducation.com/?p=skill_level","","width=180,height=510,toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,left=50,top=50,titlebar=yes");
 }
var MAX_DUMP_DEPTH = 10;

      
function dumpObj(obj, name, indent, depth) 
{
    if (depth > MAX_DUMP_DEPTH) {
        return indent + name + ": <Maximum Depth Reached>\n";
    }
    if (typeof obj == "object") {
        var child = null;
        var output = indent + name + "\n";
        indent += "\t";
        for (var item in obj)
        {
            try {
                child = obj[item];
            } catch (e) {
                child = "<Unable to Evaluate>";
            }
            if (typeof child == "object") {
                output += dumpObj(child, item, indent, depth + 1);
            } else {
                output += indent + item + ": " + child + "\n";
            }
        }
        return output;
    } else {
        return obj;
    }
}

function Set_Cookie( name, value, expires, path, domain, secure )
{
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime( today.getTime() );

    /*
    if the expires variable is set, make the correct
    expires time, the current script below will set
    it for x number of days, to make it for hours,
    delete * 24, for minutes, delete * 60 * 24
    */
    if ( expires )
    {
        expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date( today.getTime() + (expires) );

    document.cookie = name + "=" +escape( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
    ( ( path ) ? ";path=" + path : "" ) +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
}

function Get_Cookie( check_name ) {
    // first we'll split this cookie up into name/value pairs
    // note: document.cookie only returns name=value, not the other components
    var a_all_cookies = document.cookie.split( ';' );
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = false; // set boolean t/f default f

    for ( i = 0; i < a_all_cookies.length; i++ )
    {
        // now we'll split apart each name=value pair
        a_temp_cookie = a_all_cookies[i].split( '=' );


        // and trim left/right whitespace while we're at it
        cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

        // if the extracted name matches passed check_name
        if ( cookie_name == check_name )
        {
            b_cookie_found = true;
            // we need to handle case where cookie has no value but exists (no = sign, that is):
            if ( a_temp_cookie.length > 1 )
            {
                cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
            }
            // note that in cases where cookie is initialized but no value, null is returned
            return cookie_value;
            break;
        }
        a_temp_cookie = null;
        cookie_name = '';
    }
    if ( !b_cookie_found )
    {
        return null;
    }
}

function setCheckedValue(radioObj, newValue) {
    if(!radioObj)
        return;
    newValue = newValue.toString().toLowerCase();
    var radioLength = radioObj.length;
    if(radioLength == undefined)
    {
        radioObj.checked = (radioObj.value.toLowerCase() == newValue);
        return;
    }
    for(var i = 0; i < radioLength; i++)
    {
        radioObj[i].checked = false;
        if(radioObj[i].value.toLowerCase() == newValue)
        {
            radioObj[i].checked = true;
            return;
        }
    }
}

