/*
 * Linkselect jQuery Plug-in
 *
 * Copyright 2011 Giva, Inc. (http://www.givainc.com/labs/) 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * 	http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Date: 2011-12-20
 * Rev:  1.5.00
 */
(function(B){B.linkselect={version:"1.5.00"};B.fn.linkselect=function(F){var G=typeof arguments[0]=="string"&&arguments[0];var E=G&&Array.prototype.slice.call(arguments,1)||arguments;if(G&&this.length){var D=B.data(this[0],"linkselect");if(G.toLowerCase()=="object"){return D}else{if(D[G]){var C;this.each(function(H){var I=B.data(this,"linkselect")[G].apply(D,E);if(H==0&&I){if(!!I.jquery){C=B([]).add(I)}else{C=I;return false}}else{if(!!I&&!!I.jquery){C=C.add(I)}}});return C||this}else{return this}}}else{return this.each(function(){new B.LinkSelect(this,F)})}};var A=0;B.LinkSelect=function(q,V){V=B.extend({},B.LinkSelect.defaults,V);if(V.style.length==0){V.style=B.LinkSelect.defaults.style}V.classes={link:V.style+"-link",linkText:V.style+"-link-text",linkOpen:V.style+"-link-open",linkIcon:V.style+"-link-icon",linkFocus:V.style+"-link-focus",container:V.style+"-container",selected:V.style+"-selected",current:V.style+"-current",disabled:V.style+"-disabled",scrollable:V.style+"-scrollable",title:V.style+"-title",value:V.style+"-value",placeholder:"placeholder"};var J=this,K=++A,l=q,r=B(q),a={},d=false,N=0,c,F=false,b;this.id=r.attr("id");this.val=function(w,v){if(arguments.length>0){m(w,v);return M}else{return e.val()}};this.text=function(){return U().find("span."+V.classes.value).text()};this.focus=function(){setTimeout(function(){M.focus()},1);return M};this.blur=function(){setTimeout(function(){M.blur()},1);return M};this.open=function(w,v){if(d){return M}B(document).triggerHandler("click.linkselect");if(v!==false){M.trigger("focus")}setTimeout(function(){k(w)},1);return M};this.disable=function(v){d=v;M.parent().find("span."+V.classes.disabled).remove();M[d?"hide":"show"]();if(d){M.after('<span class="'+V.classes.disabled+'">'+M.html()+"</span>")}return M};this.destroy=function(){W.undelegate("li","*");M.unbind("*");o();M.before(r);f.remove()};this.replaceOptions=function(x,z,y){var v=(typeof z==="string");if(!v&&!y){y=z}var w=r.children("option");if(v&&z.length){w=w.not(z)}w.remove();B.each(x,function(AA){var AB=B("<option/>").attr("value",this.value).html(this.text);if(this.selected==true){AB.attr("selected","selected")}if(this.className){AB.addClass(this.className)}AB.appendTo(r)});Q();U().trigger("click.linkselect",[true,y])};var f=s();r.after(f).remove();var e=f.filter("input"),M=f.filter("a"),u=M.find("> span."+V.classes.linkText),H=f.filter("div"),R=f.find("."+V.classes.scrollable),I=f.find("."+V.classes.title),W=H.find("ul"),Y;S();e.addClass(r.attr("class"));B.data(e[0],"linkselect",this);H.appendTo("body").bind("mousemove.linkselect",function(v){Y=v});W.delegate("li","mouseover.linkselect",function(v){if(Y&&Y.type=="keydown"){return }i(B(this));Y=v}).delegate("li","click.linkselect",function(AA,w,z){AA.preventDefault();var v=U().removeClass(V.classes.selected),x=B(this).addClass(V.classes.selected),y=x.attr("data-value")||"",AB=x.find("."+V.classes.value).html();G(w);if((z!==false)&&((B.isFunction(V.change)&&(V.change.apply(J,[this,y,AB,z])===false))||(B.isFunction(r[0].onchange)&&(r[0].onchange.apply(J,[this,y,AB,z])===false)))){v.addClass(V.classes.selected);x.removeClass(V.classes.selected);return }e.val(y);u.html(AB);M[(w!==true)?"trigger":"triggerHandler"]("focus",[w]);if(d){M.parent().find("span."+V.classes.disabled).html(AB)}});M.bind("click.linkselect",function(v){v.preventDefault();j();setTimeout(function(){M.trigger("focus.linkselect")},0)}).bind("focus.linkselect",function(w,v){if(!H.is(":visible")&&(v!==true)){M.addClass(V.classes.linkFocus)}}).bind("blur.linkselect",function(v){if(t(v)){G()}M.removeClass(V.classes.linkFocus)}).bind((B.browser.safari?"keydown":"keypress")+".linkselect",function(AA,z){if(!!z){var AA=z}var w=AA.keyCode||AA.charCode,y=String.fromCharCode(w).toLowerCase();switch(w){case 38:case 40:AA.preventDefault();g((w==38)?-1:1);Y=AA;break;case 13:AA.preventDefault();if(H.is(":visible")){H.find("li."+V.classes.current).trigger("click.linkselect")}else{M.trigger("click.linkselect")}break;case 9:case 27:G();break;case 35:AA.preventDefault();O();Y=AA;break;case 36:AA.preventDefault();Z();Y=AA;break;case 33:case 34:AA.preventDefault();var v=H.is(":visible");if(!v){H.show()}var x=parseInt(R.height()/W.find("li:first").outerHeight(),10);if(!v){H.hide()}g((w==33)?x*-1:x);break}if(y!=c){N=0}c=y;if(typeof a[y]!="undefined"){if(N>=a[y].length){N=0}W.find("#"+J.id+"_li_"+a[y][N]).trigger("click.linkselect");AA.preventDefault();AA.stopPropagation();N++}});if(B.browser.msie){M.bind("keydown.linkselect",function(v){if(",8,9,33,34,35,36,37,38,39,40,".indexOf(","+v.keyCode+",")>-1){return B(this).triggerHandler("keypress.linkselect",[v])}})}function T(){B(document).bind("click.linkselect-"+K,function(w){var x=B(w.target);if((x.closest("a")[0]!==M[0])&&(x[0]!==R[0])&&H.is(":visible")){G();if(b&&(x.closest("."+V.classes.title)[0]===I[0])){L()}var v=x.closest(H);if(v.length){setTimeout(function(){M.trigger("focus.linkselect")},13)}else{M.removeClass(V.classes.linkFocus)}}});B(window).bind("resize.linkselect-"+K,function(){P(M,H)})}function o(){B(document).unbind("click.linkselect-"+K);B(window).unbind("resize.linkselect-"+K)}function s(){var AA=J.id,w=r.attr("name")||AA,z=l.selectedIndex==-1?"":l[l.selectedIndex].text,y=l.selectedIndex==-1?"":l[l.selectedIndex][(B.browser.msie&&B.browser.version<=7&&!(l[l.selectedIndex].attributes.value.specified))?"text":"value"],x=r.attr("tabindex");var v=['<a href="#'+J.id+'" id="'+J.id+'_link" class="'+B.trim(V.classes.link+" "+V.classLink)+'"'+(x?' tabindex="'+x+'"':"")+">",'<span class="'+V.classes.linkText+'">',z,"</span>",'<span class="'+V.classes.linkIcon+'"><span></span></span>',"</a>",'<input type="hidden" name="'+w+'" id="'+J.id+'" value="'+y+'" />','<div class="'+V.classes.container+'">','<div class="'+V.classes.title+'"><span></span></div>','<div class="'+V.classes.scrollable+'"><ul id="'+J.id+'_list">',n(r.children("option")),"</ul></div>","</div>"];return B(v.join(""))}function n(v){a=[],b=v.filter("."+V.classes.placeholder).eq(0);if(b.length==0){b=null}var w=[];v.each(function(z){var AD=B(this);var AB=AD.is(":selected");var x=B.trim(AD.text());var y='<span class="'+V.classes.value+'">'+x+"</span>";var AC=B.browser.msie&&B.browser.version<=7&&!(this.attributes.value.specified)?this.text:this.value;if(B.isFunction(V.format)){y=V.format.apply(J,[y,AC,x,z,AD,V])||y}var AA=(x.length>1)?x.substring(0,1).toLowerCase():"";if(!a[AA]){a[AA]=[]}a[AA].push(z);var AE=B.trim(this.className+" "+(AB?V.classes.selected:""));w.push('<li id="'+J.id+"_li_"+z+'" data-value="'+AC+(AE.length>0?'" class="'+AE:"")+((b&&(b[0]===AD[0]))?'" style="display: none;':"")+'">'+y+"</li>")});return w.join("")}function Q(){E=false;H[0].style.width="";if(I.length){I[0].style.width="";I.css("float","")}W.html(n(r.children("option")));if(b){S()}}function S(){var v=B.trim(r.attr("title")||(b&&b.text())||"");I[v.length?"show":"hide"]()[b?"addClass":"removeClass"](V.classes.placeholder).find("span").text(v)}function L(){var v=U().removeClass(V.classes.selected),w=b.attr("value")||"",x=b.text();if(((B.isFunction(V.change)&&(V.change.apply(J,[this,w,x,true])===false))||(B.isFunction(r[0].onchange)&&(r[0].onchange.apply(J,[this,w,x,true])===false)))){v.addClass(V.classes.selected);return }e.val(w);u.html(x).parent().triggerHandler("focus");if(d){M.parent().find("span."+V.classes.disabled).html(x)}}function m(x,w){var v=W.find("li[data-value='"+x+"']");if(v.length==0){v=W.find("li:eq(0)")}return v.trigger("click.linkselect",[true,w])}function U(){var v=W.find("li."+V.classes.selected);if(v.length==0){v=W.find("li:eq(0)")}return v}function X(){var v=W.find("li."+V.classes.current);if(v.length==0){v=U()}return v}function i(v){H.find("."+V.classes.current).removeClass(V.classes.current);v.addClass(V.classes.current);return v}function g(w){var v=X();var x=parseInt(v.attr("id").replace(/(.+)(_(\d+$))/gi,"$3"),10);D(x+w)}function D(y){var x=H.find("li"),v;if(!x||x.length==0){return false}var w=X().removeClass(V.classes.current);if(isNaN(y)||y<0){v=x.eq(0)}else{if(y>x.length-1){v=x.eq(x.length-1)}else{v=x.eq(y)}}if(H.is(":visible")){v.addClass(V.classes.current);C(v)}else{if(w[0]!==v[0]){v.trigger("click.linkselect")}}}function Z(){D(0)}function O(){D(r.children("option").length-1)}function C(w,v){var y=w[0];var z=R[0];var x={pTop:parseInt(R.css("paddingTop"),10)||0,pBottom:parseInt(R.css("paddingBottom"),10)||0,bTop:parseInt(R.css("borderTopWidth"),10)||0,bBottom:parseInt(R.css("borderBottomWidth"),10)||0};if((y.offsetTop+y.offsetHeight)>(z.scrollTop+z.clientHeight)){z.scrollTop=w.offset().top+(z.scrollTop-R.offset().top)-((z.clientHeight/((v==true)?2:1))-(w.outerHeight()+x.pBottom))}else{if(y.offsetTop-x.bTop-x.bBottom<=(z.scrollTop+x.pTop+x.pBottom)){z.scrollTop=w.offset().top+(z.scrollTop-R.offset().top)-x.pTop}}}function j(){var v=H.is(":visible");if(v){G()}else{k()}return v}var E=false;function k(AC){T();var x=U(),w=!E;M.removeClass(V.classes.linkFocus).addClass(V.classes.linkOpen);H.show();if(!E){var AB=(M.css("display").indexOf("inline")>-1)?M.parent().outerWidth(true):M.outerWidth(true);var y=V.fixedWidth?AB:H.outerWidth(true);if(y<AB){y=AB}var AA=parseInt(R.css("max-height"),10);if(B.browser.msie&&B.browser.version<=6){if((AA>0)&&(R.height()>AA)){R.height(AA)}}if(W.height()>AA){y+=25}var z=parseInt("0"+H.css("max-width"),10);if((z>0)&&(y>z)){y=AB=z}H.width(y);if(B.browser.safari){var v=H.width();if(AB>v){y=AB=v}}AB=AB-((parseInt(I.css("marginRight"),10)||0)-(parseInt(I.css("marginLeft"),10)||0));I.width(AB);if(I.outerWidth()>AB){I.width(AB-(I.outerWidth()-AB))}if(V.titleAlign.toLowerCase()=="right"&&!V.fixedWidth){I.css("float","right")}E=true}P(M,H,w);if(!!B.fn.bgIframe){H.bgIframe()}C(x,true);i(x);if(B.isFunction(V.open)){V.open.apply(this,[H,M,x,I])}if(B.isFunction(AC)){AC.apply(this,[H,M,x,I])}F=true}function G(v){o();if(v!==true){M.addClass(V.classes.linkFocus).removeClass(V.classes.linkOpen)}H.hide();if(B.isFunction(V.close)){V.close.apply(this,[H,M,U(),I])}F=false}function h(v){var w=false;if(v.is(":hidden")){w=!!v.css("visibility","hidden").show()}var x=B.extend(v.offset(),{width:v.outerWidth(),height:v.outerHeight(),marginLeft:parseInt(B.curCSS(v[0],"marginLeft",true),10)||0,marginRight:parseInt(B.curCSS(v[0],"marginRight",true),10)||0,marginTop:parseInt(B.curCSS(v[0],"marginTop",true),10)||0,marginBottom:parseInt(B.curCSS(v[0],"marginBottom",true),10)||0,paddingLeft:parseInt(B.curCSS(v[0],"paddingLeft",true),10)||0,paddingRight:parseInt(B.curCSS(v[0],"paddingRight",true),10)||0,borderLeftWidth:parseInt(B.curCSS(v[0],"borderLeftWidth",true),10)||0,borderRightWidth:parseInt(B.curCSS(v[0],"borderRightWidth",true),10)||0});if(x.marginTop<0){x.top+=x.marginTop}if(x.marginLeft<0){x.left+=x.marginLeft}x.bottom=x.top+x.height;x.right=x.left+x.width;if(w){v.hide().css("visibility","visible")}return x}function P(AD,v,y){var AA=h(AD);var x=p();var AC=H.outerWidth()+AA.left;if(AC>x.x){var z=AA.paddingLeft+AA.paddingRight+AA.borderLeftWidth+AA.borderRightWidth;if(y){I.width(I.width()-z)}AA.left=(AA.left+z-H.outerWidth())+I.outerWidth(true)}else{var AB=H.width(),w=I.outerWidth(true);if(AB>w){I.width(AB-(w-I.width()))}}v.css({position:"absolute",top:AA[V.yAxis],left:AA.left});return AA.bottom}function p(){var v={scrollLeft:B(window).scrollLeft(),scrollTop:B(window).scrollTop(),width:B("body").width(),height:B("body").height()};v.x=v.scrollLeft+v.width;v.y=v.scrollTop+v.height;return v}function t(v){return !("bubbles" in v||"cancelBubble" in v)}if(B.isFunction(V.init)){V.init.apply(this,[r,e,M,H,R,I,W])}};B.LinkSelect.defaults={style:"linkselect",classLink:"",yAxis:"top",titleAlign:"right",fixedWidth:false,init:null,change:null,format:null,open:null,close:null}})(jQuery);
