/*
* http://www.fontself.com/
* Copyright (c) 2011, Fontself. All rights reserved. 
* THIS SOFTWARE IS DISTRIBUTED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESSED OR IMPLIED.
*/
var FontselfDebugTool={};FontselfDebugTool.isConsoleDisplayed=false;FontselfDebugTool.withConsole=false;FontselfDebugTool.divID="";FontselfDebugTool.init=function(isTextDisplayed,divID){FontselfDebugTool.isConsoleDisplayed=isTextDisplayed;if(divID){FontselfDebugTool.withConsole=false;FontselfDebugTool.divID=divID;$("#"+FontselfDebugTool.divID).css("position","absolute");$("#"+FontselfDebugTool.divID).css("bottom","0px");$("#"+FontselfDebugTool.divID).css("right","0px");$("#"+FontselfDebugTool.divID).css("width","900px");$("#"+FontselfDebugTool.divID).css("height","400px");$("#"+FontselfDebugTool.divID).css("overflow-y","scroll");}else{FontselfDebugTool.withConsole=true;}};FontselfDebugTool.display=function(text){if(!FontselfDebugTool.isConsoleDisplayed||(FontselfDebugTool.withConsole&&(!console||!console.log))){return;}if(FontselfDebugTool.withConsole){console.log(text);}else{$("#"+FontselfDebugTool.divID).html(text+"<br>"+$("#"+FontselfDebugTool.divID).html());}};function TextType(){}TextType.SimpleChar="Fontself text type simplechar";TextType.Smiley="Fontself text type smiley";TextType.Ligature="Fontself text type ligature";function Font(){var texts=new Array();this.addText=function(text,textType,CSSClass){if(!texts[text]||!(texts[text] instanceof FontTextInfos)){texts[text]=new FontTextInfos(textType);}texts[text].addCSSClass(CSSClass);};this.getTexts=function(filter){if(filter&&!(filter==TextType.SimpleChar||filter==TextType.Smiley||filter==TextType.Ligature)){return"";}result=new Array();for(text in texts){if(!filter||(filter&&texts[text].getTextType()==filter)){result.push(text);}}return result;};this.getTextInfoForText=function(text){return texts[text];};}function FontTextInfos(mTypeText){var CSSClasses=new Array();var textType="";if(mTypeText==TextType.SimpleChar||mTypeText==TextType.Smiley||mTypeText==TextType.Ligature){textType=mTypeText;}else{textType=TextType.SimpleChar;}this.addCSSClass=function(cssClass){CSSClasses.push(cssClass);};this.getCSSClasses=function(){return CSSClasses;};this.getTextType=function(){return textType;};}FontID.keyToFontID={};FontID.urlToFontID={};FontID.fontStorageURLOverride;FontID.fromURL=function(anURL){var result=FontID.urlToFontID[anURL];if(!result){result=new FontID({url:anURL});FontID.urlToFontID[anURL]=result;}return result;};FontID.setFontStorageURLOverride=function(aFontStorageURLOverride){FontID.fontStorageURLOverride=aFontStorageURLOverride;};FontID.fromKey=function(aKey){var result=FontID.keyToFontID[aKey];if(!result){result=new FontID({key:aKey});FontID.keyToFontID[aKey]=result;}return result;};FontID.fromRepresentation=function(representation){var parts=representation.split("|",2);var kind=parts[0];var value=parts[1];if(kind=="key"){return FontID.fromKey(value);}else{if(kind=="url"){return FontID.fromURL(value);}else{throw new Error("Unknown representation: "+representation);}}};function FontID(key_or_url){var key=key_or_url.key;var url=key_or_url.url;if(key==url){raise("need to pass either the key or the url in the constructor.");}var buildURL=function(){if(!FontID.fontStorageURLOverride){return"http://fonts.fontself.com/fontfiles/"+key+"/";}else{return FontID.fontStorageURLOverride+key+"/";}};this.toRepresentation=function(){if(key){return"key|"+key;}else{return"url|"+url;}};this.toString=function(){return"[FontID. "+this.toRepresentation()+"]";};this.getKey=function(){return key;};this.getURL=function(){if(!url){url=buildURL();}return url;};this.getJSONURL=function(){return this.getURL()+"font.jsonp";};this.getCSSURL=function(fontSize){return this.getURL()+"font_"+fontSize+".css";};this.getPNGURL=function(fontSize){return this.getURL()+"font_"+fontSize+".png";};}FontIDAndSize.keys={};FontIDAndSize.get=function(fontID,fontSize){var key=fontID.toString()+"|"+fontSize;if(!FontIDAndSize.keys[key]){FontIDAndSize.keys[key]=new FontIDAndSize(fontID,fontSize);}return FontIDAndSize.keys[key];};function FontIDAndSize(aFontID,aFontSize){var fontID=aFontID;var fontSize=aFontSize;this.getFontSize=function(){return fontSize;};this.getFontID=function(){return fontID;};this.getPNGURL=function(){return fontID.getPNGURL(fontSize);};this.getCSSURL=function(){return fontID.getCSSURL(fontSize);};this.getJSONURL=function(){return fontID.getJSONURL();};this.toString=function(){return fontID+"|fontSize. "+fontSize+"]";};}function CSSLoader(){this.validateParams=function(cssUrl,extra,onSuccess,onError){if(!cssUrl){throw CSSLoader.onCSSURLParamsError;}if(extra){throw CSSLoader.onExtraParamsError;}if(onSuccess){throw CSSLoader.onSuccessParamsError;}if(onError){throw CSSLoader.onErrorParamsError;}};this.load=function(cssUrl,extra,onSuccess,onError){this.validateParams(cssUrl,extra,onSuccess,onError);FontselfDebugTool.display("-> CSSLoader: the CSS will be loaded for cssURL: "+cssUrl);$("<link/>").attr("rel","stylesheet").attr("href",cssUrl).attr("type","text/css").appendTo("head");};}CSSLoader.onCSSURLParamsError="CSSLoader: you SHOULD pass an cssUrl parameter!";CSSLoader.onExtraParamsError="CSSLoader: you shouldn't pass an extra parameter for this class!";CSSLoader.onSuccessParamsError="CSSLoader: your success callback will never been called bacause css files don't have any loading event!";CSSLoader.onErrorParamsError="CSSLoader: your success callback will never been called bacause css files don't have any loading event!";var CSS_LOADER=new CSSLoader();function JSONPLoader(){this.validateParams=function(jsonpUrl,extra,onSuccess,onError){if(!jsonpUrl){throw JSONPLoader.onJsonpURLParamsError;}if(!extra){throw JSONPLoader.onExtraParamsError;}if(!onSuccess){throw JSONPLoader.onSuccessParamsError;}if(onError){throw JSONPLoader.onErrorParamsError;}};this.load=function(jsonpUrl,extra,onSuccess,onError){this.validateParams(jsonpUrl,extra,onSuccess,onError);var _onSuccess=onSuccess;FontselfDebugTool.display("-> JSONPLoader: the JSONP will be loaded for font: "+extra);$.ajax({url:jsonpUrl,dataType:"jsonp json",context:this,success:function(json,textStatus,xhr){FontselfDebugTool.display("++ JSONPLoader: JSON loaded for font: "+extra+" : "+json);font=new Font();var smileys=json.smiley;var ligatures=json.ligature;var simplechars=json.simplechar;for(i=0;i<smileys.length;i++){font.addText(smileys[i][0],TextType.Smiley,smileys[i][1]);}for(i=0;i<ligatures.length;i++){font.addText(ligatures[i][0],TextType.Ligature,ligatures[i][1]);}for(i=0;i<simplechars.length;i++){font.addText(simplechars[i][0],TextType.SimpleChar,simplechars[i][1]);}_onSuccess(font);},jsonp:false,cache:true,jsonpCallback:"onFontInfo_"+extra});};}JSONPLoader.onJsonpURLParamsError="JSONPLoader: you SHOULD pass an jsonpUrl parameter!";JSONPLoader.onExtraParamsError="JSONPLoader: you SHOULD pass an extra parameter! (a font key)";JSONPLoader.onSuccessParamsError="JSONPLoader: your SHOULD pass a success callback function!";JSONPLoader.onErrorParamsError="JSONPLoader: your success callback will never been called bacause jsonp files don't have any loading error event!";var JSONP_LOADER=new JSONPLoader();function ImageLoader(){this.validateParams=function(imageUrl,extra,onSuccess,onError){if(!imageUrl){throw ImageLoader.onImageURLParamsError;}if(extra){throw ImageLoader.onExtraParamsError;}if(!onSuccess){throw ImageLoader.onSuccessParamsError;}if(!onError){throw ImageLoader.onErrorParamsError;}};this.load=function(imageUrl,extra,onSuccess,onError){this.validateParams(imageUrl,extra,onSuccess,onError);var img=new Image();img.onload=onSuccess;img.onerror=onError;img.onabort=onError;img.src=imageUrl;};}ImageLoader.onImageURLParamsError="ImageLoader: you SHOULD pass an imageUrl parameter!";ImageLoader.onExtraParamsError="ImageLoader: you shouldn't pass an extra parameter!";ImageLoader.onSuccessParamsError="ImageLoader: your SHOULD pass a success callback function!";ImageLoader.onErrorParamsError="ImageLoader: your SHOULD pass an error callback function!";var IMAGE_LOADER=new ImageLoader();function AssetResolver(){this.statusByUrl=new Array();this.resolve=function(assetLoader,url,extra,onSuccess,onError){assetLoader.validateParams(url,extra,onSuccess,onError);assetStatus=this.statusByUrl[url];if(assetStatus){switch(assetStatus.status()){case StatusEnum.SUCCESS:onSuccess(assetStatus.result());break;case StatusEnum.ERROR:onError();break;case StatusEnum.LOADING:assetStatus.registerListeners(onSuccess,onError);}}else{var assetStatus=new AssetStatus();this.statusByUrl[url]=assetStatus;assetStatus.registerListeners(onSuccess,onError);assetLoader.load(url,extra,onSuccess?assetStatus.onSuccess:null,onError?assetStatus.onError:null);}};}function AssetStatus(){var _successListeners=new Array();var _errorListeners=new Array();var _status=StatusEnum.LOADING;var _result="";this.onSuccess=function(aResult){_status=StatusEnum.SUCCESS;_result=aResult;while(_successListeners.length!=0){_successListeners.pop()(aResult);}};this.onError=function(){_status=StatusEnum.ERROR;while(_errorListeners.length!=0){_errorListeners.pop()();}};this.registerListeners=function(onSuccess,onError){if(onSuccess){_successListeners.push(onSuccess);}if(onError){_errorListeners.push(onError);}};this.status=function(){return _status;};this.result=function(){return _result;};}var StatusEnum={LOADING:1,SUCCESS:2,ERROR:3};byrne={};byrne.TrieNode=function(){this.wordCount=0;this.prefixCount=0;this.children=[];};byrne.TrieNode.prototype.add=function(word){if(word){this.prefixCount++;var k=word.charAt(0);(this.children[k]||(this.children[k]=new byrne.TrieNode())).add(word.substring(1));}else{this.wordCount++;}};byrne.TrieNode.prototype.getPrefixCount=function(word){return word?this.getCount(word,arguments.callee):this.prefixCount;};byrne.TrieNode.prototype.getWordCount=function(word){return word?this.getCount(word,arguments.callee):this.wordCount;};byrne.TrieNode.prototype.getLongest=function(word){var k=word.charAt(0);if(this.children[k]){var tmp=this.children[k].getLongest(word.substring(1));if(tmp===true){return k;}else{if(tmp!=false){return k+tmp;}}}if(this.wordCount>0){return true;}else{return false;}};byrne.TrieNode.prototype.getCount=function(word,method){var k=word.charAt(0);return this.children[k]?method.call(this.children[k],word.substring(1)):0;};function Splitter(font){var font=font;var ligatures=new byrne.TrieNode();var smileys=new byrne.TrieNode();var fillTrie=function(){var textsSmileys=font.getTexts(TextType.Smiley);var textsLigatures=font.getTexts(TextType.Ligature);for(i in textsSmileys){smileys.add(textsSmileys[i]);}for(i in textsLigatures){ligatures.add(textsLigatures[i]);}};fillTrie();this.split=function(text){var result=new Array();var longestSmileyMatch=smileys.getLongest(text);if(longestSmileyMatch.length==text.length){result.push(text);}else{while(text.length>0){var longestPrefix=ligatures.getLongest(text);var splitAt=longestPrefix?longestPrefix.length:1;result.push(text.substr(0,splitAt));text=text.substr(splitAt);}}return result;};}function Fallback(font){var font=font;this.fallback=function(c){if(c.length!=1){return c;}if(font.getTextInfoForText(c)){return c;}var upperCase=c.toUpperCase();if(c!=upperCase&&font.getTextInfoForText(upperCase)){return upperCase;}var lowerCase=c.toLowerCase();if(c!=lowerCase&&font.getTextInfoForText(lowerCase)){return lowerCase;}var withoutAccent=c.removeDiacritics();if(c!=withoutAccent&&font.getTextInfoForText(withoutAccent)){return withoutAccent;}return c;};}String.prototype.removeDiacritics=function(){var diacritics=[[/[\300-\306]/g,"A"],[/[\307]/g,"C"],[/[\310-\313]/g,"E"],[/[\314-\317]/g,"I"],[/[\320]/g,"D"],[/[\321]/g,"N"],[/[\322-\330]/g,"O"],[/[\331-\334]/g,"U"],[/[\335]/g,"Y"],[/[\340-\346]/g,"a"],[/[\347]/g,"c"],[/[\350-\353]/g,"e"],[/[\354-\357]/g,"i"],[/[\361]/g,"n"],[/[\362-\370]/g,"o"],[/[\371-\374]/g,"u"],[/[\375]/g,"y"],[/[\377]/g,"y"]];var s=this;for(var i=0;i<diacritics.length;i++){s=s.replace(diacritics[i][0],diacritics[i][1]);}return s;};fsRendering=function(options){var settings=$.extend({domIDFilter:"*",unwantedTags:new Array("video","object","embed","param","br","area","input","hr","meta","script","style"),fontStorageURLOverride:"",cssStorageURL:"http://static.fontself.com/libraries/html/v2/css/",displayConsole:false,consoleDivID:""},options);FontselfDebugTool.init(settings.displayConsole,settings.consoleDivID);settings=$.extend({domIDFilterAttribute:"[data-fontself]",domIDAttribute:"data-fontself",FSWordClass:"FS_WORD",FSFontInfoAttribute:"data-fontself",supportedFontSize:FSTools.initSupportedFontSize(),mainCSSClass:"fontself_text",inProgressClass:"fs_in_progress",fontselfyDoneClass:"fontselfy_done"},settings);if(!FSTools.mainCSSLoaded){FSTools.mainCSSLoaded=true;if(!($.browser.msie&&$.browser.version=="7.0")){fsRendering.assetResolver.resolve(CSS_LOADER,settings.cssStorageURL+"fontself-base.css");FontselfDebugTool.display("Initialization: Loading fontself-base generic CSS");}else{fsRendering.assetResolver.resolve(CSS_LOADER,settings.cssStorageURL+"fontself-base-IE7.css");FontselfDebugTool.display("Initialization: Loading fontself-base IE7 CSS");}}if(settings.fontStorageURLOverride){FontID.setFontStorageURLOverride(settings.fontStorageURLOverride);FontselfDebugTool.display("Initialization: fontstorageURLOverride has changed for:"+settings.fontStorageURLOverride);}$(settings.domIDFilter+settings.domIDFilterAttribute+", "+settings.domIDFilter+" *"+settings.domIDFilterAttribute).each(function(){var $this=$(this);var fontKey=$.trim($this.attr(settings.FSFontInfoAttribute));if(fontKey){var fontSize=FSTools.getNearFontSize(parseInt($this.css("font-size")),settings.supportedFontSize);if(!$this.hasClass(settings.inProgressClass)&&!$this.hasClass(settings.fontselfyDoneClass)){$this.addClass(settings.inProgressClass);new TagFontselfier(this,FontID.fromKey(fontKey),fontSize,settings);}}});};fsRendering.assetResolver=new AssetResolver();TagFontselfier=function(tag,fontID,fontSize,settings){var _tag=tag;var _fontID=fontID;var _fontSize=fontSize;var _settings=settings;var _key=FontIDAndSize.get(_fontID,_fontSize);var _font;var _splitter;var _fallback;var isFontLoaded=false;var isPNGLoaded=false;var $this=$(tag);var onPNGError=function(){FontselfDebugTool.display("-- TagFontselfier PNG error! for font: "+_key);};var onPNGSuccess=function(){isPNGLoaded=true;FontselfDebugTool.display("++ TagFontselfier PNG loaded! for font: "+_key);if(isFontLoaded){FontselfDebugTool.display("++ TagFontselfier FONT loaded! for font: "+_key);fontselfyTag();}};var onFontLoaded=function(font){isFontLoaded=true;FontselfDebugTool.display("++ TagFontselfier JSON loaded! for font: "+_key);_font=font;if(isPNGLoaded){FontselfDebugTool.display("++ TagFontselfier FONT loaded! for font: "+_key);fontselfyTag();}};var fontselfyTag=function(){$this.addClass("FS"+_fontID.getKey()+"_"+_fontSize).addClass(_settings.mainCSSClass);_splitter=new Splitter(_font);_fallback=new Fallback(_font);$this.contents().each(function(){var el=$(this);if(this.nodeType!=1){FontselfDebugTool.display("-> parsing of: "+el.text());el.replaceWith(new Parser(el.text(),_splitter,_fallback,_font,_settings));}else{if(el.attr(_settings.domIDAttribute)){return;}else{if(el.is("img")){el.attr("align","absmiddle");}else{if(el.is(_settings.unwantedTags.join(", "))){return;}else{var fontS=FSTools.getNearFontSize(parseInt(el.css("font-size")),_settings.supportedFontSize);var fontKey=$.trim(el.attr(_settings.FSFontInfoAttribute));var newFontID=_fontID;if(fontKey){newFontID=FontID.fromKey(fontKey);}new TagFontselfier(this,newFontID,fontS,_settings);}}}}});$this.addClass(_settings.fontselfyDoneClass);$this.removeClass(_settings.inProgressClass);};fsRendering.assetResolver.resolve(CSS_LOADER,_key.getCSSURL());fsRendering.assetResolver.resolve(IMAGE_LOADER,_key.getPNGURL(),"",onPNGSuccess,onPNGError);fsRendering.assetResolver.resolve(JSONP_LOADER,_key.getJSONURL(),fontID.getKey(),onFontLoaded);};Parser=function(text,splitter,fallback,font,settings){var words=$.trim(text).replace(/[\r|\n|\t]/g,"").replace(/\s{2,}/g," ").split(" ");if(!(words.length==1&&words[0]=="")&&text.match(/^(\n|\t)*[ ]+/g)){words.unshift(" ");
}if(!(words.length==1&&words[0]=="")&&text.match(/[ ]+(\n|\t)*$/g)){words.push(" ");}$tag=$("<p/>");var FS_SPACE="";var textInfos=font.getTextInfoForText(" ");if(textInfos){var CSSClasses=textInfos.getCSSClasses();FS_SPACE=CSSClasses[Math.floor(Math.random()*CSSClasses.length)];}for(var n=0;n<words.length;n++){if(n!=0){FSTools.getSpaceTag(FS_SPACE,settings.FSWordClass).appendTo($tag);}if(words[n]!=" "){var wordTag=FSTools.getWordTag(settings.FSWordClass);var texts=splitter.split(words[n]);for(var i=0;i<texts.length;i++){var text=fallback.fallback(texts[i]);var space=(n!=0&&i==texts.length-1)?" ":"";var textInfos=font.getTextInfoForText(text);if(textInfos){var CSSClasses=textInfos.getCSSClasses();var tmpSpan=$("<span/>").html(text+space);tmpSpan.addClass(CSSClasses[Math.floor(Math.random()*CSSClasses.length)]);tmpSpan.appendTo(wordTag);}else{wordTag.append(text+space);}}wordTag.appendTo($tag);}}return $tag.children();};FSTools=function(){};FSTools.getSpaceTag=function(spaceClass,wordClass){return FSTools.getWordTag(wordClass).append($("<span/>").addClass(spaceClass).html("&#32"));};FSTools.getWordTag=function(wordClass){return $("<span/>").addClass(wordClass);};FSTools.mainCSSLoaded=false;FSTools.initSupportedFontSize=function(){var supportedFontSize=new Array(18,20,23,26,30,34,39,44,50);return supportedFontSize.sort();};FSTools.getNearFontSize=function(fontSize,supportedFontSize){var maxFontSize=supportedFontSize[supportedFontSize.length-1];if(fontSize>=maxFontSize){return maxFontSize;}var i=0;while(supportedFontSize[i]<fontSize){i++;}return supportedFontSize[i];};

