/*
 * 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)}$("#listings table tbody").empty();$("#main").prepend("<span id='loader'>Loading jobs&hellip;</span>");$("#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.setupSearchStatus();$("#listings").addClass("loaded");$("#listnav form").submit(function(){return false})})},setupListNav:function(){$("#loader").remove();$("#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{$("#listnav ul").append('<li id="'+c.name.toLowerCase()+'"><a href="#">'+c.name+"</a></li>")}});$("#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">Filter by keyword, location, company, etc.</label></h2>          <div class="input-outer">            <div class="input-inner">              <input type="text" name="search" value="'+a+'" id="search" title="Search location, company, description &hellip;"/>            </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 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}})}},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>    ';$("#listings table").fadeOut(500,function(){$("#listings table tbody").empty()});$("#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)})}$("#listings table").fadeIn(100);$("#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(c,a){var b=new RegExp(RegExp.escape(a),"i");if(this.state_list[a.toUpperCase()]&&c.loc_state==a.toUpperCase()){return true}else{if(this.state_list[a.toUpperCase()]){return false}}if(a.length!=0&&((c.title.search(b)!=-1)||(c.company.search(b)!=-1)||(c.description.search(b)!=-1)||(c.loc.search(b)!=-1)||(c.loc_name.search(b)!=-1)||(c.loc_country.search(b)!=-1)||(c.loc_state.search(b)!=-1)||(c.loc_state_full.search(b)!=-1)||(c.perks.search(b)!=-1))||(c.howto_apply.search(b)!=-1)){return true}else{if(a.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}};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")};