/**
 * The cartografur js library.
 * 
 * Copyright 2009 cartografur.
 * Created by Jeff Verkoeyen.
 * jverkoey@gmail.com
 * twitter.com/featherless
 */
Fur.Control={};Fur.EmailCheck=function(input,info){this._input=input;this._info=info;this._last=null;this._timeout=null;this._s={DEFAULT:'in case of forgetfulness',INVALID:'invalid email',VALID_EMAIL:'looks good'};this.init();};Fur.EmailCheck.prototype={init:function(){var obj=this;this._input.keyup(function(){obj._checkInput.bind(obj)();});if(this._input.val()!=''){this._checkInput({now:true});show(this._info.parent());}else{this._info.text(this._s.DEFAULT);}},_checkInput:function(options){var email=$(this._input).val();if(this._last==email){return;}
this._last=email;if(this._timeout){clearTimeout(this._timeout);this._timeout=null;}
if(email==''){this._info.text(this._s.DEFAULT).parent().animate({backgroundColor:Fur.ColourPalette.White},500);}else{if(options&&options.now){this.checkValidity();}else{this._timeout=setTimeout(this.checkValidity.bind(this),500);}}},checkValidity:function(){var email=this._input.val();if(email.length==0){return;}
var error=null;if(email.length<5){error=this._s.INVALID;}else if(!(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(email))){error=this._s.INVALID;}
if(error){this._info.text(error).parent().animate({backgroundColor:Fur.ColourPalette.Error},500);}else{this._info.text(this._s.VALID_EMAIL).parent().animate({backgroundColor:Fur.ColourPalette.Success},500);}}};Fur.HeaderMinimizer=function(id){if(!id){id='minimizer';}
this._s={minimizer_hide:'hide the header',minimizer_show:'show the header',};$('#headerbar').after('<div id="'+id+'">'+this._s.minimizer_hide+'</div>');var obj=this;$('#'+id).click(function(){$('#headerbar').slideToggle('fast',function(){if($('#headerbar').is(':visible')){$.cookie('headerbar_hidden',0);$('#'+id).text(obj._s.minimizer_hide);}else{$.cookie('headerbar_hidden',1);$('#'+id).text(obj._s.minimizer_show);}});});if($.cookie('headerbar_hidden')=='1'){$('#'+id).text(this._s.minimizer_show);$('#headerbar').slideUp('slow');}}
Fur.InputSuggestion=function(id,suggestionText){var actions={focus:function(){if($(this).val()==suggestionText){$(this).val('');}
$(this).addClass('active');},blur:function(){if($(this).val()==''){$(this).val(suggestionText);$(this).removeClass('active');}},init:function(){if($(this).val()==''){$(this).val(suggestionText);}else if($(this).val()!=suggestionText){$(this).addClass('active')}}};$(id).focus(actions.focus).blur(actions.blur).each(actions.init);}
Fur.PasswordCheck=function(input,info,opt_usernamecheck){this._input=input;this._info=info;this._username=opt_usernamecheck;this._last=null;this._timeout=null;this._s={MIN_LENGTH:'5 or more characters',VALID_PASS:'looks good',PASS_SAME:'username = password'};this.init();};Fur.PasswordCheck.prototype={init:function(){var obj=this;this._input.keyup(function(){obj._checkInput.bind(obj)();});if(this._input.val()!=''){this._checkInput({now:true});show(this._info.parent());}else{this._info.text(this._s.MIN_LENGTH);}},_checkInput:function(options){var pass=$(this._input).val();if(this._last==pass){return;}
this._last=pass;if(this._timeout){clearTimeout(this._timeout);this._timeout=null;}
if(pass==''){this._info.text(this._s.MIN_LENGTH).parent().attr('style','display:block').animate({backgroundColor:Fur.ColourPalette.White},500);}else{if(options&&options.now){this.checkValidity();}else{this._timeout=setTimeout(this.checkValidity.bind(this),500);}}},checkValidity:function(){var pass=this._input.val();var error=null;if(pass.length<5){error=this._s.MIN_LENGTH;}else if(this._username&&this._username.isValid()&&this._username.getName()==pass){error=this._s.PASS_SAME;}
if(error){this._info.text(error).parent().animate({backgroundColor:Fur.ColourPalette.Error},500);}else{this._info.text(this._s.VALID_PASS).parent().animate({backgroundColor:Fur.ColourPalette.Success},500);}}};Fur.ProgressBar=function(progressBarId){this._progressBar=$(progressBarId);this._progressBar.css({height:'1em',border:'1px solid #ccc'});this._progressBar.append(document.createElement('div'));this._fill=this._progressBar.children('div:first');this._fill.css({backgroundColor:Fur.ColourPalette.Text,height:'1em',width:'0%'});}
Fur.ProgressBar.prototype={update:function(percent){this._fill.stop();this._fill.animate({width:percent+'%'},500);},finish:function(){this._fill.stop();this._fill.css({width:'100%'});}};Fur.UsernameCheck=function(input,info){this._input=input;this._info=info;this._last=null;this._timeout=null;this._isvalid=false;this._s={DEFAULT:'pick your nickname',UNIQUE_NICKNAME:'nice, it\'s unique',NICKNAME_DUPE:'that name\'s taken',CHECKING:'Checking availability...'};this.init();};Fur.UsernameCheck.prototype={isValid:function(){return this._isvalid;},getName:function(){return this._input.val();},init:function(){var obj=this;this._input.keyup(function(){obj._checkInput.bind(obj)();});this._info.text(this._s.DEFAULT);if(this._input.val()!=''){this._checkInput({now:true});show(this._info.parent());}},_checkInput:function(options){var name=$.trim($(this._input).val());if(this._last==name){return;}
this._last=name;if(this._timeout){clearTimeout(this._timeout);this._timeout=null;}
if(name==''){this._info.text(this._s.DEFAULT).parent().css({backgroundColor:Fur.ColourPalette.White});this._isvalid=false;}else{if(options&&options.now){this.checkAvailability();}else{this._timeout=setTimeout(this.checkAvailability.bind(this),500);}}},checkAvailability:function(){var obj=this;var delayText=function(){this._info.text(this._s.CHECKING);}
var timeout=setTimeout(delayText.bind(this),300);var success=function(result,textStatus){clearTimeout(timeout);if(result.nickname==this.nickname){if(!result.exists){obj._info.text(obj._s.UNIQUE_NICKNAME).parent().animate({backgroundColor:Fur.ColourPalette.Success},500);obj._isvalid=true;}else{obj._info.text(obj._s.NICKNAME_DUPE).parent().animate({backgroundColor:Fur.ColourPalette.Error},500);obj._isvalid=false;}}}
var nickname=this._input.val();$.ajax({type:'GET',url:'/user/exists',dataType:'json',nickname:nickname,data:{nickname:nickname},success:success});}};Fur.Control.PickLocation=function(form,input,result,callback){this._form=$(form);this._input=$(input);this._result=$(result);this._callback=callback;this._geocoder=new GClientGeocoder();this._form.submit(this.submit.bind(this));};Fur.Control.PickLocation.prototype={set_location:function(location){this._input.val(location);return this;},get_location:function(){return this._input.val();},submit:function(){var address=this._input.val();if($.trim(address)==''){this._input.focus();return;}
this._result.text('');this._geocoder.getLatLng(address,function(latlng){if(!latlng){this._result.text('We couldn\'t pin "'+address+'" down. If you\'re pretty sure it\'s right, try searching again.').show();}else{this._result.hide();this._callback(latlng,this._geocoder.getCache().get(address));}}.bind(this));}};Fur.Control.TypeAhead=function(inputID,dropdownID,map,viewer){this._input=$(inputID);this._dropdown=$(dropdownID);this._map=map;this._viewer=viewer;this._input.unbind('keydown').unbind('keyup').unbind('keypress').unbind('focus').unbind('blur').keydown(this._handle_key.bind(this)).keyup(this._handle_key.bind(this)).keypress(this._handle_key.bind(this)).focus(this._gain_focus.bind(this)).blur(this._lose_focus.bind(this)).val('');this._current_value='';this._visible_maps={};this._database={};this._list=null;this._selection=-1;};Fur.Control.TypeAhead.prototype={key:{enter:13,left:37,up:38,right:39,down:40},new_map_list:function(maps){var previously_visible_maps=this._visible_maps;this._visible_maps={};for(var i=0;i<maps.length;++i){delete previously_visible_maps[maps[i].id];this._visible_maps[maps[i].id]=true;}
for(var key in previously_visible_maps){delete this._database[key];}},load_map:function(map){if(this._visible_maps[map._id]==undefined){return;}
this._database[map._id]={map:map,name:map.getName(),data:[]};var layer=map.getLayer();for(var i=0;i<layer.features.length;++i){var feature=layer.features[i];if(feature.info.name){var entry={name:feature.info.name,lowercase_name:feature.info.name.toLowerCase(),poly_id:feature.fur_id}
this._database[map._id].data.push(entry);}}},_handle_key:function(event){if(event.type=='keyup'||event.type=='keypress'){var new_val=this._input.val();if(this._current_value!=new_val){this._current_value=new_val;this._dropdown.fadeIn('fast');this._update_filter();}}
if(event.type=='keypress'&&this._list){if(event.keyCode==this.key.enter){this._handle_selection(this._selection);}else{var old_selection=this._selection;if(event.keyCode==this.key.down){this._selection++;}else if(event.keyCode==this.key.up){this._selection--;}
if(this._selection<0){this._selection=this._list.length-1;}else if(this._selection>=this._list.length){this._selection=0;}
if(old_selection!=this._selection){this._dropdown.children('.selected').removeClass('selected');this._dropdown.children('.result:eq('+this._selection+')').addClass('selected');}}}
if(event.keyCode==this.key.down||event.keyCode==this.key.up){event.stopPropagation();return false;}
return true;},_handle_selection:function(index){this._selection=index;var selection=this._list[this._selection];this._current_value=selection.name;this._input.val(selection.name);this._dropdown.fadeOut('fast');var map=this._database[selection.map_id];var feature=map.map._poly_id_to_feature[selection.poly_id];this._map.panTo(feature.geometry.getBounds().getCenterLonLat());this._viewer.selectfeature(feature);},_update_filter:function(){var trimmed_value=$.trim(this._current_value);if(trimmed_value==''){this._dropdown.html('Type away!');}else{var words=trimmed_value.split(' ');var i=0;while(i<words.length){if(words[i]==''){words.splice(i,1);}else{++i;}}
var results=[];var hash_results={};var MAX_RESULTS=10;for(var map_id in this._database){var map=this._database[map_id];for(var i=0;i<map.data.length&&results.length<MAX_RESULTS;++i){var unique_id=''+map_id+'-'+map.data[i].poly_id;for(var i2=0;i2<words.length&&results.length<MAX_RESULTS;++i2){var offset=map.data[i].lowercase_name.indexOf(words[i2].toLowerCase());if(offset>=0){if(hash_results[unique_id]==undefined){var entry={map_id:map_id,poly_id:map.data[i].poly_id,name:map.data[i].name,matches:[{word:words[i2],offset:offset,size:words[i2].length}]};hash_results[unique_id]=entry;results.push(unique_id);}else{hash_results[unique_id].matches.push({word:words[i2],offset:offset,size:words[i2].length});}}}}
if(results.length>=MAX_RESULTS){break;}}
for(var i=0;i<results.length;++i){var entry=hash_results[results[i]];entry.score=0;for(var i2=0;i2<entry.matches.length;++i2){entry.score+=entry.matches[i2].size;}}
function by(left,right){var left_entry=hash_results[left];var right_entry=hash_results[right];return right_entry.score-left_entry.score;}
results=results.sort(by);var html=[];for(var i=0;i<results.length;++i){var entry=hash_results[results[i]];var name=entry.name;var regex=[];for(var i2=0;i2<entry.matches.length;++i2){var match=entry.matches[i2];regex.push(match.word);}
name=name.gsub(new RegExp('('+regex.join('|')+')','i'),function(match){return'<em>'+match[0]+'</em>';});html.push('<div class="result');if(i==0){html.push(' selected');}
html.push('">'+name+' <span class="map-name">'+this._database[entry.map_id].name+'</span></div>');}
if(html.length==0){this._dropdown.html('Bummer, we don\'t have an entry for that.');}else{this._dropdown.html(html.join(''));var t=this;this._dropdown.children('.result').each(function(index){$(this).click(function(){t._handle_selection.bind(t)(index);});});}
if(results.length>0){this._list=[];for(var i=0;i<results.length;++i){var entry=hash_results[results[i]];this._list.push({name:entry.name,map_id:entry.map_id,poly_id:entry.poly_id});}
this._selection=0;}else{this._list=null;this._selection=-1;}}},_gain_focus:function(){this._current_value=this._input.val();this._update_filter();this._dropdown.fadeIn('fast');this._input.select();},_lose_focus:function(){this._dropdown.fadeOut('fast');}};