jQuery.extend({searchlist:function(data,options){return new jQuery.SearchList(data,options)}});jQuery.fn.extend({searchview:function(sl,options){return this.each(function(){new jQuery.SearchListView(this,sl,options)})},updateView:function(){return this.trigger("update")},searchcontrol:function(searchlist,options){options=jQuery.extend({},jQuery.SearchListControl.defaults,options);return this.each(function(){new jQuery.SearchListControl(this,searchlist,options)})}});jQuery.SearchList=function(sourceData,options){if(!options){options={}}options.matchCase=options.matchCase||false;var data={};var previousQuery=null;var views=[];var visible=0;var lastMatch=null;$.each(sourceData,function(i,n){n.enabled=true;n.visible=true;data[n.id]=n});this.updateList=function(sourceData){$.each(sourceData,function(i,n){n.enabled=true;n.visible=true;data[n.id]=n})};this.eval=function(q){if(!options.matchCase){q=q.toLowerCase()}if(previousQuery==null||q.indexOf(previousQuery)==-1){visible=0;$.each(data,function(i,n){if(!n.enabled){n.visible=false;return}n.visible=match(q,n);if(n.visible){visible++;lastMatch=n}})}else{$.each(data,function(i,n){if(!n.enabled){n.visible=false;return}if(n.visible){n.visible=match(q,n);if(n.visible){lastMatch=n}else{visible--}}})}previousQuery=q;updateViews()};this.reset=function(){previousQuery=null;this.eval("")};this.forceMatch=function(id){if(!data[id]||!data[id].enabled){return}visible=1;previousQuery=null;for(i in data){data[i].visible=false}data[id].visible=true;lastMatch=data[id];updateViews()};this.disableIds=function(ids){for(i in ids){if(data[ids[i]]){data[ids[i]].enabled=false}}this.reset()};this.enableIds=function(ids){for(i in ids){if(data[ids[i]]){data[ids[i]].enabled=true}}this.reset()};this.enableAll=function(ids){for(id in data){data[id].enabled=true}this.reset()};this.getData=function(id){if(id==null){return data}return data[id]};this.addView=function(view){views.push(view)};function match(q,n){return q==""||((options.matchCase?n.name:n.name.toLowerCase()).indexOf(q)>-1)||(removeTilde(n.name).indexOf(q)>-1)}function updateViews(){$.each(views,function(i,n){n.trigger("update",this);switch(visible){case 0:n.trigger("noMatches");break;case 1:n.trigger("singleMatch",[lastMatch]);break;default:n.trigger("multipleMatches")}})}function removeTilde(word){word=word.toLowerCase();word=word.replace(/à|á|ä|â/,"a");word=word.replace(/è|é|ë|ê/,"e");word=word.replace(/ì|í|ï|î/,"i");word=word.replace(/ò|ó|ö|ô/,"o");word=word.replace(/ù|ú|ü|û/,"u");word=word.replace("ñ","n");return word}};jQuery.SearchListView=function(e,sl,options){if(!options){options={}}options.formatItem=options.formatItem||formatItem;options.ulClass=options.ulClass||"";options.liClass=options.liClass||"";options.liClassHover=options.liClassHover||"";options.liHoverOver=options.liHoverOver||liHoverOver;options.liHoverOut=options.liHoverOut||liHoverOut;options.liOnClick=options.liOnclick||liOnClick;options.maxHeight=options.maxHeight||300;var sl=sl;var $e=$(e);var $ul=$("<ul></ul>").addClass(options.ulClass);$ul.appendTo($e);var $lis=null;var reset=function(){$ul.empty();anterior=null;flag=false;$.each(sl.getData(),function(i,n){var $li=$(options.formatItem(n));if(!n.visible){$li.hide()}$li.appendTo($ul);anterior=n.bold});$lis=$ul.children()};reset();var lh=$lis.length>0?$($lis.get(0)).height():0;var update=function(){var data=sl.getData();var d;var $l;var cnt=0;$.each($lis,function(i,n){$l=$(n);if($l.attr("oid")!=0){d=data[$l.attr("oid")];if(d.visible){$l.show();cnt++}else{$l.hide()}}});if(options.adaptHeight&&lh>0){$ul.height(cnt*lh>options.maxHeight?options.maxHeight:cnt*lh)}};$e.bind("update",update);sl.addView($e);function formatItem(i){return $('<li oid="'+i.id+'">'+i.name+"</li>").addClass(options.liClass).bind("click",options.liOnClick).hover(function(e){options.liHoverOver(e,this)},function(e){options.liHoverOut(e,this)})}function liHoverOver(e,li){$(li).addClass(options.liClassHover)}function liHoverOut(e,li){$(li).removeClass(options.liClassHover)}function liOnClick(e){window.alert("You clicked on "+$(e.target).attr("oid"))}};jQuery.SearchListControl=function(input,searchlist,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var hasFocus=0;var lastKeyPressCode;var sl=searchlist;$input.keydown(function(event){lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:break;case KEY.DOWN:break;case KEY.TAB:case KEY.RETURN:break;case KEY.ESC:break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break}}).keypress(function(){}).focus(function(){hasFocus++}).blur(function(){hasFocus=0}).click(function(){if(hasFocus++>1){onChange(0,true)}});function selectCurrent(){var selected=select.selected();if(!selected){return false}var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){v=words.slice(0,words.length-1).join(options.multipleSeparator)+options.multipleSeparator+v}v+=options.multipleSeparator}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true}function onChange(){var currentValue=$input.val();if(currentValue==previousValue){return}previousValue=currentValue;sl.eval(currentValue)}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=8){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));jQuery.Autocompleter.Selection(input,previousValue.length,previousValue.length+sValue.length)}}};jQuery.SearchListControl.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",delay:50,autoFill:false,width:0};jQuery.PhotoTagLists=function(tag_array){var tags={};var views=[];if(tag_array){for(pid in tag_array){tags[pid]={};for(i in tag_array[pid]){tags[pid][tag_array[pid][i].tid]=tag_array[pid][i]}}}this.updateTags=function(tag_array){tags={};for(pid in tag_array){tags[pid]={};for(i in tag_array[pid]){tags[pid][tag_array[pid][i].tid]=tag_array[pid][i]}}};this.addTags=function(pid,tag_array){if(tags[pid]===undefined){tags[pid]={}}for(i in tag_array){tags[pid][tag_array[i].tid]=tag_array[i]}};var updateViews=function(){for(i in views){if(views[i].update&&typeof views[i].update=="function"){views[i].update()}else{views[i].trigger("update")}}};this.addTag=function(tag){if(tags[tag.pid]===undefined){tags[tag.pid]={}}tags[tag.pid][tag.tid]=tag;updateViews()};this.removeTag=function(pid,tid){tags[pid][tid]=null;updateViews()};this.getTags=function(pid){return tags[pid]};this.getAllTags=function(){return tags};this.addView=function(v){views.push(v)}};jQuery.PhotoTagPhotoView=function(model,options){if(!options){options={}}options.tooltipClass=options.tooltipClass||"photo-tag";options.ulClass=options.ulClass||"ptcv_class";options.liClass=options.liClass||"ptcv_class";options.pointerTrigger=options.pointerTrigger||".ptv_trigger";options.emptyCaptionHTML=options.emptyCaptionHTML||'<ul class="grey info"><li>No tienes marcas en esta foto<br/>Haz clic sobre la foto para agregar marcas</li></ul>';function formatItemHTML(i){return'<span class="ptv_trigger" tid="'+i.tid+'">'+i.text+"</span>"}options.formatItemHTML=options.formatItemHTML||formatItemHTML;function formatItem(i){return $('<li pid="'+i.pid+'" tid="'+i.tid+'"></li>').addClass(options.liClass).html(options.formatItemHTML(i))}options.formatItem=options.formatItem||formatItem;var tags={};var model=model;var sarray=null;var textShown=false;var $tt=$("<div></div>").addClass(options.tooltipClass).hide().appendTo("body");var pointer=new jQuery.Pointer({side:options.pointerSize});var s=pointer.getSide();var r=s/2;this.update=function(){sarray=[[null,null,null,null]];tags={};var $ep;var $ec;var $ul;var x;var y;var X;var Y;var pos;var all_tags=model.getAllTags();for(k in all_tags){$ep=$("#img_photo_"+k);if($ep.length>0){pos=$ep.offset();x=pos.left;X=pos.left+$ep.width();y=pos.top;Y=pos.top+$ep.height();if(sarray[0][0]===null||x<sarray[0][0]){sarray[0][0]=x}if(sarray[0][2]===null||X>sarray[0][2]){sarray[0][2]=X}if(sarray[0][1]===null||y<sarray[0][1]){sarray[0][1]=y}if(sarray[0][3]===null||Y>sarray[0][3]){sarray[0][3]=Y}sarray.push([x,y,X,Y,k,$ep,pos])}$ec=$("#tag_captions_"+k);if($ec.length>0){$ec.empty();$ul=$("<ul></ul>").addClass(options.ulClass);var $li;var cnt=0;for(j in all_tags[k]){if(all_tags[k][j]==null){continue}$li=$(options.formatItem(all_tags[k][j])).bind("mouseover",showPointer).bind("mouseout",hidePointer);$ul.append($li);cnt++}if(cnt==0){$ec.append($(options.emptyCaptionHTML))}else{$ec.append($ul)}}tags[k]={};for(j in all_tags[k]){if(all_tags[k][j]==null){continue}var t=all_tags[k][j];tags[k][j]={x:parseInt(x+all_tags[k][j].x*$ep.width()),y:parseInt(y+all_tags[k][j].y*$ep.height()),text:all_tags[k][j].text}}}};function showText(e,$e,pos,pid,tid){var tag=tags[pid][tid];var ew=$e.width();var eh=$e.height();var er=pos.left+ew;var eb=pos.top+eh;$tt.html(tag.text).css("left",tag.x-tag.text.length*3.5/2).css("top",tag.y-pos.top<r?pos.top+s-10:(eb-tag.y<r?eb-10:tag.y+r-10)).show();textShown=true}function hideText(e){if(!textShown){return}$tt.hide();textShown=false}function followMouse(e){if(e.pageX<sarray[0][0]||e.pageX>sarray[0][2]||e.pageY<sarray[0][1]||e.pageY>sarray[0][3]){if(textShown){hideText(e)}return}var md=null;var t=null;var d=0;var p=null;var i;for(i=1;i<sarray.length;i++){if(e.pageY<sarray[i][1]||e.pageY>sarray[i][3]||e.pageX<sarray[i][0]||e.pageX>sarray[i][2]){continue}for(j in tags[sarray[i][4]]){if(e.pageX-(tags[sarray[i][4]][j].x-r)<0||e.pageX>tags[sarray[i][4]][j].x+r||e.pageY-(tags[sarray[i][4]][j].y-r)<0||e.pageY>tags[sarray[i][4]][j].y+r){continue}d=Math.pow(e.pageX-tags[sarray[i][4]][j].x,2)+Math.pow(e.pageY-tags[sarray[i][4]][j].y,2);if(md==null||d<md){md=d;t=j}}break}if(t==null){hideText(e)}else{showText(e,sarray[i][5],sarray[i][6],sarray[i][4],t)}}function showPointer(e){var pid=e.target.getAttribute("pid");var tid=e.target.getAttribute("tid");pointer.assoc(document.getElementById("img_photo_"+pid));pointer.moveToPoint(tags[pid][tid].x,tags[pid][tid].y);pointer.show()}function hidePointer(){pointer.hide()}function bindEvents(){$("body").bind("mousemove",followMouse)}function unbindEvents(){$("body").unbind("mousemove",followMouse)}model.addView(this);this.hideViews=function(){hidePointer();hideText()};this.start=function(){this.update();bindEvents()};this.restart=function(newmodel){model=newmodel;model.addView(this);this.update();bindEvents()};this.stop=function(){this.hideViews();unbindEvents()};this.start()};