/*
 * Linkselect jQuery Plug-in
 *
 * Copyright 2008 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: 2009-07-30
 * Rev:  1.2.08
 */
/* Modified 2009-09-25 OB - Fix right position when no title attribute */
(function(a){a.linkselect={version:"1.2.08"};a.fn.linkselect=function(e){var f=typeof arguments[0]=="string"&&arguments[0];var d=f&&Array.prototype.slice.call(arguments,1)||arguments;if(f&&this.length){var c=a.data(this[0],"linkselect");if(f.toLowerCase()=="object"){return c}else{if(c[f]){var b;this.each(function(g){var h=a.data(this,"linkselect")[f].apply(c,d);if(g==0&&h){if(!!h.jquery){b=a([]).add(h)}else{b=h;return false}}else{if(!!h&&!!h.jquery){b=b.add(h)}}});return b||this}else{return this}}}else{return this.each(function(){new a.LinkSelect(this,e)})}};a.LinkSelect=function(K,r){r=a.extend({},a.LinkSelect.defaults,r);var j=this,F=K,L=a(K),w={},y=false,l=0,x,f=false;this.id=L.attr("id");this.val=function(P,O){if(arguments.length>0){H(P,O);return k}else{return z.val()}};this.focus=function(){setTimeout(function(){k.focus()},1);return k};this.blur=function(){setTimeout(function(){k.blur()},1);return k};this.open=function(P,O){if(y){return k}a(document).triggerHandler("click.linkselect");if(O!==false){k.trigger("focus")}setTimeout(function(){G(P)},1);return k};this.disable=function(O){y=O;k.parent().find("span."+r.classDisabled).remove();k[y?"hide":"show"]();if(y){k.after('<span class="'+r.classDisabled+'">'+k.html()+"</span>")}return k};this.replaceOptions=function(O,P){L.children("option").remove();a.each(O,function(Q){var R=a("<option/>").attr("value",this.value).html(this.text);if(this.selected==true){R.attr("selected","selected")}if(this.className){R.addClass(this.className)}R.appendTo(L)});o();c();q().trigger("click.linkselect",[true,P])};var A=M();L.after(A).remove();var z=A.filter("input");var k=A.filter("a");var h=A.filter("div");var p=A.find(".scrollable");var i=A.find(".title");var s=h.find("ul");var u;z.addClass(L.attr("className"));a.data(z[0],"linkselect",this);h.appendTo("body").bind("mousemove.linkselect",function(O){u=O});function c(){s.find("li").bind("mouseover.linkselect",function(O){if(u&&u.type=="keydown"){return}D(a(this));u=O}).bind("click.linkselect",function(T,P,S){T.preventDefault();var O=q().removeClass(r.classSelected);var Q=a(this).addClass(r.classSelected);var R=Q.attr("rel")||"";var U=Q.find("."+r.classValue).html();g(P);if((S!==false)&&((a.isFunction(r.change)&&(r.change.apply(j,[this,R,U,S])===false))||(a.isFunction(L[0].onchange)&&(L[0].onchange.apply(j,[this,R,U,S])===false)))){O.addClass(r.classSelected);Q.removeClass(r.classSelected);return}z.val(R);k.html(U)[(P!==true)?"trigger":"triggerHandler"]("focus",[P]);if(y){k.parent().find("span."+r.classDisabled).html(U)}})}c();k.bind("click.linkselect",function(O){O.preventDefault();E();if(a.browser.msie){setTimeout(function(){k.trigger("focus.linkselect")},0)}}).bind("focus.linkselect",function(P,O){if(!h.is(":visible")&&(O!==true)){k.addClass(r.classLinkFocus)}}).bind("blur.linkselect",function(O){if(N(O)){g()}k.removeClass(r.classLinkFocus)}).bind((a.browser.safari?"keydown":"keypress")+".linkselect",function(T,S){if(!!S){var T=S}var P=T.keyCode||T.charCode,R=String.fromCharCode(P).toLowerCase();switch(P){case 38:case 40:T.preventDefault();B((P==38)?-1:1);u=T;break;case 13:T.preventDefault();if(h.is(":visible")){h.find("li."+r.classCurrent).trigger("click.linkselect")}else{k.trigger("click.linkselect")}break;case 9:case 27:g();break;case 35:T.preventDefault();m();u=T;break;case 36:T.preventDefault();v();u=T;break;case 33:case 34:T.preventDefault();var O=h.is(":visible");if(!O){h.show()}var Q=parseInt(p.height()/s.find("li:first").outerHeight(),10);if(!O){h.hide()}B((P==33)?Q*-1:Q);break}if(R!=x){l=0}x=R;if(typeof w[R]!="undefined"){if(l>=w[R].length){l=0}s.find("#"+j.id+"_li_"+w[R][l]).trigger("click.linkselect");T.preventDefault();T.stopPropagation();l++}});if(a.browser.msie){k.bind("keydown.linkselect",function(O){if(",8,9,33,34,35,36,37,38,39,40,".indexOf(","+O.keyCode+",")>-1){return a(this).triggerHandler("keypress.linkselect",[O])}})}a(document).bind("click.linkselect",function(O){if((O.target!==k[0])&&(O.target!==p[0])&&h.is(":visible")){g();k.removeClass(r.classLinkFocus)}});a(window).resize(function(){if(f){n(k,h,true)}});function M(){var T=j.id;var S=L.attr("title");var R=F.selectedIndex==-1?"":F[F.selectedIndex].text;var Q=F.selectedIndex==-1?"":F[F.selectedIndex][(a.browser.msie&&a.browser.version<=7&&!(F[F.selectedIndex].attributes.value.specified))?"text":"value"];var P=L.attr("tabindex");var O=['<a href="#'+j.id+'" id="'+j.id+'_link" class="'+r.classLink+'"'+(P?' tabindex="'+P+'"':"")+">"+R+"</a>",'<input type="hidden" name="'+j.id+'" id="'+j.id+'" value="'+Q+'" />','<div class="'+r.classContainer+'">',(S)?'<div class="title"><span>'+S+"</span></div>":"",'<div class="scrollable"><ul id="'+j.id+'_list">',I(L.children("option")),"</ul></div>","</div>"];return a(O.join(""))}function I(O){w=[];var P=[];O.each(function(S){var W=a(this);var U=W.is(":selected");var Q=a.trim(W.text());var R='<span class="'+r.classValue+'">'+Q+"</span>";var V=a.browser.msie&&a.browser.version<=7&&!(this.attributes.value.specified)?this.text:this.value;if(a.isFunction(r.format)){R=r.format.apply(j,[R,V,Q,S,W,r])||R}var T=(Q.length>1)?Q.substring(0,1).toLowerCase():"";if(!w[T]){w[T]=[]}w[T].push(S);var X=a.trim(this.className+" "+(U?r.classSelected:""));P.push('<li id="'+j.id+"_li_"+S+'" rel="'+V+(X.length>0?'" class="'+X:"")+'">'+R+"</li>")});return P.join("")}function o(){e=false;h[0].style.width="";if(i.length){i[0].style.width="";i.css("float","")}s.html(I(L.children("option")))}function H(Q,P){var O=s.find("li[rel="+Q+"]");if(O.length==0){O=s.find("li:eq(0)")}return O.trigger("click.linkselect",[true,P])}function q(){var O=s.find("li.selected");if(O.length==0){O=s.find("li:eq(0)")}return O}function t(){var O=s.find("li.current");if(O.length==0){O=q()}return O}function D(O){h.find(".current").removeClass(r.classCurrent);O.addClass(r.classCurrent);return O}function B(P){var O=t();var Q=parseInt(O.attr("id").replace(/(.+)(_(\d+$))/gi,"$3"),10);d(Q+P)}function d(R){var Q=a("li",h),O;if(!Q||Q.length==0){return false}var P=t().removeClass(r.classCurrent);if(isNaN(R)||R<0){O=Q.eq(0)}else{if(R>Q.length-1){O=Q.eq(Q.length-1)}else{O=Q.eq(R)}}if(h.is(":visible")){O.addClass(r.classCurrent);b(O)}else{if(P[0]!==O[0]){O.trigger("click.linkselect")}}}function v(){d(0)}function m(){d(L.children("option").length-1)}function b(P,O){var R=P[0];var S=p[0];var Q={pTop:parseInt(p.css("paddingTop"),10)||0,pBottom:parseInt(p.css("paddingBottom"),10)||0,bTop:parseInt(p.css("borderTopWidth"),10)||0,bBottom:parseInt(p.css("borderBottomWidth"),10)||0};if((R.offsetTop+R.offsetHeight)>(S.scrollTop+S.clientHeight)){S.scrollTop=P.offset().top+(S.scrollTop-p.offset().top)-((S.clientHeight/((O==true)?2:1))-(P.outerHeight()+Q.pBottom))}else{if(R.offsetTop-Q.bTop-Q.bBottom<=(S.scrollTop+Q.pTop+Q.pBottom)){S.scrollTop=P.offset().top+(S.scrollTop-p.offset().top)-Q.pTop}}}function E(){if(h.is(":visible")){g()}else{G()}}var e=false;function G(U){var P=q();k.removeClass(r.classLinkFocus).addClass(r.classLinkOpen);h.show();if(!e){var T=(k.css("display").indexOf("inline")>-1)?k.parent().outerWidth():k.outerWidth();var Q=r.fixedWidth?T:h.width();if(Q<T){Q=T}var S=parseInt(p.css("max-height"),10);if(a.browser.msie&&a.browser.version<=6){if((S>0)&&(p.height()>S)){p.height(S)}}if(s.height()>S){Q+=25}var R=parseInt("0"+h.css("max-width"),10);if((R>0)&&(Q>R)){Q=T=R}h.width(Q);if(a.browser.safari){var O=h.width();if(T>O){Q=T=O}}i.width(T);if(i.outerWidth()>T){i.width(T-(i.outerWidth()-T))}if(r.titleAlign.toLowerCase()=="right"&&!r.fixedWidth){i.css("float","right")}e=true}n(k,h,true);if(!!a.fn.bgIframe){h.bgIframe()}b(P,true);D(P);if(a.isFunction(r.open)){r.open.apply(this,[h,k,P,i])}if(a.isFunction(U)){U.apply(this,[h,k,P,i])}f=true}function g(O){if(O!==true){k.addClass(r.classLinkFocus).removeClass(r.classLinkOpen)}h.hide();if(a.isFunction(r.close)){r.close.apply(this,[h,k,q(),i])}f=false}function C(O){var P=false;if(O.is(":hidden")){P=!!O.css("visibility","hidden").show()}var Q=a.extend(O.offset(),{width:O.outerWidth(),height:O.outerHeight(),marginLeft:parseInt(a.curCSS(O[0],"marginLeft",true),10)||0,marginRight:parseInt(a.curCSS(O[0],"marginRight",true),10)||0,marginTop:parseInt(a.curCSS(O[0],"marginTop",true),10)||0,marginBottom:parseInt(a.curCSS(O[0],"marginBottom",true),10)||0});if(Q.marginTop<0){Q.top+=Q.marginTop}if(Q.marginLeft<0){Q.left+=Q.marginLeft}Q.bottom=Q.top+Q.height;Q.right=Q.left+Q.width;if(P){O.hide().css("visibility","visible")}return Q}function n(S,O){var U=C(S);var T=J();var Q=h.outerWidth()+U.left;if(Q>T.x){if(i.length){U.left=(U.left-h.outerWidth())+i.outerWidth()}else{U.left=(U.left-h.outerWidth())+S.outerWidth()}}else{var R=h.outerWidth(),P=i.outerWidth();if(R>P){i.width(R-(P-i.width()))}}O.css({position:"absolute",top:U[r.yAxis],left:U.left});return U.bottom}function J(){var O={scrollLeft:a(window).scrollLeft(),scrollTop:a(window).scrollTop(),width:a("body").width(),height:a("body").height()};O.x=O.scrollLeft+O.width;O.y=O.scrollTop+O.height;return O}function N(O){return !("bubbles" in O||"cancelBubble" in O)}if(a.isFunction(r.init)){r.init.apply(this,[L,z,k,h,p,i,s])}};a.LinkSelect.defaults={classLink:"linkselectLink",classLinkOpen:"linkselectLinkOpen",classLinkFocus:"linkselectLinkFocus",classContainer:"linkselectContainer",classSelected:"selected",classCurrent:"current",classDisabled:"linkselectDisabled",classValue:"linkselectValue",yAxis:"top",titleAlign:"right",fixedWidth:false,init:null,change:null,format:null,open:null,close:null}})(jQuery);
