/*
 * jQuery Uniform 1.5
 * Allows styling of form elements
 */
(function(a){a.uniform={options:{selectClass:"selector",radioClass:"radio",checkboxClass:"checker",fileClass:"uploader",filenameClass:"filename",fileBtnClass:"action",fileDefaultText:"No file selected",fileBtnText:"Choose File",checkedClass:"checked",focusClass:"focus",disabledClass:"disabled",buttonClass:"button",activeClass:"active",hoverClass:"hover",useID:true,idPrefix:"uniform",resetSelector:false,autoHide:true},elements:[]};if(a.browser.msie&&a.browser.version<7){a.support.selectOpacity=false}else{a.support.selectOpacity=true}a.fn.uniform=function(k){k=a.extend(a.uniform.options,k);var d=this;if(k.resetSelector!=false){a(k.resetSelector).mouseup(function(){function l(){a.uniform.update(d)}setTimeout(l,10)})}function j(l){$el=a(l);$el.addClass($el.attr("type"));b(l)}function g(l){a(l).addClass("uniform");b(l)}function i(o){var m=a(o);var p=a("<div>"),l=a("<span>");p.addClass(k.buttonClass);if(k.useID&&m.attr("id")!=""){p.attr("id",k.idPrefix+"-"+m.attr("id"))}var n;if(m.is("a")||m.is("button")){n=m.text()}else{if(m.is(":submit")||m.is(":reset")||m.is("input[type=button]")){n=m.attr("value")}}n=n==""?m.is(":reset")?"Reset":"Submit":n;l.html(n);m.css("opacity",0);m.wrap(p);m.wrap(l);p=m.closest("div");l=m.closest("span");if(m.is(":disabled")){p.addClass(k.disabledClass)}p.bind({"mouseenter.uniform":function(){p.addClass(k.hoverClass)},"mouseleave.uniform":function(){p.removeClass(k.hoverClass);p.removeClass(k.activeClass)},"mousedown.uniform touchbegin.uniform":function(){p.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"click.uniform touchend.uniform":function(r){if(a(r.target).is("span")||a(r.target).is("div")){if(o[0].dispatchEvent){var q=document.createEvent("MouseEvents");q.initEvent("click",true,true);o[0].dispatchEvent(q)}else{o[0].click()}}}});o.bind({"focus.uniform":function(){p.addClass(k.focusClass)},"blur.uniform":function(){p.removeClass(k.focusClass)}});a.uniform.noSelect(p);b(o)}function e(o){var m=a(o);var p=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){p.hide()}p.addClass(k.selectClass);if(k.useID&&o.attr("id")!=""){p.attr("id",k.idPrefix+"-"+o.attr("id"))}var n=o.find(":selected:first");if(n.length==0){n=o.find("option:first")}l.html(n.html());o.css("opacity",0);o.wrap(p);o.before(l);p=o.parent("div");l=o.siblings("span");o.bind({"change.uniform":function(){l.text(o.find(":selected").html());p.removeClass(k.activeClass)},"focus.uniform":function(){p.addClass(k.focusClass)},"blur.uniform":function(){p.removeClass(k.focusClass);p.removeClass(k.activeClass)},"mousedown.uniform touchbegin.uniform":function(){p.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"click.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"mouseenter.uniform":function(){p.addClass(k.hoverClass)},"mouseleave.uniform":function(){p.removeClass(k.hoverClass);p.removeClass(k.activeClass)},"keyup.uniform":function(){l.text(o.find(":selected").html())}});if(a(o).attr("disabled")){p.addClass(k.disabledClass)}a.uniform.noSelect(l);b(o)}function f(n){var m=a(n);var o=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){o.hide()}o.addClass(k.checkboxClass);if(k.useID&&n.attr("id")!=""){o.attr("id",k.idPrefix+"-"+n.attr("id"))}a(n).wrap(o);a(n).wrap(l);l=n.parent();o=l.parent();a(n).css("opacity",0).bind({"focus.uniform":function(){o.addClass(k.focusClass)},"blur.uniform":function(){o.removeClass(k.focusClass)},"click.uniform touchend.uniform":function(){if(!a(n).attr("checked")){l.removeClass(k.checkedClass)}else{l.addClass(k.checkedClass)}},"mousedown.uniform touchbegin.uniform":function(){o.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){o.removeClass(k.activeClass)},"mouseenter.uniform":function(){o.addClass(k.hoverClass)},"mouseleave.uniform":function(){o.removeClass(k.hoverClass);o.removeClass(k.activeClass)}});if(a(n).attr("checked")){l.addClass(k.checkedClass)}if(a(n).attr("disabled")){o.addClass(k.disabledClass)}b(n)}function c(n){var m=a(n);var o=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){o.hide()}o.addClass(k.radioClass);if(k.useID&&n.attr("id")!=""){o.attr("id",k.idPrefix+"-"+n.attr("id"))}a(n).wrap(o);a(n).wrap(l);l=n.parent();o=l.parent();a(n).css("opacity",0).bind({"focus.uniform":function(){o.addClass(k.focusClass)},"blur.uniform":function(){o.removeClass(k.focusClass)},"click.uniform touchend.uniform":function(){if(!a(n).attr("checked")){l.removeClass(k.checkedClass)}else{var p=k.radioClass.split(" ")[0];a("."+p+" span."+k.checkedClass+":has([name='"+a(n).attr("name")+"'])").removeClass(k.checkedClass);l.addClass(k.checkedClass)}},"mousedown.uniform touchend.uniform":function(){if(!a(n).is(":disabled")){o.addClass(k.activeClass)}},"mouseup.uniform touchbegin.uniform":function(){o.removeClass(k.activeClass)},"mouseenter.uniform touchend.uniform":function(){o.addClass(k.hoverClass)},"mouseleave.uniform":function(){o.removeClass(k.hoverClass);o.removeClass(k.activeClass)}});if(a(n).attr("checked")){l.addClass(k.checkedClass)}if(a(n).attr("disabled")){o.addClass(k.disabledClass)}b(n)}function h(q){var o=a(q);var r=a("<div />"),p=a("<span>"+k.fileDefaultText+"</span>"),m=a("<span>"+k.fileBtnText+"</span>");if(!o.css("display")=="none"&&k.autoHide){r.hide()}r.addClass(k.fileClass);p.addClass(k.filenameClass);m.addClass(k.fileBtnClass);if(k.useID&&o.attr("id")!=""){r.attr("id",k.idPrefix+"-"+o.attr("id"))}o.wrap(r);o.after(m);o.after(p);r=o.closest("div");p=o.siblings("."+k.filenameClass);m=o.siblings("."+k.fileBtnClass);if(!o.attr("size")){var l=r.width();o.attr("size",l/10)}var n=function(){var s=o.val();if(s===""){s=k.fileDefaultText}else{s=s.split(/[\/\\]+/);s=s[(s.length-1)]}p.text(s)};n();o.css("opacity",0).bind({"focus.uniform":function(){r.addClass(k.focusClass)},"blur.uniform":function(){r.removeClass(k.focusClass)},"mousedown.uniform":function(){if(!a(q).is(":disabled")){r.addClass(k.activeClass)}},"mouseup.uniform":function(){r.removeClass(k.activeClass)},"mouseenter.uniform":function(){r.addClass(k.hoverClass)},"mouseleave.uniform":function(){r.removeClass(k.hoverClass);r.removeClass(k.activeClass)}});if(a.browser.msie){o.bind("click.uniform.ie7",function(){setTimeout(n,0)})}else{o.bind("change.uniform",n)}if(o.attr("disabled")){r.addClass(k.disabledClass)}a.uniform.noSelect(p);a.uniform.noSelect(m);b(q)}a.uniform.restore=function(l){if(l==undefined){l=a(a.uniform.elements)}a(l).each(function(){if(a(this).is(":checkbox")){a(this).unwrap().unwrap()}else{if(a(this).is("select")){a(this).siblings("span").remove();a(this).unwrap()}else{if(a(this).is(":radio")){a(this).unwrap().unwrap()}else{if(a(this).is(":file")){a(this).siblings("span").remove();a(this).unwrap()}else{if(a(this).is("button, :submit, :reset, a, input[type='button']")){a(this).unwrap().unwrap()}}}}}a(this).unbind(".uniform");a(this).css("opacity","1");var m=a.inArray(a(l),a.uniform.elements);a.uniform.elements.splice(m,1)})};function b(l){l=a(l).get();if(l.length>1){a.each(l,function(m,n){a.uniform.elements.push(n)})}else{a.uniform.elements.push(l)}}a.uniform.noSelect=function(l){function m(){return false}a(l).each(function(){this.onselectstart=this.ondragstart=m;a(this).mousedown(m).css({MozUserSelect:"none"})})};a.uniform.update=function(l){if(l==undefined){l=a(a.uniform.elements)}l=a(l);l.each(function(){var n=a(this);if(n.is("select")){var m=n.siblings("span");var p=n.parent("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.html(n.find(":selected").html());if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":checkbox")){var m=n.closest("span");var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.removeClass(k.checkedClass);if(n.is(":checked")){m.addClass(k.checkedClass)}if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":radio")){var m=n.closest("span");var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.removeClass(k.checkedClass);if(n.is(":checked")){m.addClass(k.checkedClass)}if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":file")){var p=n.parent("div");var o=n.siblings(k.filenameClass);btnTag=n.siblings(k.fileBtnClass);p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);o.text(n.val());if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":submit")||n.is(":reset")||n.is("button")||n.is("a")||l.is("input[type=button]")){var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}}}}}})};return this.each(function(){if(a.support.selectOpacity){var l=a(this);if(l.is("select")){if(l.attr("multiple")!=true){if(l.attr("size")==undefined||l.attr("size")<=1){e(l)}}}else{if(l.is(":checkbox")){f(l)}else{if(l.is(":radio")){c(l)}else{if(l.is(":file")){h(l)}else{if(l.is(":text, :password, input[type='email']")){j(l)}else{if(l.is("textarea")){g(l)}else{if(l.is("a")||l.is(":submit")||l.is(":reset")||l.is("button")||l.is("input[type=button]")){i(l)}}}}}}}}})}})(jQuery);


