String.prototype.trim=function(){return this.replace(/^\s*|\s*$/,"")};String.prototype.setSpaces=function(){this.trim();return this.replace(/\s+/g," ")};function sortIntegerAsc(x,y){rtn=parseInt(x,10)-parseInt(y,10);return(rtn==0)?0:Math.abs(rtn)/rtn}function SuggestiveField(){this.construct()}SuggestiveField.prototype.constructor=SuggestiveField;SuggestiveField.prototype={debug:false,debug_event:false,blockDrawing:false,data:{},div:null,field:null,hidden:null,input:null,regularExpressions:[[new RegExp("([a])","ig"),"[aàáâäã]"],[new RegExp("([c])","ig"),"[cçč]"],[new RegExp("([e])","ig"),"[eéèêëě]"],[new RegExp("([i])","ig"),"[iîïìí]"],[new RegExp("([n])","ig"),"[nñ]"],[new RegExp("([o])","ig"),"[oôö]"],[new RegExp("([r])","ig"),"[rř]"],[new RegExp("([s])","ig"),"[sš]"],[new RegExp("(\\[sš\\]\\[sš\\])","ig"),"([s]{2}|[ß])"],[new RegExp("([u])","ig"),"[uùûüů]"],[new RegExp("([y])","ig"),"[yý]"],[new RegExp("([z])","ig"),"[zž]"],[new RegExp("([ ])","ig"),"[\\W_\\s]{1,3}"]],associate:function(field){if(this.debug){console.log("SuggestiveField.associate("+field+")")}this.field=$(field)},callback:function(){if(this.debug){console.log("SuggestiveField.callback()")}return true},clickedOut:function(event){if(this.debug_event){console.log("SuggestiveField.clickedOut()")}elt=event.target;while(undefined!=elt){try{if($(elt).attr("ctp:replacement")==this.replacement_id){return false}}catch(e){}if(elt.tagName.toLowerCase()=="html"){this.hide(true,250,0);return true}elt=elt.parentNode}return false},construct:function(){this.replacement_id=null;this.translation={result:"result",results:"results"};this.search_in_current_options=true;this.drawOption=this.defaultDrawOption;this.get="";this.getTitle=this.defaultGetTitle;this.search=this.defaultSearch;this.sort=this.defaultSort},controlKeyCode:function(event,select){if(this.debug){console.log("SuggestiveField.controlKeyCode("+event.which+","+select+")")}if(this.input.isActive()||this.div.isActive()){element=event.target;rtn=false;if(select){div=this.div;used=this.input.isActive();selected_index=parseInt(div.attr("ctp:selectedindex"),10);index=null;switch(event.which){case 13:index=parseInt(selected_index,10);if(div.isVisible()){event.stopImmediatePropagation()}break;case 33:index=selected_index-10;break;case 37:if(!used){index=selected_index-1}break;case 38:index=selected_index-1;break;case 34:index=selected_index+10;break;case 39:if(!used){index=selected_index+1}break;case 40:index=selected_index+1;break}if(index){this.selectByIndex(index);this.show();event.stopImmediatePropagation();rtn=false}}else{switch(event.which){case 9:case 13:case 16:case 17:case 18:case 20:case 32:case 33:case 34:case 35:case 37:case 38:case 39:case 40:case 91:case 93:case 144:rtn=false;break;case 8:case 46:default:rtn=true;break}switch(event.which){case 8:case 32:case 37:case 46:this.search_in_current_options=false;break;default:this.search_in_current_options=true;break}}return rtn}},defaultDrawOption:function(index,option){cssClass=index%2>0?'class="colored" ':"";return $('<div index="'+index+'" value="'+option.id+'" title="'+this.getTitle(option)+'"'+cssClass+">"+option.formattedName+"</div>")},defaultGet:function(){options=this.field.find("option");rtn=new Array();$.each(options,function(key,option){option=$(option);rtn.push({id:option.val(),name:option.html(),first:(option.attr("ctp:first")=="1"),className:"suggestion-option",cleanedName:$().toURL(option.html()),formattedName:option.html()})});rtn.sort(this.sort);return rtn},defaultGetTitle:function(option){return option.name},defaultSearch:function(options,type,text){rtn=new Array();if(type=="id"&&text!=""){for(i=0;i<options.length;i++){if(options[i].id==text){rtn.push(options[i]);i=options.length}}}else{if(text==""){for(i=0;i<options.length;i++){opt=options[i];opt.formattedName=opt.name;rtn.push(opt)}}else{tmp=new Array();reg=this.setRegExp(text.setSpaces());for(i=0;i<options.length;i++){pos=options[i].name.search(reg);if(pos!=-1){if(undefined==tmp[parseInt(pos,10)]){tmp[pos]=new Array()}opt=options[i];opt.formattedName=opt.name.replace(reg,"<b>$1</b>");tmp[parseInt(pos,10)].push(opt)}}index=new Array();for(k in tmp){index.push(k)}index.sort(sortIntegerAsc);rtn=new Array();for(i=0;i<index.length;i++){for(j=0;j<tmp[index[i]].length;j++){rtn.push(tmp[index[i]][j])}}}}fName="<span>"+rtn.length+" "+(rtn.length<2?this.translation.result:this.translation.results)+"</span>";rtn.unshift({id:null,name:null,formattedName:fName});return rtn},defaultSort:function(a,b){if(a.first){return -1}else{if(a.cleanedName<b.cleanedName){return -1}else{if(a.cleanedName>b.cleanedName){return 1}else{return 0}}}},draw:function(){if(this.debug){console.log("SuggestiveField.draw()")}if(!this.blockDrawing){this.blockDrawing=true;div=$(this.div);div.html("").attr("ctp:selectedindex",0).scrollTop(0);txt=arguments[0]||"";options=this.search(this.search_in_current_options&&this.current_options.length>0?this.current_options:this.options,"name",txt);if(options.length==0&&this.search_in_current_options){options=this.search(this.options,"name",txt)}this.current_options=options.slice(1);option_found=false;for(var i=0;i<options.length;i++){elt=this.drawOption(i,options[i]);div.append(elt);if(options[i].className){elt.addClass(options[i].className)}if(i==0){elt.addClass("suggestion-number")}else{if(options[i].id==this.option_id){option_found=true;elt.addClass("selected");div.attr("ctp:selectedindex",i).scrollTop(elt.position().top)}}if(i>0){elt.hover(function(){$(this).addClass("hover")},function(){$(this).removeClass("hover")}).bind("mousedown",{SuggestionFld:this},function(event){if(event.data.SuggestionFld.selectByIndex($(this).attr("index"))){event.data.SuggestionFld.hide(true,0,0)}})}}delete (i);div.css("height","");switch(options.length){case 1:div.attr("ctp:selectedindex",null).scrollTop(0);break;case 2:if(this.option_id!=options[1].id){this.setSelected(options[1].id);div.attr("ctp:selectedindex",1).find(":equal(1)").addClass("selected");this.input.prop("disabled",true);var SuggestiveField=this;window.setTimeout(function(){SuggestiveField.input.prop("disabled",false)},1000)}break}this.blockDrawing=false}},focus:function(){this.input.focus().select()},getData:function(name){return name?this.data[name]:this.data},getSelectedOption:function(){if(this.debug){console.log("SuggestiveField.getSelectedOption()")}return this.option_id?this.search(this.options,"id",this.option_id)[1]:false},hide:function(force,duration,delay){var SuggestiveField=this;if(this.debug){console.log("SuggestiveField.hide()")}div=this.div;if((div.isVisible()&&div.queue()=="")||force){if(force){this.blocked=true;div.isActive(false);div.stop(true,true).slideUp(duration,function(){SuggestiveField.input.removeClass("open");SuggestiveField.blocked=false})}else{div.isActive(false);div.delay(delay).slideUp(duration,function(){SuggestiveField.input.removeClass("open")})}}},selectByIndex:function(){if(this.debug){console.log("SuggestiveField.selectByIndex("+arguments[0]+")")}min=1;options=this.div.find("> div");max=options.length;index=arguments[0]!=""?arguments[0]:$(this.div).attr("ctp:selectedindex");if(index<min){index=min}else{if(index>=max){index=max-1}}if(min<=index&&index<max){elementTop=0;for(var i=0;i<index-1;i++){elementTop+=$(options[i]).outerHeight()}delete (i);this.setSelected($(options[index]).attr("value"));this.div.scrollTop(elementTop).attr("ctp:selectedindex",index)}return true},set:function(blocked){if(this.debug){console.log("SuggestiveField.set()")}if(!blocked){blocked=(this.field.attr("disabled"))}this.blocked=blocked;default_value=this.field.find("option:first").html();current_value=this.field.val();if(current_value){this.option_id=current_value}this.replacement_id=this.field.attr("id");this.field.find("option:first").remove();this.options=this.defaultGet();this.current_options=this.options;this.search_in_current_options=true;this.hidden=$('<input id="'+this.field.attr("id")+'" name="'+this.field.attr("id")+'" type="hidden" />');this.hidden.insertBefore(this.field);if(this.option_id){this.hidden.val(this.option_id)}this.input=$('<input value="'+default_value+'" type="text" ctp:type="suggestive" />');$(this.input).addClass("suggestion-field "+this.field.attr("class")).attr({"ctp:defaultvalue":default_value,"ctp:replacement":this.replacement_id,autocomplete:"off"}).css({width:(this.field.width()-4)+"px",height:this.field.height()+"px"});this.input.isActive=function(){if(typeof(arguments[0])=="boolean"){this.attr("ctp:active",arguments[0]?"1":"0")}else{return(this.attr("ctp:active")!="0")}};this.input.isActive(false);this.input.insertBefore(this.field);this.field.remove();this.field=null;this.div=$('<div class="suggestion-list">');$(this.div).attr("ctp:replacement",this.replacement_id).css("width",$(this.input).innerWidth()+"px");if(!blocked){this.div.isActive=function(){if(typeof(arguments[0])=="boolean"){this.attr("ctp:active",arguments[0]?"1":"0")}else{return(this.attr("ctp:active")!="0")}};this.div.isVisible=function(){return !this.is(":hidden")};this.div.isActive(false)}$("body").append(this.div);this.div.hide();if(this.previous_option_id!=null){this.setSelected(this.previous_option_id)}if(!blocked){this.draw();this.setDimensionAndPosition();this.hide(true,0,0);$(document).bind("click",{object:this},function(event){if(this.debug_event){console.log("Document::click")}event.data.object.clickedOut(event)}).bind("keydown",{object:this},function(event){if(this.debug_event){console.log("Document::keyDown")}event.data.object.controlKeyCode(event,true)});$(window).bind("resize",{object:this},function(event){if(this.debug_event){console.log("Window::resize")}if(event.data.object.div.isVisible()){event.data.object.setDimensionAndPosition()}});$(this.input).bind("focus",{object:this},function(event){if(this.debug_event){console.log("Suggestion field::focus")}field=$(event.data.object.input);if(field.val()==field.attr("ctp:defaultvalue")){field.val("")}if(field.val()==field.attr("ctp:defaultvalue")){$(this).addClass("not_filled")}else{$(this).removeClass("not_filled")}event.data.object.show();event.data.object.input.isActive(true)}).bind("blur",{object:this},function(event){if(this.debug_event){console.log("Suggestion field::blur")}field=$(event.data.object.input);if(field.val()==""||field.val()==null){event.data.object.setSelected("")}if(field.val()==field.attr("ctp:defaultvalue")){$(this).addClass("not_filled")}else{$(this).removeClass("not_filled")}event.data.object.input.isActive(false);event.data.object.hide(true,250,500)}).bind("keyup",{object:this},function(event){if(this.debug_event){console.log("Suggestion field::keyDown")}if(event.data.object.controlKeyCode(event,false)){event.data.object.draw($(this).val())}event.data.object.show();event.stopPropagation()}).bind("click",{object:this},function(event){if(this.debug_event){console.log("Suggestion field::click")}event.data.object.show()}).bind("mouseout",{object:this},function(event){if(this.debug_event){console.log("Suggestion field::mouseOut")}event.data.object.hide(false,250,500)});$(this.div).bind("mouseover",{object:this},function(event){if(this.debug_event){console.log("Suggestion options::mouseOver")}event.data.object.div.isActive(true);event.data.object.show()}).bind("mouseout",{object:this},function(event){if(this.debug_event){console.log("Suggestion options::mouseOut")}to=event.relatedTarget;if(!$(to).hasClass("suggestion-option")&&!$(to).hasClass("suggestion-number")){event.data.object.hide(false,250,500)}}).bind("mousedown",{object:this},function(event){if(this.debug_event){console.log("Suggestion options::mouseDown")}return false})}else{$(this.input).prop("disabled",true)}if(current_value){this.setSelected(current_value)}if($(this.input).val()==$(this.input).attr("ctp:defaultvalue")){$(this.input).addClass("not_filled")}else{$(this.input).removeClass("not_filled")}$(this.input).focus();this.hide(true,500,500)},setData:function(data,erase){if(this.debug){console.log("SuggestiveFiled.setDate("+data+","+erase+")")}if(erase){this.data=data}else{for(k in data){this.data[k]=data[k]}}},setDimensionAndPosition:function(){ipt=$(this.input);this.div.css({top:(ipt.offset().top+ipt.outerHeight()+1)+"px",left:ipt.offset().left+"px"})},setLanguage:function(language){switch(language){case"dut":this.language="dut";break;case"fre":this.language="fre";break;case"ger":this.language="ger";break;case"ita":this.language="ita";break;case"spa":this.language="spa";break;case"zho":this.language="zho";break;default:case"eng":this.language="eng";break}},setPrevious:function(id){this.previous_option_id=id},setRegExp:function(text){for(index=0;index<this.regularExpressions.length;index++){text=text.replace(this.regularExpressions[index][0],this.regularExpressions[index][1])}return new RegExp("("+text+")","ig")},setSelected:function(id){if(this.debug){console.log("SuggestiveField.setSelected("+id+")")}id=id==null?"":id;this.option_id=id;option=this.search(this.options,"id",id);option=option.length==2?option[1]:null;this.hidden.val(id);this.div.find("> div").removeClass("selected");if(id!=""){this.div.find('div[value="'+id+'"]').addClass("selected");if(option){this.input.val(option.name)}}else{this.input.val($(this.input).attr("ctp:defaultvalue"));this.div.find("div").removeClass("selected")}this.callback()},show:function(){if(this.debug){console.log("SuggestiveField.show()")}div=this.div;if(!this.blocked&&(!div.isVisible()||div.isActive())){try{$(".suggestion-list:not([ctp\\:replacement="+this.replacement_id+"])").hide()}catch(e){var SuggestiveField=this;$(".suggestion-list").each(function(index,elt){elt=$(elt);if(elt.attr("ctp:replacement")!=SuggestiveField.replacement_id){elt.hide()}})}this.input.stop(true,true).addClass("open");this.setDimensionAndPosition();div.stop(true,true).slideDown(250,function(){$(this).css("height","auto")})}}};
