/*
 * Setup filtering of job listings
 *
 * The assumption made here is that the categories are shared
 * amongst all job listing types (All, Full-time, Freelance)
 */
var filterResults={listTypes:[],exceptionLimit:2,listings:[],cookieJobTypeName:"jobtype",cookieCategoryName:"categories",cookieSearchName:"searchterm",cookieOptions:{path:"/",expires:360,domain:window.location.host},type:[],cats:[],search:"",state_list:{AL:"Alabama",AK:"Alaska",AZ:"Arizona",AR:"Arkansas",CA:"California",CO:"Colorado",CT:"Connecticut",DE:"Delaware",DC:"District Of Columbia",FL:"Florida",GA:"Georgia",HI:"Hawaii",ID:"Idaho",IL:"Illinois",IN:"Indiana",IA:"Iowa",KS:"Kansas",KY:"Kentucky",LA:"Louisiana",ME:"Maine",MD:"Maryland",MA:"Massachusetts",MI:"Michigan",MN:"Minnesota",MS:"Mississippi",MO:"Missouri",MT:"Montana",NE:"Nebraska",NV:"Nevada",NH:"New Hampshire",NJ:"New Jersey",NM:"New Mexico",NY:"New York",NC:"North Carolina",ND:"North Dakota",OH:"Ohio",OK:"Oklahoma",OR:"Oregon",PA:"Pennsylvania",RI:"Rhode Island",SC:"South Carolina",SD:"South Dakota",TN:"Tennessee",TX:"Texas",UT:"Utah",VT:"Vermont",VA:"Virginia",WA:"Washington",WV:"West Virginia",WI:"Wisconsin",WY:"Wyoming"},setup:function(){if($.cookie(this.cookieJobTypeName)===null){$.cookie(this.cookieJobTypeName,"All",this.cookieOptions)}if($.cookie(this.cookieCategoryName)===null){var a="";$.each(this.listTypes,function(b,c){if(c.name=="All"){$.each(c.categories,function(d,e){if(d==c.categories.length-1){a+=e.catid}else{a+=e.catid+","}})}});$.cookie(this.cookieCategoryName,a,this.cookieOptions)}if($.cookie(this.cookieSearchName)===null){$.cookie(this.cookieSearchName,"",this.cookieOptions)}$("#searchreset").bind("click",function(){$("#listnav ul li#all a").click();$("#search").val("").blur();$("#categories input[type='checkbox']").each(function(b){if(!this.checked){$(this).click()}})});this.getListings()},getListings:function(){$.getJSON("/filter.php",function(a,b){filterResults.listings=a;filterResults.setupListNav();filterResults.setupLiveSearch();filterResults.setupCategories("All");filterResults.setupGeolocation();filterResults.setupSearchStatus();$("#listings").addClass("loaded");filterResults.setupARIA();$("#listnav form").submit(function(){return false})})},setupListNav:function(){$("#main").prepend('<div id="listnav"><span id="filternotch"></span><ul></ul></div>');$.each(this.listTypes,function(b,c){if(c.name=="All"){$("#listnav ul").append('<li id="all" class="selected"><a href="#">'+c.name+"</a></li>")}else{string='<li id="'+c.name.toLowerCase()+'"><a href="#">';string=string+c.name+'</a><span title="'+c.description+'">?</span></li>';$("#listnav ul").append(string)}});$("#listnav li span").bind("mouseenter mouseleave",function(){$(this).siblings("a").toggleClass("hover")});jobTips=$("#listnav li span[title]").tooltip({api:true,effect:"slide",predelay:300,delay:250,onBeforeShow:function(c){this.getTip().wrapInner("<div />").append("<span />");this.getConf().slideOutSpeed=200;var b=this;return true},onBeforeHide:function(b){}});$("#listnav li a").bind("focus blur",function(){tip=$(this).next("span").tooltip();if(jobTips.isShown()){jobTips.getConf().slideOutSpeed=0;tip.hide()}else{tip.show()}$(this).toggleClass("hover").parent().toggleClass("hover")});$("#listnav a").click(function(){$("#listnav li").removeClass("selected");$(this).parent().addClass("selected");filterResults.moveTabNotch(true,filterResults.setupSearchStatus);return false});var a=$.cookie(this.cookieJobTypeName);if(a){$("#listnav li").removeClass("selected");type="#"+a.toLowerCase()+"";$(type).addClass("selected")}filterResults.moveTabNotch(false)},moveTabNotch:function(a,b){a=(a===null)?true:a;tab=$("#listnav li.selected");newPos=tab.position().left+(tab.width()/2)-($("#filternotch").width()/2);if(a){$("#filternotch").stop().animate({left:newPos+"px"},200,"easeOutExpo",function(){if(typeof b=="function"){b()}})}else{$("#filternotch").css("left",newPos);if(typeof b=="function"){b()}}},setupLiveSearch:function(){var a=$.cookie(this.cookieSearchName);if(a===null){a=""}searchField='		  <form action="#" method="get" accept-charset="utf-8">		    <h2><label for="search">Type to search jobs by location, title, and description. Your results will be updated automatically below.</label></h2>		      <div class="input-outer">		        <div class="input-inner">		          <input type="text" name="search" value="'+a+'" id="search" 	                    title="Search: &#8216;new york&#8217;, &#8216;ny&#8217;, &#8216;10001&#8217;, &#8216;css&#8217; ..."/>		        </div>		      </div>		      <div id="cancel"></div>		  </form>		';$("#listnav ul").after(searchField);if(a!=""){$("#cancel").addClass("activated")}$('input[title!=""]').hint();$("#search").delayedObserver(0.2,this.processLiveSearch);if(a!=""){}$("#cancel").click(function(){$("#search").val("").blur();$("#cancel").removeClass("activated");filterResults.setupSearchStatus()})},processLiveSearch:function(a){if($("#search").val()!=""){$("#cancel").addClass("activated")}else{$("#cancel").removeClass("activated")}filterResults.setupSearchStatus()},setupCategories:function(b){categoriesList='		  <div id="categories">		    <form action="#" method="get" accept-charset="utf-8">		      <fieldset>		        <legend>Categories:</legend>		        <ul></ul>		      </fieldset>		    </form>		  </div>		';$("#listnav").after(categoriesList);$.each(this.listTypes,function(c,d){if(d.name==b){$.each(d.categories,function(e,f){$("#categories ul").append('<li><input type="checkbox" name="category" value="'+f.catid+'" id="cat'+f.catid+'" checked="checked" /> <label for="cat'+f.catid+'">'+f.name+"</label></li>")});return false}});$("#categories ul").append('<li class="clear"></li>');$("#categories input").live("click",function(){filterResults.setupSearchStatus()});var a=$.cookie(this.cookieCategoryName);if(a){selected=a.split(",");$.each(this.listTypes,function(c,d){if(d.name==b){modified=false;$.each(d.categories,function(e,f){if(jQuery.inArray(f.catid,selected)==-1){modified=true;$("#cat"+f.catid).attr("checked","")}});if(modified){filterResults.setupSearchStatus()}return false}})}},setupGeolocation:function(){var a='		     <div id="geo">		       <form action="#" method="get" accept-charset="utf-8">		         <label for="request_geo">Near your current location:</label> <input type="checkbox" name="request_geo" id="request_geo" value="1" /><label class="clear">		       </form>		     </div>		   ';if(AuthJobs.Global.supportsGeolocation()&&0){$("#categories").after(a);$("#geo").append("<span id='geo_loader'>Loading location&hellip;</span>");$("#request_geo").live("click",function(){AuthJobs.Global.getLocation(function(b){$("#geo_loader").hide();$("#geo").append("<span id='geo_results'>Location found: "+b.coords.latitude+", "+b.coords.longitude+"</span>")})})}},isFiltered:function(){return($("#jobtype").text()=="all"&&$("#exceptions").text()==""&&$("#searchphrase").text()=="")},setupSearchStatus:function(){statusText='		<div id="status">		  <a id="subscribe-trigger" href="#" rel="#subscribe"><img src="/img/button-subscribe.png" alt="Subscribe" width="131" height="36" /></a>		  <h2>You are viewing: <strong><span id="jobtype"></span> jobs <span id="exceptions"></span></strong> <span id="matchcount"></span></h2>		</div>		';if(jQuery.browser.msie){$("#listings table").css("background-color","#f9f8f5")}$("#listings table").stop().animate({opacity:0},500,function(){});$("#matchcount").hide();if($("#status").text()==""){$("#listings").before(statusText);AuthJobs.Subscribe.init()}filterResults.filterWorking()},filterWorking:function(){type=filterResults.updateTypeStatus();cats=filterResults.updateCategoryStatus();search=filterResults.updateSearchStatus();if(this.defaultFilterSettings()){$("#status").slideUp(500,filterResults.filter)}else{$("#status").addClass("working");$("#status").slideDown(500,function(){$("#status").animate({color:"#222"},500,filterResults.filter)})}},filter:function(){var a=filterResults.getFilteredResults(type,cats,search);$("#listings table tbody").empty();if(a.length==0){$("#noresults").fadeIn(250)}else{$("#noresults").hide();$.each(a,function(c,f){var b="";if(c%2!=0){b=' class="even"'}var e="";if(filterResults.listings[f].is_new){e='<span class="new">New!</span> '}var d="				  <tr"+b+'>				    <td class="opening"><a href="/jobs/'+filterResults.listings[f].id+'">'+e+filterResults.listings[f].title+'</a> <span class="at">at</span> <span class="company">'+filterResults.listings[f].company+'</span></td>				    <td class="locale"><span class="location">'+filterResults.listings[f].loc+'</span> <span class="type '+filterResults.getJobTypeName(filterResults.listings[f].empid).toLowerCase()+'">'+filterResults.getJobTypeName(filterResults.listings[f].empid)+'</span></td>				    <td class="posted">'+filterResults.listings[f].post_date_relative+"</td>				  </tr>				";$("#listings table tbody").append(d)})}if(jQuery.browser.msie){$("#listings table").css("background-color","#f9f8f5")}$("#listings table").stop().animate({opacity:1},100,function(){if(jQuery.browser.msie){$(this).css("background-color","transparent").get(0).style.removeAttribute("filter")}});$("#status").removeClass("working")},defaultFilterSettings:function(){defaults=true;if($("#listnav li.selected a").text()!="All"){return false}search=jQuery.trim($("#search").val());if(search==$("#search").attr("title")){search=""}if(search!=""){return false}$("input[name='category']").each(function(a){if(!this.checked){defaults=false}});return defaults},updateTypeStatus:function(){var b=$("#listnav li.selected a").text();var a=[];$("#jobtype").text(b.toLowerCase());$("#jobtype-modal").text(b.toLowerCase());if(b=="All"){$.each(this.listTypes,function(c,d){if(d.empid!=null){a.push(d.empid)}})}else{$.each(this.listTypes,function(c,d){if(d.name==b){a.push(d.empid);return false}})}$.cookie(this.cookieJobTypeName,b,this.cookieOptions);return a},updateCategoryStatus:function(){var b="";unchecked=$("#categories input:checkbox[checked=false]");uncheckedCount=unchecked.length;checked=$("#categories input:checkbox[checked=true]");checkedCount=checked.length;if(uncheckedCount<=this.exceptionLimit){unchecked.each(function(d){if(d==uncheckedCount-1){if(d!=0){b+=" and "}b+=$(this).next("label").text()}else{b+=$(this).next("label").text();if(d!=uncheckedCount-2){b+=", "}}})}else{checked.each(function(d){if(d==checkedCount-1){if(d!=0){b+=" and "}b+=$(this).next("label").text()}else{b+=$(this).next("label").text();if(d!=checkedCount-2){b+=", "}}})}if(b.length!=0){if(uncheckedCount<=this.exceptionLimit){$("#exceptions").text("(except "+b+")")}else{$("#exceptions").text("("+b+")")}}else{$("#exceptions").text("")}$("#exceptions-modal").text($("#exceptions").text());var a=[];var c="";checked.each(function(d){a.push($(this).val());if(d==checkedCount.length-1){c+=$(this).val()}else{c+=$(this).val()+","}});$.cookie(this.cookieCategoryName,c,this.cookieOptions);return a},updateSearchStatus:function(){var a=jQuery.trim($("#search").val());if(a==$("#search").attr("title")){a=""}if(a!=""){if($("#searchterm").length==0){$("#status strong").append(' <span id="searchphrase">matching &ldquo;<span id="searchterm">'+a.toLowerCase()+"</span>&rdquo;</span>")}else{$("#searchterm").text(a.toLowerCase())}if($("#searchterm-modal").length==0){$("#subscribe .modalheader p").append(' <span id="searchphrase-modal">matching &ldquo;<span id="searchterm-modal">'+a.toLowerCase()+"</span>&rdquo;</span>")}else{$("#searchterm-modal").text(a.toLowerCase())}}else{$("#searchphrase").remove();$("#searchphrase-modal").remove()}$.cookie(this.cookieSearchName,a,this.cookieOptions);return a},getFilteredResults:function(d,a,c){var b=[];$.each(this.listings,function(e,f){if(filterResults.listingMatches(f,d,a,c)){b.push(e)}});return b},listingMatches:function(f,e,c,d){var b=false;d=d.toLowerCase();if($.inArray(f.empid,e)!=-1&&($.inArray(f.catid,c)!=-1||$.inArray(f.catid2,c)!=-1)){b=true}if(b){terms=d.split(" ");var a=false;for(i=0;i<terms.length;i++){if(terms[i]=="and"||terms[i]=="&&"){a=false;continue}else{if(terms[i]=="or"||terms[i]=="||"){a=true;continue}}if(terms[i].substring(0,1)=="-"&&terms[i].length>1){terms[i]=terms[i].substring(1,terms[i].length);if(!a&&filterResults.listingMatchesTerm(f,terms[i])){b=false}else{if(a&&!filterResults.listingMatchesTerm(f,terms[i])){b=true}}}else{if(!a&&!filterResults.listingMatchesTerm(f,terms[i])){b=false}else{if(a&&filterResults.listingMatchesTerm(f,terms[i])){b=true}}}a=false}}return b},listingMatchesTerm:function(d,b){var c=new RegExp(RegExp.escape(b),"i");if(this.state_list[b.toUpperCase()]&&d.loc_state==b.toUpperCase()){return true}else{if(this.state_list[b.toUpperCase()]){return false}}var a=new RegExp("[0-9]{5}");if(b.search(a)!=-1&&d.loc_zipcodes.search(c)!=-1){return true}else{if(b.search(a)!=-1){return false}}if(b.length!=0&&((d.title.search(c)!=-1)||(d.company.search(c)!=-1)||(d.description.search(c)!=-1)||(d.loc.search(c)!=-1)||(d.loc_name.search(c)!=-1)||(d.loc_country.search(c)!=-1)||(d.loc_state.search(c)!=-1)||(d.loc_state_full.search(c)!=-1)||(d.perks.search(c)!=-1))||(d.howto_apply.search(c)!=-1)){return true}else{if(b.length!=0){return false}else{return true}}},getJobTypeName:function(b){var a="";$.each(this.listTypes,function(c,d){if(d.empid==b){a=d.name}});return a},setupARIA:function(){$("#listnav").attr("role","search");$("#listnav").prepend("<p id='tab-description' class='starthidden'>Filter by job type</p>");$("#listnav ul").attr("aria-describedby","tab-description").attr("role","tablist").find("li").attr("role","presentation").find("a").attr("role","tab");$("#listnav ul li a span").attr("role","presentation");$("#categories").prepend("<p id='categories-description' class='starthidden'>Filter by job category</p>");$("#categories form").attr("aria-describedby","categories-description");$("#categories ul, #categories li").attr("role","presentation")}};RegExp.escape=function(b){if(!arguments.callee.sRE){var a=["/",".","*","+","?","|","(",")","[","]","{","}","\\"];arguments.callee.sRE=new RegExp("(\\"+a.join("|\\")+")","g")}return b.replace(arguments.callee.sRE,"\\$1")};