/*
 * --------------------------------------------------------------------
 * jQuery-Plugin - selectToUISlider - creates a UI slider component from a select element(s)
 * by Scott Jehl, scott@filamentgroup.com
 * http://www.filamentgroup.com
 * reference article: http://www.filamentgroup.com/lab/update_jquery_ui_16_slider_from_a_select_element/
 * demo page: http://www.filamentgroup.com/examples/slider_v2/index.html
 * 
 * Copyright (c) 2008 Filament Group, Inc
 * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
 *
 * Usage Notes: please refer to our article above for documentation
 *  
 * --------------------------------------------------------------------
 */
jQuery.fn.selectToUISlider=function(g){function l(a){return d.tooltipSrc=="text"?e[a].text:e[a].value}var h=jQuery(this),d=jQuery.extend({labels:3,tooltip:true,tooltipSrc:"text",labelSrc:"value",sliderOptions:null},g),o=function(){var a=[];h.each(function(){a.push("handle_"+jQuery(this).attr("id"))});return a}(),e=function(){var a=[];h.eq(0).find("option").each(function(){a.push({value:jQuery(this).attr("value"),text:jQuery(this).text()})});return a}(),k=function(){if(h.eq(0).find("optgroup").size()>
0){var a=[];h.eq(0).find("optgroup").each(function(b){a[b]={};a[b].label=jQuery(this).attr("label");a[b].options=[];jQuery(this).find("option").each(function(){a[b].options.push({text:jQuery(this).text(),value:jQuery(this).attr("value")})})});return a}else return null}(),i={step:1,min:0,orientation:"horizontal",max:e.length-1,range:h.length>1,slide:function(a,b){var c=jQuery(b.handle),j=l(b.value);c.attr("aria-valuetext",j).attr("aria-valuenow",b.value).find(".ui-slider-tooltip .ttContent").text(j);
c=jQuery("#"+c.attr("id").split("handle_")[1]);c.find("option").eq(b.value).attr("selected","selected");$(c).change()},values:function(){var a=[];h.each(function(){a.push(jQuery(this).get(0).selectedIndex)});return a}()};d.sliderOptions=g?jQuery.extend(i,g.sliderOptions):i;h.bind("change keyup click",function(){var a=jQuery(this).get(0).selectedIndex,b=jQuery("#handle_"+jQuery(this).attr("id")),c=b.data("handleNum");b.parents(".ui-slider:eq(0)").slider("values",c,a)});var f=jQuery("<div></div>");
h.each(function(a){var b="",c=jQuery("label[for="+jQuery(this).attr("id")+"]"),j=c.size()>0?"Slider control for "+c.text()+"":"";c=c.attr("id")||c.attr("id","label_"+o[a]).attr("id");if(d.tooltip==false)b=' style="display: none;"';jQuery('<a href="#" tabindex="0" id="'+o[a]+'" class="ui-slider-handle" role="slider" aria-labelledby="'+c+'" aria-valuemin="'+d.sliderOptions.min+'" aria-valuemax="'+d.sliderOptions.max+'" aria-valuenow="'+d.sliderOptions.values[a]+'" aria-valuetext="'+l(d.sliderOptions.values[a])+
'" ><span class="screenReaderContext">'+j+'</span><span class="ui-slider-tooltip ui-widget-content ui-corner-all"'+b+'><span class="ttContent"></span><span class="ui-tooltip-pointer-down ui-widget-content"><span class="ui-tooltip-pointer-down-inner"></span></span></span></a>').data("handleNum",a).appendTo(f)});if(k){var m=0,n=f.append('<dl class="ui-slider-scale ui-helper-reset" role="presentation"></dl>').find(".ui-slider-scale:eq(0)");jQuery(k).each(function(a){n.append('<dt style="width: '+(100/
k.length).toFixed(2)+"%; left:"+(a/(k.length-1)*100).toFixed(2)+'%"><span>'+this.label+"</span></dt>");var b=this.options;jQuery(this.options).each(function(c){var j=m==e.length-1||m==0?'style="display: none;"':"";c=d.labelSrc=="text"?b[c].text:b[c].value;n.append('<dd style="left:'+((m/(e.length-1)*100).toFixed(2)+"%")+'"><span class="ui-slider-label">'+c+'</span><span class="ui-slider-tic ui-widget-content"'+j+"></span></dd>");m++})})}else{n=f.append('<ol class="ui-slider-scale ui-helper-reset" role="presentation"></ol>').find(".ui-slider-scale:eq(0)");
jQuery(e).each(function(a){var b=a==e.length-1||a==0?'style="display: none;"':"",c=d.labelSrc=="text"?this.text:this.value;n.append('<li style="left:'+((a/(e.length-1)*100).toFixed(2)+"%")+'"><span class="ui-slider-label">'+c+'</span><span class="ui-slider-tic ui-widget-content"'+b+"></span></li>")})}d.labels>1&&f.find(".ui-slider-scale li:last span.ui-slider-label, .ui-slider-scale dd:last span.ui-slider-label").addClass("ui-slider-label-show");g=Math.max(1,Math.round(e.length/d.labels));for(i=0;i<
e.length;i+=g)e.length-i>g&&f.find(".ui-slider-scale li:eq("+i+") span.ui-slider-label, .ui-slider-scale dd:eq("+i+") span.ui-slider-label").addClass("ui-slider-label-show");f.find(".ui-slider-scale dt").each(function(a){jQuery(this).css({left:(100/k.length*a).toFixed(2)+"%"})});f.insertAfter(jQuery(this).eq(this.length-1)).slider(d.sliderOptions).attr("role","application").find(".ui-slider-label").each(function(){jQuery(this).css("marginLeft",-jQuery(this).width()/2)});f.find(".ui-tooltip-pointer-down-inner").each(function(){var a=
jQuery(".ui-tooltip-pointer-down-inner").css("borderTopWidth"),b=jQuery(this).parents(".ui-slider-tooltip").css("backgroundColor");jQuery(this).css("border-top",a+" solid "+b)});g=f.slider("values");g.constructor==Array?jQuery(g).each(function(a){f.find(".ui-slider-tooltip .ttContent").eq(a).text(l(this))}):f.find(".ui-slider-tooltip .ttContent").eq(0).text(l(g));return this};

/*
 * HTML5 Forms Chapter JavaScript Library
 * http://thecssninja.com/javascript/H5F
 *
 * Copyright (c) 2010 Ryan Seddon - http://thecssninja.com/
 * Dual-licensed under the BSD and MIT licenses.
 * http://thecssninja.com/H5F/license.txt
 */
 var H5F=H5F||{};(function(d){var field=d.createElement("input"),emailPatt=new RegExp("^([a-z0-9_.-]+)@([0-9a-z.-]+).([a-z.]{2,6})$","i"),urlPatt=new RegExp("[a-z][-\.+a-z]*:\/\/","i"),usrPatt,curEvt,args;H5F.setup=function(form,settings){var isCollection=!form.nodeType||false;var opts={validClass:"valid",invalidClass:"error",requiredClass:"required"};if(typeof settings==="object"){for(var i in opts){if(typeof settings[i]==="undefined"){settings[i]=opts[i];}}}
 args=settings||opts;if(isCollection){for(var k=0,len=form.length;k<len;k++){H5F.validation(form[k]);}}else{H5F.validation(form);}};H5F.validation=function(form){var f=form.elements,flen=f.length,isRequired;H5F.listen(form,"invalid",H5F.checkField,true);H5F.listen(form,"blur",H5F.checkField,true);H5F.listen(form,"focus",H5F.checkField,true);if(!H5F.support()){form.checkValidity=function(){return H5F.checkValidity(form);};while(flen--){isRequired=!!(f[flen].attributes["required"]);if(f[flen].nodeName!=="FIELDSET"&&isRequired){H5F.validity(f[flen]);}}}};H5F.validity=function(el){var elem=el,missing=H5F.valueMissing(elem),type=elem.getAttribute("type"),pattern=elem.getAttribute("pattern"),placeholder=elem.getAttribute("placeholder"),isType=/^(email|url)$/i,evt=/^(input|keyup)$/i,fType=((isType.test(type))?type:((pattern)?pattern:false)),patt=H5F.pattern(elem,fType),step=H5F.range(elem,"step"),min=H5F.range(elem,"min"),max=H5F.range(elem,"max");elem.validity={patternMismatch:patt,rangeOverflow:max,rangeUnderflow:min,stepMismatch:step,valid:(!missing&&!patt&&!step&&!min&&!max),valueMissing:missing};if(placeholder&&!evt.test(curEvt)){H5F.placeholder(elem);}
 elem.checkValidity=function(){return H5F.checkValidity(elem);};};H5F.checkField=function(e){var el=H5F.getTarget(e)||e,events=/^(input|keyup|focusin|focus)$/i,checkForm=true;curEvt=e.type;if(!H5F.support()){H5F.validity(el);}
 if(el.validity.valid){H5F.removeClass(el,[args.invalidClass,args.requiredClass]);H5F.addClass(el,args.validClass);}else if(!events.test(curEvt)){if(el.validity.valueMissing){H5F.removeClass(el,[args.invalidClass,args.validClass]);H5F.addClass(el,args.requiredClass);}else{H5F.removeClass(el,[args.validClass,args.requiredClass]);H5F.addClass(el,args.invalidClass);}}else if(el.validity.valueMissing){H5F.removeClass(el,[args.requiredClass,args.invalidClass,args.validClass]);}
 if(curEvt==="input"&&checkForm){H5F.unlisten(el.form,"keyup",H5F.checkField,true);checkForm=false;}};H5F.checkValidity=function(el){var f,ff,isRequired,invalid=false;if(el.nodeName==="FORM"){f=el.elements;for(var i=0,len=f.length;i<len;i++){ff=f[i];isRequired=!!(ff.attributes["required"]);hasPattern=!!(ff.attributes["pattern"]);if(ff.nodeName!=="FIELDSET"&&(isRequired||hasPattern)){H5F.checkField(ff);if(!ff.validity.valid&&!invalid){ff.focus();invalid=true;}}}
 return!invalid;}else{H5F.checkField(el);return el.validity.valid;}};H5F.support=function(){return(H5F.isHostMethod(field,"validity")&&H5F.isHostMethod(field,"checkValidity"));};H5F.pattern=function(el,type){if(type==="email"){return!emailPatt.test(el.value);}else if(type==="url"){return!urlPatt.test(el.value);}else if(!type){return false;}else{usrPatt=new RegExp(type);return!usrPatt.test(el.value);}};H5F.placeholder=function(el){var placeholder=el.getAttribute("placeholder"),focus=/^(focus|focusin)$/i,node=/^(input|textarea)$/i,isNative=!!("placeholder"in field);if(!isNative&&node.test(el.nodeName)){if(el.value===""){el.value=placeholder;}else if(el.value===placeholder&&focus.test(curEvt)){el.value="";}}};H5F.range=function(el,type){var min=parseInt(el.getAttribute("min"),10)||0,max=parseInt(el.getAttribute("max"),10)||false,step=parseInt(el.getAttribute("step"),10)||1,val=parseInt(el.value,10),mismatch=(val-min)%step;if(!H5F.valueMissing(el)&&!isNaN(val)){if(type==="step"){return(el.getAttribute("step"))?(mismatch!==0):false;}else if(type==="min"){return(el.getAttribute("min"))?(val<min):false;}else if(type==="max"){return(el.getAttribute("max"))?(val>max):false;}}else if(el.getAttribute("type")==="number"){return true;}else{return false;}};H5F.required=function(el){var required=!!(el.attributes["required"]);return(required)?H5F.valueMissing(el):false;};H5F.valueMissing=function(el){var placeholder=el.getAttribute("placeholder"),isRequired=!!(el.attributes["required"]);return!!(isRequired&&(el.value===""||el.value===placeholder));};H5F.listen=function(node,type,fn,capture){if(H5F.isHostMethod(window,"addEventListener")){node.addEventListener(type,fn,capture);}else if(H5F.isHostMethod(window,"attachEvent")&&typeof window.event!=="undefined"){if(type==="blur"){type="focusout";}else if(type==="focus"){type="focusin";}
 node.attachEvent("on"+type,fn);}};H5F.unlisten=function(node,type,fn,capture){if(H5F.isHostMethod(window,"removeEventListener")){node.removeEventListener(type,fn,capture);}else if(H5F.isHostMethod(window,"detachEvent")&&typeof window.event!=="undefined"){node.detachEvent("on"+type,fn);}};H5F.preventActions=function(evt){evt=evt||window.event;if(evt.stopPropagation&&evt.preventDefault){evt.stopPropagation();evt.preventDefault();}else{evt.cancelBubble=true;evt.returnValue=false;}};H5F.getTarget=function(evt){evt=evt||window.event;return evt.target||evt.srcElement;};H5F.addClass=function(e,c){var re;if(!e.className){e.className=c;}
 else{re=new RegExp('(^|\\s)'+c+'(\\s|$)');if(!re.test(e.className)){e.className+=' '+c;}}};H5F.removeClass=function(e,c){var re,m,arr=(typeof c==="object")?c.length:1,len=arr;if(e.className){if(e.className==c){e.className='';}
 else{while(arr--){re=new RegExp('(^|\\s)'+((len>1)?c[arr]:c)+'(\\s|$)');m=e.className.match(re);if(m&&m.length==3){e.className=e.className.replace(re,(m[1]&&m[2])?' ':'');}}}}};H5F.isHostMethod=function(o,m){var t=typeof o[m],reFeaturedMethod=new RegExp('^function|object$','i');return!!((reFeaturedMethod.test(t)&&o[m])||t=='unknown');};})(document);

// Plugin to copy code on project page
// Simple Set Clipboard System
// Author: Joseph Huckaby

var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"/javascripts/plugins/ZeroClipboard.swf",nextId:1,$:function(a){if(typeof a=="string")a=document.getElementById(a);if(!a.addClass){a.hide=function(){this.style.display="none"};a.show=function(){this.style.display=""};a.addClass=function(b){this.removeClass(b);this.className+=" "+b};a.removeClass=function(b){for(var c=this.className.split(/\s+/),d=-1,e=0;e<c.length;e++)if(c[e]==b){d=e;e=c.length}if(d>-1){c.splice(d,1);this.className=c.join(" ")}return this};
a.hasClass=function(b){return!!this.className.match(RegExp("\\s*"+b+"\\s*"))}}return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,c){(a=this.clients[a])&&a.receiveEvent(b,c)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a,b){for(var c={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};a&&a!=b;){c.left+=a.offsetLeft;c.top+=a.offsetTop;a=a.offsetParent}return c},Client:function(a){this.handlers={};this.id=ZeroClipboard.nextId++;
this.movieId="ZeroClipboardMovie_"+this.id;ZeroClipboard.register(this.id,this);a&&this.glue(a)}};
ZeroClipboard.Client.prototype={id:0,ready:false,movie:null,clipText:"",handCursorEnabled:true,cssEffects:true,handlers:null,glue:function(a,b,c){this.domElement=ZeroClipboard.$(a);a=99;if(this.domElement.style.zIndex)a=parseInt(this.domElement.style.zIndex,10)+1;if(typeof b=="string")b=ZeroClipboard.$(b);else if(typeof b=="undefined")b=document.getElementsByTagName("body")[0];var d=ZeroClipboard.getDOMObjectPosition(this.domElement,b);this.div=document.createElement("div");var e=this.div.style;e.position=
"absolute";e.left=""+d.left+"px";e.top=""+d.top+"px";e.width=""+d.width+"px";e.height=""+d.height+"px";e.zIndex=a;if(typeof c=="object")for(addedStyle in c)e[addedStyle]=c[addedStyle];b.appendChild(this.div);this.div.innerHTML=this.getHTML(d.width,d.height)},getHTML:function(a,b){var c="",d="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/)){var e=location.href.match(/^https/i)?"https://":"http://";c+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+
e+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+a+'" height="'+b+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+d+'"/><param name="wmode" value="transparent"/></object>'}else c+=
'<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+a+'" height="'+b+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+d+'" wmode="transparent" />';return c},hide:function(){if(this.div)this.div.style.left="-2000px"},show:function(){this.reposition()},destroy:function(){if(this.domElement&&
this.div){this.hide();this.div.innerHTML="";var a=document.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.div=this.domElement=null}},reposition:function(a){if(a)(this.domElement=ZeroClipboard.$(a))||this.hide();if(this.domElement&&this.div){a=ZeroClipboard.getDOMObjectPosition(this.domElement);var b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,
"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=document.getElementById(this.movieId);if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){c=
this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=true;return}this.ready=true;this.movie.setText(this.clipText);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":if(this.domElement&&this.cssEffects){this.domElement.addClass("hover");this.recoverActive&&this.domElement.addClass("active")}break;case "mouseout":if(this.domElement&&this.cssEffects){this.recoverActive=false;if(this.domElement.hasClass("active")){this.domElement.removeClass("active");this.recoverActive=
true}this.domElement.removeClass("hover")}break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":if(this.domElement&&this.cssEffects){this.domElement.removeClass("active");this.recoverActive=false}}if(this.handlers[a])for(var d=0,e=this.handlers[a].length;d<e;d++){var f=this.handlers[a][d];if(typeof f=="function")f(this,b);else if(typeof f=="object"&&f.length==2)f[0][f[1]](this,b);else typeof f=="string"&&window[f](this,b)}}};

// Date input
DateInput=(function(A){function B(C,D){if(typeof (D)!="object"){D={}}A.extend(this,B.DEFAULT_OPTS,D);this.input=A(C);this.bindMethodsToObj("show","hide","hideIfClickOutside","keydownHandler","selectDate");this.build();this.selectDate();this.hide()}B.DEFAULT_OPTS={month_names:["January","February","March","April","May","June","July","August","September","October","November","December"],short_month_names:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],short_day_names:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],start_of_week:1};B.prototype={build:function(){var C=A('<p class="month_nav"><span class="button prev" title="[Page-Up]">&#171;</span> <span class="month_name"></span> <span class="button next" title="[Page-Down]">&#187;</span></p>');this.monthNameSpan=A(".month_name",C);A(".prev",C).click(this.bindToObj(function(){this.moveMonthBy(-1)}));A(".next",C).click(this.bindToObj(function(){this.moveMonthBy(1)}));var D=A('<p class="year_nav"><span class="button prev" title="[Ctrl+Page-Up]">&#171;</span> <span class="year_name"></span> <span class="button next" title="[Ctrl+Page-Down]">&#187;</span></p>');this.yearNameSpan=A(".year_name",D);A(".prev",D).click(this.bindToObj(function(){this.moveMonthBy(-12)}));A(".next",D).click(this.bindToObj(function(){this.moveMonthBy(12)}));var E=A('<div class="nav"></div>').append(C,D);var F="<table><thead><tr>";A(this.adjustDays(this.short_day_names)).each(function(){F+="<th>"+this+"</th>"});F+="</tr></thead><tbody></tbody></table>";this.dateSelector=this.rootLayers=A('<div class="date_selector"></div>').append(E,F).insertAfter(this.input);if(A.browser.msie&&A.browser.version<7){this.ieframe=A('<iframe class="date_selector_ieframe" frameborder="0" src="#"></iframe>').insertBefore(this.dateSelector);this.rootLayers=this.rootLayers.add(this.ieframe);A(".button",E).mouseover(function(){A(this).addClass("hover")});A(".button",E).mouseout(function(){A(this).removeClass("hover")})}this.tbody=A("tbody",this.dateSelector);this.input.change(this.bindToObj(function(){this.selectDate()}));this.selectDate()},selectMonth:function(D){var J=new Date(D.getFullYear(),D.getMonth(),1);if(!this.currentMonth||!(this.currentMonth.getFullYear()==J.getFullYear()&&this.currentMonth.getMonth()==J.getMonth())){this.currentMonth=J;var I=this.rangeStart(D),H=this.rangeEnd(D);var C=this.daysBetween(I,H);var F="";for(var E=0;E<=C;E++){var G=new Date(I.getFullYear(),I.getMonth(),I.getDate()+E,12,0);if(this.isFirstDayOfWeek(G)){F+="<tr>"}if(G.getMonth()==D.getMonth()){F+='<td class="selectable_day" date="'+this.dateToString(G)+'">'+G.getDate()+"</td>"}else{F+='<td class="unselected_month" date="'+this.dateToString(G)+'">'+G.getDate()+"</td>"}if(this.isLastDayOfWeek(G)){F+="</tr>"}}this.tbody.empty().append(F);this.monthNameSpan.empty().append(this.monthName(D));this.yearNameSpan.empty().append(this.currentMonth.getFullYear());A(".selectable_day",this.tbody).click(this.bindToObj(function(K){this.changeInput(A(K.target).attr("date"))}));A("td[date="+this.dateToString(new Date())+"]",this.tbody).addClass("today");A("td.selectable_day",this.tbody).mouseover(function(){A(this).addClass("hover")});A("td.selectable_day",this.tbody).mouseout(function(){A(this).removeClass("hover")})}A(".selected",this.tbody).removeClass("selected");A("td[date="+this.selectedDateString+"]",this.tbody).addClass("selected")},selectDate:function(C){if(typeof (C)=="undefined"){C=this.stringToDate(this.input.val())}if(!C){C=new Date()}this.selectedDate=C;this.selectedDateString=this.dateToString(this.selectedDate);this.selectMonth(this.selectedDate)},changeInput:function(C){this.input.val(C).change();this.hide()},show:function(){this.rootLayers.css("display","block");A([window,document.body]).click(this.hideIfClickOutside);this.input.unbind("focus",this.show);A(document.body).keydown(this.keydownHandler);this.setPosition()},hide:function(){this.rootLayers.css("display","none");A([window,document.body]).unbind("click",this.hideIfClickOutside);this.input.focus(this.show);A(document.body).unbind("keydown",this.keydownHandler)},hideIfClickOutside:function(C){if(C.target!=this.input[0]&&!this.insideSelector(C)){this.hide()}},insideSelector:function(C){var D=this.dateSelector.position();D.top=D.top+140;D.right=D.left+this.dateSelector.outerWidth();D.bottom=D.top+this.dateSelector.outerHeight();return C.pageY<D.bottom&&C.pageY>D.top&&C.pageX<D.right&&C.pageX>D.left},keydownHandler:function(C){switch(C.keyCode){case 9:case 27:this.hide();return ;break;case 13:this.changeInput(this.selectedDateString);break;case 33:this.moveDateMonthBy(C.ctrlKey?-12:-1);break;case 34:this.moveDateMonthBy(C.ctrlKey?12:1);break;case 38:this.moveDateBy(-7);break;case 40:this.moveDateBy(7);break;case 37:this.moveDateBy(-1);break;case 39:this.moveDateBy(1);break;default:return }C.preventDefault()},stringToDate:function(C){var D;if(D=C.match(/^(\d{1,2}) ([^\s]+) (\d{4,4})$/)){return new Date(D[3],this.shortMonthNum(D[2]),D[1],12,0)}else{return null}},dateToString:function(C){return C.getDate()+" "+this.short_month_names[C.getMonth()]+" "+C.getFullYear()},setPosition:function(){var C=this.input.offset();this.rootLayers.css({left:C.left});if(this.ieframe){this.ieframe.css({width:this.dateSelector.outerWidth(),height:this.dateSelector.outerHeight()})}},moveDateBy:function(D){var C=new Date(this.selectedDate.getFullYear(),this.selectedDate.getMonth(),this.selectedDate.getDate()+D);this.selectDate(C)},moveDateMonthBy:function(D){var C=new Date(this.selectedDate.getFullYear(),this.selectedDate.getMonth()+D,this.selectedDate.getDate());if(C.getMonth()==this.selectedDate.getMonth()+D+1){C.setDate(0)}this.selectDate(C)},moveMonthBy:function(C){var D=new Date(this.currentMonth.getFullYear(),this.currentMonth.getMonth()+C,this.currentMonth.getDate());this.selectMonth(D)},monthName:function(C){return this.month_names[C.getMonth()]},bindToObj:function(D){var C=this;return function(){return D.apply(C,arguments)}},bindMethodsToObj:function(){for(var C=0;C<arguments.length;C++){this[arguments[C]]=this.bindToObj(this[arguments[C]])}},indexFor:function(E,D){for(var C=0;C<E.length;C++){if(D==E[C]){return C}}},monthNum:function(C){return this.indexFor(this.month_names,C)},shortMonthNum:function(C){return this.indexFor(this.short_month_names,C)},shortDayNum:function(C){return this.indexFor(this.short_day_names,C)},daysBetween:function(D,C){D=Date.UTC(D.getFullYear(),D.getMonth(),D.getDate());C=Date.UTC(C.getFullYear(),C.getMonth(),C.getDate());return(C-D)/86400000},changeDayTo:function(C,D,E){var F=E*(Math.abs(D.getDay()-C-(E*7))%7);return new Date(D.getFullYear(),D.getMonth(),D.getDate()+F)},rangeStart:function(C){return this.changeDayTo(this.start_of_week,new Date(C.getFullYear(),C.getMonth()),-1)},rangeEnd:function(C){return this.changeDayTo((this.start_of_week-1)%7,new Date(C.getFullYear(),C.getMonth()+1,0),1)},isFirstDayOfWeek:function(C){return C.getDay()==this.start_of_week},isLastDayOfWeek:function(C){return C.getDay()==(this.start_of_week-1)%7},adjustDays:function(E){var D=[];for(var C=0;C<E.length;C++){D[C]=E[(C+this.start_of_week)%7]}return D}};A.fn.date_input=function(C){return this.each(function(){new B(this,C)})};A.date_input={initialize:function(C){A("input.date_input").date_input(C)}};return B})(jQuery)
$.extend(DateInput.DEFAULT_OPTS, {
  stringToDate: function(string) {
    var matches;
    if (matches = string.match(/^(\d{4,4})-(\d{1,2})-(\d{1,2})$/)) {
      return new Date(matches[1], matches[2] - 1, matches[3]);
    } else {
      return null;
    };
  },
  
  dateToString: function(date) {
    var month = (date.getMonth() + 1).toString();
    var dom = date.getDate().toString();
    return date.getFullYear() + "-" + (month < 10 ? '0' : '') + month + "-" + (dom < 10 ? '0' : '') + dom;
  }
});

// SmartStorage wrapper by ahume (github.com/ahume/smart-storage)
function SmartStorage(a){if(SmartStorage.browserIsSupported())this.dbname=a}SmartStorage.prototype._setItemForDb=function(a,b,c){b=JSON.stringify(b);c&&(b=(new Date).getTime()+c+"--cache--"+b);return localStorage.setItem(this.dbname+"_"+a,b)};SmartStorage.prototype._getItemForDb=function(a){(a=localStorage.getItem(this.dbname+"_"+a))&&(a=SmartStorage.getCachableValue(a));return JSON.parse(a)};SmartStorage.prototype._removeItemForDb=function(a){return localStorage.removeItem(this.dbname+"_"+a)};
SmartStorage.prototype.set=function(a,b,c,d){if(arguments.length<2)throw"SmartStorage error: set() requires at least 2 arguments.";if(SmartStorage.typeOf(b)==="function")throw"SmartStorage error: Can't store function reference.";return this._setItemForDb(a,b,c,d)};SmartStorage.prototype.get=function(a,b){if(arguments.length<1)throw"SmartStorage error: get() requires 1 argument.";return this._getItemForDb(a,b)};
SmartStorage.getCachableValue=function(a){a.indexOf("--cache--")>-1&&(a=a.split("--cache--"),a=(new Date).getTime()>a[0]?null:a[1]);return a};SmartStorage.browserIsSupported=function(){try{return"localStorage"in window&&window.localStorage!==null}catch(e){return false}};SmartStorage.typeOf=function(a){var b=typeof a;b==="object"&&(a?a instanceof Array?b="array":a instanceof String&&(b="string"):b="null");return b};

// Throttle function calls thanks to @rem
function throttle(fn, delay) {
  var timer = null;
  return function () {
    var context = this, args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

// Little plugin to preload images 
$.fn.preload = function() {
 this.each(function(){
     (new Image()).src = this;
 });
}

/* Fontdeck implementation */
function init() {
    store = new SmartStorage('fontdeck');
    ready_called = true;
    FontdeckSampler.init( $(".fontdeck-sampler") );
    Fontdeck.QuickSearch.init();
    Fontdeck.FormElements.init();
    Fontdeck.Account.init();
    H5F.setup($("form.validate"));
    Fontdeck.FavouriteToggle.init();
    Fontdeck.AddToWebsite.init();
    Fontdeck.FontSampleText.init();
    Fontdeck.Tags.init();
}

Fontdeck = {};

Fontdeck.FavouriteToggle = (function() {
    
    var fav_pend_img = "/images/icons/fav-pend.png",
        fav_no_img = "/images/icons/fav-no.png",
        fav_yes_img = "/images/icons/fav-yes.png";
    
    var ajax_config = {
        type:     'POST',
        dataType: 'json',
        url:      '/favorite_xhr',
        timeout: '7000',
        data: {}
    };
    
    function init() {
        if ($(".fav-toggle").length > 0) {
            // Preload remainder of icons
            $([fav_pend_img, fav_no_img, fav_yes_img]).preload();
            $(document).delegate(".fav-toggle", "click", function(e) {
                var update = ( $(this).hasClass("add-fav") ) ? "add" : "rm"; 
                updateFav(update, this.getAttribute("data-fav-type"), this.id.replace('favorite_',''));
                e.preventDefault();
            });
        }
    }
    
    function updateFav(update, type, id) { // eg updateFav("add", "font", 795)
        ajax_config.data.action = update + "_fav_" + ((type == "typeface") ? "tf" : "font");
        ajax_config.data[type] = id;
        ajax_config.success = function() {
            success(id);
        }
        ajax_config.error = function() {
            error(id);
        }
        $("#favorite_" + id).addClass("pend-fav").find("img").attr("src", fav_pend_img);
        $.ajax(ajax_config);
    }
    
    function success(id) {
        var el = $("#favorite_" + id);
        if( el.hasClass("rm-fav") ) {
            el.removeClass("rm-fav pend-fav").addClass("add-fav");
            el.find("img").attr("src", fav_no_img);
            el.html( el.html().replace(/Remove from/g, "Add to") );
        } else {
            el.removeClass("add-fav pend-fav").addClass("rm-fav");
            el.find("img").attr("src", fav_yes_img);
            el.html( el.html().replace(/Add to/g, "Remove from") );
        }
    }
    
    function error(id) {
        var el = $("#favorite_" + id);
        if( el.hasClass("rm-fav") ) {
            el.removeClass("pend-fav").find("img").attr("src", fav_yes_img);
        } else {
            el.removeClass("pend-fav").find("img").attr("src", fav_no_img);
        }
    }
    
    return {
        "init": init
    }
    
})();

var FontdeckSampler = (function() {
    
    var current_sample = 1,
        rotating = true,
        rotation_time = 5000,
        total_samples,
        rotation_timer,
        container;
    
    function init(el) {
        
        total_samples = $(".sample-holder .sample-x").length;
        
        buildNav();
        
        container = el;
        
        container.find(".sampler-nav ol a").live("click", function(e) {
            var sample_to_show = parseInt(this.getAttribute("data-sample"));
            
            showSample(sample_to_show);
            
            rotating = false;
            clearInterval(rotation_timer);
            
            e.preventDefault();
        })
    }
    
    function buildNav() {
        var ol = document.createElement("ol");
        for (var i=0, j=total_samples; i<j; ++i) {
            var li;
            if (i===0) {
                li = $('<li class="selected"><a data-sample="' + (i+1) + '">Sample ' + (i+1) + '</a></li>');
            } else {
                li = $('<li><a href="#" data-sample="' + (i+1) + '">Sample ' + (i+1) + '</a></li>');
            }
            $(ol).append(li);
        }
        $(".sampler-nav").append(ol);
    }
    
    function showSample(sample_no) {
        if (sample_no === current_sample) {
            return false;
        }
                
        //container.find(".sample-" + current_sample).animate( {"opacity":0}, 500 );
        
        // If the element is display:block then the fonts are loaded. This is the current theory.
        var font_is_pre_loaded = (container.find(".sample-" + sample_no).css("display") === "block");
        
        if (font_is_pre_loaded) {
            fadeInSample(sample_no);
        } else {
            loadFontsForSample(sample_no);
            setTimeout(function() {
                fadeInSample(sample_no);
            }, 1000)
        }
    
        // If there are more samples, pre-load the fonts for the next one:
        if (sample_no < total_samples) {
            loadFontsForSample(sample_no + 1);
        }
        
        // Update the state of the obj and the interface.
        current_sample = sample_no;
        updateNavState();
    }
    
    function loaded() {
        // Once we've shown the first sample, we can setup the timer.
        rotation_timer = setInterval(function() {
            if (current_sample >= total_samples) {
                showSample(1);
            } else {
                showSample(current_sample + 1);
            }
        }, rotation_time);
    }
    
    function fadeInSample(sample_no) {
        var el = container.find(".sample-" + sample_no);
        el.css({"z-index":10}).animate( {"opacity":1}, 500, null, function() {
            el.css({"opacity":"auto", "z-index":5});
            $(".sample-x").not(".sample-" + sample_no).css({"opacity":0, "z-index":0});
        });
    }
    
    function loadFontsForSample(sample_no) {
        container.find(".sample-" + sample_no).css({"display":"block"});
    }
    
    function updateNavState() {
        container.find(".sampler-nav li").removeClass("selected").find("a").attr("href", "#");
        container.find(".sampler-nav li:nth-child(" + current_sample + ")").addClass("selected").find("a").removeAttr("href");
        
        // And font title
        var sampler = container.find(".sample-" + current_sample);
        container.find(".sampler-nav .font-name").html(sampler.attr("data-font")).attr("href", sampler.attr("data-font-url"));
        container.find(".sampler-nav .foundry-name").html(sampler.attr("data-foundry")).attr("href", sampler.attr("data-foundry-url"));
    }
    
    
    return {
        "init": init,
        "loaded": loaded
    }
    
})();

Fontdeck.QuickSearch = (function() {
    var $search = $('#search'),
        $form = $search.parent(),
        $results,
        $resultsInner,
        resultCache = {},
        ignoreBlur = false,
        keyName = {
            enter: 13,
            esc:   27,
            up:    38,
            down:  40
        };
    
    var ajax_config = {
        type:     'GET',
        dataType: 'json',
        url:      '/quicksearch_xhr',
        timeout: '7000',
        data: {},
        success: function(data) {
            resultCache[data.query] = data;
            if (data.total > 0) {
                setResults(data.results);
            } else {
                removeResults();
            }
        },
        error: function() {
            removeResults();
        }
    };
    
    function init() {
        if ($search.length > 0) {
            $(['/images/icons/search-loading.gif']).preload();
            $form.attr({autocomplete: 'off'}).delegate('li', 'mouseover mouseout', function(e) {
                if (e.type == 'mouseover') {
                    $('.selected', $results).removeClass('selected');
                    $(this).addClass('selected');
                } else {
                    $(this).removeClass('selected');
                }
            }).delegate('li a', 'mousedown', function(e) {
                ignoreBlur = true;
            }).append('<div class="quick-search"><div></div></div>');
            $results = $('.quick-search', $form);
            $resultsInner = $('div', $results);
            $search.bind('focus click', function() {
                search($search.val());
            }).bind('keydown', function(e) {
                if (e.keyCode == keyName.enter) {
                    if (goSelected()) {
                        e.preventDefault();
                    }
                } else if (e.keyCode == keyName.down) {
                    selectItem('next');
                    e.preventDefault();
                } else if (e.keyCode == keyName.up) {
                    selectItem('prev');
                    e.preventDefault();
                } else if (e.keyCode == keyName.esc) {
                    removeResults();
                }
            }).bind('keyup', throttle(function(e) {
                if (
                    e.keyCode == keyName.enter ||
                    e.keyCode == keyName.down ||
                    e.keyCode == keyName.up ||
                    e.keyCode == keyName.esc
                ) {
                    e.preventDefault();
                } else {
                    search($search.val());
                }
            }), 250).bind('blur', function() {
                setTimeout(function() {
                    if (!ignoreBlur) {
                        removeResults();
                    }
                    ignoreBlur = false;
                }, 10);
            });
        }
    }
    
    function search(query) {
        if (query.length > 2) {
            if (resultCache[query]) {
                if (resultCache[query].total > 0) {
                    setResults(resultCache[query].results);
                } else {
                    removeResults();
                }
            } else {
                ajax_config.data.q = query;
                $search.addClass('loading');
                $.ajax(ajax_config);
            }
        } else {
            removeResults();
        }
    }
    
    function setResults(results) {
        var output = '';
        var types    = ['typeface', 'designer', 'foundry', 'tag'];
        var headings = ['Font Families', 'Designers', 'Foundries', 'Tags'];
        for (var i in types) {
            var type = types[i];
            if (results[type]) {
                output += '<h3>'+headings[i]+'</h3><ul>';
                for (var i in results[type]) {
                    var result = results[type][i];
                    output += '<li><a href="'+result.url+'">'+result.name+'</a></li>';
                }
                output += '</ul>';
            }
        }
        $search.addClass('results').removeClass('loading');
        $results.css({display: 'block'});
        $resultsInner.html(output);
        $results.css({height: Math.min($resultsInner.height(), 500)});
    }
    
    function removeResults() {
        $search.removeClass('loading results');
        $results.css({display: 'none', height: 0});
        $resultsInner.html('');
    }
    
    function selectItem(type) {
        var $selected = $('.selected', $results);
        var $next;
        if (type == 'prev') {
            if ($selected.length > 0) {
                $next = $selected.prev();
                if ($next.length == 0) {
                    $next = $selected.parent().prev().prev().children().last();
                }
            } else {
                $next = $('li', $results).last();
            }
        } else {
            if ($selected.length > 0) {
                $next = $selected.next();
                if ($next.length == 0) {
                    $next = $selected.parent().next().next().children().first();
                }
            } else {
                $next = $('li', $results).first();
            }
        }
        if ($next.length > 0) {
            $selected.removeClass('selected');
            $next.addClass('selected');
        }
    }
    
    function goSelected() {
        var $target = $('.selected a', $results);
        if ($target.length > 0) {
            window.location = $target.attr('href');
            return true;
        } else {
            return false;
        }
    }

    return {
        "init": init
    }
    
})();

Fontdeck.FontSampleText = (function() {
    
    var SAMPLE_TEXT = {
        0: 'Why pangolins dream of quiche. Up, and after doing some business at my office abroad to Lumbard Street, about the getting of a good sum of money, thence home, in preparation for my having some good sum in my hands, for fear of a trouble in the State, that I may not have all I have in the world out of my hands and so be left a beggar. Having put that in a way, I home to the office, and so to the Tower; about shipping of some more pressed men, and that done, away to Broad Streete, to Sir G. Carteret, who is at a pay of tickets all alone, and I believe not less than one thousand people in the streets. But it is a pretty thing to observe that both there and every where else, a man shall see many women now-a-days of mean sort in the streets, but no men; men being so afeard of the press. I dined with Sir G. Carteret, and after dinner had much discourse about our publique business; and he do seem to fear every day more and more what I do; which is, a general confusion in the State; plainly answering me to the question, who is it that the weight of the warr depends [upon]? that it is only Sir W. Coventry.',
        1: 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789',
        4: 'На берегу пустынных волн Стоял он, дум великих полн, И вдаль глядел.  Пред ним широко Река неслася; бедный чёлн По ней стремился одиноко. По мшистым, топким берегам Чернели избы здесь и там, Приют убогого чухонца; И лес, неведомый лучам В тумане спрятанного солнца, Кругом шумел. И думал он: Отсель грозить мы будем шведу, Здесь будет город заложен Назло надменному соседу. Природой здесь нам суждено В Европу прорубить окно, Ногою твердой стать при море. Сюда по новым им волнам Все флаги в гости будут к нам – И запируем на просторе. fi ff st !?§$%&/() @€©®™„“ •–—«» =×÷† Why pangolins dream of quiche. 012345.',
        5: 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя',
        6: "Τη γλώσσα μου έδωσαν ελληνική το σπίτι φτωχικό στις αμμουδιές του Ομήρου. Μονάχη έγνοια η γλώσσα μου στις αμμουδιές του Ομήρου. Εκεί σπάροι και πέρκες ανεμόδαρτα ρήματα ρεύματα πράσινα μες στα γαλάζια όσα είδα στα σπλάχνα μου ν' ανάβουνε σφουγγάρια, μέδουσες με τα πρώτα λόγια των Σειρήνων όστρακα ρόδινα με τα πρώτα μαύρα ρίγη. Μονάχη έγνοια η γλώσσα μου, με τα πρώτα μαύρα ρίγη. Εκεί ρόδια, κυδώνια θεοί μελαχροινοί, θείοι κ' εξάδελφοι το λάδι αδειάζοντας μες στα πελώρια κιούπια. Και πνοές από τη ρεμματιά ευωδιάζοντας λυγαριά και σχίνο fi ff st !?§$%&/() @€©®™„“ •–—«» =×÷† Why pangolins dream of quiche. 012345.",
        7: "ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣςΤτΥυΦφΧχΨψΩω",
        8: 'Եվ նա իր ընկերների հետ սկսեց սովորական աղոթքներն ու տքնությունները եւ արտասվալից պաղատանքները, խստամբերությունները, արշխարհահեծ հոգսերը, հիշելով մարգարեի ասածը, թե՝ «Երբ որ հեծեծես, այն ժամանակ կապրես»: Եվ այսպես նա շատ նեղություններ քաշեց իր ազգին մի բարի օգնություն գտնելու համար: Ամեն բան շնորհող Աստծուց իսկապես պարգեւվեց նրան [այդ] բախտը. Նա իր սուրբ աջով հայրաբար ծնեց նոր եւ սքանչելի ծնունդներ–հայերեն լեզվի նշանագրեր: Եվ այնտեղ շուտով նշանակեց, անվանեց ու դասավորեց, հորինեց սիղոբաներով - կապերով: Եվ ապա հրաժեշտ տալով սուրբ եպիսկոպոսին, իր օգնականների հետ միասին իջավ Սամոսատ քաղաքը, ուր մեծապատիվ կերպով մեծարվեց եպիսկոպոսից եւ եկեղեցուց: Why pangolins dream of quiche. 012345.',
        9: 'ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ',
        10: 'ᏗᏓᎴᏂᏍᎬᎢ ᎤᏁᎳᏅᎯ ᏚᏬᏢᏁ ᏚᎸᎶᎢ ᎠᎴ ᎡᎶᎯ ᎡᎶᎯᏃ ᏂᏓᏤᎸᎾ ᎠᎴ ᎤᏚᎸᎭᏉ ᎨᏎᎢ.  ᎤᎵᏏᎩᏃ ᎤᏭᏝᎡ ᎠᏍᏛᎩ.  ᎤᏁᎳᏅᎯᏃ ᎤᏓᏅᏙ ᎠᎹᏱ ᎦᏚᎢ ᎦᏃᎯᎵᏙᎮᎢ.  ᎤᏁᎳᏅᎯᏃ ᎢᎦ ᏫᎦᏙᎩ, ᎤᏛᏁᎢ; ᎢᎦᏃ ᎢᎤᏙᏤᎢ. (ᎼᏏ ᎤᏬᏪᎳᏅᎯ 1:1-3)',
        11: 'ᎠᎡᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚ,ᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴ',
        12: 'قفز الثّعلب البني السّريع عبر ظهر الكلب الكسلان',
        13: 'أ ب ج د ه و ز ح ط ي ل م ن س ع ف ص ق ر ش ت ث خ ذ ض ظ غ'
    }
    
    var SAMPLE_TEXT_TITLE = {
        0:  'Why pangolins dream',
        1:  'AbBbCcDdEe…',
        2:  'Font Name',
        3:  'Enter your own text…',
        4:  'Cyrillic',
        5:  'АаБбВвГгДдЕе…',
        6:  'Greek',
        7:  'ΑαΒβΓγΔδΕε…',
        8:  'Armenian',
        9:  'ԱաԲբԳգԴդԵե…',
        10:  'Cherokee',
        11:  'ᎠᎡᎣᎤᎥᎦᎧᎨᎩᎪ…',
        12: 'Arabic',
        13: 'ثخذضظغ…'
    }
    
    var PANGOLINS = 0,
        ABCD = 1,
        FONT_NAME = 2,
        CUSTOM = 3;
        CYRILLIC = 4,
        CYRILLIC_ABCD = 5,
        GREEK = 6,
        GREEK_ABCD = 7,
        ARMENIAN = 8,
        ARMENIAN_ABCD = 9,
        CHEROKEE = 10,
        CHEROKEE_ABCD = 11,
        ARABIC = 12,
        ARABIC_ABCD = 13

    var isFontPage = $('body').hasClass('font');
    var store = new SmartStorage('fontdeck');

    // Grab some useful DOM nodes.
    var $sample_text = $('#sample-text');
    var $sample_select = $('#sample-select');

    function init() {
        if ($sample_text.length > 0) {
            addEventHandlers();
            updateFromStorage();
        }
    }

    function addEventHandlers() {
        //Update text when sample changes
        $sample_select.change(function() {
            var val = $(this).val();
            if (val == CUSTOM) { // If custom is selected, wait for custom input.
                $sample_text.val('').focus();
            } else {
                updateSampleText(val);
                storeSampleText(val);
            }
        });
        $sample_text.bind('keyup change', function() {
            updateSampleText(CUSTOM, $(this).val());
            storeSampleText(CUSTOM, $(this).val());
        })
        .focus(function() {
            setTimeout(function() {
                $sample_text.select();
            }, 10);
        });
        if (SmartStorage.browserIsSupported()) {
            if (window.addEventListener) {
              window.addEventListener("storage", updateFromStorage, false);
            } else {
              window.attachEvent("onstorage", updateFromStorage);
            }
        }
    }
    
    function updateSampleText(type, text) {
        $sample_select.val(type);
        if (type != CUSTOM) {
            if ($sample_text.val() != SAMPLE_TEXT_TITLE[type]) {
                $sample_text.val(SAMPLE_TEXT_TITLE[type]);
            }
        }
        
        var new_text = SAMPLE_TEXT[type];
        if (type == FONT_NAME) {
            if (isFontPage) {
                new_text = $('#font-name').text();
            } else {
                $('.font-item').each(function() {
                    // Set each sample text here, then return.
                    $('.sample span', this).text($('.font-name a', this).text());
                });
                return;
            }
        }
        else if (type == CUSTOM) {
            new_text = text;
            if ($sample_text.val() != new_text) {
                $sample_text.val(new_text);
            }
        }
        setFontSample(type, new_text);
    }
    
    function setFontSample(type, val) {
        // Set the sample text for font or typeface page, truncating if neccessary.
        var truncate;
        if (isFontPage) {
            // On the font page we truncate the text depending on the font size.
            // This object maps font sizes to the length to truncate at.
            truncate = {
                72: 30,
                48: 75,
                36: 100,
                28: 150,
                24: 200,
                18: 300,
                16: 300,
                14: 350,
                13: 500,
                12: 700
            }
            for (var i in truncate) {
                var text = val;
                if (val.length > truncate[i]) {
                    text = text.substr(0,truncate[i])
                }
                $('.sample.size'+i+' span').html(htmlEntities(text) + '&hellip;');
            }
        } else {
            if (type == PANGOLINS) {
                val = val.substr(0,29);
            }
            $('.sample span').html(htmlEntities(val));
        }
    }
    
    function updateFromStorage() {
        // Check localStorage and update the text sample if needed.
        if (SmartStorage.browserIsSupported()) {
            var text_val = store.get('sample-text');
            if (text_val) {
                var type = parseInt(text_val.type);
                var text = text_val.text;
                if (type != CUSTOM || type == CUSTOM && text) {
                    updateSampleText(type, text);
                }
            }
            var size_val = store.get('sample-size');
            if (size_val && size_val.size != $('#sample-size-select').val()) {
            	$('#sample-size-select').val(size_val.size).change();
            }
        }
    }
    
    function storeSampleText(type, text) {
        // Stash the type and text in the browsers local storage.
        if (SmartStorage.browserIsSupported()) {
            var type = type.toString();
            store.set('sample-text', {'type': type, 'text': text}, 1800 * 1000); // Store for 30 mins
        }
    }
    
    function htmlEntities(str) {
        return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
    }
    
    return {
        'init': init
    }
    
})();

Fontdeck.FormElements = (function() {
    
    function init() {
        if ($('#sample-size-select').length > 0) { createSlider(); }
        if ($('select').length > 0) { uniformSelect(); }
        if ($('.toggle-invert').length > 0) { invertToggle(); }
        if ($('#show-smaller').length > 0) { showSmallerSizes(); }
        if ($('#project-list').length > 0) { showProjectList(); }
        if ($('.add-to-website .select-site').length > 0) { addToWebsiteOpen(); }
        if ($('#terms-toggle').length > 0) { termsToggle(); }
        if ($('#order').length > 0) { orderUpdate(); }
        if ($('.crossselect').length > 0) { $('.crossselect').crossSelect(); }
    }
    function createSlider() {
        $size_select = $('#sample-size-select');
        $size_select.wrap('<div class="sample-size-container"></div>').before('<a href="" class="sample-size-down">Decrease Sample Size</a>').after('<a href="" class="sample-size-up">Increase Sample Size</a>').selectToUISlider({labels: false}).hide();
        $('.sample-size-down').click(function() {
            val = parseFloat($size_select.val());
            val = (val == 1)? 1 : val - 1;
            $size_select.val(val).change();
            return false;
        });
        $('.sample-size-up').click(function() {
            val = parseFloat($size_select.val());
            val = (val == 13)? 13 : val + 1;
            $size_select.val(val).change();
            return false;
        });
        $size_select.change(function() {
            val = parseInt($size_select.val());
            size = parseInt($('#sample-size-select :selected').text());
            $('.sample span').css({'font-size': size});
            storeSampleSize(val);
        });
    }
    function storeSampleSize(val) {
        // Stash the type and text in the browsers local storage.
        if (SmartStorage.browserIsSupported()) {
            var prev = store.get('sample-size');
            if (!prev || val != prev.size) {
                store.set('sample-size', {size: val}, 1800 * 2000); // Store for 60 mins
            }
        }
    }
    function uniformSelect() {
        $("select.uniform").uniform()
        $(".selector.error").live('click focus', function() {
        	$(this).removeClass('error');
        });
        $("select.uniform-small").uniform({selectClass: 'selector small'});
        $("select.uniform-text").show().uniform({selectClass: 'selector small text'});
    }
    function invertToggle() {
        $('.toggle-invert a').click(function() {
            if (!$(this).hasClass('active')) {
                $('.toggle-invert .active').removeClass('active');
                $(this).addClass('active');
                $('#invert-area').toggleClass('inverted')
            }
            return false;
        });
    }
    function showSmallerSizes() {
        var $smaller = $('#smaller');
        $('#show-smaller').click(function() {
            if ($smaller.is(":visible")) {
                $smaller.slideUp();
                $(this).text('Show smaller sizes')
                return false;
            } else {
                $smaller.slideDown();
                $(this).text('Hide smaller sizes')
                return false;
            }
        });
    }
    function showProjectList() {
        $('.add-to-website').click(function() {
            $('#project-list').slideToggle();
            return false;
        });
    }
    function addToWebsiteOpen() {
        $('.add-to-website-link').live("click", function(e) {
            if (!$(this).hasClass('sign-in')) {
                $parent = $(this).parent()
                if ($parent.hasClass('opened')) {
                    $parent.removeClass('opened');
                } else {
                    $('.add-to-website').removeClass('opened');
                    $parent.addClass('opened');
                }
                return false;
            }
        });
    }
    function termsToggle() {
        $('#terms-toggle').click(function() {
            $('#terms').slideToggle(500);
            return false;
        });
    }
    function orderUpdate() {
        $('#order').change(function() {
            $('#sort').submit();
        });
        $('#updateorder').hide();
    }
    return {
        "init": init
    }
})();


Fontdeck.Account = (function() {
    
	function init() {
	    var i = 1;
		if ($('.require-js').length > 0) { showHidden(); }
		if ($('#showpassword').length > 0) { revealPassword(); }
	    if ($('a.delete').length > 0) { deleteConfirm(); }
	    if ($('#domains').length > 0) { addDomain(); }
	    if ($('#useexisting').length > 0) { updateCard(); }
	    if ($('#notification').length > 0) { closeNotification(); }
	    if ($('.redeem-voucher').length > 0) { toggleRedeem(); }
	    if ($('.datepicker').length > 0) { $('.datepicker').date_input(); }
	}
	
	function showHidden() {
		$('.require-js').show();
	}
    
    function deleteConfirm() {
        $('a.delete').click(function(){
        	var url = $(this).attr('href');
        	if (url.indexOf("?") != -1) {
        		url += '&go=1';
        	} else {
        		url += '?go=1';
        	}
        	var message = $(this).attr('data-message');
        	if (!message) {
        		message = 'Are you sure you want to delete this?';
        	}
        	if (confirm(message)) { 
        		window.location = url;
        	}
        	return false;
        });
    }
    
    function addDomain() {
    	$('#domains input.new-domain.empty').live('keyup', function() {
    	    if ($(this).val() != '') {
    	        $(this).removeClass('empty').after(' <a href="#" class="delete-domain">Delete</a>');
    	        $('#domains').append('<div style="display:none;"><input type="text" name="domains" class="new-domain empty" /></div>');
    	        $('#domains div:last').slideDown(100);
    	    }
    	});
    	$('#domains input.new-domain').live('change', function() {
    	    if (!$(this).hasClass('empty') && ($(this).val() == '')) {
    	        $(this).parent().slideUp(100, function() {
    	            $(this).remove();
    	        });
    	    }
    	});
	    $('#domains input').not(':last').after(' <a href="#" class="delete-domain">Delete</a>');
    	$('.delete-domain').live('click', function() {
    	    var $div = $(this).parent();
    	    var newDomain = false;
    	    if ($('input', $div).hasClass('new-domain')) {
    	        newDomain = true;
    	    }
    		$(this).parent().slideUp(100, function() {
    			$(this).remove();
    			if (newDomain == false) {
    			    $('#settings').submit();
    			}
    		});
    		return false;
    	});
    }
    
    function clipboard() {
    	$('.copy').each(function() {
    		var id = $(this).attr('id');
        	var clip = new ZeroClipboard.Client();
        	var $copy = $(this);
        	var $button = $('#'+id+'-button').css({display: 'block'});
        	var $code = $('#'+id+'-code');
        	clip.setText('');
            clip.setHandCursor( true );
            clip.addEventListener( 'mouseOver', function(client) {
            	$button.css({'text-decoration': 'underline'});
            } );
            clip.addEventListener( 'mouseOut', function(client) {
            	$button.css({'text-decoration': 'none'});
            } );
    		clip.addEventListener( 'mouseUp', function(client) {
    			clip.setText($code.val());
    			$('.copy.copied').each(function() {
    				$(this).removeClass('copied');
    				$('#'+$(this).attr('id')+'-button').text('Copy to clipboard');
    			});
    			$copy.addClass('copied');
    			$button.hide().text('Copied').fadeIn(300);
    		});
    		clip.glue( id+'-button', id+'-container' );
    	});
    }
        
    function revealPassword() {
    	var $masked = $('#password1');
    	var $unmasked = $('#password2');
    	var $toggle = $('#showpassword');
    	$masked.keyup(function() {
    		$unmasked.val($masked.val());
    	});
    	$unmasked.keyup(function() {
    		$masked.val($unmasked.val());
    	});
    	$toggle.change(function() {
    		$masked.toggleClass('hide');
    		$unmasked.toggleClass('hide');
    	});
    }
    
    function updateCard() {
    	var $filecard = $('#file_card');
    	var $currentcard = $('#currentcard');
    	var $updatecard = $('#updatecard');
    	var $paypalBox = $('#paypalBox');
    	
    	$('#changecard').click(
    		function() {
    			$currentcard.hide();
    			$paypalBox.hide();
				$updatecard.fadeIn(300);
    	        $filecard.val(0);
    	        $('#payment-form-stored').attr( 'id', 'payment-form' );
    	        return false;
    		}		
    	);	
    	
    	$('#useexisting').click(
    		function() {
    			$updatecard.hide();
    			$paypalBox.show();
    			$currentcard.fadeIn(300);
    	        $filecard.val(1);
    	        $('#payment-form').attr( 'id', 'payment-form-stored' );
    	        return false;
    		}		
    	);
    }
    
    function closeNotification() {
    	$('#notification .close').live("click", function() {
    		$('#notification').slideUp(300, function() {
    			$("#notification .section").html("");
    		});
    		return false;
    	});
    }
    
    function toggleRedeem() {
    	$redeemvoucher = $('.redeem-voucher');
    	$('a.redeem-voucher-link').click(function() {
			$redeemvoucher.toggle();
			$('a.redeem-voucher-link.add').toggle();
			return false;
		});
    }
    
    
    return {
        "init": init,
        "clipboard": clipboard
    }
})();

Fontdeck.AddToWebsite = (function() {
    
    var ajax_config = {
        type:     'POST',
        dataType: 'json',
        url:      '/addtowebsite_xhr.html',
        timeout: '7000',
        data: {}
    };
    
    function init() {
        if ($(".add-to-website, #project-list").length > 0) { ajaxAddFont() }
    }
    function dump(arr,level) {
    	var dumped_text = "";
    	if(!level) level = 0;
    	
    	//The padding given at the beginning of the line.
    	var level_padding = "";
    	for(var j=0;j<level+1;j++) level_padding += "    ";
    	
    	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
    		for(var item in arr) {
    			var value = arr[item];
    			
    			if(typeof(value) == 'object') { //If it is an array,
    				dumped_text += level_padding + "'" + item + "' ...\n";
    				dumped_text += dump(value,level+1);
    			} else {
    				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    			}
    		}
    	} else { //Stings/Chars/Numbers etc.
    		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    	}
    	return dumped_text;
    }
    function ajaxAddFont(project_id, font_id) {
    
    	$(document).delegate(".add-to-website .project, #project-list .project", "submit", function(e) {
    		//$('#notification').slideUp();
    		if (!$(this).hasClass('go')) {
	        	var $target = $(this).find('button').addClass("loading");
	        	var project_id = $(this).find('.project_id').val(); 
	        	var font_id = $(this).find('.font_id').val(); 
	        	ajax_config.data.project = project_id;
	        	ajax_config.data.font = font_id;
	        	ajax_config.success = function(data) {
	        		if (data.success == 1) {
	        			var vpv = location.href + "?added";
	        			if (location.search) {
	        				vpv = location.href + "&added";
	        			}
	        			pageTracker._trackPageview(vpv);
	        	    	success(data.message, $target);
	        	    } else {
	        	    	error($(this), $target, data.message);
	        	    }
	        	}
	        	ajax_config.error = function() { error($(this), $target, 'No response.') }
	        	$.ajax(ajax_config);
	        	e.preventDefault();
	        }
		});
    }
    
    function success(message, $target) {
        $('.add-to-website.opened').removeClass('opened');
		$target.parent().html('<span class="licensed">'+$target.text()+' <em>Licensed</em></span>');
    	$('#notification .section').html('<a href="#" class="close"><img src="/images/icons/close.png" alt="Close" /></a>'+message);
    	$('html, body').animate({scrollTop:0}, 300, function() {
    		$('#notification').slideDown();
    	});
    }
    
    function error($form, $target) {
	    $form.addClass('go');
		$target.removeClass('loading').click();
    }
    
    return {
        "init": init
    }
    
})();

Fontdeck.Tags = (function() {
    var $tagList = $('.tag-list');
    
    function init() {
        if ($tagList.length > 0) { hideTags(); }
        if ($(".sort-tags").length > 0) { sortTags(); }
    }
    
    function hideTags() {
        var smallHeight = 1080;
        var fullHeight = $tagList.height();
        if (fullHeight > smallHeight) {
            $tagList.height(smallHeight);
            $tagList.after('<a href="#" class="toggletags sub">Show more tags&hellip;</a>');
            $('.toggletags').click(function() {
                if ($tagList.height() == smallHeight) {
                    $(this).html('Show less tags&hellip;');
                    $tagList.animate({height: fullHeight}, 500, function() {
                        $tagList.css({height: 'auto'});
                        fullHeight = $tagList.height();
                    });
                } else {
                    $(this).html('Show more tags&hellip;');
                    $tagList.animate({height: smallHeight}, 500);
                }
                return false;
            });
        }
    }
    
    function sortTags() {
        $sortTags = $('.sort-tags');
        $sortAlpha = $('.alpha', $sortTags);
        $sortCount = $('.count', $sortTags);
        function sortAlpha(a,b){  
            return a.innerHTML > b.innerHTML ? 1 : -1;  
        }
        function rSortAlpha(a,b){  
            return a.innerHTML < b.innerHTML ? 1 : -1;  
        }
        function sortCount(a,b){  
            return parseFloat(a.getAttribute('data-count')) > parseFloat(b.getAttribute('data-count')) ? 1 : -1;  
        }
        function rSortCount(a,b){  
            return parseFloat(a.getAttribute('data-count')) < parseFloat(b.getAttribute('data-count')) ? 1 : -1;  
        }
        $sortAlpha.click(function() {
            $sortCount.removeClass('ascending descending');
            if ($(this).hasClass('ascending')) {
                $(this).removeClass('ascending').addClass('descending');
                $tagList.html($('li', $tagList).sort(rSortAlpha));
            } else {
                $(this).removeClass('descending').addClass('ascending');
                $tagList.html($('li', $tagList).sort(sortAlpha));
            }
            return false;
        });
        $sortCount.click(function() {
            $sortAlpha.removeClass('ascending descending');
            if ($(this).hasClass('descending')) {
                $(this).removeClass('descending').addClass('ascending');
                $tagList.html($('li', $tagList).sort(sortCount));
            } else {
                $(this).removeClass('ascending').addClass('descending');
                $tagList.html($('li', $tagList).sort(rSortCount));
            }
            return false;
        });
    } 
    
    return {
        "init": init
    }
    
})();

Fontdeck.Track = (function() {
	function outboundLink(link, category, action) {
		_gat._getTrackerByName()._trackEvent(category, action);
		setTimeout('document.location = "' + link.href + '"', 100);
	}
	
	return {
		"outboundLink": outboundLink
	}
})();

$(document).ready( init );
window.onload = function() { Fontdeck.Account.clipboard(); }

